[
  {
    "path": ".eslintrc.json",
    "content": "{\n  \"root\": true,\n  \"parser\": \"@typescript-eslint/parser\",\n  \"parserOptions\": {\n    \"ecmaVersion\": 12,\n    \"sourceType\": \"module\"\n  },\n  \"plugins\": [\"@typescript-eslint\"],\n  \"extends\": [\n    \"plugin:@typescript-eslint/eslint-recommended\",\n    // \"plugin:@typescript-eslint/recommended\",\n    \"plugin:prettier/recommended\"\n  ],\n  \"rules\": {\n    \"@typescript-eslint/class-name-casing\": \"off\", // TODO: why is this also triggered for namespaces and functions?\n    \"@typescript-eslint/semi\": \"warn\",\n    \"curly\": \"warn\",\n    \"eqeqeq\": \"warn\",\n    \"no-throw-literal\": \"warn\",\n    \"indent\": \"off\"\n  }\n}\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "content": "---\nname: Bug report\ndescription: Report a bug or an issue you've found with dbt Power User\nlabels: bug\nbody:\n  - type: textarea\n    attributes:\n      label: Expected behavior\n      description: What do you think should have happened\n      placeholder: >\n        A clear and concise description of what you expected to happen.\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: Actual behavior\n      description: Describe what actually happened\n      placeholder: >\n        A clear and concise description of what actually happened.\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: Steps To Reproduce\n      description: This will help us reproduce your issue\n      placeholder: >\n        In as much detail as possible, please provide steps to reproduce the issue.\n        Sample code that triggers the issue, relevant server settings, etc is all very helpful here.\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: Log output/Screenshots\n      description: What do you think went wrong?\n      placeholder: >\n        If applicable, add log output and/or screenshots to help explain your problem.\n  - type: input\n    attributes:\n      label: Operating System\n      description: What Operating System are you using?\n      placeholder: \"You can get it via `cat /etc/os-release` for example\"\n    validations:\n      required: true\n  - type: input\n    attributes:\n      label: dbt version\n      description: \"Execute `dbt --version`\"\n      placeholder: Which version of dbt are you using?\n    validations:\n      required: true\n  - type: input\n    attributes:\n      label: dbt Adapter\n      description: \"Which adapter are you using?\"\n    validations:\n      required: true\n  - type: input\n    attributes:\n      label: dbt Power User version\n      description: \"What dbt Power User version are you using?\"\n    validations:\n      required: true\n  - type: checkboxes\n    attributes:\n      label: Are you willing to submit PR?\n      description: >\n        This is absolutely not required, but we are happy to guide you in the contribution process\n        especially if you already have a good understanding of how to implement the feature.\n      options:\n        - label: Yes I am willing to submit a PR!\n  - type: markdown\n    attributes:\n      value: \"Thanks for completing our form!\"\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yaml",
    "content": "---\ncontact_links:\n  - name: Ask a question or get help right here\n    url: https://github.com/innoverio/vscode-dbt-power-user/discussions\n    about: Ask a question or get help here on Github Discussions\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "---\ncontact_links:\n  - name: Ask a question or get help right here\n    url: https://github.com/innoverio/vscode-dbt-power-user/discussions\n    about: Ask a question or get help here on Github Discussions\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "content": "---\nname: Feature request\ndescription: Suggest an idea for dbt Power User\nlabels: enhancement\nbody:\n  - type: textarea\n    attributes:\n      label: Describe the feature\n      description: What would you like to happen?\n      placeholder: >\n        A clear and concise description of what you want to happen\n        and what problem it would solve.\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: Describe alternatives you've considered\n      description: What did you try to make it happen?\n      placeholder: >\n        A clear and concise description of any alternative solutions or features you've considered.\n  - type: textarea\n    attributes:\n      label: Who will benefit?\n      placeholder: >\n        What kind of use case will this feature be useful for? Please be specific and provide examples, this will help us prioritize properly.\n  - type: checkboxes\n    attributes:\n      label: Are you willing to submit PR?\n      description: >\n        This is absolutely not required, but we are happy to guide you in the contribution process\n        especially if you already have a good understanding of how to implement the feature.\n      options:\n        - label: Yes I am willing to submit a PR!\n  - type: markdown\n    attributes:\n      value: \"Thanks for completing our form!\"\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/sweep-template.yml",
    "content": "name: Sweep Issue\ntitle: 'Sweep: '\ndescription: For small bugs, features, refactors, and tests to be handled by Sweep, an AI-powered junior developer.\nlabels: sweep\nbody:\n  - type: textarea\n    id: description\n    attributes:\n      label: Details\n      description: Tell Sweep where and what to edit and provide enough context for a new developer to the codebase\n      placeholder: |\n        Unit Tests: Write unit tests for <FILE>. Test each function in the file. Make sure to test edge cases.\n        Bugs: The bug might be in <FILE>. Here are the logs: ...\n        Features: the new endpoint should use the ... class from <FILE> because it contains ... logic.\n        Refactors: We are migrating this function to ... version because ...\n  - type: input\n    id: branch\n    attributes:\n      label: Branch\n      description: The branch to work off of (optional)\n      placeholder: |\n        main"
  },
  {
    "path": ".github/actions/common-build/action.yml",
    "content": "# .github/actions/common-build/action.yml\nname: \"Common Build\"\ndescription: \"Common build steps for the project\"\n\ninputs:\n  vsce-target:\n    description: \"VS Code target platform (e.g., darwin-arm64). When set, only the matching altimate-core native binary is installed.\"\n    required: false\n    default: \"\"\n\nruns:\n  using: \"composite\"\n  steps:\n    - name: Install Node.js\n      uses: actions/setup-node@v4\n      with:\n        node-version: \"20\"\n        cache: \"npm\"\n        cache-dependency-path: |\n          package-lock.json\n          webview_panels/package-lock.json\n    - run: npm ci\n      shell: bash\n      env:\n        VSCE_TARGET: ${{ inputs.vsce-target }}\n    - run: npm ci\n      shell: bash\n      working-directory: ./webview_panels\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n  # python dependencies\n  - package-ecosystem: \"npm\"\n    directory: \"/\"\n    schedule:\n      interval: \"daily\"\n    rebase-strategy: \"disabled\"\n    labels:\n      - \"dependencies\"\n"
  },
  {
    "path": ".github/pull_request_template.md",
    "content": "## Overview\n\n### Problem\n\nDescribe the problem you are solving. Mention the ticket/issue if applicable.\n\n### Solution\n\nDescribe the implemented solution. Add external references if needed.\n\n### Screenshot/Demo\n\nA picture is worth a thousand words. Please highlight the changes if applicable.\n\n### How to test\n\n- Steps to be followed to verify the solution or code changes\n- Mention if there is any settings configuration added/changed/deleted\n\n## Checklist\n\n- [ ] I have run this code and it appears to resolve the stated issue\n- [ ] `README.md` updated and added information about my change\n"
  },
  {
    "path": ".github/scripts/analyze-vsix.py",
    "content": "\"\"\"Analyze a VSIX file and output size data as JSON.\n\nReads the first .vsix file in the current directory, categorizes its\ncontents, and writes bundle-baseline.json with the results. Also sets\nthe vsix_size GitHub Actions output variable.\n\"\"\"\n\nimport json\nimport os\nimport sys\nimport zipfile\n\nCATEGORIES = [\n    (lambda n: \"altimate-core\" in n and n.endswith(\".node\"), \"Native: altimate-core\"),\n    (lambda n: \"zeromq/\" in n and n.endswith(\".node\"), \"Native: zeromq\"),\n    (lambda n: \"dist/node_modules/\" in n, \"Native: other node_modules\"),\n    (lambda n: n.endswith(\"extension.js\") and \"dist/\" in n, \"Extension backend (JS)\"),\n    (lambda n: \"webview_panels/dist/\" in n and n.endswith(\".js\"), \"Webview JS bundles\"),\n    (lambda n: \"webview_panels/dist/\" in n and n.endswith(\".css\"), \"Webview CSS\"),\n    (\n        lambda n: \"webview_panels/dist/\" in n\n        and (n.endswith(\".gif\") or n.endswith(\".png\")),\n        \"Webview images\",\n    ),\n    (lambda n: \"webview_panels/dist/\" in n, \"Webview other\"),\n    (\n        lambda n: \"altimate_python_packages/\" in n\n        or (n.endswith(\".py\") and \"dist/\" in n),\n        \"Python packages\",\n    ),\n    (lambda n: \"media/\" in n, \"Media assets\"),\n]\n\n\ndef categorize(filename):\n    for predicate, category in CATEGORIES:\n        if predicate(filename):\n            return category\n    return \"Other\"\n\n\ndef main():\n    vsix_files = [f for f in os.listdir(\".\") if f.endswith(\".vsix\")]\n    if not vsix_files:\n        print(\"No .vsix file found\", file=sys.stderr)\n        sys.exit(1)\n\n    vsix = vsix_files[0]\n    z = zipfile.ZipFile(vsix)\n    vsix_mb = os.path.getsize(vsix) / 1024 / 1024\n\n    categories = {}\n    for info in z.infolist():\n        cat = categorize(info.filename)\n        if cat not in categories:\n            categories[cat] = {\"raw\": 0, \"compressed\": 0, \"count\": 0}\n        categories[cat][\"raw\"] += info.file_size\n        categories[cat][\"compressed\"] += info.compress_size\n        categories[cat][\"count\"] += 1\n\n    baseline = {\"vsix_mb\": round(vsix_mb, 1), \"categories\": categories}\n    with open(\"bundle-baseline.json\", \"w\") as f:\n        json.dump(baseline, f)\n\n    gh_output = os.environ.get(\"GITHUB_OUTPUT\")\n    if gh_output:\n        with open(gh_output, \"a\") as f:\n            f.write(f\"vsix_size={vsix_mb:.1f}\\n\")\n\n    print(f\"VSIX size: {vsix_mb:.1f} MB\")\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": ".github/scripts/generate-bundle-report.py",
    "content": "\"\"\"Generate a bundle size report comparing current build against master baseline.\n\nReads bundle-baseline.json (current build) and optionally master-baseline.json\n(cached master baseline). Outputs:\n  - bundle-report.md: collapsible markdown report for PR comments\n  - GITHUB_OUTPUT: status_desc for the commit status API\n\nExpects VSCE_TARGET env var to label the platform.\n\"\"\"\n\nimport json\nimport os\nimport sys\n\n\ndef format_size(bytes_val):\n    if bytes_val >= 100 * 1024:\n        return f\"{bytes_val / 1024 / 1024:.1f} MB\"\n    return f\"{bytes_val / 1024:.0f} KB\"\n\n\ndef main():\n    target = os.environ.get(\"VSCE_TARGET\", \"unknown\")\n    current = json.load(open(\"bundle-baseline.json\"))\n    vsix_mb = current[\"vsix_mb\"]\n    categories = current[\"categories\"]\n\n    # Try to load master baseline for comparison\n    baseline_mb = None\n    baseline_cats = None\n    if os.path.exists(\"master-baseline.json\"):\n        try:\n            master = json.load(open(\"master-baseline.json\"))\n            baseline_mb = master[\"vsix_mb\"]\n            baseline_cats = master.get(\"categories\", {})\n        except Exception:\n            pass\n\n    # Build delta string for commit status\n    if baseline_mb is not None:\n        delta = vsix_mb - baseline_mb\n        sign = \"+\" if delta >= 0 else \"\"\n        delta_str = f\" ({sign}{delta:.1f} MB vs master)\"\n    else:\n        delta_str = \"\"\n\n    status_desc = f\"VSIX: {vsix_mb:.1f} MB{delta_str}\"\n\n    # Build summary line for collapsible header\n    if baseline_mb is not None:\n        delta = vsix_mb - baseline_mb\n        sign = \"+\" if delta >= 0 else \"\"\n        icon = \"\\U0001f534\" if delta > 1 else \"\\U0001f7e2\" if delta < -1 else \"\\u26aa\"\n        summary = f\"{target}: {vsix_mb:.1f} MB \\u00b7 {icon} {sign}{delta:.1f} MB vs master\"\n    else:\n        summary = f\"{target}: {vsix_mb:.1f} MB\"\n\n    total_raw = sum(v[\"raw\"] for v in categories.values())\n    total_compressed = sum(v[\"compressed\"] for v in categories.values())\n    total_files = sum(v[\"count\"] for v in categories.values())\n\n    # Build collapsible markdown report\n    lines = [\n        \"<details>\",\n        f\"<summary><strong>{summary}</strong></summary>\",\n        \"\",\n        \"| Category | Size | Compressed | Files |\",\n        \"|---|---:|---:|---:|\",\n    ]\n\n    sorted_cats = sorted(categories.items(), key=lambda x: x[1][\"raw\"], reverse=True)\n    for cat, v in sorted_cats:\n        raw = v[\"raw\"]\n        if raw < 1024:\n            continue\n        raw_s = format_size(raw)\n        comp_s = format_size(v[\"compressed\"])\n        delta_s = \"\"\n        if baseline_cats and cat in baseline_cats:\n            d = (raw - baseline_cats[cat][\"raw\"]) / 1024 / 1024\n            if abs(d) >= 0.1:\n                s = \"+\" if d >= 0 else \"\"\n                delta_s = f\" ({s}{d:.1f})\"\n        lines.append(f\"| {cat} | {raw_s}{delta_s} | {comp_s} | {v['count']} |\")\n\n    lines.append(\n        f\"| **Total** | **{total_raw / 1024 / 1024:.1f} MB** \"\n        f\"| **{total_compressed / 1024 / 1024:.1f} MB** | **{total_files}** |\"\n    )\n    lines.extend([\"\", \"</details>\"])\n\n    report = \"\\n\".join(lines)\n    with open(\"bundle-report.md\", \"w\") as f:\n        f.write(report)\n\n    gh_output = os.environ.get(\"GITHUB_OUTPUT\")\n    if gh_output:\n        with open(gh_output, \"a\") as f:\n            f.write(f\"status_desc={status_desc}\\n\")\n\n    print(report)\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "content": "on:\n  push:\n    branches:\n      - master\n  pull_request:\n    branches:\n      - master\n  release:\n    types:\n      - created\n\npermissions:\n  contents: read\n\njobs:\n  build:\n    strategy:\n      fail-fast: false\n      matrix:\n        include:\n          - os: macos-latest\n            vsce-target: darwin-arm64\n          - os: ubuntu-latest\n            vsce-target: linux-x64\n          - os: windows-latest\n            vsce-target: win32-x64\n    runs-on: ${{ matrix.os }}\n    permissions:\n      contents: read\n      pull-requests: write\n      statuses: write\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n      - name: Run common build steps\n        uses: ./.github/actions/common-build\n        with:\n          vsce-target: ${{ matrix.vsce-target }}\n      - name: Build and package VSIX\n        run: npx @vscode/vsce package --target ${{ matrix.vsce-target }}\n        env:\n          VSCE_TARGET: ${{ matrix.vsce-target }}\n          NODE_OPTIONS: --max-old-space-size=8192\n      - name: Analyze bundle size\n        id: analyze\n        run: python3 .github/scripts/analyze-vsix.py\n      - name: Restore master baseline\n        if: github.event_name == 'pull_request'\n        uses: actions/cache/restore@v4\n        with:\n          path: master-baseline.json\n          key: bundle-size-baseline-${{ matrix.vsce-target }}-will-not-match\n          restore-keys: bundle-size-baseline-${{ matrix.vsce-target }}-\n      - name: Save master baseline\n        if: github.event_name == 'push' && github.ref == 'refs/heads/master'\n        uses: actions/cache/save@v4\n        with:\n          path: bundle-baseline.json\n          key: bundle-size-baseline-${{ matrix.vsce-target }}-${{ github.sha }}\n      - name: Generate report\n        id: report\n        run: python3 .github/scripts/generate-bundle-report.py\n        env:\n          VSCE_TARGET: ${{ matrix.vsce-target }}\n      - name: Set commit status\n        if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository\n        uses: actions/github-script@v7\n        with:\n          script: |\n            const desc = '${{ steps.report.outputs.status_desc }}';\n            const target = '${{ matrix.vsce-target }}';\n            await github.rest.repos.createCommitStatus({\n              owner: context.repo.owner,\n              repo: context.repo.repo,\n              sha: context.payload.pull_request.head.sha,\n              state: 'success',\n              description: desc,\n              context: `Bundle Size (${target})`,\n              target_url: `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`,\n            });\n      - name: Upload report\n        if: github.event_name == 'pull_request'\n        uses: actions/upload-artifact@v4\n        with:\n          name: bundle-report-${{ matrix.vsce-target }}\n          path: bundle-report.md\n          retention-days: 1\n      - name: Job summary\n        shell: bash\n        run: cat bundle-report.md >> \"$GITHUB_STEP_SUMMARY\"\n\n  bundle-size-report:\n    needs: build\n    runs-on: ubuntu-latest\n    if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository\n    permissions:\n      pull-requests: write\n    steps:\n      - name: Download all reports\n        uses: actions/download-artifact@v4\n        with:\n          pattern: bundle-report-*\n      - name: Combine reports\n        run: |\n          echo \"## Bundle Size Report\" > combined-report.md\n          echo \"\" >> combined-report.md\n          for dir in bundle-report-*/; do\n            cat \"$dir/bundle-report.md\" >> combined-report.md\n            echo \"\" >> combined-report.md\n          done\n      - name: Post PR comment\n        uses: actions/github-script@v7\n        with:\n          script: |\n            const fs = require('fs');\n            const report = fs.readFileSync('combined-report.md', 'utf8');\n            const marker = '<!-- bundle-size-report -->';\n            const body = marker + '\\n' + report;\n\n            const { data: comments } = await github.rest.issues.listComments({\n              owner: context.repo.owner,\n              repo: context.repo.repo,\n              issue_number: context.issue.number,\n            });\n\n            const existing = comments.find(c => c.body.includes(marker));\n\n            if (existing) {\n              await github.rest.issues.updateComment({\n                owner: context.repo.owner,\n                repo: context.repo.repo,\n                comment_id: existing.id,\n                body,\n              });\n            } else {\n              await github.rest.issues.createComment({\n                owner: context.repo.owner,\n                repo: context.repo.repo,\n                issue_number: context.issue.number,\n                body,\n              });\n            }\n\n  release-vsstudio-marketplace:\n    needs: build\n    runs-on: ubuntu-latest\n    if: success() && startsWith( github.ref, 'refs/tags/')\n    strategy:\n      fail-fast: false\n      matrix:\n        target:\n          - darwin-arm64\n          - darwin-x64\n          - linux-arm64\n          - linux-x64\n          - win32-x64\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n      - name: Run common build steps\n        uses: ./.github/actions/common-build\n        with:\n          vsce-target: ${{ matrix.target }}\n      - name: Publish Visual Studio Marketplace\n        run: |\n          PRE_RELEASE=\"\"\n          if [ \"${{ github.event_name }}\" == \"release\" ] && [ \"${{ github.event.release.prerelease }}\" == \"true\" ]; then\n            PRE_RELEASE=\"--pre-release\"\n          fi\n          npx vsce publish --skip-duplicate --target ${{ matrix.target }} $PRE_RELEASE\n        env:\n          VSCE_PAT: ${{ secrets.VSCE_PAT }}\n          VSCE_TARGET: ${{ matrix.target }}\n\n    # Send notification after all platform builds (only on the last matrix entry)\n  release-vsstudio-notify:\n    runs-on: ubuntu-latest\n    needs: release-vsstudio-marketplace\n    if: always() && startsWith( github.ref, 'refs/tags/')\n    steps:\n      - name: Send Slack notification\n        env:\n          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}\n        uses: 8398a7/action-slack@v3\n        with:\n          status: ${{ needs.release-vsstudio-marketplace.result }}\n          text: \"Tag: ${{  github.ref_name }} release to Visual Studio Marketplace status: ${{ needs.release-vsstudio-marketplace.result == 'success' && 'succeeded' || 'failed' }} :${{ needs.release-vsstudio-marketplace.result == 'success' && 'tada' || 'disappointed' }}:\"\n\n  release-openvsx-marketplace:\n    needs: build\n    runs-on: ubuntu-latest\n    if: success() && startsWith( github.ref, 'refs/tags/')\n    strategy:\n      fail-fast: false\n      matrix:\n        target:\n          - darwin-arm64\n          - darwin-x64\n          - linux-arm64\n          - linux-x64\n          - win32-x64\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n      - name: Run common build steps\n        uses: ./.github/actions/common-build\n        with:\n          vsce-target: ${{ matrix.target }}\n      - name: Publish OpenVSX Marketplace\n        run: |\n          PRE_RELEASE=\"\"\n          if [ \"${{ github.event_name }}\" == \"release\" ] && [ \"${{ github.event.release.prerelease }}\" == \"true\" ]; then\n            PRE_RELEASE=\"--pre-release\"\n          fi\n          npx ovsx publish --skip-duplicate --target ${{ matrix.target }} $PRE_RELEASE\n        env:\n          OVSX_PAT: ${{ secrets.OVSX_PAT }}\n          VSCE_TARGET: ${{ matrix.target }}\n\n  release-openvsx-notify:\n    runs-on: ubuntu-latest\n    needs: release-openvsx-marketplace\n    if: always() && startsWith( github.ref, 'refs/tags/')\n    steps:\n      - name: Send Slack notification\n        env:\n          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}\n        uses: 8398a7/action-slack@v3\n        with:\n          status: ${{ needs.release-openvsx-marketplace.result }}\n          text: \"Tag: ${{  github.ref_name }} release to openvsx marketplace status: ${{ needs.release-openvsx-marketplace.result == 'success' && 'succeeded' || 'failed' }} :${{ needs.release-openvsx-marketplace.result == 'success' && 'tada' || 'disappointed' }}:\"\n"
  },
  {
    "path": ".github/workflows/deploy-docs-to-s3.yaml",
    "content": "name: Deploy Static Website to AWS\n\n# Defines when the action will run.\n# This example triggers the workflow on push events to the main branch.\non:\n  push:\n    branches: [master]\n\n# Limit permissions for the GITHUB_TOKEN to adhere to the principle of least privilege.\npermissions:\n  contents: read\n\n# The jobs that will be executed by the workflow.\njobs:\n  deploy:\n    # The type of runner that the job will run on.\n    runs-on: ubuntu-latest\n\n    # Steps represent a sequence of tasks that will be executed as part of the job.\n    steps:\n      # Checks-out your repository under $GITHUB_WORKSPACE, so the job can access it.\n      - uses: actions/checkout@v2\n\n      # Install MkDocs and any necessary plugins\n      - name: Install MkDocs with plugins\n        run: |\n          pip install mkdocs          \n          pip install mkdocs-material\n          pip install mkdocs-git-revision-date-localized-plugin\n\n      # Build your site using MkDocs\n      - name: Build site with MkDocs\n        run: |\n          cd documentation\n          mkdocs build --clean\n\n      # Deploy to AWS\n      - name: Deploy to AWS\n        uses: onramper/action-deploy-aws-static-site@v3.2.0\n        with:\n          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}\n          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n          domain: docs.myaltimate.com\n          publish_dir: ./documentation/site\n"
  },
  {
    "path": ".github/workflows/tests.yml",
    "content": "name: Tests\n\non:\n  push:\n    branches: [\"*\"]\n  pull_request:\n    branches: [\"*\"]\n\njobs:\n  test:\n    strategy:\n      matrix:\n        os: [macos-latest, ubuntu-latest, windows-latest]\n    runs-on: ${{ matrix.os }}\n\n    steps:\n      - uses: actions/checkout@v3\n\n      - name: Setup Node.js\n        uses: actions/setup-node@v3\n        with:\n          node-version: \"18\"\n          cache: \"npm\"\n          cache-dependency-path: |\n            package-lock.json\n            webview_panels/package-lock.json\n      - name: Install dependencies\n        run: |\n          npm ci\n          npm run install:panels\n      - name: Compile\n        run: npm run compile\n\n      - name: Install xvfb\n        if: runner.os == 'Linux'\n        run: |\n          sudo apt-get update\n          sudo apt-get install -y xvfb\n      - name: Run unit tests (Linux)\n        if: runner.os == 'Linux'\n        run: |\n          xvfb-run --auto-servernum npm run compile && xvfb-run --auto-servernum npm run test:coverage\n      - name: Run unit tests (macOS/Windows)\n        if: runner.os != 'Linux'\n        run: |\n          npm run compile && npm run test:coverage\n\n      - name: Setup Python\n        uses: actions/setup-python@v5\n        with:\n          python-version: \"3.11\"\n\n      - name: Install sqlfmt\n        run: pip install \"shandy-sqlfmt[jinjafmt]\"\n\n      - name: Run integration tests (Linux)\n        if: runner.os == 'Linux'\n        run: xvfb-run --auto-servernum npm run test:integration\n\n      - name: Run integration tests (macOS/Windows)\n        if: runner.os != 'Linux'\n        run: npm run test:integration\n\n      - name: Upload test results\n        if: always()\n        uses: actions/upload-artifact@v4\n        with:\n          name: test-results-${{ matrix.os }}\n          path: test-results/\n\n      - name: Upload coverage results\n        if: always()\n        uses: actions/upload-artifact@v4\n        with:\n          name: coverage-${{ matrix.os }}\n          path: |\n            coverage/\n            .nyc_output/\n            *.lcov\n      - name: Upload coverage to Codecov\n        if: always()\n        uses: codecov/codecov-action@v3\n        with:\n          token: ${{ secrets.CODECOV_TOKEN }}\n          directory: ./coverage/\n          flags: unittests\n          name: codecov-${{ matrix.os }}\n          fail_ci_if_error: false\n"
  },
  {
    "path": ".gitignore",
    "content": "out\nnode_modules\ndist\n.vscode-test/\n*.vsix\n.DS_Store\n.idea\n.history\n__pycache__/\n*.pyc\n*.pyo\n*.pyd\n.claude\n\n# Build and dependencies\nsrc/lib/notebooks/\n.nyc_output/\ncoverage/\ntest-results/\n.venv/\n\n# Test directories\ntest_dbt_project/\ntest-workspace/\n\n# IDE and editor files\n*.swp\n*.swo\n.vscode/\n*.code-workspace\n\n# OS generated files\n.DS_Store\n.DS_Store?\n._*\n.Spotlight-V100\n.Trashes\nehthumbs.db\nThumbs.db\n.aider*\ncerts\nmcp.json\n\n# Docker setup\ndocker-setup/*.vsix\ndocker-setup/.env\n\n# Playwright MCP\n.playwright-mcp/\n\n# GitHub issues dashboard cache\nmonitoring/github_issues/.cache/\n"
  },
  {
    "path": ".gitpod.yml",
    "content": "# This configuration file was automatically generated by Gitpod.\n# Please adjust to your needs (see https://www.gitpod.io/docs/introduction/learn-gitpod/gitpod-yaml)\n# and commit this file to your remote git repository to share the goodness with others.\n\n# Learn more from ready-to-use templates: https://www.gitpod.io/docs/introduction/getting-started/quickstart\n\nports:\n  # webview_panels\n  - port: 5173\n    visibility: public\n    onOpen: open-browser\n  # webview_panels storybook\n  - port: 6006\n    visibility: public\n    onOpen: open-browser\n\ntasks:\n  - init: npm install\n  - name: webview_panels install\n    before: |\n      cd webview_panels\n      npm install\n      gp sync-done webview_panels_install\n\n  - name: webview_panels storybook\n    command: |\n      cd webview_panels\n      gp sync-await webview_panels_install\n      npm run storybook\n\n  - name: webview_panels dev server\n    command: |\n      cd webview_panels\n      gp sync-await webview_panels_install\n      npm run dev\n"
  },
  {
    "path": ".husky/pre-commit",
    "content": "npx lint-staged\n"
  },
  {
    "path": ".mcp.json",
    "content": "{\n  \"mcpServers\": {\n    \"playwright\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@playwright/mcp\"],\n      \"env\": { \"BROWSER_NAME\": \"chromium\" }\n    }\n  }\n}\n"
  },
  {
    "path": ".nycrc.json",
    "content": "{\n  \"extends\": \"@istanbuljs/nyc-config-typescript\",\n  \"all\": true,\n  \"check-coverage\": true,\n  \"reporter\": [\"text\", \"lcov\"],\n  \"exclude\": [\n    \"coverage/**\",\n    \"packages/*/test/**\",\n    \"test/**\",\n    \"test{,-*}.{js,cjs,mjs,ts}\",\n    \"**/*{.,-}test.{js,cjs,mjs,ts}\",\n    \"**/__tests__/**\",\n    \"**/{karma,rollup,webpack,vite,vitest,jest,ava,babel,nyc,cypress}.config.{js,cjs,mjs,ts}\",\n    \"**/node_modules/**\",\n    \"dist/**\",\n    \"out/**\",\n    \"src/test/**\",\n    \"src/**/*.test.ts\",\n    \"src/test/suite/**\"\n  ],\n  \"include\": [\"src/**/*.ts\"],\n  \"branches\": 5,\n  \"lines\": 7,\n  \"functions\": 7,\n  \"statements\": 7\n}\n"
  },
  {
    "path": ".prettierignore",
    "content": "node_modules\n"
  },
  {
    "path": ".prettierrc",
    "content": "{\n  \"plugins\": [\"prettier-plugin-organize-imports\"]\n}"
  },
  {
    "path": ".vscodeignore",
    "content": ".vscode/**\n.vscode-test/**\nout/**\nsrc/**\n**/node_modules\n!dist/node_modules/**\n.gitignore\nvsc-extension-quickstart.md\n**/tsconfig.json\n**/.eslintrc.json\n**/*.map\n**/*.ts\n.github\n.claude\n.mcp.json\n.playwright-mcp\ndocker-setup\n**/*.test.*\nCLAUDE.md\nwebview_panels\n!webview_panels/dist\n\n# Non-runtime directories (docs site, test fixtures, monitoring, git hooks)\ndocumentation\ntest-fixtures\nmonitoring\n.husky\n\n# Dev/CI config files not needed in the installed extension\njest.config.js\n.gitpod.yml\n.nycrc.json\ncodecov.yml\n.prettierignore\nsweep.yaml\nprepareBuild.js\nCONTRIBUTING.md\n"
  },
  {
    "path": "CLAUDE.md",
    "content": "# Claude Code - dbt Power User VSCode Extension Architecture Guide\n\n## Project Overview\n\n**vscode-dbt-power-user** is a comprehensive VSCode extension that makes VSCode seamlessly work with dbt (data build tool). It's an open-source project published by Altimate AI that extends VSCode with advanced dbt features including auto-completion, query preview, lineage visualization, documentation generation, and AI-powered features.\n\n### Key Statistics\n\n- **Version**: 0.57.3\n- **Project Type**: VSCode Extension (TypeScript/React)\n- **License**: MIT\n- **Architecture**: Multi-layered with webview panels, Python integrations, and MCP server\n\n## High-Level Architecture\n\n### 1. Core Extension Architecture\n\nThe extension follows a **dependency injection pattern** using Inversify container:\n\n- **Entry Point**: `src/extension.ts` → `DBTPowerUserExtension`\n- **DI Container**: `src/inversify.config.ts` manages all service dependencies\n- **Main Extension Class**: `DBTPowerUserExtension` orchestrates all components\n\n### 2. Multi-Process Architecture\n\nThe extension operates across multiple processes:\n\n1. **Main Extension Process** (Node.js/TypeScript)\n\n   - VSCode API integration\n   - File system operations\n   - dbt CLI interactions\n\n2. **Webview Panels** (React/TypeScript)\n\n   - Modern React-based UI components\n   - Located in `webview_panels/` directory\n   - Built with Vite, uses Antd for UI components\n\n3. **Python Bridge Integration**\n\n   - dbt core/cloud integration via Python scripts\n   - Key files: `dbt_core_integration.py`, `dbt_cloud_integration.py`\n   - Jupyter kernel for notebook functionality\n\n4. **MCP Server** (Model Context Protocol)\n   - AI integration and tool calling functionality\n   - Located in `src/mcp/`\n\n### 3. Key Module Organization\n\n```\nsrc/\n├── manifest/           # dbt project parsing and management\n├── dbt_client/        # dbt integration (core, cloud, fusion)\n├── webview_provider/  # Webview panel management\n├── autocompletion_provider/ # Language server features\n├── services/          # Business logic services\n├── commands/          # VSCode command implementations\n├── mcp/              # Model Context Protocol server\n└── telemetry/        # Analytics and tracking\n```\n\n## Core Functionality Areas\n\n### 1. dbt Integration Support\n\n**Multiple Integration Types**:\n\n- **dbt Core**: Direct Python integration via Python bridge\n- **dbt Cloud**: API-based integration with dbt Cloud services\n- **dbt Fusion**: Command-line integration with dbt-fusion CLI\n- **Core Command**: CLI wrapper integration for dbt core\n\n**Key Integration Files**:\n\n- `src/dbt_client/dbtCoreIntegration.ts` - dbt Core Python integration\n- `src/dbt_client/dbtCloudIntegration.ts` - dbt Cloud API integration\n- `src/dbt_client/dbtFusionCommandIntegration.ts` - dbt Fusion CLI integration\n- `dbt_core_integration.py` - Python bridge for Core integration\n\n### 2. Language Server Features\n\n**Provider Architecture**: Each feature implemented as a separate provider:\n\n- `autocompletion_provider/` - IntelliSense for dbt models, macros, sources\n- `definition_provider/` - Go-to-definition functionality\n- `hover_provider/` - Hover information\n- `code_lens_provider/` - Inline actions\n- `validation_provider/` - SQL validation\n\n### 3. Webview Panel System\n\n**Modern React Architecture** (`webview_panels/`):\n\n- **Build System**: Vite + TypeScript + React 18\n- **State Management**: Redux Toolkit\n- **UI Framework**: Antd + custom components\n- **Data Visualization**: Perspective.js, Plotly.js\n\n**Key Panels**:\n\n- `modules/dataPilot/` - AI chat interface\n- `modules/queryPanel/` - Query results and analysis\n- `modules/lineage/` - Data lineage visualization\n- `modules/documentationEditor/` - Documentation management\n- `modules/insights/` - Project insights and actions\n\n### 4. AI and Advanced Features\n\n**DataPilot AI Integration**:\n\n- Chat-based interface for dbt assistance\n- Query explanation and optimization\n- Documentation generation\n- Test suggestions\n\n**MCP Server Integration**:\n\n- Tool calling for dbt operations\n- Integration with Claude and other AI models\n- Located in `src/mcp/server.ts`\n\n## Build System and Tooling\n\n### 1. Multi-Stage Build Process\n\n**Main Extension Build** (Webpack):\n\n```bash\nnpm run webpack        # Development build\nnpm run vscode:prepublish  # Production build\n```\n\n**Webview Panels Build** (Vite):\n\n```bash\nnpm run panel:webviews  # Build React components\n```\n\n### 2. Development Workflow\n\n**Key Scripts**:\n\n- `npm run compile` - Compile the code\n- `npm run watch` - Development with hot reload\n- `npm run test` - Jest-based testing\n- `npm run lint` - ESLint + Prettier\n- `npm run build-vsix` - Package extension\n\n**Development Environment**:\n\n- Uses VSCode's built-in debugger (\"Launch Extension\")\n- Hot reload for webview panels\n- Python environment auto-detection\n\n### 3. Testing Strategy\n\n**Test Configuration** (`jest.config.js`):\n\n- **Unit Tests**: Jest + ts-jest\n- **Mock System**: Custom VSCode API mocks\n- **Coverage**: Istanbul-based coverage reporting\n- **Test Location**: `src/test/` with mock infrastructure\n\n## Key Dependencies and Integrations\n\n### 1. VSCode Extension Dependencies\n\n**Required Extensions**:\n\n- `samuelcolvin.jinjahtml` - Jinja templating support\n- `ms-python.python` - Python environment integration\n- `altimateai.vscode-altimate-mcp-server` - MCP server\n\n### 2. Major Technical Dependencies\n\n**Backend (Node.js)**:\n\n- `inversify` - Dependency injection\n- `python-bridge` - Python process communication\n- `zeromq` - Jupyter kernel communication\n- `@modelcontextprotocol/sdk` - MCP protocol\n\n**Frontend (React)**:\n\n- `react` 18 + `react-dom`\n- `@reduxjs/toolkit` - State management\n- `antd` - UI component library\n- `@finos/perspective` - Data grid and visualization\n\n### 3. Python Integration\n\n**Python Scripts**:\n\n- `dbt_core_integration.py` - Core dbt operations\n- `dbt_cloud_integration.py` - Cloud API operations\n- `dbt_healthcheck.py` - Project health analysis\n- `altimate_notebook_kernel.py` - Jupyter integration\n\n## Configuration and Extensibility\n\n### 1. Extension Configuration\n\n**Comprehensive Settings** (190+ configuration options):\n\n- dbt integration mode selection\n- Query limits and templates\n- AI features and endpoints\n- Lineage visualization options\n- Defer-to-production configuration\n\n### 2. Language Support\n\n**File Type Associations**:\n\n- `jinja-sql` - Primary dbt model files\n- `jinja-yaml` - dbt configuration files\n- `jinja-md` - Documentation files\n- Custom notebook format (`.notebook`)\n\n### 3. Command System\n\n**80+ Commands Available**:\n\n- Model execution (`dbtPowerUser.runCurrentModel`)\n- Documentation generation (`dbtPowerUser.generateSchemaYML`)\n- Query analysis (`dbtPowerUser.sqlLineage`)\n- AI assistance (`dbtPowerUser.openDatapilotWithQuery`)\n\n## Deployment and Distribution\n\n### 1. Multi-Platform Distribution\n\n**CI/CD Pipeline** (`.github/workflows/ci.yml`):\n\n- **Build Matrix**: macOS, Ubuntu, Windows\n- **Visual Studio Marketplace**: Primary distribution\n- **OpenVSX Registry**: Open-source alternative\n- **Platform-specific builds**: Architecture-aware packaging\n\n### 2. Release Process\n\n**Automated Release**:\n\n- Git tag triggers release pipeline\n- Pre-release and stable channel support\n- Slack notifications for release status\n- VSIX package generation\n\n## Development Guidelines\n\n### 1. Code Organization Principles\n\n- **Dependency Injection**: All services use Inversify DI\n- **Provider Pattern**: Language features as modular providers\n- **Event-Driven**: Manifest changes trigger updates across components\n- **Separation of Concerns**: Clear boundaries between UI, business logic, and dbt integration\n\n### 2. Adding New Features\n\n**For Language Features**:\n\n1. Create provider in appropriate `*_provider/` directory\n2. Register in `inversify.config.ts`\n3. Wire up in `DBTPowerUserExtension`\n\n**For UI Features**:\n\n1. Add React component in `webview_panels/src/modules/`\n2. Update routing in `AppRoutes.tsx`\n3. Add state management slice if needed\n\n**For dbt Integration**:\n\n1. Extend appropriate dbt client (`dbtCoreIntegration.ts` etc.)\n2. Add Python bridge function if needed\n3. Update MCP server tools if AI-accessible\n\n### 3. Testing Approach\n\n- **Unit Tests**: Mock VSCode APIs and dependencies\n- **Integration Tests**: Test with real dbt projects\n- **Manual Testing**: Use \"Launch Extension\" debug configuration\n- **Webview Testing**: Storybook for component development\n\n## Common Development Patterns\n\n### 1. Manifest-Driven Architecture\n\nThe extension heavily relies on dbt's `manifest.json` for understanding project structure. Most features key off manifest parsing events.\n\n### 2. Multi-Integration Support\n\nAlways consider how features work across dbt core, cloud, and other integration types. Use strategy pattern for integration-specific behavior.\n\n### 3. Webview Communication\n\nUses VSCode's webview messaging system with typed message contracts. State is synchronized between extension and webview contexts.\n\n### 4. Python Bridge Pattern\n\nFor dbt operations requiring Python, use the established bridge pattern with JSON serialization and error handling.\n\nThis architecture enables the extension to provide comprehensive dbt development support while maintaining modularity and extensibility for future enhancements.\n\n---\n\n# User Guide\n\n## Core Features Overview\n\nThe dbt Power User extension accelerates dbt and SQL development by 3x through three key phases:\n\n### 🔧 DEVELOP\n\n- **SQL Visualizer**: Visual query builder and analyzer\n- **Query Explanation**: AI-powered SQL query explanation\n- **Auto-generation**: Generate dbt models from sources or raw SQL\n- **Auto-completion**: IntelliSense for dbt models, macros, sources, and doc blocks\n- **Click to Run**: Execute models directly from editor\n- **Query Translation**: Translate SQL between different dialects\n- **Compiled SQL Preview**: View compiled dbt code before execution\n\n### 🧪 TEST\n\n- **Query Results Preview**: Execute and analyze query results with export capabilities\n- **Test Generation**: AI-powered test generation for dbt models\n- **Column Lineage**: Detailed data lineage with code visibility\n- **Defer to Production**: Run models without rebuilding dependencies\n- **SQL Validation**: Validate SQL without execution\n- **Model Lineage**: Visual representation of model dependencies\n\n### 🤝 COLLABORATE\n\n- **Documentation Generation**: AI-powered documentation creation\n- **Code Collaboration**: Discussion threads on code and documentation\n- **Project Governance**: Automated checks for code quality and standards\n- **SaaS UI Integration**: Web-based interface for dbt docs and lineage\n- **Query History & Bookmarks**: Track and share query executions\n- **Export Workflows**: Share lineage and documentation externally\n\n## DataMates AI Integration\n\nThe extension includes **AI Teammates** through the DataMates Platform:\n\n- **Coaching**: Personalize AI teammates for specific requirements\n- **Query Assistance**: AI-powered query explanation and optimization\n- **Documentation**: Automated documentation generation\n- **Test Suggestions**: Smart test recommendations\n- **SQL Translation**: Cross-dialect SQL conversion\n\n## Feature Availability\n\n**Free Extension Features**:\n\n- SQL Visualizer, Model-level lineage, Auto-generation from sources\n- Auto-completion, Click to Run, Compiled SQL preview\n- Query results preview, Defer to production, SQL validation\n\n**With Altimate AI Key** (free signup at [app.myaltimate.com](https://app.myaltimate.com)):\n\n- Column-level lineage, Query explanation AI, Query translation AI\n- Auto-generation from SQL, Test generation AI, Documentation generation AI\n- Code/documentation collaboration, Lineage export, SaaS UI\n- Project governance, Query history & bookmarks\n\n---\n\n# Installation and Setup\n\n## Installation Methods\n\n### Native Installation\n\nInstall directly from [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=innoverio.vscode-dbt-power-user) or via VS Code:\n\n1. Open VS Code Extensions panel (`Ctrl+Shift+X`)\n2. Search for \"dbt Power User\"\n3. Click Install\n4. Reload VS Code if prompted\n\n### Dev Container Installation\n\nAdd to your `.devcontainer/devcontainer.json`:\n\n```json\n{\n  \"customizations\": {\n    \"vscode\": {\n      \"files.associations\": {\n        \"*.yaml\": \"jinja-yaml\",\n        \"*.yml\": \"jinja-yaml\",\n        \"*.sql\": \"jinja-sql\",\n        \"*.md\": \"jinja-md\"\n      },\n      \"extensions\": [\"innoverio.vscode-dbt-power-user\"]\n    }\n  }\n}\n```\n\n### Cursor IDE Support\n\nThe extension is also available for [Cursor IDE](https://www.cursor.com/how-to-install-extension). Install the same way as VS Code.\n\n## Required Configuration\n\n### 1. dbt Integration Setup\n\nConfigure how the extension connects to dbt:\n\n- **dbt Core**: For local dbt installations with Python bridge (default)\n- **dbt Cloud**: For dbt Cloud API integration\n- **dbt Fusion**: For dbt-fusion CLI integration\n- **dbt Core Command**: For CLI-based dbt core integration\n\nSet via `dbt.dbtIntegration` setting.\n\n#### dbt Fusion Integration\n\ndbt Fusion is a command-line interface that provides enhanced dbt functionality. When using fusion integration:\n\n- Requires dbt-fusion CLI to be installed in your environment\n- Extension automatically detects fusion installation via `dbt --version` output\n- Provides full feature support including query execution, compilation, and catalog operations\n- Uses JSON log format for structured command output parsing\n\n### 2. Python Environment\n\nEnsure Python and dbt are properly installed and accessible. The extension will auto-detect your Python environment through the VS Code Python extension.\n\n### 3. Optional: Altimate AI Key\n\nFor advanced AI features, get a free API key:\n\n1. Sign up at [app.myaltimate.com/register](https://app.myaltimate.com/register)\n2. Add API key to `dbt.altimateAiKey` setting\n3. Set instance name in `dbt.altimateInstanceName` setting\n\n## Project Setup\n\n1. Open your dbt project folder in VS Code\n2. Run the setup wizard: Select \"dbt\" in bottom status bar → \"Setup Extension\"\n3. The extension will auto-install dbt dependencies if enabled\n4. Verify setup via Command Palette → \"dbt Power User: Diagnostics\"\n\n---\n\n# Troubleshooting for Developers\n\n## Quick Diagnostics\n\n### 1. Setup Wizard\n\nUse the built-in setup wizard for automated issue detection:\n\n- Click \"dbt\" or \"dbt is not installed\" in bottom status bar\n- Select \"Setup Extension\"\n- Follow guided setup process\n\n### 2. Diagnostics Command\n\nRun comprehensive system diagnostics:\n\n- Open Command Palette (`Cmd+Shift+P` / `Ctrl+Shift+P`)\n- Type \"diagnostics\" → Select \"dbt Power User: Diagnostics\"\n- Review output for environment issues, Python/dbt installation status, and connection problems\n\n### 3. Problems Panel\n\nCheck VS Code Problems panel for dbt project issues:\n\n- View → Problems (or `Ctrl+Shift+M`)\n- Look for dbt-related validation errors\n\n## Debug Logging\n\nEnable detailed logging for troubleshooting:\n\n1. Command Palette → \"Set Log Level\" → \"Debug\"\n2. View logs: Output panel → \"Log\" dropdown → \"dbt\"\n3. Reproduce the issue to capture debug information\n\n## Developer Tools\n\nFor advanced debugging:\n\n- Help → Toggle Developer Tools\n- Check console for JavaScript errors and detailed logs\n\n## Common Issues\n\n**Extension not recognizing dbt project**:\n\n- Verify `dbt_project.yml` exists in workspace root\n- Check Python environment has dbt installed\n- Run diagnostics command for detailed analysis\n\n**Python/dbt not found**:\n\n- Configure Python interpreter via VS Code Python extension\n- Verify dbt is installed in selected Python environment\n- Set `dbt.dbtPythonPathOverride` if using custom Python path\n\n**Connection issues**:\n\n- Verify database connection in dbt profiles\n- Check firewall/network settings\n- Review connection details in diagnostics output\n\n## Getting Help\n\n- Join [#tools-dbt-power-user](https://getdbt.slack.com/archives/C05KPDGRMDW) in dbt Community Slack\n- Contact support at [altimate.ai/support](https://www.altimate.ai/support)\n- Use in-extension feedback widgets for feature-specific issues\n\n---\n\n# Core Development Features\n\n## Auto-completion and Navigation\n\n### Model Auto-completion\n\n- **Smart IntelliSense**: Auto-complete model names with `ref()` function\n- **Go-to-Definition**: Navigate directly to model files\n- **Hover Information**: View model details on hover\n\n### Macro Support\n\n- **Macro Auto-completion**: IntelliSense for custom and built-in macros\n- **Parameter Hints**: Auto-complete macro parameters\n- **Definition Navigation**: Jump to macro definitions\n\n### Source Integration\n\n- **Source Auto-completion**: IntelliSense for configured sources\n- **Column Awareness**: Auto-complete source column names\n- **Schema Navigation**: Navigate to source definitions\n\n### Documentation Blocks\n\n- **Doc Block Auto-completion**: IntelliSense for documentation references\n- **Definition Linking**: Navigate to doc block definitions\n\n## Query Development\n\n### SQL Compilation and Preview\n\n- **Compiled Code View**: See final SQL before execution\n- **Template Resolution**: Preview Jinja templating results\n- **Syntax Highlighting**: Enhanced SQL syntax highlighting for dbt files\n\n### Query Execution\n\n- **Preview Results**: Execute queries with `Cmd+Enter` / `Ctrl+Enter`\n- **Result Analysis**: Export results as CSV, copy as JSON\n- **Query History**: Track executed queries\n- **Configurable Limits**: Set row limits for query previews (default: 500 rows)\n\n### SQL Formatting\n\n- **Auto-formatting**: Integration with sqlfmt\n- **Custom Parameters**: Configure formatting rules\n- **Batch Processing**: Format multiple files\n\n## AI-Powered Development\n\n### Query Explanation\n\n- **Natural Language**: Get plain English explanations of complex SQL\n- **Step-by-step Analysis**: Breakdown of query logic\n- **Performance Insights**: Query optimization suggestions\n\n### Code Generation\n\n- **Model from Source**: Generate base models from source tables\n- **Model from SQL**: Convert raw SQL to dbt models\n- **Test Generation**: AI-powered test suggestions\n- **Documentation Generation**: Auto-generate model documentation\n\n### Query Translation\n\n- **Cross-dialect Support**: Translate SQL between database dialects\n- **Syntax Adaptation**: Handle dialect-specific functions and syntax\n\n## Documentation\n\nThis is a MkDocs-based documentation site for the dbt Power User VSCode Extension by Altimate AI. The site uses the Material theme and is organized around user workflows: Develop, Test, and Collaborate.\n\n### Development Commands\n\n- **Install dependencies**: `pip install --requirement documentation/requirements.txt`\n- **Start development server**: `cd documentation; mkdocs serve` (serves at http://127.0.0.1:8000)\n- **Build site**: `cd documentation; mkdocs build`\n- **Deploy to GitHub Pages**: `cd documentation; mkdocs gh-deploy`\n\n### Architecture\n\n#### Content Organization\n\n- `documentation/docs/` contains all documentation content in Markdown format\n- Content is organized by feature areas: `setup/`, `develop/`, `test/`, `document/`, `govern/`, `discover/`, `teammates/`, `datamates/`, `arch/`\n- Images and assets are stored within feature-specific directories\n- `documentation/mkdocs.yml` contains all site configuration\n\n#### Key Configuration Files\n\n- `documentation/mkdocs.yml`: Main site configuration including navigation, theme settings, and plugins\n- `documentation/requirements.txt`: Python dependencies for MkDocs and plugins\n- `documentation/docs/overrides/`: Custom theme overrides (currently empty)\n- `documentation/docs/javascripts/`: Custom JavaScript for enhanced functionality\n\n#### Theme Configuration\n\nThe site uses Material theme with:\n\n- Custom Altimate AI branding and colors\n- Google Analytics integration (G-LXRSS3VK5N)\n- Git revision date tracking via plugin\n- Built-in feedback system\n- Dark/light mode support\n\n#### Navigation Structure\n\nNavigation follows a three-phase user journey:\n\n1. **Setup**: Installation and configuration\n2. **Develop**: Core development features\n3. **Test**: Testing and validation tools\n4. **Additional**: Documentation, collaboration, discovery, and AI features\n\n### Working with Content\n\n#### Adding New Pages\n\n1. Create `.md` files in the appropriate `docs/` subdirectory\n2. Update the `nav` section in `mkdocs.yml` to include the new page\n3. Follow existing naming conventions for consistency\n\n#### Images and Assets\n\n- Store images in the same directory as the referencing markdown file\n- Use relative paths for image references\n- Common assets go in `docs/assets/`\n\n#### Internal Links\n\nUse relative markdown links to reference other pages. The site has extensive cross-referencing between related features.\n\n### Testing Changes\n\nAlways test locally with `mkdocs serve` before deploying. The development server provides live reload for content changes.\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing Guidelines\n\nThank you for your interest in contributing to the dbt™ Power User extension! We greatly appreciate the dedication of our community members in helping us enhance this project.\n\n## Bug Reports and Feature Requests\n\nOne of the simplest ways to contribute is by sharing your thoughts with us. If you come across any bugs or have ideas for new features or improvements, please start a discussion in our dedicated channel: `#tools-dbt-power-user` on the [dbt™ community Slack](https://getdbt.slack.com/archives/C05KPDGRMDW). Additionally, take a look at the [GitHub issues](https://github.com/innoverio/vscode-dbt-power-user/issues) to see if the topic has already been raised. If not, feel free to create a new issue. Your detailed bug reports, along with steps to reproduce the issue and relevant environment information, are invaluable to us and other contributors.\n\n## How to Contribute\n\nWe warmly welcome contributions from our active community! If you're interested in contributing to the extension, follow these steps:\n\n1. **Fork the Repository:** Start by forking the repository to your own GitHub account.\n\n1. **Clone the Repository:** Clone your forked repository to your local machine:\n\n   ```bash\n   git clone https://github.com/your-username/vscode-dbt-power-user.git\n   cd vscode-dbt-power-user\n   ```\n\n1. **Set Up Development Environment:** Setting up the development environment for the dbt™ Power User extension is designed to be straightforward. Most of the setup is already prepared, but you might need to follow a few steps to ensure a smooth experience:\n\n   1. **Install Node.js and npm:** If you haven't already, make sure you have Node.js and npm (Node Package Manager) installed on your machine. You can download and install them from the [official Node.js website](https://nodejs.org/). When choosing a Node.js version, we recommend installing the latest LTS (Long-Term Support) version as recommended on the website to take advantage of the latest features, optimizations, and bugfixes.\n\n   1. **Install Required Node Packages:** In the root directory of your cloned repository (`vscode-dbt-power-user`), open a terminal and run the following command to install the required Node.js packages:\n\n      ```bash\n      npm install\n      npm run install:panels\n      ```\n\n   1. **Start Debugging:** In the Visual Studio Code interface, navigate to the \"Run and Debug\" sidebar. Click on \"Launch Extension\" to start the debugging process. This will open a new window with the dbt™ Power User extension installed. During this debug session, the existing installation of dbt-power-user will be overridden, allowing you to test your changes without affecting the installed extension.\n      - **Note:** If you're running the dbt Power User extension in debug mode using `Debug Extension` and you make changes to the extension's code, you can see those changes take effect immediately by reloading the VS Code instance where the extension is running.\n      - To reload the VS Code instance in debug mode, you can either:\n        - Use the command \"Developer: Reload Window\" from the command palette by pressing Ctrl + Shift + P and typing \"Developer: Reload Window\".\n        - Simply press Ctrl/Cmd + R to reload the VS Code instance.\n   1. **Open a dbt™ Project as a Target:** To effectively test your changes, open a dbt™ project as a target. You can either use an existing project or create a new virtual environment with the necessary dbt™ package installed. Creating a virtual environment ensures a clean environment that won't interfere with any existing dbt™ installations. It's important to note that the dbt™ Power User extension itself does not require any Python/dbt™ installation.\n\n   1. **Explore and Test:** With the extension debug window open and your dbt™ project loaded, take the time to explore and test your changes. Verify that the extension behaves as expected and that your changes integrate seamlessly.\n\n   Following these steps will help you establish a productive development environment for contributing to the dbt™ Power User extension. If you encounter any issues during setup, don't hesitate to reach out to the community for assistance.\n\n1. **Make Your Changes:** Feel free to implement the changes or new features you have in mind. If you're new to contributing, our [contributing page](https://github.com/innoverio/vscode-dbt-power-user/contribute) is a great starting point. Choose an issue listed there and familiarize yourself with the extension.\n\n1. **Thorough Testing:** Test your changes thoroughly to ensure they work as expected.\n\n1. **Clear Commit Messages:** Write clear and descriptive commit messages.\n\n1. **Push Changes:** Push the changes to your forked repository.\n\n1. **Create a Pull Request:** Submit a pull request to the main repository, explaining the purpose and details of your changes.\n\n## Code Style and Formatting\n\nMaintaining consistent code style and formatting is crucial for readability and collaboration. Ensure your code aligns with the existing conventions and formatting guidelines used in the project.\n\n## Adding New Features or Fixing Bugs\n\nWhen introducing new features or addressing bugs, consider the current codebase and community needs. Engage in discussions with fellow community members if you're unsure about design decisions or implementation details.\n\n## Local Development with @altimateai/dbt-integration Library\n\nWhen working on the extension, you may need to develop against a local version of the `@altimateai/dbt-integration` library instead of the published npm package. This allows you to test changes to both the extension and the integration library simultaneously.\n\n### Setup for Local Development\n\n1. **Clone the dbt-integration repository:** First, ensure you have the `altimate-dbt-integration` repository cloned as a sibling directory to this project:\n\n   ```bash\n   cd /path/to/your/projects\n   git clone https://github.com/altimateai/altimate-dbt-integration.git\n   cd vscode-dbt-power-user\n   ```\n\n   Your directory structure should look like:\n\n   ```\n   /path/to/your/projects/\n   ├── altimate-dbt-integration/\n   └── vscode-dbt-power-user/\n   ```\n\n2. **Switch to local development mode:** Modify the following configuration files to use the local TypeScript source instead of the npm package:\n\n   **jest.config.js**: Uncomment the local development lines:\n\n   ```javascript\n   // Development: use local TypeScript source (same as webpack and tsconfig)\n   \"^@altimateai/dbt-integration$\":\n     \"<rootDir>/../altimate-dbt-integration/src/index.ts\",\n   // Production: use npm package (commented out for development)\n   // \"^@altimateai/dbt-integration$\": \"@altimateai/dbt-integration\",\n   ```\n\n   **tsconfig.json**: Update the configuration:\n\n   ```json\n   {\n     // \"rootDir\": \"src\",\n     \"rootDirs\": [\"src\", \"../altimate-dbt-integration/src\"],\n     \"paths\": {\n       \"@altimateai/dbt-integration\": [\n         \"../altimate-dbt-integration/src/index.ts\"\n       ],\n       \"@extension\": [\"./src/modules.ts\"],\n       \"@lib\": [\"./src/lib/index\"]\n     }\n   }\n   ```\n\n   **webpack.config.js**: Update the alias and copy plugin configurations:\n\n   ```javascript\n   // In resolve.alias section:\n   \"@altimateai/dbt-integration\": path.resolve(\n     __dirname,\n     \"../altimate-dbt-integration/src/index.ts\",\n   ),\n\n   // In CopyWebpackPlugin, comment out production copies and uncomment development copies:\n   // Development: use local Python files\n   {\n     from: path.resolve(\n       __dirname,\n       \"../altimate-dbt-integration/node_modules/python-bridge/node_python_bridge.py\",\n     ),\n     to: \"node_python_bridge.py\",\n   },\n   // ... (other local file copies)\n   ```\n\n### Switching Back to Production Mode\n\nWhen you're done with local development, revert the configuration changes to use the published npm package:\n\n1. **jest.config.js**: Comment out local development lines and uncomment production lines\n2. **tsconfig.json**: Set `\"rootDir\": \"src\"` and remove the local path mapping\n3. **webpack.config.js**: Remove local alias and use npm package copies in CopyWebpackPlugin\n\n### Benefits of Local Development Mode\n\n- **Real-time changes**: Modify both the extension and integration library simultaneously\n- **Debugging**: Set breakpoints and debug across both codebases\n- **Testing**: Test integration library changes before publishing\n- **Development workflow**: Faster iteration when working on features that span both repositories\n\n### Important Notes\n\n- Ensure both repositories are on compatible branches when doing local development\n- The local development setup expects the `altimate-dbt-integration` directory to be a sibling of `vscode-dbt-power-user`\n- Always test with the production npm package configuration before submitting pull requests\n- The Python files from the integration library are copied during the webpack build process\n\n## Testing\n\nComprehensive testing is essential for maintaining the extension's stability and reliability. While adding new features or fixing bugs, run tests locally helps ensure your changes don't introduce regressions.\n\n## Security\n\nIf you identify security vulnerabilities or potential issues, please report them responsibly. Reach out to the maintainers directly to discuss and report the issue privately.\n\n## Credits and Acknowledgments\n\nOur heartfelt thanks go out to all the contributors and our vibrant community members who have supported this project. Your contributions are a cornerstone of our progress. We also want to acknowledge that the dbt™ logo is a trademark of dbt Labs, Inc.\n\n## Feedback and Communication\n\nOpen communication is a core value of our community. Join discussions on our GitHub repository, participate in issue discussions, and provide feedback on proposed changes.\n\nThank you for being a vital part of our open-source community! Your contributions help us enhance the dbt™ Power User extension, providing an improved experience for all users.\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2020 innover.io\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.\n"
  },
  {
    "path": "README.md",
    "content": "# vscode-dbt-power-user\n\n![Last updated](https://img.shields.io/visual-studio-marketplace/last-updated/innoverio.vscode-dbt-power-user) ![Version](https://img.shields.io/visual-studio-marketplace/v/innoverio.vscode-dbt-power-user) ![Installs](https://img.shields.io/visual-studio-marketplace/i/innoverio.vscode-dbt-power-user) ![Build passing](https://github.com/innoverio/vscode-dbt-power-user/workflows/.github/workflows/ci.yml/badge.svg)\n\nThis [open source](https://github.com/AltimateAI/vscode-dbt-power-user) extension makes VSCode seamlessly work with [dbt™](https://www.getdbt.com/).\n\nIf you need help with setting up the extension, please check the [documentation](https://docs.myaltimate.com/setup/installation/).\nFor any issues or bugs, please [contact us](https://www.altimate.ai/support) via chat or Slack.\n\n**Features:**\n\n| Feature                                                     | Details                                                                                                                                 |\n| ----------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |\n| [Auto-complete dbt™ code](#autocomplete)                   | Auto-fill model names, macros, sources and docs. Click on model names, macros, sources to go to definitions.                            |\n| [Preview Query results and Analyze](#querypreview)          | Generate dbt™ model / query results. Export as CSV or analyze results by creating graphs, filters, groups                              |\n| [Column lineage](#lineage)                                  | Model lineage as well as column lineage                                                                                                 |\n| [Generate dbt™ Models](#genmodel)                          | from source files or convert SQL to dbt™ Model (docs)                                                                                  |\n| [Generate documentation](#gendoc)                           | Generate model and column descriptions or write in the UI editor. Save formatted text in YAML files.                                    |\n| [Defer to prod](#defertoprod)                               | Build your model in development without building (by defering) your upstream models                                                     |\n| [Click to run parent / child models and tests](#clicktorun) | Just click to do common dbt™ operations like running tests, parent / child models or previewing data.                                  |\n| [Compiled query preview and explanation](#queryexplanation) | Get live preview of compiled query as your write code. Also, generate explanations for dbt™ code written previously (by somebody else) |\n| [Project health check](#healthcheck)                        | Identify issues in your dbt™ project like columns not present, models not materialized                                                 |\n| [SQL validator](#validateSQL)                               | Identify issues in SQL like typos in keywords, missing or extra parentheses, non-existent columns                                       |\n| [Big Query cost estimator](#bqcost)                         | Estimate data that will be processed by dbt™ model in BigQuery                                                                         |\n| [Other features](#otherfeatures)                            | dbt™ logs viewer (force tailing)                                                                                                       |\n\nNote: This extension is fully compatible with dev containers, code spaces and remote extension. See [Visual Studio Code Remote - Containers](https://code.visualstudio.com/docs/remote/containers) and [Visual Studio Code Remote - WSL](https://code.visualstudio.com/docs/remote/wsl).\nThe extension is supported for dbt™ versions above 1.0.\n\n## Features\n\n### <a id=\"autocomplete\">Autocomplete model, macro, source names and click to go to definition</a>\n\nAuto-fill model names, macros, sources and docs. Click on model names, macros, sources to go to definitions. [(docs)](https://docs.myaltimate.com/develop/autocomplete/)\n\n![autocomplete](media/images/autocomplete.gif)\n\n### <a id=\"querypreview\">Preview query results and analyze</a>\n\nGenerate dbt™ model / query results. Export as CSV or analyze results by creating graphs, filters, groups. [(docs)](https://docs.myaltimate.com/test/queryResults/)\n\n![previewquery](media/images/previewquery.gif)\n\n### <a id=\"lineage\">Column lineage</a>\n\nView model lineage as well as column lineage with components like models, seeds, sources, exposures and info like model types, tests, documentation, linkage types. [(docs)](https://docs.myaltimate.com/test/lineage/)\n\n![lineage](media/images/lineage.gif)\n\n### <a id=\"genmodel\"> Generate dbt™ Models from source or SQL</a>\n\nGenerate dbt™ models from sources defined in YAML. You can also convert existing SQL to a dbt™ model where references get populated automatically. [(docs)](https://docs.myaltimate.com/develop/clicktorun/)\n\n![genmodel](media/images/genmodel.gif)\n\n### <a id=\"gendoc\"> Generate documentation</a>\n\nGenerate model and column descriptions automatically or write descriptions manually in the UI editor. Your descriptions are automatically formatted and saved in YAML files. [(docs)](https://docs.myaltimate.com/document/generatedoc/)\n\n![gendoc](media/images/gendoc.gif)\n\n### <a id=\"defertoprod\">Defer to prod</a>\n\nDefer building your upstream models when you make changes in development by referencing production models. Here's [(more info)](https://docs.getdbt.com/blog/defer-to-prod) about the concept. This functionality can be used in dbt™ core with the extension. [(docs)](https://docs.myaltimate.com/test/defertoprod/)\n\n### <a id=\"clicktorun\"> Click to run parent/child models and tests</a>\n\nJust click to do common button operations like executing tests, building or running parent / child models. [(docs)](https://docs.myaltimate.com/develop/clicktorun/)\n\n![autocomplete](media/images/runmodeltests.gif)\n\n### <a id=\"queryexplanation\"> Compiled query preview and explanation</a>\n\nGet live preview of compiled query as your write code. Also, generate explanations for dbt™ code written previously (by somebody else). [(docs)](https://docs.myaltimate.com/develop/explanation/)\n\n![explanation](media/images/explanation.gif)\n\n### <a id=\"healthcheck\"> Project health check</a>\n\nIdentify issues in your dbt™ project like columns not present, models not materialized. [(docs)](https://docs.myaltimate.com/test/healthcheck/)\n\n![healthcheck](media/images/healthcheck.gif)\n\n### <a id=\"validateSQL\"> SQL validator</a>\n\nValidate SQL to identify issues like mistyped keywords, extra parentheses, columns no present in database [(docs)](https://docs.myaltimate.com/test/sqlvalidation/)\n\n![sql-validator](media/images/sqlValidation.gif)\n\n### <a id=\"bqcost\"> Big Query cost estimator</a>\n\nEstimate data that will be processed by dbt™ model in BigQuery [(docs)](https://docs.myaltimate.com/test/bigquerycost/)\n\n![bqcostestimator](media/images/bqcostestimator.gif)\n\n### <a id=\"otherfeatures\"> Other features</a>\n\n**dbt™ logs view (force tailing)**\n\n![dbt-log](media/images/dbt-log.gif)\n\nPlease check [documentation](https://docs.myaltimate.com/arch/faq/) for additional info.\nFor any issues or bugs, please [contact us](https://www.altimate.ai/support) via chat or Slack.\n"
  },
  {
    "path": "altimate_notebook_kernel.py",
    "content": "import json\nimport re\nfrom datetime import  datetime\nimport jupyter_client\nimport queue\n\nclass CustomDecoder(json.JSONDecoder):\n    def __init__(self, *args, **kwargs):\n        super().__init__(object_hook=self.object_hook, *args, **kwargs)\n    def object_hook(self, obj):\n        for key, value in obj.items():\n            if value == 'null':\n                obj[key] = None\n        return obj\n\n\n# Notebook kernel which will responsible for creating kernel executors for each notebook\n# should shut down kernel after notebook is closed\n# also store the cell outputs/data and use it for further executions\n# TODO: implement as required - extract to separate file\n\n\n# a method which will be called once a notebook is open, create an instance of this class\n# save doc uri as unique identifier for the notebook\n# initialize a jupyter kernel executor on notebook open and shutdown on close\n# store results of each cell execution and update after each execution\n# handle cell deletions\n# destroy this instance when notebook is closed\n\nclass JupyterKernelExecutor:\n    def __init__(self):\n        self.kernel_manager = jupyter_client.KernelManager()\n        self.kernel_manager.start_kernel()\n        self.kernel_client = self.kernel_manager.client()\n        self.kernel_client.start_channels()\n        print('session pid', self.kernel_client.session.pid)\n        # print('ip', self.kernel_manager.connection_file.split('-')[1])\n        # Get the connection file\n        connection_file = self.kernel_manager.connection_file\n        # Load connection info\n        connection_info = jupyter_client.find_connection_file(connection_file)\n        with open(connection_info) as f:\n            connection_data = json.load(f)\n\n        # Extract WebSocket URL\n        websocket_url = f\"ws://{connection_data['ip']}:{connection_data['shell_port']}/api/kernels/{self.kernel_manager.kernel_id}/channels\"\n        print(connection_data, self.kernel_manager.kernel_name, self.kernel_manager.kernel_spec.name)\n\n    def execute(self, code, user_expressions=None):\n        self.kernel_client.wait_for_ready()\n\n        # print(\"Executing code:\", code, user_expressions)\n        # Execute the code\n        self.kernel_client.execute(code, silent=False, store_history=True, user_expressions=user_expressions)\n\n        # Capture and return the output\n        output = []\n        start_time = datetime.now()\n        while True:\n            try:\n                msg = self.kernel_client.get_iopub_msg(timeout=1)\n\n                def datetime_converter(o):\n                    if isinstance(o, datetime):\n                        return o.__str__()\n\n                # print(\"msg\", msg)\n\n                if msg['msg_type'] == 'stream':\n                    # for stdout\n                    output.append({'mime': 'text/plain', 'value': msg['content']['text']})\n                elif msg['msg_type'] == 'comm_open':\n                    state = msg['content']['data']['state']\n                    state['model_id'] = msg['content']['comm_id']\n                    # Handle comm_open messages\n                    output.append({'mime': 'application/vnd.jupyter.widget-view+json', 'value': state})\n                elif msg['msg_type'] in ['execute_result', 'display_data']:\n                    # Flag to check if any key other than 'text/plain' exists\n                    other_keys_exist = False\n\n                    # Iterate over the keys in msg['content']['data']\n                    for key, value in msg['content']['data'].items():\n                        # Check if the key is not 'text/plain'\n                        if key != 'text/plain':\n                            # Append the dictionary to the output list\n                            output.append({'mime': key, 'value': value})\n                            other_keys_exist = True\n\n                    # If no other keys exist, add the 'text/plain' value\n                    if not other_keys_exist and 'text/plain' in msg['content']['data']:\n                        output.append({'mime': 'text/plain', 'value': msg['content']['data']['text/plain']})\n                elif msg['msg_type'] == 'error':\n                    output.append({'mime': 'text/plain', 'value': '\\n'.join(msg['content']['traceback'])})\n                elif msg['msg_type'] == 'status' and msg['content']['execution_state'] == 'idle':\n                    break\n            except queue.Empty:\n                if (datetime.now() - start_time).total_seconds() > 30:  # Timeout after 30 seconds\n                    break\n        return output\n\n    def shutdown(self):\n        # Shutdown the kernel client and kernel manager\n        self.kernel_client.stop_channels()\n        self.kernel_manager.shutdown_kernel()\n        del self.kernel_client\n\nclass AltimateNotebookKernel:\n    def __init__(self, doc_uri):\n        \"\"\"\n        Initialize the AltimateNotebookKernel instance.\n        \n        Parameters:\n        doc_uri (str): The unique identifier for the notebook.\n        \"\"\"\n        self.doc_uri = doc_uri\n        self.kernel_executor = self.initialize_kernel_executor()\n        self.cell_results = {}\n\n    def get_session_id(self):\n        return self.kernel_executor.kernel_client.session.pid\n    \n    def close_notebook(self):\n        \"\"\"\n        Method to be called when the notebook is closed.\n        Shuts down the Jupyter kernel executor.\n        \"\"\"\n        if self.kernel_executor:\n            self.shutdown_kernel_executor()\n            self.kernel_executor = None\n            print(f\"Notebook {self.doc_uri} closed and kernel shut down.\")\n\n    def get_connection_file(self):\n        return self.kernel_executor.kernel_manager.connection_file\n    \n    def initialize_kernel_executor(self):\n        \"\"\"\n        Initializes the Jupyter kernel executor.\n        \n        Returns:\n        kernel_executor: The initialized kernel executor.\n        \"\"\"\n        kernel_executor = JupyterKernelExecutor()\n        return kernel_executor\n\n    def shutdown_kernel_executor(self):\n        \"\"\"\n        Shuts down the Jupyter kernel executor.\n        \"\"\"\n        # Placeholder for actual kernel shutdown logic\n        print(\"Kernel executor shut down.\")\n    \n    def get_sql_result_by_cell(self, cell_id):\n        code = f\"cell_{cell_id}\"\n        return self.kernel_executor.execute(code)\n\n    def store_sql_result(self, cell_id, result):\n        \"\"\"\n        Stores the result of a cell execution.\n        \n        Parameters:\n        cell_id (str): The unique identifier for the cell.\n        result: The result of the cell execution.\n        \"\"\"\n        resultJson =  json.loads(result)\n        \n        # Construct the code to store the result in the Jupyter kernel\n        code = f\"\"\"\n        cell_{cell_id} = {resultJson}\n        \"\"\"\n        self.execute_python(code)\n        \n    def execute_python(self, code):\n        \"\"\"\n        Executes a cell and stores the result.\n        \n        Parameters:\n        cell_id (str): The unique identifier for the cell.\n        code (str): The code to be executed in the cell.\n        \n        Returns:\n        result: The result of the cell execution.\n        \"\"\"\n        response = self.kernel_executor.execute(code)\n        return response\n    \n    def delete_cell(self, cell_id):\n        \"\"\"\n        Handles cell deletion.\n        \n        Parameters:\n        cell_id (str): The unique identifier for the cell to be deleted.\n        \"\"\"\n        if cell_id in self.cell_results:\n            del self.cell_results[cell_id]\n            print(f\"Cell {cell_id} deleted.\")\n\n    def destroy_instance(self):\n        \"\"\"\n        Destroys the instance when the notebook is closed.\n        \"\"\"\n        self.close_notebook()\n        self.cell_results.clear()\n        print(f\"Instance for notebook {self.doc_uri} destroyed.\")\n"
  },
  {
    "path": "codecov.yml",
    "content": "coverage:\n  status:\n    project:\n      default:\n        target: 10%    # the required coverage value\n        threshold: 1%  # the leniency in hitting the target\n    patch:\n      default:\n        target: 90%\n        threshold: 1%\n\nignore:\n  - \"test/**/*\"       # ignore test files\n  - \"out/**/*\"        # ignore compiled output\n  - \"**/*.d.ts\"      # ignore type declaration files "
  },
  {
    "path": "docker-setup/Dockerfile",
    "content": "FROM codercom/code-server:latest\n\nUSER root\n\n# Install Node.js 20\nRUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \\\n    && apt-get install -y nodejs \\\n    && corepack enable\n\n# Install Python 3, pip, git, and other dependencies\nRUN apt-get update && apt-get install -y \\\n    python3 \\\n    python3-pip \\\n    python3-venv \\\n    git \\\n    xvfb \\\n    && rm -rf /var/lib/apt/lists/*\n\n# Install dbt-duckdb globally (available for all users)\nRUN pip3 install --break-system-packages dbt-duckdb\n\nUSER coder\n\n# Create altimate directory\nRUN mkdir -p ~/.altimate\n\n# Set up dbt profiles for both test projects\n# Projects are copied from the read-only extension-src mount to writable home dirs at container startup\nRUN mkdir -p ~/.dbt && printf '%s\\n' \\\n    'jaffle_shop:' \\\n    '  target: dev' \\\n    '  outputs:' \\\n    '    dev:' \\\n    '      type: duckdb' \\\n    '      path: /home/coder/jaffle-shop-duckdb/jaffle_shop.duckdb' \\\n    '      threads: 4' \\\n    '' \\\n    'dbt_core_sample_duckdb:' \\\n    '  target: go_sales' \\\n    '  outputs:' \\\n    '    go_sales:' \\\n    '      type: duckdb' \\\n    '      path: /home/coder/dbt-core-sample-duckdb/go_sales.db' \\\n    > ~/.dbt/profiles.yml\n\n# Install all required extensions for dbt Power User (extensionDependencies in package.json)\nRUN code-server --install-extension ms-python.python \\\n    && code-server --install-extension samuelcolvin.jinjahtml \\\n    && code-server --install-extension altimateai.vscode-altimate-mcp-server\n\nEXPOSE 3001\n\nWORKDIR /home/coder\nCOPY --chown=coder:coder start-code-server.sh /usr/local/bin/\nENTRYPOINT []\nCMD [\"/usr/local/bin/start-code-server.sh\"]\n"
  },
  {
    "path": "docker-setup/README.md",
    "content": "# Docker Development Setup\n\nDevelop and test the dbt Power User extension in code-server (VS Code in browser) with volume-mounted source for hot-reload.\n\n## Quick Start\n\n```bash\nnpm run docker:deploy\n```\n\nThis builds the extension, starts the container, and enters watch mode. Open http://localhost:3001/?folder=/home/coder/project in your browser.\n\n## How It Works\n\nThe extension source is **volume-mounted** into the container (read-only), so you don't need to rebuild a VSIX or the Docker image for every change:\n\n1. `deploy.sh` runs `npm run build` to build the extension\n2. Docker container starts with the repo mounted at `/home/coder/extension-src`\n3. `start-code-server.sh` symlinks the mounted source into code-server's extensions directory\n4. `npm run watch` runs on the host — any source change triggers a rebuild\n5. Reload the browser to pick up changes\n\n## Configuration\n\n### Custom dbt Project\n\nBy default, the container uses the built-in `jaffle_shop_duckdb` project. To use your own:\n\n1. Copy `.env.example` to `.env`\n2. Set `DBT_PROJECT_PATH=/absolute/path/to/your/project`\n3. Re-run `npm run docker:deploy`\n\n## What's Pre-Installed\n\n- **code-server**: VS Code in the browser (port 3001, no auth)\n- **Node.js 20**: For extension host\n- **Python 3 + dbt-duckdb**: For dbt integration\n- **jaffle_shop_duckdb**: Sample dbt project with pre-configured profile and deps\n- **Python extension**: Required dependency for dbt Power User\n- **Xvfb**: For headless testing\n\n## Commands\n\n| Command                 | Description                                  |\n| ----------------------- | -------------------------------------------- |\n| `npm run docker:deploy` | Build, start container, and enter watch mode |\n| `npm run docker:logs`   | View container logs                          |\n| `npm run docker:stop`   | Stop the container                           |\n\n## Playwright MCP Testing\n\nUse Playwright MCP tools to programmatically verify the extension in Docker.\n\n### Prerequisites\n\nAdd to `.mcp.json` (project or global):\n\n```json\n{\n  \"playwright\": {\n    \"command\": \"npx\",\n    \"args\": [\n      \"@playwright/mcp@latest\",\n      \"--executable-path\",\n      \"/usr/bin/chromium-browser\",\n      \"--headless\"\n    ]\n  }\n}\n```\n\n> **Note:** The `--executable-path` above is a Linux example. On macOS, point to your browser binary instead (e.g. `\"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\"`), or omit `--executable-path` entirely and run `npx playwright install` to use Playwright's bundled Chromium.\n\nThe package is `@playwright/mcp` (NOT `@anthropic-ai/mcp-playwright`).\n\n### Automated E2E Test Checklist\n\nFollow this exact sequence — each step is one tool call:\n\n**1. Verify bundle before deploying** (saves debugging stale code later):\n\n```bash\ngrep -c \"myKeyFunction\" dist/extension.js  # confirm expected code is bundled\n```\n\n**2. Deploy with `--build`** (NEVER use `docker compose restart` — code-server caches extension state):\n\n```bash\ndocker compose -f docker-setup/docker-compose.yml up --build -d\n```\n\n**3. Wait for ready + seed dbt** (seed BEFORE browser connects — extension gets its own DuckDB connection):\n\n```bash\nfor i in $(seq 1 15); do curl -sf http://localhost:3001/healthz > /dev/null 2>&1 && break; sleep 2; done\nCID=$(docker ps -q --filter \"name=docker-setup-code-server\")\ndocker exec $CID bash -c 'cd /home/coder/jaffle-shop-duckdb && dbt seed && dbt run'\n```\n\n**4. Check extension activation via logs** (don't waste time clicking through the UI):\n\n```bash\nCID=$(docker ps -q --filter \"name=docker-setup-code-server\")\nlatest=$(docker exec $CID bash -c 'ls -td /home/coder/.local/share/code-server/logs/*/ | head -1')\ndocker exec $CID grep \"innoverio\\|removed\" \"${latest}remoteagent.log\"\ndocker exec $CID grep \"innoverio\" \"${latest}exthost1/remoteexthost.log\"\n```\n\n- ✅ `ExtensionService#_doActivateExtension innoverio.vscode-dbt-power-user` = activated\n- ❌ `Marked extension as removed` = `.obsolete` bug (fixed in PR #1859)\n\n**5. Create test SQL files** (do this from the host before connecting Playwright):\n\n```bash\ndocker exec $CID bash -c 'cat > /home/coder/jaffle-shop-duckdb/test_query.sql << \"SQL\"\nSELECT * FROM {{ ref(\"customers\") }} LIMIT 10\nSQL'\n```\n\n**6. Connect Playwright and navigate**:\n\n```\nmcp__playwright__browser_navigate → http://localhost:3001/?folder=/home/coder/jaffle-shop-duckdb\nmcp__playwright__browser_wait_for → 20 seconds (extension activation + dbt parsing)\n```\n\n**7. Open file** — two approaches, tree click is more reliable:\n\n_Option A: Click file tree_ (recommended — Ctrl+P can be flaky in Playwright):\n\n```\nmcp__playwright__browser_evaluate →\n  const items = document.querySelectorAll('[role=\"treeitem\"]');\n  const target = Array.from(items).find(i => i.getAttribute('aria-label') === 'test_query.sql');\n  if (target) { target.click(); target.click(); } // double-click to pin tab\n```\n\n_Option B: Quick Open_ (sometimes the file doesn't open — retry if title doesn't change):\n\n```\nmcp__playwright__browser_press_key → Control+P\nmcp__playwright__browser_snapshot → find textbox ref\nmcp__playwright__browser_type → ref=<textbox>, text='test_query.sql', submit=true\n```\n\n**8. Execute and capture**:\n\n```\nmcp__playwright__browser_wait_for → 2 seconds\nmcp__playwright__browser_press_key → Control+Enter\nmcp__playwright__browser_wait_for → 12 seconds\nmcp__playwright__browser_take_screenshot\n```\n\n### Common Pitfalls\n\n| Pitfall                                       | Symptom                                  | Fix                                                                                                                                                                                                                     |\n| --------------------------------------------- | ---------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `docker compose restart` after rebuild        | Tests pass/fail inconsistently           | Always use `up --build`                                                                                                                                                                                                 |\n| Browser connects before `dbt seed`            | \"Table does not exist\" error             | Seed first, then navigate                                                                                                                                                                                               |\n| Extension marked as \"removed\"                 | No dbt commands in palette               | Symlink must use versioned name (`innoverio.vscode-dbt-power-user-0.60.1`), not bare name. `extensions.json` registration alone is insufficient — code-server's obsolete scanner matches directory names. See PR #1859. |\n| Wrong Playwright package                      | MCP fails to connect                     | Use `@playwright/mcp`, not `@anthropic-ai/mcp-playwright`                                                                                                                                                               |\n| `cd` into `node_modules/` for symlink ops     | Subsequent commands run from wrong dir   | Use absolute paths or don't cd                                                                                                                                                                                          |\n| Multiple worktrees on same Docker setup       | Port conflict / container name collision | Use `docker compose -p <project-name>` and different ports in `docker-compose.override.yml`                                                                                                                             |\n| Quick Open (`Ctrl+P`) doesn't open file       | File stays on previous tab               | Use `evaluate()` to click tree items directly: `document.querySelectorAll('[role=\"treeitem\"]')` find + click. More reliable than Quick Open in Playwright.                                                              |\n| `.sql` files open as \"MS SQL\" not \"Jinja SQL\" | No dbt-specific syntax highlighting      | Expected until `jinjahtml` activates. Extension activation order varies — `jinjahtml` maps `.sql` → `jinja-sql` but may not be ready when the file first opens. Reload or reopen the file.                              |\n\n## Troubleshooting\n\n**Container won't start:**\n\n```bash\nnpm run docker:stop\ncd docker-setup && docker compose up --build\n```\n\n**Extension not loading:**\n\n```bash\n# Check the symlink exists\ndocker exec -it docker-setup-code-server-1 ls -la ~/.local/share/code-server/extensions/\n\n# Check extension source is mounted\ndocker exec -it docker-setup-code-server-1 ls /home/coder/extension-src/package.json\n```\n\n**Rebuild from scratch:**\n\n```bash\nnpm run docker:stop\ncd docker-setup && docker compose build --no-cache && docker compose up -d\n```\n\n**Check dbt installation:**\n\n```bash\ndocker exec -it docker-setup-code-server-1 dbt --version\n```\n"
  },
  {
    "path": "docker-setup/deploy.sh",
    "content": "#!/bin/bash\nset -e\n\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\nPROJECT_ROOT=\"$(dirname \"$SCRIPT_DIR\")\"\n\ncd \"$PROJECT_ROOT\"\n\n# Determine docker compose command (V2 syntax with fallback)\nif docker compose version &>/dev/null; then\n    DC=\"docker compose -f docker-setup/docker-compose.yml\"\nelse\n    DC=\"docker-compose -f docker-setup/docker-compose.yml\"\nfi\n\n# Step 1: Check for .env file with DBT_PROJECT_PATH\nif [ -f \"$SCRIPT_DIR/.env\" ]; then\n    echo \"Loading .env from docker-setup/.env\"\n    export $(grep -v '^#' \"$SCRIPT_DIR/.env\" | xargs)\nfi\n\nif [ -n \"$DBT_PROJECT_PATH\" ]; then\n    echo \"Using custom dbt project: $DBT_PROJECT_PATH\"\nelse\n    echo \"Using built-in jaffle_shop_duckdb project\"\nfi\n\n# Step 2: Build the extension\necho \"\"\necho \"Building extension...\"\nnpm run build\n\n# Step 3: Build and start the container\necho \"\"\necho \"Building and starting code-server container...\"\n$DC up --build -d\n\n# Step 4: Wait for code-server to be ready\necho \"\"\necho \"Waiting for code-server to be ready...\"\nMAX_WAIT=60\nWAITED=0\nuntil curl -sf http://localhost:3001/healthz > /dev/null 2>&1; do\n    if [ $WAITED -ge $MAX_WAIT ]; then\n        echo \"Timed out waiting for code-server after ${MAX_WAIT}s\"\n        echo \"Check logs with: npm run docker:logs\"\n        exit 1\n    fi\n    sleep 2\n    WAITED=$((WAITED + 2))\n    echo \"  Waiting... (${WAITED}s)\"\ndone\necho \"code-server is ready at http://localhost:3001/?folder=/home/coder/project\"\n\n# Step 5: Start watch for auto-recompilation\necho \"\"\necho \"Starting watch mode for hot-reload...\"\necho \"  Changes to extension source will auto-rebuild.\"\necho \"  After rebuild, reload code-server in browser to pick up changes.\"\necho \"\"\nnpm run watch\n"
  },
  {
    "path": "docker-setup/docker-compose.yml",
    "content": "services:\n  code-server:\n    build:\n      context: .\n      dockerfile: Dockerfile\n    ports:\n      - \"3001:3001\"\n    environment:\n      - PORT=3001\n    volumes:\n      - ..:/home/coder/extension-src:ro\n      - ${DBT_PROJECT_PATH:-/home/coder/jaffle-shop-duckdb}:/home/coder/project\n    restart: unless-stopped\n"
  },
  {
    "path": "docker-setup/start-code-server.sh",
    "content": "#!/bin/bash\n\n# Copy test projects from read-only extension-src mount to writable home dirs and install deps\nfor project in jaffle-shop-duckdb dbt-core-sample-duckdb; do\n    src=\"/home/coder/extension-src/test-fixtures/$project\"\n    dest=\"/home/coder/$project\"\n    if [ -d \"$src\" ] && [ ! -d \"$dest\" ]; then\n        echo \"Setting up $project...\"\n        cp -r \"$src\" \"$dest\"\n        cd \"$dest\" && dbt deps 2>&1 || true\n    fi\ndone\n\n# Symlink the volume-mounted extension source into code-server extensions directory\nEXTENSIONS_DIR=\"$HOME/.local/share/code-server/extensions\"\nmkdir -p \"$EXTENSIONS_DIR\"\n\n# Read version from package.json for the symlink name.\n# code-server's obsolete scanner matches directory names against the registry format\n# `publisher.name-version`. Without the version suffix, it marks the extension as\n# removed on every boot — even if extensions.json has the correct entry.\nEXT_VERSION=$(node -e \"console.log(require('/home/coder/extension-src/package.json').version)\")\nEXT_DIR_NAME=\"innoverio.vscode-dbt-power-user-${EXT_VERSION}\"\n\n# Remove any stale symlink or directory\nrm -rf \"$EXTENSIONS_DIR/innoverio.vscode-dbt-power-user\"\nrm -rf \"$EXTENSIONS_DIR\"/innoverio.vscode-dbt-power-user-*\nrm -rf \"$EXTENSIONS_DIR/altimate.vscode-dbt-power-user\"\n\n# Create symlink with version suffix (required by code-server)\nln -s /home/coder/extension-src \"$EXTENSIONS_DIR/$EXT_DIR_NAME\"\n\n# Register the symlinked extension in extensions.json so code-server doesn't mark it as obsolete.\n# code-server only knows about extensions installed via `code-server --install-extension`;\n# symlinked extensions must be added to the registry manually.\nEXTJSON=\"$EXTENSIONS_DIR/extensions.json\"\nif [ ! -f \"$EXTJSON\" ]; then\n    echo \"[]\" > \"$EXTJSON\"\nfi\nnode -e \"\n  const fs = require('fs');\n  const pkg = JSON.parse(fs.readFileSync('/home/coder/extension-src/package.json', 'utf8'));\n  const id = pkg.publisher + '.' + pkg.name;\n  const dirName = '$EXT_DIR_NAME';\n  let exts = JSON.parse(fs.readFileSync('$EXTJSON', 'utf8'));\n  exts = exts.filter(e => !e.identifier || e.identifier.id !== id);\n  exts.push({\n    identifier: { id },\n    version: pkg.version,\n    location: { \\$mid: 1, path: '$EXTENSIONS_DIR/' + dirName, scheme: 'file' },\n    relativeLocation: dirName,\n    metadata: { installedTimestamp: Date.now(), source: 'vsix' }\n  });\n  fs.writeFileSync('$EXTJSON', JSON.stringify(exts, null, 2));\n  console.log('Registered', id, '@' + pkg.version, 'in extensions.json');\n\"\n\n# Clear .obsolete so code-server doesn't skip our extension on first scan\necho '{}' > \"$EXTENSIONS_DIR/.obsolete\"\n\n# Determine project directory\nif [ -d \"/home/coder/project\" ] && [ \"$(ls -A /home/coder/project 2>/dev/null)\" ]; then\n    PROJECT_DIR=\"/home/coder/project\"\nelse\n    PROJECT_DIR=\"/home/coder/jaffle_shop_duckdb\"\nfi\n\n# Start code-server with the project open\nexec code-server \\\n    --bind-addr 0.0.0.0:${PORT:-3001} \\\n    --auth none \\\n    --disable-telemetry \\\n    --disable-workspace-trust \\\n    --log debug \\\n    \"$PROJECT_DIR\"\n"
  },
  {
    "path": "documentation/docs/arch/beta.md",
    "content": "/// admonition | Only use the following steps for \"dbt Cloud\" environments. If you have a dbt Core environment, use the [required config instructions for \"dbt Core\" environments](../setup/reqdConfig.md). If you have a dbt Fusion environment, use the [required config instructions for \"dbt Fusion\" environments](../setup/reqdConfigFusion.md).\n    type: warning\n///\n\n/// admonition | dbt Cloud integration is available as beta functionality\n    type: tip\n///\n\n## Enable dbt Cloud Integration by adding an API key\n\ndbt Cloud integration in Power User VSCode extension requires an API key. There are also multiple preview features in the extension including [generate dbt documentation](../document/generatedoc.md), [column lineage](../test/lineage.md), [query explanation](../develop/explanation.md), [generate dbt model from SQL](../develop/genmodelSQL.md) that are also enabled with an API key.\n\n/// details | You can get an API key for free by signing up at [www.altimate.ai](https://www.altimate.ai)\n\n<interactive demo to get an API key>\n\n<div style=\"position: relative; padding-bottom: calc(51.70312500000001% + 44px); height: 0;\"><iframe src=https://app.supademo.com/embed/yanO4l-w5hH0xzXf93w-d frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n\n///\n\nYou need to add the API key from \"Settings->API key\" in your Altimate instance to the VSCode extension settings. You also need to add \"Instance name\" in the extension settings. Please get your instance name from your Altimate AI URL. If your URL for Altimate instance is - \"companyx.app.myaltimate.com\", then instance name is \"companyx\".\n\nGo to the VSCode extension settings, and then add an API key and instance name.\n\n/// details | Here's a demo of how to add an instance name and an API Key to the extension settings\n\n<Interactive demo to add API key in the extension>\n\n<div style=\"position: relative; padding-bottom: calc(57.25% + 44px); height: 0;\"><iframe src=https://app.supademo.com/embed/clnjpwl3u07x4pedv9ifjfuf9 frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n///\n\n## Use the setup wizard for configuration (recommended)\n\n/// admonition | Need to setup environment variables? Refer to this [section](https://docs.myaltimate.com/setup/optConfig/#environment-variables-setup)\n    type: warning\n///\n\nThis method will save a bunch of time for you, and you can also validate your configuration. Setup wizard will help you in associating sql files with jinja-sql, selecting the right Python interpreter, make sure dbt dependencies are correctly installed etc. In the end, it will also validate your configuration.\n\nYou can start the setup wizard by clicking on dbt status icon in the bottom status bar, and performing the following necessary steps as shown in the recorded demo below:\n\n<div style=\"position: relative; padding-bottom: 56.25%; height: 0;\"><iframe src=\"https://www.loom.com/embed/9e77435a96374622934daf5ff4e741e0?sid=1d407b78-eecc-436c-a49d-d9ffe858ba5d\" frameborder=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n\n**Here are the steps covered in the setup wizard**\n\n**Select Python Interpreter**\n\nClick on the action button - \"Select Python Interpreter\" and choose your preferred python interpreter. Usually, choosing an interpreter that's recommended or mapped to your virtual environment software (e.g. venv) as per the list is a good idea. If you know the path of your Python environment, you can choose it from the list, or if the path is not present, you can enter it manually.\n\n/// admonition | If needed, please run 'where python' command on terminal to see if it shows path to Python interpreter that you are using.\n    type: tip\n///\n\n**Install dbt**\n\nIf dbt is not installed in your environment (dbt status icon on bottom status bar will show it), Click on \"Install dbt Cloud\" button in the next step. This will install latest version of dbt Cloud CLI in your environment.\n\n**Validate Project**\n\nLast step is clicking on button - \"Validate Project\" It will run a bunch of checks to make sure your dbt environment and project are setup correctly.\nIf there are some issues, it will tell you exactly what's wrong as well.\n\n/// admonition | If you still can't get the extension setup correctly, please check the [troubleshooting page](../troubleshooting.md)\n    type: tip\n///\n\n## Recorded Demo\n\n<div style=\"position: relative; padding-bottom: 56.25%; height: 0;\"><iframe src=\"https://www.loom.com/embed/9e77435a96374622934daf5ff4e741e0?sid=a36e1758-8dc0-46b5-affe-0d14957120de\" frameborder=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n\n## Questions and Answers\n\n#### Is dbt Cloud or dbt Fusion integration free?\n\nAnswer: Yes, integration with dbt Cloud or dbt Fusion is free and treated the same as integration with dbt Core. It will not count towards the usage quota.\n\n![Image](images/pricing_clarifications.png)\n\n#### Why do I need to add the Altimate API key?\n\nThe API key is necessary for authentication with our backend. VSCode supports login-based authentication, but it often logs out between sessions, which can disrupt the workflow. The API key provides a more stable and streamlined experience. This is particularly beneficial for large teams, allowing them to integrate the key into their deployment secrets when setting up VSCode as a remote environment. In the future, integration with [Cloud Service token](https://docs.getdbt.com/docs/dbt-cloud-apis/authentication)s might be necessary for deeper cloud interactions, thus having the Altimate integration in place from the start makes sense.\n\n#### What benefits does registering an API key provide?\n\nA direct line of communication with our users is established with the authentication in place. This is essential for efficiently communicating hotfixes, new releases, and deprecation warnings. It helps to minimize operational challenges and ensures that users are not left with outdated versions or unaware of updates due to the limitations of VSCode or lack of IDE restarts. Our main goal is to prevent any disruption in your development environment and to support our users proactively.\n\n#### What if I don't want to use preview features or accidentally send data to Altimate?\n\nWe understand the concern about using preview features and the risk of accidental data transmission. To address this, we have implemented stringent data security practices, which you can review in our [security FAQ](https://docs.myaltimate.com/arch/faq/). Our solutions have passed security reviews by several large organizations in the US, and we are open to undergoing similar reviews for your organization. Additionally, we are working on making some preview features available offline through our [open-source Python CLI package](https://github.com/AltimateAI/datapilot-cli).\n\n#### How are you addressing concerns about data transmission in preview features?\n\nTo directly address concerns about data transmission, we have added a \"local-mode-only\" setting in VSCode. If enabled, this setting prevents backend calls for any feature except authentication. This setting can be reviewed by your security team since our [client code](https://github.com/AltimateAI/vscode-dbt-power-user/blob/master/src/altimate.ts) is open-source.\n\nAdd the following setting in vscode settings.json\n\n```json\n{\n   dbt.isLocalMode: True\n}\n```\n"
  },
  {
    "path": "documentation/docs/arch/faq.md",
    "content": "The dbt Power User extension is developed and maintained by [Altimate AI](https://www.altimate.ai). We are a software company based in the San Francisco Bay Area and have many large enterprise companies as customers.\nWe have done many security/governance reviews for these companies and we are SOC 2 Type 2 certified.\n\nHere is our [Privacy Policy](https://www.altimate.ai/privacy) and [Terms of Use](https://www.altimate.ai/terms).\n\n/// admonition | If you need us to do a security review with your IT / security teams, please [contact us](https://www.altimate.ai/support) via chat or Slack.\n    type: tip\n///\n\n### **Security Measures & Protocols**\n\n### 1. **Is my data encrypted during transmission?**\n\nYes, all data transmitted to and from our service is encrypted using Transport Layer Security (TLS). This ensures that your data remains confidential and cannot be intercepted or tampered with during transmission.\n\n### 2. **How do you prevent unauthorized access to your systems?**\n\nOur systems are designed with multiple layers of security:\n\n- **Transmission**: We use Transport Layer Security (TLS) to encrypt data during transmission.\n- **Infrastructure Security**: Our service is hosted on AWS, operating within a Private Virtual Private Cloud (VPC). This provides a secluded environment, significantly reducing intrusion risks.\n- **Internal Access Controls**: Only authorized developers have access to our servers. Access rights are managed and restricted using AWS's Role-Based Access Control (RBAC) mechanism.\n\n### 3. **Do you comply with industry security standards (e.g., ISO 27001, SOC 2)?**\n\nWe take security and compliance very seriously at Altimate AI, and we have SOC 2 TYPE 2 certification already.\n\n### 4. **Where are your data centers located, and what security measures are in place there?**\n\nOur data centers are managed through Amazon Web Services (AWS), which has facilities in multiple geographic regions around the world. By leveraging AWS, we ensure our users benefit from the rigorous security standards that this leading cloud provider upholds.\n\n### 5. **How are users authenticated and managed?**\n\nUsers are authenticated with email and password combinations in the SaaS UI. In the VSCode extension, Python package, users use the API key associated with their account. In the enterprise edition, we provide OAuth authentication as well.\n\n### 6. **Do you have a disaster recovery and business continuity plan?**\n\nYes, at Altimate AI, we have a robust disaster recovery plan in place. Our data is backed up frequently to ensure minimal data loss. In the event of any system failure, our recovery processes are designed to restore services within an hour. This quick recovery time minimizes disruptions and ensures the continuity of our services for our users.\n\n/// admonition | If you need us to do a security review with your IT/security teams, please [contact us](https://www.altimate.ai/support) via chat or Slack.\n    type: tip\n///\n\n---\n\n### **Data Privacy & Retention**\n\n### 1. **What data do you collect and for what purposes?**\n\nThe only data we collect is any feedback you may choose to provide us. This feedback is stored for a brief period of 30 days. Its sole purpose is to assist us in quality improvement efforts, allowing us to identify areas where our models can be further refined and enhanced.\n\nWe also collect telemetry data as per VSCode guidelines using telemetry framework offered by VSCode. Telemetry is used for error and usage reporting in order to make the extension better.\nYou can disable telemetry if needed, as per instructions [here](https://code.visualstudio.com/docs/getstarted/telemetry#_disable-telemetry-reporting).\n\n### 2. **How do you ensure my data privacy?**\n\nAt Altimate AI, ensuring the privacy of your data is a top priority. Here's how we uphold it:\n\n- **Data Isolation**: We employ a multi-tenant architecture that inherently isolates data on a per-tenant basis.\n- **Strict Access Controls**: Only a select group of authorized developers can access the collected metadata. We employ Amazon Web Services' Identity and Access Management (IAM) policies to meticulously restrict and control access to our various data stores.\n\n### 3. **How long do you retain my data?**\n\nAt Altimate AI, we maintain a strict policy of not retaining data related to the requests you make while using our service. The only data we retain is any feedback you may choose to provide us. This feedback is stored for a brief period of 30 days. Its sole purpose is to assist us in quality improvement efforts, allowing us to identify areas where our models can be further refined and enhanced.\n\n### 4. **What's your stance on GDPR?**\n\nWe do not store any actual customer data, we only store aggregate statistics and metadata. As a result, GDPR data deletion requests do not need to be propagated to us because we do not store such data.\nOur customers typically do not request or require DPAs. However, we're happy to provide a DPA or review a vendor DPA if your organization needs it.\n\n/// admonition | If you need us to do a security review with your IT/security teams, please [contact us](https://www.altimate.ai/support) via chat or Slack.\n    type: tip\n///\n\n### 5. **What is your cookie policy?**\n\nWe store only essential cookies, but not to track user data but only to keep few features working as expected. We use only following first party cookies\n\n- **Intercom**: Used for support requests. Cookies stored by Intercom and their cookies policy is defined [here](https://www.intercom.com/help/en/articles/2361922-intercom-messenger-cookies)\n- **Supertokens**: Used for SSO authentication and these cookies will be stored only for tenants with SSO. More details on Supertokens cookies policy can be viewed [here](https://supertokens.com/docs/passwordless/common-customizations/sessions/cookie-consent)\n\n---\n\n### **Use of Data for AI Model Training**\n\n### 1. **Do you use my data to train your AI models?**\n\nAt Altimate AI, our primary objective is to provide accurate and efficient documentation using our AI models. However, we do not use any specific client data to train our models. Our models are designed to be tenant-agnostic, meaning they do not learn or differentiate based on individual client data. Any data processed by our service is not repurposed for model training or enhancement.\n\n### 2. **How do you ensure my data isn't unintentionally used for model improvement?**\n\nWe employ strict data isolation and access controls. The multi-tenant architecture isolates data on a per-tenant basis, and our internal access controls ensure that only a select group of authorized developers can access the metadata. Coupled with our tenant-agnostic model approach, our infrastructure is designed to prevent any unintentional usage of your data outside its primary purpose.\n\n### 3. **Can I opt-in or opt-out of allowing my data to be used for model training in the future?**\n\nCurrently, we do not use client data for model training, so there's no opt-in or opt-out mechanism. If our policy were to change in the future, we would provide users with clear communication and choices regarding the use of their data.\n\n/// admonition | If you need us to do a security review with your IT/security teams, please [contact us](https://www.altimate.ai/support) via chat or Slack.\n    type: tip\n///\n\n---\n\n### **LLM & AI Security**\n\n### 1. **How does Altimate handle LLM access?**\n\nAltimate gives you two options for LLM access:\n\n- **BYOK (Bring Your Own Key)** — Always free and unlimited. Use your own API keys from any of 35+ supported providers (Anthropic, OpenAI, AWS Bedrock, Azure OpenAI, Google, Ollama, and more). With BYOK, your data goes directly to your chosen provider — **Altimate never sees it**.\n\n- **[Altimate LLM Gateway](llm-gateway.md)** — A managed option for users who don't want to manage API keys. The gateway dynamically routes to the best model for each task. See below for its security details.\n\n### 2. **Does the Altimate LLM Gateway store my prompts or responses?**\n\nYour full prompts and responses are not retained after processing. Your data is not used to train, fine-tune, or improve any models.\n\nThe gateway does store limited **metadata** for each request:\n\n- Number of prompt and completion tokens\n- Latency\n- Model used\n\nThis metadata is used for billing, performance monitoring, and routing optimization.\n\nAdditionally, a small number of prompts are sampled for **anonymous categorization** to power routing and model ranking. This categorization is stored completely anonymously and is never associated with your account or user ID. No code, SQL, credentials, or PII are retained.\n\nYou can opt out of all telemetry by reaching out to us via the Intercom chat built into the [Altimate dashboard](https://app.myaltimate.com).\n\n### 3. **What metadata does the Altimate LLM Gateway collect?**\n\n| Metadata | Purpose |\n|----------|---------|\n| Number of prompt tokens | Usage tracking and billing |\n| Number of completion tokens | Usage tracking and billing |\n| Latency | Performance monitoring |\n| Model used | Routing optimization |\n| Anonymous prompt categorization (sampled) | Model ranking and routing |\n\nPrompt categorization is stored completely anonymously — never linked to your account or user ID. You can opt out via the Intercom chat in the [Altimate dashboard](https://app.myaltimate.com).\n\n/// admonition | If you need us to do a security review with your IT/security teams, please [contact us](https://www.altimate.ai/support) via chat or Slack.\n    type: tip\n///\n\n---\n\n## **What data get sent to the SaaS backend for the preview features?**\n\n### Model Definition\n\n- **Model Name:** The name of the model.\n- **Model Schema:** Schema details of the model.\n- **Model SQL:** SQL queries related to the model.\n- **Adapter Type:** Type of adapter used.\n\nThe above model attributes will be referenced in the following feature descriptions\n\n### 1. Documentation Generations\n\n- **Model Attributes:** Refer to the Model Definition.\n- **Existing Documentation:** Any existing documentation for the model.\n- **Parent Models:** Corresponding parent models associated with the current model.\n\n### 2. SQL to Model\n\n- **SQL:** SQL queries used.\n- **Adapter Type:** Type of adapter used (Refer to Model Definition for adapter type details).\n- **All Models Present:** List of all models present.\n- **All Sources Present:** List of all sources present.\n\n### 3. SQL Explanation\n\n- **SQL:** SQL queries used for explanation.\n- **Adapter Type:** Type of adapter used (Refer to Model Definition for adapter type details).\n\n### 4. Column Lineage\n\n- **SQL:** SQL queries related to column lineage.\n- **Adapter Type:** Type of adapter used (Refer to Model Definition for adapter type details).\n- **Model Attributes:** Refer to the Model Definition.\n- **Upstream and Downstream Models Attributes:** Information about all upstream and downstream models. Includes models open in the LINEAGE panel in the extension and additional ones necessary for generating the lineage. (Refer to the model Definition for details about model attributes).\n\n### 5. Defer-to-prod (with saas mode - \"DataPilot dbt integration\" option)\n\n- **dbt manifest file** In the SaaS mode - when you configure \"DataPilot dbt integration\", manifest files are uploaded to the SaaS instance.\n\n/// admonition | If you would like to connect your on-premise storage for manifest file uploads, please [contact us](https://www.altimate.ai/support) via chat or Slack.\n    type: info\n///\n\nAll of the details can be found in the code [here](https://github.com/AltimateAI/vscode-dbt-power-user/blob/master/src/altimate.ts). Please note that we only send meta-data, such as model schema and queries to the backend. We never send actual data to the backend and we do not store any of the meta-data.\n\n/// admonition | If you need us to do a security review with your IT/security teams, please [contact us](https://www.altimate.ai/support) via chat or Slack.\n    type: tip\n///\n"
  },
  {
    "path": "documentation/docs/arch/llm-gateway.md",
    "content": "---\nstatus: new\n---\n\n# Altimate LLM Gateway\n\nThe Altimate LLM Gateway is a managed LLM service that gives you access to the best AI models — **60-80% cheaper** than buying tokens directly from providers. No API keys to manage, no billing across multiple providers, no rate limits to worry about.\n\n## How It Works\n\nThe gateway dynamically routes each request to the best model for the task across **Sonnet 4.6, Opus 4.6, GPT-5.4, GPT-5.3, and GPT-5.4-mini**. You pay a flat token price regardless of which model handles your request — no surprise bills from expensive model routing.\n\n## Pricing\n\n| Plan | Price | Tokens/mo | $/M tokens | Overage (per 1M tokens) |\n|------|-------|-----------|------------|------------------------|\n| **Community** | $0/mo | 10M (one-time) | Free | BYOK only |\n| **Pro Tier 1** | $29/mo | 20M | $1.45 | $5/M tokens |\n| **Pro Tier 2** | $89/mo | 70M | $1.27 | $3/M tokens |\n| **Enterprise** | Custom | Custom | Custom | Negotiated |\n\nTokens are counted as input + output combined. All tiers get access to all models — the upgrade incentive is volume, not capability.\n\n## What Would This Cost You Directly?\n\nBuying 20M tokens directly from providers:\n\n| Model | Direct Cost (20M tokens) | With Altimate Pro Tier 1 | Savings |\n|-------|--------------------------|--------------------------|---------|\n| Sonnet 4.6 | ~$84 | **$29** | ~65% |\n| Opus 4.6 | ~$140 | **$29** | ~79% |\n| GPT-5.4 (short context) | ~$75 | **$29** | ~61% |\n| GPT-5.4 (long context) | ~$135 | **$29** | ~79% |\n\nWith Altimate, you pay $29 flat regardless of which model handles your task. Buying the same 20M tokens directly from providers would cost $75-140 depending on the model — and you'd have to manage API keys, billing, and rate limits across multiple providers yourself.\n\n## BYOK vs. Gateway\n\n| | BYOK (Bring Your Own Key) | Altimate LLM Gateway |\n|---|---|---|\n| **Cost** | Free and unlimited | Token-based pricing (10M tokens free) |\n| **API Keys** | You manage your own keys | No keys needed |\n| **Models** | Any model from your provider | Dynamic routing across best-in-class models |\n| **Data Path** | Direct to your provider — Altimate never sees it | Through Altimate — see [Security FAQ](faq.md#llm-ai-security) for data handling details |\n| **Best For** | Users with existing API keys or strict data residency requirements | Users who want simplicity and cost savings |\n\nBoth options are always available. You can use BYOK and the gateway side by side.\n\n## Models Available\n\nThe gateway routes across the following models based on task complexity, context length, and quality requirements:\n\n| Model | Provider | Strengths |\n|-------|----------|-----------|\n| **Claude Sonnet 4.6** | Anthropic | Excellent price/performance for most data engineering tasks |\n| **Claude Opus 4.6** | Anthropic | Highest quality for complex reasoning and analysis |\n| **GPT-5.4** | OpenAI | Strong general-purpose capabilities |\n| **GPT-5.3** | OpenAI | Cost-effective for simpler tasks |\n| **GPT-5.4-mini** | OpenAI | Fast, lightweight tasks |\n\nYou don't choose the model — the gateway selects the optimal one for each request automatically.\n\n## Security\n\nThe Altimate LLM Gateway is designed with enterprise security requirements in mind:\n\n### Data Handling\n\n- **Your data is not used to train, fine-tune, or improve any models.**\n- The gateway stores limited metadata (token counts, latency, model used) for billing and routing.\n- A small number of prompts are sampled for anonymous categorization to improve routing. See [Security FAQ](faq.md#llm-ai-security) for full details.\n\n### Compliance\n\n- **SOC 2 Type II** certified\n- **TLS 1.3** encryption for all data in transit\n- AWS infrastructure in private VPC with network isolation\n- IAM-based RBAC with MFA enforcement for developer access\n\n\n/// admonition | If you need us to do a security review with your IT/security teams, please [contact us](https://www.altimate.ai/support) via chat or Slack.\n    type: tip\n///\n\n## Getting Started\n\n1. Install the [Datamates extension](https://marketplace.visualstudio.com/items?itemName=altimateai.vscode-altimate-mcp-server) in your IDE\n2. Open the command palette (`Cmd+Shift+P` / `Ctrl+Shift+P`) and select **Datamates: Open Altimate Code Chat**\n3. The Community plan with 10M free tokens is available immediately — no credit card required\n\nTo upgrade or manage your plan, visit the [Altimate pricing page](https://www.altimate.ai/pricing).\n"
  },
  {
    "path": "documentation/docs/arch/pricingfaq.md",
    "content": "The Power User for dbt extension is developed and maintained by [Altimate AI](https://www.altimate.ai). We are a software company based in the San Francisco Bay Area, and have many large enterprise companies as customers.\n\n### **Info about pricing plans is available on the [Pricing page](https://www.altimate.ai/pricing)**\n\n### 1. **Are you going to charge for current free features in the \"power user for dbt\" extension?**\n\nNo. We have no plans to convert previously available free features into paid features. Newly developed features may be released with a credit quota for the free community plan. Please check the [pricing page](https://www.altimate.ai/pricing) for more details.\n\n### 2. **What exactly is credit for the feature?**\n\nYou can find the definition of credit for different features in the table below.\n\n| Feature            | Definition of credit                                                                                                                                                                                         |\n| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| Docs Generation    | Each generated description = 1 credit. For bulk generation, 3 generated descriptions = 1 credit. If you bulk generate descriptions for more than 300 columns, only first 100 credits are counted             |\n| Column Lineage     | Each column lineage generation = 1 credit. Once the lineage for a particular column in a model is generated, no additional credits are counted for that particular column lineage unless VSCode is restarted |\n| Query Explanation  | Each query explanation= 1 credit, Follow-up question = 1 credit                                                                                                                                              |\n| Model Generation   | Each dbt model generation = 2 credits                                                                                                                                                                        |\n| Model Updates      | Each model change generation = 1 credit                                                                                                                                                                      |\n| Tests Generation   | Each test generation = 1 credit. No credit count for adding default tests without code generation.                                                                                                           |\n| Defer to Prod      | Each dbt command executed with defer flag (saas mode) = 1 credit                                                                                                                                             |\n| Query Translation  | Each query translation = 3 credits                                                                                                                                                                           |\n| Project Governance | Each scan = 5 credits. Same project scan is not counted again unless VSCode is restarted.                                                                                                                    |\n| Collaboration      | One share = 5 credits. It doesn't matter how many comments are added, only first time share operation is counted.                                                                                            |\n| SQL Visualizer     | Each DAG Generation = 1 credit. No additional credits are counted for creating that particular DAB unless VSCode is restarted                                                                                |\n| AI agent in UI     | Each agent execution = 1 credit                                                                                                                                                                              |\n\nFeatures that are not listed here, have unlimited free usage. Their usage is not counted towards the no. of credits\n\n### 3. **What is considered an upgrade or downgrade of the subscription?**\n\nUpgrade or downgrade of the subscription is determined based on the price of the subscription plan. If the price of the original subscription plan is higher than the price of the newer subscription plan, it's considered a downgrade. If the price of the original subscription plan is lower than the price of the new subscription plan, it's considered an upgrade.\n\n### 4. **What happens during an upgrade of the subscription?**\n\nAs soon as you upgrade the subscription, changes will be made to your instance for the new subscription. You will be charged the difference between a new subscription price and the prorated current subscription price based on the no. of credits remaining.\n\n### 5. **What happens during a downgrade of the subscription?**\n\nYour current subscription will be downgraded at the end of the current billing cycle. There is no refund when you downgrade your subscription, as the subscription is downgraded at the end of the billing cycle.\n\n### 6. **What happens if I change from a yearly subscription to a monthly subscription?**\n\nIf the price of the monthly subscription is lower than the yearly subscription, it's considered a downgrade. So, the change in the subscription will be made only after the current billing period is over.\n\nIf you would like to make an immediate change to your subscription, make the change at a yearly plan level. It will be considered an upgrade and will be effective immediately.\n\n/// admonition | If you can't find your question here, please [contact us](https://www.altimate.ai/support) via Slack.\n    type: tip\n///\n"
  },
  {
    "path": "documentation/docs/develop/autocomplete.md",
    "content": "dbt-power user extension auto-completes model, macro, column names in the VSCode\n\n## Models\n\na) Autocomplete model\n\n![Autocomplete model](images/autocompleteModel.gif)\n\nb) Go to model definition\n\n![Go to model definition](images/definitionModel.gif)\n\n## Macros\n\n/// details | a) Autocomplete macro\n\n![Autocomplete macro](images/autocompleteMacro.gif)\n\n///\n\n/// details | b) Go to macro definition\n\n![Go to macro definition](images/definitionMacro.gif)\n\n///\n\n## Sources\n\n/// details | a) Autocomplete source\n\n![Autocomplete source](images/autocompleteSource.gif)\n\n///\n\n/// details | b) Go to source definition\n\n![Go to source definition](images/definitionSource.gif)\n\n///\n\n## Doc blocks\n\n/// details | a) Autocomplete doc block\n\n![Autocomplete doc block](images/autocompleteDoc.gif)\n\n///\n\n/// details | b) Go to doc block definition\n\n![Go to doc block definition](images/definitionDoc.gif)\n\n///\n"
  },
  {
    "path": "documentation/docs/develop/clicktorun.md",
    "content": "There are two methods to do it. You can either do it from the top right corner toolbar or from the extension side pane\n\n### Method 1: Build and run models from the toolbar\n\nThe toolbar action to build models is present on the top right corner of the VSCode as shown in the image below:\n\n![buildRunModels](images/buildRunModels.png)\n\n### Method 2: Run models from the side panel\n\n![extensionPanel](images/extensionPanel.gif)\n\n/// admonition | You cannot build models from the side panel\n    type: info\n\n///\n"
  },
  {
    "path": "documentation/docs/develop/compiledCode.md",
    "content": "## Preview compiled code (SQL)\n\nThe toolbar action to preview compiled code is present on the top right corner of the VSCode as shown in the image below:\n\n![buildRunModels](images/compiledPreview.png)\n"
  },
  {
    "path": "documentation/docs/develop/explanation.md",
    "content": "Query explanation is invaluable to understanding a complex piece of dbt or SQL code (especially written by others!).\n\n## Start Query Explanation\n\nYou can get an explanation for the entire query code in the file or selected parts. If you need an explanation for only some part of the code, select that code first. You can trigger the query explanation functionality in three different ways.\n\n### Right Click Menu #Right-click, select \"DataPilot\" menu, and choose an action to \"explain\" the query.<br>\n\n![rightClick](images/queryExplainRightClick.png)<br>\n\n### Utilize SQL actions menu\n\nPress \"SQL actions\" button from the toolbar. It will open the \"SQL actions\" menu drawer, as shown below. Please select the \"Explain query\" action.<br>\n\n![sqlActions](images/queryExplainSQLActions.png) <br>\n\n### Explain query button from the query results panel\n\nThere is an explain query button in the query results panel where you can see compiled SQL. Pressing that button will start query explanation workflow.<br>\n\n![explainButton](images/queryExplainButton.png)<br>\n\n## Get more details in the DataPilot chat\n\nOnce you start the query explanation workflow in the DataPilot chat panel on the left-hand side, DataPilot will show more specific suggestions to get detailed explanations on specific areas. You can choose one of those suggestions or ask more questions in the input box below the suggestions, as shown in the image below.\n\n![explainSuggestion](images/queryExplainSuggestion.png)<br>\n\n## Recorded demo video\n\n<iframe width=\"800\" height=\"600\" src=\"https://www.youtube.com/embed/OfAmF9cJHEw?si=ueaufGL_MObAJpbf\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen></iframe>\n\n/// admonition | Please provide feedback on the generated explanations using thumbs up / down buttons. Your feedback will help us tremendously to improve this functionality.\n    type: tip\n///\n\n/// admonition | This feature requires an API key. You can get it by signing up for free at [www.altimate.ai](https://www.altimate.ai)\n    type: info\n///\n"
  },
  {
    "path": "documentation/docs/develop/genmodelSQL.md",
    "content": "You can convert existing SQL into dbt model as below. The extension automatically converts SQL to jinja-sql by populating right references.\n\n<Interactive demo for converting SQL to dbt model>\n\n<div style=\"position: relative; padding-bottom: calc(57.25% + 44px); height: 0;\"><iframe src=https://app.supademo.com/embed/clntspo5o0ickpeygblm175kb frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n\n/// admonition | This feature requires an API key. You can get it by signing up for free at [www.altimate.ai](https://www.altimate.ai)\n    type: info\n///\n"
  },
  {
    "path": "documentation/docs/develop/genmodelSource.md",
    "content": "Generating model from sources defined in yaml file is very easy as below:\n\n![Generate model from source](images/generateModelSource.gif)\n\n/// details | You can configure a file name template and prefix in the extension settings\n\n![Generate model settings](images/genModelSettings.png)\n\n///\n\n/// admonition | Why does the generated model appear with the syntax {{ adapter.quote(column_name)}}?\n    type: info\n\nThis syntax provides a safe way for the adapter to quote the columns.\nSince the extension supports different adapters, this is the easiest way to ensure that it works for all of them.\n///\n"
  },
  {
    "path": "documentation/docs/develop/translateSQL.md",
    "content": "You can translate SQL queries from one dialect to another using this functionality. For example, translate query in Postgres SQL dialect to Snowflake SQL dialect\n\n### Supported SQL dialects\n\nathena, bigquery, clickhouse, databricks, doris, drill, duckdb, hive, mysql, oracle, postgres, presto, prql, redshift, snowflake, spark, sqlite, starrocks, tableau, teradata, trino, tsql\n\n### Step 1: Create a new file and add SQL query\n\n![newTranslateFile](images/newTranslateFile.png)\n\n### Step 2: Right click, and choose DataPilot -> Translate (SQL Dialect)\n\n![rightClickTranslate](images/rightClickTranslate.png)\n\n### Step 3: Provide source and destination dialect\n\nDataPilot chat interface will open on the left hand side, where you should provide source and destination dialects.\n\nSource dialect: Current dialect of the SQL present in the file\nDestination dialect: The SQL dialect in which you want to translate the query\n\n/// admonition | Destination dialect value is auto-populated in the drop-down based on the data backend for current dbt Project. It can be changed by clicking on it.\n    type: tip\n///\n\nHit the \"Translate\" button after source and destination dialects are provided.\n\n![translateButton](images/translateButton.png)\n\n/// admonition | Query Translate (SQL Dialect) functionality works on the whole file, and not selected code snippet. DataPilot will proceed with assumption that the whole file needs to be translated.\n    type: info\n///\n\n### Step 4: Review Translated SQL and Explanation\n\nIn this step, DataPilot will give you translated SQL along with explanation of what has been changed in translation.\n\nDifferent databases use different functions for common operations or sometimes syntax is different. DataPilot translation takes care of these differences and it also provides explanation of those differences.\n\n![actulTranslation](images/actualTranslation.png)\n\n/// admonition | You can click on \"Replace\" button below translated query, and translate query will replace the original query in the file.\n    type: tip\n///\n\n### Step 5: Convert SQL to dbt Model (optional)\n\nIf needed, you can covert SQL from a file to a dbl model\nwith the SQL to dbt Model functionality [(details)](genmodelSQL.md)\n\n### Limitations\n\n/// details | Following are a few limitations\n\n- If there are functions we can't identify, then we will not be able to convert it. In those scenario, it will be kept as is.\n- We do not look at data types. If there are some data types which are not supported in the target database, we may not be able translate those\n  ///\n\n### Recorded Demo\n\n<iframe width=\"800\" height=\"600\" src=\"https://www.youtube.com/embed/ssLpEFVNE3c?si=aT8JgDlq2BKMHzN5\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen></iframe>\n"
  },
  {
    "path": "documentation/docs/develop/updatemodel.md",
    "content": "Updating or changing an existing dbt (or SQL) model using natural language is quite straightforward with this functionality.\n\n### Step 1: Trigger the Operation\n\nSelect a piece of code, or if you want to use a whole file, right-click and choose the DataPilot menu and choose the \"change\" submenu\n\n![Start Query Change](images/startDataPilotChange.png)\n\n### Step 2: Instructions for Changes\n\nGive instructions for changes in the input text box\n\n![Input to DataPilot for change](images/changeDataPilotChat.png)\n\n### Step 3: Copy the Code #Copy the changed code and put it in a file\n\n![Copy Changed Code](images/createCodeFile.png)\n\n### Recorded demo video\n\n<iframe width=\"800\" height=\"600\" src=\"https://www.youtube.com/embed/TqyNhLTRD0M?si=TJXknBYz1fVpMFAi\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen></iframe>\n\n/// admonition | Please provide feedback on the generated explanations using thumbs up / down buttons. Your feedback will help us tremendously to improve this functionality.\n    type: tip\n///\n\n/// admonition | This feature requires an API key. You can get it by signing up for free at [www.altimate.ai](https://www.altimate.ai)\n    type: info\n///\n"
  },
  {
    "path": "documentation/docs/discover/setupui.md",
    "content": "This page covers the setup steps necessary to view your dbt documentation and lineage in the SaaS UI.\nThe steps below ship your manifest.json and catalog.json projects to SaaS UI in order to visualize information like dbt model/column descriptions and column lineage.\n\n/// admonition | Please note that this lineage and documentation in UI functionality is not yet supported with dbt 1.8\n    type: info\n///\n\n/// admonition | If you want to re-create any existing dbt core integration using Connections, kindly delete the existing integration first and then create a fresh connection.\n    type: warning\n///\n\n## Step 1: Create a dbt Core Connection\n\n1. Navigate to **Settings -> Connections** and click **Create new connection**\n\n    ![DBT Core Connection](images/DBT_Cloud_Connection.png)\n\n2. Select **dbt Core** as the connection type & provide the required connection name & description details\n\n    ![Create DBT Core Connection](images/DBT_Core_Create_Connection.png)\n\n3. Provide **Environment Name** & Click **Create Connection** to create the dbt Core connection\n\n    ![Final Create DBT Core Connection](images/DBT_Core_Create_Final_Connection.png)\n\n| Field                  | Description                                                                                                                                                                                        |\n| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Connection name        | Unique connection name, this can be mapped to your dbt Project                                                                                                                                     |\n| Connection description | A brief description of the connection (e.g., \"Production dbt Core project for analytics\")                                                                                                          |\n| Environment name       | Environment name can be based on which environment that you are going to upload manifest.json and catalog.json files from. For now, just add the value as \"prod\" for your production environments.  |\n\n## Step 2: Install the open-source DataPilot CLI\n\nThe next step is to install the latest version of DataPilot CLI. It will be used to upload manifest and catalog files to the SaaS instance. Please run the following command to install the latest version of the DataPilot CLI.\n\n```\npip install altimate-datapilot-cli --upgrade\n```\n\nHere's the link to the repo: [https://github.com/AltimateAI/datapilot-cli](https://github.com/AltimateAI/datapilot-cli)\n\n## Step 3: Execute the command for uploading the manifest and catalog files\n\nGo to **Settings -> Connections** page and click on the dbt core connection name for the connection created. Copy the command for uploading files in the overlay screen on the side.\n\n/// admonition | manifest and catalog files don't contain any information about your data. It's all metadata about your environment. Please feel free to check our [security page](https://docs.myaltimate.com/arch/faq/) for more info on how we protect your metadata.\n    type: info\n///\n\n![DBT Core Connection Details](images/copyCommand.png)<br>\n\nYou need to update the following placeholders in the copied command -\n\n| Placeholder                    | Description                                                                                                                        | Example                         |\n| ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------- | ------------------------------- |\n| Path/to/manifest/file          | This is path to your manifest file in the project directory. It's usually stored in the 'target' directory in your dbt project.    | ./target/manifest.json          |\n| Path/to/catalog/file           | This is the path to your catalog file in the project directory. It's usually stored in the 'target' directory in your dbt project. | ./target/catalog.json           |\n| Path/to/run-results/file       | Path to your run results file in the project directory                                                                              | ./target/run_results.json       |\n| Path/to/semantic-manifest/file | Path to your semantic manifest file in the project directory                                                                        | ./target/semantic_manifest.json |\n| Path/to/sources/file           | Path to your sources file in the project directory                                                                                  | ./target/sources.json           |\n\n/// admonition | In addition to the required `manifest.json` and `catalog.json`, we now support uploading additional artifacts — `run_results.json`, `semantic_manifest.json`, and `sources.json` — for richer insights. These are optional but recommended for complete visibility into your dbt project.\n    type: info\n///\n\n/// admonition | If you are missing manifest.json or catalog.json files in the target directory, please run the `dbt build` and `dbt docs generate` commands. Also, you can add steps to upload the manifest and catalog files command in your dbt pipelines. That way, you will always have up-to-date documentation and lineage in UI without any manual steps.\n    type: tip\n///\n\nHere's the sample output after running the command and successfully uploading your files.\n\n```\n(.venv) pradnesh@pradneshs-MacBook-Air jaffle_shop % datapilot dbt onboard --backend-url https://api.tryaltimate.com --token 00x0x0x0x0x0x0 --instance-name freemegatenant --dbt_core_integration_id 1 --dbt_core_integration_environment prod --manifest-path ./target/manifest.json --catalog-path ./target/catalog.json\nManifest onboarded successfully!\nCatalog onboarded successfully!\nManifest and catalog ingestion has started. You can check the status at https://freemegatenant.demo.tryaltimate.com/settings/integrations/1/prod\n\n```\n\n/// admonition | It takes a few minutes to upload the files and sync that info with the rest of the UI. You can check the status of the upload by going to the link provided in the command output.\n    type: tip\n///\n\n## Automating with CI/CD Pipelines\n\nTo ensure your dbt documentation and lineage in the UI stays up-to-date automatically, we strongly recommend integrating the manifest and catalog upload process into your CI/CD pipeline. This eliminates manual steps and ensures that any changes to your dbt project are immediately reflected in the SaaS UI.\n\n## Automatic Sync with dbt Cloud Connection\n\nFor dbt Cloud users, you can now set up automatic artifact syncing in the SaaS UI using the dbt Cloud API connection. This eliminates the need for manual file uploads or CLI commands.\n\n### Prerequisites: Create a dbt Cloud Service Token\n\nBefore setting up the connection, create a service token in dbt Cloud with **Job Viewer** permission. This grants read-only access to the Jobs API for fetching artifacts (manifest.json, catalog.json) from your dbt Cloud runs.\n\n1. Click your account name in the left menu and select **Account settings**\n2. Select **Service Tokens** from the left sidebar\n3. Click **+ New Token**\n4. Enter a descriptive name (e.g., \"Altimate Integration\")\n5. Assign the **Job Viewer** permission and select the projects you want to sync\n6. Click **Save**\n7. **Important**: Copy and save the token immediately — you won't be able to view it again\n\n![DBT Cloud Connection](images/dbtCreateServiceToken.png)\n\n![DBT Cloud Connection](images/dbtServiceTokenPermission.png)\n\n> **Note**: Permission availability may vary by dbt Cloud plan. Refer to the [dbt Cloud Service Tokens documentation](https://docs.getdbt.com/docs/dbt-cloud-apis/service-tokens) for details.\n\n![DBT Cloud Connection](images/DBT_Cloud_Connection.png)\n\n### Setup Steps\n\n1. Navigate to **Settings -> Connections** and click **Create new connection**\n2. Select **dbt Cloud** as the connection type\n3. Provide the required connection details:\n4. **Service Account Token**: Generate a new Service Token from dbt Cloud Account Settings ([learn more](https://docs.getdbt.com/docs/dbt-cloud-apis/service-tokens))\n5. **Account ID**: Available at `https://cloud.getdbt.com/next/settings/accounts/{{account_id}}`\n6. **Custom URL** (optional): For custom dbt Cloud instances (defaults to `https://cloud.getdbt.com/api/v2/`)\n7. Click **Test Connection** to verify your setup\n8. Configure the sync schedule:\n    - **Scheduled**: Sync artifacts on a regular schedule. Select from Daily, Weekly, or Monthly frequency options and choose the time (UTC) when sync should occur (e.g., Daily at 12:00 AM UTC)\n    - **Real-time**: (Coming soon) Immediate sync when dbt Cloud runs complete\n9. Click **Create Connection**\n\nAfter creation, your dbt Cloud projects and environments will be automatically discovered.\n<div style=\"position: relative; box-sizing: content-box; max-height: 80vh; max-height: 80svh; width: 100%; aspect-ratio: 1.73; padding: 40px 0 40px 0;\">\n  <iframe src=\"https://app.supademo.com/embed/cml93jv5t01in180iqac81nl2?embed_v=2&utm_source=embed\" loading=\"lazy\" title=\"dbt Cloud Integration\" allow=\"clipboard-write\" frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe>\n</div>\n\n/// admonition | Automatic syncing keeps your documentation and lineage always up-to-date without manual intervention\n    type: tip\n///\n\n/// admonition | The dbt cloud connection deletion has a processing delay of a few hours. If you need to recreate the same connection immediately, contact us.\n    type: warning\n///\n\n\n"
  },
  {
    "path": "documentation/docs/discover/viewdocs.md",
    "content": "This page highlights functionality for searching and viewing documentation for your DBT Projects. Please go to Code -> dbt from the navigation menu on the left-hand side to view all your dbt models, seeds, and other components.\n\n/// admonition | [Setups steps](./setupui.md) needed for the information to show in SaaS UI\n    type: warning\n///\n\n## Search and Filter\n\nOn top of that, you can search for specific entities or columns by name via the search bar. This search also searches across the descriptions written for models and columns. On the left-hand side, there are different filters available for dbt project name, entity type, materialization etc., so you can filter different entities easily.\n![dbt Models](images/dbtModel.png)<br>\n\n## View Schema\n\nSuppose you want to get a quick view of the schema. Click \"View Schema\" button for a particular dbt Model, and the side screen will quickly show the view of schemas. In this view, you can also quickly see the documentation written for the model and columns.\n![view Schemas](images/viewSchema.png)<br>\n\n## View Details (Docs)\n\nThe \"View details\" button takes you to a more detailed view, where you can see the schema, documentation, lineage, and code information.\n![view Details](images/viewDetails.png)<br>\n\nIn addition to schemas, you can also view the actual code and compiled code in the \"Code\" tab.\n\n## Recorded Demo\n\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/JUuQM6Hxcwg?si=HAAU3UQWHQR7LssQ\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen></iframe>\n\n/// admonition | Using this feature requires an API key. You can get it by signing up for free at [www.altimate.ai](https://www.altimate.ai) Also, you need to perform the setup steps outlined on the [Setup UI page](setupui.md)\n    type: info\n///\n"
  },
  {
    "path": "documentation/docs/discover/viewlineage.md",
    "content": "In the DataPilot SaaS UI, you can see model level as well as column level lineage. You can also see the types of changes that occurred during the column lineage traversal\ne.g. column was unchanged or alias was used\n\n/// admonition | [Setups steps](./setupui.md) needed for the information to show in SaaS UI\n    type: warning\n///\n\n## View Model Level Lineage\n\nGo to code -> dbt from the left-hand navigation menu and see the available list of dbt Models. You can also search on the top or use provided filters to find the exact model you are looking for.\n\n![dbt Models](images/dbtModel.png)<br>\n\nClick on the \"View Details\" button and go to the Lineage tab. You can expand the lineage further by clicking on (+) signs on individual blocks.\n\n![View Lineage](images/viewLineage.png)<br>\n\n/// admonition | If you click on the specific model in the lineage view, the lineage graph for only that model will be highlighted, as shown in the image above.\n    type: tip\n///\n\n## View Column Level Lineage\n\nIn order to view column-level lineage, first click on \"View Details\" button in one of models shown in the lineage view. This will display a list of columns present in the model.\nClick on the column for which you need to view the lineage.\n\n![Column Selection](images/columnSelection.png)<br>\n\nOnce you click on the column, you will see the column lineage view as below:\n\n![Lineage SaaS](images/lineageSaaS.png)<br>\n\n## Code transformations\n\nYou can also see how that particular column was created from previous stage columns via transformation information available as icons at each block level.\nThe following type of transformations are shown in this view:\n\n| Type           | Description                                           |\n| -------------- | ----------------------------------------------------- |\n| Original       | The original column in the lineage graph              |\n| Alias          | Alias was used on the previous stage columns          |\n| Transformation | Transformation was used on the previous stage columns |\n| Unchanged      | No change was made in the previous stage column       |\n| Not sure       | Not known how this column was created                 |\n\nIf code is available for a particular transformation, a small code icon is displayed. When you click on the code icon, it shows the list of code transformations that were performed to create that column.\n\n![SaaS Code](images/saasCode.png)\n\n## Recorded Demo\n\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/JUuQM6Hxcwg?si=cT8KfuVBz-lm43WC&amp;start=116\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen></iframe>\n\n/// admonition | Using this feature requires an API key. You can get it by signing up for free at [www.altimate.ai](https://www.altimate.ai) Also, you need to perform the setup steps outlined on the [Setup UI page](setupui.md)\n    type: info\n///\n"
  },
  {
    "path": "documentation/docs/document/docblocks.md",
    "content": "# Support for dbt Doc Blocks\n\ndbt Power User provides comprehensive support for dbt doc blocks, allowing you to create, manage, and reference documentation blocks throughout your dbt project.\n\n<div style=\"position: relative; box-sizing: content-box; max-height: 80vh; max-height: 80svh; width: 100%; aspect-ratio: 1.5470008952551477; padding: 40px 0 40px 0;\"><iframe src=\"https://app.supademo.com/embed/cmc2au66hkebpsn1r4gfbewnf?embed_v=2\" loading=\"lazy\" title=\"Use Doc Blocks in dbt with the Power User for dbt Extension\" allow=\"clipboard-write\" frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n\n## What are dbt Doc Blocks?\n\nDoc blocks are reusable documentation components in dbt that allow you to define documentation once and reference it multiple times across your project. They're defined in `.md` files and can contain any markdown content including text, images, tables, and code snippets.\n\n```markdown\n{% docs doc_description %}\nThis is a reusable documentation block that can be referenced throughout your dbt project.\n\n{% enddocs %}\n```\n\n## Referencing Doc Blocks\n\n### In Schema Files\n\nDoc blocks can be referenced in your `schema.yml` files for consistent documentation across models:\n\n```yaml\nversion: 2\n\nmodels:\n  - name: my_model\n    description: \"{{ doc('my_model') }}\"\n    columns:\n      - name: model_id\n        description: \"{{ doc('model_id') }}\"\n```\n\n## Propagating Doc Blocks\n\nUsing the Propagate Docs Selector - you can select which downstream models you want to propagate docs to:\n\n![propagateSelector](images/propagateSelector.png)\n"
  },
  {
    "path": "documentation/docs/document/generatedoc.md",
    "content": "Instead of writing documentation manually, you can generate the documentation!\n\n### Bulk generate documentation\n\nBulk documentation generation is possible for all columns. You can also choose to bulk-generate documentation only for columns that are missing descriptions.\n\n![Bulk Edit Options](images/bulkEditOptions.png)\n\n### Regenerate documentation based on preferences around length and persona\n\nWe have added the DataPilot chat panel on the left-hand side. There, you can regenerate documentation based on specific preferences e.g. personas, content length.\n\n### Language and Persona Settings\n\nWhen it comes to generating documentation, the following settings are available: <br>\n**Language:** You can choose between French, English, Dutch, German at this time. <br>\n**Personas:** you can choose between technical user, business user and general user. If you specify general user, we don't use specific persona to generate documentation.\n\n<div style=\"position: relative; box-sizing: content-box; max-height: 80vh; max-height: 80svh; width: 100%; aspect-ratio: 2.319778188539741; padding: 40px 0 40px 0;\"><iframe src=\"https://app.supademo.com/embed/cm8og6wbf02pi110iisz3eqfc?embed_v=2\" loading=\"lazy\" title=\"Documentation Settings\" allow=\"clipboard-write\" frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n<br>Settings can be configured in the settings panel. Settings panel is opened by clicking \"Settings\" button in the top right corner of the Documentation Editor tab.\n\nExisting documentation (whether generated or written manually) can be further updated using regeneration functionality with DataPilot.\n\n/// admonition | Save changes in YAML file\n    type: tip\nYou can save the changes in the existing or a new YAML file with save button at the bottom of the panel.\nIf you see any issues with the content that's saved in the YAML file, please check the [optional config section](../setup/optConfig.md/#column-name-setup-for-yaml-file-updates).\n///\n\n### Propagate docs to downstream models\n\nYou can propagate already written descriptions to downstream model columns easily.\n\n**First, click on \"Docs Propagation\" button for the particular column**\n\n![Propagate Docs](images/propagateDocs.png)\n\n**Select columns in different models where docs should be propagated**\n\nSelect the checkboxes for right columns in models and click on the \"Propagate documentation to selected models\" button\n\n![Choose Models](images/chooseModels.png)\n\n### Personalize and Coach AI\n\nYou can personalize and coach the Documentation Writer AI teammate.\n\n/// admonition | Personalize and Coach Documentation Writer AI\n    type: tip\nPlease check more info about how to personalize and coach documentation writer AI teammate [here](../teammates/coach.md).\nIf you would like to learn more about AI teammates, please check this [doc page](../teammates/introduction.md)\n///\n\n### Documentation Collaboration\n\nYou can also enable reviews of documentation via collaboration workflow. Please check details [here](../govern/collaboration.md#document-collaboration-workflow)\n\n### Interactive Demo\n\nHere's a demo of generating model and column descriptions:\n\n<interactive demo of generating documentation>\n\n<div style=\"position: relative; padding-bottom: calc(86.34704370179949% + 42px); height: 0;\"><iframe src=\"https://app.supademo.com/embed/cm8oeopuq03drzh0i0yyvsxw7\" allow=\"clipboard-write\" frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n\n/// admonition | Document generation or propagation requires an API key. You can get it by signing up for free at [www.altimate.ai](https://wwww.altimate.ai)\n    type: info\n///\n\n### Recorded Demo\n\n<div style=\"position: relative; width: 100%; padding-bottom: 56.25%;\">\n  <iframe style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\" \n          src=\"https://www.youtube.com/embed/8EuBDEuYZ2o\" \n          title=\"YouTube video player\" \n          frameborder=\"0\" \n          allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" \n          referrerpolicy=\"strict-origin-when-cross-origin\" \n          allowfullscreen>\n  </iframe>\n</div>\n"
  },
  {
    "path": "documentation/docs/document/write.md",
    "content": "You can write descriptions for dbt models and columns in the Documentation Editor. The documentation editor also shows the descriptions that were written previously. Those previously written descriptions can be updated as well.\n\nFor columns that are not referenced in the dbt model, you can click “sync with db” button to get those columns shown in the documentation editor.\n\n/// admonition | Save changes in YAML file\n    type: tip\nYou can save the changes in the existing or a new YAML file with the save button at the bottom of the panel.\nIf you see any issues with the content that's saved in the YAML file, please check the [optional config section](../setup/optConfig.md/#column-name-setup-for-yaml-file-updates).\n///\n\n<Interactive demo of documentation editor>\n\n<div style=\"position: relative; padding-bottom: calc(91.09497964721845% + 42px); height: 0;\"><iframe src=\"https://app.supademo.com/embed/zNPSarhtOahAfzA-kw2jV\" allow=\"clipboard-write\" frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n\n/// admonition | You can also generate the documentation, please refer the section on [generate documentation](generatedoc.md)\n    type: tip\n///\n"
  },
  {
    "path": "documentation/docs/govern/collaboration.md",
    "content": "Collab functionality enables you to discuss code and documentation easily with the stakeholders via VSCode and UI. Many stakeholders are not comfortable using IDE directly; this functionality enables them also to have a discussion with technical users.\n\n## Code Collaboration Workflow\n\n/// admonition | Code Collaboration workflow allows you to discuss code without creating a PR\n    type: tip\n///\n\n### Start a discussion\n\nYou can start a discussion at the file or code block levels (single or multiple lines) by pressing (+) sign next to the code.\n\n![StartDiscussion](images/startDiscussion.png)<br>\n\n/// admonition | If you click on the display icon as shown in the image above, you can show details of the discussion previously started\n    type: tip\n///\n\nWhen a discussion is started, the extension generates dbt docs and uploads those docs to the Altimate AI SaaS instance so that non-technical stakeholders can contribute to the discussion via SaaS UI as well.\n\n### Add a comment\n\nOnce the discussion is started, you can publish a comment and also tag other users from the Altimate AI SaaS instance.\n\n![Add comment](images/discussionText.png)<br>\n\n/// admonition | If you don't want to tag the user but still want to share the link with them, just copy the link from the comments box, and share it with them manually (Slack, Email etc.)\n    type: tip\n///\n\n### Email notification (if a user is tagged)\n\nTagger user receives an email notification with a link to open the discussion in the Altimate AI UI.\n\n![Sample Email](images/sampleEmail.png)<br>\n\n### Non-technical users can reply to comment via UI\n\n![Comment UI](images/commentUI.png)\n\n### Technical user can see the comment in IDE directly\n\nThe technical user who started the discussion in IDE can see the replies from other users directly in the IDE.\n\n![List Comments](images/listComments.png)\n\nThe discussion can continue from here onwards or it can be resolved by clicking resolve action available on top of the comment textbox. Discussion can be started from a UI also\nsimilarly, by clicking on (+) sign next to the code blocks.\n\n## Document Collaboration Workflow\n\nTable and column descriptions can also be reviewed and discussed with this functionality.\n\n### Start a discussion\n\nDiscussion can be started via VSCode in the Documentation Editor panel or from SaaS product UI also from the link shared as covered in code collaboration workflow above.\n\n![Doc Discussion](images/startDocDiscussion.png)\n\n### Add a comment\n\nYou can add a comment and tag a user to the comment. In that case, that particular user will receive an email notification to open the discussion. Please check the code collaboration workflow for email notification example.\n\n![Doc Comment](images/docDiscussion.png)\n\n### View all doc discussions\n\nYou can view all doc discussion on line no. 1 of the model file, and copy discussion links from there. Click on the display icon shown on the left-hand side of line no. 1.\n\nYou can copy the documentation discussion link from here and share it with other users. You can also resolve the discussion as needed.\n\n![Doc Comment](images/firstLineList.png)\n\n## Lineage Export Workflow\n\nYou can export lineage from IDE to SaaS UI and share the URL with other team members for better collaboration\n\n### Export lineage\n\nYou can export model-level and column-level lineage. Just click the export button at the top of the panel and give the export a name.\n\n![Export Action](images/exportAction.png)\n\nOnce you create an export, a link will be generated at the bottom. You can copy this link and share it with others.\n\n![Export Link](images/exportLink.png)\n\n### View Lineage in SaaS\n\nAnyone can use this link, and view the lineage in SaaS UI.\n\n![Lineage View](images/lineageView.png)\n\nYou can also view the lineage from the list of all exported lineage views available from \"Collab\" -> \"Export Lineage\" left-hand side navigation\n\n![Lineage List](images/lineageList.png)\n\n/// admonition | In order to view the lineage in SaaS UI from the link, a user needs to be registered in the same Altimate AI instance\n    type: info\n///\n\n## Recorded Demo\n\n<iframe width=\"800\" height=\"600\" src=\"https://www.youtube.com/embed/pI1U94j-pOI?si=ckfDMYqeVgjBmg-7\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen></iframe>\n\n/// admonition | This feature requires an API key. You can get it by signing up for free at [www.altimate.ai](https://www.altimate.ai)\n    type: info\n///\n"
  },
  {
    "path": "documentation/docs/govern/governance.md",
    "content": "Prevent issues from getting shipped to production! Project governance functionality lets you swiftly scan all dbt projects in your workspace against dbt best practices and organizational guidelines to quickly bring issues to your attention.\n\n## Available via Extension & Python Package\n\nProject governance functionality is available in the power user extension and the open-source Python package.\n\n/// admonition | Also, the project governance functionality is available as a Python package, so the checks can be integrated in your Git, CI/CD workflows. More details [here](https://datapilot.readthedocs.io/en/latest/insights.html)\n    type: tip\n///\n\n## Configure Checks\n\nYou can configure different checks per your preferences in a local YAML file or the SaaS configuration stored in the Altimate AI backend. Navigate to the Action panel in the extension\n\nFirst, navigate to the Actions panel in the extension and go to \"Project Governance\" tab. Then, choose the dbt project for which you want to perform a governance check.\n![ActionsPanel](images/actionsPanel.png)<br>\n\n### Manual Configuration of Checks\n\nThe configuration of checks and the list of checks to be performed can be defined in a YAML file.\nMore details on the configuration and YAML file [here](https://datapilot.readthedocs.io/en/latest/configuration.html#project-health-configuration)\n\nSelect the YAML file by clicking on \"Select Config Path\"\n![ConfigPath](images/configPath.png)<br>\n\n### SaaS Configuration of Checks\n\n/// admonition | SaaS configuration method allows you to share multiple configurations and reference those as per environments, teams, and projects.\n    type: tip\n///\n\nFirst, navigate to governance menu item on left hand side nav and choose \"new dbt Governance Config\".\n![newCheckConfig](images/newCheckConfig.png)<br>\n\nIn the governance config, a name and description should be provided. The owner field is automatically populated by the name of the current user.\n\nIn the model section, you can define regex patterns for names to define different types of models. The default configuration is already pre-populated as:\n\n```\n  staging: \"^stg_.*\"       # Regex for staging models\n  mart: \"^(mrt_|mart_|fct_|dim_).*\"  # Regex for mart models\n  intermediate: \"^int_.*\"  # Regex for intermediate models\n  base: \"^base_.*\"         # Regex for base models\n```\n\nBelow that section, there are different types of checks available. Few of the checks, require additional configuration.\nIn that case, please click on the \"configure\" button next to the check to provide necessary configuration. You can search for specific checks and select / deselect checks that should be included in the config.\n\nThis list also shows files required to perform the check. Checks require either a manifest file or catalog file or both files.\nYou can filter checks based on the type of files required. Please hit the \"save\" button after you are done creating dbt Governance config on this screen.\n\n![listChecks](images/listChecks.png)<br>\n\nSelect the right config for checks from the list\n\n![SaaSCheckConfig](images/saasCheckConfig.png)<br>\n\n## Do the Scan\n\nClick the start scan button. You may be asked to install Altimate AI DataPilot package.\n\n/// admonition | DataPilot python package is [open source package](https://github.com/AltimateAI/datapilot), that's actually used to do governance checks with the power user extension\n    type: tip\n///\n\nThe scan usually runs in a few seconds, but depending on the size of your project and manifest / catalog files it may take longer.\n\n![DataPilotPackage](images/DataPilotPackage.png)<br>\n\n## View Scan Results\n\nView the scan results right below the \"Start Scan\" button after the scan is finished. Scan results are organized by file type and check type and can be filtered on the same.\nYou can clear results via a button or start the scan again.\n\n![ScanResults](images/scanResults.png)<br>\n\n## List of Checks\n\nChecks between the Python package and Power User extension are the same. You can find a complete list of checks [here](https://datapilot.readthedocs.io/en/latest/insights.html)\n\n## Recorded Demo\n\n<iframe width=\"800\" height=\"600\" src=\"https://www.youtube.com/embed/3nJ9otNNIwQ?si=2K-bzC0_q74o6VXZ\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen></iframe>\n"
  },
  {
    "path": "documentation/docs/govern/multiproject.md",
    "content": "# Multi Project Support with dbt-loom\n\nPower User extension now supports dbt-loom, where native features like query preview, compiled code, column lineage support multi-project references.\n\n## Setup dbt-loom in your project\n\n- Instructions on how to [install and configure dbt-loom](https://github.com/nicholasyager/dbt-loom)\n- Sample project [example with dbt-loom configured](https://github.com/Bl3f/dbt-loom-example)\n\n/// admonition | Please make sure dbt_loom.config.yml file is in the root of your multi-project directory\n    type: warning\n///\n\n## Reference models from other projects in code via auto-complete\n\nUse standard dbt-loom syntax to reference models from other projects. For example,\n\n```\n{{ ref('core', 'orders') }}\n```\n\nwhere 'orders' model from the 'core' project is referenced.\n\n![Reference Loom](images/referenceLoom.png)\n\n## Visualize Lineage with models from the other projects\n\nWhen you visualize the model or column lineage, models from other projects will be shown with the special \"ext\" type as below.\n\n![Lineage Loom](images/lineageLoom.png)\n\n## Limitations\n\n- Clicking on referenced model name in the code, and then opening that model file doesn't work for multi-project references.\n\n## Recorded Demo\n\n<div style=\"position: relative; padding-bottom: 62.5%; height: 0;\"><iframe src=\"https://www.loom.com/embed/539c361693de4cc6bebb96e1fdda1f04?sid=d3390ef2-7af5-4993-b08d-cfb664571992\" frameborder=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n"
  },
  {
    "path": "documentation/docs/govern/notebooks.md",
    "content": "**Why Notebooks?**\n\nNotebooks allow you to codify your usual ad-hoc data analysis, data preparation workflows, so they can be reused. For example, if you have a workflow for standard data analysis - check for duplicates, check timezone field, make sure only certain values are present for a \"customer_type\" column - you can create a notebook to codify these steps. Then, you can always trigger this notebook with a click of button for a table or data output of particular model to validate or clean the data. In these notebooks, you can create different 'cells' mapping to jinja-sql, python or markdown text in a single file, and you can execute these cells together.\n\n**Notebook templates**\n\nYou can also utilize some out-of-the-box notebook templates for common tasks - e.g. profile the data results, create a config file for the project, create dbt staging models etc.\n\n**Notebook sharing**\n\nMany times, this ad-hoc work is dependent on organizational best practices and the type of data that your team works on. So, these notebooks can be reused by your team members as well as extended teams. That's why we have enabled sharing - where you can share notebooks with other users in your Altimate AI saas instance. This is especially useful when you have popular notebooks spread across multiple code repositories.\n\n/// admonition | We would love to hear your feedback on what additional functionality we can build in this area. If you have encountered any issues in this functionality, please message us over [chat](https://app.myaltimate.com/contactus)\n    type: tip\n///\n\n## Enable notebooks in VSCode\n\nYou just need to add the following line to the settings.json file in your .vscode directory at the root of your repo.\n\n```\n\"dbt.enableNotebooks\": true,\n```\n\n/// admonition | If you don't have the .vscode directory at the root of the repo, please create it\n    type: info\n///\n\nThen, reload or restart your VSCode.\n\n## Create new notebook\n\nYou can create a notebook by going to File -> New File and then choosing the option of\nDataPilot Notebook as shown below.\n\n![Start Notebook](images/startNotebook.png)<br>\n\nAfter this, it will give you an option of creating a blank notebook or use one of the existing templates.\nFor now, let's choose a \"blank notebook\". The first code cell will be automatically created for you.\n\n![Cells Info](images/cellsInfo.png)<br>\n\nYou can add additional code cells or markdown text cells. There are additional options available for the code cell to run cells, split, delete etc. as below\n\n![Cell Actions](images/cellActions.png)<br>\n\nAfter you are done, you can just save the notebook file like any other file in VSCode.\n\n## Use notebook templates\n\nThere are a few ways in which you can trigger notebook templates.\n\n/// admonition | The notebook templates may use some standard Python packages, and VSCode may ask for your confirmation before installing the necessary packages\n    type: info\n///\n\n**There is a contextual notebook menu available at the top of the file when you open any SQL file in VSCode**\n![Top Menu](images/topMenu.png)<br>\n\nAfter notebook is created based on the template, just click on \"Run all\" button on top to execute the notebook and get results.\nFollowing notebook templates are available today:\n\n### [Template] Profile the query\n\nThis template will have two cell blocks. First block will have SQL / jinja query and it will produce preview of data results.\nThe second block will have python code for profiling the query.\n\n### [Template] Get test suggestions\n\nThis template will recommend tests based on the context of the dbt model, and generate code for those tests as well.\n![testCode](images/testCode.png)<br>\n\n### [Template] Generate dbt base model SQL\n\nThis template will generate base model SQL based on your input of source name and table information.\n![baseModel](images/baseModel.png)<br>\n\n### [Template] Generate dbt model yaml\n\nThis template creates config yaml for documentation and tests for the particular dbt model from where the action is triggered.\n![configYaml](images/configYaml.png)<br>\n\n### [Template] Generate dbt model CTE\n\nThis template generates model CTEs from dbt model file.\n\n**You can also create notebooks from the \"Actions\" tab in VSCode (present in the bottom panel)**\n\n![actionsTab](images/actionsTab.png)<br>\n\nThere are some notebook templates available as pre-configured notebooks. These templates are used at\ndbt Project level.\n\n### [Template] Generate dbt source yaml\n\nBased on schema name specified in the code block, it can generate source yaml for you automatically.\nYou need to provide schema name as an input in the code block.\n\n![sourceYaml](images/sourceYaml.png)<br>\n\n### [Template] Extract exposures from Metabase\n\nThis template helps extract exposures from Metabase\n![expoMetabase](images/expoMetabase.png)<br>\n\n/// admonition | We would love to hear your feedback on what additional templates or functionality we can build in this area. If you have encountered any issues in this functionality, please message us over [chat](https://app.myaltimate.com/contactus)\n    type: tip\n///\n\n## Share notebook\n\nOnce you save the notebook, you can share it with other users in DataPilot instance. This enables you to share notebooks across repositories with the whole organization.\n\n![shareNotebook](images/shareNotebook.png)<br>\n\n## Recorded demo\n\n<div style=\"position: relative; padding-bottom: 62.5%; height: 0;\"><iframe src=\"https://www.loom.com/embed/326aecdce9ee42e8b2d28e366d52be5a?sid=fee59cc0-ea1f-4dcd-a22b-908f121b2255\" frameborder=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n"
  },
  {
    "path": "documentation/docs/govern/querybookmarks.md",
    "content": "# Query History and Bookmarks\n\nNow, you can see the history of all the SQL queries or dbt models you ran. So, you can re-run them to view and compare results to see how your data has changed between code changes. You can also look at the compiled SQL code of queries that were run previously.\n\nQueries from the query history can also be bookmarked and tagged. So, you can reuse those queries next time you need to do a similar ad-hoc analysis.\n\nUsers can also share their query bookmarks with other users in your org-specific DataPilot SaaS instance. That way, you can have a shared repository of the most useful queries across the team.\n\n/// admonition | Your VSCode session stores only the last 10 queries in the query history, and this info is stored locally on your machine and not in the SaaS instance.\n    type: info\n///\n\n## View Query History\n\nYou can view query history in the \"History\" tab of the \"Query History\" panel. You can also search your query history for specific queries.\n\n![Query History](images/queryHistory.png)<br>\n\n## Execute Query from History\n\nIf you hover over the query from the history, you can perform a few actions, like executing the query (play icon) or bookmarking the query (bookmark icon). If you execute the query, the results are shown in the main code editor window as shown below:\n\n![Execute History](images/executeHistory.png)<br>\n\n/// admonition | In this way, you can [compare query results](https://docs.myaltimate.com/test/queryResults/#compare-query-results) between different runs of your query\n    type: info\n///\n\n## Add Bookmark\n\nIf you execute some query frequently, you can also bookmark that query by clicking the bookmark button when you hover the query entry in the history.\n\n![Bookmark Query](images/addBookmark.png)<br>\n\n/// admonition | You can add tags to your queries for better organization. You can also search your bookmarks by text or by tags. Many users use tags to categorize queries based on a specific purpose or a project.\n    type: tip\n///\n\n## Share Bookmark\n\nYou can share your bookmarks with other users in your Altimate AI instance so they can utilize those queries. When you share a bookmark, it's shared with all the users in \"your\" Altimate AI SaaS instance.\n\n![Share Query](images/shareBookmark.png)<br>\n\n## View Code\n\nQuery or bookmark code can be easily viewed by clicking on the query. Also, this code can be opened in the main code editor window by clicking on the icon as shown below:\n\n![View Code](images/bookmarkCode.png)<br>\n\n## Recorded Demo\n\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/1TPAyE5EJ5Y?si=JQqP2cXIEu_AUvwU\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen></iframe>\n\n/// admonition | This feature requires an API key. You can get it by signing up for free at [www.altimate.ai](https://www.altimate.ai)\n    type: info\n///\n"
  },
  {
    "path": "documentation/docs/index.md",
    "content": "# Accelerate dbt and SQL Development by 3x\n\n\nWelcome to the docs for [dbt Power User VSCode Extension](https://marketplace.visualstudio.com/items?itemName=innoverio.vscode-dbt-power-user), an [open sourced](https://github.com/AltimateAI/vscode-dbt-power-user) extension created by [Altimate AI](https://www.altimate.ai/).\n\nIt offers various features across three important phases of dbt and SQL work - develop, test, and collaborate.\n\n<div class=\"html-in-md\">\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Accelerate dbt and SQL Development by 3x</title>\n    <style>\n        .container {\n            max-width: 1000px;\n            margin: 0 auto;\n            padding: 15px;\n            background: linear-gradient(145deg, var(--bg-secondary), var(--bg-primary));\n            border-radius: 20px;\n            -webkit-background-clip: text;\n            -webkit-text-fill-color: text;\n            box-shadow: 0 10px 30px var(--shadow-color);\n        }\n        .workflow {\n            display: flex;\n            flex-direction: column;\n            margin-bottom: 20px;\n        }\n        .steps {\n            display: flex;\n            justify-content: space-between;\n            width: 100%;\n            position: relative;\n            margin-bottom: 20px;\n        }\n        .step {\n            background: linear-gradient(135deg, var(--gradient-start), var(--gradient-end));\n            font-size: 20px;\n            padding: 10px;\n            border-radius: 12px;\n            text-align: center;\n            z-index: 1;\n            width: 45%;\n            box-shadow: 0 4px 20px rgba(66, 133, 244, 0.3);\n            transition: transform 0.3s ease, box-shadow 0.3s ease;\n        }\n        .step:hover {\n            transform: translateY(-2px);\n            box-shadow: 0 6px 20px rgba(66, 133, 244, 0.4);\n        }\n        .details {\n            display: flex;\n            justify-content: space-between;\n            gap: 20px;\n        }\n        .column {\n            width: 45%;\n            padding: 10px;\n            border-radius: 15px;\n            background: transparent;\n            position: relative; \n            border: 1px solid var(--border-color);\n            box-shadow: 0 4px 15px var(--shadow-color);\n            transition: transform 0.3s ease, box-shadow 0.3s ease;\n        }\n        .column:hover {\n            transform: translateY(-2px);\n            box-shadow: 0 6px 20px rgba(0, 0, 0, 0.1);\n        }\n        ul {\n            /* padding-left: 20px;\n            margin: 0; */\n        }\n        li {\n            margin-bottom: 15px;\n            position: relative;\n            padding-left: 10px;\n        }\n        li:last-child {\n            margin-bottom: 0;\n        }\n        a {\n            color: var(--text-secondary);\n            text-decoration: none;\n            transition: color 0.3s ease;\n            position: relative;\n        }\n        a:hover {\n            color: var(--gradient-end);\n        }\n        a::after {\n            content: '';\n            position: absolute;\n            width: 100%;\n            height: 2px;\n            bottom: -2px;\n            left: 0;\n            background: linear-gradient(90deg, var(--gradient-start), var(--gradient-end));\n            transform: scaleX(0);\n            transform-origin: right;\n            transition: transform 0.3s ease;\n        }\n        a:hover::after {\n            transform: scaleX(1);\n            transform-origin: left;\n        }\n        .connecting-line {\n            width: 3px;\n            height: 20px;\n            background: linear-gradient(180deg, var(--gradient-start), var(--gradient-end));\n            margin: 0 auto;\n            box-shadow: 0 2px 8px rgba(66, 133, 244, 0.2);\n        }\n    </style>\n</head>\n<body>\n    <div class=\"container\">        \n        <div class=\"workflow\">\n            <div class=\"steps\">\n                <div class=\"arrow\"></div>\n                <div class=\"step\">Develop</div>\n                <div class=\"step\">Test</div>\n                <div class=\"step\">Collaborate</div>\n            </div>\n        </div>\n        <div class=\"details\">\n            <div class=\"column\">\n                <ul>\n                    <li><a href=\"test/sqlvisualizer\">SQL Visualizer</a></li>\n                    <li><a href=\"develop/explanation\">Query Explanation</a></li>\n                    <li><a href=\"develop/genmodelsource\">Auto-gen dbt from source</a></li>\n                    <li><a href=\"develop/genmodelSQL\">Auto-gen dbt from SQL</a> </li>\n                    <li><a href=\"develop/autocomplete\">Auto-complete code</a> </li>\n                    <li><a href=\"develop/clicktorun\"> Click to Run Models</a></li>\n                    <li><a href=\"develop/translateSQL\">Query Translation</a></li>\n                    <li><a href=\"develop/compiledCode\">Compiled SQL preview</a></li>\n                </ul>\n            </div>\n            <div class=\"column\">\n                <ul>\n                    <li><a href=\"test/queryResults\">Preview query results and analysis</a></li>\n                    <li><a href=\"test/writetests\">Tests Generation</a></li>\n                    <li><a href=\"test/lineage\">Column lineage with code visibility</a></li>\n                    <li><a href=\"test/defertoprod\">Defer to prod</a></li>\n                    <li><a href=\"test/sqlvalidation\">SQL validation without execution</a></li>\n                </ul>\n            </div>\n            <div class=\"column\">\n                <ul>\n                    <li><a href=\"govern/collaboration\">Collaboration workflows</a></li>\n                    <li><a href=\"document/generatedoc\">Documentation generation</a></li>\n                    <li><a href=\"govern/governance\">Project governance in IDE, Git, CI/CD</a></li>\n                    <li><a href=\"discover/viewlineage\">SaaS UI for dbt docs and lineage</a></li>\n                    <li><a href=\"govern/querybookmarks\">Query history and Query bookmarks</a></li>\n                </ul>\n            </div>\n        </div>\n    </div>\n</body>\n</html>\n\n</div>\n\n## Datamates with AI Teammates\n\nThe Power User extension is part of the Datamates Platform. Datamates Platform offers the functionality to automate and accelerate the work of data teams in various areas\nof platform engineering, data engineering, and analytics engineering. Datamates Platform consists of many AI teammates to help data teams with their work. For example, there is a documentation generator teammate that's specifically developed to handle data documentation work.\n\nThese AI teammates are available as part of the power user extension to offer the functionality ranging from dbt models, docs, tests generation to SQL translation & explanation. AI teammates can be coached by you and personalized for your specific requirements. To learn more - please check this section on [coaching AI teammates](./teammates/coach.md).\n\n<br>\n## Feature Comparison\n\nThe dbt Power User Extension has great features out of the box. Add a free [Altimate api key](setup/reqdConfig.md#enable-saas-features-by-adding-api-key) to unlock all the features in \"With Altimate AI Key\" below.\n\n<div class=\"html-in-md\">\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Feature Comparison</title>\n</head>\n<body>\n    <div class=\"container\">        \n        <div class=\"workflow\">\n            <div class=\"steps\">\n                <div class=\"arrow\"></div>\n                <div class=\"step\">dbt Power Users Extension</div>\n                <div class=\"step\">With Altimate AI Key</div>\n            </div>\n        </div>\n        <div class=\"details\">\n            <div class=\"column\">\n                <ul>\n                    <li><a href=\"test/sqlvisualizer\">SQL Visualizer</a></li>\n                    <li><a href=\"test/lineage/#model-lineage\">Data Lineage: Model Level </a></li>\n                    <li><a href=\"develop/genmodelsource\">Auto-gen dbt from source</a></li>\n                    <li><a href=\"develop/autocomplete\">Auto-complete code</a> </li>\n                    <li><a href=\"develop/clicktorun\">Click to Run Models</a></li>\n                    <li><a href=\"develop/compiledCode\">Compiled SQL preview</a></li>\n                    <li><a href=\"test/queryResults\">Preview query results and analysis</a></li>\n                    <li><a href=\"test/defertoprod\">Defer to prod</a></li>\n                    <li><a href=\"test/sqlvalidation\">SQL validation without execution</a></li>\n                </ul>\n            </div>\n            <div class=\"column\">\n                <ul>\n                    <li><a href=\"https://datamates-docs.myaltimate.com/user-guide/home/\">Datamates</a></li> \n                    <li><a href=\"test/lineage/#column-lineage\">Data Lineage: Column Level </a></li>\n                    <li><a href=\"develop/explanation\">Query Explanation AI</a></li>\n                    <li><a href=\"develop/translateSQL\">Query Translation AI</a></li>\n                    <li><a href=\"develop/genmodelSQL\">Auto-gen dbt from SQL</a> </li>\n                    <li><a href=\"test/writetests\">Tests Generation AI</a></li>\n                    <li><a href=\"document/generatedoc\">Documentation Generation AI</a></li>\n                    <li><a href=\"teammates/coach\">Coach & Personalize AI Teammates</a></li>\n                    <li><a href=\"govern/collaboration#start-a-discussion\">Code Collaboration</a></li>\n                    <li><a href=\"govern/collaboration#start-a-discussion_1\">Documentation Collaboration</a></li>\n                    <li><a href=\"govern/collaboration#lineage-export-workflow\">Data Lineage - Export</a></li>\n                    <li><a href=\"govern/collaboration#view-lineage-in-saas\">Data Lineage - SaaS UI</a></li>\n                    <li><a href=\"govern/governance#configure-checks\">Project Governance - VS Code </a></li>              \n                    <li><a href=\"govern/governance#available-via-extension-python-package\">Project Governance - CI/CD </a></li>              \n                    <li><a href=\"govern/governance#saas-configuration-of-checks\">Project Governance - SaaS UI</a></li>         \n                    <li><a href=\"discover/viewlineage\">dbt Docs - SaaS UI (dbt core or cloud)</a></li>\n                    <li><a href=\"govern/querybookmarks\">Query History</a></li>\n                    <li><a href=\"govern/querybookmarks\">Query Bookmarks</a></li>\n                    <li><a href=\"govern/querybookmarks\">Query Sharing</a></li>\n                    \n                </ul>\n            </div>\n        </div>\n    </div>\n</body>\n</html>\n\n</div>\n\n## Support\n\nPower user extension and Datamates Platform is developed and maintained by [Altimate AI team](https://www.altimate.ai).\nPlease join the dbt Community Slack Channel [#tools-dbt-power-user](https://getdbt.slack.com/archives/C05KPDGRMDW) to meet with the community of users of the extension.\n\nIf you run into issues, please [contact us](https://www.altimate.ai/support) via Slack or chat\n"
  },
  {
    "path": "documentation/docs/javascripts/feedback,js",
    "content": "var feedback = document.forms.feedback\nfeedback.addEventListener(\"submit\", function(ev) {\n  ev.preventDefault()\n\n  /* Retrieve page and feedback value */\n  var page = document.location.pathname\n  var data = ev.submitter.getAttribute(\"data-md-value\")\n\n  /* Send feedback value */\n  console.log(page, data)\n})"
  },
  {
    "path": "documentation/docs/overrides/.gitkeep",
    "content": ""
  },
  {
    "path": "documentation/docs/overrides/main.html",
    "content": "{% extends \"base.html\" %}\n\n{% block announce %}\n<strong>New!</strong> Altimate Code &mdash; #1 on ADE-Bench. 100+ deterministic tools for dbt &amp; SQL. <a href=\"/arch/llm-gateway/\">10M tokens of Sonnet, Opus &amp; GPT-5 &mdash; free!</a> <a class=\"md-banner-cta\" href=\"/teammates/altimate-code/\">Get Started &rarr;</a>\n{% endblock %}\n\n{% block extrahead %}\n  <!-- Start of Reo Javascript -->\n  <script type=\"text/javascript\">\n    !function(){var e,t,n;e=\"e4fe6006f75148d\",t=function(){Reo.init({clientID:\"e4fe6006f75148d\"})},(n=document.createElement(\"script\")).src=\"https://static.reo.dev/\"+e+\"/reo.js\",n.defer=!0,n.onload=t,document.head.appendChild(n)}();\n  </script>\n  <!-- End of Reo Javascript -->\n{% endblock %}\n"
  },
  {
    "path": "documentation/docs/setup/configuration.md",
    "content": "# Configuration Settings\n\nThis page provides a comprehensive overview of all available configuration settings in the dbt Power User extension. The settings are organized by category for easy reference.\n\n## Core Settings\n\n### dbt Integration Settings\n\n#### dbt.dbtIntegration\n\n- **Type**: string\n- **Default**: \"core\"\n- **Options**: [\"core\", \"cloud\", \"fusion\", \"corecommand\"]\n- **Description**: Choose how you want to integrate with dbt. Use \"core\" for local dbt installations with Python bridge, \"cloud\" for dbt Cloud integration, \"fusion\" for dbt Fusion CLI integration, or \"corecommand\" for command-line based dbt core integration. This setting determines how the extension interacts with your dbt environment.\n\n#### dbt.dbtPythonPathOverride\n\n- **Type**: string\n- **Description**: Specify a custom path to your Python executable or entrypoint. This is useful when you need to use a specific Python environment different from the VS Code Python extension's default. Most users should leave this empty and configure their Python environment through the VS Code Python extension instead.\n\n#### dbt.dbtCustomRunnerImport\n\n- **Type**: string\n- **Default**: \"from dbt.cli.main import dbtRunner\"\n- **Description**: Customize the Python import statement used to import the dbt runner. This is only applicable when using dbt core integration. Useful when you have a custom dbt implementation or need to use a specific dbt runner class.\n\n#### dbt.installDepsOnProjectInitialization\n\n- **Type**: boolean\n- **Default**: true\n- **Description**: Controls whether the extension automatically runs dbt deps when initializing a project. When enabled, the extension will automatically install all package dependencies specified in your packages.yml file when you first open a dbt project.\n\n## Project Configuration\n\n#### dbt.allowListFolders\n\n- **Type**: array of strings\n- **Default**: []\n- **Description**: Specify which folders in your workspace should be considered for dbt operations. This is particularly useful in monorepos or workspaces with multiple dbt projects. Paths should be relative to the workspace root.\n\n#### dbt.deferConfigPerProject\n\n- **Type**: object\n- **Description**: Configure how the extension handles model dependencies across environments.\n- **Properties**:\n  - `deferToProduction`: boolean - When true, allows running models without rebuilding parent models\n  - `manifestPathForDeferral`: string - Path to the manifest file containing parent model information\n  - `favorState`: boolean - When true, uses the deferred state even if the model exists in both environments\n\n## Command Settings\n\n#### dbt.runModelCommandAdditionalParams\n\n- **Type**: array of strings\n- **Default**: []\n- **Description**: Add extra command-line parameters to all dbt run commands. Each parameter must be a separate array entry.\n\n#### dbt.buildModelCommandAdditionalParams\n\n- **Type**: array of strings\n- **Default**: []\n- **Description**: Add extra command-line parameters to all dbt build commands. Similar to runModelCommandAdditionalParams, but specifically for build commands.\n\n## Query Settings\n\n#### dbt.queryLimit\n\n- **Type**: integer\n- **Default**: 500\n- **Minimum**: 1\n- **Description**: Controls the maximum number of rows returned when using the Preview SQL Query command.\n\n#### dbt.queryTemplate\n\n- **Type**: string\n- **Default**: \"select from ({query}\\n) as query limit {limit}\"\n- **Description**: Customize how preview queries are constructed. The template must include {query} and {limit} placeholders.\n\n## UI/Display Settings\n\n#### dbt.perspectiveTheme\n\n- **Type**: string\n- **Default**: \"Vintage\"\n- **Options**: [\"Vintage\", \"Pro Light\", \"Pro Dark\", \"Vaporwave\", \"Solarized\", \"Solarized Dark\", \"Monokai\"]\n- **Description**: Choose the visual theme for the query results viewer.\n\n## Model Generation Settings\n\n#### dbt.fileNameTemplateGenerateModel\n\n- **Type**: string\n- **Default**: \"{prefix}{sourceName}{tableName}\"\n- **Options**:\n  - \"{prefix}{sourceName}{tableName}\"\n  - \"{prefix}{tableName}\"\n  - \"{tableName}\"\n- **Description**: Define how new model filenames are generated when creating models from sources.\n\n#### dbt.prefixGenerateModel\n\n- **Type**: string\n- **Default**: \"base\"\n- **Description**: Set the default prefix used when generating new models from sources.\n\n## SQL Formatting\n\n#### dbt.sqlFmtPath\n\n- **Type**: string\n- **Description**: Specify the path to your SQL formatter executable (sqlfmt).\n\n#### dbt.sqlFmtAdditionalParams\n\n- **Type**: array of strings\n- **Default**: []\n- **Description**: Add extra parameters to the SQL formatting command.\n\n## Altimate AI Integration\n\n#### dbt.altimateAiKey\n\n- **Type**: string\n- **DisplayName**: \"Altimate AI API Key\"\n- **Description**: Required for features that need backend support. Sign up for a free Altimate AI account at app.myaltimate.com/register.\n\n#### dbt.altimateInstanceName\n\n- **Type**: string\n- **DisplayName**: \"Altimate AI Instance Name\"\n- **Description**: The instance name for your Altimate AI account.\n\n## Feature Toggles\n\n#### dbt.enableNewLineagePanel\n\n- **Type**: boolean\n- **Description**: Enable or disable the new lineage panel in dbt.\n\n#### dbt.enableCollaboration\n\n- **Type**: boolean\n- **Default**: true\n- **Description**: Enable or disable the documentation collaboration features.\n\n#### dbt.disableQueryHistory\n\n- **Type**: boolean\n- **Default**: false\n- **Description**: Control whether the extension keeps track of your query history and bookmarks.\n\n#### dbt.enableNotebooks\n\n- **Type**: boolean\n- **Default**: false\n- **Description**: Enable or disable the Datapilot notebooks feature.\n\n## Lineage Settings\n\n#### dbt.lineage.showSelectEdges\n\n- **Type**: boolean\n- **Default**: true\n- **Description**: Control the visibility of SELECT statement relationships in the lineage graph.\n\n#### dbt.lineage.showNonSelectEdges\n\n- **Type**: boolean\n- **Default**: false\n- **Description**: Control the visibility of non-SELECT relationships in the lineage graph.\n\n#### dbt.lineage.defaultExpansion\n\n- **Type**: number\n- **Default**: 1\n- **Description**: Set how many levels of relationships are automatically expanded when viewing the lineage graph.\n\n## Other Settings\n\n#### dbt.unquotedCaseInsensitiveIdentifierRegex\n\n- **Type**: string\n- **Description**: Define a regular expression pattern to identify unquoted identifiers in your SQL code.\n\n#### dbt.conversationsPollingInterval\n\n- **Type**: integer\n- **Default**: 900\n- **Minimum**: 30\n- **Description**: Set how frequently (in seconds) the extension checks for new comments and conversations in documentation.\n"
  },
  {
    "path": "documentation/docs/setup/cursor_installation_workaround.md",
    "content": "# Cursor IDE: Installation Workaround\n\n/// admonition | Known Cursor Issue\n    type: warning\n\nSome Cursor IDE users experience the dbt Power User extension installation freezing for several minutes, followed by a **\"Failed to fetch\"** error dialog. This is a **known issue on Cursor's side** and has been reported and acknowledged by the Cursor team. See the [Cursor forum thread](https://forum.cursor.com/t/dbt-power-user-extension-installation-freezes-with-repeated-extensionquery-requests-and-failed-to-fetch-error/149385/4) for details.\n\nUntil the Cursor team resolves this, please try the workarounds below.\n///\n\n## Problem\n\nWhen installing the dbt Power User extension in Cursor IDE:\n\n1. The installation **freezes for several minutes** with repeated `extensionQuery` requests.\n2. An error dialog appears with a **\"Failed to fetch\"** message.\n3. The extension fails to install through the normal marketplace flow.\n\n---\n\n## Workaround 1: Register extension metadata and reinstall\n\nThis workaround tricks Cursor into recognizing the extension entry, then lets you cleanly reinstall it.\n\n**Step 1.** Open the Cursor extensions metadata file at:\n\n| Platform | Path |\n|----------|------|\n| macOS / Linux | `~/.cursor/extensions/extensions.json` |\n| Windows | `%USERPROFILE%\\.cursor\\extensions\\extensions.json` |\n\n**Step 2.** Add the following JSON object to the array in that file:\n\n/// admonition | Update the paths\n    type: tip\n\nReplace `<YOUR_HOME_DIR>` with your actual home directory path (e.g. `/Users/jane`, `/home/jane`, or `C:/Users/jane`).\n///\n\n```json\n{\n    \"identifier\": {\n        \"id\": \"innoverio.vscode-dbt-power-user\"\n    },\n    \"version\": \"0.59.1\",\n    \"location\": {\n        \"$mid\": 1,\n        \"fsPath\": \"<YOUR_HOME_DIR>/.cursor/extensions/innoverio.vscode-dbt-power-user-0.59.1-universal\",\n        \"path\": \"<YOUR_HOME_DIR>/.cursor/extensions/innoverio.vscode-dbt-power-user-0.59.1-universal\",\n        \"scheme\": \"file\"\n    },\n    \"relativeLocation\": \"innoverio.vscode-dbt-power-user-0.59.1-universal\",\n    \"metadata\": {\n        \"installedTimestamp\": 1768889206275,\n        \"pinned\": false,\n        \"source\": \"gallery\",\n        \"id\": \"4e4743d1-e423-44b9-88a4-d639da0996d1\",\n        \"publisherId\": \"4a9e9d34-3546-42a6-971d-5a640a726245\",\n        \"publisherDisplayName\": \"Altimate Inc.\",\n        \"targetPlatform\": \"universal\",\n        \"updated\": false,\n        \"private\": false,\n        \"isPreReleaseVersion\": false,\n        \"hasPreReleaseVersion\": false\n    }\n}\n```\n\n/// admonition | Validate your JSON\n    type: info\n\nIf `extensions.json` already has other entries, make sure to add a comma separator between objects so the JSON remains valid.\n///\n\n**Step 3.** Save the file.\n\n**Step 4.** The extension will now appear as installed in Cursor, but it is not actually installed yet — this is just a metadata entry.\n\n![Extension shows as installed after metadata change](images/cursor_workaround_step_1.png)\n\n**Step 5.** Reload the Cursor window:\n\n- Press `Cmd + Shift + P` (macOS) or `Ctrl + Shift + P` (Windows/Linux)\n- Type **\"Developer: Reload Window\"** and press Enter\n\n**Step 6.** Open the dbt Power User extension page. You will see an error that the extension files don't exist — this is expected:\n\n![Extension page showing error](images/cursor_workaround_step_2.png)\n\n```\nUnable to read file '.../.cursor/extensions/innoverio.vscode-dbt-power-user-0.59.1-universal/package.json'\n```\n\n![Package.json not found error](images/cursor_workaround_step_3.png)\n\n**Step 7.** **Uninstall** the extension, then **reinstall** it. You can choose any version you want to install. The installation should now complete successfully.\n\n---\n\n## Workaround 2: Manual VSIX installation\n\nIf Workaround 1 does not resolve the issue, you can manually install the extension using a `.vsix` file.\n\n**Step 1.** Download the `.vsix` file from the [Open VSX Registry](https://open-vsx.org/extension/innoverio/vscode-dbt-power-user):\n\n- Go to the extension page and click **Download** to get the `.vsix` file.\n\n![Download VSIX from Open VSX](images/cursor_workaround_manual.png)\n\n**Step 2.** Install the `.vsix` file in Cursor:\n\n- Open the **Extensions** panel in Cursor\n- Drag and drop the downloaded `.vsix` file into the Extensions panel\n\nThe extension will install directly from the file, bypassing the marketplace fetch entirely.\n\n---\n\n/// admonition | Still having issues?\n    type: tip\n\nIf neither workaround resolves the problem, please reach out on the [#tools-dbt-power-user](https://getdbt.slack.com/archives/C05KPDGRMDW) Slack channel or [contact support](https://www.altimate.ai/support).\n///\n"
  },
  {
    "path": "documentation/docs/setup/faq.md",
    "content": "## Frequently Asked Questions\n\n- **Why am I receiving a \"Network Error\" message when trying to log into my Altimate AI account on the Sign In page?**\n\nWhen logging into your Altimate AI account on the Sign In page, if you encounter a \"Network Error\" message, it's likely due to the use of the general URL: https://app.myaltimate.com/login. At Altimate AI, we assign a unique URL to each tenant as part of our commitment to ensuring data isolation and providing a seamless user experience. Therefore, to access your account without any issues, it's crucial to use the specific URL that was uniquely created for you at the time of your account registration.\n\n- **How to Customize the Target Profile for VS Code dbt Power User Extension Functions?**\n\nTo customize the target profile in VS Code for dbt Power User extension functions, follow these steps:\n\nOpen Your dbt Project: Ensure you have your dbt project open in VS Code where the dbt Power User extension is installed.\n\nLocate the profiles.yml File: This file contains the configuration for your different dbt profiles. By default, the extension uses the 'dev' profile.\n\nEdit the Profile: In the profiles.yml file, you can define multiple profiles. Each profile can have different settings for your database connection and other preferences.\n\nSet Your Desired Profile:\n\nTo change the active profile, you can use the dbt CLI command `dbt --profile your_profile_name debug` in the integrated terminal of VS Code.\nAlternatively, some extensions allow profile selection through the extension settings. Check if dbt Power User has such an option by going to the extension settings in VS Code.\nRestart VS Code: After making changes, restart VS Code to ensure that the new profile settings are loaded.\n\nVerify the Change: Run a command like \"compiled dbt preview\" or \"query preview\" to verify that the extension is now using your specified profile.\n"
  },
  {
    "path": "documentation/docs/setup/installation.md",
    "content": "/// admonition | We've released our [Datamates Extension](https://marketplace.visualstudio.com/items?itemName=altimateai.vscode-altimate-mcp-server) - to give you the power to use AI TeamMates! [Click here](https://datamates-docs.myaltimate.com/) to learn more.\n///\n\nThere are a few different ways in which extension can be installed.\nYou can install it natively or in a dev container.\n\n## Install the extension natively\n\nYou can install the extension from VSCode directly or from the [VSCode Marketplace](https://marketplace.visualstudio.com/items?itemName=innoverio.vscode-dbt-power-user)\n\nYou can install the extension from Cursor or any other VSCode compatible editors directly or from the [Open VSX Registry](https://open-vsx.org/extension/innoverio/vscode-dbt-power-user)\n\n/// admonition | Cursor IDE users: Installation may freeze\n    type: warning\n\nSome Cursor users experience the extension installation freezing for several minutes and showing a \"Failed to fetch\" error. This is a known Cursor issue. If you encounter this, please follow the [Cursor installation workaround](cursor_installation_workaround.md) to resolve it.\n///\n\n\n/// details | Here's how to install the extension in VSCode\n\n<interactive demo for installing the extension>\n\n<div style=\"position: relative; padding-bottom: calc(57.25% + 44px); height: 0;\"><iframe src=https://app.supademo.com/embed/clpbwiqry0jb7penezw0wwz31 frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n\n///\n\n/// admonition | Need to setup environment variables? Refer to this [section](https://docs.myaltimate.com/setup/optConfig/#environment-variables-setup)\n    type: warning\n///\n\n/// admonition | If you are seeing the message \"Reload required\", please reload the VSCode or restart the VSCode.\n    type: info\n///\n\n## Install the extension in a dev container (or in codespaces)\n\nYou need to do the below steps only if you need to setup the extension in a devcontainer (or GitHub Codespaces)\n\nPlease add the following configuration in to your devcontainer.json file:\n\n```\n\"customizations\": {\n        \"vscode\": {\n                ...\n                \"files.associations\": {\n                    \"*.yaml\": \"jinja-yaml\",\n                    \"*.yml\": \"jinja-yaml\",\n                    \"*.sql\": \"jinja-sql\",\n                    \"*.md\": \"jinja-md\"\n                },\n                ...\n            },\n            \"extensions\": [\n                ...\n                \"innoverio.vscode-dbt-power-user\",\n                ...\n            ]\n        }\n    }\n```\n\n/// admonition | Please do NOT forget to do required configuration based on your dbt setup: [dbt Core](reqdConfig.md), [dbt Cloud](reqdConfigCloud.md), or [dbt Fusion](reqdConfigFusion.md), and [optional configuration](optConfig.md)!!\n    type: warning\n///\n"
  },
  {
    "path": "documentation/docs/setup/optConfig.md",
    "content": "## Environment Variables Setup\n\nThere are multiple sources from where the extension reads the environment variables.\n\n- [Using vscode Integrated terminal Profiles](#environment-variables-setup-using-the-integrated-terminal-profiles-vscodesettingsjson)\n- [Variables set outside of Visual Code in .zshrc or .bashrc](#environment-variables-set-outside-of-visual-code-zshrc-bashrc)\n- [dot env file (we get this from python extension)](#environment-variables-through-pythonenvfile)\n\n/// admonition | Environment variable available in vscode terminal doesn't necessarily will be available to the extension. Extension can only read environment variables if available in the above sources\n    type: warning\n///\n\n### Environment variables set outside of Visual Code (.zshrc, .bashrc, ...)\n\nIf you have variables set in .zshrc or .bashrc the extension automatically picks it up.\nThese environment variables will be passed to all operations of the extension. If you make changes to the environment variables you need to restart vscode.\n\n/// admonition | The environment variable should be valid for all your dbt projects. For example DBT_PROFILES_DIR can be set to ., that way dbt will lookup the profiles.yaml file inside the root of the dbt project.\n    type: info\n///\n\n### Environment variables setup using the integrated Terminal Profiles ( .vscode/settings.json )\n\nThe extension will read any VSCode configurations in .vscode/settings.json and pass them to all operations of the extension:\n\nOSX:\n\n```\n\"terminal.integrated.env.osx\": {\n    \"ENV_VARIABLE_NAME\": \"VALUE\"\n}\n```\n\nWindows:\n\n```\n\"terminal.integrated.env.windows\": {\n    \"ENV_VARIABLE_NAME\": \"VALUE\"\n}\n\n```\n\nLinux:\n\n```\n\"terminal.integrated.env.linux\": {\n    \"ENV_VARIABLE_NAME\": \"VALUE\"\n}\n```\n\nThe official documentation can be found [here](https://code.visualstudio.com/docs/terminal/profiles)\n\n/// admonition | Visual Code variable substitution is not supported except the environment variable pattern ${env:*} and ${workspaceFolder}.\n    type: warning\n///\n\n### Environment variables through python.envFile\n\nThe extension also loads an environment variable definitions file identified by the python.envFile setting. The default value of this setting is `${workspaceFolder}/.env`.\n\nThis way supports all Visual Code variable substitution patterns but the environment variables will not be available to the vscode terminal. Read all about [environment variables](https://code.visualstudio.com/docs/python/environments#_environment-variables) supported by the Visual Code Python extension.\n\n/// admonition | Make sure the .env file is in the [right format](https://www.dotenv.org/docs/security/env) or else the extension won't be able to detected the variables.\n    type: warning\n///\n\n### Listing Environment Variables detected by the extension\n\nWe have a debugging utility available within the extension that lists down the environment variables available to the extension and the source from where it is read. Here is how you can trigger the debugging utility\n\n1. Cmd +Shift + P (Ctrl + Shift + P in case of windows) to start the VSCode command bar\n2. Select the option dbt Power User: Print environment variable\n   ![Debug Command](images/debugCmd.png)\n3. It should print all the environment variables detected and the sources as well\n   ![Sample Output](images/listEnvVariables.png)\n\n/// admonition | In certain scenarios, step 3 has to be executed twice to get the environment variables printed.\n    type: warning\n///\n\n### Default DBT Env Support\n\nThe following env variables when set are automatically picked by the extension\n\nDBT_PROFILES_DIR : This is used to override the folder where profiles file is located\nDBT_TARGET_PATH : This is for overriding the dbt target path\n\n## Custom dbt Runner\n\nThe dbt.dbtCustomRunnerImport configuration can be used to plug your own dbt runner. This dbt runner has to invoke dbt but can perform authentication or additional configuration steps before invoking dbt or your own custom dbt executable.\n\nCode can be imported from the selected Python environment, so just install your own library or inline the code in the configuration. Note that the Python code should be written in one line.\n\nFor example let's add this custom dbt runner in your project root folder, called `my_custom_runner.py` . In this case we inherit from the existing dbtRunner from dbt, but that's optional, as long as the interface is compatible with dbt, it should work as expected.\n\n```python\nfrom typing import List\nfrom dbt.cli.main import dbtRunner, dbtRunnerResult\n\nclass MyCustomRunner(dbtRunner):\n    def invoke(self, args: List[str], **kwargs) -> dbtRunnerResult:\n        print(\"Here you can perform setup or authentication or modify args\")\n        super().invoke(args, **kwargs)\n\n### patch the dbtRunner\ndbtRunner = MyCustomRunner\n```\n\nNow in the vscode config json add an entry for `\"dbt.dbtCustomRunnerImport”` .\n\n```json\n{\n\t\"dbt.dbtCustomRunnerImport”: “from my_custom_runner import dbtRunner”\n}\n```\n\nNote that the custom dbtRunner is only used for dbt command invocations. Some operations like metadata fetching, query execution will directly use dbt api and will therefore not use the instructions set up in the custom dbt runner.\n\nFor more information you can check out these resources:\n\n- [Programmatic Invocation Support in dbt](https://docs.getdbt.com/reference/programmatic-invocations)\n- [dbt Runner Implementation in dbt core](https://github.com/dbt-labs/dbt-core/blob/ddd6506beafd410847d0702267c1e87150377668/core/dbt/cli/main.py#L43)\n\n## [Deprecated] MSSQL, Synapse, Oracle - Query Preview Config\n\n/// admonition | It is no longer required to specify query template for any of the adapter.\n    type: warning\n///\n\nYour database may not support standard SQL LIMIT statements like `SELECT * from table LIMIT 10`. You can override this default behaviour through `dbt.queryTemplate`.\n\nPlease make a PR in the [dbt-power-user repo](https://github.com/AltimateAI/vscode-dbt-power-user) if you find that you need to change `dbt.queryTemplate` for your favourite adapter and help the community.\n\n### `dbt.queryTemplate` for Oracle\n\nChange to `select * from ({query})\\n where ROWNUM <= {limit}`\n\n### `dbt.queryTemplate` for MS SQL, Synapse\n\nChange to `set rowcount {limit}; {query}` or `{query}\\n order by 1 OFFSET 0 ROWS FETCH FIRST {limit} ROWS ONLY` (note that your query can't have an order by clause).\n\n## Enable color highlighting of terminal output on Windows\n\nThese instructions are for setting the TERM environment variable to xterm-256color in a VSCode terminal instance. This configuration instructs the terminal to operate in a mode that supports 256 colors and various text formatting options, enhancing the display of colored output. So, the relevant dbt command outputs e.g job status \"Success\" or \"Failure\" are shown in the right color.\n\n```\n\"terminal.integrated.env.windows\": {\n    \"TERM\": \"xterm-256color\"\n}\n```\n\n/// admonition | Above instructions for color highlighting are for Windows machines only\n    type: warning\n///\n\n## Skip Project\n\nTo specify project folders explicitly and control which projects are included in the build process, you can configure the `dbt.allowListFolders` setting.\n\nThis can be particularly useful when you have a large number of projects in the same workspace. You can define workspace-relative paths to include as follows:\n\n```json\n\"dbt.allowListFolders\": [\n  \"folder1\",\n  \"folder2\"\n]\n\n```\n\n## Configure Source to Model file name template\n\nYou can configure the file name template for source to model files. To do so, go to the extension setting and choose the template you want to use and specify the prefix.\n\n![Template for source to model generation](images/source-to-model-template.png)\n\n## Configure sqlfmt\n\nsqlfmt is a SQL formatter that you can use with dbt-power-user VSCode extension so your dbt models are always correctly formatted.\n\n### Install `sqlfmt`\n\nWe recommend installing sqlfmt with the jinjafmt extra (which will also install the Python code formatter, Black).\n\nInstall sqlfmt by running,\n\n```\npipx install 'shandy-sqlfmt[jinjafmt]'\n```\n\nIf you don't have 'pipx' installed, please install it using instructions [here](https://github.com/pypa/pipx).\nFind more about sqlfmt in their [docs](https://docs.sqlfmt.com/getting-started/installation).\n\n### Configure `dbt.sqlFmtPath` or `dbt.sqlFmtAdditionalParams`\n\nYou can configure the path to sqlfmt through `dbt.sqlFmtPath` and you can configure additional parameters through `dbt.sqlFmtAdditionalParams`.\n\n### Usage\n\nPlease select \"dbt Power User\" (extension id:`innoverio.vscode-dbt-power-user`) as the default formatter. You can do this either by using the context menu (right click on a open dbt model in the editor) and select \"Format Document With...\", or you can add the following to your settings:\n\n```json\n  \"[jinja-sql]\": {\n    \"editor.defaultFormatter\": \"innoverio.vscode-dbt-power-user\"\n  }\n\n```\n\n### Format on save\n\nYou can enable format on save for python by having the following values in your settings:\n\n```json\n  \"[jinja-sql]\": {\n    \"editor.defaultFormatter\": \"innoverio.vscode-dbt-power-user\",\n    \"editor.formatOnSave\": true\n  }\n\n```\n\n## Setup Altimate API credentials using Environment variables\n\nYou can now setup the Altimate Instance Name and Key using environment variables\n\nadd following entries to .env file\n\n```bash\nALTIMATE_KEY=<Altimate Key>\nALTIMATE_INSTANCE_NAME=<Altimate Instance Name>\n```\n\nNow, the vscode settings.json to include\n\n```\n{\n    \"dbt.altimateAiKey\": \"${env:ALTIMATE_KEY}\",\n    \"dbt.altimateInstanceName\": \"${env:ALTIMATE_INSTANCE_NAME}\"\n}\n```\n\nThis setting is available in v0.37.9 and onwards.\n\n## Column name setup for YAML file updates\n\nDataPilot can update your YAML files when documentation or tests are added or edited.\nDifferent databases use different column casing conventions. For example, Snowflake always uses upper-case column names, whereas Postgres uses lower-case column names by default.\n\nThese database-specific standards may create issues in DataPilot behavior without the correct configuration. These issues may include -\n\n- The documentation editor may save column names in incorrect casing in YAML files.\n- Operations like \"bulk generate\" documentation for missing columns may generate documentation for existing columns.\n\nIf you are facing these issues, you can adjust the following settings:\n\n- New column names are always saved in lowercase in YAML files, except for columns with [quoted identifiers](https://docs.getdbt.com/reference/resource-properties/quote), regardless of the database. (dbt handles database-specific casing automatically this way)\n\nIf you want to save the column name as it is in the database, set `dbt.showColumnNamesInLowercase`=false in .vscode/settings.json\n\n- If you update documentation or tests for the existing columns, we will not change the casing for column names that are already present in YAML files\n\nIf there are columns with [quoted identifiers](https://docs.getdbt.com/reference/resource-properties/quote), we don't change the casing of such columns; we add the 'quote: true' attribute for those columns. You can also set a regex string to find unquoted identifiers by adding `dbt.unquotedCaseInsensitiveIdentifierRegex`= 'your_regex' in .vscode/settings.json or change it in VSCode extension settings.\n\n## Disable setup walkthrough pop-up\n\nTo disable the popup that prompts for extension to be setup when loaded for the first time set the setting dbt.hideWalkthrough to true in vscode's settings.json\n\n```\n{\n    \"dbt.hideWalkthrough\": true\n}\n```\n"
  },
  {
    "path": "documentation/docs/setup/reqdConfig.md",
    "content": "/// admonition | Only use the following steps for \"dbt Core\" environments. If you have a dbt Cloud environment, use the [required config instructions for \"dbt Cloud\" environments](./reqdConfigCloud.md). If you have a dbt Fusion environment, use the [required config instructions for \"dbt Fusion\" environments](./reqdConfigFusion.md).\n    type: warning\n///\n\n## Use the setup wizard for configuration (recommended)\n\n/// admonition | Need to setup environment variables? Refer to this [section](https://docs.myaltimate.com/setup/optConfig/#environment-variables-setup)\n    type: warning\n///\n\nThis method will save a bunch of time for you, and you can also validate your configuration. Setup wizard will help you in associating sql files with jinja-sql, selecting the right Python interpreter, make sure dbt dependencies are correctly installed etc. In the end, it will also validate your configuration.\n\nYou can start the setup wizard by clicking on dbt status icon in bottom status bar, and perform following necessary steps as shown in click-through demo below:\n\n<interactive demo for setup wizard>\n\n<div style=\"position: relative; box-sizing: content-box; max-height: 80vh; max-height: 80svh; width: 100%; aspect-ratio: 1.50; padding: 40px 0 40px 0;\">\n  <iframe src=\"https://app.supademo.com/embed/cmnsywfgw4brfcr4j1npz9esr?embed_v=2&utm_source=embed\" loading=\"lazy\" title=\"dbt Power User Setup guide-Core\" allow=\"clipboard-write\" frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n\n**Here are steps covered in the setup wizard**\n\n**Select Python Interpreter**\n\nClick on the action button - \"Select Python Interpreter\" and choose your preferred python interpreter. Usually, choosing interpreter that's recommended, or mapped to your virtual environment software (e.g. venv) as per the list is a good idea. If you know the path of your Python environment, you can choose it from the list or if the path is not present there, you can enter it manually.\n\n/// admonition | If needed, please run 'where python' command on terminal to see if it shows path to Python interpreter that you are using.\n    type: tip\n///\n\n**Install dbt**\n\nIf dbt is not installed in your environment (dbt status icon on bottom status bar will show it), Click on \"Install dbt\" button in the next step.\nIt will ask for dbt version and adapter that's need for your database environment (e.g. Snowflake). Based on these inputs, setup wizard will automatically install dbt in your environment\n\n**Install dbt deps**\n\nMany times project failures or weird errors are seen if dbt dependencies are not installed. In this step, once you click on 'Run dbt deps' button, setup wizard will automatically run dbt deps command for your project.\n\n**Validate Project**\n\nLast step is clicking on button - \"Validate Project\" It will run a bunch of checks to make sure your dbt environment and project are setup correctly.\nIf there are some issues, it will tell you exactly what's wrong as well.\n\n/// admonition | If you still can't get the extension setup correctly, please contact us via slack or chat through [support page](https://www.altimate.ai/support)\n    type: tip\n///\n\n## Manual method of configuration\n\n/// admonition | Please follow the manual method only if you couldn't use the setup wizard above.\n    type: info\n\n///\n\n### Associate \\*.sql files with jinja-sql\n\nThere are two different methods to do this. Please follow only one method:\n\n#### Method 1: Configure in Preferences > Settings in the extension\n\n![File Associations](images/associations.png)\n\n#### Method 2: Update the settings.json file directly\n\n/// details | Type 'settings.json' in the VS Code command pallet to open it\n\n![Open Settings.json](images/settingsTrigger.png)\n\n///\n\nand add following lines at the end of settings.json\n\n```\n    \"files.associations\": {\n        \"*.sql\": \"jinja-sql\",\n        \"*.yml\": \"jinja-yaml\"\n    },\n```\n\n### Associate Python Interpreter with dbt installation\n\nEnsure that the Python interpreter selection is always visible on the bottom strip of the VS Code for ease of use:\n\n/// details | Enable python interpreter visibility by updating VSCode settings\n\n![Enable Python interpreter visibility](images/interpreterVisibility.gif)\n\n///\n\nSelect the Python interpreter that has dbt installed.\n\n![Select Python interpreter](images/selectInterpreter.gif)\n\n/// admonition | Tip\n    type: info\n\nIf you select a python environment with dbt already installed, the dbt label on the bottom strip of the VS Code will show a checkmark.\n\n///\n\n/// details | If dbt is shown as not installed in the extension, the extension can install dbt for you automatically - just click on the dbt status icon on the bottom strip of the VSCode.\n    type: tip\n\n<interactive demo to install dbt in Python environment>\n\n<div style=\"position: relative; padding-bottom: calc(57.25% + 44px); height: 0;\"><iframe src=https://app.supademo.com/embed/clphpdd9d0fkapet0d9v8goup frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n\n///\n\n/// admonition | Warning for Python path overrides\n    type: warning\n\nAvoid using the setting dbt.dbtPythonPathOverride unless using Meltano, the extension depends on the Python interpreter for visual code compatible environment variable parsing.\n\n///\n\n## Enable SaaS features by adding API key\n\nThere are multiple features in the extension, including [generate dbt documentation](../document/generatedoc.md), [column lineage](../test/lineage.md), [query explanation](../develop/explanation.md), [generate dbt model from SQL](../develop/genmodelSQL.md) that require an API key.\n\n/// details | You can get an API key for free by signing up at [www.altimate.ai](https://www.altimate.ai)\n\n<interactive demo to get an API key>\n\n<div style=\"position: relative; padding-bottom: calc(51.70312500000001% + 44px); height: 0;\"><iframe src=https://app.supademo.com/embed/yanO4l-w5hH0xzXf93w-d frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n\n///\n\nYou need to add the API key from \"Settings->API key\" in your Altimate instance to the VSCode extension settings. You also need to add \"Instance name\" in the extension settings. Please get your instance name from your Altimate AI URL. If your URL for Altimate instance is - \"companyx.app.myaltimate.com\", then instance name is \"companyx\".\n\nGo to VSCode extension settings, and add API key and instance name there.\n\n/// details | Here's demo of how to add instance name and API Key to the extension settings\n\n<Interactive demo to add API key in the extension>\n\n<div style=\"position: relative; padding-bottom: calc(57.25% + 44px); height: 0;\"><iframe src=https://app.supademo.com/embed/clnjpwl3u07x4pedv9ifjfuf9 frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n///\n"
  },
  {
    "path": "documentation/docs/setup/reqdConfigCloud.md",
    "content": "/// admonition | Only use the following steps for \"dbt Cloud\" environments. If you have a dbt Core environment, use the [required config instructions for \"dbt Core\" environments](./reqdConfig.md). If you have a dbt Fusion environment, use the [required config instructions for \"dbt Fusion\" environments](./reqdConfigFusion.md).\n    type: warning\n///\n\n/// admonition | dbt Cloud integration is available as beta functionality\n    type: tip\n///\n\n## Enable dbt Cloud Integration by adding an API key\n\ndbt Cloud integration in Power User VSCode extension requires an API key. There are also multiple preview features in the extension including [generate dbt documentation](../document/generatedoc.md), [column lineage](../test/lineage.md), [query explanation](../develop/explanation.md), [generate dbt model from SQL](../develop/genmodelSQL.md) that are also enabled with an API key.\n\n/// details | You can get an API key for free by signing up at [www.altimate.ai](https://www.altimate.ai)\n\n<interactive demo to get an API key>\n\n<div style=\"position: relative; padding-bottom: calc(51.70312500000001% + 44px); height: 0;\"><iframe src=https://app.supademo.com/embed/yanO4l-w5hH0xzXf93w-d frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n\n///\n\nYou need to add the API key from \"Settings->API key\" in your Altimate instance to the VSCode extension settings. You also need to add \"Instance name\" in the extension settings. Please get your instance name from your Altimate AI URL. If your URL for Altimate instance is - \"companyx.app.myaltimate.com\", then instance name is \"companyx\".\n\nGo to the VSCode extension settings, and then add an API key and instance name.\n\n/// details | Here's a demo of how to add an instance name and an API Key to the extension settings\n\n<Interactive demo to add API key in the extension>\n\n<div style=\"position: relative; padding-bottom: calc(57.25% + 44px); height: 0;\"><iframe src=https://app.supademo.com/embed/clnjpwl3u07x4pedv9ifjfuf9 frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n///\n\n## Use the setup wizard for configuration (recommended)\n\n/// admonition | Need to setup environment variables? Refer to this [section](https://docs.myaltimate.com/setup/optConfig/#environment-variables-setup)\n    type: warning\n///\n\nThis method will save a bunch of time for you, and you can also validate your configuration. Setup wizard will help you in associating sql files with jinja-sql, selecting the right Python interpreter, make sure dbt dependencies are correctly installed etc. In the end, it will also validate your configuration.\n\nYou can start the setup wizard by clicking on dbt status icon in bottom status bar, and performing following necessary steps as shown in the recorded demo below:\n\n<div style=\"position: relative; box-sizing: content-box; max-height: 80vh; max-height: 80svh; width: 100%; aspect-ratio: 1.50; padding: 40px 0 40px 0;\">\n  <iframe src=\"https://app.supademo.com/embed/cmnt0ivy300g4w80j5zufa5p7?embed_v=2&utm_source=embed\" loading=\"lazy\" title=\"dbt Power User Setup guide-Cloud\" allow=\"clipboard-write\" frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n\n**Here are the steps covered in the setup wizard**\n\n**Select Python Interpreter**\n\nClick on the action button - \"Select Python Interpreter\" and choose your preferred python interpreter. Usually, choosing interpreter that's recommended, or mapped to your virtual environment software (e.g. venv) as per the list is a good idea. If you know the path of your Python envionment, you can choose it from the list or if the path is not present there, you can enter it manually.\n\n/// admonition | If needed, please run 'where python' command on terminal to see if it shows path to Python interpreter that you are using.\n    type: tip\n///\n\n**Install dbt**\n\nIf dbt is not installed in your environment (dbt status icon on bottom status bar will show it), Click on \"Install dbt Cloud\" button in the next step. This will install latest version of dbt Cloud CLI in your environment.\n\n**Validate Project**\n\nLast step is clicking on button - \"Validate Project\" It will run a bunch of checks to make sure your dbt environment and project are setup correctly.\nIf there are some issues, it will tell you exactly what's wrong as well.\n\n/// admonition | If you still can't get the extension setup correctly, please check the [troubleshooting page](../troubleshooting.md)\n    type: tip\n///\n\n## Questions and Answers\n\n#### Is dbt Cloud integration free?\n\nAnswer: Yes, integration with dbt Cloud is free and treated the same as integration with dbt Core. It will not count towards the usage quota.\n\n![Image](images/pricing_clarifications.png)\n\n#### Why do I need to add the Altimate API key?\n\nThe API key is necessary for authentication with our backend. VSCode supports login-based authentication, but it often logs out between sessions, which can disrupt the workflow. The API key provides a more stable and streamlined experience. This is particularly beneficial for large teams, allowing them to integrate the key into their deployment secrets when setting up VSCode as a remote environment. In the future, integration with [Cloud Service token](https://docs.getdbt.com/docs/dbt-cloud-apis/authentication)s might be necessary for deeper cloud interactions, thus having the Altimate integration in place from the start makes sense.\n\n#### What benefits does registering an API key provide?\n\nA direct line of communication with our users is established with the authentication in place. This is essential for efficiently communicating hotfixes, new releases, and deprecation warnings. It helps to minimize operational challenges and ensures that users are not left with outdated versions or unaware of updates due to the limitations of VSCode or lack of IDE restarts. Our main goal is to prevent any disruption in your development environment and to support our users proactively.\n\n#### What if I don't want to use preview features or accidentally send data to Altimate?\n\nWe understand the concern about using preview features and the risk of accidental data transmission. To address this, we have implemented stringent data security practices, which you can review in our [security FAQ](https://docs.myaltimate.com/arch/faq/). Our solutions have passed security reviews by several large organizations in the US, and we are open to undergoing similar reviews for your organization. Additionally, we are working on making some preview features available offline through our [open-source Python CLI package](https://github.com/AltimateAI/datapilot-cli).\n\n#### How are you addressing concerns about data transmission in preview features?\n\nTo directly address concerns about data transmission, we have added a \"local-mode-only\" setting in VSCode. If enabled, this setting prevents backend calls for any feature except authentication. This setting can be reviewed by your security team since our [client code](https://github.com/AltimateAI/vscode-dbt-power-user/blob/master/src/altimate.ts) is open-source.\n\nAdd the following setting in vscode settings.json\n\n```json\n{\n   dbt.isLocalMode: True\n}\n```\n"
  },
  {
    "path": "documentation/docs/setup/reqdConfigFusion.md",
    "content": "/// admonition | Only use the following steps for \"dbt Fusion\" environments. If you have a dbt Core environment, use the [required config instructions for \"dbt Core\" environments](./reqdConfig.md). If you have a dbt Cloud environment, use the [required config instructions for \"dbt Cloud\" environments](./reqdConfigCloud.md).\n    type: warning\n///\n\n/// admonition | dbt Fusion integration provides enhanced performance and features\n    type: tip\n///\n\n## What is dbt Fusion?\n\ndbt Fusion is a command-line interface that provides enhanced dbt functionality with improved performance and additional features. Unlike standard dbt Core, dbt Fusion is a standalone executable that doesn't require a Python environment, making it easier to install and manage.\n\n### Key Benefits of dbt Fusion Integration:\n- **Standalone Installation**: No Python environment required\n- **Enhanced Performance**: Optimized execution compared to standard dbt\n- **Cross-Platform Support**: Available for macOS, Linux, and Windows\n- **Simple Setup**: Single executable installation\n- **Full VSCode Integration**: Complete feature support in the extension\n\n## Use the setup wizard for configuration (recommended)\n\n/// admonition | Need to setup environment variables? Refer to this [section](https://docs.myaltimate.com/setup/optConfig/#environment-variables-setup)\n    type: warning\n///\n\nThis method will save a bunch of time for you, and you can also validate your configuration. The setup wizard will help you in associating SQL files with jinja-sql, installing dbt Fusion if needed, and validating your project configuration.\n\nYou can start the setup wizard by clicking on the dbt status icon in the bottom status bar, and perform the following necessary steps:\n\n<div style=\"position: relative; box-sizing: content-box; max-height: 80vh; max-height: 80svh; width: 100%; aspect-ratio: 1.50; padding: 40px 0 40px 0;\">\n  <iframe src=\"https://app.supademo.com/embed/cmnt1t4jz4hj3cr4j3knosm74?embed_v=2&utm_source=embed\" loading=\"lazy\" title=\"dbt Power User Setup guide-Fusion\" allow=\"clipboard-write\" frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n\n**Here are the steps covered in the setup wizard**\n\n**Select dbt Integration Type**\n\nIn the setup wizard, choose \"dbt Fusion\" as your integration type. This will configure the extension to use the dbt Fusion CLI for all dbt operations.\n\n**Install dbt Fusion**\n\nIf dbt Fusion is not installed in your system (the dbt status icon on the bottom status bar will show it), click on \"Install dbt Fusion\" button. The setup wizard will automatically install the latest version of dbt Fusion using the appropriate method for your operating system:\n\n- **macOS/Linux**: Uses curl to download and install from dbt Labs CDN\n- **Windows**: Uses PowerShell to download and install from dbt Labs CDN\n\n**Associate SQL Files**\n\nThe wizard will help you associate `*.sql` files with `jinja-sql` language mode for proper syntax highlighting and IntelliSense support.\n\n**Validate Project**\n\nThe last step is clicking the \"Validate Project\" button. It will run a bunch of checks to make sure your dbt Fusion environment and project are set up correctly. If there are issues, it will tell you exactly what's wrong.\n\n/// admonition | If you still can't get the extension setup correctly, please contact us via slack or chat through [support page](https://www.altimate.ai/support)\n    type: tip\n///\n\n## Manual method of configuration\n\n/// admonition | Please follow the manual method only if you couldn't use the setup wizard above.\n    type: info\n///\n\n### Step 1: Install dbt Fusion\n\n#### Automatic Installation via Extension\n\n1. Open the Command Palette (`Ctrl+Shift+P` / `Cmd+Shift+P`)\n2. Type \"dbt Power User: Install dbt\"\n3. Select the command and choose \"dbt Fusion\" when prompted\n4. The extension will automatically download and install dbt Fusion for your platform\n\n#### Manual Installation\n\n**macOS and Linux:**\n```bash\ncurl -fsSL https://public.cdn.getdbt.com/fs/install/install.sh | sh -s -- --update\n```\n\n**Windows (PowerShell):**\n```powershell\nirm https://public.cdn.getdbt.com/fs/install/install.ps1 | iex\n```\n\n#### Verify Installation\n\nAfter installation, verify that dbt Fusion is properly installed by running:\n```bash\ndbt --version\n```\n\nYou should see output that includes \"dbt-fusion\" in the version information.\n\n### Step 2: Configure dbt Integration Type\n\nSet the integration type to fusion in your VSCode settings:\n\n#### Method 1: Via VSCode Settings UI\n1. Open VSCode Settings (`Ctrl+,` / `Cmd+,`)\n2. Search for \"dbt integration\"\n3. Set \"Dbt: Dbt Integration\" to \"fusion\"\n\n#### Method 2: Via settings.json\nAdd the following to your VSCode settings.json:\n```json\n{\n    \"dbt.dbtIntegration\": \"fusion\"\n}\n```\n\n### Step 3: Associate *.sql files with jinja-sql\n\n#### Method 1: Configure in Preferences > Settings\n![File Associations](images/associations.png)\n\n#### Method 2: Update settings.json directly\n```json\n{\n    \"files.associations\": {\n        \"*.sql\": \"jinja-sql\",\n        \"*.yml\": \"jinja-yaml\"\n    }\n}\n```\n\n### Step 4: Verify Configuration\n\nAfter configuration, check that:\n1. The bottom status bar shows \"dbt fusion\" with a checkmark\n2. You can execute dbt commands through the extension\n3. IntelliSense and syntax highlighting work in your dbt files\n\n## Enable SaaS features by adding API key\n\nThere are multiple features in the extension, including [generate dbt documentation](../document/generatedoc.md), [column lineage](../test/lineage.md), [query explanation](../develop/explanation.md), [generate dbt model from SQL](../develop/genmodelSQL.md) that require an API key.\n\n/// details | You can get an API key for free by signing up at [www.altimate.ai](https://www.altimate.ai)\n\n<interactive demo to get an API key>\n\n<div style=\"position: relative; padding-bottom: calc(51.70312500000001% + 44px); height: 0;\"><iframe src=https://app.supademo.com/embed/yanO4l-w5hH0xzXf93w-d frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n\n///\n\nYou need to add the API key from \"Settings->API key\" in your Altimate instance to the VSCode extension settings. You also need to add \"Instance name\" in the extension settings. Please get your instance name from your Altimate AI URL. If your URL for Altimate instance is - \"companyx.app.myaltimate.com\", then instance name is \"companyx\".\n\nGo to VSCode extension settings, and add API key and instance name there.\n\n/// details | Here's demo of how to add instance name and API Key to the extension settings\n\n<Interactive demo to add API key in the extension>\n\n<div style=\"position: relative; padding-bottom: calc(57.25% + 44px); height: 0;\"><iframe src=https://app.supademo.com/embed/clnjpwl3u07x4pedv9ifjfuf9 frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n///\n\n## Feature Support\n\ndbt Fusion integration supports most extension features with some exceptions:\n\n### ✅ Supported Features\n- **Query Execution**: Execute models and preview results\n- **SQL Compilation**: View compiled SQL code\n- **Auto-completion**: IntelliSense for models, macros, and sources\n- **Column Lineage**: Trace data lineage between models\n- **SQL Validation**: Validate SQL without execution\n- **Defer to Production**: Run models without rebuilding dependencies\n- **Test Generation**: AI-powered test generation\n- **Query Explanation**: AI-powered SQL explanation\n\n### ❌ Limited Features\n- **Documentation Generation**: Not supported in dbt Fusion CLI\n- **Some Advanced Features**: May have limitations compared to dbt Core integration\n\n## Questions and Answers\n\n#### What is dbt Fusion and how is it different from dbt Core?\n\ndbt Fusion is an enhanced command-line interface for dbt that provides improved performance and additional features. Unlike dbt Core, which requires a Python environment, dbt Fusion is a standalone executable that can be installed independently.\n\n#### Is dbt Fusion integration free?\n\nYes, dbt Fusion integration is free and treated the same as integration with dbt Core. It will not count towards the usage quota for AI features.\n\n#### Do I need Python installed to use dbt Fusion?\n\nNo, dbt Fusion is a standalone executable that doesn't require a Python environment. This makes it easier to install and manage compared to dbt Core.\n\n#### Can I switch between dbt Core and dbt Fusion integrations?\n\nYes, you can switch between integration types by changing the `dbt.dbtIntegration` setting in VSCode. The extension will automatically detect and use the appropriate dbt executable.\n\n#### What if dbt Fusion is not available for my platform?\n\ndbt Fusion supports macOS, Linux, and Windows. If you encounter installation issues, you can fall back to using dbt Core or dbt Cloud integrations instead.\n\n#### Why do I need to add the Altimate API key?\n\nThe API key is necessary for advanced AI-powered features like query explanation, test generation, and column lineage. Basic dbt operations (execution, compilation) work without an API key."
  },
  {
    "path": "documentation/docs/setup/sso.md",
    "content": "If you would like to use SSO for authentication, please follow the instructions below. <br>\n\nWe support OIDC (OpenID Connect) today, and SAML is not yet supported. We will explain the process for Okta as authentication provider below, but\nsimilar steps can be used for other authentication providers as well.\n\n## OKTA SSO Setup\n\n## Step 1: Create a web app\n\nChoose authentication method as \"OIDC\" and type of application as \"web application\".\n\n![Authentication Type](images/authType.png)\n\nAdd additional config for -\n\n**Sign-in redirect URI**: https://\"instance-url\"/login/callback/okta <br>\n**Sign-out redirect URI**: https://\"instance-url\"/login\n\nYour instance-url may be either \"instance-name\".app.getaltimate.com or \"instance-name\".app.myaltimate.com\n\n/// admonition | If you don't know the instance-name in above URIs, please contact the support team\n    type: tip\n///\n\nAlso, in \"Assignments\" section, please choose \"skip group assignments\" for now.\n\n![Authentication Config](images/authConfig.png)\n\nFinally, save the config to create the Okta app.\n\n## Step 2: Share config info with our support team\n\nShare Client-ID, Client-Secret, OIDC provider (Okta) URL (e.g.https://trial-1627894-admin.okta.com/admin/app/) with the support team.\n\n![Authentication Details](images/authDetails.png)\n\n## Step 3: Start using Altimate AI instance with SSO\n\nOnce our support team has done necessary config based on the info provided by you in the earlier step, we will notify you.\n\nYou can also create a bookmark app in Okta by following these [instructions from Okta documentation](https://support.okta.com/help/s/article/create-a-bookmark-app?language=en_US)\nPlease use URL as https://<tenant>.getaltimate.com/login-redirect/okta or https://<tenant>.myaltimate.com/login-redirect/okta based on instructions shared by our support team. <br>\n\nAfter this point, you can start using your Altimate AI instance with SSO and start onboarding users!\n\n/// admonition | You need to have an enterprise plan for the SSO integration.\n    type: info\n///\n\n## Azure AD SSO Setup\n\n## Step 1: Create Azure AD App\n\nGo to Azure [home](https://portal.azure.com/#home) and search “Active Directory” in search bar, and select active directory\n\n![Azure AD Search](images/AzureADSearch.png)\n\nClick + Add and select App registration.\n\n![New AD App](images/newADApp.png)\n\nEnter a valid application name and in “Redirect URI” section, select “Web” and enter url “https://<instance url>/login/callback/active-directory” (replacing “instance url” with your instance url)\n\n![AD URL](images/ADURL.png)\n\nYour instance-url may be either \"instance-name\".app.getaltimate.com or \"instance-name\".app.myaltimate.com\n\n/// admonition | If you don't know the instance-name in above URIs, please contact the support team\n    type: tip\n///\n\nAfter registration, in overview section of the application, copy and save “Application (client) ID”. Then, Click “Add a certificate or secret”\n\n![Add Certificate](images/AddCertificate.png)\n\nclick “New client secret”. Enter description and select expiration according to your preferences.\n\n![Add Client Secret](images/addClientSecret.png)\n\n/// admonition | Make sure to contact us to update the secrets if it is expired.\n    type: tip\n///\n\nCopy and save the secret value\n\n![Save Secret Value](images/saveSecretValue.png)\n\n- Click “Default Directory | App registrations” link in the top left breadcrumb\n- Click “Endpoints”\n- Copy and save “OpenID Connect metadata document” url\n\n![Document URL](images/documentURL.png)\n\n## Step 2: Share config info with our support team\n\nFrom instructions in 'Step1' above, copy following information and share it with our support team\n\n```\nApplication (client) ID\nclient secret\nOpenID Connect metadata document url\n```\n\n## Step 3: Start assigning users / groups to app\n\nOnce our support team has done necessary config based on the info provided by you in the earlier step, we will notify you. After this point, you can start with additional steps necessary as below:\n\n### Update the app to require user assignment\n\n1. Sign in to the [Microsoft Entra admin center](https://entra.microsoft.com/).\n2. If you have access to multiple tenants, use the Directories + subscriptions filter in the top menu to switch to the tenant containing the app registration from the Directories + subscriptions menu.\n3. Browse to Identity > Applications > Enterprise applications, then select All applications.\n4. Select the application you created earlier. Use the filters at the top of the window to search for a specific application.\n5. On the application's Overview page, under Manage, select Properties.\n6. Locate the setting Assignment required? and set it to Yes.\n7. Select Save on the top bar.\n\n![App Config](images/appConfig.png)\n\n### Assign the app to users and groups to restrict access\n\nOnce you've configured your app to enable user assignment, you can go ahead and assign the app to users and groups.\n\n1. Under Manage, select the Users and groups then select Add user/group.\n2. Under Users, select None Selected, and the Users selector pane opens, where you can select multiple users and groups.\n3. Once you're done adding the users and groups, select Select.\n4. (Optional) If you have defined app roles in your application, you can use the Select role option to assign the app role to the selected users and groups.\n5. Select Assign to complete the assignments of the app to the users and groups.\n6. On return to the Users and groups page, the newly added users and groups appear in the updated list.\n\n![App Users](images/appUsers.png)\n\n/// admonition | If needed, please check Microsoft Entra documentation [here](https://learn.microsoft.com/en-us/entra/identity-platform/howto-restrict-your-app-to-a-set-of-users)\n    type: tip\n///\n\n## Azure AD Troubleshooting\n\nIf you encounter email related error during login with active directory like below, ask your Azure Active directory admin to add a valid email to the user as explained in next steps\n\n![Error Info](images/errorInfo.png)\n\nSolution:\nIn Azure, go to “Users” by searching in top search input. Select the user who has email issue and go to “Properties” and click edit button near “Contact Information”. Enter a valid email in “Email” field and save. User should be able to login now\n\n![Contact Info](images/contactInfo.png)\n"
  },
  {
    "path": "documentation/docs/studio.md",
    "content": "# Studio\n\n## What is Studio?\n\nStudio is a specialized agent designed for users to interact with their data stack using natural language. It is an easy-to-use solution for all your questions across Snowflake, DBT, Tableau, Databricks, Airflow, GitHub and more.\n\n## Key Capabilities\n\nStudio empowers users to:\n\n- **Analyze performance** of existing workloads across your data infrastructure\n- **dbt Project analysis** of entire dbt project structure, models, tests, dependencies etc.\n- **Lineage exploration** to explore the lineage of dbt models and answer related questions\n- **Documentation search** allows to search through dbt models documentation as well as add missing documentation\n- **Perform root cause analysis** to quickly identify and resolve issues\n- **Conduct cross-tool analysis** spanning multiple platforms in a single conversation\n- **Generate detailed optimization plans** with quantified outcomes and projected savings\n- **Best practices review** to get recommendations on dbt models best practices implementation\n\n## Why Do We Need Studio?\n\nTraditional AI approaches have critical limitations. These limitations are well taken care of through Studio:\n\n### Without Studio\n\n1. User asks: \"Why is my dbt model running slow?\"\n2. Agent searches basic data\n3. Finds execution time metrics\n4. Provides incomplete analysis with:\n   - Missing: Root cause of performance issue\n   - Missing: Downstream impact on dependent models\n   - Missing: Historical performance trends\n\n**Result:** Incomplete, Siloed AI Responses\n\n### With Studio\n\n1. User asks: \"Why is my dbt model running slow?\"\n2. Multi-agentic framework assembles rich context\n3. Provides comprehensive analysis:\n   - Root cause identified (e.g., inefficient CTEs, missing indexes)\n   - Downstream impact on dependent models assessed\n   - Actionable optimization recommendations with code examples\n\n**Result:** Context-Rich, Memory-Enhanced Intelligence\n\n## Extending Context\n\nBeyond the integrations already connected to your SaaS instance, Studio allows you to enrich your queries with additional context:\n![Studio Datamates and Knowledge Base](studio/images/Studio-context.png)\n\n| Option               | Description                                                                                                                                                      |\n| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **Datamates**        | Select any [Datamate](https://datamates-docs.myaltimate.com/user-guide/home/) to widen the context based on tools                                                |\n| **Knowledge Bases**  | Connect organizational knowledge repositories from [Knowledge Hub](https://datamates-docs.myaltimate.com/user-guide/components/knowledgehub/) for deeper context |\n| **File Attachments** | Upload documents, queries, or data files directly into your conversation                                                                                         |\n\nThis flexibility ensures you can ask questions across a broader tool set while providing the agent with the context it needs to deliver accurate, actionable insights.\n\n## How Studio Works\n\n### 1. Providing Input\n\nWhen starting a conversation, users have multiple ways to provide context:\n\n| Option                  | Description                                                                    |\n| ----------------------- | ------------------------------------------------------------------------------ |\n| **Ask a question**      | Type your query directly in the chat input                                     |\n| **Add Datamate**        | Select a Datamate to access any tool specific information                      |\n| **Attach files**        | Upload files for analysis (via \"+\" menu)                                       |\n| **Knowledge Base**      | Access organizational knowledge repositories from Knowledge Hub (via \"+\" menu) |\n| **View Prompt Library** | Browse pre-built prompts for common tasks (via 'Select Prompt Library')        |\n\n### 2. Results Delivery\n\nOnce the search is complete, you receive a comprehensive analysis with:\n\n- **Executive Summary** - High-level findings\n- **Key Metrics** - Data tables with critical information\n- **Detailed Analysis** - In-depth analysis (e.g., query-by-query breakdown)\n- **Key Findings** - Insights with evidence and impact\n- **Root Cause Analysis** - Why issues occurred\n- **Optimization Recommendations** - Prioritized action items\n- **Next Steps** - Implementation roadmap\n\n### 3. Output Features\n\nAnalysis results include interactive options:\n\n| Feature                 | Description                                 |\n| ----------------------- | ------------------------------------------- |\n| **View detailed steps** | Expand to see the full execution trace      |\n| **Task Progress**       | Visual checklist of completed subtasks      |\n| **Download**            | Export results for offline use or reporting |\n\n### 4. Confidence Indicators\n\nStudio provides transparency about result quality:\n\n| Indicator            | Meaning                                         |\n| -------------------- | ----------------------------------------------- |\n| Low Confidence (50%) | Consider refining your query for better results |\n| High Confidence      | Results are reliable and well-supported         |\n\n## Components of Studio\n\nTwo important components of Studio are Chat History and Prompt Library:\n![Studio Chat History and Prompt Store](studio/images/Studio-history-prompt-store.png)\n\n### Chat History\n\nChat History is a persistent record of all your previous conversations with Studio. Located in the left sidebar, it provides quick access to past interactions, allowing you to revisit analyses, continue previous work, or reference earlier insights.\n\n#### Key Features\n\n| Feature               | Description                                                                 |\n| --------------------- | --------------------------------------------------------------------------- |\n| **Conversation List** | All past chats are displayed chronologically with preview titles            |\n| **Status Indicators** | Each conversation shows its current status (e.g., \"Completed\")              |\n| **Timestamps**        | Relative timestamps (e.g., \"8h ago\", \"11h ago\") help you locate recent work |\n| **Search**            | Quickly find specific conversations using the search bar                    |\n| **New Chat**          | Start a fresh conversation at any time with the \"+ New Chat\" button         |\n\n#### How It Works\n\n- **Automatic Saving** - Every conversation is automatically saved to your Chat History\n- **Title Generation** - Conversations are titled based on your initial query (e.g., \"Help me create a Jira ticket with the below details...\", \"Analyse the query\")\n- **Quick Resume** - Click any conversation to instantly resume where you left off\n\n#### Use Cases\n\n- **Continuing Analysis** - Pick up where you left off on a complex investigation\n- **Reference Past Insights** - Look back at previous cost analyses or query optimizations\n- **Audit Trail** - Track what questions you've asked and what answers you received\n- **Knowledge Building** - Build on previous conversations rather than starting from scratch\n\n### Prompt Library\n\nPrompt Library is a shared repository of pre-built, reusable prompts that help you get started quickly with common data analysis tasks. It serves as a knowledge base of effective queries created by you, your team and the organization.\n\n#### Key Features\n\n| Feature                | Description                                                                   |\n| ---------------------- | ----------------------------------------------------------------------------- |\n| **Pre-built Prompts**  | Ready-to-use prompts for common analytical tasks                              |\n| **Tagging System**     | Organize prompts with tags like \"query\", \"summary\", \"test\" for easy discovery |\n| **Ownership Tracking** | See who created each prompt (individual or \"Altimate AI\")                     |\n| **Team Sharing**       | Share prompts with \"All org\" or specific teams                                |\n| **Search & Filter**    | Find prompts by type, team, owner, or tags                                    |\n| **Custom Prompts**     | Create and save your own prompts with \"+ New Saved Prompt\"                    |\n\n#### How to Use\n\n1. **Access the Library** - Click \"View Prompt Library\" from the Suggested Prompts link on the main Studio screen\n2. **Browse or Search** - Use filters (Type, Teams, Owner, Tags) or search to find relevant prompts\n3. **Select a Prompt** - Click the send icon to use a prompt directly\n4. **Customize** - Many prompts have placeholders (e.g., `<enter no. of days>`) that you can fill in\n5. **Save Your Own** - Click \"+ New Saved Prompt\" to add your custom prompts to the library\n\n#### Filters Available\n\n| Filter    | Purpose                                              |\n| --------- | ---------------------------------------------------- |\n| **Type**  | Filter by prompt category                            |\n| **Teams** | Show prompts shared with specific teams              |\n| **Owner** | Filter by prompt creator                             |\n| **Tags**  | Filter by semantic tags (query, summary, test, etc.) |\n| **Sort**  | Order by \"Recently Added\" or other criteria          |\n\n#### Benefits\n\n- **Faster Start** - Don't write prompts from scratch; use proven templates\n- **Best Practices** - Leverage prompts crafted by experts\n- **Consistency** - Teams use standardized prompts for common analyses\n- **Knowledge Sharing** - Share effective prompts across the organization or with specific teams\n- **Parameterized Templates** - Prompts with placeholders adapt to different scenarios\n\n## Accessing Studio from SaaS Pages\n\nStudio is also seamlessly integrated throughout the SaaS platform, providing context-aware assistance directly within the pages. A Studio popup is available on every major page, offering relevant prompts and insights based on the specific data and context of that page.\n\n### How It Works\n\nEach SaaS page includes a **Studio button** (chat icon) in the bottom right corner. Clicking this button opens a Studio popup panel that:\n\n![Studio Access Button](studio/images/Studio-chat-button.png)\n![Studio Popup Panel](studio/images/Studio-chat-popup.png)\n\n- **Automatically understands the page context** - The agent knows which page you're on and what data you're viewing\n- **Provides relevant suggested prompts** - Pre-built questions specific to that page's functionality\n- **Allows custom questions** - You can ask your own questions within the page context\n- **Offers full expansion** - Use the \"Expand in Studio\" link to open the full Studio experience\n\n### Page-Specific Studio Integration\n\n#### Summary Page:\n\nWhen accessing Studio from the **Summary** page, you get assistance focused on cost analysis and spending insights.\n\n**Use Cases**: Cost analysis, spending trends, budget forecasting, cost optimization opportunities\n\n#### Discover Page:\n\nWhen accessing Studio from the **Discover** page, you get assistance in identifying and prioritizing optimization opportunities.\n\n**Use Cases**: Optimization prioritization, cost-saving initiatives, quick wins identification, resource efficiency\n\n#### Datasets Page:\n\nWhen accessing Studio from the **Datasets** page, you get assistance for exploring and understanding your data assets.\n\n**Use Cases**: Data catalog exploration, metadata analysis, data governance, dependency mapping\n\n#### Code Page:\n\nWhen accessing Studio from the **Code** page (Queries tab), you get assistance for query performance analysis and optimization.\n\n**Use Cases**: Query optimization, performance troubleshooting, cost attribution, anti-pattern identification\n\n#### Infra Page:\n\nWhen accessing Studio from the **Infra** page, you get assistance for infrastructure management and warehouse optimization.\n\n**Use Cases**: Resource monitoring, infrastructure cost optimization, utilization analysis\n\n### Benefits of Page-Specific Studio\n\n| Benefit                     | Description                                                                                                                    |\n| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |\n| **Consistent Experience**   | Same powerful Studio's agent capabilities available wherever you need them                                                     |\n| **Contextual Intelligence** | The agent understands what data and metrics are relevant to your current page                                                  |\n| **Faster Insights**         | No need to switch between pages. Suggested prompts help you ask the right questions immediately without thinking about context |\n| **Progressive Disclosure**  | Start with a quick popup, expand to full Studio when needed                                                                    |\n| **Chat History**            | The history for all the chats done through SaaS pages is retained and can be viewed on the main Studio page                    |\n\n/// admonition | Studio is currently in Beta. We're continuously improving the platform based on user feedback.\n    type: info\n///\n\n/// admonition | For more information and access to Studio, visit [app.myaltimate.com](https://app.myaltimate.com)\n    type: tip\n///\n"
  },
  {
    "path": "documentation/docs/stylesheets/extra.css",
    "content": "/* Announcement banner — thin strip style */\n.md-banner {\n  background: linear-gradient(90deg, #1565c0 0%, #6a1b9a 50%, #8e24aa 100%) !important;\n  color: #ffffff !important;\n  padding: 0 !important;\n  overflow: visible !important;\n  position: relative !important;\n}\n\n.md-banner .md-banner__inner {\n  margin: 0 auto !important;\n  padding: 0.3rem 1rem !important;\n  font-size: 0.7rem !important;\n  line-height: 1.4 !important;\n  text-align: center;\n  white-space: nowrap;\n  position: static !important;\n}\n\n.md-banner .md-banner__inner a:not(.md-banner-cta) {\n  color: #e1bee7 !important;\n  text-decoration: none;\n  font-weight: 500;\n}\n\n.md-banner .md-banner__inner a:not(.md-banner-cta):hover {\n  color: #ffffff !important;\n  text-decoration: underline;\n}\n\n.md-banner .md-banner__inner .md-banner-cta {\n  display: inline-block;\n  background: rgba(255, 255, 255, 0.18);\n  color: #ffffff !important;\n  padding: 0.15rem 0.65rem;\n  border-radius: 20px;\n  font-size: 0.65rem;\n  font-weight: 600;\n  text-decoration: none !important;\n  margin-left: 0.5rem;\n  border: 1px solid rgba(255, 255, 255, 0.3);\n  letter-spacing: 0.02em;\n  transition: background 0.2s;\n  vertical-align: middle;\n}\n\n.md-banner .md-banner__inner .md-banner-cta:hover {\n  background: rgba(255, 255, 255, 0.3);\n}\n\n.md-banner .md-banner__button {\n  position: absolute !important;\n  right: 1rem !important;\n  top: 50% !important;\n  transform: translateY(-50%) !important;\n  color: rgba(255, 255, 255, 0.5) !important;\n  float: none !important;\n  margin: 0 !important;\n  padding: 0 !important;\n}\n\n.md-banner .md-banner__button:hover {\n  color: #ffffff !important;\n}\n\n.md-banner .md-banner__button svg {\n  width: 0.85rem;\n  height: 0.85rem;\n}\n"
  },
  {
    "path": "documentation/docs/teammates/altimate-code.md",
    "content": "---\nstatus: new\n---\n\n# Altimate Code in IDE\n\n## What is Altimate Code?\n\n[Altimate Code](https://docs.altimate.sh) is the open-source data engineering harness with 100+ deterministic tools for building, validating, optimizing, and shipping data products. It brings AI-powered data engineering directly into your IDE through the Datamates extension, or can be used standalone via CLI and TUI.\n\n## Getting Started in Your IDE\n\n### Install the Datamates Extension\n\n- **VS Code** — [Microsoft Marketplace](https://marketplace.visualstudio.com/items?itemName=altimateai.vscode-altimate-mcp-server)\n- **Cursor / other VS Code-compatible editors** — [Open VSX Registry](https://open-vsx.org/extension/altimateai/vscode-altimate-mcp-server)\n\n### Open Altimate Code Chat\n\n1. Press `Cmd+Shift+P` (macOS) or `Ctrl+Shift+P` (Windows/Linux) to open the command palette\n2. Type `Datamates`\n3. Select **Datamates: Open Altimate Code Chat**\n\nThis opens the Altimate Code chat panel where you can interact with agents and run data engineering tools.\n\n## Features\n\n### Agent Modes\n\nAltimate Code provides three agent modes to match your workflow:\n\n| Mode | Access Level | Use Case |\n|------|-------------|----------|\n| **Builder** | Full read/write | Scaffolding dbt projects, writing models, generating tests and docs |\n| **Analyst** | Read-only | Exploring schemas, running queries, analyzing lineage |\n| **Plan** | Minimal access | Planning changes, reviewing impact before execution |\n\n### 100+ Data Engineering Tools\n\n- **SQL Tools** — Validation without execution, query optimization, anti-pattern detection, dialect translation, PII scanning\n- **dbt Tools** — Model generation, test generation, documentation generation, project scaffolding, troubleshooting\n- **Lineage Tools** — Column-level lineage, impact analysis, downstream dependency tracking\n- **Schema Tools** — Schema exploration, table/column discovery, metadata indexing\n- **FinOps Tools** — Cost analysis, warehouse spend reports, optimization recommendations\n- **Warehouse Tools** — Direct query execution, result preview, connection management\n\n## Benchmarks\n\nAltimate Code is **#1 on ADE-Bench** — the industry benchmark for AI data engineering agents, created by Benn Stancil (founder of Mode) in collaboration with dbt Labs. It evaluates agents on real-world analytics and data engineering tasks using actual dbt projects and databases.\n\n**The harness — not the model — is the differentiator.** Despite using Sonnet 4.6 (not the most expensive model), Altimate Code outperforms agents running on more capable models, demonstrating that purpose-built tooling and deterministic operations outperform raw model capability alone.\n\n### ADE-Bench (DuckDB Local)\n\n| Tool | Model | Score | Pass Rate |\n|------|-------|-------|-----------|\n| **Altimate Code** | Sonnet 4.6 | **32/43** | **74.4%** |\n| Cortex Code CLI | Opus 4.6 | 28/43 | 65% |\n| dbt Labs | Sonnet 4.5 | ~25/43 | 59% |\n| Claude Code (baseline) | Sonnet 4.6 | ~17/43 | 40% |\n\n### Other Benchmarks\n\n| Benchmark | Result |\n|-----------|--------|\n| **SQL Anti-Pattern Detection** | 100% accuracy across 1,077 queries, 19 categories. Zero false positives. |\n| **Column-Level Lineage** | 100% edge match across 500 queries with complex joins, CTEs, and subqueries. |\n| **Snowflake Query Optimization (TPC-H)** | 16.8% average execution speedup (3.6x vs baseline). |\n\n[Full benchmark details →](https://www.altimate.sh/benchmarks)\n\n## LLM Access\n\nTwo options for powering the AI chat:\n\n- **BYOK (Bring Your Own Key)** — Free and unlimited. Use any of 35+ supported providers (Anthropic, OpenAI, AWS Bedrock, Azure OpenAI, Google, Ollama, and more)\n- **[Altimate LLM Gateway](../arch/llm-gateway.md)** — Managed LLM access with dynamic routing across Sonnet 4.6, Opus 4.6, GPT-5.4, GPT-5.3, and more. 10M tokens free to get started — no API keys to manage\n\n## Standalone Usage\n\nAltimate Code can also be used outside the IDE:\n\n| Interface | Description |\n|-----------|-------------|\n| **TUI** | Interactive terminal UI — `altimate` |\n| **CLI** | Command-line for scripting — `altimate run` |\n| **Web UI** | Browser-based interface — `altimate web` |\n| **CI/CD** | Headless mode for pipelines — `altimate check` |\n| **GitHub/GitLab** | Automated PR review and issue triage |\n\nInstall standalone:\n\n```bash\nnpm install -g altimate-code\n```\n\n## Full Documentation\n\n- **Altimate Code docs** — [docs.altimate.sh](https://docs.altimate.sh)\n- **Datamates docs** — [datamates-docs.myaltimate.com](https://datamates-docs.myaltimate.com/)\n"
  },
  {
    "path": "documentation/docs/teammates/coach.md",
    "content": "You can coach and personalize your AI teammates by giving instructions in the natural language.\n\nFirst, enable AI teammates functionality by going in settings -> teammates menu.\n![enableTeammates](images/enableTeammates.png)<br>\n\n/// admonition | Unless you enable teammates in the SaaS instance, coaching and personalization outlined below won't work.\n    type: warning\n///\n\n## Documentation Writer\n\nDocumentation writer AI teammate is available via the documentation editor panel in the Power User VSCode extension.\nHere are more details on how to [generate documentation](../document/generatedoc.md)\n\n### Trigger coaching\n\nIf you want to coach your documentation writer, after the documentation is generated, click on \"do you want to coach AI\" icon\nas shown below:\n\n![triggerCoachAI](images/triggerCoachAI.png)<br>\n\n### Provide instructions\n\nYou can provide instructions in the natural language first and then the AI teammate will show you what it has understood.\nYou can edit that understanding further as shown below:\n\n![addInstructions](images/addInstructions.png)<br>\n\n### Curate and update learnings\n\nAll the learnings done by AI teammates can be curated further by you in the settings -> teammates are in the SaaS UI.\nYou can edit the earlier learnings, enable / disable them or you can simply delete them as well.\n\n![viewLearnings](images/viewLearnings.png)<br>\n"
  },
  {
    "path": "documentation/docs/teammates/introduction.md",
    "content": "## What are AI Teammates?\n\nAs AI is evolving, now we can create virtual AI teammates where some pieces of work can be done autonomously by them. You can coach these virtual teammates just like new members of your team, so the work they deliver is perfectly tailored for your organizations requirements.\n\n## What work AI Teammates can Do?\n\nIn certain scenarios, they can assist you vs. doing work completely autonomously and you can personalize these assistants as per your requirements. Today, work done by data teams can be divided in three simple buckets - 1. Done by humans 2. Done by humans and AI together 3. Done by AI autnomously\n\n## How AI Teammates Work with Us?\n\nAI teammates are integrated in day to day work of data teams through Power User VSCode extension, Python package, and SaaS UI. Power User extension already has comprehensive AI functionality ranging from dbt model,test,docs generation to SQL query translation & explanation.\n\n/// admonition | For more info, please check [our website](https://www.altimate.ai)\n    type: tip\n///\n"
  },
  {
    "path": "documentation/docs/test/adhocquery.md",
    "content": "You can run ad hoc SQL queries or dbt Models in the \"Query Results\" tab\n\n## Click on the \"New Query\" Button\n\nThe \"New Query\" button is available in the \"Query Results\" bottom panel.\n\n![New Query Trigger](images/newQueryTrigger.png)\n\n## Enter a Query\n\nEnter the SQL or dbt query that you want to run\n\n![New Query](images/newQuery.png)\n\n## Run the Query\n\nClick on play button to run the query and see the results in the bottom panel\n\n![See Results](images/seeResults.png)\n"
  },
  {
    "path": "documentation/docs/test/bigquerycost.md",
    "content": "For dbt models running in Big Query, you can get the estimate of the data processed for that model right inside VSCode as below:\n\n<div style=\"position: relative; padding-bottom: calc(63.5% + 44px); height: 0;\"><iframe src=https://app.supademo.com/embed/clpzoqwia2r0jpezy954p5v7h frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n\n/// admonition | Note\nThis feature is supported for dbt version 1.6 and above.\n///\n"
  },
  {
    "path": "documentation/docs/test/defertoprod.md",
    "content": "Defer functionality in dbt allows the user to run a subset of models or tests without having to first build their upstream parents. Usually, it leads to significant cost and time savings during testing of the dbt models. More information about this functionality is available in [dbt docs](https://docs.getdbt.com/blog/defer-to-prod).\n\n### Step 1: Enable Defer to production functionality in the \"Actions\" panel as below\n\n![enableDefertoprod](images/enableDefertoprod.png)<br>\n\n### Step 2: Choose where your manifest file is stored for the production environment\n\nYou can either use this functionality in the local mode where your manifest files stay in your local computer. You can also use the SaaS instance to store your manifest files so multiple team members can benefit from prod or staging data.\n\n## Local Mode\n\nChoose the location of your local manifest file as shown in the image below:\n\n![chooseLocal](images/chooseLocal.png)<br>\n\n## SaaS Mode\n\n/// admonition | To use the Altimate SaaS instance, you will need to install the `altimate-datapilot` python package. You can install it using the following command: `pip install altimate-datapilot`. This package is required to upload the manifest file to the SaaS instance. You can find more information about the package [here](https://github.com/AltimateAI/datapilot).\n    type: tip\n///\n\nFirst, create the dbt integration in the Altimate AI SaaS instance by going to Settings -> Integrations from left side navigation menu. This is just to create a reference where you can upload respective manifest files to point to.\n\n/// admonition | If you would like to connect your on-premise storage for manifest file uploads, please [contact us](https://www.altimate.ai/support) via chat or Slack.\n    type: info\n///\n\n![addIntegration](images/addIntegration.png)<br>\n\nThen, copy the command (last column in above image) from the UI to upload manifest files mapped to this integration.\n\nThe command will look something like this - <br>\n\n\"datapilot dbt onboard --token <token> --instance-name <instance_name> --dbt_core_integration_id <id> --manifest-path 'Path/to/file'\"\n<br><br>\n(You need to replace 'Path/to/file' with the path to your manifest file e.g. /Users/mrx/documents/repos/jaffle_shop/target/manifest.json)\n\n/// admonition | You can use this command to run at regular intervals in your CI/CD or orchestration tool so the latest manifest is always available for reference automatically in other environments\n    type: tip\n///\n\nNow, choose the right dbt integration to reference in your VSCode as below:\n\n![addIntegration](images/chooseSaaS.png)<br>\n\n### Step 3: Enable/disable favor state\n\nTurn on favor-state if you need it. If it's turned on, the defer functionality will favor using the node defined in the referenced integration, even if the node exists in the current project.\n\n## Recorded demo video\n\n<iframe width=\"800\" height=\"600\" src=\"https://www.youtube.com/embed/r91_NShqhlU?si=dil-QKff7d5hHjL4\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen></iframe>\n\n## Interactive demo\n\n<div style=\"position: relative; padding-bottom: calc(88.35733099209834% + 42px); height: 0;\"><iframe src=\"https://app.supademo.com/embed/cltlt0f7g1tk6cd1jy5qo12ym\" allow=\"clipboard-write\" frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n\n/// admonition | Using defer to prod with SaaS instance requires an API key. You can get it by signing up for free at [www.altimate.ai](https://www.altimate.ai) Local mode doesn't require an API key.\n    type: info\n///\n"
  },
  {
    "path": "documentation/docs/test/lineage.md",
    "content": "Lineage is available as model level lineage and column level lineage. You need to add an API key to view column level lineage. You can view model level lineage without an API key.\n\n## Model lineage\n\n- Different dbt entities like sources, seeds, models, tests, metrics, exposures, and model types are shown in the lineage view.\n\n- For applicable components, Clicking on \"Details\" shows a list of columns with descriptions as well as dbt tests that are written for that particular component.\n\n![Model Lineage](images/modelLineage.png)\n\n## Expand lineage graph\n\nYou can expand lineage at a single expansion level by clicking (+) signs on individual blocks or you can expand multiple levels of lineage by using \"Expand\" button as show below\n\n![Expand Lineage Button](images/dbtExpand.png)\n\n## Column lineage\n\n- After clicking on \"Details\" for the component, you can see a list of columns. Then, you can click on a column name to change model lineage to column lineage view.\n\n![Column Selection](images/columnSelection.png)\n\n- In the column lineage view, links between components are shown as select links and non-select links. Select links are shown as solid lines if there is a direct flow of data between columns through select statements. Non-Select links are shown as dotted lines if columns appear in the condition/clause like where, join, having, etc. Check the Settings tab if you want to disable certain types of links or set specific expansion levels by default.\n\n![Column Lineage](images/columnLineage.png)\n\n## Code transformations\n\n- On each individual component, you can see small icons that show how that column was created (through transformation, just name change or passed unchanged). If code is available for a particular transformation, a small code icon is displayed.\n- When you click on the code icon, it shows the list of code transformations that were performed to create that column.\n\n![Transformation Code](images/TranformationCode.png)\n\n/// admonition | Column lineage with code transformation is also available in SaaS UI. Please refer to the section on [SaaS Discovery UI](../discover/viewlineage.md)\n    type: tip\n///\n\n![Lineage SaaS](images/lineageSaaS.png)\n\n/// details | Following are a few limitations in the column level lineage\n    type: note\n\n- Snapshots are not supported (coming soon)\n- Operators that may result in an incomplete lineage - Unnest - Lateral View Flatten - Json flatten to columns\n///\n\n## Export lineage\n\nYou can export lineage view to a web page. Please check more details [here](../govern/collaboration.md#lineage-export-workflow)\n\n## Interactive demo - column lineage\n\n<div style=\"position: relative; padding-bottom: calc(62.510416666666664% + 42px); height: 0;\"><iframe src=\"https://app.supademo.com/embed/clxkvc6q801nwsioa2h827cpt\" title=\"Column Lineage v3\" allow=\"clipboard-write\" frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n\n## Recorded demo - column lineage\n\n<div style=\"position: relative; padding-bottom: 62.5%; height: 0;\"><iframe src=\"https://www.loom.com/embed/24c9230c94854443a17d85de78f90ea8?sid=ba72566e-20e0-4ea2-a16a-55c8d5751c9e\" frameborder=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n\n/// admonition | Column lineage requires an API key. You can get it by signing up for free at [www.altimate.ai](https://www.altimate.ai)\n    type: info\n///\n"
  },
  {
    "path": "documentation/docs/test/queryResults.md",
    "content": "You can preview the resulting data and SQL query from your code with the extension, export it as CSV and do further analysis.\n\n## Preview results, export and analyze\n\nYou can preview results for the entire dbt model or select part of the dbt model to preview results only for that selection. After you select, Press Cmd+Enter (Mac) or Control+Enter (Windows/Linux) to run a query.\n\n<interactive demo of preview query results>\n\n<div style=\"position: relative; padding-bottom: calc(60.84217448487505% + 44px); height: 0;\"><iframe src=https://app.supademo.com/embed/S4uCGtgs_jisbJs5SfJzZ frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n\n/// details | You can also preview query results via \"execute dbt SQL\" operation from the toolbar on the top right corner. You have to click on the \"play\" button as shown in the image below.\n![preview results from toolbar](images/previewresultsToolbar.png)\n///\n\n/// details | You can view and copy the SQL query that was executed to get the data results.\n\nIn order to view executed SQL query, you need to click on SQL tab inside \"Query Results\" bottom panel.\nThere is a copy SQL button also, it becomes visible only when you hover over the top right corner.\n![copy sql button](images/copysqlbutton.png)\n\n///\n\n## Configure settings for query preview\n\nThere are multiple actions available as actions on the top of query results preview window. Please click “configure” button to make it visible.\n\n| Action      | Details                                                                                              |\n| ----------- | ---------------------------------------------------------------------------------------------------- |\n| Dark Mode   | You can change configuration of preview results display to light, dark, solarized etc. display modes |\n| Scroll Mode | Free scroll or aligned scroll                                                                        |\n| Read only   | Read only or editable mode (Note: editable mode doesn’t save values in the database)                 |\n| Reset       | Reset button to reset the view                                                                       |\n| Export      | You can export the data in CSV format                                                                |\n| Copy        | You can copy the data shown in the preview. There are multiple options like CSV and JSON format      |\n\nQuery preview is limited to 500 rows by default, this can be configured in Settings area or you can configure query results options in \"Help\" tab in the bottom panel as below.\n\nYou can also change table zoom level with 'scale' setting so you can see more columns in a single view or you can clear results by clicking “clear results” button.\n\n![Query results settings](images/queryresultsSettings.png)\n\n## Compare Query Results\n\nYou can save query results by opening in a tab. Then, make changes to a query and run query results.\nNow, you can compare previous results with new results easily as below:\n\n<div style=\"position: relative; padding-bottom: calc(101.2290950744559% + 42px); height: 0;\"><iframe src=\"https://app.supademo.com/embed/clyjc445z035z1y2pqv8z7oyd\" loading=\"lazy\" title=\"Compare results\" allow=\"clipboard-write\" frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n\n## Run an ad-hoc query\n\nYou can run ad hoc SQL queries or dbt Models in the \"Query Results\" tab\n![New Query](images/newQuery.gif)\n"
  },
  {
    "path": "documentation/docs/test/runctes.md",
    "content": "# Preview CTEs (Common Table Expressions)\n\ndbt Power User allows you to preview individual CTEs (Common Table Expressions) within your dbt models, making it easier to debug and understand complex queries by examining each component separately.\n\n<div style=\"position: relative; box-sizing: content-box; max-height: 80vh; max-height: 80svh; width: 100%; aspect-ratio: 1.5470008952551477; padding: 40px 0 40px 0;\"><iframe src=\"https://app.supademo.com/embed/cmc2e5dnokjiqsn1rupca8l9o?embed_v=2\" loading=\"lazy\" title=\"Preview CTE Results using Power User for dbt Extension\" allow=\"clipboard-write\" frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n\n## What are CTEs?\n\nCommon Table Expressions (CTEs) are temporary named result sets that exist within the execution scope of a single SQL statement. They help break down complex queries into more manageable, readable pieces. In dbt, CTEs are often used to organize complex transformations into logical steps.\n\n## Preview Individual CTEs\n\n### Using the CTE Preview Feature\n\nYou can preview the results of individual CTEs within your dbt model:\n\n1. **Open your dbt model** in the editor\n2. **Locate the CTE** you want to preview\n3. **Click on Execute CTE** right above the CTE\n"
  },
  {
    "path": "documentation/docs/test/runtests.md",
    "content": "There are two methods to run dbt model tests. You can either do it from the top right corner toolbar or from the extension side panel.\n\n### Method 1: Run tests from the toolbar\n\nThe toolbar action to run tests is present on the top right corner of the VSCode, as shown in the image below:\n\n![Test models](images/runTests.png)\n\n### Method 2: Run tests from the side panel\n\nOn the left side of the navigation, click on the dbt power user extension icon to open the left-side panel, as shown in the image below.\nThen, click on the \"Test dbt Model\" button (hover over the area shown by the red circle to make it visible) to execute dbt model tests.\n\n![Run tests in the side panel](images/testsPanel.png)\n"
  },
  {
    "path": "documentation/docs/test/sqlvalidation.md",
    "content": "Identify SQL issues like non-existent columns, keyword typos, extra parentheses easily\n\nFollowing SQL checks are available:\n\n| Check                        | Details                                                                                         |\n| ---------------------------- | ----------------------------------------------------------------------------------------------- |\n| Identify non-existent column | If SQL is referencing some columns that don't exist, those columns will be identified as error. |\n| Keyword typos                | If there are some typos in SQL keywords, those keywords will be flagged                         |\n| Missing or extra parentheses | If there are missed or extra parentheses, that SQL area will be highlighted                     |\n\n<interactive demo of SQL validator>\n\n<div style=\"position: relative; padding-bottom: calc(63.94160057678443% + 44px); height: 0;\"><iframe src=https://app.supademo.com/embed/clpyaam841qoepezyayydl83b frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n"
  },
  {
    "path": "documentation/docs/test/sqlvisualizer.md",
    "content": "# SQL Visualizer (Beta)\n\nThe new SQL visualizer translates complex SQL queries into intuitive graphical representations. SQL visualizer functionality shows the SQL structure of your code and how different components of the code are connected.\nThe provided SQL query is visually broken down into nodes representing CTEs, joins, filters, and unions, making it easier to understand, refactor, and debug the query components.\n\n### Key Benefits\n\n- Enhanced Comprehension: Quickly grasp SQL structure and flow through visual elements.\n- Improved Productivity: Drag-and-drop functionality for faster query modification.\n- Better Collaboration: Visual diagrams are effective documentation and are easier to share.\n- Easier Refactoring: Simplify query restructuring with the visual graph of all components.\n- Simplified Debugging: Identify and correct errors quickly by visually tracing query logic.\n\n/// admonition | This functionality is still in beta. The functionality may change further to streamline the experience\n    type: info\n///\n\n## Trigger the functionality\n\n### Actions Toolbar\n\nClick on \"SQL Actions\" icon as shown in the image below and choose \"Visualize SQL\" option from the drop down as below:\n\n![SQL Actions Trigger](images/buttonSQLActions.png)\n\n### Right Click Menu\n\nYou can just right click in the file, chose \"DataPilot\" menu and then choose option \"Visualize SQL\"\n\n![Right Click Visualizer](images/rightClickVisualizer.png)\n\n### Command Palette\n\nOpen the model file for which you need to see SQL visualization. Then, press cmd+shift+P (for Mac) or Ctrl+shift+P (for Windows) to bring up the command palette. Search for \"SQL visualizer\" and execute it.\n\n![Command SQL Visualizer](images/commandSQLVisualizer.png)\n\n## View the SQL components flow\n\nPlease use the bottom left corner buttons to zoom in / zoom out, etc.\n\n![SQL Flow](images/graphView.png)\n\n## Hover over connections to view the code\n\nYou can hover over connections like join, group, union to see the code. You can also click on \"View Details\" within the component to see the list of columns and descriptions.\n\n![View Code](images/codeView.png)\n\n## Same view is available in the SaaS Discovery UI\n\nSQL visualizer is also available in the SaaS Discovery UI where you can also see column lineage, dbt Model documentation and compiled code.\nPlease check more details on how to set up SaaS Discovery UI [here](../discover/setupui.md)\n\n![saas SQL Visualizer](images/saasSQLVisualizer.png)\n\n## Recorded Demo\n\n<div style=\"position: relative; padding-bottom: 62.5%; height: 0;\"><iframe src=\"https://www.loom.com/embed/11068668306f4b209450dc7b47b830c9?sid=75ab7592-7f45-4a88-8579-78e411ebadb4\" frameborder=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n"
  },
  {
    "path": "documentation/docs/test/utilities.md",
    "content": "## dbt logs viewer (force tailing)\n\n![dbt-logviewer](images/dbt-log.gif)\n"
  },
  {
    "path": "documentation/docs/test/writetests.md",
    "content": "You can generate, view, edit and delete dbt tests in VS Code under the Documentation Editor section.\n\n/// details | Following are a few limitations\n\n- The [alternative method for defining tests](https://docs.getdbt.com/reference/resource-properties/data-tests#alternative-format-for-defining-tests) is not supported yet\n- the definition of tests defined as macro is not available yet\n  ///\n\n## View dbt Tests\n\nThe documentation editor shows the tests that have been added for the dbt model and columns.\nYou can see the details of the tests by clicking on the test name. <br>\n\n![View tests](images/viewTestDetails.gif)\n\n## Add dbt Tests\n\nYou can add default dbt tests: unique, not_null, accepted_values, relationship by clicking (+) sign next to the \"Tests:\" label.\n\n![Add tests](images/addGenericTest.gif)\n\n## Generate dbt Tests (Beta)\n\nYou can also generate test code for custom tests based on dbt.utils and dbt.expectations package.\nFirst, click on (+) sign next to the \"Tests:\" label and choose \"custom tests\". DataPilot automatically detects which dbt packages you have installed, and it generates test code based on packages in your environment.\n\nIf a test definition is not available from packages (dbt.utils or dbt.expectations) that you have installed in your environment, DataPilot writes custom SQL test code and puts it in the dbt macro.\n\n/// admonition | This functionality is marked as beta. In some rare cases, DataPilot may decide to ignore the packages that you have installed or may generate inaccurate code.\n    type: info\n///\n\n![Generate tests](images/testGeneration.png)\n\n## Edit/delete dbt Tests\n\nYou can edit existing dbt tests if they are default dbt tests: unique, not_null, accepted_values, relationships by clicking on the test and using the \"pencil\" icon from the details screen. You can delete any dbt test\nby clicking on the test and using the \"trash can icon\" from the details screen\n\n![Edit tests](images/editTest.png)\n\n### Getting distinct values for \"accepted_values\" test\n\nAs shown in the image above, there is a button to quickly get distinct values for a specific column with a click of a button. This helps you write the \"accepted_values\" test easily.\n\n/// admonition | Save changes in YAML file\n    type: tip\n\nYou can save the changes in the existing or a new YAML file with save button at the bottom of the panel.\nIf you see any issues with the content that's saved in the YAML file, please check the [optional config section](../setup/optConfig.md/#column-name-setup-for-yaml-file-updates).\n///\n\n## Recorded demo video\n\n<iframe width=\"800\" height=\"600\" src=\"https://www.youtube.com/embed/VunQngGe-JE?si=G3whtDTnuJumSZ78\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen></iframe>\n"
  },
  {
    "path": "documentation/docs/troubleshooting.md",
    "content": "## Troubleshooting Steps\n\nFollow these steps to effectively troubleshoot and resolve issues with the extension:\n\n### Setup Wizard\n\nInitially, use the setup wizard. This tool is designed to identify and possibly resolve environment issues automatically. You can access it by selecting \"dbt\" or \"dbt is not installed\" in the bottom left bar of the IDE and then clicking on \"Setup Extension\".\n\n<div style=\"position: relative; padding-bottom: calc(57.25% + 44px); height: 0;\"><iframe src=https://app.supademo.com/embed/clph7wqbu4xjbpe69qnl0m9pf frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"></iframe></div>\n\n### Problems Panel\n\nCheck the problems panel for any issues with your dbt project. You can access the problems panel by clicking on the `Problems` tab.\n\n![Viewing the Problems Panel](images/problems-panel.png)\n\n### Diagnostics command\n\nThe diagnostics command in the VSCode Power User extension provides a comprehensive report that covers various aspects of the system and DBT project environment. Here is a summary of the diagnostics it generates:\n\n- **Environment Variables**: Lists all the environment variables which can help in understanding the system configuration and paths that might affect the DBT operations.\n\n- **Extension Settings**: Details the settings related to the VSCode extension, including preferences like AI keys, instance names, and various enabled or disabled features that influence how the extension behaves.\n\n- **Python and DBT Installations**: Confirms the installation of Python and DBT, along with their paths, ensuring that these essential tools are available and correctly set up.\n\n- **Workspace and Project Details**: Provides information about the active workspace and DBT projects, such as the version of DBT, project directory, and the first workspace path.\n\n- **DBT Project Configuration**: Outlines the configuration for the DBT project, including adapter type and version, and paths to essential files like dbt_project.yml.\n\n- **Connection Testing**: Tests and verifies the database connection, detailing the connection parameters and any errors encountered during the connection attempt.\n\n- **Potential Issues and Errors**: Identifies any issues with dependencies, such as mismatches in versions of Python libraries, and provides errors encountered during the execution of the DBT commands.\n  Overall, the diagnostics command is designed to help users quickly assess and troubleshoot their DBT setup within VSCode by providing detailed insights into configuration, environment, and connection status.\n\nRunning the command\n\n- On Mac, press `Cmd + Shift + P` or On Windows/Linux, use `Ctrl + Shift + P`\n- type diagnostics and pick the option listed under the dbt power user extension name and press enter\n  ![Diagnostics](images/diagnostics.png)\n- this should start a terminal window and print the diagnostic information\n\n### Check Extension Logs\n\nIf the problem persists, examine the logs in the IDE's output panel.\n\n1. Select `Log -> dbt` from the dropdown menu to view detailed extension logs, which can provide insights into underlying issues.\n2. To access more detailed logs, you can change the log level to \"Debug\":\n   - Open the vscode command palette -\n     - On Mac, do this by pressing `Cmd + Shift + P`.\n     - On Windows/Linux, use `Ctrl + Shift + P`.\n   - Once the command palette opens, type `Set Log Level`, then choose `Debug`.\n3. Run the operations again and you should start seeing debug logs in the `Log -> dbt` output stream\n\n   ![Viewing Log - dbt in the Output Panel](images/extension-logs.png)\n\n### Developer Tools\n\nFor more in-depth diagnostics, use the developer tools in Visual Studio Code (VSCode). Navigate to `Help -> Toggle Developer Tools` to access these tools, including a console with detailed logs and error messages.\n\n![Accessing Developer Tools in VSCode](images/developer-tools.png)\n\n### Contact Support\n\nIf issues still remain unresolved, please [contact us](https://www.altimate.ai/support) via Slack or chat for further assistance.\n\n/// admonition | Feedback Widgets\n    type: tip\n\nThere are also feedback widgets in the extension embedded in various features, where you can directly provide feedback on the roadmap or any issues that you encountered.\n///\n\n/// admonition | Still stuck? [contact us](https://www.altimate.ai/support) via Slack or chat\n    type: tip\n///\n"
  },
  {
    "path": "documentation/mkdocs.yml",
    "content": "site_name: dbt Power User\nsite_description: the best dbt extension for vscode\nsite_author: Altimate Inc\ntheme:\n  name: material\n  logo: assets/logo.png\n  icon:\n    repo: fontawesome/brands/github\n  custom_dir: docs/overrides\n  features:\n    - announce.dismiss\n    - content.action.edit\n    - content.action.view\n    - content.code.annotate\n    - content.code.copy\n    # - content.code.select\n    # - content.tabs.link\n    - content.tooltips\n    # - header.autohide\n    # - navigation.expand\n    - navigation.footer\n    - navigation.indexes\n    # - navigation.instant\n    # - navigation.instant.prefetch\n    # - navigation.instant.progress\n    # - navigation.prune\n    # - navigation.sections\n    # - navigation.tabs\n    # - navigation.tabs.sticky\n    - navigation.top\n    - navigation.tracking\n    - search.highlight\n    - search.share\n    - search.suggest\n    - toc.follow\n    # - toc.integrate\n\n  palette:\n    # Palette toggle for automatic mode\n    - media: \"(prefers-color-scheme)\"\n      toggle:\n        icon: material/brightness-auto\n        name: Switch to light mode\n      primary: white\n      accent: blue\n\n    # Palette toggle for light mode\n    - media: \"(prefers-color-scheme: light)\"\n      scheme: default\n      toggle:\n        icon: material/brightness-7\n        name: Switch to dark mode\n      primary: white\n      accent: blue\n\n    # Palette toggle for dark mode\n    - media: \"(prefers-color-scheme: dark)\"\n      scheme: slate\n      toggle:\n        icon: material/brightness-4\n        name: Switch to system preference\n      primary: black\n      accent: blue\n\n  font:\n    text: Roboto\n    code: Roboto Mono\n    logo: logo\n\nextra_css:\n  - stylesheets/extra.css\n\nmarkdown_extensions:\n  - pymdownx.blocks.admonition\n  - markdown.extensions.codehilite:\n      guess_lang: false\n  - pymdownx.highlight:\n      anchor_linenums: true\n      line_spans: __span\n      pygments_lang_class: true\n  - pymdownx.inlinehilite\n  - pymdownx.snippets\n  - pymdownx.superfences\n  - pymdownx.blocks.details\nplugins:\n  - search\n  - git-revision-date-localized:\n      enable_creation_date: true\n      type: date\n      fallback_to_build_date: true\n\nnav:\n  - Welcome: index.md\n  - Setup:\n      - Install the extension: setup/installation.md\n      - Cursor IDE workaround: setup/cursor_installation_workaround.md\n      - Required config:\n        - dbt Core: setup/reqdConfig.md\n        - dbt Cloud: setup/reqdConfigCloud.md\n        - dbt Fusion: setup/reqdConfigFusion.md\n      - Optional config: setup/optConfig.md\n      - All configurations: setup/configuration.md\n      - SSO: setup/sso.md\n      - FAQ: setup/faq.md\n  - Develop:\n      - Autocomplete and go to definition: develop/autocomplete.md\n      - Click to build parent/child models: develop/clicktorun.md\n      - Preview compiled code (SQL): develop/compiledCode.md\n      - Generate dbt model from source: develop/genmodelSource.md\n      - Generate dbt model from SQL: develop/genmodelSQL.md\n      - SQL validation: test/sqlvalidation.md\n      - Query explanation: develop/explanation.md\n      - Update dbt model using natural language: develop/updatemodel.md\n      - Translate SQL queries (dialects): develop/translateSQL.md\n  - Test:\n      - Preview query results: test/queryResults.md\n      - Preview CTEs: test/runctes.md\n      - Run ad hoc query: test/adhocquery.md\n      - SQL Visualizer: test/sqlvisualizer.md\n      - Generate and edit tests: test/writetests.md\n      - Run tests: test/runtests.md\n      - Column Lineage: test/lineage.md\n      - Defer to prod: test/defertoprod.md\n  - Document:\n      - Write documentation: document/write.md\n      - Generate documentation: document/generatedoc.md\n      - Support for doc blocks: document/docblocks.md\n  - Collaborate: \n      - Project Governance: govern/governance.md\n      - Notebooks for ad-hoc analysis: govern/notebooks.md\n      - Collaborate via IDE & UI: govern/collaboration.md\n      - Multi-project Support with dbt-loom: govern/multiproject.md\n      - Query Bookmarks and History: govern/querybookmarks.md\n  - Discover:\n      - Setup UI for docs & lineage: discover/setupui.md\n      - Search and view docs: discover/viewdocs.md\n      - Column lineage with Xformations: discover/viewlineage.md\n  - Utilities:\n      - Big Query cost estimator: test/bigquerycost.md\n      - Logs force tailing: test/utilities.md\n  - AI Teammates:\n      - Introduction: teammates/introduction.md\n      - Coach & Personalize: teammates/coach.md\n  - Altimate Code: teammates/altimate-code.md\n  - Altimate LLM Gateway: arch/llm-gateway.md\n  - Datamates: https://datamates-docs.myaltimate.com/\n  - Studio (Beta): studio.md\n  - Support & FAQ:\n      - Troubleshooting: troubleshooting.md\n      - Security FAQ: arch/faq.md\n      - Pricing FAQ: arch/pricingfaq.md\nextra:\n  status:\n    new: Recently added\n  analytics:\n    provider: google\n    property: G-LXRSS3VK5N\n    feedback:\n      title: Was this page helpful?\n      ratings:\n        - icon: material/emoticon-happy-outline\n          name: This page was helpful\n          data: 1\n          note: >-\n            Thanks for your feedback!\n        - icon: material/emoticon-sad-outline\n          name: This page could be improved\n          data: 0\n          note: >-\n            Thanks for your feedback! Help us improve this page by\n            using our <a href=\"https://github.com/altimateai/vscode-dbt-power-user/issues/new/?title=[DocsFeedback]+{title}+-+{url}\" target=\"_blank\" rel=\"noopener\">feedback form</a>.\n  consent:\n    title: Cookie consent\n    description: >-\n      We use cookies to recognize your repeated visits and preferences, as well\n      as to measure the effectiveness of our documentation and whether users\n      find what they're searching for. With your consent, you're helping us to\n      make our documentation better.\n    actions:\n      - accept\n      - reject\ncopyright: >\n  Copyright &copy; 2022 - 2026 Altimate Inc –\n  <a href=\"#__consent\">Change cookie settings</a>\n\ncopyright: >\n  Copyright &copy; 2022 - 2026 Altimate Inc –\n  <a href=\"#__consent\">Change cookie settings</a>\n\nrepo_url: https://github.com/AltimateAI/vscode-dbt-power-user\nedit_uri: edit/master/docs/"
  },
  {
    "path": "documentation/readme.md",
    "content": "### Local development\n\n- Install required dependencies: `pip install --requirement requirements.txt`\n- Run mkdocs server: `mkdocs serve`\n"
  },
  {
    "path": "documentation/requirements.txt",
    "content": "mkdocs>=1.6.1\nmkdocs-material>=9.5.43\nmkdocs-git-revision-date-localized-plugin>=1.3.0"
  },
  {
    "path": "jest.config.js",
    "content": "module.exports = {\n  preset: \"ts-jest\",\n  testEnvironment: \"node\",\n  roots: [\"<rootDir>/src\"],\n  testMatch: [\"**/*.test.ts\"],\n  testPathIgnorePatterns: [\"/node_modules/\", \"/src/test/integration/\"],\n  transform: {\n    \"^.+\\\\.tsx?$\": [\"ts-jest\", { tsconfig: \"tsconfig.json\" }],\n  },\n  moduleFileExtensions: [\"ts\", \"tsx\", \"js\", \"jsx\", \"json\", \"node\"],\n  setupFilesAfterEnv: [\"<rootDir>/src/test/setup.ts\"],\n  reporters: [\"default\", [\"summary\", { summaryThreshold: 1 }]],\n  collectCoverageFrom: [\n    \"src/**/*.{ts,tsx}\",\n    \"!src/test/**\",\n    \"!**/node_modules/**\",\n  ],\n  coverageDirectory: \"coverage\",\n  moduleNameMapper: {\n    \"^vscode$\": \"<rootDir>/src/test/mock/vscode.ts\",\n    \"^@lib$\": \"<rootDir>/src/test/mock/lib.ts\",\n    \"^node-fetch$\": \"<rootDir>/src/test/mock/node-fetch.ts\",\n    // Development: use local TypeScript source (same as webpack and tsconfig)\n    // \"^@altimateai/dbt-integration$\":\n    //   \"<rootDir>/../altimate-dbt-integration/src/index.ts\",\n    // Production: use npm package (commented out for development)\n    \"^@altimateai/dbt-integration$\": \"@altimateai/dbt-integration\",\n    \"^@extension$\": \"<rootDir>/src/modules.ts\",\n  },\n};\n"
  },
  {
    "path": "monitoring/README.md",
    "content": "# dbt Power User — Error Analysis Dashboard\n\nA local Flask web app that queries the `dbt-power-user-telemetry-staging` Application Insights instance and visualises error patterns across all extension users.\n\n## Prerequisites\n\n- Python 3.9+\n- Azure CLI: `brew install azure-cli`\n- Logged in to Azure: `az login`\n- Access to the `altimate-staging` resource group\n\n## Running Locally\n\n```bash\ncd monitoring\npip install -r requirements.txt\npython app.py\n```\n\nOpen **http://localhost:5050** in your browser.\n\n> Note: macOS reserves port 5000 for AirPlay. The app uses port **5050** by default.\n\n## Dashboard Sections\n\n| #   | Section                  | What it shows                                                                         |\n| --- | ------------------------ | ------------------------------------------------------------------------------------- |\n| 1   | **Summary**              | Total errors, unique error types, affected instances in the selected time window      |\n| 2   | **Error Trend**          | Line chart — errors per hour (≤2 days) or per day (>2 days)                           |\n| 3   | **Top Errors**           | Horizontal bar chart of top 10 + full table of top 15 with integration mode breakdown |\n| 4   | **By Integration Mode**  | Doughnut chart — core vs cloud vs fusion vs corecommand                               |\n| 5   | **By OS / Architecture** | Bar chart — darwin/win32/linux × x64/arm64                                            |\n| 6   | **By Extension Version** | Bar chart — error count per version (regression detection)                            |\n| 7   | **Unhandled Errors**     | Table — `unhandlederror` events grouped by message pattern                            |\n| 8   | **Error Details**        | Full paginated table (500 rows, 50/page) with expandable stack traces                 |\n\n## Filters\n\nAll sections respond to the three filters in the header bar:\n\n| Filter                | Default     | Options                                       |\n| --------------------- | ----------- | --------------------------------------------- |\n| **Days**              | Last 7 days | 24h, 7d, 14d, 30d                             |\n| **Integration Mode**  | All         | All, core, cloud, fusion, corecommand         |\n| **Extension Version** | All         | All + live-fetched versions from App Insights |\n\nClick **↺ Refresh** to re-fetch all data without changing filters.\n\n## App Insights Resource\n\n| Field          | Value                                  |\n| -------------- | -------------------------------------- |\n| Resource name  | `dbt-power-user-telemetry-staging`     |\n| Resource group | `altimate-staging`                     |\n| Subscription   | `6ff315ea-c5a6-43fc-aabf-7f1bf1287582` |\n\nThe backend queries the `customEvents` table. Error events are identified by:\n\n- `name` containing `\"Error\"` or `\"error\"`, **or**\n- `name == \"unhandlederror\"` (uncaught exceptions from the telemetry library)\n\n## API Endpoints\n\nAll endpoints accept `days`, `mode`, and `version` query parameters:\n\n| Endpoint                       | Description                                    |\n| ------------------------------ | ---------------------------------------------- |\n| `GET /api/summary`             | Total errors, unique types, affected instances |\n| `GET /api/trend`               | Errors per time bin (hourly or daily)          |\n| `GET /api/top-errors?limit=15` | Top N error types with counts and modes        |\n| `GET /api/by-mode`             | Count by dbt integration mode                  |\n| `GET /api/by-platform`         | Count by OS / architecture                     |\n| `GET /api/by-version`          | Count by extension version                     |\n| `GET /api/unhandled`           | Unhandled error message groups                 |\n| `GET /api/details?limit=500`   | Raw error rows with stack traces               |\n| `GET /api/versions`            | Distinct extension versions (for dropdown)     |\n\n## Telemetry Source\n\nErrors are logged from the extension via `src/telemetry/index.ts` using\n`sendTelemetryError(eventName, error, properties)`. The TelemetryService\nautomatically attaches `dbtIntegrationMode`, `instanceName`, `ide`, and\n`localMode` to every event, and strips secrets from stack traces.\n\nNamed error events are enumerated in `src/telemetry/events.ts`.\n"
  },
  {
    "path": "monitoring/app.py",
    "content": "\"\"\"\ndbt Power User — Error Analysis Dashboard\nFlask backend that queries Azure Application Insights telemetry.\nAuthentication: uses AzureCliCredential (requires `az login`).\n\"\"\"\n\nfrom datetime import timedelta\nfrom flask import Flask, jsonify, render_template, request\nfrom azure.identity import AzureCliCredential\nfrom azure.monitor.query import LogsQueryClient, LogsQueryStatus\n\napp = Flask(__name__)\n\nRESOURCE_ID = (\n    \"/subscriptions/6ff315ea-c5a6-43fc-aabf-7f1bf1287582\"\n    \"/resourceGroups/altimate-staging\"\n    \"/providers/microsoft.insights/components/dbt-power-user-telemetry-staging\"\n)\n\nERROR_FILTER = \"\"\"(name contains \"Error\" or name contains \"error\" or name == \"unhandlederror\")\"\"\"\nSHORT_NAME_KQL = 'iif(name contains \"/\", tostring(split(name, \"/\", 1)[0]), name)'\n\nVALID_MODES = {\"All\", \"core\", \"cloud\", \"fusion\", \"corecommand\"}\n\n_client: LogsQueryClient | None = None\n\n\ndef get_client() -> LogsQueryClient:\n    global _client\n    if _client is None:\n        _client = LogsQueryClient(AzureCliCredential())\n    return _client\n\n\ndef run_query(kql: str, days: int) -> list[dict]:\n    \"\"\"Execute a KQL query against App Insights and return rows as list of dicts.\"\"\"\n    response = get_client().query_resource(\n        RESOURCE_ID,\n        kql,\n        timespan=timedelta(days=days),\n    )\n    if response.status == LogsQueryStatus.PARTIAL:\n        table = response.partial_data[0]\n    elif response.status == LogsQueryStatus.SUCCESS:\n        table = response.tables[0]\n    else:\n        raise RuntimeError(f\"Query failed: {response.partial_error}\")\n\n    columns = list(table.columns)\n    rows = []\n    for row in table.rows:\n        record = {}\n        for col, val in zip(columns, row):\n            if hasattr(val, \"isoformat\"):\n                val = val.isoformat()\n            record[col] = val\n        rows.append(record)\n    return rows\n\n\ndef dim_filter(key: str, value: str) -> str:\n    \"\"\"KQL fragment that filters on a customDimensions key; no-op when value is 'All'.\"\"\"\n    if value == \"All\":\n        return \"\"\n    return f'| where tostring(customDimensions[\"{key}\"]) == \"{value}\"'\n\n\ndef get_params() -> tuple[int, str, str]:\n    days = int(request.args.get(\"days\", 7))\n    mode = request.args.get(\"mode\", \"All\")\n    version = request.args.get(\"version\", \"All\")\n    if mode not in VALID_MODES:\n        mode = \"All\"\n    return days, mode, version\n\n\n@app.route(\"/\")\ndef index():\n    return render_template(\"index.html\")\n\n\n@app.route(\"/api/versions\")\ndef api_versions():\n    days, _, _ = get_params()\n    kql = \"\"\"\ncustomEvents\n| extend extVersion = tostring(customDimensions[\"common.extversion\"])\n| where isnotempty(extVersion) and extVersion != \"undefined\"\n| summarize by extVersion\n| order by extVersion desc\n| project extVersion\n\"\"\"\n    rows = run_query(kql, days)\n    return jsonify([r[\"extVersion\"] for r in rows])\n\n\n@app.route(\"/api/summary\")\ndef api_summary():\n    days, mode, version = get_params()\n    kql = f\"\"\"\ncustomEvents\n| where {ERROR_FILTER}\n{dim_filter(\"dbtIntegrationMode\", mode)}\n{dim_filter(\"common.extversion\", version)}\n| extend instanceName = tostring(customDimensions[\"instanceName\"])\n| extend shortName = {SHORT_NAME_KQL}\n| summarize\n    TotalErrors = count(),\n    UniqueTypes = dcount(shortName),\n    AffectedInstances = dcountif(instanceName, isnotempty(instanceName) and instanceName != \"undefined\" and instanceName != \"\")\n\"\"\"\n    rows = run_query(kql, days)\n    if rows:\n        r = rows[0]\n        return jsonify({\n            \"totalErrors\": r.get(\"TotalErrors\", 0),\n            \"uniqueTypes\": r.get(\"UniqueTypes\", 0),\n            \"affectedInstances\": r.get(\"AffectedInstances\", 0),\n        })\n    return jsonify({\"totalErrors\": 0, \"uniqueTypes\": 0, \"affectedInstances\": 0})\n\n\n@app.route(\"/api/trend\")\ndef api_trend():\n    days, mode, version = get_params()\n    grain = \"1h\" if days <= 2 else \"1d\"\n    kql = f\"\"\"\ncustomEvents\n| where {ERROR_FILTER}\n{dim_filter(\"dbtIntegrationMode\", mode)}\n{dim_filter(\"common.extversion\", version)}\n| summarize Count = count() by bin(timestamp, {grain})\n| order by timestamp asc\n\"\"\"\n    rows = run_query(kql, days)\n    return jsonify([{\"timestamp\": r[\"timestamp\"], \"count\": r[\"Count\"]} for r in rows])\n\n\n@app.route(\"/api/top-errors\")\ndef api_top_errors():\n    days, mode, version = get_params()\n    limit = int(request.args.get(\"limit\", 15))\n    kql = f\"\"\"\ncustomEvents\n| where {ERROR_FILTER}\n{dim_filter(\"dbtIntegrationMode\", mode)}\n{dim_filter(\"common.extversion\", version)}\n| extend shortName = {SHORT_NAME_KQL}\n| extend integrationMode = tostring(customDimensions[\"dbtIntegrationMode\"])\n| summarize Count = count(), Modes = make_set(integrationMode, 10) by shortName\n| top {limit} by Count desc\n| extend ModeList = strcat_array(Modes, \", \")\n| project shortName, Count, ModeList\n| order by Count desc\n\"\"\"\n    rows = run_query(kql, days)\n    return jsonify([\n        {\"name\": r[\"shortName\"], \"count\": r[\"Count\"], \"modes\": r[\"ModeList\"]}\n        for r in rows\n    ])\n\n\n@app.route(\"/api/by-mode\")\ndef api_by_mode():\n    days, _, version = get_params()\n    kql = f\"\"\"\ncustomEvents\n| where {ERROR_FILTER}\n{dim_filter(\"common.extversion\", version)}\n| extend integrationMode = tostring(customDimensions[\"dbtIntegrationMode\"])\n| extend integrationMode = iif(isempty(integrationMode) or integrationMode == \"undefined\", \"unknown\", integrationMode)\n| summarize Count = count() by integrationMode\n| order by Count desc\n\"\"\"\n    rows = run_query(kql, days)\n    return jsonify([{\"mode\": r[\"integrationMode\"], \"count\": r[\"Count\"]} for r in rows])\n\n\n@app.route(\"/api/by-platform\")\ndef api_by_platform():\n    days, mode, version = get_params()\n    kql = f\"\"\"\ncustomEvents\n| where {ERROR_FILTER}\n{dim_filter(\"dbtIntegrationMode\", mode)}\n{dim_filter(\"common.extversion\", version)}\n| extend os = tostring(customDimensions[\"common.os\"])\n| extend arch = tostring(customDimensions[\"common.nodeArch\"])\n| extend os = iif(isempty(os) or os == \"undefined\", \"unknown\", os)\n| extend arch = iif(isempty(arch) or arch == \"undefined\", \"unknown\", arch)\n| extend platform = strcat(os, \" / \", arch)\n| summarize Count = count() by platform\n| order by Count desc\n\"\"\"\n    rows = run_query(kql, days)\n    return jsonify([{\"platform\": r[\"platform\"], \"count\": r[\"Count\"]} for r in rows])\n\n\n@app.route(\"/api/by-version\")\ndef api_by_version():\n    days, mode, _ = get_params()\n    kql = f\"\"\"\ncustomEvents\n| where {ERROR_FILTER}\n{dim_filter(\"dbtIntegrationMode\", mode)}\n| extend extVersion = tostring(customDimensions[\"common.extversion\"])\n| extend extVersion = iif(isempty(extVersion) or extVersion == \"undefined\", \"unknown\", extVersion)\n| summarize Count = count() by extVersion\n| order by Count desc\n\"\"\"\n    rows = run_query(kql, days)\n    return jsonify([{\"version\": r[\"extVersion\"], \"count\": r[\"Count\"]} for r in rows])\n\n\n@app.route(\"/api/unhandled\")\ndef api_unhandled():\n    days, mode, version = get_params()\n    kql = f\"\"\"\ncustomEvents\n| where name == \"unhandlederror\"\n{dim_filter(\"dbtIntegrationMode\", mode)}\n{dim_filter(\"common.extversion\", version)}\n| extend\n    errorMessage = tostring(customDimensions[\"message\"]),\n    extVersion = tostring(customDimensions[\"common.extversion\"]),\n    integrationMode = tostring(customDimensions[\"dbtIntegrationMode\"])\n| extend messageGroup = case(\n    errorMessage contains \"Channel closed\",      \"Channel closed (python-bridge)\",\n    errorMessage contains \"ENOENT\",              \"File not found (ENOENT)\",\n    errorMessage contains \"ECONNREFUSED\",        \"Connection refused (ECONNREFUSED)\",\n    errorMessage contains \"ETIMEDOUT\",           \"Connection timeout (ETIMEDOUT)\",\n    errorMessage contains \"EPERM\",               \"Permission denied (EPERM)\",\n    isempty(errorMessage) or errorMessage == \"undefined\", \"(no message)\",\n    substring(errorMessage, 0, 80))\n| summarize\n    Count = count(),\n    Versions = strcat_array(make_set(extVersion, 5), \", \"),\n    Modes = strcat_array(make_set(integrationMode, 5), \", \")\n    by messageGroup\n| order by Count desc\n\"\"\"\n    rows = run_query(kql, days)\n    return jsonify([\n        {\"group\": r[\"messageGroup\"], \"count\": r[\"Count\"], \"versions\": r[\"Versions\"], \"modes\": r[\"Modes\"]}\n        for r in rows\n    ])\n\n\n@app.route(\"/api/details\")\ndef api_details():\n    days, mode, version = get_params()\n    limit = int(request.args.get(\"limit\", 500))\n    kql = f\"\"\"\ncustomEvents\n| where {ERROR_FILTER}\n{dim_filter(\"dbtIntegrationMode\", mode)}\n{dim_filter(\"common.extversion\", version)}\n| extend\n    shortName      = {SHORT_NAME_KQL},\n    errorMessage   = tostring(customDimensions[\"message\"]),\n    integrationMode = tostring(customDimensions[\"dbtIntegrationMode\"]),\n    extVersion     = tostring(customDimensions[\"common.extversion\"]),\n    os             = tostring(customDimensions[\"common.os\"]),\n    arch           = tostring(customDimensions[\"common.nodeArch\"]),\n    ideApp         = tostring(customDimensions[\"ide\"]),\n    stackTrace     = tostring(customDimensions[\"stack\"])\n| project timestamp, shortName, errorMessage, integrationMode, extVersion, os, arch, ideApp, stackTrace\n| order by timestamp desc\n| take {limit}\n\"\"\"\n    rows = run_query(kql, days)\n    return jsonify([\n        {\n            \"timestamp\": r[\"timestamp\"],\n            \"name\": r[\"shortName\"],\n            \"message\": r[\"errorMessage\"],\n            \"mode\": r[\"integrationMode\"],\n            \"version\": r[\"extVersion\"],\n            \"os\": r[\"os\"],\n            \"arch\": r[\"arch\"],\n            \"ide\": r[\"ideApp\"],\n            \"stack\": r[\"stackTrace\"],\n        }\n        for r in rows\n    ])\n\n\n@app.route(\"/api/stack-analysis\")\ndef api_stack_analysis():\n    days, mode, version = get_params()\n    kql = f\"\"\"\ncustomEvents\n| where {ERROR_FILTER}\n{dim_filter(\"dbtIntegrationMode\", mode)}\n{dim_filter(\"common.extversion\", version)}\n| extend stack = tostring(customDimensions[\"stack\"])\n| where isnotempty(stack) and stack != \"undefined\"\n| extend shortName = {SHORT_NAME_KQL}\n| extend integrationMode = tostring(customDimensions[\"dbtIntegrationMode\"])\n| extend extVersion = tostring(customDimensions[\"common.extversion\"])\n| extend RootCause = case(\n    stack contains \"no profile was specified for this dbt project\",    \"No Profile Specified\",\n    stack contains \"Could not find profile named\",                      \"Profile Not Found\",\n    stack contains \"No module named 'dbt.adapters.\",                   \"dbt Adapters Module Missing\",\n    stack contains \"No module named 'dbt'\",                            \"dbt Module Not Installed\",\n    stack contains \"No module named\",                                   \"Python Module Not Found\",\n    stack contains \"dbt.exceptions.FailedToConnectError\",              \"dbt: Failed to Connect\",\n    stack contains \"dbt.exceptions.EnvVarMissingError\",                \"dbt: Env Var Missing\",\n    stack contains \"dbt.exceptions.UninstalledPackagesFoundError\",     \"dbt: Uninstalled Packages\",\n    stack contains \"dbt.exceptions.ParsingException\",                  \"dbt: Parsing Exception\",\n    stack contains \"dbt.exceptions.ParsingError\",                      \"dbt: Parsing Error\",\n    stack contains \"dbt.exceptions.CompilationException\",              \"dbt: Compilation Exception\",\n    stack contains \"dbt.exceptions.CompilationError\",                  \"dbt: Compilation Error\",\n    stack contains \"dbt.exceptions.TargetNotFoundError\",               \"dbt: Target Not Found\",\n    stack contains \"dbt.exceptions.DbtProfileError\",                   \"dbt: Profile Error\",\n    stack contains \"dbt.exceptions.DbtProjectError\",                   \"dbt: Project Error\",\n    stack contains \"dbt.exceptions.DbtValidationError\",                \"dbt: Validation Error\",\n    stack contains \"dbt.exceptions.CaughtMacroErrorWithNodeError\",     \"dbt: Caught Macro Error\",\n    stack contains \"dbt.exceptions\",                                    \"dbt: Generic Exception\",\n    stack contains \"YAMLParseError\",                                    \"YAML Parse Error\",\n    stack contains \"DB::Exception\",                                     \"Database Exception\",\n    stack contains \"FileNotFoundError\",                                 \"Python: File Not Found\",\n    stack contains \"KeyError\",                                          \"Python: Key Error\",\n    stack contains \"ImportError\",                                       \"Python: Import Error\",\n    stack contains \"NotImplementedError\",                               \"Python: Not Implemented\",\n    stack contains \"NameError:\",                                        \"Python: Name Error\",\n    stack contains \"RuntimeError: release unlocked lock\",              \"Python: Unlocked Lock\",\n    stack contains \"codec can't decode bytes\",                          \"Python: Codec Decode Error\",\n    stack contains \"Python process closed with exit code\",             \"Python Process Exited\",\n    stack contains \"spawn ENOENT\",                                      \"spawn: dbt Not Found (ENOENT)\",\n    stack contains \"spawn EBADF\",                                       \"spawn: Bad File Descriptor\",\n    stack contains \"spawn ECONNRESET\",                                  \"spawn: Connection Reset\",\n    stack contains \"Error: ENOENT: no such file or directory, open\",   \"ENOENT: File Not Found\",\n    stack contains \"Cannot read properties of\",                        \"JS: Cannot Read Properties\",\n    stack contains \"AbortError\",                                        \"JS: Abort Error\",\n    stack contains \"Channel closed\",                                    \"python-bridge: Channel Closed\",\n    stack contains \"not found: sqlfmt\",                                 \"sqlfmt Not Found\",\n    stack contains \"ENOTFOUND api.myaltimate.com\",                     \"Cannot Reach api.myaltimate.com\",\n    stack contains \"FetchError\",                                        \"JS: Fetch Error\",\n    stack contains \"dbt found following issue: Compilation Error\",     \"dbt CLI: Compilation Error\",\n    stack contains \"DeprecationWarning\",                                \"Python: Deprecation Warning\",\n    stack contains \"NotOpenSSLWarning\",                                 \"Python: OpenSSL Warning\",\n    \"Other / Unclassified\")\n| summarize\n    Count = count(),\n    TopEvents = strcat_array(make_set(shortName, 5), \", \"),\n    TopModes  = strcat_array(make_set(integrationMode, 4), \", \"),\n    TopVersions = strcat_array(make_set(extVersion, 4), \", \")\n    by RootCause\n| order by Count desc\n| take 100\n\"\"\"\n    rows = run_query(kql, days)\n    return jsonify([\n        {\n            \"rootCause\": r[\"RootCause\"],\n            \"count\": r[\"Count\"],\n            \"topEvents\": r[\"TopEvents\"],\n            \"topModes\": r[\"TopModes\"],\n            \"topVersions\": r[\"TopVersions\"],\n        }\n        for r in rows\n    ])\n\n\nif __name__ == \"__main__\":\n    app.run(debug=True, port=5050)\n"
  },
  {
    "path": "monitoring/github_issues/app.py",
    "content": "\"\"\"\nGitHub Issues Dashboard\nFlask backend that fetches issues from the GitHub REST API with local file-based caching.\n\nAuthentication:\n  Set GITHUB_TOKEN env var for 5 000 req/hr (unauthenticated = 60 req/hr).\n\nAI analysis:\n  Requires the `claude` CLI to be in PATH.\n  Uses your existing Claude Code auth (Claude Code Max subscription works).\n  No separate ANTHROPIC_API_KEY needed.\n\nUsage:\n  cd monitoring/github_issues\n  pip install -r requirements.txt\n  GITHUB_TOKEN=<pat> python app.py\n  # Open http://localhost:5051\n\"\"\"\n\nimport json\nimport os\nimport shutil\nimport subprocess\nimport time\nfrom datetime import datetime, timezone, timedelta\nfrom pathlib import Path\n\nimport requests\nfrom flask import Flask, jsonify, render_template, request\n\napp = Flask(__name__)\n\nREPO = \"AltimateAI/vscode-dbt-power-user\"\nGITHUB_API = \"https://api.github.com\"\n\nCACHE_DIR = Path(__file__).parent / \".cache\"\nISSUES_CACHE = CACHE_DIR / \"issues.json\"\nAI_THEMES_CACHE = CACHE_DIR / \"ai_themes.json\"\nISSUES_CACHE_TTL = 3600   # 1 hour\nAI_CACHE_TTL = 14400      # 4 hours\n\n\n# ---------------------------------------------------------------------------\n# GitHub data fetching + caching\n# ---------------------------------------------------------------------------\n\ndef _github_headers() -> dict:\n    token = os.environ.get(\"GITHUB_TOKEN\")\n    headers = {\"Accept\": \"application/vnd.github.v3+json\"}\n    if token:\n        headers[\"Authorization\"] = f\"Bearer {token}\"\n    return headers\n\n\ndef _fetch_all_issues() -> list[dict]:\n    \"\"\"Fetch every issue (not PR) from GitHub with full pagination.\n\n    GitHub's REST Issues API caps pagination at 1000 results (page 10 × per_page 100).\n    A 422 on page > 10 means we've hit that ceiling — stop gracefully.\n    \"\"\"\n    issues: list[dict] = []\n    page = 1\n    while True:\n        resp = requests.get(\n            f\"{GITHUB_API}/repos/{REPO}/issues\",\n            headers=_github_headers(),\n            params={\"state\": \"all\", \"per_page\": 100, \"page\": page},\n            timeout=30,\n        )\n        if resp.status_code == 422:\n            # GitHub caps the Issues API at 1000 results; stop here\n            print(f\"[github] page {page} returned 422 (API cap reached), stopping\")\n            break\n        if resp.status_code == 403:\n            remaining = resp.headers.get(\"X-RateLimit-Remaining\", \"?\")\n            reset = resp.headers.get(\"X-RateLimit-Reset\", \"?\")\n            raise RuntimeError(\n                f\"GitHub API rate limit exceeded (remaining={remaining}, reset={reset}). \"\n                \"Set the GITHUB_TOKEN environment variable to increase the limit to 5000 req/hr: \"\n                \"  GITHUB_TOKEN=<your-pat> python app.py\"\n            )\n        resp.raise_for_status()\n        batch = resp.json()\n        if not batch:\n            break\n        # GitHub's issues endpoint returns PRs too — exclude them\n        issues.extend(i for i in batch if \"pull_request\" not in i)\n        if len(batch) < 100:\n            break\n        page += 1\n    print(f\"[github] fetched {len(issues)} issues across {page} page(s)\")\n    return issues\n\n\ndef load_issues(force: bool = False) -> list[dict]:\n    \"\"\"Return cached issues, refreshing from GitHub if cache is stale.\"\"\"\n    if not force and ISSUES_CACHE.exists():\n        data = json.loads(ISSUES_CACHE.read_text())\n        if time.time() - data[\"fetched_at\"] < ISSUES_CACHE_TTL:\n            return data[\"issues\"]\n    CACHE_DIR.mkdir(exist_ok=True)\n    issues = _fetch_all_issues()\n    ISSUES_CACHE.write_text(json.dumps({\"fetched_at\": time.time(), \"issues\": issues}))\n    return issues\n\n\n# ---------------------------------------------------------------------------\n# Date helpers\n# ---------------------------------------------------------------------------\n\ndef _parse(s: str | None) -> datetime | None:\n    if not s:\n        return None\n    return datetime.fromisoformat(s.replace(\"Z\", \"+00:00\"))\n\n\ndef _now() -> datetime:\n    return datetime.now(tz=timezone.utc)\n\n\n# ---------------------------------------------------------------------------\n# Filter helpers\n# ---------------------------------------------------------------------------\n\ndef _get_params() -> tuple[int, str, str, str]:\n    days = int(request.args.get(\"days\", 90))\n    state = request.args.get(\"state\", \"all\")   # open | closed | all\n    label = request.args.get(\"label\", \"All\")\n    milestone = request.args.get(\"milestone\", \"All\")\n    return days, state, label, milestone\n\n\ndef _apply_filters(\n    issues: list[dict],\n    state: str,\n    label: str,\n    milestone: str,\n) -> list[dict]:\n    out = issues\n    if state != \"all\":\n        out = [i for i in out if i[\"state\"] == state]\n    if label != \"All\":\n        out = [i for i in out if any(lb[\"name\"] == label for lb in i.get(\"labels\", []))]\n    if milestone != \"All\":\n        out = [i for i in out if i.get(\"milestone\") and i[\"milestone\"][\"title\"] == milestone]\n    return out\n\n\n# ---------------------------------------------------------------------------\n# Routes\n# ---------------------------------------------------------------------------\n\n@app.route(\"/\")\ndef index():\n    return render_template(\"index.html\")\n\n\n@app.route(\"/api/refresh\", methods=[\"POST\"])\ndef api_refresh():\n    load_issues(force=True)\n    if AI_THEMES_CACHE.exists():\n        AI_THEMES_CACHE.unlink()\n    return jsonify({\"ok\": True})\n\n\n@app.route(\"/api/filter-options\")\ndef api_filter_options():\n    issues = load_issues()\n    labels: dict[str, str] = {}\n    milestones: set[str] = set()\n    for issue in issues:\n        for lb in issue.get(\"labels\", []):\n            labels.setdefault(lb[\"name\"], lb.get(\"color\", \"888888\"))\n        ms = issue.get(\"milestone\")\n        if ms:\n            milestones.add(ms[\"title\"])\n    return jsonify({\n        \"labels\": [{\"name\": n, \"color\": c} for n, c in sorted(labels.items())],\n        \"milestones\": sorted(milestones),\n    })\n\n\n@app.route(\"/api/summary\")\ndef api_summary():\n    days, state, label, milestone = _get_params()\n    issues = load_issues()\n    cutoff = _now() - timedelta(days=days)\n\n    # \"Open count\" always reflects current open state (filtered by label/milestone only)\n    open_issues = _apply_filters(issues, \"open\", label, milestone)\n\n    # \"Opened / closed in period\" respects all filters\n    all_filtered = _apply_filters(issues, state if state != \"all\" else \"all\", label, milestone)\n\n    opened = [i for i in all_filtered if _parse(i[\"created_at\"]) and _parse(i[\"created_at\"]) >= cutoff]\n    closed_in_period = [\n        i for i in all_filtered\n        if i[\"state\"] == \"closed\" and _parse(i.get(\"closed_at\")) and _parse(i[\"closed_at\"]) >= cutoff\n    ]\n\n    close_times = []\n    for i in closed_in_period:\n        c = _parse(i[\"created_at\"])\n        cl = _parse(i[\"closed_at\"])\n        if c and cl:\n            close_times.append((cl - c).total_seconds() / 86400)\n    avg_close = round(sum(close_times) / len(close_times), 1) if close_times else None\n\n    no_response = [\n        i for i in open_issues\n        if i.get(\"comments\", 0) == 0 and not i.get(\"assignee\")\n    ]\n\n    return jsonify({\n        \"openCount\": len(open_issues),\n        \"openedInPeriod\": len(opened),\n        \"closedInPeriod\": len(closed_in_period),\n        \"avgDaysToClose\": avg_close,\n        \"noResponseCount\": len(no_response),\n    })\n\n\n@app.route(\"/api/trend\")\ndef api_trend():\n    days, _, label, milestone = _get_params()\n    issues = load_issues()\n    cutoff = _now() - timedelta(days=days)\n    filtered = _apply_filters(issues, \"all\", label, milestone)\n\n    use_weeks = days > 60\n    grain = timedelta(days=7 if use_weeks else 1)\n\n    # Build ordered bucket keys\n    buckets: dict[str, dict] = {}\n    ptr = cutoff.replace(hour=0, minute=0, second=0, microsecond=0)\n    end = _now().replace(hour=0, minute=0, second=0, microsecond=0)\n    while ptr <= end:\n        key = ptr.strftime(\"%Y-%m-%d\")\n        buckets[key] = {\"date\": key, \"opened\": 0, \"closed\": 0}\n        ptr += grain\n\n    def _bucket(dt: datetime) -> str:\n        if use_weeks:\n            delta_days = max(0, (dt - cutoff).days)\n            bucket_start = cutoff + timedelta(days=(delta_days // 7) * 7)\n            bucket_start = bucket_start.replace(hour=0, minute=0, second=0, microsecond=0)\n        else:\n            bucket_start = dt.replace(hour=0, minute=0, second=0, microsecond=0)\n        return bucket_start.strftime(\"%Y-%m-%d\")\n\n    for issue in filtered:\n        created = _parse(issue[\"created_at\"])\n        if created and created >= cutoff:\n            k = _bucket(created)\n            if k in buckets:\n                buckets[k][\"opened\"] += 1\n        if issue[\"state\"] == \"closed\":\n            closed_dt = _parse(issue.get(\"closed_at\"))\n            if closed_dt and closed_dt >= cutoff:\n                k = _bucket(closed_dt)\n                if k in buckets:\n                    buckets[k][\"closed\"] += 1\n\n    return jsonify(sorted(buckets.values(), key=lambda x: x[\"date\"]))\n\n\n@app.route(\"/api/labels\")\ndef api_labels():\n    _, state, _, milestone = _get_params()\n    issues = load_issues()\n    # Show label distribution across all labels (don't filter by label here)\n    filtered = _apply_filters(issues, state, \"All\", milestone)\n\n    counts: dict[str, dict] = {}\n    for issue in filtered:\n        for lb in issue.get(\"labels\", []):\n            name = lb[\"name\"]\n            counts.setdefault(name, {\"name\": name, \"color\": lb.get(\"color\", \"888888\"), \"count\": 0})\n            counts[name][\"count\"] += 1\n\n    result = sorted(counts.values(), key=lambda x: x[\"count\"], reverse=True)[:20]\n    return jsonify(result)\n\n\n@app.route(\"/api/age-buckets\")\ndef api_age_buckets():\n    _, _, label, milestone = _get_params()\n    issues = load_issues()\n    open_issues = _apply_filters(issues, \"open\", label, milestone)\n\n    buckets = {\n        \"< 7 days\": 0,\n        \"7–30 days\": 0,\n        \"1–3 months\": 0,\n        \"3–6 months\": 0,\n        \"> 6 months\": 0,\n    }\n    now = _now()\n    for issue in open_issues:\n        created = _parse(issue[\"created_at\"])\n        if not created:\n            continue\n        age = (now - created).days\n        if age < 7:\n            buckets[\"< 7 days\"] += 1\n        elif age < 30:\n            buckets[\"7–30 days\"] += 1\n        elif age < 90:\n            buckets[\"1–3 months\"] += 1\n        elif age < 180:\n            buckets[\"3–6 months\"] += 1\n        else:\n            buckets[\"> 6 months\"] += 1\n\n    return jsonify([{\"bucket\": k, \"count\": v} for k, v in buckets.items()])\n\n\n@app.route(\"/api/time-to-close\")\ndef api_time_to_close():\n    days, _, label, milestone = _get_params()\n    issues = load_issues()\n    cutoff = _now() - timedelta(days=days)\n\n    closed = [\n        i for i in issues\n        if i[\"state\"] == \"closed\"\n        and _parse(i.get(\"closed_at\")) is not None\n        and _parse(i[\"closed_at\"]) >= cutoff\n    ]\n    closed = _apply_filters(closed, \"closed\", label, milestone)\n\n    buckets = {\n        \"< 1 day\": 0,\n        \"1–7 days\": 0,\n        \"1–4 weeks\": 0,\n        \"1–3 months\": 0,\n        \"> 3 months\": 0,\n    }\n    for issue in closed:\n        created = _parse(issue[\"created_at\"])\n        closed_at = _parse(issue[\"closed_at\"])\n        if not created or not closed_at:\n            continue\n        age = (closed_at - created).total_seconds() / 86400\n        if age < 1:\n            buckets[\"< 1 day\"] += 1\n        elif age < 7:\n            buckets[\"1–7 days\"] += 1\n        elif age < 28:\n            buckets[\"1–4 weeks\"] += 1\n        elif age < 90:\n            buckets[\"1–3 months\"] += 1\n        else:\n            buckets[\"> 3 months\"] += 1\n\n    return jsonify([{\"bucket\": k, \"count\": v} for k, v in buckets.items()])\n\n\n@app.route(\"/api/milestones\")\ndef api_milestones():\n    _, state, label, _ = _get_params()\n    issues = load_issues()\n    if label != \"All\":\n        issues = [i for i in issues if any(lb[\"name\"] == label for lb in i.get(\"labels\", []))]\n    if state != \"all\":\n        issues = [i for i in issues if i[\"state\"] == state]\n\n    ms_data: dict[str, dict] = {}\n    for issue in issues:\n        ms = issue.get(\"milestone\")\n        if not ms:\n            continue\n        title = ms[\"title\"]\n        ms_data.setdefault(title, {\n            \"title\": title,\n            \"url\": ms.get(\"html_url\", \"\"),\n            \"open\": 0,\n            \"closed\": 0,\n        })\n        ms_data[title][issue[\"state\"]] = ms_data[title].get(issue[\"state\"], 0) + 1\n\n    result = sorted(ms_data.values(), key=lambda x: x[\"open\"] + x[\"closed\"], reverse=True)\n    return jsonify(result)\n\n\n@app.route(\"/api/attention\")\ndef api_attention():\n    _, _, label, milestone = _get_params()\n    issues = load_issues()\n    open_issues = _apply_filters(issues, \"open\", label, milestone)\n\n    now = _now()\n    stale_age_cutoff = now - timedelta(days=90)\n    stale_activity_cutoff = now - timedelta(days=30)\n\n    def _fmt(i: dict) -> dict:\n        created = _parse(i[\"created_at\"])\n        age_days = (now - created).days if created else 0\n        return {\n            \"number\": i[\"number\"],\n            \"title\": i[\"title\"],\n            \"url\": i[\"html_url\"],\n            \"age_days\": age_days,\n            \"comments\": i.get(\"comments\", 0),\n            \"labels\": [lb[\"name\"] for lb in i.get(\"labels\", [])],\n            \"assignee\": i[\"assignee\"][\"login\"] if i.get(\"assignee\") else None,\n            \"updated_at\": i.get(\"updated_at\"),\n        }\n\n    no_response = sorted(\n        [_fmt(i) for i in open_issues if i.get(\"comments\", 0) == 0 and not i.get(\"assignee\")],\n        key=lambda x: x[\"age_days\"],\n        reverse=True,\n    )[:30]\n\n    no_labels = sorted(\n        [_fmt(i) for i in open_issues if not i.get(\"labels\")],\n        key=lambda x: x[\"age_days\"],\n        reverse=True,\n    )[:30]\n\n    stale = sorted(\n        [\n            _fmt(i) for i in open_issues\n            if _parse(i[\"created_at\"]) and _parse(i[\"created_at\"]) <= stale_age_cutoff\n            and _parse(i.get(\"updated_at\") or i[\"created_at\"]) <= stale_activity_cutoff\n        ],\n        key=lambda x: x[\"age_days\"],\n        reverse=True,\n    )[:30]\n\n    return jsonify({\"noResponse\": no_response, \"noLabels\": no_labels, \"stale\": stale})\n\n\n@app.route(\"/api/details\")\ndef api_details():\n    _, state, label, milestone = _get_params()\n    page = int(request.args.get(\"page\", 1))\n    per_page = int(request.args.get(\"per_page\", 50))\n\n    issues = load_issues()\n    filtered = _apply_filters(issues, state, label, milestone)\n    # Sort by most recently updated\n    filtered = sorted(\n        filtered,\n        key=lambda i: i.get(\"updated_at\") or i[\"created_at\"],\n        reverse=True,\n    )\n\n    now = _now()\n    total = len(filtered)\n    start = (page - 1) * per_page\n    page_issues = filtered[start : start + per_page]\n\n    def _fmt(i: dict) -> dict:\n        created = _parse(i[\"created_at\"])\n        age_days = (now - created).days if created else 0\n        return {\n            \"number\": i[\"number\"],\n            \"title\": i[\"title\"],\n            \"url\": i[\"html_url\"],\n            \"state\": i[\"state\"],\n            \"created_at\": i[\"created_at\"],\n            \"age_days\": age_days,\n            \"comments\": i.get(\"comments\", 0),\n            \"labels\": [\n                {\"name\": lb[\"name\"], \"color\": lb.get(\"color\", \"888888\")}\n                for lb in i.get(\"labels\", [])\n            ],\n            \"assignee\": i[\"assignee\"][\"login\"] if i.get(\"assignee\") else None,\n            \"milestone\": i[\"milestone\"][\"title\"] if i.get(\"milestone\") else None,\n        }\n\n    return jsonify({\n        \"issues\": [_fmt(i) for i in page_issues],\n        \"total\": total,\n        \"page\": page,\n        \"per_page\": per_page,\n        \"pages\": max(1, (total + per_page - 1) // per_page),\n    })\n\n\n@app.route(\"/api/ai-themes\")\ndef api_ai_themes():\n    if not shutil.which(\"claude\"):\n        return jsonify({\"enabled\": False, \"reason\": \"claude CLI not found in PATH\"})\n\n    issues = load_issues()\n    open_issues = [i for i in issues if i[\"state\"] == \"open\"]\n    issue_count = len(open_issues)\n\n    # Return cached result if still fresh and issue count matches\n    if AI_THEMES_CACHE.exists():\n        cached = json.loads(AI_THEMES_CACHE.read_text())\n        if (\n            time.time() - cached[\"fetched_at\"] < AI_CACHE_TTL\n            and cached.get(\"issue_count\") == issue_count\n        ):\n            return jsonify({\"enabled\": True, \"themes\": cached[\"themes\"]})\n\n    # Build the prompt — cap at 80 issues to keep prompt size manageable\n    sample = open_issues[:80]\n    # Compact plain-text list is smaller than JSON and easier for the model\n    issue_lines = \"\\n\".join(f\"#{i['number']}: {i['title']}\" for i in sample)\n\n    prompt = (\n        f\"You are analyzing GitHub issues for the 'vscode-dbt-power-user' VS Code extension \"\n        f\"(a dbt development tool by Altimate AI).\\n\\n\"\n        f\"Here are {len(sample)} open issues:\\n\"\n        f\"{issue_lines}\\n\\n\"\n        f\"Group these issues into 8-12 meaningful themes based on their titles. \"\n        f\"Each theme should represent a distinct area of concern (bug category, feature area, etc.).\\n\\n\"\n        f\"Respond with ONLY valid JSON — no markdown fences, no explanation text. \"\n        f\"The output must be a JSON array where each element has exactly these keys:\\n\"\n        f'  \"theme\": short theme name (3-6 words),\\n'\n        f'  \"description\": one sentence describing what these issues share,\\n'\n        f'  \"issue_numbers\": array of integer issue numbers that belong to this theme.\\n\\n'\n        f\"Order themes from most issues to fewest.\"\n    )\n\n    try:\n        result = subprocess.run(\n            [\"claude\", \"--model\", \"haiku\", \"-p\", prompt],\n            capture_output=True,\n            text=True,\n            timeout=300,\n        )\n    except subprocess.TimeoutExpired:\n        return jsonify({\"enabled\": True, \"error\": \"Claude CLI timed out after 300s\", \"themes\": []})\n\n    if result.returncode != 0:\n        err = (result.stderr or result.stdout)[:300]\n        return jsonify({\"enabled\": True, \"error\": f\"claude CLI exited {result.returncode}: {err}\", \"themes\": []})\n\n    output = result.stdout.strip()\n\n    # Strip markdown code fences if Claude wrapped the JSON anyway\n    if output.startswith(\"```\"):\n        lines = output.splitlines()\n        # Drop first line (```json or ```) and last line (```)\n        inner = lines[1:-1] if lines[-1].strip() == \"```\" else lines[1:]\n        output = \"\\n\".join(inner).strip()\n\n    try:\n        themes = json.loads(output)\n    except json.JSONDecodeError as exc:\n        return jsonify({\"enabled\": True, \"error\": f\"JSON parse error: {exc}\", \"themes\": [], \"raw\": output[:500]})\n\n    # Enrich each theme with full issue details (title + URL)\n    issue_map = {i[\"number\"]: i[\"title\"] for i in sample}  # sample is still the list of dicts\n    for theme in themes:\n        numbers = theme.get(\"issue_numbers\", [])\n        theme[\"issues\"] = [\n            {\n                \"number\": n,\n                \"title\": issue_map.get(n, \"\"),\n                \"url\": f\"https://github.com/{REPO}/issues/{n}\",\n            }\n            for n in numbers[:10]  # cap at 10 representative issues per theme\n        ]\n\n    CACHE_DIR.mkdir(exist_ok=True)\n    AI_THEMES_CACHE.write_text(json.dumps({\n        \"fetched_at\": time.time(),\n        \"issue_count\": issue_count,\n        \"themes\": themes,\n    }))\n\n    return jsonify({\"enabled\": True, \"themes\": themes})\n\n\nif __name__ == \"__main__\":\n    app.run(debug=True, port=5051)\n"
  },
  {
    "path": "monitoring/github_issues/requirements.txt",
    "content": "flask>=3.0.0\nrequests>=2.31.0\n"
  },
  {
    "path": "monitoring/github_issues/templates/index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>GitHub Issues — dbt Power User</title>\n    <script src=\"https://cdn.jsdelivr.net/npm/chart.js@4.4.4/dist/chart.umd.min.js\"></script>\n    <style>\n      :root {\n        --bg-primary: #0d1117;\n        --bg-secondary: #161b22;\n        --bg-card: #21262d;\n        --border: #30363d;\n        --text-primary: #e6edf3;\n        --text-muted: #8b949e;\n        --accent-blue: #58a6ff;\n        --accent-green: #3fb950;\n        --accent-orange: #d29922;\n        --accent-red: #f85149;\n        --accent-purple: #bc8cff;\n      }\n\n      *,\n      *::before,\n      *::after {\n        box-sizing: border-box;\n        margin: 0;\n        padding: 0;\n      }\n\n      body {\n        background: var(--bg-primary);\n        color: var(--text-primary);\n        font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Helvetica,\n          Arial, sans-serif;\n        font-size: 14px;\n        line-height: 1.5;\n      }\n\n      /* ── Header ── */\n      .header {\n        background: var(--bg-secondary);\n        border-bottom: 1px solid var(--border);\n        padding: 14px 24px;\n        display: flex;\n        align-items: center;\n        gap: 20px;\n        flex-wrap: wrap;\n        position: sticky;\n        top: 0;\n        z-index: 10;\n      }\n      .header-title {\n        flex-shrink: 0;\n      }\n      .header-title h1 {\n        font-size: 17px;\n        font-weight: 600;\n      }\n      .header-title .sub {\n        color: var(--text-muted);\n        font-size: 12px;\n        margin-top: 1px;\n      }\n      .header-title .sub a {\n        color: var(--accent-blue);\n        text-decoration: none;\n      }\n\n      /* ── Filters ── */\n      .filters {\n        display: flex;\n        gap: 8px;\n        align-items: center;\n        flex-wrap: wrap;\n        flex: 1;\n      }\n      .filter-group {\n        display: flex;\n        align-items: center;\n        gap: 5px;\n      }\n      .filter-group label {\n        color: var(--text-muted);\n        font-size: 12px;\n        white-space: nowrap;\n      }\n      .filters select {\n        background: var(--bg-card);\n        border: 1px solid var(--border);\n        color: var(--text-primary);\n        padding: 5px 8px;\n        border-radius: 6px;\n        font-size: 13px;\n        cursor: pointer;\n        min-width: 130px;\n      }\n      .filters select:hover {\n        border-color: var(--accent-blue);\n      }\n      .btn {\n        padding: 5px 14px;\n        border-radius: 6px;\n        font-size: 13px;\n        cursor: pointer;\n        border: 1px solid var(--border);\n        background: var(--bg-card);\n        color: var(--text-primary);\n        white-space: nowrap;\n      }\n      .btn-primary {\n        background: var(--accent-blue);\n        color: #0d1117;\n        border-color: var(--accent-blue);\n        font-weight: 600;\n      }\n      .btn-primary:hover {\n        opacity: 0.88;\n      }\n      .btn:disabled {\n        opacity: 0.45;\n        cursor: default;\n      }\n      .cache-info {\n        color: var(--text-muted);\n        font-size: 11px;\n        margin-left: auto;\n        white-space: nowrap;\n      }\n\n      /* ── Main layout ── */\n      .main {\n        padding: 20px 24px;\n        max-width: 1440px;\n        margin: 0 auto;\n      }\n\n      /* ── Summary cards ── */\n      .cards {\n        display: grid;\n        grid-template-columns: repeat(5, 1fr);\n        gap: 12px;\n        margin-bottom: 20px;\n      }\n      @media (max-width: 1200px) {\n        .cards {\n          grid-template-columns: repeat(3, 1fr);\n        }\n      }\n      @media (max-width: 700px) {\n        .cards {\n          grid-template-columns: 1fr 1fr;\n        }\n      }\n\n      .card {\n        background: var(--bg-card);\n        border: 1px solid var(--border);\n        border-radius: 8px;\n        padding: 16px 18px;\n      }\n      .card .lbl {\n        color: var(--text-muted);\n        font-size: 12px;\n        margin-bottom: 6px;\n      }\n      .card .val {\n        font-size: 30px;\n        font-weight: 700;\n      }\n      .card .hint {\n        color: var(--text-muted);\n        font-size: 11px;\n        margin-top: 3px;\n      }\n      .card.red .val {\n        color: var(--accent-red);\n      }\n      .card.blue .val {\n        color: var(--accent-blue);\n      }\n      .card.green .val {\n        color: var(--accent-green);\n      }\n      .card.orange .val {\n        color: var(--accent-orange);\n      }\n\n      /* ── Sections ── */\n      .section {\n        background: var(--bg-card);\n        border: 1px solid var(--border);\n        border-radius: 8px;\n        padding: 18px 20px;\n        margin-bottom: 18px;\n      }\n      .section > h2 {\n        font-size: 14px;\n        font-weight: 600;\n        margin-bottom: 14px;\n        color: var(--text-primary);\n      }\n      .section > h2 .note {\n        color: var(--text-muted);\n        font-size: 12px;\n        font-weight: 400;\n        margin-left: 6px;\n      }\n\n      .two-col {\n        display: grid;\n        grid-template-columns: 1fr 1fr;\n        gap: 18px;\n      }\n      @media (max-width: 950px) {\n        .two-col {\n          grid-template-columns: 1fr;\n        }\n      }\n\n      /* ── Charts ── */\n      .chart-wrap {\n        position: relative;\n        height: 260px;\n      }\n      .chart-wrap-tall {\n        position: relative;\n        height: 300px;\n      }\n      .chart-wrap-short {\n        position: relative;\n        height: 220px;\n      }\n\n      /* ── Tables ── */\n      .tbl-scroll {\n        overflow-x: auto;\n      }\n      .tbl-container {\n        max-height: 380px;\n        overflow-y: auto;\n      }\n      table {\n        width: 100%;\n        border-collapse: collapse;\n        font-size: 13px;\n      }\n      thead th {\n        background: var(--bg-secondary);\n        color: var(--text-muted);\n        font-weight: 500;\n        padding: 8px 12px;\n        text-align: left;\n        border-bottom: 1px solid var(--border);\n        position: sticky;\n        top: 0;\n        z-index: 1;\n      }\n      tbody td {\n        padding: 7px 12px;\n        border-bottom: 1px solid var(--border);\n        vertical-align: middle;\n      }\n      tbody tr:last-child td {\n        border-bottom: none;\n      }\n      tbody tr:hover td {\n        background: rgba(255, 255, 255, 0.025);\n      }\n\n      /* ── Labels ── */\n      .badge {\n        display: inline-block;\n        padding: 1px 8px;\n        border-radius: 12px;\n        font-size: 11px;\n        font-weight: 500;\n        margin: 1px 2px 1px 0;\n        white-space: nowrap;\n      }\n      .badge-open {\n        background: rgba(63, 185, 80, 0.12);\n        color: var(--accent-green);\n        border: 1px solid rgba(63, 185, 80, 0.3);\n      }\n      .badge-closed {\n        background: rgba(248, 81, 73, 0.1);\n        color: var(--accent-red);\n        border: 1px solid rgba(248, 81, 73, 0.25);\n      }\n\n      /* ── Attention tabs ── */\n      .tab-bar {\n        display: flex;\n        gap: 4px;\n        margin-bottom: 12px;\n        border-bottom: 1px solid var(--border);\n        padding-bottom: 10px;\n      }\n      .tab-btn {\n        background: transparent;\n        border: 1px solid var(--border);\n        color: var(--text-muted);\n        padding: 5px 14px;\n        border-radius: 6px;\n        cursor: pointer;\n        font-size: 13px;\n      }\n      .tab-btn:hover {\n        border-color: var(--accent-blue);\n        color: var(--text-primary);\n      }\n      .tab-btn.active {\n        background: var(--accent-blue);\n        color: #0d1117;\n        border-color: var(--accent-blue);\n        font-weight: 600;\n      }\n      .tab-panel {\n        display: none;\n      }\n      .tab-panel.active {\n        display: block;\n      }\n\n      /* ── AI themes ── */\n      .themes-grid {\n        display: grid;\n        grid-template-columns: repeat(auto-fill, minmax(290px, 1fr));\n        gap: 12px;\n      }\n      .theme-card {\n        background: var(--bg-secondary);\n        border: 1px solid var(--border);\n        border-radius: 8px;\n        padding: 14px;\n      }\n      .theme-card h3 {\n        font-size: 13px;\n        font-weight: 600;\n        color: var(--accent-blue);\n        margin-bottom: 5px;\n      }\n      .theme-card .desc {\n        color: var(--text-muted);\n        font-size: 12px;\n        margin-bottom: 8px;\n        line-height: 1.4;\n      }\n      .theme-card .count {\n        color: var(--text-muted);\n        font-size: 11px;\n        margin-bottom: 8px;\n      }\n      .theme-issues {\n        list-style: none;\n      }\n      .theme-issues li {\n        font-size: 12px;\n        padding: 2px 0;\n        overflow: hidden;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n      }\n      .theme-issues a {\n        color: var(--text-primary);\n        text-decoration: none;\n      }\n      .theme-issues a:hover {\n        color: var(--accent-blue);\n      }\n      .theme-issues .num {\n        color: var(--text-muted);\n        margin-right: 3px;\n      }\n      .ai-notice {\n        background: var(--bg-secondary);\n        border: 1px solid var(--border);\n        border-radius: 8px;\n        padding: 24px;\n        text-align: center;\n        color: var(--text-muted);\n      }\n      .ai-notice code {\n        background: var(--bg-primary);\n        padding: 1px 6px;\n        border-radius: 4px;\n        font-family: monospace;\n        color: var(--text-primary);\n      }\n      .ai-notice p + p {\n        margin-top: 8px;\n      }\n\n      /* ── Pagination ── */\n      .pagination {\n        display: flex;\n        gap: 6px;\n        align-items: center;\n        justify-content: center;\n        margin-top: 14px;\n        flex-wrap: wrap;\n      }\n      .pagination button {\n        background: var(--bg-secondary);\n        border: 1px solid var(--border);\n        color: var(--text-primary);\n        padding: 4px 12px;\n        border-radius: 6px;\n        cursor: pointer;\n        font-size: 13px;\n      }\n      .pagination button:disabled {\n        opacity: 0.35;\n        cursor: default;\n      }\n      .pagination button.active {\n        background: var(--accent-blue);\n        color: #0d1117;\n        border-color: var(--accent-blue);\n        font-weight: 600;\n      }\n      .pagination .pg-info {\n        color: var(--text-muted);\n        font-size: 12px;\n      }\n\n      /* ── Progress bar ── */\n      .progress-wrap {\n        width: 100px;\n        height: 7px;\n        background: var(--bg-primary);\n        border-radius: 4px;\n        overflow: hidden;\n        display: inline-block;\n        vertical-align: middle;\n      }\n      .progress-fill {\n        height: 100%;\n        background: var(--accent-green);\n        border-radius: 4px;\n      }\n\n      /* ── Misc ── */\n      .loading {\n        color: var(--text-muted);\n        font-size: 13px;\n        padding: 18px 0;\n        text-align: center;\n      }\n      .error-msg {\n        color: var(--accent-red);\n        font-size: 13px;\n        padding: 6px 0;\n      }\n      a.link {\n        color: var(--accent-blue);\n        text-decoration: none;\n      }\n      a.link:hover {\n        text-decoration: underline;\n      }\n      a.row-link {\n        color: var(--text-primary);\n        text-decoration: none;\n      }\n      a.row-link:hover {\n        color: var(--accent-blue);\n      }\n      .num-muted {\n        color: var(--text-muted);\n        font-size: 12px;\n      }\n    </style>\n  </head>\n  <body>\n    <!-- ═══════════════════════════════════════════════ HEADER ══ -->\n    <div class=\"header\">\n      <div class=\"header-title\">\n        <h1>GitHub Issues Dashboard</h1>\n        <div class=\"sub\">\n          <a\n            href=\"https://github.com/AltimateAI/vscode-dbt-power-user\"\n            target=\"_blank\"\n          >\n            AltimateAI/vscode-dbt-power-user\n          </a>\n        </div>\n      </div>\n\n      <div class=\"filters\">\n        <div class=\"filter-group\">\n          <label>Period</label>\n          <select id=\"f-days\" onchange=\"onFilterChange()\">\n            <option value=\"30\">Last 30 days</option>\n            <option value=\"90\" selected>Last 90 days</option>\n            <option value=\"180\">Last 180 days</option>\n            <option value=\"365\">Last year</option>\n          </select>\n        </div>\n        <div class=\"filter-group\">\n          <label>State</label>\n          <select id=\"f-state\" onchange=\"onFilterChange()\">\n            <option value=\"all\">All</option>\n            <option value=\"open\">Open</option>\n            <option value=\"closed\">Closed</option>\n          </select>\n        </div>\n        <div class=\"filter-group\">\n          <label>Label</label>\n          <select id=\"f-label\" onchange=\"onFilterChange()\">\n            <option value=\"All\">All labels</option>\n          </select>\n        </div>\n        <div class=\"filter-group\">\n          <label>Milestone</label>\n          <select id=\"f-milestone\" onchange=\"onFilterChange()\">\n            <option value=\"All\">All milestones</option>\n          </select>\n        </div>\n        <button\n          class=\"btn btn-primary\"\n          id=\"btn-refresh\"\n          onclick=\"refreshData()\"\n        >\n          ↻ Refresh Data\n        </button>\n      </div>\n      <div class=\"cache-info\" id=\"cache-info\"></div>\n    </div>\n\n    <!-- ═══════════════════════════════════════════════ MAIN ══ -->\n    <div class=\"main\">\n      <!-- Summary cards -->\n      <div class=\"cards\">\n        <div class=\"card red\">\n          <div class=\"lbl\">Open Issues</div>\n          <div class=\"val\" id=\"c-open\">–</div>\n          <div class=\"hint\">currently open</div>\n        </div>\n        <div class=\"card blue\">\n          <div class=\"lbl\">Opened in Period</div>\n          <div class=\"val\" id=\"c-opened\">–</div>\n          <div class=\"hint\">new issues</div>\n        </div>\n        <div class=\"card green\">\n          <div class=\"lbl\">Closed in Period</div>\n          <div class=\"val\" id=\"c-closed\">–</div>\n          <div class=\"hint\">resolved</div>\n        </div>\n        <div class=\"card orange\">\n          <div class=\"lbl\">Avg Days to Close</div>\n          <div class=\"val\" id=\"c-avg-close\">–</div>\n          <div class=\"hint\">mean close time</div>\n        </div>\n        <div class=\"card\">\n          <div class=\"lbl\">No Response</div>\n          <div class=\"val\" id=\"c-no-response\">–</div>\n          <div class=\"hint\">open, 0 comments, unassigned</div>\n        </div>\n      </div>\n\n      <!-- Issue trend -->\n      <div class=\"section\">\n        <h2>Issue Trend</h2>\n        <div class=\"chart-wrap-tall\"><canvas id=\"chart-trend\"></canvas></div>\n        <div id=\"err-trend\" class=\"error-msg\"></div>\n      </div>\n\n      <!-- Labels + Age buckets -->\n      <div class=\"two-col\">\n        <div class=\"section\">\n          <h2>Top Labels</h2>\n          <div class=\"chart-wrap\"><canvas id=\"chart-labels\"></canvas></div>\n          <div id=\"err-labels\" class=\"error-msg\"></div>\n        </div>\n        <div class=\"section\">\n          <h2>Open Issue Age Distribution</h2>\n          <div class=\"chart-wrap\"><canvas id=\"chart-age\"></canvas></div>\n          <div id=\"err-age\" class=\"error-msg\"></div>\n        </div>\n      </div>\n\n      <!-- Time to close + Milestones -->\n      <div class=\"two-col\">\n        <div class=\"section\">\n          <h2>Time to Close Distribution</h2>\n          <div class=\"chart-wrap\"><canvas id=\"chart-ttc\"></canvas></div>\n          <div id=\"err-ttc\" class=\"error-msg\"></div>\n        </div>\n        <div class=\"section\">\n          <h2>Milestone Progress</h2>\n          <div class=\"tbl-container\">\n            <table>\n              <thead>\n                <tr>\n                  <th>Milestone</th>\n                  <th style=\"text-align: right\">Open</th>\n                  <th style=\"text-align: right\">Closed</th>\n                  <th>Progress</th>\n                </tr>\n              </thead>\n              <tbody id=\"tbl-milestones\"></tbody>\n            </table>\n          </div>\n          <div id=\"load-milestones\" class=\"loading\">Loading…</div>\n          <div id=\"err-milestones\" class=\"error-msg\"></div>\n        </div>\n      </div>\n\n      <!-- Issues needing attention -->\n      <div class=\"section\">\n        <h2>Issues Needing Attention</h2>\n        <div class=\"tab-bar\">\n          <button class=\"tab-btn active\" onclick=\"showTab('no-response', this)\">\n            No Response <span id=\"cnt-no-response\"></span>\n          </button>\n          <button class=\"tab-btn\" onclick=\"showTab('no-labels', this)\">\n            No Labels <span id=\"cnt-no-labels\"></span>\n          </button>\n          <button class=\"tab-btn\" onclick=\"showTab('stale', this)\">\n            Stale &gt;90 days <span id=\"cnt-stale\"></span>\n          </button>\n        </div>\n\n        <div id=\"panel-no-response\" class=\"tab-panel active\">\n          <div class=\"tbl-scroll\">\n            <table>\n              <thead>\n                <tr>\n                  <th>#</th>\n                  <th>Title</th>\n                  <th>Age</th>\n                  <th>Labels</th>\n                </tr>\n              </thead>\n              <tbody id=\"tbl-no-response\"></tbody>\n            </table>\n          </div>\n        </div>\n        <div id=\"panel-no-labels\" class=\"tab-panel\">\n          <div class=\"tbl-scroll\">\n            <table>\n              <thead>\n                <tr>\n                  <th>#</th>\n                  <th>Title</th>\n                  <th>Age</th>\n                  <th>Comments</th>\n                </tr>\n              </thead>\n              <tbody id=\"tbl-no-labels\"></tbody>\n            </table>\n          </div>\n        </div>\n        <div id=\"panel-stale\" class=\"tab-panel\">\n          <div class=\"tbl-scroll\">\n            <table>\n              <thead>\n                <tr>\n                  <th>#</th>\n                  <th>Title</th>\n                  <th>Age</th>\n                  <th>Labels</th>\n                </tr>\n              </thead>\n              <tbody id=\"tbl-stale\"></tbody>\n            </table>\n          </div>\n        </div>\n        <div id=\"load-attention\" class=\"loading\">Loading…</div>\n        <div id=\"err-attention\" class=\"error-msg\"></div>\n      </div>\n\n      <!-- AI theme clusters -->\n      <div class=\"section\" id=\"ai-section\">\n        <h2>\n          AI Theme Clusters\n          <span class=\"note\">(Claude analysis of open issues)</span>\n        </h2>\n        <div id=\"ai-content\">\n          <div class=\"loading\">\n            Analyzing with Claude… this may take 30–60 s on first run\n          </div>\n        </div>\n      </div>\n\n      <!-- Issue details -->\n      <div class=\"section\">\n        <h2>Issue Details</h2>\n        <div class=\"tbl-scroll\">\n          <table>\n            <thead>\n              <tr>\n                <th>#</th>\n                <th>Title</th>\n                <th>State</th>\n                <th>Labels</th>\n                <th>Opened</th>\n                <th>Age</th>\n                <th style=\"text-align: right\">Comments</th>\n                <th>Assignee</th>\n                <th>Milestone</th>\n              </tr>\n            </thead>\n            <tbody id=\"tbl-details\"></tbody>\n          </table>\n        </div>\n        <div id=\"load-details\" class=\"loading\">Loading…</div>\n        <div id=\"err-details\" class=\"error-msg\"></div>\n        <div class=\"pagination\" id=\"details-pagination\"></div>\n      </div>\n    </div>\n    <!-- /main -->\n\n    <script>\n      // ─────────────────────────────────────────────────────────────────\n      // State\n      // ─────────────────────────────────────────────────────────────────\n      const charts = {};\n      let detailsPage = 1;\n\n      // ─────────────────────────────────────────────────────────────────\n      // Utilities\n      // ─────────────────────────────────────────────────────────────────\n      function esc(s) {\n        return String(s ?? \"\")\n          .replace(/&/g, \"&amp;\")\n          .replace(/</g, \"&lt;\")\n          .replace(/>/g, \"&gt;\")\n          .replace(/\"/g, \"&quot;\");\n      }\n\n      function formatAge(days) {\n        if (days < 1) return \"< 1d\";\n        if (days < 7) return days + \"d\";\n        if (days < 30) return Math.round(days / 7) + \"w\";\n        if (days < 365) return Math.round(days / 30) + \"mo\";\n        return (days / 365).toFixed(1) + \"y\";\n      }\n\n      function fmtDate(iso) {\n        return iso ? iso.slice(0, 10) : \"\";\n      }\n\n      function setEl(id, html) {\n        const el = document.getElementById(id);\n        if (el) el.innerHTML = html;\n      }\n\n      function setText(id, txt) {\n        const el = document.getElementById(id);\n        if (el) el.textContent = txt;\n      }\n\n      function showEl(id, show) {\n        const el = document.getElementById(id);\n        if (el) el.style.display = show ? \"\" : \"none\";\n      }\n\n      function setErr(id, msg) {\n        const el = document.getElementById(id);\n        if (el) el.textContent = msg || \"\";\n      }\n\n      function destroyChart(key) {\n        if (charts[key]) {\n          charts[key].destroy();\n          delete charts[key];\n        }\n      }\n\n      function labelBadge(lb) {\n        const c = lb.color || \"888888\";\n        return `<span class=\"badge\" style=\"background:#${esc(c)}22;color:#${esc(c)};border:1px solid #${esc(c)}44;\">${esc(lb.name)}</span>`;\n      }\n\n      // ─────────────────────────────────────────────────────────────────\n      // Filters\n      // ─────────────────────────────────────────────────────────────────\n      function getFilters(extra = {}) {\n        const p = new URLSearchParams({\n          days: document.getElementById(\"f-days\").value,\n          state: document.getElementById(\"f-state\").value,\n          label: document.getElementById(\"f-label\").value,\n          milestone: document.getElementById(\"f-milestone\").value,\n          ...extra,\n        });\n        return p;\n      }\n\n      async function apiFetch(path, extra = {}) {\n        const resp = await fetch(`${path}?${getFilters(extra)}`);\n        if (!resp.ok) throw new Error(`HTTP ${resp.status}`);\n        return resp.json();\n      }\n\n      // ─────────────────────────────────────────────────────────────────\n      // Chart defaults\n      // ─────────────────────────────────────────────────────────────────\n      function chartDefaults(extra = {}) {\n        return {\n          responsive: true,\n          maintainAspectRatio: false,\n          animation: { duration: 200 },\n          plugins: {\n            legend: {\n              labels: { color: \"#8b949e\", font: { size: 12 }, boxWidth: 14 },\n            },\n            tooltip: {\n              backgroundColor: \"#21262d\",\n              borderColor: \"#30363d\",\n              borderWidth: 1,\n              titleColor: \"#e6edf3\",\n              bodyColor: \"#8b949e\",\n            },\n          },\n          scales: {\n            x: {\n              ticks: {\n                color: \"#8b949e\",\n                font: { size: 11 },\n                maxTicksLimit: 14,\n              },\n              grid: { color: \"rgba(48,54,61,0.5)\" },\n              ...extra.x,\n            },\n            y: {\n              ticks: { color: \"#8b949e\", font: { size: 11 } },\n              grid: { color: \"rgba(48,54,61,0.5)\" },\n              beginAtZero: true,\n              ...extra.y,\n            },\n          },\n          ...extra.chartLevel,\n        };\n      }\n\n      // ─────────────────────────────────────────────────────────────────\n      // Filter options (labels + milestones dropdowns)\n      // ─────────────────────────────────────────────────────────────────\n      async function loadFilterOptions() {\n        try {\n          const data = await fetch(\"/api/filter-options\").then((r) => r.json());\n\n          const labelSel = document.getElementById(\"f-label\");\n          const prevLabel = labelSel.value;\n          while (labelSel.options.length > 1) labelSel.remove(1);\n          data.labels.forEach((lb) =>\n            labelSel.add(new Option(lb.name, lb.name)),\n          );\n          if (prevLabel !== \"All\") labelSel.value = prevLabel;\n\n          const msSel = document.getElementById(\"f-milestone\");\n          const prevMs = msSel.value;\n          while (msSel.options.length > 1) msSel.remove(1);\n          data.milestones.forEach((ms) => msSel.add(new Option(ms, ms)));\n          if (prevMs !== \"All\") msSel.value = prevMs;\n        } catch (e) {\n          console.error(\"filter-options error\", e);\n        }\n      }\n\n      // ─────────────────────────────────────────────────────────────────\n      // Summary cards\n      // ─────────────────────────────────────────────────────────────────\n      async function loadSummary() {\n        try {\n          const d = await apiFetch(\"/api/summary\");\n          setText(\"c-open\", d.openCount.toLocaleString());\n          setText(\"c-opened\", d.openedInPeriod.toLocaleString());\n          setText(\"c-closed\", d.closedInPeriod.toLocaleString());\n          setText(\n            \"c-avg-close\",\n            d.avgDaysToClose != null ? `${d.avgDaysToClose}d` : \"–\",\n          );\n          setText(\"c-no-response\", d.noResponseCount.toLocaleString());\n        } catch (e) {\n          console.error(\"summary error\", e);\n        }\n      }\n\n      // ─────────────────────────────────────────────────────────────────\n      // Trend\n      // ─────────────────────────────────────────────────────────────────\n      async function loadTrend() {\n        setErr(\"err-trend\", \"\");\n        try {\n          const rows = await apiFetch(\"/api/trend\");\n          destroyChart(\"trend\");\n          const ctx = document.getElementById(\"chart-trend\").getContext(\"2d\");\n          charts[\"trend\"] = new Chart(ctx, {\n            type: \"line\",\n            data: {\n              labels: rows.map((r) => r.date),\n              datasets: [\n                {\n                  label: \"Opened\",\n                  data: rows.map((r) => r.opened),\n                  borderColor: \"#f85149\",\n                  backgroundColor: \"rgba(248,81,73,0.08)\",\n                  fill: true,\n                  tension: 0.35,\n                  pointRadius: rows.length > 90 ? 0 : 3,\n                  borderWidth: 2,\n                },\n                {\n                  label: \"Closed\",\n                  data: rows.map((r) => r.closed),\n                  borderColor: \"#3fb950\",\n                  backgroundColor: \"rgba(63,185,80,0.08)\",\n                  fill: true,\n                  tension: 0.35,\n                  pointRadius: rows.length > 90 ? 0 : 3,\n                  borderWidth: 2,\n                },\n              ],\n            },\n            options: chartDefaults(),\n          });\n        } catch (e) {\n          setErr(\"err-trend\", `Failed to load: ${e.message}`);\n        }\n      }\n\n      // ─────────────────────────────────────────────────────────────────\n      // Labels\n      // ─────────────────────────────────────────────────────────────────\n      async function loadLabels() {\n        setErr(\"err-labels\", \"\");\n        try {\n          const rows = await apiFetch(\"/api/labels\");\n          destroyChart(\"labels\");\n          const ctx = document.getElementById(\"chart-labels\").getContext(\"2d\");\n          charts[\"labels\"] = new Chart(ctx, {\n            type: \"bar\",\n            data: {\n              labels: rows.map((r) => r.name),\n              datasets: [\n                {\n                  data: rows.map((r) => r.count),\n                  backgroundColor: rows.map((r) => `#${r.color}55`),\n                  borderColor: rows.map((r) => `#${r.color}`),\n                  borderWidth: 1,\n                },\n              ],\n            },\n            options: {\n              ...chartDefaults({ chartLevel: { indexAxis: \"y\" } }),\n              plugins: {\n                legend: { display: false },\n                tooltip: chartDefaults().plugins.tooltip,\n              },\n            },\n          });\n        } catch (e) {\n          setErr(\"err-labels\", `Failed to load: ${e.message}`);\n        }\n      }\n\n      // ─────────────────────────────────────────────────────────────────\n      // Age buckets\n      // ─────────────────────────────────────────────────────────────────\n      async function loadAgeBuckets() {\n        setErr(\"err-age\", \"\");\n        try {\n          const rows = await apiFetch(\"/api/age-buckets\");\n          destroyChart(\"age\");\n          const ctx = document.getElementById(\"chart-age\").getContext(\"2d\");\n          const palette = [\n            \"#3fb95099\",\n            \"#58a6ff99\",\n            \"#d2992299\",\n            \"#f8514999\",\n            \"#bc8cff99\",\n          ];\n          const paletteBorder = [\n            \"#3fb950\",\n            \"#58a6ff\",\n            \"#d29922\",\n            \"#f85149\",\n            \"#bc8cff\",\n          ];\n          charts[\"age\"] = new Chart(ctx, {\n            type: \"bar\",\n            data: {\n              labels: rows.map((r) => r.bucket),\n              datasets: [\n                {\n                  label: \"Open issues\",\n                  data: rows.map((r) => r.count),\n                  backgroundColor: palette,\n                  borderColor: paletteBorder,\n                  borderWidth: 1,\n                },\n              ],\n            },\n            options: {\n              ...chartDefaults(),\n              plugins: {\n                legend: { display: false },\n                tooltip: chartDefaults().plugins.tooltip,\n              },\n            },\n          });\n        } catch (e) {\n          setErr(\"err-age\", `Failed to load: ${e.message}`);\n        }\n      }\n\n      // ─────────────────────────────────────────────────────────────────\n      // Time to close\n      // ─────────────────────────────────────────────────────────────────\n      async function loadTimeToClose() {\n        setErr(\"err-ttc\", \"\");\n        try {\n          const rows = await apiFetch(\"/api/time-to-close\");\n          destroyChart(\"ttc\");\n          const ctx = document.getElementById(\"chart-ttc\").getContext(\"2d\");\n          charts[\"ttc\"] = new Chart(ctx, {\n            type: \"bar\",\n            data: {\n              labels: rows.map((r) => r.bucket),\n              datasets: [\n                {\n                  label: \"Closed issues\",\n                  data: rows.map((r) => r.count),\n                  backgroundColor: \"#58a6ff66\",\n                  borderColor: \"#58a6ff\",\n                  borderWidth: 1,\n                },\n              ],\n            },\n            options: {\n              ...chartDefaults(),\n              plugins: {\n                legend: { display: false },\n                tooltip: chartDefaults().plugins.tooltip,\n              },\n            },\n          });\n        } catch (e) {\n          setErr(\"err-ttc\", `Failed to load: ${e.message}`);\n        }\n      }\n\n      // ─────────────────────────────────────────────────────────────────\n      // Milestones\n      // ─────────────────────────────────────────────────────────────────\n      async function loadMilestones() {\n        showEl(\"load-milestones\", true);\n        setErr(\"err-milestones\", \"\");\n        const tbody = document.getElementById(\"tbl-milestones\");\n        tbody.innerHTML = \"\";\n        try {\n          const rows = await apiFetch(\"/api/milestones\");\n          showEl(\"load-milestones\", false);\n          if (!rows.length) {\n            tbody.innerHTML =\n              '<tr><td colspan=\"4\" style=\"color:var(--text-muted);text-align:center;padding:20px\">No milestones found</td></tr>';\n            return;\n          }\n          tbody.innerHTML = rows\n            .map((ms) => {\n              const total = ms.open + ms.closed;\n              const pct = total > 0 ? Math.round((ms.closed / total) * 100) : 0;\n              return `<tr>\n        <td><a class=\"link\" href=\"${esc(ms.url)}\" target=\"_blank\">${esc(ms.title)}</a></td>\n        <td style=\"text-align:right;color:var(--accent-red);\">${ms.open}</td>\n        <td style=\"text-align:right;color:var(--accent-green);\">${ms.closed}</td>\n        <td>\n          <div style=\"display:flex;align-items:center;gap:8px;\">\n            <div class=\"progress-wrap\"><div class=\"progress-fill\" style=\"width:${pct}%\"></div></div>\n            <span style=\"color:var(--text-muted);font-size:12px;\">${pct}%</span>\n          </div>\n        </td>\n      </tr>`;\n            })\n            .join(\"\");\n        } catch (e) {\n          showEl(\"load-milestones\", false);\n          setErr(\"err-milestones\", `Failed to load: ${e.message}`);\n        }\n      }\n\n      // ─────────────────────────────────────────────────────────────────\n      // Attention tables\n      // ─────────────────────────────────────────────────────────────────\n      async function loadAttention() {\n        showEl(\"load-attention\", true);\n        setErr(\"err-attention\", \"\");\n        try {\n          const d = await apiFetch(\"/api/attention\");\n          showEl(\"load-attention\", false);\n\n          // Update tab count badges\n          setText(\n            \"cnt-no-response\",\n            d.noResponse.length ? `(${d.noResponse.length})` : \"\",\n          );\n          setText(\n            \"cnt-no-labels\",\n            d.noLabels.length ? `(${d.noLabels.length})` : \"\",\n          );\n          setText(\"cnt-stale\", d.stale.length ? `(${d.stale.length})` : \"\");\n\n          _fillAttentionTable(\"tbl-no-response\", d.noResponse, (r) => [\n            `<span class=\"num-muted\">#${r.number}</span>`,\n            `<a class=\"row-link\" href=\"${esc(r.url)}\" target=\"_blank\">${esc(r.title)}</a>`,\n            formatAge(r.age_days),\n            r.labels.length\n              ? r.labels\n                  .map(\n                    (l) =>\n                      `<span class=\"badge\" style=\"background:rgba(88,166,255,.12);color:#58a6ff;border:1px solid rgba(88,166,255,.3);\">${esc(l)}</span>`,\n                  )\n                  .join(\"\")\n              : '<span style=\"color:var(--text-muted)\">–</span>',\n          ]);\n\n          _fillAttentionTable(\"tbl-no-labels\", d.noLabels, (r) => [\n            `<span class=\"num-muted\">#${r.number}</span>`,\n            `<a class=\"row-link\" href=\"${esc(r.url)}\" target=\"_blank\">${esc(r.title)}</a>`,\n            formatAge(r.age_days),\n            r.comments,\n          ]);\n\n          _fillAttentionTable(\"tbl-stale\", d.stale, (r) => [\n            `<span class=\"num-muted\">#${r.number}</span>`,\n            `<a class=\"row-link\" href=\"${esc(r.url)}\" target=\"_blank\">${esc(r.title)}</a>`,\n            formatAge(r.age_days),\n            r.labels.length\n              ? r.labels\n                  .map(\n                    (l) =>\n                      `<span class=\"badge\" style=\"background:rgba(88,166,255,.12);color:#58a6ff;border:1px solid rgba(88,166,255,.3);\">${esc(l)}</span>`,\n                  )\n                  .join(\"\")\n              : '<span style=\"color:var(--text-muted)\">–</span>',\n          ]);\n        } catch (e) {\n          showEl(\"load-attention\", false);\n          setErr(\"err-attention\", `Failed to load: ${e.message}`);\n        }\n      }\n\n      function _fillAttentionTable(tbodyId, rows, cellsFn) {\n        const tbody = document.getElementById(tbodyId);\n        if (!rows.length) {\n          const cols = tbodyId === \"tbl-no-labels\" ? 4 : 4;\n          tbody.innerHTML = `<tr><td colspan=\"${cols}\" style=\"color:var(--accent-green);text-align:center;padding:16px;\">✓ None found</td></tr>`;\n          return;\n        }\n        tbody.innerHTML = rows\n          .map(\n            (r) =>\n              `<tr>${cellsFn(r)\n                .map((c) => `<td>${c}</td>`)\n                .join(\"\")}</tr>`,\n          )\n          .join(\"\");\n      }\n\n      function showTab(name, btn) {\n        document\n          .querySelectorAll(\".tab-btn\")\n          .forEach((b) => b.classList.remove(\"active\"));\n        document\n          .querySelectorAll(\".tab-panel\")\n          .forEach((p) => p.classList.remove(\"active\"));\n        if (btn) btn.classList.add(\"active\");\n        const panel = document.getElementById(`panel-${name}`);\n        if (panel) panel.classList.add(\"active\");\n      }\n\n      // ─────────────────────────────────────────────────────────────────\n      // AI Themes\n      // ─────────────────────────────────────────────────────────────────\n      async function loadAIThemes() {\n        const container = document.getElementById(\"ai-content\");\n        container.innerHTML =\n          '<div class=\"loading\">Analyzing open issues with Claude… (may take 30–60 s on first run)</div>';\n        try {\n          const d = await fetch(\"/api/ai-themes\").then((r) => r.json());\n\n          if (!d.enabled) {\n            container.innerHTML = `<div class=\"ai-notice\">\n        <p>AI analysis requires the <code>claude</code> CLI to be in your PATH.</p>\n        <p style=\"font-size:12px;margin-top:8px;\">\n          Install Claude Code: <code>npm install -g @anthropic-ai/claude-code</code><br/>\n          Then re-run the dashboard. Uses your existing Claude Code Max auth — no API key needed.\n        </p>\n      </div>`;\n            return;\n          }\n\n          if (d.error) {\n            container.innerHTML = `<div class=\"error-msg\">Claude error: ${esc(d.error)}</div>`;\n            return;\n          }\n\n          if (!d.themes || !d.themes.length) {\n            container.innerHTML =\n              '<div style=\"color:var(--text-muted);padding:12px\">No themes returned by Claude.</div>';\n            return;\n          }\n\n          container.innerHTML = `<div class=\"themes-grid\">${d.themes\n            .map((t) => {\n              const count = (t.issue_numbers || t.issues || []).length;\n              const issues = (t.issues || []).slice(0, 6);\n              return `<div class=\"theme-card\">\n        <h3>${esc(t.theme)}</h3>\n        <div class=\"desc\">${esc(t.description)}</div>\n        <div class=\"count\">${count} issue${count !== 1 ? \"s\" : \"\"}</div>\n        <ul class=\"theme-issues\">\n          ${issues\n            .map(\n              (i) => `\n            <li>\n              <a href=\"${esc(i.url)}\" target=\"_blank\">\n                <span class=\"num\">#${i.number}</span>${esc(i.title)}\n              </a>\n            </li>`,\n            )\n            .join(\"\")}\n          ${count > 6 ? `<li style=\"color:var(--text-muted);font-size:11px;\">+${count - 6} more</li>` : \"\"}\n        </ul>\n      </div>`;\n            })\n            .join(\"\")}</div>`;\n        } catch (e) {\n          container.innerHTML = `<div class=\"error-msg\">Failed to load AI themes: ${esc(e.message)}</div>`;\n        }\n      }\n\n      // ─────────────────────────────────────────────────────────────────\n      // Issue details table\n      // ─────────────────────────────────────────────────────────────────\n      async function loadDetails(page = 1) {\n        detailsPage = page;\n        showEl(\"load-details\", true);\n        setErr(\"err-details\", \"\");\n        document.getElementById(\"tbl-details\").innerHTML = \"\";\n        try {\n          const d = await apiFetch(\"/api/details\", { page, per_page: 50 });\n          showEl(\"load-details\", false);\n\n          if (!d.issues.length) {\n            document.getElementById(\"tbl-details\").innerHTML =\n              '<tr><td colspan=\"9\" style=\"color:var(--text-muted);text-align:center;padding:20px\">No issues found</td></tr>';\n            _renderPagination(d.total, d.page, d.pages);\n            return;\n          }\n\n          document.getElementById(\"tbl-details\").innerHTML = d.issues\n            .map(\n              (i) => `\n      <tr>\n        <td><a class=\"link\" href=\"${esc(i.url)}\" target=\"_blank\" style=\"color:var(--text-muted);\">#${i.number}</a></td>\n        <td><a class=\"row-link\" href=\"${esc(i.url)}\" target=\"_blank\">${esc(i.title)}</a></td>\n        <td><span class=\"badge badge-${i.state}\">${i.state}</span></td>\n        <td>${(i.labels || []).map((lb) => labelBadge(lb)).join(\"\")}</td>\n        <td style=\"color:var(--text-muted);white-space:nowrap;font-size:12px;\">${fmtDate(i.created_at)}</td>\n        <td style=\"color:var(--text-muted);white-space:nowrap;\">${formatAge(i.age_days)}</td>\n        <td style=\"color:var(--text-muted);text-align:right;\">${i.comments}</td>\n        <td style=\"color:var(--text-muted);\">${esc(i.assignee || \"–\")}</td>\n        <td style=\"color:var(--text-muted);font-size:12px;\">${esc(i.milestone || \"–\")}</td>\n      </tr>\n    `,\n            )\n            .join(\"\");\n\n          _renderPagination(d.total, d.page, d.pages);\n        } catch (e) {\n          showEl(\"load-details\", false);\n          setErr(\"err-details\", `Failed to load: ${e.message}`);\n        }\n      }\n\n      function _renderPagination(total, page, pages) {\n        const container = document.getElementById(\"details-pagination\");\n        if (pages <= 1) {\n          container.innerHTML = `<span class=\"pg-info\">${total} issues</span>`;\n          return;\n        }\n        const prev = `<button onclick=\"loadDetails(${page - 1})\" ${page <= 1 ? \"disabled\" : \"\"}>← Prev</button>`;\n        const next = `<button onclick=\"loadDetails(${page + 1})\" ${page >= pages ? \"disabled\" : \"\"}>Next →</button>`;\n\n        const start = Math.max(1, page - 2);\n        const end = Math.min(pages, start + 4);\n        const pageButtons = [];\n        for (let p = start; p <= end; p++) {\n          pageButtons.push(\n            `<button onclick=\"loadDetails(${p})\" class=\"${p === page ? \"active\" : \"\"}\">${p}</button>`,\n          );\n        }\n        const info = `<span class=\"pg-info\">Page ${page} of ${pages} · ${total} issues</span>`;\n        container.innerHTML = `${prev}${pageButtons.join(\"\")}${next}${info}`;\n      }\n\n      // ─────────────────────────────────────────────────────────────────\n      // Refresh (force re-fetch from GitHub)\n      // ─────────────────────────────────────────────────────────────────\n      async function refreshData() {\n        const btn = document.getElementById(\"btn-refresh\");\n        btn.textContent = \"↺ Fetching…\";\n        btn.disabled = true;\n        try {\n          await fetch(\"/api/refresh\", { method: \"POST\" });\n          document.getElementById(\"cache-info\").textContent =\n            \"Refreshed just now\";\n          await loadFilterOptions();\n          await loadAll();\n          loadAIThemes();\n        } catch (e) {\n          alert(\"Refresh failed: \" + e.message);\n        } finally {\n          btn.textContent = \"↻ Refresh Data\";\n          btn.disabled = false;\n        }\n      }\n\n      // ─────────────────────────────────────────────────────────────────\n      // Load everything (minus AI — that runs separately / slower)\n      // ─────────────────────────────────────────────────────────────────\n      async function loadAll() {\n        detailsPage = 1;\n        await Promise.all([\n          loadSummary(),\n          loadTrend(),\n          loadLabels(),\n          loadAgeBuckets(),\n          loadTimeToClose(),\n          loadMilestones(),\n          loadAttention(),\n          loadDetails(1),\n        ]);\n      }\n\n      function onFilterChange() {\n        loadAll();\n      }\n\n      // ─────────────────────────────────────────────────────────────────\n      // Init\n      // ─────────────────────────────────────────────────────────────────\n      (async function init() {\n        await loadFilterOptions();\n        await loadAll();\n        // AI analysis is slower — load last without blocking main data\n        loadAIThemes();\n      })();\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "monitoring/requirements.txt",
    "content": "flask>=3.0.0\nazure-identity>=1.15.0\nazure-monitor-query>=1.3.0\n"
  },
  {
    "path": "monitoring/templates/index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>dbt Power User — Error Dashboard</title>\n    <script src=\"https://cdn.jsdelivr.net/npm/chart.js@4.4.4/dist/chart.umd.min.js\"></script>\n    <style>\n      *,\n      *::before,\n      *::after {\n        box-sizing: border-box;\n        margin: 0;\n        padding: 0;\n      }\n\n      :root {\n        --bg: #0f1117;\n        --surface: #1a1d27;\n        --surface2: #22263a;\n        --border: #2e3350;\n        --text: #e2e8f0;\n        --muted: #8892b0;\n        --accent: #6366f1;\n        --accent2: #a78bfa;\n        --danger: #f87171;\n        --warn: #fb923c;\n        --ok: #4ade80;\n        --radius: 10px;\n        --shadow: 0 4px 24px rgba(0, 0, 0, 0.4);\n      }\n\n      body {\n        font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto,\n          sans-serif;\n        background: var(--bg);\n        color: var(--text);\n        min-height: 100vh;\n        font-size: 14px;\n        line-height: 1.5;\n      }\n\n      /* ---- Header ---- */\n      header {\n        background: var(--surface);\n        border-bottom: 1px solid var(--border);\n        padding: 16px 32px;\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        gap: 16px;\n        position: sticky;\n        top: 0;\n        z-index: 100;\n      }\n      header h1 {\n        font-size: 18px;\n        font-weight: 700;\n        letter-spacing: -0.3px;\n      }\n      header h1 span {\n        color: var(--accent2);\n      }\n      #last-updated {\n        font-size: 12px;\n        color: var(--muted);\n      }\n\n      /* ---- Filter bar ---- */\n      .filters {\n        display: flex;\n        align-items: center;\n        gap: 12px;\n        flex-wrap: wrap;\n      }\n      .filters label {\n        font-size: 12px;\n        color: var(--muted);\n        display: flex;\n        align-items: center;\n        gap: 6px;\n      }\n      .filters select,\n      .filters button {\n        background: var(--surface2);\n        border: 1px solid var(--border);\n        color: var(--text);\n        border-radius: 6px;\n        padding: 5px 10px;\n        font-size: 13px;\n        cursor: pointer;\n        outline: none;\n      }\n      .filters select:focus,\n      .filters button:hover {\n        border-color: var(--accent);\n      }\n      #refresh-btn {\n        background: var(--accent);\n        border-color: var(--accent);\n        color: #fff;\n        font-weight: 600;\n        padding: 5px 16px;\n      }\n      #refresh-btn:hover {\n        background: var(--accent2);\n        border-color: var(--accent2);\n      }\n\n      /* ---- Main layout ---- */\n      main {\n        max-width: 1400px;\n        margin: 0 auto;\n        padding: 28px 32px 60px;\n        display: flex;\n        flex-direction: column;\n        gap: 36px;\n      }\n\n      /* ---- Section ---- */\n      .section-title {\n        font-size: 15px;\n        font-weight: 700;\n        color: var(--text);\n        border-left: 3px solid var(--accent);\n        padding-left: 10px;\n        margin-bottom: 16px;\n      }\n\n      /* ---- Cards ---- */\n      .cards-row {\n        display: grid;\n        grid-template-columns: repeat(3, 1fr);\n        gap: 16px;\n      }\n      @media (max-width: 900px) {\n        .cards-row {\n          grid-template-columns: 1fr;\n        }\n      }\n\n      .card {\n        background: var(--surface);\n        border: 1px solid var(--border);\n        border-radius: var(--radius);\n        padding: 20px 24px;\n        box-shadow: var(--shadow);\n      }\n      .card .card-label {\n        font-size: 11px;\n        text-transform: uppercase;\n        letter-spacing: 0.8px;\n        color: var(--muted);\n        margin-bottom: 8px;\n      }\n      .card .card-value {\n        font-size: 36px;\n        font-weight: 800;\n        color: var(--text);\n        letter-spacing: -1px;\n      }\n      .card.danger .card-value {\n        color: var(--danger);\n      }\n      .card.warn .card-value {\n        color: var(--warn);\n      }\n      .card.ok .card-value {\n        color: var(--ok);\n      }\n\n      /* ---- Chart panels ---- */\n      .chart-panel {\n        background: var(--surface);\n        border: 1px solid var(--border);\n        border-radius: var(--radius);\n        padding: 20px 24px;\n        box-shadow: var(--shadow);\n      }\n      .chart-panel canvas {\n        width: 100% !important;\n      }\n\n      .two-col {\n        display: grid;\n        grid-template-columns: 1fr 1fr;\n        gap: 16px;\n      }\n      .three-col {\n        display: grid;\n        grid-template-columns: repeat(3, 1fr);\n        gap: 16px;\n      }\n      @media (max-width: 1100px) {\n        .two-col,\n        .three-col {\n          grid-template-columns: 1fr;\n        }\n      }\n\n      /* ---- Tables ---- */\n      .table-wrap {\n        background: var(--surface);\n        border: 1px solid var(--border);\n        border-radius: var(--radius);\n        box-shadow: var(--shadow);\n        overflow: hidden;\n      }\n      table {\n        width: 100%;\n        border-collapse: collapse;\n        font-size: 13px;\n      }\n      thead th {\n        background: var(--surface2);\n        color: var(--muted);\n        font-size: 11px;\n        text-transform: uppercase;\n        letter-spacing: 0.6px;\n        padding: 10px 14px;\n        text-align: left;\n        border-bottom: 1px solid var(--border);\n        cursor: pointer;\n        user-select: none;\n        white-space: nowrap;\n      }\n      thead th:hover {\n        color: var(--text);\n      }\n      thead th.sorted {\n        color: var(--accent2);\n      }\n      thead th.sorted::after {\n        content: \" ↓\";\n      }\n      thead th.sorted.asc::after {\n        content: \" ↑\";\n      }\n      tbody tr {\n        border-bottom: 1px solid var(--border);\n        transition: background 0.1s;\n      }\n      tbody tr:last-child {\n        border-bottom: none;\n      }\n      tbody tr:hover {\n        background: var(--surface2);\n      }\n      tbody td {\n        padding: 9px 14px;\n        vertical-align: top;\n      }\n      .badge {\n        display: inline-block;\n        padding: 1px 8px;\n        border-radius: 20px;\n        font-size: 11px;\n        font-weight: 600;\n        background: var(--surface2);\n        border: 1px solid var(--border);\n      }\n      .badge.core {\n        border-color: #6366f1;\n        color: #a78bfa;\n      }\n      .badge.cloud {\n        border-color: #22d3ee;\n        color: #67e8f9;\n      }\n      .badge.fusion {\n        border-color: #4ade80;\n        color: #86efac;\n      }\n      .badge.unknown {\n        border-color: var(--border);\n        color: var(--muted);\n      }\n\n      .count-bar-wrap {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n      }\n      .count-bar {\n        height: 6px;\n        border-radius: 3px;\n        background: var(--accent);\n        min-width: 2px;\n        transition: width 0.3s;\n      }\n\n      /* ---- Details table ---- */\n      .stack-toggle {\n        cursor: pointer;\n        color: var(--accent2);\n        font-size: 12px;\n        white-space: nowrap;\n      }\n      .stack-toggle:hover {\n        text-decoration: underline;\n      }\n      .stack-pre {\n        display: none;\n        margin-top: 8px;\n        padding: 8px 10px;\n        background: var(--bg);\n        border-radius: 6px;\n        font-family: \"SF Mono\", \"Fira Code\", monospace;\n        font-size: 11px;\n        color: var(--muted);\n        white-space: pre-wrap;\n        word-break: break-all;\n        border: 1px solid var(--border);\n        max-height: 200px;\n        overflow-y: auto;\n      }\n      .stack-pre.open {\n        display: block;\n      }\n\n      /* ---- Pagination ---- */\n      .pagination {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        padding: 12px 16px;\n        border-top: 1px solid var(--border);\n        background: var(--surface);\n      }\n      .pagination button {\n        background: var(--surface2);\n        border: 1px solid var(--border);\n        color: var(--text);\n        border-radius: 6px;\n        padding: 4px 12px;\n        cursor: pointer;\n        font-size: 12px;\n      }\n      .pagination button:disabled {\n        opacity: 0.4;\n        cursor: default;\n      }\n      .pagination button:not(:disabled):hover {\n        border-color: var(--accent);\n      }\n      .pagination span {\n        font-size: 12px;\n        color: var(--muted);\n      }\n\n      /* ---- Loading / error ---- */\n      .loading {\n        text-align: center;\n        padding: 40px;\n        color: var(--muted);\n        font-size: 13px;\n      }\n      .loading::before {\n        content: \"\";\n        display: block;\n        width: 24px;\n        height: 24px;\n        border: 2px solid var(--border);\n        border-top-color: var(--accent);\n        border-radius: 50%;\n        animation: spin 0.8s linear infinite;\n        margin: 0 auto 12px;\n      }\n      @keyframes spin {\n        to {\n          transform: rotate(360deg);\n        }\n      }\n      .error-msg {\n        padding: 20px;\n        color: var(--danger);\n        font-size: 13px;\n        background: rgba(248, 113, 113, 0.08);\n        border-radius: 8px;\n        border: 1px solid rgba(248, 113, 113, 0.2);\n      }\n    </style>\n  </head>\n  <body>\n    <header>\n      <h1>dbt Power User — <span>Error Dashboard</span></h1>\n      <div class=\"filters\">\n        <label\n          >Days\n          <select id=\"sel-days\">\n            <option value=\"1\">Last 24h</option>\n            <option value=\"7\" selected>Last 7 days</option>\n            <option value=\"14\">Last 14 days</option>\n            <option value=\"30\">Last 30 days</option>\n          </select>\n        </label>\n        <label\n          >Integration mode\n          <select id=\"sel-mode\">\n            <option value=\"All\">All</option>\n            <option value=\"core\">core</option>\n            <option value=\"cloud\">cloud</option>\n            <option value=\"fusion\">fusion</option>\n            <option value=\"corecommand\">corecommand</option>\n          </select>\n        </label>\n        <label\n          >Extension version\n          <select id=\"sel-version\">\n            <option value=\"All\">All</option>\n          </select>\n        </label>\n        <button id=\"refresh-btn\" onclick=\"loadAll()\">&#8635; Refresh</button>\n      </div>\n      <span id=\"last-updated\"></span>\n    </header>\n\n    <main>\n      <!-- Section 1: Summary -->\n      <section id=\"sec-summary\">\n        <div class=\"section-title\">1 — Summary</div>\n        <div class=\"cards-row\" id=\"summary-cards\">\n          <div class=\"loading\"></div>\n        </div>\n      </section>\n\n      <!-- Section 2: Error Trend -->\n      <section id=\"sec-trend\">\n        <div class=\"section-title\">2 — Error Trend Over Time</div>\n        <div class=\"chart-panel\">\n          <div id=\"trend-loading\" class=\"loading\"></div>\n          <canvas\n            id=\"chart-trend\"\n            style=\"display: none; max-height: 280px\"\n          ></canvas>\n        </div>\n      </section>\n\n      <!-- Section 3: Top Errors -->\n      <section id=\"sec-top\">\n        <div class=\"section-title\">3 — Top Errors</div>\n        <div class=\"two-col\">\n          <div class=\"chart-panel\">\n            <div id=\"top-chart-loading\" class=\"loading\"></div>\n            <canvas\n              id=\"chart-top\"\n              style=\"display: none; max-height: 360px\"\n            ></canvas>\n          </div>\n          <div>\n            <div id=\"top-table-wrap\"></div>\n          </div>\n        </div>\n      </section>\n\n      <!-- Section 4–6: Mode / Platform / Version -->\n      <section id=\"sec-breakdown\">\n        <div class=\"section-title\">4–6 — Breakdowns</div>\n        <div class=\"three-col\">\n          <div>\n            <div\n              style=\"margin-bottom: 8px; font-size: 13px; color: var(--muted)\"\n            >\n              By Integration Mode\n            </div>\n            <div class=\"chart-panel\">\n              <div id=\"mode-loading\" class=\"loading\"></div>\n              <canvas\n                id=\"chart-mode\"\n                style=\"display: none; max-height: 260px\"\n              ></canvas>\n            </div>\n          </div>\n          <div>\n            <div\n              style=\"margin-bottom: 8px; font-size: 13px; color: var(--muted)\"\n            >\n              By OS / Architecture\n            </div>\n            <div class=\"chart-panel\">\n              <div id=\"platform-loading\" class=\"loading\"></div>\n              <canvas\n                id=\"chart-platform\"\n                style=\"display: none; max-height: 260px\"\n              ></canvas>\n            </div>\n          </div>\n          <div>\n            <div\n              style=\"margin-bottom: 8px; font-size: 13px; color: var(--muted)\"\n            >\n              By Extension Version\n            </div>\n            <div class=\"chart-panel\">\n              <div id=\"version-loading\" class=\"loading\"></div>\n              <canvas\n                id=\"chart-version\"\n                style=\"display: none; max-height: 260px\"\n              ></canvas>\n            </div>\n          </div>\n        </div>\n      </section>\n\n      <!-- Section 7: Unhandled Errors -->\n      <section id=\"sec-unhandled\">\n        <div class=\"section-title\">7 — Unhandled Errors</div>\n        <div id=\"unhandled-wrap\"></div>\n      </section>\n\n      <!-- Section 8: Error Details -->\n      <section id=\"sec-details\">\n        <div class=\"section-title\">8 — Error Details</div>\n        <div id=\"details-wrap\"></div>\n      </section>\n\n      <!-- Section 9: Stack Trace Root Cause Analysis -->\n      <section id=\"sec-stack-analysis\">\n        <div class=\"section-title\">9 — Stack Trace Root Cause Analysis</div>\n        <div class=\"two-col\">\n          <div class=\"chart-panel\">\n            <div id=\"stack-chart-loading\" class=\"loading\"></div>\n            <canvas\n              id=\"chart-stack\"\n              style=\"display: none; max-height: 420px\"\n            ></canvas>\n          </div>\n          <div>\n            <div id=\"stack-table-wrap\"></div>\n          </div>\n        </div>\n      </section>\n    </main>\n\n    <script>\n      const VALID_MODES = [\"core\", \"cloud\", \"fusion\", \"corecommand\"];\n\n      let chartInstances = {};\n      let isLoading = false;\n\n      function getFilters() {\n        return {\n          days: document.getElementById(\"sel-days\").value,\n          mode: document.getElementById(\"sel-mode\").value,\n          version: document.getElementById(\"sel-version\").value,\n        };\n      }\n\n      function qs(params) {\n        return \"?\" + new URLSearchParams(params).toString();\n      }\n\n      async function apiFetch(path, extra = {}) {\n        const f = { ...getFilters(), ...extra };\n        const resp = await fetch(path + qs(f));\n        if (!resp.ok)\n          throw new Error(`HTTP ${resp.status}: ${await resp.text()}`);\n        return resp.json();\n      }\n\n      function showError(containerId, msg) {\n        document.getElementById(containerId).innerHTML =\n          `<div class=\"error-msg\">⚠ ${msg}</div>`;\n      }\n\n      function destroyChart(id) {\n        if (chartInstances[id]) {\n          chartInstances[id].destroy();\n          delete chartInstances[id];\n        }\n      }\n\n      // ============================================================\n      // Palette\n      // ============================================================\n      const PALETTE = [\n        \"#6366f1\",\n        \"#a78bfa\",\n        \"#22d3ee\",\n        \"#4ade80\",\n        \"#fb923c\",\n        \"#f472b6\",\n        \"#facc15\",\n        \"#34d399\",\n        \"#818cf8\",\n        \"#f87171\",\n        \"#60a5fa\",\n        \"#e879f9\",\n        \"#2dd4bf\",\n        \"#fbbf24\",\n        \"#94a3b8\",\n      ];\n\n      const CHART_DEFAULTS = {\n        plugins: {\n          legend: { labels: { color: \"#8892b0\", font: { size: 12 } } },\n        },\n        scales: {\n          x: { ticks: { color: \"#8892b0\" }, grid: { color: \"#2e3350\" } },\n          y: { ticks: { color: \"#8892b0\" }, grid: { color: \"#2e3350\" } },\n        },\n      };\n\n      // ============================================================\n      // 1. Summary cards\n      // ============================================================\n      async function loadSummary() {\n        const el = document.getElementById(\"summary-cards\");\n        el.innerHTML = '<div class=\"loading\"></div>';\n        try {\n          const d = await apiFetch(\"/api/summary\");\n          el.innerHTML = `\n      <div class=\"card danger\">\n        <div class=\"card-label\">Total Errors</div>\n        <div class=\"card-value\">${d.totalErrors.toLocaleString()}</div>\n      </div>\n      <div class=\"card warn\">\n        <div class=\"card-label\">Unique Error Types</div>\n        <div class=\"card-value\">${d.uniqueTypes.toLocaleString()}</div>\n      </div>\n      <div class=\"card ok\">\n        <div class=\"card-label\">Affected Instances</div>\n        <div class=\"card-value\">${d.affectedInstances.toLocaleString()}</div>\n      </div>\n    `;\n        } catch (e) {\n          showError(\"summary-cards\", e.message);\n        }\n      }\n\n      // ============================================================\n      // 2. Error Trend\n      // ============================================================\n      async function loadTrend() {\n        const loading = document.getElementById(\"trend-loading\");\n        const canvas = document.getElementById(\"chart-trend\");\n        loading.style.display = \"block\";\n        canvas.style.display = \"none\";\n        destroyChart(\"trend\");\n        try {\n          const rows = await apiFetch(\"/api/trend\");\n          loading.style.display = \"none\";\n          canvas.style.display = \"block\";\n          chartInstances[\"trend\"] = new Chart(canvas, {\n            type: \"line\",\n            data: {\n              labels: rows.map((r) =>\n                r.timestamp.slice(0, 16).replace(\"T\", \" \"),\n              ),\n              datasets: [\n                {\n                  label: \"Errors\",\n                  data: rows.map((r) => r.count),\n                  borderColor: \"#f87171\",\n                  backgroundColor: \"rgba(248,113,113,.1)\",\n                  tension: 0.3,\n                  fill: true,\n                  pointRadius: rows.length > 30 ? 0 : 3,\n                },\n              ],\n            },\n            options: {\n              ...CHART_DEFAULTS,\n              plugins: {\n                ...CHART_DEFAULTS.plugins,\n                legend: { display: false },\n              },\n              scales: CHART_DEFAULTS.scales,\n            },\n          });\n        } catch (e) {\n          loading.style.display = \"none\";\n          document\n            .querySelector(\"#sec-trend .chart-panel\")\n            .insertAdjacentHTML(\n              \"beforeend\",\n              `<div class=\"error-msg\">⚠ ${e.message}</div>`,\n            );\n        }\n      }\n\n      // ============================================================\n      // 3. Top Errors\n      // ============================================================\n      async function loadTopErrors() {\n        const chartLoading = document.getElementById(\"top-chart-loading\");\n        const canvas = document.getElementById(\"chart-top\");\n        const tableWrap = document.getElementById(\"top-table-wrap\");\n        chartLoading.style.display = \"block\";\n        canvas.style.display = \"none\";\n        tableWrap.innerHTML = '<div class=\"loading\"></div>';\n        destroyChart(\"top\");\n        try {\n          const rows = await apiFetch(\"/api/top-errors\", { limit: 15 });\n          const maxCount = rows[0]?.count || 1;\n\n          // Chart (horizontal bar — top 10)\n          chartLoading.style.display = \"none\";\n          canvas.style.display = \"block\";\n          const chartRows = rows.slice(0, 10);\n          chartInstances[\"top\"] = new Chart(canvas, {\n            type: \"bar\",\n            data: {\n              labels: chartRows.map((r) =>\n                r.name.length > 38 ? r.name.slice(0, 35) + \"...\" : r.name,\n              ),\n              datasets: [\n                {\n                  label: \"Errors\",\n                  data: chartRows.map((r) => r.count),\n                  backgroundColor: PALETTE.slice(0, chartRows.length),\n                  borderRadius: 4,\n                },\n              ],\n            },\n            options: {\n              indexAxis: \"y\",\n              plugins: { legend: { display: false } },\n              scales: {\n                x: { ticks: { color: \"#8892b0\" }, grid: { color: \"#2e3350\" } },\n                y: {\n                  ticks: { color: \"#8892b0\", font: { size: 11 } },\n                  grid: { color: \"#2e3350\" },\n                },\n              },\n            },\n          });\n\n          // Table (all rows)\n          tableWrap.innerHTML = `\n      <div class=\"table-wrap\">\n        <table>\n          <thead><tr>\n            <th>#</th>\n            <th>Error Type</th>\n            <th>Count</th>\n            <th>Modes</th>\n          </tr></thead>\n          <tbody>\n            ${rows\n              .map(\n                (r, i) => `\n              <tr>\n                <td style=\"color:var(--muted);width:32px\">${i + 1}</td>\n                <td style=\"font-family:monospace;font-size:12px;word-break:break-all\">${escHtml(r.name)}</td>\n                <td>\n                  <div class=\"count-bar-wrap\">\n                    <div class=\"count-bar\" style=\"width:${Math.round((r.count / maxCount) * 80)}px\"></div>\n                    <span>${r.count.toLocaleString()}</span>\n                  </div>\n                </td>\n                <td>${modeBadges(r.modes)}</td>\n              </tr>\n            `,\n              )\n              .join(\"\")}\n          </tbody>\n        </table>\n      </div>\n    `;\n        } catch (e) {\n          chartLoading.style.display = \"none\";\n          tableWrap.innerHTML = `<div class=\"error-msg\">⚠ ${e.message}</div>`;\n        }\n      }\n\n      // ============================================================\n      // 4. By Mode (doughnut)\n      // ============================================================\n      async function loadByMode() {\n        const loading = document.getElementById(\"mode-loading\");\n        const canvas = document.getElementById(\"chart-mode\");\n        loading.style.display = \"block\";\n        canvas.style.display = \"none\";\n        destroyChart(\"mode\");\n        try {\n          const rows = await apiFetch(\"/api/by-mode\");\n          loading.style.display = \"none\";\n          canvas.style.display = \"block\";\n          chartInstances[\"mode\"] = new Chart(canvas, {\n            type: \"doughnut\",\n            data: {\n              labels: rows.map((r) => r.mode),\n              datasets: [\n                { data: rows.map((r) => r.count), backgroundColor: PALETTE },\n              ],\n            },\n            options: {\n              plugins: { legend: { labels: { color: \"#8892b0\" } } },\n              cutout: \"60%\",\n            },\n          });\n        } catch (e) {\n          loading.style.display = \"none\";\n          document\n            .getElementById(\"chart-mode\")\n            .insertAdjacentHTML(\n              \"afterend\",\n              `<div class=\"error-msg\">⚠ ${e.message}</div>`,\n            );\n        }\n      }\n\n      // ============================================================\n      // 5. By Platform (bar)\n      // ============================================================\n      async function loadByPlatform() {\n        const loading = document.getElementById(\"platform-loading\");\n        const canvas = document.getElementById(\"chart-platform\");\n        loading.style.display = \"block\";\n        canvas.style.display = \"none\";\n        destroyChart(\"platform\");\n        try {\n          const rows = await apiFetch(\"/api/by-platform\");\n          loading.style.display = \"none\";\n          canvas.style.display = \"block\";\n          chartInstances[\"platform\"] = new Chart(canvas, {\n            type: \"bar\",\n            data: {\n              labels: rows.map((r) => r.platform),\n              datasets: [\n                {\n                  label: \"Errors\",\n                  data: rows.map((r) => r.count),\n                  backgroundColor: PALETTE.slice(0, rows.length),\n                  borderRadius: 4,\n                },\n              ],\n            },\n            options: {\n              plugins: { legend: { display: false } },\n              scales: CHART_DEFAULTS.scales,\n            },\n          });\n        } catch (e) {\n          loading.style.display = \"none\";\n          document\n            .getElementById(\"chart-platform\")\n            .insertAdjacentHTML(\n              \"afterend\",\n              `<div class=\"error-msg\">⚠ ${e.message}</div>`,\n            );\n        }\n      }\n\n      // ============================================================\n      // 6. By Version (bar)\n      // ============================================================\n      async function loadByVersion() {\n        const loading = document.getElementById(\"version-loading\");\n        const canvas = document.getElementById(\"chart-version\");\n        loading.style.display = \"block\";\n        canvas.style.display = \"none\";\n        destroyChart(\"version\");\n        try {\n          const rows = await apiFetch(\"/api/by-version\");\n          loading.style.display = \"none\";\n          canvas.style.display = \"block\";\n          chartInstances[\"version\"] = new Chart(canvas, {\n            type: \"bar\",\n            data: {\n              labels: rows.map((r) => r.version),\n              datasets: [\n                {\n                  label: \"Errors\",\n                  data: rows.map((r) => r.count),\n                  backgroundColor: \"#6366f1\",\n                  borderRadius: 4,\n                },\n              ],\n            },\n            options: {\n              plugins: { legend: { display: false } },\n              scales: CHART_DEFAULTS.scales,\n            },\n          });\n        } catch (e) {\n          loading.style.display = \"none\";\n          document\n            .getElementById(\"chart-version\")\n            .insertAdjacentHTML(\n              \"afterend\",\n              `<div class=\"error-msg\">⚠ ${e.message}</div>`,\n            );\n        }\n      }\n\n      // ============================================================\n      // 7. Unhandled Errors\n      // ============================================================\n      async function loadUnhandled() {\n        const wrap = document.getElementById(\"unhandled-wrap\");\n        wrap.innerHTML = '<div class=\"loading\"></div>';\n        try {\n          const rows = await apiFetch(\"/api/unhandled\");\n          const maxCount = rows[0]?.count || 1;\n          wrap.innerHTML = `\n      <div class=\"table-wrap\">\n        <table>\n          <thead><tr>\n            <th>Message Group</th>\n            <th>Count</th>\n            <th>Versions</th>\n            <th>Modes</th>\n          </tr></thead>\n          <tbody>\n            ${rows\n              .map(\n                (r) => `\n              <tr>\n                <td style=\"font-family:monospace;font-size:12px\">${escHtml(r.group)}</td>\n                <td>\n                  <div class=\"count-bar-wrap\">\n                    <div class=\"count-bar\" style=\"width:${Math.round((r.count / maxCount) * 80)}px;background:var(--danger)\"></div>\n                    <span>${r.count.toLocaleString()}</span>\n                  </div>\n                </td>\n                <td style=\"font-size:12px;color:var(--muted)\">${escHtml(r.versions)}</td>\n                <td>${modeBadges(r.modes)}</td>\n              </tr>\n            `,\n              )\n              .join(\"\")}\n          </tbody>\n        </table>\n      </div>\n    `;\n        } catch (e) {\n          wrap.innerHTML = `<div class=\"error-msg\">⚠ ${e.message}</div>`;\n        }\n      }\n\n      // ============================================================\n      // 8. Error Details (paginated)\n      // ============================================================\n      let detailsData = [];\n      let detailsPage = 0;\n      const PAGE_SIZE = 50;\n\n      async function loadDetails() {\n        const wrap = document.getElementById(\"details-wrap\");\n        wrap.innerHTML = '<div class=\"loading\"></div>';\n        detailsPage = 0;\n        try {\n          detailsData = await apiFetch(\"/api/details\", { limit: 500 });\n          renderDetailsPage();\n        } catch (e) {\n          wrap.innerHTML = `<div class=\"error-msg\">⚠ ${e.message}</div>`;\n        }\n      }\n\n      function renderDetailsPage() {\n        const wrap = document.getElementById(\"details-wrap\");\n        const start = detailsPage * PAGE_SIZE;\n        const page = detailsData.slice(start, start + PAGE_SIZE);\n        const total = detailsData.length;\n        const pages = Math.ceil(total / PAGE_SIZE);\n\n        wrap.innerHTML = `\n    <div class=\"table-wrap\">\n      <table>\n        <thead><tr>\n          <th>Timestamp</th>\n          <th>Error Type</th>\n          <th>Message</th>\n          <th>Mode</th>\n          <th>Version</th>\n          <th>Platform</th>\n          <th>IDE</th>\n          <th>Stack</th>\n        </tr></thead>\n        <tbody>\n          ${page\n            .map((r, i) => {\n              const idx = start + i;\n              const ts = r.timestamp\n                ? r.timestamp.slice(0, 19).replace(\"T\", \" \")\n                : \"\";\n              return `\n              <tr>\n                <td style=\"white-space:nowrap;font-size:12px;color:var(--muted)\">${ts}</td>\n                <td style=\"font-family:monospace;font-size:11px;max-width:220px;word-break:break-all\">${escHtml(r.name)}</td>\n                <td style=\"max-width:260px;font-size:12px\">${escHtml((r.message || \"\").slice(0, 120))}</td>\n                <td>${modeBadges(r.mode)}</td>\n                <td style=\"white-space:nowrap;font-size:12px\">${escHtml(r.version || \"\")}</td>\n                <td style=\"white-space:nowrap;font-size:12px\">${escHtml(r.os || \"\")} / ${escHtml(r.arch || \"\")}</td>\n                <td style=\"white-space:nowrap;font-size:12px\">${escHtml(r.ide || \"\")}</td>\n                <td>\n                  ${\n                    r.stack\n                      ? `<span class=\"stack-toggle\" onclick=\"toggleStack(this)\">▶ show stack</span>\n                       <pre class=\"stack-pre\">${escHtml(r.stack)}</pre>`\n                      : '<span style=\"color:var(--muted);font-size:12px\">—</span>'\n                  }\n                </td>\n              </tr>\n            `;\n            })\n            .join(\"\")}\n        </tbody>\n      </table>\n      <div class=\"pagination\">\n        <button onclick=\"changePage(-1)\" ${detailsPage === 0 ? \"disabled\" : \"\"}>← Prev</button>\n        <span>Page ${detailsPage + 1} of ${pages} &nbsp;·&nbsp; ${total.toLocaleString()} rows</span>\n        <button onclick=\"changePage(1)\" ${detailsPage >= pages - 1 ? \"disabled\" : \"\"}>Next →</button>\n      </div>\n    </div>\n  `;\n      }\n\n      function changePage(delta) {\n        const pages = Math.ceil(detailsData.length / PAGE_SIZE);\n        detailsPage = Math.max(0, Math.min(pages - 1, detailsPage + delta));\n        renderDetailsPage();\n      }\n\n      function toggleStack(el) {\n        const pre = el.nextElementSibling;\n        pre.classList.toggle(\"open\");\n        el.textContent = pre.classList.contains(\"open\")\n          ? \"▼ hide stack\"\n          : \"▶ show stack\";\n      }\n\n      // ============================================================\n      // Versions dropdown\n      // ============================================================\n      async function loadVersions() {\n        const sel = document.getElementById(\"sel-version\");\n        try {\n          const versions = await fetch(\"/api/versions\" + qs(getFilters())).then(\n            (r) => r.json(),\n          );\n          const current = sel.value;\n          sel.innerHTML = '<option value=\"All\">All</option>';\n          versions.forEach((v) => {\n            const opt = document.createElement(\"option\");\n            opt.value = v;\n            opt.textContent = v;\n            if (v === current) opt.selected = true;\n            sel.appendChild(opt);\n          });\n        } catch (e) {\n          console.error(\"Failed to load versions:\", e);\n        }\n      }\n\n      // ============================================================\n      // Helpers\n      // ============================================================\n      function escHtml(str) {\n        const div = document.createElement(\"div\");\n        div.textContent = String(str || \"\");\n        return div.innerHTML;\n      }\n\n      function modeBadges(modes) {\n        if (!modes) return \"\";\n        return modes\n          .split(\",\")\n          .map((m) => {\n            m = m.trim();\n            if (!m || m === \"undefined\") return \"\";\n            const cls = VALID_MODES.includes(m) ? m : \"unknown\";\n            return `<span class=\"badge ${cls}\">${escHtml(m)}</span> `;\n          })\n          .join(\"\");\n      }\n\n      // ============================================================\n      // 9. Stack Trace Root Cause Analysis\n      // ============================================================\n      async function loadStackAnalysis() {\n        const chartLoading = document.getElementById(\"stack-chart-loading\");\n        const canvas = document.getElementById(\"chart-stack\");\n        const tableWrap = document.getElementById(\"stack-table-wrap\");\n        chartLoading.style.display = \"block\";\n        canvas.style.display = \"none\";\n        tableWrap.innerHTML = '<div class=\"loading\"></div>';\n        destroyChart(\"stack\");\n        try {\n          const rows = await apiFetch(\"/api/stack-analysis\");\n          const total = rows.reduce((s, r) => s + r.count, 0);\n          const maxCount = rows[0]?.count || 1;\n\n          // Chart — top 15 root causes\n          const chartRows = rows.slice(0, 15);\n          chartLoading.style.display = \"none\";\n          canvas.style.display = \"block\";\n          chartInstances[\"stack\"] = new Chart(canvas, {\n            type: \"bar\",\n            data: {\n              labels: chartRows.map((r) =>\n                r.rootCause.length > 40\n                  ? r.rootCause.slice(0, 37) + \"…\"\n                  : r.rootCause,\n              ),\n              datasets: [\n                {\n                  label: \"Events\",\n                  data: chartRows.map((r) => r.count),\n                  backgroundColor: chartRows.map(\n                    (_, i) => PALETTE[i % PALETTE.length],\n                  ),\n                  borderRadius: 4,\n                },\n              ],\n            },\n            options: {\n              indexAxis: \"y\",\n              plugins: { legend: { display: false } },\n              scales: {\n                x: { ticks: { color: \"#8892b0\" }, grid: { color: \"#2e3350\" } },\n                y: {\n                  ticks: { color: \"#8892b0\", font: { size: 11 } },\n                  grid: { color: \"#2e3350\" },\n                },\n              },\n            },\n          });\n\n          // Table — all root causes\n          tableWrap.innerHTML = `\n      <div class=\"table-wrap\">\n        <table>\n          <thead><tr>\n            <th>#</th>\n            <th>Root Cause</th>\n            <th>Count</th>\n            <th>% of Stack Events</th>\n            <th>Top Error Types</th>\n            <th>Modes</th>\n          </tr></thead>\n          <tbody>\n            ${rows\n              .map((r, i) => {\n                const pct =\n                  total > 0 ? ((r.count / total) * 100).toFixed(1) : \"0.0\";\n                return `\n                <tr>\n                  <td style=\"color:var(--muted);width:32px\">${i + 1}</td>\n                  <td style=\"font-weight:600;font-size:13px\">${escHtml(r.rootCause)}</td>\n                  <td>\n                    <div class=\"count-bar-wrap\">\n                      <div class=\"count-bar\" style=\"width:${Math.round((r.count / maxCount) * 80)}px;background:${PALETTE[i % PALETTE.length]}\"></div>\n                      <span>${r.count.toLocaleString()}</span>\n                    </div>\n                  </td>\n                  <td style=\"color:var(--muted);font-size:12px\">${pct}%</td>\n                  <td style=\"font-family:monospace;font-size:11px;color:var(--muted);max-width:260px;word-break:break-all\">${escHtml(r.topEvents)}</td>\n                  <td>${modeBadges(r.topModes)}</td>\n                </tr>\n              `;\n              })\n              .join(\"\")}\n          </tbody>\n        </table>\n      </div>\n    `;\n        } catch (e) {\n          chartLoading.style.display = \"none\";\n          tableWrap.innerHTML = `<div class=\"error-msg\">⚠ ${e.message}</div>`;\n        }\n      }\n\n      // ============================================================\n      // Load all\n      // ============================================================\n      async function loadAll() {\n        if (isLoading) return;\n        isLoading = true;\n        document.getElementById(\"last-updated\").textContent = \"Loading…\";\n        try {\n          await Promise.all([\n            loadVersions(),\n            loadSummary(),\n            loadTrend(),\n            loadTopErrors(),\n            loadByMode(),\n            loadByPlatform(),\n            loadByVersion(),\n            loadUnhandled(),\n            loadDetails(),\n            loadStackAnalysis(),\n          ]);\n          document.getElementById(\"last-updated\").textContent =\n            \"Updated \" + new Date().toLocaleTimeString();\n        } finally {\n          isLoading = false;\n        }\n      }\n\n      // Re-fetch on filter changes\n      [\"sel-days\", \"sel-mode\", \"sel-version\"].forEach((id) => {\n        document.getElementById(id).addEventListener(\"change\", loadAll);\n      });\n\n      // Initial load\n      loadAll();\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"vscode-dbt-power-user\",\n  \"displayName\": \"Power User for dbt\",\n  \"description\": \"a.k.a. dbt power user makes vscode work seamlessly with dbt™ core and dbt™ cloud: auto-complete, preview, column lineage, AI docs generation, health checks, cost estimation etc\",\n  \"icon\": \"media/images/dbt.png\",\n  \"publisher\": \"innoverio\",\n  \"license\": \"MIT\",\n  \"homepage\": \"https://www.altimate.ai/vscode\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/AltimateAI/vscode-dbt-power-user.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/AltimateAI/vscode-dbt-power-user/issues\"\n  },\n  \"version\": \"0.60.6\",\n  \"engines\": {\n    \"vscode\": \"^1.95.0\"\n  },\n  \"capabilities\": {\n    \"hoverProvider\": true\n  },\n  \"categories\": [\n    \"Other\",\n    \"Programming Languages\",\n    \"Snippets\",\n    \"Data Science\",\n    \"Formatters\",\n    \"Testing\"\n  ],\n  \"keywords\": [\n    \"dbt\",\n    \"sql\",\n    \"jinja-sql\",\n    \"dbt power user\"\n  ],\n  \"activationEvents\": [\n    \"workspaceContains:**/dbt_project.yml\"\n  ],\n  \"main\": \"./dist/extension\",\n  \"contributes\": {\n    \"notebookRenderer\": [\n      {\n        \"id\": \"datapilot-notebook-perspective-renderer\",\n        \"displayName\": \"Github Issues Notebook Renderer\",\n        \"entrypoint\": \"./webview_panels/dist/assets/renderer.js\",\n        \"mimeTypes\": [\n          \"application/perspective-json\"\n        ]\n      }\n    ],\n    \"notebooks\": [\n      {\n        \"type\": \"datapilot-notebook\",\n        \"displayName\": \"Datapilot Notebook\",\n        \"selector\": [\n          {\n            \"filenamePattern\": \"*.notebook\"\n          }\n        ]\n      }\n    ],\n    \"snippets\": [\n      {\n        \"language\": \"jinja-sql\",\n        \"path\": \"./snippets/snippets_sql.json\"\n      },\n      {\n        \"language\": \"jinja-yaml\",\n        \"path\": \"./snippets/snippets_yaml.json\"\n      },\n      {\n        \"language\": \"jinja-md\",\n        \"path\": \"./snippets/snippets_markdown.json\"\n      }\n    ],\n    \"configuration\": [\n      {\n        \"title\": \"Altimate AI\",\n        \"properties\": {\n          \"dbt.altimateAiKey\": {\n            \"type\": \"string\",\n            \"displayName\": \"Altimate AI API Key\",\n            \"markdownDescription\": \"Needed for features that require backend support. Sign up for a free Altimate AI account [here](https://app.myaltimate.com/register). API Key can be copied from Altimate AI UI (navigate to Settings->API Key)\"\n          },\n          \"dbt.altimateUrl\": {\n            \"type\": \"string\",\n            \"displayName\": \"Altimate API endpoint\",\n            \"description\": \"Select Altimate API endpoint\",\n            \"enum\": [\n              \"https://api.myaltimate.com\",\n              \"https://api.getaltimate.com\"\n            ],\n            \"enumDescriptions\": [\n              \"Community, Pro or Team Plan\",\n              \"Enterprise Plan\"\n            ],\n            \"default\": \"https://api.myaltimate.com\"\n          },\n          \"dbt.altimateInstanceName\": {\n            \"type\": \"string\",\n            \"displayName\": \"Altimate AI Instance Name\",\n            \"markdownDescription\": \"Needed for features that require backend support. Sign up for a free Altimate AI account [here](https://app.myaltimate.com/register). If your Altimate AI instance URL is https://betatest.app.myaltimate.com/, The instance name is betatest\"\n          },\n          \"dbt.enableMcpDataSourceQueryTools\": {\n            \"type\": \"boolean\",\n            \"description\": \"Enable data source query tools (EXECUTE_SQL_WITH_LIMIT and GET_COLUMN_VALUES)\",\n            \"default\": false\n          },\n          \"dbt.mcpSslCertKeyPath\": {\n            \"type\": \"string\",\n            \"description\": \"Path to the SSL certificate key file for MCP server\",\n            \"displayName\": \"MCP Server SSL Certificate Key Path\",\n            \"default\": \"\"\n          },\n          \"dbt.mcpSslCertPath\": {\n            \"type\": \"string\",\n            \"description\": \"Path to the SSL certificate file for MCP server\",\n            \"displayName\": \"MCP Server SSL Certificate Path\",\n            \"default\": \"\"\n          },\n          \"dbt.enableNewLineagePanel\": {\n            \"type\": \"boolean\",\n            \"description\": \"Enable the new lineage panel in dbt.\"\n          },\n          \"dbt.enableCollaboration\": {\n            \"type\": \"boolean\",\n            \"description\": \"Enable dbt docs collaboration.\",\n            \"default\": true\n          },\n          \"dbt.disableQueryHistory\": {\n            \"type\": \"boolean\",\n            \"description\": \"Disable Query history and bookmarks\",\n            \"default\": false\n          },\n          \"dbt.enableNotebooks\": {\n            \"type\": \"boolean\",\n            \"description\": \"Enable Datapilot notebooks feature\",\n            \"default\": true\n          },\n          \"dbt.lineage.showSelectEdges\": {\n            \"type\": \"boolean\",\n            \"description\": \"Show select edges in lineage panel.\",\n            \"default\": true\n          },\n          \"dbt.lineage.showNonSelectEdges\": {\n            \"type\": \"boolean\",\n            \"description\": \"Show non-select edges in lineage panel.\",\n            \"default\": false\n          },\n          \"dbt.lineage.defaultExpansion\": {\n            \"type\": \"number\",\n            \"description\": \"By default how much lineage should expand.\",\n            \"default\": 1\n          },\n          \"dbt.installDepsOnProjectInitialization\": {\n            \"type\": \"boolean\",\n            \"description\": \"Install dbt deps on project initialization\",\n            \"default\": true\n          }\n        }\n      },\n      {\n        \"title\": \"dbt Power User\",\n        \"properties\": {\n          \"dbt.unquotedCaseInsensitiveIdentifierRegex\": {\n            \"type\": \"string\",\n            \"markdownDescription\": \"Regex to identify unquoted identifiers. Example: `^([_A-Z]+[_A-Z0-9$]*)$`\"\n          },\n          \"dbt.dbtIntegration\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"core\",\n              \"cloud\",\n              \"corecommand\",\n              \"fusion\"\n            ],\n            \"default\": \"core\",\n            \"description\": \"Select dbt core or dbt cloud\"\n          },\n          \"dbt.dbtPythonPathOverride\": {\n            \"type\": \"string\",\n            \"description\": \"Path to a Python executable. Use this when the Python extension selects a different interpreter than the one where dbt is installed (e.g. dbt works in your terminal but not in the extension). You can set this manually or run the 'Detect Python from terminal' command to auto-detect it.\"\n          },\n          \"dbt.dbtCustomRunnerImport\": {\n            \"type\": \"string\",\n            \"description\": \"Python import string to import custom dbt runner. (Only supported for dbt core)\",\n            \"default\": \"from dbt.cli.main import dbtRunner\"\n          },\n          \"dbt.allowListFolders\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"default\": [],\n            \"description\": \"Define workspace-relative paths to include. Only projects within these folders will be built. If empty, no filtering is applied. The path should be relative to the workspace. Example: [folder1, folder2]\"\n          },\n          \"dbt.runModelCommandAdditionalParams\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"default\": [],\n            \"description\": \"Add additional params to the dbt run model command. Ex: --select model1 --target prod needs to be added as four different entries \\n--select \\nmodel1 \\n--target \\nprod \"\n          },\n          \"dbt.buildModelCommandAdditionalParams\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"default\": [],\n            \"description\": \"Add additional params to the dbt build model command. Ex: --select model1 --target prod needs to be added as four different entries \\n--select \\nmodel1 \\n--target \\nprod \"\n          },\n          \"dbt.queryLimit\": {\n            \"type\": \"integer\",\n            \"description\": \"The maximum number of rows the `Preview SQL Query` command returns.\",\n            \"default\": 500,\n            \"minimum\": 1\n          },\n          \"dbt.perspectiveTheme\": {\n            \"type\": \"string\",\n            \"description\": \"Theme for perspective viewer in query results panel\",\n            \"default\": \"Vintage\",\n            \"enum\": [\n              \"Vintage\",\n              \"Pro Light\",\n              \"Pro Dark\",\n              \"Vaporwave\",\n              \"Solarized\",\n              \"Solarized Dark\",\n              \"Monokai\"\n            ]\n          },\n          \"dbt.conversationsPollingInterval\": {\n            \"type\": \"integer\",\n            \"description\": \"Polling interval to fetch latest conversations (in seconds)\",\n            \"default\": 900,\n            \"minimum\": 30\n          },\n          \"dbt.queryTemplate\": {\n            \"type\": \"string\",\n            \"description\": \"Override the default query template that is used by the `Preview SQL Query` command. Use this if your database has special syntax to limit query results\",\n            \"default\": \"select * from ({query}\\n) as query limit {limit}\"\n          },\n          \"dbt.queryScale\": {\n            \"type\": \"string\",\n            \"description\": \"Override the default scale of the result table that is used by the `Preview SQL Query` command.\",\n            \"default\": 1\n          },\n          \"dbt.fileNameTemplateGenerateModel\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"{prefix}_{sourceName}_{tableName}\",\n              \"{prefix}_{sourceName}__{tableName}\",\n              \"{prefix}_{tableName}\",\n              \"{tableName}\"\n            ],\n            \"default\": \"{prefix}_{sourceName}_{tableName}\",\n            \"description\": \"Set the naming template that is used when generating a model from a source yml file.\"\n          },\n          \"dbt.prefixGenerateModel\": {\n            \"type\": \"string\",\n            \"default\": \"base\",\n            \"description\": \"Set the prefix that is used when generating a model from a source yml file.\"\n          },\n          \"dbt.sqlFmtPath\": {\n            \"type\": \"string\",\n            \"description\": \"Path to `sqlfmt`. If not set, it will look on your PATH\"\n          },\n          \"dbt.sqlFmtAdditionalParams\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"default\": [],\n            \"description\": \"Add additional params to `sqlfmt`\"\n          },\n          \"dbt.disableDepthsCalculation\": {\n            \"type\": \"boolean\",\n            \"description\": \"Disable DAG depth calculation and decoration\",\n            \"default\": false\n          },\n          \"dbt.deferConfigPerProject\": {\n            \"type\": \"object\",\n            \"description\": \"Run subset of models without building their parent models\",\n            \"scope\": \"resource\",\n            \"patternProperties\": {\n              \".*\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"deferToProduction\": {\n                    \"type\": \"boolean\",\n                    \"description\": \"Run subset of models without building their parent models\",\n                    \"default\": false\n                  },\n                  \"manifestPathForDeferral\": {\n                    \"type\": \"string\",\n                    \"description\": \"Manifest path to defer the parent models\",\n                    \"default\": \"\"\n                  },\n                  \"favorState\": {\n                    \"type\": \"boolean\",\n                    \"description\": \"If a given model exists in both the current environment and the defined defer state, turn this flag on to use the latter always\",\n                    \"default\": false\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    ],\n    \"customEditors\": [\n      {\n        \"viewType\": \"dbtPowerUser.Mcp\",\n        \"displayName\": \"MCP Walkthrough\",\n        \"selector\": [\n          {\n            \"filenamePattern\": \"*.mcpwalkthrough\"\n          }\n        ]\n      }\n    ],\n    \"viewsContainers\": {\n      \"activitybar\": [\n        {\n          \"id\": \"dbt_view\",\n          \"title\": \"dbt Power User\",\n          \"icon\": \"./media/images/dbt_icon.svg\",\n          \"contextualTitle\": \"dbt Power User\"\n        },\n        {\n          \"id\": \"datapilot_view\",\n          \"title\": \"DataPilot Chat\",\n          \"icon\": \"./media/images/altimate.svg\",\n          \"contextualTitle\": \"Altimate Data pilot\"\n        }\n      ],\n      \"panel\": [\n        {\n          \"id\": \"dbt_preview_results\",\n          \"title\": \"Query Results\",\n          \"icon\": \"./media/images/dbt_icon.svg\"\n        },\n        {\n          \"id\": \"lineage_view\",\n          \"title\": \"Lineage\",\n          \"icon\": \"./media/images/dbt_icon.svg\"\n        },\n        {\n          \"id\": \"docs_edit_view\",\n          \"title\": \"Documentation Editor\",\n          \"icon\": \"./media/images/dbt_icon.svg\"\n        },\n        {\n          \"id\": \"insights_view\",\n          \"title\": \"Actions\",\n          \"icon\": \"./media/images/dbt_icon.svg\"\n        },\n        {\n          \"id\": \"run_history_view\",\n          \"title\": \"Run History\",\n          \"icon\": \"./media/images/dbt_icon.svg\"\n        }\n      ]\n    },\n    \"views\": {\n      \"dbt_view\": [\n        {\n          \"id\": \"model_test_treeview\",\n          \"name\": \"Model Tests\"\n        },\n        {\n          \"id\": \"parent_model_treeview\",\n          \"name\": \"Parent Models\"\n        },\n        {\n          \"id\": \"children_model_treeview\",\n          \"name\": \"Children Models\"\n        },\n        {\n          \"id\": \"documentation_treeview\",\n          \"name\": \"Documentation\"\n        },\n        {\n          \"id\": \"icon_actions_treeview\",\n          \"name\": \"Project Actions ✨\"\n        }\n      ],\n      \"dbt_preview_results\": [\n        {\n          \"id\": \"dbtPowerUser.PreviewResults\",\n          \"name\": \"\",\n          \"type\": \"webview\"\n        }\n      ],\n      \"lineage_view\": [\n        {\n          \"id\": \"dbtPowerUser.Lineage\",\n          \"name\": \"\",\n          \"type\": \"webview\"\n        }\n      ],\n      \"docs_edit_view\": [\n        {\n          \"id\": \"dbtPowerUser.DocsEdit\",\n          \"name\": \"\",\n          \"type\": \"webview\"\n        }\n      ],\n      \"datapilot_view\": [\n        {\n          \"type\": \"webview\",\n          \"id\": \"dbtPowerUser.datapilot-webview\",\n          \"name\": \"\",\n          \"icon\": \"./media/images/dbt_icon.svg\"\n        }\n      ],\n      \"insights_view\": [\n        {\n          \"id\": \"dbtPowerUser.Insights\",\n          \"name\": \"\",\n          \"type\": \"webview\"\n        }\n      ],\n      \"run_history_view\": [\n        {\n          \"id\": \"run_history_treeview\",\n          \"name\": \"Runs\"\n        }\n      ]\n    },\n    \"commands\": [\n      {\n        \"command\": \"dbtPowerUser.collectQueryResultsDebugInfo\",\n        \"title\": \"Query Results Debug Info\",\n        \"category\": \"dbt Power User\"\n      },\n      {\n        \"command\": \"dbtPowerUser.resolveConversation\",\n        \"title\": \"Resolve\",\n        \"category\": \"dbt Power User\"\n      },\n      {\n        \"command\": \"dbtPowerUser.createConversation\",\n        \"title\": \"Publish\",\n        \"category\": \"dbt Power User\",\n        \"enablement\": \"!commentIsEmpty\"\n      },\n      {\n        \"command\": \"dbtPowerUser.viewInDbtDocs\",\n        \"title\": \"View in dbt docs\",\n        \"category\": \"dbt Power User\"\n      },\n      {\n        \"command\": \"dbtPowerUser.copyDbtDocsLink\",\n        \"title\": \"Copy link\",\n        \"category\": \"dbt Power User\"\n      },\n      {\n        \"command\": \"dbtPowerUser.viewInDocEditor\",\n        \"title\": \"View in documentation editor\",\n        \"category\": \"dbt Power User\"\n      },\n      {\n        \"command\": \"dbtPowerUser.createSqlFile\",\n        \"title\": \"Create Power User SQL file\"\n      },\n      {\n        \"command\": \"dbtPowerUser.createDatapilotNotebook\",\n        \"title\": \"Datapilot notebook\",\n        \"enablement\": \"dbt.enableNotebooks == true\"\n      },\n      {\n        \"command\": \"dbtPowerUser.datapilotProfileYourQuery\",\n        \"title\": \"Profile your query\",\n        \"icon\": {\n          \"light\": \"./media/images/sql-action-light.svg\",\n          \"dark\": \"./media/images/sql-action-dark.svg\"\n        }\n      },\n      {\n        \"command\": \"dbtPowerUser.replyToConversation\",\n        \"title\": \"Reply\",\n        \"enablement\": \"!commentIsEmpty\",\n        \"category\": \"dbt Power User\"\n      },\n      {\n        \"command\": \"dbtPowerUser.puQuickPick\",\n        \"category\": \"dbt Power User\",\n        \"title\": \"dbt Power User Quick Pick\"\n      },\n      {\n        \"command\": \"dbtPowerUser.openInsights\",\n        \"category\": \"dbt Power User\",\n        \"title\": \"Open dbt Power User insights panel\"\n      },\n      {\n        \"command\": \"dbtPowerUser.openOnboarding\",\n        \"category\": \"dbt Power User\",\n        \"title\": \"Get Started with dbt Power User\"\n      },\n      {\n        \"command\": \"dbtPowerUser.sqlQuickPick\",\n        \"title\": \"SQL Actions\",\n        \"category\": \"dbt Power User\",\n        \"icon\": {\n          \"light\": \"./media/images/sql-action-light.svg\",\n          \"dark\": \"./media/images/sql-action-dark.svg\"\n        }\n      },\n      {\n        \"command\": \"dbtPowerUser.runCurrentModel\",\n        \"title\": \"Run dbt Model\",\n        \"category\": \"dbt Power User\",\n        \"icon\": {\n          \"light\": \"./media/images/run-light.svg\",\n          \"dark\": \"./media/images/run-dark.svg\"\n        }\n      },\n      {\n        \"command\": \"dbtPowerUser.rerunFromHistory\",\n        \"title\": \"Re-run Command\",\n        \"category\": \"dbt Power User\",\n        \"icon\": \"$(debug-rerun)\"\n      },\n      {\n        \"command\": \"dbtPowerUser.clearRunHistory\",\n        \"title\": \"Clear Run History\",\n        \"category\": \"dbt Power User\",\n        \"icon\": \"$(clear-all)\"\n      },\n      {\n        \"command\": \"dbtPowerUser.profileCtes\",\n        \"title\": \"Profile CTEs\",\n        \"category\": \"dbt Power User\"\n      },\n      {\n        \"command\": \"dbtPowerUser.cancelCteProfiling\",\n        \"title\": \"Cancel CTE Profiling\",\n        \"category\": \"dbt Power User\"\n      },\n      {\n        \"command\": \"dbtPowerUser.clearProfileResults\",\n        \"title\": \"Clear CTE Profile Results\",\n        \"category\": \"dbt Power User\",\n        \"icon\": \"$(clear-all)\"\n      },\n      {\n        \"command\": \"dbtPowerUser.toggleProfileDecorations\",\n        \"title\": \"Toggle CTE Profile Decorations\",\n        \"category\": \"dbt Power User\"\n      },\n      {\n        \"command\": \"dbtPowerUser.openDatapilotWithQuery\",\n        \"title\": \"Start Chat\",\n        \"category\": \"dbt Power User\"\n      },\n      {\n        \"command\": \"dbtPowerUser.summarizeQuery\",\n        \"title\": \"Explain\",\n        \"category\": \"dbt Power User\"\n      },\n      {\n        \"command\": \"dbtPowerUser.changeQuery\",\n        \"title\": \"Change\",\n        \"category\": \"dbt Power User\"\n      },\n      {\n        \"command\": \"dbtPowerUser.translateQuery\",\n        \"title\": \"Translate to other SQL dialect\",\n        \"category\": \"dbt Power User\"\n      },\n      {\n        \"command\": \"dbtPowerUser.sqlToModel\",\n        \"title\": \"Convert to dbt Model\",\n        \"shortTitle\": \"Convert to dbt Model\",\n        \"category\": \"dbt Power User\",\n        \"icon\": {\n          \"light\": \"./media/images/preview-dbt-light.svg\",\n          \"dark\": \"./media/images/preview-dbt-dark.svg\"\n        }\n      },\n      {\n        \"command\": \"dbtPowerUser.validateSql\",\n        \"title\": \"Validate SQL\",\n        \"category\": \"dbt Power User\",\n        \"icon\": \"$(circuit-board)\"\n      },\n      {\n        \"command\": \"dbtPowerUser.altimateScan\",\n        \"title\": \"Project Healthcheck\",\n        \"category\": \"dbt Power User\",\n        \"icon\": \"$(circuit-board)\"\n      },\n      {\n        \"command\": \"dbtPowerUser.clearAltimateScanResults\",\n        \"category\": \"dbt Power User\",\n        \"title\": \"Clear Health Check Results\"\n      },\n      {\n        \"command\": \"dbtPowerUser.bigqueryCostEstimate\",\n        \"category\": \"dbt Power User\",\n        \"title\": \"Estimate cost for BigQuery\"\n      },\n      {\n        \"command\": \"dbtPowerUser.compileCurrentModel\",\n        \"title\": \"Compile dbt Model\",\n        \"category\": \"dbt Power User\",\n        \"icon\": {\n          \"light\": \"./media/images/build_light.svg\",\n          \"dark\": \"./media/images/build_dark.svg\"\n        }\n      },\n      {\n        \"command\": \"dbtPowerUser.sqlPreview\",\n        \"title\": \"Compiled dbt Preview\",\n        \"category\": \"dbt Power User\",\n        \"icon\": \"$(diff)\"\n      },\n      {\n        \"command\": \"dbtPowerUser.runTest\",\n        \"title\": \"Run Test\",\n        \"category\": \"dbt Power User\",\n        \"icon\": \"$(pass)\"\n      },\n      {\n        \"command\": \"dbtPowerUser.testCurrentModel\",\n        \"title\": \"Test dbt Model\",\n        \"category\": \"dbt Power User\",\n        \"icon\": \"$(pass)\"\n      },\n      {\n        \"command\": \"dbtPowerUser.runChildrenModels\",\n        \"title\": \"Run Downstream Models\",\n        \"category\": \"dbt Power User\",\n        \"icon\": \"$(run-below)\"\n      },\n      {\n        \"command\": \"dbtPowerUser.runParentModels\",\n        \"title\": \"Run Upstream Models\",\n        \"category\": \"dbt Power User\",\n        \"icon\": \"$(run-above)\"\n      },\n      {\n        \"command\": \"dbtPowerUser.copyModelName\",\n        \"title\": \"Copy model name to clipboard\",\n        \"category\": \"dbt Power User\"\n      },\n      {\n        \"command\": \"dbtPowerUser.showRunSQL\",\n        \"title\": \"Open dbt target folder run SQL\",\n        \"category\": \"dbt Power User\",\n        \"icon\": {\n          \"light\": \"./media/images/file-code_light.svg\",\n          \"dark\": \"./media/images/file-code_dark.svg\"\n        }\n      },\n      {\n        \"command\": \"dbtPowerUser.generateSchemaYML\",\n        \"title\": \"Generate Documentation YML\",\n        \"category\": \"dbt Power User\",\n        \"icon\": {\n          \"light\": \"./media/images/file-code_light.svg\",\n          \"dark\": \"./media/images/file-code_dark.svg\"\n        }\n      },\n      {\n        \"command\": \"dbtPowerUser.goToDocumentationEditor\",\n        \"title\": \"Open Documentation Editor\",\n        \"category\": \"dbt Power User\",\n        \"icon\": {\n          \"light\": \"./media/images/file-code_light.svg\",\n          \"dark\": \"./media/images/file-code_dark.svg\"\n        }\n      },\n      {\n        \"command\": \"dbtPowerUser.generateDBTDocs\",\n        \"title\": \"Run Dbt Docs Generate\",\n        \"category\": \"dbt Power User\",\n        \"icon\": {\n          \"light\": \"./media/images/run-light.svg\",\n          \"dark\": \"./media/images/run-dark.svg\"\n        }\n      },\n      {\n        \"command\": \"dbtPowerUser.resetDatapilot\",\n        \"title\": \"Start New Chat\",\n        \"icon\": \"$(add)\",\n        \"category\": \"dbt Power User\"\n      },\n      {\n        \"command\": \"dbtPowerUser.maximizeDatapilot\",\n        \"title\": \"Maximize\",\n        \"category\": \"dbt Power User\",\n        \"icon\": {\n          \"light\": \"./media/images/fullscreen-light.svg\",\n          \"dark\": \"./media/images/fullscreen-dark.svg\"\n        }\n      },\n      {\n        \"command\": \"dbtPowerUser.showHelpDatapilot\",\n        \"title\": \"Help\",\n        \"category\": \"dbt Power User\",\n        \"icon\": \"$(question)\"\n      },\n      {\n        \"command\": \"dbtPowerUser.showCompiledSQL\",\n        \"title\": \"Open dbt target folder compiled SQL\",\n        \"category\": \"dbt Power User\",\n        \"icon\": {\n          \"light\": \"./media/images/file-code_light.svg\",\n          \"dark\": \"./media/images/file-code_dark.svg\"\n        }\n      },\n      {\n        \"command\": \"dbtPowerUser.executeSQL\",\n        \"title\": \"Execute dbt SQL\",\n        \"category\": \"dbt Power User\",\n        \"icon\": \"$(play)\"\n      },\n      {\n        \"command\": \"dbtPowerUser.buildCurrentModel\",\n        \"title\": \"Build dbt Model\",\n        \"category\": \"dbt Power User\",\n        \"icon\": {\n          \"light\": \"./media/images/build-model_light.svg\",\n          \"dark\": \"./media/images/build-model_dark.svg\"\n        }\n      },\n      {\n        \"command\": \"dbtPowerUser.buildChildrenModels\",\n        \"title\": \"Build Downstream Models (model+)\",\n        \"category\": \"dbt Power User\",\n        \"icon\": {\n          \"light\": \"./media/images/build-model_light.svg\",\n          \"dark\": \"./media/images/build-model_dark.svg\"\n        }\n      },\n      {\n        \"command\": \"dbtPowerUser.buildParentModels\",\n        \"title\": \"Build Upstream Models (+model)\",\n        \"category\": \"dbt Power User\",\n        \"icon\": {\n          \"light\": \"./media/images/build-model_light.svg\",\n          \"dark\": \"./media/images/build-model_dark.svg\"\n        }\n      },\n      {\n        \"command\": \"dbtPowerUser.buildChildrenParentModels\",\n        \"title\": \"Build Upstream and Downstream Models (+model+)\",\n        \"category\": \"dbt Power User\",\n        \"icon\": {\n          \"light\": \"./media/images/build-model_light.svg\",\n          \"dark\": \"./media/images/build-model_dark.svg\"\n        }\n      },\n      {\n        \"command\": \"dbtPowerUser.buildCurrentProject\",\n        \"title\": \"Build dbt Project\",\n        \"category\": \"dbt Power User\",\n        \"icon\": {\n          \"light\": \"./media/images/build-model_light.svg\",\n          \"dark\": \"./media/images/build-model_dark.svg\"\n        }\n      },\n      {\n        \"command\": \"dbtPowerUser.cleanCurrentProject\",\n        \"title\": \"Clean dbt Project\",\n        \"category\": \"dbt Power User\",\n        \"icon\": \"$(clear-all)\"\n      },\n      {\n        \"command\": \"dbtPowerUser.printEnvVars\",\n        \"title\": \"Print environment variables\",\n        \"category\": \"dbt Power User\",\n        \"icon\": \"$(gist-secret)\"\n      },\n      {\n        \"command\": \"dbtPowerUser.diagnostics\",\n        \"title\": \"Collect diagnostics\",\n        \"category\": \"dbt Power User\",\n        \"icon\": \"$(debug-console)\"\n      },\n      {\n        \"command\": \"dbtPowerUser.detectPythonFromTerminal\",\n        \"title\": \"Detect Python from terminal\",\n        \"category\": \"dbt Power User\",\n        \"icon\": \"$(terminal)\"\n      },\n      {\n        \"command\": \"dbtPowerUser.sqlLineage\",\n        \"title\": \"Visualize SQL (Beta)\",\n        \"category\": \"dbt Power User\",\n        \"icon\": \"$(eye)\"\n      },\n      {\n        \"command\": \"dbtPowerUser.showDocumentation\",\n        \"title\": \"Show documentation\",\n        \"category\": \"dbt Power User\"\n      },\n      {\n        \"command\": \"dbtPowerUser.showDatapilotNotebooksQuickPick\",\n        \"title\": \"Show Datapilot Notebooks Quick Pick\",\n        \"category\": \"dbt Power User\"\n      },\n      {\n        \"command\": \"dbtPowerUser.showNotebookProfileQuery\",\n        \"title\": \"Profile this query\",\n        \"group\": \"notebooks@1\"\n      },\n      {\n        \"command\": \"dbtPowerUser.showNotebookTestSuggestions\",\n        \"title\": \"Get test suggestions\",\n        \"group\": \"notebooks@2\"\n      },\n      {\n        \"command\": \"dbtPowerUser.showNotebookGenerateBaseModelSql\",\n        \"title\": \"Generate dbt base model sql\",\n        \"group\": \"notebooks@3\"\n      },\n      {\n        \"command\": \"dbtPowerUser.showNotebookGenerateModelYaml\",\n        \"title\": \"Generate dbt model yaml\",\n        \"group\": \"notebooks@4\"\n      },\n      {\n        \"command\": \"dbtPowerUser.showNotebookGenerateModelCTE\",\n        \"title\": \"Generate dbt model CTE\",\n        \"group\": \"notebooks@5\"\n      },\n      {\n        \"command\": \"dbtPowerUser.applyDeferConfig\",\n        \"category\": \"dbt Power User\",\n        \"title\": \"Apply defer configuration\"\n      },\n      {\n        \"command\": \"dbtPowerUser.askAltimateAboutSelection\",\n        \"category\": \"dbt Power User\",\n        \"title\": \"Ask Altimate About Selection\"\n      },\n      {\n        \"command\": \"dbtPowerUser.explainWithAltimate\",\n        \"category\": \"dbt Power User\",\n        \"title\": \"Explain with Altimate\"\n      },\n      {\n        \"command\": \"dbtPowerUser.optimizeWithAltimate\",\n        \"category\": \"dbt Power User\",\n        \"title\": \"Optimize with Altimate\"\n      },\n      {\n        \"command\": \"dbtPowerUser.analyzeFileWithAltimate\",\n        \"category\": \"dbt Power User\",\n        \"title\": \"Analyze with Altimate\"\n      },\n      {\n        \"command\": \"dbtPowerUser.openAltimateChat\",\n        \"category\": \"dbt Power User\",\n        \"title\": \"Open Altimate Code Chat\",\n        \"icon\": \"$(sparkle)\"\n      },\n      {\n        \"command\": \"dbtPowerUser.reviewCodeWithAltimate\",\n        \"category\": \"dbt Power User\",\n        \"title\": \"Review with Altimate\"\n      }\n    ],\n    \"keybindings\": [\n      {\n        \"key\": \"Ctrl+Enter\",\n        \"mac\": \"Cmd+Enter\",\n        \"command\": \"dbtPowerUser.executeSQL\",\n        \"when\": \"editorFocus && resourceLangId =~ /^sql$|^jinja-sql$/\"\n      },\n      {\n        \"key\": \"Ctrl+'\",\n        \"mac\": \"Cmd+'\",\n        \"command\": \"dbtPowerUser.sqlPreview\"\n      }\n    ],\n    \"menus\": {\n      \"file/newFile\": [\n        {\n          \"command\": \"dbtPowerUser.createSqlFile\"\n        },\n        {\n          \"command\": \"dbtPowerUser.createDatapilotNotebook\",\n          \"when\": \"dbt.enableNotebooks == true\",\n          \"group\": \"notebook\"\n        }\n      ],\n      \"comments/commentThread/title\": [\n        {\n          \"command\": \"dbtPowerUser.viewInDocEditor\",\n          \"group\": \"navigation\",\n          \"when\": \"commentController == altimate-conversations && (commentThread =~ /saved/) && commentThread =~ /description/\"\n        },\n        {\n          \"command\": \"dbtPowerUser.copyDbtDocsLink\",\n          \"group\": \"navigation\",\n          \"when\": \"commentController == altimate-conversations && (commentThread =~ /saved/)\"\n        },\n        {\n          \"command\": \"dbtPowerUser.viewInDbtDocs\",\n          \"group\": \"navigation\",\n          \"when\": \"commentController == altimate-conversations && (commentThread =~ /saved/)\"\n        },\n        {\n          \"command\": \"dbtPowerUser.resolveConversation\",\n          \"group\": \"inline\",\n          \"when\": \"commentController == altimate-conversations && !commentThreadIsEmpty && (commentThread =~ /saved/)\"\n        }\n      ],\n      \"comments/commentThread/context\": [\n        {\n          \"command\": \"dbtPowerUser.createConversation\",\n          \"group\": \"inline@1\",\n          \"when\": \"commentController == altimate-conversations && commentThreadIsEmpty\"\n        },\n        {\n          \"command\": \"dbtPowerUser.replyToConversation\",\n          \"group\": \"inline\",\n          \"when\": \"commentController == altimate-conversations && !commentThreadIsEmpty\"\n        }\n      ],\n      \"dbtPowerUser.datapilotSubmenu\": [\n        {\n          \"command\": \"dbtPowerUser.openDatapilotWithQuery\",\n          \"group\": \"datapilot@1\"\n        },\n        {\n          \"command\": \"dbtPowerUser.summarizeQuery\",\n          \"group\": \"datapilot@2\"\n        },\n        {\n          \"command\": \"dbtPowerUser.changeQuery\",\n          \"group\": \"datapilot@3\"\n        },\n        {\n          \"command\": \"dbtPowerUser.translateQuery\",\n          \"group\": \"datapilot@4\"\n        },\n        {\n          \"command\": \"dbtPowerUser.sqlLineage\",\n          \"group\": \"datapilot@5\"\n        },\n        {\n          \"command\": \"dbtPowerUser.showNotebookProfileQuery\",\n          \"group\": \"notebooks@1\"\n        },\n        {\n          \"command\": \"dbtPowerUser.showNotebookTestSuggestions\",\n          \"group\": \"notebooks@2\"\n        },\n        {\n          \"command\": \"dbtPowerUser.showNotebookGenerateBaseModelSql\",\n          \"group\": \"notebooks@3\"\n        },\n        {\n          \"command\": \"dbtPowerUser.showNotebookGenerateModelYaml\",\n          \"group\": \"notebooks@4\"\n        },\n        {\n          \"command\": \"dbtPowerUser.showNotebookGenerateModelCTE\",\n          \"group\": \"notebooks@5\"\n        }\n      ],\n      \"dbtPowerUser.altimateCodeSubmenu\": [\n        {\n          \"command\": \"dbtPowerUser.askAltimateAboutSelection\",\n          \"group\": \"1@1\",\n          \"when\": \"editorHasSelection\"\n        },\n        {\n          \"command\": \"dbtPowerUser.explainWithAltimate\",\n          \"group\": \"1@2\"\n        },\n        {\n          \"command\": \"dbtPowerUser.optimizeWithAltimate\",\n          \"group\": \"1@3\",\n          \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\"\n        },\n        {\n          \"command\": \"dbtPowerUser.reviewCodeWithAltimate\",\n          \"group\": \"2@1\",\n          \"when\": \"dbtPowerUser.fileHasGitChanges\"\n        }\n      ],\n      \"explorer/context\": [\n        {\n          \"command\": \"dbtPowerUser.analyzeFileWithAltimate\",\n          \"group\": \"altimate@1\",\n          \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$|^yaml$|^jinja-yaml$/\"\n        }\n      ],\n      \"editor/title\": [\n        {\n          \"command\": \"dbtPowerUser.openAltimateChat\",\n          \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$|^yaml$|^jinja-yaml$/\",\n          \"group\": \"navigation@0\"\n        },\n        {\n          \"command\": \"dbtPowerUser.executeSQL\",\n          \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\",\n          \"group\": \"navigation@1\"\n        },\n        {\n          \"command\": \"dbtPowerUser.runCurrentModel\",\n          \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\",\n          \"group\": \"navigation@3\"\n        },\n        {\n          \"command\": \"dbtPowerUser.testCurrentModel\",\n          \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\",\n          \"group\": \"navigation@4\"\n        },\n        {\n          \"command\": \"dbtPowerUser.sqlPreview\",\n          \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\",\n          \"group\": \"navigation@5\"\n        },\n        {\n          \"command\": \"dbtPowerUser.sqlQuickPick\",\n          \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\",\n          \"group\": \"navigation@1\"\n        },\n        {\n          \"command\": \"dbtPowerUser.sqlToModel\",\n          \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\",\n          \"group\": \"navigation@6\"\n        }\n      ],\n      \"editor/context\": [\n        {\n          \"submenu\": \"dbtPowerUser.altimateCodeSubmenu\",\n          \"group\": \"altimate@1\",\n          \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$|^yaml$|^jinja-yaml$/\"\n        },\n        {\n          \"submenu\": \"dbtPowerUser.datapilotSubmenu\",\n          \"group\": \"datapilot@1\",\n          \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\"\n        },\n        {\n          \"submenu\": \"dbtPowerUser.buildModel\",\n          \"group\": \"dbt@5\",\n          \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\"\n        },\n        {\n          \"command\": \"dbtPowerUser.showCompiledSQL\",\n          \"group\": \"dbt@5\",\n          \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\"\n        },\n        {\n          \"command\": \"dbtPowerUser.showRunSQL\",\n          \"group\": \"dbt@6\",\n          \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\"\n        },\n        {\n          \"command\": \"dbtPowerUser.goToDocumentationEditor\",\n          \"group\": \"dbt@7\",\n          \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\"\n        },\n        {\n          \"command\": \"dbtPowerUser.testCurrentModel\",\n          \"group\": \"dbt@2\",\n          \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\"\n        },\n        {\n          \"command\": \"dbtPowerUser.runCurrentModel\",\n          \"group\": \"dbt@1\",\n          \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\"\n        },\n        {\n          \"command\": \"dbtPowerUser.sqlToModel\",\n          \"group\": \"dbt@3\",\n          \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\"\n        },\n        {\n          \"command\": \"dbtPowerUser.compileCurrentModel\",\n          \"group\": \"dbt@4\",\n          \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\"\n        },\n        {\n          \"command\": \"dbtPowerUser.validateSql\",\n          \"group\": \"dbt@4\",\n          \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\"\n        },\n        {\n          \"command\": \"dbtPowerUser.bigqueryCostEstimate\",\n          \"group\": \"dbt@4\",\n          \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\"\n        }\n      ],\n      \"editor/title/run\": [\n        {\n          \"command\": \"dbtPowerUser.buildCurrentProject\",\n          \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\",\n          \"group\": \"inline\"\n        },\n        {\n          \"command\": \"dbtPowerUser.buildCurrentModel\",\n          \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\",\n          \"group\": \"inline\"\n        },\n        {\n          \"command\": \"dbtPowerUser.buildChildrenModels\",\n          \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\",\n          \"group\": \"inline\"\n        },\n        {\n          \"command\": \"dbtPowerUser.buildParentModels\",\n          \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\",\n          \"group\": \"inline\"\n        },\n        {\n          \"command\": \"dbtPowerUser.buildChildrenParentModels\",\n          \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\",\n          \"group\": \"inline\"\n        },\n        {\n          \"command\": \"dbtPowerUser.runCurrentModel\",\n          \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\",\n          \"group\": \"inline\"\n        },\n        {\n          \"command\": \"dbtPowerUser.cleanCurrentProject\",\n          \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\",\n          \"group\": \"inline\"\n        }\n      ],\n      \"view/title\": [\n        {\n          \"command\": \"dbtPowerUser.testCurrentModel\",\n          \"when\": \"view == model_test_treeview\",\n          \"group\": \"navigation\"\n        },\n        {\n          \"command\": \"dbtPowerUser.runChildrenModels\",\n          \"when\": \"view == children_model_treeview\",\n          \"group\": \"navigation\"\n        },\n        {\n          \"command\": \"dbtPowerUser.runParentModels\",\n          \"when\": \"view == parent_model_treeview\",\n          \"group\": \"navigation\"\n        },\n        {\n          \"command\": \"dbtPowerUser.generateDBTDocs\",\n          \"when\": \"view == documentation_treeview\",\n          \"group\": \"navigation\"\n        },\n        {\n          \"command\": \"dbtPowerUser.resetDatapilot\",\n          \"when\": \"view == dbtPowerUser.datapilot-webview\",\n          \"group\": \"navigation@1\"\n        },\n        {\n          \"command\": \"dbtPowerUser.showHelpDatapilot\",\n          \"when\": \"view == dbtPowerUser.datapilot-webview\",\n          \"group\": \"navigation@3\"\n        },\n        {\n          \"command\": \"dbtPowerUser.clearRunHistory\",\n          \"when\": \"view == run_history_treeview\",\n          \"group\": \"2_clear\"\n        }\n      ],\n      \"view/item/context\": [\n        {\n          \"command\": \"dbtPowerUser.rerunFromHistory\",\n          \"when\": \"view == run_history_treeview && viewItem == runHistoryEntry\",\n          \"group\": \"inline\"\n        },\n        {\n          \"command\": \"dbtPowerUser.runTest\",\n          \"when\": \"view == model_test_treeview && viewItem != source\",\n          \"group\": \"inline\"\n        },\n        {\n          \"command\": \"dbtPowerUser.runChildrenModels\",\n          \"when\": \"view == children_model_treeview && viewItem != source\",\n          \"group\": \"inline\"\n        },\n        {\n          \"command\": \"dbtPowerUser.runParentModels\",\n          \"when\": \"view == parent_model_treeview && viewItem != source\",\n          \"group\": \"inline\"\n        },\n        {\n          \"command\": \"dbtPowerUser.copyModelName\",\n          \"when\": \"(view == parent_model_treeview || view ==  children_model_treeview || view == documentation_treeview) && viewItem != source\",\n          \"group\": \"navigation\"\n        },\n        {\n          \"command\": \"dbtPowerUser.goToDocumentationEditor\",\n          \"when\": \"view == documentation_treeview\",\n          \"group\": \"inline\"\n        }\n      ]\n    },\n    \"dbtPowerUser.buildModel\": [\n      {\n        \"command\": \"dbtPowerUser.buildCurrentModel\",\n        \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\",\n        \"group\": \"inline\"\n      },\n      {\n        \"command\": \"dbtPowerUser.buildChildrenModels\",\n        \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\",\n        \"group\": \"inline\"\n      },\n      {\n        \"command\": \"dbtPowerUser.buildParentModels\",\n        \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\",\n        \"group\": \"inline\"\n      },\n      {\n        \"command\": \"dbtPowerUser.buildChildrenParentModels\",\n        \"when\": \"resourceLangId =~ /^sql$|^jinja-sql$/\",\n        \"group\": \"inline\"\n      }\n    ],\n    \"submenus\": [\n      {\n        \"id\": \"dbtPowerUser.buildModel\",\n        \"label\": \"Build dbt Model\",\n        \"icon\": {\n          \"light\": \"./media/images/build-model_light.svg\",\n          \"dark\": \"./media/images/build-model_dark.svg\"\n        }\n      },\n      {\n        \"id\": \"dbtPowerUser.datapilotSubmenu\",\n        \"label\": \"Datapilot\"\n      },\n      {\n        \"id\": \"dbtPowerUser.altimateCodeSubmenu\",\n        \"label\": \"Altimate Code\"\n      }\n    ],\n    \"languages\": [\n      {\n        \"id\": \"jinja-sql\",\n        \"icon\": {\n          \"light\": \"./media/images/dbt_file_icon.svg\",\n          \"dark\": \"./media/images/dbt_file_icon.svg\"\n        }\n      }\n    ],\n    \"grammars\": [\n      {\n        \"language\": \"jinja-sql\",\n        \"scopeName\": \"source.sql.jinja\",\n        \"path\": \"./syntaxes/jinja-sql.tmLanguage.json\"\n      },\n      {\n        \"scopeName\": \"source.yaml.jinja\",\n        \"path\": \"./syntaxes/jinja-yaml.tmLanguage.json\",\n        \"injectTo\": [\n          \"source.yaml\"\n        ]\n      }\n    ]\n  },\n  \"scripts\": {\n    \"postinstall\": \"node postInstall.js\",\n    \"prepare\": \"husky\",\n    \"vscode:prepublish\": \"npm run panel:webviews && rsbuild build && node prepareBuild.js\",\n    \"build\": \"npm run panel:webviews && rsbuild build\",\n    \"build-dev\": \"npm run panel:webviews && rsbuild build --mode development\",\n    \"watch\": \"concurrently \\\"npm:watch --prefix ./webview_panels\\\" \\\"rsbuild build --mode development --watch\\\"\",\n    \"test-compile\": \"tsc -p ./\",\n    \"lint\": \"eslint src --ext ts\",\n    \"lint:fix\": \"eslint src --ext ts --fix\",\n    \"deploy-vscode\": \"vsce publish\",\n    \"build-vsix\": \"vsce package\",\n    \"deploy-openvsx\": \"ovsx publish\",\n    \"panel:webviews\": \"npm run build --prefix ./webview_panels\",\n    \"install:panels\": \"npm install --prefix ./webview_panels\",\n    \"test\": \"jest\",\n    \"test:unit\": \"jest\",\n    \"test:integration\": \"npm run test-compile && node out/test/integration/runTests.js\",\n    \"test:coverage\": \"jest --coverage\",\n    \"pretest\": \"npm run clean && npm run compile\",\n    \"clean\": \"rimraf out coverage\",\n    \"compile\": \"tsc -p ./\",\n    \"docker:deploy\": \"./docker-setup/deploy.sh\",\n    \"docker:logs\": \"cd docker-setup && docker compose logs -f || docker-compose logs -f\",\n    \"docker:stop\": \"cd docker-setup && docker compose down || docker-compose down\"\n  },\n  \"devDependencies\": {\n    \"@istanbuljs/nyc-config-typescript\": \"^1.0.2\",\n    \"@rsbuild/core\": \"^1.5.17\",\n    \"@types/chai\": \"^4.3.9\",\n    \"@types/glob\": \"^8.1.0\",\n    \"@types/istanbul-lib-coverage\": \"^2.0.6\",\n    \"@types/jest\": \"^29.5.0\",\n    \"@types/js-yaml\": \"^4.0.9\",\n    \"@types/mocha\": \"^10.0.7\",\n    \"@types/node\": \"^25.6.0\",\n    \"@types/vscode\": \"^1.95.0\",\n    \"@types/which\": \"^3.0.4\",\n    \"@types/ws\": \"^8.5.12\",\n    \"@typescript-eslint/eslint-plugin\": \"^5.62.0\",\n    \"@typescript-eslint/parser\": \"^5.62.0\",\n    \"@vscode/debugadapter\": \"^1.68.0\",\n    \"@vscode/debugprotocol\": \"^1.68.0\",\n    \"@vscode/test-electron\": \"^2.4.1\",\n    \"@vscode/zeromq\": \"^0.2.1\",\n    \"chai\": \"^4.3.10\",\n    \"concurrently\": \"^8.2.2\",\n    \"cross-env\": \"^7.0.3\",\n    \"eslint\": \"^8.57.0\",\n    \"eslint-config-prettier\": \"^8.9.0\",\n    \"eslint-plugin-prettier\": \"^5.2.1\",\n    \"file-loader\": \"^6.1.0\",\n    \"glob\": \"^10.4.2\",\n    \"glob-parent\": \"^6.0.2\",\n    \"husky\": \"^9.1.4\",\n    \"istanbul-lib-coverage\": \"^3.2.2\",\n    \"istanbul-lib-instrument\": \"^6.0.3\",\n    \"jest\": \"^29.5.0\",\n    \"lint-staged\": \"^15.2.5\",\n    \"mocha\": \"^10.7.0\",\n    \"ovsx\": \"^0.10.11\",\n    \"patch-package\": \"^8.0.1\",\n    \"prettier\": \"^3.3.3\",\n    \"prettier-eslint\": \"^15.0.1\",\n    \"prettier-plugin-organize-imports\": \"^3.2.4\",\n    \"source-map-support\": \"^0.5.21\",\n    \"ts-jest\": \"^29.1.0\",\n    \"ts-loader\": \"^9.4.4\",\n    \"ts-mockito\": \"^2.6.1\",\n    \"ts-node\": \"^10.9.2\",\n    \"typescript\": \"^5.9.3\"\n  },\n  \"extensionDependencies\": [\n    \"samuelcolvin.jinjahtml\",\n    \"ms-python.python\",\n    \"altimateai.vscode-altimate-mcp-server\"\n  ],\n  \"dependencies\": {\n    \"@altimateai/dbt-integration\": \"^0.2.14\",\n    \"@jupyterlab/coreutils\": \"^6.2.4\",\n    \"@jupyterlab/nbformat\": \"^4.2.4\",\n    \"@jupyterlab/services\": \"^7.0.0\",\n    \"@modelcontextprotocol/sdk\": \"^1.24.0\",\n    \"@nteract/messaging\": \"^7.0.20\",\n    \"@types/express\": \"^5.0.0\",\n    \"@vscode/chat-extension-utils\": \"^0.0.0-alpha.5\",\n    \"@vscode/codicons\": \"^0.0.36\",\n    \"@vscode/extension-telemetry\": \"0.9.7\",\n    \"@vscode/vsce\": \"^2.31.1\",\n    \"@vscode/webview-ui-toolkit\": \"^1.4.0\",\n    \"dayjs\": \"^1.11.13\",\n    \"express\": \"^5.1.0\",\n    \"inversify\": \"^6.0.2\",\n    \"inversify-binding-decorators\": \"^4.0.0\",\n    \"node-abort-controller\": \"^3.1.1\",\n    \"node-fetch\": \"^3.3.2\",\n    \"parse-diff\": \"^0.11.1\",\n    \"python-bridge\": \"^1.1.0\",\n    \"reflect-metadata\": \"^0.2.2\",\n    \"semver\": \"^7.6.3\",\n    \"which\": \"^6.0.1\",\n    \"ws\": \"^8.18.0\",\n    \"yaml\": \"^2.6.0\",\n    \"zeromq\": \"^6.1.1\",\n    \"zod\": \"^3.25.28\",\n    \"zod-to-json-schema\": \"^3.25.2\"\n  },\n  \"lint-staged\": {\n    \"**/webview_panels/**/*.{ts,tsx}\": [\n      \"cross-env PRE_COMMIT=true npm run lint --fix --prefix webview_panels\",\n      \"prettier -w\"\n    ],\n    \"*.ts\": [\n      \"eslint src --ext ts --fix\",\n      \"eslint --max-warnings=0\"\n    ],\n    \"*.{js,css,md,html,json}\": \"prettier --cache --write\"\n  },\n  \"packageManager\": \"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e\"\n}\n"
  },
  {
    "path": "package.nls.json",
    "content": "{\n  \"walkthrough.<id>.title\": \"Walkthrough Title\",\n  \"walkthrough.<id>.description\": \"Walkthrough Description\",\n  \"walkthrough.<id>.steps.<stepid>.title\": \"Walkthrough idx step idy title\",\n  \"walkthrough.<id>.steps.<stepid>.description\": \"Walkthrough idx step idy description\",\n  \"walkthrough.initialSetup.title\": \"Setup dbt Power User\",\n  \"walkthrough.initialSetup.description\": \"Setup the dbt Power User extension for your project by following the steps shown below.\",\n  \"walkthrough.initialSetup.steps.support.title\": \"Welcome to dbt Power User setup!\",\n  \"walkthrough.initialSetup.steps.support.description\": \"Before you begin, know that our team is on standby to assist you. Should you encounter any issues or have questions, [contact us](https://www.altimate.ai/support) right away.\",\n  \"walkthrough.initialSetup.steps.open.title\": \"Open dbt Project\",\n  \"walkthrough.initialSetup.steps.open.description\": \"To start off, open a dbt project.\\n[Open dbt Project](command:toSide:vscode.openFolder)\",\n  \"walkthrough.initialSetup.steps.selectInterpreter.title\": \"Select Python Interpreter\",\n  \"walkthrough.initialSetup.steps.selectInterpreter.description\": \"Choose the Python Interpreter where you have installed dbt.\\n[Select Python Interpreter](command:python.setInterpreter)\",\n  \"walkthrough.initialSetup.steps.installDbt.title\": \"Install dbt\",\n  \"walkthrough.initialSetup.steps.installDbt.description\": \"Please install dbt in the selected Python Environment.\\n[Install dbt](command:dbtPowerUser.installDbt)\",\n  \"walkthrough.initialSetup.steps.updateExtension.title\": \"Update dbt Power User Extension\",\n  \"walkthrough.initialSetup.steps.updateExtension.description\": \"To get the latest features, update the dbt Power User extension.\\n[Update Extension](command:workbench.extensions.action.extensionUpdates)\",\n  \"walkthrough.initialSetup.steps.associateFileExts.title\": \"Associate File Types\",\n  \"walkthrough.initialSetup.steps.associateFileExts.description\": \"For dbt Power User to work, *.sql file types need to be associated with the value 'sql' or 'jinja-sql' and *.yml file types should be associated with the value 'yaml' or 'jinja-yaml'.\\n[Associate File Types](command:toSide:dbtPowerUser.associateFileExts)\",\n  \"walkthrough.initialSetup.steps.validateProjectCore.title\": \"Validate project setup\",\n  \"walkthrough.initialSetup.steps.validateProjectCore.description\": \"Check if the dbt project is setup correctly. This will run dbt debug to ensure that dbt is able to locate the profile and connect to the database. You can validate multiple projects one by one as well\\n[Validate Project](command:dbtPowerUser.validateProject)\",\n  \"walkthrough.initialSetup.steps.validateProjectCloud.title\": \"Validate project setup\",\n  \"walkthrough.initialSetup.steps.validateProjectCloud.description\": \"Check if the dbt project is setup correctly. This will run dbt environment show to ensure that dbt is able to locate the profile and connect to the database. You can validate multiple projects one by one as well\\n[Validate Project](command:dbtPowerUser.validateProject)\",\n  \"walkthrough.initialSetup.steps.pickProject.title\": \"Pick a dbt project\",\n  \"walkthrough.initialSetup.steps.pickProject.description\": \"Now, let’s validate the dbt project that you are working on by checking for dbt dependencies and identifying any issues in the configuration.\\n[Pick Project](command:dbtPowerUser.pickProject)\",\n  \"walkthrough.initialSetup.steps.installDeps.title\": \"Run dbt deps\",\n  \"walkthrough.initialSetup.steps.installDeps.description\": \"This step will run dbt deps and install or update any packages involved in the project. You should see the results in a terminal that opens up. Each package should say 'Up to Date' as they are installed/ updated.\\n[Run dbt deps](command:dbtPowerUser.installDeps)\",\n  \"walkthrough.initialSetup.steps.finish.title\": \"Finish setup\",\n  \"walkthrough.initialSetup.steps.finish.description\": \"If you followed all the steps so far, the extension should be set up for your project.\\nIf you work with multiple projects in a single workspace, please pick another project and run the steps to install packages and run validation for all of them.\\nIf you still have issues, you can [contact us](https://www.altimate.ai/support) for further help\",\n  \"walkthrough.tutorials.title\": \"dbt Power User Tutorials\",\n  \"walkthrough.tutorials.description\": \"Learn about new dbt Power User features in these tutorials.\",\n  \"walkthrough.tutorials.steps.autocompletion.title\": \"Auto-completion of models, macros and sources\",\n  \"walkthrough.tutorials.steps.autocompletion.description\": \" \",\n  \"walkthrough.tutorials.steps.previews.title\": \"dbt model and SQL query results preview\",\n  \"walkthrough.tutorials.steps.previews.description\": \" \",\n  \"walkthrough.tutorials.steps.documentation.title\": \"Generate or edit dbt documentation easily\",\n  \"walkthrough.tutorials.steps.documentation.description\": \" \",\n  \"walkthrough.tutorials.steps.lineage.title\": \"Model Lineage and impact analysis using column level lineage\",\n  \"walkthrough.tutorials.steps.lineage.description\": \" \",\n  \"walkthrough.tutorials.steps.dependants.title\": \"Click to build and run parent / children models, tests\",\n  \"walkthrough.tutorials.steps.dependants.description\": \" \",\n  \"walkthrough.tutorials.steps.generate_models.title\": \"Generate dbt models from SQL or source files\",\n  \"walkthrough.tutorials.steps.generate_models.description\": \" \",\n  \"walkthrough.tutorials.steps.healthcheck.title\": \"Project Health Check - find issues in your dbt project\",\n  \"walkthrough.tutorials.steps.healthcheck.description\": \" \",\n  \"walkthrough.tutorials.steps.qsummary.title\": \"Query Summary\",\n  \"walkthrough.tutorials.steps.qsummary.description\": \" \"\n}\n"
  },
  {
    "path": "postInstall.js",
    "content": "// Copied from https://github.com/microsoft/vscode-jupyter/blob/main/build/ci/postInstall.js\nconst fs = require(\"fs\");\nconst { downloadZMQ } = require(\"@vscode/zeromq\");\nconst path = require(\"path\");\n\n/**\n * In order to get raw kernels working, we reuse the default kernel that jupyterlab ships.\n * However it expects to be talking to a websocket which is serializing the messages to strings.\n * Our raw kernel is not a web socket and needs to do its own serialization. To do so, we make a copy\n * of the default kernel with the serialization stripped out. This is simpler than making a copy of the module\n * at runtime.\n */\nfunction createJupyterKernelWithoutSerialization() {\n  var relativePath = path.join(\n    \"node_modules\",\n    \"@jupyterlab\",\n    \"services\",\n    \"lib\",\n    \"kernel\",\n    \"default.js\",\n  );\n  var filePath = path.join(\"\", relativePath);\n  if (!fs.existsSync(filePath)) {\n    throw new Error(\n      \"Jupyter lab default kernel not found '\" +\n        filePath +\n        \"' (Jupyter Extension post install script)\",\n    );\n  }\n  var fileContents = fs.readFileSync(filePath, { encoding: \"utf8\" });\n\n  // Strip websocket serialization by replacing serializer calls with pass-through.\n  var replacedContents = fileContents\n    .replace(\n      /this\\.serverSettings\\.serializer\\.deserialize\\(([^,]+),\\s*this\\._ws\\.protocol\\)/g,\n      \"$1\",\n    )\n    .replace(\n      /this\\.serverSettings\\.serializer\\.serialize\\(([^,]+),\\s*this\\._ws\\.protocol\\)/g,\n      \"$1\",\n    );\n\n  if (replacedContents === fileContents) {\n    throw new Error(\n      \"Jupyter lab default kernel cannot be made non serializing\",\n    );\n  }\n  var destPath = path.join(path.dirname(filePath), \"nonSerializingKernel.js\");\n  fs.writeFileSync(destPath, replacedContents);\n  console.log(destPath + \" file generated (by Jupyter VSC)\");\n}\n\nasync function downloadZmqBinaries() {\n  //   if (common.getBundleConfiguration() === common.bundleConfiguration.web) {\n  //     // No need to download zmq binaries for web.\n  //     return;\n  //   }\n  await downloadZMQ();\n}\n\n/**\n * Install altimate-core platform binaries.\n *\n * When VSCE_TARGET is set (CI builds platform-specific VSIXs), only install the\n * matching platform binary. Otherwise (local dev), install all platforms so the\n * extension works regardless of which machine it runs on.\n *\n * npm only installs optional dependencies for the current platform.\n * We use npm pack + tar to manually extract the tarballs into node_modules.\n */\nasync function installAltimateCoreAllPlatforms() {\n  const { execSync } = require(\"child_process\");\n\n  // Read version from the main altimate-core package to keep platform\n  // packages in sync (npm pack without a version would fetch \"latest\").\n  const corePkgPath = path.join(\n    \"node_modules\",\n    \"@altimateai\",\n    \"altimate-core\",\n    \"package.json\",\n  );\n  if (!fs.existsSync(corePkgPath)) {\n    console.warn(\n      \"@altimateai/altimate-core not found in node_modules, skipping platform binary install\",\n    );\n    return;\n  }\n  const { version: coreVersion } = JSON.parse(\n    fs.readFileSync(corePkgPath, \"utf8\"),\n  );\n  console.log(`altimate-core version: ${coreVersion}`);\n\n  // Map VS Code target platforms to altimate-core npm package names\n  const vsceTargetToPackage = {\n    \"darwin-arm64\": \"@altimateai/altimate-core-darwin-arm64\",\n    \"darwin-x64\": \"@altimateai/altimate-core-darwin-x64\",\n    \"linux-arm64\": \"@altimateai/altimate-core-linux-arm64-gnu\",\n    \"linux-x64\": \"@altimateai/altimate-core-linux-x64-gnu\",\n    \"win32-x64\": \"@altimateai/altimate-core-win32-x64-msvc\",\n  };\n\n  const allPackages = Object.values(vsceTargetToPackage);\n  const vsceTarget = process.env.VSCE_TARGET;\n\n  let packagesToInstall;\n  if (vsceTarget) {\n    const pkg = vsceTargetToPackage[vsceTarget];\n    if (!pkg) {\n      console.warn(\n        `Unknown VSCE_TARGET \"${vsceTarget}\", installing all platforms`,\n      );\n      packagesToInstall = allPackages;\n    } else {\n      console.log(`VSCE_TARGET=${vsceTarget} — installing only ${pkg}`);\n      packagesToInstall = [pkg];\n    }\n  } else {\n    packagesToInstall = allPackages;\n  }\n\n  const missing = packagesToInstall.filter((pkg) => {\n    const pkgDir = path.join(\"node_modules\", ...pkg.split(\"/\"));\n    return !fs.existsSync(pkgDir);\n  });\n\n  if (missing.length === 0) {\n    console.log(\n      \"All required altimate-core platform packages already installed\",\n    );\n    return;\n  }\n\n  console.log(\n    `Installing altimate-core platform packages via npm pack: ${missing.join(\", \")}`,\n  );\n\n  const os = require(\"os\");\n  const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"altimate-core-\"));\n\n  for (const pkg of missing) {\n    try {\n      // npm pack downloads the tarball without os/cpu filtering\n      const tgzFile = execSync(\n        `npm pack ${pkg}@${coreVersion} --pack-destination ${tmpDir}`,\n        { encoding: \"utf8\" },\n      ).trim();\n      const tgzPath = path.join(tmpDir, tgzFile);\n      const destDir = path.join(\"node_modules\", ...pkg.split(\"/\"));\n      fs.mkdirSync(destDir, { recursive: true });\n      execSync(`tar xzf \"${tgzPath}\" --strip-components=1 -C \"${destDir}\"`);\n      console.log(`Installed ${pkg} via npm pack + tar`);\n    } catch (ex) {\n      console.error(`Failed to install ${pkg}: ${ex.message}`);\n    }\n  }\n\n  // Clean up temp dir\n  try {\n    fs.rmSync(tmpDir, { recursive: true });\n  } catch {}\n\n  // Verify required packages are present\n  const stillMissing = packagesToInstall.filter((pkg) => {\n    const pkgDir = path.join(\"node_modules\", ...pkg.split(\"/\"));\n    return !fs.existsSync(pkgDir);\n  });\n  if (stillMissing.length > 0) {\n    console.error(\n      `ERROR: These altimate-core packages are still missing: ${stillMissing.join(\", \")}`,\n    );\n  } else {\n    console.log(\n      \"All required altimate-core platform packages installed successfully\",\n    );\n  }\n}\n\n/**\n * Map VSCE_TARGET to the zeromq prebuild folder names to keep.\n * Returns empty array when no target is set (keep all).\n * Mirrors getZeroMQPreBuildsFoldersToKeep() in prepareBuild.js.\n */\nfunction getZeroMQPreBuildsFoldersToKeep(vsceTarget) {\n  if (!vsceTarget) {\n    return [];\n  } else if (vsceTarget.includes(\"win32\")) {\n    if (vsceTarget.includes(\"x64\")) {\n      return [\"win32-x64\"];\n    } else if (vsceTarget.includes(\"arm64\")) {\n      return [\"win32-arm64\"];\n    } else {\n      return [\"win32-x64\", \"win32-arm64\"];\n    }\n  } else if (vsceTarget.includes(\"linux\") || vsceTarget.includes(\"alpine\")) {\n    if (vsceTarget.includes(\"arm64\")) {\n      return [\"linux-arm64\"];\n    } else if (vsceTarget.includes(\"x64\")) {\n      return [\"linux-x64\"];\n    } else if (vsceTarget.includes(\"armhf\") || vsceTarget.includes(\"arm\")) {\n      return [\"linux-arm\"];\n    } else {\n      return [\"linux-arm64\", \"linux-x64\", \"linux-arm\"];\n    }\n  } else if (vsceTarget.includes(\"darwin\")) {\n    if (vsceTarget.includes(\"arm64\")) {\n      return [\"darwin-arm64\"];\n    } else if (vsceTarget.includes(\"x64\")) {\n      return [\"darwin-x64\"];\n    } else {\n      return [\"darwin-x64\", \"darwin-arm64\"];\n    }\n  } else {\n    console.warn(\n      `Unknown VSCE_TARGET \"${vsceTarget}\", keeping all zeromq prebuilds`,\n    );\n    return [];\n  }\n}\n\n/**\n * Prune zeromq prebuilds for non-target platforms right after download.\n * This avoids webpack copying ~13MB of unused prebuilds into dist/.\n * prepareBuild.js still acts as a safety net for dist/.\n */\nfunction pruneZeromqPrebuilds() {\n  const vsceTarget = process.env.VSCE_TARGET;\n  if (!vsceTarget) {\n    return;\n  }\n\n  const keepFolders = getZeroMQPreBuildsFoldersToKeep(vsceTarget);\n  if (keepFolders.length === 0) {\n    return;\n  }\n\n  const prebuildsDir = path.join(\"node_modules\", \"zeromq\", \"prebuilds\");\n  if (!fs.existsSync(prebuildsDir)) {\n    return;\n  }\n\n  const entries = fs.readdirSync(prebuildsDir);\n  for (const entry of entries) {\n    if (!keepFolders.includes(entry)) {\n      fs.rmSync(path.join(prebuildsDir, entry), { recursive: true });\n      console.log(`Pruned zeromq prebuild: ${entry}`);\n    }\n  }\n  console.log(\n    `Kept zeromq prebuilds for VSCE_TARGET=${vsceTarget}: ${keepFolders.join(\", \")}`,\n  );\n}\n\ncreateJupyterKernelWithoutSerialization();\nPromise.all([downloadZmqBinaries(), installAltimateCoreAllPlatforms()])\n  .then(() => {\n    pruneZeromqPrebuilds();\n    process.exit(0);\n  })\n  .catch((ex) => {\n    console.error(\"Post-install failed\", ex);\n    process.exit(1);\n  });\n"
  },
  {
    "path": "prepareBuild.js",
    "content": "const path = require(\"path\");\nconst fs = require(\"fs\");\n\nfunction getZeroMQPreBuildsFoldersToKeep() {\n  // Possible values of 'VSC_VSCE_TARGET' include platforms supported by `vsce package --target`\n  // See here https://code.visualstudio.com/api/working-with-extensions/publishing-extension#platformspecific-extensions\n  const vsceTarget = process.env.VSC_VSCE_TARGET || process.env.VSCE_TARGET;\n  console.log(\"vsceTarget\", vsceTarget);\n  if (!vsceTarget) {\n    // Keep all of them, as we're not building platform specific bundles.\n    return [];\n  } else if (vsceTarget === \"web\") {\n    throw new Error(\"Not supported when targeting the Web\");\n  } else if (vsceTarget.includes(\"win32\")) {\n    if (vsceTarget.includes(\"x64\")) {\n      return [\"win32-x64\"];\n    } else if (vsceTarget.includes(\"arm64\")) {\n      return [\"win32-arm64\"];\n    } else {\n      return [\"win32-x64\", \"win32-arm64\"];\n    }\n  } else if (vsceTarget.includes(\"linux\")) {\n    if (vsceTarget.includes(\"arm64\")) {\n      return [\"linux-arm64\"];\n    } else if (vsceTarget.includes(\"x64\")) {\n      return [\"linux-x64\"];\n    } else if (vsceTarget.includes(\"arm\")) {\n      return [\"linux-arm\"];\n    } else {\n      return [\"linux-arm64\", \"linux-x64\", \"linux-arm\"];\n    }\n  } else if (vsceTarget.includes(\"alpine\")) {\n    if (vsceTarget.includes(\"arm64\")) {\n      return [\"linux-arm64\"];\n    } else if (vsceTarget.includes(\"x64\")) {\n      return [\"linux-x64\"];\n    } else if (vsceTarget.includes(\"armhf\")) {\n      return [\"linux-arm\"];\n    } else {\n      return [\"linux-arm64\", \"linux-x64\", \"linux-arm\"];\n    }\n  } else if (vsceTarget.includes(\"darwin\")) {\n    if (vsceTarget.includes(\"arm64\")) {\n      return [\"darwin-arm64\"];\n    } else if (vsceTarget.includes(\"x64\")) {\n      return [\"darwin-x64\"];\n    } else {\n      return [\"darwin-x64\", \"darwin-arm64\"];\n    }\n  } else {\n    throw new Error(`Unknown platform '${vsceTarget}'}`);\n  }\n}\n\nfunction shouldCopyFileFromZmqFolder(resourcePath) {\n  const parentFolder = path.dirname(resourcePath);\n  if (fs.statSync(resourcePath).isDirectory()) {\n    return true;\n  }\n  // return true;\n  const filename = path.basename(resourcePath);\n  // Ensure the code is platform agnostic.\n  resourcePath = (resourcePath || \"\")\n    .toString()\n    .toLowerCase()\n    .replace(/\\\\/g, \"/\");\n  // We do not need to bundle these folders\n  const foldersToIgnore = [\"build\", \"script\", \"src\", \"node_modules\", \"vendor\"];\n  if (\n    foldersToIgnore.some((folder) =>\n      resourcePath\n        .toLowerCase()\n        .startsWith(\n          path.join(parentFolder, folder).replace(/\\\\/g, \"/\").toLowerCase(),\n        ),\n    )\n  ) {\n    return false;\n  }\n\n  if (\n    resourcePath.endsWith(\".js\") ||\n    resourcePath.endsWith(\".json\") ||\n    resourcePath.endsWith(\".md\") ||\n    resourcePath.endsWith(\"license\")\n  ) {\n    return true;\n  }\n  // if (!resourcePath.includes(path.join(parentFolder, 'prebuilds').replace(/\\\\/g, '/').toLowerCase())) {\n  if (!parentFolder.includes(`${path.sep}prebuilds${path.sep}`)) {\n    // We do not ship any other sub directory.\n    return false;\n  }\n  if (filename.includes(\"electron.\") && resourcePath.endsWith(\".node\")) {\n    // We do not ship electron binaries.\n    return false;\n  }\n  const preBuildsFoldersToCopy = getZeroMQPreBuildsFoldersToKeep();\n  console.log(\"preBuildsFoldersToCopy\", preBuildsFoldersToCopy);\n  if (preBuildsFoldersToCopy.length === 0) {\n    // Copy everything from all prebuilds folder.\n    return true;\n  }\n  // Copy if this is a prebuilds folder that needs to be copied across.\n  // Use path.sep as the delimiter, as we do not want linux-arm64 to get compiled with search criteria is linux-arm.\n  if (\n    preBuildsFoldersToCopy.some((folder) =>\n      resourcePath.includes(`${folder.toLowerCase()}/`),\n    )\n  ) {\n    return true;\n  }\n  return false;\n}\n\nconst extensionFolder = path.join(__dirname);\n\nasync function deleteUnnecessaryZeromqPrebuilts() {\n  const vsceTarget = process.env.VSC_VSCE_TARGET || process.env.VSCE_TARGET;\n  if (!vsceTarget) {\n    // Keep all of them, as we're not building platform specific bundles.\n    console.log(\"vsceTarget is not set\");\n    return;\n  }\n\n  console.log(\"deleting ZeroMQ prebuilts\");\n  const necessaryPrebuilds = getZeroMQPreBuildsFoldersToKeep();\n\n  const zmqPrebuildFolder = path.join(\n    extensionFolder,\n    \"dist\",\n    \"node_modules\",\n    \"zeromq\",\n    \"prebuilds\",\n  );\n  // delete all folders except the ones in necessaryPrebuilds\n  const files = fs.readdirSync(zmqPrebuildFolder);\n  for (const file of files) {\n    if (!necessaryPrebuilds.includes(file)) {\n      console.log(\"deleting\", path.join(zmqPrebuildFolder, file));\n      fs.rmSync(path.join(zmqPrebuildFolder, file), { recursive: true });\n    }\n  }\n\n  console.log(\"copied ZeroMQ\");\n}\n\n/**\n * Map VSC_VSCE_TARGET to the altimate-core platform package suffix to keep.\n * Returns empty array if no target is set (keep all).\n */\nfunction getAltimateCorePackagesToKeep() {\n  const vsceTarget = process.env.VSC_VSCE_TARGET || process.env.VSCE_TARGET;\n  if (!vsceTarget) {\n    return [];\n  }\n  if (vsceTarget.includes(\"darwin\")) {\n    if (vsceTarget.includes(\"arm64\")) return [\"darwin-arm64\"];\n    if (vsceTarget.includes(\"x64\")) return [\"darwin-x64\"];\n    return [\"darwin-arm64\", \"darwin-x64\"];\n  }\n  if (vsceTarget.includes(\"linux\") || vsceTarget.includes(\"alpine\")) {\n    if (vsceTarget.includes(\"arm64\")) return [\"linux-arm64-gnu\"];\n    if (vsceTarget.includes(\"x64\")) return [\"linux-x64-gnu\"];\n    return [\"linux-arm64-gnu\", \"linux-x64-gnu\"];\n  }\n  if (vsceTarget.includes(\"win32\")) {\n    return [\"win32-x64-msvc\"];\n  }\n  return [];\n}\n\nfunction deleteUnnecessaryAltimateCorePackages() {\n  const vsceTarget = process.env.VSC_VSCE_TARGET || process.env.VSCE_TARGET;\n  if (!vsceTarget) {\n    console.log(\n      \"vsceTarget is not set, keeping all altimate-core platform packages\",\n    );\n    return;\n  }\n\n  console.log(\n    \"pruning altimate-core platform packages for target:\",\n    vsceTarget,\n  );\n  const keepSuffixes = getAltimateCorePackagesToKeep();\n  const altimateCoreDir = path.join(\n    extensionFolder,\n    \"dist\",\n    \"node_modules\",\n    \"@altimateai\",\n  );\n\n  if (!fs.existsSync(altimateCoreDir)) {\n    console.log(\"altimate-core dist directory not found, skipping\");\n    return;\n  }\n\n  const entries = fs.readdirSync(altimateCoreDir);\n  for (const entry of entries) {\n    // Only prune platform-specific packages (altimate-core-<platform>)\n    if (!entry.startsWith(\"altimate-core-\")) continue;\n    const suffix = entry.replace(\"altimate-core-\", \"\");\n    if (!keepSuffixes.includes(suffix)) {\n      const fullPath = path.join(altimateCoreDir, entry);\n      console.log(\"deleting\", fullPath);\n      fs.rmSync(fullPath, { recursive: true });\n    }\n  }\n\n  // Also prune .node files from the altimate-core/ directory that don't\n  // match the target platform (these are copied by webpack for direct resolution)\n  const coreDir = path.join(altimateCoreDir, \"altimate-core\");\n  if (fs.existsSync(coreDir)) {\n    const coreEntries = fs.readdirSync(coreDir);\n    for (const file of coreEntries) {\n      if (!file.endsWith(\".node\")) continue;\n      // e.g. \"altimate-core.darwin-arm64.node\" → check if \"darwin-arm64\" is kept\n      const match = file.match(/^altimate-core\\.(.+)\\.node$/);\n      if (match && !keepSuffixes.includes(match[1])) {\n        const fullPath = path.join(coreDir, file);\n        console.log(\"deleting .node file\", fullPath);\n        fs.rmSync(fullPath);\n      }\n    }\n  }\n\n  console.log(\"pruned altimate-core platform packages\");\n}\n\ndeleteUnnecessaryZeromqPrebuilts();\ndeleteUnnecessaryAltimateCorePackages();\n"
  },
  {
    "path": "rsbuild.config.ts",
    "content": "import { defineConfig, RsbuildPlugin } from \"@rsbuild/core\";\nimport { cpSync, existsSync, readdirSync } from \"fs\";\nimport path from \"path\";\n\nconst DIST = path.resolve(__dirname, \"dist\");\n\nconst copyAssetsPlugin: RsbuildPlugin = {\n  name: \"copy-assets-plugin\",\n  setup(api) {\n    api.onBeforeBuild(() => {\n      const patterns = [\n        {\n          from: path.resolve(__dirname, \"altimate_notebook_kernel.py\"),\n          to: path.join(\n            DIST,\n            \"altimate_python_packages/altimate_notebook_kernel.py\",\n          ),\n        },\n        {\n          from: path.resolve(\n            __dirname,\n            \"node_modules/@altimateai/dbt-integration/dist/node_python_bridge.py\",\n          ),\n          to: path.join(DIST, \"node_python_bridge.py\"),\n        },\n        {\n          from: path.resolve(\n            __dirname,\n            \"node_modules/@altimateai/dbt-integration/dist/altimate_python_packages/dbt_core_integration.py\",\n          ),\n          to: path.join(\n            DIST,\n            \"altimate_python_packages/dbt_core_integration.py\",\n          ),\n        },\n        {\n          from: path.resolve(\n            __dirname,\n            \"node_modules/@altimateai/dbt-integration/dist/altimate_python_packages/dbt_utils.py\",\n          ),\n          to: path.join(DIST, \"altimate_python_packages/dbt_utils.py\"),\n        },\n        {\n          from: path.resolve(\n            __dirname,\n            \"node_modules/@altimateai/dbt-integration/dist/altimate_python_packages/altimate_packages/\",\n          ),\n          to: path.join(DIST, \"altimate_python_packages/altimate_packages/\"),\n        },\n      ];\n\n      // These assets are runtime-required by the extension (Python bridge,\n      // kernel, and altimate-dbt-integration Python packages). Abort the\n      // build if any of them is missing — matches webpack's CopyPlugin\n      // default (noErrorOnMissing: false) that this code replaced.\n      for (const { from, to } of patterns) {\n        try {\n          cpSync(from, to, { recursive: true });\n        } catch (error) {\n          throw new Error(\n            `Required asset missing: failed to copy ${from} -> ${to}: ${\n              (error as Error).message\n            }`,\n          );\n        }\n      }\n\n      console.log(\"copying notebook modules\");\n      try {\n        cpSync(\n          path.resolve(__dirname, \"node_modules/zeromq\"),\n          path.join(DIST, \"node_modules/zeromq\"),\n          { recursive: true },\n        );\n      } catch (e) {\n        console.warn(`Skipping zeromq: ${(e as Error).message}`);\n      }\n\n      try {\n        const altimateCoreDir = path.dirname(\n          require.resolve(\"@altimateai/core/package.json\"),\n        );\n        cpSync(\n          altimateCoreDir,\n          path.join(DIST, \"node_modules/@altimateai/core\"),\n          { recursive: true },\n        );\n      } catch (e) {\n        console.warn(`Skipping @altimateai/core: ${(e as Error).message}`);\n      }\n\n      try {\n        cpSync(\n          path.resolve(__dirname, \"node_modules/@altimateai/altimate-core\"),\n          path.join(DIST, \"node_modules/@altimateai/altimate-core\"),\n          { recursive: true },\n        );\n        console.log(\"Copied @altimateai/altimate-core\");\n      } catch (e) {\n        console.warn(\n          `Skipping @altimateai/altimate-core: ${(e as Error).message}`,\n        );\n      }\n\n      // Copy only the .node binary directly into the altimate-core/ directory —\n      // skip the platform package directories entirely. napi-rs index.js falls back\n      // to require('./altimate-core.<platform>.node') when the platform package\n      // isn't found, so this works and halves VSIX size.\n      const altimatePlatformPackages = [\n        \"@altimateai/altimate-core-darwin-arm64\",\n        \"@altimateai/altimate-core-darwin-x64\",\n        \"@altimateai/altimate-core-linux-arm64-gnu\",\n        \"@altimateai/altimate-core-linux-x64-gnu\",\n        \"@altimateai/altimate-core-win32-x64-msvc\",\n      ];\n      const coreDistDir = path.join(\n        DIST,\n        \"node_modules/@altimateai/altimate-core\",\n      );\n      for (const pkg of altimatePlatformPackages) {\n        const srcDir = path.resolve(__dirname, \"node_modules\", pkg);\n        try {\n          if (!existsSync(srcDir)) {\n            continue;\n          }\n          for (const file of readdirSync(srcDir)) {\n            if (file.endsWith(\".node\")) {\n              cpSync(path.join(srcDir, file), path.join(coreDistDir, file));\n              console.log(\n                `Copied ${file} into altimate-core/ (skipped platform package dir)`,\n              );\n            }\n          }\n        } catch (e) {\n          console.warn(`Skipping ${pkg}: ${(e as Error).message}`);\n        }\n      }\n\n      try {\n        cpSync(\n          path.resolve(__dirname, \"node_modules/@aminya/node-gyp-build\"),\n          path.join(DIST, \"node_modules/@aminya/node-gyp-build\"),\n          { recursive: true },\n        );\n        cpSync(\n          path.resolve(__dirname, \"node_modules/node-gyp-build\"),\n          path.join(DIST, \"node_modules/node-gyp-build\"),\n          { recursive: true },\n        );\n      } catch (e) {\n        console.warn(`Skipping node-gyp-build: ${(e as Error).message}`);\n      }\n      console.log(\"copied notebook modules\");\n    });\n  },\n};\n\nexport default defineConfig({\n  source: {\n    entry: {\n      extension: \"./src/extension.ts\",\n    },\n  },\n  output: {\n    target: \"node\",\n    filename: {\n      js: \"[name].js\",\n    },\n    distPath: {\n      root: \"dist\",\n    },\n    // Webview panels also emit into dist/, so don't wipe it.\n    cleanDistPath: false,\n    sourceMap: {\n      js: \"source-map\",\n    },\n    // Match the pre-rsbuild terser config (mangle: false, keep classnames/fnames)\n    // so stack traces in VS Code remain actionable, while still getting dead-code\n    // elimination and whitespace stripping.\n    minify: {\n      js: true,\n      jsOptions: {\n        minimizerOptions: {\n          mangle: false,\n          compress: {\n            keep_classnames: true,\n            keep_fnames: true,\n          },\n        },\n      },\n    },\n  },\n  resolve: {\n    alias: {\n      \"@extension\": path.resolve(__dirname, \"./src/modules.ts\"),\n      \"@lib\": path.resolve(__dirname, \"./src/lib/index\"),\n    },\n    extensions: [\".ts\", \".js\"],\n  },\n  performance: {\n    chunkSplit: {\n      strategy: \"all-in-one\",\n    },\n  },\n  dev: {\n    writeToDisk: true,\n  },\n  tools: {\n    rspack: (config) => {\n      config.externals = [\n        \"vscode\",\n        // Ignored because we don't use them, and App Insights has try/catch\n        // guarding their loading: https://github.com/microsoft/vscode-extension-telemetry/issues/41#issuecomment-598852991\n        \"applicationinsights-native-metrics\",\n        \"@opentelemetry/tracing\",\n        \"@azure/opentelemetry-instrumentation-azure-sdk\",\n        \"@opentelemetry/instrumentation\",\n        \"@azure/functions-core\",\n        \"zeromq\",\n        \"@altimateai/core\",\n        \"@altimateai/altimate-core\",\n        \"@altimateai/altimate-core-darwin-arm64\",\n        \"@altimateai/altimate-core-darwin-x64\",\n        \"@altimateai/altimate-core-linux-arm64-gnu\",\n        \"@altimateai/altimate-core-linux-x64-gnu\",\n        \"@altimateai/altimate-core-win32-x64-msvc\",\n      ];\n\n      config.node = { __dirname: false };\n\n      config.output = {\n        ...config.output,\n        libraryTarget: \"commonjs2\",\n        devtoolModuleFilenameTemplate: \"../[resource-path]\",\n      };\n\n      // Use ts-loader so inversify's decorators + emitDecoratorMetadata keep working.\n      config.module = config.module || {};\n      config.module.rules = (config.module.rules || []).filter((rule: any) => {\n        if (rule && typeof rule === \"object\" && rule.test instanceof RegExp) {\n          return !rule.test.test(\"file.ts\");\n        }\n        return true;\n      });\n      config.module.rules.push({\n        test: /\\.ts$/,\n        exclude: /(node_modules|src\\/test)/,\n        use: [{ loader: \"ts-loader\" }],\n      });\n\n      return config;\n    },\n  },\n  plugins: [copyAssetsPlugin],\n});\n"
  },
  {
    "path": "snippets/snippets_markdown.json",
    "content": "{\n  \"Docs\": {\n      \"prefix\": \"docs\",\n      \"body\": [\n          \"{% docs ${1:name} %}\",\n          \"$2\",\n          \"{% enddocs %}\"\n      ],\n      \"description\": \"Docs\"\n  }\n}\n"
  },
  {
    "path": "snippets/snippets_sql.json",
    "content": "{\n  \"block\": {\n      \"prefix\": \"block\",\n      \"body\": [\n          \"{% block ${1:name} %}\",\n          \"  $2\",\n          \"{% endblock %}\"\n      ],\n      \"description\": \"Block\"\n  },\n  \"inline block\": {\n      \"prefix\": \"inblock\",\n      \"body\": [\n          \"{% $1 %}\"\n      ],\n      \"description\": \"Inline Block\"\n  },\n  \"Comment\": {\n      \"prefix\": \"comment\",\n      \"body\": [\n          \"{#- $1 -#}\"\n      ],\n      \"description\": \"Inline Comment\"\n  },\n  \"Complete Variable\": {\n      \"prefix\": \"cvar\",\n      \"body\": [\n          \"{{ $1 }}\"\n      ],\n      \"description\": \"Complete Variable\"\n  },\n  \"Do\": {\n      \"prefix\": \"do\",\n      \"body\": [\n          \"{% do $1 %}\"\n      ],\n      \"description\": \"Jinja Do\"\n  },\n  \"Filter\": {\n      \"prefix\": \"filter\",\n      \"body\": [\n          \"{% filter ${1:filter} %}\",\n          \"  $2\",\n          \"{% endfilter %}\"\n      ],\n      \"description\": \"Jinja Filter\"\n  },\n  \"For\": {\n      \"prefix\": \"for\",\n      \"body\": [\n          \"{% for ${1:item} in ${2:sequence} %}\",\n          \"  $3\",\n          \"{% endfor %}\"\n      ],\n      \"description\": \"Jinja For\"\n  },\n  \"For (Dict)\": {\n      \"prefix\": \"for dict\",\n      \"body\": [\n          \"{% for ${1:key}, ${2:value} in ${3:dict}.items() %}\",\n          \"  $4\",\n          \"{% endfor %}\"\n      ],\n      \"description\": \"Jinja For (Dict)\"\n  },\n  \"For (List)\": {\n      \"prefix\": \"for list\",\n      \"body\": [\n          \"{% for ${1:item} in [${2:list}] %}\",\n          \"  $3\",\n          \"{% endfor %}\"\n      ],\n      \"description\": \"Jinja For (List)\"\n  },\n  \"If\": {\n      \"prefix\": \"if\",\n      \"body\": [\n          \"{% if ${1:expr} %}\",\n          \"  $2\",\n          \"{% endif %}\"\n      ],\n      \"description\": \"Jinja If\"\n  },\n  \"Macro\": {\n      \"prefix\": \"macro\",\n      \"body\": [\n          \"{% macro ${1:name}(${2:args}) %}\",\n          \"  $3\",\n          \"{% endmacro %}\"\n      ],\n      \"description\": \"Jinja macro\"\n  },\n  \"Set\": {\n      \"prefix\": \"set\",\n      \"body\": \"{% set ${1:var} = ${2:value} %}\",\n      \"description\": \"Jinja set variable\"\n  },\n  \"Set Block\": {\n      \"prefix\": \"set_block\",\n      \"body\": [\n          \"{% set ${1:name} %}\",\n          \"  $2\",\n          \"{% endset %}\"\n      ]\n  },\n  \"Snapshot\": {\n      \"prefix\": [\n          \"snapshot\",\n          \"snap\"\n      ],\n      \"body\": [\n          \"{% snapshot ${1:snapshot_name} %}\",\n          \"\",\n          \"{{\",\n          \"   config(\",\n          \"       target_database='${2:target_database}',\",\n          \"       target_schema='${3:target_schema}',\",\n          \"       unique_key='${4:unique_key}',\",\n          \"\",\n          \"       strategy='${5:strategy}',\",\n          \"       updated_at='${6:updated_at}',\",\n          \"   )\",\n          \"}}\",\n          \"\",\n          \"\",\n          \"{% endsnapshot %}\"\n      ],\n      \"description\": \"Dbt snapshot\"\n  },\n  \"Dbt Config Block\": {\n      \"prefix\": \"config\",\n      \"body\": [\n          \"{{\",\n          \"  config(\",\n          \"    materialized = '${1:table}',\",\n          \"    )\",\n          \"}}\"\n      ],\n      \"description\": \"Dbt Config Block\"\n  },\n  \"Dbt Incremental Config Block\": {\n      \"prefix\": \"config_incremental\",\n      \"body\": [\n          \"{{\",\n          \"  config(\",\n          \"    materialized = 'incremental',\",\n          \"    unique_key = '${1:id}',\",\n          \"    )\",\n          \"}}\"\n      ],\n      \"description\": \"Dbt Incremental Config Block\"\n  },\n  \"Env Var\": {\n      \"prefix\": \"env_var\",\n      \"body\": [\n          \"{{ env_var(\\\"${1:env_var_name}\\\") }}\"\n      ],\n      \"description\": \"Env Var\"\n  },\n  \"Model Overview\": {\n      \"prefix\": \"model_overview\",\n      \"body\": [\n          \"{#-\",\n          \"Goal: ${1:high-level objective of the model}\",\n          \"Granularity: ${2:level of detail of the model}\",\n          \"Assumptions/Caveats:\",\n          \"   ${3:- assumptions/caveats if any}\",\n          \"-#}\"\n      ],\n      \"description\": \"Model Overview\"\n  },\n  \"Load Result\": {\n      \"prefix\": \"load_result\",\n      \"body\": [\n          \"load_result('${1:statement_name}')\"\n      ],\n      \"description\": \"Load Result\"\n  },\n  \"Log\": {\n      \"prefix\": \"log\",\n      \"body\": [\n          \"{{ log(${1:var}, info=${2|True,False|}) }}\"\n      ],\n      \"description\": \"Log\"\n  },\n  \"Log a variable\": {\n      \"prefix\": \"log_var\",\n      \"body\": [\n          \"{{ log('${1:var}: ' ~ ${1:var}, info=${2|True,False|}) }}\"\n      ],\n      \"description\": \"Log a single variable's name and value\"\n  },\n  \"Statement\": {\n      \"prefix\": \"statement\",\n      \"body\": [\n          \"{% call statement(${1:name}, fetch_result=${2|True,False|}) %}\",\n          \"  ${3:select 1}\",\n          \"{% endcall %}\"\n      ],\n      \"description\": \"Statement\"\n  },\n  \"Ref\": {\n      \"prefix\": \"ref\",\n      \"body\": [\n          \"{{ ref('${1:model_name}') }}\"\n      ],\n      \"description\": \"Ref\"\n  },\n  \"Return\": {\n      \"prefix\": \"return\",\n      \"body\": [\n          \"{{ return(${1}) }}\"\n      ],\n      \"description\": \"Return\"\n  },\n  \"Var\": {\n      \"prefix\": \"var\",\n      \"body\": [\n          \"{{ var('${1:var_name}') }}\"\n      ],\n      \"description\": \"Var\"\n  },\n  \"Source\": {\n      \"prefix\": \"source\",\n      \"body\": [\n          \"{{ source('${1:source}', '${2:table_name}') }}\"\n      ],\n      \"description\": \"Source\"\n  },\n  \"Incremental DBT block\": {\n      \"prefix\": \"is_incremental\",\n      \"body\": [\n          \"{% if is_incremental() %}\",\n          \"  and ${1:prefix}.${2:date_col} >= coalesce((select max(${2:date_col}) from {{ this }}), '1900-01-01')\",\n          \"{% else %}\",\n          \"  ${3:optional_cond}\",\n          \"{% endif %}\"\n      ],\n      \"description\": \"Incremental DBT Block\"\n  }\n}\n"
  },
  {
    "path": "snippets/snippets_yaml.json",
    "content": "{\n  \"Doc\": {\n      \"prefix\": \"doc\",\n      \"body\": [\n          \"{{ doc('${1:docs_name}') }}\"\n      ],\n      \"description\": \"Doc\"\n  },\n  \"Env Var\": {\n      \"prefix\": \"env_var\",\n      \"body\": [\n          \"{{ env_var('${1:env_var_name}') }}\"\n      ],\n      \"description\": \"Env Var\"\n  },\n  \"Ref\": {\n      \"prefix\": \"ref\",\n      \"body\": [\n          \"ref('${1:model_name}')\"\n      ],\n      \"description\": \"Ref\"\n  },\n  \"Source\": {\n      \"prefix\": \"source\",\n      \"body\": [\n          \"source('${1:source}', '${2:table_name}')\"\n      ],\n      \"description\": \"Source\"\n  },\n  \"Var\": {\n      \"prefix\": \"var\",\n      \"body\": [\n          \"{{ var('${1:var_name}') }}\"\n      ],\n      \"description\": \"Var\"\n  }\n}\n"
  },
  {
    "path": "src/altimate.ts",
    "content": "import {\n  AltimateHttpClient,\n  ColumnMetaData,\n  DBTConfiguration,\n  DBTTerminal,\n  NodeMetaData,\n  SourceMetaData,\n} from \"@altimateai/dbt-integration\";\nimport { NotebookItem, NotebookSchema, PreconfiguredNotebookItem } from \"@lib\";\nimport { inject } from \"inversify\";\nimport type { RequestInit } from \"node-fetch\";\nimport * as vscode from \"vscode\";\n\nexport class UserInputError extends Error {}\n\nexport interface ColumnLineage {\n  source: { uniqueId: string; column_name: string };\n  target: { uniqueId: string; column_name: string };\n  type: string;\n  views_type?: string;\n  views_code?: string[];\n}\n\ninterface Schemas {\n  [key: string]: { [key: string]: unknown };\n}\n\nexport type ModelNode = {\n  database: string;\n  schema: string;\n  name: string;\n  alias: string;\n  uniqueId: string;\n  columns: { [columnName: string]: ColumnMetaData };\n  path: string | undefined;\n};\n\nexport type ModelInfo = {\n  model_node: ModelNode;\n  compiled_sql?: string;\n  raw_sql?: string;\n};\n\nexport interface DBTColumnLineageRequest {\n  model_dialect: string;\n  targets: { uniqueId: string; column_name: string }[];\n  model_info: ModelInfo[];\n  upstream_expansion: boolean;\n  upstream_models: string[];\n  selected_column: { model_node?: ModelNode; column: string };\n  session_id: string;\n  show_indirect_edges: boolean;\n  event_type: string;\n}\n\nexport interface DBTColumnLineageResponse {\n  column_lineage: ColumnLineage[];\n  confidence?: { confidence: string; message?: string };\n  errors?: string[];\n  errors_dict?: Record<string, string[]>;\n}\n\ninterface SQLLineageRequest {\n  model_dialect: string;\n  model_info: { model_node: ModelNode }[];\n  compiled_sql: string;\n  session_id: string;\n}\n\nexport type SqlLineageDetails = Record<\n  string,\n  {\n    name: string;\n    type: string;\n    nodeType?: string;\n    nodeId?: string;\n    sql: string;\n    columns: { name: string; datatype?: string; expression?: string }[];\n  }\n>;\ntype SqlLineageResponse = {\n  tableEdges: [string, string][];\n  details: SqlLineageDetails;\n  nodePositions?: Record<string, [number, number]>;\n};\n\ninterface SQLToModelRequest {\n  sql: string;\n  adapter: string;\n  models: NodeMetaData[];\n  sources: SourceMetaData[];\n}\n\ninterface DBTProjectHealthConfig {\n  id: number;\n  name: string;\n  description: string;\n  created_on: string;\n  config: Record<string, unknown>;\n  config_schema: unknown[];\n}\n\ninterface DBTProjectHealthConfigResponse {\n  items: DBTProjectHealthConfig[];\n}\n\nexport interface SQLToModelResponse {\n  sql: string;\n}\n\ninterface NotebooksResponse {\n  notebooks: PreconfiguredNotebookItem[];\n}\n\ninterface AddNotebookRequest {\n  name: string;\n  description: string;\n  tags_list: string[];\n  data?: NotebookSchema;\n}\n\ninterface UpdateNotebookRequest {\n  name: string;\n  description?: string;\n  tags_list?: string[];\n  data?: NotebookSchema;\n}\n\ninterface OnewayFeedback {\n  feedback_value: \"good\" | \"bad\";\n  feedback_text: string;\n  feedback_src: \"dbtpu-extension\";\n  data: any;\n}\n\nexport enum QueryAnalysisType {\n  EXPLAIN = \"explain\",\n  FIX = \"fix\",\n  MODIFY = \"modify\",\n  TRANSLATE = \"translate\",\n}\n\nexport enum QueryAnalysisChatType {\n  SYSTEM = \"SystemMessage\",\n  HUMAN = \"HumanMessage\",\n}\n\ninterface QueryAnalysisChat {\n  type: QueryAnalysisChatType;\n  content: string;\n  additional_kwargs?: Record<string, unknown>;\n}\n\nexport interface QueryTranslateRequest {\n  sql: string;\n  target_dialect: string;\n  source_dialect: string;\n}\n\nexport interface QueryTranslateExplanationRequest {\n  user_sql: string;\n  translated_sql: string;\n  target_dialect: string;\n  source_dialect: string;\n}\n\ninterface DbtModel {\n  model_name: string;\n  model_description?: string;\n  compiled_sql?: string;\n  columns: {\n    column_name: string;\n    description?: string;\n    data_type?: string;\n  }[];\n  adapter?: string;\n}\n\nexport interface QueryBookmark {\n  id: number;\n  compiled_sql: string;\n  raw_sql: string;\n  name: string;\n  adapter_type: string;\n  created_on: string;\n  updated_on: string;\n  tags: { id: number; tag: string }[];\n}\n\nexport interface QueryAnalysisRequest {\n  session_id: string;\n  job_type: QueryAnalysisType;\n  model: DbtModel;\n  user_request?: string; // required for modify query\n  history?: QueryAnalysisChat[];\n}\n\nexport interface CreateDbtTestRequest {\n  session_id: string;\n  model: DbtModel;\n  column_name?: string;\n  user_request?: string;\n}\n\ninterface DocsGenerateModelRequestV2 {\n  columns: string[];\n  dbt_model: DbtModel;\n  user_instructions?: {\n    prompt_hint: string;\n    language: string;\n    persona: string;\n  };\n  follow_up_instructions?: {\n    instruction: string;\n  };\n  prompt_hint?: string;\n  gen_model_description: boolean;\n  column_index_count: number | undefined;\n  session_id: string | undefined;\n  is_bulk_gen: boolean;\n}\n\nexport interface DocsGenerateResponse {\n  column_descriptions?: {\n    column_name: string;\n    column_description: string;\n    column_citations?: { id: string; content: string }[];\n  }[];\n  model_description?: string;\n  model_citations?: { id: string; content: string }[];\n}\n\nexport interface DBTCoreIntegrationEnvironment {\n  id: number;\n  environment_type: string;\n  created_at: string;\n}\n\nexport interface SyncHistoryItem {\n  type: \"Completed\" | \"In Progress\" | \"Failed\";\n  time: string;\n  log_file: string | null;\n}\n\nexport interface DBTCoreIntegration {\n  id: number;\n  name: string;\n  environments: DBTCoreIntegrationEnvironment[];\n  created_at: string;\n  last_modified_at: string;\n  last_file_upload_time: string | null;\n  is_deleted: boolean;\n  integration_type: \"dbt_core\" | \"dbt_cloud\";\n}\n\nexport interface DBTCoreIntegrationWithSync extends DBTCoreIntegration {\n  sync_history: SyncHistoryItem[];\n}\n\nexport interface TenantUser {\n  id: number;\n  uuid: string;\n  display_name: string;\n  first_name: string;\n  last_name: string;\n  email: string;\n  phone: string;\n  is_active: boolean;\n  is_verified: boolean;\n  is_invited: boolean;\n  is_onboarded: boolean;\n  created_at: string;\n  role_title: string;\n}\n\ninterface FeedbackResponse {\n  ok: boolean;\n}\n\ninterface BulkDocsPropRequest {\n  num_columns: number;\n  session_id: string;\n}\n\nexport interface SharedDoc {\n  share_id: number;\n  name: string;\n  description: string;\n  project_name: string;\n  conversation_group: [ConversationGroup];\n}\n\nexport interface Conversation {\n  conversation_id: number;\n  message: string;\n  timestamp: string;\n  user_id: number;\n}\n\nexport interface ConversationGroup {\n  conversation_group_id: number;\n  owner: number;\n  status: \"Pending\" | \"Resolved\";\n  meta: {\n    field?: \"description\";\n    column?: string;\n    highlight: string;\n    uniqueId?: string;\n    filePath: string;\n    resource_type?: string;\n    range:\n      | {\n          end: vscode.Range[\"end\"];\n          start: vscode.Range[\"start\"];\n        }\n      | undefined;\n  };\n  conversations: Conversation[];\n}\n\nexport class AltimateRequest {\n  constructor(\n    private dbtTerminal: DBTTerminal,\n    @inject(\"DBTConfiguration\")\n    private dbtConfiguration: DBTConfiguration,\n    private altimateHttpClient: AltimateHttpClient,\n  ) {}\n\n  public getAltimateUrl(): string {\n    return this.altimateHttpClient.getAltimateUrl();\n  }\n\n  private async internalFetch(url: string, init?: RequestInit) {\n    return this.altimateHttpClient.internalFetch(url, init);\n  }\n\n  getInstanceName() {\n    return this.dbtConfiguration.getAltimateInstanceName();\n  }\n\n  getAIKey() {\n    return this.dbtConfiguration.getAltimateAiKey();\n  }\n\n  public enabled(): boolean {\n    return !!this.altimateHttpClient.getConfig();\n  }\n\n  async fetchAsStream<R>(\n    endpoint: string,\n    request: R,\n    onProgress: (response: string) => void,\n    timeout: number = 120000,\n  ) {\n    return this.altimateHttpClient.fetchAsStream(\n      endpoint,\n      request,\n      onProgress,\n      timeout,\n    );\n  }\n\n  async uploadToS3(\n    endpoint: string,\n    fetchArgs: Record<string, unknown>,\n    filePath: string,\n  ) {\n    return this.altimateHttpClient.uploadToS3(endpoint, fetchArgs, filePath);\n  }\n\n  private throwIfLocalMode(endpoint: string) {\n    try {\n      this.altimateHttpClient.throwIfLocalMode(endpoint);\n    } catch (error) {\n      // Apply additional local mode exceptions specific to AltimateRequest\n      endpoint = endpoint.split(\"?\")[0];\n      if (\n        [\n          /^dbtconfig\\/datapilot_version\\/.*$/,\n          /^dbtconfig\\/.*\\/download$/,\n        ].some((regex) => regex.test(endpoint))\n      ) {\n        return;\n      }\n      if (\n        [\n          \"auth_health\",\n          \"dbtconfig\",\n          \"dbt/v1/fetch_artifact_url\",\n          \"dbtconfig/extension/start_scan\",\n          \"dbt/v1/project_integrations\",\n          \"dbt/v1/defer_to_prod_event\",\n          \"dbt/v3/validate-credentials\",\n        ].includes(endpoint)\n      ) {\n        return;\n      }\n      throw error;\n    }\n  }\n\n  async fetch<T>(\n    endpoint: string,\n    fetchArgs = {},\n    timeout: number = 120000,\n  ): Promise<T> {\n    this.dbtTerminal.debug(\"network:request\", endpoint, fetchArgs);\n    this.throwIfLocalMode(endpoint);\n    return this.altimateHttpClient.fetch<T>(\n      endpoint,\n      fetchArgs as RequestInit,\n      timeout,\n    );\n  }\n\n  private getQueryString = (\n    params: Record<string, string | number>,\n  ): string => {\n    const queryString = Object.keys(params)\n      .map(\n        (key) =>\n          `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`,\n      )\n      .join(\"&\");\n\n    return queryString ? `?${queryString}` : \"\";\n  };\n\n  async isAuthenticated() {\n    try {\n      await this.fetch<void>(\"auth_health\", {\n        method: \"POST\",\n      });\n    } catch (error) {\n      return false;\n    }\n    return true;\n  }\n\n  async generateModelDocsV2(docsGenerate: DocsGenerateModelRequestV2) {\n    return this.fetch<DocsGenerateResponse>(\"dbt/v2\", {\n      method: \"POST\",\n      body: JSON.stringify(docsGenerate),\n    });\n  }\n\n  async sendFeedback(feedback: OnewayFeedback) {\n    return await this.fetch<FeedbackResponse>(\"feedbacks/ai/fb\", {\n      method: \"POST\",\n      body: JSON.stringify(feedback),\n    });\n  }\n\n  async getColumnLevelLineage(req: DBTColumnLineageRequest) {\n    return this.fetch<DBTColumnLineageResponse>(\"dbt/v4/lineage\", {\n      method: \"POST\",\n      body: JSON.stringify(req),\n    });\n  }\n\n  async runModeller(req: SQLToModelRequest) {\n    return this.fetch<SQLToModelResponse>(\"dbt/v1/sqltomodel\", {\n      method: \"POST\",\n      body: JSON.stringify(req),\n    });\n  }\n\n  async validateCredentials(instance: string, key: string, baseUrl?: string) {\n    const url = `${baseUrl || this.getAltimateUrl()}/dbt/v3/validate-credentials`;\n    try {\n      const response = await fetch(url, {\n        method: \"GET\",\n        headers: {\n          \"x-tenant\": instance,\n          Authorization: \"Bearer \" + key,\n          \"Content-Type\": \"application/json\",\n        },\n      });\n\n      if (!response.ok) {\n        if (response.status === 401 || response.status === 403) {\n          return {\n            error:\n              \"Invalid credentials. Please check your API key and instance name.\",\n          };\n        }\n        return {\n          error: `Validation failed with status ${response.status}`,\n        };\n      }\n\n      return (await response.json()) as Record<string, any> | undefined;\n    } catch (error) {\n      return {\n        error:\n          error instanceof Error\n            ? error.message\n            : \"Failed to validate credentials. Please check your network connection.\",\n      };\n    }\n  }\n\n  async createDbtIntegration(\n    instanceName: string,\n    apiKey: string,\n    name: string,\n    environment: string,\n    integrationType: \"dbt_core\" | \"dbt_cloud\",\n  ) {\n    const url = `${this.getAltimateUrl()}/dbt/v1/project_integration`;\n    const response = await fetch(url, {\n      method: \"POST\",\n      headers: {\n        \"x-tenant\": instanceName,\n        Authorization: \"Bearer \" + apiKey,\n        \"Content-Type\": \"application/json\",\n      },\n      body: JSON.stringify({\n        name,\n        environment,\n        integration_type: integrationType,\n      }),\n    });\n\n    if (!response.ok) {\n      const errorData = (await response.json().catch(() => ({}))) as Record<\n        string,\n        unknown\n      >;\n      throw new Error(\n        (errorData.message as string) ||\n          `Failed to create dbt integration: ${response.statusText}`,\n      );\n    }\n\n    return (await response.json()) as {\n      dbt_core_integration_id?: number;\n      dbt_cloud_integration_id?: number;\n      integration_type: string;\n    };\n  }\n\n  async checkApiConnectivity() {\n    const url = `${this.getAltimateUrl()}/health`;\n    try {\n      const response = await this.internalFetch(url, { method: \"GET\" });\n      const { status } = (await response.json()) as { status: string };\n      return { status };\n    } catch (e) {\n      this.dbtTerminal.error(\n        \"checkApiConnectivity\",\n        \"Unable to connect to backend\",\n        e,\n        true,\n        { url },\n      );\n      const errorMsg = e instanceof Error ? e.message : JSON.stringify(e);\n      return { status: \"not-ok\", errorMsg };\n    }\n  }\n\n  async fetchProjectIntegrations() {\n    return this.fetch<DBTCoreIntegration[]>(\"dbt/v1/project_integrations\");\n  }\n\n  async fetchProjectIntegrationWithSync(\n    integrationId: number,\n    environment: string,\n  ) {\n    return this.fetch<DBTCoreIntegrationWithSync>(\n      `dbt/v1/project_integrations/${integrationId}/${environment}`,\n    );\n  }\n\n  async getHealthcheckConfigs() {\n    return this.fetch<DBTProjectHealthConfigResponse>(\n      `dbtconfig${this.getQueryString({ size: \"100\" })}`,\n    );\n  }\n\n  async logDBTHealthcheckConfig(configId: string) {\n    return this.fetch(`dbtconfig/${configId}/download`);\n  }\n\n  async logDBTHealthcheckStartScan() {\n    return this.fetch(`dbtconfig/extension/start_scan`);\n  }\n\n  async getDatapilotVersion(extension_version: string) {\n    return this.fetch<{ altimate_datapilot_version: string }>(\n      `dbtconfig/datapilot_version/${extension_version}`,\n    );\n  }\n\n  async getUsersInTenant() {\n    return await this.fetch<TenantUser[]>(\"users/chat\");\n  }\n\n  async getCurrentUser() {\n    return await this.fetch<TenantUser>(\"dbt/dbt_docs_share/user/details\");\n  }\n\n  async getAllSharedDbtDocs(projectNames: string[]) {\n    const params = new URLSearchParams();\n    projectNames.forEach((p) => params.append(\"projects\", p));\n    return await this.fetch<SharedDoc[]>(\n      `dbt/dbt_docs_share/all?${params.toString()}`,\n    );\n  }\n\n  async getAppUrlByShareId(shareId: SharedDoc[\"share_id\"]) {\n    return await this.fetch<{\n      name: string;\n      app_url: string;\n    }>(`dbt/dbt_docs_share/${shareId}`, {\n      method: \"GET\",\n    });\n  }\n\n  async addConversationToGroup(\n    shareId: SharedDoc[\"share_id\"],\n    conversationGroupId: ConversationGroup[\"conversation_group_id\"],\n    message: string,\n  ) {\n    return await this.fetch<{ ok: boolean }>(\n      `dbt/dbt_docs_share/${shareId}/conversation_group/${conversationGroupId}/conversation`,\n      {\n        method: \"POST\",\n        body: JSON.stringify({\n          message,\n        }),\n      },\n    );\n  }\n\n  async createConversationGroup(\n    shareId: SharedDoc[\"share_id\"],\n    data: Partial<ConversationGroup> & { message: string },\n  ) {\n    return await this.fetch<{\n      conversation_group_id: ConversationGroup[\"conversation_group_id\"];\n      conversation_id: Conversation[\"conversation_id\"];\n    }>(`dbt/dbt_docs_share/${shareId}/conversation_group`, {\n      method: \"POST\",\n      body: JSON.stringify(data),\n    });\n  }\n\n  async resolveConversation(\n    shareId: SharedDoc[\"share_id\"],\n    conversationGroupId: ConversationGroup[\"conversation_group_id\"],\n  ) {\n    return await this.fetch<{ ok: boolean }>(\n      `dbt/dbt_docs_share/${shareId}/conversation_group/${conversationGroupId}/resolve`,\n      { method: \"POST\", body: JSON.stringify({ resolved: true }) },\n    );\n  }\n\n  async loadConversationsByShareId(shareId: SharedDoc[\"share_id\"]) {\n    return await this.fetch<{\n      dbt_docs_share_conversations: ConversationGroup[];\n    }>(`dbt/dbt_docs_share/${shareId}/conversations`);\n  }\n\n  async createDbtDocsShare(\n    data: {\n      name: string;\n      description?: string;\n    },\n    projectName: string,\n  ) {\n    return await this.fetch<{\n      share_id: number;\n      manifest_presigned_url: string;\n      catalog_presigned_url: string;\n    }>(\"dbt/dbt_docs_share\", {\n      method: \"POST\",\n      body: JSON.stringify({\n        description: data.description,\n        name: data.name,\n        project_name: projectName,\n      }),\n    });\n  }\n\n  async verifyDbtDocsUpload(share_id: number) {\n    return this.fetch<{\n      dbt_docs_share_url: string;\n    }>(\"dbt/dbt_docs_share/verify_upload/\", {\n      method: \"POST\",\n      body: JSON.stringify({ share_id }),\n    });\n  }\n\n  async getQueryBookmarks() {\n    return await this.fetch<QueryBookmark[]>(`query/bookmark`);\n  }\n\n  async sqlLineage(req: SQLLineageRequest) {\n    return this.fetch<SqlLineageResponse>(\"dbt/v3/sql_lineage\", {\n      method: \"POST\",\n      body: JSON.stringify(req),\n    });\n  }\n\n  async bulkDocsPropCredit(req: BulkDocsPropRequest) {\n    return this.fetch<FeedbackResponse>(\"dbt/v4/bulk-docs-prop-credits\", {\n      method: \"POST\",\n      body: JSON.stringify(req),\n    });\n  }\n\n  async getPreConfiguredNotebooks() {\n    return this.fetch<PreconfiguredNotebookItem[]>(\n      \"notebook/preconfigured/list\",\n      {\n        method: \"GET\",\n      },\n    );\n  }\n\n  async getNotebooks(\n    name: string = \"\",\n    tags_list: string[] = [],\n    privacy: string = \"private\",\n  ) {\n    const params = new URLSearchParams({\n      name,\n      privacy,\n      ...(tags_list.length > 0 && { tags_list: tags_list.join(\",\") }),\n    });\n    return this.fetch<NotebookItem[]>(`notebook/list?${params.toString()}`, {\n      method: \"GET\",\n    });\n  }\n\n  async addNotebook(req: AddNotebookRequest) {\n    return this.fetch<FeedbackResponse>(\"notebook\", {\n      method: \"POST\",\n      body: JSON.stringify(req),\n    });\n  }\n\n  async deleteNotebook(id: number) {\n    return this.fetch<FeedbackResponse>(`notebook/${id}`, {\n      method: \"DELETE\",\n    });\n  }\n\n  async updateNotebook(id: number, req: UpdateNotebookRequest) {\n    return this.fetch<FeedbackResponse>(`notebook/${id}`, {\n      method: \"PUT\",\n      body: JSON.stringify(req),\n    });\n  }\n\n  async updateNotebookPrivacy(id: number, privacy: string) {\n    const params = new URLSearchParams({ privacy: privacy });\n    return this.fetch<FeedbackResponse>(\n      `notebook/privacy/${id}?${params.toString()}`,\n      {\n        method: \"PUT\",\n      },\n    );\n  }\n\n  async trackBulkTestGen(sessionId: string) {\n    return this.fetch<{ ok: boolean }>(`dbt/v2/bulk_test_gen`, {\n      method: \"POST\",\n      body: JSON.stringify({ session_id: sessionId }),\n    });\n  }\n}\n"
  },
  {
    "path": "src/autocompletion_provider/docAutocompletionProvider.ts",
    "content": "import {\n  CancellationToken,\n  CompletionContext,\n  CompletionItem,\n  CompletionItemKind,\n  CompletionItemProvider,\n  CompletionList,\n  Disposable,\n  Position,\n  ProviderResult,\n  TextDocument,\n  Uri,\n} from \"vscode\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { ManifestCacheChangedEvent } from \"../dbt_client/event/manifestCacheChangedEvent\";\nimport { TelemetryService } from \"../telemetry\";\nimport { isEnclosedWithinCodeBlock } from \"../utils\";\n\nexport class DocAutocompletionProvider\n  implements CompletionItemProvider, Disposable\n{\n  private static readonly ENDS_WITH_DOC = /doc\\(['|\"]$/;\n  private docAutocompleteNameItemsMap: Map<string, CompletionItem[]> =\n    new Map();\n  private disposables: Disposable[] = [];\n\n  constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    private telemetry: TelemetryService,\n  ) {\n    this.disposables.push(\n      dbtProjectContainer.onManifestChanged((event) =>\n        this.onManifestCacheChanged(event),\n      ),\n    );\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n\n  provideCompletionItems(\n    document: TextDocument,\n    position: Position,\n    token: CancellationToken,\n    context: CompletionContext,\n  ): ProviderResult<CompletionItem[] | CompletionList<CompletionItem>> {\n    const linePrefix = document\n      .lineAt(position)\n      .text.substr(0, position.character);\n    if (!isEnclosedWithinCodeBlock(document, position)) {\n      return undefined;\n    }\n    const projectRootpath = this.dbtProjectContainer.getProjectRootpath(\n      document.uri,\n    );\n    if (projectRootpath === undefined) {\n      return;\n    }\n\n    if (linePrefix.match(DocAutocompletionProvider.ENDS_WITH_DOC)) {\n      return this.showDocNameAutocompletionItems(projectRootpath);\n    }\n    return undefined;\n  }\n\n  private onManifestCacheChanged(event: ManifestCacheChangedEvent): void {\n    event.added?.forEach((added) => {\n      this.docAutocompleteNameItemsMap.set(\n        added.project.projectRoot.fsPath,\n        Array.from(added.docMetaMap.keys()).map(\n          (docName) => new CompletionItem(docName, CompletionItemKind.File),\n        ),\n      );\n    });\n    event.removed?.forEach((removed) => {\n      this.docAutocompleteNameItemsMap.delete(removed.projectRoot.fsPath);\n    });\n  }\n\n  private showDocNameAutocompletionItems(projectRootpath: Uri) {\n    this.telemetry.sendTelemetryEvent(\"provideDocAutocompletion\");\n    return this.docAutocompleteNameItemsMap.get(projectRootpath.fsPath);\n  }\n}\n"
  },
  {
    "path": "src/autocompletion_provider/index.ts",
    "content": "import { Disposable, languages } from \"vscode\";\nimport { DBTPowerUserExtension } from \"../dbtPowerUserExtension\";\nimport { DocAutocompletionProvider } from \"./docAutocompletionProvider\";\nimport { MacroAutocompletionProvider } from \"./macroAutocompletionProvider\";\nimport { ModelAutocompletionProvider } from \"./modelAutocompletionProvider\";\nimport { SourceAutocompletionProvider } from \"./sourceAutocompletionProvider\";\nimport { UserCompletionProvider } from \"./usercompletion_provider\";\n\nexport class AutocompletionProviders implements Disposable {\n  private disposables: Disposable[] = [];\n\n  constructor(\n    private macroAutocompletionProvider: MacroAutocompletionProvider,\n    private modelAutocompletionProvider: ModelAutocompletionProvider,\n    private sourceAutocompletionProvider: SourceAutocompletionProvider,\n    private docAutocompletionProvider: DocAutocompletionProvider,\n    private userCompletionProvider: UserCompletionProvider,\n  ) {\n    this.disposables.push(\n      languages.registerCompletionItemProvider(\n        DBTPowerUserExtension.DBT_SQL_SELECTOR,\n        this.macroAutocompletionProvider,\n      ),\n      languages.registerCompletionItemProvider(\n        DBTPowerUserExtension.DBT_SQL_SELECTOR,\n        this.modelAutocompletionProvider,\n        \".\",\n        \"(\",\n        '\"',\n        \"'\",\n      ),\n      languages.registerCompletionItemProvider(\n        DBTPowerUserExtension.DBT_SQL_SELECTOR,\n        this.sourceAutocompletionProvider,\n        \".\",\n        \"(\",\n        '\"',\n        \"'\",\n      ),\n      languages.registerCompletionItemProvider(\n        DBTPowerUserExtension.DBT_YAML_SELECTOR,\n        this.docAutocompletionProvider,\n        \".\",\n        \"(\",\n        '\"',\n        \"'\",\n      ),\n      // enabled only for markdowns - to work for comment inputs\n      languages.registerCompletionItemProvider(\n        { language: \"markdown\" },\n        this.userCompletionProvider,\n        \"@\",\n      ),\n    );\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/autocompletion_provider/macroAutocompletionProvider.ts",
    "content": "import {\n  CancellationToken,\n  CompletionContext,\n  CompletionItem,\n  CompletionItemKind,\n  CompletionItemProvider,\n  CompletionList,\n  Disposable,\n  Position,\n  ProviderResult,\n  TextDocument,\n  Uri,\n} from \"vscode\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { ManifestCacheChangedEvent } from \"../dbt_client/event/manifestCacheChangedEvent\";\nimport { TelemetryService } from \"../telemetry\";\nimport { isEnclosedWithinCodeBlock } from \"../utils\";\n\n// TODO autocomplete doesn't work when mistype, delete and retype\nexport class MacroAutocompletionProvider\n  implements CompletionItemProvider, Disposable\n{\n  private macrosAutocompleteMap: Map<string, CompletionItem[]> = new Map();\n  private disposables: Disposable[] = [];\n\n  constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    private telemetry: TelemetryService,\n  ) {\n    this.disposables.push(\n      dbtProjectContainer.onManifestChanged((event) =>\n        this.onManifestCacheChanged(event),\n      ),\n    );\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n\n  provideCompletionItems(\n    document: TextDocument,\n    position: Position,\n    token: CancellationToken,\n    context: CompletionContext,\n  ): ProviderResult<CompletionItem[] | CompletionList<CompletionItem>> {\n    const range = document.getWordRangeAtPosition(position);\n    if (range && isEnclosedWithinCodeBlock(document, range)) {\n      return this.getAutoCompleteItems(document.uri);\n    }\n    return undefined;\n  }\n\n  private onManifestCacheChanged(event: ManifestCacheChangedEvent): void {\n    event.added?.forEach((added) => {\n      this.macrosAutocompleteMap.set(\n        added.project.projectRoot.fsPath,\n        Array.from(added.macroMetaMap.keys()).map((macro) => ({\n          label: macro,\n          insertText: macro,\n          kind: CompletionItemKind.Value,\n          detail: \"Macro\",\n        })),\n      );\n    });\n    event.removed?.forEach((removed) => {\n      this.macrosAutocompleteMap.delete(removed.projectRoot.fsPath);\n    });\n  }\n\n  private getAutoCompleteItems = (currentFilePath: Uri) => {\n    const projectRootpath =\n      this.dbtProjectContainer.getProjectRootpath(currentFilePath);\n    if (projectRootpath === undefined) {\n      return;\n    }\n    this.telemetry.sendTelemetryEvent(\"provideMacroAutocompletion\");\n    return this.macrosAutocompleteMap.get(projectRootpath.fsPath);\n  };\n}\n"
  },
  {
    "path": "src/autocompletion_provider/modelAutocompletionProvider.ts",
    "content": "import { RESOURCE_TYPE_ANALYSIS } from \"@altimateai/dbt-integration\";\nimport {\n  CancellationToken,\n  CompletionContext,\n  CompletionItem,\n  CompletionItemKind,\n  CompletionItemProvider,\n  CompletionList,\n  Disposable,\n  Position,\n  ProviderResult,\n  TextDocument,\n  Uri,\n} from \"vscode\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { ManifestCacheChangedEvent } from \"../dbt_client/event/manifestCacheChangedEvent\";\nimport { TelemetryService } from \"../telemetry\";\nimport { isEnclosedWithinCodeBlock } from \"../utils\";\n\n// TODO autocomplete doesn't work when mistype, delete and retype\nexport class ModelAutocompletionProvider\n  implements CompletionItemProvider, Disposable\n{\n  private static readonly MODEL_PATTERN = /ref\\s*\\(\\s*(['\"])?\\s*\\w*$/;\n  private static readonly PACKAGE_PATTERN =\n    /ref\\s*\\(\\s*('[^)']*'|\"[^)\"]*\")\\s*,\\s*(['\"])?\\s*\\w*$/;\n  private modelAutocompleteMap: Map<\n    string,\n    {\n      projectName: string;\n      packageName: string;\n      modelName: string;\n    }[]\n  > = new Map();\n  private disposables: Disposable[] = [];\n\n  constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    private telemetry: TelemetryService,\n  ) {\n    this.disposables.push(\n      dbtProjectContainer.onManifestChanged((event) =>\n        this.onManifestCacheChanged(event),\n      ),\n    );\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n\n  provideCompletionItems(\n    document: TextDocument,\n    position: Position,\n    token: CancellationToken,\n    context: CompletionContext,\n  ): ProviderResult<CompletionItem[] | CompletionList<CompletionItem>> {\n    const line = document.lineAt(position).text;\n    const linePrefix = line.substring(0, position.character);\n    if (!isEnclosedWithinCodeBlock(document, position)) {\n      return undefined;\n    }\n    const modelMatch = linePrefix.match(\n      ModelAutocompletionProvider.MODEL_PATTERN,\n    );\n    const packageMatch = linePrefix.match(\n      ModelAutocompletionProvider.PACKAGE_PATTERN,\n    );\n    if (!modelMatch && !packageMatch) {\n      return undefined;\n    }\n    let autoCompleteItems = this.getAutoCompleteItems(document.uri);\n    if (!autoCompleteItems) {\n      return undefined;\n    }\n    if (modelMatch) {\n      // capture group for first quote after parenthesis\n      // can be one of [`'`, `\"`, undefined]\n      if (!modelMatch[1]) {\n        // if no quotes surround insertText by \"\n        return autoCompleteItems.map((completionItem) => ({\n          label: `(${completionItem.packageName}) ${completionItem.modelName}`,\n          kind: CompletionItemKind.Value,\n          detail: \"Model\",\n          insertText:\n            completionItem.projectName === completionItem.packageName\n              ? `\"${completionItem.modelName}\"`\n              : `\"${completionItem.packageName}\", \"${completionItem.modelName}\"`,\n        }));\n      }\n      // if quotes then add end quote to match start quote\n      const endQuote =\n        line[position.character] === modelMatch[1] ? \"\" : modelMatch[1];\n      return autoCompleteItems.map((completionItem) => ({\n        label: `(${completionItem.packageName}) ${completionItem.modelName}`,\n        kind: CompletionItemKind.Value,\n        detail: \"Model\",\n        insertText:\n          completionItem.projectName === completionItem.packageName\n            ? `${completionItem.modelName}${endQuote}`\n            : `${completionItem.packageName}${modelMatch[1]}, ${modelMatch[1]}${completionItem.modelName}${endQuote}`,\n      }));\n    }\n    if (packageMatch) {\n      const packageName = packageMatch[1].replace(/['\"]/g, \"\");\n      autoCompleteItems = autoCompleteItems.filter(\n        (completionItem) => completionItem.packageName === packageName,\n      );\n      // capture group for second quote after parenthesis\n      // can be one of [`'`, `\"`, undefined]\n      if (!packageMatch[2]) {\n        return autoCompleteItems.map((completionItem) => ({\n          label: completionItem.modelName,\n          kind: CompletionItemKind.Value,\n          detail: \"Model\",\n          insertText: `\"${completionItem.modelName}\"`,\n        }));\n      }\n      // if quotes then add end quote to match start quote\n      const endQuote =\n        line[position.character] === packageMatch[2] ? \"\" : packageMatch[2];\n      return autoCompleteItems.map((completionItem) => ({\n        label: completionItem.modelName,\n        kind: CompletionItemKind.Value,\n        detail: \"Model\",\n        insertText: `${completionItem.modelName}${endQuote}`,\n      }));\n    }\n\n    return undefined;\n  }\n\n  private onManifestCacheChanged(event: ManifestCacheChangedEvent): void {\n    event.added?.forEach((added) => {\n      const project = added.project;\n      const projectName = project.getProjectName();\n      const models = added.nodeMetaMap.nodes();\n      const autocompleteItems = Array.from(models)\n        .filter((model) => model.resource_type !== RESOURCE_TYPE_ANALYSIS)\n        .map((model) => ({\n          projectName,\n          packageName: model.package_name,\n          // TODO: fix this autocomplete to support for model version\n          modelName: model.name,\n        }));\n\n      const uniqueItems: Record<\n        string,\n        {\n          projectName: string;\n          packageName: string;\n          modelName: string;\n        }\n      > = {};\n\n      for (const item of autocompleteItems) {\n        const key = `${item.projectName}|${item.packageName}|${item.modelName}`;\n        if (!uniqueItems[key]) {\n          uniqueItems[key] = item;\n        }\n      }\n\n      this.modelAutocompleteMap.set(\n        added.project.projectRoot.fsPath,\n        Object.values(uniqueItems),\n      );\n    });\n    event.removed?.forEach((removed) => {\n      this.modelAutocompleteMap.delete(removed.projectRoot.fsPath);\n    });\n  }\n\n  private getAutoCompleteItems = (currentFilePath: Uri) => {\n    const projectRootpath =\n      this.dbtProjectContainer.getProjectRootpath(currentFilePath);\n    if (projectRootpath === undefined) {\n      const project = this.dbtProjectContainer.getFromWorkspaceState(\n        \"dbtPowerUser.projectSelected\",\n      );\n      if (!project?.uri) {\n        return;\n      }\n\n      return this.modelAutocompleteMap.get(project.uri.fsPath);\n    }\n    this.telemetry.sendTelemetryEvent(\"provideModelAutocompletion\");\n    return this.modelAutocompleteMap.get(projectRootpath.fsPath);\n  };\n}\n"
  },
  {
    "path": "src/autocompletion_provider/sourceAutocompletionProvider.ts",
    "content": "import {\n  CancellationToken,\n  CompletionContext,\n  CompletionItem,\n  CompletionItemKind,\n  CompletionItemProvider,\n  CompletionList,\n  Disposable,\n  Position,\n  ProviderResult,\n  TextDocument,\n  Uri,\n} from \"vscode\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { ManifestCacheChangedEvent } from \"../dbt_client/event/manifestCacheChangedEvent\";\nimport { TelemetryService } from \"../telemetry\";\nimport { isEnclosedWithinCodeBlock } from \"../utils\";\n\n// TODO autocomplete doesn't work when mistype, delete and retype\nexport class SourceAutocompletionProvider\n  implements CompletionItemProvider, Disposable\n{\n  private static readonly GET_SOURCE_NAME = /(?!['\"])(\\w+)(?=['\"])/;\n  private static readonly ENDS_WITH_SOURCE = /source\\(['|\"]$/;\n  private sourceAutocompleteNameItemsMap: Map<string, CompletionItem[]> =\n    new Map();\n  private sourceAutocompleteTableMap: Map<\n    string,\n    Map<string, CompletionItem[]>\n  > = new Map();\n  private disposables: Disposable[] = [];\n\n  constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    private telemetry: TelemetryService,\n  ) {\n    this.disposables.push(\n      dbtProjectContainer.onManifestChanged((event) =>\n        this.onManifestCacheChanged(event),\n      ),\n    );\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n\n  provideCompletionItems(\n    document: TextDocument,\n    position: Position,\n    token: CancellationToken,\n    context: CompletionContext,\n  ): ProviderResult<CompletionItem[] | CompletionList<CompletionItem>> {\n    const linePrefix = document\n      .lineAt(position)\n      .text.substr(0, position.character);\n    if (!isEnclosedWithinCodeBlock(document, position)) {\n      return undefined;\n    }\n    const projectRootpath = this.dbtProjectContainer.getProjectRootpath(\n      document.uri,\n    );\n    if (projectRootpath === undefined) {\n      return;\n    }\n\n    if (linePrefix.match(SourceAutocompletionProvider.ENDS_WITH_SOURCE)) {\n      return this.showSourceNameAutocompletionItems(projectRootpath);\n    }\n\n    if (\n      linePrefix.match(SourceAutocompletionProvider.GET_SOURCE_NAME) &&\n      linePrefix.includes(\"source\")\n    ) {\n      const autoCompleteItems = this.showTableNameAutocompletionItems(\n        linePrefix,\n        projectRootpath,\n      );\n      return autoCompleteItems;\n    }\n    return undefined;\n  }\n\n  private onManifestCacheChanged(event: ManifestCacheChangedEvent): void {\n    event.added?.forEach((added) => {\n      this.sourceAutocompleteNameItemsMap.set(\n        added.project.projectRoot.fsPath,\n        Array.from(added.sourceMetaMap.keys()).map(\n          (source) => new CompletionItem(source, CompletionItemKind.File),\n        ),\n      );\n      const sourceTableMap: Map<string, CompletionItem[]> = new Map();\n      added.sourceMetaMap.forEach((value, key) => {\n        const autocompleteItems = value.tables.map((item) => {\n          return new CompletionItem(item.name, CompletionItemKind.File);\n        });\n        sourceTableMap.set(key, autocompleteItems);\n      });\n      this.sourceAutocompleteTableMap.set(\n        added.project.projectRoot.fsPath,\n        sourceTableMap,\n      );\n    });\n    event.removed?.forEach((removed) => {\n      this.sourceAutocompleteNameItemsMap.delete(removed.projectRoot.fsPath);\n      this.sourceAutocompleteTableMap.delete(removed.projectRoot.fsPath);\n    });\n  }\n\n  private showSourceNameAutocompletionItems(projectRootpath: Uri) {\n    return this.sourceAutocompleteNameItemsMap.get(projectRootpath.fsPath);\n  }\n\n  private showTableNameAutocompletionItems(\n    linePrefix: string,\n    projectRootpath: Uri,\n  ) {\n    const sourceNameMatch = linePrefix.match(\n      SourceAutocompletionProvider.GET_SOURCE_NAME,\n    );\n    if (sourceNameMatch !== null) {\n      const sourceTableMap = this.sourceAutocompleteTableMap.get(\n        projectRootpath.fsPath,\n      );\n      if (sourceTableMap === undefined) {\n        return;\n      }\n      this.telemetry.sendTelemetryEvent(\"provideSourceAutocompletion\");\n      return sourceTableMap.get(sourceNameMatch[0]);\n    }\n  }\n}\n"
  },
  {
    "path": "src/autocompletion_provider/usercompletion_provider.ts",
    "content": "import {\n  CompletionItem,\n  CompletionItemKind,\n  CompletionItemProvider,\n  CompletionList,\n  Disposable,\n  ProviderResult,\n} from \"vscode\";\nimport { UsersService } from \"../services/usersService\";\n\nexport class UserCompletionProvider\n  implements CompletionItemProvider, Disposable\n{\n  private disposables: Disposable[] = [];\n\n  constructor(private usersService: UsersService) {}\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n\n  provideCompletionItems(): ProviderResult<\n    CompletionItem[] | CompletionList<CompletionItem>\n  > {\n    return this.usersService.users.map((user) => ({\n      label: {\n        label: `${user.display_name}`,\n        // description: \"Altimate\",\n        detail: \" (Altimate)\",\n      },\n      kind: CompletionItemKind.User,\n      keepWhitespace: true,\n      insertText: `${user.display_name} `,\n    }));\n  }\n}\n"
  },
  {
    "path": "src/code_lens_provider/cteCodeLensProvider.ts",
    "content": "import { DBTTerminal } from \"@altimateai/dbt-integration\";\nimport { inject } from \"inversify\";\nimport {\n  CancellationToken,\n  CodeLens,\n  CodeLensProvider,\n  Command,\n  Disposable,\n  Range,\n  TextDocument,\n} from \"vscode\";\nexport interface CteInfo {\n  name: string;\n  range: Range;\n  queryRange: Range;\n  index: number; // Order of CTE in the WITH clause\n  withClauseStart: number; // Start position of the WITH clause\n}\n\nexport class CteCodeLensProvider implements CodeLensProvider, Disposable {\n  private disposables: Disposable[] = [];\n\n  // Regex bounds constants to prevent catastrophic backtracking\n  // These limits are based on realistic SQL formatting expectations and database constraints\n\n  /** Maximum characters in quoted identifiers (\"name\", `name`, [name])\n   * Rationale: Most databases limit identifier length to 128-255 chars.\n   * 500 chars covers most real-world cases while preventing excessive backtracking. */\n  private static readonly MAX_QUOTED_IDENTIFIER_LENGTH = 500;\n\n  /** Maximum characters in CTE column list (id, name, description, etc.)\n   * Rationale: Column lists with types and constraints can be lengthy.\n   * 1000 chars accommodates complex column definitions in most practical scenarios. */\n  private static readonly MAX_COLUMN_LIST_LENGTH = 1000;\n\n  constructor(\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n  ) {}\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n\n  public provideCodeLenses(\n    document: TextDocument,\n    _token: CancellationToken,\n  ): CodeLens[] | Thenable<CodeLens[]> {\n    try {\n      // Only provide code lenses for SQL files\n      if (!document.languageId.includes(\"sql\")) {\n        this.dbtTerminal.debug(\n          \"CteCodeLensProvider\",\n          `Skipping non-SQL file: ${document.languageId}`,\n        );\n        return [];\n      }\n\n      this.dbtTerminal.debug(\n        \"CteCodeLensProvider\",\n        `Starting CTE detection for ${document.uri.fsPath}`,\n      );\n\n      const ctes = this.detectCtes(document);\n      const codeLenses: CodeLens[] = [];\n\n      this.dbtTerminal.debug(\n        \"CteCodeLensProvider\",\n        `Found ${ctes.length} CTEs in document`,\n      );\n\n      // Render both CodeLens actions on every CTE start line:\n      //   • Execute CTE: <name>   — per-CTE query preview\n      //   • ⏱ Profile CTEs         — profiles all CTEs cumulatively\n      // Profile is duplicated across lines so users don't have to scroll to\n      // the top to trigger it; every invocation runs the full profile.\n      for (const cte of ctes) {\n        const runCteCommand: Command = {\n          title: `$(play) Execute CTE: ${cte.name}`,\n          command: \"dbtPowerUser.runCteWithDependencies\",\n          arguments: [document.uri, cte.index, ctes],\n        };\n        codeLenses.push(new CodeLens(cte.range, runCteCommand));\n\n        const profileCommand: Command = {\n          title: \"⏱ Profile CTEs\",\n          command: \"dbtPowerUser.profileCtes\",\n          arguments: [document.uri, ctes],\n        };\n        codeLenses.push(new CodeLens(cte.range, profileCommand));\n\n        this.dbtTerminal.debug(\n          \"CteCodeLensProvider\",\n          `Created code lens for CTE: ${cte.name} at index ${cte.index}`,\n        );\n      }\n\n      return codeLenses;\n    } catch (error) {\n      this.dbtTerminal.error(\n        \"CteCodeLensProvider\",\n        \"Error in provideCodeLenses\",\n        error,\n      );\n      return [];\n    }\n  }\n\n  private detectCtes(document: TextDocument): CteInfo[] {\n    const text = document.getText();\n    const ctes: CteInfo[] = [];\n\n    this.dbtTerminal.debug(\n      \"CteCodeLensProvider\",\n      `Document length: ${text.length} characters`,\n    );\n\n    // Find all WITH clauses by manually parsing to avoid comment confusion\n    // This ensures we don't match 'with' inside comments while allowing unlimited comment length\n    const withPositions = this.findWithKeywords(text);\n    let withClauseCount = 0;\n\n    for (const withPos of withPositions) {\n      withClauseCount++;\n      // Start parsing after the WITH keyword, skipping any comments and whitespace manually\n      let withStartPos = withPos + 4; // 'with'.length = 4\n\n      // Skip whitespace and comments after WITH keyword using the existing comment parsing logic\n      while (withStartPos < text.length) {\n        // Skip whitespace\n        while (withStartPos < text.length && /\\s/.test(text[withStartPos])) {\n          withStartPos++;\n        }\n\n        if (withStartPos >= text.length) {\n          break;\n        }\n\n        // Check for comments using existing handleSqlComment method\n        const commentEndPos = this.handleSqlComment(text, withStartPos);\n        if (commentEndPos !== withStartPos) {\n          // Found a comment, skip over it\n          withStartPos = commentEndPos + 1;\n          continue;\n        }\n\n        // No more whitespace or comments, we found the start of CTEs\n        break;\n      }\n\n      this.dbtTerminal.debug(\n        \"CteCodeLensProvider\",\n        `Found WITH clause #${withClauseCount} at position ${withPos}`,\n      );\n\n      // Find the end of this WITH clause (before the main SELECT)\n      const withClauseEnd = this.findWithClauseEnd(text, withStartPos);\n      if (withClauseEnd === -1) {\n        this.dbtTerminal.warn(\n          \"CteCodeLensProvider\",\n          `Could not find end of WITH clause #${withClauseCount} starting at ${withStartPos}`,\n        );\n        continue;\n      }\n\n      this.dbtTerminal.debug(\n        \"CteCodeLensProvider\",\n        `WITH clause #${withClauseCount} ends at position ${withClauseEnd}`,\n      );\n\n      // Extract the WITH clause content\n      const withClauseContent = text.substring(withStartPos, withClauseEnd);\n\n      this.dbtTerminal.debug(\n        \"CteCodeLensProvider\",\n        `WITH clause content length: ${withClauseContent.length} characters`,\n      );\n\n      // Find all CTEs within this WITH clause\n      const beforeCteCount = ctes.length;\n      this.extractCtesFromWithClause(\n        withClauseContent,\n        withStartPos,\n        withPos,\n        document,\n        ctes,\n      );\n\n      const ctesFound = ctes.length - beforeCteCount;\n      this.dbtTerminal.debug(\n        \"CteCodeLensProvider\",\n        `Found ${ctesFound} CTEs in WITH clause #${withClauseCount}`,\n      );\n    }\n\n    this.dbtTerminal.debug(\n      \"CteCodeLensProvider\",\n      `Total WITH clauses found: ${withClauseCount}, Total CTEs found: ${ctes.length}`,\n    );\n\n    return ctes;\n  }\n\n  /**\n   * Find all WITH keywords in the text while properly skipping comments and strings\n   * This prevents matching 'with' inside comments or strings\n   */\n  private findWithKeywords(text: string): number[] {\n    const withPositions: number[] = [];\n    let pos = 0;\n    let inString = false;\n    let stringChar = \"\";\n\n    while (pos < text.length) {\n      // Handle comments first - skip over them entirely\n      const commentEndPos = this.handleSqlComment(text, pos);\n      if (commentEndPos !== pos) {\n        pos = commentEndPos + 1;\n        continue;\n      }\n\n      // Handle string literals using helper function\n      const stringResult = this.handleSqlStringLiteral(\n        text,\n        pos,\n        inString,\n        stringChar,\n      );\n      pos = stringResult.newPos;\n      inString = stringResult.inString;\n      stringChar = stringResult.stringChar;\n\n      // Only look for WITH keyword outside of strings and comments\n      if (!inString) {\n        const remainingText = text.substring(pos);\n        const withMatch = remainingText.match(/^with\\b/i);\n        if (withMatch) {\n          // Found a WITH keyword - verify it's not part of a larger identifier\n          const charBefore = pos > 0 ? text[pos - 1] : \" \";\n          if (!/[a-zA-Z0-9_]/.test(charBefore)) {\n            withPositions.push(pos);\n          }\n          pos += withMatch[0].length;\n          continue;\n        }\n      }\n\n      pos++;\n    }\n\n    return withPositions;\n  }\n\n  /**\n   * Helper function to handle SQL string literal parsing with proper quote escaping\n   * Returns updated position and string state\n   */\n  private handleSqlStringLiteral(\n    text: string,\n    pos: number,\n    inString: boolean,\n    stringChar: string,\n  ): { newPos: number; inString: boolean; stringChar: string } {\n    const char = text[pos];\n    const nextChar = pos < text.length - 1 ? text[pos + 1] : \"\";\n\n    // Handle string literals with SQL-style quote escaping\n    if (!inString && (char === \"'\" || char === '\"')) {\n      return {\n        newPos: pos,\n        inString: true,\n        stringChar: char,\n      };\n    } else if (inString && char === stringChar) {\n      // Check for doubled quotes (SQL escape sequence)\n      if (nextChar === stringChar) {\n        // This is an escaped quote - skip the next character\n        this.dbtTerminal.debug(\n          \"CteCodeLensProvider\",\n          `Found escaped quote (${stringChar}${stringChar}) at position ${pos}`,\n        );\n        return {\n          newPos: pos + 1, // Skip the second quote\n          inString: true,\n          stringChar: stringChar,\n        };\n      } else {\n        // This is the end of the string\n        return {\n          newPos: pos,\n          inString: false,\n          stringChar: \"\",\n        };\n      }\n    }\n\n    return { newPos: pos, inString, stringChar };\n  }\n\n  /**\n   * Helper function to handle SQL and Jinja comment parsing\n   * Returns updated position if currently at start of a comment, otherwise returns original position\n   */\n  private handleSqlComment(text: string, pos: number): number {\n    const char = text[pos];\n    const nextChar = pos < text.length - 1 ? text[pos + 1] : \"\";\n\n    // Handle line comments (-- comment)\n    if (char === \"-\" && nextChar === \"-\") {\n      this.dbtTerminal.debug(\n        \"CteCodeLensProvider\",\n        `Found line comment starting at position ${pos}`,\n      );\n      // Skip to end of line\n      let endPos = pos + 2;\n      while (\n        endPos < text.length &&\n        text[endPos] !== \"\\n\" &&\n        text[endPos] !== \"\\r\"\n      ) {\n        endPos++;\n      }\n      this.dbtTerminal.debug(\n        \"CteCodeLensProvider\",\n        `Line comment ends at position ${endPos}`,\n      );\n      // Return position at the newline (or end of text)\n      return endPos;\n    }\n\n    // Handle block comments (/* comment */)\n    if (char === \"/\" && nextChar === \"*\") {\n      this.dbtTerminal.debug(\n        \"CteCodeLensProvider\",\n        `Found block comment starting at position ${pos}`,\n      );\n      // Skip to end of block comment\n      let endPos = pos + 2;\n      while (endPos < text.length - 1) {\n        if (text[endPos] === \"*\" && text[endPos + 1] === \"/\") {\n          this.dbtTerminal.debug(\n            \"CteCodeLensProvider\",\n            `Block comment ends at position ${endPos + 1}`,\n          );\n          return endPos + 1; // Return position after the closing */\n        }\n        endPos++;\n      }\n      this.dbtTerminal.warn(\n        \"CteCodeLensProvider\",\n        `Unterminated block comment starting at position ${pos}`,\n      );\n      return text.length; // Return end of text if comment is not closed\n    }\n\n    // Handle Jinja comments ({# comment #})\n    if (char === \"{\" && nextChar === \"#\") {\n      this.dbtTerminal.debug(\n        \"CteCodeLensProvider\",\n        `Found Jinja comment starting at position ${pos}`,\n      );\n      // Skip to end of Jinja comment\n      let endPos = pos + 2;\n      while (endPos < text.length - 1) {\n        if (text[endPos] === \"#\" && text[endPos + 1] === \"}\") {\n          this.dbtTerminal.debug(\n            \"CteCodeLensProvider\",\n            `Jinja comment ends at position ${endPos + 1}`,\n          );\n          return endPos + 1; // Return position after the closing #}\n        }\n        endPos++;\n      }\n      this.dbtTerminal.warn(\n        \"CteCodeLensProvider\",\n        `Unterminated Jinja comment starting at position ${pos}`,\n      );\n      return text.length; // Return end of text if comment is not closed\n    }\n\n    return pos; // Not a comment, return original position\n  }\n\n  /**\n   * Check if a given position is inside a comment (line, block, or Jinja)\n   * This helps filter out false positive identifier matches within comments\n   */\n  private isPositionInsideComment(content: string, position: number): boolean {\n    // Scan backwards from the position to see if we're inside a comment\n    let pos = 0;\n    let inBlockComment = false;\n    let inJinjaComment = false;\n\n    while (pos < position && pos < content.length) {\n      const char = content[pos];\n      const nextChar = pos < content.length - 1 ? content[pos + 1] : \"\";\n\n      // Check for start of block comment\n      if (\n        !inBlockComment &&\n        !inJinjaComment &&\n        char === \"/\" &&\n        nextChar === \"*\"\n      ) {\n        inBlockComment = true;\n        pos += 2;\n        continue;\n      }\n\n      // Check for end of block comment\n      if (inBlockComment && char === \"*\" && nextChar === \"/\") {\n        inBlockComment = false;\n        pos += 2;\n        continue;\n      }\n\n      // Check for start of Jinja comment\n      if (\n        !inBlockComment &&\n        !inJinjaComment &&\n        char === \"{\" &&\n        nextChar === \"#\"\n      ) {\n        inJinjaComment = true;\n        pos += 2;\n        continue;\n      }\n\n      // Check for end of Jinja comment\n      if (inJinjaComment && char === \"#\" && nextChar === \"}\") {\n        inJinjaComment = false;\n        pos += 2;\n        continue;\n      }\n\n      // Check for line comment (only if not in other comments)\n      if (\n        !inBlockComment &&\n        !inJinjaComment &&\n        char === \"-\" &&\n        nextChar === \"-\"\n      ) {\n        // Line comment - check if our position is on this line\n        const lineStart = pos;\n        let lineEnd = pos + 2;\n        while (\n          lineEnd < content.length &&\n          content[lineEnd] !== \"\\n\" &&\n          content[lineEnd] !== \"\\r\"\n        ) {\n          lineEnd++;\n        }\n\n        // If position is within this line comment, return true\n        if (position >= lineStart && position < lineEnd) {\n          return true;\n        }\n\n        // Skip to end of line\n        pos = lineEnd;\n        continue;\n      }\n\n      pos++;\n    }\n\n    // If we're still in a block or Jinja comment when we reach the position, it's inside a comment\n    return inBlockComment || inJinjaComment;\n  }\n\n  /**\n   * Phase 1: Simple regex to find CTE identifiers without complex comment parsing\n   * This avoids catastrophic backtracking by focusing only on identifier patterns\n   */\n  private findCteIdentifiersOnly(\n    withClauseContent: string,\n  ): Array<{ index: number; identifierName: string; fullMatch: string }> {\n    // Simplified regex that matches only the identifier part\n    // This regex finds potential CTE identifiers followed by anything that looks like it could lead to AS\n    const simpleIdentifierRegex = new RegExp(\n      `((?:[a-zA-Z_][a-zA-Z0-9_]*|\"[^\"]{1,${CteCodeLensProvider.MAX_QUOTED_IDENTIFIER_LENGTH}}\"|` +\n        `\\`[^\\`]{1,${CteCodeLensProvider.MAX_QUOTED_IDENTIFIER_LENGTH}}\\`|` +\n        `\\\\[[^\\\\]]{1,${CteCodeLensProvider.MAX_QUOTED_IDENTIFIER_LENGTH}}\\\\])` +\n        `(?:\\\\.(?:[a-zA-Z_][a-zA-Z0-9_]*|\"[^\"]{1,${CteCodeLensProvider.MAX_QUOTED_IDENTIFIER_LENGTH}}\"|` +\n        `\\`[^\\`]{1,${CteCodeLensProvider.MAX_QUOTED_IDENTIFIER_LENGTH}}\\`|` +\n        `\\\\[[^\\\\]]{1,${CteCodeLensProvider.MAX_QUOTED_IDENTIFIER_LENGTH}}\\\\]))*` +\n        `(?:\\\\s*\\\\([^)]{0,${CteCodeLensProvider.MAX_COLUMN_LIST_LENGTH}}\\\\))?)`,\n      \"gi\",\n    );\n\n    const potentialMatches: Array<{\n      index: number;\n      identifierName: string;\n      fullMatch: string;\n    }> = [];\n    let match;\n\n    while ((match = simpleIdentifierRegex.exec(withClauseContent)) !== null) {\n      const identifierName = match[1];\n      const matchIndex = match.index;\n\n      // First check: Skip if this identifier is inside a comment\n      if (this.isPositionInsideComment(withClauseContent, matchIndex)) {\n        continue;\n      }\n\n      // Phase 2: Manually validate this match by checking for comments between identifier and AS\n      const validationResult = this.validateCteMatchWithComments(\n        withClauseContent,\n        matchIndex,\n        match[0],\n        identifierName,\n      );\n      if (validationResult.isValid) {\n        potentialMatches.push({\n          index: matchIndex,\n          identifierName: identifierName,\n          fullMatch: validationResult.fullMatch || match[0],\n        });\n      }\n    }\n\n    return potentialMatches;\n  }\n\n  /**\n   * Phase 2: Manually parse comments between identifier and AS keyword\n   * Uses existing handleSqlComment method to safely skip over comments\n   */\n  private validateCteMatchWithComments(\n    content: string,\n    startIndex: number,\n    fullMatch: string,\n    identifierName: string,\n  ): { isValid: boolean; fullMatch?: string } {\n    // Find the end of the identifier (including column list if present)\n    const identifierEndIndex = startIndex + identifierName.length;\n    let pos = identifierEndIndex;\n\n    // Skip any column list\n    while (pos < content.length && /\\s/.test(content[pos])) {\n      pos++;\n    }\n    if (pos < content.length && content[pos] === \"(\") {\n      const columnListEnd = this.findMatchingClosingParen(content, pos);\n      if (columnListEnd !== -1) {\n        pos = columnListEnd + 1;\n      }\n    }\n\n    // Now manually parse comments and whitespace until we find 'as'\n    while (pos < content.length) {\n      // Skip whitespace\n      while (pos < content.length && /\\s/.test(content[pos])) {\n        pos++;\n      }\n\n      if (pos >= content.length) {\n        break;\n      }\n\n      // Check for comments using existing handleSqlComment method\n      const commentEndPos = this.handleSqlComment(content, pos);\n      if (commentEndPos !== pos) {\n        // Found a comment, skip over it\n        pos = commentEndPos + 1;\n        continue;\n      }\n\n      // Check if we've reached the 'as' keyword\n      const remainingText = content.substring(pos);\n      const asMatch = remainingText.match(/^as\\s*\\(/i);\n      if (asMatch) {\n        // Calculate the full match including comments and AS\n        const fullMatchEnd = pos + asMatch[0].length;\n        const actualFullMatch = content.substring(startIndex, fullMatchEnd);\n        return {\n          isValid: true,\n          fullMatch: actualFullMatch,\n        };\n      }\n\n      // If we hit something that's not whitespace, comment, or 'as', this is not a valid CTE\n      break;\n    }\n\n    return { isValid: false };\n  }\n\n  private findWithClauseEnd(text: string, withStartPos: number): number {\n    // Look for the main SELECT that comes after all CTEs\n    // This is a simplified approach - we look for SELECT that's not inside parentheses\n    let pos = withStartPos;\n    let parenCount = 0;\n    let inString = false;\n    let stringChar = \"\";\n    let selectsChecked = 0;\n\n    this.dbtTerminal.debug(\n      \"CteCodeLensProvider\",\n      `Searching for WITH clause end starting at position ${withStartPos}`,\n    );\n\n    while (pos < text.length) {\n      const char = text[pos];\n\n      // Handle comments first - skip over them entirely\n      const commentEndPos = this.handleSqlComment(text, pos);\n      if (commentEndPos !== pos) {\n        pos = commentEndPos;\n        // Don't increment pos here - commentEndPos already points to the position after the comment\n        continue;\n      }\n\n      // Handle string literals using helper function\n      const stringResult = this.handleSqlStringLiteral(\n        text,\n        pos,\n        inString,\n        stringChar,\n      );\n      pos = stringResult.newPos;\n      inString = stringResult.inString;\n      stringChar = stringResult.stringChar;\n\n      // Only count parentheses and look for SELECT outside of strings\n      if (!inString) {\n        if (char === \"(\") {\n          parenCount++;\n        } else if (char === \")\") {\n          parenCount--;\n        } else if (parenCount === 0) {\n          // Check for nested WITH keyword at top level\n          const remainingText = text.substring(pos);\n          const nestedWithMatch = remainingText.match(/^\\s*with\\b/i);\n          if (nestedWithMatch) {\n            this.dbtTerminal.warn(\n              \"CteCodeLensProvider\",\n              `Found nested WITH clause at position ${pos}, bailing out - nested WITH clauses are not supported`,\n            );\n            return -1; // Signal failure due to nested WITH\n          }\n\n          // Check for SELECT keyword at top level\n          const selectMatch = remainingText.match(/^\\s*select\\b/i);\n          if (selectMatch) {\n            selectsChecked++;\n            this.dbtTerminal.debug(\n              \"CteCodeLensProvider\",\n              `Found top-level SELECT #${selectsChecked} at position ${pos}`,\n            );\n            return pos;\n          }\n        }\n      }\n\n      pos++;\n    }\n\n    this.dbtTerminal.warn(\n      \"CteCodeLensProvider\",\n      `No main SELECT found after WITH clause starting at ${withStartPos}, checked ${selectsChecked} SELECT statements`,\n    );\n    return text.length; // End of file if no main SELECT found\n  }\n\n  private extractCtesFromWithClause(\n    withClauseContent: string,\n    withStartPos: number,\n    withClauseStart: number,\n    document: TextDocument,\n    ctes: CteInfo[],\n  ): void {\n    this.dbtTerminal.debug(\n      \"CteCodeLensProvider\",\n      `Extracting CTEs from WITH clause content starting at ${withStartPos}`,\n    );\n\n    // Two-phase approach: Use simplified regex for identifier matching, then parse comments manually\n    // This eliminates catastrophic backtracking by avoiding complex nested quantifiers in regex\n    const cteMatches = this.findCteIdentifiersOnly(withClauseContent);\n    let cteIndex = 0;\n\n    for (const cteMatch of cteMatches) {\n      const cteName = cteMatch.identifierName;\n      const cteStartPos = withStartPos + cteMatch.index;\n      const cteNameEndPos =\n        withStartPos + cteMatch.index + cteMatch.identifierName.length;\n\n      this.dbtTerminal.debug(\n        \"CteCodeLensProvider\",\n        `Found CTE: ${cteName} at position ${cteStartPos}`,\n      );\n\n      // Find the opening parenthesis position\n      const openParenPos =\n        withStartPos + cteMatch.index + cteMatch.fullMatch.length - 1;\n\n      // Find the matching closing parenthesis\n      const cteQueryEnd = this.findMatchingClosingParen(\n        withClauseContent,\n        cteMatch.index + cteMatch.fullMatch.length - 1,\n      );\n      if (cteQueryEnd === -1) {\n        this.dbtTerminal.warn(\n          \"CteCodeLensProvider\",\n          `Could not find matching closing parenthesis for CTE: ${cteName}`,\n        );\n        continue; // Skip if we can't find matching paren\n      }\n\n      // Adjust position back to full text\n      const absoluteCteQueryEnd = withStartPos + cteQueryEnd;\n\n      this.dbtTerminal.debug(\n        \"CteCodeLensProvider\",\n        `CTE ${cteName} query range: ${openParenPos + 1} to ${absoluteCteQueryEnd}`,\n      );\n\n      // Create ranges\n      const cteNameRange = new Range(\n        document.positionAt(cteStartPos),\n        document.positionAt(cteNameEndPos),\n      );\n\n      const cteQueryRange = new Range(\n        document.positionAt(openParenPos + 1),\n        document.positionAt(absoluteCteQueryEnd),\n      );\n\n      ctes.push({\n        name: cteName,\n        range: cteNameRange,\n        queryRange: cteQueryRange,\n        index: cteIndex,\n        withClauseStart: withClauseStart,\n      });\n\n      this.dbtTerminal.debug(\n        \"CteCodeLensProvider\",\n        `Successfully extracted CTE: ${cteName} (index: ${cteIndex})`,\n      );\n\n      cteIndex++;\n    }\n\n    this.dbtTerminal.debug(\n      \"CteCodeLensProvider\",\n      `Extracted ${cteIndex} CTEs from WITH clause`,\n    );\n  }\n\n  private findMatchingClosingParen(text: string, openParenPos: number): number {\n    let parenCount = 1;\n    let pos = openParenPos + 1;\n    let inString = false;\n    let stringChar = \"\";\n    let maxDepth = 0;\n\n    this.dbtTerminal.debug(\n      \"CteCodeLensProvider\",\n      `Searching for matching closing paren starting at position ${openParenPos}`,\n    );\n\n    while (pos < text.length && parenCount > 0) {\n      const char = text[pos];\n\n      // Handle comments first - skip over them entirely\n      const commentEndPos = this.handleSqlComment(text, pos);\n      if (commentEndPos !== pos) {\n        pos = commentEndPos;\n        // Don't increment pos here - commentEndPos already points to the position after the comment\n        continue;\n      }\n\n      // Handle string literals using helper function\n      const stringResult = this.handleSqlStringLiteral(\n        text,\n        pos,\n        inString,\n        stringChar,\n      );\n      pos = stringResult.newPos;\n      inString = stringResult.inString;\n      stringChar = stringResult.stringChar;\n\n      // Only count parentheses outside of strings\n      if (!inString) {\n        if (char === \"(\") {\n          parenCount++;\n          maxDepth = Math.max(maxDepth, parenCount);\n        } else if (char === \")\") {\n          parenCount--;\n        }\n      }\n\n      pos++;\n    }\n\n    if (parenCount === 0) {\n      this.dbtTerminal.debug(\n        \"CteCodeLensProvider\",\n        `Found matching closing paren at position ${pos - 1}, max depth: ${maxDepth}`,\n      );\n      return pos - 1;\n    } else {\n      this.dbtTerminal.warn(\n        \"CteCodeLensProvider\",\n        `Could not find matching closing paren, remaining open parens: ${parenCount}, max depth reached: ${maxDepth}`,\n      );\n      return -1;\n    }\n  }\n}\n"
  },
  {
    "path": "src/code_lens_provider/index.ts",
    "content": "import { Disposable, languages } from \"vscode\";\nimport { DBTPowerUserExtension } from \"../dbtPowerUserExtension\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { CteCodeLensProvider } from \"./cteCodeLensProvider\";\nimport { SourceModelCreationCodeLensProvider } from \"./sourceModelCreationCodeLensProvider\";\nimport { SqlActionsCodeLensProvider } from \"./sqlActionsCodeLensProvider\";\nimport { VirtualSqlCodeLensProvider } from \"./virtualSqlCodeLensProvider\";\n\nexport class CodeLensProviders implements Disposable {\n  private disposables: Disposable[] = [];\n  constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    private sourceModelCreationCodeLensProvider: SourceModelCreationCodeLensProvider,\n    private virtualSqlCodeLensProvider: VirtualSqlCodeLensProvider,\n    private cteCodeLensProvider: CteCodeLensProvider,\n    private sqlActionsCodeLensProvider: SqlActionsCodeLensProvider,\n  ) {\n    // Add codelens after projects are initialized to avoid race conditions in executing notebook cells\n    this.dbtProjectContainer.onDBTProjectsInitialization(() => {\n      this.disposables.push(\n        languages.registerCodeLensProvider(\n          DBTPowerUserExtension.DBT_YAML_SELECTOR,\n          this.sourceModelCreationCodeLensProvider,\n        ),\n      );\n      this.disposables.push(\n        languages.registerCodeLensProvider(\n          DBTPowerUserExtension.DBT_SQL_SELECTOR,\n          this.virtualSqlCodeLensProvider,\n        ),\n      );\n      this.disposables.push(\n        languages.registerCodeLensProvider(\n          DBTPowerUserExtension.DBT_SQL_SELECTOR,\n          this.cteCodeLensProvider,\n        ),\n      );\n      this.disposables.push(\n        languages.registerCodeLensProvider(\n          DBTPowerUserExtension.DBT_SQL_SELECTOR,\n          this.sqlActionsCodeLensProvider,\n        ),\n        languages.registerCodeLensProvider(\n          DBTPowerUserExtension.DBT_YAML_SELECTOR,\n          this.sqlActionsCodeLensProvider,\n        ),\n      );\n    });\n  }\n\n  dispose() {\n    this.sqlActionsCodeLensProvider.dispose();\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/code_lens_provider/sourceModelCreationCodeLensProvider.ts",
    "content": "import {\n  CancellationToken,\n  CodeLens,\n  CodeLensProvider,\n  Event,\n  EventEmitter,\n  Range,\n  TextDocument,\n  Uri,\n} from \"vscode\";\nimport { CST, LineCounter, Parser } from \"yaml\";\n\ninterface Position {\n  line: number;\n  col: number;\n}\nexport interface GenerateModelFromSourceParams {\n  currentDoc: Uri;\n  sourceName: string;\n  database: string;\n  schema: string;\n  tableName: string;\n  tableIdentifier?: string;\n}\n\nexport class SourceModelCreationCodeLensProvider implements CodeLensProvider {\n  private codeLenses: CodeLens[] = [];\n  private _onDidChangeCodeLenses: EventEmitter<void> = new EventEmitter<void>();\n  public readonly onDidChangeCodeLenses: Event<void> =\n    this._onDidChangeCodeLenses.event;\n\n  public provideCodeLenses(\n    document: TextDocument,\n    token: CancellationToken,\n  ): CodeLens[] | Thenable<CodeLens[]> {\n    this.codeLenses = [];\n    const lineCounter = new LineCounter();\n    let currentSource: string | undefined = undefined;\n    let currentDatabase: string | undefined = undefined;\n    let currentSchema: string | undefined = undefined;\n    let currentTables: {\n      tableName: string;\n      tableIdentifier?: string;\n      pos: Position;\n    }[];\n\n    for (const token of new Parser(lineCounter.addNewLine).parse(\n      document.getText(),\n    )) {\n      if (token.type === \"document\" && CST.isCollection(token.value)) {\n        for (const i in token.value.items) {\n          const item = token.value.items[i];\n          if (\n            CST.isScalar(item.key) &&\n            item.key.source === \"sources\" &&\n            CST.isCollection(item.value)\n          ) {\n            // inside sources\n            for (const j in item.value.items) {\n              // inside a source\n              currentTables = [];\n              const source = item.value.items[j];\n              if (CST.isCollection(source.value)) {\n                //\n                for (const k in source.value.items) {\n                  const sourceProperty = source.value.items[k];\n                  if (\n                    CST.isScalar(sourceProperty.key) &&\n                    CST.isScalar(sourceProperty.value)\n                  ) {\n                    if (sourceProperty.key.source === \"name\") {\n                      currentSource = sourceProperty.value.source;\n                    }\n                    if (sourceProperty.key.source === \"database\") {\n                      currentDatabase = sourceProperty.value.source;\n                    }\n                    if (sourceProperty.key.source === \"schema\") {\n                      currentSchema = sourceProperty.value.source;\n                    }\n                  }\n                  if (\n                    CST.isScalar(sourceProperty.key) &&\n                    CST.isCollection(sourceProperty.value) &&\n                    sourceProperty.key.source === \"tables\"\n                  ) {\n                    // inside tables\n                    let tableName: string | undefined = undefined;\n                    let tableIdentifier: string | undefined = undefined;\n                    let position: Position | undefined = undefined;\n                    for (const l in sourceProperty.value.items) {\n                      const table = sourceProperty.value.items[l];\n                      if (CST.isCollection(table.value)) {\n                        for (const m in table.value.items) {\n                          position = lineCounter.linePos(table.value.offset);\n                          const tableProperty = table.value.items[m];\n                          if (\n                            CST.isScalar(tableProperty.value) &&\n                            CST.isScalar(tableProperty.key)\n                          ) {\n                            if (tableProperty.key.source === \"name\") {\n                              tableName = tableProperty.value.source;\n                            }\n                            if (tableProperty.key.source === \"identifier\") {\n                              tableIdentifier = tableProperty.value.source;\n                            }\n                          }\n                        }\n                      }\n                      if (tableName !== undefined && position !== undefined) {\n                        currentTables.push({\n                          tableName: tableName,\n                          tableIdentifier: tableIdentifier,\n                          pos: position,\n                        });\n                        tableName = undefined;\n                        tableIdentifier = undefined;\n                        position = undefined;\n                      }\n                    }\n                  }\n                }\n              }\n\n              // add all tables\n              for (const i in currentTables) {\n                const table = currentTables[i];\n                const params: GenerateModelFromSourceParams = {\n                  currentDoc: document.uri,\n                  sourceName: currentSource!,\n                  database: currentDatabase!,\n                  schema: currentSchema!,\n                  tableName: table.tableName,\n                  tableIdentifier: table.tableIdentifier,\n                };\n                this.codeLenses.push(\n                  new CodeLens(\n                    new Range(\n                      table.pos.line - 1,\n                      table.pos.col,\n                      table.pos.line - 1,\n                      table.pos.col,\n                    ),\n                    {\n                      title: \"Generate model\",\n                      tooltip: \"Generate model based on source configuration\",\n                      command: \"dbtPowerUser.createModelBasedonSourceConfig\",\n                      arguments: [params],\n                    },\n                  ),\n                );\n              }\n              currentDatabase = undefined;\n              currentSchema = undefined;\n              currentSource = undefined;\n            }\n          }\n        }\n      }\n    }\n    return this.codeLenses;\n  }\n}\n"
  },
  {
    "path": "src/code_lens_provider/sqlActionsCodeLensProvider.ts",
    "content": "import * as path from \"path\";\nimport {\n  CancellationToken,\n  CodeLens,\n  CodeLensProvider,\n  commands,\n  Disposable,\n  Event,\n  EventEmitter,\n  extensions,\n  ProviderResult,\n  Range,\n  TextDocument,\n  Uri,\n  window,\n} from \"vscode\";\nimport { CST, LineCounter, Parser } from \"yaml\";\nimport { AltimateCodeChatService } from \"../services/altimateCodeChatService\";\n\ninterface GitChange {\n  uri: Uri;\n}\n\ninterface GitRepoState {\n  workingTreeChanges: GitChange[];\n  indexChanges: GitChange[];\n  onDidChange: Event<void>;\n}\n\ninterface GitRepository {\n  state: GitRepoState;\n}\n\ninterface GitAPI {\n  repositories: GitRepository[];\n  onDidOpenRepository: Event<GitRepository>;\n}\n\nexport class SqlActionsCodeLensProvider\n  implements CodeLensProvider, Disposable\n{\n  private _onDidChangeCodeLenses = new EventEmitter<void>();\n  readonly onDidChangeCodeLenses: Event<void> =\n    this._onDidChangeCodeLenses.event;\n  private disposables: Disposable[] = [];\n  private changedFiles = new Set<string>();\n\n  constructor(private altimateCodeChatService: AltimateCodeChatService) {\n    this.initGitWatcher();\n    this.disposables.push(\n      window.onDidChangeActiveTextEditor((editor) => {\n        if (editor) {\n          const isChanged = this.changedFiles.has(editor.document.uri.fsPath);\n          commands.executeCommand(\n            \"setContext\",\n            \"dbtPowerUser.fileHasGitChanges\",\n            isChanged,\n          );\n        }\n      }),\n    );\n    this.disposables.push(\n      commands.registerCommand(\n        \"dbtPowerUser.reviewCodeWithAltimate\",\n        async (uri?: Uri) => {\n          const docUri = uri ?? window.activeTextEditor?.document.uri;\n          if (!docUri) {\n            return;\n          }\n          const filename = path.basename(docUri.fsPath);\n          const relativePath =\n            this.altimateCodeChatService.getRelativePath(docUri);\n          await this.altimateCodeChatService.openChat({\n            initialMessage: `Review \\`@${relativePath}\\` for dbt best practices, performance, and maintainability.`,\n            title: `Review: ${filename}`,\n          });\n        },\n      ),\n    );\n  }\n\n  private initGitWatcher() {\n    const gitExt = extensions.getExtension(\"vscode.git\");\n    if (!gitExt) {\n      return;\n    }\n    if (!gitExt.isActive) {\n      gitExt.activate().then(() => this.watchGitState());\n      return;\n    }\n    this.watchGitState();\n  }\n\n  private watchGitState() {\n    const git: GitAPI | undefined = extensions\n      .getExtension(\"vscode.git\")\n      ?.exports?.getAPI(1);\n    if (!git) {\n      return;\n    }\n\n    for (const repo of git.repositories) {\n      this.attachRepoWatcher(repo);\n    }\n\n    this.disposables.push(\n      git.onDidOpenRepository((repo: GitRepository) => {\n        this.attachRepoWatcher(repo);\n      }),\n    );\n  }\n\n  private attachRepoWatcher(repo: GitRepository) {\n    this.updateChangedFiles(repo);\n    this.disposables.push(\n      repo.state.onDidChange(() => {\n        this.updateChangedFiles(repo);\n        this._onDidChangeCodeLenses.fire();\n        // Update context key for the active editor\n        const activeUri = window.activeTextEditor?.document.uri;\n        if (activeUri) {\n          commands.executeCommand(\n            \"setContext\",\n            \"dbtPowerUser.fileHasGitChanges\",\n            this.changedFiles.has(activeUri.fsPath),\n          );\n        }\n      }),\n    );\n  }\n\n  private updateChangedFiles(repo: GitRepository) {\n    const allChanges = [\n      ...repo.state.workingTreeChanges,\n      ...repo.state.indexChanges,\n    ];\n    for (const change of allChanges) {\n      this.changedFiles.add(change.uri.fsPath);\n    }\n    const currentPaths = new Set(allChanges.map((c) => c.uri.fsPath));\n    for (const p of this.changedFiles) {\n      if (!currentPaths.has(p)) {\n        this.changedFiles.delete(p);\n      }\n    }\n  }\n\n  provideCodeLenses(\n    document: TextDocument,\n    _token: CancellationToken,\n  ): ProviderResult<CodeLens[]> {\n    if (document.fileName.endsWith(\".sql\")) {\n      return this.provideSqlCodeLenses(document);\n    }\n    return this.provideYamlCodeLenses(document);\n  }\n\n  private provideSqlCodeLenses(document: TextDocument): CodeLens[] {\n    const codeLenses: CodeLens[] = [\n      new CodeLens(new Range(0, 0, 0, 0), {\n        title: \"$(play) Execute Query\",\n        tooltip: \"Execute this SQL query\",\n        command: \"dbtPowerUser.executeSQL\",\n        arguments: [],\n      }),\n      new CodeLens(new Range(0, 0, 0, 0), {\n        title: \"$(sparkle) Explain\",\n        tooltip: \"Explain this code with Altimate\",\n        command: \"dbtPowerUser.explainWithAltimate\",\n        arguments: [],\n      }),\n      new CodeLens(new Range(0, 0, 0, 0), {\n        title: \"$(zap) Optimize\",\n        tooltip: \"Optimize this SQL with Altimate\",\n        command: \"dbtPowerUser.optimizeWithAltimate\",\n        arguments: [],\n      }),\n      new CodeLens(new Range(0, 0, 0, 0), {\n        title: \"$(book) Document\",\n        tooltip: \"Add documentation or tests for this model\",\n        command: \"dbtPowerUser.DocsEdit.focus\",\n        arguments: [],\n      }),\n    ];\n\n    if (this.changedFiles.has(document.uri.fsPath)) {\n      codeLenses.push(\n        new CodeLens(new Range(0, 0, 0, 0), {\n          title: \"$(sparkle) Review\",\n          tooltip: \"Review code changes with Altimate\",\n          command: \"dbtPowerUser.reviewCodeWithAltimate\",\n          arguments: [document.uri],\n        }),\n      );\n    }\n\n    return codeLenses;\n  }\n\n  private provideYamlCodeLenses(document: TextDocument): CodeLens[] {\n    const codeLenses: CodeLens[] = [];\n    const lineCounter = new LineCounter();\n    for (const token of new Parser(lineCounter.addNewLine).parse(\n      document.getText(),\n    )) {\n      if (!(token.type === \"document\" && CST.isCollection(token.value))) {\n        continue;\n      }\n      for (const item of token.value.items) {\n        if (\n          !(\n            CST.isScalar(item.key) &&\n            item.key.source === \"models\" &&\n            CST.isCollection(item.value)\n          )\n        ) {\n          continue;\n        }\n        for (const modelItem of item.value.items) {\n          if (!CST.isCollection(modelItem.value)) {\n            continue;\n          }\n          for (const properties of modelItem.value.items) {\n            if (\n              CST.isScalar(properties.key) &&\n              CST.isScalar(properties.value) &&\n              properties.key.source === \"name\"\n            ) {\n              const position = lineCounter.linePos(properties.key.offset);\n              const lensRange = new Range(\n                position.line - 1,\n                position.col,\n                position.line - 1,\n                position.col,\n              );\n              codeLenses.push(\n                new CodeLens(lensRange, {\n                  title: \"$(play) Run\",\n                  tooltip: `Run model ${properties.value.source}`,\n                  command: \"dbtPowerUser.yamlRunModel\",\n                  arguments: [document.uri, properties.value.source],\n                }),\n                new CodeLens(lensRange, {\n                  title: \"$(beaker) Test\",\n                  tooltip: `Run tests for model ${properties.value.source}`,\n                  command: \"dbtPowerUser.yamlTestModel\",\n                  arguments: [document.uri, properties.value.source],\n                }),\n                new CodeLens(lensRange, {\n                  title: \"$(book) Document\",\n                  tooltip: \"Add documentation or tests for this model\",\n                  command: \"dbtPowerUser.showDocumentation\",\n                  arguments: [properties.value.source],\n                }),\n              );\n            }\n          }\n        }\n      }\n    }\n\n    if (this.changedFiles.has(document.uri.fsPath)) {\n      codeLenses.unshift(\n        new CodeLens(new Range(0, 0, 0, 0), {\n          title: \"$(sparkle) Review\",\n          tooltip: \"Review code changes with Altimate\",\n          command: \"dbtPowerUser.reviewCodeWithAltimate\",\n          arguments: [document.uri],\n        }),\n      );\n    }\n\n    return codeLenses;\n  }\n\n  dispose() {\n    this._onDidChangeCodeLenses.dispose();\n    while (this.disposables.length) {\n      this.disposables.pop()?.dispose();\n    }\n  }\n}\n"
  },
  {
    "path": "src/code_lens_provider/virtualSqlCodeLensProvider.ts",
    "content": "import { NotebookService } from \"@lib\";\nimport {\n  CancellationToken,\n  CodeLens,\n  CodeLensProvider,\n  Command,\n  Disposable,\n  Range,\n  TextDocument,\n  window,\n} from \"vscode\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { QueryManifestService } from \"../services/queryManifestService\";\n\nexport class VirtualSqlCodeLensProvider\n  implements CodeLensProvider, Disposable\n{\n  private disposables: Disposable[] = [];\n\n  constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    private queryManifestService: QueryManifestService,\n    private notebookService: NotebookService,\n  ) {}\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n\n  private getProjectName() {\n    const project = this.dbtProjectContainer.getFromWorkspaceState(\n      \"dbtPowerUser.projectSelected\",\n    );\n    if (project?.label) {\n      return project.label;\n    }\n\n    // Find the project name from the current active editor\n    return this.queryManifestService.getProject()?.getProjectName();\n  }\n\n  public provideCodeLenses(\n    document: TextDocument,\n    token: CancellationToken,\n  ): CodeLens[] | Thenable<CodeLens[]> {\n    // Enable this code lens only for adhoc query files created using command: dbtPowerUser.createSqlFile\n    if (\n      (document.uri.scheme !== \"untitled\" &&\n        document.uri.scheme !== \"vscode-notebook-cell\") ||\n      document.languageId !== \"jinja-sql\"\n    ) {\n      return [];\n    }\n\n    const topOfDocument = new Range(0, 0, 0, 0);\n    const projectName = this.getProjectName();\n    const projectSelectorCommand: Command = {\n      title: `Project: ${projectName || \"Select a project\"}`,\n      command: \"dbtPowerUser.pickProject\",\n      arguments: [document.uri],\n    };\n\n    const projectSelectorCodeLens = new CodeLens(\n      topOfDocument,\n      projectSelectorCommand,\n    );\n\n    // Cell id code lens for notebook cells\n    if (\n      document.uri.scheme === \"vscode-notebook-cell\" &&\n      window.activeNotebookEditor?.notebook\n    ) {\n      const cells = this.notebookService\n        .getCellByNotebookAutocompleteMap()\n        .get(window.activeNotebookEditor?.notebook.uri.fsPath);\n      const cell = cells?.find((c) => c.fragment === document.uri.fragment);\n      if (cell) {\n        const cellIdLens = new CodeLens(topOfDocument, {\n          title: `Cell id: cell_${cell.cellId}`,\n          command: \"\", // TODO: Add command to allow user to modify cell id\n          arguments: [document.uri],\n        });\n\n        return [cellIdLens];\n      }\n      return [];\n    }\n\n    return [projectSelectorCodeLens];\n  }\n}\n"
  },
  {
    "path": "src/commands/altimateScan.ts",
    "content": "import { DBTTerminal } from \"@altimateai/dbt-integration\";\nimport { inject } from \"inversify\";\nimport { commands, ProgressLocation, Uri, window } from \"vscode\";\nimport { AltimateRequest } from \"../altimate\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport {\n  ManifestCacheChangedEvent,\n  ManifestCacheProjectAddedEvent,\n} from \"../dbt_client/event/manifestCacheChangedEvent\";\nimport { TelemetryService } from \"../telemetry\";\nimport { InitCatalog } from \"./tests/initCatalog\";\nimport { MissingSchemaTest } from \"./tests/missingSchemaTest\";\nimport { ScanContext } from \"./tests/scanContext\";\nimport { StaleModelColumnTest } from \"./tests/staleModelColumnTest\";\nimport { AltimateScanStep } from \"./tests/step\";\nimport { UndocumentedModelColumnTest } from \"./tests/undocumentedModelColumnTest\";\nimport { UnmaterializedModelTest } from \"./tests/unmaterializedModelTest\";\n\nexport class AltimateScan {\n  private eventMap: Map<string, ManifestCacheProjectAddedEvent> = new Map();\n  private offlineAltimateScanSteps: AltimateScanStep[];\n  private onlineAltimateScanSteps: AltimateScanStep[];\n  private altimateScanSteps: AltimateScanStep[];\n\n  constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    private telemetry: TelemetryService,\n    private altimate: AltimateRequest,\n    private missingSchemaTest: MissingSchemaTest,\n    private undocumentedModelColumnTest: UndocumentedModelColumnTest,\n    private unmaterializedModelTest: UnmaterializedModelTest,\n    private staleModelColumnTest: StaleModelColumnTest,\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n  ) {\n    dbtProjectContainer.onManifestChanged((event) =>\n      this.onManifestCacheChanged(event),\n    );\n\n    this.offlineAltimateScanSteps = [missingSchemaTest];\n\n    // online tests rely on a connection to database\n    this.onlineAltimateScanSteps = [\n      unmaterializedModelTest,\n      undocumentedModelColumnTest,\n      staleModelColumnTest,\n      // feel free to add more tests\n    ];\n\n    //TODO\n    // altimate tests rely on an altimate account. these are assumed to be online as well.\n    this.altimateScanSteps = [];\n  }\n\n  private async onManifestCacheChanged(event: ManifestCacheChangedEvent) {\n    event.added?.forEach((added) => {\n      this.eventMap.set(added.project.projectRoot.fsPath, added);\n    });\n    event.removed?.forEach((removed) => {\n      this.eventMap.delete(removed.projectRoot.fsPath);\n    });\n  }\n\n  async clearProblems() {\n    this.telemetry.sendTelemetryEvent(\"altimateScan:Clear\");\n    window.withProgress(\n      {\n        location: ProgressLocation.Notification,\n        title: \"Clearing problems...\",\n        cancellable: false,\n      },\n      async () => {\n        const projects = this.dbtProjectContainer.getProjects();\n        for (const project of projects) {\n          project.projectHealth.clear();\n        }\n      },\n    );\n  }\n\n  async getProblems() {\n    this.telemetry.sendTelemetryEvent(\"altimateScan:Start\");\n    let totalProblems: number = 0;\n    window.withProgress(\n      {\n        location: ProgressLocation.Notification,\n        title: \"Scanning for problems...\",\n        cancellable: true,\n      },\n      async () => {\n        const projects = this.dbtProjectContainer.getProjects();\n        for (const project of projects) {\n          try {\n            const scanContext: ScanContext = new ScanContext(\n              project,\n              this.eventMap.get(project.projectRoot.fsPath),\n            );\n            await this.runSteps(scanContext);\n            totalProblems += this.showDiagnostics(scanContext);\n          } catch (err) {\n            this.dbtTerminal.debug(\n              \"altimateScane:getProblems\",\n              `Error occurred for ${project.getProjectName()}`,\n              err,\n            );\n          }\n        }\n        // we can select problem tab as soon as the first project is done maybe\n        await commands.executeCommand(\"workbench.actions.view.problems\");\n        this.telemetry.sendTelemetryEvent(\"altimateScan:Done\", {\n          problemsFound: totalProblems.toString(),\n        });\n      },\n    );\n  }\n\n  async runSteps(scanContext: ScanContext) {\n    // run all the offline steps first, no need to get the catalog yet\n    await Promise.all(\n      this.offlineAltimateScanSteps.map(\n        async (stepof) => await stepof.run(scanContext),\n      ),\n    );\n\n    // get catalog before continuing to online steps\n    // errors are caught on python side and returned as a catalog with 0 length\n    // telemetry is sent from dbtproject.ts if there is an error\n    await this.initCatalog(scanContext);\n    // if there was some error in getting the catalog, we dont get anything back.\n    // stop the remaining tests in that case.\n    if (\n      scanContext.scanResults[\"missingCatalog\"] !== undefined &&\n      scanContext.scanResults[\"missingCatalog\"][\n        scanContext.project.getProjectName() + scanContext.project.projectRoot\n      ] === true\n    ) {\n      return;\n    }\n    await Promise.all(\n      this.onlineAltimateScanSteps.map(\n        async (stepon) => await stepon.run(scanContext),\n      ),\n    );\n  }\n\n  public async initCatalog(scanContext: ScanContext): Promise<void> {\n    if (scanContext === undefined) {\n      throw new Error(\"Scan Context has not been set\");\n    }\n\n    const projectCatalog = await new InitCatalog().run(scanContext);\n    scanContext.catalog[\n      scanContext.project.getProjectName() + scanContext.project.projectRoot\n    ] = projectCatalog;\n  }\n\n  showDiagnostics(scanContext: ScanContext) {\n    if (scanContext === undefined) {\n      throw new Error(\"Scan Context has not been set\");\n    }\n    scanContext.project.projectHealth.clear();\n    let totalProblems = 0;\n    for (const [filePath, fileDiagnostics] of Object.entries(\n      scanContext.diagnostics,\n    )) {\n      scanContext.project.projectHealth.set(\n        Uri.file(filePath),\n        fileDiagnostics,\n      );\n      totalProblems += fileDiagnostics.length;\n    }\n    return totalProblems;\n  }\n}\n"
  },
  {
    "path": "src/commands/bigQueryCostEstimate.ts",
    "content": "import { DBTTerminal } from \"@altimateai/dbt-integration\";\nimport { inject } from \"inversify\";\nimport { PythonException } from \"python-bridge\";\nimport { window } from \"vscode\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { TelemetryService } from \"../telemetry\";\nimport { extendErrorWithSupportLinks } from \"../utils\";\nimport path = require(\"path\");\n\nexport class BigQueryCostEstimate {\n  constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n    private telemetry: TelemetryService,\n  ) {}\n\n  async estimateCost({ returnResult }: { returnResult?: boolean }) {\n    const modelName = path.basename(\n      window.activeTextEditor!.document.fileName,\n      \".sql\",\n    );\n    if (!returnResult) {\n      await this.dbtTerminal.show(true);\n    }\n    try {\n      const query = window.activeTextEditor?.document.getText();\n      if (!query) {\n        window.showErrorMessage(\n          \"We need a valid query to get a cost estimate.\",\n        );\n        return;\n      }\n      const compiledQuery = await this.getProject()?.unsafeCompileQuery(\n        query,\n        modelName,\n      );\n      if (!compiledQuery) {\n        window.showErrorMessage(\n          \"We need a valid query to get a cost estimate.\",\n        );\n        return;\n      }\n      const result = await this.getProject()?.validateSQLDryRun(compiledQuery);\n      if (!result) {\n        return;\n      }\n      this.dbtTerminal.log(\n        `The query for ${modelName} will process ${result.bytes_processed}.\\r\\n`,\n      );\n      if (returnResult) {\n        return { modelName, result };\n      }\n    } catch (error) {\n      if (error instanceof PythonException) {\n        window.showErrorMessage(\n          extendErrorWithSupportLinks(\n            `An error occured while trying to compile your node: ${modelName}` +\n              error.exception.message +\n              \".\",\n          ),\n        );\n        this.telemetry.sendTelemetryError(\n          \"bigqueryCostEstimatePythonError\",\n          error,\n        );\n        return;\n      }\n      window.showErrorMessage(\n        \"Could not perform bigquery cost estimate: \" + (error as Error).message,\n      );\n    }\n  }\n\n  private getProject() {\n    const currentFilePath = window.activeTextEditor?.document.uri;\n    if (!currentFilePath) {\n      return;\n    }\n    return this.dbtProjectContainer.findDBTProject(currentFilePath);\n  }\n}\n"
  },
  {
    "path": "src/commands/index.ts",
    "content": "import { DBTTerminal, RunModelType } from \"@altimateai/dbt-integration\";\nimport { DatapilotNotebookController, OpenNotebookRequest } from \"@lib\";\nimport { existsSync, readFileSync } from \"fs\";\nimport { inject } from \"inversify\";\nimport {\n  CancellationTokenSource,\n  CodeLens,\n  commands,\n  CommentReply,\n  CommentThread,\n  DecorationRangeBehavior,\n  Disposable,\n  env,\n  extensions,\n  languages,\n  ProgressLocation,\n  Range,\n  TextEditor,\n  TextEditorDecorationType,\n  Uri,\n  version,\n  ViewColumn,\n  window,\n  workspace,\n} from \"vscode\";\nimport { AltimateRequest } from \"../altimate\";\nimport {\n  CteCodeLensProvider,\n  CteInfo,\n} from \"../code_lens_provider/cteCodeLensProvider\";\nimport {\n  ConversationCommentThread,\n  ConversationProvider,\n} from \"../comment_provider/conversationProvider\";\nimport { SqlPreviewContentProvider } from \"../content_provider/sqlPreviewContentProvider\";\nimport { CteProfilerDecorationProvider } from \"../cte_profiler/cteProfilerDecorationProvider\";\nimport { CteProfilerService } from \"../cte_profiler/cteProfilerService\";\nimport { DBTClient } from \"../dbt_client\";\nimport { DBTProject } from \"../dbt_client/dbtProject\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { PythonEnvironment } from \"../dbt_client/pythonEnvironment\";\nimport { NotebookQuickPick } from \"../quickpick/notebookQuickPick\";\nimport { ProjectQuickPickItem } from \"../quickpick/projectQuickPick\";\nimport { AltimateCodeChatService } from \"../services/altimateCodeChatService\";\nimport { DiagnosticsOutputChannel } from \"../services/diagnosticsOutputChannel\";\nimport { QueryManifestService } from \"../services/queryManifestService\";\nimport { RunHistoryService } from \"../services/runHistoryService\";\nimport { SharedStateService } from \"../services/sharedStateService\";\nimport { TelemetryService } from \"../telemetry\";\nimport { TelemetryEvents } from \"../telemetry/events\";\nimport { RunTreeItem } from \"../treeview_provider/runHistoryTreeItems\";\nimport {\n  deepEqual,\n  extendErrorWithSupportLinks,\n  getFirstWorkspacePath,\n  getFormattedDateTime,\n} from \"../utils\";\nimport { SQLLineagePanel } from \"../webview_provider/sqlLineagePanel\";\nimport { AltimateScan } from \"./altimateScan\";\nimport { BigQueryCostEstimate } from \"./bigQueryCostEstimate\";\nimport { RunModel } from \"./runModel\";\nimport { RunTest } from \"./runTest\";\nimport { SqlToModel } from \"./sqlToModel\";\nimport { ValidateSql } from \"./validateSql\";\nimport { WalkthroughCommands } from \"./walkthroughCommands\";\n\nexport class VSCodeCommands implements Disposable {\n  private disposables: Disposable[] = [];\n\n  constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    private runModel: RunModel,\n    private runTest: RunTest,\n    private sqlToModel: SqlToModel,\n    private validateSql: ValidateSql,\n    private altimateScan: AltimateScan,\n    private walkthroughCommands: WalkthroughCommands,\n    private bigQueryCostEstimate: BigQueryCostEstimate,\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n    private diagnosticsOutputChannel: DiagnosticsOutputChannel,\n    private eventEmitterService: SharedStateService,\n    private conversationController: ConversationProvider,\n    @inject(PythonEnvironment)\n    private pythonEnvironment: PythonEnvironment,\n    private dbtClient: DBTClient,\n    private sqlLineagePanel: SQLLineagePanel,\n    private queryManifestService: QueryManifestService,\n    private altimate: AltimateRequest,\n    private notebookController: DatapilotNotebookController,\n    private runHistoryService: RunHistoryService,\n    private altimateCodeChatService: AltimateCodeChatService,\n    private cteProfilerService: CteProfilerService,\n    private cteProfilerDecorationProvider: CteProfilerDecorationProvider,\n    private cteCodeLensProvider: CteCodeLensProvider,\n    private telemetry: TelemetryService,\n  ) {\n    this.disposables.push(\n      this.cteProfilerService,\n      this.cteProfilerDecorationProvider,\n      commands.registerCommand(\n        \"dbtPowerUser.checkIfDbtIsInstalled\",\n        async () => {\n          await this.dbtProjectContainer.detectDBT();\n          this.dbtProjectContainer.initialize();\n        },\n      ),\n      commands.registerCommand(\"dbtPowerUser.installDbt\", () =>\n        this.walkthroughCommands.installDbt(),\n      ),\n      commands.registerCommand(\"dbtPowerUser.runCurrentModel\", () => {\n        // `dbt run` on a singular test file is never meaningful; route it\n        // to `dbt test --select <test>` instead. See #1720.\n        if (this.runTest.runSingularTestOnActiveWindowIfApplicable()) {\n          return;\n        }\n        this.runModel.runModelOnActiveWindow();\n      }),\n      commands.registerCommand(\n        \"dbtPowerUser.rerunFromHistory\",\n        (item: RunTreeItem) => {\n          this.dbtProjectContainer.rerunFromHistory(item.entry);\n        },\n      ),\n      commands.registerCommand(\"dbtPowerUser.clearRunHistory\", async () => {\n        const confirm = await window.showWarningMessage(\n          \"Clear all run history entries?\",\n          { modal: true },\n          \"Clear\",\n        );\n        if (confirm === \"Clear\") {\n          this.runHistoryService.clear();\n        }\n      }),\n      commands.registerCommand(\n        \"dbtPowerUser.profileCtes\",\n        async (uri?: Uri, ctes?: CteInfo[]) => {\n          // When called from command palette, args are undefined — use active editor\n          const source = uri ? \"codeLens\" : \"commandPalette\";\n          const activeEditor = window.activeTextEditor;\n          const docUri = uri ?? activeEditor?.document.uri;\n          if (!docUri) {\n            window.showErrorMessage(\"No active SQL file to profile.\");\n            return;\n          }\n\n          let document = workspace.textDocuments.find(\n            (doc) => doc.uri.toString() === docUri.toString(),\n          );\n          if (!document) {\n            try {\n              document = await workspace.openTextDocument(docUri);\n            } catch (error) {\n              this.dbtTerminal.error(\n                \"CteProfiler\",\n                \"Failed to open document\",\n                error,\n              );\n              window.showErrorMessage(\"Document not found\");\n              return;\n            }\n          }\n\n          // If ctes not provided (command palette), re-detect from CodeLens provider\n          if (!ctes) {\n            const cts = new CancellationTokenSource();\n            // `provideCodeLenses` returns `CodeLens[] | Thenable<CodeLens[]>`;\n            // `await` handles all three (sync array, Promise, custom Thenable).\n            const resolved = await this.cteCodeLensProvider.provideCodeLenses(\n              document,\n              cts.token,\n            );\n            cts.dispose();\n            // Extract CteInfo from CodeLens arguments (index 1 is the ctes array)\n            const profileLens = resolved.find(\n              (cl: CodeLens) =>\n                cl.command?.command === \"dbtPowerUser.profileCtes\",\n            );\n            ctes = profileLens?.command?.arguments?.[1] as\n              | CteInfo[]\n              | undefined;\n\n            if (!ctes || ctes.length === 0) {\n              window.showInformationMessage(\n                \"No CTEs found in this file to profile.\",\n              );\n              return;\n            }\n          }\n\n          const telemetryEvent = TelemetryEvents[\"CteProfiler/Profile\"];\n          const totalCtes = ctes.length;\n          this.telemetry.startTelemetryEvent(\n            telemetryEvent,\n            { source },\n            { cteCount: totalCtes },\n          );\n\n          await window.withProgress(\n            {\n              location: ProgressLocation.Notification,\n              title: `Profiling ${totalCtes} CTE${totalCtes === 1 ? \"\" : \"s\"}`,\n              cancellable: true,\n            },\n            async (progress, token) => {\n              // Forward notification cancel to the service's own token.\n              token.onCancellationRequested(() => {\n                this.telemetry.sendTelemetryEvent(\n                  TelemetryEvents[\"CteProfiler/Cancel\"],\n                  { source: \"progressNotification\" },\n                );\n                this.cteProfilerService.cancel();\n              });\n\n              // Report per-CTE increments as the service fires result updates.\n              let lastCount = 0;\n              const progressSub = this.cteProfilerService.onResultChanged(\n                (result) => {\n                  if (!result || result.uri !== docUri.toString()) {\n                    return;\n                  }\n                  const done = result.ctes.length;\n                  if (done <= lastCount) {\n                    return;\n                  }\n                  const delta = done - lastCount;\n                  lastCount = done;\n                  progress.report({\n                    increment: (delta / totalCtes) * 100,\n                    message: `${done}/${totalCtes} — ${result.ctes[done - 1]?.name ?? \"\"}`,\n                  });\n                },\n              );\n\n              try {\n                await this.cteProfilerService.profileModel(\n                  docUri,\n                  document!,\n                  ctes!,\n                );\n                const result = this.cteProfilerService.getResult(\n                  docUri.toString(),\n                );\n                this.telemetry.endTelemetryEvent(\n                  telemetryEvent,\n                  undefined,\n                  { source, status: result?.status ?? \"unknown\" },\n                  {\n                    cteCount: totalCtes,\n                    totalTimeMs: result?.totalTimeMs ?? 0,\n                    profiledCount: result?.ctes.length ?? 0,\n                  },\n                );\n              } catch (error) {\n                this.telemetry.endTelemetryEvent(\n                  telemetryEvent,\n                  error,\n                  { source },\n                  { cteCount: totalCtes },\n                );\n              } finally {\n                progressSub.dispose();\n              }\n            },\n          );\n        },\n      ),\n      commands.registerCommand(\"dbtPowerUser.cancelCteProfiling\", () => {\n        this.telemetry.sendTelemetryEvent(\n          TelemetryEvents[\"CteProfiler/Cancel\"],\n          { source: \"commandPalette\" },\n        );\n        this.cteProfilerService.cancel();\n      }),\n      commands.registerCommand(\"dbtPowerUser.clearProfileResults\", () =>\n        this.cteProfilerService.clearResults(),\n      ),\n      commands.registerCommand(\"dbtPowerUser.toggleProfileDecorations\", () =>\n        this.cteProfilerDecorationProvider.toggle(),\n      ),\n      commands.registerCommand(\"dbtPowerUser.testCurrentModel\", () => {\n        // Singular data tests must be selected by their own test name, not\n        // the surrounding model. See #1720.\n        if (this.runTest.runSingularTestOnActiveWindowIfApplicable()) {\n          return;\n        }\n        this.runModel.runTestsOnActiveWindow();\n      }),\n      commands.registerCommand(\"dbtPowerUser.compileCurrentModel\", () =>\n        this.runModel.compileModelOnActiveWindow(),\n      ),\n      commands.registerCommand(\n        \"dbtPowerUser.bigqueryCostEstimate\",\n        ({ returnResult }: { returnResult?: boolean }) =>\n          this.bigQueryCostEstimate.estimateCost({ returnResult }),\n      ),\n      commands.registerTextEditorCommand(\n        \"dbtPowerUser.sqlPreview\",\n        async (editor: TextEditor) => {\n          const uri = editor.document.uri.with({\n            scheme: SqlPreviewContentProvider.SCHEME,\n          });\n          const doc = await workspace.openTextDocument(uri);\n          const isOpen = window.visibleTextEditors.some(\n            (e) => e.document.uri === uri,\n          );\n          await window.showTextDocument(doc, ViewColumn.Beside, false);\n          await languages.setTextDocumentLanguage(doc, \"sql\");\n          if (!isOpen) {\n            await commands.executeCommand(\"workbench.action.lockEditorGroup\");\n            await commands.executeCommand(\n              \"workbench.action.focusPreviousGroup\",\n            );\n          } else {\n            await commands.executeCommand(\"workbench.action.closeActiveEditor\");\n            return;\n          }\n        },\n      ),\n      commands.registerCommand(\n        \"dbtPowerUser.goToDocumentationEditor\",\n        async () => {\n          await commands.executeCommand(\n            \"workbench.view.extension.docs_edit_view\",\n          );\n        },\n      ),\n      commands.registerCommand(\"dbtPowerUser.runTest\", (model) => {\n        // Tree-item invocation (from the test treeview): run the selected\n        // test node — never a singular test, always a generic test.\n        if (model !== undefined) {\n          this.runModel.runModelOnNodeTreeItem(RunModelType.TEST)(model);\n          return;\n        }\n        // Command-palette invocation (no tree item): route singular test\n        // files to `dbt test --select <test>`; otherwise fall back to\n        // running the generic tests attached to the active model. See #1720.\n        if (this.runTest.runSingularTestOnActiveWindowIfApplicable()) {\n          return;\n        }\n        this.runModel.runModelOnNodeTreeItem(RunModelType.TEST)(model);\n      }),\n      commands.registerCommand(\"dbtPowerUser.runChildrenModels\", (model) =>\n        this.runModel.runModelOnNodeTreeItem(RunModelType.RUN_CHILDREN)(model),\n      ),\n      commands.registerCommand(\n        \"dbtPowerUser.yamlRunModel\",\n        (uri: Uri, modelName: string) => {\n          this.dbtProjectContainer.runModelByName(uri, modelName);\n        },\n      ),\n      commands.registerCommand(\n        \"dbtPowerUser.yamlTestModel\",\n        (uri: Uri, modelName: string) => {\n          this.dbtProjectContainer.runModelTest(uri, modelName);\n        },\n      ),\n      commands.registerCommand(\"dbtPowerUser.runParentModels\", (model) =>\n        this.runModel.runModelOnNodeTreeItem(RunModelType.RUN_PARENTS)(model),\n      ),\n      commands.registerCommand(\"dbtPowerUser.copyModelName\", (model) =>\n        env.clipboard.writeText(model.label.toString()),\n      ),\n      commands.registerCommand(\"dbtPowerUser.showRunSQL\", () =>\n        this.runModel.showRunSQLOnActiveWindow(),\n      ),\n      commands.registerCommand(\"dbtPowerUser.showCompiledSQL\", () =>\n        this.runModel.showCompiledSQLOnActiveWindow(),\n      ),\n      commands.registerCommand(\"dbtPowerUser.generateSchemaYML\", () =>\n        this.runModel.generateSchemaYMLOnActiveWindow(),\n      ),\n      commands.registerCommand(\"dbtPowerUser.generateDBTDocs\", () =>\n        this.runModel.generateDBTDocsOnActiveWindow(),\n      ),\n      commands.registerCommand(\"dbtPowerUser.executeSQL\", () =>\n        this.runModel.executeQueryOnActiveWindow(),\n      ),\n      commands.registerCommand(\n        \"dbtPowerUser.runSelectedQuery\",\n        (uri: Uri, range: Range) => this.runSelectedQuery(uri, range),\n      ),\n      commands.registerCommand(\n        \"dbtPowerUser.runCteWithDependencies\",\n        (uri: Uri, cteIndex: number, ctes: CteInfo[]) =>\n          this.runCteWithDependencies(uri, cteIndex, ctes),\n      ),\n      commands.registerCommand(\"dbtPowerUser.summarizeQuery\", () =>\n        this.eventEmitterService.fire({\n          command: \"dbtPowerUser.summarizeQuery\",\n          payload: {},\n        }),\n      ),\n      commands.registerCommand(\"dbtPowerUser.changeQuery\", () =>\n        this.eventEmitterService.fire({\n          command: \"dbtPowerUser.changeQuery\",\n          payload: {},\n        }),\n      ),\n      commands.registerCommand(\"dbtPowerUser.translateQuery\", () =>\n        this.eventEmitterService.fire({\n          command: \"dbtPowerUser.translateQuery\",\n          payload: {},\n        }),\n      ),\n      commands.registerCommand(\n        \"dbtPowerUser.createModelBasedonSourceConfig\",\n        (params) => {\n          this.runModel.createModelBasedonSourceConfig(params);\n        },\n      ),\n      commands.registerCommand(\"dbtPowerUser.buildCurrentModel\", () =>\n        this.runModel.buildModelOnActiveWindow(),\n      ),\n      commands.registerCommand(\"dbtPowerUser.buildCurrentProject\", () => {\n        if (!window.activeTextEditor) {\n          return;\n        }\n        const activeFileUri = window.activeTextEditor.document.uri;\n        if (!activeFileUri) {\n          this.dbtTerminal.debug(\n            \"buildCurrentProject\",\n            \"skipping buildCurrentProject without active file\",\n          );\n          return;\n        }\n\n        const dbtProject =\n          this.dbtProjectContainer.findDBTProject(activeFileUri);\n        if (!dbtProject) {\n          this.dbtTerminal.debug(\n            \"buildCurrentProject\",\n            `buildCurrentProject unable to find dbtproject by active file: ${activeFileUri.path}`,\n          );\n          return;\n        }\n        this.dbtTerminal.debug(\n          \"buildCurrentProject\",\n          `building current project: ${dbtProject.getProjectName()} with active file: ${\n            activeFileUri.path\n          }`,\n        );\n\n        dbtProject.buildProject();\n      }),\n      commands.registerCommand(\"dbtPowerUser.cleanCurrentProject\", () => {\n        if (!window.activeTextEditor) {\n          return;\n        }\n        const activeFileUri = window.activeTextEditor.document.uri;\n        if (!activeFileUri) {\n          this.dbtTerminal.debug(\n            \"cleanCurrentProject\",\n            \"skipping cleanCurrentProject without active file\",\n          );\n          return;\n        }\n\n        const dbtProject =\n          this.dbtProjectContainer.findDBTProject(activeFileUri);\n        if (!dbtProject) {\n          this.dbtTerminal.debug(\n            \"cleanCurrentProject\",\n            `cleanCurrentProject unable to find dbtproject by active file: ${activeFileUri.path}`,\n          );\n          return;\n        }\n        this.dbtTerminal.debug(\n          \"cleanCurrentProject\",\n          `cleaning current project: ${dbtProject.getProjectName()} with active file: ${\n            activeFileUri.path\n          }`,\n        );\n\n        dbtProject.clean();\n      }),\n      commands.registerCommand(\"dbtPowerUser.buildChildrenModels\", () =>\n        this.runModel.buildModelOnActiveWindow(RunModelType.BUILD_CHILDREN),\n      ),\n      commands.registerCommand(\"dbtPowerUser.buildParentModels\", () =>\n        this.runModel.buildModelOnActiveWindow(RunModelType.BUILD_PARENTS),\n      ),\n      commands.registerCommand(\"dbtPowerUser.buildChildrenParentModels\", () =>\n        this.runModel.buildModelOnActiveWindow(\n          RunModelType.BUILD_CHILDREN_PARENTS,\n        ),\n      ),\n      commands.registerCommand(\"dbtPowerUser.sqlToModel\", () =>\n        this.sqlToModel.getModelFromSql(),\n      ),\n      commands.registerCommand(\"dbtPowerUser.validateSql\", () =>\n        this.validateSql.validateSql(),\n      ),\n      commands.registerCommand(\"dbtPowerUser.altimateScan\", () =>\n        this.altimateScan.getProblems(),\n      ),\n      commands.registerCommand(\"dbtPowerUser.clearAltimateScanResults\", () =>\n        this.altimateScan.clearProblems(),\n      ),\n      commands.registerCommand(\"dbtPowerUser.validateProject\", () => {\n        const pickedProject: ProjectQuickPickItem | undefined =\n          this.dbtProjectContainer.getFromWorkspaceState(\n            \"dbtPowerUser.projectSelected\",\n          );\n\n        this.walkthroughCommands.validateProjects(pickedProject);\n      }),\n      commands.registerCommand(\"dbtPowerUser.installDeps\", () => {\n        this.dbtProjectContainer.setToGlobalState(\n          \"showSetupWalkthrough\",\n          false,\n        );\n\n        const pickedProject: ProjectQuickPickItem | undefined =\n          this.dbtProjectContainer.getFromWorkspaceState(\n            \"dbtPowerUser.projectSelected\",\n          );\n        this.walkthroughCommands.installDeps(pickedProject);\n      }),\n      commands.registerCommand(\n        \"dbtPowerUser.openSetupWalkthrough\",\n        async () => {\n          this.eventEmitterService.eventEmitter.fire({\n            command: \"onboarding:render\",\n            payload: { initialStep: \"prerequisites\" },\n          });\n        },\n      ),\n      commands.registerCommand(\n        \"dbtPowerUser.openTutorialWalkthrough\",\n        async () => {\n          this.eventEmitterService.eventEmitter.fire({\n            command: \"onboarding:render\",\n            payload: { initialStep: \"finish\" },\n          });\n        },\n      ),\n      commands.registerCommand(\"dbtPowerUser.associateFileExts\", async () => {\n        commands.executeCommand(\n          \"workbench.action.openSettings\",\n          \"@id:files.associations\",\n        );\n      }),\n      commands.registerCommand(\"dbtPowerUser.openDatapilotWithQuery\", () =>\n        this.eventEmitterService.fire({\n          command: \"dbtPowerUser.openDatapilotWithQuery\",\n          payload: {},\n        }),\n      ),\n      commands.registerCommand(\"dbtPowerUser.showHelpDatapilot\", () =>\n        this.eventEmitterService.fire({\n          command: \"dbtPowerUser.openHelpInDatapilot\",\n          payload: {},\n        }),\n      ),\n      commands.registerCommand(\n        \"dbtPowerUser.createConversation\",\n        (reply: CommentReply) => {\n          try {\n            this.conversationController.createConversation(reply);\n          } catch (err) {\n            window.showErrorMessage(\n              extendErrorWithSupportLinks((err as Error).message),\n            );\n          }\n        },\n      ),\n      commands.registerCommand(\n        \"dbtPowerUser.replyToConversation\",\n        (reply: CommentReply) => {\n          try {\n            this.conversationController.replyToConversation(reply);\n          } catch (err) {\n            window.showErrorMessage(\n              extendErrorWithSupportLinks((err as Error).message),\n            );\n          }\n        },\n      ),\n\n      commands.registerCommand(\n        \"dbtPowerUser.resolveConversation\",\n        (thread: CommentThread) => {\n          try {\n            this.conversationController.resolveConversation(\n              thread as ConversationCommentThread,\n            );\n          } catch (err) {\n            window.showErrorMessage(\n              extendErrorWithSupportLinks((err as Error).message),\n            );\n          }\n        },\n      ),\n      commands.registerCommand(\n        \"dbtPowerUser.copyDbtDocsLink\",\n        (thread: CommentThread) => {\n          try {\n            this.conversationController.copyThreadLink(\n              thread as ConversationCommentThread,\n            );\n          } catch (err) {\n            window.showErrorMessage(\n              extendErrorWithSupportLinks((err as Error).message),\n            );\n          }\n        },\n      ),\n      commands.registerCommand(\n        \"dbtPowerUser.viewInDocEditor\",\n        (thread: CommentThread) => {\n          try {\n            this.conversationController.viewInDocEditor(\n              thread as ConversationCommentThread,\n            );\n          } catch (err) {\n            window.showErrorMessage(\n              extendErrorWithSupportLinks((err as Error).message),\n            );\n          }\n        },\n      ),\n      commands.registerCommand(\n        \"dbtPowerUser.viewInDbtDocs\",\n        (thread: CommentThread) => {\n          try {\n            this.conversationController.viewInDbtDocs(\n              thread as ConversationCommentThread,\n            );\n          } catch (err) {\n            window.showErrorMessage(\n              extendErrorWithSupportLinks((err as Error).message),\n            );\n          }\n        },\n      ),\n      commands.registerCommand(\"dbtPowerUser.printEnvVars\", () => {\n        const activeFolder = window.activeTextEditor\n          ? workspace.getWorkspaceFolder(window.activeTextEditor.document.uri)\n          : undefined;\n        return this.pythonEnvironment.printEnvVars(activeFolder);\n      }),\n      commands.registerCommand(\n        \"dbtPowerUser.detectPythonFromTerminal\",\n        async () => {\n          // Check if there's a terminal open that we can detect from\n          if (\n            !window.activeTerminal &&\n            !window.terminals.some((t) => t.shellIntegration)\n          ) {\n            const action = await window.showWarningMessage(\n              \"No terminal is open. Please open a terminal with your dbt environment activated, then try again.\",\n              \"Open Terminal\",\n            );\n            if (action === \"Open Terminal\") {\n              await commands.executeCommand(\n                \"workbench.action.terminal.toggleTerminal\",\n              );\n            }\n            return;\n          }\n\n          const detectedPath =\n            await this.pythonEnvironment.detectPythonFromShell();\n          if (!detectedPath) {\n            window.showWarningMessage(\n              \"Could not find a Python interpreter with dbt installed in your terminal. \" +\n                \"Make sure dbt is installed and the correct environment is activated, then try again.\",\n            );\n            return;\n          }\n\n          const currentOverride = workspace\n            .getConfiguration(\"dbt\")\n            .get<string>(\"dbtPythonPathOverride\", \"\");\n          if (currentOverride === detectedPath) {\n            window.showInformationMessage(\n              `Python path is already set to: ${detectedPath}`,\n            );\n            return;\n          }\n\n          const action = await window.showInformationMessage(\n            `Found Python with dbt at: ${detectedPath}. Use this as the Python interpreter?`,\n            \"Yes\",\n            \"No\",\n          );\n          if (action === \"Yes\") {\n            await workspace\n              .getConfiguration(\"dbt\")\n              .update(\"dbtPythonPathOverride\", detectedPath);\n            window.showInformationMessage(\n              `Python path set to: ${detectedPath}. The extension will reload.`,\n            );\n            // Re-detect dbt with the new path\n            await this.dbtProjectContainer.detectDBT();\n            await this.dbtProjectContainer.initialize();\n          }\n        },\n      ),\n      commands.registerCommand(\"dbtPowerUser.diagnostics\", async () => {\n        try {\n          this.diagnosticsOutputChannel.show();\n          this.diagnosticsOutputChannel.logLine(\"Diagnostics started...\");\n          this.diagnosticsOutputChannel.logNewLine();\n\n          // Printing env vars per project\n          const dbtProjects = this.dbtProjectContainer.getProjects();\n          if (dbtProjects.length > 0) {\n            for (const project of dbtProjects) {\n              const projectFolder = workspace.getWorkspaceFolder(\n                project.projectRoot,\n              );\n              this.diagnosticsOutputChannel.logBlockWithHeader(\n                [\n                  `Printing environment variables for project: ${project.getProjectName()}`,\n                  `  (root: ${project.projectRoot.fsPath})`,\n                  \"* Please remove any sensitive information before sending it to us\",\n                ],\n                Object.entries(\n                  this.pythonEnvironment.getEnvironmentVariables(projectFolder),\n                ).map(([key, value]) => `${key}=${value}`),\n              );\n              this.diagnosticsOutputChannel.logNewLine();\n            }\n          } else {\n            const activeFolder = window.activeTextEditor\n              ? workspace.getWorkspaceFolder(\n                  window.activeTextEditor.document.uri,\n                )\n              : undefined;\n            this.diagnosticsOutputChannel.logBlockWithHeader(\n              [\n                \"Printing environment variables...\",\n                \"* Please remove any sensitive information before sending it to us\",\n              ],\n              Object.entries(\n                this.pythonEnvironment.getEnvironmentVariables(activeFolder),\n              ).map(([key, value]) => `${key}=${value}`),\n            );\n            this.diagnosticsOutputChannel.logNewLine();\n          }\n\n          // Printing python paths\n          this.diagnosticsOutputChannel.logBlockWithHeader(\n            [\n              \"Printing all python paths...\",\n              \"* Please remove any sensitive information before sending it to us\",\n            ],\n            this.pythonEnvironment.allPythonPaths.map(({ path }) => path),\n          );\n          this.diagnosticsOutputChannel.logNewLine();\n\n          // Printing extension settings\n          const dbtSettings = workspace.getConfiguration().inspect(\"dbt\");\n          const globalValue: any = dbtSettings?.globalValue || {};\n          const defaultValue: any = dbtSettings?.defaultValue || {};\n          const workspaceValue: any = dbtSettings?.workspaceValue || {};\n          const settingKeys = [\n            ...Object.keys(globalValue),\n            ...Object.keys(defaultValue),\n            ...Object.keys(workspaceValue),\n          ];\n          this.diagnosticsOutputChannel.logBlockWithHeader(\n            [\n              \"Printing extension settings...\",\n              \"* Please remove any sensitive information before sending it to us\",\n            ],\n            settingKeys.map((key) => {\n              const value = workspace.getConfiguration(\"dbt\").get(key);\n              let overridenText = \"\";\n              if (!deepEqual(value, defaultValue[key])) {\n                if (deepEqual(value, workspaceValue[key])) {\n                  overridenText = `${key} is overridden in workspace settings`;\n                } else if (deepEqual(value, globalValue[key])) {\n                  overridenText = `${key} is overridden in user settings`;\n                }\n              }\n\n              const valueText =\n                Array.isArray(value) || typeof value === \"object\"\n                  ? JSON.stringify(value)\n                  : value;\n              return `${key}=${valueText}\\t\\t${overridenText}`;\n            }),\n          );\n          this.diagnosticsOutputChannel.logNewLine();\n\n          // Printing extension and setup info\n          const dbtIntegrationMode = workspace\n            .getConfiguration(\"dbt\")\n            .get<string>(\"dbtIntegration\", \"core\");\n          const allowListFolders = workspace\n            .getConfiguration(\"dbt\")\n            .get<string[]>(\"allowListFolders\", []);\n          const apiConnectivity = await this.altimate.checkApiConnectivity();\n          this.diagnosticsOutputChannel.logBlock([\n            `Python Path=${this.pythonEnvironment.pythonPath}`,\n            `VSCode version=${version}`,\n            `Extension version=${\n              extensions.getExtension(\"innoverio.vscode-dbt-power-user\")\n                ?.packageJSON?.version\n            }`,\n            `DBT integration mode=${dbtIntegrationMode}`,\n            `First workspace path=${getFirstWorkspacePath()}`,\n            `Altimate API connectivity=${apiConnectivity.status}`,\n            apiConnectivity.errorMsg\n              ? `Altimate API connectivity error=${apiConnectivity.errorMsg}`\n              : \"\",\n            `AllowList Folders=${allowListFolders}`,\n          ]);\n          this.diagnosticsOutputChannel.logNewLine();\n\n          if (!this.dbtClient.pythonInstalled) {\n            this.diagnosticsOutputChannel.logLine(\"Python is not installed\");\n            this.diagnosticsOutputChannel.logLine(\n              \"Can't proceed further without fixing python installation\",\n            );\n            return;\n          }\n          this.diagnosticsOutputChannel.logLine(\"Python is installed\");\n          if (!this.dbtClient.dbtInstalled) {\n            this.diagnosticsOutputChannel.logLine(\"DBT is not installed\");\n            this.diagnosticsOutputChannel.logLine(\n              \"Can't proceed further without fixing dbt installation\",\n            );\n            return;\n          }\n          this.diagnosticsOutputChannel.logLine(\"DBT is installed\");\n          const dbtWorkspaces = this.dbtProjectContainer.dbtWorkspaceFolders;\n          this.diagnosticsOutputChannel.logLine(\n            `Number of workspaces=${dbtWorkspaces.length}`,\n          );\n          for (const w of dbtWorkspaces) {\n            this.diagnosticsOutputChannel.logHorizontalRule();\n            this.diagnosticsOutputChannel.logLine(\n              `Workspace Path=${w.workspaceFolder.uri.fsPath}`,\n            );\n            this.diagnosticsOutputChannel.logLine(\n              `Adapters=${w.getAdapters()}`,\n            );\n            this.diagnosticsOutputChannel.logLine(\n              `AllowList Folders=${w.getAllowListFolders()}`,\n            );\n            w.projectDiscoveryDiagnostics.forEach((uri, diagnostics) => {\n              this.diagnosticsOutputChannel.logLine(\n                `Problems for ${uri.fsPath}`,\n              );\n              diagnostics.forEach((d) => {\n                this.diagnosticsOutputChannel.logLine(\n                  `source=${d.source}\\tmessage=${d.message}`,\n                );\n              });\n            });\n            this.diagnosticsOutputChannel.logHorizontalRule();\n          }\n\n          const projects = this.dbtProjectContainer.getProjects();\n          this.diagnosticsOutputChannel.logLine(\n            `Number of projects=${projects.length}`,\n          );\n          if (projects.length === 0) {\n            this.diagnosticsOutputChannel.logLine(\"No project detected\");\n            this.diagnosticsOutputChannel.logLine(\n              \"Can't proceed further without project\",\n            );\n            return;\n          }\n          this.diagnosticsOutputChannel.logNewLine();\n\n          for (const project of projects) {\n            try {\n              this.diagnosticsOutputChannel.logHorizontalRule();\n              this.diagnosticsOutputChannel.logLine(\n                `Printing information for ${project.getProjectName()}`,\n              );\n              this.diagnosticsOutputChannel.logHorizontalRule();\n              await this.printProjectInfo(project);\n            } catch (e) {\n              this.diagnosticsOutputChannel.logNewLine();\n              this.diagnosticsOutputChannel.logLine(\n                \"Failed to print all the info for the project...\",\n              );\n              this.diagnosticsOutputChannel.logLine(`Error=${e}`);\n            } finally {\n              this.diagnosticsOutputChannel.logHorizontalRule();\n            }\n          }\n          this.diagnosticsOutputChannel.logNewLine();\n          this.diagnosticsOutputChannel.logLine(\n            \"Diagnostics completed successfully...\",\n          );\n        } catch (e) {\n          this.diagnosticsOutputChannel.logNewLine();\n          this.diagnosticsOutputChannel.logLine(\n            \"Diagnostics ended with error...\",\n          );\n          this.diagnosticsOutputChannel.logLine(`Error=${e}`);\n        }\n      }),\n      commands.registerCommand(\n        \"dbtPowerUser.createDatapilotNotebook\",\n        async (args: OpenNotebookRequest | undefined) => {\n          this.notebookController.createNotebook(args);\n        },\n      ),\n      commands.registerCommand(\n        \"dbtPowerUser.openTargetSelector\",\n        async (\n          targets,\n          project: DBTProject,\n          statusBar,\n          currentTarget?: string,\n        ) => {\n          try {\n            if (!targets) {\n              return;\n            }\n            this.dbtTerminal.debug(\n              \"OpenTargetSelector\",\n              \"Showing following targets\",\n              targets,\n            );\n            const sortedTargets = (targets as string[]).sort((a, b) => {\n              if (a === currentTarget) {\n                return -1;\n              }\n              if (b === currentTarget) {\n                return 1;\n              }\n              return 0;\n            });\n            const items = sortedTargets.map((t) => ({\n              label: t,\n              description: t === currentTarget ? \"(current)\" : \"\",\n            }));\n            const selected = await window.showQuickPick(items, {\n              title: \"Select your target\",\n              canPickMany: false,\n            });\n            const target = selected?.label;\n            if (target) {\n              await project.setSelectedTarget(target);\n              await statusBar.updateStatusBar();\n              this.dbtTerminal.info(\n                \"OpenTargetSelector\",\n                \"Selecting target\",\n                true,\n                target,\n              );\n            }\n          } catch (error) {\n            this.dbtTerminal.error(\n              \"OpenTargetSelector\",\n              \"An error occurred while changing target\",\n              error,\n            );\n            window.showErrorMessage(\n              \"An error occurred while changing target: \" + error,\n            );\n          }\n        },\n      ),\n      commands.registerCommand(\n        \"dbtPowerUser.createSqlFile\",\n        async (args: { code?: string; fileName?: string } | undefined) => {\n          const { code, fileName } = args || {};\n          try {\n            const project =\n              await this.queryManifestService.getOrPickProjectFromWorkspace();\n            if (!project) {\n              window.showErrorMessage(\"No dbt project selected.\");\n              return;\n            }\n\n            // Open a new untitled sql file by default\n            let docOpenPromise = workspace.openTextDocument({\n              language: \"jinja-sql\",\n            });\n            // If file name is provided, open the file in the project\n            if (fileName) {\n              const uri = Uri.parse(\n                `${project.projectRoot}/${fileName}-${getFormattedDateTime()}.sql`,\n              ).with({ scheme: \"untitled\" });\n              docOpenPromise = workspace.openTextDocument(uri);\n            }\n\n            const annotationDecoration: TextEditorDecorationType =\n              window.createTextEditorDecorationType({\n                rangeBehavior: DecorationRangeBehavior.OpenOpen,\n              });\n\n            const contentText =\n              \"Enter your query here and execute it just like any dbt model file. This file is unsaved, you can either save it to your project or save it as a bookmark for later usage or share it with your team members.\";\n\n            const decorations = [\n              {\n                renderOptions: {\n                  before: {\n                    color: \"#666666\",\n                    contentText,\n                    // hacking to add more css properties\n                    width: \"90%;display: block;white-space: pre-line;\",\n                  },\n                },\n                range: new Range(2, 0, 2, 0),\n              },\n            ];\n\n            docOpenPromise.then((doc) => {\n              // set this to sql language so we can bind codelens and other features\n              languages.setTextDocumentLanguage(doc, \"jinja-sql\");\n              window.showTextDocument(doc).then((editor) => {\n                editor.edit((editBuilder) => {\n                  const entireDocumentRange = new Range(\n                    doc.positionAt(0),\n                    doc.positionAt(doc.getText().length),\n                  );\n                  editBuilder.replace(entireDocumentRange, code || \"\\n\");\n\n                  editor.setDecorations(annotationDecoration, decorations);\n                  setTimeout(() => {\n                    commands.executeCommand(\"cursorMove\", {\n                      to: \"up\",\n                      by: \"line\",\n                      value: 1,\n                    });\n                  }, 0);\n                  const disposable = workspace.onDidChangeTextDocument((e) => {\n                    const activeEditor = window.activeTextEditor;\n                    if (activeEditor && e.document === editor.document) {\n                      if (activeEditor.document.getText().trim()) {\n                        activeEditor.setDecorations(annotationDecoration, []);\n                        disposable.dispose();\n                      }\n                    }\n                  });\n                });\n              });\n            });\n          } catch (e) {\n            const message = (e as Error).message;\n            this.dbtTerminal.error(\"createSqlFile\", message, e, true);\n            window.showErrorMessage(message);\n          }\n        },\n      ),\n      commands.registerCommand(\"dbtPowerUser.sqlLineage\", async () => {\n        window.withProgress(\n          {\n            title: \"Retrieving SQL visualization\",\n            location: ProgressLocation.Notification,\n            cancellable: false,\n          },\n          async (_, token) => {\n            try {\n              const modelName = this.sqlLineagePanel.getActiveEditorFilename();\n              const lineage = await this.sqlLineagePanel.getSQLLineage(token);\n              const panel = window.createWebviewPanel(\n                SQLLineagePanel.viewType,\n                `${modelName} - visualization`,\n                ViewColumn.Two,\n                { retainContextWhenHidden: true, enableScripts: true },\n              );\n              this.sqlLineagePanel.renderSqlVisualizer(panel, lineage);\n            } catch (e) {\n              const errorMessage = (e as Error)?.message;\n              this.dbtTerminal.error(\"sqlLineage\", errorMessage, e, true);\n              window.showErrorMessage(errorMessage);\n            }\n          },\n        );\n      }),\n      commands.registerCommand(\n        \"dbtPowerUser.showDocumentation\",\n        async (modelName) => {\n          const result = queryManifestService.getEventByCurrentProject();\n          if (!result) {\n            return;\n          }\n          const { event } = result;\n          if (!event) {\n            return;\n          }\n          const { nodeMetaMap } = event;\n          const model = nodeMetaMap.lookupByBaseName(modelName);\n          if (!model?.path) {\n            return;\n          }\n          const doc = await workspace.openTextDocument(Uri.file(model.path));\n          await window.showTextDocument(doc);\n          await commands.executeCommand(\"dbtPowerUser.DocsEdit.focus\");\n        },\n      ),\n      commands.registerCommand(\n        \"dbtPowerUser.showDatapilotNotebooksQuickPick\",\n        async () => {\n          const notebookQuickPick = new NotebookQuickPick();\n          await notebookQuickPick.showNotebookPicker();\n        },\n      ),\n      commands.registerCommand(\n        \"dbtPowerUser.showNotebookProfileQuery\",\n        async () => {\n          await commands.executeCommand(\n            \"dbtPowerUser.createDatapilotNotebook\",\n            {\n              template: \"Profile your query\",\n            },\n          );\n        },\n      ),\n      commands.registerCommand(\n        \"dbtPowerUser.showNotebookTestSuggestions\",\n        async () => {\n          await commands.executeCommand(\n            \"dbtPowerUser.createDatapilotNotebook\",\n            {\n              template: \"Get test suggestions\",\n            },\n          );\n        },\n      ),\n      commands.registerCommand(\n        \"dbtPowerUser.showNotebookGenerateBaseModelSql\",\n        async () => {\n          await commands.executeCommand(\n            \"dbtPowerUser.createDatapilotNotebook\",\n            {\n              template: \"Generate dbt base model sql\",\n            },\n          );\n        },\n      ),\n      commands.registerCommand(\n        \"dbtPowerUser.showNotebookGenerateModelYaml\",\n        async () => {\n          await commands.executeCommand(\n            \"dbtPowerUser.createDatapilotNotebook\",\n            {\n              template: \"Generate dbt model yaml\",\n            },\n          );\n        },\n      ),\n      commands.registerCommand(\n        \"dbtPowerUser.showNotebookGenerateModelCTE\",\n        async () => {\n          await commands.executeCommand(\n            \"dbtPowerUser.createDatapilotNotebook\",\n            {\n              template: \"Generate dbt model CTE\",\n            },\n          );\n        },\n      ),\n      commands.registerCommand(\"dbtPowerUser.applyDeferConfig\", async () => {\n        const projects = this.dbtProjectContainer.getProjects();\n        try {\n          await Promise.all(\n            projects.map((project) => project.applyDeferConfig()),\n          );\n          window.showInformationMessage(\"Applied defer configuration\");\n        } catch (error) {\n          this.dbtTerminal.error(\n            \"applyDeferConfig\",\n            \"Failed to apply defer configuration\",\n            error,\n          );\n          window.showErrorMessage(\n            `Failed to apply defer configuration: ${error}`,\n          );\n        }\n      }),\n      commands.registerCommand(\n        \"dbtPowerUser.askAltimateAboutSelection\",\n        async () => {\n          const context = this.altimateCodeChatService.getEditorContext();\n          if (!context) {\n            return;\n          }\n          await this.altimateCodeChatService.openChat({\n            initialMessage: `Regarding this code from \\`@${context.relativePath}\\`:\\n\\`\\`\\`\\n${context.code}\\n\\`\\`\\``,\n            title: `Ask: ${context.fileName}`,\n          });\n        },\n      ),\n      commands.registerCommand(\"dbtPowerUser.explainWithAltimate\", async () => {\n        const context = this.altimateCodeChatService.getEditorContext();\n        if (!context) {\n          return;\n        }\n        await this.altimateCodeChatService.openChat({\n          initialMessage: `Explain the following code from \\`@${context.relativePath}\\`:\\n\\`\\`\\`sql\\n${context.code}\\n\\`\\`\\``,\n          title: `Explain: ${context.fileName}`,\n        });\n      }),\n      commands.registerCommand(\n        \"dbtPowerUser.optimizeWithAltimate\",\n        async () => {\n          const context = this.altimateCodeChatService.getEditorContext();\n          if (!context) {\n            return;\n          }\n          await this.altimateCodeChatService.openChat({\n            initialMessage: `Optimize the following SQL from \\`@${context.relativePath}\\` for performance and readability:\\n\\`\\`\\`sql\\n${context.code}\\n\\`\\`\\``,\n            title: `Optimize: ${context.fileName}`,\n          });\n        },\n      ),\n      commands.registerCommand(\n        \"dbtPowerUser.analyzeFileWithAltimate\",\n        async (uri?: Uri) => {\n          const fileUri = uri ?? window.activeTextEditor?.document.uri;\n          if (!fileUri) {\n            return;\n          }\n          const ctx = this.altimateCodeChatService.getContextForUri(fileUri);\n          if (!ctx) {\n            return;\n          }\n          await this.altimateCodeChatService.openChat({\n            initialMessage: `Analyze \\`@${ctx.relativePath}\\` for dbt best practices, performance, and documentation completeness.`,\n            title: `Analyze: ${ctx.fileName}`,\n          });\n        },\n      ),\n      commands.registerCommand(\"dbtPowerUser.openAltimateChat\", async () => {\n        const context = this.altimateCodeChatService.getEditorContext();\n        if (context) {\n          await this.altimateCodeChatService.openChat({\n            initialMessage: `Help me with \\`@${context.relativePath}\\`:\\n\\`\\`\\`\\n${context.code}\\n\\`\\`\\``,\n            title: `Chat: ${context.fileName}`,\n          });\n        } else {\n          await this.altimateCodeChatService.openChat({\n            initialMessage: \"How can I help you with your dbt project?\",\n            title: \"Altimate Code Chat\",\n          });\n        }\n      }),\n    );\n  }\n\n  private async printProjectInfo(project: DBTProject) {\n    this.diagnosticsOutputChannel.logLine(\n      `Project Name=${project.getProjectName()}`,\n    );\n    this.diagnosticsOutputChannel.logLine(\n      `Adapter Type=${project.getAdapterType()}`,\n    );\n\n    const dbtVersion = project.getDBTVersion();\n    if (!dbtVersion) {\n      this.diagnosticsOutputChannel.logLine(\"DBT is not initialized properly\");\n    } else {\n      this.diagnosticsOutputChannel.logLine(\n        `DBT version=${dbtVersion.join(\".\")}`,\n      );\n    }\n\n    if (!project.getPythonBridgeStatus()) {\n      this.diagnosticsOutputChannel.logLine(\"Python bridge is not connected\");\n    } else {\n      this.diagnosticsOutputChannel.logLine(\"Python bridge is connected\");\n    }\n\n    this.diagnosticsOutputChannel.logNewLine();\n\n    const paths = [\n      {\n        pathType: \"DBT Project File\",\n        path: project.getDBTProjectFilePath(),\n      },\n      { pathType: \"Target\", path: project.getTargetPath() },\n      {\n        pathType: \"PackageInstall\",\n        path: project.getPackageInstallPath(),\n      },\n      { pathType: \"Manifest\", path: project.getManifestPath() },\n      { pathType: \"Catalog\", path: project.getCatalogPath() },\n      ...(project.getModelPaths() || []).map((path) => ({\n        pathType: \"Model\",\n        path,\n      })),\n      ...(project.getSeedPaths() || []).map((path) => ({\n        pathType: \"Seed\",\n        path,\n      })),\n      ...(project.getMacroPaths() || []).map((path) => ({\n        pathType: \"Macro\",\n        path,\n      })),\n    ];\n\n    for (const p of paths) {\n      if (!p.path) {\n        this.diagnosticsOutputChannel.logLine(`${p.pathType} path not found`);\n        continue;\n      }\n      let line = `${p.pathType} path=${p.path}\\t\\t`;\n      if (!existsSync(p.path)) {\n        line += \"File doesn't exists at location\";\n      } else {\n        line += \"File exists at location\";\n      }\n      this.diagnosticsOutputChannel.logLine(line);\n    }\n\n    const dbtProjectFilePath = project.getDBTProjectFilePath();\n    if (existsSync(dbtProjectFilePath)) {\n      this.diagnosticsOutputChannel.logNewLine();\n      this.diagnosticsOutputChannel.logNewLine();\n      this.diagnosticsOutputChannel.logLine(\"dbt_project.yml\");\n      this.diagnosticsOutputChannel.logHorizontalRule();\n      const fileContent = readFileSync(dbtProjectFilePath, \"utf8\");\n      this.diagnosticsOutputChannel.logLine(fileContent.replace(/\\n/g, \"\\r\\n\"));\n      this.diagnosticsOutputChannel.logHorizontalRule();\n    }\n\n    this.diagnosticsOutputChannel.logNewLine();\n    const diagnostics = project.getAllDiagnostic();\n    this.diagnosticsOutputChannel.logLine(\n      `Number of diagnostics issues=${diagnostics.length}`,\n    );\n    for (const d of diagnostics) {\n      this.diagnosticsOutputChannel.logLine(d.message);\n    }\n    await project.debug(false);\n  }\n\n  private runSelectedQuery(uri: Uri, range: Range): void {\n    // Get the document and extract the selected text\n    const document = workspace.textDocuments.find(\n      (doc) => doc.uri.toString() === uri.toString(),\n    );\n    if (!document) {\n      window.showErrorMessage(\"Document not found\");\n      return;\n    }\n\n    const selectedQuery = document.getText(range);\n    if (!selectedQuery.trim()) {\n      window.showErrorMessage(\"No query selected\");\n      return;\n    }\n\n    // Create a model name based on the selection - use \"cte_query\" as default\n    const modelName = \"cte_query\";\n\n    // Execute the selected query using the existing infrastructure\n    this.dbtProjectContainer.executeSQL(uri, selectedQuery, modelName);\n  }\n\n  private async runCteWithDependencies(\n    uri: Uri,\n    cteIndex: number,\n    ctes: CteInfo[],\n  ): Promise<void> {\n    this.dbtTerminal.debug(\n      \"CteExecution\",\n      `Starting CTE execution for index ${cteIndex} with ${ctes.length} total CTEs`,\n    );\n\n    try {\n      // Get the document asynchronously\n      let document = workspace.textDocuments.find(\n        (doc) => doc.uri.toString() === uri.toString(),\n      );\n\n      if (!document) {\n        // Try to open the document if not found in workspace\n        try {\n          document = await workspace.openTextDocument(uri);\n        } catch (error) {\n          this.dbtTerminal.error(\n            \"CteExecution\",\n            `Failed to open document: ${uri.toString()}`,\n            error,\n          );\n          window.showErrorMessage(\"Document not found and could not be opened\");\n          return;\n        }\n      }\n\n      const text = document.getText();\n\n      // Find the target CTE and all its dependencies\n      const targetCte = ctes[cteIndex];\n      if (!targetCte) {\n        this.dbtTerminal.warn(\n          \"CteExecution\",\n          `CTE not found at index ${cteIndex}, available CTEs: ${ctes.length}`,\n        );\n        window.showErrorMessage(\"CTE not found\");\n        return;\n      }\n\n      this.dbtTerminal.debug(\n        \"CteExecution\",\n        `Target CTE: ${targetCte.name} (index: ${targetCte.index})`,\n      );\n\n      // Get all CTEs from the same WITH clause that come before or at the target index\n      const sameScopeCtesUpToTarget = ctes.filter(\n        (cte) =>\n          cte.withClauseStart === targetCte.withClauseStart &&\n          cte.index <= targetCte.index,\n      );\n\n      this.dbtTerminal.debug(\n        \"CteExecution\",\n        `Found ${sameScopeCtesUpToTarget.length} CTEs in dependency chain: ${sameScopeCtesUpToTarget.map((c) => c.name).join(\", \")}`,\n      );\n\n      // Build the complete query with dependencies\n      const cteDefinitions: string[] = [];\n\n      for (const cte of sameScopeCtesUpToTarget) {\n        // Extract the full CTE definition (name + AS + query)\n        const cteStart = cte.range.start;\n\n        // Get from CTE name to end of its query\n        const cteStartPos = document.offsetAt(cteStart);\n\n        // Improved regex to handle quoted identifiers, dotted names, and complex column lists\n        // Supports: identifier, \"quoted identifier\", schema.table, `backtick quoted`, [bracket quoted]\n        const cteNameMatch = text\n          .substring(cteStartPos)\n          .match(\n            /^((?:[a-zA-Z_][a-zA-Z0-9_]*|\"[^\"]+\"|`[^`]+`|\\[[^\\]]+\\])(?:\\.(?:[a-zA-Z_][a-zA-Z0-9_]*|\"[^\"]+\"|`[^`]+`|\\[[^\\]]+\\]))*(?:\\s*\\([^)]*\\))?)\\s+as\\s*\\(/i,\n          );\n\n        if (cteNameMatch) {\n          const cteQuery = document.getText(cte.queryRange);\n          const fullCteDefinition = `${cteNameMatch[1]} AS (\\n${cteQuery}\\n)`;\n          cteDefinitions.push(fullCteDefinition);\n\n          this.dbtTerminal.debug(\n            \"CteExecution\",\n            `Added CTE to query: ${cteNameMatch[1]} (${cteQuery.length} chars)`,\n          );\n        } else {\n          this.dbtTerminal.warn(\n            \"CteExecution\",\n            `Could not parse CTE definition for: ${cte.name}`,\n          );\n        }\n      }\n\n      // Check if we have any valid CTE definitions\n      if (cteDefinitions.length === 0) {\n        this.dbtTerminal.warn(\n          \"CteExecution\",\n          \"No valid CTE definitions found, cannot build query\",\n        );\n        window.showErrorMessage(\"Failed to extract CTE definitions\");\n        return;\n      }\n\n      // Build the complete query including preamble before WITH clause\n      // Extract everything before the WITH clause (dbt configs, variables, etc.)\n      const preamble = text.substring(0, targetCte.withClauseStart).trim();\n\n      let query = \"\";\n      if (preamble) {\n        query += preamble + \"\\n\\n\";\n        this.dbtTerminal.debug(\n          \"CteExecution\",\n          `Including preamble (${preamble.length} chars) before WITH clause`,\n        );\n      }\n\n      query += \"WITH \";\n      query += cteDefinitions.join(\",\\n\");\n\n      // Add a simple SELECT to execute the target CTE with proper quoting\n      const quotedTargetName = this.quoteSqlIdentifier(targetCte.name);\n      query += `\\nSELECT * FROM ${quotedTargetName}`;\n\n      this.dbtTerminal.debug(\n        \"CteExecution\",\n        `Generated query length: ${query.length} characters`,\n      );\n\n      // Create a unique model name with timestamp to prevent collisions\n      const timestamp = Date.now();\n      const hash = this.generateShortHash(targetCte.name + timestamp);\n      const modelName = `cte_${targetCte.name}_${hash}`;\n\n      this.dbtTerminal.debug(\n        \"CteExecution\",\n        `Executing CTE query with model name: ${modelName}`,\n      );\n\n      // Execute the complete query with dependencies\n      this.dbtProjectContainer.executeSQL(uri, query, modelName);\n    } catch (error) {\n      this.dbtTerminal.error(\n        \"CteExecution\",\n        \"Unexpected error in runCteWithDependencies\",\n        error,\n      );\n      window.showErrorMessage(\n        `Failed to execute CTE: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n      );\n    }\n  }\n\n  private quoteSqlIdentifier(identifier: string): string {\n    // If identifier is already quoted or contains dots, return as-is\n    if (identifier.match(/^[\"'`\\[]/) || identifier.includes(\".\")) {\n      return identifier;\n    }\n\n    // If identifier contains special characters or spaces, quote it\n    if (!identifier.match(/^[a-zA-Z_][a-zA-Z0-9_]*$/)) {\n      return `\"${identifier}\"`;\n    }\n\n    return identifier;\n  }\n\n  private generateShortHash(input: string): string {\n    // Simple hash function to generate a short unique suffix\n    let hash = 0;\n    for (let i = 0; i < input.length; i++) {\n      const char = input.charCodeAt(i);\n      hash = (hash << 5) - hash + char;\n      hash = hash & hash; // Convert to 32-bit integer\n    }\n    return Math.abs(hash).toString(36).substring(0, 6);\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/commands/runModel.ts",
    "content": "import path = require(\"path\");\nimport { RunModelType } from \"@altimateai/dbt-integration\";\nimport { Uri, window } from \"vscode\";\nimport { GenerateModelFromSourceParams } from \"../code_lens_provider/sourceModelCreationCodeLensProvider\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { NodeTreeItem } from \"../treeview_provider/modelTreeviewProvider\";\nimport { extendErrorWithSupportLinks } from \"../utils\";\n\nexport class RunModel {\n  constructor(private dbtProjectContainer: DBTProjectContainer) {}\n\n  runModelOnActiveWindow(type?: RunModelType) {\n    if (!window.activeTextEditor) {\n      return;\n    }\n    const fullPath = window.activeTextEditor.document.uri;\n    this.runDBTModel(fullPath, type);\n  }\n\n  buildModelOnActiveWindow(type?: RunModelType) {\n    if (!window.activeTextEditor) {\n      return;\n    }\n    const fullPath = window.activeTextEditor.document.uri;\n    this.buildDBTModel(fullPath, type);\n  }\n\n  runTestsOnActiveWindow() {\n    if (!window.activeTextEditor) {\n      return;\n    }\n    const fullPath = window.activeTextEditor.document.uri;\n    this.runDBTModelTest(fullPath);\n  }\n\n  compileModelOnActiveWindow() {\n    if (!window.activeTextEditor) {\n      return;\n    }\n    const fullPath = window.activeTextEditor.document.uri;\n    this.compileDBTModel(fullPath);\n  }\n\n  compileQueryOnActiveWindow() {\n    if (!window.activeTextEditor) {\n      return;\n    }\n    const fullPath = window.activeTextEditor.document.uri;\n    const query = window.activeTextEditor.document.getText();\n    if (query !== undefined) {\n      this.compileDBTQuery(fullPath, query);\n    }\n  }\n\n  private getQuery() {\n    if (!window.activeTextEditor) {\n      return;\n    }\n    const cursor = window.activeTextEditor.selection;\n    return window.activeTextEditor.document.getText(\n      cursor.isEmpty ? undefined : cursor,\n    );\n  }\n\n  executeQueryOnActiveWindow() {\n    const query = this.getQuery();\n    if (query === undefined) {\n      return;\n    }\n    const modelPath = window.activeTextEditor?.document.uri;\n    if (modelPath) {\n      const modelName = path.basename(modelPath.fsPath, \".sql\");\n      this.executeSQL(window.activeTextEditor!.document.uri, query, modelName);\n    }\n  }\n\n  runModelOnNodeTreeItem(type: RunModelType) {\n    return (model?: NodeTreeItem) => {\n      if (model === undefined) {\n        this.runModelOnActiveWindow(type);\n        return;\n      }\n      if (!model.url) {\n        return;\n      }\n      switch (type) {\n        case RunModelType.TEST: {\n          if (model.label) {\n            this.runDBTTest(\n              Uri.file(model.url),\n              model.label.toString().split(\".\")[0],\n            );\n          }\n          break;\n        }\n        case RunModelType.BUILD_CHILDREN:\n        case RunModelType.BUILD_CHILDREN_PARENTS:\n        case RunModelType.BUILD_PARENTS: {\n          // Catch Parents || Children RunTypes\n          this.buildDBTModel(Uri.file(model.url), type);\n          break;\n        }\n        case RunModelType.RUN_CHILDREN:\n        case RunModelType.RUN_PARENTS: {\n          // Catch Parents || Children RunTypes\n          this.runDBTModel(Uri.file(model.url), type);\n          break;\n        }\n      }\n    };\n  }\n\n  showCompiledSQLOnActiveWindow() {\n    const fullPath = window.activeTextEditor?.document.uri;\n    if (fullPath !== undefined) {\n      this.showCompiledSQL(fullPath);\n    }\n  }\n  generateSchemaYMLOnActiveWindow() {\n    const fullPath = window.activeTextEditor?.document.uri;\n    if (fullPath !== undefined) {\n      this.generateSchemaYML(fullPath);\n    }\n  }\n  showRunSQLOnActiveWindow() {\n    const fullPath = window.activeTextEditor?.document.uri;\n    if (fullPath !== undefined) {\n      this.showRunSQL(fullPath);\n    }\n  }\n\n  generateDBTDocsOnActiveWindow() {\n    const fullPath = window.activeTextEditor?.document.uri;\n    if (fullPath !== undefined) {\n      this.generateDBTDocs(fullPath);\n    }\n  }\n\n  runDBTModel(modelPath: Uri, type?: RunModelType) {\n    this.dbtProjectContainer.runModel(modelPath, type);\n  }\n\n  buildDBTModel(modelPath: Uri, type?: RunModelType) {\n    this.dbtProjectContainer.buildModel(modelPath, type);\n  }\n\n  compileDBTModel(modelPath: Uri, type?: RunModelType) {\n    this.dbtProjectContainer.compileModel(modelPath, type);\n  }\n\n  generateDBTDocs(modelPath: Uri, type?: RunModelType) {\n    this.dbtProjectContainer.generateDocs(modelPath);\n  }\n\n  compileDBTQuery(modelPath: Uri, query: string) {\n    this.dbtProjectContainer.compileQuery(modelPath, query);\n  }\n\n  runDBTTest(modelPath: Uri, testName: string) {\n    this.dbtProjectContainer.runTest(modelPath, testName);\n  }\n\n  runDBTModelTest(modelPath: Uri) {\n    const modelName = path.basename(modelPath.fsPath, \".sql\");\n    this.dbtProjectContainer.runModelTest(modelPath, modelName);\n  }\n\n  async executeSQL(uri: Uri, query: string, modelName: string) {\n    this.dbtProjectContainer.executeSQL(uri, query, modelName);\n  }\n\n  showCompiledSQL(modelPath: Uri) {\n    this.dbtProjectContainer.showCompiledSQL(modelPath);\n  }\n\n  generateSchemaYML(modelPath: Uri) {\n    const modelName = path.basename(modelPath.fsPath, \".sql\");\n    this.dbtProjectContainer.generateSchemaYML(modelPath, modelName);\n  }\n\n  showRunSQL(modelPath: Uri) {\n    this.dbtProjectContainer.showRunSQL(modelPath);\n  }\n\n  createModelBasedonSourceConfig(params: GenerateModelFromSourceParams) {\n    const project = this.dbtProjectContainer.findDBTProject(params.currentDoc);\n    const sourcePath = path.dirname(params.currentDoc.fsPath);\n    if (project) {\n      project.generateModel(params.sourceName, params.tableName, sourcePath);\n    } else {\n      window.showErrorMessage(\n        extendErrorWithSupportLinks(\n          \"Could not generate model! No project found for \" +\n            params.currentDoc.fsPath +\n            \".\",\n        ),\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "src/commands/runTest.ts",
    "content": "import { Uri, window } from \"vscode\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { QueryManifestService } from \"../services/queryManifestService\";\n\n/**\n * Handles singular data tests — standalone `.sql` files that live under the\n * project's configured `test-paths` and are executed with `dbt test --select\n * <test_name>`.\n *\n * These are not models and must not be dispatched through `RunModel`: running\n * them as a model spawns `dbt run`, which is never meaningful for a test file.\n * The original command entry points (`dbtPowerUser.runCurrentModel`,\n * `dbtPowerUser.testCurrentModel`, `dbtPowerUser.runTest`) consult this class\n * first and delegate to `RunModel` only when the active file is not a singular\n * test.\n */\nexport class RunTest {\n  constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    private queryManifestService: QueryManifestService,\n  ) {}\n\n  /**\n   * Returns the singular test name for the given file URI, or `undefined` if\n   * the file is not a singular data test in the current project's manifest.\n   *\n   * Singular tests are SQL files that appear in the manifest as test resources\n   * without `test_metadata` (generic tests like `not_null` / `unique` have\n   * `test_metadata` populated and live in `schema.yml`, not in `.sql` files).\n   * Detection uses the parsed manifest rather than a hardcoded `tests/`\n   * prefix, so projects with custom `test-paths` in `dbt_project.yml` are\n   * handled correctly.\n   */\n  getSingularTestName(uri: Uri): string | undefined {\n    const event = this.queryManifestService.getEventByDocument(uri);\n    if (!event) {\n      return undefined;\n    }\n    const filePath = uri.fsPath;\n    for (const [name, testData] of event.testMetaMap) {\n      if (testData.test_metadata === undefined && testData.path === filePath) {\n        return name;\n      }\n    }\n    return undefined;\n  }\n\n  /**\n   * Runs the singular test at the given URI via\n   * `dbt test --select <test_name>`.\n   */\n  runSingularTest(uri: Uri, testName: string): void {\n    this.dbtProjectContainer.runTest(uri, testName);\n  }\n\n  /**\n   * Attempts to run the active editor's file as a singular test. Returns\n   * `true` if the file was a singular test and the run was dispatched,\n   * `false` otherwise — in which case the caller should fall back to the\n   * regular model/test behavior.\n   */\n  runSingularTestOnActiveWindowIfApplicable(): boolean {\n    if (!window.activeTextEditor) {\n      return false;\n    }\n    const uri = window.activeTextEditor.document.uri;\n    const testName = this.getSingularTestName(uri);\n    if (testName === undefined) {\n      return false;\n    }\n    this.runSingularTest(uri, testName);\n    return true;\n  }\n}\n"
  },
  {
    "path": "src/commands/sqlToModel.ts",
    "content": "import { DBTTerminal } from \"@altimateai/dbt-integration\";\nimport { inject } from \"inversify\";\nimport * as path from \"path\";\nimport { Position, ProgressLocation, Range, window } from \"vscode\";\nimport { AltimateRequest } from \"../altimate\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport {\n  ManifestCacheChangedEvent,\n  ManifestCacheProjectAddedEvent,\n} from \"../dbt_client/event/manifestCacheChangedEvent\";\nimport { AltimateAuthService } from \"../services/altimateAuthService\";\nimport { TelemetryService } from \"../telemetry\";\nimport { extendErrorWithSupportLinks } from \"../utils\";\n\nexport class SqlToModel {\n  private eventMap: Map<string, ManifestCacheProjectAddedEvent> = new Map();\n  constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    private telemetry: TelemetryService,\n    private altimate: AltimateRequest,\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n    private altimateAuthService: AltimateAuthService,\n  ) {\n    dbtProjectContainer.onManifestChanged((event) =>\n      this.onManifestCacheChanged(event),\n    );\n  }\n\n  private async onManifestCacheChanged(event: ManifestCacheChangedEvent) {\n    event.added?.forEach((added) => {\n      this.eventMap.set(added.project.projectRoot.fsPath, added);\n    });\n    event.removed?.forEach((removed) => {\n      this.eventMap.delete(removed.projectRoot.fsPath);\n    });\n  }\n\n  async getModelFromSql() {\n    if (!this.altimateAuthService.handlePreviewFeatures()) {\n      return;\n    }\n    this.telemetry.sendTelemetryEvent(\"sqlToModel\");\n    if (!window.activeTextEditor) {\n      return;\n    }\n    const activedoc = window.activeTextEditor;\n    const currentFilePath = activedoc.document.uri;\n    const model = path.basename(\n      window.activeTextEditor!.document.fileName,\n      \".sql\",\n    );\n    const project = this.dbtProjectContainer.findDBTProject(currentFilePath);\n    if (!project) {\n      window.showErrorMessage(\n        extendErrorWithSupportLinks(\n          \"Could not find a dbt project. Please put the new model in a dbt project before converting to a model.\",\n        ),\n      );\n      this.telemetry.sendTelemetryError(\"sqlToModelNoProjectError\");\n      return;\n    }\n    const event = this.eventMap.get(project.projectRoot.fsPath);\n    if (!event) {\n      project.throwDiagnosticsErrorIfAvailable();\n      // If we get here, we don't know what exactly is the error.\n      //  Probably the extension is still initializing\n      window.showErrorMessage(\n        extendErrorWithSupportLinks(\n          \"The extension is still initializing, please retry again.\",\n        ),\n      );\n      this.telemetry.sendTelemetryError(\"sqlToModelNoManifestError\");\n      return;\n    }\n    const { nodeMetaMap, sourceMetaMap } = event;\n    const allmodels = Array.from(nodeMetaMap.nodes());\n    const allsources = Array.from(sourceMetaMap.values());\n\n    const fileText = activedoc.document.getText();\n    try {\n      const sqlToModelResponse = await window.withProgress(\n        {\n          location: ProgressLocation.Notification,\n          title: \"Convert SQL to Model...\",\n          cancellable: false,\n        },\n        async () => {\n          let compiledSql: string | undefined;\n          try {\n            compiledSql = await project.unsafeCompileQuery(fileText);\n          } catch (error) {\n            window.showErrorMessage(\n              extendErrorWithSupportLinks(\n                \"Could not compile the SQL: \" + (error as Error).message,\n              ),\n            );\n            return;\n          }\n          return await this.altimate.runModeller({\n            // if we can run this through compile sql, we can also do\n            // conversions that were half done. if it fails, just send the text as is.\n            sql: compiledSql || fileText,\n            adapter: project.getAdapterType(),\n            models: allmodels,\n            sources: allsources,\n          });\n        },\n      );\n\n      // if somehow the response isnt there or got an error response\n      if (\n        sqlToModelResponse === undefined ||\n        sqlToModelResponse.sql === undefined\n      ) {\n        window.showErrorMessage(\n          extendErrorWithSupportLinks(\n            \"Could not convert sql to model. Encountered unknown error when converting sql to model.\",\n          ),\n        );\n        this.dbtTerminal.error(\n          \"sqlToModelEmptyBackendResponseError\",\n          `Could not convert sql to model for query: ${fileText}`,\n          new Error(\"Empty response from backend\"),\n        );\n        return;\n      }\n\n      const startpos = new Position(0, 0);\n      const endpos = new Position(\n        activedoc.document.lineCount,\n        activedoc.document.lineAt(activedoc.document.lineCount - 1).text.length,\n      );\n      activedoc.edit((editBuilder) => {\n        editBuilder.replace(\n          new Range(startpos, endpos),\n          sqlToModelResponse.sql,\n        );\n      });\n      window.showInformationMessage(\n        `SQL successfully converted to model ${model}`,\n      );\n    } catch (err) {\n      window.showErrorMessage(\n        extendErrorWithSupportLinks(\n          \"Could not convert SQL to model: \" + (err as Error).message,\n        ),\n      );\n      this.dbtTerminal.error(\n        \"sqlToModelError\",\n        `Could not convert sql to model for query: ${fileText}`,\n        err,\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "src/commands/tests/initCatalog.ts",
    "content": "import { Catalog } from \"@altimateai/dbt-integration\";\nimport { ScanContext } from \"./scanContext\";\nimport { AltimateScanStep } from \"./step\";\n\nexport class InitCatalog implements AltimateScanStep {\n  public async run(scanContext: ScanContext) {\n    const project = scanContext.project;\n    const scanResults = scanContext.scanResults;\n    const cata = await project.getCatalog();\n    if (cata.length === 0) {\n      let catalogResults = scanResults[\"missingCatalog\"];\n      if (catalogResults === undefined) {\n        catalogResults = scanResults[\"missingCatalog\"] = {};\n      }\n      scanResults[\"missingCatalog\"][\n        project.getProjectName() + project.projectRoot\n      ] = true;\n    }\n    const modelDict: Record<string, Catalog> = Object.create(null);\n    cata.forEach((model) => {\n      const modelKey = JSON.stringify({\n        projectroot: project.projectRoot.fsPath,\n        project: project.getProjectName(),\n        database: model.table_database.toLowerCase(),\n        schema: model.table_schema.toLowerCase(),\n        name: model.table_name.toLowerCase(),\n      });\n      modelDict[modelKey] = modelDict[modelKey] || [];\n      modelDict[modelKey].push(model);\n    });\n    return modelDict;\n  }\n}\n"
  },
  {
    "path": "src/commands/tests/missingSchemaTest.ts",
    "content": "import { RESOURCE_TYPE_MODEL } from \"@altimateai/dbt-integration\";\nimport { Diagnostic, DiagnosticSeverity, Range } from \"vscode\";\nimport { ScanContext } from \"./scanContext\";\nimport { AltimateScanStep } from \"./step\";\n\nexport class MissingSchemaTest implements AltimateScanStep {\n  public async run(scanContext: ScanContext) {\n    const {\n      eventMap: projectEventMap,\n      diagnostics: projectDiagnostics,\n      scanResults,\n    } = scanContext;\n\n    if (projectEventMap === undefined) {\n      return;\n    }\n    const { nodeMetaMap } = projectEventMap;\n    for (const value of nodeMetaMap.nodes()) {\n      // blacklisting node types.. should we instead whitelist just models and sources?\n      if (\n        // TODO - need to filter out only models here but the resource type isnt available\n        !value.unique_id.startsWith(RESOURCE_TYPE_MODEL) ||\n        value.config.materialized === \"seed\" ||\n        value.config.materialized === \"ephemeral\"\n      ) {\n        continue;\n      }\n      if (!value.patch_path && value.path) {\n        const errMessage = `Documentation missing for model: ${value.name}`;\n        let projDiagnostic = projectDiagnostics[value.path];\n        if (projDiagnostic === undefined) {\n          projectDiagnostics[value.path] = projDiagnostic = [];\n        }\n        projDiagnostic.push(\n          new Diagnostic(\n            new Range(0, 0, 0, 0),\n            errMessage,\n            DiagnosticSeverity.Information,\n          ),\n        );\n        // TODO - set a note that this model is missing documentation\n        // so that we dont keep telling users that x column doc is missing\n        let missingDocsDict = scanResults[\"missingDoc\"];\n        if (missingDocsDict === undefined) {\n          scanResults[\"missingDoc\"] = missingDocsDict = new Set<string>();\n        }\n        missingDocsDict.add(value.unique_id);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/commands/tests/scanContext.ts",
    "content": "import { Catalog } from \"@altimateai/dbt-integration\";\nimport { Diagnostic } from \"vscode\";\nimport { DBTProject } from \"../../dbt_client/dbtProject\";\nimport { ManifestCacheProjectAddedEvent } from \"../../dbt_client/event/manifestCacheChangedEvent\";\n\nexport interface AltimateCatalog {\n  [projectName: string]: { [key: string]: Catalog };\n}\nexport class ScanContext {\n  project: DBTProject;\n  catalog: AltimateCatalog = {};\n  eventMap: ManifestCacheProjectAddedEvent | undefined;\n  diagnostics: { [filepath: string]: Diagnostic[] };\n  scanResults: { [key: string]: any } = {};\n\n  constructor(\n    project: DBTProject,\n    eventMap: ManifestCacheProjectAddedEvent | undefined,\n  ) {\n    this.project = project;\n    this.catalog = {};\n    this.eventMap = eventMap;\n    this.diagnostics = {};\n  }\n}\n"
  },
  {
    "path": "src/commands/tests/staleModelColumnTest.ts",
    "content": "import { createFullPathForNode } from \"@altimateai/dbt-integration\";\nimport { readFileSync } from \"fs\";\nimport { Diagnostic, DiagnosticSeverity, Range, Uri } from \"vscode\";\nimport { getColumnNameByCase, removeProtocol } from \"../../utils\";\nimport { ScanContext } from \"./scanContext\";\nimport { AltimateScanStep } from \"./step\";\n\nexport class StaleModelColumnTest implements AltimateScanStep {\n  private getTextLocation(\n    modelname: string,\n    colname: string,\n    schemaPath: string,\n  ): Range | undefined {\n    // 1) Read the file at filepath\n    const docContent: string = readFileSync(schemaPath, \"utf-8\");\n\n    // Use regex to find whole word matches for model\n    const modelRegex = new RegExp(`\\\\bname\\\\:\\\\s*?${modelname}\\\\b`);\n    const modelMatch = docContent.match(modelRegex);\n    if (!modelMatch) {\n      return undefined;\n    }\n\n    // 2) Search for exact matches of 'colname' that occur after 'modelname'\n    const colRegex = new RegExp(\n      `\\\\bname\\\\:\\\\s*?${colname}\\\\b|\\\\balias\\\\:\\\\s*?${colname}\\\\b`,\n      \"g\",\n    );\n    let colMatch;\n    while ((colMatch = colRegex.exec(docContent)) !== null) {\n      if (colMatch.index > (modelMatch.index || 0)) {\n        // Calculate line and character number for the match\n        const beforeMatch = docContent.substring(0, colMatch.index);\n        const lines = beforeMatch.split(\"\\n\");\n        const line = lines.length - 1;\n        const char = lines[line].length; // +1 to make it 1-based\n        // doing this because regex contains variable number of chars.\n        const matchLength = colMatch[0].length;\n\n        // 3) Return the line number and character number\n        return new Range(\n          line,\n          char + matchLength - colname.length,\n          line,\n          char + matchLength,\n        );\n      }\n    }\n\n    return undefined;\n  }\n\n  public async run(scanContext: ScanContext) {\n    const {\n      project,\n      catalog: altimateCatalog,\n      eventMap: projectEventMap,\n      diagnostics: projectDiagnostics,\n    } = scanContext;\n    const projectName = project.getProjectName();\n    const projectRootUri = project.projectRoot;\n    if (projectEventMap === undefined) {\n      return;\n    }\n    const { nodeMetaMap } = projectEventMap;\n    for (const value of nodeMetaMap.nodes()) {\n      if (value.config.materialized === \"ephemeral\") {\n        // ephemeral models by nature wont be materialized so we cant verify if they are stale.\n        continue;\n      }\n      const modelKey = JSON.stringify({\n        projectroot: projectRootUri.fsPath,\n        project: projectName,\n        database: value.database.toLowerCase(),\n        schema: value.schema.toLowerCase(),\n        name: value.alias.toLowerCase(),\n      });\n      if (\n        Object.keys(altimateCatalog[projectName + projectRootUri]).includes(\n          modelKey,\n        )\n      ) {\n        // do model-level checks here.\n        const modelDict =\n          altimateCatalog[projectName + projectRootUri][modelKey];\n        const allDBColumns = modelDict.map(({ column_name }) =>\n          getColumnNameByCase(column_name, project.getAdapterType()),\n        );\n        const packagePath = project.getPackageInstallPath();\n        if (packagePath === undefined) {\n          throw new Error(\n            \"packagePath is not defined in \" + project.projectRoot.fsPath,\n          );\n        }\n        for (const existingCol of Object.keys(value.columns)) {\n          if (\n            !allDBColumns.includes(\n              getColumnNameByCase(existingCol, project.getAdapterType()),\n            )\n          ) {\n            const errMessage = `Column ${existingCol} listed in model ${value.name} is not found in the database.\n            It may be outdated or misspelled.`;\n            // If we are here, the patch_path is guaranteed to be defined since\n            // we catch missing doc errors before we enter this function.\n\n            const schemaPath =\n              createFullPathForNode(\n                projectName,\n                projectRootUri.fsPath,\n                value.package_name,\n                packagePath,\n                removeProtocol(value.patch_path),\n              ) ||\n              Uri.joinPath(\n                project.projectRoot,\n                removeProtocol(value.patch_path),\n              ).fsPath;\n\n            const colInDocRange = this.getTextLocation(\n              value.name,\n              existingCol,\n              schemaPath,\n            );\n\n            let schemaDiagnostics = projectDiagnostics[schemaPath];\n            if (schemaDiagnostics === undefined) {\n              projectDiagnostics[schemaPath] = schemaDiagnostics = [];\n            }\n            schemaDiagnostics.push(\n              new Diagnostic(\n                colInDocRange || new Range(0, 0, 0, 0),\n                errMessage,\n                DiagnosticSeverity.Warning,\n              ),\n            );\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/commands/tests/step.ts",
    "content": "import { ScanContext } from \"./scanContext\";\n\nexport interface AltimateScanStep {\n  run(scanContext: ScanContext): Promise<any>;\n}\n"
  },
  {
    "path": "src/commands/tests/undocumentedModelColumnTest.ts",
    "content": "import { Diagnostic, DiagnosticSeverity, Range } from \"vscode\";\nimport { getColumnNameByCase } from \"../../utils\";\nimport { ScanContext } from \"./scanContext\";\nimport { AltimateScanStep } from \"./step\";\n\nexport class UndocumentedModelColumnTest implements AltimateScanStep {\n  public async run(scanContext: ScanContext) {\n    const {\n      project,\n      catalog: altimateCatalog,\n      eventMap: projectEventMap,\n      diagnostics: projectDiagnostics,\n      scanResults,\n    } = scanContext;\n    const projectName = project.getProjectName();\n    const projectRootUri = project.projectRoot;\n    if (projectEventMap === undefined) {\n      return;\n    }\n    const { nodeMetaMap } = projectEventMap;\n    for (const value of nodeMetaMap.nodes()) {\n      if (\n        (scanResults[\"missingDoc\"] !== undefined &&\n          scanResults[\"missingDoc\"].has(value.unique_id)) ||\n        value.config.materialized === \"seed\" ||\n        value.config.materialized === \"ephemeral\"\n      ) {\n        // schema is missing, no point in looking for undocumented columns\n        // or the model is not materialized / seed type\n        continue;\n      }\n\n      const modelKey = JSON.stringify({\n        projectroot: projectRootUri.fsPath,\n        project: projectName,\n        database: value.database.toLowerCase(),\n        schema: value.schema.toLowerCase(),\n        name: value.alias.toLowerCase(),\n      });\n      if (\n        Object.keys(altimateCatalog[projectName + projectRootUri]).includes(\n          modelKey,\n        )\n      ) {\n        // do model-level checks here.\n        const modelDict =\n          altimateCatalog[projectName + projectRootUri][modelKey];\n        const existingColumnsLowered = Object.keys(value.columns).map((key) =>\n          getColumnNameByCase(key, project.getAdapterType()),\n        );\n        for (const column of modelDict) {\n          if (\n            !existingColumnsLowered.includes(\n              getColumnNameByCase(column.column_name, project.getAdapterType()),\n            )\n          ) {\n            if (!value.path) {\n              continue;\n            }\n            const errMessage = `Column ${column.column_name} is undocumented in model: ${value.name}`;\n\n            let modelDiagnostics = projectDiagnostics[value.path];\n            if (modelDiagnostics === undefined) {\n              projectDiagnostics[value.path] = modelDiagnostics = [];\n            }\n            modelDiagnostics.push(\n              new Diagnostic(\n                new Range(0, 0, 0, 0),\n                errMessage,\n                DiagnosticSeverity.Information,\n              ),\n            );\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/commands/tests/unmaterializedModelTest.ts",
    "content": "import { Diagnostic, DiagnosticSeverity, Range } from \"vscode\";\nimport { ScanContext } from \"./scanContext\";\nimport { AltimateScanStep } from \"./step\";\n\nexport class UnmaterializedModelTest implements AltimateScanStep {\n  public async run(scanContext: ScanContext) {\n    const {\n      project,\n      catalog: altimateCatalog,\n      eventMap: projectEventMap,\n      diagnostics: projectDiagnostics,\n    } = scanContext;\n    const projectName = project.getProjectName();\n    const projectRootUri = project.projectRoot;\n    if (projectEventMap === undefined) {\n      return;\n    }\n    const { nodeMetaMap } = projectEventMap;\n    for (const value of nodeMetaMap.nodes()) {\n      if (value.config.materialized === \"ephemeral\") {\n        // ephemeral models by nature wont be materialized.\n        // seeds should be materialized so that other features\n        // work well so we'll raise errors for those\n        continue;\n      }\n\n      const modelKey = JSON.stringify({\n        projectroot: projectRootUri.fsPath,\n        project: projectName,\n        database: value.database.toLowerCase(),\n        schema: value.schema.toLowerCase(),\n        name: value.alias.toLowerCase(),\n      });\n      if (\n        !Object.keys(altimateCatalog[projectName + projectRootUri]).includes(\n          modelKey,\n        ) &&\n        value.path\n      ) {\n        // When the model is not in model dict, we could not find the table or view in\n        // information schema. meaning it was not materialized.\n        const errMessage = `Model ${value.name} does not exist in the database`;\n        let modelDiagnostics = projectDiagnostics[value.path];\n        if (modelDiagnostics === undefined) {\n          projectDiagnostics[value.path] = modelDiagnostics = [];\n        }\n        modelDiagnostics.push(\n          new Diagnostic(\n            new Range(0, 0, 0, 0),\n            errMessage,\n            DiagnosticSeverity.Information,\n          ),\n        );\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/commands/validateSql.ts",
    "content": "import { DBTTerminal } from \"@altimateai/dbt-integration\";\nimport { inject } from \"inversify\";\nimport { basename } from \"path\";\nimport { PythonException } from \"python-bridge\";\nimport {\n  CancellationToken,\n  commands,\n  Diagnostic,\n  DiagnosticCollection,\n  DiagnosticSeverity,\n  languages,\n  Position,\n  ProgressLocation,\n  Range,\n  Uri,\n  ViewColumn,\n  window,\n  workspace,\n} from \"vscode\";\nimport { AltimateRequest, ModelNode } from \"../altimate\";\nimport { SqlPreviewContentProvider } from \"../content_provider/sqlPreviewContentProvider\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport {\n  ManifestCacheChangedEvent,\n  ManifestCacheProjectAddedEvent,\n} from \"../dbt_client/event/manifestCacheChangedEvent\";\nimport { TelemetryService } from \"../telemetry\";\nimport { extendErrorWithSupportLinks } from \"../utils\";\n\nexport class ValidateSql {\n  private eventMap: Map<string, ManifestCacheProjectAddedEvent> = new Map();\n  private diagnosticsCollection: DiagnosticCollection;\n  constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    private telemetry: TelemetryService,\n    private altimate: AltimateRequest,\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n  ) {\n    dbtProjectContainer.onManifestChanged((event) =>\n      this.onManifestCacheChanged(event),\n    );\n    this.diagnosticsCollection = languages.createDiagnosticCollection();\n  }\n\n  private async onManifestCacheChanged(event: ManifestCacheChangedEvent) {\n    event.added?.forEach((added) => {\n      this.eventMap.set(added.project.projectRoot.fsPath, added);\n    });\n    event.removed?.forEach((removed) => {\n      this.eventMap.delete(removed.projectRoot.fsPath);\n    });\n  }\n\n  private showError(exc: unknown) {\n    if (exc instanceof PythonException) {\n      window.showErrorMessage(\n        extendErrorWithSupportLinks(\n          `An error occured while trying to compile your model: ` +\n            exc.exception.message +\n            \".\",\n        ),\n      );\n      this.telemetry.sendTelemetryError(\n        \"validateSQLCompileNodePythonError\",\n        exc,\n      );\n      this.dbtTerminal.error(\n        \"validateSQLError\",\n        \"Error encountered while compiling/retrieving schema for model\",\n        exc,\n      );\n      return;\n    }\n    this.telemetry.sendTelemetryError(\n      \"validateSQLCompileNodeUnknownError\",\n      exc,\n    );\n    // Unknown error\n    window.showErrorMessage(\n      extendErrorWithSupportLinks(\n        \"Could not validate SQL: \" + (exc as Error).message,\n      ),\n    );\n  }\n\n  async validateSql() {\n    this.telemetry.sendTelemetryEvent(\"validateSql\");\n    if (!window.activeTextEditor) {\n      return;\n    }\n    const activedoc = window.activeTextEditor;\n    const currentFilePath = activedoc.document.uri;\n    const project = this.dbtProjectContainer.findDBTProject(currentFilePath);\n    if (!project) {\n      await window.showErrorMessage(\"Unable to build project\");\n      return;\n    }\n    const modelName = basename(currentFilePath.fsPath, \".sql\");\n\n    const event = this.getEvent();\n    if (!event) {\n      return;\n    }\n    const { graphMetaMap, nodeMetaMap } = event;\n    const node = nodeMetaMap.lookupByBaseName(modelName);\n    if (!node) {\n      return;\n    }\n    const parentNodes = graphMetaMap.parents.get(node.unique_id)?.nodes;\n    if (!parentNodes) {\n      return;\n    }\n\n    const parentModels: ModelNode[] = [];\n    let relationsWithoutColumns: string[] = [];\n    let compiledQuery: string | undefined;\n    let cancellationToken: CancellationToken | undefined;\n    let abortController: AbortController | undefined;\n    await window.withProgress(\n      {\n        location: ProgressLocation.Notification,\n        title: \"Validating SQL\",\n        cancellable: true,\n      },\n      async (_, token) => {\n        try {\n          cancellationToken = token;\n          abortController = new AbortController();\n          token.onCancellationRequested(() => abortController!.abort());\n          const fileContentBytes = await workspace.fs.readFile(currentFilePath);\n          if (cancellationToken.isCancellationRequested) {\n            return;\n          }\n          try {\n            compiledQuery = await project.unsafeCompileQuery(\n              fileContentBytes.toString(),\n              modelName,\n            );\n          } catch (error) {\n            window.showErrorMessage(\n              extendErrorWithSupportLinks(\n                \"Unable to compile query for model \" +\n                  node.name +\n                  \" : \" +\n                  error,\n              ),\n            );\n            return;\n          }\n          if (cancellationToken.isCancellationRequested) {\n            return;\n          }\n          const modelsToFetch = project.getNonEphemeralParents([\n            node.unique_id,\n          ]);\n          const {\n            mappedNode,\n            relationsWithoutColumns: _relationsWithoutColumns,\n          } = await project.getNodesWithDBColumns(\n            modelsToFetch,\n            abortController!.signal,\n          );\n          parentModels.push(...modelsToFetch.map((n) => mappedNode[n]));\n          relationsWithoutColumns = _relationsWithoutColumns;\n        } catch (exc) {\n          this.showError(exc);\n        }\n      },\n    );\n    if (cancellationToken?.isCancellationRequested) {\n      return;\n    }\n    if (!compiledQuery) {\n      return;\n    }\n\n    if (relationsWithoutColumns.length !== 0) {\n      window.showErrorMessage(\n        extendErrorWithSupportLinks(\n          \"Failed to fetch columns for \" +\n            relationsWithoutColumns.join(\", \") +\n            \". Probably the dbt models are not yet materialized.\",\n        ),\n      );\n    }\n\n    const request = {\n      sql: compiledQuery,\n      dialect: project.getAdapterType(),\n      models: parentModels,\n    };\n    const response = await this.getProject()?.validateSql(request);\n    const activeUri = window.activeTextEditor?.document.uri;\n    if (activeUri.scheme === SqlPreviewContentProvider.SCHEME) {\n      // current focus on compiled sql document\n      return;\n    }\n    const compileSQLUri = activeUri.with({\n      scheme: SqlPreviewContentProvider.SCHEME,\n    });\n    const isOpen = !!window.visibleTextEditors.find(\n      (item) => item.document.uri === compileSQLUri,\n    );\n    if (!response || !response?.error_type) {\n      const tabGroup = window.tabGroups.all.find(\n        (tabGroup) =>\n          (tabGroup.activeTab?.input as { uri: Uri })?.uri.toString() ===\n          compileSQLUri.toString(),\n      );\n      if (tabGroup) {\n        await window.tabGroups.close(tabGroup);\n      }\n      window.showInformationMessage(\"SQL is valid.\");\n      this.diagnosticsCollection.set(compileSQLUri, []);\n      return;\n    }\n    if (response.error_type === \"sql_unknown_error\") {\n      window.showErrorMessage(\"Unable to validate SQL.\");\n      this.telemetry.sendTelemetryError(\n        \"validateSQLError\",\n        response.errors[0].description,\n      );\n      this.diagnosticsCollection.set(compileSQLUri, []);\n      return;\n    }\n    if (\n      response.error_type === \"sql_parse_error\" ||\n      (response.errors.length > 0 && response.errors[0].start_position)\n    ) {\n      if (!isOpen) {\n        const doc = await workspace.openTextDocument(compileSQLUri);\n        await window.showTextDocument(doc, ViewColumn.Beside, true);\n        await languages.setTextDocumentLanguage(doc, \"sql\");\n      }\n    }\n    commands.executeCommand(\"workbench.action.problems.focus\");\n\n    const diagnostics = response?.errors?.map(\n      ({ description, start_position, end_position }) => {\n        let startPos = new Position(0, 1);\n        let endPos = new Position(0, 1);\n        if (start_position) {\n          startPos = new Position(start_position[0], start_position[1]);\n        }\n        if (end_position) {\n          endPos = new Position(end_position[0], end_position[1]);\n        }\n        return new Diagnostic(\n          new Range(startPos, endPos),\n          description,\n          DiagnosticSeverity.Error,\n        );\n      },\n    );\n\n    this.diagnosticsCollection.set(compileSQLUri, diagnostics);\n  }\n\n  private getProject() {\n    const currentFilePath = window.activeTextEditor?.document.uri;\n    if (!currentFilePath) {\n      return;\n    }\n    return this.dbtProjectContainer.findDBTProject(currentFilePath);\n  }\n\n  private getEvent(): ManifestCacheProjectAddedEvent | undefined {\n    if (window.activeTextEditor === undefined || this.eventMap === undefined) {\n      return;\n    }\n\n    const currentFilePath = window.activeTextEditor.document.uri;\n    const projectRootpath =\n      this.dbtProjectContainer.getProjectRootpath(currentFilePath);\n    if (projectRootpath === undefined) {\n      return;\n    }\n\n    const event = this.eventMap.get(projectRootpath.fsPath);\n    if (event === undefined) {\n      return;\n    }\n    return event;\n  }\n}\n"
  },
  {
    "path": "src/commands/walkthroughCommands.ts",
    "content": "import {\n  CommandProcessExecutionFactory,\n  DBTTerminal,\n} from \"@altimateai/dbt-integration\";\nimport { inject } from \"inversify\";\nimport { gte } from \"semver\";\nimport {\n  commands,\n  ProgressLocation,\n  QuickPickItem,\n  window,\n  workspace,\n} from \"vscode\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { PythonEnvironment } from \"../dbt_client/pythonEnvironment\";\nimport { ProjectQuickPickItem } from \"../quickpick/projectQuickPick\";\nimport { TelemetryService } from \"../telemetry\";\nimport { getFirstWorkspacePath } from \"../utils\";\n\nenum PromptAnswer {\n  YES = \"Yes\",\n  NO = \"No\",\n}\n\nenum DbtInstallationPromptAnswer {\n  INSTALL = \"Install dbt core\",\n  INSTALL_CLOUD = \"Install dbt cloud\",\n  INSTALL_FUSION = \"Install dbt fusion\",\n}\n\nexport class WalkthroughCommands {\n  constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    private telemetry: TelemetryService,\n    private commandProcessExecutionFactory: CommandProcessExecutionFactory,\n    @inject(PythonEnvironment)\n    private pythonEnvironment: PythonEnvironment,\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n  ) {}\n\n  async validateProjects(\n    projectContext: ProjectQuickPickItem | undefined,\n    skipConfirmation = false,\n  ) {\n    if (projectContext === undefined) {\n      // This shouldnt happen really\n      window.showErrorMessage(\n        \"No project was selected, please select a project in the step 'Pick a dbt project' above.\",\n      );\n      return;\n    }\n    let debugCommand = \"dbt debug\";\n    if (\n      workspace\n        .getConfiguration(\"dbt\")\n        .get<string>(\"dbtIntegration\", \"core\") === \"cloud\"\n    ) {\n      debugCommand = \"dbt environment show\";\n    }\n    if (!skipConfirmation) {\n      const answer = await window.showInformationMessage(\n        `Do you want to validate the project: ${projectContext.label}? This will run the command '${debugCommand}' inside this project. Do you want to continue?`,\n        PromptAnswer.YES,\n        PromptAnswer.NO,\n      );\n      if (answer !== PromptAnswer.YES) {\n        return;\n      }\n    }\n    try {\n      this.telemetry.sendTelemetryEvent(\"validateProject\");\n      const project = this.dbtProjectContainer.findDBTProject(\n        projectContext.uri,\n      );\n      if (project === undefined) {\n        throw new Error(`Project ${projectContext.label} was not found`);\n      }\n      const runModelOutput = await project.debug();\n      if (runModelOutput.fullOutput.includes(\"ERROR\")) {\n        throw new Error(runModelOutput.fullOutput);\n      }\n    } catch (err) {\n      this.dbtTerminal.error(\n        \"validateProjectError\",\n        `Error when validating ${projectContext.label}`,\n        err,\n      );\n      window.showErrorMessage(\n        \"Error running dbt debug for project \" +\n          projectContext.label +\n          \". Please check the output tab for more details.\",\n      );\n      throw err;\n    }\n  }\n  async installDeps(\n    projectContext: ProjectQuickPickItem | undefined,\n    skipConfirmation = false,\n  ) {\n    if (projectContext === undefined) {\n      // This shouldnt happen really\n      window.showErrorMessage(\n        \"No project was selected, please select a project in the step 'Pick a dbt project' above.\",\n      );\n      return;\n    }\n    if (!skipConfirmation) {\n      const answer = await window.showInformationMessage(\n        `Do you want to install packages for the project: ${projectContext.label}? This will run the command 'dbt deps' inside this project. Do you want to continue?`,\n        PromptAnswer.YES,\n        PromptAnswer.NO,\n      );\n      if (answer !== PromptAnswer.YES) {\n        return;\n      }\n    }\n    try {\n      this.telemetry.sendTelemetryEvent(\"installDeps\");\n      const project = this.dbtProjectContainer.findDBTProject(\n        projectContext.uri,\n      );\n      if (project === undefined) {\n        throw new Error(`Project ${projectContext.label} was not found`);\n      }\n\n      await project.installDeps();\n    } catch (err) {\n      this.dbtTerminal.debug(\n        \"WalkthroughCommands.installDeps\",\n        \"Could not install deps\",\n        err,\n      );\n      this.telemetry.sendTelemetryError(\"installDepsError\", err);\n      window.showErrorMessage(\n        \"Error installing dbt dependencies for project \" +\n          projectContext.label +\n          \". Please check the output tab for more details.\",\n      );\n      throw err;\n    }\n  }\n\n  async installDbt(): Promise<void> {\n    const dbtIntegration = workspace\n      .getConfiguration(\"dbt\")\n      .get<string>(\"dbtIntegration\", \"core\");\n    switch (dbtIntegration) {\n      case \"core\":\n        return this.installDbtCore();\n      case \"fusion\":\n        return this.installDbtFusion();\n      case \"cloud\":\n        return this.installDbtCloud();\n      default:\n        throw new Error(\n          `Unsupported dbt integration: ${dbtIntegration}. Supported values are 'core', 'cloud', 'fusion'.`,\n        );\n    }\n  }\n\n  private async installDbtFusion(): Promise<void> {\n    let error = undefined;\n    await window.withProgress(\n      {\n        title: `Installing dbt fusion...`,\n        location: ProgressLocation.Notification,\n        cancellable: false,\n      },\n      async () => {\n        try {\n          const platform = process.platform;\n          let command: string;\n          let args: string[];\n\n          if (platform === \"darwin\" || platform === \"linux\") {\n            command = \"sh\";\n            args = [\n              \"-c\",\n              \"curl -fsSL https://public.cdn.getdbt.com/fs/install/install.sh | sh -s -- --update\",\n            ];\n          } else if (platform === \"win32\") {\n            command = \"powershell\";\n            args = [\n              \"-Command\",\n              \"irm https://public.cdn.getdbt.com/fs/install/install.ps1 | iex\",\n            ];\n          } else {\n            throw new Error(\n              `Unsupported platform: ${platform}, only MacOS, Linux and Windows are supported for dbt fusion installation`,\n            );\n          }\n\n          await this.commandProcessExecutionFactory\n            .createCommandProcessExecution({\n              command,\n              args,\n              cwd: getFirstWorkspacePath(),\n              envVars: this.pythonEnvironment.getEnvironmentVariables(),\n            })\n            .completeWithTerminalOutput();\n\n          // Initialize after installation\n          await this.dbtProjectContainer.detectDBT();\n          this.dbtProjectContainer.initialize();\n        } catch (err) {\n          error = err;\n        }\n      },\n    );\n    if (error) {\n      const answer = await window.showErrorMessage(\n        \"Could not install dbt fusion: \" + (error as Error).message,\n        DbtInstallationPromptAnswer.INSTALL_FUSION,\n      );\n      if (answer === DbtInstallationPromptAnswer.INSTALL_FUSION) {\n        commands.executeCommand(\"dbtPowerUser.installDbt\");\n      }\n    }\n  }\n\n  private async installDbtCloud(): Promise<void> {\n    let error = undefined;\n    await window.withProgress(\n      {\n        title: `Installing dbt cloud...`,\n        location: ProgressLocation.Notification,\n        cancellable: false,\n      },\n      async () => {\n        try {\n          const { stdout, stderr } = await this.commandProcessExecutionFactory\n            .createCommandProcessExecution({\n              command: this.pythonEnvironment.pythonPath,\n              args: [\n                \"-m\",\n                \"pip\",\n                \"install\",\n                \"dbt\",\n                \"--no-cache-dir\",\n                \"--force-reinstall\",\n              ],\n              cwd: getFirstWorkspacePath(),\n              envVars: this.pythonEnvironment.getEnvironmentVariables(),\n            })\n            .completeWithTerminalOutput();\n          if (\n            !stdout.includes(\"Successfully installed\") &&\n            !stdout.includes(\"Requirement already satisfied\") &&\n            stderr\n          ) {\n            throw new Error(stderr);\n          }\n          await this.dbtProjectContainer.detectDBT();\n          this.dbtProjectContainer.initialize();\n        } catch (err) {\n          error = err;\n        }\n      },\n    );\n    if (error) {\n      const answer = await window.showErrorMessage(\n        \"Could not install dbt cloud: \" + (error as Error).message,\n        DbtInstallationPromptAnswer.INSTALL_CLOUD,\n      );\n      if (answer === DbtInstallationPromptAnswer.INSTALL_CLOUD) {\n        commands.executeCommand(\"dbtPowerUser.installDbt\");\n      }\n    }\n  }\n\n  private async installDbtCore(): Promise<void> {\n    const dbtVersion: QuickPickItem | undefined = await window.showQuickPick(\n      [\"1.8\", \"1.9\", \"1.10\", \"1.11\"].map((value) => ({\n        label: value,\n      })),\n      {\n        title: \"Select your dbt version\",\n        canPickMany: false,\n      },\n    );\n    if (!dbtVersion) {\n      return;\n    }\n    const adapter: QuickPickItem | undefined = await window.showQuickPick(\n      [\n        \"snowflake\",\n        \"bigquery\",\n        \"redshift\",\n        \"postgres\",\n        \"databricks\",\n        \"sqlserver\",\n        \"duckdb\",\n        \"athena\",\n        \"spark\",\n        \"clickhouse\",\n        \"trino\",\n        \"synapse\",\n        \"fabric\",\n        \"risingwave\",\n      ].map((value) => ({ label: value })),\n      {\n        title: \"Select your adapter\",\n        canPickMany: false,\n      },\n    );\n    if (!adapter || !adapter.label) {\n      return;\n    }\n    const packageVersion = dbtVersion.label;\n    const packageName = this.mapToAdapterPackage(adapter.label);\n    let error = undefined;\n    await window.withProgress(\n      {\n        title: `Installing ${packageName} ${packageVersion}...`,\n        location: ProgressLocation.Notification,\n        cancellable: false,\n      },\n      async () => {\n        try {\n          const args = [\n            \"-m\",\n            \"pip\",\n            \"install\",\n            \"--no-cache-dir\",\n            \"--force-reinstall\",\n          ];\n          const isIndependentAdapterPackage = gte(\n            packageVersion + \".0\",\n            \"1.8.0\",\n          );\n          if (isIndependentAdapterPackage) {\n            args.push(`dbt-core~=${packageVersion}.0`);\n            args.push(`${packageName}`);\n          } else {\n            args.push(`${packageName}==${packageVersion}`);\n          }\n          const { stdout, stderr } = await this.commandProcessExecutionFactory\n            .createCommandProcessExecution({\n              command: this.pythonEnvironment.pythonPath,\n              args,\n              cwd: getFirstWorkspacePath(),\n              envVars: this.pythonEnvironment.getEnvironmentVariables(),\n            })\n            .completeWithTerminalOutput();\n          if (\n            !stdout.includes(\"Successfully installed\") &&\n            !stdout.includes(\"Requirement already satisfied\") &&\n            stderr\n          ) {\n            throw new Error(stderr);\n          }\n          await this.dbtProjectContainer.detectDBT();\n          this.dbtProjectContainer.initialize();\n        } catch (err) {\n          error = err;\n        }\n      },\n    );\n    if (error) {\n      const answer = await window.showErrorMessage(\n        \"Could not install dbt: \" + (error as Error).message,\n        DbtInstallationPromptAnswer.INSTALL,\n      );\n      if (answer === DbtInstallationPromptAnswer.INSTALL) {\n        commands.executeCommand(\"dbtPowerUser.installDbt\");\n      }\n    }\n  }\n\n  private mapToAdapterPackage(adapter: string): string {\n    switch (adapter) {\n      case \"snowflake\":\n        return \"dbt-snowflake\";\n      case \"bigquery\":\n        return \"dbt-bigquery\";\n      case \"redshift\":\n        return \"dbt-redshift\";\n      case \"postgres\":\n        return \"dbt-postgres\";\n      case \"databricks\":\n        return \"dbt-databricks\";\n      case \"sqlserver\":\n        return \"dbt-sqlserver\";\n      case \"duckdb\":\n        return \"dbt-duckdb\";\n      case \"athena\":\n        return \"dbt-athena-community\";\n      case \"spark\":\n        return \"dbt-spark\";\n      case \"clickhouse\":\n        return \"dbt-clickhouse\";\n      case \"trino\":\n        return \"dbt-trino\";\n      case \"synapse\":\n        return \"dbt-synapse\";\n      case \"fabric\":\n        return \"dbt-fabric\";\n      case \"risingwave\":\n        return \"dbt-risingwave\";\n    }\n    throw new Error(\"Adapter is not supported\" + adapter);\n  }\n}\n"
  },
  {
    "path": "src/comment_provider/conversationProvider.ts",
    "content": "import {\n  DBTTerminal,\n  RESOURCE_TYPE_MACRO,\n  RESOURCE_TYPE_TEST,\n} from \"@altimateai/dbt-integration\";\nimport { inject } from \"inversify\";\nimport {\n  CancellationToken,\n  commands,\n  Comment,\n  CommentAuthorInformation,\n  CommentMode,\n  CommentReply,\n  comments,\n  CommentThread,\n  CommentThreadState,\n  Disposable,\n  env,\n  MarkdownString,\n  Range,\n  TextDocument,\n  Uri,\n  window,\n  workspace,\n} from \"vscode\";\nimport { Conversation, ConversationGroup, SharedDoc } from \"../altimate\";\nimport { ConversationService } from \"../services/conversationService\";\nimport { QueryManifestService } from \"../services/queryManifestService\";\nimport { SharedStateService } from \"../services/sharedStateService\";\nimport { UsersService } from \"../services/usersService\";\nimport { TelemetryService } from \"../telemetry\";\nimport { extendErrorWithSupportLinks } from \"../utils\";\nimport path = require(\"path\");\n\n// Extends vscode commentthread and add extra fields for reference\nexport interface ConversationCommentThread extends CommentThread {\n  share_id: SharedDoc[\"share_id\"];\n  conversation_group_id: ConversationGroup[\"conversation_group_id\"];\n  meta: ConversationGroup[\"meta\"];\n}\n\nexport class ConversationComment implements Comment {\n  label: string | undefined;\n  timestamp: Date;\n  savedBody: string | MarkdownString; // for the Cancel button\n  constructor(\n    public conversation_id: Conversation[\"conversation_id\"],\n    public body: string | MarkdownString,\n    public mode: CommentMode,\n    public author: CommentAuthorInformation,\n    public time: string,\n    public parent?: ConversationCommentThread,\n    public contextValue?: string,\n  ) {\n    this.savedBody = this.body;\n    this.timestamp = new Date(this.time);\n  }\n}\n\nconst ALLOWED_FILE_EXTENSIONS = [\".sql\"];\nexport class ConversationProvider implements Disposable {\n  private disposables: Disposable[] = [];\n  private commentController;\n  private timer: NodeJS.Timeout | undefined;\n  private isPolling: boolean = false;\n  // record of share id with conv group\n  // used to identify deleted records during polling\n  // can be removed in future if we get right events like delete, add etc.,\n  private _threads: Record<string, Record<string, ConversationCommentThread>> =\n    {};\n\n  constructor(\n    private conversationService: ConversationService,\n    private usersService: UsersService,\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n    private emitterService: SharedStateService,\n    private queryManifestService: QueryManifestService,\n    private telemetry: TelemetryService,\n  ) {\n    if (!this.isCollaborationEnabled()) {\n      return;\n    }\n\n    // Create comment controller\n    this.commentController = comments.createCommentController(\n      \"altimate-conversations\",\n      // this title will be used to show in selection options when more than one extension in vscode has commenting feature\n      \"Altimate dbt conversations\",\n    );\n\n    this.commentController.commentingRangeProvider = {\n      provideCommentingRanges: (\n        document: TextDocument,\n        token: CancellationToken,\n      ) => {\n        // enable only for allowed files\n        if (\n          !ALLOWED_FILE_EXTENSIONS.find((ext) =>\n            document.uri.fsPath.endsWith(ext),\n          )\n        ) {\n          return null;\n        }\n        const lineCount = document.lineCount;\n        return [new Range(0, 0, lineCount - 1, 0)];\n      },\n    };\n\n    this.disposables.push(\n      emitterService.eventEmitter.event((d) => {\n        if (\n          d.command === \"dbtProjectsInitialized\" ||\n          d.command === \"refetchConversations\"\n        ) {\n          this.loadThreads();\n        }\n      }),\n    );\n\n    this.disposables.push(this.commentController);\n  }\n\n  private isCollaborationEnabled() {\n    const enableCollaboration = workspace\n      .getConfiguration(\"dbt\")\n      .get<boolean>(\"enableCollaboration\", false);\n    this.dbtTerminal.debug(\n      \"ConversationProvider:isCollaborationEnabled\",\n      \"collaboration status\",\n      enableCollaboration,\n    );\n\n    return enableCollaboration;\n  }\n\n  // simple polling for getting latest conversations\n  private setupPolling() {\n    clearTimeout(this.timer);\n    const pollingInterval = workspace\n      .getConfiguration(\"dbt\")\n      .get<number>(\"conversationsPollingInterval\", 30);\n    this.dbtTerminal.debug(\n      \"ConversationProvider:setupRefetch\",\n      \"refresh conversations after\",\n      pollingInterval,\n    );\n    this.timer = setTimeout(() => {\n      this.loadThreads();\n    }, pollingInterval * 1000);\n    this.isPolling = true;\n  }\n\n  private async loadThreads() {\n    this.dbtTerminal.debug(\n      \"ConversationProvider:loadThreads\",\n      \"loading threads\",\n    );\n    const shares = await this.conversationService.loadSharedDocs();\n    if (shares && shares.length && !this.isPolling) {\n      this.setupPolling();\n    }\n\n    if (!shares?.length) {\n      this.dbtTerminal.debug(\n        \"ConversationProvider:loadThreads\",\n        \"No conversations yet\",\n      );\n      return;\n    }\n\n    shares.map(async (dbtDocsShare) => {\n      this.dbtTerminal.debug(\n        \"ConversationProvider:loadThreads\",\n        \"loading conversations\",\n        dbtDocsShare.share_id,\n      );\n      const conversations = dbtDocsShare.conversation_group;\n      if (!conversations?.length) {\n        this.dbtTerminal.debug(\n          \"ConversationProvider:loadThreads\",\n          \"No conversations in share\",\n          dbtDocsShare.share_id,\n        );\n        return;\n      }\n\n      const pendingConversations = conversations.filter(\n        (c) => c.status === \"Pending\",\n      );\n\n      this.emitterService.fire({\n        command: \"conversations:updates\",\n        payload: {\n          shareId: dbtDocsShare.share_id,\n          conversationGroups: pendingConversations,\n        },\n      });\n      // If local cache has this share already, find if any conversation is missing from db (which as resolved)\n      // can be removed in future if we get right events like delete, add etc.,\n      if (this._threads[dbtDocsShare.share_id]) {\n        const currentConversationGroupIds = Object.keys(\n          this._threads[dbtDocsShare.share_id],\n        );\n        const conversationGroupIdsFromDB = pendingConversations.map((c) =>\n          c.conversation_group_id.toString(),\n        );\n\n        const missingConversationGroupIds = currentConversationGroupIds.filter(\n          (id) => !conversationGroupIdsFromDB.includes(id),\n        );\n\n        if (missingConversationGroupIds.length) {\n          this.dbtTerminal.debug(\n            \"ConversationProvider:loadThreads\",\n            \"resolving threads\",\n            missingConversationGroupIds,\n          );\n          // delete resolved conversations\n          missingConversationGroupIds.forEach((id) =>\n            this._threads[dbtDocsShare.share_id][id].dispose(),\n          );\n        }\n      }\n\n      const project = this.queryManifestService.getProjectByName(\n        dbtDocsShare.project_name,\n      );\n\n      if (!project) {\n        this.dbtTerminal.debug(\n          \"ConversationProvider:loadThreads\",\n          \"not able to get project\",\n          dbtDocsShare,\n        );\n        return;\n      }\n\n      pendingConversations.map((conversationGroup) => {\n        const uri = Uri.file(\n          path.join(\n            project.projectRoot.fsPath,\n            conversationGroup.meta.filePath,\n          ),\n        );\n        const thread =\n          this._threads[dbtDocsShare.share_id]?.[\n            conversationGroup.conversation_group_id\n          ] ??\n          (this.commentController!.createCommentThread(\n            uri,\n            new Range(\n              conversationGroup.meta.range?.start.line || 0,\n              conversationGroup.meta.range?.start.character || 0,\n              conversationGroup.meta.range?.end.line || 0,\n              conversationGroup.meta.range?.end.character || 0,\n            ),\n            [],\n          ) as ConversationCommentThread);\n        // whenever new comment thread is added, active editor loses focus\n        if (window.activeTextEditor?.document.uri.fsPath === uri.fsPath) {\n          window.showTextDocument(window.activeTextEditor.document);\n        }\n        thread.state = CommentThreadState.Unresolved;\n        thread.comments = conversationGroup.conversations.map(\n          (conversation) =>\n            new ConversationComment(\n              conversation.conversation_id,\n              this.convertTextFromDbToCommentFormat(conversation.message),\n              CommentMode.Preview,\n              {\n                name:\n                  this.usersService.getUserById(conversation.user_id)\n                    ?.first_name || \"Unknown\",\n              },\n              conversation.timestamp,\n              undefined,\n              \"\",\n            ),\n        );\n\n        const isInDocsEditor = !!conversationGroup.meta.field;\n        if (isInDocsEditor) {\n          thread.comments = [\n            new ConversationComment(\n              -1,\n              [\n                \"This comment is added from documentation editor.\",\n                'Please click \"View in documentation editor\" button to view in documentation editor.\\n',\n                conversationGroup.meta.column\n                  ? `Column: ${conversationGroup.meta.column}\\n`\n                  : \"\",\n                \"Description:\",\n                conversationGroup.meta.highlight,\n              ].join(\" \"),\n              CommentMode.Preview,\n              {\n                name: \"Altimate\",\n              },\n              new Date().toISOString(),\n              undefined,\n              \"\",\n            ),\n            ...thread.comments,\n          ];\n        }\n        thread.conversation_group_id = conversationGroup.conversation_group_id;\n        thread.meta = conversationGroup.meta;\n        thread.share_id = dbtDocsShare.share_id;\n        thread.label = \"Discussion\";\n        this.addContextValue(thread);\n\n        // update the local cache\n        this._threads[dbtDocsShare.share_id] = {\n          ...this._threads[dbtDocsShare.share_id],\n          [conversationGroup.conversation_group_id]: thread,\n        };\n      });\n    });\n  }\n\n  private addContextValue(thread: ConversationCommentThread) {\n    let contextValue = \"saved\";\n\n    if (thread.meta.field === \"description\") {\n      contextValue += \"|description\";\n    }\n    thread.contextValue = contextValue;\n  }\n\n  // convert \"@[john](john)\" to \"@john\"\n  private convertTextFromDbToCommentFormat(text: string) {\n    return new MarkdownString(text.replace(/@\\[(.*?)\\]\\((.*?)\\)/g, \"@$2\"));\n  }\n\n  // convert \"@john\" to \"@[john](john)\"\n  private convertTextToDbFormat(text: string) {\n    return new MarkdownString(text).value.replace(/@(\\S+)\\s/g, \"@[$1]($1) \");\n  }\n\n  private addComment(reply: CommentReply) {\n    const thread = reply.thread;\n    thread.contextValue = \"saving\";\n    const newComment = new ConversationComment(\n      -1,\n      new MarkdownString(reply.text),\n      CommentMode.Preview,\n      { name: this.usersService.user?.first_name || \"Unknown\" },\n      new Date().toISOString(),\n      thread as ConversationCommentThread,\n      \"\",\n    );\n\n    thread.comments = [...thread.comments, newComment];\n\n    return newComment;\n  }\n\n  async copyThreadLink(thread: ConversationCommentThread) {\n    this.telemetry.sendTelemetryEvent(\"dbtCollaboration:copyLink\", {\n      source: \"vscode\",\n    });\n    if (!thread.share_id) {\n      window.showErrorMessage(\n        extendErrorWithSupportLinks(\"Unable to find conversation.\"),\n      );\n      return;\n    }\n\n    const result = await this.conversationService.getAppUrlByShareId(\n      thread.share_id,\n    );\n    if (result?.app_url) {\n      env.clipboard.writeText(\n        `${result.app_url}/${thread.conversation_group_id}`,\n      );\n      window.showInformationMessage(\"Url copied\", \"Ok\");\n    }\n  }\n\n  async viewInDocEditor(thread: ConversationCommentThread) {\n    this.telemetry.sendTelemetryEvent(\"dbtCollaboration:viewInDocEditor\", {\n      source: \"vscode\",\n    });\n    this.dbtTerminal.debug(\n      \"ConversationProvider:viewInDocEditor\",\n      \"viewing conversation\",\n      thread.share_id,\n      thread.conversation_group_id,\n    );\n    commands.executeCommand(\"dbtPowerUser.DocsEdit.focus\");\n    this.emitterService.fire({\n      command: \"viewConversation\",\n      payload: {\n        shareId: thread.share_id,\n        conversation_group_id: thread.conversation_group_id,\n      },\n    });\n    // When clicking button in vscode comment, active text editor changes to comment\n    // refocussing the model to make sure documentation shows up\n    const editor = window.visibleTextEditors.find(\n      (editor) => editor.document.uri.fsPath === thread.uri.fsPath,\n    );\n    if (editor?.document) {\n      window.showTextDocument(editor.document);\n    }\n  }\n\n  async viewInDbtDocs(thread: ConversationCommentThread) {\n    this.telemetry.sendTelemetryEvent(\"dbtCollaboration:viewInDbtDocs\", {\n      source: \"vscode\",\n    });\n    if (!thread.share_id) {\n      window.showErrorMessage(\n        extendErrorWithSupportLinks(\"Unable to find conversation.\"),\n      );\n      return;\n    }\n    this.dbtTerminal.debug(\n      \"ConversationProvider:viewInDbtDocs\",\n      `firing render dbtdocs event`,\n      thread.share_id,\n    );\n    this.emitterService.fire({\n      command: \"dbtdocsview:render\",\n      payload: {\n        shareId: thread.share_id,\n        conversationGroupId: thread.conversation_group_id,\n        userId: this.usersService.user?.id,\n      },\n    });\n  }\n\n  private getNodeMeta(uri: Uri, resourceName: string) {\n    const event = this.queryManifestService.getEventByDocument(uri);\n    if (!event) {\n      this.dbtTerminal.debug(\"getNodeMeta\", \"event not available\");\n      return;\n    }\n\n    const currentNode = event.nodeMetaMap.lookupByBaseName(resourceName);\n    // For model\n    if (currentNode) {\n      return {\n        resource_type: currentNode.resource_type,\n        uniqueId: currentNode.unique_id,\n      };\n    }\n\n    const macroNode = event.macroMetaMap.get(resourceName);\n    // For macro\n    if (macroNode) {\n      return {\n        resource_type: RESOURCE_TYPE_MACRO,\n        uniqueId: macroNode.unique_id,\n      };\n    }\n\n    const testNode = event.testMetaMap.get(resourceName);\n    // For tests\n    if (testNode) {\n      return {\n        resource_type: RESOURCE_TYPE_TEST,\n        uniqueId: testNode.unique_id,\n      };\n    }\n  }\n\n  createCommentThread(uri: Uri, range: Range) {\n    return this.commentController?.createCommentThread(uri, range, []);\n  }\n\n  async saveConversation(\n    message: string,\n    uri: Uri,\n    extraMeta: Record<string, unknown> = {},\n    range: Range | undefined,\n    source: \"vscode\" | \"documentation-editor\" = \"vscode\",\n  ) {\n    this.telemetry.sendTelemetryEvent(\"dbtCollaboration:create\", {\n      source,\n    });\n    const model = path.basename(uri.fsPath, \".sql\");\n    const convertedMessage = this.convertTextToDbFormat(message);\n\n    const nodeMeta = this.getNodeMeta(uri, model);\n\n    // Find selected text\n    const editor = window.visibleTextEditors.find(\n      (editor) => editor.document.uri.fsPath === uri.fsPath,\n    );\n    const project = this.queryManifestService.getProjectByUri(uri);\n    const { value, ...rest } = extraMeta;\n    // update highlighted text as desc if conversation is created from desc field in doc editor\n    const highlight =\n      rest.field === \"description\"\n        ? (value as string)\n        : (range?.isSingleLine\n            ? editor?.document.lineAt(range?.start?.line ?? 0).text\n            : editor?.document.getText(range)) || \"\";\n\n    const meta = {\n      ...rest,\n      highlight,\n      source: \"extension\",\n      uniqueId: nodeMeta?.uniqueId,\n      filePath: path.relative(project?.projectRoot.fsPath || \"\", uri.fsPath),\n      resource_type: nodeMeta?.resource_type,\n      range: range\n        ? {\n            end: range.end,\n            start: range.start,\n          }\n        : undefined,\n    };\n    let shareName = \"Discussion on \";\n    if (nodeMeta?.uniqueId) {\n      shareName += nodeMeta.uniqueId;\n    } else if (model) {\n      shareName += model;\n    } else {\n      shareName = \"Untitled Discussion\";\n    }\n\n    // create share\n    const result = await this.conversationService.shareDbtDocs({\n      name: shareName, // `dbt docs discussion on ${nodeMeta?.uniqueId}`,\n      description: \"\",\n      uri,\n      model,\n    });\n    // Failing silently, because this case will happen if key is not added\n    // message for adding key will be already shown\n    if (!result) {\n      return;\n    }\n    const { shareId, shareUrl } = result;\n    this.dbtTerminal.debug(\n      \"ConversationProvider:createConversation\",\n      \"created conversation, adding conversation to group\",\n      shareId,\n      shareUrl,\n    );\n\n    // create conversation group\n    const addReplyResult =\n      await this.conversationService.createConversationGroup(shareId, {\n        message: convertedMessage,\n        meta,\n      });\n\n    if (!addReplyResult) {\n      throw new Error(\"Unable to create group\");\n    }\n\n    this.dbtTerminal.debug(\n      \"ConversationProvider\",\n      \"added conversation to created conversation group\",\n      addReplyResult,\n    );\n\n    return {\n      conversation_id: addReplyResult.conversation_id,\n      shareId,\n      conversation_group_id: addReplyResult.conversation_group_id,\n      meta,\n    };\n  }\n\n  async createConversation(\n    reply: CommentReply,\n    extraMeta: Record<string, unknown> = {},\n    source: \"vscode\" | \"documentation-editor\" = \"vscode\",\n  ) {\n    try {\n      this.dbtTerminal.debug(\n        \"ConversationProvider:createConversation\",\n        \"creating conversation\",\n        reply,\n      );\n      const thread = reply.thread as ConversationCommentThread;\n      thread.state = CommentThreadState.Unresolved;\n      this.addComment(reply);\n      thread.label = \"Pending\";\n\n      const result = await this.saveConversation(\n        reply.text,\n        thread.uri,\n        extraMeta,\n        thread.range,\n        source,\n      );\n\n      if (!result) {\n        return;\n      }\n      const { conversation_id, shareId, conversation_group_id, meta } = result;\n\n      (thread.comments[0] as ConversationComment).conversation_id =\n        conversation_id;\n      thread.share_id = shareId;\n      thread.conversation_group_id = conversation_group_id;\n      thread.meta = meta;\n\n      this._threads[shareId] = {\n        ...this._threads[shareId],\n        [thread.conversation_group_id]: thread,\n      };\n      thread.label = \"Discussion\";\n      this.addContextValue(thread);\n    } catch (error) {\n      this.dbtTerminal.error(\n        \"ConversationProvider:createConversation\",\n        \"unable to create conversation\",\n        error,\n      );\n      // If share cannot be created, delete the thread\n      reply.thread.dispose();\n      window.showErrorMessage(\n        extendErrorWithSupportLinks(\n          `Unable to save your comment. ${(error as Error).message}`,\n        ),\n      );\n    } finally {\n      if (!this.isPolling) {\n        this.setupPolling();\n      }\n    }\n  }\n\n  async replyToConversation(reply: CommentReply) {\n    this.telemetry.sendTelemetryEvent(\"dbtCollaboration:reply\", {\n      source: \"vscode\",\n    });\n\n    const thread = reply.thread as ConversationCommentThread;\n    try {\n      if (!thread.share_id) {\n        throw new Error(\"Unable to find conversation. Missing share id\");\n      }\n\n      this.dbtTerminal.debug(\n        \"ConversationProvider:replyToConversation\",\n        \"replying to conversation\",\n        reply,\n      );\n      this.addComment(reply);\n\n      if (!thread.conversation_group_id) {\n        if (!thread.share_id) {\n          throw new Error(\n            \"Unable to find conversation. Missing conversation group id\",\n          );\n        }\n        return;\n      }\n\n      await this.conversationService.addConversationToGroup(\n        thread.share_id,\n        thread.conversation_group_id,\n        this.convertTextToDbFormat(reply.text),\n      );\n    } catch (error) {\n      this.dbtTerminal.error(\n        \"ConversationProvider:replyToConversation\",\n        \"unable to reply conversation\",\n        error,\n      );\n      window.showErrorMessage(\n        extendErrorWithSupportLinks(\n          `Unable to save your reply. ${(error as Error).message}`,\n        ),\n      );\n    }\n    this.addContextValue(thread);\n  }\n\n  async resolveConversation(commentThread: ConversationCommentThread) {\n    try {\n      this.telemetry.sendTelemetryEvent(\"dbtCollaboration:resolve\", {\n        source: \"vscode\",\n      });\n      if (!commentThread.share_id) {\n        throw new Error(\"Unable to find conversation. Missing share id\");\n      }\n      this.dbtTerminal.debug(\n        \"ConversationProvider:resolveConversation\",\n        `resolving conversation: ${commentThread.conversation_group_id} in share: ${commentThread.share_id}`,\n      );\n      const result = await this.conversationService.resolveConversation(\n        commentThread.share_id,\n        commentThread.conversation_group_id,\n      );\n      this.dbtTerminal.debug(\n        \"ConversationProvider:resolveConversation\",\n        `resolved conversation: ${commentThread.conversation_group_id} in share: ${commentThread.share_id}`,\n        result,\n      );\n\n      commentThread.dispose();\n    } catch (error) {\n      this.dbtTerminal.error(\n        \"ConversationProvider:resolveConversation\",\n        \"unable to resolve conversation\",\n        error,\n      );\n      window.showErrorMessage(\n        extendErrorWithSupportLinks(\n          `Unable to resolve comment. ${(error as Error).message}`,\n        ),\n      );\n    }\n  }\n\n  dispose() {\n    if (this.timer) {\n      clearTimeout(this.timer);\n      this.timer = undefined;\n    }\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/comment_provider/index.ts",
    "content": "import { Disposable } from \"vscode\";\nimport { ConversationProvider } from \"./conversationProvider\";\n\nexport class CommentProviders implements Disposable {\n  private disposables: Disposable[] = [];\n  constructor(private conversationProvider: ConversationProvider) {\n    this.disposables.push(this.conversationProvider);\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/content_provider/index.ts",
    "content": "import { Disposable, workspace } from \"vscode\";\nimport { SqlPreviewContentProvider } from \"./sqlPreviewContentProvider\";\n\nexport class ContentProviders implements Disposable {\n  private disposables: Disposable[] = [];\n\n  constructor(private sqlPreviewContentProvider: SqlPreviewContentProvider) {\n    this.disposables.push(\n      workspace.registerTextDocumentContentProvider(\n        SqlPreviewContentProvider.SCHEME,\n        this.sqlPreviewContentProvider,\n      ),\n    );\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/content_provider/sqlPreviewContentProvider.ts",
    "content": "import { readFileSync } from \"fs\";\nimport {\n  Disposable,\n  Event,\n  EventEmitter,\n  ProgressLocation,\n  TextDocumentChangeEvent,\n  TextDocumentContentProvider,\n  Uri,\n  window,\n  workspace,\n} from \"vscode\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { TelemetryService } from \"../telemetry\";\nimport path = require(\"path\");\n\nexport class SqlPreviewContentProvider\n  implements TextDocumentContentProvider, Disposable\n{\n  static readonly SCHEME = \"query-preview\";\n\n  private _onDidChange = new EventEmitter<Uri>();\n  private compilationDocs = new Map<string, Uri>();\n  private subscriptions: Disposable[] = [];\n  private debounceTimers: Map<string, NodeJS.Timeout> = new Map();\n\n  constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    private telemetry: TelemetryService,\n  ) {\n    // Register a single global listener for all document changes\n    this.subscriptions.push(\n      workspace.onDidChangeTextDocument((e: TextDocumentChangeEvent) => {\n        // Check if this document has an associated preview\n        const fileUriString = e.document.uri.toString();\n        for (const [\n          previewUriString,\n          previewUri,\n        ] of this.compilationDocs.entries()) {\n          const actualFileUri = previewUri.with({ scheme: \"file\" });\n          if (actualFileUri.toString() === fileUriString) {\n            // Debounce the update\n            const existingTimer = this.debounceTimers.get(previewUriString);\n            if (existingTimer) {\n              clearTimeout(existingTimer);\n            }\n            const timer = setTimeout(() => {\n              this._onDidChange.fire(previewUri);\n              this.debounceTimers.delete(previewUriString);\n            }, 500);\n            this.debounceTimers.set(previewUriString, timer);\n            break;\n          }\n        }\n      }),\n    );\n\n    // Clean up when editors are closed, not when text documents are closed\n    // This prevents premature cleanup during document lifecycle events\n    this.subscriptions.push(\n      window.onDidChangeVisibleTextEditors(() => {\n        // Get all visible preview document URIs\n        const visiblePreviewUris = new Set(\n          window.visibleTextEditors\n            .filter(\n              (editor) =>\n                editor.document.uri.scheme === SqlPreviewContentProvider.SCHEME,\n            )\n            .map((editor) => editor.document.uri.toString()),\n        );\n\n        // Remove documents that are no longer visible\n        for (const [uriString] of this.compilationDocs.entries()) {\n          if (!visiblePreviewUris.has(uriString)) {\n            this.compilationDocs.delete(uriString);\n            const timer = this.debounceTimers.get(uriString);\n            if (timer) {\n              clearTimeout(timer);\n              this.debounceTimers.delete(uriString);\n            }\n          }\n        }\n      }),\n    );\n  }\n\n  dispose(): void {\n    this._onDidChange.dispose();\n    for (const subscription of this.subscriptions) {\n      subscription.dispose();\n    }\n    for (const timer of this.debounceTimers.values()) {\n      clearTimeout(timer);\n    }\n    this.debounceTimers.clear();\n  }\n\n  get onDidChange(): Event<Uri> {\n    return this._onDidChange.event;\n  }\n\n  provideTextDocumentContent(uri: Uri): string | Thenable<string> {\n    const uriString = uri.toString();\n    // Track this preview document for change detection\n    this.compilationDocs.set(uriString, uri);\n    return window.withProgress(\n      {\n        location: ProgressLocation.Notification,\n        title: \"Compiling dbt model...\",\n        cancellable: false,\n      },\n      async () => await this.requestCompilation(uri),\n    );\n  }\n\n  private async requestCompilation(uri: Uri) {\n    try {\n      const fsPath = decodeURI(uri.fsPath);\n      const modelName = path.basename(fsPath, \".sql\");\n\n      // Read from the active document if available, otherwise fall back to file\n      const actualFileUri = uri.with({ scheme: \"file\" });\n      const document = workspace.textDocuments.find(\n        (doc) => doc.uri.toString() === actualFileUri.toString(),\n      );\n      const query = document\n        ? document.getText()\n        : readFileSync(fsPath, \"utf8\");\n\n      const project = this.dbtProjectContainer.findDBTProject(Uri.file(fsPath));\n      if (project === undefined) {\n        this.telemetry.sendTelemetryError(\"sqlPreviewNotLoadingError\");\n        return \"Still loading dbt project, please try again later...\";\n      }\n      this.telemetry.sendTelemetryEvent(\"requestCompilation\");\n      await project.refreshProjectConfig();\n      return await project.unsafeCompileQuery(query, modelName);\n    } catch (error: any) {\n      const errorMessage = (error as Error).message;\n      window.showErrorMessage(`Error while compiling: ${errorMessage}`);\n      return errorMessage;\n    }\n  }\n}\n"
  },
  {
    "path": "src/cte_profiler/cteProfilerDecorationProvider.ts",
    "content": "import { DBTTerminal } from \"@altimateai/dbt-integration\";\nimport { inject } from \"inversify\";\nimport {\n  DecorationOptions,\n  Disposable,\n  OverviewRulerLane,\n  Range,\n  TextEditor,\n  TextEditorDecorationType,\n  ThemeColor,\n  Uri,\n  window,\n} from \"vscode\";\nimport { CteProfilerService } from \"./cteProfilerService\";\nimport { CteProfileEntry } from \"./cteProfilerTypes\";\n\nexport class CteProfilerDecorationProvider implements Disposable {\n  private disposables: Disposable[] = [];\n  private visible = true;\n\n  private readonly hotDecorationType: TextEditorDecorationType;\n  private readonly warmDecorationType: TextEditorDecorationType;\n  private readonly coolDecorationType: TextEditorDecorationType;\n\n  constructor(\n    private cteProfilerService: CteProfilerService,\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n  ) {\n    this.hotDecorationType = window.createTextEditorDecorationType({\n      gutterIconPath: Uri.file(\n        __dirname + \"/../../media/images/profiler-hot.svg\",\n      ),\n      gutterIconSize: \"contain\",\n      after: {\n        margin: \"0 0 0 8px\",\n        textDecoration: \"none\",\n      },\n      overviewRulerColor: new ThemeColor(\"editorError.foreground\"),\n      overviewRulerLane: OverviewRulerLane.Right,\n    });\n\n    this.warmDecorationType = window.createTextEditorDecorationType({\n      gutterIconPath: Uri.file(\n        __dirname + \"/../../media/images/profiler-warm.svg\",\n      ),\n      gutterIconSize: \"contain\",\n      after: {\n        margin: \"0 0 0 8px\",\n        textDecoration: \"none\",\n      },\n      overviewRulerColor: new ThemeColor(\"editorWarning.foreground\"),\n      overviewRulerLane: OverviewRulerLane.Right,\n    });\n\n    this.coolDecorationType = window.createTextEditorDecorationType({\n      after: {\n        margin: \"0 0 0 8px\",\n        textDecoration: \"none\",\n      },\n    });\n\n    this.disposables.push(\n      this.cteProfilerService.onResultChanged(() => {\n        window.visibleTextEditors.forEach((editor) => {\n          this.updateDecorations(editor);\n        });\n      }),\n      window.onDidChangeActiveTextEditor((editor) => {\n        if (editor) {\n          this.updateDecorations(editor);\n        }\n      }),\n    );\n  }\n\n  dispose() {\n    this.hotDecorationType.dispose();\n    this.warmDecorationType.dispose();\n    this.coolDecorationType.dispose();\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n\n  toggle(): void {\n    this.visible = !this.visible;\n    window.visibleTextEditors.forEach((editor) => {\n      this.updateDecorations(editor);\n    });\n  }\n\n  private updateDecorations(editor: TextEditor): void {\n    const result = this.cteProfilerService.getResult(\n      editor.document.uri.toString(),\n    );\n\n    if (!result || !this.visible) {\n      editor.setDecorations(this.hotDecorationType, []);\n      editor.setDecorations(this.warmDecorationType, []);\n      editor.setDecorations(this.coolDecorationType, []);\n      return;\n    }\n\n    const hot: DecorationOptions[] = [];\n    const warm: DecorationOptions[] = [];\n    const cool: DecorationOptions[] = [];\n\n    for (const cte of result.ctes) {\n      const line = cte.line;\n      // Line numbers are captured at profile time; the document may have been\n      // edited since, so skip entries that no longer point at a valid line.\n      if (line < 0 || line >= editor.document.lineCount) {\n        continue;\n      }\n      const lineLength = editor.document.lineAt(line).text.length;\n      const range = new Range(line, lineLength, line, lineLength);\n\n      const decoration: DecorationOptions = {\n        range,\n        renderOptions: {\n          after: {\n            contentText: formatProfileText(cte.marginalTimeMs, cte.rowCount),\n            color: new ThemeColor(tierToThemeColor(cte.tier)),\n          },\n        },\n      };\n\n      if (cte.tier === \"hot\") {\n        hot.push(decoration);\n      } else if (cte.tier === \"warm\") {\n        warm.push(decoration);\n      } else {\n        cool.push(decoration);\n      }\n    }\n\n    // Add EOF summary on the last content line of the document.\n    //\n    // Status determines what (if anything) we render:\n    //   • complete → \"Total: <time> · <rows> rows\" — accurate model totals\n    //   • partial  → \"Partial: <time> · <rows> rows (<done>/<total> CTEs)\"\n    //                — values reflect only the last completed CTE; the count\n    //                  suffix makes clear the run was cut short\n    //   • error    → omit; window.showErrorMessage already surfaces the failure\n    if (\n      result.ctes.length > 0 &&\n      (result.status === \"complete\" || result.status === \"partial\")\n    ) {\n      const totalLine = editor.document.lineCount - 1;\n      // Skip the summary if a per-CTE decoration already lives on the same\n      // line — visual smear from two `after` decorations on one line is worse\n      // than dropping the summary (edge case: in-progress SQL where the last\n      // CTE happens to end on the document's final line).\n      const cteLineCollision = result.ctes.some(\n        (cte) => cte.line === totalLine,\n      );\n      if (totalLine >= 0 && !cteLineCollision) {\n        const totalLineLength = editor.document.lineAt(totalLine).text.length;\n        const summaryText =\n          result.status === \"complete\"\n            ? `  ⏱ Total: ${formatTime(result.totalTimeMs)} · ${formatRows(result.totalRows)} rows`\n            : `  ⏱ Partial: ${formatTime(result.totalTimeMs)} · ${formatRows(result.totalRows)} rows (${result.ctes.length}/${result.totalCount} CTEs)`;\n        const summaryDecoration: DecorationOptions = {\n          range: new Range(\n            totalLine,\n            totalLineLength,\n            totalLine,\n            totalLineLength,\n          ),\n          renderOptions: {\n            after: {\n              contentText: summaryText,\n              color: new ThemeColor(\"editorCodeLens.foreground\"),\n              fontStyle: \"italic\",\n            },\n          },\n        };\n        cool.push(summaryDecoration);\n      }\n    }\n\n    editor.setDecorations(this.hotDecorationType, hot);\n    editor.setDecorations(this.warmDecorationType, warm);\n    editor.setDecorations(this.coolDecorationType, cool);\n\n    this.dbtTerminal.debug(\n      \"CteProfiler\",\n      `Updated decorations: ${hot.length} hot, ${warm.length} warm, ${cool.length} cool`,\n    );\n  }\n}\n\nfunction formatProfileText(timeMs: number, rows: number): string {\n  return `  ⏱ ${formatTime(timeMs)} · ${formatRows(rows)} rows`;\n}\n\nfunction formatTime(timeMs: number): string {\n  if (timeMs >= 1000) {\n    return `${(timeMs / 1000).toFixed(1)}s`;\n  }\n  return `${timeMs}ms`;\n}\n\nfunction formatRows(rows: number): string {\n  if (rows >= 1_000_000) {\n    return `${(rows / 1_000_000).toFixed(1)}M`;\n  }\n  if (rows >= 1_000) {\n    return `${(rows / 1_000).toFixed(1)}k`;\n  }\n  return `${rows}`;\n}\n\nfunction tierToThemeColor(tier: CteProfileEntry[\"tier\"]): string {\n  switch (tier) {\n    case \"hot\":\n      return \"editorError.foreground\";\n    case \"warm\":\n      return \"editorWarning.foreground\";\n    default:\n      return \"editorCodeLens.foreground\";\n  }\n}\n"
  },
  {
    "path": "src/cte_profiler/cteProfilerService.ts",
    "content": "import { DBTTerminal } from \"@altimateai/dbt-integration\";\nimport { inject, injectable } from \"inversify\";\nimport {\n  CancellationTokenSource,\n  Disposable,\n  Event,\n  EventEmitter,\n  TextDocument,\n  Uri,\n  window,\n} from \"vscode\";\nimport { CteInfo } from \"../code_lens_provider/cteCodeLensProvider\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { CteProfileEntry, CteProfileResult } from \"./cteProfilerTypes\";\n\n@injectable()\nexport class CteProfilerService implements Disposable {\n  private results: Map<string, CteProfileResult> = new Map();\n  private cancellationTokenSource: CancellationTokenSource | undefined;\n\n  private _onResultChanged = new EventEmitter<CteProfileResult | undefined>();\n  readonly onResultChanged: Event<CteProfileResult | undefined> =\n    this._onResultChanged.event;\n\n  private disposables: Disposable[] = [this._onResultChanged];\n\n  constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n  ) {}\n\n  dispose() {\n    this.cancellationTokenSource?.dispose();\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n\n  getResult(uri: string): CteProfileResult | undefined {\n    return this.results.get(uri);\n  }\n\n  get isRunning(): boolean {\n    return this.cancellationTokenSource !== undefined;\n  }\n\n  async profileModel(\n    uri: Uri,\n    document: TextDocument,\n    ctes: CteInfo[],\n  ): Promise<void> {\n    if (this.cancellationTokenSource) {\n      window.showWarningMessage(\n        \"A CTE profiling run is already in progress. Cancel it first.\",\n      );\n      return;\n    }\n\n    if (ctes.length === 0) {\n      window.showInformationMessage(\"No CTEs found in this model to profile.\");\n      return;\n    }\n\n    const project = this.dbtProjectContainer.findDBTProject(uri);\n    if (!project) {\n      window.showErrorMessage(\"Could not find dbt project for this file.\");\n      return;\n    }\n\n    const modelName = this.extractModelName(uri);\n    this.cancellationTokenSource = new CancellationTokenSource();\n    const token = this.cancellationTokenSource.token;\n\n    const result: CteProfileResult = {\n      uri: uri.toString(),\n      modelName,\n      status: \"running\",\n      totalTimeMs: 0,\n      totalRows: 0,\n      totalCount: ctes.length,\n      ctes: [],\n      timestamp: Date.now(),\n    };\n\n    this.results.set(uri.toString(), result);\n    this._onResultChanged.fire(result);\n\n    this.dbtTerminal.debug(\n      \"CteProfiler\",\n      `Starting profiling for ${modelName} with ${ctes.length} CTEs`,\n    );\n\n    try {\n      const text = document.getText();\n      const cteEntries: CteProfileEntry[] = [];\n      let previousCumulativeTime = 0;\n\n      for (let i = 0; i < ctes.length; i++) {\n        // Cancellation is intentionally checked between CTEs only — we cannot\n        // abort a query that's already in flight inside\n        // `immediatelyExecuteSQLWithLimit()`, which is a shared helper without\n        // a `CancellationToken`. Mid-query abort is tracked as a follow-up\n        // once that helper grows cancellation support across all dbt\n        // integrations (core/cloud/fusion/core-command + Python bridge).\n        if (token.isCancellationRequested) {\n          this.dbtTerminal.debug(\n            \"CteProfiler\",\n            `Profiling cancelled at CTE ${i}/${ctes.length}`,\n          );\n          result.status = \"partial\";\n          break;\n        }\n\n        const targetCte = ctes[i];\n\n        const query = this.buildCountQuery(text, ctes, targetCte, document);\n\n        if (!query) {\n          this.dbtTerminal.warn(\n            \"CteProfiler\",\n            `Failed to build query for CTE: ${targetCte.name}`,\n          );\n          continue;\n        }\n\n        this.dbtTerminal.debug(\n          \"CteProfiler\",\n          `Profiling CTE ${i + 1}/${ctes.length}: ${targetCte.name}`,\n        );\n\n        const start = Date.now();\n        const queryResult = await project.immediatelyExecuteSQLWithLimit(\n          query,\n          `cte_profiler_${targetCte.name}`,\n          1,\n        );\n        const elapsed = Date.now() - start;\n\n        const rowCount = this.extractRowCount(queryResult.data);\n        const marginalTime = Math.max(0, elapsed - previousCumulativeTime);\n        previousCumulativeTime = elapsed;\n\n        cteEntries.push({\n          name: targetCte.name,\n          line: targetCte.range.start.line,\n          queryTimeMs: elapsed,\n          marginalTimeMs: marginalTime,\n          rowCount,\n          tier: \"cool\", // classified after all CTEs complete\n        });\n\n        this.dbtTerminal.debug(\n          \"CteProfiler\",\n          `CTE ${targetCte.name}: ${elapsed}ms cumulative, ${marginalTime}ms marginal, ${rowCount} rows`,\n        );\n\n        // Update result with partial data so decorations refresh live\n        result.ctes = this.classifyTiers(cteEntries);\n        result.totalTimeMs = elapsed;\n        result.totalRows = rowCount;\n        this._onResultChanged.fire(result);\n      }\n\n      // Final classification and status\n      result.ctes = this.classifyTiers(cteEntries);\n      if (result.status === \"running\") {\n        result.status = \"complete\";\n      }\n      result.totalTimeMs =\n        cteEntries.length > 0\n          ? cteEntries[cteEntries.length - 1].queryTimeMs\n          : 0;\n      result.totalRows =\n        cteEntries.length > 0 ? cteEntries[cteEntries.length - 1].rowCount : 0;\n\n      this.results.set(uri.toString(), result);\n      this._onResultChanged.fire(result);\n\n      this.dbtTerminal.debug(\n        \"CteProfiler\",\n        `Profiling ${result.status}: ${result.totalTimeMs}ms total, ${result.ctes.length} CTEs`,\n      );\n    } catch (error) {\n      this.dbtTerminal.error(\"CteProfiler\", \"Profiling failed\", error);\n      result.status = \"error\";\n      result.error = error instanceof Error ? error.message : \"Unknown error\";\n      this.results.set(uri.toString(), result);\n      this._onResultChanged.fire(result);\n      window.showErrorMessage(`CTE profiling failed: ${result.error}`);\n    } finally {\n      this.cancellationTokenSource?.dispose();\n      this.cancellationTokenSource = undefined;\n    }\n  }\n\n  cancel(): void {\n    if (this.cancellationTokenSource) {\n      this.cancellationTokenSource.cancel();\n      this.dbtTerminal.debug(\"CteProfiler\", \"Cancellation requested\");\n    }\n  }\n\n  clearResults(): void {\n    this.results.clear();\n    this._onResultChanged.fire(undefined);\n  }\n\n  private buildCountQuery(\n    text: string,\n    ctes: CteInfo[],\n    targetCte: CteInfo,\n    document: TextDocument,\n  ): string | undefined {\n    // Reuse exact pattern from runCteWithDependencies\n    const sameScopeCtesUpToTarget = ctes.filter(\n      (cte) =>\n        cte.withClauseStart === targetCte.withClauseStart &&\n        cte.index <= targetCte.index,\n    );\n\n    const cteDefinitions: string[] = [];\n\n    // Rebuild each CTE by slicing the raw source between the name position and\n    // the query body. This preserves column lists and any comments between\n    // the identifier and the AS keyword, matching what detectCtes() accepts.\n    for (const cte of sameScopeCtesUpToTarget) {\n      const headerStart = document.offsetAt(cte.range.start);\n      const queryBodyStart = document.offsetAt(cte.queryRange.start);\n      if (queryBodyStart <= headerStart) {\n        continue;\n      }\n      const headerWithOpenParen = text.substring(headerStart, queryBodyStart);\n      const cteQuery = document.getText(cte.queryRange);\n      cteDefinitions.push(`${headerWithOpenParen}\\n${cteQuery}\\n)`);\n    }\n\n    if (cteDefinitions.length === 0) {\n      return undefined;\n    }\n\n    // Include preamble (dbt configs, variables before WITH)\n    const preamble = text.substring(0, targetCte.withClauseStart).trim();\n    let query = \"\";\n    if (preamble) {\n      query += preamble + \"\\n\\n\";\n    }\n\n    query += \"WITH \";\n    query += cteDefinitions.join(\",\\n\");\n\n    const quotedName = this.quoteSqlIdentifier(\n      this.stripColumnList(targetCte.name),\n    );\n    query += `\\nSELECT COUNT(*) AS _profile_count FROM ${quotedName}`;\n\n    return query;\n  }\n\n  private stripColumnList(rawName: string): string {\n    // CteCodeLensProvider.name may include a trailing column list like\n    // \"my_cte (id, name)\". Strip it so the FROM clause references only the\n    // identifier.\n    return rawName.replace(/\\s*\\([^)]*\\)\\s*$/, \"\").trim();\n  }\n\n  private extractRowCount(data: Record<string, unknown>[]): number {\n    if (data.length === 0) {\n      return 0;\n    }\n    const count = data[0][\"_profile_count\"];\n    return typeof count === \"number\" ? count : Number(count) || 0;\n  }\n\n  private classifyTiers(entries: CteProfileEntry[]): CteProfileEntry[] {\n    if (entries.length === 0) {\n      return entries;\n    }\n\n    const maxMarginal = Math.max(...entries.map((e) => e.marginalTimeMs));\n    if (maxMarginal === 0) {\n      return entries.map((e) => ({ ...e, tier: \"cool\" as const }));\n    }\n\n    return entries.map((e) => {\n      const fraction = e.marginalTimeMs / maxMarginal;\n      let tier: \"hot\" | \"warm\" | \"cool\";\n      if (fraction >= 0.5) {\n        tier = \"hot\";\n      } else if (fraction >= 0.2) {\n        tier = \"warm\";\n      } else {\n        tier = \"cool\";\n      }\n      return { ...e, tier };\n    });\n  }\n\n  private quoteSqlIdentifier(identifier: string): string {\n    if (identifier.match(/^[\"'`\\[]/) || identifier.includes(\".\")) {\n      return identifier;\n    }\n    if (!identifier.match(/^[a-zA-Z_][a-zA-Z0-9_]*$/)) {\n      return `\"${identifier}\"`;\n    }\n    return identifier;\n  }\n\n  private extractModelName(uri: Uri): string {\n    const path = uri.fsPath;\n    const parts = path.split(/[/\\\\]/);\n    const fileName = parts[parts.length - 1];\n    return fileName.replace(/\\.sql$/i, \"\");\n  }\n}\n"
  },
  {
    "path": "src/cte_profiler/cteProfilerTypes.ts",
    "content": "export interface CteProfileEntry {\n  name: string;\n  line: number;\n  queryTimeMs: number;\n  marginalTimeMs: number;\n  rowCount: number;\n  tier: \"hot\" | \"warm\" | \"cool\";\n}\n\nexport interface CteProfileResult {\n  uri: string;\n  modelName: string;\n  status: \"running\" | \"complete\" | \"partial\" | \"error\";\n  totalTimeMs: number;\n  totalRows: number;\n  // Number of CTEs the profile run was started with; lets the UI render an\n  // \"X/Y CTEs\" suffix for partial runs even after `ctes` only holds the\n  // entries that completed.\n  totalCount: number;\n  ctes: CteProfileEntry[];\n  timestamp: number;\n  error?: string;\n}\n"
  },
  {
    "path": "src/dbtPowerUserExtension.ts",
    "content": "import { NotebookProviders } from \"@lib\";\nimport { commands, Disposable, ExtensionContext, workspace } from \"vscode\";\nimport { AutocompletionProviders } from \"./autocompletion_provider\";\nimport { CodeLensProviders } from \"./code_lens_provider\";\nimport { VSCodeCommands } from \"./commands\";\nimport { CommentProviders } from \"./comment_provider\";\nimport { ContentProviders } from \"./content_provider\";\nimport { DBTProjectContainer } from \"./dbt_client/dbtProjectContainer\";\nimport { DefinitionProviders } from \"./definition_provider\";\nimport { DocumentFormattingEditProviders } from \"./document_formatting_edit_provider\";\nimport { HoverProviders } from \"./hover_provider\";\nimport { DbtPowerUserMcpServer } from \"./mcp\";\nimport { DbtPowerUserActionsCenter } from \"./quickpick\";\nimport { StatusBars } from \"./statusbar\";\nimport { TelemetryService } from \"./telemetry\";\nimport { TreeviewProviders } from \"./treeview_provider\";\nimport { ValidationProvider } from \"./validation_provider\";\nimport { WebviewViewProviders } from \"./webview_provider\";\n\nenum PromptAnswer {\n  YES = \"Yes\",\n  NO = \"No\",\n}\n\nexport class DBTPowerUserExtension implements Disposable {\n  static DBT_SQL_SELECTOR = [\n    { language: \"jinja-sql\", scheme: \"file\" },\n    { language: \"sql\", scheme: \"file\" },\n    { language: \"jinja-sql\", scheme: \"untitled\" },\n    { language: \"jinja-sql\", scheme: \"vscode-notebook-cell\" },\n  ];\n  static DBT_YAML_SELECTOR = [\n    { language: \"yaml\", scheme: \"file\" },\n    { language: \"jinja-yaml\", scheme: \"file\" },\n  ];\n  static DBT_YAML_SQL_SELECTOR = [\n    { language: \"jinja-sql\", scheme: \"file\" },\n    { language: \"sql\", scheme: \"file\" },\n    { language: \"yaml\", scheme: \"file\" },\n    { language: \"jinja-yaml\", scheme: \"file\" },\n  ];\n\n  private disposables: Disposable[] = [];\n\n  constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    private webviewViewProviders: WebviewViewProviders,\n    private autocompletionProviders: AutocompletionProviders,\n    private definitionProviders: DefinitionProviders,\n    private vscodeCommands: VSCodeCommands,\n    private treeviewProviders: TreeviewProviders,\n    private contentProviders: ContentProviders,\n    private codeLensProviders: CodeLensProviders,\n    private documentFormattingEditProviders: DocumentFormattingEditProviders,\n    private statusBars: StatusBars,\n    private puStatusBars: DbtPowerUserActionsCenter,\n    private telemetry: TelemetryService,\n    private hoverProviders: HoverProviders,\n    private validationProvider: ValidationProvider,\n    private commentProviders: CommentProviders,\n    private notebookProviders: NotebookProviders,\n    private mcpServer: DbtPowerUserMcpServer,\n  ) {\n    this.disposables.push(\n      this.dbtProjectContainer,\n      this.webviewViewProviders,\n      this.definitionProviders,\n      this.autocompletionProviders,\n      this.treeviewProviders,\n      this.contentProviders,\n      this.codeLensProviders,\n      this.vscodeCommands,\n      this.documentFormattingEditProviders,\n      this.statusBars,\n      this.puStatusBars,\n      this.telemetry,\n      this.hoverProviders,\n      this.validationProvider,\n      this.commentProviders,\n      this.notebookProviders,\n      this.mcpServer,\n    );\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n\n  async activate(context: ExtensionContext): Promise<void> {\n    try {\n      await this.mcpServer.updateMcpExtensionApi();\n      this.dbtProjectContainer.setContext(context);\n      this.dbtProjectContainer.initializeWalkthrough();\n      await this.dbtProjectContainer.detectDBT();\n      await this.dbtProjectContainer.initializeDBTProjects();\n      await this.statusBars.initialize();\n      // Ask to reload the window if the dbt integration changes\n      const dbtIntegration = workspace\n        .getConfiguration(\"dbt\")\n        .get<string>(\"dbtIntegration\", \"core\");\n      workspace.onDidChangeConfiguration((e) => {\n        if (!e.affectsConfiguration(\"dbt\")) {\n          return;\n        }\n        const newDbtIntegration = workspace\n          .getConfiguration(\"dbt\")\n          .get<string>(\"dbtIntegration\", \"core\");\n        if (\n          dbtIntegration !== newDbtIntegration &&\n          [\"core\", \"cloud\", \"corecommand\", \"fusion\"].includes(newDbtIntegration)\n        ) {\n          commands.executeCommand(\"workbench.action.reloadWindow\");\n        }\n      });\n    } catch (error) {\n      this.telemetry.sendTelemetryError(\"extensionActivationError\", error);\n    }\n  }\n}\n"
  },
  {
    "path": "src/dbt_client/datapilot.ts",
    "content": "import {\n  CommandProcessExecutionFactory,\n  DBTConfiguration,\n  DBTTerminal,\n} from \"@altimateai/dbt-integration\";\nimport { inject } from \"inversify\";\nimport { Uri, workspace } from \"vscode\";\nimport { PythonEnvironment } from \"./pythonEnvironment\";\n\nexport class AltimateDatapilot {\n  private packageName = \"altimate-datapilot-cli\";\n  constructor(\n    @inject(PythonEnvironment)\n    private pythonEnvironment: PythonEnvironment,\n    private commandProcessExecutionFactory: CommandProcessExecutionFactory,\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n    @inject(\"DBTConfiguration\")\n    private dbtConfiguration: DBTConfiguration,\n  ) {}\n\n  private getWorkspaceFolder() {\n    const cwd = this.dbtConfiguration.getWorkingDirectory();\n    return cwd ? workspace.getWorkspaceFolder(Uri.file(cwd)) : undefined;\n  }\n\n  async checkIfAltimateDatapilotInstalled(): Promise<string> {\n    const process =\n      this.commandProcessExecutionFactory.createCommandProcessExecution({\n        command: this.pythonEnvironment.pythonPath,\n        args: [\"-c\", \"import datapilot;print(datapilot.__version__)\"],\n        cwd: this.dbtConfiguration.getWorkingDirectory(),\n        envVars: this.pythonEnvironment.getEnvironmentVariables(\n          this.getWorkspaceFolder(),\n        ),\n      });\n    const { stdout, stderr } = await process.complete();\n    if (stderr) {\n      this.dbtTerminal.debug(\n        \"AltimateDatapilot:checkIfAltimateDatapilotInstalled\",\n        \"Datapilot not installed\",\n        stderr,\n      );\n      return \"\";\n    }\n    return stdout.trim();\n  }\n\n  async installAltimateDatapilot(datapilotVersion: string) {\n    const { stderr, stdout } = await this.commandProcessExecutionFactory\n      .createCommandProcessExecution({\n        command: this.pythonEnvironment.pythonPath,\n        args: [\n          \"-m\",\n          \"pip\",\n          \"install\",\n          `${this.packageName}==${datapilotVersion}`,\n        ],\n        cwd: this.dbtConfiguration.getWorkingDirectory(),\n        envVars: this.pythonEnvironment.getEnvironmentVariables(\n          this.getWorkspaceFolder(),\n        ),\n      })\n      .completeWithTerminalOutput();\n    if (!stdout.includes(\"Successfully installed\") && stderr) {\n      throw new Error(stderr);\n    }\n  }\n}\n"
  },
  {
    "path": "src/dbt_client/dbtProject.ts",
    "content": "import { existsSync, writeFileSync } from \"fs\";\n\nimport {\n  Catalog,\n  CATALOG_FILE,\n  ColumnMetaData,\n  DataPilotHealtCheckParams,\n  DBColumn,\n  DBT_PROJECT_FILE,\n  DBTCommand,\n  DBTCommandExecution,\n  DBTCommandExecutionInfrastructure,\n  DBTCommandFactory,\n  DBTDiagnosticData,\n  DBTNode,\n  DBTProjectIntegration,\n  DBTProjectIntegrationAdapter,\n  DBTProjectIntegrationAdapterEvents,\n  DBTTerminal,\n  DeferConfig,\n  extractOutputColumns,\n  HealthcheckArgs,\n  isResourceHasDbColumns,\n  isResourceNode,\n  MANIFEST_FILE,\n  NoCredentialsError,\n  NodeMetaData,\n  ParsedManifest,\n  ProjectHealthcheck,\n  QueryExecution,\n  QueryExecutionResult,\n  RESOURCE_TYPE_MODEL,\n  RESOURCE_TYPE_SOURCE,\n  RunModelParams,\n  RunResultsEventData,\n  SourceNode,\n  Table,\n  validateSQL,\n} from \"@altimateai/dbt-integration\";\nimport { inject } from \"inversify\";\nimport * as path from \"path\";\nimport { PythonException } from \"python-bridge\";\nimport {\n  commands,\n  Diagnostic,\n  DiagnosticCollection,\n  DiagnosticSeverity,\n  Disposable,\n  Event,\n  EventEmitter,\n  languages,\n  ProgressLocation,\n  Range,\n  RelativePattern,\n  Uri,\n  ViewColumn,\n  window,\n  workspace,\n} from \"vscode\";\nimport { AltimateRequest, ModelNode } from \"../altimate\";\nimport { AltimateAuthService } from \"../services/altimateAuthService\";\nimport { RunHistoryService } from \"../services/runHistoryService\";\nimport { SharedStateService } from \"../services/sharedStateService\";\nimport { TelemetryService } from \"../telemetry\";\nimport { TelemetryEvents } from \"../telemetry/events\";\nimport {\n  extendErrorWithSupportLinks,\n  getColumnNameByCase,\n  getProjectRelativePath,\n  resolveSettingsVariables,\n} from \"../utils\";\nimport { ValidationProvider } from \"../validation_provider\";\nimport { DBTProjectLog } from \"./dbtProjectLog\";\nimport {\n  ManifestCacheChangedEvent,\n  ManifestCacheProjectAddedEvent,\n  RebuildManifestStatusChange,\n} from \"./event/manifestCacheChangedEvent\";\nimport { ProjectConfigChangedEvent } from \"./event/projectConfigChangedEvent\";\nimport { RunResultsEvent } from \"./event/runResultsEvent\";\nimport { PythonEnvironment } from \"./pythonEnvironment\";\n\ninterface FileNameTemplateMap {\n  [key: string]: string;\n}\n\ninterface JsonObj {\n  [key: string]: string | number | undefined;\n}\n\nexport class DBTProject implements Disposable {\n  private _manifestCacheEvent?: ManifestCacheProjectAddedEvent;\n  readonly projectRoot: Uri;\n  private dbtProjectIntegration: DBTProjectIntegrationAdapter;\n\n  private _onProjectConfigChanged =\n    new EventEmitter<ProjectConfigChangedEvent>();\n  public onProjectConfigChanged = this._onProjectConfigChanged.event;\n  private _onRunResults = new EventEmitter<RunResultsEvent>();\n  public onRunResults = this._onRunResults.event;\n  private _onSourceFileChanged = new EventEmitter<void>();\n  public onSourceFileChanged = this._onSourceFileChanged.event;\n  private dbtProjectLog?: DBTProjectLog;\n  public readonly projectHealth = languages.createDiagnosticCollection(\"dbt\");\n  public readonly pythonBridgeDiagnostics =\n    languages.createDiagnosticCollection(\"dbt-python-bridge\");\n  public readonly rebuildManifestDiagnostics =\n    languages.createDiagnosticCollection(\"dbt-rebuild-manifest\");\n  public readonly projectConfigDiagnostics =\n    languages.createDiagnosticCollection(\"dbt-project-config\");\n  private disposables: Disposable[] = [\n    this._onProjectConfigChanged,\n    this._onSourceFileChanged,\n    this.projectHealth,\n    this.pythonBridgeDiagnostics,\n    this.rebuildManifestDiagnostics,\n    this.projectConfigDiagnostics,\n  ];\n  private _onRebuildManifestStatusChange =\n    new EventEmitter<RebuildManifestStatusChange>();\n  readonly onRebuildManifestStatusChange =\n    this._onRebuildManifestStatusChange.event;\n\n  private dbSchemaCache: Record<string, ModelNode> = {};\n  private queues: Map<string, DBTCommandExecution[]> = new Map<\n    string,\n    DBTCommandExecution[]\n  >();\n  private queueStates: Map<string, boolean> = new Map<string, boolean>();\n\n  constructor(\n    @inject(PythonEnvironment)\n    private PythonEnvironment: PythonEnvironment,\n    @inject(\"Factory<DBTProjectLog>\")\n    private dbtProjectLogFactory: (\n      onProjectConfigChanged: Event<ProjectConfigChangedEvent>,\n    ) => DBTProjectLog,\n    private dbtCommandFactory: DBTCommandFactory,\n    private terminal: DBTTerminal,\n    private eventEmitterService: SharedStateService,\n    private telemetry: TelemetryService,\n    private executionInfrastructure: DBTCommandExecutionInfrastructure,\n    private dbtIntegrationAdapterFactory: (\n      projectRoot: string,\n      deferConfig: DeferConfig | undefined,\n    ) => DBTProjectIntegrationAdapter,\n    private altimate: AltimateRequest,\n    private validationProvider: ValidationProvider,\n    private altimateAuthService: AltimateAuthService,\n    private runHistoryService: RunHistoryService,\n    path: Uri,\n    _projectConfig: any,\n    private _onManifestChanged: EventEmitter<ManifestCacheChangedEvent>,\n  ) {\n    this.projectRoot = path;\n    try {\n      this.validationProvider.validateCredentialsSilently();\n    } catch (error) {\n      this.terminal.error(\n        \"validateCredentialsSilently\",\n        \"Credential validation failed\",\n        error,\n        false,\n      );\n    }\n\n    this.dbtProjectLog = this.dbtProjectLogFactory(this.onProjectConfigChanged);\n\n    // Check if dbt loom is installed for telemetry (only for core integration)\n    const dbtIntegrationMode = workspace\n      .getConfiguration(\"dbt\")\n      .get<string>(\"dbtIntegration\", \"core\");\n\n    if (dbtIntegrationMode === \"core\") {\n      this.isDbtLoomInstalled().then((isInstalled) => {\n        this.telemetry.setTelemetryCustomAttribute(\n          \"dbtLoomInstalled\",\n          `${isInstalled}`,\n        );\n      });\n    }\n\n    // Create the integration adapter which will handle the integration selection internally\n    this.dbtProjectIntegration = this.dbtIntegrationAdapterFactory(\n      this.projectRoot.fsPath,\n      this.retrieveDeferConfigFromSettings(),\n    );\n\n    // Set up Node.js watcher events to emit VSCode events directly\n    this.dbtProjectIntegration.on(\n      DBTProjectIntegrationAdapterEvents.SOURCE_FILE_CHANGED,\n      () => {\n        this.terminal.debug(\n          \"DBTProject\",\n          \"Received sourceFileChanged event from Node.js file watchers\",\n        );\n        this._onSourceFileChanged.fire();\n      },\n    );\n\n    this.dbtProjectIntegration.on(\n      DBTProjectIntegrationAdapterEvents.PROJECT_CONFIG_CHANGED,\n      () => {\n        this.terminal.debug(\n          \"DBTProject\",\n          \"Received projectConfigChanged event from Node.js project config watcher\",\n        );\n        const event = new ProjectConfigChangedEvent(this);\n        this.stampCloudVariantOnTelemetry();\n        this._onProjectConfigChanged.fire(event);\n      },\n    );\n\n    this.dbtProjectIntegration.on(\n      DBTProjectIntegrationAdapterEvents.REBUILD_MANIFEST_STATUS_CHANGE,\n      (status: { inProgress: boolean }) => {\n        this.terminal.debug(\n          \"DBTProject\",\n          `Received rebuildManifestStatusChange event: inProgress=${status.inProgress}`,\n        );\n        const event: RebuildManifestStatusChange = {\n          project: this,\n          inProgress: status.inProgress,\n        };\n        this._onRebuildManifestStatusChange.fire(event);\n      },\n    );\n\n    // Handle manifestCreated events from dbtIntegrationAdapter\n    this.dbtProjectIntegration.on(\n      DBTProjectIntegrationAdapterEvents.MANIFEST_PARSED,\n      (parsedManifest: ParsedManifest) => {\n        this.terminal.debug(\n          \"DBTProject\",\n          \"Received manifestParsed event from dbtIntegrationAdapter\",\n        );\n        const manifestCacheEvent: ManifestCacheProjectAddedEvent = {\n          project: this,\n          nodeMetaMap: parsedManifest.nodeMetaMap,\n          macroMetaMap: parsedManifest.macroMetaMap,\n          metricMetaMap: parsedManifest.metricMetaMap,\n          sourceMetaMap: parsedManifest.sourceMetaMap,\n          graphMetaMap: parsedManifest.graphMetaMap,\n          testMetaMap: parsedManifest.testMetaMap,\n          docMetaMap: parsedManifest.docMetaMap,\n          exposureMetaMap: parsedManifest.exposureMetaMap,\n          functionMetaMap: parsedManifest.functionMetaMap,\n          modelDepthMap: parsedManifest.modelDepthMap,\n        };\n        this._manifestCacheEvent = manifestCacheEvent;\n        this._onManifestChanged.fire({ added: [manifestCacheEvent] });\n      },\n    );\n\n    // Handle runResultsCreated events from dbtIntegrationAdapter\n    this.dbtProjectIntegration.on(\n      DBTProjectIntegrationAdapterEvents.RUN_RESULTS_PARSED,\n      (eventData: RunResultsEventData) => {\n        this.terminal.debug(\n          \"DBTProject\",\n          \"Received runResultsParsed event from dbtIntegrationAdapter\",\n        );\n\n        this.runHistoryService.addEntry(eventData);\n\n        const uniqueIds = eventData.results.map((r) => r.uniqueId);\n        const runResultsEvent = new RunResultsEvent(this, uniqueIds);\n        this._onRunResults.fire(runResultsEvent);\n      },\n    );\n\n    // Handle diagnosticsChanged events from dbtIntegrationAdapter\n    this.dbtProjectIntegration.on(\n      DBTProjectIntegrationAdapterEvents.DIAGNOSTICS_CHANGED,\n      () => {\n        this.terminal.debug(\n          \"DBTProject\",\n          \"Received diagnosticsChanged event from dbtIntegrationAdapter\",\n        );\n        this.updateDiagnosticsInProblemsPanel();\n      },\n    );\n\n    this.disposables.push(\n      this.dbtProjectIntegration,\n      this._onManifestChanged.event((event) => {\n        const addedEvent = event.added?.find(\n          (e) => e.project.projectRoot === this.projectRoot,\n        );\n        if (addedEvent) {\n          this._manifestCacheEvent = addedEvent;\n        }\n      }),\n      this.onRunResults((event) => {\n        this.invalidateCacheUsingUniqueIds(event.uniqueIds || []);\n      }),\n    );\n\n    // Initialize Python environment and set up change listener\n    this.initializePythonEnvironmentListener();\n\n    this.terminal.debug(\n      \"DbtProject\",\n      `Created ${dbtIntegrationMode} dbt project ${this.getProjectName()} at ${\n        this.projectRoot\n      }`,\n    );\n  }\n\n  private initializePythonEnvironmentListener(): void {\n    this.PythonEnvironment.initialize()\n      .then(() => {\n        this.disposables.push(\n          this.PythonEnvironment.onPythonEnvironmentChanged(() =>\n            this.onPythonEnvironmentChanged(),\n          ),\n        );\n      })\n      .catch((err) => {\n        this.terminal.error(\n          \"dbtProject:initializePythonEnvironmentListener\",\n          \"Failed to initialize Python environment listener\",\n          err,\n        );\n      });\n  }\n\n  private async isDbtLoomInstalled(): Promise<boolean> {\n    const dbtLoomThread = this.executionInfrastructure.createPythonBridge(\n      this.projectRoot.fsPath,\n    );\n    try {\n      await dbtLoomThread.ex`from dbt_loom import *`;\n      return true;\n    } catch (error) {\n      return false;\n    } finally {\n      await this.executionInfrastructure.closePythonBridge(dbtLoomThread);\n    }\n  }\n\n  private stampCloudVariantOnTelemetry(): void {\n    const info = this.dbtProjectIntegration.getCloudVariantInfo();\n    this.telemetry.setTelemetryCustomAttribute(\n      \"dbtCloudVariant\",\n      info?.variant ?? \"\",\n    );\n    this.telemetry.setTelemetryCustomAttribute(\n      \"dbtCloudRawVersion\",\n      info?.rawDbtVersion ?? \"\",\n    );\n  }\n\n  private invalidateCacheUsingUniqueIds(uniqueIds: string[]) {\n    for (const uniqueId of uniqueIds) {\n      if (uniqueId in this.dbSchemaCache) {\n        delete this.dbSchemaCache[uniqueId];\n      }\n    }\n  }\n\n  getProjectName() {\n    return this.dbtProjectIntegration.getProjectName();\n  }\n\n  getProjectRoot() {\n    return this.projectRoot.fsPath;\n  }\n\n  getSelectedTarget() {\n    return this.dbtProjectIntegration.getSelectedTarget();\n  }\n\n  getTargetNames() {\n    return this.dbtProjectIntegration.getTargetNames();\n  }\n\n  async setSelectedTarget(targetName: string) {\n    await window.withProgress(\n      {\n        location: ProgressLocation.Notification,\n        title: \"Changing target...\",\n        cancellable: false,\n      },\n      () => this.dbtProjectIntegration.setSelectedTarget(targetName),\n    );\n  }\n\n  getDBTProjectFilePath() {\n    return path.join(this.projectRoot.fsPath, DBT_PROJECT_FILE);\n  }\n\n  getTargetPath() {\n    return this.dbtProjectIntegration.getTargetPath();\n  }\n\n  getPackageInstallPath() {\n    return this.dbtProjectIntegration.getPackageInstallPath();\n  }\n\n  getModelPaths() {\n    return this.dbtProjectIntegration.getModelPaths();\n  }\n\n  getSeedPaths() {\n    return this.dbtProjectIntegration.getSeedPaths();\n  }\n\n  getMacroPaths() {\n    return this.dbtProjectIntegration.getMacroPaths();\n  }\n\n  getManifestPath() {\n    const targetPath = this.getTargetPath();\n    if (!targetPath) {\n      return;\n    }\n    return path.join(targetPath, MANIFEST_FILE);\n  }\n\n  getCatalogPath() {\n    const targetPath = this.getTargetPath();\n    if (!targetPath) {\n      return;\n    }\n    return path.join(targetPath, CATALOG_FILE);\n  }\n\n  getPythonBridgeStatus() {\n    return this.dbtProjectIntegration.getPythonBridgeStatus();\n  }\n\n  getAllDiagnostic(): Diagnostic[] {\n    const projectURI = Uri.file(\n      path.join(this.projectRoot.fsPath, DBT_PROJECT_FILE),\n    );\n    const integrationDiagnostics =\n      this.getCurrentProjectIntegration().getDiagnostics();\n\n    // Convert diagnostic data to VSCode Diagnostics\n    const convertedDiagnostics = [\n      ...integrationDiagnostics.pythonBridgeDiagnostics.map(\n        (data) =>\n          new Diagnostic(\n            new Range(\n              data.range?.startLine || 0,\n              data.range?.startColumn || 0,\n              data.range?.endLine || 999,\n              data.range?.endColumn || 999,\n            ),\n            data.message,\n            this.mapSeverityToVSCode(data.severity),\n          ),\n      ),\n      ...integrationDiagnostics.rebuildManifestDiagnostics.map(\n        (data) =>\n          new Diagnostic(\n            new Range(\n              data.range?.startLine || 0,\n              data.range?.startColumn || 0,\n              data.range?.endLine || 999,\n              data.range?.endColumn || 999,\n            ),\n            data.message,\n            this.mapSeverityToVSCode(data.severity),\n          ),\n      ),\n      ...(integrationDiagnostics.projectConfigDiagnostics || []).map(\n        (data) =>\n          new Diagnostic(\n            new Range(\n              data.range?.startLine || 0,\n              data.range?.startColumn || 0,\n              data.range?.endLine || 999,\n              data.range?.endColumn || 999,\n            ),\n            data.message,\n            this.mapSeverityToVSCode(data.severity),\n          ),\n      ),\n    ];\n\n    return [\n      ...convertedDiagnostics,\n      ...(this.projectHealth.get(projectURI) || []),\n    ];\n  }\n\n  private mapSeverityToVSCode(severity: string): DiagnosticSeverity {\n    switch (severity) {\n      case \"error\":\n        return DiagnosticSeverity.Error;\n      case \"warning\":\n        return DiagnosticSeverity.Warning;\n      case \"info\":\n        return DiagnosticSeverity.Information;\n      case \"hint\":\n        return DiagnosticSeverity.Hint;\n      default:\n        return DiagnosticSeverity.Error;\n    }\n  }\n\n  private convertDiagnosticDataToVSCode(data: DBTDiagnosticData): Diagnostic {\n    return new Diagnostic(\n      new Range(\n        data.range?.startLine || 0,\n        data.range?.startColumn || 0,\n        data.range?.endLine || 999,\n        data.range?.endColumn || 999,\n      ),\n      data.message,\n      this.mapSeverityToVSCode(data.severity),\n    );\n  }\n\n  updateDiagnosticsInProblemsPanel(): void {\n    const projectURI = Uri.file(\n      path.join(this.projectRoot.fsPath, DBT_PROJECT_FILE),\n    );\n    const integrationDiagnostics =\n      this.getCurrentProjectIntegration().getDiagnostics();\n\n    // Update each diagnostic collection separately\n    this.pythonBridgeDiagnostics.set(\n      projectURI,\n      integrationDiagnostics.pythonBridgeDiagnostics.map((data) =>\n        this.convertDiagnosticDataToVSCode(data),\n      ),\n    );\n\n    this.rebuildManifestDiagnostics.set(\n      projectURI,\n      integrationDiagnostics.rebuildManifestDiagnostics.map((data) =>\n        this.convertDiagnosticDataToVSCode(data),\n      ),\n    );\n\n    this.projectConfigDiagnostics.set(\n      projectURI,\n      integrationDiagnostics.projectConfigDiagnostics.map((data) =>\n        this.convertDiagnosticDataToVSCode(data),\n      ),\n    );\n  }\n\n  async performDatapilotHealthcheck(args: DataPilotHealtCheckParams) {\n    const manifestPath = this.getManifestPath();\n    if (!manifestPath) {\n      throw new Error(\n        `Unable to find manifest path for project ${this.getProjectName()}`,\n      );\n    }\n    const healthcheckArgs: HealthcheckArgs = { manifestPath };\n    if (args.configType === \"Manual\") {\n      healthcheckArgs.configPath = args.configPath;\n    } else {\n      if (args.configType === \"Saas\") {\n        healthcheckArgs.config = args.config;\n      }\n      if (\n        args.configType === \"All\" ||\n        args.config_schema.some((i) => i.files_required.includes(\"Catalog\"))\n      ) {\n        const docsGenerateCommand =\n          this.dbtCommandFactory.createDocsGenerateCommand();\n        docsGenerateCommand.focus = false;\n        docsGenerateCommand.logToTerminal = false;\n        docsGenerateCommand.showProgress = false;\n        await this.unsafeGenerateDocsImmediately();\n        healthcheckArgs.catalogPath = this.getCatalogPath();\n        if (!healthcheckArgs.catalogPath) {\n          throw new Error(\n            `Unable to find catalog path for project ${this.getProjectName()}`,\n          );\n        }\n      }\n    }\n    this.terminal.debug(\n      \"performDatapilotHealthcheck\",\n      \"Performing healthcheck\",\n      healthcheckArgs,\n    );\n    // Create isolated Python bridge for healthcheck\n    const healthCheckThread = this.executionInfrastructure.createPythonBridge(\n      this.projectRoot.fsPath,\n    );\n\n    let projectHealthcheck: ProjectHealthcheck;\n    try {\n      await healthCheckThread.ex`from dbt_utils import *`;\n      projectHealthcheck = await healthCheckThread.lock<ProjectHealthcheck>(\n        (python) =>\n          python!`to_dict(project_healthcheck(${healthcheckArgs.manifestPath}, ${healthcheckArgs.catalogPath}, ${healthcheckArgs.configPath}, ${healthcheckArgs.config}, ${this.altimate.getAIKey()}, ${this.altimate.getInstanceName()}, ${this.altimate.getAltimateUrl()}))`,\n      );\n    } finally {\n      await this.executionInfrastructure.closePythonBridge(healthCheckThread);\n    }\n    // temp fix: ideally datapilot should return absolute path\n    for (const key in projectHealthcheck.model_insights) {\n      for (const item of projectHealthcheck.model_insights[key]) {\n        item.path = path.join(this.projectRoot.fsPath, item.original_file_path);\n      }\n    }\n    return projectHealthcheck;\n  }\n\n  async initialize(): Promise<void> {\n    // Create command queue for this project\n    this.createQueue(\"all\");\n\n    try {\n      await this.dbtProjectIntegration.initialize();\n    } catch (error) {\n      window.showErrorMessage(\n        extendErrorWithSupportLinks(\n          \"An unexpected error occured while initializing the dbt project at \" +\n            this.projectRoot +\n            \": \" +\n            error +\n            \".\",\n        ),\n      );\n    }\n\n    // ensure all watchers are cleaned up\n    if (this.dbtProjectLog) {\n      this.disposables.push(this.dbtProjectLog);\n    }\n\n    this.terminal.debug(\n      \"DbtProject\",\n      `Initialized dbt project ${this.getProjectName()} at ${this.projectRoot}`,\n    );\n  }\n\n  async rebuildManifest(): Promise<void> {\n    this.dbtProjectIntegration.rebuildManifest();\n  }\n\n  private async onPythonEnvironmentChanged() {\n    this.terminal.debug(\n      \"DbtProject\",\n      `Python environment for dbt project ${this.getProjectName()} at ${\n        this.projectRoot\n      } has changed`,\n    );\n    await this.initialize();\n  }\n\n  async refreshProjectConfig(): Promise<void> {\n    this.dbtProjectIntegration.refreshProjectConfig();\n  }\n\n  async parseManifest(): Promise<ParsedManifest | undefined> {\n    return await this.dbtProjectIntegration.parseManifest();\n  }\n\n  getAdapterType() {\n    return this.dbtProjectIntegration.getAdapterType() || \"unknown\";\n  }\n\n  findPackageName(uri: Uri): string | undefined {\n    const documentPath = uri.path;\n    const pathSegments = documentPath\n      .replace(new RegExp(this.projectRoot + \"/\", \"g\"), \"\")\n      .split(\"/\");\n    const packagesInstallPath = this.getPackageInstallPath();\n    if (packagesInstallPath && uri.fsPath.startsWith(packagesInstallPath)) {\n      return pathSegments[1];\n    }\n    return undefined;\n  }\n\n  contains(uri: Uri) {\n    return (\n      uri.fsPath === this.projectRoot.fsPath ||\n      uri.fsPath.startsWith(this.projectRoot.fsPath + path.sep)\n    );\n  }\n\n  async runModel(runModelParams: RunModelParams) {\n    if (!this.validateIntegrationPrerequisites()) {\n      return undefined;\n    }\n\n    const runModelCommand =\n      this.dbtCommandFactory.createRunModelCommand(runModelParams);\n\n    try {\n      const command =\n        await this.getCurrentProjectIntegration().runModel(runModelCommand);\n      this.telemetry.sendTelemetryEvent(\"runModel\");\n      if (command) {\n        this.addCommandToQueue(\"all\", command);\n      }\n    } catch (error) {\n      this.handleNoCredentialsError(error);\n    }\n  }\n\n  async unsafeRunModelImmediately(runModelParams: RunModelParams) {\n    this.telemetry.sendTelemetryEvent(\"runModel\");\n    return this.dbtProjectIntegration.unsafeRunModelImmediately(runModelParams);\n  }\n\n  async buildModel(runModelParams: RunModelParams) {\n    if (!this.validateIntegrationPrerequisites()) {\n      return undefined;\n    }\n\n    const buildModelCommand =\n      this.dbtCommandFactory.createBuildModelCommand(runModelParams);\n\n    try {\n      const command =\n        await this.getCurrentProjectIntegration().buildModel(buildModelCommand);\n      this.telemetry.sendTelemetryEvent(\"buildModel\");\n      if (command) {\n        this.addCommandToQueue(\"all\", command);\n      }\n    } catch (error) {\n      this.handleNoCredentialsError(error);\n    }\n  }\n\n  async unsafeBuildModelImmediately(runModelParams: RunModelParams) {\n    this.telemetry.sendTelemetryEvent(\"buildModel\");\n    return this.dbtProjectIntegration.unsafeBuildModelImmediately(\n      runModelParams,\n    );\n  }\n\n  async buildProject() {\n    if (!this.validateIntegrationPrerequisites()) {\n      return;\n    }\n\n    const buildProjectCommand =\n      this.dbtCommandFactory.createBuildProjectCommand();\n\n    try {\n      const command =\n        await this.getCurrentProjectIntegration().buildProject(\n          buildProjectCommand,\n        );\n      this.telemetry.sendTelemetryEvent(\"buildProject\");\n      if (command) {\n        this.addCommandToQueue(\"all\", command);\n      }\n    } catch (error) {\n      this.handleNoCredentialsError(error);\n    }\n  }\n\n  async unsafeBuildProjectImmediately() {\n    this.telemetry.sendTelemetryEvent(\"buildProject\");\n    return this.dbtProjectIntegration.unsafeBuildProjectImmediately();\n  }\n\n  async runTest(testName: string) {\n    if (!this.validateIntegrationPrerequisites()) {\n      return undefined;\n    }\n\n    const testModelCommand =\n      this.dbtCommandFactory.createTestModelCommand(testName);\n\n    try {\n      const command =\n        await this.getCurrentProjectIntegration().runTest(testModelCommand);\n      this.telemetry.sendTelemetryEvent(\"runTest\");\n      if (command) {\n        this.addCommandToQueue(\"all\", command);\n      }\n    } catch (error) {\n      this.handleNoCredentialsError(error);\n    }\n  }\n\n  async unsafeRunTestImmediately(testName: string) {\n    this.telemetry.sendTelemetryEvent(\"runTest\");\n    return this.dbtProjectIntegration.unsafeRunTestImmediately(testName);\n  }\n\n  async runModelTest(modelName: string) {\n    if (!this.validateIntegrationPrerequisites()) {\n      return undefined;\n    }\n\n    const testModelCommand =\n      this.dbtCommandFactory.createTestModelCommand(modelName);\n\n    try {\n      const command =\n        await this.getCurrentProjectIntegration().runModelTest(\n          testModelCommand,\n        );\n      this.telemetry.sendTelemetryEvent(\"runModelTest\");\n      if (command) {\n        this.addCommandToQueue(\"all\", command);\n      }\n    } catch (error) {\n      this.handleNoCredentialsError(error);\n    }\n  }\n\n  async unsafeRunModelTestImmediately(modelName: string) {\n    this.telemetry.sendTelemetryEvent(\"runModelTest\");\n    return this.dbtProjectIntegration.unsafeRunModelTestImmediately(modelName);\n  }\n\n  private handleNoCredentialsError(error: unknown) {\n    if (error instanceof NoCredentialsError) {\n      this.altimateAuthService.handlePreviewFeatures();\n      return;\n    }\n    window.showErrorMessage((error as Error).message);\n  }\n\n  private validateIntegrationPrerequisites(): boolean {\n    // Validate different prerequisites based on integration type\n    const dbtIntegrationMode = workspace\n      .getConfiguration(\"dbt\")\n      .get<string>(\"dbtIntegration\", \"core\");\n\n    switch (dbtIntegrationMode) {\n      case \"cloud\":\n      case \"fusion\":\n        // For cloud/fusion integrations, validate authentication\n        try {\n          this.validationProvider.validateCredentialsSilently();\n          return true;\n        } catch (e) {\n          window.showErrorMessage((e as Error).message);\n          return false;\n        }\n      case \"core\":\n      case \"corecommand\":\n      default:\n        // For core integrations, check if we have a proper dbt installation\n        // We'll validate through the integration's diagnostic system\n        const diagnostics =\n          this.getCurrentProjectIntegration().getDiagnostics();\n        const hasErrors = [\n          ...diagnostics.pythonBridgeDiagnostics,\n          ...diagnostics.rebuildManifestDiagnostics,\n        ].some((diagnostic) => diagnostic.severity === \"error\");\n\n        if (hasErrors) {\n          window.showErrorMessage(\n            \"dbt installation or Python environment is not properly configured\",\n          );\n          return false;\n        }\n        return true;\n    }\n  }\n\n  private requiresAuthentication(): boolean {\n    const dbtIntegrationMode = workspace\n      .getConfiguration(\"dbt\")\n      .get<string>(\"dbtIntegration\", \"core\");\n    return dbtIntegrationMode === \"cloud\";\n  }\n\n  throwIfNotAuthenticated() {\n    if (this.requiresAuthentication()) {\n      this.validationProvider.throwIfNotAuthenticated();\n    }\n  }\n\n  async compileModel(runModelParams: RunModelParams) {\n    if (!this.validateIntegrationPrerequisites()) {\n      return;\n    }\n\n    const compileModelCommand =\n      this.dbtCommandFactory.createCompileModelCommand(runModelParams);\n    const command =\n      await this.getCurrentProjectIntegration().compileModel(\n        compileModelCommand,\n      );\n    this.telemetry.sendTelemetryEvent(\"compileModel\");\n    if (command) {\n      this.addCommandToQueue(\"all\", command);\n    }\n  }\n\n  async unsafeCompileModelImmediately(runModelParams: RunModelParams) {\n    this.telemetry.sendTelemetryEvent(\"compileModel\");\n    return this.dbtProjectIntegration.unsafeCompileModelImmediately(\n      runModelParams,\n    );\n  }\n\n  async unsafeGenerateDocsImmediately(args?: string[]) {\n    return this.dbtProjectIntegration.unsafeGenerateDocsImmediately(args);\n  }\n\n  async generateDocs() {\n    if (!this.validateIntegrationPrerequisites()) {\n      return;\n    }\n\n    const docsGenerateCommand =\n      this.dbtCommandFactory.createDocsGenerateCommand();\n    const command =\n      await this.getCurrentProjectIntegration().generateDocs(\n        docsGenerateCommand,\n      );\n    this.telemetry.sendTelemetryEvent(\"generateDocs\");\n    if (command) {\n      this.addCommandToQueue(\"all\", command);\n    }\n  }\n\n  clean() {\n    this.throwIfNotAuthenticated();\n    this.telemetry.sendTelemetryEvent(\"clean\");\n    return this.dbtProjectIntegration.clean();\n  }\n\n  debug(focus: boolean = true) {\n    this.telemetry.sendTelemetryEvent(\"debug\");\n    return this.dbtProjectIntegration.debug(focus);\n  }\n\n  async installDbtPackages(packages: string[]) {\n    this.telemetry.sendTelemetryEvent(\"installDbtPackages\");\n    return this.dbtProjectIntegration.installDbtPackages(packages);\n  }\n\n  async installDeps(silent = false) {\n    this.telemetry.sendTelemetryEvent(\"installDeps\");\n    return this.dbtProjectIntegration.installDeps(silent);\n  }\n\n  async compileNode(modelName: string): Promise<string | undefined> {\n    this.telemetry.sendTelemetryEvent(\"compileNode\");\n    this.throwDiagnosticsErrorIfAvailable();\n    try {\n      return await this.dbtProjectIntegration.unsafeCompileNode(modelName);\n    } catch (exc: any) {\n      if (exc instanceof PythonException) {\n        window.showErrorMessage(\n          extendErrorWithSupportLinks(\n            `An error occured while trying to compile your node: ${modelName}` +\n              exc.exception.message +\n              \".\",\n          ),\n        );\n        this.telemetry.sendTelemetryError(\"compileNodePythonError\", exc);\n        return (\n          \"Exception: \" +\n          exc.exception.message +\n          \"\\n\\n\" +\n          \"Detailed error information:\\n\" +\n          exc\n        );\n      }\n      this.telemetry.sendTelemetryError(\"compileNodeUnknownError\", exc);\n      // Unknown error\n      window.showErrorMessage(\n        extendErrorWithSupportLinks(\n          \"Could not compile model \" +\n            modelName +\n            \": \" +\n            (exc as Error).message +\n            \".\",\n        ),\n      );\n      return \"Detailed error information:\\n\" + exc;\n    }\n  }\n\n  async unsafeCompileNode(modelName: string): Promise<string | undefined> {\n    this.telemetry.sendTelemetryEvent(\"unsafeCompileNode\");\n    this.throwDiagnosticsErrorIfAvailable();\n    this.throwIfNotAuthenticated();\n    return this.dbtProjectIntegration.unsafeCompileNode(modelName);\n  }\n\n  async validateSql(request: {\n    sql: string;\n    dialect: string;\n    models: any[];\n  }): Promise<Awaited<ReturnType<typeof validateSQL>>> {\n    const { sql, dialect, models } = request;\n    this.throwDiagnosticsErrorIfAvailable();\n    this.throwIfNotAuthenticated();\n    const sqlValidationThread = this.executionInfrastructure.createPythonBridge(\n      this.projectRoot.fsPath,\n    );\n    try {\n      return await validateSQL(sql, dialect, models, sqlValidationThread);\n    } finally {\n      await this.executionInfrastructure.closePythonBridge(sqlValidationThread);\n    }\n  }\n\n  async validateSQLDryRun(query: string) {\n    this.throwIfNotAuthenticated();\n    try {\n      return this.dbtProjectIntegration.validateSQLDryRun(query);\n    } catch (exc) {\n      const exception = exc as { exception: { message: string } };\n      window.showErrorMessage(\n        exception.exception.message || \"Could not validate sql with dry run.\",\n      );\n      this.telemetry.sendTelemetryError(\"validateSQLDryRunError\", {\n        error: exc,\n      });\n    }\n  }\n\n  getDBTVersion(): number[] | undefined {\n    return this.getCurrentProjectIntegration().getVersion();\n  }\n\n  async compileQuery(\n    query: string,\n    originalModelName: string | undefined = undefined,\n  ): Promise<string | undefined> {\n    this.telemetry.sendTelemetryEvent(\"compileQuery\");\n    try {\n      return await this.dbtProjectIntegration.unsafeCompileQuery(\n        query,\n        originalModelName,\n      );\n    } catch (exc: any) {\n      if (exc instanceof PythonException) {\n        window.showErrorMessage(\n          extendErrorWithSupportLinks(\n            \"An error occured while trying to compile your query: \" +\n              exc.exception.message +\n              \".\",\n          ),\n        );\n        this.telemetry.sendTelemetryError(\"compileQueryPythonError\", exc);\n        return undefined;\n      }\n      this.telemetry.sendTelemetryError(\"compileQueryUnknownError\", exc);\n      // Unknown error\n      window.showErrorMessage(\n        extendErrorWithSupportLinks(\n          \"Could not compile query: \" + (exc as Error).message,\n        ),\n      );\n      return undefined;\n    }\n  }\n\n  showCompiledSql(modelPath: Uri) {\n    this.findModelInTargetfolder(modelPath, \"compiled\");\n  }\n\n  showRunSQL(modelPath: Uri) {\n    this.findModelInTargetfolder(modelPath, \"run\");\n  }\n\n  createYMLContent(\n    columnsInRelation: { [key: string]: string }[],\n    modelName: string,\n  ): string {\n    let yamlString = \"version: 2\\n\\nmodels:\\n\";\n    yamlString += `  - name: ${modelName}\\n    description: \"\"\\n    columns:\\n`;\n    for (const item of columnsInRelation) {\n      yamlString += `    - name: ${item.column}\\n      description: \"\"\\n`;\n    }\n    return yamlString;\n  }\n\n  async unsafeCompileQuery(\n    query: string,\n    originalModelName: string | undefined = undefined,\n  ) {\n    this.throwIfNotAuthenticated();\n    return this.dbtProjectIntegration.unsafeCompileQuery(\n      query,\n      originalModelName,\n    );\n  }\n\n  async getColumnsOfModel(modelName: string) {\n    this.throwIfNotAuthenticated();\n    const result =\n      await this.dbtProjectIntegration.getColumnsOfModel(modelName);\n    await this.getCurrentProjectIntegration().cleanupConnections();\n    return result;\n  }\n\n  async getColumnsOfSource(sourceName: string, tableName: string) {\n    this.throwIfNotAuthenticated();\n    const result = await this.dbtProjectIntegration.getColumnsOfSource(\n      sourceName,\n      tableName,\n    );\n    await this.getCurrentProjectIntegration().cleanupConnections();\n    return result;\n  }\n\n  async getColumnValues(model: string, column: string) {\n    this.telemetry.startTelemetryEvent(\n      TelemetryEvents[\"DocumentationEditor/GetDistinctColumnValues\"],\n      { column, model },\n    );\n\n    try {\n      this.throwIfNotAuthenticated();\n      this.terminal.debug(\n        \"getColumnValues\",\n        \"finding distinct values for column\",\n        true,\n        { model, column },\n      );\n      const result = this.dbtProjectIntegration.getColumnValues(model, column);\n      this.telemetry.endTelemetryEvent(\n        TelemetryEvents[\"DocumentationEditor/GetDistinctColumnValues\"],\n        undefined,\n        { column, model },\n      );\n      return (result as any).flat();\n    } catch (error) {\n      this.telemetry.endTelemetryEvent(\n        TelemetryEvents[\"DocumentationEditor/GetDistinctColumnValues\"],\n        error,\n        { column, model },\n      );\n      throw error;\n    } finally {\n      await this.getCurrentProjectIntegration().cleanupConnections();\n    }\n  }\n\n  async getBulkSchemaFromDB(req: DBTNode[], signal: AbortSignal) {\n    this.throwIfNotAuthenticated();\n    try {\n      const result =\n        await this.getCurrentProjectIntegration().getBulkSchemaFromDB(\n          req,\n          signal,\n        );\n      await this.getCurrentProjectIntegration().cleanupConnections();\n      return result;\n    } finally {\n      await this.getCurrentProjectIntegration().cleanupConnections();\n    }\n  }\n\n  async getCatalog(): Promise<Catalog> {\n    this.throwIfNotAuthenticated();\n    try {\n      const result = await this.getCurrentProjectIntegration().getCatalog();\n      return result;\n    } catch (exc: any) {\n      if (exc instanceof PythonException) {\n        this.telemetry.sendTelemetryError(\"catalogPythonError\", exc, {\n          adapter: this.getAdapterType(),\n        });\n        window.showErrorMessage(\n          \"Some of the scans could not run as connectivity to database for the project \" +\n            this.getProjectName() +\n            \" is not available. \",\n        );\n        return [];\n      }\n      // Unknown error\n      this.telemetry.sendTelemetryError(\"catalogUnknownError\", exc, {\n        adapter: this.getAdapterType(),\n      });\n      window.showErrorMessage(\n        \"Some of the scans could not run as connectivity to database for the project \" +\n          this.getProjectName() +\n          \" is not available. \",\n      );\n      return [];\n    } finally {\n      await this.getCurrentProjectIntegration().cleanupConnections();\n    }\n  }\n\n  async generateSchemaYML(modelPath: Uri, modelName: string) {\n    try {\n      // Create filePath based on model location\n      const currentDir = path.dirname(modelPath.fsPath);\n      const location = path.join(currentDir, modelName + \"_schema.yml\");\n      if (!existsSync(location)) {\n        this.telemetry.sendTelemetryEvent(\"generateSchemaYML\", {\n          adapter: this.getAdapterType(),\n        });\n        const columnsInRelation = await this.getColumnsOfModel(modelName);\n        // Generate yml file content\n        const fileContents = this.createYMLContent(\n          columnsInRelation,\n          modelName,\n        );\n        writeFileSync(location, fileContents);\n        const doc = await workspace.openTextDocument(Uri.file(location));\n        window.showTextDocument(doc);\n      } else {\n        window.showErrorMessage(\n          `A file called ${modelName}_schema.yml already exists in ${currentDir}. If you want to generate the schema yml, please rename the other file or delete it if you want to generate the yml again.`,\n        );\n      }\n    } catch (exc: any) {\n      if (exc instanceof PythonException) {\n        this.telemetry.sendTelemetryError(\"generateSchemaYMLPythonError\", exc, {\n          adapter: this.getAdapterType(),\n        });\n        window.showErrorMessage(\n          extendErrorWithSupportLinks(\n            \"An error occured while trying to generate the schema yml \" +\n              exc.exception.message +\n              \".\",\n          ),\n        );\n      }\n      // Unknown error\n      this.telemetry.sendTelemetryError(\"generateSchemaYMLUnknownError\", exc, {\n        adapter: this.getAdapterType(),\n      });\n      window.showErrorMessage(\n        extendErrorWithSupportLinks(\n          \"Could not generate schema yaml: \" + (exc as Error).message,\n        ),\n      );\n    }\n  }\n\n  async generateModel(\n    sourceName: string,\n    tableName: string,\n    sourcePath: string,\n  ) {\n    await window.withProgress(\n      {\n        location: ProgressLocation.Notification,\n        title: \"Generating model...\",\n        cancellable: false,\n      },\n      async () => {\n        try {\n          const prefix = workspace\n            .getConfiguration(\"dbt\")\n            .get<string>(\"prefixGenerateModel\", \"base\");\n\n          // Map setting to fileName\n          const fileNameTemplateMap: FileNameTemplateMap = {\n            \"{prefix}_{sourceName}_{tableName}\": `${prefix}_${sourceName}_${tableName}`,\n            \"{prefix}_{sourceName}__{tableName}\": `${prefix}_${sourceName}__${tableName}`,\n            \"{prefix}_{tableName}\": `${prefix}_${tableName}`,\n            \"{tableName}\": `${tableName}`,\n          };\n\n          // Default filename template\n          let fileName = `${prefix}_${sourceName}_${tableName}`;\n\n          const fileNameTemplate = workspace\n            .getConfiguration(\"dbt\")\n            .get<string>(\n              \"fileNameTemplateGenerateModel\",\n              \"{prefix}_{sourceName}_{tableName}\",\n            );\n\n          this.telemetry.sendTelemetryEvent(\"generateModel\", {\n            prefix: prefix,\n            filenametemplate: fileNameTemplate,\n            adapter: this.getAdapterType(),\n          });\n\n          // Parse setting to fileName\n          if (fileNameTemplate in fileNameTemplateMap) {\n            fileName = fileNameTemplateMap[fileNameTemplate];\n          }\n          // Create filePath based on source.yml location\n          const location = path.join(sourcePath, fileName + \".sql\");\n          if (!existsSync(location)) {\n            const columnsInRelation = await this.getColumnsOfSource(\n              sourceName,\n              tableName,\n            );\n            this.terminal.debug(\n              \"dbtProject:generateModel\",\n              `Generating columns for source ${sourceName} and table ${tableName}`,\n              columnsInRelation,\n            );\n\n            const fileContents = `with source as (\n        select * from {{ source('${sourceName}', '${tableName}') }}\n  ),\n  renamed as (\n      select\n          ${columnsInRelation\n            .map((column) => `{{ adapter.quote(\"${column.column}\") }}`)\n            .join(\",\\n        \")}\n\n      from source\n  )\n  select * from renamed\n    `;\n            writeFileSync(location, fileContents);\n            const doc = await workspace.openTextDocument(Uri.file(location));\n            window.showTextDocument(doc);\n          } else {\n            window.showErrorMessage(\n              `A model called ${fileName} already exists in ${sourcePath}. If you want to generate the model, please rename the other model or delete it if you want to generate the model again.`,\n            );\n          }\n        } catch (exc: any) {\n          if (exc instanceof PythonException) {\n            this.telemetry.sendTelemetryError(\"generateModelPythonError\", exc, {\n              adapter: this.getAdapterType(),\n            });\n            window.showErrorMessage(\n              \"An error occured while trying to generate the model \" +\n                exc.exception.message,\n            );\n          }\n          // Unknown error\n          this.telemetry.sendTelemetryError(\"generateModelUnknownError\", exc, {\n            adapter: this.getAdapterType(),\n          });\n          window.showErrorMessage(\n            extendErrorWithSupportLinks(\n              \"An error occured while trying to generate the model:\" +\n                exc +\n                \".\",\n            ),\n          );\n        }\n      },\n    );\n  }\n\n  async executeSQLOnQueryPanel(query: string, modelName: string) {\n    const limit = workspace\n      .getConfiguration(\"dbt\")\n      .get<number>(\"queryLimit\", 500);\n    return this.executeSQLWithLimitOnQueryPanel(query, modelName, limit);\n  }\n\n  async executeSQLWithLimitOnQueryPanel(\n    query: string,\n    modelName: string,\n    limit: number,\n  ) {\n    if (limit <= 0) {\n      window.showErrorMessage(\"Please enter a positive number for query limit\");\n      return;\n    }\n    this.terminal.info(\"executeSQL\", \"Executed query: \" + query, true, {\n      adapter: this.getAdapterType(),\n      limit: limit.toString(),\n    });\n    this.eventEmitterService.fire({\n      command: \"executeQuery\",\n      payload: {\n        query,\n        fn: this.dbtProjectIntegration.executeSQLWithLimit(\n          query,\n          modelName,\n          limit,\n        ),\n        projectName: this.getProjectName(),\n      },\n    });\n  }\n\n  async immediatelyExecuteSQLWithLimit(\n    query: string,\n    modelName: string,\n    limit: number,\n  ): Promise<QueryExecutionResult> {\n    this.throwDiagnosticsErrorIfAvailable();\n    this.throwIfNotAuthenticated();\n    this.terminal.info(\"executeSQL\", \"Executed query: \" + query, true, {\n      adapter: this.getAdapterType(),\n      limit: limit.toString(),\n    });\n    return this.dbtProjectIntegration.immediatelyExecuteSQLWithLimit(\n      query,\n      modelName,\n      limit,\n    );\n  }\n\n  async executeSQLWithLimit(query: string, modelName: string, limit: number) {\n    this.throwDiagnosticsErrorIfAvailable();\n    this.throwIfNotAuthenticated();\n    this.terminal.info(\"executeSQL\", \"Executed query: \" + query, true, {\n      adapter: this.getAdapterType(),\n      limit: limit.toString(),\n    });\n    return this.dbtProjectIntegration.executeSQLWithLimit(\n      query,\n      modelName,\n      limit,\n    );\n  }\n\n  async immediatelyExecuteSQL(\n    query: string,\n    modelName: string,\n  ): Promise<QueryExecutionResult> {\n    this.throwDiagnosticsErrorIfAvailable();\n    this.throwIfNotAuthenticated();\n    const limit = workspace\n      .getConfiguration(\"dbt\")\n      .get<number>(\"queryLimit\", 500);\n    this.terminal.info(\"executeSQL\", \"Executed query: \" + query, true, {\n      adapter: this.getAdapterType(),\n      limit: limit.toString(),\n    });\n    return this.dbtProjectIntegration.immediatelyExecuteSQL(query, modelName);\n  }\n\n  executeSQL(query: string, modelName: string): Promise<QueryExecution> {\n    const limit = workspace\n      .getConfiguration(\"dbt\")\n      .get<number>(\"queryLimit\", 500);\n    this.terminal.info(\"executeSQL\", \"Executed query: \" + query, true, {\n      adapter: this.getAdapterType(),\n      limit: limit.toString(),\n    });\n    return this.dbtProjectIntegration.executeSQL(query, modelName);\n  }\n\n  async dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n\n  private async findModelInTargetfolder(modelPath: Uri, type: string) {\n    const targetPath = this.getTargetPath();\n    if (!targetPath) {\n      return;\n    }\n    const relativePath = path.relative(\n      this.projectRoot.fsPath,\n      modelPath.fsPath,\n    );\n\n    const targetModels = await workspace.findFiles(\n      new RelativePattern(targetPath, path.join(type, \"**\", relativePath)),\n    );\n    if (targetModels.length > 0) {\n      commands.executeCommand(\"vscode.open\", targetModels[0], {\n        preview: false,\n        preserveFocus: true,\n        viewColumn: ViewColumn.Beside,\n      });\n    }\n  }\n\n  static isResourceNode(resourceType: string): boolean {\n    return isResourceNode(resourceType);\n  }\n\n  static isResourceHasDbColumns(resourceType: string): boolean {\n    return isResourceHasDbColumns(resourceType);\n  }\n\n  getNonEphemeralParents(keys: string[]): string[] {\n    return this.dbtProjectIntegration.getNonEphemeralParents(keys);\n  }\n\n  getChildrenModels({ table }: { table: string }): Table[] {\n    return this.dbtProjectIntegration.getChildrenModels({ table });\n  }\n\n  getParentModels({ table }: { table: string }): Table[] {\n    return this.dbtProjectIntegration.getParentModels({ table });\n  }\n\n  mergeColumnsFromDB(\n    node: Pick<ModelNode, \"columns\">,\n    columnsFromDB: DBColumn[],\n  ) {\n    if (!columnsFromDB || columnsFromDB.length === 0) {\n      return false;\n    }\n    if (columnsFromDB.length > 100) {\n      // Flagging events where more than 100 columns are fetched from db to get a sense of how many of these happen\n      this.telemetry.sendTelemetryEvent(\"excessiveColumnsFetchedFromDB\");\n    }\n    const columnsFromManifest: Record<string, ColumnMetaData> = {};\n    Object.entries(node.columns).forEach(([k, v]) => {\n      columnsFromManifest[getColumnNameByCase(k, this.getAdapterType())] = v;\n    });\n\n    for (const c of columnsFromDB) {\n      const columnNameFromDB = getColumnNameByCase(\n        c.column,\n        this.getAdapterType(),\n      );\n      const existing_column = columnsFromManifest[columnNameFromDB];\n      if (existing_column) {\n        existing_column.data_type = (\n          existing_column.data_type || c.dtype\n        )?.toLowerCase();\n        continue;\n      }\n      node.columns[columnNameFromDB] = {\n        name: columnNameFromDB,\n        data_type: c.dtype?.toLowerCase(),\n        description: \"\",\n        meta: {},\n      };\n    }\n    if (Object.keys(node.columns).length > columnsFromDB.length) {\n      // Flagging events where columns fetched from db are less than the number of columns in the manifest\n      this.telemetry.sendTelemetryEvent(\"possibleStaleSchema\");\n    }\n    return true;\n  }\n\n  public findPackageVersion(packageName: string) {\n    const version =\n      this.getCurrentProjectIntegration().findPackageVersion(packageName);\n    this.terminal.debug(\n      \"dbtProject:findPackageVersion\",\n      `found ${packageName} version: ${version}`,\n    );\n    return version;\n  }\n\n  async getBulkCompiledSql(models: string[]) {\n    if (models.length === 0) {\n      return {};\n    }\n    if (!this._manifestCacheEvent) {\n      throw new Error(\"The dbt manifest is not available\");\n    }\n    const { nodeMetaMap } = this._manifestCacheEvent;\n    return this.getCurrentProjectIntegration().getBulkCompiledSQL(\n      models\n        .map((m) => nodeMetaMap.lookupByUniqueId(m))\n        .filter(Boolean) as NodeMetaData[],\n    );\n  }\n\n  async getNodesWithDBColumns(modelsToFetch: string[], signal: AbortSignal) {\n    const mappedNode: Record<string, ModelNode> = {};\n    const relationsWithoutColumns: string[] = [];\n    if (modelsToFetch.length === 0) {\n      return { mappedNode, relationsWithoutColumns, mappedCompiledSql: {} };\n    }\n    if (!this._manifestCacheEvent) {\n      throw new Error(\"The dbt manifest is not available\");\n    }\n    const { nodeMetaMap, sourceMetaMap } = this._manifestCacheEvent;\n    const bulkSchemaRequest: DBTNode[] = [];\n\n    for (const key of modelsToFetch) {\n      if (this.dbSchemaCache[key]) {\n        this.telemetry.sendTelemetryEvent(\"dbSchemaCacheHit\", { model: key });\n        mappedNode[key] = this.dbSchemaCache[key];\n        continue;\n      }\n      const splits = key.split(\".\");\n      const resource_type = splits[0];\n      if (resource_type === RESOURCE_TYPE_SOURCE) {\n        const source = sourceMetaMap.get(splits[2]);\n        const tableName = splits[3];\n        if (!source) {\n          continue;\n        }\n        const table = source?.tables.find((t) => t.name === tableName);\n        if (!table) {\n          continue;\n        }\n        bulkSchemaRequest.push({\n          unique_id: key,\n          name: source.name,\n          resource_type,\n          table: table.name,\n        } as SourceNode);\n        const node = {\n          database: source.database,\n          schema: source.schema,\n          name: table.name,\n          alias: table.identifier,\n          uniqueId: key,\n          columns: table.columns,\n          path: table.path,\n        };\n        mappedNode[key] = node;\n      } else if (DBTProject.isResourceNode(resource_type)) {\n        const node = nodeMetaMap.lookupByUniqueId(key);\n        if (!node) {\n          continue;\n        }\n        if (DBTProject.isResourceHasDbColumns(resource_type)) {\n          bulkSchemaRequest.push({\n            unique_id: key,\n            name: node.name,\n            resource_type,\n          });\n        }\n        mappedNode[key] = {\n          uniqueId: key,\n          ...node,\n        };\n      }\n    }\n\n    const dbSchemaRequest = bulkSchemaRequest.filter(\n      (r) => r.resource_type !== RESOURCE_TYPE_MODEL,\n    );\n\n    const sqlglotSchemaRequest = bulkSchemaRequest.filter(\n      (r) => r.resource_type === RESOURCE_TYPE_MODEL,\n    );\n    let startTime = Date.now();\n    const sqlglotSchemaResponse = await this.getBulkCompiledSql(\n      sqlglotSchemaRequest.map((r) => r.unique_id),\n    );\n    const compiledSqlTime = Date.now() - startTime;\n\n    if (signal.aborted) {\n      return {\n        mappedNode,\n        relationsWithoutColumns,\n        mappedCompiledSql: sqlglotSchemaResponse,\n      };\n    }\n\n    const sqlglotSchemas: Record<string, DBColumn[]> = {};\n    const dialect = this.getAdapterType();\n\n    startTime = Date.now();\n    for (const r of sqlglotSchemaRequest) {\n      if (!sqlglotSchemaResponse[r.unique_id]) {\n        dbSchemaRequest.push(r);\n        continue;\n      }\n\n      try {\n        const columns = await extractOutputColumns(\n          sqlglotSchemaResponse[r.unique_id],\n          dialect,\n        );\n        sqlglotSchemas[r.unique_id] = columns.map((c) => ({\n          column: c,\n          dtype: \"string\",\n        }));\n      } catch (e) {\n        this.terminal.warn(\n          \"sqlglotSchemaFetchingFailed\",\n          `Error while schema fetching for ${r.unique_id}`,\n          true,\n          e,\n        );\n        dbSchemaRequest.push(r);\n      }\n    }\n    const sqlglotSchemaTime = Date.now() - startTime;\n\n    if (signal.aborted) {\n      return {\n        mappedNode,\n        relationsWithoutColumns,\n        mappedCompiledSql: sqlglotSchemaResponse,\n      };\n    }\n\n    startTime = Date.now();\n    const dbSchemaResponse =\n      await this.getCurrentProjectIntegration().getBulkSchemaFromDB(\n        dbSchemaRequest,\n        signal,\n      );\n    const dbFetchTime = Date.now() - startTime;\n\n    const bulkSchemaResponse = { ...dbSchemaResponse, ...sqlglotSchemas };\n\n    for (const key of modelsToFetch) {\n      if (!bulkSchemaRequest.find((r) => r.unique_id === key)) {\n        continue;\n      }\n      const node = mappedNode[key];\n      if (!node) {\n        continue;\n      }\n      const dbColumnAdded = this.mergeColumnsFromDB(\n        node,\n        bulkSchemaResponse[key],\n      );\n      if (!dbColumnAdded) {\n        relationsWithoutColumns.push(key);\n      } else {\n        // only adding to cache when successfully fetched columns from db\n        this.dbSchemaCache[key] = mappedNode[key];\n      }\n    }\n\n    console.log(\"getNodesWithDBColumnsTimings\", {\n      compiledSqlTime,\n      sqlglotSchemaTime,\n      dbFetchTime,\n      modelInfosLength: modelsToFetch.length,\n    });\n    this.telemetry.sendTelemetryEvent(\"getNodesWithDBColumnsTimings\", {\n      compiledSqlTime: compiledSqlTime.toString(),\n      sqlglotSchemaTime: sqlglotSchemaTime.toString(),\n      dbFetchTime: dbFetchTime.toString(),\n      modelInfosLength: modelsToFetch.length.toString(),\n    });\n\n    return {\n      mappedNode,\n      relationsWithoutColumns,\n      mappedCompiledSql: sqlglotSchemaResponse,\n    };\n  }\n\n  async applyDeferConfig(): Promise<void> {\n    const deferConfig = this.retrieveDeferConfigFromSettings();\n    await this.dbtProjectIntegration.applyDeferConfig(deferConfig);\n  }\n\n  throwDiagnosticsErrorIfAvailable() {\n    // Check integration diagnostics\n    const integrationDiagnostics =\n      this.getCurrentProjectIntegration().getDiagnostics();\n    const allIntegrationDiagnostics = [\n      ...integrationDiagnostics.pythonBridgeDiagnostics,\n      ...integrationDiagnostics.rebuildManifestDiagnostics,\n    ];\n\n    for (const diagnostic of allIntegrationDiagnostics) {\n      if (diagnostic.severity === \"error\") {\n        throw new Error(diagnostic.message);\n      }\n    }\n\n    // Check VSCode diagnostic collections\n    const vscodeCollections: DiagnosticCollection[] = [\n      this.projectHealth,\n      this.pythonBridgeDiagnostics,\n      this.rebuildManifestDiagnostics,\n      this.projectConfigDiagnostics,\n    ];\n\n    for (const diagnosticCollection of vscodeCollections) {\n      for (const [_, diagnostics] of diagnosticCollection) {\n        const error = diagnostics.find(\n          (diagnostic) => diagnostic.severity === DiagnosticSeverity.Error,\n        );\n        if (error) {\n          throw new Error(error.message);\n        }\n      }\n    }\n  }\n\n  private retrieveDeferConfigFromSettings(): DeferConfig | undefined {\n    const relativePath = getProjectRelativePath(this.projectRoot);\n    const currentConfig: Record<string, DeferConfig> = workspace\n      .getConfiguration(\"dbt\")\n      .get(\"deferConfigPerProject\", {});\n    if (currentConfig[relativePath]) {\n      const config = currentConfig[relativePath];\n      const resolvedManifestPath = config.manifestPathForDeferral\n        ? resolveSettingsVariables(\n            config.manifestPathForDeferral,\n            this.projectRoot,\n          )\n        : config.manifestPathForDeferral;\n      return new DeferConfig(\n        config.deferToProduction,\n        config.favorState,\n        resolvedManifestPath,\n        config.manifestPathType,\n        config.dbtCoreIntegrationId,\n      );\n    }\n  }\n\n  getDeferConfig(): DeferConfig {\n    if (!this.dbtProjectIntegration) {\n      throw new Error(\"DBT Project Integration is not initialized.\");\n    }\n    return this.dbtProjectIntegration.getDeferConfig();\n  }\n\n  private createQueue(queueName: string) {\n    this.queues.set(queueName, []);\n  }\n\n  private addCommandToQueue(queueName: string, command: DBTCommand): void {\n    this.queues.get(queueName)!.push({\n      command: async (signal) => {\n        await command.execute(signal);\n      },\n      statusMessage: command.statusMessage,\n      focus: command.focus,\n      signal: command.signal,\n      showProgress: command.showProgress,\n    });\n    this.pickCommandToRun(queueName);\n  }\n\n  private async pickCommandToRun(queueName: string): Promise<void> {\n    const queue = this.queues.get(queueName)!;\n    const running = this.queueStates.get(queueName);\n    if (!running && queue.length > 0) {\n      this.queueStates.set(queueName, true);\n      const { command, statusMessage, focus, showProgress } = queue.shift()!;\n      const commandExecution = async (signal?: AbortSignal) => {\n        try {\n          await command(signal);\n        } catch (error) {\n          if (error instanceof NoCredentialsError) {\n            this.altimateAuthService.handlePreviewFeatures();\n            return;\n          }\n          window.showErrorMessage(\n            extendErrorWithSupportLinks(\n              `Could not run command '${statusMessage}': ` + error + \".\",\n            ),\n          );\n          this.telemetry.sendTelemetryError(\"queueRunCommandError\", error, {\n            command: statusMessage,\n          });\n        }\n      };\n\n      if (showProgress) {\n        await window.withProgress(\n          {\n            location: focus\n              ? ProgressLocation.Notification\n              : ProgressLocation.Window,\n            cancellable: true,\n            title: statusMessage,\n          },\n          async (_, token) => {\n            const abortController = new AbortController();\n            token.onCancellationRequested(() => abortController.abort());\n            await commandExecution(abortController.signal);\n          },\n        );\n      } else {\n        await commandExecution();\n      }\n      this.queueStates.set(queueName, false);\n      this.pickCommandToRun(queueName);\n    }\n  }\n\n  private getCurrentProjectIntegration(): DBTProjectIntegration {\n    return this.dbtProjectIntegration.getCurrentProjectIntegration();\n  }\n}\n"
  },
  {
    "path": "src/dbt_client/dbtProjectContainer.ts",
    "content": "import type { RunResultsEventData } from \"@altimateai/dbt-integration\";\nimport {\n  DataPilotHealtCheckParams,\n  DBTTerminal,\n  EnvironmentVariables,\n  RunModelParams,\n  RunModelType,\n} from \"@altimateai/dbt-integration\";\nimport * as fs from \"fs\";\nimport { inject } from \"inversify\";\nimport { basename } from \"path\";\nimport {\n  commands,\n  Disposable,\n  EventEmitter,\n  ExtensionContext,\n  Uri,\n  window,\n  workspace,\n  WorkspaceFolder,\n} from \"vscode\";\nimport { AltimateRequest } from \"../altimate\";\nimport { DBTClient } from \"../dbt_client\";\nimport { AltimateDatapilot } from \"../dbt_client/datapilot\";\nimport { extractDbtSubcommand } from \"../utils\";\nimport { DBTProject } from \"./dbtProject\";\nimport { DBTWorkspaceFolder } from \"./dbtWorkspaceFolder\";\nimport {\n  ManifestCacheChangedEvent,\n  RebuildManifestCombinedStatusChange,\n} from \"./event/manifestCacheChangedEvent\";\n\nenum PromptAnswer {\n  YES = \"Yes\",\n  IGNORE = \"Ignore\",\n}\n\nexport interface ProjectRegisteredUnregisteredEvent {\n  root: Uri;\n  name: string;\n  registered: boolean;\n}\n\nexport interface DBTProjectsInitializationEvent {}\n\nexport class DBTProjectContainer implements Disposable {\n  public onDBTInstallationVerification =\n    this.dbtClient.onDBTInstallationVerification;\n  private _onDBTProjectsInitializationEvent =\n    new EventEmitter<DBTProjectsInitializationEvent>();\n  public readonly onDBTProjectsInitialization =\n    this._onDBTProjectsInitializationEvent.event;\n  dbtWorkspaceFolders: DBTWorkspaceFolder[] = [];\n  private _onManifestChanged = new EventEmitter<ManifestCacheChangedEvent>();\n  private _onProjectRegisteredUnregistered =\n    new EventEmitter<ProjectRegisteredUnregisteredEvent>();\n  public readonly onManifestChanged = this._onManifestChanged.event;\n  private disposables: Disposable[] = [\n    this._onManifestChanged,\n    this._onProjectRegisteredUnregistered,\n  ];\n  private context?: ExtensionContext;\n  private projects: Map<Uri, string> = new Map<Uri, string>();\n  private _onRebuildManifestStatusChange =\n    new EventEmitter<RebuildManifestCombinedStatusChange>();\n  readonly onRebuildManifestStatusChange =\n    this._onRebuildManifestStatusChange.event;\n  private rebuildManifestStatusChangeMap = new Map<string, boolean>();\n\n  constructor(\n    private dbtClient: DBTClient,\n    @inject(\"Factory<DBTWorkspaceFolder>\")\n    private dbtWorkspaceFolderFactory: (\n      workspaceFolder: WorkspaceFolder,\n      _onManifestChanged: EventEmitter<ManifestCacheChangedEvent>,\n      _onProjectRegisteredUnregistered: EventEmitter<ProjectRegisteredUnregisteredEvent>,\n      pythonPath?: string,\n      envVars?: EnvironmentVariables,\n    ) => DBTWorkspaceFolder,\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n    private altimateDatapilot: AltimateDatapilot,\n    private altimate: AltimateRequest,\n  ) {\n    this.disposables.push(\n      workspace.onDidChangeWorkspaceFolders(async (event) => {\n        const { added, removed } = event;\n        await Promise.all(\n          added.map(\n            async (folder) => await this.registerWorkspaceFolder(folder),\n          ),\n        );\n        removed.forEach((removedWorkspaceFolder) =>\n          this.unregisterWorkspaceFolder(removedWorkspaceFolder),\n        );\n      }),\n      this.dbtClient,\n      this.dbtTerminal,\n    );\n    this._onProjectRegisteredUnregistered.event((event) => {\n      if (event.registered) {\n        this.projects.set(event.root, event.name);\n      } else {\n        this.projects.delete(event.root);\n      }\n    });\n  }\n\n  setContext(context: ExtensionContext) {\n    this.context = context;\n  }\n\n  showErrorIfDbtOrPythonNotInstalled() {\n    return this.dbtClient.showErrorIfDbtOrPythonNotInstalled();\n  }\n\n  showErrorIfDbtIsNotInstalled() {\n    return this.dbtClient.showErrorIfDbtIsNotInstalled();\n  }\n\n  async initializeDBTProjects(): Promise<void> {\n    const folders = workspace.workspaceFolders;\n    if (folders === undefined) {\n      return;\n    }\n    await Promise.all(\n      folders.map((folder) => this.registerWorkspaceFolder(folder)),\n    );\n    this._onDBTProjectsInitializationEvent.fire({});\n  }\n\n  async showWalkthrough() {\n    const answer = await window.showInformationMessage(\n      `Thanks for installing dbt Power User. Do you need help setting up the extension?`,\n      PromptAnswer.YES,\n      PromptAnswer.IGNORE,\n    );\n    commands.executeCommand(\n      \"setContext\",\n      \"dbtPowerUser.showSetupWalkthrough\",\n      false,\n    );\n    if (answer === PromptAnswer.YES) {\n      commands.executeCommand(\"dbtPowerUser.openOnboarding\");\n    }\n    this.setToGlobalState(\"showSetupWalkthrough\", false);\n  }\n\n  async initializeWalkthrough() {\n    // show setup walkthrough if needed\n    const isWalkthroughDisabledFromSettings = workspace\n      .getConfiguration(\"dbt\")\n      .get(\"hideWalkthrough\", false);\n    const showSetupWalkthrough = this.getFromGlobalState(\n      \"showSetupWalkthrough\",\n    );\n    if (\n      !isWalkthroughDisabledFromSettings &&\n      (showSetupWalkthrough === undefined || showSetupWalkthrough === true)\n    ) {\n      this.dbtTerminal.debug(\n        \"dbtProjectContainer:setupWalkthroughDisplayed\",\n        \"showing SetupWalkthrough: value of showSetupWalkthrough is\" +\n          showSetupWalkthrough,\n      );\n      this.showWalkthrough();\n    }\n  }\n\n  get extensionUri() {\n    return this.context!.extensionUri;\n  }\n\n  get extensionVersion() {\n    return this.context!.extension.packageJSON.version;\n  }\n\n  setToWorkspaceState(key: string, value: any) {\n    this.context!.workspaceState.update(key, value);\n  }\n  getFromWorkspaceState(key: string): any {\n    return this.context!.workspaceState.get(key);\n  }\n  setToGlobalState(key: string, value: any) {\n    this.context!.globalState.update(key, value);\n  }\n\n  getFromGlobalState(key: string): any {\n    return this.context!.globalState.get(key);\n  }\n\n  get extensionId(): string {\n    return this.context?.extension.id.toString() || \"\";\n  }\n\n  get pythonInstalled(): boolean {\n    return this.dbtClient.pythonInstalled ?? false;\n  }\n\n  get dbtInstalled(): boolean {\n    return this.dbtClient.dbtInstalled ?? false;\n  }\n\n  // TODO: bypasses events and could be inconsistent\n  getPackageName = (uri: Uri): string | undefined => {\n    return this.findDBTProject(uri)?.findPackageName(uri);\n  };\n\n  // TODO: bypasses events and could be inconsistent\n  getProjectRootpath = (uri: Uri): Uri | undefined => {\n    return this.findDBTProject(uri)?.projectRoot;\n  };\n\n  async detectDBT(): Promise<void> {\n    await this.dbtClient.detectDBT();\n  }\n\n  async reinitialize(): Promise<void> {\n    // Dispose all existing workspace folders\n    this.dbtWorkspaceFolders.forEach((workspaceFolder) =>\n      workspaceFolder.dispose(),\n    );\n    this.dbtWorkspaceFolders = [];\n\n    // Clear projects map\n    this.projects.clear();\n\n    // Clear rebuild manifest status map\n    this.rebuildManifestStatusChangeMap.clear();\n\n    // Re-detect DBT with new integration type\n    await this.detectDBT();\n\n    // Re-initialize DBT projects\n    await this.initializeDBTProjects();\n  }\n\n  async initialize() {\n    this.getProjects().forEach((project) => project.initialize());\n  }\n\n  executeSQL(uri: Uri, query: string, modelName: string): void {\n    if (uri.scheme === \"untitled\") {\n      const selectedProject = this.getFromWorkspaceState(\n        \"dbtPowerUser.projectSelected\",\n      );\n      if (selectedProject) {\n        uri = selectedProject.uri;\n      }\n    }\n    this.findDBTProject(uri)?.executeSQLOnQueryPanel(query, modelName);\n  }\n\n  runModel(modelPath: Uri, type?: RunModelType) {\n    this.findDBTProject(modelPath)?.runModel(\n      this.createModelParams(modelPath, type),\n    );\n  }\n\n  buildModel(modelPath: Uri, type?: RunModelType) {\n    this.findDBTProject(modelPath)?.buildModel(\n      this.createModelParams(modelPath, type),\n    );\n  }\n\n  buildProject(modelPath: Uri, type?: RunModelType) {\n    this.findDBTProject(modelPath)?.buildProject();\n  }\n\n  runTest(modelPath: Uri, testName: string) {\n    this.findDBTProject(modelPath)?.runTest(testName);\n  }\n\n  runModelTest(modelPath: Uri, modelName: string) {\n    this.findDBTProject(modelPath)?.runModelTest(modelName);\n  }\n\n  runModelByName(projectUri: Uri, modelName: string) {\n    this.findDBTProject(projectUri)?.runModel({\n      plusOperatorLeft: \"\",\n      modelName,\n      plusOperatorRight: \"\",\n    });\n  }\n\n  compileModel(modelPath: Uri, type?: RunModelType) {\n    this.findDBTProject(modelPath)?.compileModel(\n      this.createModelParams(modelPath, type),\n    );\n  }\n\n  generateDocs(modelPath: Uri) {\n    this.findDBTProject(modelPath)?.generateDocs();\n  }\n\n  compileQuery(modelPath: Uri, query: string) {\n    return this.findDBTProject(modelPath)?.compileQuery(query);\n  }\n\n  showRunSQL(modelPath: Uri) {\n    this.findDBTProject(modelPath)?.showRunSQL(modelPath);\n  }\n\n  showCompiledSQL(modelPath: Uri) {\n    this.findDBTProject(modelPath)?.showCompiledSql(modelPath);\n  }\n\n  generateSchemaYML(modelPath: Uri, modelName: string) {\n    this.findDBTProject(modelPath)?.generateSchemaYML(modelPath, modelName);\n  }\n\n  findDBTProject(uri: Uri): DBTProject | undefined {\n    return this.findDBTWorkspaceFolder(uri)?.findDBTProject(uri);\n  }\n\n  getProjects(): DBTProject[] {\n    return this.dbtWorkspaceFolders.flatMap((workspaceFolder) =>\n      workspaceFolder.getProjects(),\n    );\n  }\n\n  findProjectByName(projectName: string): DBTProject | undefined {\n    return this.getProjects().find(\n      (project) => project.getProjectName() === projectName,\n    );\n  }\n\n  rerunFromHistory(entry: RunResultsEventData): void {\n    const project = this.findProjectByName(entry.projectName);\n    if (!project) {\n      window.showErrorMessage(\n        `Project \"${entry.projectName}\" is not currently loaded.`,\n      );\n      return;\n    }\n\n    const runModelParams = this.parseHistoryArgs(entry.args);\n\n    switch (extractDbtSubcommand(entry.command)) {\n      case \"run\":\n        if (runModelParams.modelName) {\n          project.runModel(runModelParams);\n        } else {\n          window.showWarningMessage(\n            \"Re-running project-wide dbt run is not currently supported. Please run from the terminal.\",\n          );\n        }\n        break;\n      case \"build\":\n        if (runModelParams.modelName) {\n          project.buildModel(runModelParams);\n        } else {\n          project.buildProject();\n        }\n        break;\n      case \"test\":\n        if (entry.args.length > 0) {\n          project.runTest(entry.args[0]);\n        } else {\n          window.showWarningMessage(\n            \"Re-running project-wide dbt test is not currently supported. Please run tests from the terminal.\",\n          );\n        }\n        break;\n      case \"compile\":\n        if (runModelParams.modelName) {\n          project.compileModel(runModelParams);\n        } else {\n          window.showWarningMessage(\n            \"Re-running project-wide dbt compile is not currently supported. Please run from the terminal.\",\n          );\n        }\n        break;\n      default:\n        window.showWarningMessage(\n          `Re-run is not supported for command: ${entry.command}`,\n        );\n    }\n  }\n\n  private parseHistoryArgs(args: string[]): RunModelParams {\n    if (args.length === 0) {\n      return { plusOperatorLeft: \"\", modelName: \"\", plusOperatorRight: \"\" };\n    }\n    const selector = args[0];\n    const plusOperatorLeft = selector.startsWith(\"+\") ? \"+\" : \"\";\n    const plusOperatorRight = selector.endsWith(\"+\") ? \"+\" : \"\";\n    const modelName = selector.replace(/^\\+/, \"\").replace(/\\+$/, \"\");\n    return { plusOperatorLeft, modelName, plusOperatorRight };\n  }\n\n  getAdapters(): string[] {\n    return Array.from(\n      new Set<string>(\n        this.dbtWorkspaceFolders.flatMap((workspaceFolder) =>\n          workspaceFolder.getAdapters(),\n        ),\n      ),\n    );\n  }\n\n  getPythonEnvironment() {\n    return this.dbtClient.getPythonEnvironment();\n  }\n\n  dispose() {\n    this.dbtWorkspaceFolders.forEach((workspaceFolder) =>\n      workspaceFolder.dispose(),\n    );\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n\n  private createModelParams(modelPath: Uri, type?: RunModelType) {\n    const modelName = basename(\n      fs.realpathSync.native(modelPath.fsPath),\n      \".sql\",\n    );\n    const plusOperatorLeft =\n      type === RunModelType.RUN_PARENTS ||\n      type === RunModelType.BUILD_PARENTS ||\n      type === RunModelType.BUILD_CHILDREN_PARENTS\n        ? \"+\"\n        : \"\";\n    const plusOperatorRight =\n      type === RunModelType.RUN_CHILDREN ||\n      type === RunModelType.BUILD_CHILDREN ||\n      type === RunModelType.BUILD_CHILDREN_PARENTS\n        ? \"+\"\n        : \"\";\n    return { plusOperatorLeft, modelName, plusOperatorRight };\n  }\n\n  private async registerWorkspaceFolder(\n    workspaceFolder: WorkspaceFolder,\n  ): Promise<void> {\n    const dbtProjectWorkspaceFolder = this.dbtWorkspaceFolderFactory(\n      workspaceFolder,\n      this._onManifestChanged,\n      this._onProjectRegisteredUnregistered,\n    );\n    this.disposables.push(\n      dbtProjectWorkspaceFolder.onRebuildManifestStatusChange((e) => {\n        this.rebuildManifestStatusChangeMap.set(\n          e.project.projectRoot.fsPath,\n          e.inProgress,\n        );\n        const inProgressProjects: DBTProject[] = Array.from(\n          this.rebuildManifestStatusChangeMap.entries(),\n        )\n          .filter(([_, inProgress]) => inProgress)\n          .map(([root, _]) => root)\n          .map((root) => this.findDBTProject(Uri.file(root)))\n          .filter((project) => project !== undefined) as DBTProject[];\n\n        this._onRebuildManifestStatusChange.fire({\n          projects: inProgressProjects,\n          inProgress: inProgressProjects.length > 0,\n        });\n      }),\n    );\n    this.dbtWorkspaceFolders.push(dbtProjectWorkspaceFolder);\n    this.dbtTerminal.debug(\n      \"dbtProjectContainer:registerWorkspaceFolder\",\n      \"dbtWorkspaceFolders\",\n      this.dbtWorkspaceFolders,\n    );\n    await dbtProjectWorkspaceFolder.discoverProjects();\n  }\n\n  private unregisterWorkspaceFolder(workspaceFolder: WorkspaceFolder): void {\n    const folderToDelete = this.findDBTWorkspaceFolder(workspaceFolder.uri);\n    if (folderToDelete === undefined) {\n      return;\n    }\n    this.dbtWorkspaceFolders.splice(\n      this.dbtWorkspaceFolders.indexOf(folderToDelete),\n      1,\n    );\n    folderToDelete.dispose();\n  }\n\n  private findDBTWorkspaceFolder(uri: Uri): DBTWorkspaceFolder | undefined {\n    return this.dbtWorkspaceFolders.find((folder) => folder.contains(uri));\n  }\n\n  async checkIfAltimateDatapilotInstalled() {\n    const datapilotVersion =\n      await this.altimateDatapilot.checkIfAltimateDatapilotInstalled();\n    const { altimate_datapilot_version } =\n      await this.altimate.getDatapilotVersion(this.extensionVersion);\n    return datapilotVersion === altimate_datapilot_version;\n  }\n\n  async installAltimateDatapilot() {\n    const { altimate_datapilot_version } =\n      await this.altimate.getDatapilotVersion(this.extensionVersion);\n    await this.altimateDatapilot.installAltimateDatapilot(\n      altimate_datapilot_version,\n    );\n  }\n\n  executeAltimateDatapilotHealthcheck(args: DataPilotHealtCheckParams) {\n    const project = this.getProjects().find(\n      (p) => p.projectRoot.fsPath.toString() === args.projectRoot,\n    );\n    if (!project) {\n      throw new Error(`Unable to find project ${args.projectRoot}`);\n    }\n    return project.performDatapilotHealthcheck(args);\n  }\n}\n"
  },
  {
    "path": "src/dbt_client/dbtProjectLog.ts",
    "content": "import { closeSync, existsSync, openSync, readSync } from \"fs\";\nimport * as path from \"path\";\nimport {\n  Disposable,\n  Event,\n  FileSystemWatcher,\n  OutputChannel,\n  RelativePattern,\n  window,\n  workspace,\n} from \"vscode\";\nimport { setupWatcherHandler, stripANSI } from \"../utils\";\nimport { ProjectConfigChangedEvent } from \"./event/projectConfigChangedEvent\";\n\nexport class DBTProjectLog implements Disposable {\n  private outputChannel?: OutputChannel;\n  private logFileWatcher?: FileSystemWatcher;\n  private logPosition: number = 0;\n  private static LOG_PATH = \"logs\";\n  private static LOG_FILE = \"dbt.log\";\n  private currentProjectName?: string;\n  private disposables: Disposable[] = [];\n\n  constructor(onProjectConfigChanged: Event<ProjectConfigChangedEvent>) {\n    this.disposables.push(\n      onProjectConfigChanged((event) => this.onProjectConfigChanged(event)),\n    );\n  }\n\n  private onProjectConfigChanged(event: ProjectConfigChangedEvent) {\n    const projectRoot = event.project.projectRoot;\n    const projectName = event.project.getProjectName();\n    if (this.outputChannel === undefined) {\n      this.outputChannel = window.createOutputChannel(\n        `${projectName} dbt logs`,\n      );\n      this.readLogFileFromLastPosition(event);\n\n      this.logFileWatcher = workspace.createFileSystemWatcher(\n        new RelativePattern(\n          projectRoot.path,\n          `${DBTProjectLog.LOG_PATH}/${DBTProjectLog.LOG_FILE}`,\n        ),\n      );\n      setupWatcherHandler(this.logFileWatcher, () =>\n        this.readLogFileFromLastPosition(event),\n      );\n      this.currentProjectName = projectName;\n    }\n    if (this.currentProjectName !== projectName) {\n      this.outputChannel.dispose();\n      this.outputChannel = window.createOutputChannel(\n        `${projectName} dbt logs`,\n      );\n      this.logPosition = 0;\n      this.readLogFileFromLastPosition(event);\n      this.currentProjectName = projectName;\n    }\n  }\n\n  private readLogFileFromLastPosition(event: ProjectConfigChangedEvent): void {\n    const {\n      project: { projectRoot },\n    } = event;\n    const logPath = path.join(\n      projectRoot.fsPath,\n      DBTProjectLog.LOG_PATH,\n      DBTProjectLog.LOG_FILE,\n    );\n    if (this.outputChannel && existsSync(logPath)) {\n      let fileHandle;\n      try {\n        fileHandle = openSync(logPath, \"r\");\n        const chunkSize = 1024 * 1024;\n        const buffer = Buffer.alloc(chunkSize);\n        while (true) {\n          const bytesRead = readSync(\n            fileHandle,\n            buffer,\n            0,\n            buffer.length,\n            this.logPosition,\n          );\n          if (!bytesRead) {\n            break;\n          }\n          this.logPosition += bytesRead;\n          this.outputChannel.appendLine(\n            stripANSI(buffer.toString(\"utf8\", 0, bytesRead)),\n          );\n        }\n      } catch (error) {\n        console.log(\"Could not read log file\", error);\n      } finally {\n        if (fileHandle) {\n          closeSync(fileHandle);\n        }\n      }\n    }\n  }\n\n  public dispose() {\n    if (this.outputChannel !== undefined) {\n      this.outputChannel.dispose();\n    }\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/dbt_client/dbtVersionEvent.ts",
    "content": "export interface DBTInstallationVerificationEvent {\n  inProgress: boolean;\n  installed?: boolean;\n}\n"
  },
  {
    "path": "src/dbt_client/dbtWorkspaceFolder.ts",
    "content": "import { existsSync, statSync } from \"fs\";\nimport { inject } from \"inversify\";\nimport * as path from \"path\";\nimport {\n  Diagnostic,\n  Disposable,\n  EventEmitter,\n  FileSystemWatcher,\n  languages,\n  Range,\n  RelativePattern,\n  Uri,\n  window,\n  workspace,\n  WorkspaceFolder,\n} from \"vscode\";\nimport { YAMLError } from \"yaml\";\nimport { TelemetryService } from \"../telemetry\";\nimport { DBTProject } from \"./dbtProject\";\nimport { ProjectRegisteredUnregisteredEvent } from \"./dbtProjectContainer\";\nimport {\n  ManifestCacheChangedEvent,\n  RebuildManifestStatusChange,\n} from \"./event/manifestCacheChangedEvent\";\n\nimport {\n  DBT_PROJECT_FILE,\n  DBTProjectDetection,\n  DBTTerminal,\n  readAndParseProjectConfig,\n} from \"@altimateai/dbt-integration\";\n\nexport class DBTWorkspaceFolder implements Disposable {\n  private watcher: FileSystemWatcher;\n  readonly projectDiscoveryDiagnostics =\n    languages.createDiagnosticCollection(\"dbt\");\n  private dbtProjects: DBTProject[] = [];\n  private disposables: Disposable[] = [];\n  private _onRebuildManifestStatusChange =\n    new EventEmitter<RebuildManifestStatusChange>();\n  readonly onRebuildManifestStatusChange =\n    this._onRebuildManifestStatusChange.event;\n\n  constructor(\n    @inject(\"DBTProjectFactory\")\n    private dbtProjectFactory: (\n      path: Uri,\n      projectConfig: any,\n      _onManifestChanged: EventEmitter<ManifestCacheChangedEvent>,\n    ) => DBTProject,\n    @inject(\"Factory<DBTProjectDetection>\")\n    private dbtProjectDetectionFactory: () => DBTProjectDetection,\n    private telemetry: TelemetryService,\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n    public workspaceFolder: WorkspaceFolder,\n    private _onManifestChanged: EventEmitter<ManifestCacheChangedEvent>,\n    private _onProjectRegisteredUnregistered: EventEmitter<ProjectRegisteredUnregisteredEvent>,\n  ) {\n    this.watcher = this.createConfigWatcher();\n    this.disposables.push(this.watcher);\n  }\n\n  getAllowListFolders() {\n    const nonFilteredAlolowListFolders = workspace\n      .getConfiguration(\"dbt\")\n      .get<string[]>(\"allowListFolders\", [])\n      .map((folder) => {\n        if (!path.isAbsolute(folder)) {\n          return path.join(this.workspaceFolder.uri.fsPath, folder);\n        }\n        return folder;\n      });\n    const allowListFolders = nonFilteredAlolowListFolders.filter((folder) =>\n      existsSync(folder),\n    );\n    if (nonFilteredAlolowListFolders.length === allowListFolders.length) {\n      console.warn(\n        \"filtered out non-existing allowListFolders\",\n        allowListFolders,\n        nonFilteredAlolowListFolders,\n      );\n      this.telemetry.sendTelemetryEvent(\"nonExistingAllowListFolders\");\n    }\n    return allowListFolders;\n  }\n\n  private async retryWithBackoff<T>(\n    fn: () => Thenable<T>,\n    retries: number = 5,\n    backoff: number = 1000,\n  ): Promise<T> {\n    let attempt = 0;\n    while (attempt < retries) {\n      try {\n        const result = await fn();\n        if (Array.isArray(result) && result.length === 0) {\n          this.dbtTerminal.debug(\n            \"discoverProjects\",\n            \"no projects found. retrying...\",\n            false,\n          );\n          throw new Error(\"no projects found. retrying\");\n        }\n        return result;\n      } catch (error) {\n        attempt++;\n        if (attempt >= retries) {\n          throw error;\n        }\n        await new Promise((resolve) => setTimeout(resolve, backoff * attempt));\n      }\n    }\n    this.dbtTerminal.debug(\n      \"discoverProjects\",\n      \"no projects found after maximum retries\",\n      false,\n    );\n    throw new Error(\"no projects found after maximum retries\");\n  }\n\n  async discoverProjects() {\n    // Ignore dbt_packages and venv/site-packages/dbt project folders\n    const excludePattern =\n      \"**/{dbt_packages,site-packages,dbt_internal_packages}\";\n    const dbtProjectFiles = await this.retryWithBackoff(\n      () =>\n        workspace.findFiles(\n          new RelativePattern(this.workspaceFolder, `**/${DBT_PROJECT_FILE}`),\n          new RelativePattern(this.workspaceFolder, excludePattern),\n        ),\n      5,\n      1000,\n    );\n    this.dbtTerminal.info(\n      \"discoverProjects\",\n      \"foundProjects\",\n      false,\n      dbtProjectFiles,\n    );\n\n    const allowListFolders = this.getAllowListFolders();\n    this.dbtTerminal.info(\n      \"discoverProjects\",\n      \"allowListFolders\",\n      false,\n      allowListFolders,\n    );\n\n    const projectDirectories = dbtProjectFiles\n      .filter((uri) => existsSync(uri.fsPath) && statSync(uri.fsPath).isFile())\n      .filter((uri) => this.notInVenv(uri.fsPath))\n      .filter((uri) => {\n        return (\n          allowListFolders.length === 0 ||\n          allowListFolders.some((folder) => uri.fsPath.startsWith(folder))\n        );\n      })\n      .map((uri) => Uri.file(uri.path.split(\"/\")!.slice(0, -1).join(\"/\")));\n\n    this.dbtTerminal.info(\n      \"discoverProjects\",\n      \"foundProjectsAfterFilter\",\n      false,\n      projectDirectories,\n    );\n\n    this.telemetry.sendTelemetryEvent(\n      \"discoverProjects\",\n      {},\n      { numProjects: projectDirectories.length },\n    );\n\n    const dbtIntegrationMode = workspace\n      .getConfiguration(\"dbt\")\n      .get<string>(\"dbtIntegration\", \"core\");\n\n    const filteredProjects =\n      await this.dbtProjectDetectionFactory().discoverProjects(\n        projectDirectories.map((uri) => uri.fsPath),\n      );\n\n    if (filteredProjects.length > 20) {\n      window.showWarningMessage(\n        `dbt Power User detected ${filteredProjects.length} projects in your workspace, this will negatively affect performance.`,\n      );\n    }\n\n    this.dbtTerminal.info(\n      \"discoverProjects\",\n      \"foundProjectsAfterProjectIntegrationFilter\",\n      false,\n      filteredProjects,\n    );\n\n    await Promise.all(\n      filteredProjects.map(async (projectPath) => {\n        await this.registerDBTProject(Uri.file(projectPath));\n      }),\n    );\n  }\n\n  findDBTProject(uri: Uri): DBTProject | undefined {\n    return this.dbtProjects.find((project) => project.contains(uri));\n  }\n\n  getProjects(): DBTProject[] {\n    return this.dbtProjects;\n  }\n\n  contains(uri: Uri) {\n    if (!uri?.fsPath) {\n      return false;\n    }\n    return (\n      uri.fsPath === this.workspaceFolder.uri.fsPath ||\n      uri.fsPath.startsWith(this.workspaceFolder.uri.fsPath + path.sep)\n    );\n  }\n\n  getAdapters(): string[] {\n    return Array.from(\n      new Set<string>(\n        this.dbtProjects.map((project) => project.getAdapterType()),\n      ),\n    );\n  }\n\n  dispose() {\n    this.dbtProjects.forEach((project) => project.dispose());\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n\n  private async registerDBTProject(uri: Uri) {\n    try {\n      const projectConfig = readAndParseProjectConfig(uri.fsPath);\n      const dbtProject = this.dbtProjectFactory(\n        uri,\n        projectConfig,\n        this._onManifestChanged,\n      );\n      this.disposables.push(\n        dbtProject.onRebuildManifestStatusChange((e) => {\n          this._onRebuildManifestStatusChange.fire(e);\n        }),\n      );\n      this.dbtProjects.push(dbtProject);\n      // sorting the dbt projects descending by path ensures that we find the deepest path first\n      this.dbtProjects.sort(\n        (a, b) => -a.projectRoot.fsPath.localeCompare(b.projectRoot.fsPath),\n      );\n      await dbtProject.initialize();\n      this.projectDiscoveryDiagnostics.clear();\n      this._onProjectRegisteredUnregistered.fire({\n        root: uri,\n        name: dbtProject.getProjectName(),\n        registered: true,\n      });\n    } catch (error) {\n      this.dbtTerminal.error(\n        \"registerDBTProject\",\n        `Unable to register dbt project for ${uri.fsPath}`,\n        error,\n      );\n      if (error instanceof YAMLError) {\n        this.projectDiscoveryDiagnostics.set(\n          Uri.joinPath(uri, DBT_PROJECT_FILE),\n          [new Diagnostic(new Range(0, 0, 999, 999), error.message)],\n        );\n      }\n      window.showErrorMessage(\n        `Skipping project: could not parse dbt_project_config.yml at '${uri}': ${error}`,\n      );\n      this.telemetry.sendTelemetryError(\"registerDBTProjectError\", error);\n    }\n  }\n\n  private async unregisterDBTProject(uri: Uri) {\n    const projectToDelete = this.dbtProjects.find(\n      (dbtProject) => dbtProject.projectRoot.fsPath === uri.fsPath,\n    );\n    if (projectToDelete === undefined) {\n      return;\n    }\n    this.dbtProjects.splice(this.dbtProjects.indexOf(projectToDelete), 1);\n    this._onProjectRegisteredUnregistered.fire({\n      root: uri,\n      name: projectToDelete.getProjectName(),\n      registered: false,\n    });\n    await projectToDelete.dispose();\n  }\n\n  private createConfigWatcher(): FileSystemWatcher {\n    const watcher = workspace.createFileSystemWatcher(\n      new RelativePattern(this.workspaceFolder, `**/${DBT_PROJECT_FILE}`),\n    );\n\n    const dirName = (uri: Uri) => Uri.file(path.dirname(uri.fsPath));\n\n    watcher.onDidCreate((uri) => {\n      const allowListFolders = this.getAllowListFolders();\n      if (\n        existsSync(uri.fsPath) &&\n        statSync(uri.fsPath).isFile() &&\n        this.notInVenv(uri.fsPath) &&\n        this.notInDBtPackages(\n          uri.fsPath,\n          this.dbtProjects.map((project) => project.getPackageInstallPath()),\n        ) &&\n        (allowListFolders.length === 0 ||\n          allowListFolders.some((folder) => uri.fsPath.startsWith(folder)))\n      ) {\n        this.registerDBTProject(dirName(uri));\n      }\n    });\n    watcher.onDidDelete((uri) => this.unregisterDBTProject(dirName(uri)));\n    this.disposables.push(watcher);\n    return watcher;\n  }\n\n  private notInVenv(path: string): boolean {\n    const notInVenv = !path.includes(\"site-packages\");\n    if (!notInVenv) {\n      this.dbtTerminal.info(\n        \"discoverProjects\",\n        \"foundProjectInVenv\",\n        false,\n        path,\n      );\n    }\n    return notInVenv;\n  }\n\n  private notInDBtPackages(\n    uri: string,\n    packagesInstallPaths: (string | undefined)[],\n  ) {\n    for (const packagesInstallPath of packagesInstallPaths) {\n      if (packagesInstallPath) {\n        if (uri.startsWith(packagesInstallPath)) {\n          return false;\n        }\n      }\n    }\n    return true;\n  }\n}\n"
  },
  {
    "path": "src/dbt_client/event/manifestCacheChangedEvent.ts",
    "content": "import {\n  DocMetaMap,\n  ExposureMetaMap,\n  FunctionMetaMap,\n  GraphMetaMap,\n  MacroMetaMap,\n  MetricMetaMap,\n  NodeMetaMap,\n  SourceMetaMap,\n  TestMetaMap,\n} from \"@altimateai/dbt-integration\";\nimport { Uri } from \"vscode\";\nimport { DBTProject } from \"../dbtProject\";\n\nexport interface ManifestCacheProjectAddedEvent {\n  project: DBTProject;\n  nodeMetaMap: NodeMetaMap;\n  macroMetaMap: MacroMetaMap;\n  metricMetaMap: MetricMetaMap;\n  sourceMetaMap: SourceMetaMap;\n  graphMetaMap: GraphMetaMap;\n  testMetaMap: TestMetaMap;\n  docMetaMap: DocMetaMap;\n  exposureMetaMap: ExposureMetaMap;\n  functionMetaMap: FunctionMetaMap;\n  modelDepthMap: Map<string, number>;\n}\n\nexport interface ManifestCacheProjectRemovedEvent {\n  projectRoot: Uri;\n}\n\nexport interface ManifestCacheChangedEvent {\n  added?: ManifestCacheProjectAddedEvent[];\n  removed?: ManifestCacheProjectRemovedEvent[];\n}\n\nexport interface RebuildManifestStatusChange {\n  project: DBTProject;\n  inProgress: boolean;\n}\n\nexport interface RebuildManifestCombinedStatusChange {\n  projects: DBTProject[];\n  inProgress: boolean;\n}\n"
  },
  {
    "path": "src/dbt_client/event/projectConfigChangedEvent.ts",
    "content": "import { DBTProject } from \"../dbtProject\";\nexport class ProjectConfigChangedEvent {\n  constructor(public project: DBTProject) {}\n}\n"
  },
  {
    "path": "src/dbt_client/event/runResultsEvent.ts",
    "content": "import { DBTProject } from \"../dbtProject\";\n\nexport class RunResultsEvent {\n  constructor(\n    public project: DBTProject,\n    public uniqueIds?: string[],\n  ) {}\n}\n"
  },
  {
    "path": "src/dbt_client/index.ts",
    "content": "import { DBTDetection } from \"@altimateai/dbt-integration\";\nimport { existsSync } from \"fs\";\nimport { inject } from \"inversify\";\nimport { commands, Disposable, EventEmitter, window, workspace } from \"vscode\";\nimport { DBTInstallationVerificationEvent } from \"./dbtVersionEvent\";\nimport { PythonEnvironment } from \"./pythonEnvironment\";\n\nenum PythonInterpreterPromptAnswer {\n  SELECT = \"Select Python interpreter\",\n  DETECT = \"Detect from terminal\",\n}\n\nexport class DBTClient implements Disposable {\n  private _onDBTInstallationVerificationEvent =\n    new EventEmitter<DBTInstallationVerificationEvent>();\n  public readonly onDBTInstallationVerification =\n    this._onDBTInstallationVerificationEvent.event;\n  private _dbtInstalled?: boolean;\n  private _pythonInstalled?: boolean;\n  public get dbtInstalled() {\n    return this._dbtInstalled;\n  }\n  public get pythonInstalled() {\n    return this._pythonInstalled;\n  }\n  private disposables: Disposable[] = [\n    this._onDBTInstallationVerificationEvent,\n  ];\n  private shownError = false;\n  constructor(\n    @inject(PythonEnvironment)\n    private pythonEnvironment: PythonEnvironment,\n    @inject(\"Factory<DBTDetection>\")\n    private dbtDetectionFactory: () => DBTDetection,\n  ) {}\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n\n  async detectDBT(): Promise<void> {\n    await this.pythonEnvironment.initialize();\n    this.disposables.push(\n      this.pythonEnvironment.onPythonEnvironmentChanged(() => {\n        this.checkAllInstalled();\n      }),\n    );\n    await this.checkAllInstalled();\n  }\n\n  private async checkAllInstalled(): Promise<void> {\n    this._onDBTInstallationVerificationEvent.fire({\n      inProgress: true,\n    });\n    this.shownError = false;\n    this._dbtInstalled = undefined;\n    this._pythonInstalled = this.pythonPathExists();\n    this._dbtInstalled = await this.dbtDetectionFactory().detectDBT();\n    // Refresh cached Python version — by this point the Python extension\n    // has settled after an interpreter change\n    await this.pythonEnvironment.refreshPythonVersion();\n    this._onDBTInstallationVerificationEvent.fire({\n      inProgress: false,\n      installed: this._dbtInstalled,\n    });\n    commands.executeCommand(\n      \"setContext\",\n      \"dbtPowerUser.dbtInstalled\",\n      this._dbtInstalled,\n    );\n    if (!this._dbtInstalled) {\n      this.showErrorIfDbtOrPythonNotInstalled();\n    }\n  }\n\n  async showErrorIfDbtOrPythonNotInstalled() {\n    if (!this._pythonInstalled) {\n      if (!this.shownError) {\n        // We don't want to flood the user with errors\n        this.shownError = true;\n        const answer = await window.showErrorMessage(\n          \"No Python interpreter is selected or Python is not installed\",\n          PythonInterpreterPromptAnswer.SELECT,\n          PythonInterpreterPromptAnswer.DETECT,\n        );\n        if (answer === PythonInterpreterPromptAnswer.SELECT) {\n          commands.executeCommand(\"python.setInterpreter\");\n        } else if (answer === PythonInterpreterPromptAnswer.DETECT) {\n          commands.executeCommand(\"dbtPowerUser.detectPythonFromTerminal\");\n        }\n      }\n      return false;\n    }\n    if (!this.pythonEnvironment.isPython3) {\n      const answer = await window.showErrorMessage(\n        \"Only Python 3 is supported by dbt, please select a Python 3 interpreter\",\n        PythonInterpreterPromptAnswer.SELECT,\n        PythonInterpreterPromptAnswer.DETECT,\n      );\n      if (answer === PythonInterpreterPromptAnswer.SELECT) {\n        commands.executeCommand(\"python.setInterpreter\");\n      } else if (answer === PythonInterpreterPromptAnswer.DETECT) {\n        commands.executeCommand(\"dbtPowerUser.detectPythonFromTerminal\");\n      }\n      return false;\n    }\n    return this.showErrorIfDbtIsNotInstalled();\n  }\n\n  private async executeInstallDbtCommand(message: string, option: string) {\n    const answer = await window.showErrorMessage(\n      message,\n      option,\n      PythonInterpreterPromptAnswer.DETECT,\n      \"Troubleshoot\",\n    );\n    if (answer === option) {\n      commands.executeCommand(\"dbtPowerUser.installDbt\");\n    } else if (answer === PythonInterpreterPromptAnswer.DETECT) {\n      commands.executeCommand(\"dbtPowerUser.detectPythonFromTerminal\");\n    } else if (answer?.includes(\"Troubleshoot\")) {\n      commands.executeCommand(\"dbtPowerUser.openSetupWalkthrough\");\n    }\n  }\n\n  async showErrorIfDbtIsNotInstalled() {\n    if (!this._dbtInstalled) {\n      if (!this.shownError) {\n        // We don't want to flood the user with errors\n        this.shownError = true;\n        const dbtIntegrationMode = workspace\n          .getConfiguration(\"dbt\")\n          .get<string>(\"dbtIntegration\", \"core\");\n        switch (dbtIntegrationMode) {\n          case \"fusion\":\n            await this.executeInstallDbtCommand(\n              \"Please ensure dbt fusion cli is installed.\",\n              \"Install dbt fusion\",\n            );\n            break;\n          case \"core\":\n            await this.executeInstallDbtCommand(\n              \"Please ensure dbt core cli is installed.\",\n              \"Install dbt core\",\n            );\n            break;\n          case \"cloud\":\n            await this.executeInstallDbtCommand(\n              \"Please ensure dbt cloud cli is installed.\",\n              \"Install dbt cloud\",\n            );\n            break;\n          default:\n            window.showErrorMessage(\n              `Unknown dbt integration mode: ${dbtIntegrationMode}. Supported modes are: core, cloud, fusion.`,\n            );\n            break;\n        }\n      }\n      return false;\n    }\n    return true;\n  }\n\n  getPythonEnvironment() {\n    return this.pythonEnvironment;\n  }\n\n  private pythonPathExists() {\n    return (\n      this.pythonEnvironment.pythonPath !== undefined &&\n      existsSync(this.pythonEnvironment.pythonPath)\n    );\n  }\n}\n"
  },
  {
    "path": "src/dbt_client/pythonEnvironment.ts",
    "content": "import { DBTTerminal, EnvironmentVariables } from \"@altimateai/dbt-integration\";\nimport { inject } from \"inversify\";\nimport {\n  Disposable,\n  Event,\n  extensions,\n  Terminal,\n  Uri,\n  window,\n  workspace,\n  WorkspaceFolder,\n} from \"vscode\";\n\ntype EnvFrom = \"process\" | \"integrated\" | \"dotenv\";\ninterface EnvVarsResult {\n  vars: EnvironmentVariables;\n  sources: Record<string, EnvFrom>;\n}\ninterface PythonExecutionDetails {\n  getPythonPath: () => string;\n  onDidChangeExecutionDetails: Event<Uri | undefined>;\n  getEnvVars: (workspaceFolder?: WorkspaceFolder) => EnvVarsResult;\n}\n\nexport class PythonEnvironment {\n  private executionDetails?: PythonExecutionDetails;\n  private disposables: Disposable[] = [];\n  public allPythonPaths: { path: string; pathType: string }[] = [];\n  public isPython3: boolean = true;\n  private _pythonVersion?: string;\n\n  constructor(\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n  ) {}\n\n  async dispose(): Promise<void> {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n\n  async printEnvVars(workspaceFolder?: WorkspaceFolder) {\n    await this.dbtTerminal.show(true);\n    if (!this.executionDetails) {\n      throw new Error(\n        \"executionDetails is undefined, cannot retrieve environment variables\",\n      );\n    }\n    const { vars, sources } = this.executionDetails.getEnvVars(workspaceFolder);\n    this.dbtTerminal.log(\"Printing environment variables...\\r\\n\");\n    for (const key in vars) {\n      this.dbtTerminal.log(`${key}=${vars[key]}\\t\\tsource:${sources[key]}\\r\\n`);\n    }\n  }\n\n  public get pythonPath() {\n    return (\n      this.getResolvedConfigValue(\"dbtPythonPathOverride\") ||\n      this.executionDetails!.getPythonPath()\n    );\n  }\n\n  public get pythonVersion(): string | undefined {\n    return this._pythonVersion;\n  }\n\n  /** Re-fetch the Python version from the Python extension (call after interpreter change) */\n  public async refreshPythonVersion(): Promise<void> {\n    try {\n      const extension = extensions.getExtension(\"ms-python.python\");\n      if (!extension?.isActive) {\n        return;\n      }\n      const api = extension.exports;\n      const pythonPath = this.pythonPath;\n      const envDetails =\n        await api.environment.getEnvironmentDetails(pythonPath);\n      this._pythonVersion = envDetails?.version?.join(\".\");\n      this.isPython3 = envDetails?.version?.[0] === \"3\";\n    } catch (e) {\n      this.dbtTerminal.debug(\n        \"pythonEnvironment:refreshPythonVersion\",\n        \"Failed to refresh Python version; keeping previous values\",\n        e,\n      );\n    }\n  }\n\n  public get environmentVariables(): EnvironmentVariables {\n    return this.getEnvironmentVariables();\n  }\n\n  public getEnvironmentVariables(\n    workspaceFolder?: WorkspaceFolder,\n  ): EnvironmentVariables {\n    if (!this.executionDetails) {\n      throw new Error(\n        \"executionDetails is undefined, cannot retrieve environment variables\",\n      );\n    }\n    return this.executionDetails.getEnvVars(workspaceFolder).vars;\n  }\n\n  public get onPythonEnvironmentChanged() {\n    return this.executionDetails!.onDidChangeExecutionDetails;\n  }\n\n  async initialize(): Promise<void> {\n    if (this.executionDetails !== undefined) {\n      return;\n    }\n\n    this.executionDetails = await this.activatePythonExtension();\n  }\n\n  getResolvedConfigValue(key: string, workspaceFolder?: WorkspaceFolder) {\n    const value = workspace\n      .getConfiguration(\"dbt\", workspaceFolder?.uri)\n      .get<string>(key, \"\");\n    return this.substituteSettingsVariables(\n      value,\n      this.getEnvironmentVariables(workspaceFolder),\n      workspaceFolder,\n    );\n  }\n\n  private substituteSettingsVariables(\n    value: any,\n    vsCodeEnv: EnvironmentVariables,\n    workspaceFolder?: WorkspaceFolder,\n    sources?: Record<string, EnvFrom>,\n  ): any {\n    if (!value) {\n      return value;\n    }\n    if (typeof value !== \"string\") {\n      return value;\n    }\n    const regexVsCodeEnv = /\\$\\{env\\:(.*?)\\}/gm;\n    let matchResult;\n    while ((matchResult = regexVsCodeEnv.exec(value)) !== null) {\n      // This is necessary to avoid infinite loops with zero-width matches\n      if (matchResult.index === regexVsCodeEnv.lastIndex) {\n        regexVsCodeEnv.lastIndex++;\n      }\n      if (vsCodeEnv[matchResult[1]] !== undefined) {\n        value = value.replace(\n          new RegExp(`\\\\\\$\\\\\\{env\\\\\\:${matchResult[1]}\\\\\\}`, \"gm\"),\n          vsCodeEnv[matchResult[1]]!,\n        );\n        this.dbtTerminal.debug(\n          \"pythonEnvironment:substituteSettingsVariables\",\n          `Picking env var ${matchResult[1]} from ${sources?.[matchResult[1]]}`,\n        );\n      }\n    }\n    const resolvedFolder = workspaceFolder || workspace.workspaceFolders?.[0];\n    if (resolvedFolder) {\n      value = value.replace(\"${workspaceFolder}\", resolvedFolder.uri.fsPath);\n    }\n    return value;\n  }\n\n  /**\n   * Detect Python with dbt installed from the VS Code integrated terminal.\n   * Uses shell integration API to execute a probe command in a real terminal\n   * (which has the user's shell profile, venv activations, conda, etc.).\n   * Returns undefined if no terminal with shell integration is available.\n   */\n  public async detectPythonFromShell(): Promise<string | undefined> {\n    // Unique markers to reliably extract the path from noisy terminal output.\n    const startMarker = \"__DBT_DETECT_START__\";\n    const endMarker = \"__DBT_DETECT_END__\";\n    // Build a platform-appropriate command string.\n    // POSIX shells: outer single quotes, inner double quotes in Python code.\n    // Windows/PowerShell: outer double quotes, inner single quotes in Python code.\n    const isWindows = process.platform === \"win32\";\n    const pyCodePosix = `import sys; __import__(\"dbt\"); print(\"${startMarker}\"); print(sys.executable); print(\"${endMarker}\")`;\n    const pyCodeWin = `import sys; __import__('dbt'); print('${startMarker}'); print(sys.executable); print('${endMarker}')`;\n    const buildCmd = (pythonCmd: string) =>\n      isWindows\n        ? `${pythonCmd} -c \"${pyCodeWin}\"`\n        : `${pythonCmd} -c '${pyCodePosix}'`;\n\n    const terminal = this.findTerminalWithShellIntegration();\n    if (!terminal?.shellIntegration) {\n      this.dbtTerminal.debug(\n        \"pythonEnvironment:detectPythonFromShell\",\n        \"No terminal with shell integration found\",\n      );\n      return undefined;\n    }\n\n    this.dbtTerminal.debug(\n      \"pythonEnvironment:detectPythonFromShell\",\n      `Using terminal: ${terminal.name}`,\n    );\n    for (const pythonCmd of [\"python3\", \"python\"]) {\n      const result = await this.executeInTerminal(\n        terminal,\n        buildCmd(pythonCmd),\n        startMarker,\n        endMarker,\n      );\n      if (result) {\n        return result;\n      }\n    }\n\n    return undefined;\n  }\n\n  private findTerminalWithShellIntegration(): Terminal | undefined {\n    // Prefer the active terminal if it has shell integration\n    const active = window.activeTerminal;\n    if (active?.shellIntegration) {\n      return active;\n    }\n    // Otherwise find any terminal with shell integration\n    return window.terminals.find((t) => t.shellIntegration !== undefined);\n  }\n\n  private async executeInTerminal(\n    terminal: Terminal,\n    commandLine: string,\n    startMarker: string,\n    endMarker: string,\n  ): Promise<string | undefined> {\n    if (!terminal.shellIntegration) {\n      return undefined;\n    }\n    const execution = terminal.shellIntegration.executeCommand(commandLine);\n    // Race the stream read against a 10s timeout to avoid hanging indefinitely\n    const output = await Promise.race([\n      (async () => {\n        let collected = \"\";\n        for await (const data of execution.read()) {\n          collected += data;\n        }\n        return collected;\n      })(),\n      new Promise<undefined>((resolve) =>\n        setTimeout(() => resolve(undefined), 10_000),\n      ),\n    ]);\n    if (output === undefined) {\n      this.dbtTerminal.debug(\n        \"pythonEnvironment:executeInTerminal\",\n        `Timed out executing: ${commandLine}`,\n      );\n      return undefined;\n    }\n    // Strip ANSI/OSC escape codes and control characters\n    const cleaned = output.replace(\n      // eslint-disable-next-line no-control-regex\n      /\\x1B(?:\\][^\\x07\\x1B]*(?:\\x07|\\x1B\\\\)|[@-Z\\\\-_]|\\[[0-?]*[ -/]*[@-~])/g,\n      \"\",\n    );\n    this.dbtTerminal.debug(\n      \"pythonEnvironment:executeInTerminal\",\n      `Terminal output (cleaned): ${cleaned.slice(0, 500)}`,\n    );\n    // Extract the path between our unique markers\n    const startIdx = cleaned.indexOf(startMarker);\n    const endIdx = cleaned.indexOf(endMarker);\n    if (startIdx === -1 || endIdx === -1 || endIdx <= startIdx) {\n      return undefined;\n    }\n    const between = cleaned.slice(startIdx + startMarker.length, endIdx).trim();\n    if (between) {\n      this.dbtTerminal.debug(\n        \"pythonEnvironment:executeInTerminal\",\n        `Detected Python with dbt at: ${between}`,\n      );\n      return between;\n    }\n    return undefined;\n  }\n\n  private async activatePythonExtension(): Promise<PythonExecutionDetails> {\n    const extension = extensions.getExtension(\"ms-python.python\")!;\n\n    if (!extension.isActive) {\n      await extension.activate();\n    }\n    await extension.exports.ready;\n\n    const api = extension.exports;\n    this.allPythonPaths = await api.environment.getEnvironmentPaths();\n    const pythonPath = api.settings.getExecutionDetails(workspace.workspaceFile)\n      .execCommand[0];\n    const envDetails = await api.environment.getEnvironmentDetails(pythonPath);\n    this.isPython3 = envDetails?.version?.[0] === \"3\";\n    this._pythonVersion = envDetails?.version?.join(\".\");\n\n    const dbtInstalledPythonPath: string[] = [];\n    // TODO: support multiple workspacefolders for python detection\n    // for (const workspaceFolder of workspace.workspaceFolders || []) {\n    //   const candidatePythonPath = api.settings.getExecutionDetails(\n    //     workspaceFolder.uri,\n    //   ).execCommand[0];\n\n    //   const dbtInstalledCommand =\n    //     this.dbtCommandFactory.createVerifyDbtInstalledCommand();\n    //   const checkDBTInstalledProcess =\n    //     this.commandProcessExecutionFactory.createCommandProcessExecution({\n    //       command: candidatePythonPath,\n    //       args: dbtInstalledCommand.processExecutionParams.args,\n    //     });\n\n    //   try {\n    //     await checkDBTInstalledProcess.complete();\n    //   } catch {\n    //     continue;\n    //   }\n\n    //   dbtInstalledPythonPath.push(candidatePythonPath);\n    // }\n\n    return (this.executionDetails = {\n      getPythonPath: () => {\n        if (dbtInstalledPythonPath.length > 0) {\n          return dbtInstalledPythonPath[0];\n        } else {\n          return api.settings.getExecutionDetails(workspace.workspaceFile)\n            .execCommand[0];\n        }\n      },\n      onDidChangeExecutionDetails: api.settings.onDidChangeExecutionDetails,\n      // There are 3 places from where we can get environments variables:\n      // 1. process env    2. integrated terminal env    3. dot env file(we can get this from python extension)\n      // Collecting env vars from all 3 places and merging them into one in the above order\n      // While merging, also tagging the places from where the env var has come.\n      getEnvVars: (workspaceFolder?: WorkspaceFolder) => {\n        const envVars: EnvironmentVariables = {};\n        const sources: Record<string, EnvFrom> = {};\n        for (const key in process.env) {\n          envVars[key] = process.env[key];\n          sources[key] = \"process\";\n        }\n        try {\n          const integratedEnv:\n            | Record<string, Record<string, string>>\n            | undefined = workspace\n            .getConfiguration(\"terminal\")\n            .get(\"integrated.env\");\n          if (integratedEnv) {\n            // parse vs code environment variables\n            for (const prop in integratedEnv) {\n              // Ignore any settings not supported by the terminal\n              // We don't know which os is used in terminal unfortunately, so we just merge all of them.\n              if (![\"osx\", \"windows\", \"linux\"].includes(prop)) {\n                this.dbtTerminal.debug(\n                  \"pythonEnvironment:envVars\",\n                  \"Loading env vars from config.terminal.integrated.env\",\n                  \"Ignoring invalid property \" + prop,\n                );\n                continue;\n              }\n              this.dbtTerminal.debug(\n                \"pythonEnvironment:envVars\",\n                \"Loading env vars from config.terminal.integrated.env\",\n                \"Merging from \" + prop,\n                Object.keys(integratedEnv[prop]),\n              );\n              for (const key in integratedEnv[prop]) {\n                envVars[key] = this.substituteSettingsVariables(\n                  integratedEnv[prop][key],\n                  process.env,\n                  workspaceFolder,\n                  sources,\n                );\n                sources[key] = \"integrated\";\n              }\n            }\n          }\n          if (api.environments) {\n            const workspacePath =\n              workspaceFolder || workspace.workspaceFolders?.[0];\n            if (workspacePath) {\n              this.dbtTerminal.debug(\n                \"pythonEnvironment:envVars\",\n                `workspacePath:${workspacePath.uri.fsPath}`,\n              );\n              const workspaceEnv =\n                api.environments.getEnvironmentVariables(workspacePath);\n              this.dbtTerminal.debug(\n                \"pythonEnvironment:envVars\",\n                `workspaceEnv:${Object.keys(workspaceEnv)}`,\n              );\n              for (const key in workspaceEnv) {\n                // env var from python extension also includes env var from process env\n                // therefore only merging those env var, which are not present in process env\n                // or whose value differ from process env\n                if (!(key in envVars) || workspaceEnv[key] !== envVars[key]) {\n                  envVars[key] = workspaceEnv[key];\n                  sources[key] = \"dotenv\";\n                }\n              }\n            }\n          }\n        } catch (e: any) {\n          this.dbtTerminal.error(\n            \"getEnvVarsError\",\n            \"Could not call environment api\",\n            e,\n          );\n        }\n\n        return { vars: envVars, sources };\n      },\n    });\n  }\n}\n"
  },
  {
    "path": "src/dbt_client/runtimePythonEnvironmentProvider.ts",
    "content": "import {\n  EnvironmentVariables,\n  PythonEnvironmentProvider,\n  RuntimePythonEnvironment,\n} from \"@altimateai/dbt-integration\";\nimport { inject, injectable } from \"inversify\";\nimport { Uri, workspace } from \"vscode\";\nimport { PythonEnvironment } from \"./pythonEnvironment\";\n\n@injectable()\nexport class VSCodeRuntimePythonEnvironmentProvider\n  implements PythonEnvironmentProvider\n{\n  private callbacks: ((environment: RuntimePythonEnvironment) => void)[] = [];\n\n  constructor(\n    @inject(PythonEnvironment)\n    private vscodeEnvironment: PythonEnvironment,\n  ) {\n    // Set up python environment change handling\n    // Initialize environment and listen for changes\n    this.vscodeEnvironment.initialize().then(() => {\n      this.vscodeEnvironment.onPythonEnvironmentChanged(() => {\n        const currentEnvironment = this.getCurrentEnvironment();\n        this.callbacks.forEach((callback) => callback(currentEnvironment));\n      });\n    });\n  }\n\n  getCurrentEnvironment(): RuntimePythonEnvironment {\n    return {\n      pythonPath: this.vscodeEnvironment.pythonPath,\n      getEnvironmentVariables: (\n        workspacePath: string,\n      ): EnvironmentVariables => {\n        // workspacePath may be undefined at runtime when called by dbt-integration\n        // code that hasn't been updated to pass it yet (e.g. DBTCoreDetection)\n        const folder = workspacePath\n          ? workspace.getWorkspaceFolder(Uri.file(workspacePath))\n          : undefined;\n        return this.vscodeEnvironment.getEnvironmentVariables(folder);\n      },\n    };\n  }\n\n  onEnvironmentChanged(\n    callback: (environment: RuntimePythonEnvironment) => void,\n  ): () => void {\n    this.callbacks.push(callback);\n\n    // Return cleanup function\n    return () => {\n      const index = this.callbacks.indexOf(callback);\n      if (index > -1) {\n        this.callbacks.splice(index, 1);\n      }\n    };\n  }\n}\n\n@injectable()\nexport class StaticRuntimePythonEnvironment\n  implements RuntimePythonEnvironment\n{\n  constructor(\n    @inject(PythonEnvironment)\n    private vscodeEnvironment: PythonEnvironment,\n  ) {}\n\n  get pythonPath(): string {\n    return this.vscodeEnvironment.pythonPath;\n  }\n\n  getEnvironmentVariables(workspacePath: string): EnvironmentVariables {\n    // workspacePath may be undefined at runtime when called by dbt-integration\n    // code that hasn't been updated to pass it yet (e.g. DBTCoreDetection)\n    const folder = workspacePath\n      ? workspace.getWorkspaceFolder(Uri.file(workspacePath))\n      : undefined;\n    return this.vscodeEnvironment.getEnvironmentVariables(folder);\n  }\n}\n"
  },
  {
    "path": "src/dbt_client/vscodeConfiguration.ts",
    "content": "import {\n  DBTConfiguration,\n  DEFAULT_CONFIGURATION_VALUES,\n} from \"@altimateai/dbt-integration\";\nimport { injectable } from \"inversify\";\nimport { workspace } from \"vscode\";\nimport { getFirstWorkspacePath, resolveSettingsVariables } from \"../utils\";\n\n@injectable()\nexport class VSCodeDBTConfiguration implements DBTConfiguration {\n  getDbtCustomRunnerImport(): string {\n    return workspace\n      .getConfiguration(\"dbt\")\n      .get<string>(\n        \"dbtCustomRunnerImport\",\n        DEFAULT_CONFIGURATION_VALUES.dbtCustomRunnerImport,\n      );\n  }\n\n  getDbtIntegration(): string {\n    return workspace\n      .getConfiguration(\"dbt\")\n      .get<string>(\n        \"dbtIntegration\",\n        DEFAULT_CONFIGURATION_VALUES.dbtIntegration,\n      );\n  }\n\n  getRunModelCommandAdditionalParams(): string[] {\n    const params = workspace\n      .getConfiguration(\"dbt\")\n      .get<\n        string[]\n      >(\"runModelCommandAdditionalParams\", DEFAULT_CONFIGURATION_VALUES.runModelCommandAdditionalParams);\n    return params.map((p) => resolveSettingsVariables(p));\n  }\n\n  getBuildModelCommandAdditionalParams(): string[] {\n    const params = workspace\n      .getConfiguration(\"dbt\")\n      .get<\n        string[]\n      >(\"buildModelCommandAdditionalParams\", DEFAULT_CONFIGURATION_VALUES.buildModelCommandAdditionalParams);\n    return params.map((p) => resolveSettingsVariables(p));\n  }\n\n  getTestModelCommandAdditionalParams(): string[] {\n    const params = workspace\n      .getConfiguration(\"dbt\")\n      .get<\n        string[]\n      >(\"testModelCommandAdditionalParams\", DEFAULT_CONFIGURATION_VALUES.testModelCommandAdditionalParams);\n    return params.map((p) => resolveSettingsVariables(p));\n  }\n\n  getQueryTemplate(): string {\n    return workspace\n      .getConfiguration(\"dbt\")\n      .get<string>(\"queryTemplate\", DEFAULT_CONFIGURATION_VALUES.queryTemplate);\n  }\n\n  getQueryLimit(): number {\n    return workspace\n      .getConfiguration(\"dbt\")\n      .get<number>(\"queryLimit\", DEFAULT_CONFIGURATION_VALUES.queryLimit);\n  }\n\n  getEnableNotebooks(): boolean {\n    return workspace\n      .getConfiguration(\"dbt\")\n      .get<boolean>(\n        \"enableNotebooks\",\n        DEFAULT_CONFIGURATION_VALUES.enableNotebooks,\n      );\n  }\n\n  getDisableQueryHistory(): boolean {\n    return workspace\n      .getConfiguration(\"dbt\")\n      .get<boolean>(\n        \"disableQueryHistory\",\n        DEFAULT_CONFIGURATION_VALUES.disableQueryHistory,\n      );\n  }\n\n  getInstallDepsOnProjectInitialization(): boolean {\n    return workspace\n      .getConfiguration(\"dbt\")\n      .get<boolean>(\n        \"installDepsOnProjectInitialization\",\n        DEFAULT_CONFIGURATION_VALUES.installDepsOnProjectInitialization,\n      );\n  }\n\n  getDisableDepthsCalculation(): boolean {\n    return workspace\n      .getConfiguration(\"dbt\")\n      .get<boolean>(\n        \"disableDepthsCalculation\",\n        DEFAULT_CONFIGURATION_VALUES.disableDepthsCalculation,\n      );\n  }\n\n  getWorkingDirectory(): string {\n    return getFirstWorkspacePath();\n  }\n\n  getAltimateUrl(): string {\n    return workspace\n      .getConfiguration(\"dbt\")\n      .get<string>(\"altimateUrl\", DEFAULT_CONFIGURATION_VALUES.altimateUrl);\n  }\n\n  getIsLocalMode(): boolean {\n    return workspace\n      .getConfiguration(\"dbt\")\n      .get<boolean>(\"isLocalMode\", DEFAULT_CONFIGURATION_VALUES.isLocalMode);\n  }\n\n  getAltimateInstanceName(): string | undefined {\n    return workspace\n      .getConfiguration(\"dbt\")\n      .get<string>(\"altimateInstanceName\");\n  }\n\n  getAltimateAiKey(): string | undefined {\n    return workspace.getConfiguration(\"dbt\").get<string>(\"altimateAiKey\");\n  }\n}\n"
  },
  {
    "path": "src/dbt_client/vscodeTerminal.ts",
    "content": "import { DBTTerminal } from \"@altimateai/dbt-integration\";\nimport { injectable } from \"inversify\";\nimport { PythonException } from \"python-bridge\";\nimport { Disposable, EventEmitter, Terminal, window } from \"vscode\";\nimport { TelemetryService } from \"../telemetry\";\nimport { stripANSI } from \"../utils\";\n\n@injectable()\nexport class VSCodeDBTTerminal implements DBTTerminal {\n  private disposables: Disposable[] = [];\n  private terminal?: Terminal;\n  private readonly writeEmitter = new EventEmitter<string>();\n  private outputChannel = window.createOutputChannel(`Log - dbt`, {\n    log: true,\n  });\n\n  constructor(private telemetry: TelemetryService) {}\n\n  async show(status: boolean) {\n    if (status) {\n      await this.requireTerminal();\n      this.terminal!.show(!status);\n    }\n  }\n\n  log(message: string, ...args: any[]) {\n    this.outputChannel.info(stripANSI(message), args);\n    console.log(stripANSI(message), args);\n    if (this.terminal !== undefined) {\n      this.writeEmitter.fire(message);\n    }\n  }\n\n  trace(message: string) {\n    this.outputChannel?.appendLine(stripANSI(message));\n    console.log(message);\n  }\n\n  debug(name: string, message: string, ...args: any[]) {\n    this.outputChannel?.debug(`${name}:${stripANSI(message)}`, args);\n    console.debug(message, args);\n  }\n\n  info(\n    name: string,\n    message: string,\n    sendTelemetry: boolean = true,\n    ...args: any[]\n  ) {\n    this.outputChannel?.info(`${name}:${stripANSI(message)}`, args);\n    console.info(`${name}:${message}`, args);\n    if (sendTelemetry) {\n      this.telemetry.sendTelemetryEvent(name, { message, level: \"info\" });\n    }\n  }\n\n  warn(\n    name: string,\n    message: string,\n    sendTelemetry: boolean = true,\n    ...args: any[]\n  ) {\n    this.outputChannel?.warn(`${name}:${stripANSI(message)}`, args);\n    console.warn(`${name}:${message}`, args);\n    if (sendTelemetry) {\n      this.telemetry.sendTelemetryEvent(name, { message, level: \"warn\" });\n    }\n  }\n\n  error(\n    name: string,\n    message: string,\n    e: PythonException | Error | unknown,\n    sendTelemetry = true,\n    ...args: any[]\n  ) {\n    let errorMessage = message;\n    if (e instanceof PythonException) {\n      errorMessage = `${message}:${e.toString()}`;\n    } else if (e instanceof Error) {\n      errorMessage = `${message}:${e.message}`;\n    } else if (e) {\n      errorMessage = `${message}:${e}`;\n    }\n    this.outputChannel?.error(`${name}:${stripANSI(errorMessage)}`, args);\n    console.error(`${name}:${errorMessage}`, args);\n    if (sendTelemetry) {\n      this.telemetry.sendTelemetryError(name, e, { message });\n    }\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      x?.dispose();\n    }\n  }\n\n  private async requireTerminal() {\n    if (this.terminal === undefined) {\n      this.terminal = window.createTerminal({\n        name: \"Tasks - dbt\",\n        pty: {\n          onDidWrite: this.writeEmitter.event,\n          open: () => this.writeEmitter.fire(\"\"),\n          close: () => {\n            this.terminal?.dispose();\n            this.terminal = undefined;\n          },\n        },\n      });\n      this.disposables.push(this.terminal);\n      await new Promise((resolve) => setTimeout(resolve, 100));\n    }\n  }\n}\n"
  },
  {
    "path": "src/definition_provider/docDefinitionProvider.ts",
    "content": "import { DocMetaMap } from \"@altimateai/dbt-integration\";\nimport {\n  Definition,\n  DefinitionLink,\n  DefinitionProvider,\n  Disposable,\n  Location,\n  Position,\n  ProviderResult,\n  TextDocument,\n  Uri,\n} from \"vscode\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { ManifestCacheChangedEvent } from \"../dbt_client/event/manifestCacheChangedEvent\";\nimport { TelemetryService } from \"../telemetry\";\n\nexport class DocDefinitionProvider implements DefinitionProvider, Disposable {\n  private docToLocationMap: Map<string, DocMetaMap> = new Map();\n  private static readonly IS_DOC = /(doc)\\([^)]*\\)/;\n  private static readonly GET_DOC_INFO = /(?!['\"])(\\w+)(?=['\"])/g;\n  private disposables: Disposable[] = [];\n\n  constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    private telemetry: TelemetryService,\n  ) {\n    this.disposables.push(\n      dbtProjectContainer.onManifestChanged((event) =>\n        this.onManifestCacheChanged(event),\n      ),\n    );\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n\n  provideDefinition(\n    document: TextDocument,\n    position: Position,\n  ): ProviderResult<Definition | DefinitionLink[]> {\n    return new Promise((resolve) => {\n      const range = document.getWordRangeAtPosition(\n        position,\n        DocDefinitionProvider.IS_DOC,\n      );\n      const word = document.getText(range);\n      if (word) {\n        const packageName = this.dbtProjectContainer.getPackageName(\n          document.uri,\n        );\n\n        const docName = word.match(DocDefinitionProvider.GET_DOC_INFO);\n        if (docName === null || docName === undefined) {\n          resolve(undefined);\n          return;\n        }\n\n        // const docName =\n        //   packageName !== undefined && !word.includes(\".\")\n        //     ? `${packageName}.${word}`\n        //     : word;\n\n        const definition = this.getDocDefinition(docName[0], document.uri);\n        if (definition !== undefined) {\n          resolve(definition);\n          this.telemetry.sendTelemetryEvent(\"provideDocDefinition\");\n          return;\n        }\n      }\n      resolve(undefined);\n    });\n  }\n\n  private onManifestCacheChanged(event: ManifestCacheChangedEvent): void {\n    event.added?.forEach((added) => {\n      this.docToLocationMap.set(\n        added.project.projectRoot.fsPath,\n        added.docMetaMap,\n      );\n    });\n    event.removed?.forEach((removed) => {\n      this.docToLocationMap.delete(removed.projectRoot.fsPath);\n    });\n  }\n\n  private getDocDefinition(\n    docName: string,\n    currentFilePath: Uri,\n  ): Definition | undefined {\n    const projectRootpath =\n      this.dbtProjectContainer.getProjectRootpath(currentFilePath);\n    if (projectRootpath === undefined) {\n      return;\n    }\n    const docMap = this.docToLocationMap.get(projectRootpath.fsPath);\n    if (docMap === undefined) {\n      return;\n    }\n    const location = docMap.get(docName);\n    if (location) {\n      return new Location(\n        Uri.file(location.path),\n        new Position(location.line, location.character),\n      );\n    }\n    return undefined;\n  }\n}\n"
  },
  {
    "path": "src/definition_provider/index.ts",
    "content": "import { Disposable, languages } from \"vscode\";\nimport { DBTPowerUserExtension } from \"../dbtPowerUserExtension\";\nimport { DocDefinitionProvider } from \"./docDefinitionProvider\";\nimport { MacroDefinitionProvider } from \"./macroDefinitionProvider\";\nimport { ModelDefinitionProvider } from \"./modelDefinitionProvider\";\nimport { SourceDefinitionProvider } from \"./sourceDefinitionProvider\";\n\nexport class DefinitionProviders implements Disposable {\n  private disposables: Disposable[] = [];\n\n  constructor(\n    private modelDefinitionProvider: ModelDefinitionProvider,\n    private macroDefinitionProvider: MacroDefinitionProvider,\n    private sourceDefinitionProvider: SourceDefinitionProvider,\n    private docDefinitionsProvider: DocDefinitionProvider,\n  ) {\n    this.disposables.push(\n      languages.registerDefinitionProvider(\n        DBTPowerUserExtension.DBT_YAML_SQL_SELECTOR,\n        this.modelDefinitionProvider,\n      ),\n      languages.registerDefinitionProvider(\n        DBTPowerUserExtension.DBT_SQL_SELECTOR,\n        this.macroDefinitionProvider,\n      ),\n      languages.registerDefinitionProvider(\n        DBTPowerUserExtension.DBT_YAML_SQL_SELECTOR,\n        this.sourceDefinitionProvider,\n      ),\n      languages.registerDefinitionProvider(\n        DBTPowerUserExtension.DBT_YAML_SQL_SELECTOR,\n        this.docDefinitionsProvider,\n      ),\n    );\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/definition_provider/macroDefinitionProvider.ts",
    "content": "import { MacroMetaMap } from \"@altimateai/dbt-integration\";\nimport {\n  Definition,\n  DefinitionLink,\n  DefinitionProvider,\n  Disposable,\n  Location,\n  Position,\n  ProviderResult,\n  TextDocument,\n  Uri,\n} from \"vscode\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { ManifestCacheChangedEvent } from \"../dbt_client/event/manifestCacheChangedEvent\";\nimport { TelemetryService } from \"../telemetry\";\nimport { isEnclosedWithinCodeBlock } from \"../utils\";\nexport class MacroDefinitionProvider implements DefinitionProvider, Disposable {\n  private macroToLocationMap: Map<string, MacroMetaMap> = new Map();\n  private static readonly IS_MACRO = /\\w+\\.?\\w+/;\n  private disposables: Disposable[] = [];\n\n  constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    private telemetry: TelemetryService,\n  ) {\n    this.disposables.push(\n      dbtProjectContainer.onManifestChanged((event) =>\n        this.onManifestCacheChanged(event),\n      ),\n    );\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n\n  provideDefinition(\n    document: TextDocument,\n    position: Position,\n  ): ProviderResult<Definition | DefinitionLink[]> {\n    return new Promise((resolve) => {\n      const textLine = document.lineAt(position).text;\n      const range = document.getWordRangeAtPosition(\n        position,\n        MacroDefinitionProvider.IS_MACRO,\n      );\n      const word = document.getText(range);\n      if (\n        range &&\n        textLine[range.end.character] === \"(\" &&\n        isEnclosedWithinCodeBlock(document, range)\n      ) {\n        const packageName = this.dbtProjectContainer.getPackageName(\n          document.uri,\n        );\n\n        // Build the list of lookup candidates for the macro meta map. The map\n        // stores macros from the current dbt project under their bare name\n        // (e.g. `log_toto`) and macros from installed packages under\n        // `<package>.<name>` (e.g. `dbt_utils.pivot`). The editor word may\n        // already carry a package prefix, and — per issue #1754 — that prefix\n        // may be the current project's own name, which dbt accepts as a valid\n        // call even though the map is keyed by the bare name.\n        const lookupCandidates: string[] = [];\n        if (word.includes(\".\")) {\n          // Prefer the full `<pkg>.<name>` lookup first (cross-package call),\n          // then fall back to the bare `<name>` lookup, which matches macros\n          // defined in the current project (including self-prefixed calls).\n          lookupCandidates.push(word);\n          const dotIndex = word.indexOf(\".\");\n          lookupCandidates.push(word.substring(dotIndex + 1));\n        } else if (packageName !== undefined) {\n          // Inside an installed package: unprefixed calls resolve against\n          // that package's own macros, which are keyed as `<pkg>.<name>`.\n          lookupCandidates.push(`${packageName}.${word}`);\n        } else {\n          lookupCandidates.push(word);\n        }\n\n        for (const candidate of lookupCandidates) {\n          const definition = this.getMacroDefinition(candidate, document.uri);\n          if (definition !== undefined) {\n            resolve(definition);\n            this.telemetry.sendTelemetryEvent(\"provideMacroDefinition\");\n            return;\n          }\n        }\n      }\n      resolve(undefined);\n    });\n  }\n\n  private onManifestCacheChanged(event: ManifestCacheChangedEvent): void {\n    event.added?.forEach((added) => {\n      this.macroToLocationMap.set(\n        added.project.projectRoot.fsPath,\n        added.macroMetaMap,\n      );\n    });\n    event.removed?.forEach((removed) => {\n      this.macroToLocationMap.delete(removed.projectRoot.fsPath);\n    });\n  }\n\n  private getMacroDefinition(\n    macroName: string,\n    currentFilePath: Uri,\n  ): Definition | undefined {\n    const projectRootpath =\n      this.dbtProjectContainer.getProjectRootpath(currentFilePath);\n    if (projectRootpath === undefined) {\n      return;\n    }\n    const macroMap = this.macroToLocationMap.get(projectRootpath.fsPath);\n    if (macroMap === undefined) {\n      return;\n    }\n    const location = macroMap.get(macroName);\n    if (location && location.path) {\n      return new Location(\n        Uri.file(location.path),\n        new Position(location.line, location.character),\n      );\n    }\n    return undefined;\n  }\n}\n"
  },
  {
    "path": "src/definition_provider/modelDefinitionProvider.ts",
    "content": "import { DBTTerminal, NodeMetaMap } from \"@altimateai/dbt-integration\";\nimport { inject } from \"inversify\";\nimport {\n  CancellationToken,\n  Definition,\n  DefinitionLink,\n  DefinitionProvider,\n  Disposable,\n  Location,\n  Position,\n  ProviderResult,\n  Range,\n  TextDocument,\n  Uri,\n} from \"vscode\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { ManifestCacheChangedEvent } from \"../dbt_client/event/manifestCacheChangedEvent\";\nimport { TelemetryService } from \"../telemetry\";\n\nexport class ModelDefinitionProvider implements DefinitionProvider, Disposable {\n  private modelToLocationMap: Map<string, NodeMetaMap> = new Map();\n  private static readonly IS_REF = /(ref)\\([^)]*\\)/;\n  private static readonly GET_DBT_MODEL = /(?!'|\")([^(?!'|\")]*)(?='|\")/gi;\n  private disposables: Disposable[] = [];\n\n  constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    private telemetry: TelemetryService,\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n  ) {\n    this.disposables.push(\n      dbtProjectContainer.onManifestChanged((event) =>\n        this.onManifestCacheChanged(event),\n      ),\n    );\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n\n  provideDefinition(\n    document: TextDocument,\n    position: Position,\n    token: CancellationToken,\n  ): ProviderResult<Definition | DefinitionLink[]> {\n    return new Promise((resolve) => {\n      const hover = document.getText(document.getWordRangeAtPosition(position));\n      const word = document.getText(\n        document.getWordRangeAtPosition(\n          position,\n          ModelDefinitionProvider.IS_REF,\n        ),\n      );\n      const project = this.dbtProjectContainer.findDBTProject(document.uri);\n      if (!project) {\n        this.dbtTerminal.debug(\n          \"modelDefinitionProvider:provideDefinition\",\n          \"Could not load definition provider, project not found in container for \" +\n            document.uri.fsPath,\n        );\n        return;\n      }\n      if (word !== undefined && hover !== \"ref\") {\n        const dbtModel = word.match(ModelDefinitionProvider.GET_DBT_MODEL);\n        if (dbtModel && dbtModel.length === 1) {\n          const definition = this.getDefinitionFor(\n            project.getProjectName(),\n            dbtModel[0],\n            document.uri,\n          );\n          resolve(definition);\n          this.telemetry.sendTelemetryEvent(\"provideModelDefinition\", {\n            type: \"single\",\n          });\n          return;\n        }\n        if (dbtModel && dbtModel.length === 3) {\n          const definition = this.getDefinitionFor(\n            dbtModel[0],\n            dbtModel[2],\n            document.uri,\n          );\n          this.telemetry.sendTelemetryEvent(\"provideModelDefinition\", {\n            type: \"dual\",\n          });\n          resolve(definition);\n          return;\n        }\n      }\n      resolve(undefined);\n    });\n  }\n\n  private onManifestCacheChanged(event: ManifestCacheChangedEvent): void {\n    event.added?.forEach((added) => {\n      this.modelToLocationMap.set(\n        added.project.projectRoot.fsPath,\n        added.nodeMetaMap,\n      );\n    });\n    event.removed?.forEach((removed) => {\n      this.modelToLocationMap.delete(removed.projectRoot.fsPath);\n    });\n  }\n\n  private getDefinitionFor(\n    projectName: string,\n    modelName: string,\n    currentFilePath: Uri,\n  ): Definition | undefined {\n    const projectRootpath =\n      this.dbtProjectContainer.getProjectRootpath(currentFilePath);\n    if (projectRootpath === undefined) {\n      return;\n    }\n    const nodeMap = this.modelToLocationMap.get(projectRootpath.fsPath);\n    if (nodeMap === undefined) {\n      return;\n    }\n    const location = nodeMap.lookupByBaseName(modelName);\n    if (location && location.path) {\n      return new Location(Uri.file(location.path), new Range(0, 0, 999, 999));\n    }\n    return undefined;\n  }\n}\n"
  },
  {
    "path": "src/definition_provider/sourceDefinitionProvider.ts",
    "content": "import { SourceMetaMap } from \"@altimateai/dbt-integration\";\nimport { readFileSync } from \"fs\";\nimport {\n  CancellationToken,\n  Definition,\n  DefinitionLink,\n  DefinitionProvider,\n  Disposable,\n  Location,\n  Position,\n  ProviderResult,\n  TextDocument,\n  Uri,\n} from \"vscode\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { ManifestCacheChangedEvent } from \"../dbt_client/event/manifestCacheChangedEvent\";\nimport { TelemetryService } from \"../telemetry\";\nimport { isEnclosedWithinCodeBlock } from \"../utils\";\n\nexport class SourceDefinitionProvider\n  implements DefinitionProvider, Disposable\n{\n  private sourceMetaMap: Map<string, SourceMetaMap> = new Map();\n  private static readonly IS_SOURCE = /(source)\\([^)]*\\)/;\n  private static readonly GET_SOURCE_INFO = /(?!['\"])(\\w+)(?=['\"])/g;\n  private disposables: Disposable[] = [];\n\n  constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    private telemetry: TelemetryService,\n  ) {\n    this.disposables.push(\n      dbtProjectContainer.onManifestChanged((event) =>\n        this.onManifestCacheChanged(event),\n      ),\n    );\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n\n  provideDefinition(\n    document: TextDocument,\n    position: Position,\n    token: CancellationToken,\n  ): ProviderResult<Definition | DefinitionLink[]> {\n    return new Promise((resolve) => {\n      const hover = document.getText(document.getWordRangeAtPosition(position));\n      const range = document.getWordRangeAtPosition(\n        position,\n        SourceDefinitionProvider.IS_SOURCE,\n      );\n      const word = document.getText(range);\n\n      const linePrefix = document\n        .lineAt(position)\n        .text.substr(0, position.character);\n\n      if (\n        !isEnclosedWithinCodeBlock(document, position) ||\n        !linePrefix.includes(\"source\") ||\n        hover === \"source\"\n      ) {\n        resolve(undefined);\n        return;\n      }\n\n      const source = word.match(SourceDefinitionProvider.GET_SOURCE_INFO);\n      if (source === null || source === undefined) {\n        resolve(undefined);\n        return;\n      }\n      if (source.length < 2) {\n        resolve(undefined);\n        return;\n      }\n      const definition = this.getSourceDefinition(\n        source[0],\n        document.uri,\n        source[1],\n      );\n      this.telemetry.sendTelemetryEvent(\"provideSourceDefinition\");\n      resolve(definition);\n    });\n  }\n\n  private onManifestCacheChanged(event: ManifestCacheChangedEvent): void {\n    event.added?.forEach((added) => {\n      this.sourceMetaMap.set(\n        added.project.projectRoot.fsPath,\n        added.sourceMetaMap,\n      );\n    });\n    event.removed?.forEach((removed) => {\n      this.sourceMetaMap.delete(removed.projectRoot.fsPath);\n    });\n  }\n\n  private getSourceDefinition(\n    sourceName: string,\n    currentFilePath: Uri,\n    tableName: string,\n  ): Definition | undefined {\n    const projectRootpath =\n      this.dbtProjectContainer.getProjectRootpath(currentFilePath);\n    if (projectRootpath === undefined) {\n      return;\n    }\n    const sourceMap = this.sourceMetaMap.get(projectRootpath.fsPath);\n    if (sourceMap === undefined) {\n      return;\n    }\n    const location = sourceMap\n      .get(sourceName)\n      ?.tables.find((table) => table.name === tableName);\n    if (location && location.path) {\n      const sourceFile: string = readFileSync(location.path).toString(\"utf8\");\n      const sourceFileLines = sourceFile.split(\"\\n\");\n      for (let index = 0; index < sourceFileLines.length; index++) {\n        const currentLine = sourceFileLines[index];\n        if (currentLine.includes(tableName)) {\n          return new Location(\n            Uri.file(location.path),\n            new Position(index, currentLine.indexOf(tableName)),\n          );\n        }\n      }\n    }\n    return undefined;\n  }\n}\n"
  },
  {
    "path": "src/document_formatting_edit_provider/dbtDocumentFormattingEditProvider.ts",
    "content": "import { CommandProcessExecutionFactory } from \"@altimateai/dbt-integration\";\nimport { exec } from \"child_process\";\nimport fs from \"fs\";\nimport { inject } from \"inversify\";\nimport os from \"os\";\nimport parseDiff from \"parse-diff\";\nimport path from \"path\";\nimport { promisify } from \"util\";\nimport {\n  CancellationToken,\n  DocumentFormattingEditProvider,\n  FormattingOptions,\n  ProviderResult,\n  Range,\n  TextDocument,\n  TextEdit,\n  window,\n  workspace,\n} from \"vscode\";\nimport which from \"which\";\nimport { PythonEnvironment } from \"../dbt_client/pythonEnvironment\";\nimport { TelemetryService } from \"../telemetry\";\nimport { extendErrorWithSupportLinks, getFirstWorkspacePath } from \"../utils\";\n\nconst execAsync = promisify(exec);\n\n// prettier-ignore\nexport class DbtDocumentFormattingEditProvider implements DocumentFormattingEditProvider {\n  private cachedSqlFmtPath: string | undefined;\n  private cachedPythonPath: string | undefined;\n\n  constructor(\n    private commandProcessExecutionFactory: CommandProcessExecutionFactory,\n    private telemetry: TelemetryService,\n    @inject(PythonEnvironment)\n    private pythonEnvironment: PythonEnvironment,\n  ) {}\n\n  provideDocumentFormattingEdits(\n    document: TextDocument,\n    options: FormattingOptions,\n    token: CancellationToken,\n  ): ProviderResult<TextEdit[]> {\n    return this.executeSqlFmt(document);\n  }\n\n  private async executeSqlFmt(document: TextDocument) {\n    const sqlFmtPathSetting =\n      this.pythonEnvironment.getResolvedConfigValue(\"sqlFmtPath\");\n    const sqlFmtAdditionalParamsSetting = workspace\n      .getConfiguration(\"dbt\")\n      .get<string[]>(\"sqlFmtAdditionalParams\", [])\n      .join(\" \")\n      .split(\" \")\n      .filter((s) => s !== \"\");\n\n    const sqlFmtArgs = [\n      \"-\",\n      \"--diff\",\n      \"--no-progressbar\",\n      \"--quiet\",\n      ...sqlFmtAdditionalParamsSetting,\n    ];\n    try {\n      // try to find sqlfmt on PATH if not set\n      const sqlFmtPath = sqlFmtPathSetting || (await this.findSqlFmtPath());\n      if (!sqlFmtPath) {\n        throw new Error(\"sqlfmt not found\");\n      }\n      this.telemetry.sendTelemetryEvent(\"formatDbtModel\", {\n        sqlFmtPath: sqlFmtPathSetting ? \"setting\" : \"path\",\n      });\n      try {\n        const { stderr } = await this.commandProcessExecutionFactory\n          .createCommandProcessExecution({\n            command: sqlFmtPath,\n            args: sqlFmtArgs,\n            stdin: document.getText(),\n            cwd: getFirstWorkspacePath(),\n          })\n          .complete();\n        if (stderr) {\n          throw new Error(stderr);\n        }\n        return [];\n      } catch (e) {\n        try {\n          return this.processDiffOutput(document, (e as Error).message);\n        } catch (error) {\n          this.telemetry.sendTelemetryError(\n            \"formatDbtModelApplyDiffFailed\",\n            error,\n          );\n          window.showErrorMessage(\n            extendErrorWithSupportLinks(\n              \"Could not process difference output from sqlfmt. Detailed error: \" +\n                error +\n                \".\",\n            ),\n          );\n        }\n      }\n    } catch (error) {\n      this.telemetry.sendTelemetryError(\"formatDbtModelApplyDiffFailed\", error);\n      window.showErrorMessage(\n        extendErrorWithSupportLinks(\n          'Could not run sqlfmt. If sqlfmt is installed (e.g. via `uv tool install \"shandy-sqlfmt[jinjafmt]\"` or `pipx install \"shandy-sqlfmt[jinjafmt]\"`), ' +\n            \"try setting the `dbt.sqlFmtPath` setting to the full path of the sqlfmt binary, \" +\n            \"or restart VS Code to pick up PATH changes. Detailed error: \" +\n            error +\n            \".\",\n        ),\n      );\n    }\n    return [];\n  }\n\n  private async findSqlFmtPath(): Promise<string | undefined> {\n    const currentPythonPath = this.pythonEnvironment.pythonPath;\n\n    // Return cached result if still valid (same interpreter + binary exists)\n    if (\n      this.cachedSqlFmtPath &&\n      this.cachedPythonPath === currentPythonPath &&\n      fs.existsSync(this.cachedSqlFmtPath)\n    ) {\n      return this.cachedSqlFmtPath;\n    }\n\n    const result = await this.discoverSqlFmtPath();\n    this.cachedSqlFmtPath = result;\n    this.cachedPythonPath = currentPythonPath;\n    return result;\n  }\n\n  private async discoverSqlFmtPath(): Promise<string | undefined> {\n    const isWindows = process.platform === \"win32\";\n    const exe = isWindows ? \"sqlfmt.exe\" : \"sqlfmt\";\n\n    // 1. Check Python venv bin directory\n    const pythonPath = this.pythonEnvironment.pythonPath;\n    if (pythonPath) {\n      const candidatePath = path.join(path.dirname(pythonPath), exe);\n      if (fs.existsSync(candidatePath)) {\n        return candidatePath;\n      }\n    }\n\n    // 2. Check well-known tool binary locations (uv, pipx)\n    for (const candidate of this.getToolBinCandidates(exe)) {\n      if (fs.existsSync(candidate)) {\n        return candidate;\n      }\n    }\n\n    // 3. Try uv tool dir (async, non-blocking) for custom uv install locations\n    const uvToolPath = await this.findSqlFmtInUvTools(exe);\n    if (uvToolPath) {\n      return uvToolPath;\n    }\n\n    // 4. Fall back to system PATH via which\n    try {\n      return await which(\"sqlfmt\");\n    } catch {\n      return undefined;\n    }\n  }\n\n  private getToolBinCandidates(exe: string): string[] {\n    const home = os.homedir();\n    const candidates: string[] = [];\n\n    // UV_TOOL_BIN_DIR / PIPX_BIN_DIR override default locations\n    const uvToolBinDir = process.env.UV_TOOL_BIN_DIR;\n    if (uvToolBinDir) {\n      candidates.push(path.join(uvToolBinDir, exe));\n    }\n    const pipxBinDir = process.env.PIPX_BIN_DIR;\n    if (pipxBinDir) {\n      candidates.push(path.join(pipxBinDir, exe));\n    }\n\n    if (process.platform === \"win32\") {\n      const appData = process.env.APPDATA;\n      if (appData) {\n        candidates.push(\n          path.join(\n            appData,\n            \"uv\",\n            \"data\",\n            \"tools\",\n            \"shandy-sqlfmt\",\n            \"Scripts\",\n            exe,\n          ),\n          path.join(appData, \"Python\", \"Scripts\", exe),\n        );\n      }\n      candidates.push(\n        path.join(home, \".local\", \"bin\", exe),\n        path.join(home, \"pipx\", \"venvs\", \"shandy-sqlfmt\", \"Scripts\", exe),\n      );\n    } else {\n      // Linux/macOS: default location for uv tool install and pipx\n      candidates.push(path.join(home, \".local\", \"bin\", exe));\n    }\n\n    return candidates;\n  }\n\n  private async findSqlFmtInUvTools(exe: string): Promise<string | undefined> {\n    try {\n      const { stdout } = await execAsync(\"uv tool dir\", { timeout: 3000 });\n      const uvToolDir = stdout.trim();\n      if (uvToolDir) {\n        const executable =\n          process.platform === \"win32\"\n            ? path.join(uvToolDir, \"shandy-sqlfmt\", \"Scripts\", exe)\n            : path.join(uvToolDir, \"shandy-sqlfmt\", \"bin\", exe);\n        if (fs.existsSync(executable)) {\n          return executable;\n        }\n      }\n    } catch {\n      // uv is not installed or not on PATH — ignore\n    }\n    return undefined;\n  }\n\n  private processDiffOutput(\n    document: TextDocument,\n    diffOutput: string,\n  ): TextEdit[] {\n    const textEdits: TextEdit[] = [];\n    const diffs = parseDiff(diffOutput);\n\n    if (document.lineCount === 0) {\n      return textEdits;\n    }\n\n    diffs.forEach((diff) => {\n      diff.chunks.forEach((chunk) => {\n        // Build new content from add + normal changes (these are the lines\n        // that should appear in the formatted output for this chunk's range).\n        const newLines = chunk.changes\n          .filter((c) => this.isAddChange(c) || this.isNormalChange(c))\n          .map((c) => c.content.slice(1));\n        const newContent =\n          newLines.length > 0 ? newLines.join(\"\\n\") + \"\\n\" : \"\";\n\n        if (chunk.oldLines === 0) {\n          // Pure insertion — no old lines to replace\n          const insertLine = Math.min(chunk.oldStart, document.lineCount) - 1;\n          textEdits.push(\n            TextEdit.insert(\n              document.lineAt(Math.max(insertLine, 0)).range.start,\n              newContent,\n            ),\n          );\n        } else {\n          // Replace the chunk's old range with new content.\n          // VSCode applies all TextEdits simultaneously against the original\n          // document, so each chunk references original line positions.\n          const startLine = Math.max(chunk.oldStart - 1, 0);\n          const endLine = Math.min(\n            startLine + chunk.oldLines - 1,\n            document.lineCount - 1,\n          );\n          if (startLine >= document.lineCount) {\n            return;\n          }\n          const range = new Range(\n            document.lineAt(startLine).range.start,\n            document.lineAt(endLine).rangeIncludingLineBreak.end,\n          );\n          textEdits.push(TextEdit.replace(range, newContent));\n        }\n      });\n    });\n    return textEdits;\n  }\n\n  private isAddChange(change: parseDiff.Change): change is parseDiff.AddChange {\n    return change.type === \"add\";\n  }\n\n  private isNormalChange(\n    change: parseDiff.Change,\n  ): change is parseDiff.NormalChange {\n    return change.type === \"normal\";\n  }\n\n  private isDeleteChange(\n    change: parseDiff.Change,\n  ): change is parseDiff.DeleteChange {\n    return (\n      /*\n          parseDiff reads sqlfmt's \"\\ No newline at end of file\" diff output as a delete change.\n          This deceptive delete change should be skipped. So, adding an edge case to the expression.\n      */\n      change.type === \"del\" && change.content !== \"\\\\ No newline at end of file\"\n    );\n  }\n}\n"
  },
  {
    "path": "src/document_formatting_edit_provider/index.ts",
    "content": "import { Disposable, languages } from \"vscode\";\nimport { DBTPowerUserExtension } from \"../dbtPowerUserExtension\";\nimport { DbtDocumentFormattingEditProvider } from \"./dbtDocumentFormattingEditProvider\";\n\nexport class DocumentFormattingEditProviders implements Disposable {\n  private disposables: Disposable[] = [];\n\n  constructor(\n    private dbtDocumentFormattingProvider: DbtDocumentFormattingEditProvider,\n  ) {\n    this.disposables.push(\n      languages.registerDocumentFormattingEditProvider(\n        DBTPowerUserExtension.DBT_SQL_SELECTOR,\n        this.dbtDocumentFormattingProvider,\n      ),\n    );\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/extension.ts",
    "content": "import \"reflect-metadata\";\nimport { ExtensionContext } from \"vscode\";\nimport { DBTPowerUserExtension } from \"./dbtPowerUserExtension\";\nimport { container } from \"./inversify.config\";\n\nexport async function activate(context: ExtensionContext) {\n  const dbtPowerUserExtension = container.get(DBTPowerUserExtension);\n\n  context.subscriptions.push(dbtPowerUserExtension);\n\n  await dbtPowerUserExtension.activate(context);\n}\n\nexport function deactivate() {}\n"
  },
  {
    "path": "src/hover_provider/depthDecorationProvider.ts",
    "content": "import {\n  DecorationOptions,\n  Disposable,\n  Hover,\n  HoverProvider,\n  MarkdownString,\n  Position,\n  Range,\n  TextDocument,\n  TextEditor,\n  TextEditorDecorationType,\n  window,\n  workspace,\n} from \"vscode\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { getDepthColor } from \"../utils\";\n\nexport class DepthDecorationProvider implements HoverProvider, Disposable {\n  private disposables: Disposable[] = [];\n  private readonly REF_PATTERN =\n    /\\{\\{\\s*ref\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)\\s*\\}\\}/;\n  private readonly decorationType: TextEditorDecorationType;\n  private projectToDepthMap: Map<string, Map<string, number>> = new Map();\n\n  constructor(private dbtProjectContainer: DBTProjectContainer) {\n    this.decorationType = window.createTextEditorDecorationType({\n      after: {\n        margin: \"0 0 0 5px\",\n        textDecoration: \"none\",\n      },\n    });\n\n    this.dbtProjectContainer.onManifestChanged((event) => {\n      event.added?.forEach((added) => {\n        this.projectToDepthMap.set(\n          added.project.projectRoot.fsPath,\n          added.modelDepthMap,\n        );\n      });\n      event.removed?.forEach((removed) => {\n        this.projectToDepthMap.delete(removed.projectRoot.fsPath);\n      });\n\n      window.visibleTextEditors.forEach((editor) => {\n        this.updateDecorations(editor);\n      });\n    });\n\n    this.disposables.push(\n      window.onDidChangeActiveTextEditor((editor) => {\n        if (editor) {\n          this.updateDecorations(editor);\n        }\n      }),\n      workspace.onDidChangeTextDocument((event) => {\n        if (\n          window.activeTextEditor &&\n          event.document === window.activeTextEditor.document\n        ) {\n          this.updateDecorations(window.activeTextEditor);\n        }\n      }),\n      workspace.onDidChangeConfiguration((event) => {\n        if (event.affectsConfiguration(\"dbt\")) {\n          window.visibleTextEditors.forEach((editor) => {\n            this.updateDecorations(editor);\n          });\n        }\n      }),\n    );\n  }\n\n  dispose() {\n    this.decorationType.dispose();\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n\n  private updateDecorations(editor: TextEditor): void {\n    const project = this.dbtProjectContainer.findDBTProject(\n      editor.document.uri,\n    );\n    if (!project) {\n      return;\n    }\n\n    const projectRoot = project.projectRoot.fsPath;\n    const depthMapForProject = this.projectToDepthMap.get(projectRoot);\n    if (!depthMapForProject) {\n      return;\n    }\n\n    const text = editor.document.getText();\n    const decorations: DecorationOptions[] = [];\n    const pattern = new RegExp(this.REF_PATTERN, \"g\");\n    let match;\n\n    while ((match = pattern.exec(text)) !== null) {\n      const startPos = editor.document.positionAt(match.index);\n      const endPos = editor.document.positionAt(match.index + match[0].length);\n      const refRange = new Range(startPos, endPos);\n\n      const modelName = match[1];\n      const depth = depthMapForProject.get(modelName);\n\n      if (depth !== undefined) {\n        decorations.push(this.createDepthDecoration(refRange, depth));\n      }\n    }\n\n    editor.setDecorations(this.decorationType, decorations);\n  }\n\n  private createDepthDecoration(\n    refRange: Range,\n    depth: number,\n  ): DecorationOptions {\n    const color = getDepthColor(depth);\n    const depthText = `(${depth})`;\n\n    return {\n      range: refRange,\n      renderOptions: {\n        after: {\n          contentText: depthText,\n          backgroundColor: color,\n          color: \"white\",\n          fontWeight: \"bold\",\n          margin: \"0 0 0 5px\",\n        },\n      },\n    };\n  }\n\n  public provideHover(\n    document: TextDocument,\n    position: Position,\n  ): Hover | undefined {\n    const project = this.dbtProjectContainer.findDBTProject(document.uri);\n    if (!project) {\n      return;\n    }\n\n    const projectRoot = project.projectRoot.fsPath;\n    const depthMapForProject = this.projectToDepthMap.get(projectRoot);\n    if (!depthMapForProject) {\n      return;\n    }\n\n    const text = document.getText();\n    let matches: RegExpMatchArray[] = [];\n    try {\n      const pattern = new RegExp(this.REF_PATTERN, \"g\");\n      matches = Array.from(text.matchAll(pattern));\n    } catch (error) {\n      console.error(\"Error matching ref pattern in provideHover:\", error);\n      return undefined;\n    }\n\n    for (const match of matches) {\n      if (match.index === undefined) {\n        continue;\n      }\n      const startPos = document.positionAt(match.index);\n      const endPos = document.positionAt(match.index + match[0].length);\n      const refRange = new Range(startPos, endPos);\n\n      if (refRange.contains(position)) {\n        const modelName = match[1];\n        const depth = depthMapForProject.get(modelName);\n\n        if (depth !== undefined) {\n          const color = getDepthColor(depth);\n          const markdown = new MarkdownString(\n            `**DAG Depth:** <span style=\"color:${color}\">${depth}</span>\\n\\n` +\n              `The longest path of models between a source and this model is ${depth} nodes long.`,\n          );\n          markdown.isTrusted = true;\n          markdown.supportHtml = true;\n          return new Hover(markdown, refRange);\n        }\n      }\n    }\n\n    return undefined;\n  }\n}\n"
  },
  {
    "path": "src/hover_provider/index.ts",
    "content": "import { Disposable, languages } from \"vscode\";\nimport { DBTPowerUserExtension } from \"../dbtPowerUserExtension\";\nimport { DepthDecorationProvider } from \"./depthDecorationProvider\";\nimport { MacroHoverProvider } from \"./macroHoverProvider\";\nimport { ModelHoverProvider } from \"./modelHoverProvider\";\nimport { SourceHoverProvider } from \"./sourceHoverProvider\";\nimport { YamlModelHoverProvider } from \"./yamlModelHoverProvider\";\n\nexport class HoverProviders implements Disposable {\n  private disposables: Disposable[] = [];\n\n  constructor(\n    private modelHoverProvider: ModelHoverProvider,\n    private sourceHoverProvider: SourceHoverProvider,\n    private macroHoverProvider: MacroHoverProvider,\n    private depthDecorationProvider: DepthDecorationProvider,\n    private yamlModelHoverProvider: YamlModelHoverProvider,\n  ) {\n    this.disposables.push(\n      languages.registerHoverProvider(\n        DBTPowerUserExtension.DBT_SQL_SELECTOR,\n        this.modelHoverProvider,\n      ),\n    );\n    this.disposables.push(\n      languages.registerHoverProvider(\n        DBTPowerUserExtension.DBT_SQL_SELECTOR,\n        this.sourceHoverProvider,\n      ),\n    );\n    this.disposables.push(\n      languages.registerHoverProvider(\n        DBTPowerUserExtension.DBT_SQL_SELECTOR,\n        this.macroHoverProvider,\n      ),\n    );\n    this.disposables.push(\n      languages.registerHoverProvider(\n        DBTPowerUserExtension.DBT_SQL_SELECTOR,\n        this.depthDecorationProvider,\n      ),\n    );\n    this.disposables.push(\n      languages.registerHoverProvider(\n        DBTPowerUserExtension.DBT_YAML_SELECTOR,\n        this.yamlModelHoverProvider,\n      ),\n    );\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/hover_provider/macroHoverProvider.ts",
    "content": "import {\n  DBTTerminal,\n  MacroMetaData,\n  MacroMetaMap,\n  NodeMetaData,\n  NodeMetaMap,\n} from \"@altimateai/dbt-integration\";\nimport { inject } from \"inversify\";\nimport {\n  CancellationToken,\n  Disposable,\n  Hover,\n  HoverProvider,\n  Position,\n  ProviderResult,\n  TextDocument,\n} from \"vscode\";\nimport { QueryManifestService } from \"../services/queryManifestService\";\nimport { TelemetryService } from \"../telemetry\";\nimport { generateMacroHoverMarkdown } from \"./utils\";\n\nexport class MacroHoverProvider implements HoverProvider, Disposable {\n  private disposables: Disposable[] = [];\n\n  constructor(\n    private telemetry: TelemetryService,\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n    private queryManifestService: QueryManifestService,\n  ) {}\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n\n  provideHover(\n    document: TextDocument,\n    position: Position,\n    token: CancellationToken,\n  ): ProviderResult<Hover> {\n    const hoverText = document.getText(\n      document.getWordRangeAtPosition(position),\n    );\n\n    this.dbtTerminal.debug(\"MacroHoverProvider\", `checking: ${hoverText}`);\n    const eventResult = this.queryManifestService.getEventByDocument(\n      document.uri,\n    );\n    if (!eventResult) {\n      return;\n    }\n    const { macroMetaMap, nodeMetaMap } = eventResult;\n    const macroMeta = macroMetaMap.get(hoverText);\n    if (!macroMeta) {\n      return null;\n    }\n\n    const referencedBy = this.getNodesReferencingMacro(\n      macroMeta.unique_id,\n      macroMetaMap,\n      nodeMetaMap,\n    );\n    const hoverContent = generateMacroHoverMarkdown(\n      macroMeta,\n      referencedBy,\n      eventResult,\n    );\n    this.telemetry.sendTelemetryEvent(\"provideMacroHover\");\n    return new Hover(hoverContent);\n  }\n\n  private getNodesReferencingMacro(\n    macroMetaName: string,\n    macroMetaMap: MacroMetaMap,\n    nodeMetaMap: NodeMetaMap,\n  ) {\n    const referencedBy: (MacroMetaData | NodeMetaData)[] = [];\n    const allNodes = [...macroMetaMap.values(), ...nodeMetaMap.nodes()];\n\n    allNodes.forEach((node) => {\n      if (node.depends_on.macros.includes(macroMetaName)) {\n        referencedBy.push(node);\n      }\n    });\n\n    return referencedBy;\n  }\n}\n"
  },
  {
    "path": "src/hover_provider/modelHoverProvider.ts",
    "content": "import { DBTTerminal, NodeMetaMap } from \"@altimateai/dbt-integration\";\nimport { inject } from \"inversify\";\nimport {\n  CancellationToken,\n  Disposable,\n  Hover,\n  HoverProvider,\n  MarkdownString,\n  Position,\n  ProviderResult,\n  Range,\n  TextDocument,\n  Uri,\n} from \"vscode\";\nimport { DBTProject } from \"../dbt_client/dbtProject\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { ManifestCacheChangedEvent } from \"../dbt_client/event/manifestCacheChangedEvent\";\nimport { TelemetryService } from \"../telemetry\";\nimport { generateHoverMarkdownString } from \"./utils\";\n\nexport class ModelHoverProvider implements HoverProvider, Disposable {\n  private modelToLocationMap: Map<string, NodeMetaMap> = new Map();\n  private static readonly IS_REF = /(ref)\\([^)]*\\)/;\n  private static readonly GET_DBT_MODEL = /(?!'|\")([^(?!'|\")]*)(?='|\")/gi;\n  private disposables: Disposable[] = [];\n\n  constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    private telemetry: TelemetryService,\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n  ) {\n    this.disposables.push(\n      dbtProjectContainer.onManifestChanged((event) =>\n        this.onManifestCacheChanged(event),\n      ),\n    );\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n\n  private getProject(uri: Uri): DBTProject | undefined {\n    const projectByUri = this.dbtProjectContainer.findDBTProject(uri);\n    if (projectByUri) {\n      return projectByUri;\n    }\n\n    const project = this.dbtProjectContainer.getFromWorkspaceState(\n      \"dbtPowerUser.projectSelected\",\n    );\n    if (!project?.uri) {\n      return;\n    }\n\n    return this.dbtProjectContainer.findDBTProject(project?.uri);\n  }\n\n  provideHover(\n    document: TextDocument,\n    position: Position,\n    token: CancellationToken,\n  ): ProviderResult<Hover> {\n    return new Promise((resolve) => {\n      const hover = document.getText(document.getWordRangeAtPosition(position));\n      const range = document.getWordRangeAtPosition(\n        position,\n        ModelHoverProvider.IS_REF,\n      );\n      if (!range) {\n        resolve(undefined);\n      }\n      const word = document.getText(range);\n      const project = this.getProject(document.uri);\n      if (!project) {\n        this.dbtTerminal.debug(\n          \"modeHoverProvider:provideHover\",\n          \"Could not load hover provider, project not found in container for \" +\n            document.uri.fsPath,\n        );\n        return;\n      }\n      if (word !== undefined && hover !== \"ref\") {\n        const dbtModel = word.match(ModelHoverProvider.GET_DBT_MODEL);\n        if (dbtModel && dbtModel.length === 1) {\n          const mdString = this.getHoverMarkdownFor(\n            dbtModel[0],\n            project.projectRoot,\n          );\n          if (mdString !== undefined) {\n            const hover = new Hover(mdString, new Range(position, position));\n            resolve(hover);\n          }\n          this.telemetry.sendTelemetryEvent(\"provideModelHover\", {\n            type: \"single\",\n          });\n          return;\n        }\n        if (dbtModel && dbtModel.length === 3) {\n          const mdString = this.getHoverMarkdownFor(\n            dbtModel[2],\n            project.projectRoot,\n          );\n          if (mdString !== undefined) {\n            const hover = new Hover(mdString, new Range(position, position));\n            resolve(hover);\n          }\n          this.telemetry.sendTelemetryEvent(\"provideModelHover\", {\n            type: \"dual\",\n          });\n          return;\n        }\n      }\n      resolve(undefined);\n    });\n  }\n\n  private onManifestCacheChanged(event: ManifestCacheChangedEvent): void {\n    event.added?.forEach((added) => {\n      this.modelToLocationMap.set(\n        added.project.projectRoot.fsPath,\n        added.nodeMetaMap,\n      );\n    });\n    event.removed?.forEach((removed) => {\n      this.modelToLocationMap.delete(removed.projectRoot.fsPath);\n    });\n  }\n\n  private getHoverMarkdownFor(\n    modelName: string,\n    currentFilePath: Uri,\n  ): MarkdownString | undefined {\n    const projectRootpath =\n      this.dbtProjectContainer.getProjectRootpath(currentFilePath);\n    if (projectRootpath === undefined) {\n      return;\n    }\n    const nodeMap = this.modelToLocationMap.get(projectRootpath.fsPath);\n    if (nodeMap === undefined) {\n      return;\n    }\n    const node = nodeMap.lookupByBaseName(modelName);\n    if (node) {\n      return generateHoverMarkdownString(node, \"ref\");\n    }\n    return undefined;\n  }\n}\n"
  },
  {
    "path": "src/hover_provider/sourceHoverProvider.ts",
    "content": "import { SourceMetaMap } from \"@altimateai/dbt-integration\";\nimport {\n  CancellationToken,\n  Disposable,\n  Hover,\n  HoverProvider,\n  MarkdownString,\n  Position,\n  ProviderResult,\n  TextDocument,\n  Uri,\n} from \"vscode\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { ManifestCacheChangedEvent } from \"../dbt_client/event/manifestCacheChangedEvent\";\nimport { TelemetryService } from \"../telemetry\";\nimport { isEnclosedWithinCodeBlock } from \"../utils\";\nimport { generateHoverMarkdownString } from \"./utils\";\n\nexport class SourceHoverProvider implements HoverProvider, Disposable {\n  private sourceMetaMap: Map<string, SourceMetaMap> = new Map();\n  private static readonly IS_SOURCE = /(source)\\([^)]*\\)/;\n  private static readonly GET_SOURCE_INFO = /(?!['\"])(\\w+)(?=['\"])/g;\n  private disposables: Disposable[] = [];\n\n  constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    private telemetry: TelemetryService,\n  ) {\n    this.disposables.push(\n      dbtProjectContainer.onManifestChanged((event) =>\n        this.onManifestCacheChanged(event),\n      ),\n    );\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n\n  provideHover(\n    document: TextDocument,\n    position: Position,\n    token: CancellationToken,\n  ): ProviderResult<Hover> {\n    return new Promise((resolve) => {\n      const hover = document.getText(document.getWordRangeAtPosition(position));\n      const range = document.getWordRangeAtPosition(\n        position,\n        SourceHoverProvider.IS_SOURCE,\n      );\n      const word = document.getText(range);\n\n      const linePrefix = document\n        .lineAt(position)\n        .text.substr(0, position.character);\n\n      if (\n        !isEnclosedWithinCodeBlock(document, position) ||\n        !linePrefix.includes(\"source\") ||\n        hover === \"source\"\n      ) {\n        resolve(undefined);\n        return;\n      }\n\n      const source = word.match(SourceHoverProvider.GET_SOURCE_INFO);\n      if (source === null || source === undefined) {\n        resolve(undefined);\n        return;\n      }\n      if (source.length < 2) {\n        resolve(undefined);\n        return;\n      }\n      const mdString = this.getSourceHover(source[0], document.uri, source[1]);\n      if (mdString !== undefined) {\n        const hover = new Hover(mdString);\n        resolve(hover);\n      }\n      this.telemetry.sendTelemetryEvent(\"provideSourceHover\");\n    });\n  }\n\n  private onManifestCacheChanged(event: ManifestCacheChangedEvent): void {\n    event.added?.forEach((added) => {\n      this.sourceMetaMap.set(\n        added.project.projectRoot.fsPath,\n        added.sourceMetaMap,\n      );\n    });\n    event.removed?.forEach((removed) => {\n      this.sourceMetaMap.delete(removed.projectRoot.fsPath);\n    });\n  }\n\n  private getSourceHover(\n    sourceName: string,\n    currentFilePath: Uri,\n    tableName: string,\n  ): MarkdownString | undefined {\n    const projectRootpath =\n      this.dbtProjectContainer.getProjectRootpath(currentFilePath);\n    if (projectRootpath === undefined) {\n      return;\n    }\n    const sourceMap = this.sourceMetaMap.get(projectRootpath.fsPath);\n    if (sourceMap === undefined) {\n      return;\n    }\n    const node = sourceMap\n      .get(sourceName)\n      ?.tables.find((table) => table.name === tableName);\n    if (node) {\n      return generateHoverMarkdownString(node, \"source\");\n    }\n    return undefined;\n  }\n}\n"
  },
  {
    "path": "src/hover_provider/utils.ts",
    "content": "import {\n  MacroMetaData,\n  NodeMetaData,\n  NodeMetaType,\n  SourceMetaType,\n} from \"@altimateai/dbt-integration\";\nimport { MarkdownString, Uri } from \"vscode\";\nimport { ManifestCacheProjectAddedEvent } from \"../dbt_client/event/manifestCacheChangedEvent\";\n\nexport function generateHoverMarkdownString(\n  node: NodeMetaType | SourceMetaType,\n  nodeType: string,\n): MarkdownString {\n  const content = new MarkdownString();\n  content.supportHtml = true;\n  content.isTrusted = true;\n  content.appendMarkdown(\n    `<span style=\"color:#347890;\">(${nodeType})&nbsp;</span><span><strong>${node.name}</strong></span>`,\n  );\n  if (node.description !== \"\") {\n    content.appendMarkdown(`</br><span>${node.description}</span>`);\n  }\n  addSeparator(content);\n  for (const colKey in node.columns) {\n    const column = node.columns[colKey];\n    content.appendMarkdown(\n      `<span style=\"color:#347890;\">(column)&nbsp;</span><span>${column.name} &nbsp;</span>`,\n    );\n    if (column.data_type) {\n      content.appendMarkdown(\n        `<span>-&nbsp;${column.data_type.toLowerCase()}</span>`,\n      );\n    }\n    if (column.description !== \"\") {\n      content.appendMarkdown(\n        `<br/><span><em>${column.description}</em></span>`,\n      );\n    }\n    content.appendMarkdown(\"</br>\");\n  }\n  return content;\n}\n\nexport const generateMacroHoverMarkdown = (\n  node: MacroMetaData,\n  referencedBy: (MacroMetaData | NodeMetaData)[],\n  event: ManifestCacheProjectAddedEvent,\n) => {\n  const content = new MarkdownString();\n  content.supportHtml = true;\n  content.isTrusted = true;\n  content.appendMarkdown(\n    `<span style=\"color:#347890;\">(Macro)&nbsp;</span><span><strong>${node.name}</strong></span>`,\n  );\n  if (node.description !== \"\") {\n    content.appendMarkdown(`</br><span>${node.description}</span>`);\n  }\n  addSeparator(content);\n  node.arguments?.forEach((macroArg) => {\n    content.appendMarkdown(\n      `<span style=\"color:#347890;\">(argument)&nbsp;</span><span>${macroArg.name} &nbsp;</span>`,\n    );\n    if (macroArg.type) {\n      content.appendMarkdown(\n        `<span>-&nbsp;${macroArg.type.toLowerCase()}</span>`,\n      );\n    }\n    if (macroArg.description !== \"\") {\n      content.appendMarkdown(\n        `<br/><span><em>${macroArg.description}</em></span>`,\n      );\n    }\n    content.appendMarkdown(\"</br>\");\n  });\n\n  if (referencedBy.length) {\n    addSeparator(content);\n    content.appendMarkdown(\n      `<span style=\"color:#347890;\">(Referenced by)&nbsp;</span><span>${referencedBy\n        .map((node) => buildLink(node))\n        .join(\",&nbsp;\")}</span>`,\n    );\n    content.appendMarkdown(\"</br>\");\n  }\n\n  if (node.depends_on.macros?.length || node.depends_on.nodes?.length) {\n    const dependsOn = [\n      ...(node.depends_on.macros?.map((m) =>\n        [...event.macroMetaMap.values()].find((macro) => macro.unique_id === m),\n      ) || []),\n      ...(node.depends_on.nodes?.map((m) =>\n        [...event.nodeMetaMap.nodes()].find((macro) => macro.unique_id === m),\n      ) || []),\n    ];\n    addSeparator(content);\n    content.appendMarkdown(\n      `<span style=\"color:#347890;\">(Depends on)&nbsp;</span><span>${dependsOn\n        .map((node) => buildLink(node))\n        .join(\",&nbsp;\")}</span>`,\n    );\n  }\n\n  return content;\n};\n\nconst addSeparator = (content: MarkdownString) => {\n  content.appendText(\"\\n\");\n  content.appendText(\"\\n\");\n  content.appendMarkdown(\"---\");\n  content.appendText(\"\\n\");\n  content.appendText(\"\\n\");\n};\n\nconst buildLink = (node: MacroMetaData | NodeMetaData | undefined) => {\n  if (!node) {\n    return;\n  }\n  if (!node.path) {\n    return node.name;\n  }\n\n  return `[${node.name}](${Uri.file(node.path)} \"${node.unique_id}\")`;\n};\n"
  },
  {
    "path": "src/hover_provider/yamlModelHoverProvider.ts",
    "content": "import { NodeMetaMap, SourceMetaMap } from \"@altimateai/dbt-integration\";\nimport {\n  CancellationToken,\n  Disposable,\n  Hover,\n  HoverProvider,\n  Position,\n  ProviderResult,\n  Range,\n  TextDocument,\n} from \"vscode\";\nimport { parseDocument } from \"yaml\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { ManifestCacheChangedEvent } from \"../dbt_client/event/manifestCacheChangedEvent\";\nimport { TelemetryService } from \"../telemetry\";\nimport { generateHoverMarkdownString } from \"./utils\";\n\ninterface YamlMapItem {\n  key?: { value?: string };\n  value?: { value?: string; items?: YamlMapItem[] };\n  items?: YamlMapItem[];\n  range?: [number, number, number];\n}\n\nexport class YamlModelHoverProvider implements HoverProvider, Disposable {\n  private nodeMetaMap: Map<string, NodeMetaMap> = new Map();\n  private sourceMetaMap: Map<string, SourceMetaMap> = new Map();\n  private disposables: Disposable[] = [];\n\n  constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    private telemetry: TelemetryService,\n  ) {\n    this.disposables.push(\n      dbtProjectContainer.onManifestChanged((event) =>\n        this.onManifestCacheChanged(event),\n      ),\n    );\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n\n  provideHover(\n    document: TextDocument,\n    position: Position,\n    _token: CancellationToken,\n  ): ProviderResult<Hover> {\n    const projectRootpath = this.dbtProjectContainer.getProjectRootpath(\n      document.uri,\n    );\n    if (!projectRootpath) {\n      return;\n    }\n\n    const modelName = this.getModelNameAtPosition(document, position);\n    if (modelName) {\n      const nodeMap = this.nodeMetaMap.get(projectRootpath.fsPath);\n      if (nodeMap) {\n        const node = nodeMap.lookupByBaseName(modelName);\n        if (node) {\n          this.telemetry.sendTelemetryEvent(\"provideYamlModelHover\");\n          return new Hover(\n            generateHoverMarkdownString(node, \"model\"),\n            new Range(position, position),\n          );\n        }\n      }\n    }\n\n    const sourceInfo = this.getSourceNameAtPosition(document, position);\n    if (sourceInfo) {\n      const sourceMap = this.sourceMetaMap.get(projectRootpath.fsPath);\n      if (sourceMap) {\n        const source = sourceMap.get(sourceInfo.sourceName);\n        if (source && sourceInfo.tableName) {\n          const table = source.tables.find(\n            (t) => t.name === sourceInfo.tableName,\n          );\n          if (table) {\n            this.telemetry.sendTelemetryEvent(\"provideYamlSourceHover\");\n            return new Hover(\n              generateHoverMarkdownString(table, \"source\"),\n              new Range(position, position),\n            );\n          }\n        }\n      }\n    }\n\n    return undefined;\n  }\n\n  private getModelNameAtPosition(\n    document: TextDocument,\n    position: Position,\n  ): string | undefined {\n    try {\n      const parsedYaml = parseDocument(document.getText());\n      if (!parsedYaml.contents) {\n        return;\n      }\n      const offset = document.offsetAt(position);\n      const contents = parsedYaml.contents as { items?: YamlMapItem[] };\n      if (!contents.items) {\n        return;\n      }\n\n      const modelsNode = contents.items.find(\n        (item) => item?.key?.value === \"models\",\n      );\n      if (!modelsNode?.value?.items) {\n        return;\n      }\n\n      for (const model of modelsNode.value.items) {\n        if (!model?.items) {\n          continue;\n        }\n        const nameNode = model.items.find(\n          (item) => item?.key?.value === \"name\",\n        );\n        if (!nameNode?.value) {\n          continue;\n        }\n        const nameValue = (nameNode.value as { value?: string }).value;\n        if (!nameValue) {\n          continue;\n        }\n\n        // Check if cursor is on or near the name value\n        const nameRange = (nameNode.value as { range?: [number, number] })\n          .range;\n        if (nameRange && offset >= nameRange[0] && offset <= nameRange[1]) {\n          return nameValue;\n        }\n\n        // Fallback: check if cursor word matches the model name\n        const wordRange = document.getWordRangeAtPosition(position);\n        if (wordRange) {\n          const word = document.getText(wordRange);\n          if (word === nameValue) {\n            // Verify cursor is within this model's block\n            if (\n              model.range &&\n              offset >= model.range[0] &&\n              offset <= model.range[1]\n            ) {\n              return nameValue;\n            }\n          }\n        }\n      }\n    } catch {\n      // YAML parse errors are expected during editing\n    }\n    return undefined;\n  }\n\n  private getSourceNameAtPosition(\n    document: TextDocument,\n    position: Position,\n  ): { sourceName: string; tableName?: string } | undefined {\n    try {\n      const parsedYaml = parseDocument(document.getText());\n      if (!parsedYaml.contents) {\n        return;\n      }\n      const offset = document.offsetAt(position);\n      const contents = parsedYaml.contents as { items?: YamlMapItem[] };\n      if (!contents.items) {\n        return;\n      }\n\n      const sourcesNode = contents.items.find(\n        (item) => item?.key?.value === \"sources\",\n      );\n      if (!sourcesNode?.value?.items) {\n        return;\n      }\n\n      for (const source of sourcesNode.value.items) {\n        if (!source?.items) {\n          continue;\n        }\n        const nameNode = source.items.find(\n          (item) => item?.key?.value === \"name\",\n        );\n        if (!nameNode?.value) {\n          continue;\n        }\n        const sourceName = (nameNode.value as { value?: string }).value;\n        if (!sourceName) {\n          continue;\n        }\n\n        // Check if cursor is within this source block\n        if (\n          !(\n            source.range &&\n            offset >= source.range[0] &&\n            offset <= source.range[1]\n          )\n        ) {\n          continue;\n        }\n\n        // Check tables within this source\n        const tablesNode = source.items.find(\n          (item) => item?.key?.value === \"tables\",\n        );\n        if (!tablesNode?.value?.items) {\n          // Cursor is on the source name itself\n          const nameRange = (nameNode.value as { range?: [number, number] })\n            .range;\n          if (nameRange && offset >= nameRange[0] && offset <= nameRange[1]) {\n            return { sourceName };\n          }\n          continue;\n        }\n\n        for (const table of tablesNode.value.items) {\n          if (!table?.items) {\n            continue;\n          }\n          const tableNameNode = table.items.find(\n            (item) => item?.key?.value === \"name\",\n          );\n          if (!tableNameNode?.value) {\n            continue;\n          }\n          const tableName = (tableNameNode.value as { value?: string }).value;\n          if (!tableName) {\n            continue;\n          }\n          const tableNameRange = (\n            tableNameNode.value as { range?: [number, number] }\n          ).range;\n          if (\n            tableNameRange &&\n            offset >= tableNameRange[0] &&\n            offset <= tableNameRange[1]\n          ) {\n            return { sourceName, tableName };\n          }\n        }\n      }\n    } catch {\n      // YAML parse errors are expected during editing\n    }\n    return undefined;\n  }\n\n  private onManifestCacheChanged(event: ManifestCacheChangedEvent): void {\n    event.added?.forEach((added) => {\n      this.nodeMetaMap.set(added.project.projectRoot.fsPath, added.nodeMetaMap);\n      this.sourceMetaMap.set(\n        added.project.projectRoot.fsPath,\n        added.sourceMetaMap,\n      );\n    });\n    event.removed?.forEach((removed) => {\n      this.nodeMetaMap.delete(removed.projectRoot.fsPath);\n      this.sourceMetaMap.delete(removed.projectRoot.fsPath);\n    });\n  }\n}\n"
  },
  {
    "path": "src/inversify.config.ts",
    "content": "import {\n  AltimateHttpClient,\n  ChildrenParentParser,\n  CLIDBTCommandExecutionStrategy,\n  CommandProcessExecutionFactory,\n  DBTCloudDetection,\n  DBTCloudProjectDetection,\n  DBTCloudProjectIntegration,\n  DbtCloudVariantDetector,\n  DBTCommandExecutionInfrastructure,\n  DBTCommandExecutionStrategy,\n  DBTCommandFactory,\n  DBTConfiguration,\n  DBTCoreCommandDetection,\n  DBTCoreCommandProjectDetection,\n  DBTCoreCommandProjectIntegration,\n  DBTCoreDetection,\n  DBTCoreProjectDetection,\n  DBTCoreProjectIntegration,\n  DBTDetection,\n  DBTDiagnosticData,\n  DBTFusionCommandDetection,\n  DBTFusionCommandProjectDetection,\n  DBTFusionCommandProjectIntegration,\n  DbtIntegrationClient,\n  DBTProjectDetection,\n  DBTProjectIntegrationAdapter,\n  DBTTerminal,\n  DeferConfig,\n  DocParser,\n  ExposureParser,\n  FunctionParser,\n  GraphParser,\n  MacroParser,\n  MetricParser,\n  ModelDepthParser,\n  NodeParser,\n  PythonDBTCommandExecutionStrategy,\n  PythonEnvironmentProvider,\n  RuntimePythonEnvironment,\n  SourceParser,\n  TestParser,\n} from \"@altimateai/dbt-integration\";\nimport * as LibNamespace from \"@lib\";\nimport { NotebookKernelClient } from \"@lib\";\nimport { Container, interfaces } from \"inversify\";\nimport { Event, EventEmitter, Uri, workspace, WorkspaceFolder } from \"vscode\";\nimport { AltimateRequest } from \"./altimate\";\nimport { DBTProject } from \"./dbt_client/dbtProject\";\nimport { ProjectRegisteredUnregisteredEvent } from \"./dbt_client/dbtProjectContainer\";\nimport { DBTProjectLog } from \"./dbt_client/dbtProjectLog\";\nimport { DBTWorkspaceFolder } from \"./dbt_client/dbtWorkspaceFolder\";\nimport { ManifestCacheChangedEvent } from \"./dbt_client/event/manifestCacheChangedEvent\";\nimport { ProjectConfigChangedEvent } from \"./dbt_client/event/projectConfigChangedEvent\";\nimport { PythonEnvironment } from \"./dbt_client/pythonEnvironment\";\nimport {\n  StaticRuntimePythonEnvironment,\n  VSCodeRuntimePythonEnvironmentProvider,\n} from \"./dbt_client/runtimePythonEnvironmentProvider\";\nimport { VSCodeDBTConfiguration } from \"./dbt_client/vscodeConfiguration\";\nimport { VSCodeDBTTerminal } from \"./dbt_client/vscodeTerminal\";\nimport { AltimateAuthService } from \"./services/altimateAuthService\";\nimport { AltimateCodeChatService } from \"./services/altimateCodeChatService\";\nimport { ConversationService } from \"./services/conversationService\";\nimport { DbtLineageService } from \"./services/dbtLineageService\";\nimport { DbtTestService } from \"./services/dbtTestService\";\nimport { DiagnosticsOutputChannel } from \"./services/diagnosticsOutputChannel\";\nimport { DocGenService } from \"./services/docGenService\";\nimport { FileService } from \"./services/fileService\";\nimport { QueryAnalysisService } from \"./services/queryAnalysisService\";\nimport { QueryManifestService } from \"./services/queryManifestService\";\nimport { RunHistoryService } from \"./services/runHistoryService\";\nimport { SharedStateService } from \"./services/sharedStateService\";\nimport { StreamingService } from \"./services/streamingService\";\nimport { UsersService } from \"./services/usersService\";\nimport { TelemetryService } from \"./telemetry\";\n\nimport { ValidationProvider } from \"./validation_provider\";\n\n// Core extension components\nimport { DBTClient } from \"./dbt_client\";\nimport { AltimateDatapilot } from \"./dbt_client/datapilot\";\nimport { DBTProjectContainer } from \"./dbt_client/dbtProjectContainer\";\nimport { DbtPowerUserMcpServer } from \"./mcp\";\nimport { DbtPowerUserMcpServerTools } from \"./mcp/server\";\n\n// Import providers\nimport { AutocompletionProviders } from \"./autocompletion_provider\";\nimport { DocAutocompletionProvider } from \"./autocompletion_provider/docAutocompletionProvider\";\nimport { MacroAutocompletionProvider } from \"./autocompletion_provider/macroAutocompletionProvider\";\nimport { ModelAutocompletionProvider } from \"./autocompletion_provider/modelAutocompletionProvider\";\nimport { SourceAutocompletionProvider } from \"./autocompletion_provider/sourceAutocompletionProvider\";\nimport { UserCompletionProvider } from \"./autocompletion_provider/usercompletion_provider\";\nimport { CodeLensProviders } from \"./code_lens_provider\";\nimport { CteCodeLensProvider } from \"./code_lens_provider/cteCodeLensProvider\";\nimport { SourceModelCreationCodeLensProvider } from \"./code_lens_provider/sourceModelCreationCodeLensProvider\";\nimport { SqlActionsCodeLensProvider } from \"./code_lens_provider/sqlActionsCodeLensProvider\";\nimport { VirtualSqlCodeLensProvider } from \"./code_lens_provider/virtualSqlCodeLensProvider\";\nimport { DefinitionProviders } from \"./definition_provider\";\nimport { DocDefinitionProvider } from \"./definition_provider/docDefinitionProvider\";\nimport { MacroDefinitionProvider } from \"./definition_provider/macroDefinitionProvider\";\nimport { ModelDefinitionProvider } from \"./definition_provider/modelDefinitionProvider\";\nimport { SourceDefinitionProvider } from \"./definition_provider/sourceDefinitionProvider\";\nimport { HoverProviders } from \"./hover_provider\";\nimport { DepthDecorationProvider } from \"./hover_provider/depthDecorationProvider\";\nimport { MacroHoverProvider } from \"./hover_provider/macroHoverProvider\";\nimport { ModelHoverProvider } from \"./hover_provider/modelHoverProvider\";\nimport { SourceHoverProvider } from \"./hover_provider/sourceHoverProvider\";\nimport { YamlModelHoverProvider } from \"./hover_provider/yamlModelHoverProvider\";\nimport { ProjectQuickPick } from \"./quickpick/projectQuickPick\";\n\n// Import missing providers and components\nimport { VSCodeCommands } from \"./commands\";\nimport { AltimateScan } from \"./commands/altimateScan\";\nimport { BigQueryCostEstimate } from \"./commands/bigQueryCostEstimate\";\nimport { RunModel } from \"./commands/runModel\";\nimport { RunTest } from \"./commands/runTest\";\nimport { SqlToModel } from \"./commands/sqlToModel\";\nimport { MissingSchemaTest } from \"./commands/tests/missingSchemaTest\";\nimport { StaleModelColumnTest } from \"./commands/tests/staleModelColumnTest\";\nimport { UndocumentedModelColumnTest } from \"./commands/tests/undocumentedModelColumnTest\";\nimport { UnmaterializedModelTest } from \"./commands/tests/unmaterializedModelTest\";\nimport { ValidateSql } from \"./commands/validateSql\";\nimport { WalkthroughCommands } from \"./commands/walkthroughCommands\";\nimport { CommentProviders } from \"./comment_provider\";\nimport { ConversationProvider } from \"./comment_provider/conversationProvider\";\nimport { ContentProviders } from \"./content_provider\";\nimport { SqlPreviewContentProvider } from \"./content_provider/sqlPreviewContentProvider\";\nimport { CteProfilerDecorationProvider } from \"./cte_profiler/cteProfilerDecorationProvider\";\nimport { CteProfilerService } from \"./cte_profiler/cteProfilerService\";\nimport { DBTPowerUserExtension } from \"./dbtPowerUserExtension\";\nimport { DocumentFormattingEditProviders } from \"./document_formatting_edit_provider\";\nimport { DbtDocumentFormattingEditProvider } from \"./document_formatting_edit_provider/dbtDocumentFormattingEditProvider\";\nimport { DbtPowerUserActionsCenter } from \"./quickpick\";\nimport { DbtPowerUserControlCenterAction } from \"./quickpick/actionsQuickPick\";\nimport { DbtSQLAction } from \"./quickpick/sqlQuickPick\";\nimport { StatusBars } from \"./statusbar\";\nimport { DeferToProductionStatusBar } from \"./statusbar/deferToProductionStatusBar\";\nimport { TargetStatusBar } from \"./statusbar/targetStatusBar\";\nimport { VersionStatusBar } from \"./statusbar/versionStatusBar\";\nimport { TreeviewProviders } from \"./treeview_provider\";\nimport {\n  ChildrenModelTreeview,\n  DocumentationTreeview,\n  IconActionsTreeview,\n  ModelTestTreeview,\n  ParentModelTreeview,\n} from \"./treeview_provider/modelTreeviewProvider\";\nimport { RunHistoryTreeviewProvider } from \"./treeview_provider/runHistoryTreeviewProvider\";\nimport { WebviewViewProviders } from \"./webview_provider\";\nimport { DataPilotPanel } from \"./webview_provider/datapilotPanel\";\nimport { DbtDocsView } from \"./webview_provider/DbtDocsView\";\nimport { DocsEditViewPanel } from \"./webview_provider/docsEditPanel\";\nimport { InsightsPanel } from \"./webview_provider/insightsPanel\";\nimport { LineagePanel } from \"./webview_provider/lineagePanel\";\nimport { NewDocsGenPanel } from \"./webview_provider/newDocsGenPanel\";\nimport { NewLineagePanel } from \"./webview_provider/newLineagePanel\";\nimport { OnboardingPanel } from \"./webview_provider/onboardingPanel\";\nimport { QueryResultPanel } from \"./webview_provider/queryResultPanel\";\nimport { SQLLineagePanel } from \"./webview_provider/sqlLineagePanel\";\n\nexport const container = new Container();\n\n// Bind parser classes\ncontainer\n  .bind(ChildrenParentParser)\n  .toDynamicValue(() => new ChildrenParentParser());\ncontainer\n  .bind(NodeParser)\n  .toDynamicValue(\n    (context) => new NodeParser(context.container.get(\"DBTTerminal\")),\n  );\ncontainer\n  .bind(MacroParser)\n  .toDynamicValue(\n    (context) => new MacroParser(context.container.get(\"DBTTerminal\")),\n  );\ncontainer\n  .bind(MetricParser)\n  .toDynamicValue(\n    (context) => new MetricParser(context.container.get(\"DBTTerminal\")),\n  );\ncontainer\n  .bind(GraphParser)\n  .toDynamicValue(\n    (context) => new GraphParser(context.container.get(\"DBTTerminal\")),\n  );\ncontainer\n  .bind(SourceParser)\n  .toDynamicValue(\n    (context) => new SourceParser(context.container.get(\"DBTTerminal\")),\n  );\ncontainer\n  .bind(TestParser)\n  .toDynamicValue(\n    (context) => new TestParser(context.container.get(\"DBTTerminal\")),\n  );\ncontainer\n  .bind(ExposureParser)\n  .toDynamicValue(\n    (context) => new ExposureParser(context.container.get(\"DBTTerminal\")),\n  );\ncontainer\n  .bind(FunctionParser)\n  .toDynamicValue(\n    (context) => new FunctionParser(context.container.get(\"DBTTerminal\")),\n  );\ncontainer\n  .bind(DocParser)\n  .toDynamicValue(\n    (context) => new DocParser(context.container.get(\"DBTTerminal\")),\n  );\ncontainer\n  .bind(ModelDepthParser)\n  .toDynamicValue(\n    (context) =>\n      new ModelDepthParser(\n        context.container.get(\"DBTTerminal\"),\n        context.container.get(DbtIntegrationClient),\n        context.container.get(\"DBTConfiguration\"),\n      ),\n  );\n\n// Bind core dbt integration classes using factory functions\ncontainer\n  .bind(CLIDBTCommandExecutionStrategy)\n  .toDynamicValue(() => {\n    // Note: CLIDBTCommandExecutionStrategy requires projectRoot and dbtPath at construction time\n    // These will be provided by the factory functions that create instances\n    throw new Error(\n      \"CLIDBTCommandExecutionStrategy should be created via Factory<CLIDBTCommandExecutionStrategy>\",\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind<\n    interfaces.Factory<PythonDBTCommandExecutionStrategy>\n  >(\"Factory<PythonDBTCommandExecutionStrategy>\")\n  .toFactory<\n    PythonDBTCommandExecutionStrategy,\n    [string]\n  >((context: interfaces.Context) => {\n    return (projectRoot: string) => {\n      const { container } = context;\n      const baseConfig = container.get<DBTConfiguration>(\"DBTConfiguration\");\n      // Create a per-project config that returns the correct working directory\n      // so that PythonDBTCommandExecutionStrategy resolves the right .env file\n      const projectConfig = Object.create(baseConfig) as DBTConfiguration;\n      projectConfig.getWorkingDirectory = () => projectRoot;\n      return new PythonDBTCommandExecutionStrategy(\n        container.get(CommandProcessExecutionFactory),\n        container.get(\"RuntimePythonEnvironment\"),\n        container.get(\"DBTTerminal\"),\n        projectConfig,\n      );\n    };\n  });\n\ncontainer.bind(DBTCommandExecutionInfrastructure).toDynamicValue((context) => {\n  return new DBTCommandExecutionInfrastructure(\n    context.container.get(\"RuntimePythonEnvironment\"),\n    context.container.get(\"DBTTerminal\"),\n  );\n});\n\ncontainer\n  .bind(DBTCommandFactory)\n  .toDynamicValue((context) => {\n    return new DBTCommandFactory(context.container.get(\"DBTConfiguration\"));\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(DbtCloudVariantDetector)\n  .toDynamicValue((context) => {\n    return new DbtCloudVariantDetector(context.container.get(\"DBTTerminal\"));\n  })\n  .inSingletonScope();\n\n// Bind dbt core integration classes using factory functions\ncontainer\n  .bind(DBTCoreDetection)\n  .toDynamicValue((context) => {\n    return new DBTCoreDetection(\n      context.container.get(\"RuntimePythonEnvironment\"),\n      context.container.get(CommandProcessExecutionFactory),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(DBTCoreProjectDetection)\n  .toDynamicValue((context) => {\n    return new DBTCoreProjectDetection(\n      context.container.get(DBTCommandExecutionInfrastructure),\n      context.container.get(\"DBTTerminal\"),\n    );\n  })\n  .inSingletonScope();\n\n// Note: DBTCoreProjectIntegration requires projectRoot at construction time\n// It will be created via Factory<DBTCoreProjectIntegration>\ncontainer\n  .bind(DBTCoreProjectIntegration)\n  .toDynamicValue(() => {\n    throw new Error(\n      \"DBTCoreProjectIntegration should be created via Factory<DBTCoreProjectIntegration>\",\n    );\n  })\n  .inSingletonScope();\n\n// Bind dbt cloud integration classes using factory functions\ncontainer\n  .bind(DBTCloudDetection)\n  .toDynamicValue((context) => {\n    return new DBTCloudDetection(\n      context.container.get(CommandProcessExecutionFactory),\n      context.container.get(\"RuntimePythonEnvironment\"),\n      context.container.get(\"DBTTerminal\"),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(DBTCloudProjectDetection)\n  .toDynamicValue(() => {\n    return new DBTCloudProjectDetection();\n  })\n  .inSingletonScope();\n\n// Note: DBTCloudProjectIntegration requires projectRoot at construction time\n// It will be created via Factory<DBTCloudProjectIntegration>\ncontainer\n  .bind(DBTCloudProjectIntegration)\n  .toDynamicValue(() => {\n    throw new Error(\n      \"DBTCloudProjectIntegration should be created via Factory<DBTCloudProjectIntegration>\",\n    );\n  })\n  .inSingletonScope();\n\n// Bind dbt fusion integration classes using factory functions\ncontainer\n  .bind(DBTFusionCommandDetection)\n  .toDynamicValue((context) => {\n    return new DBTFusionCommandDetection(\n      context.container.get(CommandProcessExecutionFactory),\n      context.container.get(\"RuntimePythonEnvironment\"),\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(\"DBTConfiguration\"),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(DBTFusionCommandProjectDetection)\n  .toDynamicValue(() => {\n    return new DBTFusionCommandProjectDetection();\n  })\n  .inSingletonScope();\n\n// Note: DBTFusionCommandProjectIntegration requires projectRoot at construction time\n// It will be created via Factory<DBTFusionCommandProjectIntegration>\ncontainer\n  .bind(DBTFusionCommandProjectIntegration)\n  .toDynamicValue(() => {\n    throw new Error(\n      \"DBTFusionCommandProjectIntegration should be created via Factory<DBTFusionCommandProjectIntegration>\",\n    );\n  })\n  .inSingletonScope();\n\n// Bind dbt core command integration classes using factory functions\ncontainer\n  .bind(DBTCoreCommandDetection)\n  .toDynamicValue((context) => {\n    return new DBTCoreCommandDetection(\n      context.container.get(\"RuntimePythonEnvironment\"),\n      context.container.get(CommandProcessExecutionFactory),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(DBTCoreCommandProjectDetection)\n  .toDynamicValue((context) => {\n    return new DBTCoreCommandProjectDetection(\n      context.container.get(DBTCommandExecutionInfrastructure),\n      context.container.get(\"DBTTerminal\"),\n    );\n  })\n  .inSingletonScope();\n\n// Note: DBTCoreCommandProjectIntegration requires projectRoot at construction time\n// It will be created via Factory<DBTCoreCommandProjectIntegration>\ncontainer\n  .bind(DBTCoreCommandProjectIntegration)\n  .toDynamicValue(() => {\n    throw new Error(\n      \"DBTCoreCommandProjectIntegration should be created via Factory<DBTCoreCommandProjectIntegration>\",\n    );\n  })\n  .inSingletonScope();\n\n// Bind DBTConfiguration\ncontainer\n  .bind<DBTConfiguration>(\"DBTConfiguration\")\n  .to(VSCodeDBTConfiguration)\n  .inSingletonScope();\n\n// Bind DBTTerminal\ncontainer\n  .bind<DBTTerminal>(\"DBTTerminal\")\n  .to(VSCodeDBTTerminal)\n  .inSingletonScope();\n\n// Bind RuntimePythonEnvironment (VSCode-free version for dbt_integration)\ncontainer\n  .bind<RuntimePythonEnvironment>(\"RuntimePythonEnvironment\")\n  .to(StaticRuntimePythonEnvironment)\n  .inSingletonScope();\n\n// Bind PythonEnvironmentProvider\ncontainer\n  .bind<PythonEnvironmentProvider>(\"PythonEnvironmentProvider\")\n  .to(VSCodeRuntimePythonEnvironmentProvider)\n  .inSingletonScope();\n\n// Bind CommandProcessExecutionFactory\ncontainer\n  .bind(CommandProcessExecutionFactory)\n  .toDynamicValue((context) => {\n    return new CommandProcessExecutionFactory(\n      context.container.get(\"DBTTerminal\"),\n    );\n  })\n  .inSingletonScope();\n\n// Bind AltimateHttpClient\ncontainer\n  .bind(AltimateHttpClient)\n  .toDynamicValue((context) => {\n    return new AltimateHttpClient(\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(\"DBTConfiguration\"),\n    );\n  })\n  .inSingletonScope();\n\n// Bind DbtIntegrationClient\ncontainer\n  .bind(DbtIntegrationClient)\n  .toDynamicValue((context) => {\n    return new DbtIntegrationClient(\n      context.container.get(AltimateHttpClient),\n      context.container.get(\"DBTTerminal\"),\n    );\n  })\n  .inSingletonScope();\n\n// Bind AltimateRequest\ncontainer\n  .bind(AltimateRequest)\n  .toDynamicValue((context) => {\n    return new AltimateRequest(\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(\"DBTConfiguration\"),\n      context.container.get(AltimateHttpClient),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind<interfaces.Factory<DBTDetection>>(\"Factory<DBTDetection>\")\n  .toFactory<DBTDetection, []>((context: interfaces.Context) => {\n    return () => {\n      const { container } = context;\n      const dbtIntegrationMode = workspace\n        .getConfiguration(\"dbt\")\n        .get<string>(\"dbtIntegration\", \"core\");\n\n      switch (dbtIntegrationMode) {\n        case \"cloud\":\n          return container.get(DBTCloudDetection);\n        case \"fusion\":\n          return container.get(DBTFusionCommandDetection);\n        default:\n          return container.get(DBTCoreDetection);\n      }\n    };\n  });\n\ncontainer\n  .bind<interfaces.Factory<DBTProjectDetection>>(\"Factory<DBTProjectDetection>\")\n  .toFactory<DBTProjectDetection, []>((context: interfaces.Context) => {\n    return () => {\n      const { container } = context;\n      const dbtIntegrationMode = workspace\n        .getConfiguration(\"dbt\")\n        .get<string>(\"dbtIntegration\", \"core\");\n\n      switch (dbtIntegrationMode) {\n        case \"cloud\":\n          // Handle preview features for cloud integration\n          container.get(AltimateAuthService).handlePreviewFeatures();\n          return container.get(DBTCloudProjectDetection);\n        case \"fusion\":\n          return container.get(DBTFusionCommandProjectDetection);\n        default:\n          return container.get(DBTCoreProjectDetection);\n      }\n    };\n  });\n\ncontainer\n  .bind<interfaces.Factory<DBTWorkspaceFolder>>(\"Factory<DBTWorkspaceFolder>\")\n  .toFactory<\n    DBTWorkspaceFolder,\n    [\n      WorkspaceFolder,\n      EventEmitter<ManifestCacheChangedEvent>,\n      EventEmitter<ProjectRegisteredUnregisteredEvent>,\n    ]\n  >((context: interfaces.Context) => {\n    return (\n      workspaceFolder: WorkspaceFolder,\n      _onManifestChanged: EventEmitter<ManifestCacheChangedEvent>,\n      _onProjectRegisteredUnregistered: EventEmitter<ProjectRegisteredUnregisteredEvent>,\n    ) => {\n      const { container } = context;\n      return new DBTWorkspaceFolder(\n        container.get(\"Factory<DBTProject>\"),\n        container.get(\"Factory<DBTProjectDetection>\"),\n        container.get(TelemetryService),\n        container.get(\"DBTTerminal\"),\n        workspaceFolder,\n        _onManifestChanged,\n        _onProjectRegisteredUnregistered,\n      );\n    };\n  });\n\ncontainer\n  .bind<\n    interfaces.Factory<DBTCommandExecutionStrategy>\n  >(\"Factory<CLIDBTCommandExecutionStrategy>\")\n  .toFactory<\n    CLIDBTCommandExecutionStrategy,\n    [string, string]\n  >((context: interfaces.Context) => {\n    return (projectRoot: string, dbtPath: string) => {\n      const { container } = context;\n      return new CLIDBTCommandExecutionStrategy(\n        container.get(CommandProcessExecutionFactory),\n        container.get(\"RuntimePythonEnvironment\"),\n        container.get(\"DBTTerminal\"),\n        projectRoot,\n        dbtPath,\n      );\n    };\n  });\n\ncontainer\n  .bind<\n    interfaces.Factory<DBTCoreProjectIntegration>\n  >(\"Factory<DBTCoreProjectIntegration>\")\n  .toFactory<\n    DBTCoreProjectIntegration,\n    [string, DBTDiagnosticData[], DeferConfig, () => void]\n  >((context: interfaces.Context) => {\n    return (\n      projectRoot: string,\n      projectConfigDiagnostics: DBTDiagnosticData[],\n      deferConfig: DeferConfig,\n      onDiagnosticsChanged: () => void,\n    ) => {\n      const { container } = context;\n      const pythonStrategyFactory = container.get<\n        (projectRoot: string) => PythonDBTCommandExecutionStrategy\n      >(\"Factory<PythonDBTCommandExecutionStrategy>\");\n      return new DBTCoreProjectIntegration(\n        container.get(DBTCommandExecutionInfrastructure),\n        container.get(\"RuntimePythonEnvironment\"),\n        container.get(\"PythonEnvironmentProvider\"),\n        pythonStrategyFactory(projectRoot),\n        container.get(\"Factory<CLIDBTCommandExecutionStrategy>\"),\n        container.get(\"DBTTerminal\"),\n        container.get(\"DBTConfiguration\"),\n        container.get(DbtIntegrationClient),\n        projectRoot,\n        projectConfigDiagnostics,\n        deferConfig,\n        onDiagnosticsChanged,\n      );\n    };\n  });\n\ncontainer\n  .bind<\n    interfaces.Factory<DBTCoreProjectIntegration>\n  >(\"Factory<DBTCoreCommandProjectIntegration>\")\n  .toFactory<\n    DBTCoreCommandProjectIntegration,\n    [string, DBTDiagnosticData[], DeferConfig, () => void]\n  >((context: interfaces.Context) => {\n    return (\n      projectRoot: string,\n      projectConfigDiagnostics: DBTDiagnosticData[],\n      deferConfig: DeferConfig,\n      onDiagnosticsChanged: () => void,\n    ) => {\n      const { container } = context;\n      const pythonStrategyFactory = container.get<\n        (projectRoot: string) => PythonDBTCommandExecutionStrategy\n      >(\"Factory<PythonDBTCommandExecutionStrategy>\");\n      return new DBTCoreCommandProjectIntegration(\n        container.get(DBTCommandExecutionInfrastructure),\n        container.get(\"RuntimePythonEnvironment\"),\n        container.get(\"PythonEnvironmentProvider\"),\n        pythonStrategyFactory(projectRoot),\n        container.get(\"Factory<CLIDBTCommandExecutionStrategy>\"),\n        container.get(\"DBTTerminal\"),\n        container.get(\"DBTConfiguration\"),\n        container.get(DbtIntegrationClient),\n        projectRoot,\n        projectConfigDiagnostics,\n        deferConfig,\n        onDiagnosticsChanged,\n      );\n    };\n  });\n\ncontainer\n  .bind<\n    interfaces.Factory<DBTCoreProjectIntegration>\n  >(\"Factory<DBTFusionCommandProjectIntegration>\")\n  .toFactory<\n    DBTFusionCommandProjectIntegration,\n    [string, DBTDiagnosticData[], DeferConfig, () => void]\n  >((context: interfaces.Context) => {\n    return (\n      projectRoot: string,\n      projectConfigDiagnostics: DBTDiagnosticData[],\n      deferConfig: DeferConfig,\n      onDiagnosticsChanged: () => void,\n    ) => {\n      const { container } = context;\n      return new DBTFusionCommandProjectIntegration(\n        container.get(DBTCommandExecutionInfrastructure),\n        container.get(DBTCommandFactory),\n        container.get(\"Factory<CLIDBTCommandExecutionStrategy>\"),\n        container.get(\"RuntimePythonEnvironment\"),\n        container.get(\"PythonEnvironmentProvider\"),\n        container.get(\"DBTTerminal\"),\n        projectRoot,\n        projectConfigDiagnostics,\n        deferConfig,\n        onDiagnosticsChanged,\n        container.get(DbtCloudVariantDetector),\n      );\n    };\n  });\n\ncontainer\n  .bind<\n    interfaces.Factory<DBTCloudProjectIntegration>\n  >(\"Factory<DBTCloudProjectIntegration>\")\n  .toFactory<\n    DBTCloudProjectIntegration,\n    [string, DBTDiagnosticData[], DeferConfig, () => void]\n  >((context: interfaces.Context) => {\n    return (\n      projectRoot: string,\n      projectConfigDiagnostics: DBTDiagnosticData[],\n      deferConfig: DeferConfig,\n      onDiagnosticsChanged: () => void,\n    ) => {\n      const { container } = context;\n      return new DBTCloudProjectIntegration(\n        container.get(DBTCommandExecutionInfrastructure),\n        container.get(DBTCommandFactory),\n        container.get(\"Factory<CLIDBTCommandExecutionStrategy>\"),\n        container.get(\"RuntimePythonEnvironment\"),\n        container.get(\"PythonEnvironmentProvider\"),\n        container.get(\"DBTTerminal\"),\n        projectRoot,\n        projectConfigDiagnostics,\n        deferConfig,\n        onDiagnosticsChanged,\n        container.get(DbtCloudVariantDetector),\n      );\n    };\n  });\n\ncontainer\n  .bind<\n    interfaces.Factory<DBTProjectIntegrationAdapter>\n  >(\"Factory<DBTProjectIntegrationAdapter>\")\n  .toFactory<\n    DBTProjectIntegrationAdapter,\n    [string, DeferConfig | undefined]\n  >((context: interfaces.Context) => {\n    return (projectRoot: string, deferConfig: DeferConfig | undefined) => {\n      const { container } = context;\n      return new DBTProjectIntegrationAdapter(\n        container.get(\"DBTConfiguration\"),\n        container.get(DBTCommandFactory),\n        container.get(\"Factory<DBTCoreProjectIntegration>\"),\n        container.get(\"Factory<DBTCloudProjectIntegration>\"),\n        container.get(\"Factory<DBTFusionCommandProjectIntegration>\"),\n        container.get(\"Factory<DBTCoreCommandProjectIntegration>\"),\n        projectRoot,\n        deferConfig,\n        container.get(ChildrenParentParser),\n        container.get(NodeParser),\n        container.get(MacroParser),\n        container.get(MetricParser),\n        container.get(GraphParser),\n        container.get(SourceParser),\n        container.get(TestParser),\n        container.get(ExposureParser),\n        container.get(FunctionParser),\n        container.get(DocParser),\n        container.get(\"DBTTerminal\"),\n        container.get(ModelDepthParser),\n      );\n    };\n  });\n\ncontainer\n  .bind<interfaces.Factory<DBTProject>>(\"Factory<DBTProject>\")\n  .toFactory<\n    DBTProject,\n    [Uri, any, EventEmitter<ManifestCacheChangedEvent>]\n  >((context: interfaces.Context) => {\n    return (\n      path: Uri,\n      projectConfig: any,\n      _onManifestChanged: EventEmitter<ManifestCacheChangedEvent>,\n    ) => {\n      const { container } = context;\n      return new DBTProject(\n        container.get(PythonEnvironment),\n        container.get(\"Factory<DBTProjectLog>\"),\n        container.get(DBTCommandFactory),\n        container.get(\"DBTTerminal\"),\n        container.get(SharedStateService),\n        container.get(TelemetryService),\n        container.get(DBTCommandExecutionInfrastructure),\n        container.get(\"Factory<DBTProjectIntegrationAdapter>\"),\n        container.get(AltimateRequest),\n        container.get(ValidationProvider),\n        container.get(AltimateAuthService),\n        container.get(RunHistoryService),\n        path,\n        projectConfig,\n        _onManifestChanged,\n      );\n    };\n  });\n\ncontainer\n  .bind<interfaces.Factory<DBTProjectLog>>(\"Factory<DBTProjectLog>\")\n  .toFactory<DBTProjectLog, [Event<ProjectConfigChangedEvent>]>(() => {\n    return (onProjectConfigChanged: Event<ProjectConfigChangedEvent>) => {\n      return new DBTProjectLog(onProjectConfigChanged);\n    };\n  });\n\n// Bind services\ncontainer\n  .bind(AltimateAuthService)\n  .toDynamicValue((context) => {\n    return new AltimateAuthService(context.container.get(\"DBTConfiguration\"));\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(ConversationService)\n  .toDynamicValue((context) => {\n    return new ConversationService(\n      context.container.get(QueryManifestService),\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(AltimateRequest),\n      context.container.get(AltimateAuthService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(DbtLineageService)\n  .toDynamicValue((context) => {\n    return new DbtLineageService(\n      context.container.get(AltimateRequest),\n      context.container.get(TelemetryService),\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(QueryManifestService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(DbtTestService)\n  .toDynamicValue((context) => {\n    return new DbtTestService(\n      context.container.get(DocGenService),\n      context.container.get(StreamingService),\n      context.container.get(AltimateRequest),\n      context.container.get(QueryManifestService),\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(TelemetryService),\n      context.container.get(AltimateAuthService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(DiagnosticsOutputChannel)\n  .toDynamicValue(() => {\n    return new DiagnosticsOutputChannel();\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(DocGenService)\n  .toDynamicValue((context) => {\n    return new DocGenService(\n      context.container.get(AltimateRequest),\n      context.container.get(DBTProjectContainer),\n      context.container.get(TelemetryService),\n      context.container.get(QueryManifestService),\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(AltimateAuthService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(FileService)\n  .toDynamicValue(() => {\n    return new FileService();\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(QueryAnalysisService)\n  .toDynamicValue((context) => {\n    return new QueryAnalysisService(\n      context.container.get(DocGenService),\n      context.container.get(StreamingService),\n      context.container.get(AltimateRequest),\n      context.container.get(QueryManifestService),\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(FileService),\n      context.container.get(AltimateAuthService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(QueryManifestService)\n  .toDynamicValue((context) => {\n    return new QueryManifestService(\n      context.container.get(DBTProjectContainer),\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(SharedStateService),\n      context.container.get(ProjectQuickPick),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(SharedStateService)\n  .toDynamicValue(() => {\n    return new SharedStateService();\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(AltimateCodeChatService)\n  .toDynamicValue(() => {\n    return new AltimateCodeChatService();\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(RunHistoryService)\n  .toDynamicValue(() => {\n    return new RunHistoryService();\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(RunHistoryTreeviewProvider)\n  .toDynamicValue((context) => {\n    return new RunHistoryTreeviewProvider(\n      context.container.get(RunHistoryService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(CteProfilerService)\n  .toDynamicValue((context) => {\n    return new CteProfilerService(\n      context.container.get(DBTProjectContainer),\n      context.container.get(\"DBTTerminal\"),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(CteProfilerDecorationProvider)\n  .toDynamicValue((context) => {\n    return new CteProfilerDecorationProvider(\n      context.container.get(CteProfilerService),\n      context.container.get(\"DBTTerminal\"),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(ProjectQuickPick)\n  .toDynamicValue(() => {\n    return new ProjectQuickPick();\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(StreamingService)\n  .toDynamicValue((context) => {\n    return new StreamingService(\n      context.container.get(AltimateRequest),\n      context.container.get(SharedStateService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(UsersService)\n  .toDynamicValue((context) => {\n    return new UsersService(\n      context.container.get(DBTProjectContainer),\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(AltimateRequest),\n      context.container.get(AltimateAuthService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(TelemetryService)\n  .toDynamicValue(() => {\n    return new TelemetryService();\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(ValidationProvider)\n  .toDynamicValue((context) => {\n    return new ValidationProvider(\n      context.container.get(AltimateRequest),\n      context.container.get(AltimateAuthService),\n    );\n  })\n  .inSingletonScope();\n\n// Bind manifest components\ncontainer\n  .bind(PythonEnvironment)\n  .toDynamicValue((context) => {\n    return new PythonEnvironment(context.container.get(\"DBTTerminal\"));\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(DBTProjectContainer)\n  .toDynamicValue((context) => {\n    return new DBTProjectContainer(\n      context.container.get(DBTClient),\n      context.container.get(\"Factory<DBTWorkspaceFolder>\"),\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(AltimateDatapilot),\n      context.container.get(AltimateRequest),\n    );\n  })\n  .inSingletonScope();\n\n// Bind MCP server tools\ncontainer\n  .bind(DbtPowerUserMcpServerTools)\n  .toDynamicValue((context) => {\n    return new DbtPowerUserMcpServerTools(\n      context.container.get(DBTProjectContainer),\n      context.container.get(\"DBTTerminal\"),\n    );\n  })\n  .inSingletonScope();\n\n// Bind MCP server\ncontainer\n  .bind(DbtPowerUserMcpServer)\n  .toDynamicValue((context) => {\n    return new DbtPowerUserMcpServer(\n      context.container.get(DbtPowerUserMcpServerTools),\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(AltimateRequest),\n      context.container.get(SharedStateService),\n      context.container.get(AltimateAuthService),\n    );\n  })\n  .inSingletonScope();\n\n// Bind dbt client\ncontainer\n  .bind(DBTClient)\n  .toDynamicValue((context) => {\n    return new DBTClient(\n      context.container.get(PythonEnvironment),\n      context.container.get(\"Factory<DBTDetection>\"),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(AltimateDatapilot)\n  .toDynamicValue((context) => {\n    return new AltimateDatapilot(\n      context.container.get(PythonEnvironment),\n      context.container.get(CommandProcessExecutionFactory),\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(\"DBTConfiguration\"),\n    );\n  })\n  .inSingletonScope();\n\n// Bind autocompletion providers\ncontainer\n  .bind(AutocompletionProviders)\n  .toDynamicValue((context) => {\n    return new AutocompletionProviders(\n      context.container.get(MacroAutocompletionProvider),\n      context.container.get(ModelAutocompletionProvider),\n      context.container.get(SourceAutocompletionProvider),\n      context.container.get(DocAutocompletionProvider),\n      context.container.get(UserCompletionProvider),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(DocAutocompletionProvider)\n  .toDynamicValue((context) => {\n    return new DocAutocompletionProvider(\n      context.container.get(DBTProjectContainer),\n      context.container.get(TelemetryService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(MacroAutocompletionProvider)\n  .toDynamicValue((context) => {\n    return new MacroAutocompletionProvider(\n      context.container.get(DBTProjectContainer),\n      context.container.get(TelemetryService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(ModelAutocompletionProvider)\n  .toDynamicValue((context) => {\n    return new ModelAutocompletionProvider(\n      context.container.get(DBTProjectContainer),\n      context.container.get(TelemetryService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(SourceAutocompletionProvider)\n  .toDynamicValue((context) => {\n    return new SourceAutocompletionProvider(\n      context.container.get(DBTProjectContainer),\n      context.container.get(TelemetryService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(UserCompletionProvider)\n  .toDynamicValue((context) => {\n    return new UserCompletionProvider(context.container.get(UsersService));\n  })\n  .inSingletonScope();\n\n// Bind code lens providers\ncontainer\n  .bind(CodeLensProviders)\n  .toDynamicValue((context) => {\n    return new CodeLensProviders(\n      context.container.get(DBTProjectContainer),\n      context.container.get(SourceModelCreationCodeLensProvider),\n      context.container.get(VirtualSqlCodeLensProvider),\n      context.container.get(CteCodeLensProvider),\n      context.container.get(SqlActionsCodeLensProvider),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(CteCodeLensProvider)\n  .toDynamicValue((context) => {\n    return new CteCodeLensProvider(context.container.get(\"DBTTerminal\"));\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(SqlActionsCodeLensProvider)\n  .toDynamicValue((context) => {\n    return new SqlActionsCodeLensProvider(\n      context.container.get(AltimateCodeChatService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(SourceModelCreationCodeLensProvider)\n  .toDynamicValue(() => {\n    return new SourceModelCreationCodeLensProvider();\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(VirtualSqlCodeLensProvider)\n  .toDynamicValue((context) => {\n    return new VirtualSqlCodeLensProvider(\n      context.container.get(DBTProjectContainer),\n      context.container.get(QueryManifestService),\n      context.container.get(\"NotebookService\"),\n    );\n  })\n  .inSingletonScope();\n\n// Bind definition providers\ncontainer\n  .bind(DefinitionProviders)\n  .toDynamicValue((context) => {\n    return new DefinitionProviders(\n      context.container.get(ModelDefinitionProvider),\n      context.container.get(MacroDefinitionProvider),\n      context.container.get(SourceDefinitionProvider),\n      context.container.get(DocDefinitionProvider),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(DocDefinitionProvider)\n  .toDynamicValue((context) => {\n    return new DocDefinitionProvider(\n      context.container.get(DBTProjectContainer),\n      context.container.get(TelemetryService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(MacroDefinitionProvider)\n  .toDynamicValue((context) => {\n    return new MacroDefinitionProvider(\n      context.container.get(DBTProjectContainer),\n      context.container.get(TelemetryService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(ModelDefinitionProvider)\n  .toDynamicValue((context) => {\n    return new ModelDefinitionProvider(\n      context.container.get(DBTProjectContainer),\n      context.container.get(TelemetryService),\n      context.container.get(\"DBTTerminal\"),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(SourceDefinitionProvider)\n  .toDynamicValue((context) => {\n    return new SourceDefinitionProvider(\n      context.container.get(DBTProjectContainer),\n      context.container.get(TelemetryService),\n    );\n  })\n  .inSingletonScope();\n\n// Bind hover providers\ncontainer\n  .bind(HoverProviders)\n  .toDynamicValue((context) => {\n    return new HoverProviders(\n      context.container.get(ModelHoverProvider),\n      context.container.get(SourceHoverProvider),\n      context.container.get(MacroHoverProvider),\n      context.container.get(DepthDecorationProvider),\n      context.container.get(YamlModelHoverProvider),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(DepthDecorationProvider)\n  .toDynamicValue((context) => {\n    return new DepthDecorationProvider(\n      context.container.get(DBTProjectContainer),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(MacroHoverProvider)\n  .toDynamicValue((context) => {\n    return new MacroHoverProvider(\n      context.container.get(TelemetryService),\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(QueryManifestService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(ModelHoverProvider)\n  .toDynamicValue((context) => {\n    return new ModelHoverProvider(\n      context.container.get(DBTProjectContainer),\n      context.container.get(TelemetryService),\n      context.container.get(\"DBTTerminal\"),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(SourceHoverProvider)\n  .toDynamicValue((context) => {\n    return new SourceHoverProvider(\n      context.container.get(DBTProjectContainer),\n      context.container.get(TelemetryService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(YamlModelHoverProvider)\n  .toDynamicValue((context) => {\n    return new YamlModelHoverProvider(\n      context.container.get(DBTProjectContainer),\n      context.container.get(TelemetryService),\n    );\n  })\n  .inSingletonScope();\n\n// Bind notebook-related services\n\ncontainer\n  .bind<any>(\"NotebookFileSystemProvider\")\n  .toDynamicValue((context) => {\n    return new LibNamespace.NotebookFileSystemProvider(\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(AltimateRequest),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind<interfaces.Factory<NotebookKernelClient>>(\"Factory<NotebookClient>\")\n  .toFactory<NotebookKernelClient, [string]>((context: interfaces.Context) => {\n    return (path: string) => {\n      const { container } = context;\n      return new LibNamespace.NotebookKernelClient(\n        path,\n        container.get(DBTCommandExecutionInfrastructure),\n        container.get(\"NotebookDependencies\"),\n        container.get(\"DBTTerminal\"),\n      );\n    };\n  });\ncontainer\n  .bind<any>(\"NotebookDependencies\")\n  .toDynamicValue((context) => {\n    return new LibNamespace.NotebookDependencies(\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(TelemetryService),\n      context.container.get(CommandProcessExecutionFactory),\n      context.container.get(PythonEnvironment),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind<any>(\"ClientMapper\")\n  .toDynamicValue((context) => {\n    return new LibNamespace.ClientMapper(\n      context.container.get(DBTCommandExecutionInfrastructure),\n      context.container.get(\"NotebookDependencies\"),\n      context.container.get(\"DBTTerminal\"),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind<any>(\"DatapilotNotebookSerializer\")\n  .toDynamicValue(() => {\n    return new LibNamespace.DatapilotNotebookSerializer();\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind<any>(\"DatapilotNotebookController\")\n  .toDynamicValue((context) => {\n    return new LibNamespace.DatapilotNotebookController(\n      context.container.get(\"ClientMapper\"),\n      context.container.get(QueryManifestService),\n      context.container.get(TelemetryService),\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(\"NotebookDependencies\"),\n      context.container.get(AltimateRequest),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind<any>(\"NotebookService\")\n  .toDynamicValue((context) => {\n    return new LibNamespace.NotebookService(\n      context.container.get(\"DatapilotNotebookController\"),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind<any>(\"NotebookProviders\")\n  .toDynamicValue((context) => {\n    return new LibNamespace.NotebookProviders(\n      context.container.get(\"DatapilotNotebookSerializer\"),\n      context.container.get(\"DatapilotNotebookController\"),\n      context.container.get(\"NotebookFileSystemProvider\"),\n      context.container.get(\"DBTTerminal\"),\n    );\n  })\n  .inSingletonScope();\n\n// Bind test components\ncontainer\n  .bind(MissingSchemaTest)\n  .toDynamicValue(() => {\n    return new MissingSchemaTest();\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(UndocumentedModelColumnTest)\n  .toDynamicValue(() => {\n    return new UndocumentedModelColumnTest();\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(UnmaterializedModelTest)\n  .toDynamicValue(() => {\n    return new UnmaterializedModelTest();\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(StaleModelColumnTest)\n  .toDynamicValue(() => {\n    return new StaleModelColumnTest();\n  })\n  .inSingletonScope();\n\n// Bind additional webview components\ncontainer\n  .bind(DbtDocsView)\n  .toDynamicValue((context) => {\n    return new DbtDocsView(\n      context.container.get(DBTProjectContainer),\n      context.container.get(AltimateRequest),\n      context.container.get(TelemetryService),\n      context.container.get(SharedStateService),\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(QueryManifestService),\n      context.container.get(UsersService),\n      context.container.get(AltimateAuthService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(SqlPreviewContentProvider)\n  .toDynamicValue((context) => {\n    return new SqlPreviewContentProvider(\n      context.container.get(DBTProjectContainer),\n      context.container.get(TelemetryService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(DbtDocumentFormattingEditProvider)\n  .toDynamicValue((context) => {\n    return new DbtDocumentFormattingEditProvider(\n      context.container.get(CommandProcessExecutionFactory),\n      context.container.get(TelemetryService),\n      context.container.get(PythonEnvironment),\n    );\n  })\n  .inSingletonScope();\n\n// Bind status bar components\ncontainer\n  .bind(VersionStatusBar)\n  .toDynamicValue((context) => {\n    return new VersionStatusBar(context.container.get(DBTProjectContainer));\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(DeferToProductionStatusBar)\n  .toDynamicValue((context) => {\n    return new DeferToProductionStatusBar(\n      context.container.get(DBTProjectContainer),\n      context.container.get(\"DBTTerminal\"),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(TargetStatusBar)\n  .toDynamicValue((context) => {\n    return new TargetStatusBar(\n      context.container.get(DBTProjectContainer),\n      context.container.get(\"DBTTerminal\"),\n    );\n  })\n  .inSingletonScope();\n\n// Bind quick pick components\ncontainer\n  .bind(DbtPowerUserControlCenterAction)\n  .toDynamicValue(() => {\n    return new DbtPowerUserControlCenterAction();\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(DbtSQLAction)\n  .toDynamicValue((context) => {\n    return new DbtSQLAction(context.container.get(DBTProjectContainer));\n  })\n  .inSingletonScope();\n\n// Bind individual command components that are required by VSCodeCommands\ncontainer\n  .bind(RunModel)\n  .toDynamicValue((context) => {\n    return new RunModel(context.container.get(DBTProjectContainer));\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(RunTest)\n  .toDynamicValue((context) => {\n    return new RunTest(\n      context.container.get(DBTProjectContainer),\n      context.container.get(QueryManifestService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(SqlToModel)\n  .toDynamicValue((context) => {\n    return new SqlToModel(\n      context.container.get(DBTProjectContainer),\n      context.container.get(TelemetryService),\n      context.container.get(AltimateRequest),\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(AltimateAuthService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(ValidateSql)\n  .toDynamicValue((context) => {\n    return new ValidateSql(\n      context.container.get(DBTProjectContainer),\n      context.container.get(TelemetryService),\n      context.container.get(AltimateRequest),\n      context.container.get(\"DBTTerminal\"),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(AltimateScan)\n  .toDynamicValue((context) => {\n    return new AltimateScan(\n      context.container.get(DBTProjectContainer),\n      context.container.get(TelemetryService),\n      context.container.get(AltimateRequest),\n      context.container.get(MissingSchemaTest),\n      context.container.get(UndocumentedModelColumnTest),\n      context.container.get(UnmaterializedModelTest),\n      context.container.get(StaleModelColumnTest),\n      context.container.get(\"DBTTerminal\"),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(WalkthroughCommands)\n  .toDynamicValue((context) => {\n    return new WalkthroughCommands(\n      context.container.get(DBTProjectContainer),\n      context.container.get(TelemetryService),\n      context.container.get(CommandProcessExecutionFactory),\n      context.container.get(PythonEnvironment),\n      context.container.get(\"DBTTerminal\"),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(BigQueryCostEstimate)\n  .toDynamicValue((context) => {\n    return new BigQueryCostEstimate(\n      context.container.get(DBTProjectContainer),\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(TelemetryService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(ConversationProvider)\n  .toDynamicValue((context) => {\n    return new ConversationProvider(\n      context.container.get(ConversationService),\n      context.container.get(UsersService),\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(SharedStateService),\n      context.container.get(QueryManifestService),\n      context.container.get(TelemetryService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(SQLLineagePanel)\n  .toDynamicValue((context) => {\n    return new SQLLineagePanel(\n      context.container.get(DBTProjectContainer),\n      context.container.get(AltimateRequest),\n      context.container.get(TelemetryService),\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(QueryManifestService),\n      context.container.get(SharedStateService),\n      context.container.get(UsersService),\n      context.container.get(AltimateAuthService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(VSCodeCommands)\n  .toDynamicValue((context) => {\n    return new VSCodeCommands(\n      context.container.get(DBTProjectContainer),\n      context.container.get(RunModel),\n      context.container.get(RunTest),\n      context.container.get(SqlToModel),\n      context.container.get(ValidateSql),\n      context.container.get(AltimateScan),\n      context.container.get(WalkthroughCommands),\n      context.container.get(BigQueryCostEstimate),\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(DiagnosticsOutputChannel),\n      context.container.get(SharedStateService),\n      context.container.get(ConversationProvider),\n      context.container.get(PythonEnvironment),\n      context.container.get(DBTClient),\n      context.container.get(SQLLineagePanel),\n      context.container.get(QueryManifestService),\n      context.container.get(AltimateRequest),\n      context.container.get(\"DatapilotNotebookController\"),\n      context.container.get(RunHistoryService),\n      context.container.get(AltimateCodeChatService),\n      context.container.get(CteProfilerService),\n      context.container.get(CteProfilerDecorationProvider),\n      context.container.get(CteCodeLensProvider),\n      context.container.get(TelemetryService),\n    );\n  })\n  .inSingletonScope();\n\n// Bind webview panel components\ncontainer\n  .bind(QueryResultPanel)\n  .toDynamicValue((context) => {\n    return new QueryResultPanel(\n      context.container.get(DBTProjectContainer),\n      context.container.get(TelemetryService),\n      context.container.get(AltimateRequest),\n      context.container.get(SharedStateService),\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(QueryManifestService),\n      context.container.get(UsersService),\n      context.container.get(AltimateAuthService),\n      context.container.get(AltimateCodeChatService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(DocsEditViewPanel)\n  .toDynamicValue((context) => {\n    return new DocsEditViewPanel(\n      context.container.get(DBTProjectContainer),\n      context.container.get(AltimateRequest),\n      context.container.get(TelemetryService),\n      context.container.get(NewDocsGenPanel),\n      context.container.get(DocGenService),\n      context.container.get(DbtTestService),\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(DbtLineageService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(LineagePanel)\n  .toDynamicValue((context) => {\n    return new LineagePanel(\n      context.container.get(NewLineagePanel),\n      context.container.get(DBTProjectContainer),\n      context.container.get(TelemetryService),\n      context.container.get(\"DBTTerminal\"),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(DataPilotPanel)\n  .toDynamicValue((context) => {\n    return new DataPilotPanel(\n      context.container.get(DBTProjectContainer),\n      context.container.get(TelemetryService),\n      context.container.get(AltimateRequest),\n      context.container.get(DocGenService),\n      context.container.get(SharedStateService),\n      context.container.get(QueryAnalysisService),\n      context.container.get(QueryManifestService),\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(DbtTestService),\n      context.container.get(FileService),\n      context.container.get(UsersService),\n      context.container.get(AltimateAuthService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(InsightsPanel)\n  .toDynamicValue((context) => {\n    return new InsightsPanel(\n      context.container.get(DBTProjectContainer),\n      context.container.get(AltimateRequest),\n      context.container.get(DbtIntegrationClient),\n      context.container.get(TelemetryService),\n      context.container.get(SharedStateService),\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(QueryManifestService),\n      context.container.get(ValidationProvider),\n      context.container.get(UsersService),\n      context.container.get(\"NotebookFileSystemProvider\"),\n      context.container.get(AltimateAuthService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(NewDocsGenPanel)\n  .toDynamicValue((context) => {\n    return new NewDocsGenPanel(\n      context.container.get(DBTProjectContainer),\n      context.container.get(AltimateRequest),\n      context.container.get(TelemetryService),\n      context.container.get(DocGenService),\n      context.container.get(SharedStateService),\n      context.container.get(QueryManifestService),\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(DbtTestService),\n      context.container.get(UsersService),\n      context.container.get(DbtDocsView),\n      context.container.get(ConversationProvider),\n      context.container.get(ConversationService),\n      context.container.get(AltimateAuthService),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(NewLineagePanel)\n  .toDynamicValue((context) => {\n    return new NewLineagePanel(\n      context.container.get(DBTProjectContainer),\n      context.container.get(AltimateRequest),\n      context.container.get(TelemetryService),\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(DbtLineageService),\n      context.container.get(SharedStateService),\n      context.container.get(QueryManifestService),\n      context.container.get(UsersService),\n      context.container.get(AltimateAuthService),\n    );\n  })\n  .inSingletonScope();\n\n// Bind WebviewViewProviders\ncontainer\n  .bind(WebviewViewProviders)\n  .toDynamicValue((context) => {\n    return new WebviewViewProviders(\n      context.container.get(QueryResultPanel),\n      context.container.get(DocsEditViewPanel),\n      context.container.get(LineagePanel),\n      context.container.get(DataPilotPanel),\n      context.container.get(InsightsPanel),\n    );\n  })\n  .inSingletonScope();\n\n// Bind treeview components\ncontainer\n  .bind(ChildrenModelTreeview)\n  .toDynamicValue((context) => {\n    return new ChildrenModelTreeview(\n      context.container.get(DBTProjectContainer),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(ParentModelTreeview)\n  .toDynamicValue((context) => {\n    return new ParentModelTreeview(context.container.get(DBTProjectContainer));\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(ModelTestTreeview)\n  .toDynamicValue((context) => {\n    return new ModelTestTreeview(context.container.get(DBTProjectContainer));\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(DocumentationTreeview)\n  .toDynamicValue((context) => {\n    return new DocumentationTreeview(\n      context.container.get(DBTProjectContainer),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(IconActionsTreeview)\n  .toDynamicValue(() => {\n    return new IconActionsTreeview();\n  })\n  .inSingletonScope();\n\n// Bind TreeviewProviders\ncontainer\n  .bind(TreeviewProviders)\n  .toDynamicValue((context) => {\n    return new TreeviewProviders(\n      context.container.get(ChildrenModelTreeview),\n      context.container.get(ParentModelTreeview),\n      context.container.get(ModelTestTreeview),\n      context.container.get(DocumentationTreeview),\n      context.container.get(IconActionsTreeview),\n      context.container.get(RunHistoryTreeviewProvider),\n    );\n  })\n  .inSingletonScope();\n\n// Bind ContentProviders\ncontainer\n  .bind(ContentProviders)\n  .toDynamicValue((context) => {\n    return new ContentProviders(\n      context.container.get(SqlPreviewContentProvider),\n    );\n  })\n  .inSingletonScope();\n\n// Bind DocumentFormattingEditProviders\ncontainer\n  .bind(DocumentFormattingEditProviders)\n  .toDynamicValue((context) => {\n    return new DocumentFormattingEditProviders(\n      context.container.get(DbtDocumentFormattingEditProvider),\n    );\n  })\n  .inSingletonScope();\n\n// Bind StatusBars\ncontainer\n  .bind(StatusBars)\n  .toDynamicValue((context) => {\n    return new StatusBars(\n      context.container.get(VersionStatusBar),\n      context.container.get(DeferToProductionStatusBar),\n      context.container.get(TargetStatusBar),\n    );\n  })\n  .inSingletonScope();\n\ncontainer\n  .bind(OnboardingPanel)\n  .toDynamicValue((context) => {\n    return new OnboardingPanel(\n      context.container.get(DBTProjectContainer),\n      context.container.get(AltimateRequest),\n      context.container.get(TelemetryService),\n      context.container.get(SharedStateService),\n      context.container.get(\"DBTTerminal\"),\n      context.container.get(QueryManifestService),\n      context.container.get(UsersService),\n      context.container.get(WalkthroughCommands),\n      context.container.get(AltimateAuthService),\n    );\n  })\n  .inSingletonScope();\n\n// Bind DbtPowerUserActionsCenter\ncontainer\n  .bind(DbtPowerUserActionsCenter)\n  .toDynamicValue((context) => {\n    return new DbtPowerUserActionsCenter(\n      context.container.get(DbtPowerUserControlCenterAction),\n      context.container.get(ProjectQuickPick),\n      context.container.get(DBTProjectContainer),\n      context.container.get(DbtSQLAction),\n      context.container.get(SharedStateService),\n      context.container.get(OnboardingPanel),\n    );\n  })\n  .inSingletonScope();\n\n// Bind CommentProviders\ncontainer\n  .bind(CommentProviders)\n  .toDynamicValue((context) => {\n    return new CommentProviders(context.container.get(ConversationProvider));\n  })\n  .inSingletonScope();\n\n// Finally, bind the main DBTPowerUserExtension\ncontainer\n  .bind(DBTPowerUserExtension)\n  .toDynamicValue((context) => {\n    return new DBTPowerUserExtension(\n      context.container.get(DBTProjectContainer),\n      context.container.get(WebviewViewProviders),\n      context.container.get(AutocompletionProviders),\n      context.container.get(DefinitionProviders),\n      context.container.get(VSCodeCommands),\n      context.container.get(TreeviewProviders),\n      context.container.get(ContentProviders),\n      context.container.get(CodeLensProviders),\n      context.container.get(DocumentFormattingEditProviders),\n      context.container.get(StatusBars),\n      context.container.get(DbtPowerUserActionsCenter),\n      context.container.get(TelemetryService),\n      context.container.get(HoverProviders),\n      context.container.get(ValidationProvider),\n      context.container.get(CommentProviders),\n      context.container.get(\"NotebookProviders\"),\n      context.container.get(DbtPowerUserMcpServer),\n    );\n  })\n  .inSingletonScope();\n"
  },
  {
    "path": "src/lib/index.d.ts",
    "content": "import {\n  AltimateRequest,\n  CommandProcessExecutionFactory,\n  DBTCommandExecutionInfrastructure,\n  DBTProject,\n  DBTTerminal,\n  PythonEnvironment,\n  QueryExecutionResult,\n  QueryManifestService,\n  TelemetryService,\n} from \"@extension\";\nimport { KernelConnection } from \"@jupyterlab/services\";\nimport * as vscode from \"vscode\";\nimport {\n  CancellationToken,\n  Disposable,\n  Event,\n  FileChangeEvent,\n  FileStat,\n  FileSystemProvider,\n  FileType,\n  NotebookCell,\n  NotebookCellKind,\n  NotebookCellOutput,\n  NotebookData,\n  NotebookSerializer,\n  Uri,\n} from \"vscode\";\n\ndeclare class DatapilotNotebookSerializer\n  implements NotebookSerializer, Disposable\n{\n  dispose(): void;\n  deserializeNotebook(\n    content: Uint8Array,\n    _token: CancellationToken,\n  ): Promise<NotebookData>;\n  serializeNotebook(\n    data: NotebookData,\n    _token: CancellationToken,\n  ): Promise<Uint8Array>;\n}\n\ninterface NotebookItem {\n  id: number;\n  name: string;\n  data: NotebookSchema;\n  description: string;\n  created_on: string;\n  updated_on: string;\n  tags: {\n    id: number;\n    tag: string;\n  }[];\n  privacy: boolean;\n}\ninterface NotebookSchema {\n  cells: NotebookCellSchema[];\n  metadata?: Record<string, unknown>;\n}\ninterface NotebookCellSchema {\n  source: string[];\n  cell_type: NotebookCellKind;\n  languageId: string;\n  metadata?: Record<string, unknown>;\n  outputs?: NotebookCellOutput[];\n}\ninterface PreconfiguredNotebookItem {\n  name: string;\n  description: string;\n  created_at: string;\n  updated_at: string;\n  id: string;\n  tags: string[];\n  data: NotebookSchema;\n}\ninterface NotebookCellEvent {\n  cellId: string;\n  notebook: string;\n  result?: Record<string, unknown>;\n  event: \"add\" | \"update\" | \"delete\";\n  fragment?: string;\n  languageId: string;\n}\ninterface OpenNotebookRequest {\n  notebookId?: string;\n  template?: string;\n  context?: Record<string, unknown>;\n  notebookSchema?: NotebookSchema;\n}\ninterface NotebookDependency {\n  type: \"dbt\" | \"python\";\n  package: string;\n  name?: string;\n  version?: string;\n}\n\ndeclare class NotebookDependencies {\n  private readonly dbtTerminal;\n  private readonly telemetry;\n  private commandProcessExecutionFactory;\n  private pythonEnvironment;\n  constructor(\n    dbtTerminal: DBTTerminal,\n    telemetry: TelemetryService,\n    commandProcessExecutionFactory: CommandProcessExecutionFactory,\n    pythonEnvironment: PythonEnvironment,\n  );\n  private checkPythonDependencies;\n  private checkDbtDependencies;\n  private installMissingPythonPackages;\n  private installMissingDbtPackages;\n  verifyAndInstallDependenciesIfNeeded(\n    dependencies: NotebookDependency[],\n    project: DBTProject,\n  ): Promise<void>;\n  getDependenciesVersion(): Promise<Record<string, string>>;\n  validateAndInstallNotebookDependencies(): Promise<boolean | undefined>;\n  private notebookDependenciesAreInstalled;\n}\n\ninterface ConnectionSettings {\n  control_port: number;\n  hb_port: number;\n  iopub_port: number;\n  ip: string;\n  key: string;\n  kernel_name: string;\n  shell_port: number;\n  signature_scheme: string;\n  stdin_port: number;\n  transport: string;\n}\ninterface RawKernelType {\n  realKernel: KernelConnection;\n  socket: WebSocket;\n  kernelProcess: {\n    connection: ConnectionSettings;\n    pid: number;\n  };\n}\n\ninterface WidgetPayload {\n  [key: string]: unknown;\n}\ninterface IPyWidgetMessage {\n  type: string;\n  payload: WidgetPayload;\n}\ninterface NotebookContext {\n  [key: string]: unknown;\n}\ndeclare class NotebookKernelClient implements Disposable {\n  private executionInfrastructure;\n  private notebookDependencies;\n  private dbtTerminal;\n  get postMessage(): Event<IPyWidgetMessage>;\n  private _postMessageEmitter;\n  private disposables;\n  private lastUsedStreamOutput?;\n  private static modelIdsOwnedByCells;\n  private python;\n  private kernel;\n  private isInitializing;\n  private readonly ownedCommIds;\n  private readonly commIdsMappedToWidgetOutputModels;\n  private readonly ownedRequestMsgIds;\n  private commIdsMappedToParentWidgetModel;\n  private streamsReAttachedToExecutingCell;\n  private registerdCommTargets;\n  private outputsAreSpecificToAWidget;\n  private versions?;\n  constructor(\n    notebookPath: string,\n    executionInfrastructure: DBTCommandExecutionInfrastructure,\n    notebookDependencies: NotebookDependencies,\n    dbtTerminal: DBTTerminal,\n  );\n  isInitialized(): Promise<boolean>;\n  dispose(): Promise<void>;\n  get jupyterPackagesVersions(): Record<string, string> | undefined;\n  private getDependenciesVersion;\n  getKernel(): Promise<RawKernelType | undefined>;\n  private initializeNotebookKernel;\n  onKernelSocketResponse(payload: { id: string }): void;\n  storeContext(context: NotebookContext): Promise<void>;\n  storeDataInKernel(cellId: string, data: unknown): Promise<boolean>;\n  registerCommTarget(payload: string): Promise<void>;\n  getPythonCodeByType(type: string, cellId: string): Promise<string>;\n  executePython(\n    code: string,\n    cell: NotebookCell,\n    onOutput: (output: NotebookCellOutput) => void,\n  ): Promise<NotebookCellOutput[] | undefined>;\n  private handleUpdateDisplayDataMessage;\n  private handleCommOpen;\n  private handleCommMsg;\n  private handleExecuteResult;\n  private addToCellData;\n  private canMimeTypeBeRenderedByWidgetManager;\n  private handleExecuteInput;\n  private handleStatusMessage;\n  private handleStreamMessage;\n  private handleDisplayData;\n  private handleClearOutput;\n  private handleError;\n}\n\ndeclare class ClientMapper {\n  private executionInfrastructure;\n  private notebookDependencies;\n  private dbtTerminal;\n  private clientMap;\n  constructor(\n    executionInfrastructure: DBTCommandExecutionInfrastructure,\n    notebookDependencies: NotebookDependencies,\n    dbtTerminal: DBTTerminal,\n  );\n  initializeNotebookClient(notebookUri: Uri): Promise<NotebookKernelClient>;\n  getNotebookClient(notebookUri: Uri): Promise<NotebookKernelClient>;\n}\n\ninterface ModelTestArgs {\n  model: string;\n  tests?: string[];\n}\ninterface DbtSourceYamlArgs {\n  source: string;\n  schema?: string;\n  database?: string;\n}\ninterface DbtModelArgs {\n  model: string;\n  schema?: string;\n  database?: string;\n  description?: string;\n}\ninterface ExposureArgs {\n  connection: string;\n  project?: string;\n}\ndeclare class DatapilotNotebookController implements Disposable {\n  private clientMapper;\n  private queryManifestService;\n  private telemetry;\n  private dbtTerminal;\n  private notebookDependencies;\n  private altimate;\n  private readonly id;\n  private readonly label;\n  private _onNotebookCellEvent;\n  readonly onNotebookCellChangeEvent: vscode.Event<NotebookCellEvent>;\n  private readonly disposables;\n  private associatedNotebooks;\n  private executionOrder;\n  private readonly controller;\n  constructor(\n    clientMapper: ClientMapper,\n    queryManifestService: QueryManifestService,\n    telemetry: TelemetryService,\n    dbtTerminal: DBTTerminal,\n    notebookDependencies: NotebookDependencies,\n    altimate: AltimateRequest,\n  );\n  private getNotebookByTemplate;\n  modelTestSuggestions(args: ModelTestArgs): Promise<void>;\n  generateDbtSourceYaml(args: DbtSourceYamlArgs): Promise<void>;\n  generateDbtDbtModelSql(args: DbtModelArgs): Promise<void>;\n  generateDbtDbtModelYaml(args: DbtModelArgs): Promise<void>;\n  generateDbtDbtModelCTE(args: DbtModelArgs): Promise<void>;\n  extractExposuresFromMetabase(args: ExposureArgs): Promise<void>;\n  extractExposuresFromTableau(args: ExposureArgs): Promise<void>;\n  private getFileName;\n  createNotebook(args: OpenNotebookRequest | undefined): Promise<void>;\n  private sendMessageToPreloadScript;\n  private getRandomString;\n  private genUniqueId;\n  private updateCellId;\n  private onNotebookClose;\n  private onDidChangeSelectedNotebooks;\n  private onNotebookOpen;\n  private waitForControllerAssociation;\n  private isControllerAssociatedWithNotebook;\n  dispose(): void;\n  private _executeAll;\n  private filterIPyWidgets;\n  private updateContextVariablesInKernel;\n  private _doExecution;\n}\n\ndeclare class NotebookFileSystemProvider implements FileSystemProvider {\n  private dbtTerminal;\n  private altimate;\n  private _emitter;\n  readonly onDidChangeFile: Event<FileChangeEvent[]>;\n  private notebookDataMap;\n  constructor(dbtTerminal: DBTTerminal, altimate: AltimateRequest);\n  watch(\n    _uri: Uri,\n    _options: {\n      recursive: boolean;\n      excludes: string[];\n    },\n  ): Disposable;\n  stat(_uri: Uri): FileStat;\n  readDirectory(_uri: Uri): [string, FileType][];\n  createDirectory(_uri: Uri): void;\n  private getNotebookData;\n  readFile(uri: Uri): Promise<Uint8Array>;\n  writeFile(\n    uri: Uri,\n    content: Uint8Array,\n    _options: {\n      create: boolean;\n      overwrite: boolean;\n    },\n  ): Promise<void>;\n  delete(\n    uri: Uri,\n    _options: {\n      recursive: boolean;\n    },\n  ): void;\n  rename(\n    oldUri: Uri,\n    newUri: Uri,\n    _options: {\n      overwrite: boolean;\n    },\n  ): void;\n  private getFileNameFromUri;\n  private customSave;\n  private saveNotebook;\n}\n\ndeclare class NotebookService implements Disposable {\n  private notebookKernel;\n  private disposables;\n  private cellByNotebookAutocompleteMap;\n  constructor(notebookKernel: DatapilotNotebookController);\n  dispose(): void;\n  getCellByNotebookAutocompleteMap(): Map<\n    string,\n    {\n      cellId: string;\n      fragment: string;\n      languageId: string;\n    }[]\n  >;\n  private onNotebookCellChanged;\n}\n\ndeclare const CustomNotebooks: {\n  notebooks: PreconfiguredNotebookItem[];\n};\n\ndeclare class NotebookProviders implements Disposable {\n  private notebookProvider;\n  private notebookController;\n  private notebookFileSystemProvider;\n  private dbtTerminal;\n  private disposables;\n  constructor(\n    notebookProvider: DatapilotNotebookSerializer,\n    notebookController: DatapilotNotebookController,\n    notebookFileSystemProvider: NotebookFileSystemProvider,\n    dbtTerminal: DBTTerminal,\n  );\n  private bindNotebookActions;\n  dispose(): void;\n}\n\ninterface DBColumn {\n  column: string;\n  dtype: string;\n}\ninterface ColumnConfig$1 {\n  name: string;\n  tests: string[];\n  description?: string;\n  [key: string]: string | string[] | undefined;\n}\ninterface Model {\n  name: string;\n  columns: ColumnConfig$1[];\n  tests?: Array<{\n    [key: string]: unknown;\n  }>;\n}\ninterface DbtConfig {\n  [key: string]: Model[];\n}\ntype QueryFn = (query: string) => Promise<QueryExecutionResult | undefined>;\n\ninterface ColumnConfig {\n  tests?: string[];\n  description?: string;\n  [key: string]: unknown;\n}\ninterface Props {\n  tableRelation: string;\n  sample?: boolean;\n  limit?: number;\n  resourceType?: string;\n  columnConfig?: Record<string, ColumnConfig>;\n  excludeTypes?: string[];\n  excludeCols?: string[];\n  tests?: (\n    | \"uniqueness\"\n    | \"accepted_values\"\n    | \"range\"\n    | \"string_length\"\n    | \"recency\"\n  )[];\n  uniquenessCompositeKeyLength?: number;\n  acceptedValuesMaxCardinality?: number;\n  rangeStddevs?: number;\n  stringLengthStddevs?: number;\n  recencyStddevs?: number;\n  dbtConfig?: DbtConfig;\n  returnObject?: boolean;\n  columnsInRelation: DBColumn[];\n  adapter: string;\n  queryFn: QueryFn;\n}\ndeclare const getTestSuggestions: ({\n  tableRelation,\n  sample,\n  limit,\n  resourceType,\n  columnConfig,\n  excludeTypes,\n  excludeCols,\n  tests,\n  uniquenessCompositeKeyLength,\n  acceptedValuesMaxCardinality,\n  rangeStddevs,\n  stringLengthStddevs,\n  recencyStddevs,\n  dbtConfig,\n  returnObject,\n  columnsInRelation,\n  adapter,\n  queryFn,\n}: Props) => Promise<DbtConfig | undefined>;\n\nexport {\n  ClientMapper,\n  CustomNotebooks,\n  DatapilotNotebookController,\n  DatapilotNotebookSerializer,\n  getTestSuggestions,\n  NotebookDependencies,\n  NotebookFileSystemProvider,\n  NotebookKernelClient,\n  NotebookProviders,\n  NotebookService,\n  type DbtConfig,\n  type IPyWidgetMessage,\n  type Model,\n  type NotebookCellEvent,\n  type NotebookCellSchema,\n  type NotebookDependency,\n  type NotebookItem,\n  type NotebookSchema,\n  type OpenNotebookRequest,\n  type PreconfiguredNotebookItem,\n};\n"
  },
  {
    "path": "src/lib/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, Symbol.toStringTag, { value: \"Module\" });\nconst u = require(\"vscode\"),\n  p = require(\"@extension\"),\n  ie = require(\"python-bridge\"),\n  pe = require(\"fs\"),\n  ne = require(\"@jupyterlab/services\");\nfunction L(o, e, t, n) {\n  var r = arguments.length,\n    s =\n      r < 3 ? e : n === null ? (n = Object.getOwnPropertyDescriptor(e, t)) : n,\n    a;\n  if (typeof Reflect == \"object\" && typeof Reflect.decorate == \"function\")\n    s = Reflect.decorate(o, e, t, n);\n  else\n    for (var i = o.length - 1; i >= 0; i--)\n      (a = o[i]) && (s = (r < 3 ? a(s) : r > 3 ? a(e, t, s) : a(e, t)) || s);\n  return r > 3 && s && Object.defineProperty(e, t, s), s;\n}\nfunction $(o, e) {\n  return function (t, n) {\n    e(t, n, o);\n  };\n}\nfunction me(o, e, t) {\n  return Object.defineProperty(o, \"name\", { configurable: !0, value: e });\n}\nfunction q(o, e) {\n  if (typeof Reflect == \"object\" && typeof Reflect.metadata == \"function\")\n    return Reflect.metadata(o, e);\n}\nconst he = (o) => (\"getCells\" in o ? o.getCells() : o.cells),\n  be = (o) =>\n    o instanceof u.NotebookCellData ? o.value : o.document.getText(),\n  ge = (o) =>\n    o instanceof u.NotebookCellData ? o.languageId : o.document.languageId,\n  Z = (o, e, t) => {\n    var r;\n    const n = [];\n    for (const s of he(o))\n      n.push({\n        cell_type: s.kind,\n        source: be(s).split(/\\r?\\n/g),\n        languageId: ge(s),\n        metadata: s.metadata,\n        outputs: t ? s.outputs : void 0,\n      });\n    return {\n      cells: n,\n      metadata: {\n        ...o.metadata,\n        name: e,\n        createdAt:\n          ((r = o.metadata) == null ? void 0 : r.createdAt) ||\n          new Date().toISOString(),\n        updatedAt: new Date().toISOString(),\n      },\n    };\n  },\n  x = () => Math.random().toString(36).substr(2, 9);\nfunction fe() {\n  const o = new Date(),\n    e = o.toLocaleDateString(\"en-GB\").replace(/\\//g, \"-\"),\n    t = o.toLocaleTimeString(\"en-GB\", { hour12: !1 }).replace(/:/g, \"-\");\n  return `${e}-${t}`;\n}\nclass le {\n  dispose() {\n    throw new Error(\"Method not implemented.\");\n  }\n  async deserializeNotebook(e, t) {\n    const n = new TextDecoder().decode(e);\n    let r;\n    try {\n      r = JSON.parse(n);\n    } catch {\n      r = { cells: [] };\n    }\n    const s = r.cells.map((i) => {\n        var c;\n        const l = new u.NotebookCellData(\n          i.cell_type,\n          (c = i.source) == null\n            ? void 0\n            : c.join(`\n`),\n          i.languageId,\n        );\n        return (l.metadata = i.metadata), (l.outputs = i.outputs), l;\n      }),\n      a = new u.NotebookData(s);\n    return (a.metadata = r.metadata), a;\n  }\n  async serializeNotebook(e, t) {\n    const n = Z(e);\n    return new TextEncoder().encode(JSON.stringify(n));\n  }\n}\nvar I;\n(function (o) {\n  (o.error = \"application/vnd.code.notebook.error\"),\n    (o.stderr = \"application/vnd.code.notebook.stderr\"),\n    (o.stdout = \"application/vnd.code.notebook.stdout\");\n})(I || (I = {}));\nconst ye = [\"text/plain\", \"text/markdown\", I.stderr, I.stdout],\n  oe = [\n    \"application/vnd.*\",\n    \"application/vdom.*\",\n    \"application/geo+json\",\n    \"application/x-nteract-model-debug+json\",\n    \"text/html\",\n    \"application/javascript\",\n    \"image/gif\",\n    \"text/latex\",\n    \"text/markdown\",\n    \"image/png\",\n    \"image/svg+xml\",\n    \"image/jpeg\",\n    \"application/json\",\n    \"text/plain\",\n  ],\n  P = new Map();\nP.set(\"display_data\", Y);\nP.set(\"error\", Se);\nP.set(\"execute_result\", Y);\nP.set(\"stream\", Ce);\nP.set(\"update_display_data\", Y);\nfunction J(o) {\n  const e = P.get(o.output_type);\n  let t;\n  return (\n    e\n      ? (t = e(o))\n      : (console.warn(\n          `Unable to translate cell from ${o.output_type} to NotebookCellData for VS Code.`,\n        ),\n        (t = Y(o))),\n    t\n  );\n}\nfunction te(o) {\n  const e = { outputType: o.output_type };\n  switch ((o.transient && (e.transient = o.transient), o.output_type)) {\n    case \"display_data\":\n    case \"execute_result\":\n    case \"update_display_data\": {\n      (e.executionCount = o.execution_count),\n        (e.metadata = o.metadata ? JSON.parse(JSON.stringify(o.metadata)) : {});\n      break;\n    }\n  }\n  return e;\n}\nfunction Y(o) {\n  const e = te(o);\n  (\"image/svg+xml\" in o.data || \"image/png\" in o.data) &&\n    (e.__displayOpenPlotIcon = !0);\n  const t = [];\n  if (o.data) for (const n in o.data) t.push(ke(n, o.data[n]));\n  return new u.NotebookCellOutput(we(t), e);\n}\nfunction we(o) {\n  return o.sort((e, t) => {\n    const n = (a, i) => (\n      a.endsWith(\".*\") && (a = a.substr(0, a.indexOf(\".*\"))), i.startsWith(a)\n    );\n    let r = oe.findIndex((a) => n(a, e.mime)),\n      s = oe.findIndex((a) => n(a, t.mime));\n    return (\n      re(e) && (r = -1),\n      re(t) && (s = -1),\n      (r = r === -1 ? 100 : r),\n      (s = s === -1 ? 100 : s),\n      r - s\n    );\n  });\n}\nfunction re(o) {\n  if (o.mime.startsWith(\"application/vnd.\"))\n    try {\n      return new TextDecoder().decode(o.data).length === 0;\n    } catch {\n      console.error(`Failed to decode ${o.mime}`, o.data);\n    }\n  return !1;\n}\nfunction ke(o, e) {\n  if (!e) return u.NotebookCellOutputItem.text(\"\", o);\n  try {\n    if (\n      (o.startsWith(\"text/\") || ye.includes(o)) &&\n      (Array.isArray(e) || typeof e == \"string\")\n    ) {\n      const t = Array.isArray(e) ? G(e) : e;\n      return u.NotebookCellOutputItem.text(t, o);\n    } else\n      return o.startsWith(\"image/\") &&\n        typeof e == \"string\" &&\n        o !== \"image/svg+xml\"\n        ? new u.NotebookCellOutputItem(Te(e), o)\n        : typeof e == \"object\" && e !== null && !Array.isArray(e)\n          ? u.NotebookCellOutputItem.text(JSON.stringify(e), o)\n          : ((e = Array.isArray(e) ? G(e) : e),\n            u.NotebookCellOutputItem.text(e, o));\n  } catch (t) {\n    return (\n      console.error(\n        `Failed to convert ${o} output to a buffer ${typeof e}, ${e}`,\n        t,\n      ),\n      u.NotebookCellOutputItem.text(\"\")\n    );\n  }\n}\nfunction Te(o) {\n  return typeof Buffer < \"u\" && typeof Buffer.from == \"function\"\n    ? Buffer.from(o, \"base64\")\n    : Uint8Array.from(atob(o), (e) => e.charCodeAt(0));\n}\nfunction G(o) {\n  if (Array.isArray(o)) {\n    let e = \"\";\n    for (let t = 0; t < o.length; t += 1) {\n      const n = o[t];\n      t < o.length - 1 &&\n      !n.endsWith(`\n`)\n        ? (e = e.concat(`${n}\n`))\n        : (e = e.concat(n));\n    }\n    return e;\n  }\n  return o.toString();\n}\nfunction _e(o) {\n  let e = o;\n  do (o = e), (e = o.replace(/[^\\n]\\x08/gm, \"\"));\n  while (e.length < o.length);\n  return o;\n}\nfunction Ee(o) {\n  for (\n    o = o.replace(\n      /\\r+\\n/gm,\n      `\n`,\n    );\n    o.search(/\\r[^$]/g) > -1;\n\n  ) {\n    const e = o.match(/^(.*)\\r+/m)[1];\n    let t = o.match(/\\r+(.*)$/m)[1];\n    (t = t + e.slice(t.length, e.length)),\n      (o = o.replace(/\\r+.*$/m, \"\\r\").replace(/^.*\\r/m, t));\n  }\n  return o;\n}\nfunction ve(o) {\n  return Ee(_e(o));\n}\nfunction K(o) {\n  if (o.parent_header && \"msg_id\" in o.parent_header)\n    return o.parent_header.msg_id;\n}\nfunction Ne(o) {\n  if (Object.prototype.hasOwnProperty.call(o, \"text/html\")) {\n    const e = o[\"text/html\"];\n    typeof e == \"string\" &&\n      e.includes('<iframe id=\"tensorboard-frame-') &&\n      (o[\"text/html\"] = e.replace(\n        /new URL\\((.*), window.location\\)/,\n        'new URL(\"http://localhost\")',\n      ));\n  }\n  return o;\n}\nconst Oe = \"e976ee50-99ed-4aba-9b6b-9dcd5634d07d:IPyWidgets:\";\nfunction Q(o) {\n  let e = typeof o == \"string\" ? o : \"\";\n  return (\n    typeof o != \"string\" &&\n      \"content\" in o &&\n      \"code\" in o.content &&\n      typeof o.content.code == \"string\" &&\n      (e = o.content.code),\n    !e.includes(Oe)\n  );\n}\nfunction Ce(o) {\n  const e = G(o.text),\n    t =\n      o.name === \"stderr\"\n        ? u.NotebookCellOutputItem.stderr\n        : u.NotebookCellOutputItem.stdout;\n  return new u.NotebookCellOutput([t(e)], te(o));\n}\nfunction Se(o) {\n  return (\n    (o = o || { output_type: \"error\", ename: \"\", evalue: \"\", traceback: [] }),\n    new u.NotebookCellOutput(\n      [\n        u.NotebookCellOutputItem.error({\n          name: (o == null ? void 0 : o.ename) || \"\",\n          message: (o == null ? void 0 : o.evalue) || \"\",\n          stack: ((o == null ? void 0 : o.traceback) || []).join(`\n`),\n        }),\n      ],\n      { ...te(o), originalError: o },\n    )\n  );\n}\nvar ee;\n(function (o) {\n  (o.GeneratedThemeName = \"ipython-theme\"),\n    (o.MatplotLibDefaultParams = \"_VSCode_defaultMatplotlib_Params\"),\n    (o.MatplotLibFigureFormats = \"_VSCode_matplotLib_FigureFormats\"),\n    (o.DefaultCodeCellMarker = \"# %%\"),\n    (o.DefaultCommTarget = \"jupyter.widget\"),\n    (o.ALL_VARIABLES = \"ALL_VARIABLES\"),\n    (o.KERNEL_VARIABLES = \"KERNEL_VARIABLES\"),\n    (o.DEBUGGER_VARIABLES = \"DEBUGGER_VARIABLES\"),\n    (o.PYTHON_VARIABLES_REQUESTER = \"PYTHON_VARIABLES_REQUESTER\"),\n    (o.MULTIPLEXING_DEBUGSERVICE = \"MULTIPLEXING_DEBUGSERVICE\"),\n    (o.RUN_BY_LINE_DEBUGSERVICE = \"RUN_BY_LINE_DEBUGSERVICE\"),\n    (o.REMOTE_URI = \"https://remote/\"),\n    (o.REMOTE_URI_ID_PARAM = \"id\"),\n    (o.REMOTE_URI_HANDLE_PARAM = \"uriHandle\"),\n    (o.REMOTE_URI_EXTENSION_ID_PARAM = \"extensionId\");\n})(ee || (ee = {}));\nconst z = \"application/vnd.jupyter.widget-view+json\";\nclass Ie {\n  get value() {\n    return this._value;\n  }\n  constructor(e = null) {\n    Object.defineProperty(this, \"scope\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: e,\n    }),\n      Object.defineProperty(this, \"_resolve\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: void 0,\n      }),\n      Object.defineProperty(this, \"_reject\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: void 0,\n      }),\n      Object.defineProperty(this, \"_resolved\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: !1,\n      }),\n      Object.defineProperty(this, \"_rejected\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: !1,\n      }),\n      Object.defineProperty(this, \"_promise\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: void 0,\n      }),\n      Object.defineProperty(this, \"_value\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: void 0,\n      }),\n      (this._promise = new Promise((t, n) => {\n        (this._resolve = t), (this._reject = n);\n      }));\n  }\n  resolve(e) {\n    (this._value = e),\n      this._resolve.apply(this.scope ? this.scope : this, arguments),\n      (this._resolved = !0);\n  }\n  reject(e) {\n    this._reject.apply(this.scope ? this.scope : this, arguments),\n      (this._rejected = !0);\n  }\n  get promise() {\n    return this._promise;\n  }\n  get resolved() {\n    return this._resolved;\n  }\n  get rejected() {\n    return this._rejected;\n  }\n  get completed() {\n    return this._rejected || this._resolved;\n  }\n}\nfunction Me(o = null) {\n  return new Ie(o);\n}\nvar j = {};\nObject.defineProperty(j, \"__esModule\", { value: !0 });\nj.serialize = H = j.deserialize = void 0;\nfunction Pe(o) {\n  let e;\n  return typeof o == \"string\" ? (e = JSON.parse(o)) : (e = xe(o)), e;\n}\nvar H = (j.deserialize = Pe);\nfunction De(o) {\n  var e;\n  let t;\n  return (\n    !((e = o.buffers) === null || e === void 0) && e.length\n      ? (t = Ae(o))\n      : (t = JSON.stringify(o)),\n    t\n  );\n}\nj.serialize = De;\nfunction xe(o) {\n  const e = new DataView(o),\n    t = e.getUint32(0),\n    n = [];\n  if (t < 2) throw new Error(\"Invalid incoming Kernel Message\");\n  for (let a = 1; a <= t; a++) n.push(e.getUint32(a * 4));\n  const r = new Uint8Array(o.slice(n[0], n[1])),\n    s = JSON.parse(new TextDecoder(\"utf8\").decode(r));\n  s.buffers = [];\n  for (let a = 1; a < t; a++) {\n    const i = n[a],\n      l = n[a + 1] || o.byteLength;\n    s.buffers.push(new DataView(o.slice(i, l)));\n  }\n  return s;\n}\nfunction Ae(o) {\n  const e = [],\n    t = [],\n    n = new TextEncoder();\n  let r = [];\n  o.buffers !== void 0 && ((r = o.buffers), delete o.buffers);\n  const s = n.encode(JSON.stringify(o));\n  t.push(s.buffer);\n  for (let c = 0; c < r.length; c++) {\n    const m = r[c];\n    t.push(ArrayBuffer.isView(m) ? m.buffer : m);\n  }\n  const a = t.length;\n  e.push(4 * (a + 1));\n  for (let c = 0; c + 1 < t.length; c++)\n    e.push(e[e.length - 1] + t[c].byteLength);\n  const i = new Uint8Array(e[e.length - 1] + t[t.length - 1].byteLength),\n    l = new DataView(i.buffer);\n  l.setUint32(0, a);\n  for (let c = 0; c < e.length; c++) l.setUint32(4 * (c + 1), e[c]);\n  for (let c = 0; c < t.length; c++) i.set(new Uint8Array(t[c]), e[c]);\n  return i.buffer;\n}\nfunction je(o) {\n  if (!o || !Array.isArray(o) || o.length === 0) return;\n  const e = [];\n  for (let t = 0; t < o.length; t += 1) {\n    const n = o[t];\n    if (\"buffer\" in n && \"byteOffset\" in n) {\n      const r = n,\n        s = [...new Uint8Array(r.buffer)];\n      e.push({ byteLength: r.byteLength, byteOffset: r.byteOffset, buffer: s });\n    } else e.push([...new Uint8Array(n)]);\n  }\n  return e;\n}\nconst Re = require(\"path\");\nfunction V() {}\nRe.join(__dirname, \".\");\nfunction Le() {\n  console.log(\"Trying to load zmq\");\n  const o = require(\"zeromq\");\n  return (o.context.blocky = !1), console.info(\"ZMQ loaded.\"), o;\n}\nfunction $e(o, e) {\n  const t = o.transport === \"tcp\" ? \":\" : \"-\",\n    n = o[`${e}_port`];\n  if (!n) throw new Error(`Port not found for channel \"${e}\"`);\n  return `${o.transport}://${o.ip}${t}${n}`;\n}\nconst qe = [\"username\", \"version\", \"session\", \"msg_id\", \"msg_type\"],\n  se = {\n    stream: { name: \"string\", text: \"string\" },\n    display_data: { data: \"object\", metadata: \"object\" },\n    execute_input: { code: \"string\", execution_count: \"number\" },\n    execute_result: {\n      execution_count: \"number\",\n      data: \"object\",\n      metadata: \"object\",\n    },\n    error: { ename: \"string\", evalue: \"string\", traceback: \"object\" },\n    status: {\n      execution_state: [\n        \"string\",\n        [\"starting\", \"idle\", \"busy\", \"restarting\", \"dead\"],\n      ],\n    },\n    clear_output: { wait: \"boolean\" },\n    comm_open: { comm_id: \"string\", target_name: \"string\", data: \"object\" },\n    comm_msg: { comm_id: \"string\", data: \"object\" },\n    comm_close: { comm_id: \"string\" },\n    shutdown_reply: { restart: \"boolean\" },\n  };\nfunction Fe(o) {\n  if (o.channel !== \"iopub\") return;\n  const e = o.header.msg_type;\n  if (e in se) {\n    const t = se[e];\n    if (t === void 0) return;\n    const n = Object.keys(t),\n      r = o.content;\n    for (let s = 0; s < n.length; s++) {\n      const a = t[n[s]],\n        i = Array.isArray(a) ? a : [a, []],\n        l = n[s];\n      if (!(l in r) || typeof r[l] !== i[0])\n        switch (i[0]) {\n          case \"string\":\n            r[l] = \"\";\n            break;\n          case \"boolean\":\n            r[l] = !1;\n            break;\n          case \"object\":\n            r[l] = {};\n            break;\n          case \"number\":\n            r[l] = 0;\n            break;\n        }\n    }\n  }\n}\nfunction We(o, e) {\n  const t = o.header;\n  qe.forEach((n) => {\n    typeof t[n] != \"string\" && (t[n] = \"\");\n  }),\n    typeof o.channel != \"string\" && (o.channel = e),\n    o.content || (o.content = {}),\n    o.metadata || (o.metadata = {}),\n    o.channel === \"iopub\" && Fe(o);\n}\nconsole.log(We);\nclass Be {\n  constructor(e, t) {\n    Object.defineProperty(this, \"connection\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: e,\n    }),\n      Object.defineProperty(this, \"serialize\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: t,\n      }),\n      Object.defineProperty(this, \"onopen\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: V,\n      }),\n      Object.defineProperty(this, \"onerror\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: V,\n      }),\n      Object.defineProperty(this, \"onclose\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: V,\n      }),\n      Object.defineProperty(this, \"onmessage\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: V,\n      }),\n      Object.defineProperty(this, \"receiveHooks\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: [],\n      }),\n      Object.defineProperty(this, \"sendHooks\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: [],\n      }),\n      Object.defineProperty(this, \"msgChain\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: Promise.resolve(),\n      }),\n      Object.defineProperty(this, \"sendChain\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: Promise.resolve(),\n      }),\n      Object.defineProperty(this, \"channels\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: void 0,\n      }),\n      Object.defineProperty(this, \"closed\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: !1,\n      }),\n      (this.channels = this.generateChannels(this.connection));\n  }\n  dispose() {\n    this.closed || this.close();\n  }\n  close() {\n    this.closed = !0;\n    const e = (t) => {\n      try {\n        t.close();\n      } catch (n) {\n        console.error(\"Error during socket shutdown\", n);\n      }\n    };\n    e(this.channels.control),\n      e(this.channels.iopub),\n      e(this.channels.shell),\n      e(this.channels.stdin);\n  }\n  emit(e, ...t) {\n    switch (e) {\n      case \"message\":\n        this.onmessage({ data: t[0], type: \"message\", target: this });\n        break;\n      case \"close\":\n        this.onclose({ wasClean: !0, code: 0, reason: \"\", target: this });\n        break;\n      case \"error\":\n        this.onerror({\n          error: new Error(),\n          message: \"to do\",\n          type: \"error\",\n          target: this,\n        });\n        break;\n      case \"open\":\n        this.onopen({ target: this });\n        break;\n    }\n    return !0;\n  }\n  send(e, t) {\n    this.sendMessage(e, !1);\n  }\n  addReceiveHook(e) {\n    this.receiveHooks.push(e);\n  }\n  removeReceiveHook(e) {\n    this.receiveHooks = this.receiveHooks.filter((t) => t !== e);\n  }\n  addSendHook(e) {\n    this.sendHooks.push(e);\n  }\n  removeSendHook(e) {\n    this.sendHooks = this.sendHooks.filter((t) => t !== e);\n  }\n  generateChannel(e, t, n) {\n    const r = n();\n    return (\n      r.connect($e(e, t)),\n      this.processSocketMessages(t, r).catch((s) =>\n        console.error(`Failed to read messages from channel ${t}`, s),\n      ),\n      r\n    );\n  }\n  async processSocketMessages(e, t) {\n    for await (const n of t) {\n      if (this.closed) break;\n      this.onIncomingMessage(e, n);\n    }\n  }\n  generateChannels(e) {\n    const t = Le(),\n      n = x();\n    return {\n      iopub: this.generateChannel(\n        e,\n        \"iopub\",\n        () => new t.Subscriber({ maxMessageSize: -1, receiveHighWaterMark: 0 }),\n      ),\n      shell: this.generateChannel(\n        e,\n        \"shell\",\n        () => new t.Dealer({ routingId: n, maxMessageSize: -1 }),\n      ),\n      control: this.generateChannel(\n        e,\n        \"control\",\n        () => new t.Dealer({ routingId: n, maxMessageSize: -1 }),\n      ),\n      stdin: this.generateChannel(\n        e,\n        \"stdin\",\n        () => new t.Dealer({ routingId: n, maxMessageSize: -1 }),\n      ),\n    };\n  }\n  onIncomingMessage(e, t) {\n    this.msgChain = this.msgChain\n      .then(() => this.handleIncomingMessage(e, t))\n      .catch((n) => {\n        console.error(\"Failed to handle incoming message\", n);\n      });\n  }\n  async handleIncomingMessage(e, t) {\n    for (const n of this.receiveHooks) await n(t);\n    this.emit(\"message\", t);\n  }\n  sendMessage(e, t) {\n    this.sendChain = this.sendChain\n      .then(() => this.handleOutgoingMessage(e, t))\n      .catch((n) => {\n        console.error(\"Failed to handle outgoing message\", n);\n      });\n  }\n  async handleOutgoingMessage(e, t) {\n    if (!t) for (const s of this.sendHooks) await s(e);\n    let n, r;\n    try {\n      if (typeof e == \"string\") (n = H(e)), (r = n.channel);\n      else throw new Error(\"Not supported\");\n    } catch {\n      (r = \"shell\"), (n = e);\n    }\n    this.postToSocket(r, n);\n  }\n  postToSocket(e, t) {\n    const n = this.channels[e];\n    n && n.send(this.serialize(t));\n  }\n}\nlet X;\nclass Ue {\n  get postMessage() {\n    return this._postMessageEmitter.event;\n  }\n  constructor(e, t, n, r) {\n    Object.defineProperty(this, \"outputWidgetIds\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: new Set(),\n    }),\n      Object.defineProperty(this, \"waitingMessageIds\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: new Map(),\n      }),\n      Object.defineProperty(this, \"kernel\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: void 0,\n      }),\n      Object.defineProperty(this, \"_postMessageEmitter\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: new u.EventEmitter(),\n      }),\n      (this.kernel = this.initializeKernel(e, t, n, r));\n  }\n  get rawKernel() {\n    return this.kernel;\n  }\n  initializeKernel(e, t, n, r) {\n    var s;\n    const a = require(\"@jupyterlab/services\"),\n      i = require(\"@jupyterlab/services/lib/kernel/serialize\");\n    let l;\n    const c =\n        ((s = class extends Be {\n          constructor() {\n            super(e.connection, i.serialize), (l = this);\n          }\n        }),\n        me(s, \"RawSocketWrapper\"),\n        Object.defineProperty(s, \"CONNECTING\", {\n          enumerable: !0,\n          configurable: !0,\n          writable: !0,\n          value: 0,\n        }),\n        Object.defineProperty(s, \"OPEN\", {\n          enumerable: !0,\n          configurable: !0,\n          writable: !0,\n          value: 1,\n        }),\n        Object.defineProperty(s, \"CLOSING\", {\n          enumerable: !0,\n          configurable: !0,\n          writable: !0,\n          value: 2,\n        }),\n        Object.defineProperty(s, \"CLOSED\", {\n          enumerable: !0,\n          configurable: !0,\n          writable: !0,\n          value: 3,\n        }),\n        s),\n      m = a.ServerConnection.makeSettings({ WebSocket: c, wsUrl: \"RAW\" });\n    X || (X = require(\"@jupyterlab/services/lib/kernel/nonSerializingKernel\"));\n    const h = new X.KernelConnection({\n      serverSettings: m,\n      clientId: t,\n      handleComms: !1,\n      username: n,\n      model: r,\n    });\n    return (\n      l &&\n        (l.emit(\"open\"),\n        l.addReceiveHook(this.onKernelSocketMessage.bind(this)),\n        l.addSendHook(this.mirrorSend.bind(this))),\n      { realKernel: h, socket: l, kernelProcess: e }\n    );\n  }\n  async mirrorSend(e, t) {\n    if (\n      typeof e == \"string\" &&\n      e.includes(\"shell\") &&\n      e.includes(\"execute_request\")\n    ) {\n      const n = H(e);\n      if (\n        n.channel === \"shell\" &&\n        n.header.msg_type === \"execute_request\" &&\n        \"content\" in n &&\n        typeof n.content == \"object\" &&\n        n.content !== null &&\n        \"code\" in n.content\n      ) {\n        const r = n;\n        if (!Q(r)) return;\n        this.mirrorExecuteRequest(r);\n      }\n    }\n  }\n  raisePostMessage(e, t) {\n    this._postMessageEmitter.fire({ payload: t, type: e });\n  }\n  mirrorExecuteRequest(e) {\n    this.raisePostMessage(\"IPyWidgets_mirror_execute\", {\n      id: e.header.msg_id,\n      msg: e,\n    });\n  }\n  async onKernelSocketMessage(e) {\n    var s;\n    const t = x(),\n      n = Me();\n    if (\n      (this.waitingMessageIds.set(t, {\n        startTime: Date.now(),\n        resultPromise: n,\n      }),\n      typeof e == \"string\"\n        ? Q(e) && this.raisePostMessage(\"IPyWidgets_msg\", { id: t, data: e })\n        : (e instanceof ArrayBuffer || ArrayBuffer.isView(e)) &&\n          this.raisePostMessage(\"IPyWidgets_binary_msg\", {\n            id: t,\n            data: je([e]),\n          }),\n      (typeof e != \"string\" ||\n        e.includes(z) ||\n        e.includes(ee.DefaultCommTarget) ||\n        e.includes(\"comm_open\") ||\n        e.includes(\"comm_close\") ||\n        e.includes(\"comm_msg\")) &&\n        typeof e == \"string\")\n    ) {\n      const a = H(e);\n      if (!Q(a)) return;\n      if (ne.KernelMessage.isCommOpenMsg(a)) {\n        const i = a.content,\n          l = (s = i.data) == null ? void 0 : s.state;\n        l &&\n          typeof l == \"object\" &&\n          \"_model_module\" in l &&\n          \"_model_name\" in l &&\n          l._model_module === \"@jupyter-widgets/output\" &&\n          l._model_name === \"OutputModel\" &&\n          this.outputWidgetIds.add(i.comm_id);\n      } else if (ne.KernelMessage.isCommCloseMsg(a)) {\n        const i = a.content;\n        this.outputWidgetIds.has(i.comm_id) &&\n          this.outputWidgetIds.delete(i.comm_id);\n      }\n    }\n  }\n  onKernelSocketResponse(e) {\n    const t = this.waitingMessageIds.get(e.id);\n    t && (this.waitingMessageIds.delete(e.id), t.resultPromise.resolve());\n  }\n}\nconst Ke = require(\"path\");\nclass M {\n  get postMessage() {\n    return this._postMessageEmitter.event;\n  }\n  constructor(e, t, n, r) {\n    Object.defineProperty(this, \"executionInfrastructure\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: t,\n    }),\n      Object.defineProperty(this, \"notebookDependencies\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: n,\n      }),\n      Object.defineProperty(this, \"dbtTerminal\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: r,\n      }),\n      Object.defineProperty(this, \"_postMessageEmitter\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: new u.EventEmitter(),\n      }),\n      Object.defineProperty(this, \"disposables\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: [],\n      }),\n      Object.defineProperty(this, \"lastUsedStreamOutput\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: void 0,\n      }),\n      Object.defineProperty(this, \"python\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: void 0,\n      }),\n      Object.defineProperty(this, \"kernel\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: void 0,\n      }),\n      Object.defineProperty(this, \"isInitializing\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: !0,\n      }),\n      Object.defineProperty(this, \"ownedCommIds\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: new Set(),\n      }),\n      Object.defineProperty(this, \"commIdsMappedToWidgetOutputModels\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: new Set(),\n      }),\n      Object.defineProperty(this, \"ownedRequestMsgIds\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: new Set(),\n      }),\n      Object.defineProperty(this, \"commIdsMappedToParentWidgetModel\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: new Map(),\n      }),\n      Object.defineProperty(this, \"streamsReAttachedToExecutingCell\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: !1,\n      }),\n      Object.defineProperty(this, \"registerdCommTargets\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: new Set(),\n      }),\n      Object.defineProperty(this, \"outputsAreSpecificToAWidget\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: [],\n      }),\n      Object.defineProperty(this, \"versions\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: void 0,\n      }),\n      this.dbtTerminal.debug(\n        \"NotebookKernelClient\",\n        \"creating python bridge for notebook:\",\n        e,\n      ),\n      (this.python = this.executionInfrastructure.createPythonBridge(\n        Ke.dirname(e),\n      )),\n      this.initializeNotebookKernel(e),\n      console.log(\n        \"NotebookKernelClient\",\n        this.commIdsMappedToParentWidgetModel,\n        this.ownedRequestMsgIds,\n        this.ownedCommIds,\n      );\n  }\n  async isInitialized() {\n    return new Promise((e) => {\n      const t = setInterval(() => {\n        var n, r;\n        this.dbtTerminal.debug(\n          \"Notebookclient\",\n          \"isInitialized\",\n          !!((n = this.kernel) != null && n.rawKernel),\n        ),\n          (r = this.kernel) != null && r.rawKernel && (e(!0), clearInterval(t));\n      }, 500);\n    });\n  }\n  async dispose() {\n    this.disposables.forEach((e) => e.dispose());\n    try {\n      await this.python.ex`\n        notebook_kernel.close_notebook()\n        `;\n    } catch (e) {\n      this.dbtTerminal.error(\n        p.TelemetryEvents[\"Notebook/KernelCloseError\"],\n        e.exception.message,\n        e,\n      );\n    }\n  }\n  get jupyterPackagesVersions() {\n    return this.versions;\n  }\n  async getDependenciesVersion() {\n    this.versions = await this.notebookDependencies.getDependenciesVersion();\n  }\n  async getKernel() {\n    return new Promise((e) => {\n      const t = setInterval(() => {\n        var n;\n        this.isInitializing ||\n          (e((n = this.kernel) == null ? void 0 : n.rawKernel),\n          clearInterval(t));\n      }, 500);\n    });\n  }\n  async initializeNotebookKernel(e) {\n    try {\n      if (\n        !(await this.notebookDependencies.validateAndInstallNotebookDependencies())\n      )\n        return;\n      await this.python.ex`\n        from altimate_notebook_kernel import AltimateNotebookKernel\n        notebook_kernel = AltimateNotebookKernel(${e})\n        `;\n      const t = await this.python.lock(\n          (i) => i`notebook_kernel.get_connection_file()`,\n        ),\n        n = JSON.parse(pe.readFileSync(t, { encoding: \"utf-8\" })),\n        r = await this.python.lock((i) => i`notebook_kernel.get_session_id()`),\n        s = { connection: n, pid: r },\n        a = new Ue(s, x(), x(), {\n          name: n.kernel_name,\n          id: x(),\n          language: \"python\",\n          argv: [],\n          display_name: n.kernel_name,\n          resources: {},\n        });\n      (this.kernel = a),\n        this.disposables.push(\n          a.postMessage((i) => this._postMessageEmitter.fire(i)),\n        ),\n        this.dbtTerminal.log(\n          `Notebook Kernel started with PID: ${r} connection: ${JSON.stringify(n)}`,\n        ),\n        this.getDependenciesVersion();\n    } catch (t) {\n      let n = t.message;\n      t instanceof ie.PythonException && (n = t.exception.message),\n        this.dbtTerminal.error(\n          p.TelemetryEvents[\"Notebook/KernelInitializationError\"],\n          n,\n          t,\n        ),\n        u.window.showErrorMessage(n);\n    }\n    this.isInitializing = !1;\n  }\n  onKernelSocketResponse(e) {\n    var t;\n    (t = this.kernel) == null || t.onKernelSocketResponse(e);\n  }\n  async storeContext(e) {\n    this.dbtTerminal.log(`storeContext: ${e}`),\n      await this.python.lock((t) => t`notebook_kernel.store_context(${e})`);\n  }\n  async storeDataInKernel(e, t) {\n    try {\n      return (\n        this.dbtTerminal.log(`storeDataInKernel: ${e}`),\n        await this.python.lock(\n          (n) =>\n            n`notebook_kernel.store_sql_result(${e}, ${JSON.stringify(t)})`,\n        ),\n        !0\n      );\n    } catch (n) {\n      throw (\n        (this.dbtTerminal.error(\n          p.TelemetryEvents[\"Notebook/StoreDataInKernelError\"],\n          n.exception.message,\n          n,\n        ),\n        n)\n      );\n    }\n  }\n  async registerCommTarget(e) {\n    if (this.registerdCommTargets.has(e)) {\n      this.dbtTerminal.log(`registerCommTarget already registered: ${e}`);\n      return;\n    }\n    this.registerdCommTargets.add(e),\n      this.dbtTerminal.log(`registerCommTarget registering: ${e}`);\n    const t = await this.getKernel();\n    if (!t)\n      throw (\n        (this.registerdCommTargets.delete(e),\n        new Error(\"Kernel not found for registering comm target\"))\n      );\n    return t.realKernel.registerCommTarget(e, (n, r) => {\n      this.dbtTerminal.log(`registerCommTarget registered: ${e}`, n, r);\n    });\n  }\n  async getPythonCodeByType(e, t) {\n    return (\n      this.dbtTerminal.debug(\"getPythonCodeByType\", e, t),\n      await this.python.lock(\n        (n) => n`notebook_kernel.get_python_code_by_type(${e}, ${t})`,\n      )\n    );\n  }\n  async executePython(e, t, n) {\n    return new Promise((r, s) => {\n      var i, l;\n      if (\n        !(\n          (l = (i = this.kernel) == null ? void 0 : i.rawKernel) != null &&\n          l.realKernel\n        )\n      ) {\n        s(new Error(\"Kernel not found\"));\n        return;\n      }\n      (async () => {\n        try {\n          const c = t.metadata.cellId;\n          this.dbtTerminal.log(`Executing python code in cell: ${c}`, e);\n          const m = require(\"@jupyterlab/services\");\n          this.dbtTerminal.log(\n            \"kernel status\",\n            this.kernel.rawKernel.realKernel.status,\n          );\n          const h = await this.kernel.rawKernel.realKernel.requestExecute(\n            {\n              code: e,\n              silent: !1,\n              stop_on_error: !1,\n              allow_stdin: !0,\n              store_history: !0,\n            },\n            !1,\n            { cellId: t.document.uri.toString() },\n          );\n          if (!h) {\n            s(new Error(\"Unknown request error\"));\n            return;\n          }\n          h.onReply = (d) => {\n            if (t.document.isClosed) {\n              h.dispose();\n              return;\n            }\n            const y = d.content;\n            y.payload &&\n              y.payload.forEach((k) => {\n                if (\n                  k.data &&\n                  Object.prototype.hasOwnProperty.call(k.data, \"text/plain\")\n                ) {\n                  const v = this.addToCellData(\n                    {\n                      output_type: \"stream\",\n                      text: k.data[\"text/plain\"].toString(),\n                      name: \"stdout\",\n                      metadata: {},\n                      execution_count: y.execution_count,\n                    },\n                    d,\n                    t,\n                  );\n                  v && n(v);\n                }\n              });\n          };\n          const b = [];\n          h.done.finally(() => {\n            h.dispose(), r(b.filter((d) => !!d));\n          }),\n            (h.onStdin = (d) => {\n              this.dbtTerminal.log(\"onStdin\", d);\n            }),\n            (h.onIOPub = (d) => {\n              if (m.KernelMessage.isCommOpenMsg(d)) this.handleCommOpen(d);\n              else if (m.KernelMessage.isExecuteResultMsg(d))\n                b.push(this.handleExecuteResult(d, t));\n              else if (m.KernelMessage.isExecuteInputMsg(d))\n                this.handleExecuteInput(d);\n              else if (m.KernelMessage.isStatusMsg(d)) {\n                const y = d;\n                this.handleStatusMessage(y);\n              } else if (m.KernelMessage.isStreamMsg(d)) {\n                const y = this.handleStreamMessage(d, t);\n                y == null ||\n                  y.forEach((k) => {\n                    b.push(k);\n                  });\n              } else\n                m.KernelMessage.isDisplayDataMsg(d)\n                  ? b.push(this.handleDisplayData(d, t))\n                  : m.KernelMessage.isUpdateDisplayDataMsg(d)\n                    ? this.handleUpdateDisplayDataMessage(d)\n                    : m.KernelMessage.isClearOutputMsg(d)\n                      ? this.handleClearOutput(d)\n                      : m.KernelMessage.isErrorMsg(d)\n                        ? b.push(this.handleError(d, t))\n                        : m.KernelMessage.isCommMsgMsg(d)\n                          ? this.handleCommMsg(d)\n                          : m.KernelMessage.isCommCloseMsg(d) ||\n                            this.dbtTerminal.warn(\n                              \"NotebookUnknownIOPubMessage\",\n                              `Unknown message ${d.header.msg_type} : hasData=${\"data\" in d.content}`,\n                            );\n            });\n        } catch (c) {\n          s(c);\n        }\n      })().catch(s);\n    });\n  }\n  handleUpdateDisplayDataMessage(e) {\n    if (\n      (this.dbtTerminal.log(\"handleUpdateDisplayDataMessage\", e),\n      !e.content.transient.display_id)\n    ) {\n      this.dbtTerminal.warn(\n        \"NotebookUpdateDisplayDataMessageReceivedButNoDisplayId\",\n        \"Update display data message received, but no display id\",\n        !1,\n        e.content,\n      );\n      return;\n    }\n  }\n  handleCommOpen(e) {\n    var s;\n    const t = e.content,\n      n = (s = t.data) == null ? void 0 : s.state;\n    n &&\n      n._model_module === \"@jupyter-widgets/output\" &&\n      n._model_name === \"OutputModel\" &&\n      this.commIdsMappedToWidgetOutputModels.add(t.comm_id);\n  }\n  handleCommMsg(e) {\n    const t = e.content,\n      n = t.data,\n      r = n.method,\n      s = n.state;\n    if (r === \"update\" && s != null && s.msg_id) {\n      const a = s.msg_id,\n        i = t.comm_id,\n        l = this.outputsAreSpecificToAWidget.find(\n          (c) => c.handlingCommId === i,\n        );\n      l\n        ? ((l.msgIdsToSwallow = a), (l.clearOutputOnNextUpdateToOutput = !0))\n        : this.outputsAreSpecificToAWidget.push({\n            handlingCommId: i,\n            msgIdsToSwallow: a,\n            clearOutputOnNextUpdateToOutput: !0,\n          });\n    }\n  }\n  handleExecuteResult(e, t) {\n    return this.addToCellData(\n      {\n        output_type: \"execute_result\",\n        data: e.content.data,\n        metadata: e.content.metadata,\n        transient: e.content.transient,\n        execution_count: e.content.execution_count,\n      },\n      e,\n      t,\n    );\n  }\n  addToCellData(e, t, n) {\n    if (e.data && typeof e.data == \"object\" && z in e.data) {\n      const a = e.data[z];\n      if (a && \"model_id\" in a) {\n        const i = M.modelIdsOwnedByCells.get(n) || new Set();\n        i.add(a.model_id), M.modelIdsOwnedByCells.set(n, i);\n      }\n    }\n    const r = J(e);\n    if (n.document.isClosed) return;\n    this.dbtTerminal.log(\n      n.document.uri.fsPath,\n      `Update output with mimes ${r.items.map((a) => a.mime).toString()}`,\n    );\n    const s = K(t);\n    return (\n      (this.outputsAreSpecificToAWidget.length &&\n        this.outputsAreSpecificToAWidget[\n          this.outputsAreSpecificToAWidget.length - 1\n        ].msgIdsToSwallow === s &&\n        r.items.every((a) => this.canMimeTypeBeRenderedByWidgetManager(a))) ||\n        (this.outputsAreSpecificToAWidget.length &&\n          this.outputsAreSpecificToAWidget[\n            this.outputsAreSpecificToAWidget.length - 1\n          ].msgIdsToSwallow === s &&\n          this.dbtTerminal.warn(\"NotebookAddToCellData\", \"unknown operation\")),\n      r\n    );\n  }\n  canMimeTypeBeRenderedByWidgetManager(e) {\n    const t = e.mime;\n    if (t === I.stderr || t === I.stdout || t === I.error) return !0;\n    if (t === z) {\n      const n = JSON.parse(new TextDecoder().decode(e.data));\n      return !(\n        typeof n.model_id == \"string\" &&\n        this.commIdsMappedToWidgetOutputModels.has(n.model_id)\n      );\n    }\n    return !t.startsWith(\"application/vnd\");\n  }\n  handleExecuteInput(e) {}\n  handleStatusMessage(e) {}\n  handleStreamMessage(e, t) {\n    var r;\n    if (\n      K(e) &&\n      this.outputsAreSpecificToAWidget.length &&\n      this.outputsAreSpecificToAWidget[\n        this.outputsAreSpecificToAWidget.length - 1\n      ].msgIdsToSwallow === K(e)\n    )\n      return;\n    const n =\n      e.content.name === \"stdout\"\n        ? u.NotebookCellOutputItem.stdout(\"\").mime\n        : u.NotebookCellOutputItem.stderr(\"\").mime;\n    if (\n      (!this.streamsReAttachedToExecutingCell &&\n        !this.lastUsedStreamOutput &&\n        t.outputs.length &&\n        t.outputs[t.outputs.length - 1].items.length >= 1 &&\n        t.outputs[t.outputs.length - 1].items.every((s) => s.mime === n) &&\n        (this.lastUsedStreamOutput = {\n          output: t.outputs[0],\n          stream: e.content.name,\n        }),\n      (this.streamsReAttachedToExecutingCell = !0),\n      ((r = this.lastUsedStreamOutput) == null ? void 0 : r.stream) ===\n        e.content.name)\n    )\n      return [\n        J({\n          output_type: \"stream\",\n          name: e.content.name,\n          text: e.content.text,\n        }),\n        this.lastUsedStreamOutput.output,\n      ];\n    {\n      const s = ve(G(e.content.text));\n      return [J({ output_type: \"stream\", name: e.content.name, text: s })];\n    }\n  }\n  handleDisplayData(e, t) {\n    const n = {\n      output_type: \"display_data\",\n      data: Ne(e.content.data),\n      metadata: e.content.metadata,\n      transient: e.content.transient,\n    };\n    return this.addToCellData(n, e, t);\n  }\n  handleClearOutput(e) {\n    if (\n      this.outputsAreSpecificToAWidget.length &&\n      this.outputsAreSpecificToAWidget[\n        this.outputsAreSpecificToAWidget.length - 1\n      ].msgIdsToSwallow === K(e)\n    ) {\n      e.content.wait &&\n        this.outputsAreSpecificToAWidget.length &&\n        (this.outputsAreSpecificToAWidget[\n          this.outputsAreSpecificToAWidget.length - 1\n        ].clearOutputOnNextUpdateToOutput = !0);\n      return;\n    }\n  }\n  handleError(e, t) {\n    const n = e.content.traceback;\n    this.dbtTerminal.log(`Traceback for error ${n}`);\n    const r = {\n      output_type: \"error\",\n      ename: e.content.ename,\n      evalue: e.content.evalue,\n      traceback: n,\n    };\n    return this.addToCellData(r, e, t);\n  }\n}\nObject.defineProperty(M, \"modelIdsOwnedByCells\", {\n  enumerable: !0,\n  configurable: !0,\n  writable: !0,\n  value: new WeakMap(),\n});\nexports.NotebookDependencies = class {\n  constructor(e, t, n, r) {\n    Object.defineProperty(this, \"dbtTerminal\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: e,\n    }),\n      Object.defineProperty(this, \"telemetry\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: t,\n      }),\n      Object.defineProperty(this, \"commandProcessExecutionFactory\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: n,\n      }),\n      Object.defineProperty(this, \"pythonEnvironment\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: r,\n      });\n  }\n  async checkPythonDependencies(e) {\n    const t = [];\n    for (const n of e) {\n      const r = [\"-m\", \"pip\", \"show\", n],\n        { stderr: s } = await this.commandProcessExecutionFactory\n          .createCommandProcessExecution({\n            command: this.pythonEnvironment.pythonPath,\n            args: r,\n            cwd: p.getFirstWorkspacePath(),\n            envVars: this.pythonEnvironment.environmentVariables,\n          })\n          .completeWithTerminalOutput();\n      s && t.push(n);\n    }\n    return t;\n  }\n  checkDbtDependencies(e, t) {\n    return e\n      .map((n) => {\n        try {\n          return t.findPackageVersion(n), null;\n        } catch {\n          return n;\n        }\n      })\n      .filter(Boolean);\n  }\n  async installMissingPythonPackages(e, t) {\n    const n = await this.checkPythonDependencies(e);\n    if (!n.length) return;\n    if (\n      (this.dbtTerminal.debug(\n        \"Notebook\",\n        \"asking user to install missing python dependencies for notebook\",\n        n,\n      ),\n      (await u.window.showInformationMessage(\n        `You need the following python packages to use this notebook: ${n.join(\", \")}`,\n        \"Install\",\n        \"Cancel\",\n      )) !== \"Install\")\n    )\n      throw (\n        (this.telemetry.sendTelemetryEvent(\n          p.TelemetryEvents[\"Notebook/DependenciesInstallCancelled\"],\n        ),\n        new Error(\"User cancelled python package installation\"))\n      );\n    return (\n      this.dbtTerminal.debug(\"Notebook\", \"installing required dependencies\", n),\n      await u.window.withProgress(\n        {\n          title: \"Installing python packages...\",\n          location: u.ProgressLocation.Notification,\n          cancellable: !1,\n        },\n        async () => {\n          try {\n            const s = [\"-m\", \"pip\", \"install\", ...n],\n              { stdout: a, stderr: i } =\n                await this.commandProcessExecutionFactory\n                  .createCommandProcessExecution({\n                    command: this.pythonEnvironment.pythonPath,\n                    args: s,\n                    cwd: p.getFirstWorkspacePath(),\n                    envVars: this.pythonEnvironment.environmentVariables,\n                  })\n                  .completeWithTerminalOutput();\n            if (\n              !a.includes(\"Successfully installed\") &&\n              !a.includes(\"Requirement already satisfied\") &&\n              i\n            )\n              throw new Error(i);\n            return (\n              this.dbtTerminal.log(\n                \"Notebook dependencies have been installed successfully.\",\n              ),\n              this.telemetry.sendTelemetryEvent(\n                p.TelemetryEvents[\"Notebook/DependenciesInstalled\"],\n              ),\n              await t.initialize(),\n              !0\n            );\n          } catch (s) {\n            this.telemetry.sendTelemetryError(\n              p.TelemetryEvents[\"Notebook/DependenciesInstallError\"],\n              s,\n            ),\n              u.window.showErrorMessage(\n                p.extendErrorWithSupportLinks(s.message),\n              );\n          }\n        },\n      )\n    );\n  }\n  async installMissingDbtPackages(e, t) {\n    const n = this.checkDbtDependencies(\n      e.map((a) => `${a.name}`),\n      t,\n    );\n    if (!n.length) return;\n    const r = e.filter((a) => (a.name ? n.includes(a.name) : !1));\n    if (\n      (this.dbtTerminal.debug(\n        \"Notebook\",\n        \"asking user to install missing dbt dependencies for notebook\",\n        r,\n      ),\n      (await u.window.showInformationMessage(\n        `You need following dbt packages to use this notebook: ${r.map((a) => `${a.package}`).join(\", \")}`,\n        \"Install\",\n        \"Cancel\",\n      )) !== \"Install\")\n    )\n      throw (\n        (this.telemetry.sendTelemetryEvent(\n          p.TelemetryEvents[\"Notebook/DependenciesInstallCancelled\"],\n        ),\n        new Error(\"User cancelled dbt package installation\"))\n      );\n    return await u.window.withProgress(\n      {\n        title: \"Installing dbt packages...\",\n        location: u.ProgressLocation.Notification,\n        cancellable: !1,\n      },\n      async () => {\n        try {\n          const a = r.map((l) => `${l.package}@${l.version}`);\n          this.dbtTerminal.debug(\"Notebook\", \"installing dbt packages\", a),\n            await t.installDbtPackages(a),\n            await t.initialize();\n          const i = this.checkDbtDependencies(\n            e.map((l) => `${l.name}`),\n            t,\n          );\n          if (i.length)\n            throw new Error(`Failed to install dbt packages ${i.join(\", \")}`);\n          return (\n            this.dbtTerminal.log(\n              \"Notebook dependencies have been installed successfully.\",\n            ),\n            this.telemetry.sendTelemetryEvent(\n              p.TelemetryEvents[\"Notebook/DependenciesInstalled\"],\n            ),\n            !0\n          );\n        } catch (a) {\n          this.telemetry.sendTelemetryError(\n            p.TelemetryEvents[\"Notebook/DependenciesInstallError\"],\n            a,\n          ),\n            u.window.showErrorMessage(p.extendErrorWithSupportLinks(a.message));\n        }\n      },\n    );\n  }\n  async verifyAndInstallDependenciesIfNeeded(e, t) {\n    this.dbtTerminal.debug(\n      \"NotebookDependencies\",\n      \"verifying required dependencies\",\n      e,\n    ),\n      await Promise.all([\n        this.validateAndInstallNotebookDependencies(),\n        this.installMissingPythonPackages(\n          e.filter((n) => n.type === \"python\").map((n) => n.package),\n          t,\n        ),\n        this.installMissingDbtPackages(\n          e.filter((n) => n.type === \"dbt\"),\n          t,\n        ),\n      ]);\n  }\n  async getDependenciesVersion() {\n    const e = [\"-m\", \"jupyter\", \"--version\"],\n      { stdout: t, stderr: n } = await this.commandProcessExecutionFactory\n        .createCommandProcessExecution({\n          command: this.pythonEnvironment.pythonPath,\n          args: e,\n          cwd: p.getFirstWorkspacePath(),\n          envVars: this.pythonEnvironment.environmentVariables,\n        })\n        .completeWithTerminalOutput();\n    if (\n      !t.includes(\"Successfully installed\") &&\n      !t.includes(\"Requirement already satisfied\") &&\n      n\n    )\n      throw new Error(n);\n    const r = t.split(`\n`),\n      s = {};\n    return (\n      r.forEach((a) => {\n        const [i, l] = a.split(\":\").map((c) => c.trim());\n        i && l && (s[i] = l);\n      }),\n      s\n    );\n  }\n  async validateAndInstallNotebookDependencies() {\n    try {\n      if (await this.notebookDependenciesAreInstalled())\n        return (\n          this.dbtTerminal.log(\"Notebook dependencies are already installed.\"),\n          !0\n        );\n      if (\n        (await u.window.showInformationMessage(\n          \"You need [ipykernel](https://pypi.org/project/ipykernel/) and [jupyter_client](https://github.com/jupyter/jupyter_client) to use the notebook\",\n          \"Install\",\n          \"Cancel\",\n        )) !== \"Install\"\n      )\n        return (\n          this.telemetry.sendTelemetryEvent(\n            p.TelemetryEvents[\"Notebook/DependenciesInstallCancelled\"],\n          ),\n          !1\n        );\n      (await u.window.withProgress(\n        {\n          title: \"Installing required dependencies...\",\n          location: u.ProgressLocation.Notification,\n          cancellable: !1,\n        },\n        async () => {\n          try {\n            const n = [\n                \"-m\",\n                \"pip\",\n                \"install\",\n                \"ipykernel\",\n                \"jupyter_client\",\n                \"jupyter_contrib_nbextensions\",\n                \"ipywidgets\",\n              ],\n              { stdout: r, stderr: s } =\n                await this.commandProcessExecutionFactory\n                  .createCommandProcessExecution({\n                    command: this.pythonEnvironment.pythonPath,\n                    args: n,\n                    cwd: p.getFirstWorkspacePath(),\n                    envVars: this.pythonEnvironment.environmentVariables,\n                  })\n                  .completeWithTerminalOutput();\n            if (\n              !r.includes(\"Successfully installed\") &&\n              !r.includes(\"Requirement already satisfied\") &&\n              s\n            )\n              throw new Error(s);\n            return (\n              this.dbtTerminal.log(\n                \"Notebook dependencies have been installed successfully.\",\n              ),\n              this.telemetry.sendTelemetryEvent(\n                p.TelemetryEvents[\"Notebook/DependenciesInstalled\"],\n              ),\n              !0\n            );\n          } catch (n) {\n            return (\n              this.telemetry.sendTelemetryError(\n                p.TelemetryEvents[\"Notebook/DependenciesInstallError\"],\n                n,\n              ),\n              u.window.showErrorMessage(\n                p.extendErrorWithSupportLinks(n.message),\n              ),\n              !1\n            );\n          }\n        },\n      )) &&\n        (await u.window.showInformationMessage(\n          \"Notebook dependencies installed. Please reload the window to use the notebook.\",\n          \"Reload Window\",\n        )) === \"Reload Window\" &&\n        u.commands.executeCommand(\"workbench.action.reloadWindow\");\n    } catch (e) {\n      throw (\n        (this.dbtTerminal.error(\n          p.TelemetryEvents[\"Notebook/DependenciesInstallError\"],\n          e.message,\n          e,\n        ),\n        e)\n      );\n    }\n  }\n  async notebookDependenciesAreInstalled() {\n    try {\n      const e =\n          this.commandProcessExecutionFactory.createCommandProcessExecution({\n            command: this.pythonEnvironment.pythonPath,\n            args: [\"-c\", \"import jupyter_client\"],\n            cwd: p.getFirstWorkspacePath(),\n            envVars: this.pythonEnvironment.environmentVariables,\n          }),\n        { stderr: t } = await e.complete();\n      if (t) throw new Error(t);\n      return !0;\n    } catch {\n      return !1;\n    }\n  }\n};\nexports.NotebookDependencies = L(\n  [\n    $(0, p.inject(\"DBTTerminal\")),\n    q(\"design:paramtypes\", [\n      p.DBTTerminal,\n      p.TelemetryService,\n      p.CommandProcessExecutionFactory,\n      p.PythonEnvironment,\n    ]),\n  ],\n  exports.NotebookDependencies,\n);\nexports.ClientMapper = class {\n  constructor(e, t, n) {\n    Object.defineProperty(this, \"executionInfrastructure\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: e,\n    }),\n      Object.defineProperty(this, \"notebookDependencies\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: t,\n      }),\n      Object.defineProperty(this, \"dbtTerminal\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: n,\n      }),\n      Object.defineProperty(this, \"clientMap\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: new Map(),\n      });\n  }\n  async initializeNotebookClient(e) {\n    if (!this.clientMap.has(e.fsPath)) {\n      this.dbtTerminal.debug(\n        \"ClientMapper\",\n        \"initializing notebook client\",\n        e.fsPath,\n      );\n      const t = new M(\n        e.fsPath,\n        this.executionInfrastructure,\n        this.notebookDependencies,\n        this.dbtTerminal,\n      );\n      this.clientMap.set(\n        e.fsPath,\n        new Promise((n) => {\n          t.getKernel().then(() => n(t));\n        }),\n      );\n    }\n    return this.clientMap.get(e.fsPath);\n  }\n  getNotebookClient(e) {\n    if (!this.clientMap.has(e.fsPath))\n      throw new Error(\"Notebook client not initialized\");\n    return this.clientMap.get(e.fsPath);\n  }\n};\nexports.ClientMapper = L(\n  [\n    $(2, p.inject(\"DBTTerminal\")),\n    q(\"design:paramtypes\", [\n      p.DBTCommandExecutionInfrastructure,\n      exports.NotebookDependencies,\n      p.DBTTerminal,\n    ]),\n  ],\n  exports.ClientMapper,\n);\nconst Ve = [\"python\", \"sql\", \"jinja-sql\"],\n  ze = \"jinja-sql\",\n  ue = \".notebook\",\n  ce = \"datapilot\",\n  A = \"datapilot-notebook\",\n  Ge = require(\"path\");\nexports.DatapilotNotebookController = class {\n  constructor(e, t, n, r, s, a) {\n    Object.defineProperty(this, \"clientMapper\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: e,\n    }),\n      Object.defineProperty(this, \"queryManifestService\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: t,\n      }),\n      Object.defineProperty(this, \"telemetry\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: n,\n      }),\n      Object.defineProperty(this, \"dbtTerminal\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: r,\n      }),\n      Object.defineProperty(this, \"notebookDependencies\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: s,\n      }),\n      Object.defineProperty(this, \"altimate\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: a,\n      }),\n      Object.defineProperty(this, \"id\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: \"DatapilotNotebookController\",\n      }),\n      Object.defineProperty(this, \"label\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: \"Datapilot\",\n      }),\n      Object.defineProperty(this, \"_onNotebookCellEvent\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: new u.EventEmitter(),\n      }),\n      Object.defineProperty(this, \"onNotebookCellChangeEvent\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: this._onNotebookCellEvent.event,\n      }),\n      Object.defineProperty(this, \"disposables\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: [this._onNotebookCellEvent],\n      }),\n      Object.defineProperty(this, \"associatedNotebooks\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: new Set(),\n      }),\n      Object.defineProperty(this, \"executionOrder\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: 0,\n      }),\n      Object.defineProperty(this, \"controller\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: void 0,\n      }),\n      Object.defineProperty(this, \"getRandomString\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: () => (Math.random() + 1).toString(36).substring(7),\n      }),\n      (this.controller = u.notebooks.createNotebookController(\n        this.id,\n        A,\n        this.label,\n      )),\n      (this.controller.supportedLanguages = Ve),\n      (this.controller.supportsExecutionOrder = !0),\n      (this.controller.executeHandler = this._executeAll.bind(this)),\n      this.disposables.push(\n        u.workspace.onDidChangeNotebookDocument((i) => {\n          i.contentChanges.forEach(async (l) => {\n            l.addedCells &&\n              (await this.updateCellId(i.notebook.getCells(), i.notebook)),\n              l.removedCells &&\n                l.removedCells.forEach((c) => {\n                  this._onNotebookCellEvent.fire({\n                    cellId: c.metadata.cellId,\n                    notebook: i.notebook.uri.fsPath,\n                    result: void 0,\n                    event: \"delete\",\n                    fragment: c.document.uri.fragment,\n                    languageId: c.document.languageId,\n                  });\n                });\n          });\n        }),\n      ),\n      this.disposables.push(this.controller),\n      this.controller.onDidChangeSelectedNotebooks(\n        this.onDidChangeSelectedNotebooks,\n        this,\n        this.disposables,\n      ),\n      this.disposables.push(\n        u.workspace.onDidOpenNotebookDocument(async (i) => {\n          await this.onNotebookOpen(i);\n        }),\n      ),\n      this.disposables.push(\n        u.workspace.onDidCloseNotebookDocument(async (i) => {\n          await this.onNotebookClose(i);\n        }),\n      );\n  }\n  async getNotebookByTemplate(e) {\n    var n;\n    return (\n      this.dbtTerminal.debug(\"Notebook\", \"getting notebook by template\", e),\n      e\n        ? (n = (await this.altimate.getPreConfiguredNotebooks()).find(\n            (r) => r.name === e,\n          )) == null\n          ? void 0\n          : n.data\n        : (this.dbtTerminal.debug(\"Notebook\", \"sending blank notebook\"),\n          {\n            cells: [\n              {\n                cell_type: u.NotebookCellKind.Markup,\n                source: [\n                  \"### Welcome to your new dbt Power User Notebook!\",\n                  \"> Note: Remember, you can delete any or all of these example cells to start fresh with your own work. Enjoy exploring and analyzing your data!\",\n                  \"#### Documentation and Feedback\",\n                  \"For more detailed information on how to use this notebook and the dbt Power User extension, please refer to our documentation:\",\n                  \"[dbt Power User Documentation](https://docs.myaltimate.com/govern/notebooks/)\",\n                  \"  \",\n                  \"We value your feedback! If you have any suggestions, encounter issues, or want to share your experience, please let us know:\",\n                  \"[Share Feedback](https://docs.google.com/forms/d/e/1FAIpQLScwN3wRTAniQzvcO6Hn3jC0WtBoFE2NP4X_6qGQ09IZKZ3Ojw/viewform?usp=sf_link)\",\n                  \"  \",\n                  \"Happy analyzing with your new dbt Power User Notebook!\",\n                  \"  \",\n                  \"This notebook allows you to combine Jinja SQL queries, Python code, and Markdown text. Let's explore each of these features.\",\n                  \"##### 1. Jinja SQL Queries\",\n                  \"You can write and execute Jinja SQL queries directly in this notebook. Here's an example:\",\n                ],\n                languageId: \"markdown\",\n                metadata: {},\n              },\n              {\n                cell_type: u.NotebookCellKind.Code,\n                source: [\n                  \"select * from {{ ref('your_model_name') }}\",\n                  \"{# Replace 'your_model_name' with the name of your dbt model. #}\",\n                ],\n                languageId: ze,\n                metadata: { cellId: \"jinja_sql_0\" },\n              },\n              {\n                cell_type: u.NotebookCellKind.Markup,\n                source: [\n                  \"##### 2. Python Code\",\n                  \"You can also write and execute Python code on top of the results of previous `jinja-sql` cell in this notebook. Here's a simple example:\",\n                ],\n                languageId: \"markdown\",\n                metadata: {},\n              },\n              {\n                cell_type: u.NotebookCellKind.Code,\n                source: [\n                  \"import pandas as pd\",\n                  \"from IPython.display import display, HTML\",\n                  \"from ydata_profiling import ProfileReport\",\n                  \"from io import StringIO\",\n                  \"\",\n                  \"# Extract the data field\",\n                  \"# NOTE: we use the cell id from previous cell to extract the data\",\n                  \"data = cell_jinja_sql_0['data']\",\n                  \"\",\n                  \"# Create a DataFrame\",\n                  \"df = pd.DataFrame(data)\",\n                  \"\",\n                  \"# Display the DataFrame\",\n                  \"# display(HTML(df.to_html()))\",\n                  \"\",\n                  'profile = ProfileReport(df, title=\"Profiling Report\")',\n                  \"profile.to_notebook_iframe()\",\n                ],\n                languageId: \"python\",\n                metadata: {},\n              },\n              {\n                cell_type: u.NotebookCellKind.Markup,\n                source: [\n                  \"This Python code creates a profile report of your query results. You can customize the code to suit your needs.\",\n                  \"##### 3. Markdown Text\",\n                  \"As you can see, you can use Markdown to structure your notebook with headings, lists, and more. You can also use it to add explanations and documentation to your queries and code.\",\n                  \"##### Tips for Using This Notebook\",\n                  \"- Use Jinja cells for your dbt model queries and data exploration\",\n                  \"- Use Python cells for data analysis, visualization, and custom transformations. The jinja data can be referenced using the cell id\",\n                  \"- Use Markdown cells to explain your process, document your findings, and create a narrative for your analysis\",\n                ],\n                languageId: \"markdown\",\n                metadata: {},\n              },\n            ],\n          })\n    );\n  }\n  async modelTestSuggestions(e) {\n    this.dbtTerminal.log(\"modelTestSuggestions\", e);\n  }\n  async generateDbtSourceYaml(e) {\n    this.dbtTerminal.log(\"generateDbtSourceYaml\", e);\n  }\n  async generateDbtDbtModelSql(e) {\n    this.dbtTerminal.log(\"generateDbtDbtModelSql\", e);\n  }\n  async generateDbtDbtModelYaml(e) {\n    this.dbtTerminal.log(\"generateDbtDbtModelYaml\", e);\n  }\n  async generateDbtDbtModelCTE(e) {\n    this.dbtTerminal.log(\"generateDbtDbtModelCTE\", e);\n  }\n  async extractExposuresFromMetabase(e) {\n    this.dbtTerminal.log(\"extractExposuresFromMetabase\", e);\n  }\n  async extractExposuresFromTableau(e) {\n    this.dbtTerminal.log(\"extractExposuresFromTableau\", e);\n  }\n  async getFileName(e, t) {\n    if (e) return e;\n    const n = fe();\n    if (\n      (\n        await this.altimate.addNotebook({\n          name: n,\n          description: \"\",\n          data: t\n            ? { ...t, metadata: { ...(t.metadata || {}), isDraft: !0 } }\n            : {},\n          tags_list: [],\n        })\n      ).ok &&\n      (await this.altimate.getNotebooks(n)).length > 0\n    )\n      return n;\n  }\n  async createNotebook(e) {\n    var a;\n    const {\n      notebookId: t,\n      template: n,\n      context: r = {},\n      notebookSchema: s,\n    } = e || {};\n    if (\n      (this.dbtTerminal.info(\n        p.TelemetryEvents[\"Notebook/Launch\"],\n        \"creating notebook\",\n        !0,\n        e,\n      ),\n      !r.model &&\n        (a = u.window.activeTextEditor) != null &&\n        a.document.uri.fsPath.endsWith(\".sql\"))\n    ) {\n      const i = Ge.basename(\n          u.window.activeTextEditor.document.uri.fsPath,\n          \".sql\",\n        ),\n        l = u.window.activeTextEditor.document.getText();\n      (r.model = i), (r.query = l);\n    }\n    u.window.withProgress(\n      {\n        location: u.ProgressLocation.Notification,\n        title: \"Launching notebook...\",\n        cancellable: !1,\n      },\n      async () => {\n        var i;\n        try {\n          const l = s || (t ? null : await this.getNotebookByTemplate(n)),\n            c = await this.queryManifestService.getOrPickProjectFromWorkspace();\n          if (!c) {\n            u.window.showErrorMessage(\"No dbt project selected.\");\n            return;\n          }\n          if (\n            ((i = l == null ? void 0 : l.metadata) != null &&\n              i.dependencies &&\n              (await this.notebookDependencies.verifyAndInstallDependenciesIfNeeded(\n                l.metadata.dependencies,\n                c,\n              )),\n            r && l)\n          )\n            for (const d in r)\n              Object.prototype.hasOwnProperty.call(r, d) &&\n                typeof r[d] == \"string\" &&\n                (l.cells[0].source = l.cells[0].source.map((y) =>\n                  y.replace(`%_${d}_%`, r[d]),\n                ));\n          const m = await this.getFileName(t, l),\n            h = u.Uri.parse(`${c.projectRoot}/${m}${ue}`).with({ scheme: ce });\n          this.dbtTerminal.debug(\"Notebook\", \"opening notebook\", h);\n          const b = await u.workspace.openNotebookDocument(h);\n          await u.window.showNotebookDocument(b);\n        } catch (l) {\n          const c =\n            l instanceof ie.PythonException ? l.exception.message : l.message;\n          this.dbtTerminal.error(\n            `${p.TelemetryEvents[\"Notebook/LaunchError\"]}`,\n            c,\n            l,\n          ),\n            u.window.showErrorMessage(p.extendErrorWithSupportLinks(c));\n        }\n      },\n    );\n  }\n  sendMessageToPreloadScript(e) {}\n  genUniqueId(e) {\n    return `${e.document.languageId.replace(/-/g, \"_\")}_${this.getRandomString()}`;\n  }\n  async updateCellId(e, t) {\n    if (\n      !!!u.window.visibleNotebookEditors.find(\n        (s) => s.notebook.uri.fsPath === t.uri.fsPath,\n      )\n    )\n      return;\n    const r = [];\n    if (\n      (e.forEach((s) => {\n        let a = s.metadata.cellId;\n        if (!a) {\n          a = this.genUniqueId(s);\n          const i = { ...s.metadata, cellId: a },\n            l = u.NotebookEdit.updateCellMetadata(s.index, i);\n          r.push(l);\n        }\n        this._onNotebookCellEvent.fire({\n          cellId: a,\n          notebook: t.uri.fsPath,\n          event: \"update\",\n          fragment: s.document.uri.fragment,\n          languageId: s.document.languageId,\n        });\n      }),\n      r.length > 0)\n    ) {\n      const s = new u.WorkspaceEdit();\n      s.set(t.uri, r), await u.workspace.applyEdit(s);\n    }\n  }\n  async onNotebookClose(e) {\n    if (e.notebookType !== A) return;\n    const t = await this.clientMapper.getNotebookClient(e.uri);\n    t && t.dispose(),\n      this.dbtTerminal.debug(\n        \"Notebookcontroller\",\n        `notebook closed: ${e.uri.fsPath}`,\n        e.isUntitled,\n      ),\n      e.isUntitled && (await u.workspace.fs.delete(e.uri));\n  }\n  async onDidChangeSelectedNotebooks({ notebook: e, selected: t }) {\n    this.dbtTerminal.debug(\n      \"Notebookcontroller\",\n      `notebook controller selected: ${e.uri.fsPath}`,\n      t,\n    );\n    const n = e.uri.toString();\n    t ? this.associatedNotebooks.add(n) : this.associatedNotebooks.delete(n);\n  }\n  async onNotebookOpen(e) {\n    var s;\n    if (e.notebookType !== A) return;\n    this.controller.updateNotebookAffinity(\n      e,\n      u.NotebookControllerAffinity.Default,\n    ),\n      this.dbtTerminal.debug(\n        \"Notebookcontroller\",\n        `notebook open and controller associated: ${e.uri.fsPath}`,\n      );\n    const t = await this.clientMapper.initializeNotebookClient(e.uri),\n      n = await t.getKernel();\n    if (!(n != null && n.realKernel))\n      throw new Error(\"Unable to initialize kernel\");\n    this.disposables.push(\n      t.postMessage((a) => {\n        this.sendMessageToPreloadScript(a);\n      }, this),\n    );\n    const r = e.getCells();\n    await this.updateCellId(r, e);\n    try {\n      await this.waitForControllerAssociation(e);\n    } catch {\n      this.dbtTerminal.warn(\n        \"Notebookcontroller\",\n        `Controller association timeout for ${e.uri.fsPath}. Proceeding anyway.`,\n      ),\n        this.associatedNotebooks.add(e.uri.toString());\n    }\n    (s = e.metadata) != null &&\n      s.autoRun &&\n      (await this._executeAll(e.getCells(), e, this.controller));\n  }\n  async waitForControllerAssociation(e, t = 2e3) {\n    const n = Date.now();\n    for (; !this.isControllerAssociatedWithNotebook(e); ) {\n      if (Date.now() - n > t)\n        throw new Error(\"Timeout waiting for controller association\");\n      await new Promise((r) => setTimeout(r, 500));\n    }\n  }\n  isControllerAssociatedWithNotebook(e) {\n    return this.associatedNotebooks.has(e.uri.toString());\n  }\n  dispose() {\n    this.disposables.forEach((e) => e.dispose());\n  }\n  async _executeAll(e, t, n) {\n    var a, i;\n    const r = await this.queryManifestService.getOrPickProjectFromWorkspace();\n    if (!r) {\n      u.window.showErrorMessage(\"No dbt project selected.\");\n      return;\n    }\n    (a = t.metadata) != null &&\n      a.dependencies &&\n      (await this.notebookDependencies.verifyAndInstallDependenciesIfNeeded(\n        t.metadata.dependencies,\n        r,\n      ));\n    const s = await this.clientMapper.getNotebookClient(t.uri);\n    await this.updateContextVariablesInKernel(r, s, e[0]);\n    for (const l of e)\n      await this._doExecution(\n        l,\n        t,\n        (i = t.metadata) == null ? void 0 : i.isUserNotebook,\n        n,\n        r,\n        s,\n      );\n  }\n  filterIPyWidgets(e, t = !1) {\n    return e.map((n) => {\n      const s = n.items.find(\n        (a) => a.mime === \"application/vnd.jupyter.widget-view+json\",\n      )\n        ? t\n          ? [u.NotebookCellOutputItem.text(\"IPyWidgets not supported\")]\n          : []\n        : n.items;\n      return new u.NotebookCellOutput(s);\n    });\n  }\n  updateContextVariablesInKernel(e, t, n) {\n    return t.executePython(\n      `\nmanifest_path=\"${e.getManifestPath()}\"\nproject_name=\"${e.getProjectName()}\"\n            `,\n      n,\n      () => {},\n    );\n  }\n  async _doExecution(e, t, n, r, s, a) {\n    this.dbtTerminal.debug(\"Notebook\", \"executing cell\", e.index, t.uri.fsPath);\n    let i;\n    try {\n      const l = [];\n      switch (\n        ((i = r.createNotebookCellExecution(e)),\n        (i.executionOrder = ++this.executionOrder),\n        i.start(Date.now()),\n        i.token.onCancellationRequested((c) => {\n          i == null || i.end(!0, Date.now());\n        }),\n        i.clearOutput(),\n        e.document.languageId)\n      ) {\n        case \"markdown\":\n          break;\n        case \"python\":\n          {\n            this.telemetry.startTelemetryEvent(\n              p.TelemetryEvents[\"Notebook/Execute\"],\n              { language: e.document.languageId },\n            );\n            const c = await (a == null\n              ? void 0\n              : a.executePython(e.document.getText(), e, (m) => {\n                  i == null || i.appendOutput(this.filterIPyWidgets([m], n));\n                }));\n            c && i.appendOutput(this.filterIPyWidgets(c, n));\n          }\n          break;\n        case \"jinja-sql\":\n        case \"sql\":\n          {\n            this.dbtTerminal.debug(\n              \"Notebook\",\n              \"executing sql\",\n              e.document.getText(),\n            ),\n              this.telemetry.startTelemetryEvent(\n                p.TelemetryEvents[\"Notebook/Execute\"],\n                { language: e.document.languageId },\n              );\n            const { metadata: c } = e;\n            if ((c == null ? void 0 : c.execution_type) === \"compile\") {\n              const m = await s.unsafeCompileQuery(e.document.getText());\n              i.appendOutput(\n                new u.NotebookCellOutput([\n                  u.NotebookCellOutputItem.text(\n                    m,\n                    c == null ? void 0 : c.output_mime_type,\n                  ),\n                ]),\n              );\n            } else {\n              const m = await s.executeSQL(e.document.getText(), \"\", !0);\n              this._onNotebookCellEvent.fire({\n                cellId: e.metadata.cellId,\n                notebook: t.uri.fsPath,\n                result: m,\n                event: \"add\",\n                languageId: e.document.languageId,\n              }),\n                n ||\n                  (l.push(\n                    u.NotebookCellOutputItem.json(\n                      m,\n                      \"application/perspective-json\",\n                    ),\n                  ),\n                  i.appendOutput(new u.NotebookCellOutput(l))),\n                await a.storeDataInKernel(e.metadata.cellId, m);\n            }\n          }\n          break;\n        default:\n          u.window.showErrorMessage(\n            `Language: ${e.document.languageId} not supported`,\n          );\n          break;\n      }\n      this.telemetry.endTelemetryEvent(p.TelemetryEvents[\"Notebook/Execute\"], {\n        language: e.document.languageId,\n      }),\n        i.end(!0, Date.now());\n    } catch (l) {\n      this.dbtTerminal.error(\n        \"Notebook\",\n        `Error executing cell: ${l.message}`,\n        l,\n        !1,\n      ),\n        i == null ||\n          i.replaceOutput([\n            new u.NotebookCellOutput([u.NotebookCellOutputItem.error(l)]),\n          ]),\n        this.telemetry.endTelemetryEvent(\n          p.TelemetryEvents[\"Notebook/Execute\"],\n          l,\n          { language: e.document.languageId },\n        ),\n        i == null || i.end(!1, Date.now());\n    }\n  }\n};\nexports.DatapilotNotebookController = L(\n  [\n    $(3, p.inject(\"DBTTerminal\")),\n    q(\"design:paramtypes\", [\n      exports.ClientMapper,\n      p.QueryManifestService,\n      p.TelemetryService,\n      p.DBTTerminal,\n      exports.NotebookDependencies,\n      p.AltimateRequest,\n    ]),\n  ],\n  exports.DatapilotNotebookController,\n);\nclass He {\n  constructor() {\n    Object.defineProperty(this, \"_disposables\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: [],\n    });\n  }\n  dispose() {\n    this._disposables.forEach((e) => e.dispose());\n  }\n  provideCellStatusBarItems(e) {\n    if (e.document.languageId !== \"jinja-sql\") return;\n    const t = new u.NotebookCellStatusBarItem(\n      \"$(globe) Profile your query\",\n      u.NotebookCellStatusBarAlignment.Left,\n    );\n    return (\n      (t.command = \"dbtPowerUser.datapilotProfileYourQuery\"),\n      (t.tooltip = \"Profile your query\"),\n      []\n    );\n  }\n}\nconst ae = require(\"path\");\nexports.NotebookFileSystemProvider = class {\n  constructor(e, t) {\n    Object.defineProperty(this, \"dbtTerminal\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: e,\n    }),\n      Object.defineProperty(this, \"altimate\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: t,\n      }),\n      Object.defineProperty(this, \"_emitter\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: new u.EventEmitter(),\n      }),\n      Object.defineProperty(this, \"onDidChangeFile\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: this._emitter.event,\n      }),\n      Object.defineProperty(this, \"notebookDataMap\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: new Map(),\n      });\n  }\n  watch(e, t) {\n    return new u.Disposable(() => {});\n  }\n  stat(e) {\n    return {\n      type: u.FileType.File,\n      ctime: Date.now(),\n      mtime: Date.now(),\n      size: 0,\n    };\n  }\n  readDirectory(e) {\n    return [];\n  }\n  createDirectory(e) {}\n  async getNotebookData(e) {\n    if (this.notebookDataMap.has(e)) return this.notebookDataMap.get(e);\n    const t = (await this.altimate.getNotebooks(e)) || [];\n    return t.length ? t[0] : null;\n  }\n  async readFile(e) {\n    const t = this.getFileNameFromUri(e),\n      n = await this.getNotebookData(t),\n      r = (n == null ? void 0 : n.data) || {};\n    return (\n      \"cells\" in r &&\n        \"metadata\" in r &&\n        (r.metadata\n          ? (r.metadata = { ...r.metadata, id: n == null ? void 0 : n.id })\n          : (r.metadata = { id: n == null ? void 0 : n.id })),\n      n && this.notebookDataMap.set(t, n),\n      new TextEncoder().encode(JSON.stringify(r))\n    );\n  }\n  async writeFile(e, t, n) {\n    await this.customSave(e, t);\n  }\n  delete(e, t) {\n    const n = e.with({ path: ae.posix.dirname(e.path) });\n    this._emitter.fire([\n      { type: u.FileChangeType.Changed, uri: n },\n      { uri: e, type: u.FileChangeType.Deleted },\n    ]);\n  }\n  rename(e, t, n) {\n    this._emitter.fire([\n      { type: u.FileChangeType.Deleted, uri: e },\n      { type: u.FileChangeType.Created, uri: t },\n    ]);\n  }\n  getFileNameFromUri(e) {\n    return ae.basename(e.fsPath, ue);\n  }\n  async customSave(e, t) {\n    var n;\n    try {\n      console.log(\"custom save\", e, new TextDecoder().decode(t));\n      const r =\n        (n = u.window.activeNotebookEditor) == null ? void 0 : n.notebook;\n      if (!r)\n        return (\n          this.dbtTerminal.warn(\n            p.TelemetryEvents[\"Notebook/SaveError\"],\n            \"No active notebook found\",\n          ),\n          !1\n        );\n      this.dbtTerminal.log(\"saving notebook\", r);\n      const { name: s } = r.metadata;\n      return (\n        await this.saveNotebook(r, s),\n        this._emitter.fire([{ type: u.FileChangeType.Changed, uri: e }]),\n        !0\n      );\n    } catch (r) {\n      this.dbtTerminal.error(\n        p.TelemetryEvents[\"Notebook/SaveError\"],\n        r.message,\n        r,\n      ),\n        u.window.showErrorMessage(\n          p.extendErrorWithSupportLinks(\n            `Failed to save notebook. Error: ${r.message}`,\n          ),\n        );\n    }\n    return !1;\n  }\n  async saveNotebook(e, t) {\n    try {\n      const n = Z(e, t);\n      this.dbtTerminal.log(\"saving notebook\", t, n),\n        await this.altimate.updateNotebook(e.metadata.id, {\n          name: t,\n          description: \"\",\n          data: n,\n          tags_list: [],\n        }),\n        this.dbtTerminal.log(\"notebook saved\", t, n);\n      const r = this.getFileNameFromUri(e.uri),\n        s = this.notebookDataMap.get(r);\n      return s && ((s.data = Z(e, t, !0)), this.notebookDataMap.set(r, s)), n;\n    } catch (n) {\n      this.dbtTerminal.error(\n        p.TelemetryEvents[\"Notebook/SaveError\"],\n        n.message,\n        n,\n      ),\n        u.window.showErrorMessage(\n          p.extendErrorWithSupportLinks(\n            `Failed to save notebook. Error: ${n.message}`,\n          ),\n        );\n    }\n  }\n};\nexports.NotebookFileSystemProvider = L(\n  [\n    $(0, p.inject(\"DBTTerminal\")),\n    q(\"design:paramtypes\", [p.DBTTerminal, p.AltimateRequest]),\n  ],\n  exports.NotebookFileSystemProvider,\n);\nclass Ye {\n  constructor(e) {\n    Object.defineProperty(this, \"notebookKernel\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: e,\n    }),\n      Object.defineProperty(this, \"disposables\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: [],\n      }),\n      Object.defineProperty(this, \"cellByNotebookAutocompleteMap\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: new Map(),\n      }),\n      this.disposables.push(\n        this.notebookKernel.onNotebookCellChangeEvent((t) => {\n          this.onNotebookCellChanged(t);\n        }),\n      );\n  }\n  dispose() {\n    for (; this.disposables.length; ) {\n      const e = this.disposables.pop();\n      e && e.dispose();\n    }\n  }\n  getCellByNotebookAutocompleteMap() {\n    return this.cellByNotebookAutocompleteMap;\n  }\n  onNotebookCellChanged(e) {\n    if (!e.fragment) return;\n    const t = {\n        cellId: e.cellId,\n        fragment: e.fragment,\n        languageId: e.languageId,\n      },\n      n = this.cellByNotebookAutocompleteMap.get(e.notebook) || [];\n    switch (e.event) {\n      case \"add\":\n      case \"update\":\n        this.cellByNotebookAutocompleteMap.set(e.notebook, [\n          ...n.filter((r) => r.cellId !== e.cellId),\n          t,\n        ]);\n        break;\n      case \"delete\":\n        this.cellByNotebookAutocompleteMap.set(\n          e.notebook,\n          n.filter((r) => r.cellId !== e.cellId),\n        );\n        break;\n    }\n  }\n}\nconst Je = {\n  notebooks: [\n    {\n      name: \"Profile your query\",\n      description: \"Notebook to profile your query\",\n      created_at: new Date().toISOString(),\n      updated_at: new Date().toISOString(),\n      id: \"1\",\n      data: {\n        cells: [\n          {\n            cell_type: u.NotebookCellKind.Code,\n            source: [\"{{context.query}}\"],\n            languageId: \"jinja-sql\",\n            metadata: { cellId: \"jinja_sql_cu6pt\" },\n          },\n          {\n            cell_type: u.NotebookCellKind.Code,\n            source: [\n              \"import pandas as pd\",\n              \"from IPython.display import display, HTML\",\n              \"from ydata_profiling import ProfileReport\",\n              \"from io import StringIO\",\n              \"\",\n              \"# Extract the data field\",\n              \"data = cell_jinja_sql_cu6pt['data']\",\n              \"\",\n              \"# Create a DataFrame\",\n              \"df = pd.DataFrame(data)\",\n              \"\",\n              \"# Display the DataFrame\",\n              \"# display(HTML(df.to_html()))\",\n              \"\",\n              'profile = ProfileReport(df, title=\"Profiling Report\")',\n              \"profile.to_notebook_iframe()\",\n            ],\n            languageId: \"python\",\n            metadata: {},\n          },\n        ],\n        metadata: { dependencies: [\"pandas\", \"ydata_profiling\"], autoRun: !0 },\n      },\n      tags: [\"profile\"],\n    },\n  ],\n};\nexports.NotebookProviders = class {\n  constructor(e, t, n, r) {\n    Object.defineProperty(this, \"notebookProvider\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: e,\n    }),\n      Object.defineProperty(this, \"notebookController\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: t,\n      }),\n      Object.defineProperty(this, \"notebookFileSystemProvider\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: n,\n      }),\n      Object.defineProperty(this, \"dbtTerminal\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: r,\n      }),\n      Object.defineProperty(this, \"disposables\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: [],\n      }),\n      this.disposables.push(\n        u.workspace.onDidChangeConfiguration((s) => {\n          s.affectsConfiguration(\"dbt.enableNotebooks\") &&\n            this.bindNotebookActions();\n        }),\n      ),\n      this.bindNotebookActions();\n  }\n  bindNotebookActions() {\n    u.workspace.getConfiguration(\"dbt\").get(\"enableNotebooks\", !1) &&\n      (this.dbtTerminal.log(\"Notebooks enabled, binding actions\"),\n      this.disposables.push(\n        u.notebooks.registerNotebookCellStatusBarItemProvider(A, new He()),\n        u.workspace.registerNotebookSerializer(A, this.notebookProvider, {}),\n        this.notebookController,\n      ),\n      this.disposables.push(\n        u.workspace.registerFileSystemProvider(\n          ce,\n          this.notebookFileSystemProvider,\n          { isCaseSensitive: !0, isReadonly: !1 },\n        ),\n      ));\n  }\n  dispose() {\n    for (; this.disposables.length; ) {\n      const e = this.disposables.pop();\n      e && e.dispose();\n    }\n  }\n};\nexports.NotebookProviders = L(\n  [\n    $(3, p.inject(\"DBTTerminal\")),\n    q(\"design:paramtypes\", [\n      le,\n      exports.DatapilotNotebookController,\n      exports.NotebookFileSystemProvider,\n      p.DBTTerminal,\n    ]),\n  ],\n  exports.NotebookProviders,\n);\nconst F = (o) => (o === \"bigquery\" ? \"RAND\" : \"RANDOM\"),\n  R = async (o, e) => {\n    const t = await e(o);\n    return (t == null ? void 0 : t.data) || [];\n  },\n  W = (o, e, t) =>\n    o.filter((n) => !e.includes(n.column) && !t.includes(n.dtype)),\n  Qe = (o) => [\"timestamp\", \"date\"].includes(o.dtype.toLowerCase()),\n  Xe = (o) =>\n    [\n      \"char\",\n      \"character\",\n      \"varchar\",\n      \"string\",\n      \"text\",\n      \"nchar\",\n      \"nvarchar\",\n      \"variant\",\n      \"character varying\",\n      \"citext\",\n      \"name\",\n      \"json\",\n      \"jsonb\",\n      \"bstring\",\n      \"bpchar\",\n      \"tinytext\",\n      \"mediumtext\",\n      \"longtext\",\n      \"enum\",\n    ].includes(o.dtype.toLowerCase()),\n  Ze = (o) => {\n    const e = [\n        \"int\",\n        \"integer\",\n        \"bigint\",\n        \"smallint\",\n        \"tinyint\",\n        \"decimal\",\n        \"numeric\",\n        \"float\",\n        \"real\",\n        \"double\",\n        \"number\",\n      ],\n      t = o.dtype.toLowerCase();\n    return e.some((n) => t.includes(n));\n  },\n  D = (o) => Number(o),\n  B = (o = {}, e) => {\n    if (!o) return e || {};\n    if (!e) return o;\n    const t = {},\n      n = [...new Set([...Object.keys(o), ...Object.keys(e)])].filter((r) =>\n        [\"models\", \"sources\", \"seeds\"].includes(r),\n      );\n    for (const r of n) {\n      if (!o[r]) {\n        t[r] = e[r];\n        continue;\n      }\n      if (!e[r]) {\n        t[r] = o[r];\n        continue;\n      }\n      const s = o[r] || [],\n        a = e[r] || [],\n        i = new Map(s.map((h) => [h.name, h])),\n        l = new Map(a.map((h) => [h.name, h])),\n        m = [\n          ...new Set([...s.map((h) => h.name), ...a.map((h) => h.name)]),\n        ].map((h) => {\n          var f, N, _, T;\n          const b = i.get(h),\n            d = l.get(h),\n            y = [\n              ...((b == null ? void 0 : b.tests) || []),\n              ...((d == null ? void 0 : d.tests) || []),\n            ],\n            k = new Map(\n              ((f = b == null ? void 0 : b.columns) == null\n                ? void 0\n                : f.map((g) => [g.name, g])) || [],\n            ),\n            v = new Map(\n              ((N = d == null ? void 0 : d.columns) == null\n                ? void 0\n                : N.map((g) => [g.name, g])) || [],\n            ),\n            w = [\n              ...new Set([\n                ...(((_ = b == null ? void 0 : b.columns) == null\n                  ? void 0\n                  : _.map((g) => g.name)) || []),\n                ...(((T = d == null ? void 0 : d.columns) == null\n                  ? void 0\n                  : T.map((g) => g.name)) || []),\n              ]),\n            ].map((g) => {\n              const C = k.get(g),\n                S = v.get(g);\n              return C\n                ? S\n                  ? {\n                      ...C,\n                      ...S,\n                      name: g,\n                      tests: [...(C.tests || []), ...(S.tests || [])],\n                    }\n                  : C\n                : S;\n            }),\n            E = { name: h, columns: w };\n          return y.length > 0 && (E.tests = y), E;\n        });\n      t[r] = m;\n    }\n    return t;\n  };\nclass U {\n  constructor(e, t) {\n    Object.defineProperty(this, \"quote\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: void 0,\n    }),\n      Object.defineProperty(this, \"adapter\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: void 0,\n      }),\n      Object.defineProperty(this, \"queryFn\", {\n        enumerable: !0,\n        configurable: !0,\n        writable: !0,\n        value: void 0,\n      }),\n      (this.quote = (n, r) =>\n        r ? `adapter.quote('${n}')` : `{{adapter.quote('${n}')}}`),\n      (this.adapter = e),\n      (this.queryFn = t);\n  }\n}\nclass et extends U {\n  async generateRangeTests({\n    tableRelation: e,\n    excludeTypes: t,\n    excludeCols: n,\n    stddevs: r,\n    limit: s,\n    sample: a,\n    columnConfig: i,\n    resourceType: l,\n    dbtConfig: c,\n    columnsInRelation: m,\n  }) {\n    const b = W(m, n, t).filter((f) => Ze(f));\n    if (b.length === 0) return c;\n    let d = \"\";\n    s !== null &&\n      (a\n        ? (d = `ORDER BY ${F(this.adapter)}() LIMIT ${s}`)\n        : (d = `LIMIT ${s}`));\n    const y = b.map(\n        (f, N) =>\n          `SELECT '${f.column}' AS COLNAME, MIN(${this.quote(f.column)}) as COL_MIN, MAX(${this.quote(f.column)}) as COL_MAX, STDDEV(${this.quote(f.column)}) as COL_STDDEV, ${N + 1} AS ORDERING FROM base`,\n      ),\n      k = `\n            WITH base AS (\n                SELECT * FROM {{ref('${e}')}}\n                ${d}\n            )\n            SELECT * FROM (\n                ${y.join(`\nUNION ALL\n`)}\n            ) t1\n            ORDER BY ORDERING ASC\n        `,\n      O = (await R(k, this.queryFn)).map((f) => {\n        const N = D(f[1]),\n          _ = D(f[2]),\n          T = D(f[3]);\n        return {\n          ...{\n            name: f[0],\n            tests: [\n              {\n                \"dbt_utils.accepted_range\": {\n                  min_value: D(N - (r * T) / 2),\n                  max_value: D(_ + (r * T) / 2),\n                },\n              },\n            ],\n          },\n          ...i,\n        };\n      }),\n      w = { name: e, columns: O },\n      E = { [l]: [w] };\n    return B(c, E);\n  }\n}\nclass tt extends U {\n  getColumnCombinations(e, t) {\n    const n = [];\n    for (let r = 0; r < t; r++) n.push(...this.combinations(e, r + 1));\n    return n;\n  }\n  combinations(e, t) {\n    if (t === 0) return [[]];\n    if (e.length === 0) return [];\n    const [n, ...r] = e,\n      s = this.combinations(r, t),\n      a = this.combinations(r, t - 1).map((i) => [n, ...i]);\n    return [...s, ...a];\n  }\n  buildLimitStatement(e, t, n) {\n    return t === null ? \"\" : n ? `ORDER BY ${F(e)}() LIMIT ${t}` : `LIMIT ${t}`;\n  }\n  buildCountDistinctQuery(e, t, n) {\n    const r = e.map((s, a) => {\n      const i = s.map((l) => this.quote(l));\n      return `\n                SELECT ${a + 1} AS ORDERING, count(1) AS CARDINALITY\n                from (\n                    SELECT 1 FROM base\n                    GROUP BY ${i.join(\", \")}\n                ) t\n            `;\n    });\n    return `\n            WITH base AS (\n                SELECT * FROM {{ref('${t}')}}\n                ${n}\n            )\n            ${r.join(`\nUNION ALL\n`)}\n            ORDER BY ordering ASC\n        `;\n  }\n  async generateUniquenessTests({\n    tableRelation: e,\n    excludeTypes: t,\n    excludeCols: n,\n    compositeKeyLength: r,\n    limit: s,\n    sample: a,\n    columnConfig: i,\n    resourceType: l,\n    dbtConfig: c,\n    columnsInRelation: m,\n  }) {\n    const b = W(m, n, t).map((_) => _.column);\n    if (b.length === 0) return c;\n    const d = this.getColumnCombinations(b, r),\n      y = this.buildLimitStatement(this.adapter, s, a),\n      k = this.buildCountDistinctQuery(d, e, y),\n      O = (\n        await R(\n          `\n              WITH base AS (\n                  SELECT * FROM {{ref('${e}')}}\n                  ${y}\n              )\n              SELECT count(1) AS TABLE_COUNT FROM base\n          `,\n          this.queryFn,\n        )\n      )[0][0],\n      w = await R(k, this.queryFn),\n      E = d.filter((_, T) => w[T][1] === O),\n      f = { name: e, columns: [], tests: [] };\n    E.forEach((_) => {\n      _.length === 1\n        ? f.columns.push({ name: _[0], tests: [\"unique\", \"not_null\"], ...i })\n        : f.tests.push({\n            \"dbt_utils.unique_combination_of_columns\": {\n              combination_of_columns: _,\n            },\n          });\n    });\n    const N = { [l]: [f] };\n    return B(c, N);\n  }\n}\nclass nt extends U {\n  async getAcceptedValuesTestSuggestions({\n    tableRelation: e,\n    excludeTypes: t,\n    excludeCols: n,\n    limit: r,\n    sample: s,\n    columnConfig: a,\n    resourceType: i,\n    dbtConfig: l,\n    columnsInRelation: c,\n    maxCardinality: m = 5,\n  }) {\n    const h = (T, g) => {\n        switch (T) {\n          case \"bigquery\":\n            return `array_agg(CAST(${this.quote(g)} AS STRING))`;\n          case \"redshift\":\n            return `split_to_array(listagg(${this.quote(g)}::VARCHAR, '|'), '|') `;\n          case \"databricks\":\n            return `to_json(array_agg(CAST(${this.quote(g)} AS STRING)))`;\n          default:\n            return `array_agg(${this.quote(g)}::VARCHAR)`;\n        }\n      },\n      b = W(c, n, t);\n    if (b.length === 0) return l;\n    const d = b.map(\n        (T, g) => `\n            select ${g + 1} AS ORDERING,\n                '${T.column}' AS COLNAME,\n                count(1) as CARDINALITY,\n                ${h(this.adapter, T.column)} AS UNIQUE_VALUES\n            from (\n                select ${this.quote(T.column)}\n                from base\n                group by ${this.quote(T.column)}\n            ) t1\n        `,\n      ),\n      y = r\n        ? s\n          ? `ORDER BY ${F(this.adapter)}() LIMIT ${r}`\n          : `LIMIT ${r}`\n        : \"\",\n      k = `\n            WITH base AS (\n                SELECT * FROM {{ref('${e}')}}\n                ${y}\n            )\n            SELECT * FROM (\n                ${d.join(`\nUNION ALL\n`)}\n            ) t2\n            WHERE CARDINALITY <= ${m}\n            ORDER BY ORDERING ASC\n        `,\n      v = await this.queryFn(k);\n    if (!v) return l;\n    const { columnNames: O, data: w } = v,\n      E = O.indexOf(\"COLNAME\"),\n      f = O.indexOf(\"UNIQUE_VALUES\"),\n      N = w\n        .map((T) => {\n          const g = T[f];\n          if (!g) return null;\n          const C = typeof g == \"string\" ? JSON.parse(g) : g;\n          return {\n            name: T[E],\n            tests: [{ accepted_values: { values: C.sort() } }],\n            ...a,\n          };\n        })\n        .filter(Boolean),\n      _ = { [i]: [{ name: e, columns: N }] };\n    return B(l, _);\n  }\n}\nclass ot extends U {\n  async generateStringLengthTests({\n    tableRelation: e,\n    excludeTypes: t,\n    excludeCols: n,\n    stddevs: r,\n    limit: s,\n    sample: a,\n    columnConfig: i,\n    resourceType: l,\n    dbtConfig: c,\n    columnsInRelation: m,\n  }) {\n    const b = W(m, n, t).filter((f) => Xe(f));\n    if (b.length === 0) return c;\n    const d = s\n        ? a\n          ? `ORDER BY ${F(this.adapter)}() LIMIT ${s}`\n          : `LIMIT ${s}`\n        : \"\",\n      y = b.map(\n        (f, N) => `\n            SELECT '${f.column}' AS COLNAME,\n                MIN(LENGTH(CAST(${this.quote(f.column)} as varchar))) as COL_MIN,\n                MAX(LENGTH(CAST(${this.quote(f.column)} as varchar))) as COL_MAX,\n                STDDEV(LENGTH(CAST(${this.quote(f.column)} as varchar))) as COL_STDDEV,\n                ${N + 1} AS ORDERING\n            FROM base\n            WHERE ${this.quote(f.column)} IS NOT NULL\n        `,\n      ),\n      k = `\n            WITH base AS (\n                SELECT * FROM {{ref('${e}')}}\n                ${d}\n            )\n            SELECT * FROM (\n                ${y.join(`\nUNION ALL\n`)}\n            ) t1\n            ORDER BY ORDERING ASC\n        `,\n      O = (await R(k, this.queryFn)).map((f) => {\n        const [N, _, T, g] = f;\n        let C;\n        if (_ === T)\n          C = {\n            \"dbt_expectations.expect_column_value_lengths_to_equal\": {\n              value: _,\n              row_condition: `${this.quote(N)} is not null`,\n            },\n          };\n        else {\n          let S = _ - r * g;\n          const de = T + r * g;\n          S < 0 && (S = 0),\n            (C = {\n              \"dbt_expectations.expect_column_value_lengths_to_be_between\": {\n                min_value: Math.floor(S),\n                max_value: Math.ceil(de),\n                row_condition: `${this.quote(N)} is not null`,\n              },\n            });\n        }\n        return { name: N, tests: [C], ...i };\n      }),\n      w = { name: e, columns: O },\n      E = { [l]: [w] };\n    return B(c, E);\n  }\n}\nclass rt extends U {\n  async generateRecencyTests({\n    tableRelation: e,\n    excludeTypes: t,\n    excludeCols: n,\n    stddevs: r,\n    limit: s,\n    sample: a,\n    resourceType: i,\n    dbtConfig: l,\n    columnsInRelation: c,\n  }) {\n    const h = W(c, n, t).filter(Qe);\n    if (h.length === 0) return l;\n    const b = s\n        ? a\n          ? `ORDER BY ${F(this.adapter)}() LIMIT ${s}`\n          : `LIMIT ${s}`\n        : \"\",\n      d = `\n    WITH base AS (\n      SELECT * FROM {{ref('${e}')}}\n      ${b}\n    )\n    ${h.map(\n      (w, E) => `\n      SELECT \n        MAX(minutes_diff) AS max_minutes_diff,\n        AVG(minutes_diff) AS avg_minutes_diff,\n        STDDEV(minutes_diff) AS stddev_minutes_diff,\n        ${E + 1} AS ordering\n      FROM (\n      SELECT \n        {{ dbt.datediff(\"LAG(\"~${this.quote(w.column, !0)}~\", 1) OVER(ORDER BY \"~${this.quote(w.column, !0)}~\")\", ${this.quote(w.column, !0)}, \"minute\") }} AS minutes_diff\n            FROM  base\n      ) t2\n      WHERE minutes_diff <> 0\n    `,\n    ).join(`\nUNION ALL\n`)}\n    ORDER BY ordering ASC\n  `,\n      y = await R(d, this.queryFn),\n      k = h.map((w, E) => {\n        const [, f, N] = y[E],\n          _ = f + N * r;\n        let T, g;\n        return (\n          _ >= 60 * 24\n            ? ((T = \"day\"), (g = Math.floor(_ / (60 * 24))))\n            : _ >= 60\n              ? ((T = \"hour\"), (g = Math.floor(_ / 60)))\n              : ((T = \"minute\"), (g = Math.floor(_))),\n          { \"dbt_utils.recency\": { field: w.column, datepart: T, interval: g } }\n        );\n      }),\n      v = { name: e, ...(k.length > 0 && { tests: k }) },\n      O = { [i]: [v] };\n    return B(l, O);\n  }\n}\nconst st = async ({\n  tableRelation: o,\n  sample: e = !1,\n  limit: t = 1e4,\n  resourceType: n = \"models\",\n  columnConfig: r = {},\n  excludeTypes: s = [],\n  excludeCols: a = [],\n  tests: i = [\n    \"uniqueness\",\n    \"accepted_values\",\n    \"range\",\n    \"string_length\",\n    \"recency\",\n  ],\n  uniquenessCompositeKeyLength: l = 1,\n  acceptedValuesMaxCardinality: c = 5,\n  rangeStddevs: m = 0,\n  stringLengthStddevs: h = 0,\n  recencyStddevs: b = 1,\n  dbtConfig: d,\n  returnObject: y = !1,\n  columnsInRelation: k,\n  adapter: v,\n  queryFn: O,\n}) => {\n  console.log(\"testgen getTestSuggestions args\", {\n    tableRelation: o,\n    sample: e,\n    limit: t,\n    resourceType: n,\n    columnConfig: r,\n    excludeTypes: s,\n    excludeCols: a,\n    tests: i,\n    uniquenessCompositeKeyLength: l,\n    acceptedValuesMaxCardinality: c,\n    rangeStddevs: m,\n    stringLengthStddevs: h,\n    recencyStddevs: b,\n    dbtConfig: d,\n    returnObject: y,\n    columnsInRelation: k,\n  });\n  let w = d;\n  return (\n    i.includes(\"uniqueness\") &&\n      (w = await new tt(v, O).generateUniquenessTests({\n        tableRelation: o,\n        excludeTypes: s,\n        excludeCols: a,\n        limit: t,\n        sample: e,\n        columnConfig: r,\n        resourceType: n,\n        dbtConfig: w,\n        columnsInRelation: k,\n        compositeKeyLength: l,\n      })),\n    i.includes(\"accepted_values\") &&\n      (w = await new nt(v, O).getAcceptedValuesTestSuggestions({\n        tableRelation: o,\n        excludeTypes: s,\n        excludeCols: a,\n        limit: t,\n        sample: e,\n        columnConfig: r,\n        resourceType: n,\n        dbtConfig: w,\n        columnsInRelation: k,\n        maxCardinality: c,\n      })),\n    i.includes(\"range\") &&\n      (w = await new et(v, O).generateRangeTests({\n        tableRelation: o,\n        excludeTypes: s,\n        excludeCols: a,\n        limit: t,\n        sample: e,\n        columnConfig: r,\n        resourceType: n,\n        dbtConfig: w,\n        columnsInRelation: k,\n        stddevs: m,\n      })),\n    i.includes(\"string_length\") &&\n      (w = await new ot(v, O).generateStringLengthTests({\n        tableRelation: o,\n        excludeTypes: s,\n        excludeCols: a,\n        limit: t,\n        sample: e,\n        columnConfig: r,\n        resourceType: n,\n        dbtConfig: w,\n        columnsInRelation: k,\n        stddevs: h,\n      })),\n    i.includes(\"recency\") &&\n      (w = await new rt(v, O).generateRecencyTests({\n        tableRelation: o,\n        excludeTypes: s,\n        excludeCols: a,\n        limit: t,\n        sample: e,\n        resourceType: n,\n        dbtConfig: w,\n        columnsInRelation: k,\n        stddevs: b,\n      })),\n    w\n  );\n};\nexports.CustomNotebooks = Je;\nexports.DatapilotNotebookSerializer = le;\nexports.NotebookKernelClient = M;\nexports.NotebookService = Ye;\nexports.getTestSuggestions = st;\n"
  },
  {
    "path": "src/mcp/index.ts",
    "content": "import { DBTTerminal } from \"@altimateai/dbt-integration\";\nimport { inject } from \"inversify\";\nimport { ConfigurationTarget, Disposable, extensions, workspace } from \"vscode\";\nimport { AltimateRequest } from \"../modules\";\nimport { AltimateAuthService } from \"../services/altimateAuthService\";\nimport { SharedStateService } from \"../services/sharedStateService\";\nimport { DbtPowerUserMcpServerTools } from \"./server\";\nimport { ToolRegistry } from \"./types\";\n\nexport class DbtPowerUserMcpServer implements Disposable {\n  private disposables: Disposable[] = [];\n  private mcpExtensionApi: ToolRegistry | undefined;\n\n  constructor(\n    private dbtPowerUserMcpServerTools: DbtPowerUserMcpServerTools,\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n    private altimate: AltimateRequest,\n    private eventEmitter: SharedStateService,\n    private altimateAuthService: AltimateAuthService,\n  ) {\n    workspace.onDidChangeConfiguration((event) => {\n      if (event.affectsConfiguration(\"altimate.onboardedMcpServer\")) {\n        this.registerToolsInMcpExtension();\n      }\n    });\n\n    this.disposables.push(\n      this.eventEmitter.eventEmitter.event((d) => {\n        if (d.command === \"dbtProjectsInitialized\") {\n          this.registerToolsInMcpExtension();\n        }\n      }),\n    );\n  }\n\n  async updateMcpExtensionApi() {\n    try {\n      const extension = extensions.getExtension(\n        \"altimateai.vscode-altimate-mcp-server\",\n      );\n\n      if (!extension) {\n        this.dbtTerminal.error(\n          \"DbtPowerUserMcpServer: enableMcpExtensionIntegration\",\n          \"Failed to install MCP extension\",\n          { message: \"Failed to install Altimate MCP Server extension\" },\n        );\n        return;\n      }\n\n      if (!extension.isActive) {\n        await extension.activate();\n      }\n      await extension.exports.ready;\n      this.mcpExtensionApi = extension.exports as ToolRegistry;\n\n      await this.mcpExtensionApi.addMcpIntegrationConfig([\n        {\n          title: \"Advanced Data Tools\",\n          description:\n            \"Enhance your experience with advanced data exploration features. By enabling this option, you allow data lookup queries to be processed and shared with Cursor. Features include:\\n• Query specific column values\\n• Execute SQL\\n• Previewing data structures\",\n          enableButton: \"Enable Advanced Features\",\n          disableButton: \"Disable Features\",\n          ide: [\"cursor\", \"vscode\"],\n          onCommandTrigger: async () => {\n            return await workspace\n              .getConfiguration(\"dbt\")\n              .update(\n                \"enableMcpDataSourceQueryTools\",\n                true,\n                ConfigurationTarget.Global,\n              );\n          },\n        },\n      ]);\n    } catch (error) {\n      this.dbtTerminal.error(\n        \"DbtPowerUserMcpServer:updateMcpExtensionApiError\",\n        \"Error updating MCP extension API\",\n        { message: (error as Error).message },\n      );\n    }\n  }\n\n  private async registerToolsInMcpExtension() {\n    if (!this.mcpExtensionApi) {\n      this.dbtTerminal.info(\n        \"DbtPowerUserMcpServer: registerToolsInMcpExtension\",\n        \"MCP extension API not found\",\n      );\n      return;\n    }\n    const onboardedAltimate = workspace\n      .getConfiguration(\"altimate\")\n      .get<boolean>(\"onboardedMcpServer\", false);\n    if (!onboardedAltimate) {\n      this.dbtTerminal.debug(\n        \"DbtPowerUserMcpServer\",\n        \"Onboarding not completed, skipping tools registration\",\n      );\n      return;\n    }\n\n    this.dbtTerminal.debug(\n      \"DbtPowerUserMcpServer\",\n      \"Onboarding completed, proceeding with tools registration\",\n    );\n    if (!this.altimateAuthService.handlePreviewFeatures()) {\n      this.dbtTerminal.info(\n        \"DbtPowerUserMcpServer: enableMcpExtensionIntegration\",\n        \"Preview features are not enabled, skipping MCP server start\",\n      );\n      return;\n    }\n\n    try {\n      const tools = this.dbtPowerUserMcpServerTools.getMcpTools();\n      await this.mcpExtensionApi.registerTools(tools);\n    } catch (error) {\n      this.dbtTerminal.error(\n        \"DbtPowerUserMcpServer:registerToolsInMcpExtensionError\",\n        \"Error registering tools in MCP extension\",\n        { message: (error as Error).message },\n      );\n    }\n  }\n\n  dispose() {\n    this.disposables.forEach((disposable) => disposable.dispose());\n  }\n}\n"
  },
  {
    "path": "src/mcp/server.ts",
    "content": "import { CommandProcessResult } from \"@altimateai/dbt-integration\";\nimport { ToolSchema } from \"@modelcontextprotocol/sdk/types.js\";\nimport { inject } from \"inversify\";\nimport { Disposable, Uri, workspace } from \"vscode\";\nimport { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport { z as z4 } from \"zod/v4\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { DBTProject, DBTTerminal } from \"../modules\";\nimport { McpTool } from \"./types\";\n\nconst ToolInputSchema = ToolSchema.shape.inputSchema;\ntype ToolInput = z4.infer<typeof ToolInputSchema>;\n\n/** Convert Zod schema to JSON Schema without `$schema` meta-field.\n *  The default `jsonSchema7` target includes `\"$schema\": \"http://json-schema.org/draft-07/schema#\"`\n *  which Gemini's tool-calling API rejects as an unsupported property. Using `openApi3`\n *  produces an identical schema structure minus the `$schema` field.  */\nconst zodToJsonSchemaAny = zodToJsonSchema as (\n  schema: unknown,\n  options?: unknown,\n) => unknown;\nfunction toToolInput(schema: z.ZodSchema<unknown>): ToolInput {\n  return zodToJsonSchemaAny(schema, { target: \"openApi3\" }) as ToolInput;\n}\n\nconst BaseSchema = z.object({});\nconst BaseProjectRootSchema = BaseSchema.extend({ projectRoot: z.string() });\nconst GetColumnsOfModelSchema = BaseProjectRootSchema.extend({\n  modelName: z.string(),\n});\nconst GetColumnsOfSourceSchema = BaseProjectRootSchema.extend({\n  sourceName: z.string(),\n  tableName: z.string(),\n});\nconst GetColumnValuesSchema = BaseProjectRootSchema.extend({\n  model: z.string(),\n  column: z.string(),\n});\nconst CompileModelSchema = BaseProjectRootSchema.extend({\n  modelName: z.string(),\n});\nconst CompileQuerySchema = BaseProjectRootSchema.extend({\n  query: z.string(),\n  originalModelName: z.string().optional(),\n});\nconst ExecuteSQLSchema = BaseProjectRootSchema.extend({\n  query: z.string(),\n  modelName: z.string(),\n});\nconst RunModelSchema = BaseProjectRootSchema.extend({\n  plusOperatorLeft: z.enum([\"\", \"+\"]),\n  modelName: z.string(),\n  plusOperatorRight: z.enum([\"\", \"+\"]),\n});\nconst BuildModelSchema = BaseProjectRootSchema.extend({\n  plusOperatorLeft: z.enum([\"\", \"+\"]),\n  modelName: z.string(),\n  plusOperatorRight: z.enum([\"\", \"+\"]),\n});\nconst BuildProjectSchema = BaseProjectRootSchema.extend({});\nconst RunTestSchema = BaseProjectRootSchema.extend({\n  testName: z.string(),\n});\nconst RunModelTestSchema = BaseProjectRootSchema.extend({\n  modelName: z.string(),\n});\nconst AddDbtPackagesSchema = BaseProjectRootSchema.extend({\n  packages: z.array(z.string()),\n});\nconst InstallDepsSchema = BaseProjectRootSchema.extend({});\n\nconst GetChildrenModelsSchema = BaseProjectRootSchema.extend({\n  table: z.string(),\n});\n\nconst GetParentModelsSchema = BaseProjectRootSchema.extend({\n  table: z.string(),\n});\n\nconst DBT_BEST_PRACTICES_CONTENT = `# dbt Project Best Practices for AI Agents\n\n## Tool Selection: Use MCP Tools Instead of Terminal Commands\n\n**⚠️ IMPORTANT**: ALWAYS use these MCP tools instead of running dbt commands in the terminal.\n\n**⚠️ PREFERRED**: Use \\`execute_sql\\` for quickly validating SQL and verifying results.\n**⚠️ PREFERRED**: Use \\`build_model\\` for building models - it automatically rebuilds downstream dependencies.\n\n### MCP Tools Summary\n\n| Tool | Purpose |\n|------|---------|\n| \\`get_best_practices\\` | ⚠️ **READ FIRST** - Get workflow guidelines before starting |\n| \\`build_model\\` | ⚠️ **PREFERRED** - Build model with auto downstream rebuild |\n| \\`compile_model\\` | Convert Jinja to raw SQL (no validation, no database!) |\n| \\`get_columns_of_model\\` | Get column names and types for a model |\n| \\`get_columns_of_source\\` | Get column names and types for a source |\n| \\`get_parent_models\\` | Find upstream dependencies |\n| \\`get_children_models\\` | Find downstream dependencies |\n| \\`execute_sql\\` | Run verification queries |\n\n---\n\n## Critical Workflow: Write → Build → Verify\n\n### 1. Write the Model\n- Create or modify the SQL file in the \\`models/\\` directory\n- Use proper Jinja templating with \\`{{ ref() }}\\` and \\`{{ source() }}\\`\n\n### 2. Build the Model (REQUIRED!)\n- **ALWAYS use \\`build_model\\` MCP tool** - it automatically rebuilds downstream models\n- ⚠️ **WARNING**: \\`compile_model\\` only renders Jinja templates - it does NOT create the model in the database!\n\n### 3. Verify the Result\n- Use \\`execute_sql\\` MCP tool for specific verification queries\n- Or use bash: \\`dbt show --select model_name --limit 10\\` to preview the data\n\n## Common Mistakes to Avoid\n\n### ❌ WRONG: Stopping after compile\n1. Write model file ✓\n2. Run compile_model ✓\n3. Stop (WRONG! Model not built in database)\n\n### ✅ CORRECT: Full workflow\n1. Try out SQL using execute_sql ✓\n2. Write model file ✓\n3. Call build_model with modelName ✓ (creates model AND rebuilds downstream!)\n4. Verify with execute_sql or dbt show ✓\n\n## Selector Patterns\n\n| Pattern | Meaning |\n|---------|---------|\n| \\`model\\` | Just the model |\n| \\`model+\\` | Model and all downstream (use plusOperatorRight: \"+\") |\n| \\`+model\\` | Model and all upstream (use plusOperatorLeft: \"+\") |\n| \\`+model+\\` | Model with all dependencies |\n\n## Remember\n\n**A dbt task is NOT complete until:**\n1. The model file is written\n2. \\`build_model\\` has been called successfully\n3. The output has been verified\n\nNever stop at \\`compile_model\\` - that only renders Jinja templating, it does NOT create anything in the database!\n`;\n\nenum ToolName {\n  GET_BEST_PRACTICES = \"get_best_practices\",\n  GET_PROJECTS = \"get_projects\",\n  GET_CHILDREN_MODELS = \"get_children_models\",\n  GET_PARENT_MODELS = \"get_parent_models\",\n  GET_COLUMNS_OF_MODEL = \"get_columns_of_model\",\n  GET_COLUMNS_OF_SOURCE = \"get_columns_of_source\",\n  GET_COLUMN_VALUES = \"get_column_values\",\n  COMPILE_MODEL = \"compile_model\",\n  COMPILE_QUERY = \"compile_query\",\n  EXECUTE_SQL = \"execute_sql\",\n  RUN_MODEL = \"run_model\",\n  BUILD_MODEL = \"build_model\",\n  BUILD_PROJECT = \"build_project\",\n  RUN_TEST = \"run_test\",\n  RUN_MODEL_TEST = \"run_model_test\",\n  ADD_DBT_PACKAGES = \"add_dbt_packages\",\n  INSTALL_DEPS = \"install_deps\",\n}\n\nexport class DbtPowerUserMcpServerTools implements Disposable {\n  constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n  ) {}\n\n  private tools: McpTool[] = [\n    {\n      name: ToolName.GET_BEST_PRACTICES,\n      description:\n        \"⚠️ IMPORTANT: Call this tool BEFORE starting any dbt task to get critical workflow guidelines. Returns best practices for completing dbt tasks correctly, including the required Write → Build → Verify workflow and proper tool usage. This helps avoid common mistakes like stopping after compile.\",\n      inputSchema: toToolInput(BaseSchema),\n      handler: async () => {\n        return {\n          content: createTextContent(DBT_BEST_PRACTICES_CONTENT),\n        };\n      },\n    },\n    {\n      name: ToolName.GET_PROJECTS,\n      description: `Returns detailed information about all available dbt projects including:\n- projectRoot: The root directory path of the dbt project\n- projectName: The name of the dbt project from dbt_project.yml\n- selectedTarget: The currently selected target profile\n- targetNames: List of all available target profiles\n- targetPath: The directory where compiled artifacts are stored\n- packageInstallPath: The directory where dbt packages are installed\n- modelPaths: List of directories containing dbt models\n- seedPaths: List of directories containing dbt seeds\n- macroPaths: List of directories containing dbt macros\n- manifestPath: Path to the manifest.json file\n- catalogPath: Path to the catalog.json file\n- dbtVersion: The version of dbt being used (e.g., \"1.5.0\")\n- adapterType: The database adapter type (e.g., \"postgres\", \"snowflake\")\nThis must be called first to get the projectRoot parameter needed for all other tools.`,\n      inputSchema: toToolInput(BaseSchema),\n      handler: async (args: Record<string, unknown>) => {\n        const projects = this.dbtProjectContainer.getProjects();\n        const projectDetails = await Promise.all(\n          projects.map(async (project: DBTProject) => {\n            const details: Record<string, any> = {\n              projectRoot: project.projectRoot.fsPath,\n            };\n\n            await this.safeGetProjectProperty(\n              project,\n              \"projectName\",\n              () => project.getProjectName(),\n              details,\n            );\n            await this.safeGetProjectProperty(\n              project,\n              \"selectedTarget\",\n              () => project.getSelectedTarget(),\n              details,\n            );\n            await this.safeGetProjectProperty(\n              project,\n              \"targetNames\",\n              () => project.getTargetNames(),\n              details,\n            );\n            await this.safeGetProjectProperty(\n              project,\n              \"targetPath\",\n              () => project.getTargetPath(),\n              details,\n            );\n            await this.safeGetProjectProperty(\n              project,\n              \"packageInstallPath\",\n              () => project.getPackageInstallPath(),\n              details,\n            );\n            await this.safeGetProjectProperty(\n              project,\n              \"modelPaths\",\n              () => project.getModelPaths(),\n              details,\n            );\n            await this.safeGetProjectProperty(\n              project,\n              \"seedPaths\",\n              () => project.getSeedPaths(),\n              details,\n            );\n            await this.safeGetProjectProperty(\n              project,\n              \"macroPaths\",\n              () => project.getMacroPaths(),\n              details,\n            );\n            await this.safeGetProjectProperty(\n              project,\n              \"manifestPath\",\n              () => project.getManifestPath(),\n              details,\n            );\n            await this.safeGetProjectProperty(\n              project,\n              \"catalogPath\",\n              () => project.getCatalogPath(),\n              details,\n            );\n            await this.safeGetProjectProperty(\n              project,\n              \"dbtVersion\",\n              () => {\n                const version = project.getDBTVersion();\n                return version ? version.join(\".\") : undefined;\n              },\n              details,\n            );\n            await this.safeGetProjectProperty(\n              project,\n              \"adapterType\",\n              () => project.getAdapterType(),\n              details,\n            );\n\n            return details;\n          }),\n        );\n\n        return {\n          content: createTextContent(JSON.stringify(projectDetails)),\n        };\n      },\n    },\n    {\n      name: ToolName.GET_COLUMNS_OF_MODEL,\n      description:\n        \"Returns the column names and data types for a specified dbt model. WORKFLOW: Call this BEFORE completing any task to verify the output schema matches requirements.\",\n      inputSchema: toToolInput(GetColumnsOfModelSchema),\n      handler: async (args: Record<string, unknown>) => {\n        const validatedArgs = GetColumnsOfModelSchema.parse(args);\n        const projectRoot = decodeURIComponent(validatedArgs.projectRoot);\n        const project = this.dbtProjectContainer.findDBTProject(\n          Uri.file(projectRoot),\n        );\n        if (!project) {\n          throw new Error(\n            `Project not found for root: ${validatedArgs.projectRoot}`,\n          );\n        }\n        const result = await project.getColumnsOfModel(validatedArgs.modelName);\n        return {\n          content: createTextContent(JSON.stringify(result)),\n        };\n      },\n    },\n    {\n      name: ToolName.GET_COLUMNS_OF_SOURCE,\n      description:\n        \"Returns the column names and data types for a specified dbt source. Use this to understand a source's schema before querying it.\",\n      inputSchema: toToolInput(GetColumnsOfSourceSchema),\n      handler: async (args: Record<string, unknown>) => {\n        const validatedArgs = GetColumnsOfSourceSchema.parse(args);\n        const projectRoot = decodeURIComponent(validatedArgs.projectRoot);\n        const project = this.dbtProjectContainer.findDBTProject(\n          Uri.file(projectRoot),\n        );\n        if (!project) {\n          throw new Error(\n            `Project not found for root: ${validatedArgs.projectRoot}`,\n          );\n        }\n        const result = await project.getColumnsOfSource(\n          validatedArgs.sourceName,\n          validatedArgs.tableName,\n        );\n        return {\n          content: createTextContent(JSON.stringify(result)),\n        };\n      },\n    },\n    ...(workspace\n      .getConfiguration(\"dbt\")\n      .get<boolean>(\"enableMcpDataSourceQueryTools\", false)\n      ? [\n          {\n            name: ToolName.GET_COLUMN_VALUES,\n            description:\n              \"Returns the distinct values for a specified column in a model or source. Use this to understand the data distribution and possible values in a column.\",\n            inputSchema: toToolInput(GetColumnValuesSchema),\n            handler: async (args: Record<string, unknown>) => {\n              const validatedArgs = GetColumnValuesSchema.parse(args);\n              const projectRoot = decodeURIComponent(validatedArgs.projectRoot);\n              const project = this.dbtProjectContainer.findDBTProject(\n                Uri.file(projectRoot),\n              );\n              if (!project) {\n                throw new Error(\n                  `Project not found for root: ${validatedArgs.projectRoot}`,\n                );\n              }\n              const result = await project.getColumnValues(\n                validatedArgs.model,\n                validatedArgs.column,\n              );\n              return {\n                content: createTextContent(JSON.stringify(result)),\n              };\n            },\n          },\n          {\n            name: ToolName.EXECUTE_SQL,\n            description:\n              \"⚠️ PREFERRED for validation: Execute SQL queries against the database and get results immediately. WORKFLOW: Use this to spot-check row counts, verify key values, and validate your logic before and after building models.\",\n            inputSchema: toToolInput(ExecuteSQLSchema),\n            handler: async (args: Record<string, unknown>) => {\n              const validatedArgs = ExecuteSQLSchema.parse(args);\n              const projectRoot = decodeURIComponent(validatedArgs.projectRoot);\n              const project = this.dbtProjectContainer.findDBTProject(\n                Uri.file(projectRoot),\n              );\n              if (!project) {\n                throw new Error(\n                  `Project not found for root: ${validatedArgs.projectRoot}`,\n                );\n              }\n              const result = await project.immediatelyExecuteSQL(\n                validatedArgs.query,\n                validatedArgs.modelName,\n              );\n              return {\n                content: createTextContent(JSON.stringify(result)),\n              };\n            },\n          },\n        ]\n      : []),\n    {\n      name: ToolName.COMPILE_MODEL,\n      description:\n        \"Use this instead of running 'dbt compile' in the terminal. Converts Jinja SQL to raw SQL. ⚠️ WARNING: This ONLY performs Jinja templating - it does NOT validate SQL syntax or create anything in the database! You MUST call build_model to actually create the model.\",\n      inputSchema: toToolInput(CompileModelSchema),\n      handler: async (args: Record<string, unknown>) => {\n        const validatedArgs = CompileModelSchema.parse(args);\n        const projectRoot = decodeURIComponent(validatedArgs.projectRoot);\n        const project = this.dbtProjectContainer.findDBTProject(\n          Uri.file(projectRoot),\n        );\n        if (!project) {\n          throw new Error(\n            `Project not found for root: ${validatedArgs.projectRoot}`,\n          );\n        }\n        const result = await project.unsafeCompileNode(validatedArgs.modelName);\n        return { content: createTextContent(result || \"\") };\n      },\n    },\n    {\n      name: ToolName.COMPILE_QUERY,\n      description:\n        \"Use this instead of running 'dbt compile' in the terminal. Converts Jinja SQL query to raw SQL. ⚠️ WARNING: This ONLY performs Jinja templating - it does NOT validate SQL syntax or execute anything! Use execute_sql to run and validate the query.\",\n      inputSchema: toToolInput(CompileQuerySchema),\n      handler: async (args: Record<string, unknown>) => {\n        const validatedArgs = CompileQuerySchema.parse(args);\n        const projectRoot = decodeURIComponent(validatedArgs.projectRoot);\n        const project = this.dbtProjectContainer.findDBTProject(\n          Uri.file(projectRoot),\n        );\n        if (!project) {\n          throw new Error(\n            `Project not found for root: ${validatedArgs.projectRoot}`,\n          );\n        }\n        const result = await project.unsafeCompileQuery(\n          validatedArgs.query,\n          validatedArgs.originalModelName,\n        );\n        return { content: createTextContent(result || \"\") };\n      },\n    },\n    {\n      name: ToolName.RUN_MODEL,\n      description:\n        \"Use this instead of running 'dbt run' in the terminal. Runs a dbt model. For most cases, prefer build_model instead as it also runs tests. Use + for plusOperatorLeft to include upstream models, and + for plusOperatorRight to include downstream models.\",\n      inputSchema: toToolInput(RunModelSchema),\n      handler: async (args: Record<string, unknown>) => {\n        const validatedArgs = RunModelSchema.parse(args);\n        const projectRoot = decodeURIComponent(validatedArgs.projectRoot);\n        const project = this.dbtProjectContainer.findDBTProject(\n          Uri.file(projectRoot),\n        );\n        if (!project) {\n          throw new Error(\n            `Project not found for root: ${validatedArgs.projectRoot}`,\n          );\n        }\n        const result = await project.unsafeRunModelImmediately({\n          plusOperatorLeft: validatedArgs.plusOperatorLeft,\n          modelName: validatedArgs.modelName,\n          plusOperatorRight: validatedArgs.plusOperatorRight,\n        });\n        return this.handleDbtCommandOutput(result);\n      },\n    },\n    {\n      name: ToolName.BUILD_MODEL,\n      description:\n        \"⚠️ PREFERRED: Use this instead of running 'dbt build' in the terminal. Builds a dbt model AND runs its tests. Use + for plusOperatorRight to also rebuild downstream models (recommended after fixes). This ensures data consistency throughout your pipeline.\",\n      inputSchema: toToolInput(BuildModelSchema),\n      handler: async (args: Record<string, unknown>) => {\n        const validatedArgs = BuildModelSchema.parse(args);\n        const projectRoot = decodeURIComponent(validatedArgs.projectRoot);\n        const project = this.dbtProjectContainer.findDBTProject(\n          Uri.file(projectRoot),\n        );\n        if (!project) {\n          throw new Error(\n            `Project not found for root: ${validatedArgs.projectRoot}`,\n          );\n        }\n        const result = await project.unsafeBuildModelImmediately({\n          plusOperatorLeft: validatedArgs.plusOperatorLeft,\n          modelName: validatedArgs.modelName,\n          plusOperatorRight: validatedArgs.plusOperatorRight,\n        });\n        return this.handleDbtCommandOutput(result);\n      },\n    },\n    {\n      name: ToolName.BUILD_PROJECT,\n      description:\n        \"Use this instead of running 'dbt build' in the terminal. Builds the entire dbt project including seeds, models, and all tests. For single model changes, prefer build_model instead.\",\n      inputSchema: toToolInput(BuildProjectSchema),\n      handler: async (args: Record<string, unknown>) => {\n        const validatedArgs = BuildProjectSchema.parse(args);\n        const projectRoot = decodeURIComponent(validatedArgs.projectRoot);\n        const project = this.dbtProjectContainer.findDBTProject(\n          Uri.file(projectRoot),\n        );\n        if (!project) {\n          throw new Error(\n            `Project not found for root: ${validatedArgs.projectRoot}`,\n          );\n        }\n        const result = await project.unsafeBuildProjectImmediately();\n        return this.handleDbtCommandOutput(result);\n      },\n    },\n    {\n      name: ToolName.RUN_TEST,\n      description:\n        \"Use this instead of running 'dbt test' in the terminal. Runs an individual dbt test by test name from the manifest. Note: build_model already includes tests, so use this only for running specific tests independently.\",\n      inputSchema: toToolInput(RunTestSchema),\n      handler: async (args: Record<string, unknown>) => {\n        const validatedArgs = RunTestSchema.parse(args);\n        const projectRoot = decodeURIComponent(validatedArgs.projectRoot);\n        const project = this.dbtProjectContainer.findDBTProject(\n          Uri.file(projectRoot),\n        );\n        if (!project) {\n          throw new Error(\n            `Project not found for root: ${validatedArgs.projectRoot}`,\n          );\n        }\n        const result = await project.unsafeRunTestImmediately(\n          validatedArgs.testName,\n        );\n        return this.handleDbtCommandOutput(result);\n      },\n    },\n    {\n      name: ToolName.RUN_MODEL_TEST,\n      description:\n        \"Use this instead of running 'dbt test' in the terminal. Runs all tests defined for a specific dbt model. Note: build_model already includes tests, so use this only when you need to run tests without rebuilding the model.\",\n      inputSchema: toToolInput(RunModelTestSchema),\n      handler: async (args: Record<string, unknown>) => {\n        const validatedArgs = RunModelTestSchema.parse(args);\n        const projectRoot = decodeURIComponent(validatedArgs.projectRoot);\n        const project = this.dbtProjectContainer.findDBTProject(\n          Uri.file(projectRoot),\n        );\n        if (!project) {\n          throw new Error(\n            `Project not found for root: ${validatedArgs.projectRoot}`,\n          );\n        }\n        const result = await project.unsafeRunModelTestImmediately(\n          validatedArgs.modelName,\n        );\n        return this.handleDbtCommandOutput(result);\n      },\n    },\n    {\n      name: ToolName.ADD_DBT_PACKAGES,\n      description:\n        \"Adds dbt package(s) to the project's packages.yml. Format: packageName@version. After adding packages, call install_deps to install them.\",\n      inputSchema: toToolInput(AddDbtPackagesSchema),\n      handler: async (args: Record<string, unknown>) => {\n        const validatedArgs = AddDbtPackagesSchema.parse(args);\n        const projectRoot = decodeURIComponent(validatedArgs.projectRoot);\n        const project = this.dbtProjectContainer.findDBTProject(\n          Uri.file(projectRoot),\n        );\n        if (!project) {\n          throw new Error(\n            `Project not found for root: ${validatedArgs.projectRoot}`,\n          );\n        }\n        const result = await project.installDbtPackages(validatedArgs.packages);\n        return {\n          content: createTextContent(result.fullOutput),\n        };\n      },\n    },\n    {\n      name: ToolName.INSTALL_DEPS,\n      description:\n        \"Use this instead of running 'dbt deps' in the terminal. Installs dbt package dependencies from packages.yml. Call this after adding packages with add_dbt_packages, or when setting up a project.\",\n      inputSchema: toToolInput(InstallDepsSchema),\n      handler: async (args: Record<string, unknown>) => {\n        const validatedArgs = InstallDepsSchema.parse(args);\n        const projectRoot = decodeURIComponent(validatedArgs.projectRoot);\n        const project = this.dbtProjectContainer.findDBTProject(\n          Uri.file(projectRoot),\n        );\n        if (!project) {\n          throw new Error(\n            `Project not found for root: ${validatedArgs.projectRoot}`,\n          );\n        }\n        const result = await project.installDeps();\n        return {\n          content: createTextContent(result.fullOutput),\n        };\n      },\n    },\n    {\n      name: ToolName.GET_CHILDREN_MODELS,\n      description:\n        \"Returns the list of models that depend on the specified model (its children). Use this to understand a model's downstream impact and lineage.\",\n      inputSchema: toToolInput(GetChildrenModelsSchema),\n      handler: async (args: Record<string, unknown>) => {\n        const validatedArgs = GetChildrenModelsSchema.parse(args);\n        const projectRoot = decodeURIComponent(validatedArgs.projectRoot);\n        const project = this.dbtProjectContainer.findDBTProject(\n          Uri.file(projectRoot),\n        );\n        if (!project) {\n          throw new Error(\n            `Project not found for root: ${validatedArgs.projectRoot}`,\n          );\n        }\n        const result = project.getChildrenModels({\n          table: validatedArgs.table,\n        });\n        return {\n          content: createTextContent(JSON.stringify(result)),\n        };\n      },\n    },\n    {\n      name: ToolName.GET_PARENT_MODELS,\n      description:\n        \"Returns the list of models that the specified model depends on (its parents). Use this to understand a model's upstream dependencies and lineage.\",\n      inputSchema: toToolInput(GetParentModelsSchema),\n      handler: async (args: Record<string, unknown>) => {\n        const validatedArgs = GetParentModelsSchema.parse(args);\n        const projectRoot = decodeURIComponent(validatedArgs.projectRoot);\n        const project = this.dbtProjectContainer.findDBTProject(\n          Uri.file(projectRoot),\n        );\n        if (!project) {\n          throw new Error(\n            `Project not found for root: ${validatedArgs.projectRoot}`,\n          );\n        }\n        const result = project.getParentModels({\n          table: validatedArgs.table,\n        });\n        return {\n          content: createTextContent(JSON.stringify(result)),\n        };\n      },\n    },\n  ];\n\n  dispose() {}\n\n  private handleDbtCommandOutput = (result?: CommandProcessResult) => {\n    if (result?.stderr) {\n      throw new Error(result.stderr);\n    }\n    return {\n      content: createTextContent(result?.stdout || \"\"),\n    };\n  };\n\n  public getMcpTools = () => {\n    return this.tools;\n  };\n\n  private async safeGetProjectProperty<T>(\n    project: DBTProject,\n    propertyName: string,\n    getter: () => T,\n    details: Record<string, any>,\n  ): Promise<void> {\n    try {\n      const value = await getter();\n      if (value !== undefined && value !== null) {\n        details[propertyName] = value;\n      }\n    } catch (error) {\n      this.dbtTerminal.debug(\n        \"DbtPowerUserMcpServerTools\",\n        `Failed to get ${propertyName}`,\n        error,\n      );\n    }\n  }\n}\n\n// Helper function to create properly typed content\nconst createTextContent = (text: string) => [\n  {\n    type: \"text\" as const,\n    text,\n  },\n];\n"
  },
  {
    "path": "src/mcp/types.ts",
    "content": "import {\n  CallToolResultSchema,\n  ToolSchema,\n} from \"@modelcontextprotocol/sdk/types\";\nimport { z } from \"zod/v4\";\n\nexport type ToolInput = z.infer<typeof ToolSchema.shape.inputSchema>;\n\nexport type McpTool = {\n  name: string;\n  description: string;\n  inputSchema: ToolInput;\n  handler: (\n    args: Record<string, unknown>,\n  ) => Promise<z.infer<typeof CallToolResultSchema>>;\n};\n\nexport type McpOnboardingStep = {\n  title: string;\n  description: string;\n  enableButton: string;\n  disableButton?: string;\n  onCommandTrigger: (...args: unknown[]) => Promise<void>;\n  ide: string[];\n};\n\nexport type ToolRegistry = {\n  registerTools: (tools: McpTool[]) => Promise<void>;\n  addMcpIntegrationConfig: (steps: McpOnboardingStep[]) => Promise<void>;\n};\n"
  },
  {
    "path": "src/mcp/utils.ts",
    "content": "import { env } from \"vscode\";\n\nexport const isCursor = (): boolean => {\n  return env.appName === \"Cursor\";\n};\n"
  },
  {
    "path": "src/modules.ts",
    "content": "export {\n  CommandProcessExecutionFactory,\n  DBTCommandExecutionInfrastructure,\n  DBTTerminal,\n  ExecuteSQLResult,\n} from \"@altimateai/dbt-integration\";\nexport { inject } from \"inversify\";\nexport { AltimateRequest } from \"./altimate\";\nexport { DBTProject } from \"./dbt_client/dbtProject\";\nexport { DBTProjectContainer } from \"./dbt_client/dbtProjectContainer\";\nexport { PythonEnvironment } from \"./dbt_client/pythonEnvironment\";\nexport { QueryManifestService } from \"./services/queryManifestService\";\nexport { TelemetryService } from \"./telemetry\";\nexport { TelemetryEvents } from \"./telemetry/events\";\nexport { extendErrorWithSupportLinks, getFirstWorkspacePath } from \"./utils\";\n"
  },
  {
    "path": "src/quickpick/actionsQuickPick.ts",
    "content": "import {\n  commands,\n  Disposable,\n  QuickPickItem,\n  QuickPickItemKind,\n  ThemeIcon,\n  Uri,\n  window,\n} from \"vscode\";\n\nexport class DbtPowerUserControlCenterAction {\n  async openActions() {\n    const disposables: Disposable[] = [];\n    try {\n      return await new Promise<Uri | undefined>((resolve, reject) => {\n        const dbtpuquickpick = window.createQuickPick<\n          DbtPowerUserControlPanelItem | QuickPickItem\n        >();\n        dbtpuquickpick.title = \"dbt Power User Control Panel\";\n        dbtpuquickpick.items = [\n          new DbtPowerUserControlPanelItem(\n            \"Change dbt flavour\",\n            \"compare-changes\",\n            \"Switch between dbt core, cloud or fusion\",\n            \"dbtPowerUser.openSetupWalkthrough\",\n          ),\n          new DbtPowerUserControlPanelItem(\n            \"Troubleshooting\",\n            \"debug\",\n            \"Setup the extension\",\n            \"dbtPowerUser.openOnboarding\",\n            [\"prerequisites\"],\n          ),\n          new DbtPowerUserControlPanelItem(\n            \"Tutorials\",\n            \"book\",\n            \"How to use the extension\",\n            \"dbtPowerUser.openTutorialWalkthrough\",\n          ),\n          new DbtPowerUserControlPanelItem(\n            \"Documentation\",\n            \"link-external\",\n            \"View the detailed Documentation for the extension\",\n            // This really is an older interface meant to work with executeCommand.\n            // recommended is to use vscode.env.openExternal\n            \"vscode.open\",\n            [Uri.parse(\"https://docs.myaltimate.com\")],\n          ),\n          {\n            label: \"\",\n            kind: QuickPickItemKind.Separator,\n          },\n          new DbtPowerUserControlPanelItem(\n            \"Run Project Healthcheck\",\n            \"debug-start\",\n            \"Run the Project healthcheck\",\n            \"dbtPowerUser.altimateScan\",\n          ),\n          new DbtPowerUserControlPanelItem(\n            \"Clear Healthcheck Results\",\n            \"debug-stop\",\n            \"Clear all problems\",\n            \"dbtPowerUser.clearAltimateScanResults\",\n          ),\n          new DbtPowerUserControlPanelItem(\n            \"Diagnostics\",\n            \"tools\",\n            \"Run diagnostics on the dbt project\",\n            \"dbtPowerUser.diagnostics\",\n          ),\n          {\n            label: \"\",\n            kind: QuickPickItemKind.Separator,\n          },\n          new DbtPowerUserControlPanelItem(\n            \"Join the Community\",\n            \"add\",\n            \"Join our slack community\",\n            \"vscode.open\",\n            [Uri.parse(\"https://getdbt.slack.com/archives/C05KPDGRMDW\")],\n          ),\n          new DbtPowerUserControlPanelItem(\n            \"Feedback\",\n            \"feed\",\n            \"Give us Feedback!\",\n            \"vscode.open\",\n            [Uri.parse(\"https://form.jotform.com/251114282479154\")],\n          ),\n        ];\n\n        disposables.push(\n          dbtpuquickpick.onDidChangeValue((value) => {\n            dbtpuquickpick.busy = true;\n          }),\n          dbtpuquickpick.onDidChangeSelection((items) => {\n            const item = items[0];\n            if (item instanceof DbtPowerUserControlPanelItem) {\n              commands.executeCommand(item.command, ...item.commandArgs);\n              dbtpuquickpick.hide();\n            }\n          }),\n          dbtpuquickpick.onDidHide(() => {\n            resolve(undefined);\n            dbtpuquickpick.dispose();\n          }),\n        );\n        dbtpuquickpick.show();\n      });\n    } finally {\n      disposables.forEach((d) => d.dispose());\n    }\n  }\n}\n\nclass DbtPowerUserControlPanelItem implements QuickPickItem {\n  label: string;\n  iconPath?: ThemeIcon | Uri | { light: Uri; dark: Uri } | undefined;\n  description?: string | undefined;\n  command: string;\n  commandArgs: any[];\n\n  constructor(\n    label: string,\n    iconPath: string = \"\",\n    description?: string | undefined,\n    commandStr?: string,\n    commandArgs?: any[],\n  ) {\n    this.label = label;\n    this.iconPath = new ThemeIcon(iconPath);\n    this.description = description || \"\";\n    this.command = commandStr || \"\";\n    this.commandArgs = commandArgs || [];\n  }\n}\n"
  },
  {
    "path": "src/quickpick/index.ts",
    "content": "import { commands, Disposable, window } from \"vscode\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { SharedStateService } from \"../services/sharedStateService\";\nimport { OnboardingPanel } from \"../webview_provider/onboardingPanel\";\nimport { DbtPowerUserControlCenterAction } from \"./actionsQuickPick\";\nimport { ProjectQuickPick } from \"./projectQuickPick\";\nimport { DbtSQLAction } from \"./sqlQuickPick\";\n\nexport class DbtPowerUserActionsCenter implements Disposable {\n  private disposables: Disposable[] = [];\n\n  constructor(\n    private puLaunchQuickPick: DbtPowerUserControlCenterAction,\n    private projectQuickPick: ProjectQuickPick,\n    private dbtProjectContainer: DBTProjectContainer,\n    private sqlQuickPick: DbtSQLAction,\n    private emitterService: SharedStateService,\n    private onboardingPanel: OnboardingPanel,\n  ) {\n    commands.registerCommand(\"dbtPowerUser.puQuickPick\", async () => {\n      await this.puLaunchQuickPick.openActions();\n    });\n    commands.registerCommand(\"dbtPowerUser.openInsights\", async () => {\n      await commands.executeCommand(\"dbtPowerUser.Insights.focus\");\n    });\n    commands.registerCommand(\n      \"dbtPowerUser.openOnboarding\",\n      async (initialStep?: string) => {\n        this.emitterService.eventEmitter.fire({\n          command: \"onboarding:render\",\n          payload: initialStep ? { initialStep } : {},\n        });\n      },\n    );\n    commands.registerCommand(\"dbtPowerUser.sqlQuickPick\", async () => {\n      await this.sqlQuickPick.openQuickPick();\n    });\n    commands.registerCommand(\"dbtPowerUser.pickProject\", async () => {\n      const pickedProject = await this.projectQuickPick.projectPicker(\n        await this.dbtProjectContainer.getProjects(),\n      );\n      if (pickedProject) {\n        this.dbtProjectContainer.setToWorkspaceState(\n          \"dbtPowerUser.projectSelected\",\n          pickedProject,\n        );\n        commands.executeCommand(\n          \"setContext\",\n          \"dbtPowerUser.walkthroughProjectSelected\",\n          true,\n        );\n        window.showInformationMessage(\n          \"You have succesfully selected \" + pickedProject.label + \".\",\n        );\n      }\n    });\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/quickpick/notebookQuickPick.ts",
    "content": "import { commands, QuickPickItem, window } from \"vscode\";\n\nexport interface NotebookQuickPickItem extends QuickPickItem {\n  label: string;\n  description: string;\n  command: string;\n  arguments: any[];\n}\n\nexport class NotebookQuickPick {\n  async showNotebookPicker(): Promise<void> {\n    const notebooks: NotebookQuickPickItem[] = [\n      {\n        label: \"Profile this query\",\n        description: \"Profile this query\",\n        command: \"dbtPowerUser.createDatapilotNotebook\",\n        arguments: [{ template: \"Profile your query\" }],\n      },\n      {\n        label: \"Get test suggestions\",\n        description: \"Get test suggestions\",\n        command: \"dbtPowerUser.createDatapilotNotebook\",\n        arguments: [{ template: \"Get test suggestions\" }],\n      },\n      {\n        label: \"Generate dbt base model sql\",\n        description: \"Generate dbt base model sql\",\n        command: \"dbtPowerUser.createDatapilotNotebook\",\n        arguments: [\n          {\n            template: \"Generate dbt base model sql\",\n          },\n        ],\n      },\n      {\n        label: \"Generate dbt model yaml\",\n        description: \"Generate dbt model yaml\",\n        command: \"dbtPowerUser.createDatapilotNotebook\",\n        arguments: [\n          {\n            template: \"Generate dbt model yaml\",\n          },\n        ],\n      },\n      {\n        label: \"Generate dbt model CTE\",\n        description: \"Generate dbt model CTE\",\n        command: \"dbtPowerUser.createDatapilotNotebook\",\n        arguments: [\n          {\n            template: \"Generate dbt model CTE\",\n          },\n        ],\n      },\n    ];\n\n    const pick = await window.showQuickPick(notebooks, {\n      title: \"Select a Notebook\",\n      canPickMany: false,\n    });\n\n    if (pick) {\n      try {\n        await commands.executeCommand(pick.command, ...pick.arguments);\n      } catch (error) {\n        window.showErrorMessage(`Failed to execute notebook command: ${error}`);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/quickpick/projectQuickPick.ts",
    "content": "import { QuickPickItem, Uri, window } from \"vscode\";\nimport { DBTProject } from \"../dbt_client/dbtProject\";\n\nexport interface ProjectQuickPickItem extends QuickPickItem {\n  label: string;\n  description: string;\n  uri: Uri;\n}\n\nexport class ProjectQuickPick {\n  async projectPicker(\n    projects: DBTProject[],\n  ): Promise<ProjectQuickPickItem | undefined> {\n    const options: ProjectQuickPickItem[] = projects.map((item) => {\n      return {\n        label: item.getProjectName(),\n        description: item.projectRoot.fsPath,\n        uri: item.projectRoot,\n      };\n    });\n\n    const pick: ProjectQuickPickItem | undefined = await window.showQuickPick(\n      options,\n      {\n        title: \"Select a Project\",\n        canPickMany: false,\n      },\n    );\n    if (!pick) {\n      return;\n    }\n    return pick;\n  }\n}\n"
  },
  {
    "path": "src/quickpick/sqlQuickPick.ts",
    "content": "import * as path from \"path\";\nimport {\n  commands,\n  Disposable,\n  QuickPickItem,\n  ThemeIcon,\n  Uri,\n  window,\n} from \"vscode\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\n\nexport class DbtSQLAction {\n  constructor(private dbtProjectContainer: DBTProjectContainer) {}\n\n  private getProject() {\n    const currentFilePath = window.activeTextEditor?.document.uri;\n    if (!currentFilePath) {\n      return;\n    }\n    return this.dbtProjectContainer.findDBTProject(currentFilePath);\n  }\n\n  async openQuickPick() {\n    const disposables: Disposable[] = [];\n    try {\n      return await new Promise<Uri | undefined>(async (resolve, reject) => {\n        const dbtpuquickpick = window.createQuickPick<\n          SQLActionItem | QuickPickItem\n        >();\n        dbtpuquickpick.title = \"SQL Actions\";\n        const items = [\n          new SQLActionItem(\n            \"Validate SQL\",\n            new ThemeIcon(\"check-all\"),\n            \"Validate the sql query\",\n            \"dbtPowerUser.validateSql\",\n          ),\n          new SQLActionItem(\n            \"Explain query\",\n            {\n              light: Uri.file(\n                path.join(\n                  path.resolve(__dirname),\n                  \"../media/images/lightbulb_light.svg\",\n                ),\n              ),\n              dark: Uri.file(\n                path.join(\n                  path.resolve(__dirname),\n                  \"../media/images/lightbulb_dark.svg\",\n                ),\n              ),\n            },\n            \"Explain the sql query\",\n            \"dbtPowerUser.summarizeQuery\",\n          ),\n          new SQLActionItem(\n            \"Sql to Model\",\n            {\n              light: Uri.file(\n                path.join(\n                  path.resolve(__dirname),\n                  \"../media/images/preview-dbt-light.svg\",\n                ),\n              ),\n              dark: Uri.file(\n                path.join(\n                  path.resolve(__dirname),\n                  \"../media/images/preview-dbt-dark.svg\",\n                ),\n              ),\n            },\n            \"Convert sql to dbt model\",\n            \"dbtPowerUser.sqlToModel\",\n          ),\n          new SQLActionItem(\n            \"Visualize SQL\",\n            new ThemeIcon(\"preview\"),\n            \"Visualize the sql query\",\n            \"dbtPowerUser.sqlLineage\",\n          ),\n        ];\n\n        const project = this.getProject();\n        if (project) {\n          const adapter = project.getAdapterType();\n          const dbtVersion = project.getDBTVersion();\n          if (\n            adapter === \"bigquery\" &&\n            dbtVersion &&\n            dbtVersion[0] >= 1 &&\n            dbtVersion[1] >= 6\n          ) {\n            items.push(\n              new SQLActionItem(\n                \"BigQuery Cost Estimate\",\n                new ThemeIcon(\"dashboard\"),\n                \"Estimate cost for BigQuery\",\n                \"dbtPowerUser.bigqueryCostEstimate\",\n                [true],\n              ),\n            );\n          }\n        }\n        dbtpuquickpick.items = items;\n\n        disposables.push(\n          dbtpuquickpick.onDidChangeValue((value) => {\n            dbtpuquickpick.busy = true;\n          }),\n          dbtpuquickpick.onDidChangeSelection((items) => {\n            const item = items[0];\n            if (item instanceof SQLActionItem) {\n              commands.executeCommand(item.command, ...item.commandArgs);\n              dbtpuquickpick.hide();\n            }\n          }),\n          dbtpuquickpick.onDidHide(() => {\n            resolve(undefined);\n            dbtpuquickpick.dispose();\n          }),\n        );\n        dbtpuquickpick.show();\n      });\n    } finally {\n      disposables.forEach((d) => d.dispose());\n    }\n  }\n}\n\nclass SQLActionItem implements QuickPickItem {\n  label: string;\n  iconPath?: ThemeIcon | Uri | { light: Uri; dark: Uri } | undefined;\n  description?: string | undefined;\n  command: string;\n  commandArgs: any[];\n\n  constructor(\n    label: string,\n    iconPath: ThemeIcon | Uri | { light: Uri; dark: Uri } | undefined,\n    description?: string | undefined,\n    commandStr?: string,\n    commandArgs?: any[],\n  ) {\n    this.label = label;\n    this.iconPath = iconPath;\n    this.description = description || \"\";\n    this.command = commandStr || \"\";\n    this.commandArgs = commandArgs || [];\n  }\n}\n"
  },
  {
    "path": "src/services/altimateAuthService.ts",
    "content": "import { DBTConfiguration } from \"@altimateai/dbt-integration\";\nimport { inject } from \"inversify\";\nimport { env, Uri, window } from \"vscode\";\n\nenum PromptAnswer {\n  YES = \"Get your free API Key\",\n}\n\nexport class AltimateAuthService {\n  constructor(\n    @inject(\"DBTConfiguration\")\n    private dbtConfiguration: DBTConfiguration,\n  ) {}\n\n  /**\n   * Checks if user has valid Altimate credentials and shows setup message if not.\n   * @returns true if user has valid credentials, false if credentials are missing\n   */\n  handlePreviewFeatures(): boolean {\n    const message = this.getCredentialsMessage();\n    if (!message) {\n      return true;\n    }\n    this.showAPIKeyMessage(message);\n    return false;\n  }\n\n  /**\n   * Gets a message describing missing credentials, or undefined if credentials are valid.\n   */\n  getCredentialsMessage(): string | undefined {\n    const key = this.dbtConfiguration.getAltimateAiKey();\n    const instance = this.dbtConfiguration.getAltimateInstanceName();\n\n    if (!key && !instance) {\n      return `To use this feature, please add an API Key and an instance name in the settings.`;\n    }\n    if (!key) {\n      return `To use this feature, please add an API key in the settings.`;\n    }\n    if (!instance) {\n      return `To use this feature, please add an instance name in the settings.`;\n    }\n    return;\n  }\n\n  /**\n   * Checks if the user has valid Altimate credentials.\n   */\n  isAuthenticated(): boolean {\n    const key = this.dbtConfiguration.getAltimateAiKey();\n    const instance = this.dbtConfiguration.getAltimateInstanceName();\n    return !!(key && instance);\n  }\n\n  /**\n   * Gets the current Altimate configuration if valid.\n   */\n  getConfig(): { key: string; instance: string } | undefined {\n    const key = this.dbtConfiguration.getAltimateAiKey();\n    const instance = this.dbtConfiguration.getAltimateInstanceName();\n    if (!key || !instance) {\n      return undefined;\n    }\n    return { key, instance };\n  }\n\n  private async showAPIKeyMessage(message: string) {\n    const answer = await window.showInformationMessage(\n      message,\n      PromptAnswer.YES,\n    );\n    if (answer === PromptAnswer.YES) {\n      env.openExternal(\n        Uri.parse(\"https://app.myaltimate.com/register?source=extension\"),\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "src/services/altimateCodeChatService.ts",
    "content": "import * as path from \"path\";\nimport { Disposable, extensions, Range, Uri, window, workspace } from \"vscode\";\n\nexport class AltimateCodeChatService implements Disposable {\n  private disposables: Disposable[] = [];\n\n  async openChat(options: {\n    initialMessage: string;\n    title: string;\n  }): Promise<boolean> {\n    const altimateExt = extensions.getExtension(\n      \"altimateai.vscode-altimate-mcp-server\",\n    );\n    if (!altimateExt) {\n      window.showErrorMessage(\n        \"Datamates extension is not installed or not active.\",\n      );\n      return false;\n    }\n    if (!altimateExt.isActive) {\n      await altimateExt.activate();\n    }\n    const chat = altimateExt.exports?.chat;\n    if (!chat) {\n      window.showErrorMessage(\n        \"Datamates extension is out of date, please update to the latest version.\",\n      );\n      return false;\n    }\n    // createSession opens the panel, starts the server, creates the session,\n    // and sends the initial message — all handled by the Datamates extension's\n    // webview:ready lifecycle.\n    await chat.createSession({\n      initialMessage: options.initialMessage,\n      title: options.title,\n    });\n    return true;\n  }\n\n  getEditorContext(): {\n    code: string;\n    relativePath: string;\n    fileName: string;\n  } | null {\n    const editor = window.activeTextEditor;\n    if (!editor) {\n      return null;\n    }\n\n    const document = editor.document;\n    const selection = editor.selection;\n    const fileName = path.basename(document.uri.fsPath);\n    const relativePath = this.getRelativePath(document.uri);\n\n    if (selection && !selection.isEmpty) {\n      const selectionRange = new Range(\n        selection.start.line,\n        selection.start.character,\n        selection.end.line,\n        selection.end.character,\n      );\n      return {\n        code: document.getText(selectionRange),\n        relativePath,\n        fileName,\n      };\n    }\n\n    return {\n      code: document.getText(),\n      relativePath,\n      fileName,\n    };\n  }\n\n  getContextForUri(uri: Uri): {\n    code: string;\n    relativePath: string;\n    fileName: string;\n  } | null {\n    const fileName = path.basename(uri.fsPath);\n    const relativePath = this.getRelativePath(uri);\n    return {\n      code: \"\",\n      relativePath,\n      fileName,\n    };\n  }\n\n  getRelativePath(uri: Uri): string {\n    const workspaceFolders = workspace.workspaceFolders;\n    if (workspaceFolders && workspaceFolders.length > 0) {\n      const relative = path.relative(\n        workspaceFolders[0].uri.fsPath,\n        uri.fsPath,\n      );\n      if (!relative.startsWith(\"..\")) {\n        return relative;\n      }\n    }\n    return uri.fsPath;\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      this.disposables.pop()?.dispose();\n    }\n  }\n}\n"
  },
  {
    "path": "src/services/conversationService.ts",
    "content": "import { DBTTerminal, hashProjectRoot } from \"@altimateai/dbt-integration\";\nimport { rmSync } from \"fs\";\nimport { inject } from \"inversify\";\nimport * as os from \"os\";\nimport { ProgressLocation, Uri, window } from \"vscode\";\nimport { AltimateRequest, ConversationGroup, SharedDoc } from \"../altimate\";\nimport { extendErrorWithSupportLinks } from \"../utils\";\nimport { AltimateAuthService } from \"./altimateAuthService\";\nimport { QueryManifestService } from \"./queryManifestService\";\nimport path = require(\"path\");\n\nexport class ConversationService {\n  // Local cache to store shared docs\n  private sharedDocs: SharedDoc[] = [];\n  private conversationsBySharedDoc: Record<\n    SharedDoc[\"share_id\"],\n    ConversationGroup[]\n  > = {};\n\n  public constructor(\n    private queryManifestService: QueryManifestService,\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n    private altimateRequest: AltimateRequest,\n    private altimateAuthService: AltimateAuthService,\n  ) {}\n\n  public getConversations() {\n    return this.conversationsBySharedDoc;\n  }\n\n  public async loadSharedDocs() {\n    try {\n      if (this.altimateAuthService.getCredentialsMessage()) {\n        this.dbtTerminal.debug(\n          \"ConversationService:loadSharedDocs\",\n          \"Missing credentials. skipping loadSharedDocs\",\n        );\n        return;\n      }\n      // query the shared docs by current project names in workspace\n      const projectNames =\n        this.queryManifestService.getProjectNamesInWorkspace();\n\n      if (!projectNames?.length) {\n        this.dbtTerminal.debug(\n          \"ConversationService:loadSharedDocs\",\n          \"no valid project names. skipping loadSharedDocs\",\n        );\n        return;\n      }\n\n      const shares =\n        await this.altimateRequest.getAllSharedDbtDocs(projectNames);\n      this.sharedDocs = shares || [];\n      shares.forEach((share) => {\n        this.conversationsBySharedDoc[share.share_id] =\n          share.conversation_group;\n      });\n      return this.sharedDocs;\n    } catch (err) {\n      this.dbtTerminal.error(\n        \"ConversationService:loadSharedDocs\",\n        \"Unable to load shared docs\",\n        err,\n      );\n    }\n  }\n\n  public async getAppUrlByShareId(shareId: SharedDoc[\"share_id\"]) {\n    try {\n      if (!this.altimateAuthService.handlePreviewFeatures()) {\n        return;\n      }\n      return this.altimateRequest.getAppUrlByShareId(shareId);\n    } catch (err) {\n      this.dbtTerminal.error(\n        \"ConversationService:getAppUrlByShareId\",\n        \"Unable to get url\",\n        err,\n      );\n      window.showErrorMessage(\n        extendErrorWithSupportLinks(\n          `Unable to get shareable url. Error: ${(err as Error).message}`,\n        ),\n      );\n    }\n  }\n\n  public async createConversationGroup(\n    shareId: SharedDoc[\"share_id\"],\n    data: Partial<ConversationGroup> & { message: string },\n  ) {\n    try {\n      if (!this.altimateAuthService.handlePreviewFeatures()) {\n        return;\n      }\n      return this.altimateRequest.createConversationGroup(shareId, data);\n    } catch (err) {\n      this.dbtTerminal.error(\n        \"ConversationService:createConversationGroup\",\n        \"Unable to create conversation group\",\n        err,\n      );\n      window.showErrorMessage(\n        extendErrorWithSupportLinks(\n          `Unable to save your comment. Error: ${(err as Error).message}`,\n        ),\n      );\n    }\n  }\n\n  public async addConversationToGroup(\n    shareId: SharedDoc[\"share_id\"],\n    conversationGroupId: ConversationGroup[\"conversation_group_id\"],\n    message: string,\n  ) {\n    try {\n      if (!this.altimateAuthService.handlePreviewFeatures()) {\n        return;\n      }\n      const result = await this.altimateRequest.addConversationToGroup(\n        shareId,\n        conversationGroupId,\n        message,\n      );\n      this.dbtTerminal.debug(\n        \"ConversationService:addConversationToGroup\",\n        \"added new conversation\",\n        conversationGroupId,\n      );\n      return result;\n    } catch (err) {\n      this.dbtTerminal.error(\n        \"ConversationService:addConversationToGroup\",\n        \"Unable to add reply to conversation\",\n        err,\n      );\n      window.showErrorMessage(\n        extendErrorWithSupportLinks(\n          `Unable to save your reply. Error: ${(err as Error).message}`,\n        ),\n      );\n    }\n  }\n\n  public async resolveConversation(\n    shareId: SharedDoc[\"share_id\"],\n    conversationGroupId: ConversationGroup[\"conversation_group_id\"],\n  ) {\n    try {\n      if (!this.altimateAuthService.handlePreviewFeatures()) {\n        return;\n      }\n      return await this.altimateRequest.resolveConversation(\n        shareId,\n        conversationGroupId,\n      );\n    } catch (err) {\n      this.dbtTerminal.error(\n        \"ConversationService:resolveConversation\",\n        \"Unable to resolve conversation group\",\n        err,\n      );\n      window.showErrorMessage(\n        extendErrorWithSupportLinks(\n          `Unable to resolve conversation. Error: ${(err as Error).message}`,\n        ),\n      );\n    }\n  }\n\n  public async loadConversationsByShareId(shareId: SharedDoc[\"share_id\"]) {\n    if (!this.altimateAuthService.handlePreviewFeatures()) {\n      return;\n    }\n    const conversations =\n      await this.altimateRequest.loadConversationsByShareId(shareId);\n\n    this.conversationsBySharedDoc[shareId] =\n      conversations.dbt_docs_share_conversations;\n    return conversations.dbt_docs_share_conversations;\n  }\n\n  /**\n   * create shareable dbt docs\n   * Steps involved\n   * 1. generate dbt docs by current state of project in temporary directory\n   * 2. create share doc and get presigned upload urls\n   * 3. upload manifest and catalog\n   * 4. verify upload\n   * 5. delete the temporary directory\n   */\n  public async shareDbtDocs(data: {\n    name: string;\n    description?: string;\n    uri?: Uri;\n    model?: string;\n  }): Promise<\n    { shareUrl: string; shareId: SharedDoc[\"share_id\"] } | undefined\n  > {\n    if (!this.altimateAuthService.handlePreviewFeatures()) {\n      return;\n    }\n    return new Promise((resolve, reject) => {\n      window.withProgress(\n        {\n          title: \"\",\n          location: ProgressLocation.Notification,\n          cancellable: false,\n        },\n        async (progress) => {\n          const project = this.queryManifestService.getProjectByUri(data.uri);\n          if (!project) {\n            reject(new Error(\"Invalid dbt project\"));\n            return;\n          }\n          progress.report({ message: \"Generating dbt docs...\" });\n\n          // generate docs in tmp directory\n          const hashedProjectRoot = hashProjectRoot(project.projectRoot.fsPath);\n          const tmpDirPath = path.join(os.tmpdir(), hashedProjectRoot);\n\n          try {\n            const args = data.model\n              ? [\"--target-path\", tmpDirPath, \"--models\", `+${data.model}+`]\n              : [\"--target-path\", tmpDirPath];\n            this.dbtTerminal.debug(\n              \"docGenService:shareDbtDocs\",\n              \"generating docs in path:\",\n              args,\n            );\n\n            // generate docs in tmp directory\n            await project.unsafeGenerateDocsImmediately(args);\n\n            this.dbtTerminal.debug(\n              \"docGenService:shareDbtDocs\",\n              \"generated docs in path:\",\n              tmpDirPath,\n            );\n            this.dbtTerminal.debug(\n              \"docGenService:shareDbtDocs\",\n              \"creating dbt share id\",\n              data,\n            );\n\n            // create a shareid\n            progress.report({ message: \"Creating dbt_docs_share record...\" });\n            const createShareResult =\n              await this.altimateRequest.createDbtDocsShare(\n                data,\n                project.getProjectName(),\n              );\n            this.dbtTerminal.debug(\n              \"docGenService:shareDbtDocs\",\n              \"created dbt share id\",\n              createShareResult,\n            );\n\n            const filePathMapping = {\n              \"manifest.json\": \"manifest_presigned_url\",\n              \"catalog.json\": \"catalog_presigned_url\",\n            };\n\n            // Upload the artifacts\n            progress.report({ message: \"Uploading artifacts...\" });\n            const fileUploadResponses = await Promise.all(\n              Object.keys(filePathMapping).map(async (file) => {\n                // @ts-ignore\n                const url = createShareResult[filePathMapping[file]];\n                if (!url) {\n                  throw new Error(`Invalid presigned url for ${file}`);\n                }\n                return this.altimateRequest.uploadToS3(\n                  url,\n                  {},\n                  path.join(tmpDirPath, file),\n                );\n              }),\n            );\n\n            if (fileUploadResponses.length !== 2) {\n              reject(\n                new Error(\n                  \"Unable to upload required artifacts. Please try again later.\",\n                ),\n              );\n              return;\n            }\n\n            // verify the uploads\n            progress.report({ message: \"Verifying uploads...\" });\n            const verifyResult = await this.altimateRequest.verifyDbtDocsUpload(\n              createShareResult.share_id,\n            );\n            if (!verifyResult.dbt_docs_share_url) {\n              reject(new Error(\"Unable to verify uploads. Please try again.\"));\n              return;\n            }\n\n            progress.report({ message: \"Resolving...\" });\n            resolve({\n              shareUrl: verifyResult.dbt_docs_share_url,\n              shareId: createShareResult.share_id,\n            });\n          } catch (err) {\n            reject(err);\n          } finally {\n            this.dbtTerminal.debug(\n              \"docGenService:shareDbtDocs\",\n              \"deleting docs tmp directory\",\n              tmpDirPath,\n            );\n            rmSync(tmpDirPath, { force: true, recursive: true });\n          }\n        },\n      );\n    });\n  }\n}\n"
  },
  {
    "path": "src/services/dbtLineageService.ts",
    "content": "import {\n  computeColumnLineage,\n  GraphMetaMap,\n  NodeGraphMap,\n  RESOURCE_TYPE_ANALYSIS,\n  RESOURCE_TYPE_EXPOSURE,\n  RESOURCE_TYPE_FUNCTION,\n  RESOURCE_TYPE_METRIC,\n  RESOURCE_TYPE_MODEL,\n  RESOURCE_TYPE_SNAPSHOT,\n  RESOURCE_TYPE_SOURCE,\n  Table,\n} from \"@altimateai/dbt-integration\";\nimport { inject } from \"inversify\";\nimport { AbortError } from \"node-fetch\";\nimport { CancellationTokenSource, env, Uri, window, workspace } from \"vscode\";\nimport { ModelInfo } from \"../altimate\";\nimport { ManifestCacheProjectAddedEvent } from \"../dbt_client/event/manifestCacheChangedEvent\";\nimport {\n  AltimateRequest,\n  DBTTerminal,\n  QueryManifestService,\n  TelemetryService,\n} from \"../modules\";\nimport { extendErrorWithSupportLinks } from \"../utils\";\n\nexport enum CllEvents {\n  START = \"start\",\n  END = \"end\",\n  CANCEL = \"cancel\",\n}\n\nconst CAN_COMPILE_SQL_NODE = [\n  RESOURCE_TYPE_MODEL,\n  RESOURCE_TYPE_SNAPSHOT,\n  RESOURCE_TYPE_ANALYSIS,\n];\nconst canCompileSQL = (nodeType: string) =>\n  CAN_COMPILE_SQL_NODE.includes(nodeType);\n\nexport class DbtLineageService {\n  public constructor(\n    private altimateRequest: AltimateRequest,\n    protected telemetry: TelemetryService,\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n    private queryManifestService: QueryManifestService,\n  ) {}\n\n  getUpstreamTables({ table }: { table: string }) {\n    return { tables: this.getConnectedTables(\"children\", table) };\n  }\n\n  getDownstreamTables({ table }: { table: string }) {\n    return { tables: this.getConnectedTables(\"parents\", table) };\n  }\n\n  private getConnectedTables(\n    key: keyof GraphMetaMap,\n    table: string,\n  ): Table[] | undefined {\n    const _event = this.queryManifestService.getEventByCurrentProject();\n    if (!_event) {\n      return;\n    }\n    const { event } = _event;\n    if (!event) {\n      return;\n    }\n    const { graphMetaMap } = event;\n    const dependencyNodes = graphMetaMap[key];\n    const node = dependencyNodes.get(table);\n    if (!node) {\n      return;\n    }\n    const tables: Map<string, Table> = new Map();\n    node.nodes.forEach(({ url, key }) => {\n      const _node = this.createTable(event, url, key);\n      if (!_node) {\n        return;\n      }\n      if (!tables.has(_node.table)) {\n        tables.set(_node.table, _node);\n      }\n    });\n    return Array.from(tables.values()).sort((a, b) =>\n      a.table.localeCompare(b.table),\n    );\n  }\n\n  createTable(\n    event: ManifestCacheProjectAddedEvent,\n    tableUrl: string | undefined,\n    key: string,\n  ): Table | undefined {\n    const splits = key.split(\".\");\n    const nodeType = splits[0];\n    const { graphMetaMap, testMetaMap } = event;\n    const upstreamCount = this.getConnectedNodeCount(\n      graphMetaMap[\"children\"],\n      key,\n    );\n    const downstreamCount = this.getConnectedNodeCount(\n      graphMetaMap[\"parents\"],\n      key,\n    );\n    if (nodeType === RESOURCE_TYPE_SOURCE) {\n      const { sourceMetaMap } = event;\n      const schema = splits[2];\n      const table = splits[3];\n      const _node = sourceMetaMap.get(schema);\n      if (!_node) {\n        return;\n      }\n      const _table = _node.tables.find((t) => t.name === table);\n      if (!_table) {\n        return;\n      }\n      return {\n        table: key,\n        label: table,\n        url: tableUrl,\n        upstreamCount,\n        downstreamCount,\n        nodeType,\n        isExternalProject: _node.is_external_project,\n        tests: (graphMetaMap[\"tests\"].get(key)?.nodes || []).map((n) => {\n          const testKey = n.label.split(\".\")[0];\n          return { ...testMetaMap.get(testKey), key: testKey };\n        }),\n        columns: _table.columns,\n        description: _table?.description,\n        packageName: _node.package_name,\n      };\n    }\n    if (nodeType === RESOURCE_TYPE_METRIC) {\n      return {\n        table: key,\n        label: splits[2],\n        url: tableUrl,\n        upstreamCount,\n        downstreamCount,\n        nodeType,\n        materialization: undefined,\n        tests: [],\n        columns: {},\n        isExternalProject: false,\n      };\n    }\n    const { nodeMetaMap } = event;\n\n    const table = splits[2];\n    if (nodeType === RESOURCE_TYPE_EXPOSURE) {\n      return {\n        table: key,\n        label: table,\n        url: tableUrl,\n        upstreamCount,\n        downstreamCount,\n        nodeType,\n        materialization: undefined,\n        tests: [],\n        columns: {},\n        isExternalProject: false,\n      };\n    }\n\n    if (nodeType === RESOURCE_TYPE_FUNCTION) {\n      const { functionMetaMap } = event;\n      const fn = functionMetaMap.get(table);\n      const fnType = fn?.config?.type;\n      return {\n        table: key,\n        label: table,\n        url: tableUrl,\n        upstreamCount,\n        downstreamCount,\n        nodeType,\n        materialization: fnType ? `${fnType} function` : \"function\",\n        tests: [],\n        columns: {},\n        isExternalProject: fn?.is_external_project ?? false,\n      };\n    }\n\n    const node = nodeMetaMap.lookupByUniqueId(key);\n    if (!node) {\n      return;\n    }\n\n    const materialization = node.config.materialized;\n    return {\n      table: key,\n      label: node.alias,\n      url: tableUrl,\n      upstreamCount,\n      downstreamCount,\n      isExternalProject: node.is_external_project,\n      nodeType,\n      materialization,\n      description: node.description,\n      columns: node.columns,\n      patchPath: node.patch_path,\n      tests: (graphMetaMap[\"tests\"].get(key)?.nodes || []).map((n) => {\n        const testKey = n.label.split(\".\")[0];\n        return { ...testMetaMap.get(testKey), key: testKey };\n      }),\n      packageName: node.package_name,\n      meta: node.meta,\n    };\n  }\n\n  private getConnectedNodeCount(g: NodeGraphMap, key: string) {\n    return g.get(key)?.nodes.length || 0;\n  }\n\n  async getConnectedColumns(\n    {\n      targets,\n      upstreamExpansion,\n      currAnd1HopTables,\n      selectedColumn,\n      showIndirectEdges,\n      eventType,\n    }: {\n      targets: [string, string][];\n      upstreamExpansion: boolean;\n      currAnd1HopTables: string[];\n      // select_column is used for pricing not business logic\n      selectedColumn: { name: string; table: string };\n      showIndirectEdges: boolean;\n      eventType: string;\n    },\n    cancellationTokenSource: CancellationTokenSource,\n  ) {\n    const _event = this.queryManifestService.getEventByCurrentProject();\n    if (!_event) {\n      return;\n    }\n    const { event } = _event;\n    if (!event) {\n      return;\n    }\n    const project = this.queryManifestService.getProject();\n    if (!project) {\n      return;\n    }\n\n    const modelInfos: ModelInfo[] = [];\n    let upstream_models: string[] = [];\n    let auxiliaryTables: string[] = []; // these are used for better sqlglot parsing\n    let sqlTables: string[] = []; // these are used which models should be compiled sql\n    currAnd1HopTables = Array.from(new Set(currAnd1HopTables));\n    const currTables = new Set(targets.map((t) => t[0]));\n    if (upstreamExpansion) {\n      const hop1Tables = currAnd1HopTables.filter((t) => !currTables.has(t));\n      upstream_models = [...hop1Tables];\n      sqlTables = [...hop1Tables];\n      auxiliaryTables = project.getNonEphemeralParents(hop1Tables);\n    } else {\n      auxiliaryTables = project.getNonEphemeralParents(Array.from(currTables));\n      sqlTables = Array.from(currTables);\n    }\n    currAnd1HopTables = Array.from(new Set(currAnd1HopTables));\n    const modelsToFetch = Array.from(\n      new Set([...currAnd1HopTables, ...auxiliaryTables, selectedColumn.table]),\n    );\n    // using artifacts(mappedCompiledSql) from getNodesWithDBColumns as optimization\n    const abortController = new AbortController();\n    cancellationTokenSource.token.onCancellationRequested(() =>\n      abortController.abort(),\n    );\n    const { mappedNode, relationsWithoutColumns, mappedCompiledSql } =\n      await project.getNodesWithDBColumns(\n        modelsToFetch,\n        abortController.signal,\n      );\n\n    const selected_column = {\n      model_node: mappedNode[selectedColumn.table],\n      column: selectedColumn.name,\n    };\n\n    if (cancellationTokenSource.token.isCancellationRequested) {\n      return { column_lineage: [] };\n    }\n\n    const modelsToCompile = modelsToFetch.filter((key) => {\n      if (!sqlTables.includes(key)) {\n        return false;\n      }\n      const nodeType = key.split(\".\")[0];\n      if (!canCompileSQL(nodeType)) {\n        return false;\n      }\n      return true;\n    });\n    const bulkCompiledSql = await project.getBulkCompiledSql(\n      modelsToCompile.filter((m) => !mappedCompiledSql[m]),\n    );\n    for (const key of modelsToFetch) {\n      const node = mappedNode[key];\n      if (!node) {\n        continue;\n      }\n      if (modelsToCompile.includes(key)) {\n        // rawSql only for debuging propose in backend\n        let rawSql: string = \"\";\n        if (node.path) {\n          try {\n            rawSql = (\n              await workspace.fs.readFile(Uri.file(node.path))\n            ).toString();\n          } catch (e) {\n            this.dbtTerminal.warn(\n              \"readRawSql\",\n              `Unable to read raw sql file ${node.path}`,\n            );\n          }\n        }\n        modelInfos.push({\n          model_node: node,\n          compiled_sql: mappedCompiledSql[key] || bulkCompiledSql[key],\n          raw_sql: rawSql,\n        });\n      } else {\n        modelInfos.push({ model_node: node });\n      }\n    }\n\n    if (relationsWithoutColumns.length !== 0) {\n      window.showErrorMessage(\n        extendErrorWithSupportLinks(\n          \"Failed to fetch columns for \" +\n            relationsWithoutColumns.join(\", \") +\n            \". Probably the dbt models are not yet materialized.\",\n        ),\n      );\n      // we still show the lineage for the rest of the models whose\n      // schemas we could get so not returning here\n    }\n\n    const targetTables = Array.from(new Set(targets.map((t) => t[0])));\n    // targets should not empty\n    if (targets.length === 0 || modelInfos.length < targetTables.length) {\n      this.telemetry.sendTelemetryError(\"columnLineageLogicError\", {\n        targets,\n        modelInfos,\n        upstreamExpansion,\n        currAnd1HopTables,\n        selectedColumn,\n      });\n      return { column_lineage: [] };\n    }\n\n    // the case where upstream/downstream only has ephemeral models\n    if (modelInfos.length === targetTables.length) {\n      return { column_lineage: [] };\n    }\n    const models = modelInfos.map((m) => m.model_node.uniqueId);\n    const hasAllModels = targets.every((t) => models.includes(t[0]));\n    if (!hasAllModels) {\n      // most probably error message is already shown in above checks\n      return { column_lineage: [] };\n    }\n\n    const modelDialect = project.getAdapterType();\n\n    // --- altimate-core: try local column lineage first ---\n    const cllEngine = workspace\n      .getConfiguration(\"dbt\")\n      .get<string>(\"lineage.cllEngine\", \"legacy\");\n\n    this.dbtTerminal.debug(\n      \"dbtLineageService:getConnectedColumns\",\n      `Column lineage engine: ${cllEngine}`,\n    );\n\n    if (cllEngine === \"sqlEngine\") {\n      try {\n        const localResult = await computeColumnLineage(\n          modelDialect,\n          modelInfos,\n          {\n            showIndirectEdges,\n            isCancelled: () =>\n              cancellationTokenSource.token.isCancellationRequested,\n          },\n        );\n        if (localResult) {\n          this.dbtTerminal.debug(\n            \"newLineagePanel:getConnectedColumns\",\n            \"altimate-core-node result\",\n            {\n              lineageCount: localResult.column_lineage.length,\n              errors: localResult.errors,\n            },\n          );\n          return localResult;\n        }\n        this.dbtTerminal.warn(\n          \"dbtLineageService:getConnectedColumns\",\n          \"computeColumnLineage returned null - altimate-core native module may not be loaded\",\n        );\n      } catch (error) {\n        this.dbtTerminal.warn(\n          \"newLineagePanel:getConnectedColumns\",\n          \"altimate-core-node failed, falling back to legacy API\",\n          true,\n          error,\n        );\n      }\n    }\n    // --- end altimate-core ---\n\n    this.dbtTerminal.debug(\n      \"dbtLineageService:getConnectedColumns\",\n      \"Using legacy API for column lineage\",\n    );\n\n    try {\n      if (cancellationTokenSource.token.isCancellationRequested) {\n        return { column_lineage: [] };\n      }\n      const sessionId = `${env.sessionId}-${selectedColumn.table}-${selectedColumn.name}`;\n      const request = {\n        model_dialect: modelDialect,\n        model_info: modelInfos,\n        upstream_expansion: upstreamExpansion,\n        upstream_models,\n        targets: targets.map((t) => ({ uniqueId: t[0], column_name: t[1] })),\n        selected_column: selected_column!,\n        session_id: sessionId,\n        show_indirect_edges: showIndirectEdges,\n        event_type: eventType,\n      };\n      this.dbtTerminal.debug(\n        \"newLineagePanel:getConnectedColumns\",\n        \"request\",\n        request,\n      );\n      const startTime = Date.now();\n      const result = await this.altimateRequest.getColumnLevelLineage(request);\n      const apiTime = Date.now() - startTime;\n      this.dbtTerminal.debug(\n        \"newLineagePanel:getConnectedColumns\",\n        \"response\",\n        result,\n      );\n      this.telemetry.sendTelemetryEvent(\"columnLineageTimes\", {\n        apiTime: apiTime.toString(),\n        modelInfosLength: modelInfos.length.toString(),\n      });\n      console.log(\"lineageTimings:\", {\n        apiTime: apiTime.toString(),\n        modelInfosLength: modelInfos.length.toString(),\n      });\n      if (!result.errors_dict && result.errors && result.errors.length > 0) {\n        window.showErrorMessage(\n          extendErrorWithSupportLinks(result.errors.join(\"\\n\")),\n        );\n        this.telemetry.sendTelemetryError(\"columnLineageApiError\", {\n          errors: result.errors,\n        });\n      }\n      const column_lineage =\n        result.column_lineage.map((c) => ({\n          source: [c.source.uniqueId, c.source.column_name],\n          target: [c.target.uniqueId, c.target.column_name],\n          type: c.type,\n          viewsType: c.views_type,\n          viewsCode: c.views_code,\n        })) || [];\n      return {\n        column_lineage,\n        confidence: result.confidence,\n        errors: result.errors_dict,\n      };\n    } catch (error) {\n      if (error instanceof AbortError) {\n        window.showErrorMessage(\n          extendErrorWithSupportLinks(\n            \"Fetching column level lineage timed out.\",\n          ),\n        );\n        this.telemetry.sendTelemetryError(\n          \"columnLevelLineageRequestTimeout\",\n          error,\n        );\n        return;\n      }\n      window.showErrorMessage(\n        extendErrorWithSupportLinks(\n          \"Could not generate column level lineage: \" +\n            (error as Error).message,\n        ),\n      );\n      this.telemetry.sendTelemetryError(\"ColumnLevelLineageError\", error);\n      return;\n    }\n  }\n}\n"
  },
  {
    "path": "src/services/dbtTestService.ts",
    "content": "import {\n  DBTTerminal,\n  MacroMetaMap,\n  TestMetaData,\n  TestMetadataAcceptedValues,\n  TestMetadataRelationships,\n} from \"@altimateai/dbt-integration\";\nimport { getTestSuggestions } from \"@lib\";\nimport { readFileSync } from \"fs\";\nimport { inject } from \"inversify\";\nimport { env, ProgressLocation, WebviewView, window } from \"vscode\";\nimport { parse, stringify } from \"yaml\";\nimport {\n  AltimateRequest,\n  CreateDbtTestRequest,\n  UserInputError,\n} from \"../altimate\";\nimport { DBTProject } from \"../dbt_client/dbtProject\";\nimport { TelemetryService } from \"../telemetry\";\nimport { TelemetryEvents } from \"../telemetry/events\";\nimport {\n  extendErrorWithSupportLinks,\n  getColumnTestConfigFromYml,\n  isColumnNameEqual,\n  removeProtocol,\n} from \"../utils\";\nimport { AltimateAuthService } from \"./altimateAuthService\";\nimport { DocGenService } from \"./docGenService\";\nimport { QueryManifestService } from \"./queryManifestService\";\nimport { StreamingService } from \"./streamingService\";\nimport path = require(\"path\");\n\nexport class DbtTestService {\n  public constructor(\n    private docGenService: DocGenService,\n    private streamingService: StreamingService,\n    private altimateRequest: AltimateRequest,\n    private queryManifestService: QueryManifestService,\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n    private telemetryService: TelemetryService,\n    private altimateAuthService: AltimateAuthService,\n  ) {}\n\n  // Remove duplicate tests from tests array\n  public removeDuplicateTests(\n    tests: (\n      | string\n      | TestMetadataAcceptedValues\n      | TestMetadataRelationships\n      | {\n          [x: string]: any;\n        }\n      | null\n    )[],\n  ) {\n    const seen = new Set();\n    return tests.filter((item) => {\n      const stringified = JSON.stringify(item);\n      if (seen.has(stringified)) {\n        return false;\n      }\n      seen.add(stringified);\n      return true;\n    });\n  }\n\n  private returnTestMetadataFromKwargs(test: TestMetaData) {\n    // If this is new test added in doc editor webview panel and not saved yet, return the config from kwargs\n    if (test.test_metadata?.kwargs) {\n      const { model, ...rest } = test.test_metadata.kwargs;\n      if (Object.keys(rest).length > 0) {\n        return stringify(rest);\n      }\n    }\n  }\n\n  private filterAndStringifyTest = (\n    testsPerColumnOrModelFromYml: Record<string, Record<string, unknown>>[],\n    test: TestMetaData,\n  ) => {\n    if (!testsPerColumnOrModelFromYml?.length) {\n      return this.returnTestMetadataFromKwargs(test);\n    }\n\n    // Ignore these generic fields, as we handle these fields differently in UI\n    const ignoredFields = [\"model\", \"column_name\", \"field\", \"to\", \"values\"];\n\n    if (!test.test_metadata) {\n      return;\n    }\n    const { name, namespace } = test.test_metadata;\n    const fullName = namespace ? `${namespace}.${name}` : name;\n\n    const existingConfig = getColumnTestConfigFromYml(\n      testsPerColumnOrModelFromYml,\n      test.test_metadata.kwargs,\n      fullName,\n    );\n\n    if (!existingConfig) {\n      this.dbtTerminal.debug(\"getDbtTestCode\", \"no test available in yml\");\n      return this.returnTestMetadataFromKwargs(test);\n    }\n\n    this.dbtTerminal.debug(\n      \"getDbtTestCode\",\n      \"sending selected config from yml\",\n      existingConfig,\n    );\n\n    // Remove fields which are already handled in UI\n    const filteredConfig = Object.entries(existingConfig).reduce(\n      (acc: Record<string, unknown>, [key, value]) => {\n        if (ignoredFields.includes(key)) {\n          return acc;\n        }\n\n        acc[key] = value;\n        return acc;\n      },\n      {},\n    );\n    // If test is from external package ex: dbt_utils, show the package namespace as well\n    const refinedTestConfig = namespace\n      ? {\n          [fullName]: filteredConfig,\n        }\n      : filteredConfig;\n    return stringify(refinedTestConfig);\n  };\n\n  /**\n   * Find the extra config for test from schema.yml, if available\n   */\n  public getConfigByTest(\n    test: TestMetaData,\n    modelName: string,\n    columnNameFromTestMetadata?: string,\n  ) {\n    const eventResult = this.queryManifestService.getEventByCurrentProject();\n    if (!eventResult?.event) {\n      return;\n    }\n    const {\n      event: { nodeMetaMap },\n    } = eventResult;\n    const node = nodeMetaMap.lookupByBaseName(modelName);\n    if (!node) {\n      return;\n    }\n    const project = this.queryManifestService.getProject();\n    if (!project) {\n      return;\n    }\n\n    const patchPath = node?.patch_path?.includes(\"://\")\n      ? path.join(project.projectRoot.fsPath, removeProtocol(node.patch_path))\n      : node.patch_path;\n\n    if (!patchPath) {\n      this.dbtTerminal.debug(\n        \"getDbtTestCode\",\n        \"unable to find patch path\",\n        patchPath,\n      );\n      return null;\n    }\n    this.dbtTerminal.debug(\n      \"getDbtTestCode\",\n      \"finding test from yaml\",\n      patchPath,\n    );\n    const parsedDocFile = parse(\n      readFileSync(patchPath, { encoding: \"utf-8\" }),\n      {\n        strict: false,\n        uniqueKeys: false,\n        maxAliasCount: -1,\n      },\n    );\n\n    if (!parsedDocFile) {\n      this.dbtTerminal.debug(\n        \"getDbtTestCode\",\n        \"yml file does not have any content\",\n        patchPath,\n      );\n      return null;\n    }\n\n    const model = parsedDocFile.models?.find((m: any) => m.name === modelName);\n\n    // model test\n    if (!columnNameFromTestMetadata) {\n      this.dbtTerminal.debug(\n        \"getDbtTestCode\",\n        \"finding model test from yml\",\n        parsedDocFile,\n        model,\n      );\n      return this.filterAndStringifyTest(model?.tests, test);\n    }\n\n    const column =\n      model.columns &&\n      model.columns.find((yamlColumn: any) =>\n        isColumnNameEqual(yamlColumn.name, columnNameFromTestMetadata),\n      );\n    this.dbtTerminal.debug(\n      \"getDbtTestCode\",\n      \"finding column test from yml\",\n      parsedDocFile,\n      model,\n      column,\n    );\n\n    return this.filterAndStringifyTest(column?.tests, test);\n  }\n\n  // Find the file path of test macro\n  private getMacroFilePath = (\n    macros: [string],\n    projectName: string,\n    macroMetaMap: MacroMetaMap,\n    testName: string | undefined,\n  ) => {\n    if (!testName) {\n      return;\n    }\n\n    // Find if current test depends on test macro in current project\n    const macro = macros.find(\n      (m) => m === `macro.${projectName}.test_${testName}`,\n    );\n\n    if (macro) {\n      // return the file path if it ends with sql\n      const macroData = macroMetaMap.get(`test_${testName}`);\n      return macroData?.path?.endsWith(\".sql\") ? macroData?.path : undefined;\n    }\n  };\n\n  public async createTest(\n    params: Partial<CreateDbtTestRequest> & {\n      column?: string;\n      filePath?: string;\n    },\n    syncRequestId?: string,\n  ) {\n    if (!this.altimateAuthService.handlePreviewFeatures()) {\n      return;\n    }\n\n    const { session_id } = params;\n    if (!session_id) {\n      throw new UserInputError(\"Invalid session id\");\n    }\n\n    if (!params.filePath) {\n      throw new UserInputError(\"Invalid file path\");\n    }\n\n    const dbtProject = this.queryManifestService.getProject();\n\n    if (!dbtProject) {\n      throw new Error(\"Invalid dbt project\");\n    }\n\n    const adapter = dbtProject.getAdapterType();\n    const { documentation } = await this.docGenService.getCompiledDocumentation(\n      params.filePath,\n    );\n    if (!documentation) {\n      throw new Error(\"Unable to find documentation for the model\");\n    }\n\n    const queryText = window.activeTextEditor?.document.getText();\n\n    return this.streamingService.fetchAsStream<CreateDbtTestRequest>({\n      endpoint: \"dbt/v2/dbt-test\",\n      syncRequestId,\n      request: {\n        ...params,\n        session_id: session_id as string,\n        column_name: params.column as string | undefined,\n        model: {\n          model_name: documentation.name,\n          adapter,\n          compiled_sql: await dbtProject.unsafeCompileQuery(queryText || \"\"),\n          columns: documentation.columns.map((c) => ({\n            column_name: c.name,\n            data_type: c.type,\n          })),\n        },\n      },\n    });\n  }\n\n  public async getTestsForCurrentModel() {\n    const eventResult = this.queryManifestService.getEventByCurrentProject();\n    if (!eventResult?.event || !eventResult?.currentDocument) {\n      return undefined;\n    }\n\n    const project = this.queryManifestService.getProject();\n    if (!project) {\n      return undefined;\n    }\n\n    const { currentDocument } = eventResult;\n    const modelName = path.basename(currentDocument.uri.fsPath, \".sql\");\n    return this.getTestsForModel(modelName);\n  }\n\n  public async getTestsForModel(modelName: string) {\n    const eventResult = this.queryManifestService.getEventByCurrentProject();\n    if (!eventResult?.event || !eventResult?.currentDocument) {\n      return undefined;\n    }\n\n    const project = this.queryManifestService.getProject();\n    if (!project) {\n      return undefined;\n    }\n    const projectName = project.getProjectName();\n\n    const {\n      event: { nodeMetaMap, graphMetaMap, testMetaMap, macroMetaMap },\n    } = eventResult;\n\n    this.dbtTerminal.debug(\n      \"dbtTests\",\n      \"getting tests by modelName:\",\n      false,\n      modelName,\n    );\n    const _node = nodeMetaMap.lookupByBaseName(modelName);\n    if (!_node) {\n      this.dbtTerminal.debug(\"no node for tableName:\", modelName);\n      return;\n    }\n    const key = _node.unique_id;\n    return (graphMetaMap[\"tests\"].get(key)?.nodes || [])\n      .map((n) => {\n        const testKey = n.label.split(\".\")[0];\n        const testData = testMetaMap.get(testKey);\n\n        if (!testData) {\n          return null;\n        }\n\n        // For singular tests, attached_node will be undefined\n        if (!testData.attached_node) {\n          return { ...testData, key: testKey };\n        }\n\n        // dbt sends tests (ex: relationships) to both source and connected models\n        // do not send the test which has different model in attached_node\n        if (testData.attached_node !== key) {\n          return null;\n        }\n\n        const {\n          depends_on: { macros },\n          test_metadata,\n        } = testData;\n\n        const macroFilepath = this.getMacroFilePath(\n          macros,\n          projectName,\n          macroMetaMap,\n          test_metadata?.name,\n        );\n\n        return {\n          ...testData,\n          path: macroFilepath || testData.path,\n          key: testKey,\n        };\n      })\n      .filter((t) => Boolean(t));\n  }\n\n  public async generateTestsForColumns(\n    project: DBTProject,\n    panel: WebviewView | undefined,\n  ) {\n    if (!this.altimateAuthService.handlePreviewFeatures()) {\n      return;\n    }\n    return await window.withProgress(\n      {\n        title: \"Generating tests...\",\n        location: ProgressLocation.Notification,\n        cancellable: false,\n      },\n      async () => {\n        try {\n          this.telemetryService.startTelemetryEvent(\n            TelemetryEvents[\"DocumentationEditor/BulkGenerateTests\"],\n          );\n\n          const currentFilePath = window.activeTextEditor?.document.uri;\n          if (!currentFilePath) {\n            return;\n          }\n          const modelName = path.basename(currentFilePath.fsPath, \".sql\");\n\n          const columnsInRelation = await project.getColumnsOfModel(modelName);\n          const testSuggestions = await getTestSuggestions({\n            adapter: project.getAdapterType(),\n            columnsInRelation,\n            tableRelation: modelName,\n            dbtConfig: {},\n            queryFn: async (query: string) =>\n              project.immediatelyExecuteSQL(query, modelName),\n          });\n\n          this.telemetryService.endTelemetryEvent(\n            TelemetryEvents[\"DocumentationEditor/BulkGenerateTests\"],\n          );\n          if (!testSuggestions) {\n            return;\n          }\n\n          this.dbtTerminal.debug(\n            \"docsEditPanel:generateTestsForColumns\",\n            \"testSuggestions\",\n            testSuggestions,\n          );\n          const testSuggestionsForModel = testSuggestions?.models[0];\n\n          const sessionID = `${\n            env.sessionId\n          }-${modelName}-numColumns-${testSuggestionsForModel?.columns.length}-${Date.now()}`;\n\n          await this.altimateRequest.trackBulkTestGen(sessionID);\n          return testSuggestionsForModel;\n        } catch (error) {\n          this.telemetryService.endTelemetryEvent(\n            TelemetryEvents[\"DocumentationEditor/BulkGenerateTests\"],\n            error,\n          );\n          this.dbtTerminal.error(\n            \"docsEditPanel:generateTestsForColumns\",\n            \"error\",\n            error,\n          );\n          window.showErrorMessage(\n            extendErrorWithSupportLinks((error as Error).message),\n          );\n        }\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "src/services/diagnosticsOutputChannel.ts",
    "content": "import { OutputChannel, window } from \"vscode\";\nimport { stripANSI } from \"../utils\";\n\nexport class DiagnosticsOutputChannel {\n  private outputChannel: OutputChannel;\n\n  constructor() {\n    this.outputChannel = window.createOutputChannel(\n      \"dbt Power User - Diagnostics\",\n      \"log\",\n    );\n  }\n\n  show(): void {\n    this.outputChannel.show(true);\n  }\n\n  log(message: string): void {\n    this.outputChannel.appendLine(stripANSI(message));\n  }\n\n  logNewLine(): void {\n    this.outputChannel.appendLine(\"\");\n  }\n\n  logLine(line: string): void {\n    this.outputChannel.appendLine(stripANSI(line));\n  }\n\n  logHorizontalRule(): void {\n    this.outputChannel.appendLine(\n      \"--------------------------------------------------------------------------\",\n    );\n  }\n\n  logBlock(block: string[]): void {\n    this.logHorizontalRule();\n    for (const line of block) {\n      if (line) {\n        this.logLine(line);\n      }\n    }\n    this.logHorizontalRule();\n  }\n\n  logBlockWithHeader(header: string[], block: string[]): void {\n    this.logHorizontalRule();\n    for (const line of header) {\n      this.logLine(line);\n    }\n    this.logHorizontalRule();\n    for (const line of block) {\n      this.logLine(line);\n    }\n    this.logHorizontalRule();\n  }\n\n  dispose(): void {\n    this.outputChannel.dispose();\n  }\n}\n"
  },
  {
    "path": "src/services/docGenService.ts",
    "content": "import path = require(\"path\");\nimport {\n  DBTTerminal,\n  NodeMetaData,\n  RateLimitException,\n  RESOURCE_TYPE_MODEL,\n} from \"@altimateai/dbt-integration\";\nimport { promises as fs } from \"fs\";\nimport { inject } from \"inversify\";\nimport * as yaml from \"js-yaml\";\nimport {\n  env,\n  ProgressLocation,\n  Uri,\n  WebviewPanel,\n  WebviewView,\n  window,\n} from \"vscode\";\nimport { AltimateRequest, DocsGenerateResponse } from \"../altimate\";\nimport { DBTProject } from \"../dbt_client/dbtProject\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { TelemetryService } from \"../telemetry\";\nimport { TelemetryEvents } from \"../telemetry/events\";\nimport { extendErrorWithSupportLinks, removeProtocol } from \"../utils\";\nimport {\n  AIColumnDescription,\n  DBTDocumentation,\n  Source,\n} from \"../webview_provider/docsEditPanel\";\nimport { AltimateAuthService } from \"./altimateAuthService\";\nimport { QueryManifestService } from \"./queryManifestService\";\n\ninterface DBTDocumentationMessage {\n  documentation: DBTDocumentation | undefined;\n  message?: { message: string; type: string };\n}\n\nexport interface DocumentationSchemaColumn {\n  name: string;\n  description: string;\n  data_type?: string;\n  quote?: boolean;\n  [key: string]: unknown;\n}\ninterface DocumentationSchemaModel {\n  name: string;\n  description: string;\n  tests: any;\n  columns: { name: string; description?: string; data_type?: string }[];\n}\nexport interface DocumentationSchema {\n  version: number;\n  models: DocumentationSchemaModel[];\n}\n\ninterface GenerateDocsForColumnsProps {\n  panel: WebviewView | WebviewPanel | undefined;\n  message: any;\n  project: DBTProject | undefined;\n  documentation: DBTDocumentation | undefined;\n  isBulkGen: boolean;\n}\n\ninterface GenerateDocsForModelProps {\n  panel: WebviewView | WebviewPanel | undefined;\n  documentation: DBTDocumentation | undefined;\n  queryText: string;\n  project: DBTProject | undefined;\n  message: any;\n  columnIndexCount: number | undefined;\n  isBulkGen: boolean;\n}\n\ninterface FeedbackRequestProps {\n  panel: WebviewView | WebviewPanel | undefined;\n  queryText: string;\n  message: any;\n  syncRequestId?: string;\n}\n\nconst COLUMNS_PER_CHUNK = 3;\n\nexport class DocGenService {\n  public constructor(\n    private altimateRequest: AltimateRequest,\n    protected dbtProjectContainer: DBTProjectContainer,\n    protected telemetry: TelemetryService,\n    private queryManifestService: QueryManifestService,\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n    private altimateAuthService: AltimateAuthService,\n  ) {}\n\n  private getCompiledDocumentationFromNode(\n    currentNode: NodeMetaData | undefined,\n    modelName: string,\n    filePath: string,\n  ): DBTDocumentation | undefined {\n    if (!currentNode) {\n      return;\n    }\n    const docColumns = currentNode.columns;\n    return {\n      aiEnabled: this.altimateRequest.enabled(),\n      name: modelName,\n      patchPath: currentNode.patch_path,\n      description: currentNode.description,\n      generated: false,\n      uniqueId: currentNode.unique_id,\n      resource_type: currentNode.resource_type,\n      filePath,\n      columns: Object.values(docColumns).map((column) => {\n        return {\n          name: column.name,\n          description: column.description,\n          generated: false,\n          source: Source.YAML,\n          type: column.data_type?.toLowerCase(),\n        };\n      }),\n    };\n  }\n\n  private getCurrentNode(modelName: string): NodeMetaData | undefined {\n    const eventResult = this.queryManifestService.getEventByCurrentProject();\n    if (!eventResult || !eventResult.event) {\n      return undefined;\n    }\n\n    const { event } = eventResult;\n    return event.nodeMetaMap.lookupByBaseName(modelName);\n  }\n\n  private async generateDocsForColumn(\n    documentation: DBTDocumentation | undefined,\n    compiledSql: string | undefined,\n    adapter: string,\n    message: any,\n    columns: string[],\n    columnIndexCount: number | undefined = undefined,\n    sessionID: string | undefined = undefined,\n    isBulkGen: boolean = false,\n  ): Promise<DocsGenerateResponse | undefined> {\n    return new Promise(async (resolve, reject) => {\n      if (!documentation) {\n        return resolve(undefined);\n      }\n\n      try {\n        const result = await this.altimateRequest.generateModelDocsV2({\n          columns,\n          dbt_model: {\n            model_name: documentation.name,\n            model_description: message.description,\n            compiled_sql: compiledSql,\n            columns: message.columns.map((column: any) => ({\n              column_name: column.name,\n              description: column.description,\n              data_type: column.type,\n            })),\n            adapter,\n          },\n          gen_model_description: false,\n          user_instructions: message.user_instructions,\n          follow_up_instructions: message.follow_up_instructions,\n          column_index_count: columnIndexCount,\n          session_id: sessionID,\n          is_bulk_gen: isBulkGen,\n        });\n\n        return resolve(result);\n      } catch (err) {\n        this.dbtTerminal.debug(\n          \"docGenService:generateDocsForColumn\",\n          \"error while generating column doc\" + err,\n          columns,\n        );\n\n        if (err instanceof RateLimitException) {\n          setTimeout(async () => {\n            this.dbtTerminal.debug(\n              \"docGenService:generateDocsForColumn\",\n              \"retrying generating column doc\",\n              columns,\n            );\n            return resolve(\n              await this.generateDocsForColumn(\n                documentation,\n                compiledSql,\n                adapter,\n                message,\n                columns,\n              ),\n            );\n          }, err.retryAfter);\n          return;\n        }\n        reject(err);\n      }\n    });\n  }\n\n  private async transmitAIGeneratedColumnDocs(\n    panel: WebviewView | WebviewPanel | undefined,\n    generatedColumnDescriptions: AIColumnDescription[],\n    syncRequestId?: string,\n  ) {\n    if (panel) {\n      const result = syncRequestId\n        ? {\n            command: \"response\",\n            args: {\n              body: { columns: generatedColumnDescriptions },\n              syncRequestId,\n              status: true,\n            },\n          }\n        : {\n            command: \"renderAIGeneratedColumnDocs\",\n            columns: generatedColumnDescriptions,\n          };\n      await panel.webview.postMessage(result);\n    }\n  }\n\n  private async transmitError(panel?: WebviewView | WebviewPanel) {\n    if (panel) {\n      await panel.webview.postMessage({\n        command: \"renderError\",\n      });\n    }\n  }\n\n  private async transmitAIGeneratedModelDocs(\n    response: DocsGenerateResponse,\n    syncRequestId?: string,\n    panel?: WebviewView | WebviewPanel,\n  ) {\n    if (panel) {\n      const result = syncRequestId\n        ? {\n            command: \"response\",\n            args: { body: response, syncRequestId, status: true },\n          }\n        : {\n            command: \"renderAIGeneratedModelDocs\",\n            response,\n          };\n      await panel.webview.postMessage(result);\n    }\n  }\n\n  public async getCompiledDocumentationForCurrentActiveFile() {\n    return this.getCompiledDocumentation(\n      window.activeTextEditor?.document?.uri.fsPath,\n    );\n  }\n\n  public async getUncompiledDocumentationForCurrentActiveFile() {\n    return this.getUncompiledDocumentation(\n      window.activeTextEditor?.document?.uri.fsPath,\n    );\n  }\n\n  private getDocumentationValidationMessage(\n    filePath?: string,\n    context?: \"project\" | \"node\" | \"resource_type\" | \"model_path\",\n  ) {\n    // File is not a .sql file\n    if (!filePath?.endsWith(\".sql\")) {\n      return {\n        message:\n          \"Documentation is only available for .sql files. Please open a dbt model (.sql) file.\",\n        type: \"warning\",\n      };\n    }\n\n    // Check for project diagnostics errors\n    try {\n      this.queryManifestService\n        .getProjectByUri(Uri.file(filePath))\n        ?.throwDiagnosticsErrorIfAvailable();\n    } catch (err) {\n      return { message: (err as Error).message, type: \"error\" };\n    }\n\n    // Context-specific error messages\n    if (context === \"project\") {\n      return {\n        message:\n          \"Unable to find dbt project or project root for this file. Ensure the file is part of a valid dbt project.\",\n        type: \"warning\",\n      };\n    }\n\n    if (context === \"node\") {\n      return {\n        message:\n          \"Model not found in dbt manifest. Ensure the model has been compiled and exists in the dbt project.\",\n        type: \"warning\",\n      };\n    }\n\n    if (context === \"resource_type\") {\n      return {\n        message:\n          \"Documentation is only available for dbt models. This file appears to be a snapshot, macro, test, or other dbt resource type which is not supported.\",\n        type: \"warning\",\n      };\n    }\n\n    // Default generic message\n    return {\n      message:\n        \"A valid dbt model file needs to be open and active in the editor area above to view documentation for that model.\",\n      type: \"warning\",\n    };\n  }\n\n  private async getDocumentation(\n    filePath?: string,\n    compiled: boolean = true,\n  ): Promise<DBTDocumentationMessage> {\n    // Initial validation (file path, .sql extension, diagnostics)\n    const initialValidation = this.getDocumentationValidationMessage(filePath);\n    if (initialValidation.type === \"error\" || !filePath) {\n      return { documentation: undefined, message: initialValidation };\n    }\n\n    const modelName = path.basename(filePath, \".sql\");\n    const project = this.dbtProjectContainer.findDBTProject(Uri.file(filePath));\n\n    // Project validation\n    if (!project || !project.projectRoot) {\n      return {\n        documentation: undefined,\n        message: this.getDocumentationValidationMessage(filePath, \"project\"),\n      };\n    }\n\n    // Model path validation - ensure file is in configured model directories\n    const modelPaths = project.getModelPaths();\n    if (\n      !modelPaths ||\n      !modelPaths.some(\n        (modelPath) =>\n          filePath.startsWith(modelPath + path.sep) ||\n          path.dirname(filePath) === modelPath,\n      )\n    ) {\n      return {\n        documentation: undefined,\n        message: this.getDocumentationValidationMessage(filePath, \"model_path\"),\n      };\n    }\n\n    // Node validation\n    const currentNode = this.getCurrentNode(modelName);\n    if (!currentNode) {\n      return {\n        documentation: undefined,\n        message: this.getDocumentationValidationMessage(filePath, \"node\"),\n      };\n    }\n\n    // Resource type validation - ensure it's a model\n    if (currentNode.resource_type !== RESOURCE_TYPE_MODEL) {\n      return {\n        documentation: undefined,\n        message: this.getDocumentationValidationMessage(\n          filePath,\n          \"resource_type\",\n        ),\n      };\n    }\n\n    // Branch based on compiled vs uncompiled\n    if (compiled) {\n      // Compiled documentation path\n      const documentation = this.getCompiledDocumentationFromNode(\n        currentNode,\n        modelName,\n        filePath,\n      );\n      return { documentation };\n    } else {\n      // Uncompiled documentation path\n      if (!currentNode.patch_path) {\n        return {\n          documentation: {\n            aiEnabled: this.altimateRequest.enabled(),\n            name: modelName,\n            description: \"\",\n            uniqueId: currentNode.unique_id,\n            resource_type: currentNode.resource_type,\n            generated: false,\n            filePath,\n            columns: [],\n          },\n        };\n      }\n\n      try {\n        // Read and parse the YAML file\n        const yamlPath = path.join(\n          project.projectRoot.fsPath,\n          removeProtocol(currentNode.patch_path),\n        );\n        const content = await fs.readFile(yamlPath, \"utf8\");\n        const parsedDoc = yaml.load(content) as DocumentationSchema;\n\n        // Find matching model definition\n        const modelDef = parsedDoc.models?.find((m) => m.name === modelName);\n        if (!modelDef) {\n          return {\n            documentation: {\n              aiEnabled: this.altimateRequest.enabled(),\n              name: modelName,\n              description: \"\",\n              uniqueId: currentNode.unique_id,\n              resource_type: currentNode.resource_type,\n              filePath,\n              generated: false,\n              columns: [],\n            },\n          };\n        }\n\n        // Map to DBTDocumentation format\n        return {\n          documentation: {\n            aiEnabled: this.altimateRequest.enabled(),\n            name: modelName,\n            patchPath: currentNode.patch_path,\n            description: modelDef.description || \"\",\n            generated: false,\n            uniqueId: currentNode.unique_id,\n            resource_type: currentNode.resource_type,\n            filePath,\n            columns: (modelDef.columns || []).map((column) => ({\n              name: column.name,\n              description: column.description || \"\",\n              generated: false,\n              source: Source.YAML,\n              type: column.data_type?.toLowerCase(),\n            })),\n          },\n        };\n      } catch (error) {\n        this.dbtTerminal.error(\n          \"docGenService:getDocumentationYamlError\",\n          `Error reading YAML documentation: ${error}`,\n          error,\n        );\n      }\n      // falling back on compiled implementation\n      return this.getDocumentation(filePath, true);\n    }\n  }\n\n  public async getCompiledDocumentation(\n    filePath?: string,\n  ): Promise<DBTDocumentationMessage> {\n    return this.getDocumentation(filePath, true);\n  }\n\n  public async getUncompiledDocumentation(\n    filePath?: string,\n  ): Promise<DBTDocumentationMessage> {\n    return this.getDocumentation(filePath, false);\n  }\n\n  private chunk(a: string[], n: number) {\n    return [...Array(Math.ceil(a.length / n))].map((_, i) =>\n      a.slice(n * i, n + n * i),\n    );\n  }\n\n  /**\n   * handles single or multi column bulk generation\n   */\n  public async generateDocsForColumns({\n    project,\n    message,\n    documentation,\n    panel,\n    isBulkGen,\n  }: GenerateDocsForColumnsProps) {\n    if (!this.altimateAuthService.handlePreviewFeatures()) {\n      return;\n    }\n    if (!project || !window.activeTextEditor) {\n      return;\n    }\n\n    const queryText = window.activeTextEditor.document.getText();\n    const columns: string[] = message.columnName\n      ? [message.columnName]\n      : message.columnNames;\n\n    const chunks = this.chunk(columns, COLUMNS_PER_CHUNK);\n    const telemetryEventName = isBulkGen\n      ? message.isAll\n        ? TelemetryEvents[\"DocumentationEditor/BulkGenerateAllClick\"]\n        : TelemetryEvents[\"DocumentationEditor/BulkGenerateMissingColumnsClick\"]\n      : TelemetryEvents[\"DocumentationEditor/GenerateDescForColumnClick\"];\n\n    this.telemetry.startTelemetryEvent(telemetryEventName, {\n      model: documentation?.name || \"\",\n      columns: columns.join(\",\"),\n    });\n\n    window.withProgress(\n      {\n        title: \"\",\n        location: ProgressLocation.Notification,\n        cancellable: false,\n      },\n      async (progress) => {\n        if (documentation === undefined) {\n          return;\n        }\n        try {\n          const results: (DocsGenerateResponse | undefined)[] = [];\n          const progressMessage =\n            columns.length > COLUMNS_PER_CHUNK\n              ? `Generating documentation for ${columns.length} columns`\n              : `Generating documentation for ${\n                  columns.length > 1 ? \"columns\" : \"column\"\n                } ${columns.join(\", \")}`;\n          progress.report({\n            message: progressMessage,\n            increment: 0,\n          });\n\n          const compiledSql = await project.unsafeCompileQuery(queryText);\n          const columnIndexCount = isBulkGen\n            ? chunks.length * COLUMNS_PER_CHUNK\n            : 1;\n          const sessionID = `${\n            env.sessionId\n          }-${documentation?.name}-numColumns-${columnIndexCount}-${Date.now()}`;\n\n          await Promise.all(\n            chunks.map(async (chunk, i) => {\n              const chunkResult = await this.generateDocsForColumn(\n                documentation,\n                compiledSql,\n                project.getAdapterType(),\n                message,\n                chunk,\n                i * COLUMNS_PER_CHUNK,\n                sessionID,\n                isBulkGen,\n              );\n              results.push(chunkResult);\n              this.dbtTerminal.debug(\n                \"docGenService:generateDocsForColumns\",\n                \"generate docs for columns chunk result\",\n                chunkResult,\n              );\n              progress.report({\n                message: `Generated docs for ${Math.min(\n                  results.length * COLUMNS_PER_CHUNK,\n                  columns.length,\n                )} of ${columns.length} columns`,\n                increment: (chunk.length / columns.length) * 100,\n              });\n            }),\n          );\n          const generatedDocsForColumn = {\n            column_descriptions: results\n              .map((response) => response?.column_descriptions)\n              .filter(\n                (\n                  item,\n                ): item is NonNullable<\n                  DocsGenerateResponse[\"column_descriptions\"]\n                > => !!item,\n              )\n              .flatMap((r) => r),\n          };\n\n          if (\n            !generatedDocsForColumn ||\n            !generatedDocsForColumn.column_descriptions\n          ) {\n            // nothing to do if nothing happened\n            return;\n          }\n          this.transmitAIGeneratedColumnDocs(\n            panel,\n            generatedDocsForColumn.column_descriptions.map((entry) => ({\n              name: entry.column_name,\n              description: entry.column_description,\n              citations: entry.column_citations,\n            })),\n            message.syncRequestId,\n          );\n          this.telemetry.endTelemetryEvent(telemetryEventName, undefined, {\n            model: documentation?.name || \"\",\n            columns: columns.join(\",\"),\n          });\n        } catch (error) {\n          this.transmitError(panel);\n          window.showErrorMessage(\n            extendErrorWithSupportLinks(\n              \"Could not generate documentation: \" + (error as Error).message,\n            ),\n          );\n          this.telemetry.endTelemetryEvent(telemetryEventName, error, {\n            model: documentation?.name || \"\",\n            columns: columns.join(\",\"),\n          });\n        }\n      },\n    );\n  }\n\n  public async generateDocsForModel({\n    documentation,\n    queryText,\n    project,\n    message,\n    panel,\n    columnIndexCount,\n    isBulkGen,\n  }: GenerateDocsForModelProps) {\n    if (!this.altimateAuthService.handlePreviewFeatures()) {\n      return;\n    }\n    if (!project) {\n      return;\n    }\n    this.telemetry.startTelemetryEvent(\n      TelemetryEvents[\"DocumentationEditor/GenerateDescForModelClick\"],\n      {\n        model: documentation?.name || \"\",\n      },\n    );\n\n    window.withProgress(\n      {\n        title: `Generating documentation for model ${documentation?.name}`,\n        location: ProgressLocation.Notification,\n        cancellable: false,\n      },\n      async () => {\n        if (documentation === undefined) {\n          return;\n        }\n        try {\n          const compiledSql = await project.unsafeCompileQuery(queryText);\n          const sessionID = `${\n            env.sessionId\n          }-${documentation?.name}-numColumns-0-${Date.now()}`;\n          const generateDocsForModel =\n            await this.altimateRequest.generateModelDocsV2({\n              columns: [],\n              dbt_model: {\n                model_name: documentation?.name,\n                model_description: message.description,\n                compiled_sql: compiledSql,\n                columns: message.columns.map((column: any) => ({\n                  column_name: column.name,\n                  description: column.description,\n                  data_type: column.type,\n                  modelName: documentation?.name,\n                })),\n                adapter: project.getAdapterType(),\n              },\n              prompt_hint: message.promptHint || \"generate\",\n              gen_model_description: true,\n              user_instructions: {\n                ...message.user_instructions,\n                prompt_hint:\n                  message.user_instructions.prompt_hint || \"generate\",\n              },\n              follow_up_instructions: message.follow_up_instructions,\n              column_index_count: columnIndexCount,\n              session_id: sessionID,\n              is_bulk_gen: isBulkGen,\n            });\n\n          if (\n            !generateDocsForModel ||\n            !generateDocsForModel.model_description\n          ) {\n            // nothing to do if nothing happened\n            return;\n          }\n          this.transmitAIGeneratedModelDocs(\n            generateDocsForModel,\n            message.syncRequestId,\n            panel,\n          );\n          this.telemetry.endTelemetryEvent(\n            TelemetryEvents[\"DocumentationEditor/GenerateDescForModelClick\"],\n            undefined,\n            {\n              model: documentation?.name || \"\",\n            },\n          );\n        } catch (error) {\n          this.transmitError(panel);\n          window.showErrorMessage(\n            extendErrorWithSupportLinks(\n              \"Could not generate documentation: \" + (error as Error).message,\n            ),\n          );\n          this.telemetry.endTelemetryEvent(\n            TelemetryEvents[\"DocumentationEditor/GenerateDescForModelClick\"],\n            error,\n            {\n              model: documentation?.name || \"\",\n            },\n          );\n        }\n      },\n    );\n  }\n\n  public async sendFeedback({\n    queryText,\n    message,\n    panel,\n    syncRequestId,\n  }: FeedbackRequestProps) {\n    this.telemetry.startTelemetryEvent(TelemetryEvents[\"Datapilot/Feedback\"]);\n    window.withProgress(\n      {\n        title: \"Sending feedback\",\n        location: ProgressLocation.Notification,\n        cancellable: false,\n      },\n      async () => {\n        try {\n          const project = this.queryManifestService.getProject();\n          if (!project) {\n            throw new Error(\"Unable to find project\");\n          }\n          const { documentation } = await this.getUncompiledDocumentation();\n          const compiledSql = await project.unsafeCompileQuery(queryText);\n          const request = message.data;\n          request[\"feedback_text\"] = message.comment;\n          request[\"additional_prompt_inputs\"] = {\n            model_name: documentation?.name,\n            model_description: documentation?.description,\n            compiled_sql: compiledSql,\n            columns: documentation?.columns.map((column) => ({\n              column_name: column.name,\n              description: column.description,\n              data_type: column.type,\n            })),\n          };\n          await this.altimateRequest.sendFeedback({\n            data: request,\n            feedback_src: \"dbtpu-extension\",\n            feedback_text: message.comment,\n            feedback_value: message.rating,\n          });\n          if (panel) {\n            await panel.webview.postMessage({\n              command: \"response\",\n              args: {\n                syncRequestId,\n                body: {\n                  status: true,\n                },\n                status: true,\n              },\n            });\n          }\n          this.telemetry.endTelemetryEvent(\n            TelemetryEvents[\"Datapilot/Feedback\"],\n          );\n        } catch (error) {\n          this.telemetry.endTelemetryEvent(\n            TelemetryEvents[\"Datapilot/Feedback\"],\n            error,\n          );\n          this.transmitError(panel);\n          window.showErrorMessage(\n            extendErrorWithSupportLinks(\n              \"Could not send feedback: \" + (error as Error).message,\n            ),\n          );\n          this.telemetry.sendTelemetryError(\n            \"altimateGenerateDocsSendFeedbackError\",\n            error,\n          );\n        }\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "src/services/fileService.ts",
    "content": "import { TextDocument, TextEditor, Uri, window, workspace } from \"vscode\";\n\n/**\n * service to promisify file related actions\n */\nexport class FileService {\n  public async openFileByPath(path?: string): Promise<TextEditor> {\n    return new Promise((resolve, reject) => {\n      if (!path) {\n        reject(new Error(\"Invalid file path\"));\n        return;\n      }\n      workspace.openTextDocument(Uri.file(path)).then(\n        (file: TextDocument) => {\n          window.showTextDocument(file, 1, false).then(\n            (e) => {\n              resolve(e);\n            },\n            (error) => {\n              reject(error);\n            },\n          );\n        },\n        (error) => {\n          reject(error);\n        },\n      );\n    });\n  }\n}\n"
  },
  {
    "path": "src/services/queryAnalysisService.ts",
    "content": "import { DBTTerminal } from \"@altimateai/dbt-integration\";\nimport { inject } from \"inversify\";\nimport { Range, window } from \"vscode\";\nimport {\n  AltimateRequest,\n  QueryAnalysisRequest,\n  QueryAnalysisType,\n  QueryTranslateExplanationRequest,\n  QueryTranslateRequest,\n  UserInputError,\n} from \"../altimate\";\nimport { AltimateAuthService } from \"./altimateAuthService\";\nimport { DocGenService } from \"./docGenService\";\nimport { FileService } from \"./fileService\";\nimport { QueryManifestService } from \"./queryManifestService\";\nimport { StreamingService } from \"./streamingService\";\n\nexport interface QueryTranslateIncomingRequest {\n  source?: string;\n  target?: string;\n  filePath?: string;\n}\n\nexport interface QueryTranslateExplanationIncomingRequest {\n  source?: string;\n  target?: string;\n  userSql: string;\n  translatedSql: string;\n}\n\nexport class QueryAnalysisService {\n  public constructor(\n    private docGenService: DocGenService,\n    private streamingService: StreamingService,\n    private altimateRequest: AltimateRequest,\n    private queryManifestService: QueryManifestService,\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n    private fileService: FileService,\n    private altimateAuthService: AltimateAuthService,\n  ) {}\n\n  public getSelectedQuery() {\n    const editor = window.activeTextEditor;\n    if (!editor) {\n      return null;\n    }\n    const fileName = editor.document.fileName.split(\"/\").pop();\n    const selection = editor.selection;\n    if (selection && !selection.isEmpty) {\n      const selectionRange = new Range(\n        selection.start.line,\n        selection.start.character,\n        selection.end.line,\n        selection.end.character,\n      );\n      return {\n        query: editor.document.getText(selectionRange),\n        fileName: `${fileName} (L${selection.start.line + 1}-L${\n          selection.end.line + 1\n        })`,\n      };\n    }\n\n    return { query: editor.document.getText(), fileName };\n  }\n\n  public async executeQueryTranslate(params: QueryTranslateIncomingRequest) {\n    if (!this.altimateAuthService.handlePreviewFeatures()) {\n      return;\n    }\n\n    if (!params.filePath) {\n      throw new UserInputError(\n        \"Invalid file. Please open a valid file with SQL\",\n      );\n    }\n\n    const editor = await this.fileService.openFileByPath(params.filePath);\n\n    const sql = editor.document.getText();\n\n    if (!params.source) {\n      throw new UserInputError(\"Invalid source dialect\");\n    }\n\n    if (!params.target) {\n      throw new UserInputError(\"Invalid target dialect\");\n    }\n\n    const dbtProject = this.queryManifestService.getProject();\n\n    if (!dbtProject) {\n      const error = new Error(\"Invalid dbt project\");\n      this.dbtTerminal.error(\n        \"executeQueryAnalysisError\",\n        \"Invalid dbt project\",\n        error,\n      );\n      throw error;\n    }\n\n    const compiledSql = await dbtProject.unsafeCompileQuery(sql);\n    const response = (await this.altimateRequest.fetch(\"dbt/v3/translate\", {\n      method: \"POST\",\n      body: JSON.stringify({\n        source_dialect: params.source,\n        target_dialect: params.target,\n        sql: compiledSql,\n      } as QueryTranslateRequest),\n    })) as { translated_sql: string };\n    return {\n      translatedSql: response.translated_sql,\n      userSql: compiledSql,\n    };\n  }\n\n  public async executeQueryTranslateExplanation(\n    params: QueryTranslateExplanationIncomingRequest,\n    syncRequestId?: string,\n  ) {\n    if (!this.altimateAuthService.handlePreviewFeatures()) {\n      return;\n    }\n\n    if (!params.source) {\n      throw new UserInputError(\"Invalid source dialect\");\n    }\n\n    if (!params.target) {\n      throw new UserInputError(\"Invalid target dialect\");\n    }\n\n    return this.streamingService.fetchAsStream<QueryTranslateExplanationRequest>(\n      {\n        endpoint: \"dbt/v3/translate-explanation\",\n        syncRequestId,\n        request: {\n          source_dialect: params.source,\n          target_dialect: params.target,\n          translated_sql: params.translatedSql,\n          user_sql: params.userSql,\n        } as QueryTranslateExplanationRequest,\n      },\n    );\n  }\n\n  public async executeQueryAnalysis(\n    params: Partial<QueryAnalysisRequest> & {\n      filePath?: string;\n    },\n    job_type: QueryAnalysisType,\n    syncRequestId?: string,\n  ) {\n    if (!this.altimateAuthService.handlePreviewFeatures()) {\n      return;\n    }\n\n    const { session_id } = params;\n    if (!session_id) {\n      const error = new Error(\"Invalid session id\");\n      this.dbtTerminal.error(\n        \"executeQueryAnalysisError\",\n        \"Missing session id\",\n        error,\n      );\n      throw error;\n    }\n\n    const selectionData = this.getSelectedQuery();\n    if (!selectionData) {\n      const error = new Error(\"Invalid query\");\n      this.dbtTerminal.error(\n        \"executeQueryAnalysisError\",\n        \"Missing query\",\n        error,\n      );\n      throw error;\n    }\n    const { query } = selectionData;\n    const dbtProject = this.queryManifestService.getProject();\n\n    if (!dbtProject) {\n      const error = new Error(\"Invalid dbt project\");\n      this.dbtTerminal.error(\n        \"executeQueryAnalysisError\",\n        \"Invalid dbt project\",\n        error,\n      );\n      throw error;\n    }\n\n    const adapter = dbtProject.getAdapterType() || \"unknown\";\n    const { documentation } = await this.docGenService.getCompiledDocumentation(\n      params.filePath,\n    );\n    if (!documentation) {\n      const error = new Error(\"Invalid model\");\n      this.dbtTerminal.error(\n        \"executeQueryAnalysisError\",\n        \"Unable to find documentation for the model\",\n        error,\n      );\n      throw error;\n    }\n    return this.streamingService.fetchAsStream<QueryAnalysisRequest>({\n      endpoint: \"dbt/v2/query-analysis\",\n      syncRequestId,\n      request: {\n        session_id,\n        job_type,\n        model: {\n          model_name: documentation.name,\n          adapter,\n          compiled_sql: await dbtProject.unsafeCompileQuery(query),\n          columns: documentation.columns.map((c) => ({\n            column_name: c.name,\n            data_type: c.type,\n          })),\n        },\n        ...params,\n      },\n    });\n  }\n\n  public async getFollowupQuestions({\n    query,\n    user_request,\n    filePath,\n  }: {\n    query: string;\n    user_request: string;\n    filePath?: string;\n  }) {\n    if (!this.altimateAuthService.handlePreviewFeatures()) {\n      return;\n    }\n    const dbtProject = this.queryManifestService.getProject();\n    if (!dbtProject) {\n      const error = new Error(\"Invalid dbt project\");\n      this.dbtTerminal.error(\n        \"getFollowupQuestionsError\",\n        \"Invalid dbt project\",\n        error,\n      );\n      throw error;\n    }\n\n    const adapter = dbtProject.getAdapterType() || \"unknown\";\n    const { documentation } =\n      await this.docGenService.getCompiledDocumentation(filePath);\n\n    if (!documentation) {\n      const error = new Error(\n        \"To use this feature, a valid model should be open in editor.\",\n      );\n      this.dbtTerminal.error(\n        \"getFollowupQuestionsError\",\n        \"Unable to find documentation for the model\",\n        error,\n      );\n      throw error;\n    }\n    return this.altimateRequest.fetch(\"dbt/v2/follow-up-questions\", {\n      method: \"POST\",\n      body: JSON.stringify({\n        model: {\n          model_name: documentation.name,\n          adapter,\n          compiled_sql: await dbtProject.unsafeCompileQuery(query),\n          columns: documentation.columns.map((c) => ({\n            column_name: c.name,\n            data_type: c.type,\n          })),\n        },\n        user_request,\n      }),\n    });\n  }\n}\n"
  },
  {
    "path": "src/services/queryManifestService.ts",
    "content": "import { DBTTerminal } from \"@altimateai/dbt-integration\";\nimport { inject } from \"inversify\";\nimport { TextDocument, Uri, window } from \"vscode\";\nimport { DBTProject } from \"../dbt_client/dbtProject\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport {\n  ManifestCacheChangedEvent,\n  ManifestCacheProjectAddedEvent,\n} from \"../dbt_client/event/manifestCacheChangedEvent\";\nimport { ProjectQuickPick } from \"../quickpick/projectQuickPick\";\nimport { SharedStateService } from \"./sharedStateService\";\n\nexport class QueryManifestService {\n  private eventMap: Map<string, ManifestCacheProjectAddedEvent> = new Map();\n\n  public constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n    protected emitterService: SharedStateService,\n    private projectQuickPick: ProjectQuickPick,\n  ) {\n    dbtProjectContainer.onDBTProjectsInitialization(() => {\n      this.emitterService.fire({\n        command: \"dbtProjectsInitialized\",\n        payload: {},\n      });\n    });\n\n    dbtProjectContainer.onManifestChanged((event) =>\n      this.onManifestCacheChanged(event),\n    );\n  }\n\n  private async onManifestCacheChanged(event: ManifestCacheChangedEvent) {\n    event.added?.forEach((added) => {\n      this.eventMap.set(added.project.projectRoot.fsPath, added);\n    });\n    event.removed?.forEach((removed) => {\n      this.eventMap.delete(removed.projectRoot.fsPath);\n    });\n  }\n\n  public getProject(): DBTProject | undefined {\n    return this.getProjectByUri(window.activeTextEditor?.document.uri);\n  }\n\n  public getProjectByUri(uri?: Uri): DBTProject | undefined {\n    if (!uri) {\n      return;\n    }\n    return this.dbtProjectContainer.findDBTProject(uri);\n  }\n\n  public getProjectNamesInWorkspace(): string[] | undefined {\n    // remove duplicates\n    return [\n      ...new Set(\n        this.dbtProjectContainer\n          .getProjects()\n          .map((project) => project.getProjectName()),\n      ),\n    ];\n  }\n\n  public getProjectByName(projectName: string) {\n    const projects = this.dbtProjectContainer.getProjects();\n    return projects.find((project) => project.getProjectName() === projectName);\n  }\n\n  public getEventByCurrentProject():\n    | {\n        event: ManifestCacheProjectAddedEvent | undefined;\n        currentDocument: TextDocument;\n      }\n    | undefined {\n    if (window.activeTextEditor === undefined || this.eventMap === undefined) {\n      return;\n    }\n\n    const currentDocument = window.activeTextEditor.document;\n    const currentFilePath = currentDocument.uri;\n    return { event: this.getEventByDocument(currentFilePath), currentDocument };\n  }\n\n  public getEventByDocument(currentFilePath: Uri) {\n    this.dbtTerminal.debug(\n      \"getting event for project, currentFilePath: \",\n      currentFilePath.fsPath,\n    );\n    const projectRootpath =\n      this.dbtProjectContainer.getProjectRootpath(currentFilePath);\n    if (projectRootpath === undefined) {\n      this.dbtTerminal.debug(\n        \"no project for currentFilePath: \",\n        currentFilePath.fsPath,\n      );\n      return;\n    }\n\n    const event = this.eventMap.get(projectRootpath.fsPath);\n    if (event === undefined) {\n      this.dbtTerminal.debug(\"no event for project: \", projectRootpath.fsPath);\n      return;\n    }\n    return event;\n  }\n\n  public getSourcesInProject(currentFilePath?: Uri) {\n    if (!currentFilePath) {\n      return;\n    }\n\n    const projectRootpath =\n      this.dbtProjectContainer.getProjectRootpath(currentFilePath);\n    if (projectRootpath === undefined) {\n      return;\n    }\n\n    const event = this.eventMap.get(projectRootpath.fsPath);\n    if (!event) {\n      return;\n    }\n\n    const sources = event.sourceMetaMap.entries();\n    console.log(event.sourceMetaMap.size, sources);\n    const items = Array.from(sources).map(([key, source]) => ({\n      name: key,\n      tables: source.tables.map((t) => t.name),\n    }));\n\n    return items;\n  }\n\n  public getModelsInProject(\n    currentFilePath?: Uri,\n  ): Iterable<string> | undefined {\n    if (!currentFilePath) {\n      return;\n    }\n\n    const projectRootpath =\n      this.dbtProjectContainer.getProjectRootpath(currentFilePath);\n    if (projectRootpath === undefined) {\n      return;\n    }\n\n    const event = this.eventMap.get(projectRootpath.fsPath);\n    if (!event) {\n      return;\n    }\n\n    // TODO: fix for model versions\n    return Array.from(event.nodeMetaMap.nodes()).map((node) => node.name);\n  }\n\n  // get project based on current active editor\n  // if no editor, then ask user to pick project\n  public async getOrPickProjectFromWorkspace() {\n    const uri =\n      window.activeTextEditor?.document.uri ||\n      window.activeNotebookEditor?.notebook.uri;\n    const project = uri ? this.dbtProjectContainer.findDBTProject(uri) : null;\n\n    if (project) {\n      return project;\n    }\n    this.dbtTerminal.debug(\n      \"getProject\",\n      \"no project name provided, getting all projects in workspace\",\n    );\n    const projects = this.dbtProjectContainer.getProjects();\n    if (projects.length === 1) {\n      this.dbtTerminal.debug(\n        \"getProject\",\n        `single project in workspace, returning project: ${projects[0].getProjectName()}`,\n      );\n      return projects[0];\n    }\n\n    this.dbtTerminal.debug(\n      \"getProject\",\n      \"multiple projects in workspace, prompting user to select project\",\n    );\n\n    const pickedProject = await this.projectQuickPick.projectPicker(projects);\n    if (!pickedProject) {\n      this.dbtTerminal.debug(\"getProject\", \"no project selected, returning\");\n      return;\n    }\n\n    this.dbtTerminal.debug(\n      \"getProject\",\n      `project selected: ${pickedProject.uri}`,\n    );\n    return this.dbtProjectContainer.findDBTProject(pickedProject.uri);\n  }\n}\n"
  },
  {
    "path": "src/services/runHistoryService.ts",
    "content": "import type { RunResultsEventData } from \"@altimateai/dbt-integration\";\nimport { injectable } from \"inversify\";\nimport { Disposable, Event, EventEmitter } from \"vscode\";\n\nexport type {\n  RunResultEntry,\n  RunResultsEventData,\n  RunStatus,\n} from \"@altimateai/dbt-integration\";\n\n@injectable()\nexport class RunHistoryService implements Disposable {\n  private static readonly MAX_ENTRIES = 50;\n\n  private history: RunResultsEventData[] = [];\n\n  private _onHistoryChanged = new EventEmitter<\n    RunResultsEventData | undefined\n  >();\n  readonly onHistoryChanged: Event<RunResultsEventData | undefined> =\n    this._onHistoryChanged.event;\n\n  private disposables: Disposable[] = [this._onHistoryChanged];\n\n  /**\n   * Add a completed run to history.\n   * Accepts pre-parsed RunResultsEventData from dbt-integration.\n   *\n   * Dedup by invocation ID (`entry.id`). Each dbt run generates a unique\n   * invocation_id, so re-running the same command creates a new entry —\n   * this is intentional so users can compare stats across runs. The only\n   * case where dedup fires is fs.watch emitting multiple events for the\n   * same file write (same invocation_id read twice).\n   */\n  addEntry(entry: RunResultsEventData): RunResultsEventData {\n    const existingIndex = this.history.findIndex((e) => e.id === entry.id);\n    if (existingIndex !== -1) {\n      this.history[existingIndex] = entry;\n      this._onHistoryChanged.fire(entry);\n      return entry;\n    }\n\n    this.history.unshift(entry);\n    if (this.history.length > RunHistoryService.MAX_ENTRIES) {\n      this.history.pop();\n    }\n    this._onHistoryChanged.fire(entry);\n    return entry;\n  }\n\n  clear(): void {\n    this.history = [];\n    this._onHistoryChanged.fire(undefined);\n  }\n\n  get entries(): readonly RunResultsEventData[] {\n    return this.history;\n  }\n\n  dispose(): void {\n    this.disposables.forEach((d) => d.dispose());\n  }\n}\n"
  },
  {
    "path": "src/services/sharedStateService.ts",
    "content": "import { EventEmitter } from \"vscode\";\nimport { SharedStateEventEmitterProps } from \"../webview_provider/altimateWebviewProvider\";\n\nexport class SharedStateService {\n  public eventEmitter;\n\n  public constructor() {\n    this.eventEmitter = new EventEmitter<SharedStateEventEmitterProps>();\n  }\n\n  public fire(data: SharedStateEventEmitterProps) {\n    this.eventEmitter.fire(data);\n  }\n}\n"
  },
  {
    "path": "src/services/streamingService.ts",
    "content": "import { AltimateRequest } from \"../altimate\";\nimport { SharedStateService } from \"./sharedStateService\";\n\nexport class StreamingService {\n  public constructor(\n    private altimateRequest: AltimateRequest,\n    private emitterService: SharedStateService,\n  ) {}\n\n  public async fetchAsStream<R>({\n    endpoint,\n    syncRequestId,\n    request,\n  }: {\n    endpoint: string;\n    request: R;\n    syncRequestId?: string;\n  }) {\n    const response = await this.altimateRequest.fetchAsStream<R>(\n      endpoint,\n      request,\n      (chunk: string) => {\n        this.emitterService.fire({\n          command: \"stream:chunk\",\n          payload: {\n            syncRequestId,\n            body: { chunk },\n            status: true,\n          },\n        });\n      },\n    );\n\n    return response;\n  }\n}\n"
  },
  {
    "path": "src/services/usersService.ts",
    "content": "import { DBTTerminal } from \"@altimateai/dbt-integration\";\nimport { inject } from \"inversify\";\nimport { Disposable } from \"vscode\";\nimport { AltimateRequest, TenantUser } from \"../altimate\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { DBTInstallationVerificationEvent } from \"../dbt_client/dbtVersionEvent\";\nimport { AltimateAuthService } from \"./altimateAuthService\";\n\n/**\n * Service to load and store users in tenant and current user\n */\nexport class UsersService implements Disposable {\n  // Local cache of users in tenant\n  private tenantUsers: Record<string, TenantUser> = {};\n  // Local cache of current user\n  private tenantUser: TenantUser | undefined;\n  private disposables: Disposable[] = [];\n\n  public constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n    private altimateRequest: AltimateRequest,\n    private altimateAuthService: AltimateAuthService,\n  ) {\n    this.disposables.push(\n      this.dbtProjectContainer.onDBTInstallationVerification((e) =>\n        this.onDBTInstallationVerification(e),\n      ),\n    );\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n\n  private async onDBTInstallationVerification(\n    event: DBTInstallationVerificationEvent,\n  ) {\n    if (event.installed) {\n      try {\n        // Run both load operations in parallel\n        await Promise.all([this.loadCurrentUser(), this.loadUsersInTenant()]);\n      } catch (e) {\n        this.dbtTerminal.error(\n          \"UsersService.onDBTInstallationVerification\",\n          \"Could not load user from backend\",\n          e,\n          true,\n        );\n      }\n    }\n  }\n\n  private async loadUsersInTenant() {\n    if (this.altimateAuthService.getCredentialsMessage()) {\n      this.dbtTerminal.debug(\n        \"UsersService:loadUsersInTenant\",\n        \"Missing credentials. skipping loadUsersInTenant\",\n      );\n      return;\n    }\n    this.dbtTerminal.debug(\"UsersService\", \"loading tenant users\");\n    const users = await this.altimateRequest.getUsersInTenant();\n    this.tenantUsers = users.reduce((acc: Record<string, TenantUser>, user) => {\n      acc[user.id] = user;\n      return acc;\n    }, {});\n    this.dbtTerminal.debug(\"UsersService\", \"loaded tenant users\", users.length);\n  }\n\n  private async loadCurrentUser() {\n    if (this.altimateAuthService.getCredentialsMessage()) {\n      this.dbtTerminal.debug(\n        \"UsersService:loadCurrentUser\",\n        \"Missing credentials. skipping loadCurrentUser\",\n      );\n      return;\n    }\n    this.dbtTerminal.debug(\"UsersService\", \"loading current user\");\n    const user = await this.altimateRequest.getCurrentUser();\n    this.tenantUser = user;\n    this.dbtTerminal.debug(\"UsersService\", \"loaded current user\", user);\n  }\n\n  public getUserById(userId: TenantUser[\"id\"]) {\n    return this.tenantUsers[userId];\n  }\n\n  get user() {\n    return this.tenantUser;\n  }\n\n  get users() {\n    return Object.values(this.tenantUsers);\n  }\n}\n"
  },
  {
    "path": "src/statusbar/deferToProductionStatusBar.ts",
    "content": "import { DBTTerminal } from \"@altimateai/dbt-integration\";\nimport { inject } from \"inversify\";\nimport {\n  Disposable,\n  StatusBarAlignment,\n  StatusBarItem,\n  TextEditor,\n  window,\n  workspace,\n} from \"vscode\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\n\nexport class DeferToProductionStatusBar implements Disposable {\n  readonly statusBar: StatusBarItem = window.createStatusBarItem(\n    StatusBarAlignment.Left,\n    9,\n  );\n  private disposables: Disposable[] = [];\n\n  constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n  ) {\n    this.disposables.push(\n      workspace.onDidChangeConfiguration(\n        async (e) => {\n          if (!e.affectsConfiguration(\"dbt.deferConfigPerProject\")) {\n            return;\n          }\n          this.updateStatusBar();\n        },\n        this,\n        this.disposables,\n      ),\n    );\n    this.disposables.push(\n      window.onDidChangeActiveTextEditor(\n        async (event: TextEditor | undefined) => {\n          if (event === undefined) {\n            this.statusBar.hide();\n          }\n          this.updateStatusBar();\n        },\n      ),\n    );\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n    this.statusBar.dispose();\n  }\n\n  private showTextInStatusBar(text: string) {\n    this.statusBar.text = text;\n    this.statusBar.command = {\n      title: \"Open Insights Panel\",\n      command: \"dbtPowerUser.openInsights\",\n    };\n    this.statusBar.show();\n  }\n\n  public updateStatusBar() {\n    try {\n      const currentProject = this.getCurrentProject();\n      if (!currentProject) {\n        this.statusBar.hide();\n      }\n      const config = currentProject.getDeferConfig();\n      if (config.deferToProduction) {\n        this.showTextInStatusBar(\"$(sync) Defer\");\n        this.statusBar.show();\n        return;\n      }\n      this.showTextInStatusBar(\"$(sync-ignored) Defer\");\n      this.statusBar.show();\n    } catch (err) {\n      this.statusBar.hide();\n      this.dbtTerminal.debug(\n        \"DeferToProductionStatusBar\",\n        \"Unable to update defer status bar\",\n        err,\n      );\n    }\n  }\n\n  private getCurrentProject() {\n    const projects = this.dbtProjectContainer.getProjects();\n    if (projects.length === 1) {\n      return projects[0];\n    }\n    const currentFilePath = window.activeTextEditor?.document.uri;\n    if (!currentFilePath) {\n      throw new Error(\"No file selected in the editor\");\n    }\n    const currentProject =\n      this.dbtProjectContainer.findDBTProject(currentFilePath);\n\n    if (!currentProject) {\n      throw new Error(\"no Project found for selected document\");\n    }\n    return currentProject;\n  }\n}\n"
  },
  {
    "path": "src/statusbar/index.ts",
    "content": "import { Disposable } from \"vscode\";\nimport { DeferToProductionStatusBar } from \"./deferToProductionStatusBar\";\nimport { TargetStatusBar } from \"./targetStatusBar\";\nimport { VersionStatusBar } from \"./versionStatusBar\";\n\nexport class StatusBars implements Disposable {\n  private disposables: Disposable[] = [];\n\n  constructor(\n    private dbtStatusBar: VersionStatusBar,\n    private deferToProductionStatusBar: DeferToProductionStatusBar,\n    private targetStatusBar: TargetStatusBar,\n  ) {\n    this.disposables.push(this.dbtStatusBar);\n    this.disposables.push(this.deferToProductionStatusBar);\n    this.disposables.push(this.targetStatusBar);\n  }\n\n  initialize() {\n    this.deferToProductionStatusBar.updateStatusBar();\n    this.targetStatusBar.updateStatusBar();\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/statusbar/targetStatusBar.ts",
    "content": "import { DBTTerminal } from \"@altimateai/dbt-integration\";\nimport { inject } from \"inversify\";\nimport {\n  Disposable,\n  StatusBarAlignment,\n  StatusBarItem,\n  TextEditor,\n  window,\n} from \"vscode\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\n\nexport class TargetStatusBar implements Disposable {\n  readonly statusBar: StatusBarItem = window.createStatusBarItem(\n    StatusBarAlignment.Left,\n    9,\n  );\n  private disposables: Disposable[] = [];\n\n  constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n  ) {\n    this.disposables.push(\n      window.onDidChangeActiveTextEditor(\n        async (event: TextEditor | undefined) => {\n          this.updateStatusBar();\n        },\n      ),\n    );\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n    this.statusBar.dispose();\n  }\n\n  public async updateStatusBar() {\n    try {\n      const currentProject = this.getCurrentProject();\n      const targets = await currentProject.getTargetNames();\n      const selectedTarget = await currentProject.getSelectedTarget();\n      if (selectedTarget) {\n        const maxLength = 10;\n        this.statusBar.text = `$(target) ${selectedTarget.length >= maxLength ? selectedTarget.substring(0, maxLength) + \"...\" : selectedTarget}`;\n        this.statusBar.tooltip = `The currently selected target for project ${currentProject.getProjectName()} is ${selectedTarget}`;\n        this.statusBar.command = {\n          title: \"Open Target selector\",\n          command: \"dbtPowerUser.openTargetSelector\",\n          arguments: [targets, currentProject, this, selectedTarget],\n        };\n        this.statusBar.show();\n      }\n    } catch (err) {\n      this.statusBar.hide();\n      this.dbtTerminal.debug(\n        \"TargetStatusBar\",\n        \"Unable to update target status bar\",\n        err,\n      );\n    }\n  }\n\n  private getCurrentProject() {\n    const projects = this.dbtProjectContainer.getProjects();\n    if (projects.length === 1) {\n      return projects[0];\n    }\n    const currentFilePath = window.activeTextEditor?.document.uri;\n    if (!currentFilePath) {\n      throw new Error(\"No file selected in the editor\");\n    }\n    const currentProject =\n      this.dbtProjectContainer.findDBTProject(currentFilePath);\n\n    if (!currentProject) {\n      throw new Error(\"no Project found for selected document\");\n    }\n    return currentProject;\n  }\n}\n"
  },
  {
    "path": "src/statusbar/versionStatusBar.ts",
    "content": "import {\n  Command,\n  Disposable,\n  StatusBarAlignment,\n  StatusBarItem,\n  window,\n  workspace,\n} from \"vscode\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { DBTInstallationVerificationEvent } from \"../dbt_client/dbtVersionEvent\";\nimport { RebuildManifestCombinedStatusChange } from \"../dbt_client/event/manifestCacheChangedEvent\";\n\nexport class VersionStatusBar implements Disposable {\n  readonly statusBar: StatusBarItem = window.createStatusBarItem(\n    StatusBarAlignment.Left,\n    10,\n  );\n  private disposables: Disposable[] = [];\n  private installed: boolean | undefined;\n\n  constructor(private dbtProjectContainer: DBTProjectContainer) {\n    this.disposables.push(\n      this.dbtProjectContainer.onDBTInstallationVerification((e) =>\n        this.onDBTInstallationVerification(e),\n      ),\n      this.dbtProjectContainer.onRebuildManifestStatusChange((e) =>\n        this.onRebuildManifestStatusChange(e),\n      ),\n    );\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n    this.statusBar.dispose();\n  }\n\n  private getDbtText() {\n    const dbtIntegrationMode = workspace\n      .getConfiguration(\"dbt\")\n      .get<string>(\"dbtIntegration\", \"core\");\n    switch (dbtIntegrationMode) {\n      case \"fusion\":\n        return \"dbt fusion\";\n      case \"cloud\":\n        return \"dbt cloud\";\n      default:\n        return \"dbt core\";\n    }\n  }\n\n  private onRebuildManifestStatusChange(\n    event: RebuildManifestCombinedStatusChange,\n  ) {\n    if (!event.inProgress) {\n      if (!this.installed) {\n        this.showTextInStatusBar(\n          `$(error) ${this.getDbtText()} is not installed`,\n        );\n\n        return;\n      }\n      this.showTextInStatusBar(`$(check) ${this.getDbtText()}`);\n      return;\n    }\n    if (event.projects.length === 1) {\n      this.showTextInStatusBar(\n        `$(sync~spin) Parsing ${event.projects[0].getProjectName()}`,\n      );\n      return;\n    }\n    this.showTextInStatusBar(\"$(sync~spin) Parsing projects\");\n  }\n\n  private async onDBTInstallationVerification(\n    event: DBTInstallationVerificationEvent,\n  ) {\n    this.installed = event.installed;\n    if (event.inProgress === true) {\n      this.showTextInStatusBar(\"$(sync~spin) Detecting dbt\");\n      return;\n    }\n    if (!event.installed) {\n      this.showTextInStatusBar(\n        `$(error) ${this.getDbtText()} is not installed`,\n      );\n      return;\n    }\n    this.showTextInStatusBar(`$(check) ${this.getDbtText()}`);\n  }\n\n  private showTextInStatusBar(text: string, command?: Command) {\n    this.statusBar.text = text;\n    this.statusBar.command = command || {\n      title: \"Open Control Panel\",\n      command: \"dbtPowerUser.puQuickPick\",\n    };\n    this.statusBar.show();\n  }\n}\n"
  },
  {
    "path": "src/telemetry/events.ts",
    "content": "export enum TelemetryEventPriority {\n  \"Critical\" = \"Critical\",\n  \"High\" = \"High\",\n  \"Medium\" = \"Medium\",\n  \"Low\" = \"Low\",\n}\n\n// List of event names\nexport enum TelemetryEvents {\n  \"Datapilot/Feedback\" = \"Datapilot/Feedback\",\n  \"DocumentationEditor/Load\" = \"DocumentationEditor/Load\",\n  \"DocumentationEditor/SyncWithDBClick\" = \"DocumentationEditor/SyncWithDBClick\",\n  \"DocumentationEditor/TestsTabClick\" = \"DocumentationEditor/TestsTabClick\",\n  \"DocumentationEditor/SettingsOpen\" = \"DocumentationEditor/SettingsOpen\",\n  \"DocumentationEditor/SettingsUpdate\" = \"DocumentationEditor/SettingsUpdate\",\n  \"DocumentationEditor/HelpOpen\" = \"DocumentationEditor/HelpOpen\",\n  \"DocumentationEditor/HelpTestsOpen\" = \"DocumentationEditor/HelpTestsOpen\",\n  \"DocumentationEditor/HelpDocumentationLinkInDocumentationClick\" = \"DocumentationEditor/HelpDocumentationLinkInDocumentationClick\",\n  \"DocumentationEditor/HelpContactusLinkInDocumentationClick\" = \"DocumentationEditor/HelpContactusLinkInDocumentationClick\",\n  \"DocumentationEditor/HelpDocumentationLinkInTestsClick\" = \"DocumentationEditor/HelpDocumentationLinkInTestsClick\",\n  \"DocumentationEditor/HelpContactusLinkInTestsClick\" = \"DocumentationEditor/HelpContactusLinkInTestsClick\",\n  \"DocumentationEditor/FeedbackClick\" = \"DocumentationEditor/FeedbackClick\",\n  \"DocumentationEditor/BulkGenerateTests\" = \"DocumentationEditor/BulkGenerateTests\",\n  \"DocumentationEditor/SaveClick\" = \"DocumentationEditor/SaveClick\",\n  \"DocumentationEditor/SaveBulk\" = \"DocumentationEditor/SaveBulk\",\n  \"DocumentationEditor/SaveError\" = \"DocumentationEditor/SaveError\",\n  \"DocumentationEditor/SaveNewFilePathSelect\" = \"DocumentationEditor/SaveNewFilePathSelect\",\n  \"DocumentationEditor/BulkGenerateAllClick\" = \"DocumentationEditor/BulkGenerateAllClick\",\n  \"DocumentationEditor/BulkGenerateAllError\" = \"DocumentationEditor/BulkGenerateAllError\",\n  \"DocumentationEditor/BulkGenerateMissingColumnsClick\" = \"DocumentationEditor/BulkGenerateMissingColumnsClick\",\n  \"DocumentationEditor/BulkGenerateMissingColumnsError\" = \"DocumentationEditor/BulkGenerateMissingColumnsError\",\n  \"DocumentationEditor/GenerateDescForModelClick\" = \"DocumentationEditor/GenerateDescForModelClick\",\n  \"DocumentationEditor/GenerateDescForColumnClick\" = \"DocumentationEditor/GenerateDescForColumnClick\",\n  \"DocumentationEditor/GenerateDescByDatapilotForModelClick\" = \"DocumentationEditor/GenerateDescByDatapilotForModelClick\",\n  \"DocumentationEditor/GenerateDescByDatapilotForColumnClick\" = \"DocumentationEditor/GenerateDescByDatapilotForColumnClick\",\n  \"DocumentationEditor/ColumnTestClick\" = \"DocumentationEditor/ColumnTestClick\",\n  \"DocumentationEditor/ModelTestClick\" = \"DocumentationEditor/ModelTestClick\",\n  \"DocumentationEditor/AddTestClick\" = \"DocumentationEditor/AddTestClick\",\n  \"DocumentationEditor/AddCustomTestClick\" = \"DocumentationEditor/AddCustomTestClick\",\n  \"DocumentationEditor/GetDistinctColumnValues\" = \"DocumentationEditor/GetDistinctColumnValues\",\n  \"DocumentationEditor/AcceptedValuesSaveClick\" = \"DocumentationEditor/AcceptedValuesSaveClick\",\n  \"DocumentationEditor/RelationshipsToSelect\" = \"DocumentationEditor/RelationshipsToSelect\",\n  \"DocumentationEditor/RelationshipsFieldSelect\" = \"DocumentationEditor/RelationshipsFieldSelect\",\n  \"DocumentationEditor/RelationshipsSaveClick\" = \"DocumentationEditor/RelationshipsSaveClick\",\n  \"DocumentationEditor/TestEditClick\" = \"DocumentationEditor/TestEditClick\",\n  \"DocumentationEditor/TestEditCancel\" = \"DocumentationEditor/TestEditCancel\",\n  \"DocumentationEditor/TestEditUpdateClick\" = \"DocumentationEditor/TestEditUpdateClick\",\n  \"DocumentationEditor/TestDeleteClick\" = \"DocumentationEditor/TestDeleteClick\",\n  \"DocumentationEditor/AddTestSelect\" = \"DocumentationEditor/AddTestSelect\",\n  \"Notebook/DependenciesInstallCancelled\" = \"Notebook/DependenciesInstallCancelled\",\n  \"Notebook/DependenciesInstalled\" = \"Notebook/DependenciesInstalled\",\n  \"Notebook/DependenciesInstallError\" = \"Notebook/DependenciesInstallError\",\n  \"Notebook/KernelInitializationError\" = \"Notebook/KernelInitializationError\",\n  \"Notebook/KernelCloseError\" = \"Notebook/KernelCloseError\",\n  \"Notebook/Execute\" = \"Notebook/Execute\",\n  \"Notebook/WidgetVersionError\" = \"Notebook/WidgetVersionError\",\n  \"Notebook/SaveError\" = \"Notebook/SaveError\",\n  \"Notebook/Launch\" = \"Notebook/Launch\",\n  \"Notebook/LaunchError\" = \"Notebook/LaunchError\",\n  \"Notebook/StoreDataInKernelError\" = \"Notebook/StoreDataInKernelError\",\n  \"QueryHistory/Disabled\" = \"QueryHistory/Disabled\",\n  \"QueryHistory/Cleared\" = \"QueryHistory/Cleared\",\n  \"CteProfiler/Profile\" = \"CteProfiler/Profile\",\n  \"CteProfiler/Cancel\" = \"CteProfiler/Cancel\",\n  \"MCP/ToolCall\" = \"MCP/ToolCall\",\n  \"MCP/Onboarding\" = \"MCP/Onboarding\",\n  \"MCP/Onboarding/SetUpNow\" = \"MCP/Onboarding/SetUpNow\",\n  \"MCP/Onboarding/Later\" = \"MCP/Onboarding/Later\",\n  \"MCP/Onboarding/Success\" = \"MCP/Onboarding/Success\",\n  \"MCP/Onboarding/Failed\" = \"MCP/Onboarding/Failed\",\n}\n"
  },
  {
    "path": "src/telemetry/index.ts",
    "content": "import TelemetryReporter from \"@vscode/extension-telemetry\";\nimport * as vscode from \"vscode\";\n\nexport class TelemetryService implements vscode.Disposable {\n  private customAttributes: { [key: string]: string } = {};\n  private telemetryReporter: TelemetryReporter = new TelemetryReporter(\n    \"InstrumentationKey=50598369-dd83-4f9a-9a65-ca1fa6f1785c;IngestionEndpoint=https://westus-0.in.applicationinsights.azure.com/;LiveEndpoint=https://westus.livediagnostics.monitor.azure.com/;ApplicationId=429da6f5-e7b0-40e6-a602-adaa8dcde8b9\",\n  );\n  private eventMeasurements = new Map();\n\n  constructor() {\n    this.customAttributes[\"ide\"] = vscode.env.appName;\n  }\n\n  setTelemetryCustomAttribute(key: string, value: string) {\n    this.customAttributes[key] = value;\n  }\n\n  startTelemetryEvent(\n    eventName: string,\n    properties?: { [key: string]: string },\n    measurements?: { [key: string]: number },\n  ) {\n    this.eventMeasurements.set(eventName, new Date().getTime());\n    this.sendTelemetryEvent(eventName, properties, measurements);\n  }\n\n  // TODO: check if we have to identify python exception\n  endTelemetryEvent(\n    eventName: string,\n    error?: unknown,\n    properties?: { [key: string]: string },\n    measurements?: { [key: string]: number },\n  ) {\n    const start = this.eventMeasurements.get(eventName);\n    if (error) {\n      this.sendTelemetryError(`${eventName}Error`, error, properties, {\n        ...(measurements || {}),\n        duration: new Date().getTime() - start,\n      });\n      return;\n    }\n\n    this.sendTelemetryEvent(`${eventName}Success`, properties, {\n      ...(measurements || {}),\n      duration: new Date().getTime() - start,\n    });\n  }\n\n  private getFeatureName(eventName: string) {\n    const [featureName, rest] = eventName.split(\"/\");\n    if (rest) {\n      return { feature: featureName };\n    }\n    return {};\n  }\n\n  sendTelemetryEvent(\n    eventName: string, // TODO: should be TelemetryEvents\n    properties?: { [key: string]: string },\n    measurements?: { [key: string]: number },\n  ) {\n    this.telemetryReporter.sendTelemetryEvent(\n      eventName,\n      {\n        ...this.getFeatureName(eventName),\n        ...properties,\n        instanceName: vscode.workspace\n          .getConfiguration(\"dbt\")\n          .get<string>(\"altimateInstanceName\"),\n        dbtIntegrationMode: vscode.workspace\n          .getConfiguration(\"dbt\")\n          .get<string>(\"dbtIntegration\", \"core\"),\n        localMode: vscode.workspace\n          .getConfiguration(\"dbt\")\n          .get<boolean>(\"isLocalMode\", false)\n          ? \"true\"\n          : \"false\",\n        ...this.customAttributes,\n      },\n      measurements,\n    );\n  }\n\n  sendTelemetryError(\n    eventName: string, // TODO: should be TelemetryEvents\n    error?: unknown,\n    properties?: { [key: string]: string },\n    measurements?: { [key: string]: number },\n  ) {\n    this.telemetryReporter.sendTelemetryErrorEvent(\n      eventName,\n      {\n        ...this.getFeatureName(eventName),\n        ...properties,\n        instanceName: vscode.workspace\n          .getConfiguration(\"dbt\")\n          .get<string>(\"altimateInstanceName\"),\n        dbtIntegrationMode: vscode.workspace\n          .getConfiguration(\"dbt\")\n          .get<string>(\"dbtIntegration\", \"core\"),\n        localMode: vscode.workspace\n          .getConfiguration(\"dbt\")\n          .get<boolean>(\"isLocalMode\", false)\n          ? \"true\"\n          : \"false\",\n        stack: this.removeGenericSecretsFromStackTrace(\n          error !== undefined && error instanceof Error\n            ? error.stack\n            : JSON.stringify(error),\n        ),\n        ...this.customAttributes,\n      },\n      measurements,\n    );\n  }\n\n  private removeGenericSecretsFromStackTrace(\n    error: string | undefined,\n  ): string {\n    if (!error) {\n      return \"\";\n    }\n    return error.replace(\n      /(key|token|sig|secret|signature|password|passwd|pwd|android:value)/i,\n      \"****\",\n    );\n  }\n\n  dispose(): void {\n    this.telemetryReporter?.dispose();\n  }\n}\n"
  },
  {
    "path": "src/test/common.ts",
    "content": "export class MockEventEmitter<T> {\n  private listeners: ((e: T) => any)[] = [];\n\n  event = (listener: (e: T) => any) => {\n    this.listeners.push(listener);\n    return {\n      dispose: () => {\n        const index = this.listeners.indexOf(listener);\n        if (index > -1) {\n          this.listeners.splice(index, 1);\n        }\n      },\n    };\n  };\n\n  fire(data: T): void {\n    this.listeners.forEach((listener) => listener(data));\n  }\n\n  dispose(): void {\n    this.listeners = [];\n  }\n}\n"
  },
  {
    "path": "src/test/fixtures/formatter/README.md",
    "content": "# SQL Formatter Test Fixtures\n\nEach `.sql` file is a test case for `processDiffOutput()`, containing the original SQL before formatting.\n\n## How tests work\n\nThe integration tests use **real sqlfmt** and **real VSCode APIs** via `@vscode/test-electron`:\n\n```text\nfixture.sql -> real sqlfmt (child_process.spawnSync) -> diff output + formatted output\n                                                            |\nreal vscode.TextDocument (from temp file) + diff -> processDiffOutput() -> real TextEdit[]\n                                                                                |\n                                                    vscode.workspace.applyEdit() -> compare vs sqlfmt output\n```\n\nNo mocks, no pre-generated `.diff` files. The diff and expected output are both generated live by invoking `sqlfmt` with the same args used in production. The sqlfmt CLI formatted output is the source of truth.\n\n## Prerequisites\n\nInstall sqlfmt with jinja support:\n\n```bash\npip install \"shandy-sqlfmt[jinjafmt]\"\n```\n\n## Running tests\n\n```bash\n# If sqlfmt is on PATH:\nnpm run test:integration\n\n# Or point to sqlfmt explicitly (useful in CI or virtualenvs):\nSQLFMT_PATH=/path/to/venv/bin/sqlfmt npm run test:integration\n```\n\nIf sqlfmt is not installed (or only the Go `sqlfmt` variant is found), all tests are gracefully skipped via Mocha's `this.skip()`.\n\n## Adding a new fixture\n\n1. Create a new `.sql` file under `src/test/fixtures/formatter/`\n2. Write the SQL to test (the unformatted input)\n3. The test suite auto-discovers all `.sql` files in this directory\n"
  },
  {
    "path": "src/test/fixtures/formatter/add-trailing-newline.sql",
    "content": "select id, name from customers where active = true"
  },
  {
    "path": "src/test/fixtures/formatter/basic-select-reformat.sql",
    "content": "SELECT id,name,\n    created_at FROM customers\nWHERE   active = true\n"
  },
  {
    "path": "src/test/fixtures/formatter/delete-blank-lines.sql",
    "content": "select id, name from customers where active = true\n\norder by name\n"
  },
  {
    "path": "src/test/fixtures/formatter/issue-1717-exact-reproducer.sql",
    "content": "with\n\n    cte1 as (\n\n        select src.*\n        from {{ source(\"my_looooooooooooooong_source_schema_name\", \"my_table_name\") }} as src\n\n    ),\n\n    cte2 as (\n\n        select\n            my_looooooooooooooooooooooooong_column_name1 as my_loooooooong_alias0,\n        from cte1\n\n    ),\n\n    cte3 as (\n\n        select\n            my_looooooooooooooooooooooooong_column_name1 as my_loooooooong_alias1,\n            my_looooooooooooooooooooooooong_column_name2 as my_loooooooong_alias2,\n            my_looooooooooooooooooooooooong_column_name3 as my_loooooooong_alias3,\n            my_looooooooooooooooooooooooong_column_name4 as my_loooooooong_alias4,\n            my_looooooooooooooooooooooooong_column_name5 as my_loooooooong_alias5,\n            my_column_name1,\n            my_looooooooooooooooooooooooong_column_name6\n            as my_loooooooong_alias6,\n            my_looooooooooooooooooooooooong_column_name7\n            as my_loooooooong_alias7,\n            my_column_name2,\n            my_column_name3\n        from\n            cte2\n\n    )\n\nselect\n    my_arbitrary_function(\n        my_nested_function('my_loooooooonooooooog_string', d.my_column_name1)\n    ) as my_column_name4\nfrom cte3 as d\n"
  },
  {
    "path": "src/test/fixtures/formatter/issue-1717-long-lines.sql",
    "content": "select customer_id, first_name, last_name, email_address, phone_number, street_address, city, state, zip_code, country, date_of_birth, account_created_at, last_login_at, is_active, subscription_tier from {{ ref('stg_customers') }} where is_active = true and subscription_tier in ('premium', 'enterprise') order by last_login_at desc\n"
  },
  {
    "path": "src/test/fixtures/formatter/jinja-source-long-line.sql",
    "content": "select id, name, category, description, price, quantity_in_stock, supplier_id, warehouse_location from {{ source('inventory_management_system', 'product_catalog_items') }} where quantity_in_stock > 0\n"
  },
  {
    "path": "src/test/fixtures/formatter/long-line-split-to-multiple.sql",
    "content": "select order_id, customer_id, order_date, status, total_amount, shipping_address, billing_address, payment_method, discount_code, tax_amount from orders where status != 'cancelled'\n"
  },
  {
    "path": "src/test/fixtures/formatter/multi-chunk-changes.sql",
    "content": "with\n    source as (select * from {{ source(\"raw\", \"payments\") }}),\n\n    renamed as (\n        select\n            id as payment_id,\n            ORDER_ID as order_id,\n            amount as payment_amount\n        from source\n    ),\n\n    aggregated as (\n        select\n            order_id,\n            sum(payment_amount) as total_paid,\n            count(*) as payment_count\n        from renamed\n        group by order_id\n    ),\n\n    final as (\n        select\n            order_id,\n            total_paid,\n            payment_count,\n            CASE WHEN total_paid > 100 THEN 'high' WHEN total_paid > 50 THEN 'medium' ELSE 'low' END as tier\n        from aggregated\n        where total_paid > 0\n    )\n\nselect *\nfrom final\n"
  },
  {
    "path": "src/test/fixtures/formatter/no-changes-needed.sql",
    "content": "select id, name, created_at from customers where active = true\n"
  },
  {
    "path": "src/test/fixtures/runHistory.ts",
    "content": "import type {\n  RunResultEntry,\n  RunResultsEventData,\n} from \"@altimateai/dbt-integration\";\n\nexport const createResult = (\n  overrides: Partial<RunResultEntry> = {},\n): RunResultEntry => ({\n  name: \"model1\",\n  uniqueId: \"model.project.model1\",\n  status: \"success\",\n  executionTime: 1.0,\n  resourceType: \"model\",\n  ...overrides,\n});\n\nexport const createTestResult = (\n  overrides: Partial<RunResultEntry> = {},\n): RunResultEntry => ({\n  name: \"abc123def456\",\n  uniqueId: \"test.my_project.not_null_orders_order_id.abc123def456\",\n  status: \"success\",\n  executionTime: 0.5,\n  resourceType: \"test\",\n  ...overrides,\n});\n\nexport const createEntry = (\n  overrides: Partial<RunResultsEventData> & { command: string },\n): RunResultsEventData => ({\n  id: \"test-invocation\",\n  args: [],\n  completedAt: new Date(\"2024-01-15T10:30:00\"),\n  projectName: \"test-project\",\n  results: [createResult()],\n  elapsedTime: 1.0,\n  ...overrides,\n});\n"
  },
  {
    "path": "src/test/integration/formatter.test.ts",
    "content": "import { CommandProcessExecutionFactory } from \"@altimateai/dbt-integration\";\nimport * as assert from \"assert\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport \"reflect-metadata\";\nimport * as vscode from \"vscode\";\nimport { PythonEnvironment } from \"../../dbt_client/pythonEnvironment\";\nimport { DbtDocumentFormattingEditProvider } from \"../../document_formatting_edit_provider/dbtDocumentFormattingEditProvider\";\nimport { TelemetryService } from \"../../telemetry\";\nimport {\n  FormatterFixture,\n  loadFormatterFixtures,\n} from \"./helpers/fixtureLoader\";\nimport { findSqlfmt, runSqlfmt, runSqlfmtFormat } from \"./helpers/sqlfmtRunner\";\n\nsuite(\"Formatter Integration Tests\", function () {\n  this.timeout(30_000);\n\n  const extensionRoot = path.resolve(__dirname, \"../../../\");\n  let fixtures: FormatterFixture[];\n  let tempDir: string;\n\n  suiteSetup(function () {\n    if (!findSqlfmt()) {\n      this.skip();\n    }\n\n    fixtures = loadFormatterFixtures(extensionRoot);\n    tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"formatter-test-\"));\n  });\n\n  suiteTeardown(function () {\n    if (tempDir && fs.existsSync(tempDir)) {\n      fs.rmSync(tempDir, { recursive: true, force: true });\n    }\n  });\n\n  test(\"sqlfmt is available on PATH\", function () {\n    const sqlfmtPath = findSqlfmt();\n    assert.ok(sqlfmtPath, \"sqlfmt should be found on PATH\");\n  });\n\n  test(\"fixtures are loaded\", function () {\n    assert.ok(fixtures.length > 0, \"Should have at least one fixture\");\n  });\n\n  suite(\"fixture tests\", function () {\n    // Dynamically create tests for each fixture after suiteSetup runs.\n    // Mocha requires tests to be registered synchronously, so we use a\n    // two-phase approach: register all fixtures, skip at runtime if needed.\n\n    const extensionRoot = path.resolve(__dirname, \"../../../\");\n    const fixtureDir = path.join(\n      extensionRoot,\n      \"src\",\n      \"test\",\n      \"fixtures\",\n      \"formatter\",\n    );\n\n    // Read fixture names synchronously at test registration time\n    let fixtureNames: string[];\n    try {\n      fixtureNames = fs\n        .readdirSync(fixtureDir)\n        .filter((f) => f.endsWith(\".sql\"))\n        .map((f) => f.replace(/\\.sql$/, \"\"))\n        .sort();\n    } catch {\n      fixtureNames = [];\n    }\n\n    for (const fixtureName of fixtureNames) {\n      if (fixtureName === \"no-changes-needed\") {\n        test(`${fixtureName}: sqlfmt reports no changes, zero edits`, async function () {\n          if (!findSqlfmt()) {\n            this.skip();\n          }\n\n          const input = fs.readFileSync(\n            path.join(fixtureDir, `${fixtureName}.sql`),\n            \"utf-8\",\n          );\n\n          const diffResult = runSqlfmt(input);\n          assert.ok(diffResult.available, \"sqlfmt should be available\");\n          assert.strictEqual(\n            diffResult.hasChanges,\n            false,\n            \"sqlfmt should report no changes\",\n          );\n\n          // Verify sqlfmt format output matches input\n          const formatResult = runSqlfmtFormat(input);\n          assert.ok(formatResult.available, \"sqlfmt should be available\");\n          assert.strictEqual(\n            formatResult.formatted,\n            input,\n            \"sqlfmt formatted output should equal input when no changes needed\",\n          );\n        });\n        continue;\n      }\n\n      test(`${fixtureName}: input → sqlfmt → processDiffOutput → applyEdit → matches sqlfmt output`, async function () {\n        if (!findSqlfmt()) {\n          this.skip();\n        }\n\n        const input = fs.readFileSync(\n          path.join(fixtureDir, `${fixtureName}.sql`),\n          \"utf-8\",\n        );\n\n        // 1. Run sqlfmt to get the canonical formatted output (source of truth)\n        const formatResult = runSqlfmtFormat(input);\n        assert.ok(formatResult.available, \"sqlfmt should be available\");\n        assert.ok(\n          formatResult.hasChanges,\n          `sqlfmt should report changes for fixture ${fixtureName}`,\n        );\n        const sqlfmtFormatted = formatResult.formatted;\n\n        // 2. Run sqlfmt in diff mode for processDiffOutput\n        const diffResult = runSqlfmt(input);\n        assert.ok(diffResult.available, \"sqlfmt should be available\");\n        assert.ok(\n          diffResult.hasChanges,\n          `sqlfmt diff should report changes for fixture ${fixtureName}`,\n        );\n\n        // 3. Write input to temp file, open as real vscode.TextDocument\n        const tempFile = path.join(tempDir, `${fixtureName}.sql`);\n        fs.writeFileSync(tempFile, input);\n        const uri = vscode.Uri.file(tempFile);\n        const document = await vscode.workspace.openTextDocument(uri);\n\n        // 4. Call processDiffOutput on the real document\n        const provider = new DbtDocumentFormattingEditProvider(\n          {} as CommandProcessExecutionFactory,\n          {} as TelemetryService,\n          {} as PythonEnvironment,\n        );\n        const edits: vscode.TextEdit[] = (provider as any).processDiffOutput(\n          document,\n          diffResult.diffOutput,\n        );\n\n        assert.ok(\n          edits.length > 0,\n          `Should produce at least one edit for fixture ${fixtureName}`,\n        );\n\n        // 5. Apply edits via real vscode.workspace.applyEdit\n        const wsEdit = new vscode.WorkspaceEdit();\n        wsEdit.set(document.uri, edits);\n        const applied = await vscode.workspace.applyEdit(wsEdit);\n        assert.ok(applied, \"workspace.applyEdit should succeed\");\n\n        // 6. Compare vscode document (after edits) with sqlfmt formatted output\n        const resultText = document.getText();\n        assert.strictEqual(\n          resultText,\n          sqlfmtFormatted,\n          `VS Code document after edits should match sqlfmt formatted output for fixture ${fixtureName}`,\n        );\n      });\n    }\n  });\n\n  suite(\"edge cases\", function () {\n    test(\"empty diff string produces no edits\", async function () {\n      if (!findSqlfmt()) {\n        this.skip();\n      }\n\n      const tempFile = path.join(tempDir, \"edge-empty-diff.sql\");\n      fs.writeFileSync(tempFile, \"select 1\\n\");\n      const document = await vscode.workspace.openTextDocument(\n        vscode.Uri.file(tempFile),\n      );\n\n      const provider = new DbtDocumentFormattingEditProvider(\n        {} as CommandProcessExecutionFactory,\n        {} as TelemetryService,\n        {} as PythonEnvironment,\n      );\n      const edits: vscode.TextEdit[] = (provider as any).processDiffOutput(\n        document,\n        \"\",\n      );\n\n      assert.strictEqual(edits.length, 0, \"Empty diff should produce no edits\");\n    });\n\n    test(\"diff with only summary lines produces no edits\", async function () {\n      if (!findSqlfmt()) {\n        this.skip();\n      }\n\n      const tempFile = path.join(tempDir, \"edge-summary-only.sql\");\n      fs.writeFileSync(tempFile, \"select 1\\n\");\n      const document = await vscode.workspace.openTextDocument(\n        vscode.Uri.file(tempFile),\n      );\n\n      const provider = new DbtDocumentFormattingEditProvider(\n        {} as CommandProcessExecutionFactory,\n        {} as TelemetryService,\n        {} as PythonEnvironment,\n      );\n      const edits: vscode.TextEdit[] = (provider as any).processDiffOutput(\n        document,\n        \"1 file passed formatting check.\\n\",\n      );\n\n      assert.strictEqual(\n        edits.length,\n        0,\n        \"Summary-only diff should produce no edits\",\n      );\n    });\n  });\n});\n"
  },
  {
    "path": "src/test/integration/helpers/fixtureLoader.ts",
    "content": "import * as fs from \"fs\";\nimport * as path from \"path\";\n\nexport interface FormatterFixture {\n  /** File stem used as test label */\n  name: string;\n  /** Original SQL content (before formatting) */\n  input: string;\n}\n\n/**\n * Discovers and loads all formatter fixture files.\n * Each .sql file in the fixtures/formatter directory is a test case.\n *\n * @param extensionRoot Absolute path to the extension project root\n */\nexport function loadFormatterFixtures(\n  extensionRoot: string,\n): FormatterFixture[] {\n  const fixtureDir = path.join(\n    extensionRoot,\n    \"src\",\n    \"test\",\n    \"fixtures\",\n    \"formatter\",\n  );\n\n  return fs\n    .readdirSync(fixtureDir)\n    .filter((f) => f.endsWith(\".sql\"))\n    .sort()\n    .map((f) => ({\n      name: f.replace(/\\.sql$/, \"\"),\n      input: fs.readFileSync(path.join(fixtureDir, f), \"utf-8\"),\n    }));\n}\n"
  },
  {
    "path": "src/test/integration/helpers/sqlfmtRunner.ts",
    "content": "import { spawnSync } from \"child_process\";\nimport which from \"which\";\n\nlet cachedSqlfmtPath: string | null | undefined;\n\n/**\n * Validates that a candidate path is the Python shandy-sqlfmt binary\n * by checking `--version` output for \"sqlfmt, version\".\n */\nfunction isShandySqlfmt(candidatePath: string): boolean {\n  try {\n    const result = spawnSync(candidatePath, [\"--version\"], {\n      encoding: \"utf-8\",\n      timeout: 5_000,\n    });\n    const output = (result.stdout || \"\") + (result.stderr || \"\");\n    return output.includes(\"sqlfmt, version\");\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Finds the Python shandy-sqlfmt binary. Caches the result.\n *\n * Resolution order:\n * 1. SQLFMT_PATH environment variable (explicit path to binary)\n * 2. `sqlfmt` on PATH (validated as shandy-sqlfmt, not Go sqlfmt)\n */\nexport function findSqlfmt(): string | null {\n  if (cachedSqlfmtPath !== undefined) {\n    return cachedSqlfmtPath;\n  }\n\n  // 1. Check SQLFMT_PATH env var\n  const envPath = process.env.SQLFMT_PATH;\n  if (envPath && isShandySqlfmt(envPath)) {\n    cachedSqlfmtPath = envPath;\n    return cachedSqlfmtPath;\n  }\n\n  // 2. Search PATH\n  let candidate: string;\n  try {\n    candidate = which.sync(\"sqlfmt\");\n  } catch {\n    cachedSqlfmtPath = null;\n    return null;\n  }\n\n  if (isShandySqlfmt(candidate)) {\n    cachedSqlfmtPath = candidate;\n    return cachedSqlfmtPath;\n  }\n\n  cachedSqlfmtPath = null;\n  return null;\n}\n\nexport interface SqlfmtResult {\n  diffOutput: string;\n  hasChanges: boolean;\n  available: boolean;\n}\n\nexport interface SqlfmtFormatResult {\n  /** The formatted SQL content */\n  formatted: string;\n  /** Whether sqlfmt made any changes */\n  hasChanges: boolean;\n  /** Whether sqlfmt was found */\n  available: boolean;\n}\n\n/**\n * Runs sqlfmt on the given SQL content with the same args used in production:\n *   sqlfmt - --diff --no-progressbar --quiet --line-length 80\n *\n * Returns the diff output (from stderr, since sqlfmt exits non-zero when\n * there are changes and puts the diff in the error message).\n */\nexport function runSqlfmt(sqlContent: string): SqlfmtResult {\n  const sqlfmtPath = findSqlfmt();\n  if (!sqlfmtPath) {\n    return { diffOutput: \"\", hasChanges: false, available: false };\n  }\n\n  const result = spawnSync(\n    sqlfmtPath,\n    [\"-\", \"--diff\", \"--no-progressbar\", \"--quiet\", \"--line-length\", \"80\"],\n    {\n      input: sqlContent,\n      encoding: \"utf-8\",\n      timeout: 15_000,\n    },\n  );\n\n  // sqlfmt exit code 0 = no changes, exit code 1 = changes (diff in stderr)\n  if (result.status === 0) {\n    return { diffOutput: \"\", hasChanges: false, available: true };\n  }\n\n  const diffOutput = postProcessDiff(result.stderr || \"\");\n  return { diffOutput, hasChanges: true, available: true };\n}\n\n/**\n * Runs sqlfmt on the given SQL content and returns the formatted output:\n *   sqlfmt - --no-progressbar --quiet --line-length 80\n *\n * Unlike runSqlfmt(), this returns the actual formatted SQL (not a diff).\n * Without --diff, sqlfmt always exits 0, so hasChanges is determined by\n * comparing the output to the input.\n */\nexport function runSqlfmtFormat(sqlContent: string): SqlfmtFormatResult {\n  const sqlfmtPath = findSqlfmt();\n  if (!sqlfmtPath) {\n    return { formatted: \"\", hasChanges: false, available: false };\n  }\n\n  const result = spawnSync(\n    sqlfmtPath,\n    [\"-\", \"--no-progressbar\", \"--quiet\", \"--line-length\", \"80\"],\n    {\n      input: sqlContent,\n      encoding: \"utf-8\",\n      timeout: 15_000,\n    },\n  );\n\n  // Without --diff, sqlfmt writes formatted SQL to stdout and always exits 0.\n  const formatted = result.stdout || \"\";\n  return {\n    formatted,\n    hasChanges: formatted !== sqlContent,\n    available: true,\n  };\n}\n\n/**\n * Post-processes sqlfmt diff output to handle a parse-diff quirk:\n * blank context lines (lines that exist unchanged between changes) in\n * unified diffs should have a leading space, but sqlfmt emits them as\n * truly empty lines. parse-diff needs the leading space to recognize\n * them as context lines rather than ignoring them.\n */\nfunction postProcessDiff(diff: string): string {\n  const lines = diff.split(\"\\n\");\n  const result: string[] = [];\n  let inHunk = false;\n\n  for (const line of lines) {\n    if (line.startsWith(\"@@\")) {\n      inHunk = true;\n      result.push(line);\n    } else if (\n      inHunk &&\n      line === \"\" &&\n      result.length > 0 &&\n      !result[result.length - 1].startsWith(\"@@\")\n    ) {\n      // Empty line inside a hunk that isn't right after the @@ header —\n      // treat as a blank context line\n      result.push(\" \");\n    } else {\n      if (\n        line.startsWith(\"---\") ||\n        line.startsWith(\"+++\") ||\n        line.startsWith(\"diff \")\n      ) {\n        inHunk = false;\n      }\n      result.push(line);\n    }\n  }\n\n  return result.join(\"\\n\");\n}\n"
  },
  {
    "path": "src/test/integration/index.ts",
    "content": "import { glob } from \"glob\";\nimport Mocha from \"mocha\";\nimport * as path from \"path\";\n\nexport async function run(): Promise<void> {\n  const mocha = new Mocha({\n    ui: \"tdd\",\n    timeout: 30_000,\n    color: true,\n  });\n\n  const testsRoot = path.resolve(__dirname);\n  const files = await glob(\"**/*.test.js\", { cwd: testsRoot });\n\n  for (const file of files) {\n    mocha.addFile(path.resolve(testsRoot, file));\n  }\n\n  return new Promise<void>((resolve, reject) => {\n    mocha.run((failures) => {\n      if (failures > 0) {\n        reject(new Error(`${failures} test(s) failed.`));\n      } else {\n        resolve();\n      }\n    });\n  });\n}\n"
  },
  {
    "path": "src/test/integration/runHistoryTreeview.test.ts",
    "content": "import * as assert from \"assert\";\nimport \"reflect-metadata\";\nimport * as vscode from \"vscode\";\nimport { RunHistoryService } from \"../../services/runHistoryService\";\nimport {\n  ResultTreeItem,\n  RunTreeItem,\n} from \"../../treeview_provider/runHistoryTreeItems\";\nimport { RunHistoryTreeviewProvider } from \"../../treeview_provider/runHistoryTreeviewProvider\";\nimport { createEntry } from \"../fixtures/runHistory\";\n\nsuite(\"Run History TreeView Integration\", function () {\n  this.timeout(10_000);\n\n  let service: RunHistoryService;\n  let provider: RunHistoryTreeviewProvider;\n  let registration: vscode.Disposable;\n\n  setup(function () {\n    service = new RunHistoryService();\n    provider = new RunHistoryTreeviewProvider(service);\n    registration = vscode.window.registerTreeDataProvider(\n      \"run_history_treeview\",\n      provider,\n    );\n  });\n\n  teardown(function () {\n    registration.dispose();\n    provider.dispose();\n    service.dispose();\n  });\n\n  test(\"registers tree data provider without error\", function () {\n    assert.ok(registration, \"Registration should return a disposable\");\n  });\n\n  test(\"empty history returns no children\", function () {\n    const children = provider.getChildren();\n    assert.strictEqual(children.length, 0);\n  });\n\n  test(\"added entry produces a RunTreeItem at root\", function () {\n    service.addEntry(createEntry({ command: \"dbt run\" }));\n\n    const children = provider.getChildren();\n    assert.strictEqual(children.length, 1);\n    assert.ok(children[0] instanceof RunTreeItem);\n  });\n\n  test(\"RunTreeItem has expected label and description\", function () {\n    service.addEntry(\n      createEntry({ command: \"dbt build --select +stg_orders+\" }),\n    );\n\n    const item = provider.getChildren()[0] as RunTreeItem;\n    assert.strictEqual(item.label, \"dbt build --select +stg_orders+\");\n    assert.ok(\n      typeof item.description === \"string\" && item.description.length > 0,\n    );\n  });\n\n  test(\"RunTreeItem exposes real ThemeIcon\", function () {\n    service.addEntry(createEntry({ command: \"dbt run\" }));\n\n    const item = provider.getChildren()[0] as RunTreeItem;\n    assert.ok(item.iconPath instanceof vscode.ThemeIcon);\n  });\n\n  test(\"expanding a RunTreeItem yields ResultTreeItems\", function () {\n    service.addEntry(\n      createEntry({\n        command: \"dbt run\",\n        results: [\n          {\n            name: \"m1\",\n            uniqueId: \"model.p.m1\",\n            status: \"success\",\n            executionTime: 1.0,\n            resourceType: \"model\",\n          },\n          {\n            name: \"t1\",\n            uniqueId: \"test.p.t1\",\n            status: \"error\",\n            executionTime: 0.3,\n            resourceType: \"test\",\n          },\n        ],\n      }),\n    );\n\n    const runItem = provider.getChildren()[0] as RunTreeItem;\n    const children = provider.getChildren(runItem);\n    assert.strictEqual(children.length, 2);\n    assert.ok(children[0] instanceof ResultTreeItem);\n    assert.ok(children[1] instanceof ResultTreeItem);\n  });\n\n  test(\"ResultTreeItem is a leaf node\", function () {\n    service.addEntry(createEntry({ command: \"dbt run\" }));\n\n    const runItem = provider.getChildren()[0] as RunTreeItem;\n    const resultItem = provider.getChildren(runItem)[0] as ResultTreeItem;\n    assert.strictEqual(provider.getChildren(resultItem).length, 0);\n  });\n\n  test(\"onDidChangeTreeData fires on real EventEmitter\", function (done) {\n    provider.onDidChangeTreeData(() => done());\n    service.addEntry(createEntry({ command: \"dbt run\" }));\n  });\n\n  test(\"multiple entries appear in reverse chronological order\", function () {\n    service.addEntry(createEntry({ id: \"first\", command: \"dbt run\" }));\n    service.addEntry(createEntry({ id: \"second\", command: \"dbt build\" }));\n\n    const children = provider.getChildren() as RunTreeItem[];\n    assert.strictEqual(children.length, 2);\n    assert.strictEqual(children[0].entry.id, \"second\");\n    assert.strictEqual(children[1].entry.id, \"first\");\n  });\n});\n"
  },
  {
    "path": "src/test/integration/runTests.ts",
    "content": "import { runTests } from \"@vscode/test-electron\";\nimport * as path from \"path\";\n\nasync function main() {\n  try {\n    const extensionDevelopmentPath = path.resolve(__dirname, \"../../../\");\n    const extensionTestsPath = path.resolve(__dirname, \"./index\");\n\n    await runTests({\n      extensionDevelopmentPath,\n      extensionTestsPath,\n      launchArgs: [\"--disable-extensions\"],\n      // Forward PATH and SQLFMT_PATH to the extension host process so\n      // that sqlfmt installed in a virtualenv is discoverable.\n      // macOS Electron apps often reset PATH to system defaults.\n      extensionTestsEnv: {\n        PATH: process.env.PATH,\n        SQLFMT_PATH: process.env.SQLFMT_PATH,\n      },\n    });\n  } catch (err) {\n    console.error(\"Failed to run integration tests:\", err);\n    process.exit(1);\n  }\n}\n\nmain();\n"
  },
  {
    "path": "src/test/mock/lib.ts",
    "content": "export interface NotebookKernelClient {\n  executeCell: jest.Mock;\n  interrupt: jest.Mock;\n}\n\nexport interface NotebookDependencies {\n  kernelClient: NotebookKernelClient;\n}\n\nexport const mockNotebookKernelClient: NotebookKernelClient = {\n  executeCell: jest.fn(),\n  interrupt: jest.fn(),\n};\n\nexport const mockNotebookDependencies: NotebookDependencies = {\n  kernelClient: mockNotebookKernelClient,\n};\n"
  },
  {
    "path": "src/test/mock/node-fetch.ts",
    "content": "// Mock for node-fetch module\nexport class AbortError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = \"AbortError\";\n  }\n}\n\nexport default jest.fn(() =>\n  Promise.resolve({\n    ok: true,\n    status: 200,\n    json: () => Promise.resolve({}),\n    text: () => Promise.resolve(\"\"),\n  }),\n);\n"
  },
  {
    "path": "src/test/mock/vscode.ts",
    "content": "import { jest } from \"@jest/globals\";\n\n// Export VSCode types that were previously defined\nexport const ExtensionKind = {\n  UI: 1,\n  Workspace: 2,\n};\n\nexport const Uri = {\n  file: jest.fn((f: string) => ({ fsPath: f })),\n  parse: jest.fn(),\n};\n\nexport class Position {\n  constructor(\n    public line: number,\n    public character: number,\n  ) {}\n\n  // Add common Position methods for compatibility\n  isEqual(other: Position): boolean {\n    return this.line === other.line && this.character === other.character;\n  }\n\n  isBefore(other: Position): boolean {\n    return (\n      this.line < other.line ||\n      (this.line === other.line && this.character < other.character)\n    );\n  }\n\n  isAfter(other: Position): boolean {\n    return (\n      this.line > other.line ||\n      (this.line === other.line && this.character > other.character)\n    );\n  }\n\n  isBeforeOrEqual(other: Position): boolean {\n    return this.isBefore(other) || this.isEqual(other);\n  }\n\n  isAfterOrEqual(other: Position): boolean {\n    return this.isAfter(other) || this.isEqual(other);\n  }\n}\n\nexport class Range {\n  public start: Position;\n  public end: Position;\n\n  constructor(start: Position, end: Position) {\n    this.start = start;\n    this.end = end;\n  }\n}\n\nexport class Location {\n  public range: Range | Position;\n  constructor(\n    public uri: typeof Uri | any,\n    rangeOrPosition: Range | Position,\n  ) {\n    this.range = rangeOrPosition;\n  }\n}\n\nexport const DiagnosticSeverity = {\n  Error: 0,\n  Warning: 1,\n  Information: 2,\n  Hint: 3,\n};\n\nexport const TreeItemCollapsibleState = {\n  None: 0,\n  Collapsed: 1,\n  Expanded: 2,\n};\n\nexport const TreeItem = class {\n  constructor(\n    public label?: string,\n    public collapsibleState?: number,\n  ) {}\n};\n\nexport const Diagnostic = class {\n  constructor(\n    public range: any,\n    public message: string,\n    public severity?: number,\n  ) {}\n};\n\nexport class TextEdit {\n  constructor(\n    public range: Range,\n    public newText: string,\n  ) {}\n\n  static insert(position: Position, newText: string): TextEdit {\n    return new TextEdit(new Range(position, position), newText);\n  }\n\n  static replace(range: Range, newText: string): TextEdit {\n    return new TextEdit(range, newText);\n  }\n\n  static delete(range: Range): TextEdit {\n    return new TextEdit(range, \"\");\n  }\n}\n\n// Mock VSCode API\nexport const extensions = {\n  getExtension: jest.fn(),\n  all: [],\n};\n\nexport const commands = {\n  registerCommand: jest.fn().mockReturnValue({ dispose: jest.fn() }),\n  getCommands: jest.fn().mockReturnValue(Promise.resolve([])),\n  executeCommand: jest.fn().mockReturnValue(Promise.resolve()),\n};\n\nexport const window = {\n  showInformationMessage: jest.fn().mockReturnValue(Promise.resolve()),\n  showWarningMessage: jest.fn().mockReturnValue(Promise.resolve()),\n  showErrorMessage: jest.fn().mockReturnValue(Promise.resolve()),\n  createOutputChannel: jest.fn().mockReturnValue({\n    append: jest.fn(),\n    appendLine: jest.fn(),\n    clear: jest.fn(),\n    show: jest.fn(),\n    hide: jest.fn(),\n    dispose: jest.fn(),\n  }),\n  createTerminal: jest.fn().mockReturnValue({\n    sendText: jest.fn(),\n    show: jest.fn(),\n    hide: jest.fn(),\n    dispose: jest.fn(),\n  }),\n  withProgress: jest\n    .fn()\n    .mockImplementation((_options: any, task: any) => task()),\n};\n\nexport const workspace = {\n  getConfiguration: jest.fn().mockReturnValue({\n    get: jest.fn(),\n    has: jest.fn(),\n    update: jest.fn(),\n  }),\n  workspaceFolders: [],\n  getWorkspaceFolder: jest.fn((uri: typeof Uri) => {\n    if (workspace.workspaceFolders && workspace.workspaceFolders.length > 0) {\n      return workspace.workspaceFolders[0];\n    }\n    return undefined;\n  }),\n  onDidChangeConfiguration: jest.fn().mockReturnValue({ dispose: jest.fn() }),\n  onDidChangeWorkspaceFolders: jest\n    .fn()\n    .mockReturnValue({ dispose: jest.fn() }),\n  createFileSystemWatcher: jest.fn().mockReturnValue({\n    onDidChange: jest.fn().mockReturnValue({ dispose: jest.fn() }),\n    onDidCreate: jest.fn().mockReturnValue({ dispose: jest.fn() }),\n    onDidDelete: jest.fn().mockReturnValue({ dispose: jest.fn() }),\n    dispose: jest.fn(),\n  }),\n} as any;\n\nexport const languages = {\n  createDiagnosticCollection: jest.fn().mockReturnValue({\n    set: jest.fn(),\n    get: jest.fn(),\n    delete: jest.fn(),\n    clear: jest.fn(),\n    dispose: jest.fn(),\n    [Symbol.iterator]: function* () {\n      yield* new Map();\n    },\n    entries: function* () {\n      yield* new Map();\n    },\n    forEach: function (\n      callback: (uri: typeof Uri, diagnostics: any[]) => void,\n    ) {\n      // Mock implementation that does nothing by default\n    },\n  }),\n  registerCodeLensProvider: jest.fn().mockReturnValue({ dispose: jest.fn() }),\n};\n\nexport class EventEmitter<T> {\n  private listeners: ((e: T) => any)[] = [];\n\n  event = (listener: (e: T) => any) => {\n    this.listeners.push(listener);\n    return {\n      dispose: () => {\n        const index = this.listeners.indexOf(listener);\n        if (index > -1) {\n          this.listeners.splice(index, 1);\n        }\n      },\n    };\n  };\n\n  fire(data: T): void {\n    this.listeners.forEach((listener) => listener(data));\n  }\n\n  dispose(): void {\n    this.listeners = [];\n  }\n}\n\nexport const ProgressLocation = {\n  Notification: 15,\n};\n\nexport const RelativePattern = jest.fn();\nexport const ViewColumn = {};\nexport const Disposable = Object.assign(jest.fn(), { from: jest.fn() });\nexport const Event = jest.fn();\n\nexport const CancellationTokenSource = jest.fn().mockImplementation(() => ({\n  token: {\n    onCancellationRequested: jest.fn(),\n    isCancellationRequested: false,\n  },\n  cancel: jest.fn(),\n  dispose: jest.fn(),\n}));\n\nexport const CancellationToken = {\n  None: {\n    onCancellationRequested: jest.fn(),\n    isCancellationRequested: false,\n  },\n};\n\nexport const ThemeIcon = jest.fn().mockImplementation((...args: unknown[]) => ({\n  id: args[0],\n  color: args[1],\n}));\n\nexport const ThemeColor = jest\n  .fn()\n  .mockImplementation((...args: unknown[]) => ({ id: args[0] }));\n\nexport const resetMocks = () => {\n  jest.clearAllMocks();\n};\n"
  },
  {
    "path": "src/test/setup.ts",
    "content": "import \"reflect-metadata\";\n\n// Set up the container before tests\nimport \"../inversify.config\";\n"
  },
  {
    "path": "src/test/suite/altimate.test.ts",
    "content": "import { DBTConfiguration, DBTTerminal } from \"@altimateai/dbt-integration\";\nimport {\n  afterEach,\n  beforeEach,\n  describe,\n  expect,\n  it,\n  jest,\n} from \"@jest/globals\";\nimport { AltimateRequest } from \"../../altimate\";\n\ntype FetchFn = (\n  input: string | URL | Request,\n  init?: RequestInit,\n) => Promise<Response>;\n\ndescribe(\"AltimateRequest Tests\", () => {\n  let mockTerminal: jest.Mocked<DBTTerminal>;\n  let mockDBTConfiguration: jest.Mocked<DBTConfiguration>;\n  let request: AltimateRequest;\n  const fetchMock = jest.fn() as jest.MockedFunction<FetchFn>;\n  jest.mock(\"node-fetch\", () => ({\n    __esModule: true,\n    default: fetchMock,\n  }));\n\n  beforeEach(() => {\n    mockTerminal = {\n      show: jest.fn(),\n      log: jest.fn(),\n      trace: jest.fn(),\n      debug: jest.fn(),\n      info: jest.fn(),\n      error: jest.fn(),\n      dispose: jest.fn(),\n      logNewLine: jest.fn(),\n      logLine: jest.fn(),\n      logHorizontalRule: jest.fn(),\n      logBlock: jest.fn(),\n      warn: jest.fn(),\n    } as unknown as jest.Mocked<DBTTerminal>;\n\n    mockDBTConfiguration = {\n      getDbtCustomRunnerImport: jest\n        .fn()\n        .mockReturnValue(\"from dbt.cli.main import dbtRunner\"),\n      getDbtIntegration: jest.fn().mockReturnValue(\"core\"),\n      getRunModelCommandAdditionalParams: jest.fn().mockReturnValue([]),\n      getBuildModelCommandAdditionalParams: jest.fn().mockReturnValue([]),\n      getTestModelCommandAdditionalParams: jest.fn().mockReturnValue([]),\n      getQueryTemplate: jest\n        .fn()\n        .mockReturnValue(\"select * from ({query}) as query limit {limit}\"),\n      getQueryLimit: jest.fn().mockReturnValue(500),\n      getEnableNotebooks: jest.fn().mockReturnValue(false),\n      getDisableQueryHistory: jest.fn().mockReturnValue(false),\n      getWorkingDirectory: jest.fn().mockReturnValue(\"/test/workspace\"),\n      getAltimateUrl: jest.fn().mockReturnValue(\"https://api.myaltimate.com\"),\n      getIsLocalMode: jest.fn().mockReturnValue(false),\n      getAltimateInstanceName: jest.fn().mockReturnValue(\"test-instance\"),\n      getAltimateAiKey: jest.fn().mockReturnValue(\"test-key\"),\n    } as unknown as jest.Mocked<DBTConfiguration>;\n\n    const mockConfig = {\n      get: jest\n        .fn()\n        .mockImplementation((key: unknown, defaultValue?: unknown) => {\n          if (key === \"dbt.isLocalMode\" || key === \"isLocalMode\") {\n            return false;\n          }\n          return defaultValue ?? \"test-value\";\n        }),\n      has: jest.fn().mockReturnValue(true),\n      inspect: jest.fn(),\n      update: jest.fn().mockReturnValue(Promise.resolve()),\n    };\n\n    const mockAltimateHttpClient = {\n      fetch: jest.fn(),\n      fetchAsStream: jest.fn(),\n      uploadToS3: jest.fn(),\n      getConfig: jest\n        .fn()\n        .mockReturnValue({ key: \"test-key\", instance: \"test-instance\" }),\n      getAltimateUrl: jest.fn().mockReturnValue(\"https://api.altimate.ai\"),\n      throwIfLocalMode: jest.fn(),\n      internalFetch: fetchMock,\n    };\n\n    request = new AltimateRequest(\n      mockTerminal,\n      mockDBTConfiguration,\n      mockAltimateHttpClient as any,\n    );\n  });\n\n  afterEach(() => {\n    jest.restoreAllMocks();\n  });\n\n  it(\"should handle authentication check\", async () => {\n    // Mock the fetch method on AltimateHttpClient to resolve successfully\n    const mockAltimateHttpClient = (request as any).altimateHttpClient;\n    mockAltimateHttpClient.fetch.mockResolvedValue(undefined);\n\n    const result = await request.isAuthenticated();\n    expect(result).toBe(true);\n\n    expect(mockAltimateHttpClient.fetch).toHaveBeenCalledWith(\n      \"auth_health\",\n      {\n        method: \"POST\",\n      },\n      120000,\n    );\n  });\n\n  it(\"should handle stream responses\", async () => {\n    const mockAltimateHttpClient = (request as any).altimateHttpClient;\n    const onProgress = jest.fn();\n\n    mockAltimateHttpClient.fetchAsStream.mockResolvedValue(\n      '{\"status\": \"success\"}',\n    );\n\n    const result = await request.fetchAsStream(\n      \"/test-endpoint\",\n      { test: true },\n      onProgress,\n    );\n\n    expect(mockAltimateHttpClient.fetchAsStream).toHaveBeenCalledWith(\n      \"/test-endpoint\",\n      { test: true },\n      onProgress,\n      120000,\n    );\n\n    expect(result).toBe('{\"status\": \"success\"}');\n  });\n\n  it(\"should generate query strings\", () => {\n    const query = (request as any).getQueryString({ a: \"b\", c: 1 });\n    expect(query).toBe(\"?a=b&c=1\");\n    const empty = (request as any).getQueryString({});\n    expect(empty).toBe(\"\");\n  });\n\n  it(\"should respect local mode configuration\", () => {\n    const mockAltimateHttpClient = (request as any).altimateHttpClient;\n\n    // Mock AltimateHttpClient to throw for unsupported endpoints\n    mockAltimateHttpClient.throwIfLocalMode.mockImplementation(\n      (endpoint: string) => {\n        if (endpoint === \"unsupported\") {\n          throw new Error(\n            \"Cannot use unsupported in local mode. Please switch to cloud mode in settings.\",\n          );\n        }\n      },\n    );\n\n    expect(() =>\n      (request as any).throwIfLocalMode(\"auth_health\"),\n    ).not.toThrow();\n    expect(() => (request as any).throwIfLocalMode(\"unsupported\")).toThrow(\n      /local mode/,\n    );\n  });\n});\n"
  },
  {
    "path": "src/test/suite/commandProcessExecution.test.ts",
    "content": "import {\n  CommandProcessExecution,\n  CommandProcessExecutionFactory,\n  DBTTerminal,\n} from \"@altimateai/dbt-integration\";\nimport { afterEach, beforeEach, describe, expect, it } from \"@jest/globals\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport { anything, instance, mock, verify, when } from \"ts-mockito\";\nimport { VSCodeDBTTerminal } from \"../../dbt_client/vscodeTerminal\";\n\ndescribe(\"CommandProcessExecution Tests\", () => {\n  let mockTerminal: DBTTerminal;\n  let factory: CommandProcessExecutionFactory;\n  let testDir: string;\n\n  beforeEach(() => {\n    mockTerminal = mock(VSCodeDBTTerminal);\n    when(mockTerminal.debug(anything(), anything(), anything())).thenReturn();\n    factory = new CommandProcessExecutionFactory(instance(mockTerminal));\n    testDir = path.join(\n      os.tmpdir(),\n      \"test-dir-\" + Math.random().toString(36).slice(2),\n    );\n    if (!fs.existsSync(testDir)) {\n      fs.mkdirSync(testDir, { recursive: true });\n    }\n  });\n\n  afterEach(() => {\n    if (fs.existsSync(testDir)) {\n      fs.rmdirSync(testDir);\n    }\n  });\n\n  it(\"should execute command and return output\", async () => {\n    const execution = factory.createCommandProcessExecution({\n      command: process.platform === \"win32\" ? \"cmd\" : \"echo\",\n      args: process.platform === \"win32\" ? [\"/c\", \"echo test\"] : [\"test\"],\n    });\n\n    const result = await execution.complete();\n    expect(result.stdout.trim()).toBe(\"test\");\n    expect(result.stderr).toBe(\"\");\n    verify(mockTerminal.debug(anything(), anything(), anything())).called();\n  });\n\n  it(\"should handle command errors\", async () => {\n    const execution = factory.createCommandProcessExecution({\n      command: \"nonexistentcommand\",\n    });\n\n    await expect(execution.complete()).rejects.toThrow(/ENOENT/);\n  });\n\n  it(\"should handle command with environment variables\", async () => {\n    const execution = factory.createCommandProcessExecution({\n      command: process.platform === \"win32\" ? \"cmd\" : \"printenv\",\n      args:\n        process.platform === \"win32\" ? [\"/c\", \"echo %TEST_VAR%\"] : [\"TEST_VAR\"],\n      envVars: { TEST_VAR: \"test_value\" },\n    });\n\n    const result = await execution.complete();\n    expect(result.stdout.trim()).toBe(\"test_value\");\n  });\n\n  it(\"should handle command with working directory\", async () => {\n    const execution = factory.createCommandProcessExecution({\n      command: process.platform === \"win32\" ? \"cmd\" : \"sh\",\n      args: process.platform === \"win32\" ? [\"/c\", \"cd\"] : [\"-c\", \"pwd\"],\n      cwd: testDir,\n    });\n\n    const result = await execution.complete();\n    const normalizedOutput = path.normalize(result.stdout.trim());\n    const normalizedTestDir = path.normalize(testDir);\n    expect(normalizedOutput.toLowerCase()).toContain(\n      normalizedTestDir.toLowerCase(),\n    );\n  });\n\n  it(\"should handle command with stderr output\", async () => {\n    jest.setTimeout(5000); // Increase timeout to 5 seconds\n    const execution = factory.createCommandProcessExecution({\n      command: process.platform === \"win32\" ? \"cmd\" : \"sh\",\n      args:\n        process.platform === \"win32\"\n          ? [\"/c\", \"echo error 1>&2\"]\n          : [\"-c\", \"echo error >&2\"],\n    });\n\n    const result = await execution.complete();\n    expect(result.stderr.trim()).toBe(\"error\");\n  });\n\n  it(\"should stream output to terminal\", async () => {\n    const execution = factory.createCommandProcessExecution({\n      command: process.platform === \"win32\" ? \"cmd\" : \"echo\",\n      args: process.platform === \"win32\" ? [\"/c\", \"echo stream\"] : [\"stream\"],\n    });\n    when(mockTerminal.log(anything())).thenReturn();\n    const result = await execution.completeWithTerminalOutput();\n    expect(result.stdout.trim()).toBe(\"stream\");\n    verify(mockTerminal.log(anything())).atLeast(1);\n  });\n\n  it(\"should format text by replacing newlines\", () => {\n    const execution = new CommandProcessExecution(\n      instance(mockTerminal),\n      \"\",\n      [],\n    );\n    expect(execution.formatText(\"a\\n\\nb\")).toBe(\"a\\r\\n\\rb\");\n  });\n});\n"
  },
  {
    "path": "src/test/suite/conversationProvider.test.ts",
    "content": "import { describe, expect, it } from \"@jest/globals\";\n\n/**\n * Test the `saveConversation` highlight extraction guard.\n *\n * Telemetry showed 636 monthly crashes with:\n *   TypeError: Cannot read properties of undefined (reading 'line')\n *   at conversationProvider.ts (saveConversation)\n *\n * The crash happens when `range` is defined (truthy) and `range.isSingleLine`\n * is truthy, but `range.start` is undefined — producing `range.start.line`\n * which throws. This can occur with partially constructed Range objects\n * from CommentThread.range.\n */\ndescribe(\"saveConversation highlight extraction guard\", () => {\n  // Extracted logic mirrors the highlight ternary in saveConversation\n  function extractHighlight(\n    field: string | undefined,\n    value: unknown,\n    range:\n      | {\n          isSingleLine?: boolean;\n          start?: { line: number };\n          end?: { line: number };\n        }\n      | undefined,\n    documentLineAt: (line: number) => string,\n    documentGetText: (range: unknown) => string,\n  ): string {\n    return field === \"description\"\n      ? (value as string)\n      : (range?.isSingleLine\n          ? documentLineAt(range?.start?.line ?? 0)\n          : documentGetText(range)) || \"\";\n  }\n\n  const mockLineAt = (line: number) => `line ${line} content`;\n  const mockGetText = (_range: unknown) => \"full text\";\n\n  it(\"should not crash when range is undefined\", () => {\n    const result = extractHighlight(\n      undefined,\n      undefined,\n      undefined,\n      mockLineAt,\n      mockGetText,\n    );\n    expect(result).toBe(\"full text\");\n  });\n\n  it(\"should not crash when range.start is undefined\", () => {\n    const partialRange = { isSingleLine: true } as any;\n    const result = extractHighlight(\n      undefined,\n      undefined,\n      partialRange,\n      mockLineAt,\n      mockGetText,\n    );\n    // Falls back to line 0 via ?? 0\n    expect(result).toBe(\"line 0 content\");\n  });\n\n  it(\"should use value when field is description\", () => {\n    const result = extractHighlight(\n      \"description\",\n      \"my description\",\n      undefined,\n      mockLineAt,\n      mockGetText,\n    );\n    expect(result).toBe(\"my description\");\n  });\n\n  it(\"should use lineAt when range is single line with valid start\", () => {\n    const range = {\n      isSingleLine: true,\n      start: { line: 5 },\n      end: { line: 5 },\n    };\n    const result = extractHighlight(\n      undefined,\n      undefined,\n      range,\n      mockLineAt,\n      mockGetText,\n    );\n    expect(result).toBe(\"line 5 content\");\n  });\n\n  it(\"should use getText when range is multi-line\", () => {\n    const range = {\n      isSingleLine: false,\n      start: { line: 1 },\n      end: { line: 3 },\n    };\n    const result = extractHighlight(\n      undefined,\n      undefined,\n      range,\n      mockLineAt,\n      mockGetText,\n    );\n    expect(result).toBe(\"full text\");\n  });\n});\n"
  },
  {
    "path": "src/test/suite/coverage.ts",
    "content": "import * as fs from \"fs\";\nimport { createCoverageMap } from \"istanbul-lib-coverage\";\nimport { createInstrumenter } from \"istanbul-lib-instrument\";\nimport * as path from \"path\";\n\nconst coverageMap = createCoverageMap({});\nconst instrumenter = createInstrumenter({\n  compact: false,\n  preserveComments: true,\n  produceSourceMap: true,\n  autoWrap: true,\n  esModules: true,\n});\n\nexport function setupCoverage() {\n  const coverageDir = path.join(__dirname, \"../../../coverage\");\n  if (!fs.existsSync(coverageDir)) {\n    fs.mkdirSync(coverageDir, { recursive: true });\n  }\n\n  // Hook into require to instrument files\n  const originalRequire = require.extensions[\".js\"];\n  require.extensions[\".js\"] = function (module: any, filename: string) {\n    if (filename.includes(\"/src/\") && !filename.includes(\"/test/\")) {\n      const content = fs.readFileSync(filename, \"utf8\");\n      const instrumentedCode = instrumenter.instrumentSync(content, filename);\n      module._compile(instrumentedCode, filename);\n    } else {\n      originalRequire(module, filename);\n    }\n  };\n\n  // Save coverage data on process exit\n  process.on(\"exit\", () => {\n    const coverage = JSON.stringify(coverageMap);\n    fs.writeFileSync(path.join(coverageDir, \"coverage.json\"), coverage);\n    fs.writeFileSync(\n      path.join(coverageDir, \"coverage-final.json\"),\n      JSON.stringify(instrumenter.fileCoverage),\n    );\n  });\n}\n"
  },
  {
    "path": "src/test/suite/cteCodeLensProvider.test.ts",
    "content": "import { DBTTerminal } from \"@altimateai/dbt-integration\";\nimport { afterEach, beforeEach, describe, expect, it } from \"@jest/globals\";\nimport { Position, TextDocument } from \"vscode\";\nimport {\n  CteCodeLensProvider,\n  CteInfo,\n} from \"../../code_lens_provider/cteCodeLensProvider\";\n\ndescribe(\"CteCodeLensProvider\", () => {\n  let mockDBTTerminal: jest.Mocked<DBTTerminal>;\n  let provider: CteCodeLensProvider;\n\n  beforeEach(() => {\n    // Mock DBTTerminal\n    mockDBTTerminal = {\n      debug: jest.fn(),\n      warn: jest.fn(),\n      error: jest.fn(),\n      info: jest.fn(),\n      log: jest.fn(),\n      trace: jest.fn(),\n    } as any;\n\n    // Create provider instance\n    provider = new CteCodeLensProvider(mockDBTTerminal);\n  });\n\n  afterEach(() => {\n    jest.clearAllMocks();\n  });\n\n  // Helper function to create a mock TextDocument\n  const createMockDocument = (\n    content: string,\n    languageId = \"jinja-sql\",\n  ): TextDocument => {\n    const lines = content.split(\"\\n\");\n\n    const positionAt = (offset: number): Position => {\n      let currentOffset = 0;\n      for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {\n        const lineLength = lines[lineIndex].length;\n        if (currentOffset + lineLength >= offset) {\n          const character = offset - currentOffset;\n          return new Position(lineIndex, character);\n        }\n        currentOffset += lineLength + 1; // +1 for newline character\n      }\n      return new Position(lines.length - 1, lines[lines.length - 1].length);\n    };\n\n    const offsetAt = (position: Position): number => {\n      let offset = 0;\n      for (\n        let lineIndex = 0;\n        lineIndex < position.line && lineIndex < lines.length;\n        lineIndex++\n      ) {\n        offset += lines[lineIndex].length + 1; // +1 for newline character\n      }\n      offset += position.character;\n      return offset;\n    };\n\n    return {\n      getText: () => content,\n      languageId,\n      positionAt,\n      offsetAt,\n      uri: { fsPath: \"test.sql\" } as any,\n      fileName: \"test.sql\",\n      isUntitled: false,\n      isDirty: false,\n      isClosed: false,\n      save: jest.fn(),\n      eol: 1,\n      lineCount: lines.length,\n      lineAt: jest.fn(),\n      validateRange: jest.fn(),\n      validatePosition: jest.fn(),\n      getWordRangeAtPosition: jest.fn(),\n      version: 1,\n    } as any;\n  };\n\n  // Helper function to assert CTE properties\n  const assertCTE = (\n    cte: CteInfo,\n    expectedName: string,\n    expectedIndex: number,\n    description?: string,\n  ) => {\n    const msg = description ? ` (${description})` : \"\";\n    expect(cte.name).toBe(expectedName);\n    expect(cte.index).toBe(expectedIndex);\n    expect(cte.range).toBeDefined();\n    expect(cte.queryRange).toBeDefined();\n    expect(typeof cte.withClauseStart).toBe(\"number\");\n  };\n\n  // Use type assertion to access private method for testing\n  const detectCtes = (document: TextDocument): CteInfo[] => {\n    return (provider as any).detectCtes(document);\n  };\n\n  describe(\"Basic CTE Detection\", () => {\n    it(\"should detect single CTE correctly with proper ranges\", () => {\n      const sql = \"with my_cte as (select 1 as id) select * from my_cte\";\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(ctes[0], \"my_cte\", 0, \"CTE with simple select and ID column\");\n    });\n\n    it(\"should detect multiple CTEs correctly with proper indexing\", () => {\n      const sql = `with\n        first_cte as (select 1 as id),\n        second_cte as (select 2 as id),\n        third_cte as (select 3 as id)\n      select * from third_cte`;\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(3);\n      assertCTE(ctes[0], \"first_cte\", 0, \"CTE with simple select\");\n      assertCTE(ctes[1], \"second_cte\", 1, \"CTE with different ID value\");\n      assertCTE(ctes[2], \"third_cte\", 2, \"CTE with third ID value\");\n    });\n\n    it(\"should handle CTEs with column lists\", () => {\n      const sql =\n        \"with my_cte (id, name) as (select 1, 'test') select * from my_cte\";\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        \"my_cte (id, name)\",\n        0,\n        \"CTE with explicit column list specification\",\n      );\n    });\n\n    it(\"should handle quoted CTE names\", () => {\n      const sql = `with \"my cte\" as (select 1 as id) select * from \"my cte\"`;\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        '\"my cte\"',\n        0,\n        \"CTE with double-quoted name containing space\",\n      );\n    });\n  });\n\n  describe(\"Comments in CTE Body\", () => {\n    it(\"should handle line comments with unmatched quotes in CTE body\", () => {\n      const sql = `with\n        cte_without_lens as (\n          select *\n          from {{ ref('parent') }}\n          where\n            condition = true  -- CTE doesn't have a lens\n        ),\n        cte_with_lens as (\n          select *\n          from {{ ref('parent') }}\n          where\n            condition = true -- CTE has a 'lens'\n        )\n      select * from cte_with_lens`;\n\n      const document = createMockDocument(sql);\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(2);\n      assertCTE(\n        ctes[0],\n        \"cte_without_lens\",\n        0,\n        \"CTE with line comment containing unmatched single quote\",\n      );\n      assertCTE(\n        ctes[1],\n        \"cte_with_lens\",\n        1,\n        \"CTE with line comment containing matched single quotes\",\n      );\n    });\n\n    it(\"should handle block comments with unmatched quotes in CTE body\", () => {\n      const sql = `with\n        cte_with_block_comment as (\n          select *\n          from {{ ref('parent') }}\n          where\n            condition = true /* This is a block comment with unmatched quote ' */\n        )\n      select * from cte_with_block_comment`;\n\n      const document = createMockDocument(sql);\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        \"cte_with_block_comment\",\n        0,\n        \"CTE with block comment containing unmatched single quote\",\n      );\n    });\n\n    it(\"should handle Jinja comments with unmatched quotes in CTE body\", () => {\n      const sql = `with\n        cte_with_jinja_comment as (\n          select *\n          from {{ ref('parent') }}\n          where\n            condition = true {# This is a Jinja comment with unmatched quote ' #}\n        )\n      select * from cte_with_jinja_comment`;\n\n      const document = createMockDocument(sql);\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        \"cte_with_jinja_comment\",\n        0,\n        \"CTE with Jinja comment containing unmatched single quote\",\n      );\n    });\n  });\n\n  describe(\"Comments Between CTE Name and AS\", () => {\n    it(\"should handle single-line block comment between name and AS\", () => {\n      const sql =\n        \"with source /* test */ as (select 1 as id) select * from source\";\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        \"source\",\n        0,\n        \"CTE with single-line block comment between name and AS keyword\",\n      );\n      // Skip content extraction test for now due to Range/Position mocking complexity\n      // The important part is that CTE detection works correctly\n    });\n\n    it(\"should handle multi-line block comment between name and AS\", () => {\n      const sql = `with source \n/* this is \na multi-line comment\nthat should be ignored */\nas (\n  select * from {{ ref('raw_orders') }}\n)\nselect * from source`;\n\n      const document = createMockDocument(sql);\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        \"source\",\n        0,\n        \"CTE with multi-line block comment between name and AS keyword\",\n      );\n      // Skip content extraction test for now due to Range/Position mocking complexity\n      // The important part is that CTE detection works correctly\n    });\n\n    it(\"should handle Jinja comment between name and AS\", () => {\n      const sql =\n        \"with target {# some comment #} as (select 1 as id) select * from target\";\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        \"target\",\n        0,\n        \"CTE with Jinja comment between name and AS keyword\",\n      );\n    });\n\n    it(\"should handle line comment between name and AS (multiline)\", () => {\n      const sql = `with multiline_cte -- this is a comment\n      as (\n        select 4 as id\n      )\n      select * from multiline_cte`;\n\n      const document = createMockDocument(sql);\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        \"multiline_cte\",\n        0,\n        \"CTE with line comment on separate line before AS keyword\",\n      );\n    });\n\n    it(\"should handle complex comment with quotes between name and AS\", () => {\n      const sql = `with complex_comment /* more complex comment with 'quotes' */ as (\n        select 5 as id\n      ) select * from complex_comment`;\n\n      const document = createMockDocument(sql);\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        \"complex_comment\",\n        0,\n        \"CTE with block comment containing both single and double quotes\",\n      );\n    });\n  });\n\n  describe(\"Comments Before and Around CTE Names\", () => {\n    it(\"should handle block comment before CTE name\", () => {\n      const sql =\n        \"with /* comment before name */ my_cte as (select 1 as id) select * from my_cte\";\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(ctes[0], \"my_cte\", 0, \"CTE with block comment before name\");\n    });\n\n    it(\"should handle line comment before CTE name on separate line\", () => {\n      const sql = `with\n        -- This is a comment before the CTE name\n        my_cte as (\n          select 1 as id\n        )\n      select * from my_cte`;\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        \"my_cte\",\n        0,\n        \"CTE with line comment before name on separate line\",\n      );\n    });\n\n    it(\"should handle Jinja comment before CTE name\", () => {\n      const sql =\n        \"with {# comment before name #} my_cte as (select 1 as id) select * from my_cte\";\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(ctes[0], \"my_cte\", 0, \"CTE with Jinja comment before name\");\n    });\n\n    it(\"should handle comment immediately after WITH keyword\", () => {\n      const sql =\n        \"with /* comment after WITH */ my_cte as (select 1 as id) select * from my_cte\";\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        \"my_cte\",\n        0,\n        \"CTE with block comment immediately after WITH keyword\",\n      );\n    });\n\n    it(\"should handle line comment after WITH keyword\", () => {\n      const sql = `with -- comment after WITH\n        my_cte as (\n          select 1 as id\n        )\n      select * from my_cte`;\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        \"my_cte\",\n        0,\n        \"CTE with line comment after WITH keyword\",\n      );\n    });\n\n    it(\"should handle multiple comments around CTE name\", () => {\n      const sql =\n        \"with /* before */ my_cte /* after */ as (select 1 as id) select * from my_cte\";\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        \"my_cte\",\n        0,\n        \"CTE with block comments before and after name\",\n      );\n    });\n\n    it(\"should handle mixed comment types around CTE name\", () => {\n      const sql = `with -- line comment\n        /* block comment */ my_cte {# jinja comment #} as (\n          select 1 as id\n        )\n      select * from my_cte`;\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        \"my_cte\",\n        0,\n        \"CTE with mixed comment types around name\",\n      );\n    });\n\n    it(\"should handle comments in multi-CTE scenarios\", () => {\n      const sql = `with\n        /* comment */ first_cte as (\n          select 1 as id\n        ),\n        -- another comment\n        second_cte /* inline comment */ as (\n          select 2 as id\n        ),\n        {# jinja comment #} third_cte as (\n          select 3 as id\n        )\n      select * from third_cte`;\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(3);\n      assertCTE(\n        ctes[0],\n        \"first_cte\",\n        0,\n        \"First CTE with block comment before name\",\n      );\n      assertCTE(\n        ctes[1],\n        \"second_cte\",\n        1,\n        \"Second CTE with line and inline comments\",\n      );\n      assertCTE(\n        ctes[2],\n        \"third_cte\",\n        2,\n        \"Third CTE with Jinja comment before name\",\n      );\n    });\n\n    it(\"should handle comments with special characters around CTE name\", () => {\n      const sql =\n        \"with /* comment with $pecial ch@rs & symbols! */ my_cte as (select 1 as id) select * from my_cte\";\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        \"my_cte\",\n        0,\n        \"CTE with comment containing special characters\",\n      );\n    });\n\n    it(\"should handle unterminated block comment before CTE name\", () => {\n      const sql =\n        \"with /* unterminated comment my_cte as (select 1 as id) select * from my_cte\";\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      // With unterminated comment, the parser may not detect the CTE correctly\n      // This test verifies graceful handling of malformed comments\n      expect(ctes.length).toBeGreaterThanOrEqual(0);\n    });\n\n    it(\"should handle sequential line and block comments between name and AS\", () => {\n      const sql = `with source -- test\n/* this is\na multi-line comment\nthat should be ignored */\nas (\n    select * from {{ ref('raw_orders') }}\n)\nselect * from renamed`;\n\n      const document = createMockDocument(sql);\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        \"source\",\n        0,\n        \"CTE with sequential line and block comments between name and AS\",\n      );\n    });\n  });\n\n  describe(\"Complex Comment Scenarios\", () => {\n    it(\"should handle CTE with mixed block and Jinja comments\", () => {\n      const sql = `with\nsource /* test */ as(\n    {#-\n    Normally we would select from the table here, but we are using seeds to load\n    our data in this project\n    #}\n    select * from {{ ref('raw_orders') }}\n),\n\nrenamed as (\n    select\n        id as order_id,\n        user_id as customer_id,\n        order_date,\n        status\n    from source\n)\n\nselect * from renamed`;\n\n      const document = createMockDocument(sql);\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(2);\n      assertCTE(\n        ctes[0],\n        \"source\",\n        0,\n        \"CTE with block comment after name and Jinja comment in body\",\n      );\n      assertCTE(\n        ctes[1],\n        \"renamed\",\n        1,\n        \"CTE that references another CTE with column aliasing\",\n      );\n    });\n\n    it(\"should handle CTE with multi-line block comment before AS keyword\", () => {\n      const sql = `with source \n/* this is \na multi-line comment\nthat should be ignored */\nas (\n    select * from {{ ref('raw_orders') }}\n),\n\nrenamed as (\n    select\n        id as order_id,\n        user_id as customer_id,\n        order_date,\n        status\n    from source\n)\n\nselect * from renamed`;\n\n      const document = createMockDocument(sql);\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(2);\n      assertCTE(\n        ctes[0],\n        \"source\",\n        0,\n        \"CTE with multi-line block comment spanning multiple lines before AS\",\n      );\n      assertCTE(\n        ctes[1],\n        \"renamed\",\n        1,\n        \"CTE that selects from another CTE with column renaming\",\n      );\n    });\n  });\n\n  describe(\"Very Lengthy Comments with Quoted Names\", () => {\n    it(\"should handle extremely long block comment before quoted CTE name\", () => {\n      // Create a 1500+ character comment to test real-world lengthy comment scenarios\n      const longComment =\n        \"/* \" +\n        \"This is an extremely long comment that might appear in real-world SQL files. \".repeat(\n          25,\n        ) +\n        \"It contains multiple sentences and potentially problematic content like 'quoted strings', \" +\n        \"special characters !@#$%^&*()_+-=[]{}|;:,.<>?, and even problematic keywords \" +\n        \"that might confuse the parser. This comment also contains backslashes \\\\ and forward slashes // \" +\n        \"and other regex-problematic characters like .*+?^${}()|[] that could cause catastrophic backtracking \" +\n        \"in poorly designed regular expressions. The comment goes on and on longer. \".repeat(\n          10,\n        ) +\n        \" */\";\n\n      const sql = `with ${longComment} \"quoted_cte_name\" as (select 1 as id) select * from \"quoted_cte_name\"`;\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        '\"quoted_cte_name\"',\n        0,\n        \"CTE with extremely long block comment (1500+ chars) before quoted name\",\n      );\n    });\n\n    it(\"should handle extremely long line comment before quoted CTE name\", () => {\n      // Create a 1000+ character line comment\n      const longLineComment =\n        \"-- \" +\n        \"This is an extremely long line comment that might appear in real-world SQL files. \".repeat(\n          12,\n        ) +\n        \"It contains 'quoted strings' and special characters that could cause issues. \";\n\n      const sql = `with\\n${longLineComment}\\n\"quoted_cte_name\" as (select 1 as id) select * from \"quoted_cte_name\"`;\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        '\"quoted_cte_name\"',\n        0,\n        \"CTE with extremely long line comment (1000+ chars) before quoted name\",\n      );\n    });\n\n    it(\"should handle extremely long Jinja comment before quoted CTE name\", () => {\n      // Create a 1200+ character Jinja comment\n      const longJinjaComment =\n        \"{# \" +\n        \"This is an extremely long Jinja comment that might appear in real-world dbt files. \".repeat(\n          15,\n        ) +\n        \"It contains 'quoted strings', template variables like {{ var('my_var') }}, and complex logic. \" +\n        \"The comment includes special characters and database keywords that could confuse parsers. \" +\n        \" #}\";\n\n      const sql = `with ${longJinjaComment} \"quoted_cte_name\" as (select 1 as id) select * from \"quoted_cte_name\"`;\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        '\"quoted_cte_name\"',\n        0,\n        \"CTE with extremely long Jinja comment (1200+ chars) before quoted name\",\n      );\n    });\n\n    it(\"should handle extremely long block comment after quoted CTE name\", () => {\n      // Create a 2000+ character comment after the name\n      const longComment =\n        \"/* \" +\n        \"This is an extremely long comment that appears after the table name but before AS. \".repeat(\n          30,\n        ) +\n        \"It contains multiple paragraphs, 'quoted strings', and complex descriptions that might \" +\n        \"explain the business logic behind the transformation. The comment includes database keywords, special \" +\n        \"characters, and other potentially problematic content for regex parsing. \".repeat(\n          5,\n        ) +\n        \" */\";\n\n      const sql = `with \"quoted_cte_name\" ${longComment} as (select 1 as id) select * from \"quoted_cte_name\"`;\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        '\"quoted_cte_name\"',\n        0,\n        \"CTE with extremely long block comment (2000+ chars) after quoted name\",\n      );\n    });\n\n    it(\"should handle multiple very long comments around quoted CTE name\", () => {\n      // Create multiple long comments around the CTE name\n      const longCommentBefore =\n        \"/* \" +\n        \"Long comment before the CTE name. \".repeat(20) +\n        \"Contains 'quotes' and special characters. \" +\n        \" */\";\n\n      const longCommentAfter =\n        \"/* \" +\n        \"Long comment after the CTE name but before AS. \".repeat(20) +\n        \"Also contains 'quotes' and special characters. \" +\n        \" */\";\n\n      const sql = `with ${longCommentBefore} \"quoted_cte_name\" ${longCommentAfter} as (select 1 as id) select * from \"quoted_cte_name\"`;\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        '\"quoted_cte_name\"',\n        0,\n        \"CTE with multiple very long comments around quoted name\",\n      );\n    });\n\n    it(\"should handle extremely long mixed comment types around quoted CTE name\", () => {\n      // Test with line comment, block comment, and Jinja comment (avoid SQL keywords in comments)\n      const longLineComment =\n        \"-- \" +\n        \"Very long line comment containing 'quotes' and special characters. \".repeat(\n          10,\n        );\n\n      const longBlockComment =\n        \"/* \" +\n        \"Very long block comment containing 'quotes' and special characters. \".repeat(\n          15,\n        ) +\n        \" */\";\n\n      const longJinjaComment =\n        \"{# \" +\n        \"Very long Jinja comment containing 'quotes' and template logic. \".repeat(\n          10,\n        ) +\n        \" #}\";\n\n      const sql = `${longLineComment}\\n${longBlockComment}\\nwith \"quoted_cte_name\" ${longJinjaComment} as (select 1 as id) select * from \"quoted_cte_name\"`;\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        '\"quoted_cte_name\"',\n        0,\n        \"CTE with extremely long mixed comment types around quoted name\",\n      );\n    });\n\n    it(\"should handle lengthy comments with quoted names in multi-CTE scenario\", () => {\n      // Test performance with multiple CTEs each having lengthy comments\n      const longComment1 =\n        \"/* \" +\n        \"First data source containing very long description. \".repeat(25) +\n        \"Contains 'quotes' and special characters for testing. \" +\n        \" */\";\n\n      const longComment2 =\n        \"/* \" +\n        \"Second data source containing very long description. \".repeat(25) +\n        \"Also contains 'quotes' and special characters for testing. \" +\n        \" */\";\n\n      const sql = `with\n        ${longComment1} \"first_quoted_cte\" as (\n          select 1 as id, 'first' as name\n        ),\n        ${longComment2} \"second_quoted_cte\" as (\n          select 2 as id, 'second' as name\n        )\n      select * from \"first_quoted_cte\" union all select * from \"second_quoted_cte\"`;\n\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(2);\n      assertCTE(\n        ctes[0],\n        '\"first_quoted_cte\"',\n        0,\n        \"First CTE with very long comment before quoted name\",\n      );\n      assertCTE(\n        ctes[1],\n        '\"second_quoted_cte\"',\n        1,\n        \"Second CTE with very long comment before quoted name\",\n      );\n    });\n\n    it(\"should handle extremely long comments with regex-problematic content\", () => {\n      // Create a comment with content that could cause regex issues\n      const problemComment =\n        \"/* \" +\n        \"This comment contains regex-problematic content: .*+?^${}()|[] \".repeat(\n          20,\n        ) +\n        \"It also has nested quotes like 'text with \\\"nested quotes\\\" inside' and \" +\n        \"backslashes \\\\ and forward slashes // that could break poorly designed regex. \" +\n        \"The comment includes SQL injection attempts like '; DROP TABLE users; -- \" +\n        \"and other malicious content that should be handled safely. \".repeat(\n          10,\n        ) +\n        \" */\";\n\n      const sql = `with ${problemComment} \"secure_cte_name\" as (select 1 as id) select * from \"secure_cte_name\"`;\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        '\"secure_cte_name\"',\n        0,\n        \"CTE with extremely long comment containing regex-problematic content\",\n      );\n    });\n  });\n\n  describe(\"MAX_QUOTED_IDENTIFIER_LENGTH Edge Cases\", () => {\n    it(\"should handle comments with quoted strings longer than MAX_QUOTED_IDENTIFIER_LENGTH\", () => {\n      // Create a quoted string in comment that's longer than 500 chars\n      const veryLongQuotedString = '\"' + \"a\".repeat(600) + '\"';\n      const commentWithLongQuotedString = `/* This comment contains a very long quoted string: ${veryLongQuotedString} that exceeds the MAX_QUOTED_IDENTIFIER_LENGTH limit */`;\n\n      const sql = `with ${commentWithLongQuotedString} \"real_cte\" as (select 1 as id) select * from \"real_cte\"`;\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        '\"real_cte\"',\n        0,\n        \"CTE with comment containing quoted string longer than MAX_QUOTED_IDENTIFIER_LENGTH\",\n      );\n    });\n\n    it(\"should handle quoted CTE name approaching MAX_QUOTED_IDENTIFIER_LENGTH limit\", () => {\n      // Create a quoted CTE name that's close to but under the 500 char limit\n      const longCTEName = '\"' + \"very_long_cte_name_\" + \"x\".repeat(450) + '\"';\n\n      const sql = `with ${longCTEName} as (select 1 as id) select * from ${longCTEName}`;\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        longCTEName,\n        0,\n        \"CTE with quoted name approaching MAX_QUOTED_IDENTIFIER_LENGTH limit\",\n      );\n    });\n\n    it(\"should handle quoted CTE name exactly at MAX_QUOTED_IDENTIFIER_LENGTH limit\", () => {\n      // Create a quoted CTE name that's exactly at the 500 char limit (498 chars inside quotes + 2 quotes = 500)\n      const exactLimitCTEName = '\"' + \"x\".repeat(498) + '\"';\n\n      const sql = `with ${exactLimitCTEName} as (select 1 as id) select * from ${exactLimitCTEName}`;\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        exactLimitCTEName,\n        0,\n        \"CTE with quoted name exactly at MAX_QUOTED_IDENTIFIER_LENGTH limit\",\n      );\n    });\n\n    it(\"should handle comment with multiple long quoted strings and real CTE\", () => {\n      // Test multiple long quoted strings in comments\n      const longQuotedString1 =\n        '\"' + \"fake_identifier_1_\" + \"a\".repeat(600) + '\"';\n      const longQuotedString2 =\n        '\"' + \"fake_identifier_2_\" + \"b\".repeat(700) + '\"';\n      const commentWithMultipleLongQuotes = `/* Comment with ${longQuotedString1} and also ${longQuotedString2} */`;\n\n      const sql = `with ${commentWithMultipleLongQuotes} \"actual_cte\" as (select 1 as id) select * from \"actual_cte\"`;\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        '\"actual_cte\"',\n        0,\n        \"CTE with comment containing multiple quoted strings longer than MAX_QUOTED_IDENTIFIER_LENGTH\",\n      );\n    });\n\n    it(\"should handle extremely long comment with quoted content and real long CTE name\", () => {\n      // Combine very long comment with quoted content AND a long CTE name\n      const longQuotedInComment =\n        '\"' + \"fake_cte_name_in_comment_\" + \"z\".repeat(800) + '\"';\n      const longComment = `/* ${\"Very long comment text. \".repeat(50)} Contains fake quoted identifier: ${longQuotedInComment} ${\"More comment text. \".repeat(30)} */`;\n      const longRealCTEName = '\"' + \"real_cte_name_\" + \"r\".repeat(400) + '\"';\n\n      const sql = `with ${longComment} ${longRealCTEName} as (select 1 as id) select * from ${longRealCTEName}`;\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        longRealCTEName,\n        0,\n        \"CTE with extremely long comment containing long quoted string and long real CTE name\",\n      );\n    });\n\n    it(\"should handle line comment with long quoted string before quoted CTE\", () => {\n      // Test line comment with long quoted content\n      const longQuotedInLineComment =\n        '\"' + \"fake_line_comment_identifier_\" + \"l\".repeat(600) + '\"';\n      const lineComment = `-- Line comment with long quoted string: ${longQuotedInLineComment}`;\n\n      const sql = `with\\n${lineComment}\\n\"real_cte\" as (select 1 as id) select * from \"real_cte\"`;\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        '\"real_cte\"',\n        0,\n        \"CTE with line comment containing quoted string longer than MAX_QUOTED_IDENTIFIER_LENGTH\",\n      );\n    });\n\n    it(\"should handle Jinja comment with long quoted string before quoted CTE\", () => {\n      // Test Jinja comment with long quoted content\n      const longQuotedInJinjaComment =\n        '\"' + \"fake_jinja_identifier_\" + \"j\".repeat(650) + '\"';\n      const jinjaComment = `{# Jinja comment with long quoted string: ${longQuotedInJinjaComment} #}`;\n\n      const sql = `with ${jinjaComment} \"real_cte\" as (select 1 as id) select * from \"real_cte\"`;\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        '\"real_cte\"',\n        0,\n        \"CTE with Jinja comment containing quoted string longer than MAX_QUOTED_IDENTIFIER_LENGTH\",\n      );\n    });\n\n    it(\"should handle mixed comment types with various length quoted strings\", () => {\n      // Test combination of different comment types with various length quoted strings\n      const shortQuoted = '\"short\"';\n      const mediumQuoted = '\"' + \"medium_\" + \"m\".repeat(200) + '\"';\n      const longQuoted = '\"' + \"very_long_\" + \"v\".repeat(800) + '\"';\n\n      const lineComment = `-- Line comment with ${shortQuoted}`;\n      const blockComment = `/* Block comment with ${mediumQuoted} and ${longQuoted} */`;\n      const jinjaComment = `{# Jinja comment with ${longQuoted} #}`;\n\n      const sql = `${lineComment}\\n${blockComment}\\nwith ${jinjaComment} \"mixed_test_cte\" as (select 1 as id) select * from \"mixed_test_cte\"`;\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        '\"mixed_test_cte\"',\n        0,\n        \"CTE with mixed comment types containing various length quoted strings\",\n      );\n    });\n  });\n\n  describe(\"CTE Column List Test Cases\", () => {\n    describe(\"Basic Column List Variations\", () => {\n      it(\"should handle simple column list with multiple columns\", () => {\n        const sql =\n          \"with my_cte (id, name, email, created_at) as (select 1, 'John', 'john@example.com', now()) select * from my_cte\";\n        const document = createMockDocument(sql);\n\n        const ctes = detectCtes(document);\n\n        expect(ctes).toHaveLength(1);\n        assertCTE(\n          ctes[0],\n          \"my_cte (id, name, email, created_at)\",\n          0,\n          \"CTE with multiple column names in list\",\n        );\n      });\n\n      it(\"should handle column list with quoted column names\", () => {\n        const sql =\n          'with my_cte (\"user id\", \"full name\", \"email address\") as (select 1, \\'John Doe\\', \\'john@example.com\\') select * from my_cte';\n        const document = createMockDocument(sql);\n\n        const ctes = detectCtes(document);\n\n        expect(ctes).toHaveLength(1);\n        assertCTE(\n          ctes[0],\n          'my_cte (\"user id\", \"full name\", \"email address\")',\n          0,\n          \"CTE with quoted column names containing spaces\",\n        );\n      });\n\n      it(\"should handle column list with mixed quoted and unquoted names\", () => {\n        const sql =\n          \"with my_cte (id, \\\"user name\\\", email, \\\"created at\\\") as (select 1, 'John', 'john@example.com', now()) select * from my_cte\";\n        const document = createMockDocument(sql);\n\n        const ctes = detectCtes(document);\n\n        expect(ctes).toHaveLength(1);\n        assertCTE(\n          ctes[0],\n          'my_cte (id, \"user name\", email, \"created at\")',\n          0,\n          \"CTE with mixed quoted and unquoted column names\",\n        );\n      });\n\n      it(\"should handle column list with simple data types\", () => {\n        const sql =\n          \"with my_cte (id integer, name varchar, amount decimal) as (select 1, 'John', 100.50) select * from my_cte\";\n        const document = createMockDocument(sql);\n\n        const ctes = detectCtes(document);\n\n        expect(ctes).toHaveLength(1);\n        assertCTE(\n          ctes[0],\n          \"my_cte (id integer, name varchar, amount decimal)\",\n          0,\n          \"CTE with simple column names and data types\",\n        );\n      });\n\n      it(\"should handle column list with single column\", () => {\n        const sql =\n          \"with my_cte (single_column) as (select 'value') select * from my_cte\";\n        const document = createMockDocument(sql);\n\n        const ctes = detectCtes(document);\n\n        expect(ctes).toHaveLength(1);\n        assertCTE(\n          ctes[0],\n          \"my_cte (single_column)\",\n          0,\n          \"CTE with single column in list\",\n        );\n      });\n    });\n\n    describe(\"Length and Performance Edge Cases\", () => {\n      it(\"should handle column list approaching MAX_COLUMN_LIST_LENGTH limit\", () => {\n        // Create a column list that's close to but under the 1000 char limit\n        const longColumnList = Array.from(\n          { length: 20 },\n          (_, i) => `column_${i}_with_long_name`,\n        ).join(\", \");\n        const sql = `with my_cte (${longColumnList}) as (select ${Array.from({ length: 20 }, (_, i) => i).join(\", \")}) select * from my_cte`;\n        const document = createMockDocument(sql);\n\n        const ctes = detectCtes(document);\n\n        expect(ctes).toHaveLength(1);\n        assertCTE(\n          ctes[0],\n          `my_cte (${longColumnList})`,\n          0,\n          \"CTE with column list approaching MAX_COLUMN_LIST_LENGTH limit\",\n        );\n      });\n\n      it(\"should handle column list near MAX_COLUMN_LIST_LENGTH limit\", () => {\n        // Create a column list that's close to the 1000 char limit\n        const nearLimitColumnList = \"x\".repeat(900); // 900 chars - well within limit\n        const sql = `with my_cte (${nearLimitColumnList}) as (select 1) select * from my_cte`;\n        const document = createMockDocument(sql);\n\n        const ctes = detectCtes(document);\n\n        expect(ctes).toHaveLength(1);\n        assertCTE(\n          ctes[0],\n          `my_cte (${nearLimitColumnList})`,\n          0,\n          \"CTE with column list near MAX_COLUMN_LIST_LENGTH limit\",\n        );\n      });\n\n      it(\"should handle very long individual column names\", () => {\n        const longColumnName1 =\n          '\"' + \"very_long_column_name_\" + \"a\".repeat(200) + '\"';\n        const longColumnName2 =\n          '\"' + \"another_long_column_name_\" + \"b\".repeat(200) + '\"';\n        const sql = `with my_cte (${longColumnName1}, ${longColumnName2}) as (select 1, 2) select * from my_cte`;\n        const document = createMockDocument(sql);\n\n        const ctes = detectCtes(document);\n\n        expect(ctes).toHaveLength(1);\n        assertCTE(\n          ctes[0],\n          `my_cte (${longColumnName1}, ${longColumnName2})`,\n          0,\n          \"CTE with very long individual column names\",\n        );\n      });\n    });\n\n    describe(\"Complex Column List Scenarios\", () => {\n      it(\"should handle column list with nested parentheses (function calls)\", () => {\n        const sql =\n          \"with my_cte (id, calculated_value, formatted_date) as (select 1, round(avg(amount), 2), to_char(created_at, 'YYYY-MM-DD')) select * from my_cte\";\n        const document = createMockDocument(sql);\n\n        const ctes = detectCtes(document);\n\n        expect(ctes).toHaveLength(1);\n        assertCTE(\n          ctes[0],\n          \"my_cte (id, calculated_value, formatted_date)\",\n          0,\n          \"CTE with column list containing nested parentheses from function calls\",\n        );\n      });\n\n      it(\"should handle column list with simple constraints\", () => {\n        const sql =\n          \"with my_cte (id not null, name, amount default 0) as (select 1, 'John', 100.0) select * from my_cte\";\n        const document = createMockDocument(sql);\n\n        const ctes = detectCtes(document);\n\n        expect(ctes).toHaveLength(1);\n        assertCTE(\n          ctes[0],\n          \"my_cte (id not null, name, amount default 0)\",\n          0,\n          \"CTE with column list containing simple constraints\",\n        );\n      });\n\n      it(\"should handle column list with line breaks and formatting\", () => {\n        const sql = `with my_cte (\n          id,\n          name,\n          email,\n          created_at\n        ) as (\n          select 1, 'John', 'john@example.com', now()\n        ) select * from my_cte`;\n        const document = createMockDocument(sql);\n\n        const ctes = detectCtes(document);\n\n        expect(ctes).toHaveLength(1);\n        assertCTE(\n          ctes[0],\n          `my_cte (\n          id,\n          name,\n          email,\n          created_at\n        )`,\n          0,\n          \"CTE with multi-line formatted column list\",\n        );\n      });\n\n      it(\"should handle column list with special characters and escaped quotes\", () => {\n        const sql = `with my_cte (\"col_with_'quote\", \"col with spaces\", \"col@with#symbols\") as (select 1, 2, 3) select * from my_cte`;\n        const document = createMockDocument(sql);\n\n        const ctes = detectCtes(document);\n\n        expect(ctes).toHaveLength(1);\n        assertCTE(\n          ctes[0],\n          `my_cte (\"col_with_'quote\", \"col with spaces\", \"col@with#symbols\")`,\n          0,\n          \"CTE with column list containing special characters and quotes\",\n        );\n      });\n    });\n\n    describe(\"Column List + Comment Combinations\", () => {\n      it(\"should handle comments before the opening parenthesis\", () => {\n        const sql =\n          \"with my_cte /* comment before column list */ (id, name) as (select 1, 'John') select * from my_cte\";\n        const document = createMockDocument(sql);\n\n        const ctes = detectCtes(document);\n\n        // Current limitation: Comments between CTE name and column list break the parsing\n        // This is an edge case that would require more complex parsing logic\n        expect(ctes).toHaveLength(0);\n      });\n\n      it(\"should handle comments after the closing parenthesis\", () => {\n        const sql =\n          \"with my_cte (id, name) /* comment after column list */ as (select 1, 'John') select * from my_cte\";\n        const document = createMockDocument(sql);\n\n        const ctes = detectCtes(document);\n\n        expect(ctes).toHaveLength(1);\n        assertCTE(\n          ctes[0],\n          \"my_cte (id, name)\",\n          0,\n          \"CTE with comment after column list closing parenthesis\",\n        );\n      });\n\n      it(\"should handle comments between column list and AS keyword\", () => {\n        const sql = `with my_cte (id, name, email)\n        -- This is a comment before AS\n        /* Another comment */\n        as (select 1, 'John', 'john@example.com') select * from my_cte`;\n        const document = createMockDocument(sql);\n\n        const ctes = detectCtes(document);\n\n        expect(ctes).toHaveLength(1);\n        assertCTE(\n          ctes[0],\n          \"my_cte (id, name, email)\",\n          0,\n          \"CTE with comments between column list and AS keyword\",\n        );\n      });\n\n      it(\"should handle mixed comment types around column lists\", () => {\n        const sql = `with /* before */ my_cte (\n          id, -- line comment\n          name /* inline comment */,\n          email\n        ) {# jinja comment #} as (select 1, 'John', 'john@example.com') select * from my_cte`;\n        const document = createMockDocument(sql);\n\n        const ctes = detectCtes(document);\n\n        expect(ctes).toHaveLength(1);\n        // Comments within column lists are currently included in the CTE name\n        // This is expected behavior given the current parsing approach\n        assertCTE(\n          ctes[0],\n          `my_cte (\n          id, -- line comment\n          name /* inline comment */,\n          email\n        )`,\n          0,\n          \"CTE with mixed comment types around column list\",\n        );\n      });\n    });\n\n    describe(\"Error Handling and Edge Cases\", () => {\n      it(\"should handle empty column lists\", () => {\n        const sql = \"with my_cte () as (select 1) select * from my_cte\";\n        const document = createMockDocument(sql);\n\n        const ctes = detectCtes(document);\n\n        expect(ctes).toHaveLength(1);\n        assertCTE(ctes[0], \"my_cte ()\", 0, \"CTE with empty column list\");\n      });\n\n      it(\"should handle column lists with only whitespace\", () => {\n        const sql = \"with my_cte (   ) as (select 1) select * from my_cte\";\n        const document = createMockDocument(sql);\n\n        const ctes = detectCtes(document);\n\n        expect(ctes).toHaveLength(1);\n        assertCTE(\n          ctes[0],\n          \"my_cte (   )\",\n          0,\n          \"CTE with whitespace-only column list\",\n        );\n      });\n\n      it(\"should handle column lists in combination with quoted CTE names\", () => {\n        const sql =\n          'with \"my cte\" (id, \"user name\", email) as (select 1, \\'John\\', \\'john@example.com\\') select * from \"my cte\"';\n        const document = createMockDocument(sql);\n\n        const ctes = detectCtes(document);\n\n        expect(ctes).toHaveLength(1);\n        assertCTE(\n          ctes[0],\n          '\"my cte\" (id, \"user name\", email)',\n          0,\n          \"CTE with quoted name and column list with quoted columns\",\n        );\n      });\n\n      it(\"should handle deeply nested parentheses in column definitions\", () => {\n        const sql =\n          \"with my_cte (calculated_field, nested_calc) as (select sum(case when (x > 0 and (y < 10 or z = (a + b))) then 1 else 0 end), avg(coalesce(field1, field2, 0))) select * from my_cte\";\n        const document = createMockDocument(sql);\n\n        const ctes = detectCtes(document);\n\n        expect(ctes).toHaveLength(1);\n        assertCTE(\n          ctes[0],\n          \"my_cte (calculated_field, nested_calc)\",\n          0,\n          \"CTE with column list and deeply nested parentheses in query\",\n        );\n      });\n    });\n\n    describe(\"Real-World Complex Scenarios\", () => {\n      it(\"should handle simple BigQuery-style column definitions\", () => {\n        const sql = `with my_cte (\n          user_id INT64,\n          user_name STRING,\n          created_at TIMESTAMP\n        ) as (\n          select 1, 'John', current_timestamp()\n        ) select * from my_cte`;\n        const document = createMockDocument(sql);\n\n        const ctes = detectCtes(document);\n\n        expect(ctes).toHaveLength(1);\n        assertCTE(\n          ctes[0],\n          `my_cte (\n          user_id INT64,\n          user_name STRING,\n          created_at TIMESTAMP\n        )`,\n          0,\n          \"CTE with simple BigQuery-style column definitions\",\n        );\n      });\n\n      it(\"should handle multi-CTE scenarios with varying column list complexity\", () => {\n        const sql = `with\n          simple_cte (id, name) as (\n            select 1, 'John'\n          ),\n          complex_cte (\n            user_id,\n            \"full name\",\n            calculated_field,\n            metadata_json\n          ) as (\n            select id, name, id * 100, '{\"key\": \"value\"}'\n            from simple_cte\n          ),\n          no_columns_cte as (\n            select * from complex_cte\n          )\n        select * from no_columns_cte`;\n        const document = createMockDocument(sql);\n\n        const ctes = detectCtes(document);\n\n        expect(ctes).toHaveLength(3);\n        assertCTE(\n          ctes[0],\n          \"simple_cte (id, name)\",\n          0,\n          \"First CTE with simple column list\",\n        );\n        assertCTE(\n          ctes[1],\n          `complex_cte (\n            user_id,\n            \"full name\",\n            calculated_field,\n            metadata_json\n          )`,\n          1,\n          \"Second CTE with complex multi-line column list\",\n        );\n        assertCTE(\n          ctes[2],\n          \"no_columns_cte\",\n          2,\n          \"Third CTE without column list\",\n        );\n      });\n    });\n  });\n\n  describe(\"CTE Cross-References\", () => {\n    it(\"should handle simple sequential CTE references\", () => {\n      const sql = `with\n        base_data as (\n          select 1 as id, 'test' as name\n        ),\n        filtered_data as (\n          select * from base_data where id > 0\n        ),\n        final_data as (\n          select id, upper(name) as name from filtered_data\n        )\n      select * from final_data`;\n\n      const document = createMockDocument(sql);\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(3);\n      assertCTE(ctes[0], \"base_data\", 0, \"CTE with hardcoded test data\");\n      assertCTE(\n        ctes[1],\n        \"filtered_data\",\n        1,\n        \"CTE filtering data from base_data CTE\",\n      );\n      assertCTE(\n        ctes[2],\n        \"final_data\",\n        2,\n        \"CTE transforming data from filtered_data CTE\",\n      );\n    });\n\n    it(\"should handle CTE references with joins\", () => {\n      const sql = `with\n        orders as (\n          select 1 as order_id, 100 as customer_id\n        ),\n        customers as (\n          select 100 as id, 'John' as name\n        ),\n        order_details as (\n          select o.order_id, c.name\n          from orders o\n          join customers c on o.customer_id = c.id\n        )\n      select * from order_details`;\n\n      const document = createMockDocument(sql);\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(3);\n      assertCTE(ctes[0], \"orders\", 0, \"CTE with order and customer ID data\");\n      assertCTE(ctes[1], \"customers\", 1, \"CTE with customer ID and name data\");\n      assertCTE(\n        ctes[2],\n        \"order_details\",\n        2,\n        \"CTE joining orders and customers CTEs\",\n      );\n    });\n\n    it(\"should handle CTE references with comments and quotes\", () => {\n      const sql = `with\n        source_data as (\n          select id, name -- 'source' data extraction\n          from raw_table\n        ),\n        cleaned_data as (\n          /* Reference to 'source_data' CTE */\n          select * from source_data\n          where name is not null\n        )\n      select * from cleaned_data`;\n\n      const document = createMockDocument(sql);\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(2);\n      assertCTE(\n        ctes[0],\n        \"source_data\",\n        0,\n        \"CTE with line comment containing single quotes\",\n      );\n      assertCTE(\n        ctes[1],\n        \"cleaned_data\",\n        1,\n        \"CTE referencing source_data with block comment containing quotes\",\n      );\n    });\n\n    it(\"should handle multiple CTE references in one query\", () => {\n      const sql = `with\n        cte_a as (\n          select 1 as id, 'A' as source\n        ),\n        cte_b as (\n          select 2 as id, 'B' as source\n        ),\n        cte_combined as (\n          select * from cte_a\n          union all\n          select * from cte_b\n        )\n      select * from cte_combined`;\n\n      const document = createMockDocument(sql);\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(3);\n      assertCTE(ctes[0], \"cte_a\", 0, \"CTE with ID 1 and source A\");\n      assertCTE(ctes[1], \"cte_b\", 1, \"CTE with ID 2 and source B\");\n      assertCTE(\n        ctes[2],\n        \"cte_combined\",\n        2,\n        \"CTE combining cte_a and cte_b with UNION ALL\",\n      );\n    });\n\n    it(\"should handle nested CTE references with subqueries\", () => {\n      const sql = `with\n        base as (\n          select id, amount from transactions\n        ),\n        aggregated as (\n          select id, sum(amount) as total\n          from base\n          group by id\n        ),\n        ranked as (\n          select *,\n                 (select count(*) from aggregated a2 where a2.total > aggregated.total) as rank\n          from aggregated\n        )\n      select * from ranked`;\n\n      const document = createMockDocument(sql);\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(3);\n      assertCTE(\n        ctes[0],\n        \"base\",\n        0,\n        \"CTE selecting ID and amount from transactions table\",\n      );\n      assertCTE(\n        ctes[1],\n        \"aggregated\",\n        1,\n        \"CTE grouping base CTE data by ID with sum\",\n      );\n      assertCTE(\n        ctes[2],\n        \"ranked\",\n        2,\n        \"CTE adding rank using correlated subquery on aggregated CTE\",\n      );\n    });\n  });\n\n  describe(\"Edge Cases\", () => {\n    it(\"should handle no CTEs\", () => {\n      const sql = \"select * from my_table\";\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(0);\n    });\n\n    it(\"should handle empty WITH clause\", () => {\n      const sql = \"with select * from my_table\";\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(0);\n    });\n\n    it(\"should handle complex nested queries\", () => {\n      const sql = `with my_cte as (\n        select id, (\n          select count(*) \n          from other_table \n          where other_table.id = main_table.id\n        ) as count\n        from main_table\n      ) select * from my_cte`;\n\n      const document = createMockDocument(sql);\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        \"my_cte\",\n        0,\n        \"CTE with correlated subquery counting from other table\",\n      );\n\n      // Skip content extraction test - focus on CTE detection correctness\n    });\n\n    it(\"should handle unterminated comments gracefully\", () => {\n      const sql =\n        \"with source /* unterminated comment as (select 1) select * from source\";\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      // The regex actually detects \"comment\" as a CTE name due to the unterminated comment\n      // This is expected behavior - the regex tries to parse what it can\n      expect(ctes.length).toBeGreaterThanOrEqual(0);\n    });\n\n    it(\"should skip non-SQL files\", () => {\n      const sql = \"with my_cte as (select 1) select * from my_cte\";\n      const document = createMockDocument(sql, \"plaintext\");\n\n      // Use provideCodeLenses which checks languageId\n      const codeLenses = provider.provideCodeLenses(document, {} as any);\n\n      expect(codeLenses).toEqual([]);\n    });\n  });\n\n  describe(\"CTE Range and Content Validation\", () => {\n    it(\"should provide correct ranges for CTE name and query\", () => {\n      const sql = \"with my_cte as (select 1 as id) select * from my_cte\";\n      const document = createMockDocument(sql);\n\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      const cte = ctes[0];\n\n      // Verify basic range structure is defined\n      expect(cte.range).toBeDefined();\n      expect(cte.queryRange).toBeDefined();\n      expect(cte.range.start).toBeDefined();\n      expect(cte.range.end).toBeDefined();\n      expect(cte.queryRange.start).toBeDefined();\n      expect(cte.queryRange.end).toBeDefined();\n\n      // Verify the CTE name was extracted correctly\n      expect(cte.name).toBe(\"my_cte\");\n      expect(cte.index).toBe(0);\n      expect(typeof cte.withClauseStart).toBe(\"number\");\n    });\n\n    it(\"should detect complex CTEs correctly\", () => {\n      const sql = `with\n        orders_summary as (\n          select \n            customer_id,\n            count(*) as order_count,\n            sum(total_amount) as total_spent\n          from orders\n          where status = 'completed'\n          group by customer_id\n        )\n      select * from orders_summary`;\n\n      const document = createMockDocument(sql);\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        \"orders_summary\",\n        0,\n        \"CTE with aggregated customer order data\",\n      );\n\n      // Verify range structure is correct\n      expect(ctes[0].queryRange).toBeDefined();\n    });\n\n    it(\"should handle CTE detection with comments correctly\", () => {\n      const sql = `with my_cte as (\n        select \n          id,\n          name, -- This is a comment with quotes 'inside'\n          /* Another comment */ \n          status\n        from users\n        {# Jinja comment with 'quotes' #}\n        where active = true\n      ) select * from my_cte`;\n\n      const document = createMockDocument(sql);\n      const ctes = detectCtes(document);\n\n      expect(ctes).toHaveLength(1);\n      assertCTE(\n        ctes[0],\n        \"my_cte\",\n        0,\n        \"CTE with line, block, and Jinja comments containing quotes\",\n      );\n\n      // Verify that CTE was detected despite comments with quotes\n      expect(ctes[0].name).toBe(\"my_cte\");\n      expect(ctes[0].queryRange).toBeDefined();\n    });\n  });\n});\n"
  },
  {
    "path": "src/test/suite/dbtCloudDetection.test.ts",
    "content": "import {\n  CommandProcessExecution,\n  CommandProcessExecutionFactory,\n  DBTCloudDetection,\n  DBTTerminal,\n  RuntimePythonEnvironment,\n} from \"@altimateai/dbt-integration\";\nimport { afterEach, beforeEach, describe, expect, it } from \"@jest/globals\";\nimport { anything, instance, mock, when } from \"ts-mockito\";\nimport { workspace } from \"vscode\";\nimport { VSCodeDBTTerminal } from \"../../dbt_client/vscodeTerminal\";\n\ndescribe(\"DBTCloudDetection Tests\", () => {\n  let mockCommandProcessExecutionFactory: CommandProcessExecutionFactory;\n  let mockPythonEnvironment: RuntimePythonEnvironment;\n  let mockTerminal: DBTTerminal;\n  let mockCommandProcessExecution: CommandProcessExecution;\n  let dbtCloudDetection: DBTCloudDetection;\n\n  beforeEach(() => {\n    mockCommandProcessExecutionFactory = mock(CommandProcessExecutionFactory);\n    mockTerminal = mock(VSCodeDBTTerminal);\n    mockCommandProcessExecution = mock<CommandProcessExecution>();\n\n    mockPythonEnvironment = {\n      pythonPath: \"/usr/bin/python3\",\n      getEnvironmentVariables: jest.fn().mockReturnValue({}),\n    };\n\n    // Setup default mocks\n    when(mockTerminal.debug(anything(), anything())).thenReturn();\n    when(\n      mockCommandProcessExecutionFactory.createCommandProcessExecution(\n        anything(),\n      ),\n    ).thenReturn(instance(mockCommandProcessExecution));\n\n    // Mock workspace.workspaceFolders\n    Object.defineProperty(workspace, \"workspaceFolders\", {\n      get: () => [{ uri: { fsPath: \"/test/workspace\" } }],\n      configurable: true,\n    });\n\n    dbtCloudDetection = new DBTCloudDetection(\n      instance(mockCommandProcessExecutionFactory),\n      mockPythonEnvironment,\n      instance(mockTerminal),\n    );\n  });\n\n  afterEach(() => {\n    // Reset workspace.workspaceFolders\n    Object.defineProperty(workspace, \"workspaceFolders\", {\n      get: () => undefined,\n      configurable: true,\n    });\n  });\n\n  it(\"should return true for supported dbt Cloud CLI version\", async () => {\n    when(mockCommandProcessExecution.complete()).thenResolve({\n      stdout: \"dbt Cloud CLI - 0.38.0\",\n      stderr: \"\",\n      fullOutput: \"dbt Cloud CLI - 0.38.0\",\n    });\n\n    const result = await dbtCloudDetection.detectDBT();\n    expect(result).toBe(true);\n  });\n\n  it.skip(\"should return false for unsupported dbt Cloud CLI version\", async () => {\n    when(mockCommandProcessExecution.complete()).thenResolve({\n      stdout: \"dbt Cloud CLI - 0.35.0\",\n      stderr: \"\",\n      fullOutput: \"dbt Cloud CLI - 0.35.0\",\n    });\n\n    const result = await dbtCloudDetection.detectDBT();\n    expect(result).toBe(false);\n  });\n\n  it(\"should return false when command execution fails\", async () => {\n    when(mockCommandProcessExecution.complete()).thenReject(\n      new Error(\"Command failed\"),\n    );\n\n    const result = await dbtCloudDetection.detectDBT();\n    expect(result).toBe(false);\n  });\n});\n"
  },
  {
    "path": "src/test/suite/dbtCoreDetection.test.ts",
    "content": "import {\n  CommandProcessExecution,\n  CommandProcessExecutionFactory,\n  DBTCoreDetection,\n} from \"@altimateai/dbt-integration\";\nimport { afterEach, beforeEach, describe, expect, it } from \"@jest/globals\";\nimport { Uri, workspace } from \"vscode\";\nimport { PythonEnvironment } from \"../../dbt_client/pythonEnvironment\";\n\ndescribe(\"DBTCoreDetection Tests\", () => {\n  let detection: DBTCoreDetection;\n  let mockCommandProcessExecutionFactory: jest.Mocked<CommandProcessExecutionFactory>;\n  let mockPythonEnvironment: jest.Mocked<PythonEnvironment>;\n  let mockCommandProcessExecution: jest.Mocked<CommandProcessExecution>;\n\n  beforeEach(() => {\n    // Mock workspace folders\n    const mockWorkspaceFolders = [\n      {\n        uri: Uri.file(\"/test/workspace\"),\n        name: \"test\",\n        index: 0,\n      },\n    ];\n\n    Object.defineProperty(workspace, \"workspaceFolders\", {\n      get: () => mockWorkspaceFolders,\n      configurable: true,\n    });\n\n    mockCommandProcessExecution = {\n      complete: jest\n        .fn()\n        .mockResolvedValue({ stdout: \"\", stderr: \"\", fullOutput: \"\" }),\n      completeWithTerminalOutput: jest\n        .fn()\n        .mockResolvedValue({ stdout: \"\", stderr: \"\", fullOutput: \"\" }),\n      disposables: [],\n      terminal: {} as any,\n      command: \"\",\n      spawn: jest.fn(),\n      kill: jest.fn(),\n      dispose: jest.fn(),\n      formatText: jest.fn(),\n    } as unknown as jest.Mocked<CommandProcessExecution>;\n\n    mockCommandProcessExecutionFactory = {\n      createCommandProcessExecution: jest\n        .fn()\n        .mockReturnValue(mockCommandProcessExecution),\n    } as unknown as jest.Mocked<CommandProcessExecutionFactory>;\n\n    mockPythonEnvironment = {\n      pythonPath: \"/path/to/python\",\n      getEnvironmentVariables: jest\n        .fn()\n        .mockReturnValue({ PATH: \"/some/path\" }),\n    } as unknown as jest.Mocked<PythonEnvironment>;\n\n    detection = new DBTCoreDetection(\n      mockPythonEnvironment as any,\n      mockCommandProcessExecutionFactory as any,\n    );\n  });\n\n  afterEach(() => {\n    jest.clearAllMocks();\n    // Restore original workspaceFolders property\n    Object.defineProperty(workspace, \"workspaceFolders\", {\n      get: () => undefined,\n      configurable: true,\n    });\n  });\n\n  it(\"should return true when dbt is installed\", async () => {\n    const mockResponse = {\n      stdout: \"\",\n      stderr: \"\",\n      fullOutput: \"\",\n    };\n    mockCommandProcessExecution.complete.mockResolvedValue(mockResponse);\n    mockCommandProcessExecutionFactory.createCommandProcessExecution.mockReturnValue(\n      mockCommandProcessExecution,\n    );\n\n    const result = await detection.detectDBT();\n\n    expect(result).toBe(true);\n    expect(\n      mockCommandProcessExecutionFactory.createCommandProcessExecution,\n    ).toHaveBeenCalledWith({\n      command: \"/path/to/python\",\n      args: [\"-c\", \"import dbt\"],\n      envVars: { PATH: \"/some/path\" },\n    });\n    expect(mockCommandProcessExecution.complete).toHaveBeenCalled();\n  });\n\n  it(\"should return false when dbt import fails with stderr\", async () => {\n    mockCommandProcessExecution.complete.mockResolvedValue({\n      stdout: \"\",\n      stderr: \"ModuleNotFoundError: No module named 'dbt'\",\n      fullOutput: \"ModuleNotFoundError: No module named 'dbt'\",\n    });\n\n    const result = await detection.detectDBT();\n\n    expect(result).toBe(false);\n  });\n\n  it(\"should return false when command execution throws error\", async () => {\n    mockCommandProcessExecution.complete.mockRejectedValue(\n      new Error(\"Command failed\"),\n    );\n\n    const result = await detection.detectDBT();\n\n    expect(result).toBe(false);\n  });\n});\n"
  },
  {
    "path": "src/test/suite/dbtCoreIntegration.test.ts",
    "content": "import {\n  CommandProcessExecution,\n  CommandProcessExecutionFactory,\n  DBTCoreDetection,\n} from \"@altimateai/dbt-integration\";\nimport { expect } from \"@jest/globals\";\nimport { workspace } from \"vscode\";\n\n// Mock workspace folders\njest.mock(\"vscode\", () => ({\n  ...jest.requireActual(\"vscode\"),\n  workspace: {\n    workspaceFolders: [\n      {\n        uri: {\n          fsPath: \"/test/workspace\",\n        },\n      },\n    ],\n  },\n}));\n\n// Note: DBTCoreProjectIntegration tests are temporarily disabled\n// TODO: Add proper tests for DBTCoreProjectIntegration\n\ndescribe(\"DBTCoreDetection Tests\", () => {\n  let dbtCoreDetection: DBTCoreDetection;\n  let mockCommandProcessExecutionFactory: jest.Mocked<CommandProcessExecutionFactory>;\n  let mockPythonEnvironment: jest.Mocked<any>;\n\n  beforeEach(() => {\n    // Create mock dependencies\n    mockCommandProcessExecutionFactory = {\n      createCommandProcessExecution: jest.fn(),\n    } as any;\n\n    mockPythonEnvironment = {\n      pythonPath: \"/usr/bin/python3\",\n      getEnvironmentVariables: jest.fn().mockReturnValue({}),\n    } as any;\n\n    // Create the instance with mocked dependencies\n    dbtCoreDetection = new DBTCoreDetection(\n      mockPythonEnvironment,\n      mockCommandProcessExecutionFactory,\n    );\n  });\n\n  it(\"should detect dbt when python import succeeds\", async () => {\n    // Arrange\n    const mockProcess = {\n      complete: jest.fn().mockResolvedValue({ stdout: \"\", stderr: \"\" }),\n      disposables: [],\n      terminal: undefined,\n      command: \"\",\n      spawn: jest.fn(),\n      kill: jest.fn(),\n      dispose: jest.fn(),\n      completeWithTerminalOutput: jest.fn(),\n      formatText: jest.fn(),\n    } as unknown as CommandProcessExecution;\n\n    mockCommandProcessExecutionFactory.createCommandProcessExecution.mockReturnValue(\n      mockProcess,\n    );\n\n    // Mock workspace folders\n    Object.defineProperty(workspace, \"workspaceFolders\", {\n      get: () => [{ uri: { fsPath: \"/test/workspace\" } }],\n      configurable: true,\n    });\n\n    // Act\n    const result = await dbtCoreDetection.detectDBT();\n\n    // Assert\n    expect(result).toBe(true);\n    expect(\n      mockCommandProcessExecutionFactory.createCommandProcessExecution,\n    ).toHaveBeenCalledWith({\n      command: \"/usr/bin/python3\",\n      args: [\"-c\", \"import dbt\"],\n      envVars: {},\n    });\n  });\n\n  it(\"should return false when dbt import fails\", async () => {\n    // Arrange\n    const mockProcess = {\n      complete: jest\n        .fn()\n        .mockRejectedValue(\n          new Error(\"ModuleNotFoundError: No module named 'dbt'\"),\n        ),\n      disposables: [],\n      terminal: undefined,\n      command: \"\",\n      spawn: jest.fn(),\n      kill: jest.fn(),\n      dispose: jest.fn(),\n      completeWithTerminalOutput: jest.fn(),\n      formatText: jest.fn(),\n    } as unknown as CommandProcessExecution;\n\n    mockCommandProcessExecutionFactory.createCommandProcessExecution.mockReturnValue(\n      mockProcess,\n    );\n\n    // Mock workspace folders\n    Object.defineProperty(workspace, \"workspaceFolders\", {\n      get: () => [{ uri: { fsPath: \"/test/workspace\" } }],\n      configurable: true,\n    });\n\n    // Act\n    const result = await dbtCoreDetection.detectDBT();\n\n    // Assert\n    expect(result).toBe(false);\n    expect(\n      mockCommandProcessExecutionFactory.createCommandProcessExecution,\n    ).toHaveBeenCalledWith({\n      command: \"/usr/bin/python3\",\n      args: [\"-c\", \"import dbt\"],\n      envVars: {},\n    });\n  });\n});\n"
  },
  {
    "path": "src/test/suite/dbtIntegration.test.ts",
    "content": "import {\n  CLIDBTCommandExecutionStrategy,\n  CommandProcessExecution,\n  CommandProcessExecutionFactory,\n  DBTCommand,\n  DBTTerminal,\n  RuntimePythonEnvironment,\n} from \"@altimateai/dbt-integration\";\nimport { afterEach, beforeEach, describe, expect, it } from \"@jest/globals\";\n\ndescribe(\"CLIDBTCommandExecutionStrategy Tests\", () => {\n  let strategy: CLIDBTCommandExecutionStrategy;\n  let mockCommandProcessExecutionFactory: jest.Mocked<CommandProcessExecutionFactory>;\n  let mockPythonEnvironment: jest.Mocked<RuntimePythonEnvironment>;\n  let mockTerminal: jest.Mocked<DBTTerminal>;\n  let mockCommandProcessExecution: jest.Mocked<CommandProcessExecution>;\n\n  beforeEach(() => {\n    // Create mock dependencies\n    mockCommandProcessExecution = {\n      complete: jest\n        .fn()\n        .mockResolvedValue({ stdout: \"success\", stderr: \"\", exitCode: 0 }),\n      completeWithTerminalOutput: jest\n        .fn()\n        .mockResolvedValue({ stdout: \"success\", stderr: \"\", exitCode: 0 }),\n      disposables: [],\n      terminal: {} as any,\n      command: \"\",\n      spawn: jest.fn(),\n      kill: jest.fn(),\n      dispose: jest.fn(),\n      formatText: jest.fn(),\n    } as unknown as jest.Mocked<CommandProcessExecution>;\n\n    mockCommandProcessExecutionFactory = {\n      createCommandProcessExecution: jest\n        .fn()\n        .mockReturnValue(mockCommandProcessExecution),\n    } as unknown as jest.Mocked<CommandProcessExecutionFactory>;\n\n    mockPythonEnvironment = {\n      pythonPath: \"/path/to/python\",\n      environmentVariables: { PATH: \"/some/path\" },\n      getEnvironmentVariables: jest\n        .fn()\n        .mockReturnValue({ PATH: \"/some/path\" }),\n    } as unknown as jest.Mocked<RuntimePythonEnvironment>;\n\n    mockTerminal = {\n      show: jest.fn(),\n      log: jest.fn(),\n      trace: jest.fn(),\n      debug: jest.fn(),\n      info: jest.fn(),\n      error: jest.fn(),\n      dispose: jest.fn(),\n    } as unknown as jest.Mocked<DBTTerminal>;\n\n    // Create strategy instance\n    strategy = new CLIDBTCommandExecutionStrategy(\n      mockCommandProcessExecutionFactory,\n      mockPythonEnvironment,\n      mockTerminal,\n      \"/test/workspace\",\n      \"dbt\",\n    );\n  });\n\n  afterEach(() => {\n    jest.clearAllMocks();\n  });\n\n  it(\"should properly handle command with terminal logging\", async () => {\n    // Arrange\n    const command = new DBTCommand(\n      \"Running dbt command\",\n      [\"run\", \"--select\", \"my_model\"],\n      true,\n      true,\n      true,\n    );\n\n    // Act\n    const result = await strategy.execute(command);\n\n    // Assert\n    expect(result.stdout).toBe(\"success\");\n\n    // Verify terminal was shown\n    expect(mockTerminal.show).toHaveBeenCalled();\n\n    // Verify telemetry was sent through terminal.info\n    expect(mockTerminal.info).toHaveBeenCalledWith(\n      \"dbtCommand\",\n      \"Executed dbt command: dbt run --select my_model\",\n      true,\n      {\n        command: \"dbt run --select my_model\",\n        execution: \"cli\",\n      },\n    );\n\n    // Verify terminal logging\n    expect(mockTerminal.log).toHaveBeenCalledWith(\n      \"> Executing task: dbt run --select my_model\\n\\r\",\n    );\n\n    // Verify command process execution\n    expect(\n      mockCommandProcessExecutionFactory.createCommandProcessExecution,\n    ).toHaveBeenCalledWith({\n      command: \"dbt\",\n      args: [\"run\", \"--select\", \"my_model\"],\n      signal: undefined,\n      cwd: \"/test/workspace\",\n      envVars: { PATH: \"/some/path\" },\n    });\n\n    // Verify completeWithTerminalOutput was called since logToTerminal is true\n    expect(\n      mockCommandProcessExecution.completeWithTerminalOutput,\n    ).toHaveBeenCalled();\n  });\n\n  it(\"should handle command without terminal logging\", async () => {\n    // Arrange\n    const command = new DBTCommand(\n      \"Running dbt command\",\n      [\"run\", \"--select\", \"my_model\"],\n      false,\n      true,\n      false,\n    );\n\n    // Act\n    const result = await strategy.execute(command);\n\n    // Assert\n    expect(result.stdout).toBe(\"success\");\n\n    // Verify terminal was not shown\n    expect(mockTerminal.show).not.toHaveBeenCalled();\n\n    // Verify telemetry was still sent through terminal.info\n    expect(mockTerminal.info).toHaveBeenCalledWith(\n      \"dbtCommand\",\n      \"Executed dbt command: dbt run --select my_model\",\n      true,\n      {\n        command: \"dbt run --select my_model\",\n        execution: \"cli\",\n      },\n    );\n\n    // Verify terminal was not logged to\n    expect(mockTerminal.log).not.toHaveBeenCalled();\n\n    // Verify command process execution\n    expect(\n      mockCommandProcessExecutionFactory.createCommandProcessExecution,\n    ).toHaveBeenCalledWith({\n      command: \"dbt\",\n      args: [\"run\", \"--select\", \"my_model\"],\n      signal: undefined,\n      cwd: \"/test/workspace\",\n      envVars: { PATH: \"/some/path\" },\n    });\n\n    // Verify complete was called since logToTerminal is false\n    expect(mockCommandProcessExecution.complete).toHaveBeenCalled();\n  });\n\n  it(\"should throw error when python environment is not available\", async () => {\n    // Arrange\n    const command = new DBTCommand(\"Running dbt command\", [\n      \"run\",\n      \"--select\",\n      \"my_model\",\n    ]);\n\n    // Remove python environment\n    (strategy as any).pythonEnvironment = {};\n\n    // Act & Assert\n    await expect(strategy.execute(command)).rejects.toThrow(\n      \"Could not launch command as python environment is not available\",\n    );\n  });\n});\n\ndescribe(\"DBTCommand Test Suite\", () => {\n  let mockExecutionStrategy: jest.Mocked<CLIDBTCommandExecutionStrategy>;\n\n  beforeEach(() => {\n    mockExecutionStrategy = {\n      execute: jest.fn(),\n    } as unknown as jest.Mocked<CLIDBTCommandExecutionStrategy>;\n  });\n\n  afterEach(() => {\n    jest.clearAllMocks();\n  });\n\n  it(\"should throw error when no execution strategy is set\", async () => {\n    const command = new DBTCommand(\"Test command\", [\"test\"]);\n    try {\n      await command.execute();\n      // If we get here, the test should fail because we expected an error\n      expect(true).toBe(false);\n    } catch (error) {\n      expect((error as Error).message).toBe(\n        \"Execution strategy is required to run dbt commands\",\n      );\n    }\n  });\n\n  it(\"should format command correctly\", () => {\n    const command = new DBTCommand(\"Test command\", [\n      \"run\",\n      \"--select\",\n      \"my_model\",\n    ]);\n    expect(command.getCommandAsString()).toBe(\"dbt run --select my_model\");\n  });\n\n  it(\"should append new arguments\", () => {\n    const command = new DBTCommand(\"Test command\", [\"run\"]);\n    command.addArgument(\"--select\");\n    command.addArgument(\"my_model\");\n    expect(command.getCommandAsString()).toBe(\"dbt run --select my_model\");\n  });\n\n  it(\"should use execution strategy when set\", async () => {\n    const command = new DBTCommand(\"Test command\", [\"test\"]);\n    mockExecutionStrategy.execute.mockResolvedValue({\n      stdout: \"success\",\n      stderr: \"\",\n      fullOutput: \"success\",\n    });\n\n    command.setExecutionStrategy(mockExecutionStrategy);\n    const result = await command.execute();\n\n    expect(result.stdout).toBe(\"success\");\n    expect(mockExecutionStrategy.execute).toHaveBeenCalledWith(\n      command,\n      undefined,\n    );\n  });\n});\n"
  },
  {
    "path": "src/test/suite/dbtProject.test.ts",
    "content": "import {\n  Catalog,\n  DBTCommandExecutionInfrastructure,\n  DBTCommandFactory,\n  DBTDiagnosticData,\n  DBTProjectIntegrationAdapterEvents,\n  DBTTerminal,\n  NoCredentialsError,\n  ParsedManifest,\n  RunResultsEventData,\n} from \"@altimateai/dbt-integration\";\nimport {\n  afterEach,\n  beforeEach,\n  describe,\n  expect,\n  it,\n  jest,\n} from \"@jest/globals\";\nimport { EventEmitter } from \"events\";\nimport * as path from \"path\";\nimport * as vscode from \"vscode\";\nimport { AltimateRequest } from \"../../altimate\";\nimport { DBTProject } from \"../../dbt_client/dbtProject\";\nimport { DBTProjectLog } from \"../../dbt_client/dbtProjectLog\";\nimport { ManifestCacheChangedEvent } from \"../../dbt_client/event/manifestCacheChangedEvent\";\nimport { PythonEnvironment } from \"../../dbt_client/pythonEnvironment\";\nimport { AltimateAuthService } from \"../../services/altimateAuthService\";\nimport { RunHistoryService } from \"../../services/runHistoryService\";\nimport { SharedStateService } from \"../../services/sharedStateService\";\nimport { TelemetryService } from \"../../telemetry\";\nimport { ValidationProvider } from \"../../validation_provider\";\n\n// Mock the @altimateai/dbt-integration module\njest.mock(\"@altimateai/dbt-integration\", () => {\n  // Get the actual module to inherit constants\n  const actualModule = jest.requireActual(\"@altimateai/dbt-integration\") as any;\n\n  return {\n    // First, include all the constants that should be inherited\n    DBT_PROJECT_FILE: actualModule.DBT_PROJECT_FILE || \"dbt_project.yml\",\n    MANIFEST_FILE: actualModule.MANIFEST_FILE || \"manifest.json\",\n    RUN_RESULTS_FILE: actualModule.RUN_RESULTS_FILE || \"run_results.json\",\n    CATALOG_FILE: actualModule.CATALOG_FILE || \"catalog.json\",\n    RESOURCE_TYPE_MODEL: actualModule.RESOURCE_TYPE_MODEL || \"model\",\n    RESOURCE_TYPE_MACRO: actualModule.RESOURCE_TYPE_MACRO || \"macro\",\n    RESOURCE_TYPE_ANALYSIS: actualModule.RESOURCE_TYPE_ANALYSIS || \"analysis\",\n    RESOURCE_TYPE_SOURCE: actualModule.RESOURCE_TYPE_SOURCE || \"source\",\n    RESOURCE_TYPE_EXPOSURE: actualModule.RESOURCE_TYPE_EXPOSURE || \"exposure\",\n    RESOURCE_TYPE_SEED: actualModule.RESOURCE_TYPE_SEED || \"seed\",\n    RESOURCE_TYPE_SNAPSHOT: actualModule.RESOURCE_TYPE_SNAPSHOT || \"snapshot\",\n    RESOURCE_TYPE_TEST: actualModule.RESOURCE_TYPE_TEST || \"test\",\n    RESOURCE_TYPE_METRIC: actualModule.RESOURCE_TYPE_METRIC || \"semantic_model\",\n\n    // Include any other constants from the actual module\n    DEFAULT_CONFIGURATION_VALUES:\n      actualModule.DEFAULT_CONFIGURATION_VALUES || {},\n\n    // Mock functions\n    validateSQLUsingSqlGlot: jest.fn(),\n    validateSQL: jest.fn(),\n\n    // Keep the actual event constants but ensure they're defined\n    DBTProjectIntegrationAdapterEvents:\n      actualModule.DBTProjectIntegrationAdapterEvents || {\n        SOURCE_FILE_CHANGED: \"sourceFileChanged\",\n        MANIFEST_PARSED: \"manifestParsed\",\n        RUN_RESULTS_PARSED: \"runResultsParsed\",\n        DIAGNOSTICS_CHANGED: \"diagnosticsChanged\",\n        PROJECT_CONFIG_CHANGED: \"projectConfigChanged\",\n        REBUILD_MANIFEST_STATUS_CHANGE: \"rebuildManifestStatusChange\",\n      },\n\n    // Mock the error class but keep it extending Error\n    NoCredentialsError: class NoCredentialsError extends Error {\n      constructor(message?: string) {\n        super(message);\n        this.name = \"NoCredentialsError\";\n      }\n    },\n  };\n});\n\n// Mock python-bridge\njest.mock(\"python-bridge\", () => ({\n  PythonException: class PythonException extends Error {\n    exception: any;\n    constructor(message: string) {\n      super(message);\n      this.exception = { message };\n    }\n  },\n}));\n\n// Mock vscode module\njest.mock(\"vscode\", () => {\n  const mock = jest.requireActual(\"../mock/vscode\");\n  return mock;\n});\n\n// Mock getProjectRelativePath to avoid workspace issues\njest.mock(\"../../utils\", () => {\n  return {\n    getProjectRelativePath: jest.fn(() => \"test-project\"),\n    extendErrorWithSupportLinks: jest.fn((error: any) => error),\n    getColumnNameByCase: jest.fn((name: string) => name),\n  };\n});\n\ndescribe(\"DBTProject Test Suite\", () => {\n  let mockTerminal: jest.Mocked<DBTTerminal>;\n  let mockTelemetry: jest.Mocked<TelemetryService>;\n  let mockAltimate: jest.Mocked<AltimateRequest>;\n  let mockValidationProvider: jest.Mocked<ValidationProvider>;\n  let mockPythonEnvironment: jest.Mocked<PythonEnvironment>;\n  let mockSharedStateService: jest.Mocked<SharedStateService>;\n  let mockAltimateAuthService: jest.Mocked<AltimateAuthService>;\n  let mockRunHistoryService: jest.Mocked<RunHistoryService>;\n  let mockExecutionInfrastructure: jest.Mocked<DBTCommandExecutionInfrastructure>;\n  let mockCommandFactory: jest.Mocked<DBTCommandFactory>;\n  let mockProjectIntegration: any;\n  let mockDbtProjectLog: jest.Mocked<DBTProjectLog>;\n  let mockManifestChangedEmitter: jest.Mocked<\n    vscode.EventEmitter<ManifestCacheChangedEvent>\n  >;\n  let dbtProject: DBTProject;\n  let dbtProjectLogFactory: jest.Mock;\n\n  beforeEach(() => {\n    // Setup workspace configuration mock\n    (vscode.workspace as any).workspaceFolders = [\n      {\n        uri: vscode.Uri.file(\"/test/workspace\"),\n        name: \"Test Workspace\",\n        index: 0,\n      },\n    ];\n    (vscode.workspace.getConfiguration as jest.Mock).mockReturnValue({\n      get: jest.fn((key: string) => {\n        if (key === \"dbtIntegration\") {\n          return \"core\";\n        }\n        if (key === \"queryLimit\") {\n          return 500;\n        }\n        if (key === \"deferConfigPerProject\") {\n          return {};\n        }\n        return undefined;\n      }),\n      has: jest.fn(),\n      update: jest.fn(),\n    });\n    // Mock DBTTerminal\n    mockTerminal = {\n      show: jest.fn(),\n      log: jest.fn(),\n      trace: jest.fn(),\n      debug: jest.fn(),\n      info: jest.fn(),\n      error: jest.fn(),\n      dispose: jest.fn(),\n      logNewLine: jest.fn(),\n      logLine: jest.fn(),\n      logHorizontalRule: jest.fn(),\n      logBlock: jest.fn(),\n      warn: jest.fn(),\n    } as unknown as jest.Mocked<DBTTerminal>;\n\n    // Mock TelemetryService\n    mockTelemetry = {\n      sendTelemetryEvent: jest.fn(),\n      sendTelemetryError: jest.fn(),\n      setTelemetryCustomAttribute: jest.fn(),\n      startTelemetryEvent: jest.fn(),\n      endTelemetryEvent: jest.fn(),\n      dispose: jest.fn(),\n    } as unknown as jest.Mocked<TelemetryService>;\n\n    // Mock AltimateRequest\n    mockAltimate = {\n      handlePreviewFeatures: jest.fn().mockReturnValue(true),\n      enabled: jest.fn().mockReturnValue(true),\n      isAuthenticated: jest.fn().mockReturnValue(true),\n      validateCredentials: jest.fn(),\n      getAIKey: jest.fn().mockReturnValue(\"test-ai-key\"),\n      getInstanceName: jest.fn().mockReturnValue(\"test-instance\"),\n      getAltimateUrl: jest.fn().mockReturnValue(\"https://test.altimate.ai\"),\n      dispose: jest.fn(),\n    } as unknown as jest.Mocked<AltimateRequest>;\n\n    // Mock ValidationProvider\n    mockValidationProvider = {\n      validateCredentialsSilently: jest.fn(),\n    } as unknown as jest.Mocked<ValidationProvider>;\n\n    // Mock PythonEnvironment\n    mockPythonEnvironment = {\n      initialize: jest.fn(() => Promise.resolve()),\n      onPythonEnvironmentChanged: jest.fn().mockReturnValue({\n        dispose: jest.fn(),\n      }),\n    } as unknown as jest.Mocked<PythonEnvironment>;\n\n    // Mock SharedStateService\n    mockSharedStateService = {} as unknown as jest.Mocked<SharedStateService>;\n\n    // Mock AltimateAuthService\n    mockAltimateAuthService = {} as unknown as jest.Mocked<AltimateAuthService>;\n\n    // Mock RunHistoryService\n    mockRunHistoryService = {\n      addEntry: jest.fn(),\n    } as unknown as jest.Mocked<RunHistoryService>;\n\n    // Mock DBTCommandExecutionInfrastructure\n    mockExecutionInfrastructure = {\n      createPythonBridge: jest.fn().mockImplementation(() => ({\n        ex: jest.fn(),\n        lock: jest.fn(),\n        pid: 1234,\n        end: jest.fn(),\n        disconnect: jest.fn(),\n        kill: jest.fn(),\n        ex_json: jest.fn(),\n        exNB: jest.fn(),\n        exAsync: jest.fn(),\n        runJupyterKernel: jest.fn(),\n        stdin: null,\n        stdout: null,\n        stderr: null,\n        connected: true,\n      })),\n      closePythonBridge: jest.fn(),\n    } as unknown as jest.Mocked<DBTCommandExecutionInfrastructure>;\n\n    // Mock DBTCommandFactory\n    mockCommandFactory = {\n      createDocsGenerateCommand: jest.fn().mockReturnValue({\n        focus: false,\n        logToTerminal: false,\n        showProgress: false,\n      }),\n    } as unknown as jest.Mocked<DBTCommandFactory>;\n\n    // Mock DBTProjectIntegrationAdapter with EventEmitter functionality\n    const integrationEventEmitter = new EventEmitter();\n    mockProjectIntegration = {\n      on: jest.fn().mockImplementation((event: any, listener: any) => {\n        integrationEventEmitter.on(event, listener);\n      }),\n      emit: jest.fn().mockImplementation((event: any, ...args: any) => {\n        integrationEventEmitter.emit(event, ...args);\n      }),\n      getCurrentProjectIntegration: jest.fn(() => mockProjectIntegration),\n      cleanupConnections: jest.fn(),\n      getProjectName: jest.fn().mockReturnValue(\"test-project\"),\n      getSelectedTarget: jest.fn().mockReturnValue(\"dev\"),\n      getTargetNames: jest.fn().mockReturnValue([\"dev\", \"prod\"]),\n      getColumnsOfModel: jest.fn(() => Promise.resolve([])),\n      getColumnsOfSource: jest.fn(() => Promise.resolve([])),\n      getCatalog: jest.fn(() => Promise.resolve({})),\n      unsafeCompileNode: jest.fn(),\n      unsafeCompileQuery: jest.fn(),\n      runQuery: jest.fn(),\n      getColumnValues: jest.fn(),\n      unsafeGenerateDocsImmediately: jest.fn(),\n      setSelectedTarget: jest.fn(),\n      getTargetPath: jest.fn().mockReturnValue(\"/project/target\"),\n      getPackageInstallPath: jest.fn().mockReturnValue(\"/project/dbt_packages\"),\n      getModelPaths: jest.fn().mockReturnValue([\"/project/models\"]),\n      getSeedPaths: jest.fn().mockReturnValue([\"/project/seeds\"]),\n      getMacroPaths: jest.fn().mockReturnValue([\"/project/macros\"]),\n      getPythonBridgeStatus: jest.fn().mockReturnValue(\"ready\"),\n      getDiagnostics: jest.fn().mockReturnValue({\n        pythonBridgeDiagnostics: [],\n        rebuildManifestDiagnostics: [],\n        projectConfigDiagnostics: [],\n      }),\n      initialize: jest.fn(),\n      parseManifest: jest.fn(),\n      rebuildManifest: jest.fn(),\n      createDbtCommand: jest.fn(),\n      runDbtCommand: jest.fn(),\n      dispose: jest.fn(),\n    };\n\n    // Mock DBTProjectLog\n    mockDbtProjectLog = {\n      dispose: jest.fn(),\n    } as unknown as jest.Mocked<DBTProjectLog>;\n\n    // Create factory that returns the same mock instance\n    dbtProjectLogFactory = jest.fn().mockReturnValue(mockDbtProjectLog);\n\n    // Mock EventEmitter for manifest changes\n    mockManifestChangedEmitter = {\n      event: jest.fn().mockReturnValue({ dispose: jest.fn() }),\n      fire: jest.fn(),\n      dispose: jest.fn(),\n    } as unknown as jest.Mocked<vscode.EventEmitter<ManifestCacheChangedEvent>>;\n  });\n\n  afterEach(() => {\n    jest.clearAllMocks();\n    if (dbtProject) {\n      dbtProject.dispose();\n    }\n  });\n\n  describe(\"Constructor and Initialization\", () => {\n    it(\"should have access to constants from @altimateai/dbt-integration\", () => {\n      // Import the mocked module to verify constants are available\n      const {\n        DBT_PROJECT_FILE,\n        MANIFEST_FILE,\n        RESOURCE_TYPE_MODEL,\n        DBTProjectIntegrationAdapterEvents,\n      } = require(\"@altimateai/dbt-integration\");\n\n      // Verify constants are defined\n      expect(DBT_PROJECT_FILE).toBe(\"dbt_project.yml\");\n      expect(MANIFEST_FILE).toBe(\"manifest.json\");\n      expect(RESOURCE_TYPE_MODEL).toBe(\"model\");\n      expect(DBTProjectIntegrationAdapterEvents.SOURCE_FILE_CHANGED).toBe(\n        \"sourceFileChanged\",\n      );\n    });\n\n    it(\"should create DBTProject instance with correct configuration\", () => {\n      const projectUri = vscode.Uri.file(\"/test/project\");\n      const projectConfig = {};\n\n      dbtProject = new DBTProject(\n        mockPythonEnvironment,\n        dbtProjectLogFactory as any,\n        mockCommandFactory,\n        mockTerminal,\n        mockSharedStateService,\n        mockTelemetry,\n        mockExecutionInfrastructure,\n        jest.fn().mockReturnValue(mockProjectIntegration) as any,\n        mockAltimate,\n        mockValidationProvider,\n        mockAltimateAuthService,\n        mockRunHistoryService,\n        projectUri,\n        projectConfig,\n        mockManifestChangedEmitter,\n      );\n\n      expect(dbtProject.projectRoot).toBe(projectUri);\n      expect(\n        mockValidationProvider.validateCredentialsSilently,\n      ).toHaveBeenCalled();\n      expect(mockTerminal.debug).toHaveBeenCalledWith(\n        \"DbtProject\",\n        expect.stringContaining(\"Created core dbt project\"),\n      );\n    });\n\n    it(\"should handle validation errors gracefully\", () => {\n      mockValidationProvider.validateCredentialsSilently.mockImplementation(\n        () => {\n          throw new NoCredentialsError();\n        },\n      );\n\n      const projectUri = vscode.Uri.file(\"/test/project\");\n      const projectConfig = {};\n\n      dbtProject = new DBTProject(\n        mockPythonEnvironment,\n        dbtProjectLogFactory as any,\n        mockCommandFactory,\n        mockTerminal,\n        mockSharedStateService,\n        mockTelemetry,\n        mockExecutionInfrastructure,\n        jest.fn().mockReturnValue(mockProjectIntegration) as any,\n        mockAltimate,\n        mockValidationProvider,\n        mockAltimateAuthService,\n        mockRunHistoryService,\n        projectUri,\n        projectConfig,\n        mockManifestChangedEmitter,\n      );\n\n      expect(mockTerminal.error).toHaveBeenCalledWith(\n        \"validateCredentialsSilently\",\n        \"Credential validation failed\",\n        expect.any(NoCredentialsError),\n        false,\n      );\n    });\n\n    it(\"should initialize project integration on initialize()\", async () => {\n      const projectUri = vscode.Uri.file(\"/test/project\");\n\n      dbtProject = new DBTProject(\n        mockPythonEnvironment,\n        dbtProjectLogFactory as any,\n        mockCommandFactory,\n        mockTerminal,\n        mockSharedStateService,\n        mockTelemetry,\n        mockExecutionInfrastructure,\n        jest.fn().mockReturnValue(mockProjectIntegration) as any,\n        mockAltimate,\n        mockValidationProvider,\n        mockAltimateAuthService,\n        mockRunHistoryService,\n        projectUri,\n        {},\n        mockManifestChangedEmitter,\n      );\n\n      await dbtProject.initialize();\n\n      expect(mockProjectIntegration.initialize).toHaveBeenCalled();\n    });\n  });\n\n  describe(\"Project Configuration Methods\", () => {\n    beforeEach(() => {\n      const projectUri = vscode.Uri.file(\"/test/project\");\n      dbtProject = new DBTProject(\n        mockPythonEnvironment,\n        dbtProjectLogFactory as any,\n        mockCommandFactory,\n        mockTerminal,\n        mockSharedStateService,\n        mockTelemetry,\n        mockExecutionInfrastructure,\n        jest.fn().mockReturnValue(mockProjectIntegration) as any,\n        mockAltimate,\n        mockValidationProvider,\n        mockAltimateAuthService,\n        mockRunHistoryService,\n        projectUri,\n        {},\n        mockManifestChangedEmitter,\n      );\n    });\n\n    it(\"should get project name\", () => {\n      expect(dbtProject.getProjectName()).toBe(\"test-project\");\n      expect(mockProjectIntegration.getProjectName).toHaveBeenCalled();\n    });\n\n    it(\"should get project root\", () => {\n      expect(dbtProject.getProjectRoot()).toBe(\"/test/project\");\n    });\n\n    it(\"should get selected target\", () => {\n      expect(dbtProject.getSelectedTarget()).toBe(\"dev\");\n      expect(mockProjectIntegration.getSelectedTarget).toHaveBeenCalled();\n    });\n\n    it(\"should get target names\", () => {\n      expect(dbtProject.getTargetNames()).toEqual([\"dev\", \"prod\"]);\n      expect(mockProjectIntegration.getTargetNames).toHaveBeenCalled();\n    });\n\n    it(\"should set selected target with progress\", async () => {\n      await dbtProject.setSelectedTarget(\"prod\");\n\n      expect(vscode.window.withProgress).toHaveBeenCalledWith(\n        {\n          location: vscode.ProgressLocation.Notification,\n          title: \"Changing target...\",\n          cancellable: false,\n        },\n        expect.any(Function),\n      );\n      expect(mockProjectIntegration.setSelectedTarget).toHaveBeenCalledWith(\n        \"prod\",\n      );\n    });\n\n    it(\"should get DBT project file path\", () => {\n      const { DBT_PROJECT_FILE } = require(\"@altimateai/dbt-integration\");\n      expect(dbtProject.getDBTProjectFilePath()).toBe(\n        path.join(\"/test/project\", DBT_PROJECT_FILE),\n      );\n    });\n\n    it(\"should get manifest path\", () => {\n      expect(dbtProject.getManifestPath()).toBe(\n        path.join(\"/project/target\", \"manifest.json\"),\n      );\n    });\n\n    it(\"should get catalog path\", () => {\n      expect(dbtProject.getCatalogPath()).toBe(\n        path.join(\"/project/target\", \"catalog.json\"),\n      );\n    });\n\n    it(\"should return undefined for paths when target path is not available\", () => {\n      mockProjectIntegration.getTargetPath.mockReturnValue(undefined);\n      expect(dbtProject.getManifestPath()).toBeUndefined();\n      expect(dbtProject.getCatalogPath()).toBeUndefined();\n    });\n  });\n\n  describe(\"Event Handling\", () => {\n    beforeEach(() => {\n      const projectUri = vscode.Uri.file(\"/test/project\");\n      dbtProject = new DBTProject(\n        mockPythonEnvironment,\n        dbtProjectLogFactory as any,\n        mockCommandFactory,\n        mockTerminal,\n        mockSharedStateService,\n        mockTelemetry,\n        mockExecutionInfrastructure,\n        jest.fn().mockReturnValue(mockProjectIntegration) as any,\n        mockAltimate,\n        mockValidationProvider,\n        mockAltimateAuthService,\n        mockRunHistoryService,\n        projectUri,\n        {},\n        mockManifestChangedEmitter,\n      );\n    });\n\n    it(\"should handle source file changed events\", () => {\n      const sourceFileChangedHandler = jest.fn();\n      dbtProject.onSourceFileChanged(sourceFileChangedHandler);\n\n      // Trigger the event from the integration\n      const onCall = mockProjectIntegration.on.mock.calls.find(\n        (call: any) =>\n          call[0] === DBTProjectIntegrationAdapterEvents.SOURCE_FILE_CHANGED,\n      );\n      onCall![1](); // Call the handler\n\n      expect(mockTerminal.debug).toHaveBeenCalledWith(\n        \"DBTProject\",\n        \"Received sourceFileChanged event from Node.js file watchers\",\n      );\n    });\n\n    it(\"should handle manifest parsed events\", () => {\n      const parsedManifest: ParsedManifest = {\n        nodeMetaMap: {\n          lookupByBaseName: (() => undefined) as any,\n          lookupByUniqueId: (() => undefined) as any,\n          nodes: (() => []) as any,\n        },\n        macroMetaMap: new Map(),\n        metricMetaMap: new Map(),\n        sourceMetaMap: new Map(),\n        graphMetaMap: {\n          parents: new Map(),\n          children: new Map(),\n          tests: new Map(),\n          metrics: new Map(),\n        },\n        testMetaMap: new Map(),\n        docMetaMap: new Map(),\n        exposureMetaMap: new Map(),\n        modelDepthMap: new Map(),\n        functionMetaMap: new Map(),\n      };\n\n      // Trigger the event from the integration\n      const onCall = mockProjectIntegration.on.mock.calls.find(\n        (call: any) =>\n          call[0] === DBTProjectIntegrationAdapterEvents.MANIFEST_PARSED,\n      );\n      onCall![1](parsedManifest);\n\n      expect(mockManifestChangedEmitter.fire).toHaveBeenCalledWith({\n        added: [\n          expect.objectContaining({\n            project: dbtProject,\n            ...parsedManifest,\n          }),\n        ],\n      });\n    });\n\n    it(\"should handle run results parsed events\", () => {\n      const runResultsData: RunResultsEventData = {\n        id: \"run-1\",\n        command: \"dbt run\",\n        args: [],\n        completedAt: new Date(),\n        projectName: \"test-project\",\n        elapsedTime: 0,\n        results: [\n          { uniqueId: \"model.test.model1\" } as any,\n          { uniqueId: \"model.test.model2\" } as any,\n        ],\n      };\n\n      const runResultsHandler = jest.fn();\n      dbtProject.onRunResults(runResultsHandler);\n\n      // Trigger the event from the integration\n      const onCall = mockProjectIntegration.on.mock.calls.find(\n        (call: any) =>\n          call[0] === DBTProjectIntegrationAdapterEvents.RUN_RESULTS_PARSED,\n      );\n      onCall![1](runResultsData);\n\n      expect(mockTerminal.debug).toHaveBeenCalledWith(\n        \"DBTProject\",\n        \"Received runResultsParsed event from dbtIntegrationAdapter\",\n      );\n    });\n  });\n\n  describe(\"Diagnostics\", () => {\n    beforeEach(() => {\n      const projectUri = vscode.Uri.file(\"/test/project\");\n      dbtProject = new DBTProject(\n        mockPythonEnvironment,\n        dbtProjectLogFactory as any,\n        mockCommandFactory,\n        mockTerminal,\n        mockSharedStateService,\n        mockTelemetry,\n        mockExecutionInfrastructure,\n        jest.fn().mockReturnValue(mockProjectIntegration) as any,\n        mockAltimate,\n        mockValidationProvider,\n        mockAltimateAuthService,\n        mockRunHistoryService,\n        projectUri,\n        {},\n        mockManifestChangedEmitter,\n      );\n    });\n\n    it(\"should get all diagnostics\", () => {\n      const mockDiagnosticData: DBTDiagnosticData = {\n        message: \"Test diagnostic\",\n        severity: \"error\",\n        filePath: \"/test/file.sql\",\n        source: \"dbt\",\n        category: \"error\",\n        range: {\n          startLine: 1,\n          startColumn: 0,\n          endLine: 1,\n          endColumn: 10,\n        },\n      };\n\n      (mockProjectIntegration.getDiagnostics as jest.Mock).mockReturnValue({\n        pythonBridgeDiagnostics: [mockDiagnosticData],\n        rebuildManifestDiagnostics: [],\n        projectConfigDiagnostics: [],\n      });\n\n      const diagnostics = dbtProject.getAllDiagnostic();\n\n      expect(diagnostics).toHaveLength(1);\n      // Check the diagnostic properties instead of checking if constructor was called\n      expect(diagnostics[0]).toMatchObject({\n        message: mockDiagnosticData.message,\n        severity: vscode.DiagnosticSeverity.Error,\n      });\n    });\n\n    it(\"should update diagnostics in problems panel\", () => {\n      const mockDiagnosticData: DBTDiagnosticData = {\n        message: \"Test diagnostic\",\n        severity: \"warning\",\n        filePath: \"/test/file.sql\",\n        source: \"dbt\",\n        category: \"warning\",\n      };\n\n      (mockProjectIntegration.getDiagnostics as jest.Mock).mockReturnValue({\n        pythonBridgeDiagnostics: [mockDiagnosticData],\n        rebuildManifestDiagnostics: [mockDiagnosticData],\n        projectConfigDiagnostics: [mockDiagnosticData],\n      });\n\n      dbtProject.updateDiagnosticsInProblemsPanel();\n\n      expect(dbtProject.pythonBridgeDiagnostics.set).toHaveBeenCalled();\n      expect(dbtProject.rebuildManifestDiagnostics.set).toHaveBeenCalled();\n      expect(dbtProject.projectConfigDiagnostics.set).toHaveBeenCalled();\n    });\n  });\n\n  describe(\"Model Operations\", () => {\n    beforeEach(() => {\n      const projectUri = vscode.Uri.file(\"/test/project\");\n      dbtProject = new DBTProject(\n        mockPythonEnvironment,\n        dbtProjectLogFactory as any,\n        mockCommandFactory,\n        mockTerminal,\n        mockSharedStateService,\n        mockTelemetry,\n        mockExecutionInfrastructure,\n        jest.fn().mockReturnValue(mockProjectIntegration) as any,\n        mockAltimate,\n        mockValidationProvider,\n        mockAltimateAuthService,\n        mockRunHistoryService,\n        projectUri,\n        {},\n        mockManifestChangedEmitter,\n      );\n    });\n\n    it(\"should compile node\", async () => {\n      mockProjectIntegration.unsafeCompileNode.mockResolvedValue(\n        \"-- compiled SQL\",\n      );\n\n      const result = await dbtProject.compileNode(\"model.test.my_model\");\n\n      expect(result).toBe(\"-- compiled SQL\");\n      expect(mockProjectIntegration.unsafeCompileNode).toHaveBeenCalledWith(\n        \"model.test.my_model\",\n      );\n    });\n\n    it(\"should handle compile node errors\", async () => {\n      mockProjectIntegration.unsafeCompileNode.mockRejectedValue(\n        new Error(\"Compile failed\"),\n      );\n\n      const result = await dbtProject.compileNode(\"model.test.my_model\");\n\n      // When an error occurs, it returns a string with error details\n      expect(result).toContain(\"Detailed error information:\");\n      // Check that error message was shown to user\n      expect(vscode.window.showErrorMessage).toHaveBeenCalled();\n    });\n\n    it(\"should validate SQL\", async () => {\n      const request = {\n        sql: \"SELECT * FROM table\",\n        dialect: \"postgres\",\n        models: [],\n      };\n\n      // The real validateSQL requires a working python bridge; here we just\n      // verify the wiring: the python bridge is created and closed around the\n      // call, even when validation itself surfaces an error.\n      await expect(dbtProject.validateSql(request)).rejects.toBeDefined();\n\n      expect(mockExecutionInfrastructure.createPythonBridge).toHaveBeenCalled();\n      expect(mockExecutionInfrastructure.closePythonBridge).toHaveBeenCalled();\n    });\n  });\n\n  describe(\"Query Execution\", () => {\n    beforeEach(() => {\n      const projectUri = vscode.Uri.file(\"/test/project\");\n      dbtProject = new DBTProject(\n        mockPythonEnvironment,\n        dbtProjectLogFactory as any,\n        mockCommandFactory,\n        mockTerminal,\n        mockSharedStateService,\n        mockTelemetry,\n        mockExecutionInfrastructure,\n        jest.fn().mockReturnValue(mockProjectIntegration) as any,\n        mockAltimate,\n        mockValidationProvider,\n        mockAltimateAuthService,\n        mockRunHistoryService,\n        projectUri,\n        {},\n        mockManifestChangedEmitter,\n      );\n    });\n\n    it(\"should compile query\", async () => {\n      const mockCompiledSQL = \"SELECT col1 FROM table\";\n\n      mockProjectIntegration.unsafeCompileQuery.mockResolvedValue(\n        mockCompiledSQL,\n      );\n\n      const result = await dbtProject.compileQuery(\n        \"SELECT col1 FROM {{ ref('table') }}\",\n        \"test_model\",\n      );\n\n      expect(result).toEqual(mockCompiledSQL);\n      expect(mockProjectIntegration.unsafeCompileQuery).toHaveBeenCalledWith(\n        \"SELECT col1 FROM {{ ref('table') }}\",\n        \"test_model\",\n      );\n    });\n\n    it(\"should get column values\", async () => {\n      const mockColumnValues = [\"value1\", \"value2\"];\n\n      mockProjectIntegration.getColumnValues.mockReturnValue(mockColumnValues);\n\n      const result = await dbtProject.getColumnValues(\"model\", \"col\");\n\n      expect(result).toEqual(mockColumnValues);\n      expect(mockProjectIntegration.getColumnValues).toHaveBeenCalledWith(\n        \"model\",\n        \"col\",\n      );\n      expect(mockProjectIntegration.cleanupConnections).toHaveBeenCalled();\n    });\n  });\n\n  describe(\"Healthcheck\", () => {\n    beforeEach(() => {\n      const projectUri = vscode.Uri.file(\"/test/project\");\n      dbtProject = new DBTProject(\n        mockPythonEnvironment,\n        dbtProjectLogFactory as any,\n        mockCommandFactory,\n        mockTerminal,\n        mockSharedStateService,\n        mockTelemetry,\n        mockExecutionInfrastructure,\n        jest.fn().mockReturnValue(mockProjectIntegration) as any,\n        mockAltimate,\n        mockValidationProvider,\n        mockAltimateAuthService,\n        mockRunHistoryService,\n        projectUri,\n        {},\n        mockManifestChangedEmitter,\n      );\n    });\n\n    it(\"should perform datapilot healthcheck\", async () => {\n      const mockHealthcheckResult = {\n        model_insights: {\n          test_model: [\n            {\n              original_file_path: \"models/test.sql\",\n              path: \"models/test.sql\",\n            },\n          ],\n        },\n      };\n\n      // Create a fresh mock for this test\n      const pythonBridge = {\n        ex: jest.fn(),\n        lock: jest\n          .fn()\n          .mockImplementation(() => Promise.resolve(mockHealthcheckResult)),\n        pid: 1234,\n        end: jest.fn(),\n        disconnect: jest.fn(),\n        kill: jest.fn(),\n        ex_json: jest.fn(),\n        exNB: jest.fn(),\n        exAsync: jest.fn(),\n        runJupyterKernel: jest.fn(),\n        stdin: null,\n        stdout: null,\n        stderr: null,\n        connected: true,\n      };\n\n      mockExecutionInfrastructure.createPythonBridge.mockReturnValueOnce(\n        pythonBridge as any,\n      );\n\n      const result = await dbtProject.performDatapilotHealthcheck({\n        projectRoot: \"/test/project\",\n        configType: \"Manual\",\n        configPath: \"/config/path\",\n      } as any);\n\n      expect(result).toHaveProperty(\"model_insights\");\n      expect(result.model_insights).toEqual(\n        mockHealthcheckResult.model_insights,\n      );\n      expect(\n        mockExecutionInfrastructure.closePythonBridge,\n      ).toHaveBeenCalledWith(pythonBridge);\n    });\n\n    it(\"should handle healthcheck with catalog generation\", async () => {\n      const mockHealthcheckResult = {\n        model_insights: {},\n      };\n\n      // Create a fresh mock for this test\n      const pythonBridge = {\n        ex: jest.fn(),\n        lock: jest\n          .fn()\n          .mockImplementation(() => Promise.resolve(mockHealthcheckResult)),\n        pid: 1234,\n        end: jest.fn(),\n        disconnect: jest.fn(),\n        kill: jest.fn(),\n        ex_json: jest.fn(),\n        exNB: jest.fn(),\n        exAsync: jest.fn(),\n        runJupyterKernel: jest.fn(),\n        stdin: null,\n        stdout: null,\n        stderr: null,\n        connected: true,\n      };\n\n      mockExecutionInfrastructure.createPythonBridge.mockReturnValueOnce(\n        pythonBridge as any,\n      );\n\n      mockProjectIntegration.unsafeGenerateDocsImmediately.mockResolvedValue(\n        {},\n      );\n\n      await dbtProject.performDatapilotHealthcheck({\n        projectRoot: \"/test/project\",\n        configType: \"All\",\n        config_schema: [\n          {\n            files_required: [\"Catalog\"],\n          },\n        ],\n      } as any);\n\n      expect(mockCommandFactory.createDocsGenerateCommand).toHaveBeenCalled();\n      expect(\n        mockProjectIntegration.unsafeGenerateDocsImmediately,\n      ).toHaveBeenCalled();\n    });\n  });\n\n  describe(\"Catalog Operations\", () => {\n    beforeEach(() => {\n      const projectUri = vscode.Uri.file(\"/test/project\");\n      dbtProject = new DBTProject(\n        mockPythonEnvironment,\n        dbtProjectLogFactory as any,\n        mockCommandFactory,\n        mockTerminal,\n        mockSharedStateService,\n        mockTelemetry,\n        mockExecutionInfrastructure,\n        jest.fn().mockReturnValue(mockProjectIntegration) as any,\n        mockAltimate,\n        mockValidationProvider,\n        mockAltimateAuthService,\n        mockRunHistoryService,\n        projectUri,\n        {},\n        mockManifestChangedEmitter,\n      );\n    });\n\n    it(\"should get catalog\", async () => {\n      const mockCatalog: Catalog = {\n        nodes: {\n          \"model.test.my_model\": {\n            unique_id: \"model.test.my_model\",\n            columns: {\n              col1: { name: \"col1\", type: \"varchar\" },\n            },\n          },\n        },\n      } as any;\n\n      // Mock getCatalog method to return the catalog\n      mockProjectIntegration.getCatalog.mockImplementation(() =>\n        Promise.resolve(mockCatalog),\n      );\n\n      const result = await dbtProject.getCatalog();\n\n      expect(result).toEqual(mockCatalog);\n      expect(mockProjectIntegration.getCatalog).toHaveBeenCalled();\n      expect(mockProjectIntegration.cleanupConnections).toHaveBeenCalled();\n    });\n\n    it(\"should get columns of model\", async () => {\n      const mockColumns = [\n        { name: \"col1\", type: \"varchar\" },\n        { name: \"col2\", type: \"integer\" },\n      ];\n\n      // Mock getColumnsOfModel method returns the columns directly\n      mockProjectIntegration.getColumnsOfModel.mockImplementation(() =>\n        Promise.resolve(mockColumns),\n      );\n\n      const result = await dbtProject.getColumnsOfModel(\"model.test.my_model\");\n\n      expect(result).toEqual(mockColumns);\n      expect(mockProjectIntegration.getColumnsOfModel).toHaveBeenCalledWith(\n        \"model.test.my_model\",\n      );\n      expect(mockProjectIntegration.cleanupConnections).toHaveBeenCalled();\n    });\n\n    it(\"should get columns of source\", async () => {\n      const mockColumns = [{ name: \"col1\", type: \"varchar\" }];\n\n      // Mock getColumnsOfSource method\n      mockProjectIntegration.getColumnsOfSource.mockImplementation(() =>\n        Promise.resolve(mockColumns),\n      );\n\n      const result = await dbtProject.getColumnsOfSource(\n        \"my_source\",\n        \"my_table\",\n      );\n\n      expect(result).toEqual(mockColumns);\n      expect(mockProjectIntegration.getColumnsOfSource).toHaveBeenCalledWith(\n        \"my_source\",\n        \"my_table\",\n      );\n      expect(mockProjectIntegration.cleanupConnections).toHaveBeenCalled();\n    });\n  });\n\n  describe(\"Disposal\", () => {\n    it(\"should dispose all resources properly\", async () => {\n      const projectUri = vscode.Uri.file(\"/test/project\");\n      dbtProject = new DBTProject(\n        mockPythonEnvironment,\n        dbtProjectLogFactory as any,\n        mockCommandFactory,\n        mockTerminal,\n        mockSharedStateService,\n        mockTelemetry,\n        mockExecutionInfrastructure,\n        jest.fn().mockReturnValue(mockProjectIntegration) as any,\n        mockAltimate,\n        mockValidationProvider,\n        mockAltimateAuthService,\n        mockRunHistoryService,\n        projectUri,\n        {},\n        mockManifestChangedEmitter,\n      );\n\n      // Initialize to ensure dbtProjectLog is added to disposables\n      await dbtProject.initialize();\n\n      const projectHealthDispose = jest.spyOn(\n        dbtProject.projectHealth,\n        \"dispose\",\n      );\n      const pythonBridgeDiagnosticsDispose = jest.spyOn(\n        dbtProject.pythonBridgeDiagnostics,\n        \"dispose\",\n      );\n      const rebuildManifestDiagnosticsDispose = jest.spyOn(\n        dbtProject.rebuildManifestDiagnostics,\n        \"dispose\",\n      );\n      const projectConfigDiagnosticsDispose = jest.spyOn(\n        dbtProject.projectConfigDiagnostics,\n        \"dispose\",\n      );\n\n      await dbtProject.dispose();\n\n      expect(projectHealthDispose).toHaveBeenCalled();\n      expect(pythonBridgeDiagnosticsDispose).toHaveBeenCalled();\n      expect(rebuildManifestDiagnosticsDispose).toHaveBeenCalled();\n      expect(projectConfigDiagnosticsDispose).toHaveBeenCalled();\n      expect(mockProjectIntegration.dispose).toHaveBeenCalled();\n      // dbtProjectLog is created in constructor and added to disposables in initialize\n      expect(mockDbtProjectLog.dispose).toHaveBeenCalled();\n    });\n  });\n\n  describe(\"dbt Loom Integration\", () => {\n    it(\"should check if dbt loom is installed\", async () => {\n      const pythonBridge = mockExecutionInfrastructure.createPythonBridge();\n      (pythonBridge.ex as any).mockResolvedValue(undefined);\n\n      const projectUri = vscode.Uri.file(\"/test/project\");\n      dbtProject = new DBTProject(\n        mockPythonEnvironment,\n        dbtProjectLogFactory as any,\n        mockCommandFactory,\n        mockTerminal,\n        mockSharedStateService,\n        mockTelemetry,\n        mockExecutionInfrastructure,\n        jest.fn().mockReturnValue(mockProjectIntegration) as any,\n        mockAltimate,\n        mockValidationProvider,\n        mockAltimateAuthService,\n        mockRunHistoryService,\n        projectUri,\n        {},\n        mockManifestChangedEmitter,\n      );\n\n      // Wait for the async dbt loom check to complete\n      await new Promise((resolve) => setTimeout(resolve, 100));\n\n      expect(mockTelemetry.setTelemetryCustomAttribute).toHaveBeenCalledWith(\n        \"dbtLoomInstalled\",\n        \"true\",\n      );\n    });\n  });\n});\n"
  },
  {
    "path": "src/test/suite/dbtProjectContainer.test.ts",
    "content": "import {\n  DataPilotHealtCheckParams,\n  RunModelType,\n} from \"@altimateai/dbt-integration\";\nimport {\n  afterEach,\n  beforeEach,\n  describe,\n  expect,\n  it,\n  jest,\n} from \"@jest/globals\";\nimport { EventEmitter } from \"events\";\nimport * as fs from \"fs\";\nimport { commands, ExtensionContext, Uri, window, workspace } from \"vscode\";\nimport { DBTProjectContainer } from \"../../dbt_client/dbtProjectContainer\";\nimport { createEntry } from \"../fixtures/runHistory\";\n\n// Mock vscode module\njest.mock(\"vscode\", () => {\n  const mock = jest.requireActual(\"../mock/vscode\");\n  return mock;\n});\n\n// Make fs.realpathSync.native a pass-through so model params can be derived\n// from synthetic paths without the files existing on disk.\njest\n  .spyOn(fs.realpathSync, \"native\")\n  .mockImplementation((p: fs.PathLike) => p as string);\n\ndescribe(\"DBTProjectContainer Tests\", () => {\n  let container: DBTProjectContainer;\n  let mockDbtClient: any;\n  let mockDbtTerminal: any;\n  let mockAltimateDatapilot: any;\n  let mockAltimateRequest: any;\n  let mockDbtWorkspaceFolder: any;\n  let mockDbtProject: any;\n  let mockDbtWorkspaceFolderFactory: any;\n\n  beforeEach(() => {\n    // Reset all mocks\n    jest.clearAllMocks();\n\n    // Mock DBT project\n    mockDbtProject = {\n      projectRoot: Uri.file(\"/path/to/project\"),\n      findPackageName: jest.fn(() => \"test_package\"),\n      initialize: jest.fn(),\n      executeSQLOnQueryPanel: jest.fn(),\n      runModel: jest.fn(),\n      buildModel: jest.fn(),\n      buildProject: jest.fn(),\n      runTest: jest.fn(),\n      runModelTest: jest.fn(),\n      compileModel: jest.fn(),\n      generateDocs: jest.fn(),\n      compileQuery: jest.fn(() => Promise.resolve(\"compiled query\")),\n      showRunSQL: jest.fn(),\n      showCompiledSql: jest.fn(),\n      generateSchemaYML: jest.fn(),\n      performDatapilotHealthcheck: jest.fn(),\n      dispose: jest.fn(),\n    };\n\n    // Mock DBT workspace folder\n    mockDbtWorkspaceFolder = {\n      dispose: jest.fn(),\n      contains: jest.fn(() => true),\n      findDBTProject: jest.fn(() => mockDbtProject),\n      getProjects: jest.fn(() => [mockDbtProject]),\n      getAdapters: jest.fn(() => [\"postgres\"]),\n      discoverProjects: jest.fn(() => Promise.resolve()),\n      onRebuildManifestStatusChange: (handler: any) => {\n        // Mock event registration\n        return { dispose: jest.fn() };\n      },\n    };\n\n    // Mock DBT client\n    mockDbtClient = {\n      onDBTInstallationVerification: new EventEmitter().on,\n      dispose: jest.fn(),\n      showErrorIfDbtOrPythonNotInstalled: jest.fn(),\n      showErrorIfDbtIsNotInstalled: jest.fn(),\n      detectDBT: jest.fn(() => Promise.resolve()),\n      getPythonEnvironment: jest.fn(() => ({\n        pythonPath: \"/path/to/python\",\n      })),\n    };\n\n    // Mock DBT terminal\n    mockDbtTerminal = {\n      show: jest.fn(),\n      log: jest.fn(),\n      trace: jest.fn(),\n      debug: jest.fn(),\n      info: jest.fn(),\n      error: jest.fn(),\n      dispose: jest.fn(),\n      logNewLine: jest.fn(),\n      logLine: jest.fn(),\n      logHorizontalRule: jest.fn(),\n      logBlock: jest.fn(),\n      warn: jest.fn(),\n    };\n\n    // Mock Altimate datapilot\n    mockAltimateDatapilot = {\n      checkIfAltimateDatapilotInstalled: jest.fn(() =>\n        Promise.resolve(\"1.0.0\"),\n      ),\n      installAltimateDatapilot: jest.fn(() => Promise.resolve()),\n    };\n\n    // Mock Altimate request\n    mockAltimateRequest = {\n      dispose: jest.fn(),\n      enabled: jest.fn(),\n      isAuthenticated: jest.fn(),\n      validateCredentials: jest.fn(),\n      getDatapilotVersion: jest.fn(() =>\n        Promise.resolve({ altimate_datapilot_version: \"1.0.0\" }),\n      ),\n    };\n\n    // Mock workspace folder factory\n    mockDbtWorkspaceFolderFactory = jest.fn(() => mockDbtWorkspaceFolder);\n\n    // Create container\n    container = new DBTProjectContainer(\n      mockDbtClient,\n      mockDbtWorkspaceFolderFactory,\n      mockDbtTerminal,\n      mockAltimateDatapilot,\n      mockAltimateRequest,\n    );\n\n    // Set up workspace folders for testing\n    container.dbtWorkspaceFolders = [mockDbtWorkspaceFolder];\n  });\n\n  afterEach(() => {\n    jest.clearAllMocks();\n  });\n\n  describe(\"Initialization and Lifecycle\", () => {\n    it(\"should initialize with correct dependencies\", () => {\n      expect(container).toBeDefined();\n      expect(container.onDBTInstallationVerification).toBe(\n        mockDbtClient.onDBTInstallationVerification,\n      );\n    });\n\n    it(\"should dispose all dependencies\", () => {\n      container.dispose();\n\n      expect(mockDbtWorkspaceFolder.dispose).toHaveBeenCalled();\n      expect(mockDbtClient.dispose).toHaveBeenCalled();\n      expect(mockDbtTerminal.dispose).toHaveBeenCalled();\n    });\n\n    it(\"should set context properly\", () => {\n      const mockContext = {\n        extensionUri: Uri.file(\"/path/to/extension\"),\n        extension: { id: \"test-extension\", packageJSON: { version: \"1.0.0\" } },\n      } as ExtensionContext;\n\n      container.setContext(mockContext);\n      expect(container.extensionUri).toEqual(mockContext.extensionUri);\n      expect(container.extensionVersion).toBe(\"1.0.0\");\n      expect(container.extensionId).toBe(\"test-extension\");\n    });\n\n    it(\"should detect DBT installation\", async () => {\n      await container.detectDBT();\n      expect(mockDbtClient.detectDBT).toHaveBeenCalled();\n    });\n\n    it(\"should initialize all projects\", async () => {\n      await container.initialize();\n      expect(mockDbtProject.initialize).toHaveBeenCalled();\n    });\n  });\n\n  describe(\"Error Handling\", () => {\n    it(\"should show error if dbt or Python not installed\", () => {\n      container.showErrorIfDbtOrPythonNotInstalled();\n      expect(\n        mockDbtClient.showErrorIfDbtOrPythonNotInstalled,\n      ).toHaveBeenCalled();\n    });\n\n    it(\"should show error if dbt is not installed\", () => {\n      container.showErrorIfDbtIsNotInstalled();\n      expect(mockDbtClient.showErrorIfDbtIsNotInstalled).toHaveBeenCalled();\n    });\n  });\n\n  describe(\"Project Management\", () => {\n    it(\"should find DBT project for given URI\", () => {\n      const uri = Uri.file(\"/path/to/project/models/test.sql\");\n      const result = container.findDBTProject(uri);\n\n      expect(mockDbtWorkspaceFolder.findDBTProject).toHaveBeenCalledWith(uri);\n      expect(result).toBe(mockDbtProject);\n    });\n\n    it(\"should return undefined when no DBT project found\", () => {\n      container.dbtWorkspaceFolders = [];\n      const uri = Uri.file(\"/path/to/non-dbt/file.txt\");\n      const result = container.findDBTProject(uri);\n\n      expect(result).toBeUndefined();\n    });\n\n    it(\"should get all projects\", () => {\n      const projects = container.getProjects();\n      expect(projects).toEqual([mockDbtProject]);\n    });\n\n    it(\"should get unique adapters\", () => {\n      const adapters = container.getAdapters();\n      expect(adapters).toEqual([\"postgres\"]);\n    });\n\n    it(\"should get Python environment\", () => {\n      const pythonEnv = container.getPythonEnvironment();\n      expect(pythonEnv?.pythonPath).toBe(\"/path/to/python\");\n    });\n\n    it(\"should get package name from URI\", () => {\n      const uri = Uri.file(\"/path/to/project/models/test.sql\");\n      const packageName = container.getPackageName(uri);\n\n      expect(packageName).toBe(\"test_package\");\n    });\n\n    it(\"should get project root path from URI\", () => {\n      const uri = Uri.file(\"/path/to/project/models/test.sql\");\n      const rootPath = container.getProjectRootpath(uri);\n\n      expect(rootPath).toEqual(mockDbtProject.projectRoot);\n    });\n  });\n\n  describe(\"SQL Operations\", () => {\n    it(\"should execute SQL query\", () => {\n      const uri = Uri.file(\"/path/to/project/models/test.sql\");\n      const query = \"SELECT * FROM table\";\n      const modelName = \"test_model\";\n\n      container.executeSQL(uri, query, modelName);\n\n      expect(mockDbtProject.executeSQLOnQueryPanel).toHaveBeenCalledWith(\n        query,\n        modelName,\n      );\n    });\n\n    it(\"should compile query\", async () => {\n      const uri = Uri.file(\"/path/to/project/models/test.sql\");\n      const query = \"SELECT * FROM {{ ref('model') }}\";\n\n      const result = await container.compileQuery(uri, query);\n\n      expect(mockDbtProject.compileQuery).toHaveBeenCalledWith(query);\n      expect(result).toBe(\"compiled query\");\n    });\n\n    it(\"should show run SQL\", () => {\n      const uri = Uri.file(\"/path/to/project/models/test.sql\");\n\n      container.showRunSQL(uri);\n\n      expect(mockDbtProject.showRunSQL).toHaveBeenCalledWith(uri);\n    });\n\n    it(\"should show compiled SQL\", () => {\n      const uri = Uri.file(\"/path/to/project/models/test.sql\");\n\n      container.showCompiledSQL(uri);\n\n      expect(mockDbtProject.showCompiledSql).toHaveBeenCalledWith(uri);\n    });\n  });\n\n  describe(\"Model Operations\", () => {\n    it(\"should run model\", () => {\n      const modelPath = Uri.file(\"/path/to/project/models/test.sql\");\n      container.runModel(modelPath);\n\n      expect(mockDbtProject.runModel).toHaveBeenCalledWith({\n        plusOperatorLeft: \"\",\n        modelName: \"test\",\n        plusOperatorRight: \"\",\n      });\n    });\n\n    it(\"should run model with parents\", () => {\n      const modelPath = Uri.file(\"/path/to/project/models/test.sql\");\n      container.runModel(modelPath, RunModelType.RUN_PARENTS);\n\n      expect(mockDbtProject.runModel).toHaveBeenCalledWith({\n        plusOperatorLeft: \"+\",\n        modelName: \"test\",\n        plusOperatorRight: \"\",\n      });\n    });\n\n    it(\"should run model with children\", () => {\n      const modelPath = Uri.file(\"/path/to/project/models/test.sql\");\n      container.runModel(modelPath, RunModelType.RUN_CHILDREN);\n\n      expect(mockDbtProject.runModel).toHaveBeenCalledWith({\n        plusOperatorLeft: \"\",\n        modelName: \"test\",\n        plusOperatorRight: \"+\",\n      });\n    });\n\n    it(\"should build model\", () => {\n      const modelPath = Uri.file(\"/path/to/project/models/test.sql\");\n      container.buildModel(modelPath);\n\n      expect(mockDbtProject.buildModel).toHaveBeenCalledWith({\n        plusOperatorLeft: \"\",\n        modelName: \"test\",\n        plusOperatorRight: \"\",\n      });\n    });\n\n    it(\"should build project\", () => {\n      const modelPath = Uri.file(\"/path/to/project\");\n      container.buildProject(modelPath);\n\n      expect(mockDbtProject.buildProject).toHaveBeenCalled();\n    });\n\n    it(\"should compile model\", () => {\n      const modelPath = Uri.file(\"/path/to/project/models/test.sql\");\n      container.compileModel(modelPath);\n\n      expect(mockDbtProject.compileModel).toHaveBeenCalledWith({\n        plusOperatorLeft: \"\",\n        modelName: \"test\",\n        plusOperatorRight: \"\",\n      });\n    });\n\n    it(\"should generate docs\", () => {\n      const modelPath = Uri.file(\"/path/to/project/models/test.sql\");\n      container.generateDocs(modelPath);\n\n      expect(mockDbtProject.generateDocs).toHaveBeenCalled();\n    });\n\n    it(\"should generate schema YML\", () => {\n      const modelPath = Uri.file(\"/path/to/project/models/test.sql\");\n      const modelName = \"test_model\";\n\n      container.generateSchemaYML(modelPath, modelName);\n\n      expect(mockDbtProject.generateSchemaYML).toHaveBeenCalledWith(\n        modelPath,\n        modelName,\n      );\n    });\n  });\n\n  describe(\"Test Operations\", () => {\n    it(\"should run test\", () => {\n      const modelPath = Uri.file(\"/path/to/project/tests/test_model.sql\");\n      const testName = \"test_model\";\n\n      container.runTest(modelPath, testName);\n\n      expect(mockDbtProject.runTest).toHaveBeenCalledWith(testName);\n    });\n\n    it(\"should run model test\", () => {\n      const modelPath = Uri.file(\"/path/to/project/models/test.sql\");\n      const modelName = \"test_model\";\n\n      container.runModelTest(modelPath, modelName);\n\n      expect(mockDbtProject.runModelTest).toHaveBeenCalledWith(modelName);\n    });\n  });\n\n  describe(\"State Management\", () => {\n    it(\"should set and get workspace state\", () => {\n      const mockContext = {\n        workspaceState: {\n          get: jest.fn(),\n          update: jest.fn(),\n        },\n        globalState: {\n          get: jest.fn(),\n          update: jest.fn(),\n        },\n      } as unknown as ExtensionContext;\n\n      container.setContext(mockContext);\n\n      const key = \"testKey\";\n      const value = { test: \"value\" };\n\n      container.setToWorkspaceState(key, value);\n      expect(mockContext.workspaceState.update).toHaveBeenCalledWith(\n        key,\n        value,\n      );\n\n      mockContext.workspaceState.get = jest.fn(() => value);\n      const result = container.getFromWorkspaceState(key);\n      expect(result).toEqual(value);\n    });\n\n    it(\"should set and get global state\", () => {\n      const mockContext = {\n        workspaceState: {\n          get: jest.fn(),\n          update: jest.fn(),\n        },\n        globalState: {\n          get: jest.fn(),\n          update: jest.fn(),\n        },\n      } as unknown as ExtensionContext;\n\n      container.setContext(mockContext);\n\n      const key = \"globalKey\";\n      const value = \"globalValue\";\n\n      container.setToGlobalState(key, value);\n      expect(mockContext.globalState.update).toHaveBeenCalledWith(key, value);\n\n      mockContext.globalState.get = jest.fn(() => value);\n      const result = container.getFromGlobalState(key);\n      expect(result).toBe(value);\n    });\n  });\n\n  describe(\"Altimate Datapilot Integration\", () => {\n    beforeEach(() => {\n      const mockContext = {\n        extension: { id: \"test-extension\", packageJSON: { version: \"1.0.0\" } },\n      } as ExtensionContext;\n      container.setContext(mockContext);\n    });\n\n    it(\"should check if Altimate Datapilot is installed\", async () => {\n      const result = await container.checkIfAltimateDatapilotInstalled();\n\n      expect(\n        mockAltimateDatapilot.checkIfAltimateDatapilotInstalled,\n      ).toHaveBeenCalled();\n      expect(mockAltimateRequest.getDatapilotVersion).toHaveBeenCalledWith(\n        \"1.0.0\",\n      );\n      expect(result).toBe(true);\n    });\n\n    it(\"should install Altimate Datapilot\", async () => {\n      await container.installAltimateDatapilot();\n\n      expect(mockAltimateRequest.getDatapilotVersion).toHaveBeenCalledWith(\n        \"1.0.0\",\n      );\n      expect(\n        mockAltimateDatapilot.installAltimateDatapilot,\n      ).toHaveBeenCalledWith(\"1.0.0\");\n    });\n\n    it(\"should execute Altimate Datapilot healthcheck\", async () => {\n      const args = {\n        projectRoot: \"/path/to/project\",\n        configType: \"All\" as const,\n      } as DataPilotHealtCheckParams;\n\n      await container.executeAltimateDatapilotHealthcheck(args);\n\n      expect(mockDbtProject.performDatapilotHealthcheck).toHaveBeenCalledWith(\n        args,\n      );\n    });\n\n    it(\"should throw error when project not found for healthcheck\", () => {\n      // Mock getProjects to return empty array\n      container.getProjects = jest.fn(() => []);\n\n      const args = {\n        projectRoot: \"/non/existent/project\",\n        configType: \"All\" as const,\n      } as DataPilotHealtCheckParams;\n\n      expect(() => container.executeAltimateDatapilotHealthcheck(args)).toThrow(\n        \"Unable to find project /non/existent/project\",\n      );\n    });\n  });\n\n  describe(\"Workspace Folder Management\", () => {\n    it(\"should initialize DBT projects\", async () => {\n      const mockWorkspaceFolder = {\n        uri: Uri.file(\"/path/to/workspace\"),\n        name: \"test-workspace\",\n        index: 0,\n      };\n\n      // Mock workspace folders\n      (workspace as any).workspaceFolders = [mockWorkspaceFolder];\n      container.dbtWorkspaceFolders = [];\n\n      await container.initializeDBTProjects();\n\n      expect(mockDbtWorkspaceFolderFactory).toHaveBeenCalledWith(\n        mockWorkspaceFolder,\n        expect.anything(),\n        expect.anything(),\n      );\n    });\n\n    it(\"should handle undefined workspace folders\", async () => {\n      // Mock workspace folders as undefined\n      (workspace as any).workspaceFolders = undefined;\n\n      // Should not throw\n      await container.initializeDBTProjects();\n\n      // Should not call factory\n      expect(mockDbtWorkspaceFolderFactory).not.toHaveBeenCalled();\n    });\n\n    it(\"should handle workspace folder changes\", async () => {\n      // Setup workspace change handler\n      let changeHandler: any;\n      (workspace.onDidChangeWorkspaceFolders as any).mockImplementation(\n        (handler: any) => {\n          changeHandler = handler;\n          return { dispose: jest.fn() };\n        },\n      );\n\n      // Create a new container to register the handler\n      new DBTProjectContainer(\n        mockDbtClient,\n        mockDbtWorkspaceFolderFactory,\n        mockDbtTerminal,\n        mockAltimateDatapilot,\n        mockAltimateRequest,\n      );\n\n      // Simulate workspace folder change\n      const addedFolder = {\n        uri: Uri.file(\"/path/to/added\"),\n        name: \"added\",\n        index: 1,\n      };\n      const removedFolder = {\n        uri: Uri.file(\"/path/to/workspace\"),\n        name: \"test-workspace\",\n        index: 0,\n      };\n\n      await changeHandler({\n        added: [addedFolder],\n        removed: [removedFolder],\n      });\n\n      expect(mockDbtWorkspaceFolderFactory).toHaveBeenCalledWith(\n        addedFolder,\n        expect.anything(),\n        expect.anything(),\n      );\n    });\n  });\n\n  describe(\"Edge Cases\", () => {\n    it(\"should handle operations when no project is found\", () => {\n      mockDbtWorkspaceFolder.findDBTProject = jest.fn(() => undefined);\n\n      const uri = Uri.file(\"/path/to/non-dbt/file.sql\");\n\n      // These should not throw errors\n      container.runModel(uri);\n      container.buildModel(uri);\n      container.compileModel(uri);\n      container.generateDocs(uri);\n\n      expect(mockDbtProject.runModel).not.toHaveBeenCalled();\n      expect(mockDbtProject.buildModel).not.toHaveBeenCalled();\n      expect(mockDbtProject.compileModel).not.toHaveBeenCalled();\n      expect(mockDbtProject.generateDocs).not.toHaveBeenCalled();\n    });\n\n    it(\"should handle empty workspace folders array\", () => {\n      container.dbtWorkspaceFolders = [];\n\n      expect(container.getProjects()).toEqual([]);\n      expect(container.getAdapters()).toEqual([]);\n    });\n\n    it(\"should deduplicate adapters\", () => {\n      const mockDbtWorkspaceFolder2 = {\n        ...mockDbtWorkspaceFolder,\n        getAdapters: jest.fn(() => [\"postgres\", \"snowflake\"]),\n      };\n\n      container.dbtWorkspaceFolders = [\n        mockDbtWorkspaceFolder,\n        mockDbtWorkspaceFolder2,\n      ];\n\n      const adapters = container.getAdapters();\n      expect(adapters).toEqual([\"postgres\", \"snowflake\"]);\n    });\n\n    it(\"should handle undefined Python environment\", () => {\n      mockDbtClient.getPythonEnvironment = jest.fn(() => undefined);\n\n      const pythonEnv = container.getPythonEnvironment();\n      expect(pythonEnv).toBeUndefined();\n    });\n\n    it(\"should handle context not set\", () => {\n      const newContainer = new DBTProjectContainer(\n        mockDbtClient,\n        mockDbtWorkspaceFolderFactory,\n        mockDbtTerminal,\n        mockAltimateDatapilot,\n        mockAltimateRequest,\n      );\n\n      // These should not throw even without context\n      expect(() => newContainer.extensionId).not.toThrow();\n      expect(newContainer.extensionId).toBe(\"\");\n    });\n  });\n\n  describe(\"Walkthrough and Initialization\", () => {\n    beforeEach(() => {\n      const mockContext = {\n        workspaceState: {\n          get: jest.fn(),\n          update: jest.fn(),\n        },\n        globalState: {\n          get: jest.fn(),\n          update: jest.fn(),\n        },\n      } as unknown as ExtensionContext;\n      container.setContext(mockContext);\n    });\n\n    it(\"should show walkthrough when user accepts\", async () => {\n      (window.showInformationMessage as any) = jest.fn(() =>\n        Promise.resolve(\"Yes\"),\n      );\n\n      await container.showWalkthrough();\n\n      expect(commands.executeCommand).toHaveBeenCalledWith(\n        \"setContext\",\n        \"dbtPowerUser.showSetupWalkthrough\",\n        false,\n      );\n      expect(commands.executeCommand).toHaveBeenCalledWith(\n        \"dbtPowerUser.openOnboarding\",\n      );\n    });\n\n    it(\"should not show walkthrough when user ignores\", async () => {\n      (window.showInformationMessage as any) = jest.fn(() =>\n        Promise.resolve(\"Ignore\"),\n      );\n\n      await container.showWalkthrough();\n\n      expect(commands.executeCommand).not.toHaveBeenCalledWith(\n        \"dbtPowerUser.openOnboarding\",\n      );\n    });\n\n    it(\"should skip walkthrough when hidden in settings\", async () => {\n      const mockConfig = {\n        get: jest.fn((key: string, defaultValue?: any) => {\n          if (key === \"hideWalkthrough\") {\n            return true;\n          }\n          return defaultValue;\n        }),\n      };\n      (workspace.getConfiguration as any) = jest.fn(() => mockConfig);\n\n      const mockContext = {\n        workspaceState: {\n          get: jest.fn(),\n          update: jest.fn(),\n        },\n        globalState: {\n          get: jest.fn(() => true),\n          update: jest.fn(),\n        },\n      } as unknown as ExtensionContext;\n      container.setContext(mockContext);\n      (window.showInformationMessage as any) = jest.fn();\n\n      await container.initializeWalkthrough();\n\n      expect(window.showInformationMessage).not.toHaveBeenCalled();\n    });\n\n    it(\"should trigger walkthrough when not hidden and state undefined\", async () => {\n      const mockConfig = {\n        get: jest.fn((key: string, defaultValue?: any) => {\n          if (key === \"hideWalkthrough\") {\n            return false;\n          }\n          return defaultValue;\n        }),\n      };\n      (workspace.getConfiguration as any) = jest.fn(() => mockConfig);\n\n      const mockContext = {\n        workspaceState: {\n          get: jest.fn(),\n          update: jest.fn(),\n        },\n        globalState: {\n          get: jest.fn(() => undefined),\n          update: jest.fn(),\n        },\n      } as unknown as ExtensionContext;\n      container.setContext(mockContext);\n      (window.showInformationMessage as any) = jest.fn(() =>\n        Promise.resolve(\"Ignore\"),\n      );\n\n      await container.initializeWalkthrough();\n\n      expect(window.showInformationMessage).toHaveBeenCalled();\n    });\n  });\n\n  describe(\"Project Registration Events\", () => {\n    it(\"should set up project registration event handler\", () => {\n      // The project registration event handler is set up in the constructor\n      // and is tested indirectly through workspace folder operations.\n      // This test verifies that the container properly initializes with the event system.\n\n      const newContainer = new DBTProjectContainer(\n        mockDbtClient,\n        mockDbtWorkspaceFolderFactory,\n        mockDbtTerminal,\n        mockAltimateDatapilot,\n        mockAltimateRequest,\n      );\n\n      // Verify the container has the expected event emitters\n      expect(\n        (newContainer as any)._onProjectRegisteredUnregistered,\n      ).toBeDefined();\n      expect((newContainer as any)._onManifestChanged).toBeDefined();\n      expect(\n        (newContainer as any)._onRebuildManifestStatusChange,\n      ).toBeDefined();\n\n      // Verify public event accessors\n      expect(newContainer.onManifestChanged).toBeDefined();\n      expect(newContainer.onRebuildManifestStatusChange).toBeDefined();\n    });\n  });\n\n  describe(\"SQL Operations with Untitled Files\", () => {\n    it(\"should handle executeSQL with untitled URI and selected project\", () => {\n      const mockContext = {\n        workspaceState: {\n          get: jest.fn((key: string) => {\n            if (key === \"dbtPowerUser.projectSelected\") {\n              return {\n                label: \"test_project\",\n                description: \"/path/to/project\",\n                uri: Uri.file(\"/path/to/project\"),\n              };\n            }\n            return undefined;\n          }),\n          update: jest.fn(),\n        },\n        globalState: {\n          get: jest.fn(),\n          update: jest.fn(),\n        },\n      } as unknown as ExtensionContext;\n      container.setContext(mockContext);\n\n      const untitledUri = { scheme: \"untitled\", fsPath: \"Untitled-1\" } as Uri;\n      const query = \"SELECT * FROM table\";\n      const modelName = \"test_model\";\n\n      container.executeSQL(untitledUri, query, modelName);\n\n      expect(mockDbtProject.executeSQLOnQueryPanel).toHaveBeenCalledWith(\n        query,\n        modelName,\n      );\n    });\n\n    it(\"should handle executeSQL with untitled URI and no selected project\", () => {\n      const mockContext = {\n        workspaceState: {\n          get: jest.fn(() => undefined),\n          update: jest.fn(),\n        },\n        globalState: {\n          get: jest.fn(),\n          update: jest.fn(),\n        },\n      } as unknown as ExtensionContext;\n      container.setContext(mockContext);\n\n      mockDbtWorkspaceFolder.findDBTProject = jest.fn(() => undefined);\n\n      const untitledUri = { scheme: \"untitled\", fsPath: \"Untitled-1\" } as Uri;\n      const query = \"SELECT * FROM table\";\n      const modelName = \"test_model\";\n\n      // Should not throw error\n      container.executeSQL(untitledUri, query, modelName);\n\n      expect(mockDbtProject.executeSQLOnQueryPanel).not.toHaveBeenCalled();\n    });\n  });\n\n  describe(\"Rebuild Manifest Status\", () => {\n    it(\"should handle rebuild manifest status changes\", () => {\n      // Setup the event handler\n      let statusChangeHandler: any;\n      const mockWorkspaceFolderWithEvent = {\n        ...mockDbtWorkspaceFolder,\n        onRebuildManifestStatusChange: (handler: any) => {\n          statusChangeHandler = handler;\n          return { dispose: jest.fn() };\n        },\n      };\n\n      const factoryWithEvent = jest.fn(() => mockWorkspaceFolderWithEvent);\n\n      // Create container with event support\n      const newContainer = new DBTProjectContainer(\n        mockDbtClient,\n        factoryWithEvent,\n        mockDbtTerminal,\n        mockAltimateDatapilot,\n        mockAltimateRequest,\n      );\n\n      // Register workspace folder\n      const workspaceFolder = {\n        uri: Uri.file(\"/path/to/workspace\"),\n        name: \"test-workspace\",\n        index: 0,\n      };\n\n      // Mock workspace folders\n      (workspace as any).workspaceFolders = [workspaceFolder];\n      newContainer.initializeDBTProjects();\n\n      // Simulate rebuild manifest status change\n      if (statusChangeHandler) {\n        statusChangeHandler({\n          project: mockDbtProject,\n          inProgress: true,\n        });\n\n        // Check that the event was properly handled\n        const rebuildEvent = (newContainer as any)\n          ._onRebuildManifestStatusChange;\n        expect(rebuildEvent).toBeDefined();\n      }\n    });\n  });\n\n  describe(\"rerunFromHistory\", () => {\n    const mockProject = {\n      getProjectName: jest.fn().mockReturnValue(\"test-project\"),\n      runModel: jest.fn(),\n      buildModel: jest.fn(),\n      buildProject: jest.fn(),\n      runTest: jest.fn(),\n      compileModel: jest.fn(),\n    };\n\n    beforeEach(() => {\n      jest\n        .spyOn(container, \"findProjectByName\")\n        .mockReturnValue(mockProject as any);\n    });\n\n    it(\"should show error when project is not found\", () => {\n      jest.spyOn(container, \"findProjectByName\").mockReturnValue(undefined);\n\n      container.rerunFromHistory(\n        createEntry({ projectName: \"nonexistent\", command: \"dbt run\" }),\n      );\n\n      expect(window.showErrorMessage).toHaveBeenCalledWith(\n        expect.stringContaining(\"nonexistent\"),\n      );\n    });\n\n    it(\"should show warning for project-wide dbt run (empty args)\", () => {\n      container.rerunFromHistory(createEntry({ command: \"dbt run\", args: [] }));\n\n      expect(window.showWarningMessage).toHaveBeenCalledWith(\n        expect.stringContaining(\"dbt run\"),\n      );\n      expect(mockProject.runModel).not.toHaveBeenCalled();\n    });\n\n    it(\"should delegate to runModel when args are present\", () => {\n      container.rerunFromHistory(\n        createEntry({ command: \"dbt run\", args: [\"my_model\"] }),\n      );\n\n      expect(mockProject.runModel).toHaveBeenCalledWith(\n        expect.objectContaining({ modelName: \"my_model\" }),\n      );\n    });\n\n    it(\"should show warning for project-wide dbt test (empty args)\", () => {\n      container.rerunFromHistory(\n        createEntry({ command: \"dbt test\", args: [] }),\n      );\n\n      expect(window.showWarningMessage).toHaveBeenCalledWith(\n        expect.stringContaining(\"dbt test\"),\n      );\n      expect(mockProject.runTest).not.toHaveBeenCalled();\n    });\n\n    it(\"should delegate to runTest when args are present\", () => {\n      container.rerunFromHistory(\n        createEntry({ command: \"dbt test\", args: [\"my_test\"] }),\n      );\n\n      expect(mockProject.runTest).toHaveBeenCalledWith(\"my_test\");\n    });\n\n    it(\"should show warning for project-wide dbt compile (empty args)\", () => {\n      container.rerunFromHistory(\n        createEntry({ command: \"dbt compile\", args: [] }),\n      );\n\n      expect(window.showWarningMessage).toHaveBeenCalledWith(\n        expect.stringContaining(\"dbt compile\"),\n      );\n      expect(mockProject.compileModel).not.toHaveBeenCalled();\n    });\n\n    it(\"should delegate to compileModel when args are present\", () => {\n      container.rerunFromHistory(\n        createEntry({ command: \"dbt compile\", args: [\"+my_model\"] }),\n      );\n\n      expect(mockProject.compileModel).toHaveBeenCalledWith(\n        expect.objectContaining({\n          plusOperatorLeft: \"+\",\n          modelName: \"my_model\",\n        }),\n      );\n    });\n\n    it(\"should call buildProject for project-wide dbt build (empty args)\", () => {\n      container.rerunFromHistory(\n        createEntry({ command: \"dbt build\", args: [] }),\n      );\n\n      expect(mockProject.buildProject).toHaveBeenCalled();\n    });\n\n    it(\"should delegate to buildModel when build has args\", () => {\n      container.rerunFromHistory(\n        createEntry({ command: \"dbt build\", args: [\"+my_model+\"] }),\n      );\n\n      expect(mockProject.buildModel).toHaveBeenCalledWith(\n        expect.objectContaining({\n          plusOperatorLeft: \"+\",\n          modelName: \"my_model\",\n          plusOperatorRight: \"+\",\n        }),\n      );\n    });\n\n    it(\"should show warning for unknown command\", () => {\n      container.rerunFromHistory(\n        createEntry({ command: \"dbt seed\", args: [] }),\n      );\n\n      expect(window.showWarningMessage).toHaveBeenCalledWith(\n        expect.stringContaining(\"seed\"),\n      );\n    });\n  });\n\n  describe(\"unregisterWorkspaceFolder (via workspace event)\", () => {\n    it(\"should remove only the targeted folder, not subsequent ones\", () => {\n      // Access the internal dbtWorkspaceFolders array directly to verify\n      // splice removes exactly one element (not all from index onward).\n      const folders = (container as any).dbtWorkspaceFolders as any[];\n      // The beforeEach seeds the container with one workspace folder; reset\n      // to a clean slate so we can assert on exactly the three we push below.\n      folders.length = 0;\n\n      const createMockFolder = (fsPath: string) => ({\n        contains: (uri: any) => uri.fsPath.startsWith(fsPath),\n        dispose: jest.fn(),\n        workspaceFolder: { uri: { fsPath } },\n      });\n\n      const folder1 = createMockFolder(\"/workspace/project-a\");\n      const folder2 = createMockFolder(\"/workspace/project-b\");\n      const folder3 = createMockFolder(\"/workspace/project-c\");\n      folders.push(folder1, folder2, folder3);\n\n      expect(folders).toHaveLength(3);\n\n      // Call the private unregisterWorkspaceFolder via its internal name\n      (container as any).unregisterWorkspaceFolder({\n        uri: { fsPath: \"/workspace/project-b\" },\n      });\n\n      expect(folders).toHaveLength(2);\n      expect(folders[0]).toBe(folder1);\n      expect(folders[1]).toBe(folder3);\n      expect(folder2.dispose).toHaveBeenCalled();\n    });\n  });\n});\n"
  },
  {
    "path": "src/test/suite/dbtTerminal.test.ts",
    "content": "import { DBTTerminal } from \"@altimateai/dbt-integration\";\nimport { afterEach, beforeEach, describe, expect, it } from \"@jest/globals\";\nimport { PythonException } from \"python-bridge\";\nimport * as vscode from \"vscode\";\nimport { VSCodeDBTTerminal } from \"../../dbt_client/vscodeTerminal\";\n\n// Set test environment\nprocess.env.NODE_ENV = \"test\";\n\ndescribe(\"DBTTerminal Test Suite\", () => {\n  let mockTelemetry: jest.Mocked<any>;\n  let mockOutputChannel: jest.Mocked<any>;\n  let terminal: DBTTerminal;\n\n  beforeEach(() => {\n    mockOutputChannel = {\n      appendLine: jest.fn(),\n      show: jest.fn(),\n      clear: jest.fn(),\n      info: jest.fn(),\n      debug: jest.fn(),\n      error: jest.fn(),\n      warn: jest.fn(),\n    };\n\n    mockTelemetry = {\n      sendTelemetryEvent: jest.fn(),\n      sendTelemetryError: jest.fn(),\n    };\n\n    terminal = new VSCodeDBTTerminal(mockTelemetry);\n    // @ts-ignore - Manually set the output channel\n    terminal.outputChannel = mockOutputChannel;\n  });\n\n  afterEach(() => {\n    jest.clearAllMocks();\n  });\n\n  it(\"should log messages with proper formatting\", () => {\n    const message = \"Test message\";\n    terminal.log(message);\n    expect(mockOutputChannel.info).toHaveBeenCalledWith(message, []);\n  });\n\n  it(\"should send telemetry on info messages\", () => {\n    const name = \"test_event\";\n    const message = \"Test info message\";\n    terminal.info(name, message);\n    expect(mockOutputChannel.info).toHaveBeenCalledWith(\n      `${name}:${message}`,\n      [],\n    );\n    expect(mockTelemetry.sendTelemetryEvent).toHaveBeenCalledWith(name, {\n      message,\n      level: \"info\",\n    });\n  });\n\n  it(\"should send telemetry on warning messages\", () => {\n    const name = \"test_warning\";\n    const message = \"Test warning message\";\n    terminal.warn(name, message);\n    expect(mockOutputChannel.warn).toHaveBeenCalledWith(\n      `${name}:${message}`,\n      [],\n    );\n    expect(mockTelemetry.sendTelemetryEvent).toHaveBeenCalledWith(name, {\n      message,\n      level: \"warn\",\n    });\n  });\n\n  it(\"should handle errors with proper error message formatting\", () => {\n    const name = \"test_error\";\n    const message = \"Test error message\";\n    const error = new Error(\"Test error details\");\n    terminal.error(name, message, error);\n    expect(mockOutputChannel.error).toHaveBeenCalledWith(\n      `${name}:${message}:${error.message}`,\n      [],\n    );\n    expect(mockTelemetry.sendTelemetryError).toHaveBeenCalledWith(name, error, {\n      message,\n    });\n  });\n\n  it(\"should handle Python exceptions\", () => {\n    const name = \"python_error\";\n    const message = \"Python error occurred\";\n    const pythonError = {\n      exception: { message: \"Test Python error\" },\n      toString: () => \"Test Python error\",\n    } as PythonException;\n    terminal.error(name, message, pythonError);\n    expect(mockOutputChannel.error).toHaveBeenCalledWith(\n      `${name}:${message}:${pythonError.toString()}`,\n      [],\n    );\n    expect(mockTelemetry.sendTelemetryError).toHaveBeenCalledWith(\n      name,\n      pythonError,\n      {\n        message,\n      },\n    );\n  });\n\n  it(\"should show and hide terminal based on status\", async () => {\n    const mockTerminal = {\n      show: jest.fn(),\n      dispose: jest.fn(),\n    };\n\n    // @ts-ignore - Mocking terminal\n    terminal.terminal = mockTerminal;\n\n    // Test showing terminal\n    await terminal.show(true);\n    expect(mockTerminal.show).toHaveBeenCalledWith(false);\n\n    // Reset the mock for the next test\n    jest.clearAllMocks();\n\n    // Test not showing terminal\n    await terminal.show(false);\n    expect(mockTerminal.show).not.toHaveBeenCalled();\n  });\n\n  it(\"should properly handle trace messages\", () => {\n    const message = \"Test trace message\";\n    terminal.trace(message);\n    expect(mockOutputChannel.appendLine).toHaveBeenCalledWith(message);\n  });\n\n  it(\"should properly handle debug messages\", () => {\n    const name = \"test_debug\";\n    const message = \"Test debug message\";\n    terminal.debug(name, message);\n    expect(mockOutputChannel.debug).toHaveBeenCalledWith(\n      `${name}:${message}`,\n      [],\n    );\n  });\n\n  it(\"should not send telemetry when sendTelemetry is false for info messages\", () => {\n    const name = \"test_event_no_telemetry\";\n    const message = \"Test info message without telemetry\";\n    terminal.info(name, message, false);\n    expect(mockOutputChannel.info).toHaveBeenCalledWith(\n      `${name}:${message}`,\n      [],\n    );\n    expect(mockTelemetry.sendTelemetryEvent).not.toHaveBeenCalled();\n  });\n\n  it(\"should not send telemetry when sendTelemetry is false for warning messages\", () => {\n    const name = \"test_warning_no_telemetry\";\n    const message = \"Test warning message without telemetry\";\n    terminal.warn(name, message, false);\n    expect(mockOutputChannel.warn).toHaveBeenCalledWith(\n      `${name}:${message}`,\n      [],\n    );\n    expect(mockTelemetry.sendTelemetryEvent).not.toHaveBeenCalled();\n  });\n\n  it(\"should not send telemetry when sendTelemetry is false for error messages\", () => {\n    const name = \"test_error_no_telemetry\";\n    const message = \"Test error message without telemetry\";\n    const error = new Error(\"Test error details\");\n    terminal.error(name, message, error, false);\n    expect(mockOutputChannel.error).toHaveBeenCalledWith(\n      `${name}:${message}:${error.message}`,\n      [],\n    );\n    expect(mockTelemetry.sendTelemetryError).not.toHaveBeenCalled();\n  });\n\n  it(\"should properly dispose of all disposables\", () => {\n    const mockDisposable1 = { dispose: jest.fn() };\n    const mockDisposable2 = { dispose: jest.fn() };\n    // @ts-ignore - Set private disposables for testing\n    terminal.disposables = [mockDisposable1, mockDisposable2];\n    terminal.dispose();\n    expect(mockDisposable1.dispose).toHaveBeenCalled();\n    expect(mockDisposable2.dispose).toHaveBeenCalled();\n    // @ts-ignore - Check private disposables for testing\n    expect(terminal.disposables.length).toBe(0);\n  });\n\n  it(\"should properly initialize and dispose terminal\", async () => {\n    // Mock vscode.window.createTerminal\n    const mockTerminal = {\n      dispose: jest.fn(),\n      show: jest.fn(),\n    };\n\n    const createTerminalMock = jest\n      .spyOn(vscode.window, \"createTerminal\")\n      .mockReturnValue(mockTerminal as unknown as vscode.Terminal);\n\n    // Create a new terminal instance\n    const newTerminal = new VSCodeDBTTerminal(mockTelemetry);\n    await newTerminal.show(true);\n\n    // Verify terminal was created with correct parameters\n    expect(createTerminalMock).toHaveBeenCalled();\n    const createTerminalArgs = createTerminalMock.mock.calls[0][0];\n    expect(createTerminalArgs.name).toBe(\"Tasks - dbt\");\n    expect(typeof createTerminalArgs.pty.onDidWrite).toBe(\"function\");\n    expect(typeof createTerminalArgs.pty.open).toBe(\"function\");\n    expect(typeof createTerminalArgs.pty.close).toBe(\"function\");\n\n    // Test terminal disposal\n    newTerminal.dispose();\n    expect(mockTerminal.dispose).toHaveBeenCalled();\n\n    // Cleanup\n    createTerminalMock.mockRestore();\n  });\n});\n"
  },
  {
    "path": "src/test/suite/dbtWorkspaceFolder.test.ts",
    "content": "import { describe, expect, it } from \"@jest/globals\";\nimport * as path from \"path\";\n\n/**\n * Test the `contains` method guard against undefined uri.fsPath.\n *\n * Telemetry showed 907 monthly crashes with:\n *   TypeError: Cannot read properties of undefined (reading 'startsWith')\n *   at DBTWorkspaceFolder.contains\n *\n * The crash happens when VS Code APIs pass a Uri without a valid fsPath\n * (e.g., virtual files, git diff views, untitled documents, output channels).\n */\ndescribe(\"DBTWorkspaceFolder.contains guard\", () => {\n  // Extracted logic mirrors the `contains` method to test without full DI setup\n  function contains(\n    uriFsPath: string | undefined,\n    workspaceFsPath: string,\n  ): boolean {\n    if (!uriFsPath) {\n      return false;\n    }\n    return (\n      uriFsPath === workspaceFsPath ||\n      uriFsPath.startsWith(workspaceFsPath + path.sep)\n    );\n  }\n\n  it(\"should return false when uri.fsPath is undefined\", () => {\n    expect(contains(undefined, \"/home/user/project\")).toBe(false);\n  });\n\n  it(\"should return false when uri.fsPath is empty string\", () => {\n    expect(contains(\"\", \"/home/user/project\")).toBe(false);\n  });\n\n  it(\"should return true when uri matches workspace root exactly\", () => {\n    expect(contains(\"/home/user/project\", \"/home/user/project\")).toBe(true);\n  });\n\n  it(\"should return true when uri is inside workspace folder\", () => {\n    expect(\n      contains(\n        `/home/user/project${path.sep}models${path.sep}file.sql`,\n        \"/home/user/project\",\n      ),\n    ).toBe(true);\n  });\n\n  it(\"should return false when uri is outside workspace folder\", () => {\n    expect(contains(\"/home/user/other/file.sql\", \"/home/user/project\")).toBe(\n      false,\n    );\n  });\n\n  it(\"should return false for partial prefix match without separator\", () => {\n    // /home/user/project-v2/file.sql should NOT match /home/user/project\n    expect(\n      contains(\"/home/user/project-v2/file.sql\", \"/home/user/project\"),\n    ).toBe(false);\n  });\n});\n"
  },
  {
    "path": "src/test/suite/diagnosticsOutputChannel.test.ts",
    "content": "import { afterEach, beforeEach, describe, expect, it } from \"@jest/globals\";\nimport * as vscode from \"vscode\";\nimport { DiagnosticsOutputChannel } from \"../../services/diagnosticsOutputChannel\";\n\n// Set test environment\nprocess.env.NODE_ENV = \"test\";\n\ndescribe(\"DiagnosticsOutputChannel Test Suite\", () => {\n  let mockOutputChannel: jest.Mocked<any>;\n  let diagnosticsChannel: DiagnosticsOutputChannel;\n\n  beforeEach(() => {\n    mockOutputChannel = {\n      appendLine: jest.fn(),\n      show: jest.fn(),\n      clear: jest.fn(),\n      dispose: jest.fn(),\n    };\n\n    // Mock vscode.window.createOutputChannel\n    jest\n      .spyOn(vscode.window, \"createOutputChannel\")\n      .mockReturnValue(mockOutputChannel);\n\n    diagnosticsChannel = new DiagnosticsOutputChannel();\n  });\n\n  afterEach(() => {\n    jest.clearAllMocks();\n    jest.restoreAllMocks();\n  });\n\n  it(\"should create output channel with correct name\", () => {\n    expect(vscode.window.createOutputChannel).toHaveBeenCalledWith(\n      \"dbt Power User - Diagnostics\",\n      \"log\",\n    );\n  });\n\n  it(\"should show output channel\", () => {\n    diagnosticsChannel.show();\n    expect(mockOutputChannel.show).toHaveBeenCalledWith(true);\n  });\n\n  it(\"should log messages\", () => {\n    const message = \"Test message\";\n    diagnosticsChannel.log(message);\n    expect(mockOutputChannel.appendLine).toHaveBeenCalledWith(message);\n  });\n\n  it(\"should log new lines\", () => {\n    diagnosticsChannel.logNewLine();\n    expect(mockOutputChannel.appendLine).toHaveBeenCalledWith(\"\");\n  });\n\n  it(\"should log lines\", () => {\n    const line = \"Test line\";\n    diagnosticsChannel.logLine(line);\n    expect(mockOutputChannel.appendLine).toHaveBeenCalledWith(line);\n  });\n\n  it(\"should log horizontal rules\", () => {\n    diagnosticsChannel.logHorizontalRule();\n    expect(mockOutputChannel.appendLine).toHaveBeenCalledWith(\n      \"--------------------------------------------------------------------------\",\n    );\n  });\n\n  it(\"should format and log blocks with horizontal rules\", () => {\n    const block = [\"Line 1\", \"Line 2\", \"Line 3\"];\n    diagnosticsChannel.logBlock(block);\n\n    // Verify horizontal rules and content\n    expect(mockOutputChannel.appendLine).toHaveBeenCalledWith(\n      \"--------------------------------------------------------------------------\",\n    );\n    expect(mockOutputChannel.appendLine).toHaveBeenCalledWith(\"Line 1\");\n    expect(mockOutputChannel.appendLine).toHaveBeenCalledWith(\"Line 2\");\n    expect(mockOutputChannel.appendLine).toHaveBeenCalledWith(\"Line 3\");\n    expect(mockOutputChannel.appendLine).toHaveBeenCalledWith(\n      \"--------------------------------------------------------------------------\",\n    );\n  });\n\n  it(\"should format and log blocks with headers\", () => {\n    const header = [\"Header 1\", \"Header 2\"];\n    const block = [\"Content 1\", \"Content 2\"];\n    diagnosticsChannel.logBlockWithHeader(header, block);\n\n    const calls = mockOutputChannel.appendLine.mock.calls.map(\n      (call: any) => call[0],\n    );\n\n    expect(calls).toEqual([\n      \"--------------------------------------------------------------------------\",\n      \"Header 1\",\n      \"Header 2\",\n      \"--------------------------------------------------------------------------\",\n      \"Content 1\",\n      \"Content 2\",\n      \"--------------------------------------------------------------------------\",\n    ]);\n  });\n\n  it(\"should handle empty lines in blocks\", () => {\n    const block = [\"Line 1\", \"\", \"Line 3\"];\n    diagnosticsChannel.logBlock(block);\n\n    // Should skip empty lines\n    expect(mockOutputChannel.appendLine).toHaveBeenCalledWith(\"Line 1\");\n    expect(mockOutputChannel.appendLine).toHaveBeenCalledWith(\"Line 3\");\n    expect(mockOutputChannel.appendLine).not.toHaveBeenCalledWith(\"\");\n  });\n\n  it(\"should dispose output channel\", () => {\n    diagnosticsChannel.dispose();\n    expect(mockOutputChannel.dispose).toHaveBeenCalled();\n  });\n});\n"
  },
  {
    "path": "src/test/suite/extension.test.ts",
    "content": "import { afterEach, beforeEach, describe, expect, it } from \"@jest/globals\";\nimport * as vscode from \"../mock/vscode\";\n\ndescribe(\"Extension Test Suite\", () => {\n  let mockExtensions: jest.Mocked<any>;\n\n  beforeEach(() => {\n    mockExtensions = {\n      getExtension: jest.fn(),\n    };\n    (vscode as any).extensions = mockExtensions;\n  });\n\n  afterEach(() => {\n    jest.clearAllMocks();\n  });\n\n  it(\"should handle array index operations\", () => {\n    expect([1, 2, 3].indexOf(5)).toBe(-1);\n    expect([1, 2, 3].indexOf(0)).toBe(-1);\n  });\n\n  const getExtension = () => {\n    // Mock the jinjahtml extension\n    const mockJinjaHtml = {\n      id: \"samuelcolvin.jinjahtml\",\n      packageJSON: {\n        name: \"jinjahtml\",\n        displayName: \"Jinja HTML\",\n        contributes: {\n          languages: [\n            {\n              id: \"jinja-sql\",\n              extensions: [\".sql\"],\n            },\n          ],\n        },\n      },\n      isActive: true,\n      activate: () => Promise.resolve(),\n      exports: {},\n      extensionUri: vscode.Uri.file(\"\"),\n      extensionPath: \"\",\n      extensionKind: vscode.ExtensionKind.UI,\n    };\n\n    // Create a mutable isActive property\n    let isActive = false;\n\n    // Mock our own extension\n    const mockOurExtension = {\n      id: \"innoverio.vscode-dbt-power-user\",\n      packageJSON: {\n        name: \"vscode-dbt-power-user\",\n        displayName: \"Power User for dbt\",\n        contributes: {\n          commands: [\n            {\n              command: \"dbt.run\",\n              title: \"Run dbt\",\n            },\n            {\n              command: \"dbt.compile\",\n              title: \"Compile dbt\",\n            },\n          ],\n        },\n      },\n      get isActive() {\n        return isActive;\n      },\n      activate: () => {\n        isActive = true;\n        return Promise.resolve();\n      },\n      exports: {},\n      extensionUri: vscode.Uri.file(\"\"),\n      extensionPath: \"\",\n      extensionKind: vscode.ExtensionKind.Workspace,\n    };\n\n    // Set up the extensions API\n    mockExtensions.getExtension.mockImplementation((id: string) => {\n      if (id === \"samuelcolvin.jinjahtml\") {\n        return mockJinjaHtml;\n      }\n      if (id === \"innoverio.vscode-dbt-power-user\") {\n        return mockOurExtension;\n      }\n      return undefined;\n    });\n\n    return mockOurExtension;\n  };\n\n  it(\"should be present\", () => {\n    const extension = getExtension();\n    expect(extension).toBeTruthy();\n  });\n\n  it(\"should activate\", async () => {\n    const extension = getExtension();\n    if (!extension) {\n      throw new Error(\"Extension not found\");\n    }\n    await extension.activate();\n    expect(extension.isActive).toBe(true);\n  });\n\n  it(\"should register commands\", async () => {\n    const extension = getExtension();\n    if (!extension) {\n      throw new Error(\"Extension not found\");\n    }\n\n    // Ensure extension is activated\n    if (!extension.isActive) {\n      await extension.activate();\n    }\n\n    // Mock the commands API to return our commands\n    const mockCommands: string[] = [\"dbt.run\", \"dbt.compile\", \"other.command\"];\n    const spy = jest.spyOn(vscode.commands, \"getCommands\");\n    (spy.mockResolvedValue as any)(mockCommands);\n\n    const allCommands = await vscode.commands.getCommands();\n    const dbtCommands = (allCommands as string[]).filter((cmd: string) =>\n      cmd.startsWith(\"dbt.\"),\n    );\n\n    // More detailed error message\n    expect(dbtCommands.length).toBeGreaterThan(0);\n\n    // Test specific commands exist\n    expect(dbtCommands).toContain(\"dbt.run\");\n    expect(dbtCommands).toContain(\"dbt.compile\");\n  });\n});\n"
  },
  {
    "path": "src/test/suite/index.ts",
    "content": "import { glob } from \"glob\";\nimport * as path from \"path\";\nimport \"reflect-metadata\";\nimport { setupCoverage } from \"./coverage\";\n\nexport async function run(): Promise<void> {\n  // Initialize coverage\n  setupCoverage();\n\n  const testsRoot = path.resolve(__dirname, \".\");\n\n  try {\n    const files = await glob(\"**/**.test.js\", { cwd: testsRoot });\n    // Add files to the test suite\n    files.forEach((f) => {\n      require(path.resolve(testsRoot, f));\n    });\n\n    return new Promise<void>((resolve, reject) => {\n      // Run the Jest test\n      process.on(\"unhandledRejection\", (err) => {\n        console.error(err);\n        reject(err);\n      });\n\n      resolve();\n    });\n  } catch (err) {\n    console.error(err);\n    throw err;\n  }\n}\n"
  },
  {
    "path": "src/test/suite/jinjaGrammar.test.ts",
    "content": "import { describe, expect, it } from \"@jest/globals\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\n/**\n * Tests for the TextMate grammar files.\n *\n * These tests validate the grammar JSON structure, regex patterns,\n * and scope naming conventions. Full tokenization testing requires\n * vscode-tmgrammar-test or a VS Code integration test host.\n */\n/**\n * TextMate grammars use Oniguruma regex which supports inline flags like (?i).\n * JavaScript RegExp does not. This helper strips (?i) and returns a JS RegExp\n * with the \"i\" flag applied externally.\n */\nfunction toJsRegex(pattern: string, extraFlags = \"\"): RegExp {\n  let flags = extraFlags;\n  const cleaned = pattern.replace(/\\(\\?i\\)/g, () => {\n    if (!flags.includes(\"i\")) {\n      flags += \"i\";\n    }\n    return \"\";\n  });\n  return new RegExp(cleaned, flags);\n}\n\ndescribe(\"Jinja SQL Grammar\", () => {\n  const grammarPath = path.resolve(\n    __dirname,\n    \"../../../syntaxes/jinja-sql.tmLanguage.json\",\n  );\n\n  let grammar: any;\n\n  beforeAll(() => {\n    const content = fs.readFileSync(grammarPath, \"utf-8\");\n    grammar = JSON.parse(content);\n  });\n\n  it(\"should be valid JSON with correct scopeName\", () => {\n    expect(grammar.scopeName).toBe(\"source.sql.jinja\");\n    expect(grammar.name).toBe(\"Jinja SQL\");\n  });\n\n  it(\"should have top-level patterns referencing repository\", () => {\n    expect(grammar.patterns.length).toBeGreaterThan(0);\n    for (const pattern of grammar.patterns) {\n      expect(pattern.include).toBeDefined();\n      const repoKey = pattern.include.replace(\"#\", \"\");\n      expect(grammar.repository[repoKey]).toBeDefined();\n    }\n  });\n\n  describe(\"repository completeness\", () => {\n    it(\"should have Jinja comment, statement, expression patterns\", () => {\n      expect(grammar.repository[\"jinja-comment\"]).toBeDefined();\n      expect(grammar.repository[\"jinja-statement\"]).toBeDefined();\n      expect(grammar.repository[\"jinja-expression\"]).toBeDefined();\n    });\n\n    it(\"should have SQL comment patterns\", () => {\n      expect(grammar.repository[\"sql-comment-line\"]).toBeDefined();\n      expect(grammar.repository[\"sql-comment-block\"]).toBeDefined();\n    });\n\n    it(\"should have SQL keyword categories\", () => {\n      expect(grammar.repository[\"sql-keyword-dml\"]).toBeDefined();\n      expect(grammar.repository[\"sql-keyword-ddl\"]).toBeDefined();\n      expect(grammar.repository[\"sql-keyword-clause\"]).toBeDefined();\n      expect(grammar.repository[\"sql-keyword-join\"]).toBeDefined();\n      expect(grammar.repository[\"sql-keyword-operator\"]).toBeDefined();\n    });\n\n    it(\"should have SQL function categories\", () => {\n      expect(grammar.repository[\"sql-function-aggregate\"]).toBeDefined();\n      expect(grammar.repository[\"sql-function-window\"]).toBeDefined();\n      expect(grammar.repository[\"sql-function-date\"]).toBeDefined();\n      expect(grammar.repository[\"sql-function-string\"]).toBeDefined();\n    });\n\n    it(\"should have Jinja sub-patterns\", () => {\n      expect(grammar.repository[\"jinja-keyword\"]).toBeDefined();\n      expect(grammar.repository[\"jinja-dbt-function\"]).toBeDefined();\n      expect(grammar.repository[\"jinja-filter\"]).toBeDefined();\n      expect(grammar.repository[\"jinja-operator\"]).toBeDefined();\n    });\n  });\n\n  describe(\"regex pattern validity\", () => {\n    const getPatternRegexes = (repo: Record<string, any>): string[] => {\n      const regexes: string[] = [];\n      for (const [, value] of Object.entries(repo)) {\n        if (value.match) {\n          regexes.push(value.match);\n        }\n        if (value.begin) {\n          regexes.push(value.begin);\n        }\n        if (value.end) {\n          regexes.push(value.end);\n        }\n      }\n      return regexes;\n    };\n\n    it(\"all regex patterns should be valid\", () => {\n      const regexes = getPatternRegexes(grammar.repository);\n      for (const regex of regexes) {\n        expect(() => toJsRegex(regex)).not.toThrow();\n      }\n    });\n  });\n\n  describe(\"dbt function coverage\", () => {\n    it(\"should match core dbt functions\", () => {\n      const dbtFnPattern = grammar.repository[\"jinja-dbt-function\"].match;\n      const regex = toJsRegex(dbtFnPattern);\n      const expectedFunctions = [\n        \"ref\",\n        \"source\",\n        \"config\",\n        \"var\",\n        \"env_var\",\n        \"adapter\",\n        \"return\",\n        \"log\",\n        \"run_query\",\n        \"this\",\n        \"graph\",\n        \"flags\",\n        \"target\",\n        \"is_incremental\",\n      ];\n\n      for (const fn of expectedFunctions) {\n        // Test with function call syntax (followed by paren)\n        expect(regex.test(`${fn}(`)).toBe(true);\n      }\n    });\n  });\n\n  describe(\"SQL keyword case insensitivity\", () => {\n    it(\"should match SELECT in any case\", () => {\n      const dmlPattern = grammar.repository[\"sql-keyword-dml\"].match;\n      const regex = toJsRegex(dmlPattern);\n      expect(regex.test(\"SELECT\")).toBe(true);\n      expect(regex.test(\"select\")).toBe(true);\n      expect(regex.test(\"Select\")).toBe(true);\n    });\n\n    it(\"should match JOIN variants\", () => {\n      const joinPattern = grammar.repository[\"sql-keyword-join\"].match;\n      const regex = toJsRegex(joinPattern);\n      expect(regex.test(\"JOIN\")).toBe(true);\n      expect(regex.test(\"LEFT JOIN\")).toBe(true);\n      expect(regex.test(\"left outer join\")).toBe(true);\n    });\n  });\n\n  describe(\"aggregate function patterns\", () => {\n    it(\"should match common aggregates followed by paren\", () => {\n      const aggPattern = grammar.repository[\"sql-function-aggregate\"].match;\n      const regex = toJsRegex(aggPattern);\n      expect(regex.test(\"COUNT(\")).toBe(true);\n      expect(regex.test(\"SUM(\")).toBe(true);\n      expect(regex.test(\"avg(\")).toBe(true);\n      expect(regex.test(\"max(\")).toBe(true);\n    });\n\n    it(\"should not match aggregate names without paren\", () => {\n      const aggPattern = grammar.repository[\"sql-function-aggregate\"].match;\n      const regex = toJsRegex(aggPattern);\n      // The lookahead (?=\\s*\\() should prevent matching without paren\n      // but the regex engine may still match the word part\n      // Test the full pattern behavior\n      expect(regex.test(\"COUNT_column\")).toBe(false);\n    });\n  });\n\n  describe(\"window function patterns\", () => {\n    it(\"should match window functions\", () => {\n      const winPattern = grammar.repository[\"sql-function-window\"].match;\n      const regex = toJsRegex(winPattern);\n      expect(regex.test(\"ROW_NUMBER(\")).toBe(true);\n      expect(regex.test(\"RANK(\")).toBe(true);\n      expect(regex.test(\"DENSE_RANK(\")).toBe(true);\n      expect(regex.test(\"LAG(\")).toBe(true);\n      expect(regex.test(\"LEAD(\")).toBe(true);\n    });\n  });\n\n  describe(\"Jinja delimiter scoping\", () => {\n    it(\"expression delimiters should have correct scope names\", () => {\n      const expr = grammar.repository[\"jinja-expression\"];\n      expect(expr.beginCaptures[\"0\"].name).toBe(\n        \"punctuation.definition.expression.begin.jinja\",\n      );\n      expect(expr.endCaptures[\"0\"].name).toBe(\n        \"punctuation.definition.expression.end.jinja\",\n      );\n    });\n\n    it(\"statement delimiters should have correct scope names\", () => {\n      const stmt = grammar.repository[\"jinja-statement\"];\n      expect(stmt.beginCaptures[\"0\"].name).toBe(\n        \"punctuation.definition.tag.begin.jinja\",\n      );\n      expect(stmt.endCaptures[\"0\"].name).toBe(\n        \"punctuation.definition.tag.end.jinja\",\n      );\n    });\n\n    it(\"comment delimiters should have correct scope names\", () => {\n      const comment = grammar.repository[\"jinja-comment\"];\n      expect(comment.name).toBe(\"comment.block.jinja\");\n    });\n  });\n\n  describe(\"Jinja whitespace control\", () => {\n    it(\"should match expression delimiters with whitespace control\", () => {\n      const expr = grammar.repository[\"jinja-expression\"];\n      const beginRegex = toJsRegex(expr.begin);\n      const endRegex = toJsRegex(expr.end);\n      expect(beginRegex.test(\"{{\")).toBe(true);\n      expect(beginRegex.test(\"{{-\")).toBe(true);\n      expect(endRegex.test(\"}}\")).toBe(true);\n      expect(endRegex.test(\"-}}\")).toBe(true);\n    });\n\n    it(\"should match statement delimiters with whitespace control\", () => {\n      const stmt = grammar.repository[\"jinja-statement\"];\n      const beginRegex = toJsRegex(stmt.begin);\n      const endRegex = toJsRegex(stmt.end);\n      expect(beginRegex.test(\"{%\")).toBe(true);\n      expect(beginRegex.test(\"{%-\")).toBe(true);\n      expect(endRegex.test(\"%}\")).toBe(true);\n      expect(endRegex.test(\"-%}\")).toBe(true);\n    });\n  });\n});\n\ndescribe(\"Jinja YAML Injection Grammar\", () => {\n  const grammarPath = path.resolve(\n    __dirname,\n    \"../../../syntaxes/jinja-yaml.tmLanguage.json\",\n  );\n\n  let grammar: any;\n\n  beforeAll(() => {\n    const content = fs.readFileSync(grammarPath, \"utf-8\");\n    grammar = JSON.parse(content);\n  });\n\n  it(\"should be valid JSON with correct injection scope\", () => {\n    expect(grammar.scopeName).toBe(\"source.yaml.jinja\");\n    expect(grammar.injectionSelector).toBe(\"L:source.yaml\");\n  });\n\n  it(\"should inject Jinja patterns into YAML\", () => {\n    expect(grammar.patterns.length).toBeGreaterThan(0);\n    const includeNames = grammar.patterns.map((p: any) => p.include);\n    expect(includeNames).toContain(\"#jinja-comment\");\n    expect(includeNames).toContain(\"#jinja-statement\");\n    expect(includeNames).toContain(\"#jinja-expression\");\n  });\n\n  it(\"should have dbt function support\", () => {\n    expect(grammar.repository[\"jinja-dbt-function\"]).toBeDefined();\n    const regex = toJsRegex(grammar.repository[\"jinja-dbt-function\"].match);\n    expect(regex.test(\"ref(\")).toBe(true);\n    expect(regex.test(\"source(\")).toBe(true);\n    expect(regex.test(\"var(\")).toBe(true);\n  });\n\n  it(\"should have matching Jinja keyword patterns\", () => {\n    expect(grammar.repository[\"jinja-keyword\"]).toBeDefined();\n    const regex = toJsRegex(grammar.repository[\"jinja-keyword\"].match);\n    expect(regex.test(\"for\")).toBe(true);\n    expect(regex.test(\"if\")).toBe(true);\n    expect(regex.test(\"set\")).toBe(true);\n    expect(regex.test(\"macro\")).toBe(true);\n  });\n});\n"
  },
  {
    "path": "src/test/suite/jupyterlabServicesCompat.test.ts",
    "content": "import { expect } from \"@jest/globals\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\n/**\n * Compatibility tests for @jupyterlab/services.\n *\n * These verify that all APIs used by the notebook kernel integration\n * (src/lib/index.js) are available and have the expected shape.\n */\n\n// ---------------------------------------------------------------------------\n// 1. Public API surface\n// ---------------------------------------------------------------------------\n\ndescribe(\"@jupyterlab/services API compatibility\", () => {\n  // eslint-disable-next-line @typescript-eslint/no-var-requires\n  const services = require(\"@jupyterlab/services\");\n\n  describe(\"ServerConnection\", () => {\n    it(\"should export ServerConnection\", () => {\n      expect(services.ServerConnection).toBeDefined();\n    });\n\n    it(\"should provide makeSettings()\", () => {\n      expect(typeof services.ServerConnection.makeSettings).toBe(\"function\");\n    });\n\n    it(\"makeSettings() should return an object with expected properties\", () => {\n      const settings = services.ServerConnection.makeSettings({\n        wsUrl: \"RAW\",\n      });\n      expect(settings).toBeDefined();\n      expect(settings.wsUrl).toBe(\"RAW\");\n    });\n  });\n\n  describe(\"KernelConnection\", () => {\n    it(\"should export KernelConnection as a constructor\", () => {\n      expect(typeof services.KernelConnection).toBe(\"function\");\n    });\n  });\n\n  describe(\"KernelMessage type guards\", () => {\n    const expectedMethods = [\n      \"isCommOpenMsg\",\n      \"isExecuteResultMsg\",\n      \"isExecuteInputMsg\",\n      \"isStatusMsg\",\n      \"isStreamMsg\",\n      \"isDisplayDataMsg\",\n      \"isUpdateDisplayDataMsg\",\n      \"isClearOutputMsg\",\n      \"isErrorMsg\",\n      \"isCommMsgMsg\",\n      \"isCommCloseMsg\",\n    ];\n\n    it(\"should export KernelMessage\", () => {\n      expect(services.KernelMessage).toBeDefined();\n    });\n\n    for (const method of expectedMethods) {\n      it(`should provide KernelMessage.${method}()`, () => {\n        expect(typeof services.KernelMessage[method]).toBe(\"function\");\n      });\n    }\n  });\n});\n\n// ---------------------------------------------------------------------------\n// 2. Internal modules used by the kernel bridge\n// ---------------------------------------------------------------------------\n\ndescribe(\"@jupyterlab/services internal modules\", () => {\n  it(\"should expose the serialize module\", () => {\n    const serialize = require(\"@jupyterlab/services/lib/kernel/serialize\");\n    expect(serialize).toBeDefined();\n    expect(typeof serialize.serialize).toBe(\"function\");\n    expect(typeof serialize.deserialize).toBe(\"function\");\n  });\n\n  it(\"should expose the nonSerializingKernel module (generated by postInstall)\", () => {\n    const nonSerializingKernel = require(\"@jupyterlab/services/lib/kernel/nonSerializingKernel\");\n    expect(nonSerializingKernel).toBeDefined();\n    expect(nonSerializingKernel.KernelConnection).toBeDefined();\n  });\n});\n\n// ---------------------------------------------------------------------------\n// 3. postInstall kernel patching\n// ---------------------------------------------------------------------------\n\ndescribe(\"postInstall kernel patching\", () => {\n  const kernelDir = path.join(\n    __dirname,\n    \"..\",\n    \"..\",\n    \"..\",\n    \"node_modules\",\n    \"@jupyterlab\",\n    \"services\",\n    \"lib\",\n    \"kernel\",\n  );\n  const defaultKernelPath = path.join(kernelDir, \"default.js\");\n  const nonSerializingPath = path.join(kernelDir, \"nonSerializingKernel.js\");\n\n  it(\"default.js should exist\", () => {\n    expect(fs.existsSync(defaultKernelPath)).toBe(true);\n  });\n\n  it(\"nonSerializingKernel.js should exist after postInstall\", () => {\n    expect(fs.existsSync(nonSerializingPath)).toBe(true);\n  });\n\n  it(\"nonSerializingKernel.js should have serialization stripped\", () => {\n    const contents = fs.readFileSync(nonSerializingPath, \"utf8\");\n    // serverSettings.serializer calls should be replaced with pass-through\n    expect(contents).not.toContain(\"this.serverSettings.serializer.serialize(\");\n    expect(contents).not.toContain(\n      \"this.serverSettings.serializer.deserialize(\",\n    );\n  });\n});\n"
  },
  {
    "path": "src/test/suite/macroDefinitionProvider.test.ts",
    "content": "import type { MacroMetaMap } from \"@altimateai/dbt-integration\";\nimport { afterEach, beforeEach, describe, expect, it } from \"@jest/globals\";\nimport { DBTProjectContainer } from \"../../dbt_client/dbtProjectContainer\";\nimport { ManifestCacheChangedEvent } from \"../../dbt_client/event/manifestCacheChangedEvent\";\nimport { MacroDefinitionProvider } from \"../../definition_provider/macroDefinitionProvider\";\nimport { TelemetryService } from \"../../telemetry\";\n\n// A minimal text document mock tailored for MacroDefinitionProvider.\n// The provider only touches lineAt(position).text, getWordRangeAtPosition,\n// getText(range), and uri. It also calls isEnclosedWithinCodeBlock which\n// scans lineAt(i).text for '{'/'}' — wrapping each snippet in a jinja\n// statement block ({{ ... }}) is enough to satisfy that check.\n// The range is returned as a plain `{ start, end }` object because the\n// vscode mock's `Position` / `Range` are jest.fn() impls and we don't want\n// the `instanceof Position` check in isEnclosedWithinCodeBlock to match.\nconst createMockDocument = (line: string, word: string) => {\n  const character = line.indexOf(word);\n  if (character === -1) {\n    throw new Error(`word \"${word}\" not found in line: ${line}`);\n  }\n  const range = {\n    start: { line: 0, character },\n    end: { line: 0, character: character + word.length },\n  };\n  return {\n    uri: { fsPath: \"/workspace/project/macros/call_toto.sql\" } as any,\n    lineAt: (_pos: any) => ({ text: line }),\n    lineCount: 1,\n    getWordRangeAtPosition: (_pos: any, _regex: RegExp) => range,\n    getText: (_range: any) => word,\n  } as any;\n};\n\ndescribe(\"MacroDefinitionProvider — issue #1754\", () => {\n  const PROJECT_ROOT = \"/workspace/project\";\n  let mockContainer: jest.Mocked<DBTProjectContainer>;\n  let mockTelemetry: jest.Mocked<TelemetryService>;\n  let manifestHandlers: Array<(event: ManifestCacheChangedEvent) => void>;\n  let provider: MacroDefinitionProvider;\n\n  const fireManifest = (macroMetaMap: MacroMetaMap) => {\n    const event: ManifestCacheChangedEvent = {\n      added: [\n        {\n          project: {\n            projectRoot: { fsPath: PROJECT_ROOT } as any,\n          } as any,\n          macroMetaMap,\n        } as any,\n      ],\n      removed: undefined,\n    } as any;\n    for (const handler of manifestHandlers) {\n      handler(event);\n    }\n  };\n\n  beforeEach(() => {\n    manifestHandlers = [];\n    mockContainer = {\n      onManifestChanged: (handler: any) => {\n        manifestHandlers.push(handler);\n        return { dispose: jest.fn() };\n      },\n      getPackageName: jest.fn(),\n      getProjectRootpath: jest.fn().mockReturnValue({ fsPath: PROJECT_ROOT }),\n    } as any;\n\n    mockTelemetry = {\n      sendTelemetryEvent: jest.fn(),\n    } as any;\n\n    provider = new MacroDefinitionProvider(mockContainer, mockTelemetry);\n  });\n\n  afterEach(() => {\n    jest.clearAllMocks();\n  });\n\n  const ownProjectMacro = {\n    path: \"/workspace/project/macros/log_toto.sql\",\n    line: 0,\n    character: 10,\n    unique_id: \"macro.jaffle_shop.log_toto\",\n    name: \"log_toto\",\n    description: \"\",\n    arguments: [],\n    depends_on: { macros: [] },\n  };\n\n  const dbtUtilsMacro = {\n    path: \"/workspace/project/dbt_packages/dbt_utils/macros/pivot.sql\",\n    line: 3,\n    character: 10,\n    unique_id: \"macro.dbt_utils.pivot\",\n    name: \"pivot\",\n    description: \"\",\n    arguments: [],\n    depends_on: { macros: [] },\n  };\n\n  it(\"resolves an unprefixed macro call inside the current project (existing behavior)\", async () => {\n    const map: MacroMetaMap = new Map();\n    // Current-project macros are keyed by bare name — see macroParser.ts.\n    map.set(\"log_toto\", ownProjectMacro as any);\n    fireManifest(map);\n\n    // packageName is undefined for files inside the current project (only\n    // returns a string when the file lives under dbt_packages/).\n    (mockContainer.getPackageName as jest.Mock).mockReturnValue(undefined);\n\n    const document = createMockDocument(\"    {{ log_toto() }}\", \"log_toto\");\n    const result: any = await provider.provideDefinition(document, {\n      line: 0,\n      character: 10,\n    } as any);\n\n    expect(result).toBeDefined();\n    expect(result.uri.fsPath).toBe(ownProjectMacro.path);\n    expect(result.range.line).toBe(0);\n    expect(mockTelemetry.sendTelemetryEvent).toHaveBeenCalledWith(\n      \"provideMacroDefinition\",\n    );\n  });\n\n  it(\"resolves <current_project>.<macro> self-prefixed calls (issue #1754)\", async () => {\n    const map: MacroMetaMap = new Map();\n    map.set(\"log_toto\", ownProjectMacro as any);\n    fireManifest(map);\n\n    (mockContainer.getPackageName as jest.Mock).mockReturnValue(undefined);\n\n    const document = createMockDocument(\n      \"    {{ jaffle_shop.log_toto() }}\",\n      \"jaffle_shop.log_toto\",\n    );\n    const result: any = await provider.provideDefinition(document, {\n      line: 0,\n      character: 15,\n    } as any);\n\n    expect(result).toBeDefined();\n    expect(result.uri.fsPath).toBe(ownProjectMacro.path);\n    expect(mockTelemetry.sendTelemetryEvent).toHaveBeenCalledWith(\n      \"provideMacroDefinition\",\n    );\n  });\n\n  it(\"resolves cross-package <other_pkg>.<macro> calls\", async () => {\n    const map: MacroMetaMap = new Map();\n    map.set(\"log_toto\", ownProjectMacro as any);\n    // Cross-package macros are keyed as `<pkg>.<name>` — see macroParser.ts.\n    map.set(\"dbt_utils.pivot\", dbtUtilsMacro as any);\n    fireManifest(map);\n\n    (mockContainer.getPackageName as jest.Mock).mockReturnValue(undefined);\n\n    const document = createMockDocument(\n      \"    {{ dbt_utils.pivot() }}\",\n      \"dbt_utils.pivot\",\n    );\n    const result: any = await provider.provideDefinition(document, {\n      line: 0,\n      character: 10,\n    } as any);\n\n    expect(result).toBeDefined();\n    expect(result.uri.fsPath).toBe(dbtUtilsMacro.path);\n    expect(result.range.line).toBe(3);\n  });\n\n  it(\"returns undefined for unknown macros without touching telemetry\", async () => {\n    fireManifest(new Map());\n\n    (mockContainer.getPackageName as jest.Mock).mockReturnValue(undefined);\n\n    const document = createMockDocument(\n      \"    {{ unknown_macro() }}\",\n      \"unknown_macro\",\n    );\n    const result = await provider.provideDefinition(document, {\n      line: 0,\n      character: 10,\n    } as any);\n\n    expect(result).toBeUndefined();\n    expect(mockTelemetry.sendTelemetryEvent).not.toHaveBeenCalled();\n  });\n\n  it(\"resolves unprefixed calls from inside an installed package (preserves existing behavior)\", async () => {\n    const map: MacroMetaMap = new Map();\n    map.set(\"dbt_utils.pivot\", dbtUtilsMacro as any);\n    fireManifest(map);\n\n    // Files inside dbt_packages/dbt_utils/... report packageName = \"dbt_utils\"\n    (mockContainer.getPackageName as jest.Mock).mockReturnValue(\"dbt_utils\");\n\n    const document = createMockDocument(\"    {{ pivot() }}\", \"pivot\");\n    const result: any = await provider.provideDefinition(document, {\n      line: 0,\n      character: 9,\n    } as any);\n\n    expect(result).toBeDefined();\n    expect(result.uri.fsPath).toBe(dbtUtilsMacro.path);\n  });\n});\n"
  },
  {
    "path": "src/test/suite/mcpSchemaCompat.test.ts",
    "content": "import { describe, expect, it } from \"@jest/globals\";\nimport { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\n\n/**\n * Validates that MCP tool schemas produced by toToolInput() are compatible\n * with Gemini's tool-calling API constraints.\n *\n * Gemini rejects schemas that contain:\n * - `$schema` meta-field\n * - Non-standard `format` values\n * - `additionalProperties: true` without explicit property definitions\n *\n * Issue: https://github.com/AltimateAI/vscode-dbt-power-user/issues/1643\n */\n\nconst zodToJsonSchemaAny = zodToJsonSchema as (\n  schema: unknown,\n  options?: unknown,\n) => Record<string, unknown>;\n\n// Mirror the toToolInput helper from server.ts\nfunction toToolInput(schema: z.ZodType): Record<string, unknown> {\n  return zodToJsonSchemaAny(schema, { target: \"openApi3\" });\n}\n\n// Reproduce all schemas from server.ts\nconst BaseSchema = z.object({});\nconst BaseProjectRootSchema = BaseSchema.extend({ projectRoot: z.string() });\nconst schemas: Record<string, z.ZodType> = {\n  get_best_practices: BaseSchema,\n  get_projects: BaseSchema,\n  get_columns_of_model: BaseProjectRootSchema.extend({\n    modelName: z.string(),\n  }),\n  get_columns_of_source: BaseProjectRootSchema.extend({\n    sourceName: z.string(),\n    tableName: z.string(),\n  }),\n  get_column_values: BaseProjectRootSchema.extend({\n    model: z.string(),\n    column: z.string(),\n  }),\n  execute_sql: BaseProjectRootSchema.extend({\n    query: z.string(),\n    modelName: z.string(),\n  }),\n  compile_model: BaseProjectRootSchema.extend({ modelName: z.string() }),\n  compile_query: BaseProjectRootSchema.extend({\n    query: z.string(),\n    originalModelName: z.string().optional(),\n  }),\n  run_model: BaseProjectRootSchema.extend({\n    plusOperatorLeft: z.enum([\"\", \"+\"]),\n    modelName: z.string(),\n    plusOperatorRight: z.enum([\"\", \"+\"]),\n  }),\n  build_model: BaseProjectRootSchema.extend({\n    plusOperatorLeft: z.enum([\"\", \"+\"]),\n    modelName: z.string(),\n    plusOperatorRight: z.enum([\"\", \"+\"]),\n  }),\n  build_project: BaseProjectRootSchema.extend({}),\n  run_test: BaseProjectRootSchema.extend({ testName: z.string() }),\n  run_model_test: BaseProjectRootSchema.extend({ modelName: z.string() }),\n  add_dbt_packages: BaseProjectRootSchema.extend({\n    packages: z.array(z.string()),\n  }),\n  install_deps: BaseProjectRootSchema.extend({}),\n  get_children_models: BaseProjectRootSchema.extend({ table: z.string() }),\n  get_parent_models: BaseProjectRootSchema.extend({ table: z.string() }),\n};\n\ndescribe(\"MCP tool schema Gemini compatibility\", () => {\n  for (const [toolName, schema] of Object.entries(schemas)) {\n    describe(`tool: ${toolName}`, () => {\n      const jsonSchema = toToolInput(schema);\n\n      it(\"should not contain $schema meta-field\", () => {\n        expect(jsonSchema).not.toHaveProperty(\"$schema\");\n      });\n\n      it(\"should have type: object\", () => {\n        expect(jsonSchema).toHaveProperty(\"type\", \"object\");\n      });\n\n      it(\"should have properties field\", () => {\n        expect(jsonSchema).toHaveProperty(\"properties\");\n      });\n\n      it(\"should not have additionalProperties: true\", () => {\n        // additionalProperties: false is fine (and required by Gemini)\n        // additionalProperties: true or missing is rejected\n        if (\"additionalProperties\" in jsonSchema) {\n          expect(jsonSchema.additionalProperties).not.toBe(true);\n        }\n      });\n    });\n  }\n\n  it(\"should validate all 17 tool schemas\", () => {\n    expect(Object.keys(schemas).length).toBe(17);\n  });\n\n  it(\"default zodToJsonSchema DOES include $schema (proving the fix is needed)\", () => {\n    const defaultSchema = zodToJsonSchemaAny(BaseSchema);\n    expect(defaultSchema).toHaveProperty(\"$schema\");\n  });\n});\n"
  },
  {
    "path": "src/test/suite/newLineagePanel.test.ts",
    "content": "import { beforeEach, describe, expect, it, jest } from \"@jest/globals\";\nimport { workspace } from \"vscode\";\nimport { NewLineagePanel } from \"../../webview_provider/newLineagePanel\";\n\ndescribe(\"NewLineagePanel\", () => {\n  let panel: NewLineagePanel;\n  let mockPostMessage: jest.Mock;\n\n  beforeEach(() => {\n    mockPostMessage = jest.fn();\n\n    // Create a minimal instance by bypassing the constructor DI.\n    // We only need the methods under test and the _panel webview stub.\n    panel = Object.create(NewLineagePanel.prototype);\n\n    // Stub the internal webview panel so postMessage is captured.\n    (panel as any)._panel = {\n      webview: { postMessage: mockPostMessage },\n    };\n\n    // Stub dependencies used by getStartingNode / renderStartingNode\n    (panel as any).queryManifestService = {\n      getEventByCurrentProject: jest.fn().mockReturnValue(undefined),\n      getProject: jest.fn().mockReturnValue(undefined),\n    };\n    (panel as any).altimate = { enabled: jest.fn().mockReturnValue(false) };\n    (panel as any).dbtTerminal = {\n      info: jest.fn(),\n      debug: jest.fn(),\n      error: jest.fn(),\n    };\n  });\n\n  describe(\"eventMapChanged\", () => {\n    it(\"should re-render the starting node when the event map updates\", () => {\n      const eventMap = new Map();\n\n      panel.eventMapChanged(eventMap);\n\n      // renderStartingNode posts a \"render\" command to the webview\n      expect(mockPostMessage).toHaveBeenCalledWith(\n        expect.objectContaining({ command: \"render\" }),\n      );\n    });\n\n    it(\"should not throw when panel is not visible\", () => {\n      (panel as any)._panel = undefined;\n      const eventMap = new Map();\n\n      expect(() => panel.eventMapChanged(eventMap)).not.toThrow();\n    });\n  });\n\n  describe(\"getLineageSettings — defaultExpansion cap\", () => {\n    it(\"should cap defaultExpansion at 5 when user sets a higher value\", async () => {\n      const mockConfig = {\n        get: jest\n          .fn<any>()\n          .mockImplementation((key: string, defaultVal: unknown) => {\n            if (key === \"defaultExpansion\") {\n              return 10;\n            }\n            return defaultVal;\n          }),\n      };\n      (workspace.getConfiguration as jest.Mock).mockReturnValue(mockConfig);\n\n      // Call handleCommand with getLineageSettings\n      await (panel as any).handleCommand({\n        command: \"getLineageSettings\",\n        args: {},\n        syncRequestId: \"test-sync-1\",\n      });\n\n      expect(mockPostMessage).toHaveBeenCalledWith(\n        expect.objectContaining({\n          command: \"response\",\n          args: expect.objectContaining({\n            body: expect.objectContaining({\n              defaultExpansion: 5,\n            }),\n          }),\n        }),\n      );\n    });\n\n    it(\"should pass through defaultExpansion when within limit\", async () => {\n      const mockConfig = {\n        get: jest\n          .fn<any>()\n          .mockImplementation((key: string, defaultVal: unknown) => {\n            if (key === \"defaultExpansion\") {\n              return 3;\n            }\n            return defaultVal;\n          }),\n      };\n      (workspace.getConfiguration as jest.Mock).mockReturnValue(mockConfig);\n\n      await (panel as any).handleCommand({\n        command: \"getLineageSettings\",\n        args: {},\n        syncRequestId: \"test-sync-2\",\n      });\n\n      expect(mockPostMessage).toHaveBeenCalledWith(\n        expect.objectContaining({\n          command: \"response\",\n          args: expect.objectContaining({\n            body: expect.objectContaining({\n              defaultExpansion: 3,\n            }),\n          }),\n        }),\n      );\n    });\n\n    it(\"should use default value of 1 when setting is not configured\", async () => {\n      const mockConfig = {\n        get: jest\n          .fn<any>()\n          .mockImplementation((_key: string, defaultVal: unknown) => {\n            return defaultVal;\n          }),\n      };\n      (workspace.getConfiguration as jest.Mock).mockReturnValue(mockConfig);\n\n      await (panel as any).handleCommand({\n        command: \"getLineageSettings\",\n        args: {},\n        syncRequestId: \"test-sync-3\",\n      });\n\n      expect(mockPostMessage).toHaveBeenCalledWith(\n        expect.objectContaining({\n          command: \"response\",\n          args: expect.objectContaining({\n            body: expect.objectContaining({\n              defaultExpansion: 1,\n            }),\n          }),\n        }),\n      );\n    });\n  });\n});\n"
  },
  {
    "path": "src/test/suite/resolveSettingsVariables.test.ts",
    "content": "import { afterEach, beforeEach, describe, expect, it } from \"@jest/globals\";\nimport type { Uri } from \"vscode\";\nimport { resolveSettingsVariables } from \"../../utils\";\n\n// The vscode mock's `Uri` re-imports from \"vscode\" recursively, so construct\n// a minimal shape instead. `resolveSettingsVariables` only reads `.fsPath`.\nconst mockUri = (fsPath: string): Uri => ({ fsPath }) as unknown as Uri;\n\ndescribe(\"resolveSettingsVariables\", () => {\n  const ORIGINAL_ENV = process.env;\n\n  beforeEach(() => {\n    process.env = { ...ORIGINAL_ENV };\n  });\n\n  afterEach(() => {\n    process.env = ORIGINAL_ENV;\n  });\n\n  it(\"resolves a single ${env:VAR} placeholder\", () => {\n    process.env.FOO = \"hello\";\n    expect(resolveSettingsVariables(\"--vars=${env:FOO}\")).toBe(\"--vars=hello\");\n  });\n\n  it(\"resolves MULTIPLE ${env:VAR} placeholders in one string\", () => {\n    // Regression: the previous implementation used a stateful global regex\n    // with a mutating string, so the second placeholder was skipped.\n    process.env.FOO = \"alpha\";\n    process.env.BAR = \"beta\";\n    expect(resolveSettingsVariables(\"--vars='a=${env:FOO},b=${env:BAR}'\")).toBe(\n      \"--vars='a=alpha,b=beta'\",\n    );\n  });\n\n  it(\"resolves repeated occurrences of the same ${env:VAR}\", () => {\n    process.env.FOO = \"x\";\n    expect(resolveSettingsVariables(\"${env:FOO}/${env:FOO}\")).toBe(\"x/x\");\n  });\n\n  it(\"leaves unresolved ${env:VAR} placeholders untouched\", () => {\n    delete process.env.NOT_SET;\n    expect(resolveSettingsVariables(\"before ${env:NOT_SET} after\")).toBe(\n      \"before ${env:NOT_SET} after\",\n    );\n  });\n\n  it(\"treats env values containing $ characters as literal\", () => {\n    // Regression: passing a raw value to String.replace() causes patterns\n    // like `$1`, `$&`, `$$` to be interpreted as backreferences, silently\n    // corrupting paths like `/home/$USER/project`.\n    process.env.WEIRD = \"/home/$USER/$1/$&\";\n    expect(resolveSettingsVariables(\"path=${env:WEIRD}\")).toBe(\n      \"path=/home/$USER/$1/$&\",\n    );\n  });\n\n  it(\"resolves ${workspaceFolder} using the provided Uri\", () => {\n    const folder = mockUri(\"/workspace/project\");\n    expect(resolveSettingsVariables(\"${workspaceFolder}/models\", folder)).toBe(\n      \"/workspace/project/models\",\n    );\n  });\n\n  it(\"treats workspace folder paths containing $ characters as literal\", () => {\n    // Windows paths can legitimately contain `$` (e.g. hidden admin shares).\n    const folder = mockUri(\"/weird/$1/path\");\n    expect(resolveSettingsVariables(\"${workspaceFolder}/models\", folder)).toBe(\n      \"/weird/$1/path/models\",\n    );\n  });\n\n  it(\"handles mixed ${env:VAR} and ${workspaceFolder} substitutions\", () => {\n    process.env.PROFILE = \"dev\";\n    const folder = mockUri(\"/ws\");\n    expect(\n      resolveSettingsVariables(\n        \"--profile ${env:PROFILE} --project-dir ${workspaceFolder}\",\n        folder,\n      ),\n    ).toBe(\"--profile dev --project-dir /ws\");\n  });\n\n  it(\"returns empty string unchanged\", () => {\n    expect(resolveSettingsVariables(\"\")).toBe(\"\");\n  });\n});\n"
  },
  {
    "path": "src/test/suite/runHistoryService.test.ts",
    "content": "import {\n  afterEach,\n  beforeEach,\n  describe,\n  expect,\n  it,\n  jest,\n} from \"@jest/globals\";\nimport { RunHistoryService } from \"../../services/runHistoryService\";\nimport { createEntry } from \"../fixtures/runHistory\";\n\ndescribe(\"RunHistoryService\", () => {\n  let service: RunHistoryService;\n\n  beforeEach(() => {\n    service = new RunHistoryService();\n  });\n\n  afterEach(() => {\n    service.dispose();\n    jest.clearAllMocks();\n  });\n\n  describe(\"addEntry\", () => {\n    it(\"should store the entry and return it\", () => {\n      const entry = createEntry({ id: \"test-123\", command: \"dbt run\" });\n\n      const result = service.addEntry(entry);\n\n      expect(result).toBe(entry);\n      expect(result.id).toBe(\"test-123\");\n    });\n\n    it(\"should add new runs at the beginning of history\", () => {\n      service.addEntry(createEntry({ id: \"first\", command: \"dbt run\" }));\n      service.addEntry(createEntry({ id: \"second\", command: \"dbt build\" }));\n\n      const entries = service.entries;\n      expect(entries[0].id).toBe(\"second\");\n      expect(entries[1].id).toBe(\"first\");\n    });\n\n    it(\"should fire onHistoryChanged event when entry is added\", () => {\n      const listener = jest.fn();\n      service.onHistoryChanged(listener);\n\n      const entry = createEntry({ id: \"test-invocation\", command: \"dbt run\" });\n      service.addEntry(entry);\n\n      expect(listener).toHaveBeenCalledTimes(1);\n      expect(listener).toHaveBeenCalledWith(\n        expect.objectContaining({ id: \"test-invocation\" }),\n      );\n    });\n\n    it(\"should cap history at MAX_ENTRIES\", () => {\n      for (let i = 0; i < 55; i++) {\n        service.addEntry(\n          createEntry({\n            id: `run-${i}`,\n            command: \"dbt run\",\n            args: [`model_${i}`],\n          }),\n        );\n      }\n\n      expect(service.entries).toHaveLength(50);\n      expect(service.entries[0].id).toBe(\"run-54\");\n      expect(service.entries[49].id).toBe(\"run-5\");\n    });\n  });\n\n  describe(\"deduplication\", () => {\n    it(\"should deduplicate by invocation ID (fs.watch double-fire guard)\", () => {\n      service.addEntry(\n        createEntry({\n          id: \"inv-1\",\n          command: \"dbt build\",\n          args: [\"my_model\"],\n          elapsedTime: 1.0,\n        }),\n      );\n      service.addEntry(\n        createEntry({\n          id: \"inv-1\",\n          command: \"dbt build\",\n          args: [\"my_model\"],\n          elapsedTime: 1.0,\n        }),\n      );\n\n      expect(service.entries).toHaveLength(1);\n    });\n\n    it(\"should keep separate entries for same command with different invocation IDs\", () => {\n      service.addEntry(\n        createEntry({\n          id: \"inv-1\",\n          command: \"dbt build\",\n          args: [\"my_model\"],\n          elapsedTime: 1.0,\n        }),\n      );\n      service.addEntry(\n        createEntry({\n          id: \"inv-2\",\n          command: \"dbt build\",\n          args: [\"my_model\"],\n          elapsedTime: 2.0,\n        }),\n      );\n\n      expect(service.entries).toHaveLength(2);\n      expect(service.entries[0].id).toBe(\"inv-2\");\n      expect(service.entries[0].elapsedTime).toBe(2.0);\n      expect(service.entries[1].id).toBe(\"inv-1\");\n      expect(service.entries[1].elapsedTime).toBe(1.0);\n    });\n\n    it(\"should keep separate entries for different commands\", () => {\n      service.addEntry(\n        createEntry({ id: \"inv-1\", command: \"dbt run\", args: [\"my_model\"] }),\n      );\n      service.addEntry(\n        createEntry({ id: \"inv-2\", command: \"dbt build\", args: [\"my_model\"] }),\n      );\n\n      expect(service.entries).toHaveLength(2);\n    });\n\n    it(\"should update in place when same invocation ID is added again\", () => {\n      service.addEntry(\n        createEntry({ id: \"inv-1\", command: \"dbt run\", args: [\"model_a\"] }),\n      );\n      service.addEntry(\n        createEntry({ id: \"inv-2\", command: \"dbt build\", args: [\"model_b\"] }),\n      );\n      service.addEntry(\n        createEntry({\n          id: \"inv-1\",\n          command: \"dbt run\",\n          args: [\"model_a\"],\n          elapsedTime: 9.0,\n        }),\n      );\n\n      expect(service.entries).toHaveLength(2);\n      // Position preserved: inv-2 at [0], inv-1 (updated) at [1]\n      expect(service.entries[0].id).toBe(\"inv-2\");\n      expect(service.entries[1].id).toBe(\"inv-1\");\n      expect(service.entries[1].elapsedTime).toBe(9.0);\n    });\n\n    it(\"should fire event for deduplicated entries\", () => {\n      const listener = jest.fn();\n      service.onHistoryChanged(listener);\n\n      service.addEntry(\n        createEntry({ id: \"inv-1\", command: \"dbt build\", args: [\"my_model\"] }),\n      );\n      service.addEntry(\n        createEntry({\n          id: \"inv-1\",\n          command: \"dbt build\",\n          args: [\"my_model\"],\n          elapsedTime: 5.0,\n        }),\n      );\n\n      expect(listener).toHaveBeenCalledTimes(2);\n      expect(listener).toHaveBeenLastCalledWith(\n        expect.objectContaining({ id: \"inv-1\", elapsedTime: 5.0 }),\n      );\n    });\n  });\n\n  describe(\"clear\", () => {\n    it(\"should remove all entries\", () => {\n      service.addEntry(createEntry({ id: \"inv-1\", command: \"dbt run\" }));\n      service.addEntry(createEntry({ id: \"inv-2\", command: \"dbt build\" }));\n\n      service.clear();\n\n      expect(service.entries).toEqual([]);\n    });\n\n    it(\"should fire onHistoryChanged with undefined\", () => {\n      service.addEntry(createEntry({ id: \"inv-1\", command: \"dbt run\" }));\n      const listener = jest.fn();\n      service.onHistoryChanged(listener);\n\n      service.clear();\n\n      expect(listener).toHaveBeenCalledTimes(1);\n      expect(listener).toHaveBeenCalledWith(undefined);\n    });\n\n    it(\"should be safe to call on empty history\", () => {\n      expect(() => service.clear()).not.toThrow();\n      expect(service.entries).toEqual([]);\n    });\n\n    it(\"should allow adding entries after clearing\", () => {\n      service.addEntry(createEntry({ id: \"inv-1\", command: \"dbt run\" }));\n      service.clear();\n      service.addEntry(createEntry({ id: \"inv-2\", command: \"dbt build\" }));\n\n      expect(service.entries).toHaveLength(1);\n      expect(service.entries[0].id).toBe(\"inv-2\");\n    });\n  });\n\n  describe(\"entries\", () => {\n    it(\"should return empty array when no runs added\", () => {\n      expect(service.entries).toEqual([]);\n    });\n  });\n\n  describe(\"dispose\", () => {\n    it(\"should dispose without throwing\", () => {\n      expect(() => service.dispose()).not.toThrow();\n    });\n  });\n});\n"
  },
  {
    "path": "src/test/suite/runHistoryTreeItems.test.ts",
    "content": "import { describe, expect, it } from \"@jest/globals\";\nimport { TreeItemCollapsibleState } from \"vscode\";\nimport {\n  getStatusIcon,\n  ResultTreeItem,\n  RunTreeItem,\n} from \"../../treeview_provider/runHistoryTreeItems\";\nimport {\n  createEntry,\n  createResult,\n  createTestResult,\n} from \"../fixtures/runHistory\";\n\ndescribe(\"RunHistoryTreeItems\", () => {\n  describe(\"RunTreeItem\", () => {\n    it(\"should use entry.command as label\", () => {\n      const item = new RunTreeItem(\n        createEntry({ command: \"dbt build --select +my_model+\" }),\n      );\n      expect(item.label).toBe(\"dbt build --select +my_model+\");\n    });\n\n    it(\"should show command without flags\", () => {\n      const item = new RunTreeItem(createEntry({ command: \"dbt build\" }));\n      expect(item.label).toBe(\"dbt build\");\n    });\n\n    it(\"should be collapsed by default when results exist\", () => {\n      const item = new RunTreeItem(\n        createEntry({ command: \"dbt run\", results: [createResult()] }),\n      );\n      expect(item.collapsibleState).toBe(TreeItemCollapsibleState.Collapsed);\n    });\n\n    it(\"should be None when results are empty regardless of run count\", () => {\n      const item = new RunTreeItem(\n        createEntry({ command: \"dbt run\", results: [] }),\n      );\n      expect(item.collapsibleState).toBe(TreeItemCollapsibleState.None);\n    });\n\n    it(\"should show project name, duration, and pass count in description\", () => {\n      const allPass = new RunTreeItem(\n        createEntry({\n          command: \"dbt run\",\n          projectName: \"jaffle_shop\",\n          elapsedTime: 5.5,\n          results: [\n            createResult(),\n            createResult({ name: \"m2\", uniqueId: \"model.p.m2\" }),\n          ],\n        }),\n      );\n      const someFail = new RunTreeItem(\n        createEntry({\n          command: \"dbt run\",\n          projectName: \"analytics\",\n          results: [\n            createResult({ status: \"success\" }),\n            createResult({\n              name: \"m2\",\n              uniqueId: \"model.p.m2\",\n              status: \"error\",\n            }),\n          ],\n        }),\n      );\n\n      expect(allPass.description).toContain(\"jaffle_shop\");\n      expect(allPass.description).toContain(\"5.50s\");\n      expect(allPass.description).toContain(\"2 passed\");\n      expect(someFail.description).toContain(\"analytics\");\n      expect(someFail.description).toContain(\"1/2 passed\");\n    });\n\n    it(\"should include project name in description\", () => {\n      const item = new RunTreeItem(\n        createEntry({\n          command: \"dbt run\",\n          projectName: \"my_dbt_project\",\n          elapsedTime: 1.0,\n          results: [createResult()],\n        }),\n      );\n      expect(item.description).toBe(\"my_dbt_project • 1.00s • 1 passed\");\n    });\n\n    it(\"should use pass icon when all results succeed\", () => {\n      const item = new RunTreeItem(\n        createEntry({\n          command: \"dbt run\",\n          results: [createResult({ status: \"success\" })],\n        }),\n      );\n      expect((item.iconPath as any).id).toBe(\"pass\");\n    });\n\n    it(\"should use error icon when any result has error\", () => {\n      const item = new RunTreeItem(\n        createEntry({\n          command: \"dbt run\",\n          results: [createResult({ status: \"error\" })],\n        }),\n      );\n      expect((item.iconPath as any).id).toBe(\"error\");\n    });\n\n    it(\"should use skip icon when results are empty (no matches)\", () => {\n      const item = new RunTreeItem(\n        createEntry({ command: \"dbt run\", results: [] }),\n      );\n      expect((item.iconPath as any).id).toBe(\"debug-step-over\");\n      expect((item.iconPath as any).color.id).toBe(\"disabledForeground\");\n    });\n\n    it(\"should show 'no matches' in description when results are empty\", () => {\n      const item = new RunTreeItem(\n        createEntry({\n          command: \"dbt run\",\n          projectName: \"jaffle_shop\",\n          elapsedTime: 0,\n          results: [],\n        }),\n      );\n      expect(item.description).toBe(\"jaffle_shop • 0.00s • no matches\");\n    });\n\n    it(\"should use warning icon when results have warns but no errors\", () => {\n      const item = new RunTreeItem(\n        createEntry({\n          command: \"dbt run\",\n          results: [\n            createResult({ status: \"success\" }),\n            createResult({\n              name: \"m2\",\n              uniqueId: \"model.p.m2\",\n              status: \"warn\",\n            }),\n          ],\n        }),\n      );\n      expect((item.iconPath as any).id).toBe(\"warning\");\n      expect((item.iconPath as any).color.id).toBe(\"charts.yellow\");\n    });\n\n    it(\"should include project, duration, and invocation in tooltip\", () => {\n      const item = new RunTreeItem(\n        createEntry({\n          command: \"dbt run\",\n          projectName: \"my-project\",\n          elapsedTime: 12.34,\n          id: \"abc-123\",\n        }),\n      );\n\n      expect(item.tooltip).toContain(\"Project: my-project\");\n      expect(item.tooltip).toContain(\"Duration: 12.34s\");\n      expect(item.tooltip).toContain(\"Invocation: abc-123\");\n    });\n\n    it(\"should handle completedAt as a string (JSON deserialization)\", () => {\n      const item = new RunTreeItem(\n        createEntry({\n          command: \"dbt run\",\n          completedAt: \"2024-01-15T10:30:00.000Z\" as unknown as Date,\n        }),\n      );\n\n      expect(item.tooltip).toContain(\"Completed:\");\n    });\n\n    it(\"should have runHistoryEntry contextValue\", () => {\n      expect(\n        new RunTreeItem(createEntry({ command: \"dbt run\" })).contextValue,\n      ).toBe(\"runHistoryEntry\");\n    });\n  });\n\n  describe(\"ResultTreeItem\", () => {\n    it(\"should use model name as label with None collapsibleState\", () => {\n      const item = new ResultTreeItem(createResult({ name: \"stg_customers\" }));\n\n      expect(item.label).toBe(\"stg_customers\");\n      expect(item.collapsibleState).toBe(TreeItemCollapsibleState.None);\n    });\n\n    it(\"should display friendly test name instead of UUID\", () => {\n      const item = new ResultTreeItem(createTestResult());\n\n      expect(item.label).toBe(\"not_null_orders_order_id\");\n    });\n\n    it(\"should handle test uniqueId with compound test name\", () => {\n      const item = new ResultTreeItem(\n        createTestResult({\n          uniqueId:\n            \"test.my_project.accepted_values_orders_status.abc123def456\",\n        }),\n      );\n\n      expect(item.label).toBe(\"accepted_values_orders_status\");\n    });\n\n    it(\"should fall back to name for non-test resources\", () => {\n      const item = new ResultTreeItem(\n        createResult({ name: \"my_model\", resourceType: \"model\" }),\n      );\n\n      expect(item.label).toBe(\"my_model\");\n    });\n\n    it(\"should fall back to name for tests with short uniqueId\", () => {\n      const item = new ResultTreeItem(\n        createTestResult({\n          name: \"some_test\",\n          uniqueId: \"test.project\",\n        }),\n      );\n\n      expect(item.label).toBe(\"some_test\");\n    });\n\n    it(\"should include resource type and execution time in description\", () => {\n      const item = new ResultTreeItem(\n        createResult({ resourceType: \"test\", executionTime: 3.45 }),\n      );\n\n      expect(item.description).toContain(\"test\");\n      expect(item.description).toContain(\"3.45s\");\n    });\n\n    it(\"should use check icon for success status\", () => {\n      const item = new ResultTreeItem(createResult({ status: \"success\" }));\n      expect((item.iconPath as any).id).toBe(\"check\");\n    });\n\n    it(\"should use x icon for error status\", () => {\n      const item = new ResultTreeItem(createResult({ status: \"error\" }));\n      expect((item.iconPath as any).id).toBe(\"x\");\n    });\n\n    it(\"should use debug-step-over icon for skipped status\", () => {\n      const item = new ResultTreeItem(createResult({ status: \"skipped\" }));\n      expect((item.iconPath as any).id).toBe(\"debug-step-over\");\n    });\n\n    it(\"should include all fields in tooltip\", () => {\n      const item = new ResultTreeItem(\n        createResult({\n          name: \"my_model\",\n          resourceType: \"seed\",\n          status: \"success\",\n          executionTime: 4.56,\n          message: \"Database error\",\n          uniqueId: \"model.jaffle.customers\",\n        }),\n      );\n\n      expect(item.tooltip).toContain(\"Name: my_model\");\n      expect(item.tooltip).toContain(\"Type: seed\");\n      expect(item.tooltip).toContain(\"Status: success\");\n      expect(item.tooltip).toContain(\"Execution Time: 4.56s\");\n      expect(item.tooltip).toContain(\"Message: Database error\");\n      expect(item.tooltip).toContain(\"Unique ID: model.jaffle.customers\");\n    });\n\n    it(\"should not include message in tooltip when absent\", () => {\n      const item = new ResultTreeItem(createResult({ message: undefined }));\n      expect(item.tooltip).not.toContain(\"Message:\");\n    });\n\n    it.each([\"model\", \"test\", \"seed\", \"snapshot\"] as const)(\n      \"should set contextValue for %s resource type\",\n      (resourceType) => {\n        const item = new ResultTreeItem(createResult({ resourceType }));\n        expect(item.contextValue).toBe(`runHistoryResult.${resourceType}`);\n      },\n    );\n  });\n\n  describe(\"getStatusIcon\", () => {\n    it.each<[string, string, string]>([\n      [\"success\", \"check\", \"charts.green\"],\n      [\"error\", \"x\", \"charts.red\"],\n      [\"warn\", \"warning\", \"charts.yellow\"],\n      [\"skipped\", \"debug-step-over\", \"disabledForeground\"],\n    ])(\n      \"should return correct icon for %s status\",\n      (status, expectedIcon, expectedColor) => {\n        const result = getStatusIcon(status as any);\n        expect(result.icon).toBe(expectedIcon);\n        expect(result.color).toBe(expectedColor);\n      },\n    );\n  });\n});\n"
  },
  {
    "path": "src/test/suite/runHistoryTreeviewProvider.test.ts",
    "content": "import {\n  afterEach,\n  beforeEach,\n  describe,\n  expect,\n  it,\n  jest,\n} from \"@jest/globals\";\nimport { RunHistoryService } from \"../../services/runHistoryService\";\nimport {\n  ResultTreeItem,\n  RunTreeItem,\n} from \"../../treeview_provider/runHistoryTreeItems\";\nimport { RunHistoryTreeviewProvider } from \"../../treeview_provider/runHistoryTreeviewProvider\";\nimport { createEntry, createResult } from \"../fixtures/runHistory\";\n\ndescribe(\"RunHistoryTreeviewProvider\", () => {\n  let service: RunHistoryService;\n  let provider: RunHistoryTreeviewProvider;\n\n  beforeEach(() => {\n    service = new RunHistoryService();\n    provider = new RunHistoryTreeviewProvider(service);\n  });\n\n  afterEach(() => {\n    provider.dispose();\n    service.dispose();\n    jest.clearAllMocks();\n  });\n\n  describe(\"getTreeItem\", () => {\n    it(\"should return the element itself\", () => {\n      const entry = createEntry({ command: \"dbt run\" });\n      service.addEntry(entry);\n      const treeItem = new RunTreeItem(entry);\n\n      expect(provider.getTreeItem(treeItem)).toBe(treeItem);\n    });\n  });\n\n  describe(\"getChildren\", () => {\n    it(\"should return empty array when no history\", () => {\n      expect(provider.getChildren()).toEqual([]);\n    });\n\n    it(\"should return RunTreeItems at root level in reverse chronological order\", () => {\n      service.addEntry(createEntry({ id: \"first\", command: \"dbt run\" }));\n      service.addEntry(\n        createEntry({\n          id: \"second\",\n          command: \"dbt build\",\n          results: [\n            createResult(),\n            createResult({\n              name: \"m2\",\n              uniqueId: \"model.project.m2\",\n              status: \"error\",\n            }),\n          ],\n        }),\n      );\n\n      const rootChildren = provider.getChildren() as RunTreeItem[];\n\n      expect(rootChildren).toHaveLength(2);\n      expect(rootChildren[0].entry.id).toBe(\"second\");\n      expect(rootChildren[1].entry.id).toBe(\"first\");\n    });\n\n    it(\"should return ResultTreeItems for RunTreeItem children\", () => {\n      service.addEntry(\n        createEntry({\n          command: \"dbt run\",\n          results: [\n            createResult(),\n            createResult({\n              name: \"model2\",\n              uniqueId: \"model.project.model2\",\n              status: \"error\",\n              executionTime: 0.5,\n            }),\n          ],\n        }),\n      );\n\n      const runTreeItem = provider.getChildren()[0] as RunTreeItem;\n      const children = provider.getChildren(runTreeItem) as ResultTreeItem[];\n\n      expect(children).toHaveLength(2);\n      expect(children[0].result.name).toBe(\"model1\");\n      expect(children[1].result.name).toBe(\"model2\");\n    });\n\n    it(\"should return empty array for ResultTreeItem children\", () => {\n      service.addEntry(createEntry({ command: \"dbt run\" }));\n\n      const runTreeItem = provider.getChildren()[0] as RunTreeItem;\n      const resultItem = provider.getChildren(runTreeItem)[0] as ResultTreeItem;\n\n      expect(provider.getChildren(resultItem)).toEqual([]);\n    });\n  });\n\n  describe(\"onDidChangeTreeData\", () => {\n    it(\"should fire when history changes\", () => {\n      const listener = jest.fn();\n      provider.onDidChangeTreeData(listener);\n\n      service.addEntry(createEntry({ command: \"dbt run\" }));\n\n      expect(listener).toHaveBeenCalled();\n    });\n  });\n\n  describe(\"dispose\", () => {\n    it(\"should dispose without throwing\", () => {\n      expect(() => provider.dispose()).not.toThrow();\n    });\n  });\n});\n"
  },
  {
    "path": "src/test/suite/runTest.test.ts",
    "content": "import { beforeEach, describe, expect, it, jest } from \"@jest/globals\";\nimport { Uri, window } from \"vscode\";\nimport { RunTest } from \"../../commands/runTest\";\nimport { DBTProjectContainer } from \"../../dbt_client/dbtProjectContainer\";\nimport { ManifestCacheProjectAddedEvent } from \"../../dbt_client/event/manifestCacheChangedEvent\";\nimport { QueryManifestService } from \"../../services/queryManifestService\";\n\n/**\n * Regression tests for issue #1720.\n *\n * `RunTest` classifies active files using the parsed manifest and runs\n * singular data tests via `dbt test --select <test_name>`. The command\n * registrations in `src/commands/index.ts` consult `RunTest` first and\n * delegate to `RunModel` only when the active file is not a singular test.\n * These tests cover the classification + dispatch logic of `RunTest`\n * itself — the command-layer dispatch is exercised by integration testing.\n */\ndescribe(\"RunTest — singular test classification and dispatch\", () => {\n  let mockContainer: jest.Mocked<DBTProjectContainer>;\n  let mockQueryManifestService: jest.Mocked<QueryManifestService>;\n  let runTest: RunTest;\n\n  const singularTestPath =\n    \"/workspace/jaffle/tests/singular_nonnull_orders.sql\";\n  const modelPath = \"/workspace/jaffle/models/marts/orders.sql\";\n\n  const makeEvent = (): ManifestCacheProjectAddedEvent => {\n    const testMetaMap = new Map<string, any>();\n    // Singular test: no test_metadata, path matches file on disk.\n    testMetaMap.set(\"singular_nonnull_orders\", {\n      path: singularTestPath,\n      database: \"db\",\n      schema: \"analytics\",\n      alias: \"singular_nonnull_orders\",\n      raw_sql: \"select * from {{ ref('orders') }} where customer_id is null\",\n      depends_on: { macros: [], nodes: [], sources: [] },\n      unique_id: \"test.jaffle.singular_nonnull_orders\",\n    });\n    // Generic test: has test_metadata, should not match even if path matches\n    // (generic tests live in schema.yml, not .sql files).\n    testMetaMap.set(\"not_null_orders_customer_id\", {\n      path: \"/workspace/jaffle/models/marts/schema.yml\",\n      database: \"db\",\n      schema: \"analytics\",\n      alias: \"not_null_orders_customer_id\",\n      raw_sql: \"\",\n      test_metadata: { name: \"not_null\", kwargs: {} as any },\n      attached_node: \"model.jaffle.orders\",\n      depends_on: { macros: [], nodes: [], sources: [] },\n      unique_id: \"test.jaffle.not_null_orders_customer_id\",\n    });\n\n    return {\n      project: {} as any,\n      nodeMetaMap: new Map() as any,\n      macroMetaMap: new Map() as any,\n      metricMetaMap: new Map() as any,\n      sourceMetaMap: new Map() as any,\n      graphMetaMap: {} as any,\n      testMetaMap: testMetaMap as any,\n      docMetaMap: new Map() as any,\n      exposureMetaMap: new Map() as any,\n      functionMetaMap: new Map() as any,\n      modelDepthMap: new Map() as any,\n    };\n  };\n\n  const setActiveEditor = (fsPath: string | null) => {\n    Object.defineProperty(window, \"activeTextEditor\", {\n      value:\n        fsPath === null\n          ? undefined\n          : {\n              document: {\n                uri: Uri.file(fsPath),\n              },\n            },\n      writable: true,\n      configurable: true,\n    });\n  };\n\n  beforeEach(() => {\n    mockContainer = {\n      runTest: jest.fn(),\n    } as unknown as jest.Mocked<DBTProjectContainer>;\n\n    mockQueryManifestService = {\n      getEventByDocument: jest.fn().mockReturnValue(makeEvent()),\n    } as unknown as jest.Mocked<QueryManifestService>;\n\n    runTest = new RunTest(mockContainer, mockQueryManifestService);\n  });\n\n  describe(\"getSingularTestName\", () => {\n    it(\"returns the test name for a singular test file\", () => {\n      expect(runTest.getSingularTestName(Uri.file(singularTestPath))).toBe(\n        \"singular_nonnull_orders\",\n      );\n    });\n\n    it(\"returns undefined for a regular model file\", () => {\n      expect(runTest.getSingularTestName(Uri.file(modelPath))).toBeUndefined();\n    });\n\n    it(\"returns undefined for a generic test (has test_metadata)\", () => {\n      // Generic tests live in schema.yml; their path would never match a\n      // .sql file the user is editing, but the test_metadata filter is the\n      // authoritative guard.\n      expect(\n        runTest.getSingularTestName(\n          Uri.file(\"/workspace/jaffle/models/marts/schema.yml\"),\n        ),\n      ).toBeUndefined();\n    });\n\n    it(\"returns undefined when the manifest event is missing\", () => {\n      mockQueryManifestService.getEventByDocument = jest\n        .fn()\n        .mockReturnValue(undefined) as any;\n      expect(\n        runTest.getSingularTestName(Uri.file(singularTestPath)),\n      ).toBeUndefined();\n    });\n  });\n\n  describe(\"runSingularTestOnActiveWindowIfApplicable\", () => {\n    it(\"dispatches runTest and returns true for a singular test file\", () => {\n      setActiveEditor(singularTestPath);\n\n      const dispatched = runTest.runSingularTestOnActiveWindowIfApplicable();\n\n      expect(dispatched).toBe(true);\n      expect(mockContainer.runTest).toHaveBeenCalledWith(\n        expect.anything(),\n        \"singular_nonnull_orders\",\n      );\n    });\n\n    it(\"returns false for a regular model file (caller falls back to RunModel)\", () => {\n      setActiveEditor(modelPath);\n\n      const dispatched = runTest.runSingularTestOnActiveWindowIfApplicable();\n\n      expect(dispatched).toBe(false);\n      expect(mockContainer.runTest).not.toHaveBeenCalled();\n    });\n\n    it(\"returns false when there is no active editor\", () => {\n      setActiveEditor(null);\n\n      const dispatched = runTest.runSingularTestOnActiveWindowIfApplicable();\n\n      expect(dispatched).toBe(false);\n      expect(mockContainer.runTest).not.toHaveBeenCalled();\n    });\n\n    it(\"returns false when the manifest has no matching test\", () => {\n      setActiveEditor(singularTestPath);\n      mockQueryManifestService.getEventByDocument = jest\n        .fn()\n        .mockReturnValue(undefined) as any;\n\n      const dispatched = runTest.runSingularTestOnActiveWindowIfApplicable();\n\n      expect(dispatched).toBe(false);\n      expect(mockContainer.runTest).not.toHaveBeenCalled();\n    });\n  });\n});\n"
  },
  {
    "path": "src/test/suite/runTest.ts",
    "content": "import { runTests } from \"@vscode/test-electron\";\nimport * as path from \"path\";\n\nasync function main() {\n  try {\n    // The folder containing the Extension Manifest package.json\n    const extensionDevelopmentPath = path.resolve(__dirname, \"../../../\");\n\n    // The path to test runner\n    const extensionTestsPath = path.resolve(__dirname, \"./index\");\n\n    // Download VS Code, unzip it and run the integration test\n    await runTests({\n      extensionDevelopmentPath,\n      extensionTestsPath,\n      launchArgs: [\"--disable-extensions\"],\n    });\n  } catch (err) {\n    console.error(\"Failed to run tests\", err);\n    process.exit(1);\n  }\n}\n\nmain();\n"
  },
  {
    "path": "src/test/suite/runtimePythonEnvironmentProvider.test.ts",
    "content": "import { beforeEach, describe, expect, it } from \"@jest/globals\";\nimport { Uri, workspace } from \"vscode\";\nimport { PythonEnvironment } from \"../../dbt_client/pythonEnvironment\";\nimport {\n  StaticRuntimePythonEnvironment,\n  VSCodeRuntimePythonEnvironmentProvider,\n} from \"../../dbt_client/runtimePythonEnvironmentProvider\";\n\ndescribe(\"StaticRuntimePythonEnvironment\", () => {\n  let mockVscodeEnvironment: jest.Mocked<\n    Pick<\n      PythonEnvironment,\n      \"pythonPath\" | \"environmentVariables\" | \"getEnvironmentVariables\"\n    >\n  >;\n  let staticEnv: StaticRuntimePythonEnvironment;\n\n  beforeEach(() => {\n    mockVscodeEnvironment = {\n      pythonPath: \"/usr/bin/python3\",\n      environmentVariables: { HOME: \"/home/user\" },\n      getEnvironmentVariables: jest\n        .fn()\n        .mockReturnValue({ HOME: \"/home/user\" }),\n    } as any;\n\n    // Construct without DI — pass mock directly\n    staticEnv = Object.create(StaticRuntimePythonEnvironment.prototype);\n    (staticEnv as any).vscodeEnvironment = mockVscodeEnvironment;\n  });\n\n  it(\"should return pythonPath from vscodeEnvironment\", () => {\n    expect(staticEnv.pythonPath).toBe(\"/usr/bin/python3\");\n  });\n\n  it(\"should resolve workspace folder when path is provided\", () => {\n    const mockFolder = {\n      uri: { fsPath: \"/workspace/project\" },\n      name: \"project\",\n      index: 0,\n    };\n    const folderEnv = { DBT_TARGET: \"dev\" };\n    mockVscodeEnvironment.getEnvironmentVariables.mockReturnValue(folderEnv);\n\n    // Mock workspace.getWorkspaceFolder\n    const originalGetWorkspaceFolder = (workspace as any).getWorkspaceFolder;\n    (workspace as any).getWorkspaceFolder = jest\n      .fn()\n      .mockReturnValue(mockFolder);\n\n    const result = staticEnv.getEnvironmentVariables(\"/workspace/project\");\n\n    expect((workspace as any).getWorkspaceFolder).toHaveBeenCalledWith(\n      Uri.file(\"/workspace/project\"),\n    );\n    expect(mockVscodeEnvironment.getEnvironmentVariables).toHaveBeenCalledWith(\n      mockFolder,\n    );\n    expect(result).toEqual(folderEnv);\n\n    // Restore\n    (workspace as any).getWorkspaceFolder = originalGetWorkspaceFolder;\n  });\n\n  it(\"should fall back to default env when workspacePath is undefined\", () => {\n    const defaultEnv = { HOME: \"/home/user\" };\n    mockVscodeEnvironment.getEnvironmentVariables.mockReturnValue(defaultEnv);\n\n    // Simulate dbt-integration calling without args (before PR #33 lands)\n    const result = (staticEnv as any).getEnvironmentVariables(undefined);\n\n    expect(mockVscodeEnvironment.getEnvironmentVariables).toHaveBeenCalledWith(\n      undefined,\n    );\n    expect(result).toEqual(defaultEnv);\n  });\n\n  it(\"should pass undefined folder when workspace path is not found\", () => {\n    const defaultEnv = { HOME: \"/home/user\" };\n    mockVscodeEnvironment.getEnvironmentVariables.mockReturnValue(defaultEnv);\n\n    const originalGetWorkspaceFolder = (workspace as any).getWorkspaceFolder;\n    (workspace as any).getWorkspaceFolder = jest\n      .fn()\n      .mockReturnValue(undefined);\n\n    const result = staticEnv.getEnvironmentVariables(\"/unknown/path\");\n\n    expect((workspace as any).getWorkspaceFolder).toHaveBeenCalledWith(\n      Uri.file(\"/unknown/path\"),\n    );\n    expect(mockVscodeEnvironment.getEnvironmentVariables).toHaveBeenCalledWith(\n      undefined,\n    );\n    expect(result).toEqual(defaultEnv);\n\n    (workspace as any).getWorkspaceFolder = originalGetWorkspaceFolder;\n  });\n});\n\ndescribe(\"VSCodeRuntimePythonEnvironmentProvider\", () => {\n  let mockVscodeEnvironment: jest.Mocked<\n    Pick<\n      PythonEnvironment,\n      | \"pythonPath\"\n      | \"environmentVariables\"\n      | \"getEnvironmentVariables\"\n      | \"initialize\"\n      | \"onPythonEnvironmentChanged\"\n    >\n  >;\n  let provider: VSCodeRuntimePythonEnvironmentProvider;\n\n  beforeEach(() => {\n    mockVscodeEnvironment = {\n      pythonPath: \"/usr/bin/python3\",\n      environmentVariables: { KEY: \"value\" },\n      getEnvironmentVariables: jest.fn().mockReturnValue({ KEY: \"value\" }),\n      initialize: jest.fn().mockResolvedValue(undefined),\n      onPythonEnvironmentChanged: jest.fn(),\n    } as any;\n\n    // Construct without DI\n    provider = Object.create(VSCodeRuntimePythonEnvironmentProvider.prototype);\n    (provider as any).vscodeEnvironment = mockVscodeEnvironment;\n    (provider as any).callbacks = [];\n  });\n\n  it(\"should return environment with correct pythonPath\", () => {\n    const env = provider.getCurrentEnvironment();\n    expect(env.pythonPath).toBe(\"/usr/bin/python3\");\n  });\n\n  it(\"should return environment with getEnvironmentVariables that resolves workspace paths\", () => {\n    const mockFolder = {\n      uri: { fsPath: \"/workspace/project\" },\n      name: \"project\",\n      index: 0,\n    };\n    const folderEnv = { DBT_TARGET: \"prod\" };\n    mockVscodeEnvironment.getEnvironmentVariables.mockReturnValue(folderEnv);\n\n    const originalGetWorkspaceFolder = (workspace as any).getWorkspaceFolder;\n    (workspace as any).getWorkspaceFolder = jest\n      .fn()\n      .mockReturnValue(mockFolder);\n\n    const env = provider.getCurrentEnvironment();\n    const result = env.getEnvironmentVariables(\"/workspace/project\");\n\n    expect(result).toEqual(folderEnv);\n    expect(mockVscodeEnvironment.getEnvironmentVariables).toHaveBeenCalledWith(\n      mockFolder,\n    );\n\n    (workspace as any).getWorkspaceFolder = originalGetWorkspaceFolder;\n  });\n\n  it(\"should register and unregister change callbacks\", () => {\n    const callback = jest.fn();\n    const unregister = provider.onEnvironmentChanged(callback);\n\n    expect((provider as any).callbacks).toContain(callback);\n\n    unregister();\n    expect((provider as any).callbacks).not.toContain(callback);\n  });\n});\n"
  },
  {
    "path": "src/test/suite/testParser.test.ts",
    "content": "import {\n  DBTProjectIntegrationAdapter,\n  DBTTerminal,\n  TestParser,\n} from \"@altimateai/dbt-integration\";\nimport { beforeEach, describe, expect, it } from \"@jest/globals\";\nimport * as path from \"path\";\nimport { EventEmitter } from \"vscode\";\n\ndescribe(\"TestParser Test Suite\", () => {\n  let testParser: TestParser;\n  let mockAdapter: DBTProjectIntegrationAdapter;\n  let mockTerminal: DBTTerminal;\n\n  beforeEach(() => {\n    // Create a proper mock of DBTTerminal with all required methods\n    mockTerminal = {\n      debug: () => {},\n      log: () => {},\n      error: () => {},\n      warn: () => {},\n      logNewLine: () => {},\n      logLine: () => {},\n      logHorizontalRule: () => {},\n      logBlock: () => {},\n      logError: () => {},\n      logWarning: () => {},\n      logSuccess: () => {},\n      disposables: [],\n      writeEmitter: new EventEmitter<string>(),\n      outputChannel: {\n        append: () => {},\n        appendLine: () => {},\n        clear: () => {},\n        show: () => {},\n      },\n      telemetry: {\n        sendTelemetryEvent: () => {},\n      },\n      onDidWrite: new EventEmitter<string>().event,\n      clear: () => {},\n      show: () => {},\n      dispose: () => {},\n      write: () => {},\n      processQueue: () => Promise.resolve(),\n    } as unknown as DBTTerminal; // Use unknown to force the type cast\n\n    testParser = new TestParser(mockTerminal);\n    mockAdapter = {\n      getProjectRoot: () => \"/mock/project/path\",\n      getProjectName: () => \"mock_project\",\n    } as unknown as DBTProjectIntegrationAdapter;\n  });\n\n  it(\"should handle null/undefined testsMap\", async () => {\n    const result = await testParser.createTestMetaMap([], mockAdapter);\n    expect(result.size).toBe(0);\n  });\n\n  it(\"should parse test metadata correctly\", async () => {\n    const mockTestsMap = [\n      {\n        name: \"test_1\",\n        resource_type: \"test\",\n        raw_sql: \"SELECT * FROM table\",\n        original_file_path: \"tests/test_1.sql\",\n        database: \"test_db\",\n        schema: \"test_schema\",\n        alias: \"test_alias\",\n        column_name: '\"Test Column\"',\n        test_metadata: {\n          name: \"not_null\",\n          kwargs: { column_name: \"test_column\" },\n        },\n        attached_node: \"model.test_model\",\n        depends_on: {\n          macros: [\"macro1\"],\n          nodes: [\"model.test_model\"],\n          sources: [],\n        },\n        unique_id: \"test.test_1\",\n      },\n    ];\n\n    const result = await testParser.createTestMetaMap(\n      mockTestsMap,\n      mockAdapter,\n    );\n    expect(result.size).toBe(1);\n    const testMeta = result.get(\"test_1\");\n    expect(testMeta).toBeTruthy();\n    expect(testMeta?.unique_id).toBe(\"test.test_1\");\n    expect(testMeta?.raw_sql).toBe(\"SELECT * FROM table\");\n    expect(testMeta?.path).toBe(\n      path.join(mockAdapter.getProjectRoot(), \"tests/test_1.sql\"),\n    );\n  });\n\n  it(\"should handle column-level tests correctly\", async () => {\n    const mockTestsMap = [\n      {\n        name: \"not_null_column_test\",\n        resource_type: \"test\",\n        raw_sql: \"SELECT * FROM table WHERE column IS NULL\",\n        original_file_path: \"tests/column_tests.sql\",\n        test_metadata: {\n          name: \"not_null\",\n          kwargs: { column_name: \"test_column\" },\n        },\n        column_name: \"test_column\",\n        attached_node: \"model.test_model\",\n        unique_id: \"test.not_null_column_test\",\n        database: \"test_db\",\n        schema: \"test_schema\",\n        alias: \"test_alias\",\n        depends_on: {\n          macros: [],\n          nodes: [\"model.test_model\"],\n          sources: [],\n        },\n      },\n    ];\n\n    const result = await testParser.createTestMetaMap(\n      mockTestsMap,\n      mockAdapter,\n    );\n    const testMeta = result.get(\"not_null_column_test\");\n    expect(testMeta).toBeTruthy();\n    expect(testMeta?.column_name).toBe(\"test_column\");\n    expect(testMeta?.test_metadata).toBeTruthy();\n    expect(testMeta?.test_metadata?.name).toBe(\"not_null\");\n  });\n\n  it(\"should handle custom test configurations\", async () => {\n    const mockTestsMap = [\n      {\n        name: \"custom_test\",\n        resource_type: \"test\",\n        raw_sql: \"SELECT * FROM table WHERE condition\",\n        original_file_path: \"tests/custom_tests.sql\",\n        test_metadata: {\n          name: \"custom\",\n          kwargs: {\n            column_name: \"test_column\",\n            model: \"test_model\",\n            condition: \"value > 0\",\n            severity: \"warn\",\n          },\n        },\n        attached_node: \"model.test_model\",\n        unique_id: \"test.custom_test\",\n        database: \"test_db\",\n        schema: \"test_schema\",\n        alias: \"test_alias\",\n        depends_on: {\n          macros: [],\n          nodes: [\"model.test_model\"],\n          sources: [],\n        },\n      },\n    ];\n\n    const result = await testParser.createTestMetaMap(\n      mockTestsMap,\n      mockAdapter,\n    );\n    const testMeta = result.get(\"custom_test\");\n    expect(testMeta).toBeTruthy();\n    expect(testMeta?.test_metadata).toBeTruthy();\n    expect(testMeta?.test_metadata?.name).toBe(\"custom\");\n    expect(testMeta?.test_metadata?.kwargs).toEqual({\n      column_name: \"test_column\",\n      model: \"test_model\",\n      condition: \"value > 0\",\n      severity: \"warn\",\n    });\n  });\n\n  it(\"should handle test dependencies correctly\", async () => {\n    const mockTestsMap = [\n      {\n        name: \"dependent_test\",\n        resource_type: \"test\",\n        raw_sql: \"SELECT * FROM {{ ref('other_model') }}\",\n        original_file_path: \"tests/dependent_tests.sql\",\n        test_metadata: {\n          name: \"custom\",\n          kwargs: {\n            column_name: \"test_column\",\n            model: \"test_model\",\n          },\n        },\n        attached_node: \"model.test_model\",\n        unique_id: \"test.dependent_test\",\n        database: \"test_db\",\n        schema: \"test_schema\",\n        alias: \"test_alias\",\n        depends_on: {\n          macros: [],\n          nodes: [\"model.test_model\", \"model.other_model\"],\n          sources: [],\n        },\n      },\n    ];\n\n    const result = await testParser.createTestMetaMap(\n      mockTestsMap,\n      mockAdapter,\n    );\n    const testMeta = result.get(\"dependent_test\");\n    expect(testMeta).toBeTruthy();\n    expect(testMeta?.depends_on).toEqual({\n      macros: [],\n      nodes: [\"model.test_model\", \"model.other_model\"],\n      sources: [],\n    });\n  });\n});\n"
  },
  {
    "path": "src/test/suite/utils.test.ts",
    "content": "import {\n  getExternalProjectNamesFromDbtLoomConfig,\n  NoCredentialsError,\n  RateLimitException,\n} from \"@altimateai/dbt-integration\";\nimport { afterEach, describe, expect, it, jest } from \"@jest/globals\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport { Position, Uri, window, workspace } from \"vscode\";\nimport {\n  arrayEquals,\n  debounce,\n  deepEqual,\n  extendErrorWithSupportLinks,\n  getColumnNameByCase,\n  getColumnTestConfigFromYml,\n  getCurrentlySelectedModelNameInYamlConfig,\n  getFirstWorkspacePath,\n  getFormattedDateTime,\n  getStringSizeInMb,\n  isAcceptedValues,\n  isColumnNameEqual,\n  isEnclosedWithinCodeBlock,\n  isQuotedIdentifier,\n  isRelationship,\n  setupWatcherHandler,\n  stripANSI,\n} from \"../../utils\";\n\ndescribe(\"utils tests\", () => {\n  afterEach(() => {\n    jest.restoreAllMocks();\n  });\n\n  it(\"deepEqual compares nested objects\", () => {\n    const obj1 = { a: 1, b: { c: [1, 2] } };\n    const obj2 = { b: { c: [1, 2] }, a: 1 };\n    const obj3 = { a: 1, b: { c: [2, 1] } };\n    expect(deepEqual(obj1, obj2)).toBe(true);\n    expect(deepEqual(obj1, obj3)).toBe(false);\n  });\n\n  it(\"getStringSizeInMb handles multibyte characters\", () => {\n    const asciiSize = getStringSizeInMb(\"abc\");\n    const multiSize = getStringSizeInMb(\"πππ\");\n    expect(asciiSize).toBeCloseTo(3 / (1024 * 1024));\n    expect(multiSize).toBeCloseTo(6 / (1024 * 1024));\n  });\n\n  it(\"isQuotedIdentifier respects custom regex\", () => {\n    jest.spyOn(workspace, \"getConfiguration\").mockReturnValue({\n      get: (key: string) =>\n        key === \"unquotedCaseInsensitiveIdentifierRegex\"\n          ? \"^[a-z]+$\"\n          : undefined,\n    } as any);\n    expect(isQuotedIdentifier(\"abc\", \"any\")).toBe(false);\n    expect(isQuotedIdentifier(\"ABC\", \"any\")).toBe(true);\n  });\n\n  it(\"getColumnNameByCase and isColumnNameEqual use config\", () => {\n    jest.spyOn(workspace, \"getConfiguration\").mockReturnValue({\n      get: (key: string) => (key === \"showColumnNamesInLowercase\" ? true : \"\"),\n    } as any);\n    expect(getColumnNameByCase(\"TEST\", \"snowflake\")).toBe(\"test\");\n    expect(isColumnNameEqual(\"CoL\", \"col\")).toBe(true);\n  });\n\n  it(\"getFirstWorkspacePath falls back when no workspace\", () => {\n    (workspace.workspaceFolders as any) = undefined;\n    jest.spyOn(Uri, \"file\").mockReturnValue({ fsPath: \"./\" } as any);\n    expect(getFirstWorkspacePath()).toBe(\"./\");\n  });\n\n  it(\"getCurrentlySelectedModelNameInYamlConfig returns model\", () => {\n    const yaml = `models:\\n  - name: model_a\\n  - name: model_b`;\n    const lines = yaml.split(\"\\n\");\n    const document = {\n      languageId: \"yaml\",\n      getText: () => yaml,\n      offsetAt: ({ line, character }: any) =>\n        lines.slice(0, line).join(\"\\n\").length + (line > 0 ? 1 : 0) + character,\n    } as any;\n    (window as any).activeTextEditor = {\n      document,\n      selection: { active: { line: 2, character: 5 } },\n    };\n    expect(getCurrentlySelectedModelNameInYamlConfig()).toBe(\"model_b\");\n  });\n\n  it(\"type guard helpers identify metadata\", () => {\n    const rel = { field: \"id\", to: \"ref\" };\n    const acc = { values: [\"a\", \"b\"] };\n    expect(isRelationship(rel)).toBe(true);\n    expect(isAcceptedValues(rel)).toBe(false);\n    expect(isAcceptedValues(acc)).toBe(true);\n    expect(isRelationship(acc)).toBe(false);\n  });\n\n  it(\"getColumnTestConfigFromYml extracts config\", () => {\n    const tests = [\n      { relationships: { field: \"id\", to: \"ref\" } },\n      { accepted_values: { values: [\"a\", \"b\"] } },\n      { not_null: { severity: \"warn\" } },\n    ];\n    expect(\n      getColumnTestConfigFromYml(\n        tests,\n        { field: \"id\", to: \"ref\" },\n        \"relationships\",\n      ),\n    ).toEqual({ field: \"id\", to: \"ref\" });\n    expect(\n      getColumnTestConfigFromYml(\n        tests,\n        { values: [\"b\", \"a\"] },\n        \"accepted_values\",\n      ),\n    ).toEqual({ values: [\"a\", \"b\"] });\n    expect(\n      getColumnTestConfigFromYml(tests, { severity: \"warn\" }, \"not_null\"),\n    ).toEqual({ not_null: { severity: \"warn\" } });\n  });\n\n  it(\"getExternalProjectNamesFromDbtLoomConfig reads file\", () => {\n    const dir = fs.mkdtempSync(path.join(os.tmpdir(), \"loom-\"));\n    const file = path.join(dir, \"dbt_loom.config.yml\");\n    fs.writeFileSync(file, \"manifests:\\n  - name: proj1\\n  - name: proj2\\n\");\n    const result = getExternalProjectNamesFromDbtLoomConfig(dir);\n    expect(result).toEqual([\"proj1\", \"proj2\"]);\n    fs.rmSync(dir, { recursive: true, force: true });\n  });\n\n  it(\"getExternalProjectNamesFromDbtLoomConfig handles missing file\", () => {\n    const result = getExternalProjectNamesFromDbtLoomConfig(\"/no/such/dir\");\n    expect(result).toBeNull();\n  });\n\n  it(\"setupWatcherHandler wires events\", () => {\n    const watcher = {\n      onDidChange: jest.fn((cb: any) => (cb(), { dispose: jest.fn() })),\n      onDidCreate: jest.fn((cb: any) => (cb(), { dispose: jest.fn() })),\n      onDidDelete: jest.fn((cb: any) => (cb(), { dispose: jest.fn() })),\n    } as any;\n    const handler = jest.fn();\n    const disposables = setupWatcherHandler(watcher, handler);\n    expect(handler).toHaveBeenCalledTimes(3);\n    expect(disposables).toHaveLength(3);\n  });\n\n  it(\"custom exceptions expose properties\", () => {\n    const rl = new RateLimitException(\"msg\", 42);\n    expect(rl.retryAfter).toBe(42);\n    expect(rl).toBeInstanceOf(Error);\n    const nc = new NoCredentialsError(\"missing\");\n    expect(nc).toBeInstanceOf(NoCredentialsError);\n    expect(nc).toBeInstanceOf(Error);\n  });\n\n  it(\"arrayEquals compares arrays regardless of order\", () => {\n    expect(arrayEquals([1, 2], [2, 1])).toBe(true);\n    expect(arrayEquals([1, 2], [1, 2, 3])).toBe(false);\n  });\n\n  it(\"debounce delays execution\", () => {\n    jest.useFakeTimers();\n    const fn = jest.fn();\n    const debounced = debounce(fn as any, 50);\n    debounced();\n    jest.advanceTimersByTime(49);\n    expect(fn).not.toHaveBeenCalled();\n    jest.advanceTimersByTime(1);\n    expect(fn).toHaveBeenCalled();\n    jest.useRealTimers();\n  });\n\n  it(\"extendErrorWithSupportLinks appends link\", () => {\n    const msg = extendErrorWithSupportLinks(\"problem\");\n    expect(msg).toContain(\"contact us\");\n  });\n\n  it(\"stripANSI removes escape codes\", () => {\n    const cleaned = stripANSI(\"\\u001b[31mred\\u001b[0m\");\n    expect(cleaned).toBe(\"red\");\n  });\n\n  it(\"getFormattedDateTime formats date\", () => {\n    const formatted = getFormattedDateTime();\n    expect(formatted).toMatch(/^\\d{2}-\\d{2}-\\d{4}-\\d{2}-\\d{2}-\\d{2}$/);\n  });\n\n  it(\"isEnclosedWithinCodeBlock detects braces\", () => {\n    const lines = [\"{{\", \"ref('model')\", \"}}\", \"other\"];\n    const document = {\n      lineCount: lines.length,\n      lineAt: (i: number) => ({ text: lines[i] }),\n    } as any;\n    const range = { start: new Position(1, 2), end: new Position(1, 5) } as any;\n    expect(isEnclosedWithinCodeBlock(document, range)).toBe(true);\n    const outside = {\n      start: new Position(3, 1),\n      end: new Position(3, 2),\n    } as any;\n    expect(isEnclosedWithinCodeBlock(document, outside)).toBe(false);\n  });\n});\n"
  },
  {
    "path": "src/treeview_provider/index.ts",
    "content": "import { Disposable, window } from \"vscode\";\nimport {\n  ChildrenModelTreeview,\n  DocumentationTreeview,\n  IconActionsTreeview,\n  ModelTestTreeview,\n  ParentModelTreeview,\n} from \"./modelTreeviewProvider\";\nimport { RunHistoryTreeviewProvider } from \"./runHistoryTreeviewProvider\";\n\nexport class TreeviewProviders implements Disposable {\n  private disposables: Disposable[] = [];\n\n  constructor(\n    private childrenModelTreeview: ChildrenModelTreeview,\n    private parentModelTreeview: ParentModelTreeview,\n    private testModelTreeview: ModelTestTreeview,\n    private documentationTreeView: DocumentationTreeview,\n    private iconActionsTreeview: IconActionsTreeview,\n    private runHistoryTreeviewProvider: RunHistoryTreeviewProvider,\n  ) {\n    this.disposables.push(\n      window.registerTreeDataProvider(\n        \"model_test_treeview\",\n        this.testModelTreeview,\n      ),\n      window.registerTreeDataProvider(\n        \"parent_model_treeview\",\n        this.parentModelTreeview,\n      ),\n      window.registerTreeDataProvider(\n        \"children_model_treeview\",\n        this.childrenModelTreeview,\n      ),\n      window.registerTreeDataProvider(\n        \"documentation_treeview\",\n        this.documentationTreeView,\n      ),\n      window.registerTreeDataProvider(\n        \"icon_actions_treeview\",\n        this.iconActionsTreeview,\n      ),\n      window.registerTreeDataProvider(\n        \"run_history_treeview\",\n        this.runHistoryTreeviewProvider,\n      ),\n    );\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/treeview_provider/modelTreeviewProvider.ts",
    "content": "import { unmanaged } from \"inversify\";\nimport { provide } from \"inversify-binding-decorators\";\nimport * as path from \"path\";\n\nimport {\n  GraphMetaMap,\n  NodeData,\n  NodeMetaData,\n  NodeMetaMap,\n} from \"@altimateai/dbt-integration\";\nimport {\n  Command,\n  Disposable,\n  Event,\n  EventEmitter,\n  MarkdownString,\n  ProviderResult,\n  TextDocument,\n  ThemeIcon,\n  TreeDataProvider,\n  TreeItem,\n  TreeItemCollapsibleState,\n  Uri,\n  window,\n} from \"vscode\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport {\n  ManifestCacheChangedEvent,\n  ManifestCacheProjectAddedEvent,\n} from \"../dbt_client/event/manifestCacheChangedEvent\";\nimport {\n  getCurrentlySelectedModelNameInYamlConfig,\n  getDepthColor,\n  removeProtocol,\n} from \"../utils\";\n\ninterface IconPath {\n  light: string;\n  dark: string;\n}\n\nabstract class Node {\n  label: string;\n  key: string;\n  url: string | undefined;\n  iconPath: IconPath = {\n    light: path.join(\n      path.resolve(__dirname),\n      \"../media/images/model_light.svg\",\n    ),\n    dark: path.join(path.resolve(__dirname), \"../media/images/model_dark.svg\"),\n  };\n  displayInModelTree: boolean = true;\n\n  constructor(label: string, key: string, url?: string) {\n    this.label = label;\n    this.key = key;\n    this.url = url;\n  }\n}\n\nclass Model extends Node {}\n\nclass Seed extends Node {}\nclass Test extends Node {\n  // displayInModelTree = false;\n  iconPath = {\n    light: path.join(\n      path.resolve(__dirname),\n      \"../media/images/source_light.svg\",\n    ),\n    dark: path.join(path.resolve(__dirname), \"../media/images/source_dark.svg\"),\n  };\n}\nclass Analysis extends Node {\n  displayInModelTree = true;\n}\nclass Exposure extends Node {\n  displayInModelTree = true;\n}\nclass Function extends Node {\n  displayInModelTree = true;\n}\nclass Metric extends Node {\n  displayInModelTree = false;\n}\n\nclass Snapshot extends Node {}\n\nclass Source extends Node {\n  iconPath = {\n    light: path.join(\n      path.resolve(__dirname),\n      \"../media/images/source_light.svg\",\n    ),\n    dark: path.join(path.resolve(__dirname), \"../media/images/source_dark.svg\"),\n  };\n}\n\n@provide(ModelTreeviewProvider)\nabstract class ModelTreeviewProvider\n  implements TreeDataProvider<NodeTreeItem>, Disposable\n{\n  private eventMap: Map<string, ManifestCacheProjectAddedEvent> = new Map();\n  private _onDidChangeTreeData: EventEmitter<ModelTreeItem | undefined | void> =\n    new EventEmitter<ModelTreeItem | undefined | void>();\n  readonly onDidChangeTreeData: Event<ModelTreeItem | undefined | void> =\n    this._onDidChangeTreeData.event;\n  private disposables: Disposable[] = [this._onDidChangeTreeData];\n\n  constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    @unmanaged() private treeType: keyof GraphMetaMap,\n  ) {\n    this.treeType = treeType;\n    this.disposables.push(\n      window.onDidChangeActiveTextEditor(() => {\n        this._onDidChangeTreeData.fire();\n      }),\n      this.dbtProjectContainer.onManifestChanged((event) =>\n        this.onManifestCacheChanged(event),\n      ),\n      window.onDidChangeTextEditorSelection(() => {\n        this._onDidChangeTreeData.fire();\n      }),\n    );\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n\n  private onManifestCacheChanged(event: ManifestCacheChangedEvent): void {\n    event.added?.forEach((added) => {\n      this.eventMap.set(added.project.projectRoot.fsPath, added);\n    });\n    event.removed?.forEach((removed) => {\n      this.eventMap.delete(removed.projectRoot.fsPath);\n    });\n    this._onDidChangeTreeData.fire();\n  }\n\n  getTreeItem(element: NodeTreeItem): NodeTreeItem | Thenable<ModelTreeItem> {\n    return element;\n  }\n\n  getChildren(element?: NodeTreeItem): Thenable<NodeTreeItem[]> {\n    if (window.activeTextEditor === undefined || this.eventMap === undefined) {\n      return Promise.resolve([]);\n    }\n\n    const currentFilePath = window.activeTextEditor.document.uri;\n    const projectRootpath =\n      this.dbtProjectContainer.getProjectRootpath(currentFilePath);\n    if (projectRootpath === undefined) {\n      return Promise.resolve([]);\n    }\n\n    const event = this.eventMap.get(projectRootpath.fsPath);\n    if (event === undefined) {\n      return Promise.resolve([]);\n    }\n\n    if (element?.key.startsWith(\"test.\")) {\n      return Promise.resolve([]);\n    }\n\n    if (element) {\n      return Promise.resolve(this.getTreeItems(element.key, event));\n    }\n\n    const model = lookupModelByEditorContent(\n      event.nodeMetaMap,\n      window.activeTextEditor.document,\n    );\n    if (!model) {\n      return Promise.resolve([]);\n    }\n    return Promise.resolve(this.getTreeItems(model.unique_id, event));\n  }\n\n  private nodeDataToNode(nodeData: NodeData): Node | undefined {\n    const resourceType = nodeData.resourceType;\n    switch (resourceType) {\n      case \"snapshot\":\n        return new Snapshot(nodeData.label, nodeData.key, nodeData.url);\n      case \"exposure\":\n        return new Exposure(nodeData.label, nodeData.key, nodeData.url);\n      case \"analysis\":\n        return new Analysis(nodeData.label, nodeData.key, nodeData.url);\n      case \"test\":\n        return new Test(nodeData.label, nodeData.key, nodeData.url);\n      case \"source\":\n        return new Source(nodeData.label, nodeData.key, nodeData.url);\n      case \"seed\":\n        return new Seed(nodeData.label, nodeData.key, nodeData.url);\n      case \"semantic_model\":\n        return new Metric(nodeData.label, nodeData.key, nodeData.url);\n      case \"function\":\n        return new Function(nodeData.label, nodeData.key, nodeData.url);\n      case \"model\":\n        return new Model(nodeData.label, nodeData.key, nodeData.url);\n      default:\n        console.log(\n          `Resource Type '${resourceType}' not implemented in ModelTreeviewProvider.nodeDataToNode`,\n        );\n        return undefined;\n    }\n  }\n\n  private getNodeTreeItem(node: Node): NodeTreeItem {\n    if (node instanceof Snapshot) {\n      return new SnapshotTreeItem(node);\n    }\n    if (node instanceof Exposure) {\n      return new ExposureTreeItem(node);\n    }\n    if (node instanceof Analysis) {\n      return new AnalysisTreeItem(node);\n    }\n    if (node instanceof Test) {\n      return new TestTreeItem(node);\n    }\n    if (node instanceof Source) {\n      return new SourceTreeItem(node);\n    }\n    if (node instanceof Seed) {\n      return new SeedTreeItem(node);\n    }\n    if (node instanceof Function) {\n      return new FunctionTreeItem(node);\n    }\n    return new ModelTreeItem(node);\n  }\n\n  private getTreeItems(\n    elementName: string,\n    event: ManifestCacheProjectAddedEvent,\n  ): NodeTreeItem[] {\n    const { graphMetaMap } = event;\n    const parentModels = graphMetaMap[this.treeType].get(elementName);\n    if (parentModels === undefined) {\n      return [];\n    }\n    return parentModels.nodes\n      .flatMap((nodeData) => {\n        const node = this.nodeDataToNode(nodeData);\n        return node && node.displayInModelTree ? [node] : [];\n      })\n      .map((node) => {\n        const childNodes = graphMetaMap[this.treeType]\n          .get(node.key)\n          ?.nodes.map((nodeData) => this.nodeDataToNode(nodeData))\n          .filter((node) => node && node.displayInModelTree);\n\n        const treeItem = this.getNodeTreeItem(node);\n        treeItem.collapsibleState =\n          childNodes?.length !== 0\n            ? TreeItemCollapsibleState.Collapsed\n            : TreeItemCollapsibleState.None;\n\n        // Calculate depth from modelDepthMap\n        const depth = event.modelDepthMap.get(node.key);\n        if (depth !== undefined) {\n          treeItem.setDepth(depth);\n        }\n\n        return treeItem;\n      });\n  }\n}\n\n@provide(DocumentationTreeviewProvider)\nclass DocumentationTreeviewProvider implements TreeDataProvider<DocTreeItem> {\n  private eventMap: Map<string, ManifestCacheProjectAddedEvent> = new Map();\n  private _onDidChangeTreeData: EventEmitter<DocTreeItem | undefined | void> =\n    new EventEmitter<DocTreeItem | undefined | void>();\n  readonly onDidChangeTreeData: Event<DocTreeItem | undefined | void> =\n    this._onDidChangeTreeData.event;\n  private disposables: Disposable[] = [this._onDidChangeTreeData];\n\n  constructor(private dbtProjectContainer: DBTProjectContainer) {\n    this.disposables.push(\n      window.onDidChangeActiveTextEditor(() => {\n        this._onDidChangeTreeData.fire();\n      }),\n      this.dbtProjectContainer.onManifestChanged((event) =>\n        this.onManifestCacheChanged(event),\n      ),\n      window.onDidChangeTextEditorSelection(() => {\n        this._onDidChangeTreeData.fire();\n      }),\n    );\n  }\n\n  private onManifestCacheChanged(event: ManifestCacheChangedEvent): void {\n    event.added?.forEach((added) => {\n      this.eventMap.set(added.project.projectRoot.fsPath, added);\n    });\n    event.removed?.forEach((removed) => {\n      this.eventMap.delete(removed.projectRoot.fsPath);\n    });\n    this._onDidChangeTreeData.fire();\n  }\n\n  getTreeItem(element: DocTreeItem): TreeItem {\n    return {\n      label: element.label,\n      description: element.description,\n      command: element.command,\n      collapsibleState: element.children\n        ? TreeItemCollapsibleState.Expanded\n        : TreeItemCollapsibleState.None,\n    };\n  }\n\n  getChildren(element: DocTreeItem): ProviderResult<DocTreeItem[]> {\n    if (window.activeTextEditor === undefined || this.eventMap === undefined) {\n      return Promise.resolve([]);\n    }\n    const currentFilePath = window.activeTextEditor.document.uri;\n    const projectRootpath =\n      this.dbtProjectContainer.getProjectRootpath(currentFilePath);\n    if (!projectRootpath) {\n      return Promise.resolve([]);\n    }\n    const event = this.eventMap.get(projectRootpath.fsPath);\n\n    if (event === undefined) {\n      return Promise.resolve([]);\n    }\n    const { nodeMetaMap } = event;\n\n    if (!element) {\n      const currentNode = lookupModelByEditorContent(\n        event.nodeMetaMap,\n        window.activeTextEditor.document,\n      );\n\n      if (currentNode === undefined) {\n        return Promise.resolve([]);\n      }\n      const modelName = currentNode.name;\n\n      const children = [];\n\n      if (Object.keys(currentNode.columns).length !== 0) {\n        for (const columnName in currentNode.columns) {\n          if (currentNode.columns.hasOwnProperty(columnName)) {\n            const column = currentNode.columns[columnName];\n            const { description } = column;\n            const child: any = {\n              label: columnName,\n              description,\n            };\n            children.push(child);\n          }\n        }\n        const url =\n          currentNode.patch_path !== null\n            ? path.join(\n                projectRootpath.fsPath,\n                removeProtocol(currentNode.patch_path),\n              )\n            : \" \";\n\n        if (Object.keys(currentNode.columns).length === 0) {\n          window.showWarningMessage(\n            `Documentation View Warning: No columns found in manifest.json for ${modelName}, go edit the documentation in the documentation editor panel and run dbt docs generate`,\n          );\n        }\n        const key = currentNode.unique_id;\n        const label = currentNode.alias;\n        const description = `[ ${currentNode.config.materialized.toUpperCase()} ]  -  schema : ${\n          currentNode.schema\n        }`;\n        const nodeItem = new DocNode(label, key, url, description);\n        const treeItem = new DocTreeItem(nodeItem);\n        treeItem.children = children;\n        return [treeItem];\n      }\n      return [];\n    }\n    return element.children;\n  }\n\n  refresh(): void {\n    this._onDidChangeTreeData.fire();\n  }\n}\n\nclass DocTreeItem extends TreeItem {\n  collapsibleState: TreeItemCollapsibleState =\n    TreeItemCollapsibleState.Collapsed;\n  description: string;\n  children?: DocTreeItem[];\n  command?: Command;\n  constructor(node: DocNode) {\n    super(node.label, TreeItemCollapsibleState.Collapsed);\n    this.description = node.description !== undefined ? node.description : \" \";\n    // this. tooltip = \"test tooltip\" // node.description !== undefined ? node.description : \" \";\n    if (node.url) {\n      this.command = {\n        command: \"vscode.open\",\n        title: \"Open YML\",\n        arguments: [Uri.file(node.url)],\n      };\n    }\n    if (node.iconPath !== undefined) {\n      this.iconPath = {\n        light: Uri.file(node.iconPath.light),\n        dark: Uri.file(node.iconPath.dark),\n      };\n    }\n  }\n}\n\nexport class DocNode extends Node {\n  description: string;\n\n  constructor(label: string, key: string, url: string, description: string) {\n    super(label, key, url);\n    this.description = description;\n  }\n}\n\nexport class NodeTreeItem extends TreeItem {\n  collapsibleState = TreeItemCollapsibleState.Collapsed;\n  key: string;\n  url: string | undefined;\n  depth?: number;\n\n  constructor(node: Node) {\n    super(node.label);\n    this.key = node.key;\n    this.url = node.url;\n    if (node.iconPath !== undefined) {\n      this.iconPath = {\n        light: Uri.file(node.iconPath.light),\n        dark: Uri.file(node.iconPath.dark),\n      };\n    }\n    if (node.url) {\n      this.command = {\n        command: \"vscode.open\",\n        title: \"Select Node\",\n        arguments: [Uri.file(node.url)],\n      };\n    }\n  }\n\n  setDepth(depth: number) {\n    this.depth = depth;\n    const color = getDepthColor(depth);\n    const depthInfo = `(${depth})`;\n    this.description = this.description\n      ? `${this.description} ${depthInfo}`\n      : depthInfo;\n    this.tooltip = new MarkdownString(\n      `**DAG Depth:** <span style=\"color:${color}\">${depth}</span>\\n\\n` +\n        `The longest path of models between a source and this model is ${depth} nodes long.`,\n    );\n    this.tooltip.isTrusted = true;\n    this.tooltip.supportHtml = true;\n  }\n}\n\nexport class ActionTreeItem extends TreeItem {\n  collapsibleState = TreeItemCollapsibleState.Collapsed;\n  children?: ActionTreeItem[];\n  constructor(\n    label: string,\n    icon?: ThemeIcon,\n    command?: Command,\n    tooltip?: string,\n  ) {\n    super(label);\n    this.iconPath = icon;\n    this.command = command;\n    this.tooltip = tooltip;\n  }\n}\n\n@provide(IconActionsTreeviewProvider)\nclass IconActionsTreeviewProvider implements TreeDataProvider<ActionTreeItem> {\n  collapsibleState = TreeItemCollapsibleState.Collapsed;\n  getTreeItem(element: ActionTreeItem): ActionTreeItem {\n    element.collapsibleState = element.children\n      ? TreeItemCollapsibleState.Collapsed\n      : TreeItemCollapsibleState.None;\n    element.iconPath = element.children ? undefined : element.iconPath;\n    return element;\n  }\n\n  getChildren(element: ActionTreeItem): ProviderResult<ActionTreeItem[]> {\n    if (!element) {\n      const scanItem = new ActionTreeItem(\n        \"Project Health Check\",\n        undefined,\n        undefined,\n        \"Find issues in dbt projects\",\n      );\n\n      scanItem.children = [\n        new ActionTreeItem(\n          \"Start Scan\",\n          new ThemeIcon(\"search-view-icon\"),\n          {\n            command: \"dbtPowerUser.altimateScan\",\n            title: \"Project Health Check\",\n            arguments: [],\n          },\n          \"Scan all projects for issues\",\n        ),\n        new ActionTreeItem(\n          \"Clear Problems\",\n          new ThemeIcon(\"search-stop\"),\n          {\n            command: \"dbtPowerUser.clearAltimateScanResults\",\n            title: \"Clear All Problems\",\n            arguments: [],\n          },\n          \"Clear issues from problems panel\",\n        ),\n        new ActionTreeItem(\"Send Feedback\", undefined, {\n          command: \"vscode.open\",\n          title: \"Send Feedback\",\n          arguments: [Uri.parse(\"https://form.jotform.com/251105674252148\")],\n        }),\n      ];\n      return Promise.resolve([scanItem]);\n    }\n    return element.children;\n  }\n}\n\nclass ModelTreeItem extends NodeTreeItem {\n  contextValue = \"model\";\n}\n\nclass SourceTreeItem extends NodeTreeItem {\n  iconPath = {\n    light: Uri.file(\n      path.join(path.resolve(__dirname), \"../media/images/source_light.svg\"),\n    ),\n    dark: Uri.file(\n      path.join(path.resolve(__dirname), \"../media/images/source_dark.svg\"),\n    ),\n  };\n  contextValue = \"source\";\n}\n\nclass SeedTreeItem extends NodeTreeItem {\n  iconPath = {\n    light: Uri.file(\n      path.join(path.resolve(__dirname), \"../media/images/seed_light.svg\"),\n    ),\n    dark: Uri.file(\n      path.join(path.resolve(__dirname), \"../media/images/seed_dark.svg\"),\n    ),\n  };\n  contextValue = \"seed\";\n}\n\nclass SnapshotTreeItem extends NodeTreeItem {\n  contextValue = \"snapshot\";\n  iconPath = {\n    light: Uri.file(\n      path.join(path.resolve(__dirname), \"../media/images/snapshot_light.svg\"),\n    ),\n    dark: Uri.file(\n      path.join(path.resolve(__dirname), \"../media/images/snapshot_dark.svg\"),\n    ),\n  };\n}\n\nclass ExposureTreeItem extends NodeTreeItem {\n  contextValue = \"exposure\";\n  iconPath = {\n    light: Uri.file(\n      path.join(path.resolve(__dirname), \"../media/images/exposure_light.svg\"),\n    ),\n    dark: Uri.file(\n      path.join(path.resolve(__dirname), \"../media/images/exposure_dark.svg\"),\n    ),\n  };\n}\n\nclass FunctionTreeItem extends NodeTreeItem {\n  contextValue = \"function\";\n}\n\nclass AnalysisTreeItem extends NodeTreeItem {\n  contextValue = \"analysis\";\n}\n\nclass TestTreeItem extends NodeTreeItem {\n  iconPath = {\n    light: Uri.file(\n      path.join(path.resolve(__dirname), \"../media/images/tests_light.svg\"),\n    ),\n    dark: Uri.file(\n      path.join(path.resolve(__dirname), \"../media/images/tests_dark.svg\"),\n    ),\n  };\n  contextValue = \"test\";\n}\n\nexport class ModelTestTreeview extends ModelTreeviewProvider {\n  constructor(dbtProjectContainer: DBTProjectContainer) {\n    super(dbtProjectContainer, \"tests\");\n  }\n}\n\nexport class ParentModelTreeview extends ModelTreeviewProvider {\n  constructor(dbtProjectContainer: DBTProjectContainer) {\n    super(dbtProjectContainer, \"parents\");\n  }\n}\n\nexport class ChildrenModelTreeview extends ModelTreeviewProvider {\n  constructor(dbtProjectContainer: DBTProjectContainer) {\n    super(dbtProjectContainer, \"children\");\n  }\n}\n\nexport class DocumentationTreeview extends DocumentationTreeviewProvider {\n  constructor(dbtProjectContainer: DBTProjectContainer) {\n    super(dbtProjectContainer);\n  }\n}\n\nexport class IconActionsTreeview extends IconActionsTreeviewProvider {}\n\n// Find appropriate a model from file content (if YAML) or from a file name (otherwise)\nexport function lookupModelByEditorContent(\n  nodeMetaMap: NodeMetaMap,\n  document: TextDocument,\n): NodeMetaData | undefined {\n  const modelCandidateName =\n    document.languageId === \"yaml\" &&\n    getCurrentlySelectedModelNameInYamlConfig()\n      ? getCurrentlySelectedModelNameInYamlConfig()\n      : path.parse(document.fileName).name;\n  return nodeMetaMap.lookupByBaseName(modelCandidateName);\n}\n"
  },
  {
    "path": "src/treeview_provider/runHistoryTreeItems.ts",
    "content": "import type {\n  RunResultEntry,\n  RunResultsEventData,\n  RunStatus,\n} from \"@altimateai/dbt-integration\";\nimport {\n  ThemeColor,\n  ThemeIcon,\n  TreeItem,\n  TreeItemCollapsibleState,\n} from \"vscode\";\n\n/**\n * Top-level tree item representing a dbt command execution (e.g., `dbt run`, `dbt test`).\n * This is the parent node displayed in the Run History treeview panel.\n * Each RunTreeItem contains child ResultTreeItems for individual model/test/seed results.\n */\nexport class RunTreeItem extends TreeItem {\n  constructor(public readonly entry: RunResultsEventData) {\n    super(entry.command, RunTreeItem.getCollapsibleState(entry));\n\n    this.description = RunTreeItem.getDescription(entry);\n    this.iconPath = RunTreeItem.getIcon(entry);\n    this.tooltip = RunTreeItem.getTooltip(entry);\n    this.contextValue = \"runHistoryEntry\";\n  }\n\n  private static getCollapsibleState(\n    entry: RunResultsEventData,\n  ): TreeItemCollapsibleState {\n    if (entry.results.length === 0) {\n      return TreeItemCollapsibleState.None;\n    }\n    return TreeItemCollapsibleState.Collapsed;\n  }\n\n  private static getDescription(entry: RunResultsEventData): string {\n    const duration = `${(entry.elapsedTime ?? 0).toFixed(2)}s`;\n    const resultCount = entry.results.length;\n    const successCount = entry.results.filter(\n      (r: RunResultEntry) => r.status === \"success\",\n    ).length;\n    const errorCount = entry.results.filter(\n      (r: RunResultEntry) => r.status === \"error\",\n    ).length;\n\n    const parts: string[] = [entry.projectName, duration];\n    if (resultCount === 0) {\n      parts.push(\"no matches\");\n    } else if (errorCount > 0) {\n      parts.push(`${successCount}/${resultCount} passed`);\n    } else {\n      parts.push(`${resultCount} passed`);\n    }\n\n    return parts.join(\" • \");\n  }\n\n  private static getIcon(entry: RunResultsEventData): ThemeIcon {\n    if (entry.results.length === 0) {\n      return new ThemeIcon(\n        \"debug-step-over\",\n        new ThemeColor(\"disabledForeground\"),\n      );\n    }\n    const hasError = entry.results.some(\n      (r: RunResultEntry) => r.status === \"error\",\n    );\n    if (hasError) {\n      return new ThemeIcon(\"error\", new ThemeColor(\"charts.red\"));\n    }\n    const hasWarn = entry.results.some(\n      (r: RunResultEntry) => r.status === \"warn\",\n    );\n    if (hasWarn) {\n      return new ThemeIcon(\"warning\", new ThemeColor(\"charts.yellow\"));\n    }\n    return new ThemeIcon(\"pass\", new ThemeColor(\"charts.green\"));\n  }\n\n  private static getTooltip(entry: RunResultsEventData): string {\n    const completedAt =\n      entry.completedAt instanceof Date\n        ? entry.completedAt\n        : new Date(entry.completedAt);\n    const lines: string[] = [];\n    lines.push(`Project: ${entry.projectName}`);\n    lines.push(`Completed: ${completedAt.toLocaleTimeString()}`);\n    lines.push(`Duration: ${(entry.elapsedTime ?? 0).toFixed(2)}s`);\n    lines.push(`Invocation: ${entry.id}`);\n    return lines.join(\"\\n\");\n  }\n}\n\n/** Maps normalized RunStatus to icon and theme color for display */\nexport function getStatusIcon(status: RunStatus): {\n  icon: string;\n  color: string;\n} {\n  switch (status) {\n    case \"success\":\n      return { icon: \"check\", color: \"charts.green\" };\n    case \"error\":\n      return { icon: \"x\", color: \"charts.red\" };\n    case \"warn\":\n      return { icon: \"warning\", color: \"charts.yellow\" };\n    case \"skipped\":\n    default:\n      return { icon: \"debug-step-over\", color: \"disabledForeground\" };\n  }\n}\n\n/**\n * Child tree item representing an individual model, test, seed, or snapshot result.\n * These appear as expandable children under their parent RunTreeItem.\n * Displays the resource name, type, execution time, and status icon.\n */\nexport class ResultTreeItem extends TreeItem {\n  constructor(public readonly result: RunResultEntry) {\n    super(ResultTreeItem.getDisplayName(result), TreeItemCollapsibleState.None);\n\n    this.description = ResultTreeItem.getDescription(result);\n    this.iconPath = ResultTreeItem.getIcon(result);\n    this.tooltip = ResultTreeItem.getTooltip(result);\n    this.contextValue = `runHistoryResult.${result.resourceType}`;\n  }\n\n  static getDisplayName(result: RunResultEntry): string {\n    if (result.resourceType === \"test\") {\n      return ResultTreeItem.formatTestName(result);\n    } else {\n      return result.name;\n    }\n  }\n\n  /** Extract a human-readable name from a test's `uniqueId`, falling back to `name` */\n  private static formatTestName(result: RunResultEntry): string {\n    if (result.uniqueId) {\n      // uniqueId format: \"test.project_name.test_name.hash\"\n      const parts = result.uniqueId.split(\".\");\n      if (parts.length >= 4) {\n        return parts.slice(2, -1).join(\".\");\n      }\n    }\n    return result.name;\n  }\n\n  private static getDescription(result: RunResultEntry): string {\n    const parts: string[] = [];\n    parts.push(result.resourceType);\n    if (result.executionTime !== null && result.executionTime !== undefined) {\n      parts.push(`${result.executionTime.toFixed(2)}s`);\n    }\n    return parts.join(\" • \");\n  }\n\n  private static getIcon(result: RunResultEntry): ThemeIcon {\n    const config = getStatusIcon(result.status);\n    return new ThemeIcon(config.icon, new ThemeColor(config.color));\n  }\n\n  private static getTooltip(result: RunResultEntry): string {\n    const lines: string[] = [];\n    lines.push(`Name: ${result.name}`);\n    lines.push(`Type: ${result.resourceType}`);\n    lines.push(`Status: ${result.status}`);\n    if (result.executionTime !== null && result.executionTime !== undefined) {\n      lines.push(`Execution Time: ${result.executionTime.toFixed(2)}s`);\n    }\n    if (result.message) {\n      lines.push(`Message: ${result.message}`);\n    }\n    lines.push(`Unique ID: ${result.uniqueId}`);\n    return lines.join(\"\\n\");\n  }\n}\n\nexport type RunHistoryTreeItem = RunTreeItem | ResultTreeItem;\n"
  },
  {
    "path": "src/treeview_provider/runHistoryTreeviewProvider.ts",
    "content": "import {\n  Disposable,\n  Event,\n  EventEmitter,\n  TreeDataProvider,\n  TreeItem,\n} from \"vscode\";\nimport { RunHistoryService } from \"../services/runHistoryService\";\nimport {\n  ResultTreeItem,\n  RunHistoryTreeItem,\n  RunTreeItem,\n} from \"./runHistoryTreeItems\";\n\nexport class RunHistoryTreeviewProvider\n  implements TreeDataProvider<RunHistoryTreeItem>, Disposable\n{\n  private _onDidChangeTreeData = new EventEmitter<\n    RunHistoryTreeItem | undefined | void\n  >();\n  readonly onDidChangeTreeData: Event<RunHistoryTreeItem | undefined | void> =\n    this._onDidChangeTreeData.event;\n\n  private disposables: Disposable[] = [this._onDidChangeTreeData];\n\n  constructor(private runHistoryService: RunHistoryService) {\n    this.disposables.push(\n      this.runHistoryService.onHistoryChanged(() => {\n        this._onDidChangeTreeData.fire();\n      }),\n    );\n  }\n\n  // Called by VS Code's TreeDataProvider interface\n  getTreeItem(element: RunHistoryTreeItem): TreeItem {\n    return element;\n  }\n\n  // Called by VS Code's TreeDataProvider interface to populate the tree view\n  getChildren(element?: RunHistoryTreeItem): RunHistoryTreeItem[] {\n    if (!element) {\n      const entries = this.runHistoryService.entries;\n      return entries.map((entry) => new RunTreeItem(entry));\n    }\n\n    if (element instanceof RunTreeItem) {\n      return element.entry.results.map((result) => new ResultTreeItem(result));\n    }\n\n    return [];\n  }\n\n  dispose(): void {\n    this.disposables.forEach((d) => d.dispose());\n  }\n}\n"
  },
  {
    "path": "src/types/istanbul-lib-instrument.d.ts",
    "content": "declare module \"istanbul-lib-instrument\" {\n  interface InstrumenterOptions {\n    compact?: boolean;\n    preserveComments?: boolean;\n    produceSourceMap?: boolean;\n    autoWrap?: boolean;\n    esModules?: boolean;\n  }\n\n  interface Instrumenter {\n    instrumentSync(code: string, filename: string): string;\n    fileCoverage: any;\n  }\n\n  export function createInstrumenter(\n    options?: InstrumenterOptions,\n  ): Instrumenter;\n}\n"
  },
  {
    "path": "src/types.ts",
    "content": "export const TYPES = {\n  DBTProjectIntegration: Symbol.for(\"DBTProjectIntegration\"),\n};\n"
  },
  {
    "path": "src/utils.ts",
    "content": "import {\n  TestMetadataAcceptedValues,\n  TestMetadataRelationships,\n} from \"@altimateai/dbt-integration\";\nimport * as path from \"path\";\nimport {\n  Disposable,\n  FileSystemWatcher,\n  Position,\n  Range,\n  TextDocument,\n  Uri,\n  window,\n  workspace,\n} from \"vscode\";\nimport { parseDocument } from \"yaml\";\n\nexport const isEnclosedWithinCodeBlock = (\n  document: TextDocument,\n  rangeOrPosition: Range | Position,\n): boolean => {\n  const isWithinCodeBlock = (\n    startPosition: Position,\n    direction: \"asc\" | \"desc\",\n    lookupChar: \"{\" | \"}\",\n    stopChar: \"{\" | \"}\",\n  ): boolean => {\n    const increment = direction === \"desc\" ? -1 : 1;\n    let characterPosition: number | undefined = startPosition.character;\n    let lineNumber = startPosition.line;\n    while (lineNumber >= 0 && lineNumber < document.lineCount) {\n      const line = document.lineAt(lineNumber).text;\n      if (characterPosition === undefined) {\n        characterPosition = direction === \"desc\" ? line.length - 1 : 0;\n      }\n      while (\n        direction === \"desc\"\n          ? characterPosition >= 0\n          : characterPosition <= line.length - 1\n      ) {\n        if ([\"#\", \"%\", stopChar].includes(line[characterPosition])) {\n          if (\n            characterPosition + increment >= 0 &&\n            line[characterPosition + increment] === stopChar\n          ) {\n            return false;\n          }\n        }\n\n        if ([\"#\", \"%\", lookupChar].includes(line[characterPosition])) {\n          if (\n            characterPosition + increment >= 0 &&\n            line[characterPosition + increment] === lookupChar\n          ) {\n            return true;\n          }\n        }\n        characterPosition += increment;\n      }\n      lineNumber += increment;\n      characterPosition = undefined;\n    }\n    return false;\n  };\n  const { start, end } =\n    rangeOrPosition instanceof Position\n      ? { start: rangeOrPosition, end: rangeOrPosition }\n      : rangeOrPosition;\n  return (\n    isWithinCodeBlock(start, \"desc\", \"{\", \"}\") &&\n    isWithinCodeBlock(end, \"asc\", \"}\", \"{\")\n  );\n};\n\nexport const arrayEquals = <T>(a: Array<T>, b: Array<T>): boolean => {\n  return a.sort().toString() === b.sort().toString();\n};\n\nexport const debounce = (fn: (args: unknown) => void, wait: number) => {\n  let timeout: NodeJS.Timeout;\n  return () => {\n    clearTimeout(timeout);\n    timeout = setTimeout(fn, wait);\n  };\n};\n\nexport const setupWatcherHandler: (\n  watcher: FileSystemWatcher,\n  handler: Function,\n) => Disposable[] = (watcher, handler) => [\n  watcher.onDidChange(() => handler()),\n  watcher.onDidCreate(() => handler()),\n  watcher.onDidDelete(() => handler()),\n];\n\nexport function extendErrorWithSupportLinks(error: string): string {\n  return (\n    (error[-1] === \" \" ? error : error + \" \") +\n    \"If the issue persists, please [contact us](https://www.altimate.ai/support) via chat or Slack\"\n  );\n}\n\nexport function stripANSI(src: string): string {\n  return src.replace(\n    /[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,\n    \"\",\n  );\n}\n\nexport function getFirstWorkspacePath(): string {\n  // If we are executing python via a wrapper like Meltano,\n  // we need to execute it from a (any) project directory\n  // By default, Command execution is in an ext dir context\n  const folders = workspace.workspaceFolders;\n  if (folders) {\n    return folders[0].uri.fsPath;\n  } else {\n    // TODO: this shouldn't happen but we should make sure this is valid fallback\n    return Uri.file(\"./\").fsPath;\n  }\n}\n\nexport const getProjectRelativePath = (projectRoot: Uri) => {\n  const ws = workspace.getWorkspaceFolder(projectRoot);\n  return path.relative(ws?.uri.fsPath || \"\", projectRoot.fsPath);\n};\n\nexport const deepEqual = (obj1: any, obj2: any): boolean => {\n  if (obj1 === obj2) {\n    return true;\n  }\n\n  if (\n    typeof obj1 !== \"object\" ||\n    typeof obj2 !== \"object\" ||\n    obj1 === null ||\n    obj2 === null\n  ) {\n    return false;\n  }\n\n  const keys1 = Object.keys(obj1);\n  const keys2 = Object.keys(obj2);\n\n  if (keys1.length !== keys2.length) {\n    return false;\n  }\n\n  for (const key of keys1) {\n    if (!keys2.includes(key) || !deepEqual(obj1[key], obj2[key])) {\n      return false;\n    }\n  }\n\n  return true;\n};\n\nexport const getColumnNameByCase = (columnName: string, adapter: string) => {\n  if (isQuotedIdentifier(columnName, adapter)) {\n    return columnName;\n  }\n  const showColumnNamesInLowercase = workspace\n    .getConfiguration(\"dbt\")\n    .get<boolean>(\"showColumnNamesInLowercase\", true);\n  return showColumnNamesInLowercase ? columnName.toLowerCase() : columnName;\n};\n\nexport const isColumnNameEqual = (\n  columnNameFromYml: string | undefined,\n  incomingColumnName: string | undefined,\n) => {\n  if (!columnNameFromYml || !incomingColumnName) {\n    return false;\n  }\n\n  if (columnNameFromYml === incomingColumnName) {\n    return true;\n  }\n\n  const showColumnNamesInLowercase = workspace\n    .getConfiguration(\"dbt\")\n    .get<boolean>(\"showColumnNamesInLowercase\", true);\n\n  if (showColumnNamesInLowercase) {\n    return columnNameFromYml.toLowerCase() === incomingColumnName.toLowerCase();\n  }\n\n  return false;\n};\n\nexport const isQuotedIdentifier = (columnName: string, adapter: string) => {\n  const regexFromConfig = workspace\n    .getConfiguration(\"dbt\")\n    .get<string>(\"unquotedCaseInsensitiveIdentifierRegex\", \"\");\n  if (regexFromConfig) {\n    console.log(\n      \"[isQuotedIdentifier] using user provider regex for\",\n      regexFromConfig,\n    );\n    return !new RegExp(regexFromConfig).test(columnName);\n  }\n\n  const specialCases = [\"trino\", \"athena\", \"postgres\", \"duckdb\", \"risingwave\"];\n  if (specialCases.includes(adapter)) {\n    return !/^([_a-z]+[_a-z0-9$]*)$/.test(columnName);\n  }\n\n  // snowflake and most of the db follow standard sql spec of making the column names to uppercase by default\n  return !/^([_A-Z]+[_A-Z0-9$]*)$/.test(columnName);\n};\n\nexport const isRelationship = (\n  metadata:\n    | TestMetadataRelationships\n    | TestMetadataAcceptedValues\n    | { [x: string]: unknown },\n): metadata is TestMetadataRelationships => {\n  return (\n    (metadata as TestMetadataRelationships).field !== undefined &&\n    (metadata as TestMetadataRelationships).to !== undefined\n  );\n};\n\nexport const isAcceptedValues = (\n  metadata:\n    | TestMetadataRelationships\n    | TestMetadataAcceptedValues\n    | { [x: string]: unknown },\n): metadata is TestMetadataAcceptedValues => {\n  return (metadata as TestMetadataAcceptedValues).values !== undefined;\n};\n\nexport const getColumnTestConfigFromYml = (\n  allTests: any[] | undefined,\n  kwargs:\n    | TestMetadataAcceptedValues\n    | TestMetadataRelationships\n    | { [x: string]: unknown },\n  testName: string,\n) => {\n  const testsByTestName = allTests?.filter((t: any) => {\n    if (typeof t === \"string\") {\n      return t === testName;\n    }\n    const [key] = Object.keys(t);\n    return key === testName;\n  });\n\n  const testWithRightConfigValues = testsByTestName?.find((t: any) => {\n    if (typeof t === \"string\") {\n      return t === testName;\n    }\n\n    if (isRelationship(kwargs)) {\n      return (\n        kwargs.field === t.relationships.field &&\n        kwargs.to === t.relationships.to\n      );\n    }\n\n    if (isAcceptedValues(kwargs)) {\n      return (\n        kwargs.values?.sort().toString() ===\n        t.accepted_values.values.sort().toString()\n      );\n    }\n\n    // For multiple tests with same name but diff config from  external packages like dbt_utils,\n    // match all the config values\n    const { model, column_name, ...rest } = kwargs;\n    return Object.entries(rest).every(([k, v]) => t[testName][k] === v);\n  });\n\n  if (isRelationship(kwargs)) {\n    return (\n      testWithRightConfigValues as\n        | { relationships: TestMetadataAcceptedValues }\n        | undefined\n    )?.[\"relationships\"];\n  }\n\n  if (isAcceptedValues(kwargs)) {\n    return (\n      testWithRightConfigValues as\n        | { accepted_values: TestMetadataAcceptedValues }\n        | undefined\n    )?.[\"accepted_values\"];\n  }\n\n  if (testWithRightConfigValues?.[testName]) {\n    return {\n      [testName]: testWithRightConfigValues?.[testName],\n    };\n  }\n};\n\nexport function getFormattedDateTime(): string {\n  const now = new Date();\n\n  const date = now.toLocaleDateString(\"en-GB\").replace(/\\//g, \"-\");\n  const time = now\n    .toLocaleTimeString(\"en-GB\", { hour12: false })\n    .replace(/:/g, \"-\");\n\n  return `${date}-${time}`;\n}\n\nexport const getStringSizeInMb = (str: string): number => {\n  let sizeInBytes = 0;\n  for (let i = 0; i < str.length; i++) {\n    const charCode = str.charCodeAt(i);\n    if (charCode <= 0x7f) {\n      sizeInBytes += 1;\n    } else if (charCode <= 0x7ff) {\n      sizeInBytes += 2;\n    } else if (charCode <= 0xffff) {\n      sizeInBytes += 3;\n    } else {\n      sizeInBytes += 4;\n    }\n  }\n  const sizeInMB = sizeInBytes / (1024 * 1024);\n  return sizeInMB;\n};\n\ninterface YamlModel {\n  key?: { value: string };\n  value?: { items?: Array<YamlModelItem> };\n}\n\ninterface YamlModelItem {\n  items?: Array<{\n    key?: { value: string };\n    value?: { toString(): string };\n  }>;\n  range?: [number, number];\n}\n\nexport function getCurrentlySelectedModelNameInYamlConfig(): string {\n  if (\n    window.activeTextEditor === undefined ||\n    window.activeTextEditor.document.languageId !== \"yaml\"\n  ) {\n    return \"\";\n  }\n\n  try {\n    const parsedYaml = parseDocument(\n      window.activeTextEditor.document.getText(),\n    );\n    if (parsedYaml.contents === null) {\n      return \"\";\n    }\n    const cursorPosition = window.activeTextEditor.selection.active;\n    const offset = window.activeTextEditor.document.offsetAt(cursorPosition);\n\n    const contents = parsedYaml.contents as { items?: Array<YamlModel> };\n    if (!contents.items) {\n      return \"\";\n    }\n\n    const modelsNode = contents.items.find(\n      (item) => item?.key?.value === \"models\",\n    );\n    if (!modelsNode?.value?.items) {\n      return \"\";\n    }\n\n    // Find a model at the current position\n    for (const model of modelsNode.value.items) {\n      if (!model?.items) {\n        continue;\n      }\n\n      const nameNode = model.items.find((item) => item?.key?.value === \"name\");\n      if (!nameNode?.value) {\n        continue;\n      }\n\n      if (model.range && model.range[0] < offset && offset < model.range[1]) {\n        return nameNode.value.toString();\n      }\n    }\n  } catch (error) {\n    console.error(\"Error parsing YAML document:\", {\n      error,\n      document: window.activeTextEditor?.document.fileName,\n      position: window.activeTextEditor?.selection.active,\n    });\n  }\n  return \"\";\n}\n\nexport function removeProtocol(input: string): string {\n  return input.replace(/^[^:]+:\\/\\//, \"\");\n}\n\nexport function getDepthColor(depth: number): string {\n  const mediumDepthThreshold = workspace\n    .getConfiguration(\"dbt\")\n    .get<number>(\"mediumDepthThreshold\", 5);\n  const highDepthThreshold = workspace\n    .getConfiguration(\"dbt\")\n    .get<number>(\"highDepthThreshold\", 10);\n\n  const lowDepthColor = workspace\n    .getConfiguration(\"dbt\")\n    .get<string>(\"lowDepthColor\", \"#00ff00\");\n  const mediumDepthColor = workspace\n    .getConfiguration(\"dbt\")\n    .get<string>(\"mediumDepthColor\", \"#ffa500\");\n  const highDepthColor = workspace\n    .getConfiguration(\"dbt\")\n    .get<string>(\"highDepthColor\", \"#ff0000\");\n\n  if (depth >= highDepthThreshold) {\n    return highDepthColor; // Configurable color for high depth\n  } else if (depth >= mediumDepthThreshold) {\n    return mediumDepthColor; // Configurable color for medium depth\n  } else {\n    return lowDepthColor; // Configurable color for low depth\n  }\n}\n\n/**\n * Extract the dbt subcommand from a full command string.\n * \"dbt build --select model\" → \"build\"\n */\nexport function extractDbtSubcommand(command: string): string {\n  return command.startsWith(\"dbt \") ? command.split(\" \")[1] : command;\n}\n\n/**\n * Resolve VS Code variable substitution patterns in a string value.\n * Handles ${workspaceFolder} and ${env:VAR_NAME}.\n * VS Code only auto-resolves these in tasks.json/launch.json — extension\n * settings must resolve them manually.\n */\nexport function resolveSettingsVariables(\n  value: string,\n  workspaceFolder?: Uri,\n): string {\n  if (!value) {\n    return value;\n  }\n\n  // Resolve ${env:VAR_NAME}\n  // Use a callback-based replace to:\n  // 1. Avoid desynchronizing a stateful global regex with the mutating string\n  //    (the previous while-loop skipped subsequent placeholders in strings\n  //    containing multiple `${env:VAR}` references).\n  // 2. Treat the replacement as a literal string — passing an env value\n  //    directly to replace() causes `$1`, `$&`, etc. in the value to be\n  //    interpreted as backreferences, silently corrupting paths like\n  //    `/home/$USER/project`.\n  // Unresolved placeholders (env var not set) are left as-is.\n  value = value.replace(/\\$\\{env:(.*?)\\}/g, (match, varName) => {\n    const envValue = process.env[varName];\n    return envValue !== undefined ? envValue : match;\n  });\n\n  // Resolve ${workspaceFolder}\n  // Also use a callback for the same `$`-interpretation reason: workspace\n  // paths can legitimately contain `$` on Windows.\n  const folder = workspaceFolder ?? workspace.workspaceFolders?.[0]?.uri;\n  if (folder) {\n    value = value.replace(/\\$\\{workspaceFolder\\}/g, () => folder.fsPath);\n  }\n\n  return value;\n}\n"
  },
  {
    "path": "src/validation_provider/index.ts",
    "content": "import {\n  ForbiddenError,\n  NoCredentialsError,\n} from \"@altimateai/dbt-integration\";\nimport { commands, Disposable, window, workspace } from \"vscode\";\nimport { AltimateRequest } from \"../altimate\";\nimport { AltimateAuthService } from \"../services/altimateAuthService\";\n\nconst validTenantRegex = new RegExp(/^[a-z_][a-z0-9_-]*$/);\n\nexport class ValidationProvider implements Disposable {\n  private disposables: Disposable[] = [];\n  private _isAuthenticated = false;\n  private cachedConfig = workspace.getConfiguration(\"dbt\");\n\n  constructor(\n    private altimate: AltimateRequest,\n    private altimateAuthService: AltimateAuthService,\n  ) {\n    this.disposables.push(\n      workspace.onDidChangeConfiguration((e) => {\n        if (!e.affectsConfiguration(\"dbt\")) {\n          return;\n        }\n        this.handleConfigurationChange();\n      }),\n    );\n    this.setDBTContext();\n  }\n\n  private handleConfigurationChange() {\n    const newConfig = workspace.getConfiguration(\"dbt\");\n    const oldKey = this.cachedConfig.get<string>(\"altimateAiKey\");\n    const newKey = newConfig.get<string>(\"altimateAiKey\");\n    const oldInstance = this.cachedConfig.get<string>(\"altimateInstanceName\");\n    const newInstance = newConfig.get<string>(\"altimateInstanceName\");\n    const oldUrl = this.cachedConfig.get<string>(\"altimateUrl\");\n    const newUrl = newConfig.get<string>(\"altimateUrl\");\n\n    const credentialsChanged =\n      oldKey !== newKey || oldInstance !== newInstance || oldUrl !== newUrl;\n\n    this.cachedConfig = newConfig;\n    this.setDBTContext();\n\n    if (credentialsChanged) {\n      this.validateCredentials();\n    }\n  }\n\n  setDBTContext() {\n    let dbtIntegration = workspace\n      .getConfiguration(\"dbt\")\n      .get<string>(\"dbtIntegration\", \"core\");\n\n    if (![\"core\", \"cloud\"].includes(dbtIntegration)) {\n      dbtIntegration = \"core\";\n    }\n    commands.executeCommand(\n      \"setContext\",\n      \"dbtPowerUser.dbtIntegration\",\n      dbtIntegration,\n    );\n  }\n\n  validateCredentials() {\n    this._validateCredentials(false);\n  }\n\n  validateCredentialsSilently() {\n    this._validateCredentials(true);\n  }\n\n  private async _validateCredentials(silent: boolean) {\n    const key = this.altimate.getAIKey();\n    const instance = this.altimate.getInstanceName();\n\n    // only validate when both are set\n    if (!key || !instance) {\n      this._isAuthenticated = false;\n      return;\n    }\n\n    let message = \"\";\n    if (!validTenantRegex.exec(instance)) {\n      message = \"Instance name must not be URL.\";\n    } else if (key.length !== 32) {\n      message = \"API key is not valid\";\n    }\n    if (message) {\n      this._isAuthenticated = false;\n      if (!silent) {\n        window.showErrorMessage(message);\n      }\n      return;\n    }\n    const connectivity = await this.altimate.checkApiConnectivity();\n    if (connectivity?.status !== \"ok\") {\n      this._isAuthenticated = false;\n      if (!silent) {\n        window.showErrorMessage(\n          \"Unable to connect to Altimate Service. Please check your Firewall/VPN settings or check service [status](https://altimateai.instatus.com/).\",\n        );\n      }\n      return;\n    }\n    const validation = await this.altimate.validateCredentials(instance, key);\n    if (!validation?.ok) {\n      this._isAuthenticated = false;\n      if (!silent) {\n        window.showErrorMessage(\n          `Credentials are invalid. ${validation?.detail}`,\n        );\n      }\n      return;\n    }\n    this._isAuthenticated = true;\n    if (!silent) {\n      window.showInformationMessage(\n        \"Altimate AI credentials validated successfully.\",\n      );\n    }\n  }\n\n  isAuthenticated() {\n    return this._isAuthenticated;\n  }\n\n  throwIfNotAuthenticated() {\n    if (!this.isAuthenticated()) {\n      const message = this.altimateAuthService.getCredentialsMessage();\n      throw message ? new NoCredentialsError(message) : new ForbiddenError();\n    }\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/webview_provider/DbtDocsView.ts",
    "content": "import { DBTTerminal } from \"@altimateai/dbt-integration\";\nimport { inject } from \"inversify\";\nimport { ViewColumn, WebviewPanel, window } from \"vscode\";\nimport { AltimateRequest } from \"../altimate\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { AltimateAuthService } from \"../services/altimateAuthService\";\nimport { QueryManifestService } from \"../services/queryManifestService\";\nimport { SharedStateService } from \"../services/sharedStateService\";\nimport { UsersService } from \"../services/usersService\";\nimport { TelemetryService } from \"../telemetry\";\nimport {\n  AltimateWebviewProvider,\n  SharedStateEventEmitterProps,\n} from \"./altimateWebviewProvider\";\n\nexport class DbtDocsView extends AltimateWebviewProvider {\n  public static readonly viewType = \"dbtPowerUser.DbtDocs\";\n  protected viewPath = \"/dbt-docs\";\n  protected panelDescription = \"Dbt docs view\";\n  private _shareId: string | undefined;\n  private _conversationGroupId: string | undefined;\n\n  public constructor(\n    protected dbtProjectContainer: DBTProjectContainer,\n    protected altimateRequest: AltimateRequest,\n    protected telemetry: TelemetryService,\n    protected emitterService: SharedStateService,\n    @inject(\"DBTTerminal\")\n    protected dbtTerminal: DBTTerminal,\n    protected queryManifestService: QueryManifestService,\n    protected usersService: UsersService,\n    protected altimateAuthService: AltimateAuthService,\n  ) {\n    super(\n      dbtProjectContainer,\n      altimateRequest,\n      telemetry,\n      emitterService,\n      dbtTerminal,\n      queryManifestService,\n      usersService,\n      altimateAuthService,\n    );\n\n    const t = this;\n    this._disposables.push(\n      emitterService.eventEmitter.event((d) =>\n        t.onEvent(d as SharedStateEventEmitterProps),\n      ),\n    );\n  }\n\n  protected onWebviewReady() {\n    super.onWebviewReady();\n\n    if (!this._webview) {\n      return;\n    }\n\n    this.sendResponseToWebview({\n      command: \"dbtDocsShareDetails\",\n      args: {\n        shareId: this._shareId,\n        conversationGroupId: this._conversationGroupId,\n        userId: this.usersService.user?.id,\n      },\n    });\n  }\n\n  protected async onEvent({ command, payload }: SharedStateEventEmitterProps) {\n    switch (command) {\n      case \"dbtdocsview:render\":\n        this.dbtTerminal.debug(\n          \"dbtdocsview:render\",\n          \"rendering dbt docs view\",\n          payload,\n        );\n        this._shareId = payload.shareId as string | undefined;\n        this._conversationGroupId = payload.conversationGroupId as\n          | string\n          | undefined;\n        if (this._panel) {\n          (this._panel as WebviewPanel).dispose();\n        }\n        const webviewPanel = window.createWebviewPanel(\n          DbtDocsView.viewType,\n          \"Dbt docs\",\n          {\n            viewColumn: ViewColumn.Active,\n          },\n          { enableScripts: true, retainContextWhenHidden: true },\n        );\n        this._panel = webviewPanel;\n        this.renderWebview(webviewPanel);\n\n        break;\n      default:\n        super.onEvent({ command, payload });\n        break;\n    }\n  }\n\n  protected renderWebviewView() {\n    if (!this._webview) {\n      return;\n    }\n\n    this._webview.onDidReceiveMessage(this.handleCommand, this, []);\n\n    this._webview.html = this.getHtml(\n      this._webview,\n      this.dbtProjectContainer.extensionUri,\n    );\n  }\n\n  private renderWebview(webview: WebviewPanel) {\n    this._webview = webview.webview;\n    this.renderWebviewView();\n  }\n}\n"
  },
  {
    "path": "src/webview_provider/altimateWebviewProvider.ts",
    "content": "import { DBTTerminal } from \"@altimateai/dbt-integration\";\nimport { NotebookSchema } from \"@lib\";\nimport { inject } from \"inversify\";\nimport { PythonException } from \"python-bridge\";\nimport {\n  CancellationToken,\n  commands,\n  Disposable,\n  env,\n  Uri,\n  Webview,\n  WebviewOptions,\n  WebviewPanel,\n  WebviewView,\n  WebviewViewProvider,\n  WebviewViewResolveContext,\n  window,\n  workspace,\n} from \"vscode\";\nimport { AltimateRequest, UserInputError } from \"../altimate\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport {\n  ManifestCacheChangedEvent,\n  ManifestCacheProjectAddedEvent,\n} from \"../dbt_client/event/manifestCacheChangedEvent\";\nimport { AltimateAuthService } from \"../services/altimateAuthService\";\nimport { QueryManifestService } from \"../services/queryManifestService\";\nimport { SharedStateService } from \"../services/sharedStateService\";\nimport { UsersService } from \"../services/usersService\";\nimport { TelemetryService } from \"../telemetry\";\nimport { extendErrorWithSupportLinks } from \"../utils\";\nimport path = require(\"path\");\n\nexport type UpdateConfigProps = {\n  key: string;\n  value: string | boolean | number;\n  isPreviewFeature?: boolean;\n};\n\nexport interface HandleCommandProps extends Record<string, unknown> {\n  command: string;\n  syncRequestId?: string;\n}\n\nexport interface SharedStateEventEmitterProps {\n  command: string;\n  payload: Record<string, unknown>;\n}\n\nexport interface SendMessageProps extends Record<string, unknown> {\n  command: string;\n  syncRequestId?: string;\n  error?: string;\n  data?: unknown;\n}\n\n/**\n * This class is responsible for rendering the webview\n * Each panel needs to have its own provider which extends this class with correct viewPath and description\n */\nexport class AltimateWebviewProvider implements WebviewViewProvider {\n  public viewType = \"dbtPowerUser.Default\";\n  protected viewPath = \"/\"; // webview route path from AppRoutes.tsx\n  protected panelDescription = \"Altimate default webview\";\n\n  protected _panel: WebviewView | WebviewPanel | undefined = undefined;\n  protected _webview: Webview | undefined = undefined;\n  protected _disposables: Disposable[] = [];\n  protected eventMap: Map<string, ManifestCacheProjectAddedEvent> = new Map();\n  // Flag to know if panel's webview is rendered and ready to receive message\n  protected isWebviewReady = false;\n\n  public constructor(\n    protected dbtProjectContainer: DBTProjectContainer,\n    protected altimateRequest: AltimateRequest,\n    protected telemetry: TelemetryService,\n    protected emitterService: SharedStateService,\n    @inject(\"DBTTerminal\")\n    protected dbtTerminal: DBTTerminal,\n    protected queryManifestService: QueryManifestService,\n    protected usersService: UsersService,\n    protected altimateAuthService: AltimateAuthService,\n  ) {\n    this._disposables.push(\n      dbtProjectContainer.onManifestChanged((event) =>\n        this.onManifestCacheChanged(event),\n      ),\n    );\n\n    const t = this;\n    this._disposables.push(\n      emitterService.eventEmitter.event((d) =>\n        t.onEvent(d as SharedStateEventEmitterProps),\n      ),\n    );\n  }\n\n  public isWebviewView(\n    panel: WebviewPanel | WebviewView,\n  ): panel is WebviewView {\n    return (<WebviewView>panel).show !== undefined;\n  }\n\n  protected sendResponseToWebview({\n    command,\n    data,\n    error,\n    syncRequestId,\n    ...rest\n  }: SendMessageProps) {\n    this._panel?.webview?.postMessage({\n      command,\n      args: {\n        syncRequestId,\n        body: data,\n        status: !error,\n        error,\n      },\n      ...rest,\n    });\n  }\n\n  /**\n   * common method to trigger the command and handle errors and send response to webview\n   * @param syncRequestId\n   * @param callback\n   * @param command\n   */\n  protected async handleSyncRequestFromWebview(\n    syncRequestId: string | undefined,\n    callback: () => any,\n    command: string,\n    showErrorNotification?: boolean,\n  ) {\n    try {\n      const response = await callback();\n\n      this.sendResponseToWebview({\n        command: \"response\",\n        syncRequestId,\n        status: true,\n        data: response,\n      });\n    } catch (error) {\n      const message =\n        error instanceof PythonException\n          ? error.exception.message\n          : (error as Error).message;\n      if (error instanceof UserInputError) {\n        this.dbtTerminal.debug(command, message, error);\n      } else {\n        this.dbtTerminal.error(command, message, error);\n      }\n      if (showErrorNotification) {\n        window.showErrorMessage(extendErrorWithSupportLinks(message));\n      }\n      this.sendResponseToWebview({\n        command: \"response\",\n        syncRequestId,\n        error: message,\n        status: false,\n      });\n    }\n  }\n\n  protected onManifestCacheChanged(event: ManifestCacheChangedEvent): void {\n    event.added?.forEach((added) => {\n      this.eventMap.set(added.project.projectRoot.fsPath, added);\n    });\n    event.removed?.forEach((removed) => {\n      this.eventMap.delete(removed.projectRoot.fsPath);\n    });\n  }\n\n  protected async onEvent({ command, payload }: SharedStateEventEmitterProps) {\n    switch (command) {\n      case \"stream:chunk\":\n        this.sendResponseToWebview({\n          command: \"response\",\n          syncRequestId: payload.syncRequestId as string | undefined,\n          data: payload.body,\n        });\n        break;\n\n      default:\n        break;\n    }\n  }\n\n  protected renderWebviewView(webview: Webview) {\n    this._webview = webview;\n    this._panel!.webview.onDidReceiveMessage(this.handleCommand, this, []);\n\n    webview.html = this.getHtml(webview, this.dbtProjectContainer.extensionUri);\n  }\n\n  // typegaurd to UpdateConfigProps\n  private isUpdateConfigProps(\n    data: UpdateConfigProps | Record<string, unknown>,\n  ): data is UpdateConfigProps {\n    return (data as UpdateConfigProps).key !== undefined;\n  }\n\n  protected onWebviewReady() {\n    this.isWebviewReady = true;\n  }\n\n  private async handleWarningMessage(\n    params: {\n      infoMessage: string;\n      items: any[];\n    },\n    syncRequestId?: string,\n  ) {\n    const { infoMessage, items } = params;\n    const result = await window.showWarningMessage(infoMessage, ...items);\n    if (syncRequestId) {\n      this.sendResponseToWebview({\n        command: \"response\",\n        data: result,\n        syncRequestId,\n      });\n    }\n  }\n\n  protected async handleCommand(message: HandleCommandProps): Promise<void> {\n    const { command, syncRequestId, ...params } = message;\n\n    try {\n      switch (command) {\n        case \"configEnabled\":\n          this.handleSyncRequestFromWebview(\n            syncRequestId,\n            () => {\n              return workspace\n                .getConfiguration(params.section as string)\n                .get(params.config as string);\n            },\n            command,\n            true,\n          );\n          break;\n        case \"deleteNotebook\":\n          this.handleSyncRequestFromWebview(\n            syncRequestId,\n            () => {\n              return this.altimateRequest.deleteNotebook(\n                params.notebookId as number,\n              );\n            },\n            command,\n            true,\n          );\n          break;\n        case \"updateNotebook\":\n          this.handleSyncRequestFromWebview(\n            syncRequestId,\n            async () => {\n              const { notebookId, name, data } = params as {\n                notebookId: number;\n                name: string;\n                data?: NotebookSchema;\n              };\n              return await this.altimateRequest.updateNotebook(notebookId, {\n                name,\n                data,\n              });\n            },\n            command,\n            true,\n          );\n          break;\n        case \"openNewNotebook\":\n          commands.executeCommand(\n            \"dbtPowerUser.createDatapilotNotebook\",\n            params,\n          );\n          break;\n        case \"setToWorkspaceState\":\n          this.dbtProjectContainer.setToWorkspaceState(\n            params.key as string,\n            params.value,\n          );\n          break;\n        case \"openProblemsTab\":\n          commands.executeCommand(\"workbench.action.problems.focus\");\n\n          break;\n        case \"dbtdocsview:render\":\n          this.emitterService.fire({\n            command: \"dbtdocsview:render\",\n            payload: params,\n          });\n          break;\n        case \"getUsers\":\n          this.handleSyncRequestFromWebview(\n            syncRequestId,\n            () => {\n              return this.usersService.users;\n            },\n            command,\n            true,\n          );\n          break;\n        case \"getCurrentUser\":\n          this.handleSyncRequestFromWebview(\n            syncRequestId,\n            () => {\n              return this.usersService.user;\n            },\n            command,\n            true,\n          );\n          break;\n        case \"fetch\":\n          this.handleSyncRequestFromWebview(\n            syncRequestId,\n            () => {\n              return this.altimateRequest.fetch(\n                params.endpoint as string,\n                params.fetchArgs as Record<string, unknown>,\n              );\n            },\n            command,\n            params.endpoint === \"auth/tenant-info\" ? false : true,\n          );\n          break;\n        case \"getProjectAdapterType\":\n          this.handleSyncRequestFromWebview(\n            syncRequestId,\n            () => {\n              return this.queryManifestService.getProject()?.getAdapterType();\n            },\n            command,\n          );\n          break;\n        case \"openFile\":\n          workspace.openTextDocument(params.path as string).then((doc) => {\n            window.showTextDocument(doc);\n          });\n          break;\n        case \"webview:ready\":\n          this.onWebviewReady();\n          break;\n        case \"openURL\":\n          if (!params.url) {\n            return;\n          }\n          env.openExternal(Uri.parse(params.url as string));\n          break;\n        case \"datapilot:toggle\":\n          if (params.open) {\n            this.emitterService.eventEmitter.fire({\n              command: \"datapilot:toggle\",\n              payload: params,\n            });\n          }\n          break;\n        case \"datapilot:message\":\n          this.emitterService.eventEmitter.fire({\n            command: \"datapilot:message\",\n            payload: message,\n          });\n          break;\n        case \"validateCredentials\":\n          const isValid = this.altimateAuthService.handlePreviewFeatures();\n          this.sendResponseToWebview({\n            command: \"response\",\n            syncRequestId,\n            data: {\n              isValid,\n            },\n          });\n          break;\n        case \"sendTelemetryEvent\":\n          this.telemetry.sendTelemetryEvent(\n            params.eventName as string,\n            params.properties as { [key: string]: string },\n            params.measurements as { [key: string]: number },\n          );\n          break;\n        case \"sendTelemetryError\":\n          this.telemetry.sendTelemetryError(\n            params.eventName as string,\n            params.error,\n            params.properties as { [key: string]: string },\n          );\n          break;\n        case \"setContext\":\n          this.dbtProjectContainer.setToGlobalState(\n            params.key as string,\n            params.value,\n          );\n          break;\n        case \"getFromContext\":\n          this.sendResponseToWebview({\n            command: \"response\",\n            data: this.dbtProjectContainer.getFromGlobalState(\n              params.key as string,\n            ),\n            syncRequestId,\n          });\n          break;\n        case \"updateConfig\":\n          if (!this.isUpdateConfigProps(params)) {\n            return;\n          }\n          this.dbtTerminal.debug(\n            \"altimateWebviewProvider:handleCommand\",\n            \"Updating config\",\n            params,\n          );\n          // If config is for preview feature, then check keys\n          const shouldUpdate =\n            !params.isPreviewFeature ||\n            this.altimateAuthService.handlePreviewFeatures();\n          if (shouldUpdate) {\n            await workspace\n              .getConfiguration(\"dbt\")\n              .update(params.key, params.value);\n          }\n          if (syncRequestId) {\n            this.sendResponseToWebview({\n              command: \"response\",\n              syncRequestId,\n              data: {\n                updated: shouldUpdate,\n              },\n            });\n          }\n          break;\n        case \"showInformationMessage\":\n          const { infoMessage, items } = params as {\n            infoMessage: string;\n            items: any[];\n          };\n          const result = await window.showInformationMessage(\n            infoMessage,\n            ...items,\n          );\n          if (syncRequestId) {\n            this.sendResponseToWebview({\n              command: \"response\",\n              data: result,\n              syncRequestId,\n            });\n          }\n          break;\n        case \"showErrorMessage\":\n          const args = params as {\n            infoMessage: string;\n            items: any[];\n          };\n          window.showErrorMessage(args.infoMessage, ...(args.items || []));\n          break;\n        case \"showWarningMessage\":\n          this.handleWarningMessage(\n            params as Parameters<typeof this.handleWarningMessage>[\"0\"],\n            syncRequestId,\n          );\n          break;\n        case \"findPackageVersion\":\n          this.handleSyncRequestFromWebview(\n            syncRequestId,\n            () => {\n              try {\n                return this.queryManifestService\n                  .getProject()\n                  ?.findPackageVersion(params.packageName as string);\n              } catch (err) {\n                this.dbtTerminal.debug(\n                  \"findPackageVersion\",\n                  (err as Error).message,\n                );\n              }\n              return undefined;\n            },\n            command,\n            false,\n          );\n\n          break;\n        case \"queryResultTab:render\":\n          this.emitterService.fire({\n            command: \"queryResultTab:render\",\n            payload: params,\n          });\n          break;\n        default:\n          break;\n      }\n    } catch (err) {\n      this.dbtTerminal.error(\n        \"altimateWebviewProvider:handleCommand\",\n        \"error while handling command\",\n        err,\n      );\n    }\n  }\n\n  protected async checkIfWebviewReady() {\n    return new Promise<void>((resolve) => {\n      const interval = setInterval(() => {\n        if (this.isWebviewReady) {\n          clearInterval(interval);\n          resolve();\n        }\n      }, 500);\n    });\n  }\n\n  resolveWebviewView(\n    panel: WebviewView,\n    context: WebviewViewResolveContext<unknown>,\n    _token: CancellationToken,\n  ): void | Thenable<void> {\n    this._panel = panel;\n    this.setupWebviewOptions(context);\n    this.renderWebviewView(this._panel!.webview);\n  }\n\n  private setupWebviewOptions(context: WebviewViewResolveContext) {\n    if (this._panel && \"description\" in this._panel) {\n      this._panel.description = this.panelDescription;\n    }\n    this._panel!.webview.options = <WebviewOptions>{\n      enableScripts: true,\n      localResourceRoots: [\n        Uri.file(\n          path.join(\n            this.dbtProjectContainer.extensionUri.fsPath,\n            \"webview_panels\",\n            \"dist\",\n            \"assets\",\n          ),\n        ),\n      ],\n    };\n  }\n\n  protected getHtml(webview: Webview, extensionUri: Uri) {\n    const indexJs = webview.asWebviewUri(\n      Uri.file(\n        path.join(\n          extensionUri.fsPath,\n          \"webview_panels\",\n          \"dist\",\n          \"assets\",\n          \"main.js\",\n        ),\n      ),\n    );\n    const indexCss = webview.asWebviewUri(\n      Uri.file(\n        path.join(\n          extensionUri.fsPath,\n          \"webview_panels\",\n          \"dist\",\n          \"assets\",\n          \"main.css\",\n        ),\n      ),\n    );\n    const SpinnerUrl = webview.asWebviewUri(\n      Uri.file(\n        path.join(\n          extensionUri.fsPath,\n          \"webview_panels\",\n          \"dist\",\n          \"assets\",\n          \"spinner.gif\",\n        ),\n      ),\n    );\n    const LineageGif = webview.asWebviewUri(\n      Uri.file(\n        path.join(\n          extensionUri.fsPath,\n          \"webview_panels\",\n          \"dist\",\n          \"assets\",\n          \"lineage.gif\",\n        ),\n      ),\n    );\n    const AltimateCodeBannerUrl = webview.asWebviewUri(\n      Uri.file(\n        path.join(\n          extensionUri.fsPath,\n          \"webview_panels\",\n          \"dist\",\n          \"assets\",\n          \"altimate-code-banner-sml.png\",\n        ),\n      ),\n    );\n\n    // Tutorial images - convert URIs to strings for serialization\n    const GenerateModelFromSourceGif = webview.asWebviewUri(\n      Uri.file(\n        path.join(\n          extensionUri.fsPath,\n          \"webview_panels\",\n          \"dist\",\n          \"assets\",\n          \"generate-model-from-source.gif\",\n        ),\n      ),\n    );\n    const GenerateModelFromSQLGif = webview.asWebviewUri(\n      Uri.file(\n        path.join(\n          extensionUri.fsPath,\n          \"webview_panels\",\n          \"dist\",\n          \"assets\",\n          \"generate-model-from-SQL.gif\",\n        ),\n      ),\n    );\n    const AutocompleteModelGif = webview.asWebviewUri(\n      Uri.file(\n        path.join(\n          extensionUri.fsPath,\n          \"webview_panels\",\n          \"dist\",\n          \"assets\",\n          \"autocomplete-model.gif\",\n        ),\n      ),\n    );\n    const AutocompleteMacroGif = webview.asWebviewUri(\n      Uri.file(\n        path.join(\n          extensionUri.fsPath,\n          \"webview_panels\",\n          \"dist\",\n          \"assets\",\n          \"autocomplete-macro.gif\",\n        ),\n      ),\n    );\n    const AutocompleteSourceGif = webview.asWebviewUri(\n      Uri.file(\n        path.join(\n          extensionUri.fsPath,\n          \"webview_panels\",\n          \"dist\",\n          \"assets\",\n          \"autocomplete-source.gif\",\n        ),\n      ),\n    );\n    const DefinitionModelGif = webview.asWebviewUri(\n      Uri.file(\n        path.join(\n          extensionUri.fsPath,\n          \"webview_panels\",\n          \"dist\",\n          \"assets\",\n          \"definition-model.gif\",\n        ),\n      ),\n    );\n    const DefinitionMacroGif = webview.asWebviewUri(\n      Uri.file(\n        path.join(\n          extensionUri.fsPath,\n          \"webview_panels\",\n          \"dist\",\n          \"assets\",\n          \"definition-macro.gif\",\n        ),\n      ),\n    );\n    const QueryResultsAndSQLGif = webview.asWebviewUri(\n      Uri.file(\n        path.join(\n          extensionUri.fsPath,\n          \"webview_panels\",\n          \"dist\",\n          \"assets\",\n          \"query-results-and-SQL.gif\",\n        ),\n      ),\n    );\n    const EDAAndExportGif = webview.asWebviewUri(\n      Uri.file(\n        path.join(\n          extensionUri.fsPath,\n          \"webview_panels\",\n          \"dist\",\n          \"assets\",\n          \"EDA-and-export.gif\",\n        ),\n      ),\n    );\n    const QueryExplanationGif = webview.asWebviewUri(\n      Uri.file(\n        path.join(\n          extensionUri.fsPath,\n          \"webview_panels\",\n          \"dist\",\n          \"assets\",\n          \"query-explanation.gif\",\n        ),\n      ),\n    );\n    const GraphGif = webview.asWebviewUri(\n      Uri.file(\n        path.join(\n          extensionUri.fsPath,\n          \"webview_panels\",\n          \"dist\",\n          \"assets\",\n          \"graph.gif\",\n        ),\n      ),\n    );\n    const DocsEditorGif = webview.asWebviewUri(\n      Uri.file(\n        path.join(\n          extensionUri.fsPath,\n          \"webview_panels\",\n          \"dist\",\n          \"assets\",\n          \"docs-editor.gif\",\n        ),\n      ),\n    );\n    const DocGenerationUsingAiGif = webview.asWebviewUri(\n      Uri.file(\n        path.join(\n          extensionUri.fsPath,\n          \"webview_panels\",\n          \"dist\",\n          \"assets\",\n          \"doc-generation-using-ai.gif\",\n        ),\n      ),\n    );\n    const ModelLineageGif = webview.asWebviewUri(\n      Uri.file(\n        path.join(\n          extensionUri.fsPath,\n          \"webview_panels\",\n          \"dist\",\n          \"assets\",\n          \"model-lineage.gif\",\n        ),\n      ),\n    );\n    const ColumnLineageGif = webview.asWebviewUri(\n      Uri.file(\n        path.join(\n          extensionUri.fsPath,\n          \"webview_panels\",\n          \"dist\",\n          \"assets\",\n          \"column-lineage.gif\",\n        ),\n      ),\n    );\n    const ProjectScanGif = webview.asWebviewUri(\n      Uri.file(\n        path.join(\n          extensionUri.fsPath,\n          \"webview_panels\",\n          \"dist\",\n          \"assets\",\n          \"project-scan.gif\",\n        ),\n      ),\n    );\n\n    const codiconsUri = webview.asWebviewUri(\n      Uri.joinPath(\n        extensionUri,\n        \"webview_panels\",\n        \"dist\",\n        \"assets\",\n        \"codicons\",\n        \"codicon.css\",\n      ),\n    );\n\n    const nonce = getNonce();\n    return `\n        <!DOCTYPE html>\n          <html lang=\"en\">\n          <head>\n            <meta charset=\"UTF-8\">\n            <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n            <!--\n              Use a content security policy to only allow loading images from https or from our extension directory,\n              and only allow scripts that have a specific nonce.\n              Added unsafe-inline for css due to csp issue: https://github.com/JedWatson/react-select/issues/4631\n              -->\n            <meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'none'; worker-src blob:; font-src ${webview.cspSource}; style-src 'unsafe-inline' ${webview.cspSource}; img-src ${webview.cspSource} https: data:; script-src 'unsafe-eval' 'nonce-${nonce}' https://*.vscode-resource.vscode-cdn.net; connect-src https://*.s3.amazonaws.com\">\n            <title>VSCode DBT Power user extension</title>\n            <link rel=\"stylesheet\" type=\"text/css\" href=\"${indexCss}\">\n            <link rel=\"stylesheet\" type=\"text/css\" href=\"${codiconsUri}\">\n          </head>\n      \n          <body class=\"${this.viewPath.replace(/\\//g, \"\")}\">\n            <div id=\"root\"></div>\n            <div id=\"sidebar\"></div>\n            <div id=\"modal\"></div>\n            <script nonce=\"${nonce}\" >\n              window.viewPath = \"${this.viewPath}\";\n              var spinnerUrl = \"${SpinnerUrl}\"\n              var lineageGif = \"${LineageGif}\"\n              window.altimateCodeBannerUrl = \"${AltimateCodeBannerUrl}\";\n              window.tutorialImages = {\n                generateModelFromSource: \"${GenerateModelFromSourceGif}\",\n                generateModelFromSQL: \"${GenerateModelFromSQLGif}\",\n                autocompleteModel: \"${AutocompleteModelGif}\",\n                autocompleteMacro: \"${AutocompleteMacroGif}\",\n                autocompleteSource: \"${AutocompleteSourceGif}\",\n                definitionModel: \"${DefinitionModelGif}\",\n                definitionMacro: \"${DefinitionMacroGif}\",\n                queryResultsAndSQL: \"${QueryResultsAndSQLGif}\",\n                edaAndExport: \"${EDAAndExportGif}\",\n                queryExplanation: \"${QueryExplanationGif}\",\n                graph: \"${GraphGif}\",\n                docsEditor: \"${DocsEditorGif}\",\n                docGenerationUsingAi: \"${DocGenerationUsingAiGif}\",\n                modelLineage: \"${ModelLineageGif}\",\n                columnLineage: \"${ColumnLineageGif}\",\n                projectScan: \"${ProjectScanGif}\"\n              }\n            </script>\n            \n            <script nonce=\"${nonce}\" type=\"module\" src=\"${indexJs}\"></script>\n          </body>\n        </html>\n      `;\n  }\n\n  dispose() {\n    while (this._disposables.length) {\n      const x = this._disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n}\n\nfunction getNonce() {\n  let text = \"\";\n  const possible =\n    \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n  for (let i = 0; i < 32; i++) {\n    text += possible.charAt(Math.floor(Math.random() * possible.length));\n  }\n  return text;\n}\n"
  },
  {
    "path": "src/webview_provider/datapilotPanel.ts",
    "content": "import { DBTTerminal } from \"@altimateai/dbt-integration\";\nimport { inject } from \"inversify\";\nimport { commands, Range, window } from \"vscode\";\nimport { AltimateRequest, QueryAnalysisType } from \"../altimate\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { AltimateAuthService } from \"../services/altimateAuthService\";\nimport { DbtTestService } from \"../services/dbtTestService\";\nimport { DocGenService } from \"../services/docGenService\";\nimport { FileService } from \"../services/fileService\";\nimport {\n  QueryAnalysisService,\n  QueryTranslateExplanationIncomingRequest,\n  QueryTranslateIncomingRequest,\n} from \"../services/queryAnalysisService\";\nimport { QueryManifestService } from \"../services/queryManifestService\";\nimport { SharedStateService } from \"../services/sharedStateService\";\nimport { UsersService } from \"../services/usersService\";\nimport { TelemetryService } from \"../telemetry\";\nimport {\n  AltimateWebviewProvider,\n  HandleCommandProps,\n  SharedStateEventEmitterProps,\n} from \"./altimateWebviewProvider\";\n\nexport class DataPilotPanel extends AltimateWebviewProvider {\n  public static readonly viewType = \"dbtPowerUser.datapilot-webview\";\n  protected viewPath = \"/datapilot\";\n  protected panelDescription = \"Datapilot view\";\n  private incomingMessages: Record<string, unknown>[] = [];\n\n  public constructor(\n    dbtProjectContainer: DBTProjectContainer,\n    telemetry: TelemetryService,\n    protected altimateRequest: AltimateRequest,\n    private docGenService: DocGenService,\n    protected emitterService: SharedStateService,\n    protected queryAnalysisService: QueryAnalysisService,\n    protected queryManifestService: QueryManifestService,\n    @inject(\"DBTTerminal\")\n    protected dbtTerminal: DBTTerminal,\n    private dbtTestService: DbtTestService,\n    private fileService: FileService,\n    protected usersService: UsersService,\n    protected altimateAuthService: AltimateAuthService,\n  ) {\n    super(\n      dbtProjectContainer,\n      altimateRequest,\n      telemetry,\n      emitterService,\n      dbtTerminal,\n      queryManifestService,\n      usersService,\n      altimateAuthService,\n    );\n\n    commands.registerCommand(\"dbtPowerUser.resetDatapilot\", () =>\n      this.sendResponseToWebview({\n        command: \"datapilot:reset\",\n      }),\n    );\n  }\n\n  async handleCommand(message: HandleCommandProps): Promise<void> {\n    const { command, syncRequestId, ...params } = message;\n    const queryText = window.activeTextEditor?.document.getText();\n\n    switch (command) {\n      case \"sendFeedback\":\n        if (!queryText) {\n          return;\n        }\n        this.docGenService.sendFeedback({\n          queryText,\n          message,\n          panel: this._panel,\n          syncRequestId,\n        });\n        break;\n\n      case \"generateDocsForModel\":\n        if (!queryText) {\n          return;\n        }\n        this.docGenService.generateDocsForModel({\n          queryText,\n          documentation: (\n            await this.docGenService.getCompiledDocumentationForCurrentActiveFile()\n          ).documentation,\n          message,\n          panel: this._panel,\n          project: this.queryManifestService.getProject(),\n          columnIndexCount: undefined,\n          isBulkGen: false,\n        });\n        break;\n\n      case \"generateDocsForColumn\":\n        await this.docGenService.generateDocsForColumns({\n          documentation: (\n            await this.docGenService.getCompiledDocumentationForCurrentActiveFile()\n          ).documentation,\n          panel: this._panel,\n          message,\n          project: this.queryManifestService.getProject(),\n          isBulkGen: false,\n        });\n        break;\n\n      case \"docgen:insert\":\n      case \"testgen:insert\":\n        this.emitterService.eventEmitter.fire({\n          command: command,\n          payload: params,\n        });\n        break;\n\n      case \"querytranslate\":\n        this.handleSyncRequestFromWebview(\n          syncRequestId,\n          async () => {\n            const response =\n              (await this.queryAnalysisService.executeQueryTranslate(\n                params as unknown as QueryTranslateIncomingRequest,\n              )) as {\n                translatedSql: string;\n                userSql: string;\n              };\n            return { response };\n          },\n          command,\n          true,\n        );\n        break;\n      case \"querytranslate:explanation\":\n        this.handleSyncRequestFromWebview(\n          syncRequestId,\n          async () => {\n            const response =\n              await this.queryAnalysisService.executeQueryTranslateExplanation(\n                params as unknown as QueryTranslateExplanationIncomingRequest,\n                syncRequestId,\n              );\n            return { response };\n          },\n          command,\n          true,\n        );\n        break;\n      case \"queryAnalysis:explain\":\n        this.handleSyncRequestFromWebview(\n          syncRequestId,\n          async () => {\n            const response =\n              await this.queryAnalysisService.executeQueryAnalysis(\n                params,\n                QueryAnalysisType.EXPLAIN,\n                syncRequestId,\n              );\n            return { response };\n          },\n          command,\n          true,\n        );\n        break;\n\n      case \"queryAnalysis:modify\":\n        this.handleSyncRequestFromWebview(\n          syncRequestId,\n          async () => {\n            const response =\n              await this.queryAnalysisService.executeQueryAnalysis(\n                params,\n                QueryAnalysisType.MODIFY,\n                syncRequestId,\n              );\n            return { response };\n          },\n          command,\n          true,\n        );\n        break;\n\n      case \"dbttest:create\":\n        this.handleSyncRequestFromWebview(\n          syncRequestId,\n          async () => {\n            const response = await this.dbtTestService.createTest(\n              params,\n              syncRequestId,\n            );\n            return { response };\n          },\n          command,\n          true,\n        );\n        break;\n\n      case \"file:replace-contents\":\n        if (!params.sql || !params.filePath) {\n          return;\n        }\n        this.dbtTerminal.debug(\n          \"datapilotpanel:replace_file_contents\",\n          \"replacing translated sql\",\n          params,\n        );\n        const editor = await this.fileService.openFileByPath(\n          params.filePath as string,\n        );\n\n        editor.edit((edit) => {\n          const file = editor.document;\n          edit.replace(\n            new Range(\n              file.lineAt(0).range.start,\n              file.lineAt(file.lineCount - 1).range.end,\n            ),\n            params.sql as string,\n          );\n        });\n        break;\n\n      case \"queryanalysis:followup\":\n        this.handleSyncRequestFromWebview(\n          syncRequestId,\n          async () => {\n            const response =\n              await this.queryAnalysisService.getFollowupQuestions(\n                params as { query: string; user_request: string },\n              );\n            return response;\n          },\n          command,\n          true,\n        );\n        break;\n\n      default:\n        super.handleCommand(message);\n        break;\n    }\n  }\n\n  protected async onEvent({ command, payload }: SharedStateEventEmitterProps) {\n    switch (command) {\n      case \"datapilot:toggle\":\n        await commands.executeCommand(\"dbtPowerUser.datapilot-webview.focus\");\n        break;\n\n      case \"datapilot:message\":\n        await commands.executeCommand(\"dbtPowerUser.datapilot-webview.focus\");\n        if (!this.isWebviewReady) {\n          this.incomingMessages.push(payload);\n          return;\n        }\n        this.postToWebview(payload);\n        break;\n\n      case \"dbtPowerUser.summarizeQuery\":\n        this.handleDatapilotEvent(QueryAnalysisType.EXPLAIN, payload);\n        break;\n\n      case \"dbtPowerUser.changeQuery\":\n        this.handleDatapilotEvent(QueryAnalysisType.MODIFY, payload);\n        break;\n\n      case \"dbtPowerUser.translateQuery\":\n        this.handleDatapilotEvent(QueryAnalysisType.TRANSLATE, payload);\n        break;\n\n      case \"dbtPowerUser.openDatapilotWithQuery\":\n        this.handleDatapilotEvent(null, payload);\n        break;\n\n      case \"dbtPowerUser.openHelpInDatapilot\":\n        this.sendResponseToWebview({\n          command: \"datapilot:showHelp\",\n        });\n        break;\n\n      default:\n        super.onEvent({ command, payload });\n        break;\n    }\n  }\n\n  protected onWebviewReady() {\n    super.onWebviewReady();\n\n    if (!this._panel) {\n      return;\n    }\n\n    while (this.incomingMessages.length) {\n      this.postToWebview(this.incomingMessages.pop());\n    }\n  }\n\n  private postToWebview(message: Record<string, unknown> | undefined) {\n    if (this._panel && message) {\n      const command = (\n        \"command\" in message ? message.command : \"datapilot:message\"\n      ) as string;\n\n      this.sendResponseToWebview({\n        command,\n        args: {\n          filePath: window.activeTextEditor?.document.uri.fsPath,\n          ...message,\n        },\n      });\n    }\n  }\n\n  // handles events from sharedStateService events\n  private handleDatapilotEvent(\n    analysisType: QueryAnalysisType | null,\n    data?: { query?: string; meta?: Record<string, unknown> },\n  ) {\n    // reset the datapilot to start new session\n    this.sendResponseToWebview({\n      command: \"datapilot:reset\",\n      args: {},\n    });\n    const queryData = this.queryAnalysisService.getSelectedQuery();\n    if (!queryData) {\n      return;\n    }\n    this.emitterService.fire({\n      command: \"datapilot:message\",\n      payload: {\n        command: \"datapilot:message\",\n        // data.query will be passed from query panel webview\n        query: data?.query || queryData.query,\n        fileName: queryData.fileName,\n        requestType: \"QUERY_ANALYSIS\",\n        state: \"UNINITIALIZED\",\n        //If analysis type is undefined, dont trigger api call\n        analysisType,\n        meta: data?.meta,\n      },\n    });\n  }\n}\n"
  },
  {
    "path": "src/webview_provider/docsEditPanel.ts",
    "content": "import {\n  DBTTerminal,\n  Table,\n  TestMetaData,\n  TestMetadataAcceptedValues,\n  TestMetadataRelationships,\n} from \"@altimateai/dbt-integration\";\nimport { existsSync, readFileSync, writeFileSync } from \"fs\";\nimport { inject } from \"inversify\";\nimport { PythonException } from \"python-bridge\";\nimport { gte } from \"semver\";\nimport {\n  CancellationToken,\n  CancellationTokenSource,\n  ColorThemeKind,\n  Disposable,\n  env,\n  ProgressLocation,\n  TextEditor,\n  Uri,\n  Webview,\n  WebviewOptions,\n  WebviewView,\n  WebviewViewProvider,\n  WebviewViewResolveContext,\n  window,\n  workspace,\n} from \"vscode\";\nimport { parse, parseDocument, stringify, YAMLMap, YAMLSeq } from \"yaml\";\nimport { AltimateRequest, UserInputError } from \"../altimate\";\nimport { DBTProject } from \"../dbt_client/dbtProject\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport {\n  ManifestCacheChangedEvent,\n  ManifestCacheProjectAddedEvent,\n} from \"../dbt_client/event/manifestCacheChangedEvent\";\nimport { DbtLineageService } from \"../services/dbtLineageService\";\nimport { DbtTestService } from \"../services/dbtTestService\";\nimport {\n  DocGenService,\n  DocumentationSchema,\n  DocumentationSchemaColumn,\n} from \"../services/docGenService\";\nimport { TelemetryService } from \"../telemetry\";\nimport { TelemetryEvents } from \"../telemetry/events\";\nimport {\n  extendErrorWithSupportLinks,\n  getColumnNameByCase,\n  getColumnTestConfigFromYml,\n  isAcceptedValues,\n  isColumnNameEqual,\n  isQuotedIdentifier,\n  isRelationship,\n  removeProtocol,\n} from \"../utils\";\nimport { SendMessageProps } from \"./altimateWebviewProvider\";\nimport { NewDocsGenPanel } from \"./newDocsGenPanel\";\nimport path = require(\"path\");\n\nexport enum Source {\n  YAML = \"YAML\",\n  DATABASE = \"DATABASE\",\n}\n\ninterface MetadataColumn {\n  name: string;\n  type?: string;\n}\n\ninterface DBTDocumentationColumn extends MetadataColumn {\n  description?: string;\n  generated: boolean;\n  source: Source;\n}\n\nexport interface DBTDocumentation {\n  name: string;\n  description: string;\n  columns: DBTDocumentationColumn[];\n  generated: boolean;\n  aiEnabled: boolean;\n  filePath: string;\n  patchPath?: string;\n  uniqueId?: string;\n  resource_type?: string;\n}\n\nexport interface AIColumnDescription {\n  name: string;\n  description: string;\n  citations?: { id: string; content: string }[];\n}\n\nexport interface DocsGenPanelView extends WebviewViewProvider {\n  handleCommand(message: { command: string; args: any }): Promise<void> | void;\n  resolveWebview(\n    panel: WebviewView,\n    context: WebviewViewResolveContext,\n    token: CancellationToken,\n  ): void;\n}\n\nexport class DocsEditViewPanel implements WebviewViewProvider {\n  public static readonly viewType = \"dbtPowerUser.DocsEdit\";\n  private panel: WebviewView | undefined;\n  private context: WebviewViewResolveContext<unknown> | undefined;\n  private token: CancellationToken | undefined;\n  private _panel: WebviewView | undefined = undefined;\n  private documentation?: DBTDocumentation;\n  private loadedFromManifest = false;\n  private eventMap: Map<string, ManifestCacheProjectAddedEvent> = new Map();\n  private _disposables: Disposable[] = [];\n  private onMessageDisposable: Disposable | undefined;\n  private cancellationTokenSource: CancellationTokenSource | undefined;\n\n  public constructor(\n    private dbtProjectContainer: DBTProjectContainer,\n    private altimateRequest: AltimateRequest,\n    private telemetry: TelemetryService,\n    private newDocsPanel: NewDocsGenPanel,\n    private docGenService: DocGenService,\n    private dbtTestService: DbtTestService,\n    @inject(\"DBTTerminal\")\n    private terminal: DBTTerminal,\n    private dbtLineageService: DbtLineageService,\n  ) {\n    dbtProjectContainer.onManifestChanged((event) =>\n      this.onManifestCacheChanged(event),\n    );\n    window.onDidChangeActiveColorTheme(\n      async (e) => {\n        if (this._panel) {\n          this.updateGraphStyle();\n        }\n      },\n      null,\n      this._disposables,\n    );\n    window.onDidChangeActiveTextEditor(\n      async (event: TextEditor | undefined) => {\n        this.documentation = undefined;\n        if (event === undefined) {\n          return;\n        }\n        if (this._panel) {\n          this.transmitData();\n          this.updateGraphStyle();\n        }\n      },\n    );\n  }\n\n  private getProject(): DBTProject | undefined {\n    if (!window.activeTextEditor) {\n      return undefined;\n    }\n    const currentFilePath = window.activeTextEditor.document.uri;\n    return this.dbtProjectContainer.findDBTProject(currentFilePath);\n  }\n\n  private async transmitError() {\n    if (this._panel) {\n      await this._panel.webview.postMessage({\n        command: \"renderError\",\n      });\n    }\n  }\n\n  private async transmitData() {\n    const { documentation, message } =\n      await this.docGenService.getUncompiledDocumentationForCurrentActiveFile();\n    this.documentation = documentation;\n    if (this._panel) {\n      await this._panel.webview.postMessage({\n        command: \"renderDocumentation\",\n        docs: this.documentation,\n        missingDocumentationMessage: message,\n        tests: await this.dbtTestService.getTestsForCurrentModel(),\n        project: this.getProject()?.getProjectName(),\n        collaborationEnabled: workspace\n          .getConfiguration(\"dbt\")\n          .get<boolean>(\"enableCollaboration\", false),\n        docBlocks: this.getDocBlocksForCurrentProject(),\n      });\n    }\n  }\n\n  private getDocBlocksForCurrentProject(): Array<{\n    name: string;\n    path: string;\n  }> {\n    const project = this.getProject();\n    if (!project) {\n      return [];\n    }\n\n    const manifestEvent = this.eventMap.get(project.projectRoot.fsPath);\n    if (!manifestEvent?.docMetaMap) {\n      return [];\n    }\n\n    return Array.from(manifestEvent.docMetaMap.entries()).map(\n      ([name, metaData]) => ({\n        name,\n        path: metaData.path,\n      }),\n    );\n  }\n\n  private async transmitColumns(columns: MetadataColumn[]) {\n    if (this._panel) {\n      await this._panel.webview.postMessage({\n        command: \"renderColumnsFromMetadataFetch\",\n        columns,\n      });\n    }\n  }\n\n  private async transmitConfig() {\n    if (this._panel) {\n      await this._panel.webview.postMessage({\n        command: \"updateConfig\",\n        config: { aiEnabled: this.altimateRequest.enabled() },\n      });\n    }\n  }\n\n  private async updateGraphStyle() {\n    const theme = [\n      ColorThemeKind.Light,\n      ColorThemeKind.HighContrastLight,\n    ].includes(window.activeColorTheme.kind)\n      ? \"light\"\n      : \"dark\";\n\n    if (this._panel) {\n      await this._panel.webview.postMessage({\n        command: \"setStylesByTheme\",\n        theme: theme,\n      });\n    }\n  }\n  public async resolveWebviewView(\n    panel: WebviewView,\n    context: WebviewViewResolveContext,\n    token: CancellationToken,\n  ) {\n    this.panel = panel;\n    this.context = context;\n    this.token = token;\n    this._panel = panel;\n    this.newDocsPanel.resolveWebview(panel, context, token);\n    this.setupWebviewHooks(context);\n    this.transmitConfig();\n    this.transmitData();\n  }\n\n  public async resolveWebview(\n    panel: WebviewView,\n    context: WebviewViewResolveContext,\n    _token: CancellationToken,\n  ) {\n    this._panel = panel;\n    this.setupWebviewOptions(context);\n    this.renderWebviewView(context);\n    this.updateGraphStyle();\n  }\n\n  private renderWebviewView(context: WebviewViewResolveContext) {\n    const webview = this._panel!.webview!;\n    webview.html = getHtml(webview, this.dbtProjectContainer.extensionUri);\n  }\n\n  private setupWebviewOptions(context: WebviewViewResolveContext) {\n    this._panel!.title = \"\";\n    this._panel!.description = \"Edit model documentation\";\n    this._panel!.webview.options = <WebviewOptions>{ enableScripts: true };\n  }\n\n  private init = async () => {\n    await this.resolveWebviewView(this.panel!, this.context!, this.token!);\n  };\n\n  private getTestDataByModel(\n    message: any,\n    modelName: string,\n    project?: DBTProject,\n    existingModel?: any,\n  ) {\n    const tests = message.updatedTests as undefined | TestMetaData[];\n\n    if (!tests?.length) {\n      this.terminal.debug(\n        \"docsEditViewPanel:getTestDataByModel\",\n        \"No test data passed\",\n      );\n      return;\n    }\n\n    const updatedTests = tests.filter((test) => {\n      const modelNameInTest = test.test_metadata?.kwargs.model;\n      if (test.column_name || !modelNameInTest) {\n        return false;\n      }\n      if (modelNameInTest === modelName) {\n        return true;\n      }\n      // model name could be {{ get_where_subquery(ref('dim_hosts_cleansed')) }}\n      if (modelNameInTest.match(/'([^']+)'/)?.[1] === modelName) {\n        return true;\n      }\n      return false;\n    });\n\n    const finalTests = updatedTests\n      .map((test) => {\n        if (!test?.test_metadata) {\n          return null;\n        }\n        const { name, namespace, kwargs } = test.test_metadata;\n        const fullName: string = namespace ? `${namespace}.${name}` : name;\n        // Add extra config from external packages or test macros\n        const testMetaKwargs = this.getTestMetadataKwArgs(kwargs, fullName);\n        return testMetaKwargs || fullName;\n      })\n      .filter((t) => Boolean(t));\n    const filteredTests = this.dbtTestService.removeDuplicateTests(finalTests);\n    if (!filteredTests.length) {\n      return;\n    }\n\n    // dbt >= 1.8 renamed model-level `tests:` to `data_tests:`. Mirror the\n    // column-level selection logic: prefer `data_tests` on new dbt versions,\n    // but preserve `tests` if the user's YAML already uses that key.\n    const dbtVersion = project?.getDBTVersion();\n    if (\n      dbtVersion &&\n      gte(dbtVersion.join(\".\"), \"1.8.0\") &&\n      existingModel?.tests === undefined\n    ) {\n      return { data_tests: filteredTests };\n    }\n\n    return { tests: filteredTests };\n  }\n\n  private getTestMetadataKwArgs(\n    kwargs: TestMetadataAcceptedValues | TestMetadataRelationships,\n    fullName: string,\n  ) {\n    if (kwargs) {\n      const rest = Object.entries(kwargs).reduce(\n        (acc: Record<string, unknown>, [key, value]) => {\n          // Ignore these fields as it will be added by default\n          if (key === \"column_name\" || key === \"model\") {\n            return acc;\n          }\n\n          acc[key] = value;\n          return acc;\n        },\n        {},\n      );\n      if (Object.keys(rest)?.length) {\n        return {\n          [fullName]: rest,\n        };\n      }\n    }\n  }\n  private getTestDataByColumn(\n    message: any,\n    columnNameFromWebview: string,\n    project: DBTProject,\n    existingColumn?: any,\n  ) {\n    const tests = message.updatedTests as undefined | TestMetaData[];\n\n    if (!tests?.length) {\n      this.terminal.debug(\n        \"docsEditViewPanel:getTestDataByColumn\",\n        \"No test data passed\",\n      );\n      return;\n    }\n\n    const columnTests = tests.filter((test) =>\n      isColumnNameEqual(test.column_name, columnNameFromWebview),\n    );\n\n    // No tests for this column - may be all deleted\n    if (!columnTests.length) {\n      return;\n    }\n\n    const data = columnTests.map((test) => {\n      if (!test.test_metadata) {\n        return null;\n      }\n      const { name, namespace, kwargs } = test.test_metadata;\n      const testFullName: string = namespace ? `${namespace}.${name}` : name;\n\n      const columnTestConfigFromYml = getColumnTestConfigFromYml(\n        existingColumn?.tests,\n        kwargs,\n        testFullName,\n      );\n      // If relationships test, set field and to\n      if (isRelationship(kwargs)) {\n        const { to, field } = kwargs;\n        return {\n          relationships: {\n            ...columnTestConfigFromYml,\n            field,\n            to,\n          },\n        };\n      }\n\n      // set values if test is accepted_values\n      if (isAcceptedValues(kwargs)) {\n        return {\n          accepted_values: {\n            ...columnTestConfigFromYml,\n            values: kwargs.values,\n          },\n        };\n      }\n\n      if (columnTestConfigFromYml) {\n        return columnTestConfigFromYml;\n      }\n\n      // Add extra config from external packages or test macros\n      const testMetaKwargs = this.getTestMetadataKwArgs(kwargs, testFullName);\n      return testMetaKwargs || testFullName;\n    });\n\n    this.terminal.debug(\n      \"docsEditViewPanel:getTestDataByColumn\",\n      \"test data\",\n      false,\n      data,\n      columnNameFromWebview,\n    );\n\n    if (!data.length) {\n      return;\n    }\n\n    const dataWithoutDupes = this.dbtTestService.removeDuplicateTests(data);\n    const dbtVersion = project.getDBTVersion();\n    if (\n      dbtVersion &&\n      gte(dbtVersion.join(\".\"), \"1.8.0\") && // Compare versions\n      existingColumn?.name === columnNameFromWebview &&\n      existingColumn?.tests === undefined\n    ) {\n      return {\n        data_tests: dataWithoutDupes,\n      };\n    }\n\n    return {\n      tests: dataWithoutDupes,\n    };\n  }\n\n  private modifyColumnNames = (\n    columns: { name: string }[],\n    existingColumnNames: string[],\n  ) => {\n    return columns.map((c) => {\n      // find a column from schema.yml with same name ignoring case\n      const existingColumn = existingColumnNames.find(\n        (name) => name.toLowerCase() === c.name.toLowerCase(),\n      );\n      // column exists with matching name, so use name from schema.yml\n      if (existingColumn) {\n        return { ...c, name: existingColumn };\n      }\n\n      // new column, save the name by checking the config\n      return {\n        ...c,\n        name: c.name,\n      };\n    });\n  };\n\n  private convertColumnNamesByCaseConfig(\n    columns: { name: string }[],\n    modelName: string,\n    project: DBTProject,\n  ) {\n    if (!columns.length) {\n      return [];\n    }\n\n    const patchPath = this.documentation?.patchPath;\n    // if new project, and no schema.yml\n    if (!patchPath) {\n      return columns;\n    }\n\n    const docFile: string = readFileSync(\n      path.join(project.projectRoot.fsPath, removeProtocol(patchPath)),\n    ).toString(\"utf8\");\n    const parsedDocFile =\n      parse(docFile, {\n        strict: false,\n        uniqueKeys: false,\n        maxAliasCount: -1,\n      }) || {};\n\n    const model = parsedDocFile.models?.find(\n      (model: any) => model.name === modelName,\n    );\n\n    // new model and does not exist in schema.yml\n    if (!model) {\n      return columns;\n    }\n\n    const existingColumnNames =\n      (model.columns as { name: string }[])?.map((c) => c.name) || [];\n\n    return this.modifyColumnNames(columns, existingColumnNames);\n  }\n\n  private setOrDeleteInParsedDocument(\n    doc: YAMLMap<unknown, unknown>,\n    key: string,\n    value: any,\n  ) {\n    if (value) {\n      doc.set(key, value);\n    } else {\n      doc.delete(key);\n    }\n  }\n\n  private findEntityInParsedDoc(\n    models:\n      | YAMLSeq<DocumentationSchema[\"models\"][\"0\"]>\n      | YAMLSeq<DocumentationSchemaColumn>\n      | undefined,\n    predicate: (name: string) => boolean,\n  ) {\n    if (models && models.items) {\n      return (\n        // @ts-ignore\n        (models.items.find(\n          (\n            item:\n              | DocumentationSchema[\"models\"][\"0\"]\n              | DocumentationSchemaColumn,\n          ) => {\n            if (item instanceof YAMLMap) {\n              const name = item.get(\"name\");\n              return name && predicate(name as string);\n            }\n            return false;\n          },\n        ) as YAMLMap | undefined) || null\n      );\n    }\n    return null;\n  }\n\n  private setupWebviewHooks(context: WebviewViewResolveContext) {\n    // Clear this listener before subscribing again\n    if (this.onMessageDisposable) {\n      this.onMessageDisposable.dispose();\n      this.onMessageDisposable = undefined;\n    }\n    this.onMessageDisposable = this._panel!.webview.onDidReceiveMessage(\n      async (message) => {\n        this.terminal.debug(\n          \"docsEditPanel:setupWebviewHooks\",\n          \"onDidReceiveMessage\",\n          message,\n        );\n        if (\n          window.activeTextEditor === undefined ||\n          this.eventMap === undefined\n        ) {\n          return undefined;\n        }\n        const queryText = window.activeTextEditor.document.getText();\n        const currentFilePath = window.activeTextEditor.document.uri;\n        const project = this.getProject();\n        if (project === undefined) {\n          return undefined;\n        }\n\n        const { command, syncRequestId, ...params } = message;\n        switch (command) {\n          case \"generateTestsForColumns\":\n            const testSuggestionsForModel =\n              await this.dbtTestService.generateTestsForColumns(\n                project,\n                this._panel,\n              );\n            this._panel?.webview?.postMessage({\n              command: \"testgen:insert\",\n              tests: testSuggestionsForModel\n                ? {\n                    ...testSuggestionsForModel,\n                    columns: this.convertColumnNamesByCaseConfig(\n                      testSuggestionsForModel.columns,\n                      testSuggestionsForModel.name,\n                      project,\n                    ),\n                  }\n                : undefined,\n              model: testSuggestionsForModel?.name,\n            });\n            break;\n          case \"fetchMetadataFromDatabase\":\n            this.telemetry.startTelemetryEvent(\n              TelemetryEvents[\"DocumentationEditor/SyncWithDBClick\"],\n            );\n            window.withProgress(\n              {\n                title: \"Syncing columns with metadata from database\",\n                location: ProgressLocation.Notification,\n                cancellable: false,\n              },\n              async () => {\n                const modelName = path.basename(currentFilePath.fsPath, \".sql\");\n                try {\n                  const columnsInRelation =\n                    await project.getColumnsOfModel(modelName);\n                  const columns = this.convertColumnNamesByCaseConfig(\n                    columnsInRelation.map((column) => {\n                      return {\n                        name: column.column,\n                        type: column.dtype.toLowerCase(),\n                      };\n                    }),\n                    modelName,\n                    project,\n                  );\n                  this.transmitColumns(columns);\n                  if (syncRequestId) {\n                    this._panel!.webview.postMessage({\n                      command: \"response\",\n                      args: {\n                        syncRequestId,\n                        body: {\n                          columns,\n                        },\n                        status: true,\n                      },\n                    });\n                  }\n                  this.telemetry.endTelemetryEvent(\n                    TelemetryEvents[\"DocumentationEditor/SyncWithDBClick\"],\n                  );\n                } catch (exc) {\n                  this.transmitError();\n                  this.telemetry.endTelemetryEvent(\n                    TelemetryEvents[\"DocumentationEditor/SyncWithDBClick\"],\n                    exc,\n                  );\n                  if (exc instanceof PythonException) {\n                    window.showErrorMessage(\n                      `An error occured while fetching metadata for ${modelName} from the database: ` +\n                        exc.exception.message,\n                    );\n                    this.terminal.error(\n                      \"docsEditPanelLoadPythonError\",\n                      `An error occured while fetching metadata for ${modelName} from the database`,\n                      exc,\n                      false,\n                    );\n                    return;\n                  }\n                  window.showErrorMessage(\n                    `An error occured while fetching metadata for ${modelName} from the database: ` +\n                      exc,\n                  );\n                  this.terminal.error(\n                    \"docsEditPanelLoadError\",\n                    `An error occured while fetching metadata for ${modelName} from the database`,\n                    exc,\n                    false,\n                  );\n                  if (syncRequestId) {\n                    this._panel!.webview.postMessage({\n                      command: \"response\",\n                      args: {\n                        syncRequestId,\n                        body: {},\n                        status: false,\n                      },\n                    });\n                  }\n                }\n              },\n            );\n\n            break;\n          case \"generateDocsForModel\":\n            this.docGenService.generateDocsForModel({\n              queryText,\n              documentation: this.documentation,\n              message,\n              panel: this._panel,\n              project,\n              columnIndexCount: undefined,\n              isBulkGen: false,\n            });\n            break;\n          case \"generateDocsForColumn\":\n            await this.docGenService.generateDocsForColumns({\n              documentation: this.documentation,\n              panel: this._panel,\n              message,\n              project,\n              isBulkGen: message.isBulkGen,\n            });\n            break;\n          case \"sendFeedback\":\n            this.docGenService.sendFeedback({\n              queryText,\n              message,\n              panel: this._panel,\n            });\n            break;\n          case \"getDownstreamColumns\": {\n            const targets = params.targets as [string, string][];\n            const testsResult = await Promise.all(\n              targets.map(async (t) => {\n                if (!t[0].startsWith(\"model\")) {\n                  return;\n                }\n                const splits = t[0].split(\".\");\n                const modelName = splits[splits.length - 1];\n                return await this.dbtTestService.getTestsForModel(modelName);\n              }),\n            );\n            const tests: Record<string, unknown> = {};\n            targets.forEach((t, i) => {\n              tests[t[0]] = testsResult[i];\n            });\n            const _tables = targets\n              .map(\n                (t) =>\n                  this.dbtLineageService.getUpstreamTables({ table: t[0] })\n                    ?.tables,\n              )\n              .filter((t) => Boolean(t))\n              .flat() as Table[];\n            const tables = _tables.map((t) => t?.table);\n            if (tables.length === 0) {\n              this.handleSyncRequestFromWebview(\n                syncRequestId,\n                () => ({ column_lineage: [], tables: [], tests }),\n                \"response\",\n              );\n              return;\n            }\n            const selectedColumn = {\n              table: params.model as string,\n              name: params.column as string,\n            };\n            const currAnd1HopTables = [...tables, ...targets.map((t) => t[0])];\n            this.cancellationTokenSource = new CancellationTokenSource();\n            const columns = await this.dbtLineageService.getConnectedColumns(\n              {\n                targets,\n                currAnd1HopTables,\n                selectedColumn,\n                upstreamExpansion: true,\n                showIndirectEdges: false,\n                eventType: \"documentation_propagation\",\n              },\n              this.cancellationTokenSource!,\n            );\n            this.handleSyncRequestFromWebview(\n              syncRequestId,\n              () => ({ ...columns, tables: _tables, tests }),\n              \"response\",\n            );\n            break;\n          }\n          case \"cancelColumnLineage\": {\n            this.cancellationTokenSource?.cancel();\n            break;\n          }\n          case \"saveDocumentation\":\n            this.telemetry.sendTelemetryEvent(\n              TelemetryEvents[\"DocumentationEditor/SaveClick\"],\n            );\n            window.withProgress(\n              {\n                title: \"Saving documentation\",\n                location: ProgressLocation.Notification,\n                cancellable: false,\n              },\n              async () => {\n                await this.saveDocumentation(message, syncRequestId);\n                await this.reloadDocumentationFromManifest();\n                const tests =\n                  await this.dbtTestService.getTestsForCurrentModel();\n                if (syncRequestId) {\n                  this._panel!.webview.postMessage({\n                    command: \"response\",\n                    args: {\n                      syncRequestId,\n                      body: {\n                        saved: true,\n                        tests,\n                        documentation: this.documentation,\n                      },\n                      status: true,\n                    },\n                  });\n                }\n              },\n            );\n            break;\n          case \"saveDocumentationBulk\": {\n            this.telemetry.sendTelemetryEvent(\n              TelemetryEvents[\"DocumentationEditor/SaveBulk\"],\n            );\n\n            // Transform raw data into models array\n            const {\n              allColumns,\n              selectedColumns,\n              tableMetadata,\n              testsMetadata,\n              currentDocsData,\n              startColumns,\n            } = message;\n\n            const defaultPackageName = tableMetadata.filter(\n              (t: any) => t.packageName,\n            )[0]?.packageName;\n            const defaultPatchPath = defaultPackageName\n              ? defaultPackageName + \"://models/schema.yml\"\n              : \"\";\n\n            const models = [];\n\n            for (const item of allColumns) {\n              const key = item.model + \"/\" + item.column;\n              if (!selectedColumns[key]) {\n                continue;\n              }\n              const splits = item.model.split(\".\");\n              const modelName = splits[splits.length - 1];\n              const node = tableMetadata.find(\n                (t: any) => t.table === item.model,\n              );\n              const columnDescription =\n                currentDocsData?.columns.find((c: any) => c.name === item.root)\n                  ?.description ?? \"\";\n              models.push({\n                name: modelName,\n                description: node?.description,\n                columns: [\n                  { name: item.column, description: columnDescription },\n                ],\n                dialogType: \"Existing file\",\n                // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n                patchPath: node?.patchPath || defaultPatchPath,\n                filePath: node?.url,\n                updatedTests: testsMetadata[item.model],\n              });\n            }\n\n            const successfulSaves: string[] = [];\n            for (const item of models) {\n              await this.saveDocumentation(item, syncRequestId);\n              successfulSaves.push(item.name);\n            }\n            if (successfulSaves.length > 0) {\n              window.showInformationMessage(\n                `Successfully propagated to: ${Array.from(new Set(successfulSaves)).join(\", \")}`,\n              );\n              this.altimateRequest.bulkDocsPropCredit({\n                num_columns: startColumns.length,\n                session_id: env.sessionId,\n              });\n            }\n            break;\n          }\n        }\n      },\n      null,\n      this._disposables,\n    );\n  }\n\n  private async reloadDocumentationFromManifest() {\n    // Force reload from manifest after manifest refresh\n    this.loadedFromManifest = false;\n    this.documentation = (\n      await this.docGenService.getUncompiledDocumentationForCurrentActiveFile()\n    ).documentation;\n  }\n\n  private async saveDocumentation(message: any, syncRequestId: string) {\n    let patchPath = message.patchPath;\n    try {\n      const projectByFilePath = this.dbtProjectContainer.findDBTProject(\n        Uri.file(message.filePath),\n      );\n      if (!projectByFilePath) {\n        throw new Error(\"Unable to find project for saving documentation\");\n      }\n      const project = this.getProject();\n      if (project === undefined) {\n        return undefined;\n      }\n\n      if (!patchPath) {\n        switch (message.dialogType) {\n          case \"Existing file\":\n            const openDialog = await window.showOpenDialog({\n              filters: { Yaml: [\"yml\"] },\n              canSelectMany: false,\n            });\n            if (openDialog === undefined || openDialog.length === 0) {\n              return;\n            }\n            patchPath = openDialog[0].fsPath;\n            break;\n          case \"New file\":\n            const saveDialog = await window.showSaveDialog({\n              filters: { Yaml: [\"yml\"] },\n            });\n            if (!saveDialog) {\n              return;\n            }\n            this.telemetry.sendTelemetryEvent(\n              TelemetryEvents[\"DocumentationEditor/SaveNewFilePathSelect\"],\n            );\n            patchPath = saveDialog.fsPath;\n            break;\n        }\n      } else {\n        // the location comes from the manifest, parse it\n        patchPath = path.join(\n          projectByFilePath.projectRoot.fsPath,\n          removeProtocol(patchPath),\n        );\n      }\n      // check if file exists, if not create an empty file\n      if (!existsSync(patchPath)) {\n        writeFileSync(patchPath, \"\");\n      }\n\n      const docFile: string = readFileSync(patchPath).toString(\"utf8\");\n      const parsedDocFile = parseDocument<YAMLSeq<DocumentationSchema>>(\n        docFile,\n        {\n          strict: false,\n          uniqueKeys: false,\n        },\n      );\n      const existingModels = parsedDocFile.get(\"models\") as\n        | YAMLSeq<DocumentationSchema[\"models\"][\"0\"]>\n        | undefined;\n\n      const model = this.findEntityInParsedDoc(\n        existingModels,\n        (name: string) => name === message.name,\n      );\n\n      if (!model) {\n        // there is a models section but the model does not exist yet.\n        const newModelData = {\n          name: message.name,\n          description: message.description?.trim() || undefined,\n          columns: message.columns.length\n            ? message.columns.map((column: any) => {\n                const name = getColumnNameByCase(\n                  column.name,\n                  projectByFilePath.getAdapterType(),\n                );\n                return {\n                  name,\n                  description: column.description?.trim() || undefined,\n                  data_type: column.type?.toLowerCase(),\n                  ...this.getTestDataByColumn(\n                    message,\n                    column.name,\n                    project,\n                    // passing column to get correct key: data_tests or tests\n                    // https://github.com/AltimateAI/vscode-dbt-power-user/issues/1449\n                    { name: column.name },\n                  ),\n                  ...(isQuotedIdentifier(\n                    column.name,\n                    projectByFilePath.getAdapterType(),\n                  )\n                    ? { quote: true }\n                    : undefined),\n                };\n              })\n            : undefined,\n        };\n        // Models does not exist\n        if (existingModels?.items.length) {\n          parsedDocFile.addIn([\"models\"], newModelData);\n        } else {\n          // Models  exist, but current one is new model\n          parsedDocFile.set(\"models\", [newModelData]);\n        }\n      } else {\n        // The model already exists\n        this.setOrDeleteInParsedDocument(\n          model,\n          \"description\",\n          message.description?.trim(),\n        );\n        const modelTests = this.getTestDataByModel(\n          message,\n          model.get(\"name\") as string,\n          project,\n          model.toJSON(),\n        );\n        this.setOrDeleteInParsedDocument(model, \"tests\", modelTests?.tests);\n        this.setOrDeleteInParsedDocument(\n          model,\n          \"data_tests\",\n          modelTests?.data_tests,\n        );\n        if (!model.get(\"columns\")) {\n          model.set(\"columns\", new YAMLSeq<DocumentationSchemaColumn>());\n        }\n        message.columns.forEach((column: any) => {\n          const existingColumn = this.findEntityInParsedDoc(\n            model.get(\"columns\") as\n              | YAMLSeq<DocumentationSchemaColumn>\n              | undefined,\n            (name: string) => isColumnNameEqual(name, column.name),\n          );\n\n          if (existingColumn) {\n            // ignore tests, data_tests from existing column, as it will be recreated in `getTestDataByColumn`\n            const { tests, data_tests, ...rest } = existingColumn.toJSON();\n            this.setOrDeleteInParsedDocument(\n              existingColumn,\n              \"description\",\n              column.description?.trim(),\n            );\n            this.setOrDeleteInParsedDocument(\n              existingColumn,\n              \"data_type\",\n              (rest.data_type || column.type)?.toLowerCase(),\n            );\n            const allTests = this.getTestDataByColumn(\n              message,\n              column.name,\n              project,\n              existingColumn.toJSON(),\n            );\n            this.setOrDeleteInParsedDocument(\n              existingColumn,\n              \"tests\",\n              allTests?.tests,\n            );\n            this.setOrDeleteInParsedDocument(\n              existingColumn,\n              \"data_tests\",\n              allTests?.data_tests,\n            );\n          } else {\n            const name = getColumnNameByCase(\n              column.name,\n              projectByFilePath.getAdapterType(),\n            );\n            model.addIn([\"columns\"], {\n              name,\n              description: column.description?.trim() || undefined,\n              data_type: column.type?.toLowerCase(),\n              ...this.getTestDataByColumn(message, column.name, project),\n              ...(isQuotedIdentifier(\n                column.name,\n                projectByFilePath.getAdapterType(),\n              )\n                ? { quote: true }\n                : undefined),\n            });\n          }\n        });\n\n        // delete columns if they are empty to avoid [] in the yaml file\n        if (\n          (\n            model.get(\"columns\") as\n              | YAMLSeq<DocumentationSchemaColumn>\n              | undefined\n          )?.items.length === 0\n        ) {\n          model.delete(\"columns\");\n        }\n      }\n\n      writeFileSync(patchPath, stringify(parsedDocFile, { lineWidth: 0 }));\n    } catch (error) {\n      this.transmitError();\n      this.telemetry.sendTelemetryError(\n        TelemetryEvents[\"DocumentationEditor/SaveError\"],\n        error,\n      );\n      window.showErrorMessage(\n        `Could not save documentation to ${patchPath}: ${error}`,\n      );\n      this.terminal.error(\n        \"saveDocumentationError\",\n        `Could not save documentation to ${patchPath}`,\n        error,\n        false,\n      );\n      if (syncRequestId) {\n        this._panel!.webview.postMessage({\n          command: \"response\",\n          args: {\n            syncRequestId,\n            body: {\n              saved: false,\n            },\n            status: true,\n          },\n        });\n      }\n    }\n  }\n\n  private async handleSyncRequestFromWebview(\n    syncRequestId: string | undefined,\n    callback: () => any,\n    command: string,\n    showErrorNotification?: boolean,\n  ) {\n    try {\n      const response = await callback();\n\n      this.sendResponseToWebview({\n        command: command || \"response\",\n        syncRequestId,\n        data: response,\n      });\n    } catch (error) {\n      const message =\n        error instanceof PythonException\n          ? error.exception.message\n          : (error as Error).message;\n      if (error instanceof UserInputError) {\n        this.terminal.debug(command, message, error);\n      } else {\n        this.terminal.error(command, message, error);\n      }\n      if (showErrorNotification) {\n        window.showErrorMessage(extendErrorWithSupportLinks(message));\n      }\n      this.sendResponseToWebview({\n        command: \"response\",\n        syncRequestId,\n        error: message,\n      });\n    }\n  }\n\n  private sendResponseToWebview({\n    command,\n    data,\n    error,\n    syncRequestId,\n    ...rest\n  }: SendMessageProps) {\n    this._panel?.webview?.postMessage({\n      command,\n      args: {\n        syncRequestId,\n        body: data,\n        status: !error,\n        error,\n      },\n      ...rest,\n    });\n  }\n\n  private async onManifestCacheChanged(event: ManifestCacheChangedEvent) {\n    event.added?.forEach((added) => {\n      this.eventMap.set(added.project.projectRoot.fsPath, added);\n    });\n    event.removed?.forEach((removed) => {\n      this.eventMap.delete(removed.projectRoot.fsPath);\n    });\n    if (this.documentation !== undefined && this.loadedFromManifest) {\n      // don't reload doc panel if documentation is already set, otherwise the\n      //  documentation will be overwritten by the one coming from the manifest\n      return;\n    }\n    this.loadedFromManifest = true;\n    if (this._panel) {\n      this.transmitData();\n      this.updateGraphStyle();\n    }\n  }\n}\n\nfunction getHtml(webview: Webview, extensionUri: Uri) {\n  const indexPath = getUri(webview, extensionUri, [\n    \"docs_edit_panel\",\n    \"index.html\",\n  ]);\n  const resourceDir = getUri(webview, extensionUri, [\"docs_edit_panel\"]);\n  const theme = [\n    ColorThemeKind.Light,\n    ColorThemeKind.HighContrastLight,\n  ].includes(window.activeColorTheme.kind)\n    ? \"light\"\n    : \"dark\";\n  return readFileSync(indexPath.fsPath)\n    .toString()\n    .replace(/__ROOT__/g, resourceDir.toString())\n    .replace(/__THEME__/g, theme)\n    .replace(/__NONCE__/g, getNonce())\n    .replace(/__CSPSOURCE__/g, webview.cspSource);\n}\n\nfunction getNonce() {\n  let text = \"\";\n  const possible =\n    \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n  for (let i = 0; i < 32; i++) {\n    text += possible.charAt(Math.floor(Math.random() * possible.length));\n  }\n  return text;\n}\n\nfunction getUri(webview: Webview, extensionUri: Uri, pathList: string[]) {\n  return webview.asWebviewUri(Uri.joinPath(extensionUri, ...pathList));\n}\n"
  },
  {
    "path": "src/webview_provider/index.ts",
    "content": "import { Disposable, window } from \"vscode\";\nimport { DataPilotPanel } from \"./datapilotPanel\";\nimport { DocsEditViewPanel } from \"./docsEditPanel\";\nimport { InsightsPanel } from \"./insightsPanel\";\nimport { LineagePanel } from \"./lineagePanel\";\nimport { QueryResultPanel } from \"./queryResultPanel\";\n\nexport class WebviewViewProviders implements Disposable {\n  private disposables: Disposable[] = [];\n\n  constructor(\n    private queryResultPanel: QueryResultPanel,\n    private docsEditPanel: DocsEditViewPanel,\n    private lineagePanel: LineagePanel,\n    private dataPilotPanel: DataPilotPanel,\n    private insightsPanel: InsightsPanel,\n  ) {\n    this.disposables.push(\n      window.registerWebviewViewProvider(\n        QueryResultPanel.viewType,\n        this.queryResultPanel,\n        { webviewOptions: { retainContextWhenHidden: true } },\n      ),\n      window.registerWebviewViewProvider(\n        DocsEditViewPanel.viewType,\n        this.docsEditPanel,\n        { webviewOptions: { retainContextWhenHidden: true } },\n      ),\n      window.registerWebviewViewProvider(\n        LineagePanel.viewType,\n        this.lineagePanel,\n        { webviewOptions: { retainContextWhenHidden: true } },\n      ),\n      window.registerWebviewViewProvider(\n        DataPilotPanel.viewType,\n        this.dataPilotPanel,\n        { webviewOptions: { retainContextWhenHidden: true } },\n      ),\n      window.registerWebviewViewProvider(\n        InsightsPanel.viewType,\n        this.insightsPanel,\n        { webviewOptions: { retainContextWhenHidden: true } },\n      ),\n    );\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/webview_provider/insightsPanel.ts",
    "content": "import {\n  DataPilotHealtCheckParams,\n  DbtIntegrationClient,\n  DBTTerminal,\n  DeferConfig,\n  NotFoundError,\n} from \"@altimateai/dbt-integration\";\nimport { NotebookFileSystemProvider } from \"@lib\";\nimport { inject } from \"inversify\";\nimport {\n  commands,\n  ConfigurationTarget,\n  env,\n  FileChangeEvent,\n  FileChangeType,\n  ProgressLocation,\n  TextEditor,\n  Uri,\n  window,\n  workspace,\n} from \"vscode\";\nimport { AltimateRequest, DBTCoreIntegration } from \"../altimate\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { AltimateAuthService } from \"../services/altimateAuthService\";\nimport { QueryManifestService } from \"../services/queryManifestService\";\nimport { SharedStateService } from \"../services/sharedStateService\";\nimport { UsersService } from \"../services/usersService\";\nimport { TelemetryService } from \"../telemetry\";\nimport { getProjectRelativePath } from \"../utils\";\nimport { ValidationProvider } from \"../validation_provider\";\nimport {\n  AltimateWebviewProvider,\n  HandleCommandProps,\n  UpdateConfigProps,\n} from \"./altimateWebviewProvider\";\n\ntype UpdateConfigPropsArray = {\n  config: UpdateConfigProps[];\n  projectRoot: string;\n};\n\ninterface DbtProject {\n  projectRoot: string;\n  projectName: string;\n}\n\ntype SelectFilesProps = {\n  filters: { [name: string]: string[] } | undefined;\n  canSelectMany: boolean;\n};\n\nenum PromptAnswer {\n  YES = \"Install altimate datapilot cli\",\n}\n\nexport class InsightsPanel extends AltimateWebviewProvider {\n  public static readonly viewType = \"dbtPowerUser.Insights\";\n  protected viewPath = \"/insights\";\n  protected panelDescription = \"Toggle Defer to prod and other features\";\n\n  private projectIntegrations: DBTCoreIntegration[] | undefined;\n\n  public constructor(\n    protected dbtProjectContainer: DBTProjectContainer,\n    protected altimateRequest: AltimateRequest,\n    private dbtIntegrationClient: DbtIntegrationClient,\n    protected telemetry: TelemetryService,\n    protected emitterService: SharedStateService,\n    @inject(\"DBTTerminal\")\n    protected dbtTerminal: DBTTerminal,\n    protected queryManifestService: QueryManifestService,\n    private validationProvider: ValidationProvider,\n    protected usersService: UsersService,\n    private notebookFileSystemProvider: NotebookFileSystemProvider,\n    protected altimateAuthService: AltimateAuthService,\n  ) {\n    super(\n      dbtProjectContainer,\n      altimateRequest,\n      telemetry,\n      emitterService,\n      dbtTerminal,\n      queryManifestService,\n      usersService,\n      altimateAuthService,\n    );\n\n    this._disposables.push(\n      window.onDidChangeActiveTextEditor(\n        async (event: TextEditor | undefined) => {\n          if (event === undefined) {\n            return;\n          }\n\n          if (this._panel) {\n            const currentProject = await this.getCurrentProject();\n\n            const dbtIntegrationMode = workspace\n              .getConfiguration(\"dbt\")\n              .get<string>(\"dbtIntegration\", \"core\");\n\n            const projectPath = this.getCurrentProject();\n            if (!projectPath) {\n              this.dbtTerminal.warn(\"InsightsPanel\", \"No project selected\");\n              return;\n            }\n\n            this.sendResponseToWebview({\n              command: \"renderDeferConfig\",\n              data: {\n                config: currentProject?.getDeferConfig(),\n                projectPath: currentProject?.projectRoot.fsPath,\n                dbtIntegrationMode,\n              },\n            });\n          }\n        },\n      ),\n    );\n\n    this._disposables.push(\n      this.notebookFileSystemProvider.onDidChangeFile(\n        (e: FileChangeEvent[]) => {\n          const createdEvent = e.find(\n            (event) => event.type === FileChangeType.Created,\n          );\n          if (createdEvent) {\n            this.sendResponseToWebview({\n              command: \"refetchNotebooks\",\n              data: {},\n            });\n          }\n        },\n      ),\n    );\n  }\n\n  private getCurrentProject() {\n    const currentFilePath = window.activeTextEditor?.document.uri;\n    if (!currentFilePath) {\n      this.dbtTerminal.debug(\"InsightsPanel\", \"No file selected in the editor\");\n      return;\n    }\n\n    const currentProject =\n      this.dbtProjectContainer.findDBTProject(currentFilePath);\n    return currentProject;\n  }\n\n  private async updateDeferConfig(\n    syncRequestId: string | undefined,\n    params: UpdateConfigPropsArray,\n  ) {\n    try {\n      this.dbtTerminal.debug(\"InsightsPanel\", \"Updating defer config\", params);\n      if (!params.projectRoot) {\n        window.showErrorMessage(\"Please select a project\");\n        return;\n      }\n\n      const updateConfigs = params.config;\n      const target = workspace.workspaceFolders\n        ? ConfigurationTarget.WorkspaceFolder\n        : ConfigurationTarget.Global;\n\n      this.dbtTerminal.debug(\n        \"InsightsPanel\",\n        \"config target: ${window.activeTextEditor?.document.uri}\",\n      );\n\n      const currentConfig: Record<string, DeferConfig> = workspace\n        .getConfiguration(\"dbt\")\n        .get(\"deferConfigPerProject\", {});\n      const root = getProjectRelativePath(Uri.file(params.projectRoot));\n\n      this.dbtTerminal.info(\n        \"Defer config\",\n        \"updating defer config\",\n        true,\n        root,\n        updateConfigs,\n      );\n\n      const newConfig = {\n        ...currentConfig,\n        [root]: {\n          ...currentConfig[root],\n          ...updateConfigs.reduce((acc: Record<string, any>, param) => {\n            acc[param.key] = param.value;\n            return acc;\n          }, {}),\n        },\n      };\n\n      const workspaceFolder = workspace.getWorkspaceFolder(\n        Uri.file(params.projectRoot),\n      );\n      await workspace\n        .getConfiguration(\"dbt\", workspaceFolder)\n        .update(\"deferConfigPerProject\", newConfig, target);\n\n      if (syncRequestId) {\n        this.sendResponseToWebview({\n          command: \"response\",\n          syncRequestId,\n          data: {\n            updated: true,\n          },\n        });\n      }\n\n      if (\n        !(\n          currentConfig[root].deferToProduction ===\n            newConfig[root].deferToProduction &&\n          currentConfig[root].manifestPathForDeferral ===\n            newConfig[root].manifestPathForDeferral &&\n          currentConfig[root].favorState === newConfig[root].favorState\n        )\n      ) {\n        window.withProgress(\n          {\n            location: ProgressLocation.Notification,\n            title: \"Applying defer config...\",\n            cancellable: false,\n          },\n          async () => {\n            await this.dbtProjectContainer\n              .findDBTProject(Uri.file(params.projectRoot))\n              ?.applyDeferConfig();\n          },\n        );\n      }\n    } catch (err) {\n      this.dbtTerminal.error(\n        \"InsightsPanel\",\n        \"error while updating defer config\",\n        err,\n      );\n      this.sendResponseToWebview({\n        command: \"response\",\n        syncRequestId,\n        data: {\n          updated: false,\n        },\n        error: (err as Error).message,\n      });\n    }\n  }\n\n  private async fetchProjectIntegrations(\n    syncRequestId: string | undefined,\n    params: { clearCache?: boolean },\n  ) {\n    try {\n      if (params.clearCache) {\n        this.projectIntegrations = undefined;\n      }\n      if (this.projectIntegrations) {\n        if (syncRequestId) {\n          this.sendResponseToWebview({\n            command: \"response\",\n            syncRequestId,\n            data: this.projectIntegrations,\n          });\n        }\n        return;\n      }\n\n      if (!this.altimateAuthService.handlePreviewFeatures()) {\n        this.projectIntegrations = [];\n        if (syncRequestId) {\n          this.sendResponseToWebview({\n            command: \"response\",\n            syncRequestId,\n            data: this.projectIntegrations,\n          });\n        }\n        return;\n      }\n\n      this.dbtTerminal.debug(\"InsightsPanel\", \"Fetching project integrations\");\n      const response = await this.altimateRequest.fetchProjectIntegrations();\n\n      if (!response?.length) {\n        this.dbtTerminal.debug(\"InsightsPanel\", \"Missing project integrations\");\n        window\n          .showInformationMessage(\n            \"You need to set up integration in SaaS. Please check the documentation\",\n            ...[\"View\", \"Cancel\"],\n          )\n          .then((selection) => {\n            if (selection === \"View\") {\n              env.openExternal(\n                Uri.parse(\"https://docs.myaltimate.com/test/defertoprod\"),\n              );\n            }\n          });\n      }\n\n      this.projectIntegrations = response;\n      if (syncRequestId) {\n        this.sendResponseToWebview({\n          command: \"response\",\n          syncRequestId,\n          data: response,\n        });\n      }\n    } catch (err) {\n      this.dbtTerminal.error(\n        \"InsightsPanel\",\n        `could not fetch project integrations`,\n        err,\n      );\n      this.sendResponseToWebview({\n        command: \"response\",\n        syncRequestId,\n        data: {\n          response: [],\n        },\n        error: (err as Error).message,\n      });\n    }\n  }\n\n  private async testRemoteManifest(\n    syncRequestId: string | undefined,\n    dbtCoreIntegrationId: number,\n  ) {\n    try {\n      this.dbtTerminal.debug(\"InsightsPanel\", \"Fetching manifest signed url\");\n      const response = await this.dbtIntegrationClient.fetchArtifactUrl(\n        \"manifest\",\n        dbtCoreIntegrationId,\n      );\n      if (syncRequestId) {\n        this.sendResponseToWebview({\n          command: \"response\",\n          syncRequestId,\n          body: response,\n        });\n      }\n    } catch (err) {\n      const errorMessage =\n        err instanceof NotFoundError\n          ? \"No remote manifest file present for selected dbt core integration\"\n          : (err as Error).message;\n      window.showErrorMessage(\n        `Could not download remote manifest: ${errorMessage}`,\n      );\n      this.dbtTerminal.error(\n        \"InsightsPanel\",\n        `could not download remote manifest`,\n        err,\n      );\n      this.sendResponseToWebview({\n        command: \"response\",\n        syncRequestId,\n        data: {\n          response: [],\n        },\n        error: (err as Error).message,\n      });\n    }\n  }\n\n  private async getProjects(syncRequestId: string | undefined) {\n    try {\n      this.dbtTerminal.debug(\"InsightsPanel\", \"Fetching projects\");\n      const projects = this.dbtProjectContainer.getProjects();\n\n      const dbtProjects: DbtProject[] = [];\n\n      projects.forEach((i) => {\n        const projectName = i.getProjectName();\n        const projectRoot = i.projectRoot;\n        dbtProjects.push({\n          projectName: projectName,\n          projectRoot: projectRoot.fsPath,\n        });\n      });\n\n      if (syncRequestId) {\n        this.sendResponseToWebview({\n          command: \"response\",\n          syncRequestId,\n          data: dbtProjects,\n        });\n      }\n    } catch (err) {\n      this.dbtTerminal.error(\n        \"InsightsPanel\",\n        `could not fetch project integrations`,\n        err,\n      );\n      this.sendResponseToWebview({\n        command: \"response\",\n        syncRequestId,\n        data: {\n          response: [],\n        },\n        error: (err as Error).message,\n      });\n    }\n  }\n\n  private async selectDirectoryForManifest(syncRequestId?: string) {\n    const openDialog = await window.showOpenDialog({\n      filters: {},\n      canSelectFolders: true,\n      openLabel: \"Select\",\n      canSelectFiles: false,\n      canSelectMany: false,\n    });\n    if (openDialog === undefined || openDialog.length === 0) {\n      this.dbtTerminal.debug(\"InsightsPanel\", \"opendialog cancelled\");\n      this.sendResponseToWebview({\n        command: \"response\",\n        syncRequestId,\n        data: { error: \"Folder not selected\" },\n        error: \"Folder not selected\",\n      });\n      return;\n    }\n\n    this.sendResponseToWebview({\n      command: \"response\",\n      syncRequestId,\n      data: { path: openDialog[0].fsPath },\n    });\n  }\n\n  private async selectFiles(\n    syncRequestId: string | undefined,\n    { filters = {}, canSelectMany = false }: SelectFilesProps,\n  ) {\n    const openDialog = await window.showOpenDialog({\n      filters,\n      canSelectFolders: false,\n      openLabel: \"Select\",\n      canSelectFiles: true,\n      canSelectMany,\n    });\n    if (openDialog === undefined || openDialog.length === 0) {\n      this.dbtTerminal.debug(\"InsightsPanel\", \"opendialog cancelled\");\n      this._panel!.webview.postMessage({\n        command: \"response\",\n        args: {\n          syncRequestId,\n          body: { error: \"File not selected\" },\n          status: false,\n        },\n      });\n      return;\n    }\n\n    this._panel!.webview.postMessage({\n      command: \"response\",\n      args: {\n        syncRequestId,\n        body: { path: openDialog.map((i) => i.fsPath) },\n        status: true,\n      },\n    });\n  }\n\n  private emitError(syncRequestId: string | undefined, errorMsg: string) {\n    window.showErrorMessage(errorMsg);\n    this._panel!.webview.postMessage({\n      command: \"response\",\n      args: { syncRequestId, status: false, error: errorMsg },\n    });\n  }\n\n  private async altimateScan(\n    syncRequestId: string | undefined,\n    args: DataPilotHealtCheckParams,\n  ) {\n    try {\n      this.validationProvider.throwIfNotAuthenticated();\n      await this.altimateRequest.logDBTHealthcheckStartScan();\n    } catch (e) {\n      this.emitError(syncRequestId, (e as Error).message);\n      return;\n    }\n    let isInstalled = false;\n    try {\n      isInstalled =\n        await this.dbtProjectContainer.checkIfAltimateDatapilotInstalled();\n    } catch (e) {\n      this.emitError(\n        syncRequestId,\n        `Error while checking altimate datapilot cli installation: ${\n          (e as Error).message\n        }`,\n      );\n      this.dbtTerminal.error(\n        \"atimateDatapilotInstallationCheck\",\n        \"Error while checking altimate datapilot cli installation\",\n        e,\n      );\n      return;\n    }\n    if (!isInstalled) {\n      const answer = await window.showInformationMessage(\n        \"Altimate datapilot cli is not detected. Install it?\",\n        PromptAnswer.YES,\n      );\n      if (answer !== PromptAnswer.YES) {\n        this.emitError(\n          syncRequestId,\n          \"Altimate datapilot cli is not installed.\",\n        );\n        return;\n      }\n      try {\n        await window.withProgress(\n          {\n            title: `Installing altimate-datapilot-cli...`,\n            location: ProgressLocation.Notification,\n            cancellable: false,\n          },\n          async () => {\n            await this.dbtProjectContainer.installAltimateDatapilot();\n            window.showInformationMessage(\n              \"Successfully installed altimate-datapilot-cli\",\n            );\n          },\n        );\n      } catch (e) {\n        this.emitError(\n          syncRequestId,\n          `Error while installing altimate datapilot cli: ${\n            (e as Error).message\n          }`,\n        );\n        this.dbtTerminal.error(\n          \"atimateDatapilotInstallation\",\n          \"Error while installing altimate datapilot\",\n          e,\n        );\n        return;\n      }\n    }\n    this.telemetry.sendTelemetryEvent(\"performDatapilotHealthcheck\", {\n      args: JSON.stringify(args),\n    });\n    try {\n      window.showInformationMessage(\n        \"Started performing healthcheck. We will notify you once it's done.\",\n      );\n\n      const projectHealthcheck =\n        await this.dbtProjectContainer.executeAltimateDatapilotHealthcheck(\n          args,\n        );\n      if (this._panel?.visible) {\n        window.showInformationMessage(\"Healthcheck completed successfully.\");\n        this._panel!.webview.postMessage({\n          command: \"response\",\n          args: {\n            syncRequestId,\n            body: { projectHealthcheck },\n            status: true,\n          },\n        });\n        return;\n      }\n      const result = await window.showInformationMessage(\n        \"Healthcheck completed successfully.\",\n        \"View results\",\n      );\n      if (result === \"View results\") {\n        this.dbtTerminal.debug(\n          \"InsightsPanel\",\n          \"Sending healthcheck results to webview\",\n        );\n        await commands.executeCommand(\"dbtPowerUser.Insights.focus\");\n      }\n      this._panel!.webview.postMessage({\n        command: \"response\",\n        args: {\n          syncRequestId,\n          body: { projectHealthcheck },\n          status: true,\n        },\n      });\n    } catch (e) {\n      this.emitError(\n        syncRequestId,\n        `Error while performing project governance checks:${\n          (e as Error).message\n        }`,\n      );\n      this.dbtTerminal.error(\n        \"atimateDatapilotGovernance\",\n        \"Error while performing project governance checks\",\n        e,\n      );\n    }\n  }\n\n  async handleCommand(message: HandleCommandProps): Promise<void> {\n    const { command, syncRequestId, ...params } = message;\n\n    switch (command) {\n      case \"getNotebooks\":\n        this.handleSyncRequestFromWebview(\n          syncRequestId,\n          async () =>\n            await this.altimateRequest.getNotebooks(\n              \"\",\n              [],\n              params.privacy as string,\n            ),\n          command,\n          true,\n        );\n        break;\n      case \"getPreConfiguredNotebooks\":\n        this.handleSyncRequestFromWebview(\n          syncRequestId,\n          async () => await this.altimateRequest.getPreConfiguredNotebooks(),\n          command,\n          true,\n        );\n        break;\n      case \"updateNotebookPrivacy\":\n        this.handleSyncRequestFromWebview(\n          syncRequestId,\n          async () =>\n            await this.altimateRequest.updateNotebookPrivacy(\n              params.notebookId as number,\n              params.privacy as string,\n            ),\n          command,\n          true,\n        );\n        break;\n      case \"selectDirectoryForManifest\":\n        this.selectDirectoryForManifest(syncRequestId);\n        break;\n      case \"selectFiles\":\n        this.selectFiles(syncRequestId, params as SelectFilesProps);\n        break;\n      case \"updateDeferConfig\":\n        await this.updateDeferConfig(\n          syncRequestId,\n          params as UpdateConfigPropsArray,\n        );\n        break;\n      case \"bigqueryCostEstimate\":\n        this.dbtTerminal.debug(\n          \"InsightsPanel\",\n          \"insights_panel:handleCommand -> bigqueryCostEstimate\",\n        );\n        const result = await commands.executeCommand(\n          \"dbtPowerUser.bigqueryCostEstimate\",\n          { returnResult: true },\n        );\n\n        this.sendResponseToWebview({\n          command: \"response\",\n          syncRequestId,\n          data: result,\n        });\n        break;\n      case \"altimateScan\":\n        this.altimateScan(syncRequestId, params as DataPilotHealtCheckParams);\n        break;\n      case \"clearAltimateScanResults\":\n        commands.executeCommand(\"dbtPowerUser.clearAltimateScanResults\", {});\n        break;\n      case \"getDeferToProductionConfig\":\n        const { projectRoot } = params as { projectRoot?: string };\n        const project = this.getCurrentProject();\n        if (!project) {\n          this.sendResponseToWebview({\n            command: \"response\",\n            syncRequestId,\n            data: {\n              error: \"No project selected\",\n            },\n            error: \"No project selected\",\n          });\n          return;\n        }\n        const projectPath = project.projectRoot.fsPath;\n        const config = project.getDeferConfig();\n        this.dbtTerminal.debug(\n          \"InsightsPanel\",\n          `getting defer config for ${projectPath}`,\n          projectRoot,\n        );\n\n        const dbtIntegrationMode = workspace\n          .getConfiguration(\"dbt\")\n          .get<string>(\"dbtIntegration\", \"core\");\n\n        this.sendResponseToWebview({\n          command: \"response\",\n          syncRequestId,\n          data: {\n            config,\n            projectPath,\n            dbtIntegrationMode,\n          },\n        });\n        break;\n      case \"fetchProjectIntegrations\":\n        await this.fetchProjectIntegrations(\n          syncRequestId,\n          params as { clearCache?: boolean },\n        );\n        break;\n      case \"testRemoteManifest\":\n        const { dbtCoreIntegrationId } = params as {\n          dbtCoreIntegrationId: number;\n        };\n        await this.testRemoteManifest(syncRequestId, dbtCoreIntegrationId);\n        break;\n      case \"getProjects\":\n        await this.getProjects(syncRequestId);\n        break;\n      case \"logDBTHealthcheckConfig\":\n        try {\n          await this.altimateRequest.logDBTHealthcheckConfig(\n            params.configId as string,\n          );\n        } catch (err) {\n          this.dbtTerminal.error(\n            \"InsightsPanelError\",\n            \"Error logging healthcheck config\",\n            err,\n          );\n        }\n        break;\n      case \"getInsightConfigs\":\n        await this.handleSyncRequestFromWebview(\n          syncRequestId,\n          async () => await this.altimateRequest.getHealthcheckConfigs(),\n          command,\n          true,\n        );\n        break;\n      default:\n        super.handleCommand(message);\n        break;\n    }\n  }\n}\n"
  },
  {
    "path": "src/webview_provider/lineagePanel.ts",
    "content": "import { DBTTerminal } from \"@altimateai/dbt-integration\";\nimport { inject } from \"inversify\";\nimport {\n  CancellationToken,\n  commands,\n  Disposable,\n  TextEditor,\n  Uri,\n  WebviewView,\n  WebviewViewProvider,\n  WebviewViewResolveContext,\n  window,\n} from \"vscode\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport {\n  ManifestCacheChangedEvent,\n  ManifestCacheProjectAddedEvent,\n} from \"../dbt_client/event/manifestCacheChangedEvent\";\nimport { TelemetryService } from \"../telemetry\";\nimport { NewLineagePanel } from \"./newLineagePanel\";\n\nexport interface LineagePanelView extends WebviewViewProvider {\n  init(): void;\n  eventMapChanged(eventMap: Map<string, ManifestCacheProjectAddedEvent>): void;\n  changedActiveColorTheme(): void;\n  changedActiveTextEditor(event: TextEditor | undefined): void;\n  handleCommand(message: { command: string; args: any }): Promise<void> | void;\n}\n\nexport class LineagePanel implements WebviewViewProvider, Disposable {\n  public static readonly viewType = \"dbtPowerUser.Lineage\";\n\n  private panel: WebviewView | undefined;\n  private context: WebviewViewResolveContext<unknown> | undefined;\n  private token: CancellationToken | undefined;\n  private eventMap: Map<string, ManifestCacheProjectAddedEvent> = new Map();\n  private disposables: Disposable[] = [];\n\n  public constructor(\n    private lineagePanel: NewLineagePanel,\n    private dbtProjectContainer: DBTProjectContainer,\n    private telemetry: TelemetryService,\n    @inject(\"DBTTerminal\")\n    private dbtTerminal: DBTTerminal,\n  ) {\n    this.disposables.push(\n      dbtProjectContainer.onManifestChanged((event) =>\n        this.onManifestCacheChanged(event),\n      ),\n    );\n    window.onDidChangeActiveColorTheme(\n      async (e) => {\n        this.getPanel().changedActiveColorTheme();\n      },\n      null,\n      this.disposables,\n    );\n    window.onDidChangeActiveTextEditor((event: TextEditor | undefined) => {\n      this.getPanel().changedActiveTextEditor(event);\n    });\n  }\n\n  private getPanel() {\n    return this.lineagePanel;\n  }\n\n  private onManifestCacheChanged(event: ManifestCacheChangedEvent): void {\n    event.added?.forEach((added) => {\n      this.eventMap.set(added.project.projectRoot.fsPath, added);\n    });\n    event.removed?.forEach((removed) => {\n      this.eventMap.delete(removed.projectRoot.fsPath);\n    });\n    this.getPanel().eventMapChanged(this.eventMap);\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n\n  private init = async () => {\n    await this.getPanel().resolveWebviewView(\n      this.panel!,\n      this.context!,\n      this.token!,\n    );\n    this.getPanel().eventMapChanged(this.eventMap);\n  };\n\n  resolveWebviewView(\n    panel: WebviewView,\n    context: WebviewViewResolveContext<unknown>,\n    token: CancellationToken,\n  ): void | Thenable<void> {\n    this.panel = panel;\n    this.context = context;\n    this.token = token;\n\n    this.init();\n    panel.webview.onDidReceiveMessage(this.handleWebviewMessage, null, []);\n    const sendLineageViewEvent = () => {\n      if (this.panel!.visible) {\n        this.telemetry.sendTelemetryEvent(\"NewLineagePanelActive\");\n      }\n    };\n    sendLineageViewEvent();\n    panel.onDidChangeVisibility(sendLineageViewEvent);\n  }\n\n  private handleWebviewMessage = async (message: {\n    command: string;\n    args: any;\n  }) => {\n    this.dbtTerminal.debug(\n      \"lineagePanel:handleWebviewMessage\",\n      \"message\",\n      message,\n    );\n    const { command, args } = message;\n    // common commands\n    if (command === \"openFile\") {\n      const url = args.params?.url;\n      if (!url) {\n        return;\n      }\n      await commands.executeCommand(\"vscode.open\", Uri.file(url), {\n        preview: false,\n        preserveFocus: true,\n      });\n      return;\n    }\n\n    if (command === \"init\") {\n      this.getPanel()?.init();\n      return;\n    }\n\n    if (command === \"reactError\") {\n      const typeMapper: { [key: string]: string } = {\n        generic: \"Generic\",\n      };\n      const { type } = args;\n      this.telemetry.sendTelemetryEvent(\n        \"ReactError:\" + typeMapper[type as keyof typeof typeMapper] ||\n          \"Unknown\",\n      );\n    }\n\n    // specific commands\n    // Will add specific events in respective places in the future\n    // this.telemetry.sendTelemetryEvent(command);\n    this.getPanel().handleCommand(message);\n  };\n}\n"
  },
  {
    "path": "src/webview_provider/newDocsGenPanel.ts",
    "content": "import { DBTTerminal, TestMetaData } from \"@altimateai/dbt-integration\";\nimport { readFileSync } from \"fs\";\nimport { inject } from \"inversify\";\nimport {\n  CancellationToken,\n  Range,\n  WebviewView,\n  WebviewViewResolveContext,\n  window,\n  workspace,\n} from \"vscode\";\nimport { AltimateRequest } from \"../altimate\";\nimport { ConversationProvider } from \"../comment_provider/conversationProvider\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { ManifestCacheChangedEvent } from \"../dbt_client/event/manifestCacheChangedEvent\";\nimport { AltimateAuthService } from \"../services/altimateAuthService\";\nimport { ConversationService } from \"../services/conversationService\";\nimport { DbtTestService } from \"../services/dbtTestService\";\nimport { DocGenService } from \"../services/docGenService\";\nimport { QueryManifestService } from \"../services/queryManifestService\";\nimport { SharedStateService } from \"../services/sharedStateService\";\nimport { UsersService } from \"../services/usersService\";\nimport { TelemetryService } from \"../telemetry\";\nimport {\n  AltimateWebviewProvider,\n  HandleCommandProps,\n  SharedStateEventEmitterProps,\n} from \"./altimateWebviewProvider\";\nimport { DbtDocsView } from \"./DbtDocsView\";\nimport { DocsGenPanelView } from \"./docsEditPanel\";\n\nexport class NewDocsGenPanel\n  extends AltimateWebviewProvider\n  implements DocsGenPanelView\n{\n  public static readonly viewType = \"dbtPowerUser.DocsEdit\";\n  protected viewPath = \"/docs-generator\";\n  protected panelDescription = \"Generate documentation for your models\";\n\n  public constructor(\n    dbtProjectContainer: DBTProjectContainer,\n    protected altimateRequest: AltimateRequest,\n    telemetry: TelemetryService,\n    private docGenService: DocGenService,\n    protected emitterService: SharedStateService,\n    protected queryManifestService: QueryManifestService,\n    @inject(\"DBTTerminal\")\n    protected dbtTerminal: DBTTerminal,\n    private dbtTestService: DbtTestService,\n    protected userService: UsersService,\n    private dbtDocsView: DbtDocsView,\n    private conversationProvider: ConversationProvider,\n    private conversationService: ConversationService,\n    protected altimateAuthService: AltimateAuthService,\n  ) {\n    super(\n      dbtProjectContainer,\n      altimateRequest,\n      telemetry,\n      emitterService,\n      dbtTerminal,\n      queryManifestService,\n      userService,\n      altimateAuthService,\n    );\n  }\n\n  protected onManifestCacheChanged(event: ManifestCacheChangedEvent): void {\n    super.onManifestCacheChanged(event);\n  }\n\n  protected onWebviewReady() {\n    super.onWebviewReady();\n    this.transmitConversationsData();\n  }\n\n  private transmitConversationsData() {\n    const conversations = this.conversationService.getConversations();\n    if (!conversations) {\n      return;\n    }\n    Object.entries(conversations).forEach(([shareId, conversationGroups]) => {\n      this.sendResponseToWebview({\n        command: \"conversations:updates\",\n        shareId,\n        conversationGroups,\n      });\n    });\n  }\n\n  resolveWebview(\n    panel: WebviewView,\n    context: WebviewViewResolveContext<unknown>,\n    token: CancellationToken,\n  ): void {\n    super.resolveWebviewView(panel, context, token);\n  }\n\n  private getDbtTestCode(test: TestMetaData, modelName: string) {\n    const { path: testPath, column_name } = test;\n    this.dbtTerminal.debug(\n      \"getDbtTestCode\",\n      \"getting sql and config\",\n      testPath,\n      column_name,\n      modelName,\n    );\n\n    return {\n      sql: testPath?.endsWith(\".sql\")\n        ? readFileSync(testPath, { encoding: \"utf-8\" })\n        : undefined,\n      config: this.dbtTestService.getConfigByTest(test, modelName, column_name),\n    };\n  }\n\n  private async createConversation({\n    comment,\n    ...params\n  }: {\n    meta?: Record<string, unknown>;\n    comment?: string;\n  }) {\n    if (!window.activeTextEditor?.document.uri) {\n      throw new Error(\"Invalid file\");\n    }\n    if (!comment) {\n      throw new Error(\"Invalid comment\");\n    }\n\n    const result = await this.conversationProvider.saveConversation(\n      comment as string,\n      window.activeTextEditor.document.uri,\n\n      params.meta,\n      new Range(0, 0, 0, 0),\n      \"documentation-editor\",\n    );\n    if (!result?.shareId) {\n      return;\n    }\n    return {\n      [result.shareId]:\n        await this.conversationService.loadConversationsByShareId(\n          result.shareId,\n        ),\n    };\n  }\n\n  async handleCommand(message: HandleCommandProps): Promise<void> {\n    const { command, syncRequestId, ...args } = message;\n\n    switch (command) {\n      case \"refetchConversations\":\n        this.emitterService.fire({ command, payload: args });\n        break;\n      case \"createConversation\":\n        this.handleSyncRequestFromWebview(\n          syncRequestId,\n          async () => {\n            return this.createConversation(args);\n          },\n          command,\n        );\n        break;\n      case \"getTestCode\":\n        this.handleSyncRequestFromWebview(\n          syncRequestId,\n          async () => {\n            return this.getDbtTestCode(\n              args.test as TestMetaData,\n              args.model as string,\n            );\n          },\n          command,\n        );\n        break;\n\n      case \"getDistinctColumnValues\":\n        this.handleSyncRequestFromWebview(\n          syncRequestId,\n          async () => {\n            const result = await this.queryManifestService\n              .getProject()\n              ?.getColumnValues(args.model as string, args.column as string);\n            return result;\n          },\n          command,\n          true,\n        );\n\n        break;\n\n      case \"getCurrentModelDocumentation\": {\n        if (!this._panel) {\n          return;\n        }\n\n        const { documentation, message: missingDocumentationMessage } =\n          await this.docGenService.getUncompiledDocumentationForCurrentActiveFile();\n        this.sendResponseToWebview({\n          command: \"renderDocumentation\",\n          docs: documentation,\n          missingDocumentationMessage,\n          tests: await this.dbtTestService.getTestsForCurrentModel(),\n          project: this.queryManifestService.getProject()?.getProjectName(),\n          collaborationEnabled: workspace\n            .getConfiguration(\"dbt\")\n            .get<boolean>(\"enableCollaboration\", false),\n        });\n        break;\n      }\n\n      case \"getColumnsOfSources\":\n        this.handleSyncRequestFromWebview(\n          syncRequestId,\n          async () => {\n            const columnsFromSources = await this.queryManifestService\n              .getProject()\n              ?.getColumnsOfSource(args.source as string, args.table as string);\n            return {\n              columns: columnsFromSources\n                ? columnsFromSources.map((c) => c.column)\n                : [],\n            };\n          },\n          command,\n          true,\n        );\n        break;\n\n      case \"getColumnsOfModel\":\n        this.handleSyncRequestFromWebview(\n          syncRequestId,\n          async () => {\n            const columns = await this.queryManifestService\n              .getProject()\n              ?.getColumnsOfModel(args.model as string);\n            return {\n              columns: columns ? columns.map((c) => c.column) : [],\n            };\n          },\n          command,\n          true,\n        );\n        break;\n\n      case \"getSourcesInProject\":\n        this.handleSyncRequestFromWebview(\n          syncRequestId,\n          async () => {\n            const sources = this.queryManifestService.getSourcesInProject(\n              window.activeTextEditor?.document.uri,\n            );\n\n            return {\n              sources,\n            };\n          },\n          command,\n          true,\n        );\n        break;\n\n      case \"getModelsInProject\":\n        this.handleSyncRequestFromWebview(\n          syncRequestId,\n          async () => {\n            const models = this.queryManifestService.getModelsInProject(\n              window.activeTextEditor?.document.uri,\n            );\n\n            return {\n              models,\n            };\n          },\n          command,\n        );\n        break;\n\n      default:\n        super.handleCommand(message);\n        break;\n    }\n  }\n\n  protected async onEvent({ command, payload }: SharedStateEventEmitterProps) {\n    switch (command) {\n      case \"viewConversation\":\n        this.sendResponseToWebview({ command, ...payload });\n        break;\n      case \"conversations:updates\":\n        this.sendResponseToWebview({ command, ...payload });\n        break;\n      case \"docgen:insert\":\n      case \"testgen:insert\":\n        this.sendResponseToWebview({\n          command,\n          ...payload,\n        });\n        break;\n      default:\n        break;\n    }\n  }\n}\n"
  },
  {
    "path": "src/webview_provider/newLineagePanel.ts",
    "content": "import {\n  DBTTerminal,\n  ExposureMetaData,\n  FunctionMetaData,\n  NodeMetaData,\n  RESOURCE_TYPE_FUNCTION,\n  RESOURCE_TYPE_SOURCE,\n  SourceTable,\n  Table,\n} from \"@altimateai/dbt-integration\";\nimport { inject } from \"inversify\";\nimport * as path from \"path\";\nimport {\n  CancellationToken,\n  CancellationTokenSource,\n  ColorThemeKind,\n  commands,\n  ProgressLocation,\n  TextEditor,\n  Webview,\n  window,\n  workspace,\n} from \"vscode\";\nimport { AltimateRequest } from \"../altimate\";\nimport { DBTProject } from \"../dbt_client/dbtProject\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { ManifestCacheProjectAddedEvent } from \"../dbt_client/event/manifestCacheChangedEvent\";\nimport { AltimateAuthService } from \"../services/altimateAuthService\";\nimport { CllEvents, DbtLineageService } from \"../services/dbtLineageService\";\nimport { QueryManifestService } from \"../services/queryManifestService\";\nimport { SharedStateService } from \"../services/sharedStateService\";\nimport { UsersService } from \"../services/usersService\";\nimport { TelemetryService } from \"../telemetry\";\nimport { extendErrorWithSupportLinks } from \"../utils\";\nimport { AltimateWebviewProvider } from \"./altimateWebviewProvider\";\nimport { LineagePanelView } from \"./lineagePanel\";\n\nclass DerivedCancellationTokenSource extends CancellationTokenSource {\n  constructor(linkedToken: CancellationToken) {\n    super();\n    linkedToken.onCancellationRequested(() => {\n      super.cancel();\n    });\n  }\n}\n\nexport class NewLineagePanel\n  extends AltimateWebviewProvider\n  implements LineagePanelView\n{\n  protected viewPath = \"/lineage\";\n  protected panelDescription = \"Lineage panel\";\n  private cllProgressResolve: () => void = () => {};\n  private cancellationTokenSource: CancellationTokenSource | undefined;\n\n  public constructor(\n    protected dbtProjectContainer: DBTProjectContainer,\n    private altimate: AltimateRequest,\n    protected telemetry: TelemetryService,\n    @inject(\"DBTTerminal\")\n    private terminal: DBTTerminal,\n    private dbtLineageService: DbtLineageService,\n    eventEmitterService: SharedStateService,\n    protected queryManifestService: QueryManifestService,\n    protected usersService: UsersService,\n    protected altimateAuthService: AltimateAuthService,\n  ) {\n    super(\n      dbtProjectContainer,\n      altimate,\n      telemetry,\n      eventEmitterService,\n      terminal,\n      queryManifestService,\n      usersService,\n      altimateAuthService,\n    );\n  }\n\n  public changedActiveTextEditor(event: TextEditor | undefined) {\n    if (event === undefined) {\n      return;\n    }\n    if (!this._panel) {\n      return;\n    }\n    this.renderStartingNode();\n  }\n\n  eventMapChanged(eventMap: Map<string, ManifestCacheProjectAddedEvent>): void {\n    this.eventMap = eventMap;\n    this.renderStartingNode();\n  }\n\n  changedActiveColorTheme() {\n    if (!this._panel) {\n      return;\n    }\n    const theme = [\n      ColorThemeKind.Light,\n      ColorThemeKind.HighContrastLight,\n    ].includes(window.activeColorTheme.kind)\n      ? \"light\"\n      : \"dark\";\n    this._panel.webview.postMessage({\n      command: \"setTheme\",\n      args: { theme },\n    });\n  }\n\n  init() {\n    this.terminal.debug(\"newLineagePanel:init\", \"init\", this._panel);\n    this.changedActiveColorTheme();\n    this.renderStartingNode();\n  }\n\n  private renderStartingNode() {\n    if (!this._panel) {\n      return;\n    }\n    this._panel.webview.postMessage({\n      command: \"render\",\n      args: this.getStartingNode(),\n    });\n  }\n\n  async handleCommand(message: {\n    command: string;\n    args: any;\n    syncRequestId?: string;\n  }): Promise<void> {\n    const { command, args = {}, syncRequestId } = message;\n    const { id = syncRequestId, params } = args;\n\n    if (command === \"openProblemsTab\") {\n      commands.executeCommand(\"workbench.action.problems.focus\");\n      return;\n    }\n    if (command === \"upstreamTables\") {\n      const body = this.dbtLineageService.getUpstreamTables(params);\n      this._panel?.webview.postMessage({\n        command: \"response\",\n        args: { id, syncRequestId, body, status: true },\n      });\n      return;\n    }\n\n    if (command === \"downstreamTables\") {\n      const body = this.dbtLineageService.getDownstreamTables(params);\n      this._panel?.webview.postMessage({\n        command: \"response\",\n        args: { id, syncRequestId, body, status: true },\n      });\n      return;\n    }\n\n    if (command === \"getColumns\") {\n      const body = await this.getColumns(params);\n      this._panel?.webview.postMessage({\n        command: \"response\",\n        args: { id, syncRequestId, body, status: true },\n      });\n      return;\n    }\n\n    if (command === \"getExposureDetails\") {\n      const body = await this.getExposureDetails(params);\n      this._panel?.webview.postMessage({\n        command: \"response\",\n        args: { id, syncRequestId, body, status: true },\n      });\n      return;\n    }\n\n    if (command === \"getFunctionDetails\") {\n      const body = await this.getFunctionDetails(params);\n      this._panel?.webview.postMessage({\n        command: \"response\",\n        args: { id, syncRequestId, body, status: true },\n      });\n      return;\n    }\n\n    if (command === \"getConnectedColumns\") {\n      try {\n        const body = await this.dbtLineageService.getConnectedColumns(\n          {\n            ...params,\n            eventType: \"column_lineage\",\n          },\n          this.cancellationTokenSource ?? new CancellationTokenSource(),\n        );\n        this._panel?.webview.postMessage({\n          command: \"response\",\n          args: { id, syncRequestId, body, status: !!body },\n        });\n      } catch (error) {\n        window.showErrorMessage(\n          extendErrorWithSupportLinks(\n            \"Unable to generate lineage: \" + (error as Error).message,\n          ),\n        );\n        this._panel?.webview.postMessage({\n          command: \"response\",\n          args: { id, error, status: false },\n        });\n        this.telemetry.sendTelemetryError(\"columnLineageUnknownError\", {\n          params,\n        });\n      }\n      return;\n    }\n\n    if (command === \"sendFeedback\") {\n      try {\n        await this.altimate.sendFeedback({\n          feedback_src: \"dbtpu-extension\",\n          feedback_text: params.feedback_text,\n          feedback_value: params.feedback_value,\n          data: {},\n        });\n        this._panel?.webview.postMessage({\n          command: \"response\",\n          args: { id, syncRequestId, status: true },\n        });\n      } catch (error) {\n        this._panel?.webview.postMessage({\n          command: \"response\",\n          args: { id, syncRequestId, status: false },\n        });\n        window.showErrorMessage(\n          extendErrorWithSupportLinks(\n            \"Could not send feedback: \" + (error as Error).message,\n          ),\n        );\n        this.telemetry.sendTelemetryError(\n          \"altimateLineageSendFeedbackError\",\n          error,\n        );\n      }\n      return;\n    }\n\n    if (command === \"columnLineage\") {\n      this.handleColumnLineage(args, () => {\n        this._panel?.webview.postMessage({\n          command: \"columnLineage\",\n          args: { event: CllEvents.CANCEL },\n        });\n      });\n      return;\n    }\n\n    if (command === \"telemetryEvents\") {\n      this.telemetry.sendTelemetryEvent(id, params);\n      return;\n    }\n\n    if (command === \"previewFeature\") {\n      this.altimateAuthService.handlePreviewFeatures();\n      return;\n    }\n\n    if (command === \"showInfoNotification\") {\n      window.showInformationMessage(params.message);\n      return;\n    }\n\n    if (command === \"getLineageSettings\") {\n      const config = workspace.getConfiguration(\"dbt.lineage\");\n      this._panel?.webview.postMessage({\n        command: \"response\",\n        args: {\n          id,\n          syncRequestId,\n          status: true,\n          body: {\n            showSelectEdges: config.get(\"showSelectEdges\", true),\n            showNonSelectEdges: config.get(\"showNonSelectEdges\", false),\n            defaultExpansion: Math.min(\n              config.get<number>(\"defaultExpansion\", 1),\n              5,\n            ),\n          },\n        },\n      });\n      return;\n    }\n\n    if (command === \"persistLineageSettings\") {\n      const config = workspace.getConfiguration(\"dbt.lineage\");\n      for (const k in params) {\n        await config.update(k, params[k]);\n      }\n      this._panel?.webview.postMessage({\n        command: \"response\",\n        args: {\n          id,\n          syncRequestId,\n          status: true,\n          body: { ok: true },\n        },\n      });\n      return;\n    }\n\n    this.terminal.debug(\n      \"newLineagePanel:handleCommand\",\n      \"Unsupported command\",\n      message,\n    );\n    super.handleCommand(message);\n  }\n\n  private async handleColumnLineage(\n    { event }: { event: CllEvents },\n    onCancel: () => void,\n  ) {\n    if (event === CllEvents.START) {\n      window.withProgress(\n        {\n          title: \"Retrieving column level lineage\",\n          location: ProgressLocation.Notification,\n          cancellable: true,\n        },\n        async (_, token) => {\n          await new Promise<void>((resolve) => {\n            this.cancellationTokenSource = new DerivedCancellationTokenSource(\n              token,\n            );\n            this.cllProgressResolve = resolve;\n            token.onCancellationRequested(() => {\n              onCancel();\n            });\n          });\n        },\n      );\n      return;\n    }\n    if (event === CllEvents.END) {\n      this.cllProgressResolve();\n      this.cancellationTokenSource?.dispose();\n      return;\n    }\n    if (event === CllEvents.CANCEL) {\n      this.cllProgressResolve();\n      this.cancellationTokenSource?.cancel();\n      return;\n    }\n  }\n\n  private async addModelColumnsFromDB(project: DBTProject, node: NodeMetaData) {\n    const columnsFromDB = await project.getColumnsOfModel(node.name);\n    console.log(\"addColumnsFromDB: \", node.name, \" -> \", columnsFromDB);\n    return project.mergeColumnsFromDB(node, columnsFromDB);\n  }\n\n  private async addSourceColumnsFromDB(\n    project: DBTProject,\n    nodeName: string,\n    table: SourceTable,\n  ) {\n    const columnsFromDB = await project.getColumnsOfSource(\n      nodeName,\n      table.name,\n    );\n    console.log(\"addColumnsFromDB: \", nodeName, \" -> \", columnsFromDB);\n    return project.mergeColumnsFromDB(table, columnsFromDB);\n  }\n\n  private async getExposureDetails({\n    name,\n  }: {\n    name: string;\n  }): Promise<ExposureMetaData | undefined> {\n    const event = this.queryManifestService.getEventByCurrentProject();\n    if (!event?.event) {\n      return;\n    }\n    const project = this.queryManifestService.getProject();\n    if (!project) {\n      return;\n    }\n\n    const { exposureMetaMap } = event.event;\n\n    // Node IDs use unique_id format (exposure.project.name), but\n    // exposureMetaMap is keyed by simple exposure name.\n    const splits = name.split(\".\");\n    const exposureName = splits.length >= 3 ? splits[2] : name;\n    return exposureMetaMap.get(exposureName);\n  }\n\n  private async getFunctionDetails({\n    name,\n  }: {\n    name: string;\n  }): Promise<FunctionMetaData | undefined> {\n    const event = this.queryManifestService.getEventByCurrentProject();\n    if (!event?.event) {\n      return;\n    }\n    const { functionMetaMap } = event.event;\n    // Node IDs use unique_id format (function.project.name), but\n    // functionMetaMap is keyed by simple function name.\n    const splits = name.split(\".\");\n    const functionName = splits.length >= 3 ? splits[2] : name;\n    return functionMetaMap.get(functionName);\n  }\n\n  private async getColumns({\n    table,\n    refresh,\n  }: {\n    table: string;\n    refresh: boolean;\n  }): Promise<\n    | {\n        id: string;\n        purpose: string;\n        columns: {\n          table: string;\n          name: string;\n          datatype: string;\n          can_lineage_expand: boolean;\n          description: string;\n        }[];\n        returns?: {\n          datatype: string;\n          description: string;\n        };\n        meta?: { [key: string]: any };\n      }\n    | undefined\n  > {\n    const event = this.queryManifestService.getEventByCurrentProject();\n    if (!event?.event) {\n      return;\n    }\n    const project = this.queryManifestService.getProject();\n    if (!project) {\n      return;\n    }\n    const splits = table.split(\".\");\n    const nodeType = splits[0];\n    if (nodeType === RESOURCE_TYPE_SOURCE) {\n      const { sourceMetaMap } = event.event;\n      const sourceName = splits[2];\n      const tableName = splits[3];\n      const node = sourceMetaMap.get(sourceName);\n      if (!node) {\n        return;\n      }\n      const _table = node.tables.find((t) => t.name === tableName);\n      if (!_table) {\n        return;\n      }\n      if (refresh) {\n        const ok = await window.withProgress(\n          {\n            title: \"Fetching metadata\",\n            location: ProgressLocation.Notification,\n            cancellable: false,\n          },\n          async () => {\n            return await this.addSourceColumnsFromDB(\n              project,\n              node.name,\n              _table,\n            );\n          },\n        );\n        if (!ok) {\n          window.showErrorMessage(\n            extendErrorWithSupportLinks(\n              \"Unable to get columns from DB for model: \" +\n                node.name +\n                \" table: \" +\n                _table.name +\n                \".\",\n            ),\n          );\n          return;\n        }\n      }\n      return {\n        id: table,\n        purpose: _table.description,\n        columns: Object.values(_table.columns)\n          .map((c) => ({\n            table,\n            name: c.name,\n            datatype: c.data_type?.toLowerCase() || \"\",\n            can_lineage_expand: false,\n            description: c.description,\n          }))\n          .sort((a, b) => a.name.localeCompare(b.name)),\n      };\n    }\n    if (nodeType === RESOURCE_TYPE_FUNCTION) {\n      const tableName = splits[2];\n      const { functionMetaMap } = event.event;\n      const fn = functionMetaMap.get(tableName);\n      if (!fn) {\n        return;\n      }\n      const columns: {\n        table: string;\n        name: string;\n        datatype: string;\n        can_lineage_expand: boolean;\n        description: string;\n      }[] = [];\n      if (fn.arguments) {\n        for (const arg of fn.arguments) {\n          columns.push({\n            table,\n            name: arg.name,\n            datatype: arg.data_type || \"\",\n            can_lineage_expand: false,\n            description: arg.description || \"\",\n          });\n        }\n      }\n      return {\n        id: table,\n        purpose: fn.description || \"\",\n        columns,\n        returns: fn.returns\n          ? {\n              datatype: fn.returns.data_type || \"\",\n              description: fn.returns.description || \"\",\n            }\n          : undefined,\n      };\n    }\n    const { nodeMetaMap } = event.event;\n    const node = nodeMetaMap.lookupByUniqueId(table);\n    if (!node) {\n      return;\n    }\n    if (refresh) {\n      if (node.config.materialized === \"ephemeral\") {\n        window.showInformationMessage(\n          \"Cannot fetch columns for ephemeral models.\",\n        );\n        return;\n      }\n      const ok = await window.withProgress(\n        {\n          title: \"Fetching metadata\",\n          location: ProgressLocation.Notification,\n          cancellable: false,\n        },\n        async () => {\n          return await this.addModelColumnsFromDB(project, node);\n        },\n      );\n      if (!ok) {\n        window.showErrorMessage(\n          extendErrorWithSupportLinks(\n            \"Unable to get columns from DB for model: \" +\n              node.name +\n              \" table: \" +\n              table +\n              \".\",\n          ),\n        );\n        return;\n      }\n    }\n\n    return {\n      id: table,\n      purpose: node.description,\n      columns: Object.values(node.columns)\n        .map((c) => ({\n          table,\n          name: c.name,\n          datatype: c.data_type?.toLowerCase() || \"\",\n          can_lineage_expand: false,\n          description: c.description,\n        }))\n        .sort((a, b) => a.name.localeCompare(b.name)),\n      meta: node.meta,\n    };\n  }\n\n  private static readonly DBT_FILE_EXTENSIONS = [\".sql\", \".py\", \".csv\"];\n\n  private getFilename(): string | undefined {\n    const editor = window.activeTextEditor;\n    if (!editor) {\n      return undefined;\n    }\n    const fileName = editor.document.fileName;\n    const ext = path.extname(fileName).toLowerCase();\n    if (NewLineagePanel.DBT_FILE_EXTENSIONS.includes(ext)) {\n      return path.basename(fileName, ext);\n    }\n    return path.basename(fileName);\n  }\n\n  private getMissingLineageMessage() {\n    const message =\n      \"A valid dbt file (model, seed etc.) needs to be open and active in the editor area above to view lineage\";\n    try {\n      this.queryManifestService\n        .getProject()\n        ?.throwDiagnosticsErrorIfAvailable();\n    } catch (err) {\n      this.dbtTerminal.error(\n        \"Lineage:getMissingLineageMessage\",\n        (err as Error).message,\n        err,\n      );\n      return { message: (err as Error).message, type: \"error\" };\n    }\n\n    return { message, type: \"warning\" };\n  }\n\n  private getStartingNode():\n    | {\n        node?: Table;\n        aiEnabled: boolean;\n        missingLineageMessage?: { message: string; type: string };\n      }\n    | undefined {\n    const aiEnabled = this.altimate.enabled();\n    const event = this.queryManifestService.getEventByCurrentProject();\n    if (!event?.event) {\n      this.dbtTerminal.info(\"Lineage:getStartingNode\", \"No event found\");\n      return {\n        aiEnabled,\n        missingLineageMessage: this.getMissingLineageMessage(),\n      };\n    }\n    const { nodeMetaMap, functionMetaMap } = event.event;\n    const editor = window.activeTextEditor;\n    const tableName = this.getFilename();\n    if (!editor || !tableName) {\n      return {\n        aiEnabled,\n        missingLineageMessage: this.getMissingLineageMessage(),\n      };\n    }\n    const url = editor.document.uri.path;\n    const ext = path.extname(editor.document.fileName).toLowerCase();\n\n    // For .py files, prioritize function lookup to avoid model/function\n    // basename collisions (both could share the same name).\n    if (ext === \".py\") {\n      const fn = functionMetaMap.get(tableName);\n      if (fn) {\n        const node = this.dbtLineageService.createTable(\n          event.event,\n          url,\n          fn.unique_id,\n        );\n        return { node, aiEnabled };\n      }\n    }\n\n    const _node = nodeMetaMap.lookupByBaseName(tableName);\n    if (_node) {\n      const key = _node.unique_id;\n      const node = this.dbtLineageService.createTable(event.event, url, key);\n      return { node, aiEnabled };\n    }\n\n    // Non-.py fallback: check if the active file is a dbt function.\n    const fn = functionMetaMap.get(tableName);\n    if (fn) {\n      const node = this.dbtLineageService.createTable(\n        event.event,\n        url,\n        fn.unique_id,\n      );\n      return { node, aiEnabled };\n    }\n\n    this.dbtTerminal.info(\n      \"Lineage:getStartingNode\",\n      `No node found for ${tableName}`,\n    );\n    return {\n      aiEnabled,\n      missingLineageMessage: this.getMissingLineageMessage(),\n    };\n  }\n\n  protected renderWebviewView(webview: Webview) {\n    this._panel!.webview.html = super.getHtml(\n      webview,\n      this.dbtProjectContainer.extensionUri,\n    );\n  }\n}\n"
  },
  {
    "path": "src/webview_provider/onboardingPanel.ts",
    "content": "import { DBTTerminal } from \"@altimateai/dbt-integration\";\nimport { inject } from \"inversify\";\nimport {\n  commands,\n  ConfigurationTarget,\n  Uri,\n  ViewColumn,\n  WebviewPanel,\n  window,\n  workspace,\n} from \"vscode\";\nimport { AltimateRequest } from \"../altimate\";\nimport { WalkthroughCommands } from \"../commands/walkthroughCommands\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { AltimateAuthService } from \"../services/altimateAuthService\";\nimport { QueryManifestService } from \"../services/queryManifestService\";\nimport { SharedStateService } from \"../services/sharedStateService\";\nimport { UsersService } from \"../services/usersService\";\nimport { TelemetryService } from \"../telemetry\";\nimport {\n  AltimateWebviewProvider,\n  HandleCommandProps,\n  SharedStateEventEmitterProps,\n} from \"./altimateWebviewProvider\";\n\nexport class OnboardingPanel extends AltimateWebviewProvider {\n  public static readonly viewType = \"dbtPowerUser.Onboarding\";\n  protected viewPath = \"/onboarding\";\n  protected panelDescription = \"dbt Power User onboarding experience\";\n  private pendingStepNavigation: string | undefined;\n\n  public constructor(\n    protected dbtProjectContainer: DBTProjectContainer,\n    protected altimateRequest: AltimateRequest,\n    protected telemetry: TelemetryService,\n    protected emitterService: SharedStateService,\n    @inject(\"DBTTerminal\")\n    protected dbtTerminal: DBTTerminal,\n    protected queryManifestService: QueryManifestService,\n    protected usersService: UsersService,\n    protected walkthroughCommands: WalkthroughCommands,\n    protected altimateAuthService: AltimateAuthService,\n  ) {\n    super(\n      dbtProjectContainer,\n      altimateRequest,\n      telemetry,\n      emitterService,\n      dbtTerminal,\n      queryManifestService,\n      usersService,\n      altimateAuthService,\n    );\n\n    const t = this;\n    this._disposables.push(\n      emitterService.eventEmitter.event((d) =>\n        t.onEvent(d as SharedStateEventEmitterProps),\n      ),\n    );\n\n    // Initialize Python environment and listen to changes\n    this.initializePythonEnvironmentListener();\n  }\n\n  private async initializePythonEnvironmentListener() {\n    try {\n      // Listen to dbt installation verification events, which fire after\n      // checkAllInstalled() completes (triggered by interpreter changes).\n      // By this point dbtInstalled, pythonPath, and pythonVersion are all\n      // up to date, so the webview gets fresh data when it refreshes.\n      this._disposables.push(\n        this.dbtProjectContainer.onDBTInstallationVerification((event) => {\n          if (event.inProgress) {\n            return;\n          }\n          this.dbtTerminal.debug(\n            \"onboardingPanel:dbtInstallationVerified\",\n            \"dbt installation verification complete, notifying webview\",\n          );\n          this.sendResponseToWebview({\n            command: \"pythonEnvironmentChanged\",\n          });\n        }),\n      );\n    } catch (err) {\n      this.dbtTerminal.error(\n        \"onboardingPanel:initializePythonEnvironmentListener\",\n        \"Failed to initialize Python environment listener\",\n        err,\n      );\n    }\n  }\n\n  protected async onEvent({ command, payload }: SharedStateEventEmitterProps) {\n    switch (command) {\n      case \"onboarding:render\":\n        this.dbtTerminal.debug(\n          \"onboarding:render\",\n          \"rendering onboarding view\",\n          payload,\n        );\n        const initialStep = (payload as { initialStep?: string })?.initialStep;\n\n        // If panel already exists and is ready, just navigate to the step\n        if (this._panel && this.isWebviewReady && initialStep) {\n          // Focus the panel if it's a WebviewPanel\n          if ((this._panel as WebviewPanel).reveal) {\n            (this._panel as WebviewPanel).reveal();\n          }\n          this.sendResponseToWebview({\n            command: \"navigateToStep\",\n            payload: { step: initialStep },\n          });\n          break;\n        }\n\n        // Store the step to navigate to after webview is ready\n        this.pendingStepNavigation = initialStep;\n\n        // Create new panel if it doesn't exist\n        if (!this._panel) {\n          const webviewPanel = window.createWebviewPanel(\n            OnboardingPanel.viewType,\n            \"Get Started with dbt Power User\",\n            {\n              viewColumn: ViewColumn.Active,\n            },\n            { enableScripts: true, retainContextWhenHidden: true },\n          );\n          this._panel = webviewPanel;\n\n          // Clear the panel reference when it's disposed\n          webviewPanel.onDidDispose(() => {\n            this._panel = undefined;\n            this._webview = undefined;\n            this.isWebviewReady = false;\n          });\n\n          this.renderWebview(webviewPanel);\n        } else {\n          // Focus the panel if it's a WebviewPanel\n          if ((this._panel as WebviewPanel).reveal) {\n            (this._panel as WebviewPanel).reveal();\n          }\n        }\n\n        break;\n      default:\n        super.onEvent({ command, payload });\n        break;\n    }\n  }\n\n  protected renderWebviewView() {\n    if (!this._webview) {\n      return;\n    }\n\n    this._webview.onDidReceiveMessage(this.handleCommand, this, []);\n\n    this._webview.html = this.getHtml(\n      this._webview,\n      this.dbtProjectContainer.extensionUri,\n    );\n  }\n\n  private renderWebview(webview: WebviewPanel) {\n    this._webview = webview.webview;\n    this.renderWebviewView();\n  }\n\n  protected onWebviewReady() {\n    super.onWebviewReady();\n\n    // Send pending step navigation if any\n    if (this.pendingStepNavigation) {\n      this.sendResponseToWebview({\n        command: \"navigateToStep\",\n        payload: { step: this.pendingStepNavigation },\n      });\n      this.pendingStepNavigation = undefined;\n    }\n  }\n\n  async handleCommand(message: HandleCommandProps): Promise<void> {\n    const { command, syncRequestId } = message;\n\n    switch (command) {\n      case \"openSetupWizard\":\n        // Trigger the VSCode walkthrough\n        await commands.executeCommand(\n          \"workbench.action.openWalkthrough\",\n          \"innoverio.vscode-dbt-power-user#initialSetup\",\n        );\n        this.sendResponseToWebview({\n          command: \"response\",\n          syncRequestId,\n          data: { success: true },\n        });\n        break;\n      case \"getProjects\":\n        // Get available dbt projects\n        try {\n          const projects = this.dbtProjectContainer.getProjects();\n          this.sendResponseToWebview({\n            command: \"response\",\n            syncRequestId,\n            data: projects.map((p) => ({\n              label: p.getProjectName(),\n              projectRoot: p.projectRoot.fsPath,\n            })),\n          });\n        } catch (error) {\n          this.dbtTerminal.error(\n            \"getProjects\",\n            \"Error getting projects\",\n            error,\n          );\n          this.sendResponseToWebview({\n            command: \"response\",\n            syncRequestId,\n            error: error instanceof Error ? error.message : String(error),\n          });\n        }\n        break;\n      case \"runDbtDeps\":\n        // Run dbt deps for selected project\n        try {\n          const { projectRoot } = message as HandleCommandProps & {\n            projectRoot: string;\n          };\n          const projectUri = Uri.file(projectRoot);\n          const projects = this.dbtProjectContainer.getProjects();\n          const project = projects.find(\n            (p) => p.projectRoot.fsPath === projectRoot,\n          );\n\n          if (!project) {\n            throw new Error(`Project not found: ${projectRoot}`);\n          }\n\n          await this.walkthroughCommands.installDeps(\n            {\n              label: project.getProjectName(),\n              description: projectRoot,\n              uri: projectUri,\n            },\n            true,\n          );\n\n          this.sendResponseToWebview({\n            command: \"response\",\n            syncRequestId,\n            data: { success: true },\n          });\n        } catch (error) {\n          this.dbtTerminal.error(\"runDbtDeps\", \"Error running dbt deps\", error);\n          this.sendResponseToWebview({\n            command: \"response\",\n            syncRequestId,\n            error: error instanceof Error ? error.message : String(error),\n          });\n        }\n        break;\n      case \"validateProject\":\n        // Validate project setup\n        try {\n          const { projectRoot } = message as HandleCommandProps & {\n            projectRoot: string;\n          };\n          const projectUri = Uri.file(projectRoot);\n          const projects = this.dbtProjectContainer.getProjects();\n          const project = projects.find(\n            (p) => p.projectRoot.fsPath === projectRoot,\n          );\n\n          if (!project) {\n            throw new Error(`Project not found: ${projectRoot}`);\n          }\n\n          await this.walkthroughCommands.validateProjects(\n            {\n              label: project.getProjectName(),\n              description: projectRoot,\n              uri: projectUri,\n            },\n            true,\n          );\n\n          this.sendResponseToWebview({\n            command: \"response\",\n            syncRequestId,\n            data: { success: true },\n          });\n        } catch (error) {\n          this.dbtTerminal.error(\n            \"validateProject\",\n            \"Error validating project\",\n            error,\n          );\n          this.sendResponseToWebview({\n            command: \"response\",\n            syncRequestId,\n            error: error instanceof Error ? error.message : String(error),\n          });\n        }\n        break;\n      case \"installDbt\":\n        // Install dbt with specified integration type\n        try {\n          const { integrationType } = message as HandleCommandProps & {\n            integrationType: \"core\" | \"fusion\" | \"cloud\";\n          };\n\n          if (!integrationType) {\n            throw new Error(\"No integration type specified\");\n          }\n\n          // Set the dbt integration configuration before installation\n          const config = workspace.getConfiguration(\"dbt\");\n          await config.update(\"dbtIntegration\", integrationType, true);\n\n          // Call the installDbt command\n          await this.walkthroughCommands.installDbt();\n\n          this.sendResponseToWebview({\n            command: \"response\",\n            syncRequestId,\n            data: { success: true },\n          });\n        } catch (error) {\n          this.dbtTerminal.error(\"installDbt\", \"Error installing dbt\", error);\n          this.sendResponseToWebview({\n            command: \"response\",\n            syncRequestId,\n            error: error instanceof Error ? error.message : String(error),\n          });\n        }\n        break;\n      case \"executeCommand\":\n        // Execute VSCode commands from the wizard\n        try {\n          const commandToExecute = (\n            message as HandleCommandProps & { vscodeCommand?: string }\n          ).vscodeCommand;\n          if (!commandToExecute) {\n            throw new Error(\"No VSCode command specified in message\");\n          }\n          await commands.executeCommand(commandToExecute);\n          this.sendResponseToWebview({\n            command: \"response\",\n            syncRequestId,\n            data: { success: true },\n          });\n        } catch (error) {\n          this.dbtTerminal.error(\n            \"executeCommand\",\n            \"Error executing command\",\n            error,\n          );\n          this.sendResponseToWebview({\n            command: \"response\",\n            syncRequestId,\n            error: error instanceof Error ? error.message : String(error),\n          });\n        }\n        break;\n      case \"getDiagnosticsStatus\":\n        // Get current diagnostics status for setup prerequisites\n        try {\n          const projects = this.dbtProjectContainer.getProjects();\n          const dbtWorkspaces = this.dbtProjectContainer.dbtWorkspaceFolders;\n          const dbtIntegrationMode = workspace\n            .getConfiguration(\"dbt\")\n            .get<string>(\"dbtIntegration\", \"core\");\n          const pythonEnvironment =\n            this.dbtProjectContainer.getPythonEnvironment();\n\n          // Get dbt version from any project that has it defined\n          let dbtVersion: string | undefined;\n          for (const project of projects) {\n            try {\n              const version = project.getDBTVersion();\n              if (version) {\n                dbtVersion = version.join(\".\");\n                break;\n              }\n            } catch (error) {\n              // Continue to next project\n              continue;\n            }\n          }\n\n          // Check if file associations are configured for dbt\n          const filesConfig = workspace.getConfiguration(\"files\");\n          const associations =\n            filesConfig.get<Record<string, string>>(\"associations\") || {};\n          const requiredAssociations = {\n            \"*.sql\": \"jinja-sql\",\n            \"*.yml\": \"jinja-yaml\",\n            \"*.yaml\": \"jinja-yaml\",\n          };\n          const fileAssociationsConfigured = Object.entries(\n            requiredAssociations,\n          ).every(([pattern, language]) => associations[pattern] === language);\n\n          // Check for dbt_project.yml files in workspace folders directly\n          // This is more reliable than checking dbtProjectContainer which may not be initialized yet\n          const excludePattern =\n            \"**/{dbt_packages,site-packages,dbt_internal_packages}\";\n          const dbtProjectFiles = await workspace.findFiles(\n            \"**/dbt_project.yml\",\n            excludePattern,\n          );\n          const projectsFoundInWorkspace = dbtProjectFiles.length > 0;\n\n          this.sendResponseToWebview({\n            command: \"response\",\n            syncRequestId,\n            data: {\n              pythonInstalled: this.dbtProjectContainer.pythonInstalled,\n              dbtInstalled: this.dbtProjectContainer.dbtInstalled,\n              projectsFound: projectsFoundInWorkspace,\n              projectCount: dbtProjectFiles.length,\n              workspaceCount: dbtWorkspaces.length,\n              dbtIntegrationMode,\n              pythonPath: pythonEnvironment.pythonPath,\n              pythonVersion: pythonEnvironment.pythonVersion,\n              dbtVersion,\n              fileAssociationsConfigured,\n            },\n          });\n        } catch (error) {\n          this.dbtTerminal.error(\n            \"getDiagnosticsStatus\",\n            \"Error getting diagnostics status\",\n            error,\n          );\n          this.sendResponseToWebview({\n            command: \"response\",\n            syncRequestId,\n            error: error instanceof Error ? error.message : String(error),\n          });\n        }\n        break;\n      case \"setDbtIntegration\":\n        // Set dbt integration mode\n        try {\n          const { integrationType } = message as HandleCommandProps & {\n            integrationType: \"core\" | \"fusion\" | \"cloud\";\n          };\n\n          if (!integrationType) {\n            throw new Error(\"No integration type specified\");\n          }\n\n          // Set the dbt integration configuration\n          const config = workspace.getConfiguration(\"dbt\");\n          await config.update(\n            \"dbtIntegration\",\n            integrationType,\n            ConfigurationTarget.Workspace,\n          );\n\n          this.sendResponseToWebview({\n            command: \"response\",\n            syncRequestId,\n            data: { success: true },\n          });\n        } catch (error) {\n          this.dbtTerminal.error(\n            \"setDbtIntegration\",\n            \"Error setting dbt integration\",\n            error,\n          );\n          this.sendResponseToWebview({\n            command: \"response\",\n            syncRequestId,\n            error: error instanceof Error ? error.message : String(error),\n          });\n        }\n        break;\n      case \"configureFileAssociations\":\n        // Configure file associations for dbt files\n        try {\n          const filesConfig = workspace.getConfiguration(\"files\");\n          const currentAssociations =\n            filesConfig.get<Record<string, string>>(\"associations\") || {};\n\n          // Merge with existing associations (don't overwrite user's other associations)\n          const updatedAssociations = {\n            ...currentAssociations,\n            \"*.sql\": \"jinja-sql\",\n            \"*.yml\": \"jinja-yaml\",\n            \"*.yaml\": \"jinja-yaml\",\n          };\n\n          // Update at user level (global = true)\n          await filesConfig.update(\"associations\", updatedAssociations, true);\n\n          this.sendResponseToWebview({\n            command: \"response\",\n            syncRequestId,\n            data: { success: true },\n          });\n        } catch (error) {\n          this.dbtTerminal.error(\n            \"configureFileAssociations\",\n            \"Error configuring file associations\",\n            error,\n          );\n          this.sendResponseToWebview({\n            command: \"response\",\n            syncRequestId,\n            error: error instanceof Error ? error.message : String(error),\n          });\n        }\n        break;\n      case \"checkAltimateConfiguration\":\n        // Check if Altimate is already configured\n        try {\n          const config = workspace.getConfiguration(\"dbt\");\n          const apiKey = config.get<string>(\"altimateAiKey\");\n          const instanceName = config.get<string>(\"altimateInstanceName\");\n          const dbtIntegrationType = config.get<string>(\n            \"dbtIntegration\",\n            \"core\",\n          );\n\n          const isConfigured = !!(apiKey && instanceName);\n          const altimateUrl = config.get<string>(\"altimateUrl\", \"\");\n\n          this.sendResponseToWebview({\n            command: \"response\",\n            syncRequestId,\n            data: {\n              isConfigured,\n              dbtIntegrationType,\n              instanceName: instanceName || \"\",\n              apiKey: apiKey || \"\",\n              altimateUrl,\n            },\n          });\n        } catch (error) {\n          this.dbtTerminal.error(\n            \"checkAltimateConfiguration\",\n            \"Error checking Altimate configuration\",\n            error,\n          );\n          this.sendResponseToWebview({\n            command: \"response\",\n            syncRequestId,\n            error: error instanceof Error ? error.message : String(error),\n          });\n        }\n        break;\n      case \"saveAltimateKey\":\n        // Save Altimate API key and instance name\n        try {\n          const { apiKey, instanceName, backendURL } =\n            message as HandleCommandProps & {\n              apiKey: string;\n              instanceName: string;\n              backendURL?: string;\n            };\n\n          // Validate credentials before saving\n          this.dbtTerminal.debug(\n            \"saveAltimateKey\",\n            \"Validating credentials before saving\",\n            { instanceName },\n          );\n\n          const validationResult =\n            await this.altimateRequest.validateCredentials(\n              instanceName,\n              apiKey,\n              backendURL,\n            );\n\n          if (!validationResult?.ok) {\n            const errorMessage =\n              validationResult?.error ||\n              validationResult?.detail ||\n              \"Invalid credentials. Please check your API key and instance name.\";\n            this.dbtTerminal.error(\n              \"saveAltimateKey\",\n              \"Credential validation failed\",\n              errorMessage,\n            );\n            this.sendResponseToWebview({\n              command: \"response\",\n              syncRequestId,\n              error: errorMessage,\n            });\n            return;\n          }\n\n          this.dbtTerminal.debug(\n            \"saveAltimateKey\",\n            \"Credentials validated successfully\",\n          );\n\n          // Save at Global (user) level so the key applies across all workspaces.\n          // Save altimateUrl FIRST so the ValidationProvider (which fires on\n          // config change) uses the correct endpoint when it re-validates.\n          const dbtConfig = workspace.getConfiguration(\"dbt\");\n          if (backendURL) {\n            await dbtConfig.update(\n              \"altimateUrl\",\n              backendURL,\n              ConfigurationTarget.Global,\n            );\n          }\n          await dbtConfig.update(\n            \"altimateAiKey\",\n            apiKey,\n            ConfigurationTarget.Global,\n          );\n          await dbtConfig.update(\n            \"altimateInstanceName\",\n            instanceName,\n            ConfigurationTarget.Global,\n          );\n\n          this.sendResponseToWebview({\n            command: \"response\",\n            syncRequestId,\n            data: { success: true },\n          });\n        } catch (error) {\n          this.dbtTerminal.error(\n            \"saveAltimateKey\",\n            \"Error saving Altimate API key\",\n            error,\n          );\n          this.sendResponseToWebview({\n            command: \"response\",\n            syncRequestId,\n            error: error instanceof Error ? error.message : String(error),\n          });\n        }\n        break;\n      case \"openUrl\":\n        // Open URL in external browser\n        try {\n          const { url } = message as HandleCommandProps & {\n            url: string;\n          };\n\n          if (!url) {\n            throw new Error(\"No URL specified\");\n          }\n\n          await commands.executeCommand(\"vscode.open\", Uri.parse(url));\n\n          this.sendResponseToWebview({\n            command: \"response\",\n            syncRequestId,\n            data: { success: true },\n          });\n        } catch (error) {\n          this.dbtTerminal.error(\"openUrl\", \"Error opening URL\", error);\n          this.sendResponseToWebview({\n            command: \"response\",\n            syncRequestId,\n            error: error instanceof Error ? error.message : String(error),\n          });\n        }\n        break;\n      default:\n        super.handleCommand(message);\n        break;\n    }\n  }\n}\n"
  },
  {
    "path": "src/webview_provider/queryResultPanel.ts",
    "content": "import {\n  CancellationToken,\n  ColorThemeKind,\n  commands,\n  env,\n  ProgressLocation,\n  Range,\n  Uri,\n  ViewColumn,\n  Webview,\n  WebviewOptions,\n  WebviewView,\n  WebviewViewResolveContext,\n  window,\n  workspace,\n} from \"vscode\";\n\nimport {\n  DBTTerminal,\n  ExecuteSQLError,\n  ExecuteSQLResult,\n  QueryExecution,\n} from \"@altimateai/dbt-integration\";\nimport { inject } from \"inversify\";\nimport { PythonException } from \"python-bridge\";\nimport { AltimateRequest } from \"../altimate\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { AltimateAuthService } from \"../services/altimateAuthService\";\nimport { AltimateCodeChatService } from \"../services/altimateCodeChatService\";\nimport { QueryManifestService } from \"../services/queryManifestService\";\nimport { SharedStateService } from \"../services/sharedStateService\";\nimport { UsersService } from \"../services/usersService\";\nimport { TelemetryService } from \"../telemetry\";\nimport { TelemetryEvents } from \"../telemetry/events\";\nimport {\n  extendErrorWithSupportLinks,\n  getFormattedDateTime,\n  getStringSizeInMb,\n} from \"../utils\";\nimport {\n  AltimateWebviewProvider,\n  SendMessageProps,\n  SharedStateEventEmitterProps,\n} from \"./altimateWebviewProvider\";\nimport path = require(\"path\");\n\ninterface JsonObj {\n  [key: string]: string | number | undefined;\n}\n\nenum QueryPanelViewType {\n  DEFAULT,\n  OPEN_RESULTS_IN_TAB,\n  OPEN_RESULTS_FROM_HISTORY_BOOKMARKS,\n}\n\nenum OutboundCommand {\n  RenderQuery = \"renderQuery\",\n  RenderLoading = \"renderLoading\",\n  RenderError = \"renderError\",\n  InjectConfig = \"injectConfig\",\n  ResetState = \"resetState\",\n  GetContext = \"getContext\",\n}\n\ninterface RenderQuery {\n  columnNames: string[];\n  columnTypes: string[];\n  rows: JsonObj[];\n  raw_sql: string;\n  compiled_sql: string;\n}\n\ninterface RenderError {\n  error: any;\n  raw_sql: string;\n  compiled_sql: string;\n}\n\ninterface InjectConfig {\n  limit?: number;\n  darkMode: boolean;\n  aiEnabled: boolean;\n}\n\nenum InboundCommand {\n  CollectQueryResultsDebugInfo = \"collectQueryResultsDebugInfo\",\n  Info = \"info\",\n  Error = \"error\",\n  UpdateConfig = \"updateConfig\",\n  OpenUrl = \"openUrl\",\n  GetSummary = \"getSummary\",\n  CancelQuery = \"cancelQuery\",\n  SetContext = \"setContext\",\n  GetQueryPanelContext = \"getQueryPanelContext\",\n  GetQueryHistory = \"getQueryHistory\",\n  ExecuteQuery = \"executeQuery\",\n  ExecuteQueryFromActiveWindow = \"executeQueryFromActiveWindow\",\n  GetQueryTabData = \"getQueryTabData\",\n  RunAdhocQuery = \"runAdhocQuery\",\n  ViewResultSet = \"viewResultSet\",\n  OpenCodeInEditor = \"openCodeInEditor\",\n  ClearQueryHistory = \"clearQueryHistory\",\n  TroubleshootWithAltimate = \"troubleshootWithAltimate\",\n  OpenAltimateCodeChat = \"openAltimateCodeChat\",\n}\n\ninterface RecInfo {\n  text: string;\n}\n\ninterface RecSummary {\n  compiledSql: string;\n}\n\ninterface RecTroubleshoot {\n  compiledSql: string;\n  rawSql: string;\n  errorMessage: string;\n  fileName?: string;\n}\n\ninterface RecError {\n  text: string;\n}\n\ninterface RecConfig {\n  limit?: number;\n  scale?: number;\n}\n\ninterface RecOpenUrl {\n  url: string;\n}\n\ninterface QueryHistory {\n  rawSql: string;\n  compiledSql: string;\n  timestamp: number;\n  duration: number;\n  adapter: string;\n  projectName: string;\n  data?: JsonObj[];\n  columnNames: string[];\n  columnTypes: string[];\n  modelName: string;\n}\n\nexport class QueryResultPanel extends AltimateWebviewProvider {\n  public static readonly viewType = \"dbtPowerUser.PreviewResults\";\n  protected viewPath = \"/query-panel\";\n  protected panelDescription = \"Query results panel\";\n  private _queryTabData: any;\n  private _bottomPanel: WebviewView | undefined;\n\n  private queryExecution?: QueryExecution;\n  private incomingMessages: SendMessageProps[] = [];\n\n  // stored only for current session, if user reloads or opens new workspace, this will be reset\n  private _queryHistory: QueryHistory[] = [];\n\n  public constructor(\n    protected dbtProjectContainer: DBTProjectContainer,\n    protected telemetry: TelemetryService,\n    private altimate: AltimateRequest,\n    private eventEmitterService: SharedStateService,\n    @inject(\"DBTTerminal\")\n    protected dbtTerminal: DBTTerminal,\n    protected queryManifestService: QueryManifestService,\n    protected usersService: UsersService,\n    protected altimateAuthService: AltimateAuthService,\n    private altimateCodeChatService: AltimateCodeChatService,\n  ) {\n    super(\n      dbtProjectContainer,\n      altimate,\n      telemetry,\n      eventEmitterService,\n      dbtTerminal,\n      queryManifestService,\n      usersService,\n      altimateAuthService,\n    );\n    this._disposables.push(\n      window.onDidChangeActiveTextEditor(() => {\n        // to reset the limit on editor change\n        this.sendUpdatedContextToWebview();\n      }),\n      workspace.onDidChangeConfiguration(\n        (e) => {\n          if (e.affectsConfiguration(\"dbt.disableQueryHistory\")) {\n            if (this._panel) {\n              this.renderWebviewView(this._panel.webview);\n            }\n          }\n          if (e.affectsConfiguration(\"dbt.enableNotebooks\")) {\n            this.updateEnableNotebooksInContext();\n            const event = workspace\n              .getConfiguration(\"dbt\")\n              .get<boolean>(\"enableNotebooks\", false)\n              ? \"NotebooksEnabled\"\n              : \"NotebooksDisabled\";\n            this.telemetry.sendTelemetryEvent(event);\n          }\n        },\n        this,\n        this._disposables,\n      ),\n    );\n\n    this.updateEnableNotebooksInContext();\n    this._disposables.push(\n      commands.registerCommand(\n        \"dbtPowerUser.collectQueryResultsDebugInfo\",\n        () => this.collectQueryResultsDebugInfo(),\n      ),\n      this,\n    );\n  }\n\n  private async sendUpdatedContextToWebview() {\n    const perspectiveTheme = workspace\n      .getConfiguration(\"dbt\")\n      .get(\"perspectiveTheme\", \"Vintage\");\n    const queryHistoryDisabled = workspace\n      .getConfiguration(\"dbt\")\n      .get(\"disableQueryHistory\", false);\n\n    const limit = workspace.getConfiguration(\"dbt\").get<number>(\"queryLimit\");\n    if (this._panel) {\n      await this._panel.webview.postMessage({\n        command: OutboundCommand.GetContext,\n        limit,\n        perspectiveTheme,\n        queryHistoryDisabled,\n        activeEditor: {\n          query: window.activeTextEditor?.document.getText(),\n          filepath: window.activeTextEditor?.document.uri.fsPath,\n        },\n      });\n    }\n  }\n\n  private collectQueryResultsDebugInfo() {\n    console.log(\"Collecting query results debug info\");\n    this._panel?.webview?.postMessage({\n      command: \"collectQueryResultsDebugInfo\",\n    });\n  }\n\n  private updateEnableNotebooksInContext() {\n    // Setting this here to access it in package.json for enabling new file command\n    commands.executeCommand(\n      \"setContext\",\n      \"dbt.enableNotebooks\",\n      workspace.getConfiguration(\"dbt\").get<boolean>(\"enableNotebooks\", false),\n    );\n  }\n\n  private async createQueryResultsPanelVirtualDocument(editorName: string) {\n    this.isWebviewReady = false;\n    const webviewPanel = window.createWebviewPanel(\n      QueryResultPanel.viewType,\n      editorName + \"_\" + getFormattedDateTime(),\n      {\n        viewColumn: ViewColumn.Active,\n      },\n      { enableScripts: true, retainContextWhenHidden: true },\n    );\n    this._panel = webviewPanel;\n    this._webview = webviewPanel.webview;\n    this.renderWebviewView(webviewPanel.webview);\n    this.setupWebviewHooks();\n    await this.checkIfWebviewReady();\n  }\n\n  private updateViewTypeToWebview(viewType: QueryPanelViewType) {\n    this.sendResponseToWebview({\n      command: \"updateViewType\",\n      data: { type: viewType },\n    });\n  }\n\n  protected async onEvent({ command, payload }: SharedStateEventEmitterProps) {\n    switch (command) {\n      case \"executeQuery\":\n        this.executeQuery(\n          payload.query as string,\n          payload.fn as Promise<QueryExecution>,\n          payload.projectName as string,\n        );\n        break;\n      case \"queryResultTab:render\":\n        this.dbtTerminal.debug(\n          \"queryResultTab:render\",\n          \"rendering query result tab\",\n          payload,\n        );\n        this._queryTabData = payload.queryTabData;\n        this.createQueryResultsPanelVirtualDocument(\"Query results\");\n        this.updateViewTypeToWebview(QueryPanelViewType.OPEN_RESULTS_IN_TAB);\n        this.sendQueryTabViewEvent();\n        break;\n      default:\n        super.onEvent({ command, payload });\n    }\n  }\n\n  public async resolveWebviewView(\n    panel: WebviewView,\n    context: WebviewViewResolveContext,\n    _token: CancellationToken,\n  ) {\n    this.updateViewTypeToWebview(QueryPanelViewType.DEFAULT);\n    this._panel = panel;\n    this._bottomPanel = panel;\n    this._webview = panel.webview;\n    this.bindWebviewOptions(context);\n    this.renderWebviewView(panel.webview);\n    this.setupWebviewHooks();\n    this.transmitConfig();\n    _token.onCancellationRequested(async () => {\n      await this.transmitReset();\n    });\n    this.sendQueryPanelViewEvent();\n    this._panel.onDidChangeVisibility(this.sendQueryPanelViewEvent);\n  }\n\n  /** Sets options, note that retainContextWhen hidden is set on registration */\n  private bindWebviewOptions(context: WebviewViewResolveContext) {\n    if (!this._panel) {\n      return;\n    }\n    this._panel.title = \"Query Results\";\n    if (this.isWebviewView(this._panel)) {\n      this._panel.description = \"Preview dbt SQL Results\";\n    }\n    this._panel.webview.options = <WebviewOptions>{ enableScripts: true };\n  }\n\n  private async getProject(projectName?: string) {\n    if (!projectName) {\n      return this.queryManifestService.getOrPickProjectFromWorkspace();\n    }\n\n    const project = this.queryManifestService.getProjectByName(projectName);\n    if (!project) {\n      throw new Error(\"Unable to find project to execute query\");\n    }\n    return project;\n  }\n\n  private async executeIncomingQuery(message: {\n    query: string;\n    projectName: string;\n    editorName: string;\n    limit: number;\n  }) {\n    try {\n      const isHistoryTab = Boolean(message.projectName);\n      const project = await this.getProject(message.projectName);\n      if (!project) {\n        throw new Error(\"Unable to find project to execute query\");\n      }\n      if (message.editorName) {\n        await this.createQueryResultsPanelVirtualDocument(message.editorName);\n      }\n      this.updateViewTypeToWebview(\n        QueryPanelViewType.OPEN_RESULTS_FROM_HISTORY_BOOKMARKS,\n      );\n      this.telemetry.sendTelemetryEvent(\n        isHistoryTab ? \"QueryHistoryExecuteSql\" : \"QueryBookmarkExecuteSql\",\n      );\n      if (message.limit) {\n        await project.executeSQLWithLimitOnQueryPanel(\n          message.query,\n          \"\",\n          message.limit,\n        );\n      } else {\n        await project.executeSQLOnQueryPanel(message.query, \"\");\n      }\n      return;\n    } catch (error) {\n      window.showErrorMessage(\n        extendErrorWithSupportLinks((error as Error).message),\n      );\n      this.dbtTerminal.error(\n        \"ExecuteSqlError\",\n        \"Unable to execute query\",\n        error,\n      );\n    }\n  }\n\n  private async handleOpenCodeInEditor(message: {\n    code: string;\n    name: string;\n  }) {\n    commands.executeCommand(\"dbtPowerUser.createSqlFile\", {\n      code: message?.code,\n      name: message?.name,\n    });\n  }\n\n  /** Primary interface for WebviewView inbound communication */\n  private setupWebviewHooks() {\n    this._panel!.webview.onDidReceiveMessage(\n      async (message) => {\n        switch (message.command) {\n          // Incase of error in rendering perspective viewer query results, user can click button\n          // to disable query history and retry\n          case InboundCommand.ClearQueryHistory:\n            this.telemetry.sendTelemetryError(\n              TelemetryEvents[\"QueryHistory/Cleared\"],\n              message.error,\n            );\n            this._queryHistory = [];\n            this.sendResponseToWebview({\n              command: \"response\",\n              data: {},\n              syncRequestId: message.syncRequestId,\n            });\n            break;\n          case InboundCommand.OpenCodeInEditor:\n            this.handleOpenCodeInEditor(message);\n            break;\n          case InboundCommand.ViewResultSet:\n            const queryHistoryData = message.queryHistory;\n            this._queryTabData = {\n              queryResults: {\n                data: queryHistoryData.data,\n                columnNames: queryHistoryData.columnNames,\n                columnTypes: queryHistoryData.columnTypes,\n              },\n              compiledCodeMarkup: queryHistoryData.compiledSql,\n              rawSql: queryHistoryData.rawSql,\n              elapsedTime: {\n                queryExecutionInfo: { elapsedTime: queryHistoryData.duration },\n              },\n            };\n            this.createQueryResultsPanelVirtualDocument(\n              message.editorName || \"Custom query\",\n            );\n            this.updateViewTypeToWebview(\n              QueryPanelViewType.OPEN_RESULTS_IN_TAB,\n            );\n            break;\n          case InboundCommand.RunAdhocQuery:\n            commands.executeCommand(\"dbtPowerUser.createSqlFile\", {});\n            break;\n          case InboundCommand.ExecuteQueryFromActiveWindow:\n            await this.executeQueryFromActiveWindow(message);\n            break;\n          case InboundCommand.ExecuteQuery:\n            await this.executeIncomingQuery(message);\n            break;\n          case InboundCommand.GetQueryHistory:\n            this.sendResponseToWebview({\n              command: \"queryHistory\",\n              data: this._queryHistory,\n            });\n            break;\n          case InboundCommand.GetQueryTabData:\n            this.sendResponseToWebview({\n              command: \"response\",\n              data: this._queryTabData,\n              syncRequestId: message.syncRequestId,\n            });\n            // Reset only if opening query results in a tab using \"Open in Tab\" button\n            if (this._queryTabData) {\n              // reset to bottom panel\n              this._panel = this._bottomPanel;\n              this._queryTabData = undefined;\n            }\n            break;\n          case InboundCommand.GetQueryPanelContext:\n            {\n              await this.sendUpdatedContextToWebview();\n            }\n            break;\n          case InboundCommand.CancelQuery:\n            if (this.queryExecution) {\n              this.queryExecution.cancel();\n            }\n            await this.transmitReset();\n            break;\n          case InboundCommand.Error:\n            const error = message as RecError;\n            window.showErrorMessage(error.text);\n            break;\n          case InboundCommand.Info:\n            const info = message as RecInfo;\n            window.withProgress(\n              {\n                title: info.text,\n                location: ProgressLocation.Notification,\n                cancellable: false,\n              },\n              async () => {\n                await new Promise((timer) => setTimeout(timer, 3000));\n              },\n            );\n            break;\n          case InboundCommand.UpdateConfig:\n            const configMessage = message as RecConfig;\n            if (configMessage.limit !== undefined) {\n              workspace\n                .getConfiguration(\"dbt\")\n                .update(\"queryLimit\", configMessage.limit);\n            }\n            if (configMessage.scale) {\n              workspace\n                .getConfiguration(\"dbt\")\n                .update(\"queryScale\", configMessage.scale);\n            }\n            if (\"perspectiveTheme\" in configMessage) {\n              workspace\n                .getConfiguration(\"dbt\")\n                .update(\"perspectiveTheme\", configMessage.perspectiveTheme);\n            }\n            break;\n          case InboundCommand.OpenUrl:\n            const config = message as RecOpenUrl;\n            env.openExternal(Uri.parse(config.url));\n            break;\n          case InboundCommand.OpenAltimateCodeChat:\n            try {\n              await commands.executeCommand(\"altimate.openChat\");\n            } catch (err) {\n              window.showErrorMessage(\n                \"Altimate Code is not available. Install the Datamates extension to use chat.\",\n              );\n            }\n            break;\n          case InboundCommand.GetSummary:\n            const summary = message as RecSummary;\n            this.eventEmitterService.fire({\n              command: \"dbtPowerUser.summarizeQuery\",\n              payload: {\n                query: summary.compiledSql,\n              },\n            });\n            break;\n          case InboundCommand.TroubleshootWithAltimate: {\n            const troubleshoot = message as RecTroubleshoot;\n            const sql = troubleshoot.compiledSql || troubleshoot.rawSql;\n            const initialMessage =\n              `I ran this query and it failed.\\n\\n` +\n              `Query:\\n\\`\\`\\`sql\\n${sql}\\n\\`\\`\\`\\n\\n` +\n              `Error:\\n\\`\\`\\`\\n${troubleshoot.errorMessage}\\n\\`\\`\\`\\n\\n` +\n              `Help me troubleshoot and fix this.`;\n            const title = troubleshoot.fileName\n              ? `Troubleshoot: ${troubleshoot.fileName}`\n              : \"Troubleshoot: query error\";\n            const opened = await this.altimateCodeChatService.openChat({\n              initialMessage,\n              title,\n            });\n            if (opened) {\n              this.telemetry.sendTelemetryEvent(\n                \"TroubleshootQueryWithAltimate\",\n              );\n            }\n            break;\n          }\n          case InboundCommand.SetContext:\n            this.dbtProjectContainer.setToGlobalState(\n              message.key,\n              message.value,\n            );\n            break;\n          case InboundCommand.CollectQueryResultsDebugInfo:\n            const data = {\n              ...message,\n              historyItems: this._queryHistory.length,\n              historySize: JSON.stringify(this._queryHistory).length,\n            };\n            this.dbtTerminal.debug(\n              \"CollectQueryResultsDebugInfo\",\n              \"collecting query results debug info\",\n              data,\n            );\n            this.telemetry.sendTelemetryEvent(\n              \"CollectQueryResultsDebugInfo\",\n              data,\n            );\n            break;\n          default:\n            super.handleCommand(message);\n        }\n      },\n      this,\n      this._disposables,\n    );\n  }\n\n  private async executeQueryFromActiveWindow(message: { limit: number }) {\n    const activeEditor = window.activeTextEditor;\n    if (!activeEditor) {\n      window.showErrorMessage(\"No active editor found\");\n      return;\n    }\n    const project = await this.getProject();\n    if (!project) {\n      window.showErrorMessage(\n        \"Unable to find dbt project for executing query.\",\n      );\n      return;\n    }\n    const modelName = path.basename(activeEditor.document.uri.fsPath, \".sql\");\n    let query = activeEditor.document.getText();\n    const selection = activeEditor.selection;\n    if (selection && !selection.isEmpty) {\n      const selectionRange = new Range(\n        selection.start.line,\n        selection.start.character,\n        selection.end.line,\n        selection.end.character,\n      );\n      query = activeEditor.document.getText(selectionRange);\n    }\n    this.telemetry.sendTelemetryEvent(\"QueryActiveWindowExecuteSql\");\n    await project.executeSQLWithLimitOnQueryPanel(\n      query,\n      modelName,\n      message.limit,\n    );\n  }\n\n  private sendQueryPanelViewEvent() {\n    if (this._panel?.visible) {\n      this.telemetry.sendTelemetryEvent(\"QueryPanelActive\");\n    }\n  }\n\n  private sendQueryTabViewEvent = () => {\n    this.telemetry.sendTelemetryEvent(\"QueryTabActive\");\n  };\n\n  /** Renders webview content */\n  protected renderWebviewView(webview: Webview) {\n    this._panel!.webview.html = super.getHtml(\n      webview,\n      this.dbtProjectContainer.extensionUri,\n    );\n  }\n\n  /** Sends query result data to webview */\n  private async transmitData(\n    columnNames: string[],\n    columnTypes: string[],\n    rows: JsonObj[],\n    raw_sql: string,\n    compiled_sql: string,\n  ) {\n    const result = {\n      columnNames,\n      columnTypes,\n      rows,\n      raw_sql,\n      compiled_sql,\n    };\n    if (this._panel) {\n      await this._panel.webview.postMessage({\n        command: OutboundCommand.RenderQuery,\n        ...(<RenderQuery>result),\n      });\n    }\n\n    return result;\n  }\n\n  /** Sends error result data to webview */\n  private async transmitError(\n    error: any,\n    raw_sql: string,\n    compiled_sql: string,\n  ) {\n    if (this._panel) {\n      // TODO: telemetry\n      await this._panel.webview.postMessage({\n        command: OutboundCommand.RenderError,\n        ...(<RenderError>{ ...error, raw_sql, compiled_sql }),\n      });\n    }\n  }\n\n  /** Sends VSCode config data to webview */\n  private transmitConfig() {\n    const limit = workspace.getConfiguration(\"dbt\").get<number>(\"queryLimit\");\n    if (this._panel) {\n      this._panel.webview.postMessage({\n        command: OutboundCommand.InjectConfig,\n        ...(<InjectConfig>{\n          limit,\n          darkMode: ![\n            ColorThemeKind.Light,\n            ColorThemeKind.HighContrastLight,\n          ].includes(window.activeColorTheme.kind),\n          aiEnabled: this.altimate.enabled(),\n        }),\n      });\n    }\n  }\n\n  /** Sends VSCode render loading command to webview */\n  private async transmitLoading() {\n    if (this._panel) {\n      if (this.isWebviewReady) {\n        await this._panel.webview.postMessage({\n          command: OutboundCommand.RenderLoading,\n        });\n        return;\n      }\n    }\n\n    this.incomingMessages.push({\n      command: OutboundCommand.RenderLoading,\n    });\n  }\n\n  /** Sends VSCode clear state command */\n  private async transmitReset() {\n    if (this._panel) {\n      await this._panel.webview.postMessage({\n        command: OutboundCommand.ResetState,\n      });\n    }\n  }\n\n  /** A wrapper for {@link transmitData} which converts server\n   * results interface ({@link ExecuteSQLResult}) to what the webview expects */\n  private async transmitDataWrapper(result: ExecuteSQLResult, query: string) {\n    const rows: JsonObj[] = new Array(result.table.rows.length);\n    // Convert compressed array format to dict[] - optimized version\n    for (let i = 0; i < result.table.rows.length; i++) {\n      const row: JsonObj = {};\n      const currentRow = result.table.rows[i];\n      for (let j = 0; j < currentRow.length; j++) {\n        row[result.table.column_names[j]] = currentRow[j] as any;\n      }\n      rows[i] = row;\n    }\n    return await this.transmitData(\n      result.table.column_names,\n      result.table.column_types,\n      rows,\n      query,\n      result.compiled_sql,\n    );\n  }\n\n  private updateQueryHistory(\n    result: {\n      columnNames: string[];\n      columnTypes: string[];\n      rows: JsonObj[];\n      raw_sql: string;\n      compiled_sql: string;\n    },\n    projectName: string,\n    query: string,\n    duration: number,\n    modelName: string,\n  ) {\n    // Do not update query history if disabled\n    if (workspace.getConfiguration(\"dbt\").get(\"disableQueryHistory\", false)) {\n      return;\n    }\n    const project = projectName\n      ? this.queryManifestService.getProjectByName(projectName) // for queries executed from history and bookmarks tab\n      : this.queryManifestService.getProject(); // queries executed from main window\n    if (!project) {\n      this.dbtTerminal.debug(\n        \"updateQueryHistory\",\n        \"skipping query history update, no project found, may be executed from query history\",\n      );\n      return;\n    }\n    const queryHistoryCurrentSize = getStringSizeInMb(\n      JSON.stringify(this._queryHistory),\n    );\n    // if current history size > 3MB, remove the oldest entry\n    if (queryHistoryCurrentSize > 3) {\n      this._queryHistory.pop();\n      this.dbtTerminal.info(\n        \"updateQueryHistory\",\n        \"Query history size exceeded 3MB, cleared oldest entry\",\n      );\n    }\n    this._queryHistory.unshift({\n      rawSql: query,\n      compiledSql: result.compiled_sql,\n      timestamp: Date.now(),\n      duration,\n      adapter: project.getAdapterType(),\n      projectName: project.getProjectName(),\n      data: result.rows,\n      columnNames: result.columnNames,\n      columnTypes: result.columnTypes,\n      modelName,\n    });\n    this._queryHistory = this._queryHistory.splice(0, 10);\n  }\n\n  /** Runs a query transmitting appropriate notifications to webview */\n  public async executeQuery(\n    query: string,\n    queryExecutionPromise: Promise<QueryExecution>,\n    projectName: string,\n  ) {\n    const start = Date.now();\n    //using id to focus on the webview is more reliable than using the view title\n    await commands.executeCommand(\"dbtPowerUser.PreviewResults.focus\");\n    if (this._panel && this.isWebviewView(this._panel)) {\n      this._panel.show(); // Show the view\n      this._panel.webview.postMessage({ command: \"focus\" }); // keyboard focus\n    }\n    this.transmitLoading();\n    try {\n      const queryExecution = (this.queryExecution =\n        await queryExecutionPromise);\n      const output = await queryExecution.executeQuery();\n      const result = await this.transmitDataWrapper(output, query);\n      this.updateQueryHistory(\n        result,\n        projectName,\n        query,\n        Date.now() - start,\n        output.modelName,\n      );\n      return result;\n    } catch (exc: any) {\n      if (exc instanceof PythonException) {\n        if (exc.exception.type.name === \"KeyboardInterrupt\") {\n          // query cancellation\n          this.transmitReset();\n          return;\n        }\n        window.showErrorMessage(\n          \"An error occured while trying to execute your query: \" +\n            exc.exception.message,\n        );\n        await this.transmitError(\n          {\n            error: {\n              code: -1,\n              message: exc.exception.message,\n              data: JSON.stringify(exc.stack, null, 2),\n            },\n          },\n          query,\n          query,\n        );\n        return;\n      }\n      if (exc instanceof ExecuteSQLError) {\n        window.showErrorMessage(\n          \"An error occured while trying to execute your query: \" + exc.message,\n        );\n        await this.transmitError(\n          {\n            error: {\n              code: -1,\n              message: exc.message,\n              data: JSON.stringify(exc.stack, null, 2),\n            },\n          },\n          query,\n          exc.compiled_sql,\n        );\n        return;\n      }\n      await this.transmitError(\n        {\n          error: { code: -1, message: `${exc}`, data: {} },\n        },\n        query,\n        query,\n      );\n    } finally {\n      this.queryExecution = undefined;\n      this._panel = this._bottomPanel;\n    }\n  }\n\n  protected onWebviewReady() {\n    super.onWebviewReady();\n\n    if (!this._panel) {\n      return;\n    }\n\n    while (this.incomingMessages.length) {\n      const message = this.incomingMessages.pop();\n      if (message) {\n        this.sendResponseToWebview(message);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/webview_provider/sqlLineagePanel.ts",
    "content": "import {\n  DBTTerminal,\n  NodeMetaData,\n  RESOURCE_TYPE_SOURCE,\n  SourceTable,\n} from \"@altimateai/dbt-integration\";\nimport * as crypto from \"crypto\";\nimport { inject } from \"inversify\";\nimport * as path from \"path\";\nimport {\n  CancellationToken,\n  ColorThemeKind,\n  commands,\n  Disposable,\n  env,\n  ProgressLocation,\n  TextEditor,\n  Uri,\n  WebviewPanel,\n  window,\n  workspace,\n} from \"vscode\";\nimport { AltimateRequest, SqlLineageDetails } from \"../altimate\";\nimport { DBTProject } from \"../dbt_client/dbtProject\";\nimport { DBTProjectContainer } from \"../dbt_client/dbtProjectContainer\";\nimport { ManifestCacheProjectAddedEvent } from \"../dbt_client/event/manifestCacheChangedEvent\";\nimport { AltimateAuthService } from \"../services/altimateAuthService\";\nimport { QueryManifestService } from \"../services/queryManifestService\";\nimport { SharedStateService } from \"../services/sharedStateService\";\nimport { UsersService } from \"../services/usersService\";\nimport { TelemetryService } from \"../telemetry\";\nimport { extendErrorWithSupportLinks } from \"../utils\";\nimport { AltimateWebviewProvider } from \"./altimateWebviewProvider\";\n\ntype SQLLineage = {\n  tableEdges: [string, string][];\n  details: SqlLineageDetails;\n  nodePositions?: Record<string, [number, number]>;\n  errorMessage?: undefined;\n};\n\nexport class SQLLineagePanel\n  extends AltimateWebviewProvider\n  implements Disposable\n{\n  protected viewPath = \"/lineage\";\n  public static readonly viewType = \"dbtPowerUser.sqlLineage\";\n  private disposables: Disposable[] = [];\n  private activeTextEditor?: TextEditor;\n\n  public constructor(\n    protected dbtProjectContainer: DBTProjectContainer,\n    protected altimate: AltimateRequest,\n    protected telemetry: TelemetryService,\n    @inject(\"DBTTerminal\")\n    protected terminal: DBTTerminal,\n    protected queryManifestService: QueryManifestService,\n    protected eventEmitterService: SharedStateService,\n    protected usersService: UsersService,\n    protected altimateAuthService: AltimateAuthService,\n  ) {\n    super(\n      dbtProjectContainer,\n      altimate,\n      telemetry,\n      eventEmitterService,\n      terminal,\n      queryManifestService,\n      usersService,\n      altimateAuthService,\n    );\n    window.onDidChangeActiveColorTheme(\n      async () => {\n        this.changedActiveColorTheme();\n      },\n      null,\n      this.disposables,\n    );\n    this.activeTextEditor = window.activeTextEditor;\n    window.onDidChangeActiveTextEditor((event: TextEditor | undefined) => {\n      if (event) {\n        this.activeTextEditor = event;\n      }\n    });\n  }\n\n  dispose() {\n    while (this.disposables.length) {\n      const x = this.disposables.pop();\n      if (x) {\n        x.dispose();\n      }\n    }\n  }\n\n  changedActiveColorTheme() {\n    if (!this._panel) {\n      return;\n    }\n    const theme = [\n      ColorThemeKind.Light,\n      ColorThemeKind.HighContrastLight,\n    ].includes(window.activeColorTheme.kind)\n      ? \"light\"\n      : \"dark\";\n    this._panel.webview.postMessage({\n      command: \"setTheme\",\n      args: { theme },\n    });\n  }\n\n  private getEvent(): ManifestCacheProjectAddedEvent | undefined {\n    const currentFilePath = this.activeTextEditor?.document.uri;\n    if (!currentFilePath) {\n      return;\n    }\n    return this.queryManifestService.getEventByDocument(currentFilePath);\n  }\n\n  getActiveEditorFilename() {\n    return path.basename(this.activeTextEditor!.document.fileName, \".sql\");\n  }\n\n  private getProject() {\n    const currentFilePath = this.activeTextEditor?.document.uri;\n    if (!currentFilePath) {\n      return;\n    }\n    return this.queryManifestService.getProjectByUri(currentFilePath);\n  }\n\n  private getMissingLineageMessage() {\n    const message =\n      \"A valid dbt file (model, seed etc.) needs to be open and active in the editor area above to view lineage\";\n    try {\n      this.getProject()?.throwDiagnosticsErrorIfAvailable();\n    } catch (err) {\n      return (err as Error).message;\n    }\n\n    return message;\n  }\n\n  async getSQLLineage(token: CancellationToken): Promise<SQLLineage> {\n    const event = this.getEvent();\n    if (!event) {\n      throw new Error(this.getMissingLineageMessage());\n    }\n    const { nodeMetaMap, sourceMetaMap } = event;\n    const project = this.getProject();\n    if (!project) {\n      throw new Error(\"Unable to find the project\");\n    }\n    const modelName = this.getActiveEditorFilename();\n    const currentFile = this.activeTextEditor?.document.uri;\n    if (!currentFile) {\n      throw new Error(\"Unable to get current file\");\n    }\n    const fileContentBytes = await workspace.fs.readFile(currentFile);\n    const compiledSQL = await project.unsafeCompileQuery(\n      fileContentBytes.toString(),\n      modelName,\n    );\n    if (!compiledSQL) {\n      throw new Error(`Unable to compile sql for model ${modelName}`);\n    }\n    const currNode = nodeMetaMap.lookupByBaseName(modelName);\n    if (!currNode) {\n      throw new Error(`Unable to find model for model ${modelName}`);\n    }\n    const modelId = currNode.unique_id;\n    const modelsToFetch = project.getNonEphemeralParents([modelId]);\n    const abortController = new AbortController();\n    token.onCancellationRequested(() => abortController.abort());\n    const { mappedNode } = await project.getNodesWithDBColumns(\n      modelsToFetch,\n      abortController.signal,\n    );\n    const model_info = modelsToFetch.map((n) => ({\n      model_node: mappedNode[n],\n    }));\n    const hash = crypto.createHash(\"md5\").update(compiledSQL).digest(\"hex\");\n    const sessionId = `${env.sessionId}-${hash}`;\n    const response = await this.altimate.sqlLineage({\n      compiled_sql: compiledSQL,\n      model_info,\n      model_dialect: project.getAdapterType(),\n      session_id: sessionId,\n    });\n    const { details, nodePositions } = response;\n\n    const nodeMapping: Record<string, { nodeId: string; type: string }> = {};\n    for (const modelId of modelsToFetch) {\n      const splits = modelId.split(\".\");\n      if (splits[0] === \"source\") {\n        const _source = sourceMetaMap.get(splits[splits.length - 2]);\n        const _table = splits[splits.length - 1].toLowerCase();\n        if (_source) {\n          for (const key in details) {\n            if (details[key].type === \"table\" && key.toLowerCase() === _table) {\n              nodeMapping[key] = { nodeId: modelId, type: \"source\" };\n              break;\n            }\n          }\n          continue;\n        }\n      }\n      const _node = nodeMetaMap.lookupByUniqueId(modelId);\n      if (_node) {\n        for (const key in details) {\n          if (\n            details[key].type === \"table\" &&\n            key.toLowerCase() === _node.alias.toLowerCase()\n          ) {\n            nodeMapping[key] = { nodeId: modelId, type: _node.resource_type };\n            break;\n          }\n        }\n        continue;\n      }\n    }\n    nodeMapping[modelName] = {\n      nodeId: currNode.unique_id,\n      type: currNode.resource_type,\n    };\n    const FINAL_SELECT = \"__final_select__\";\n    const tableEdges = response.tableEdges.map(\n      (edge) =>\n        edge.map((item) => (item === FINAL_SELECT ? modelName : item)) as [\n          string,\n          string,\n        ],\n    );\n    details[modelName] = details[FINAL_SELECT];\n    delete details[FINAL_SELECT];\n    for (const k in details) {\n      details[k] = { ...details[k], ...nodeMapping[k] };\n      if (k === modelName) {\n        details[k][\"name\"] = modelName;\n      }\n    }\n    if (nodePositions) {\n      nodePositions[modelName] = nodePositions[FINAL_SELECT];\n      delete nodePositions[FINAL_SELECT];\n    }\n    return { tableEdges, details, nodePositions };\n  }\n\n  async renderSqlVisualizer(\n    panel: WebviewPanel,\n    lineage: SQLLineage,\n  ): Promise<void | Thenable<void>> {\n    this.terminal.debug(\n      \"sqlLineagePanel:resolveWebviewView\",\n      \"onResolveWebviewView\",\n    );\n    this._panel = panel;\n    this.renderWebviewView(panel.webview);\n    await this.checkIfWebviewReady();\n    panel.webview.postMessage({\n      command: \"render\",\n      args: lineage,\n    });\n  }\n\n  async handleCommand(message: {\n    command: string;\n    args: any;\n    syncRequestId?: string;\n  }): Promise<void> {\n    this.terminal.debug(\n      \"sqlLineagePanel:handleWebviewMessage\",\n      \"message\",\n      message,\n    );\n    const { command, args = {}, syncRequestId } = message;\n    const { id, params } = args;\n    switch (command) {\n      case \"openFile\":\n        const { url } = args;\n        if (!url) {\n          return;\n        }\n        await commands.executeCommand(\"vscode.open\", Uri.file(url), {\n          preview: false,\n          preserveFocus: true,\n        });\n        break;\n      case \"getColumns\":\n        const body = await this.getColumns(params);\n        this._panel?.webview.postMessage({\n          command: \"response\",\n          args: { id, syncRequestId, body, status: true },\n        });\n        break;\n\n      case \"getLineageSettings\":\n        const config = workspace.getConfiguration(\"dbt.lineage\");\n        this._panel?.webview.postMessage({\n          command: \"response\",\n          args: {\n            id,\n            syncRequestId,\n            status: true,\n            body: {\n              showSelectEdges: config.get(\"showSelectEdges\", true),\n              showNonSelectEdges: config.get(\"showNonSelectEdges\", true),\n              defaultExpansion: config.get(\"defaultExpansion\", 1),\n            },\n          },\n        });\n        break;\n      default:\n        super.handleCommand(message);\n        break;\n    }\n  }\n\n  private async addModelColumnsFromDB(project: DBTProject, node: NodeMetaData) {\n    const columnsFromDB = await project.getColumnsOfModel(node.name);\n    console.log(\"addColumnsFromDB: \", node.name, \" -> \", columnsFromDB);\n    return project.mergeColumnsFromDB(node, columnsFromDB);\n  }\n\n  private async addSourceColumnsFromDB(\n    project: DBTProject,\n    nodeName: string,\n    table: SourceTable,\n  ) {\n    const columnsFromDB = await project.getColumnsOfSource(\n      nodeName,\n      table.name,\n    );\n    console.log(\"addColumnsFromDB: \", nodeName, \" -> \", columnsFromDB);\n    return project.mergeColumnsFromDB(table, columnsFromDB);\n  }\n\n  private async getColumns({\n    table,\n    refresh,\n  }: {\n    table: string;\n    refresh: boolean;\n  }): Promise<\n    | {\n        id: string;\n        purpose: string;\n        columns: {\n          table: string;\n          name: string;\n          datatype: string;\n          can_lineage_expand: boolean;\n          description: string;\n        }[];\n      }\n    | undefined\n  > {\n    const event = this.getEvent();\n    if (!event) {\n      return;\n    }\n    const project = this.getProject();\n    if (!project) {\n      return;\n    }\n    const splits = table.split(\".\");\n    const nodeType = splits[0];\n    if (nodeType === RESOURCE_TYPE_SOURCE) {\n      const { sourceMetaMap } = event;\n      const sourceName = splits[2];\n      const tableName = splits[3];\n      const node = sourceMetaMap.get(sourceName);\n      if (!node) {\n        return;\n      }\n      const _table = node.tables.find((t) => t.name === tableName);\n      if (!_table) {\n        return;\n      }\n      if (refresh) {\n        const ok = await window.withProgress(\n          {\n            title: \"Fetching metadata\",\n            location: ProgressLocation.Notification,\n            cancellable: false,\n          },\n          async () => {\n            return await this.addSourceColumnsFromDB(\n              project,\n              node.name,\n              _table,\n            );\n          },\n        );\n        if (!ok) {\n          window.showErrorMessage(\n            extendErrorWithSupportLinks(\n              \"Unable to get columns from DB for model: \" +\n                node.name +\n                \" table: \" +\n                _table.name +\n                \".\",\n            ),\n          );\n          return;\n        }\n      }\n      return {\n        id: table,\n        purpose: _table.description,\n        columns: Object.values(_table.columns)\n          .map((c) => ({\n            table,\n            name: c.name,\n            datatype: c.data_type?.toLowerCase() || \"\",\n            can_lineage_expand: false,\n            description: c.description,\n          }))\n          .sort((a, b) => a.name.localeCompare(b.name)),\n      };\n    }\n    const { nodeMetaMap } = event;\n    const node = nodeMetaMap.lookupByUniqueId(table);\n    if (!node) {\n      return;\n    }\n    if (refresh) {\n      if (node.config.materialized === \"ephemeral\") {\n        window.showInformationMessage(\n          \"Cannot fetch columns for ephemeral models.\",\n        );\n        return;\n      }\n      const ok = await window.withProgress(\n        {\n          title: \"Fetching metadata\",\n          location: ProgressLocation.Notification,\n          cancellable: false,\n        },\n        async () => {\n          return await this.addModelColumnsFromDB(project, node);\n        },\n      );\n      if (!ok) {\n        window.showErrorMessage(\n          extendErrorWithSupportLinks(\n            \"Unable to get columns from DB for model: \" +\n              node.name +\n              \" table: \" +\n              table +\n              \".\",\n          ),\n        );\n        return;\n      }\n    }\n\n    return {\n      id: table,\n      purpose: node.description,\n      columns: Object.values(node.columns)\n        .map((c) => ({\n          table,\n          name: c.name,\n          datatype: c.data_type?.toLowerCase() || \"\",\n          can_lineage_expand: false,\n          description: c.description,\n        }))\n        .sort((a, b) => a.name.localeCompare(b.name)),\n    };\n  }\n}\n"
  },
  {
    "path": "sweep.yaml",
    "content": "# Sweep AI turns bugs & feature requests into code changes (https://sweep.dev)\n# For details on our config file, check out our docs at https://docs.sweep.dev/usage/config\n\n# This setting contains a list of rules that Sweep will check for. If any of these rules are broken in a new commit, Sweep will create an pull request to fix the broken rule.\nrules:\n  - \"All new business logic should have corresponding unit tests.\"\n  - \"Refactor large functions to be more modular.\"\n  - \"Add docstrings to all functions and file headers.\"\n\n# This is the branch that Sweep will develop from and make pull requests to. Most people use 'main' or 'master' but some users also use 'dev' or 'staging'.\nbranch: 'master'\n\n# By default Sweep will read the logs and outputs from your existing Github Actions. To disable this, set this to false.\ngha_enabled: True\n\n# This is the description of your project. It will be used by sweep when creating PRs. You can tell Sweep what's unique about your project, what frameworks you use, or anything else you want.\n#\n# Example:\n#\n# description: sweepai/sweep is a python project. The main api endpoints are in sweepai/api.py. Write code that adheres to PEP8.\ndescription: ''\n\n# This sets whether to create pull requests as drafts. If this is set to True, then all pull requests will be created as drafts and GitHub Actions will not be triggered.\ndraft: False\n\n# This is a list of directories that Sweep will not be able to edit.\nblocked_dirs: []\n"
  },
  {
    "path": "syntaxes/jinja-sql.tmLanguage.json",
    "content": "{\n  \"$schema\": \"https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json\",\n  \"name\": \"Jinja SQL\",\n  \"scopeName\": \"source.sql.jinja\",\n  \"patterns\": [\n    { \"include\": \"#jinja-comment\" },\n    { \"include\": \"#jinja-statement\" },\n    { \"include\": \"#jinja-expression\" },\n    { \"include\": \"#sql-comment-line\" },\n    { \"include\": \"#sql-comment-block\" },\n    { \"include\": \"#sql-string-single\" },\n    { \"include\": \"#sql-string-double\" },\n    { \"include\": \"#sql-number\" },\n    { \"include\": \"#sql-keyword-dml\" },\n    { \"include\": \"#sql-keyword-ddl\" },\n    { \"include\": \"#sql-keyword-clause\" },\n    { \"include\": \"#sql-keyword-join\" },\n    { \"include\": \"#sql-keyword-operator\" },\n    { \"include\": \"#sql-keyword-other\" },\n    { \"include\": \"#sql-function-aggregate\" },\n    { \"include\": \"#sql-function-window\" },\n    { \"include\": \"#sql-function-date\" },\n    { \"include\": \"#sql-function-string\" },\n    { \"include\": \"#sql-function-conditional\" },\n    { \"include\": \"#sql-function-conversion\" },\n    { \"include\": \"#sql-constant\" },\n    { \"include\": \"#sql-operator\" },\n    { \"include\": \"#sql-identifier\" }\n  ],\n  \"repository\": {\n    \"jinja-comment\": {\n      \"name\": \"comment.block.jinja\",\n      \"begin\": \"\\\\{#\",\n      \"end\": \"#\\\\}\",\n      \"beginCaptures\": { \"0\": { \"name\": \"punctuation.definition.comment.begin.jinja\" } },\n      \"endCaptures\": { \"0\": { \"name\": \"punctuation.definition.comment.end.jinja\" } }\n    },\n    \"jinja-statement\": {\n      \"name\": \"meta.statement.jinja\",\n      \"begin\": \"\\\\{%-?\",\n      \"end\": \"-?%\\\\}\",\n      \"beginCaptures\": { \"0\": { \"name\": \"punctuation.definition.tag.begin.jinja\" } },\n      \"endCaptures\": { \"0\": { \"name\": \"punctuation.definition.tag.end.jinja\" } },\n      \"patterns\": [\n        { \"include\": \"#jinja-keyword\" },\n        { \"include\": \"#jinja-dbt-function\" },\n        { \"include\": \"#jinja-filter\" },\n        { \"include\": \"#jinja-operator\" },\n        { \"include\": \"#jinja-string-single\" },\n        { \"include\": \"#jinja-string-double\" },\n        { \"include\": \"#jinja-number\" },\n        { \"include\": \"#jinja-boolean\" },\n        { \"include\": \"#jinja-variable\" }\n      ]\n    },\n    \"jinja-expression\": {\n      \"name\": \"meta.expression.jinja\",\n      \"begin\": \"\\\\{\\\\{-?\",\n      \"end\": \"-?\\\\}\\\\}\",\n      \"beginCaptures\": { \"0\": { \"name\": \"punctuation.definition.expression.begin.jinja\" } },\n      \"endCaptures\": { \"0\": { \"name\": \"punctuation.definition.expression.end.jinja\" } },\n      \"patterns\": [\n        { \"include\": \"#jinja-dbt-function\" },\n        { \"include\": \"#jinja-filter\" },\n        { \"include\": \"#jinja-operator\" },\n        { \"include\": \"#jinja-string-single\" },\n        { \"include\": \"#jinja-string-double\" },\n        { \"include\": \"#jinja-number\" },\n        { \"include\": \"#jinja-boolean\" },\n        { \"include\": \"#jinja-variable\" }\n      ]\n    },\n    \"jinja-keyword\": {\n      \"match\": \"(?i)\\\\b(for|endfor|if|elif|else|endif|set|macro|endmacro|call|endcall|block|endblock|filter|endfilter|raw|endraw|extends|include|import|from|do|with|endwith|autoescape|endautoescape)\\\\b\",\n      \"name\": \"keyword.control.jinja\"\n    },\n    \"jinja-dbt-function\": {\n      \"match\": \"\\\\b(ref|source|config|var|env_var|adapter|return|log|run_query|execute|this|graph|flags|target|project_name|schema|database|model|modules|exceptions|fromjson|tojson|fromyaml|toyaml|set_strict_mode|is_incremental|builtins)\\\\b(?=\\\\s*\\\\(|\\\\s*\\\\.)\",\n      \"name\": \"support.function.dbt.jinja\"\n    },\n    \"jinja-filter\": {\n      \"match\": \"(?<=\\\\|\\\\s{0,4})\\\\b(trim|lower|upper|title|capitalize|default|d|int|float|string|list|join|replace|regex_replace|length|count|sort|reverse|unique|first|last|map|select|reject|selectattr|rejectattr|groupby|batch|slice|indent|truncate|wordwrap|center|round|abs|attr|format|safe|escape|e|forceescape|urlencode|xmlattr|filesizeformat|pprint|dictsort|striptags|tojson|as_bool|as_number|as_text|as_native|log|set)\\\\b\",\n      \"name\": \"support.function.filter.jinja\"\n    },\n    \"jinja-operator\": {\n      \"match\": \"\\\\b(and|or|not|in|is)\\\\b|~|\\\\|(?!\\\\})\",\n      \"name\": \"keyword.operator.jinja\"\n    },\n    \"jinja-string-single\": {\n      \"name\": \"string.quoted.single.jinja\",\n      \"begin\": \"'\",\n      \"end\": \"'\",\n      \"patterns\": [\n        { \"match\": \"\\\\\\\\.\", \"name\": \"constant.character.escape.jinja\" }\n      ]\n    },\n    \"jinja-string-double\": {\n      \"name\": \"string.quoted.double.jinja\",\n      \"begin\": \"\\\"\",\n      \"end\": \"\\\"\",\n      \"patterns\": [\n        { \"match\": \"\\\\\\\\.\", \"name\": \"constant.character.escape.jinja\" }\n      ]\n    },\n    \"jinja-number\": {\n      \"match\": \"\\\\b\\\\d+(\\\\.\\\\d+)?\\\\b\",\n      \"name\": \"constant.numeric.jinja\"\n    },\n    \"jinja-boolean\": {\n      \"match\": \"\\\\b(true|false|True|False|none|None)\\\\b\",\n      \"name\": \"constant.language.jinja\"\n    },\n    \"jinja-variable\": {\n      \"match\": \"\\\\b[a-zA-Z_][a-zA-Z0-9_]*\\\\b\",\n      \"name\": \"variable.other.jinja\"\n    },\n    \"sql-comment-line\": {\n      \"name\": \"comment.line.double-dash.sql\",\n      \"match\": \"--.*$\"\n    },\n    \"sql-comment-block\": {\n      \"name\": \"comment.block.sql\",\n      \"begin\": \"/\\\\*\",\n      \"end\": \"\\\\*/\",\n      \"beginCaptures\": { \"0\": { \"name\": \"punctuation.definition.comment.begin.sql\" } },\n      \"endCaptures\": { \"0\": { \"name\": \"punctuation.definition.comment.end.sql\" } }\n    },\n    \"sql-string-single\": {\n      \"name\": \"string.quoted.single.sql\",\n      \"begin\": \"'\",\n      \"end\": \"'\",\n      \"patterns\": [\n        { \"match\": \"''\", \"name\": \"constant.character.escape.sql\" },\n        { \"include\": \"#jinja-expression\" }\n      ]\n    },\n    \"sql-string-double\": {\n      \"name\": \"string.quoted.double.sql\",\n      \"begin\": \"\\\"\",\n      \"end\": \"\\\"\",\n      \"patterns\": [\n        { \"match\": \"\\\"\\\"\", \"name\": \"constant.character.escape.sql\" }\n      ]\n    },\n    \"sql-number\": {\n      \"match\": \"\\\\b\\\\d+(\\\\.\\\\d+)?([eE][+-]?\\\\d+)?\\\\b\",\n      \"name\": \"constant.numeric.sql\"\n    },\n    \"sql-keyword-dml\": {\n      \"match\": \"(?i)\\\\b(SELECT|INSERT|UPDATE|DELETE|MERGE|UPSERT|TRUNCATE|COPY|UNLOAD)\\\\b\",\n      \"name\": \"keyword.other.dml.sql\"\n    },\n    \"sql-keyword-ddl\": {\n      \"match\": \"(?i)\\\\b(CREATE|ALTER|DROP|REPLACE|RENAME|COMMENT|GRANT|REVOKE)\\\\b\",\n      \"name\": \"keyword.other.ddl.sql\"\n    },\n    \"sql-keyword-clause\": {\n      \"match\": \"(?i)\\\\b(FROM|WHERE|GROUP\\\\s+BY|ORDER\\\\s+BY|HAVING|LIMIT|OFFSET|FETCH|UNION|UNION\\\\s+ALL|INTERSECT|EXCEPT|MINUS|INTO|VALUES|SET|WITH|AS|DISTINCT|ALL|TOP|QUALIFY|WINDOW|PARTITION\\\\s+BY|ROWS|RANGE|UNBOUNDED|PRECEDING|FOLLOWING|CURRENT\\\\s+ROW)\\\\b\",\n      \"name\": \"keyword.other.clause.sql\"\n    },\n    \"sql-keyword-join\": {\n      \"match\": \"(?i)\\\\b(JOIN|INNER\\\\s+JOIN|LEFT\\\\s+JOIN|LEFT\\\\s+OUTER\\\\s+JOIN|RIGHT\\\\s+JOIN|RIGHT\\\\s+OUTER\\\\s+JOIN|FULL\\\\s+JOIN|FULL\\\\s+OUTER\\\\s+JOIN|CROSS\\\\s+JOIN|NATURAL\\\\s+JOIN|LATERAL|ON|USING)\\\\b\",\n      \"name\": \"keyword.other.join.sql\"\n    },\n    \"sql-keyword-operator\": {\n      \"match\": \"(?i)\\\\b(AND|OR|NOT|IN|EXISTS|BETWEEN|LIKE|ILIKE|RLIKE|REGEXP|IS|IS\\\\s+NOT|ANY|SOME|ALL|CASE|WHEN|THEN|ELSE|END)\\\\b\",\n      \"name\": \"keyword.operator.sql\"\n    },\n    \"sql-keyword-other\": {\n      \"match\": \"(?i)\\\\b(TABLE|VIEW|MATERIALIZED|TEMPORARY|TEMP|IF|BEGIN|COMMIT|ROLLBACK|SAVEPOINT|TRANSACTION|INDEX|CONSTRAINT|PRIMARY\\\\s+KEY|FOREIGN\\\\s+KEY|REFERENCES|UNIQUE|CHECK|DEFAULT|NOT\\\\s+NULL|NULL|CASCADE|RESTRICT|SCHEMA|DATABASE|WAREHOUSE|STAGE|PIPE|STREAM|TASK|PROCEDURE|FUNCTION|RETURNS|LANGUAGE|OVER|OVERWRITE|EXTERNAL|LATERAL\\\\s+FLATTEN|PIVOT|UNPIVOT|TABLESAMPLE|SAMPLE|RECURSIVE|VOLATILE|TRANSIENT|CLUSTER\\\\s+BY|ASC|DESC|NULLS\\\\s+FIRST|NULLS\\\\s+LAST)\\\\b\",\n      \"name\": \"keyword.other.sql\"\n    },\n    \"sql-function-aggregate\": {\n      \"match\": \"(?i)\\\\b(COUNT|SUM|AVG|MIN|MAX|LISTAGG|ARRAY_AGG|OBJECT_AGG|MEDIAN|MODE|PERCENTILE_CONT|PERCENTILE_DISC|APPROX_COUNT_DISTINCT|HLL|STDDEV|STDDEV_POP|STDDEV_SAMP|VARIANCE|VAR_POP|VAR_SAMP|CORR|COVAR_POP|COVAR_SAMP|REGR_SLOPE|REGR_INTERCEPT|BITAND_AGG|BITOR_AGG|BOOLAND_AGG|BOOLOR_AGG|ANY_VALUE|COUNT_IF|GROUPING|GROUPING_ID)\\\\b(?=\\\\s*\\\\()\",\n      \"name\": \"support.function.aggregate.sql\"\n    },\n    \"sql-function-window\": {\n      \"match\": \"(?i)\\\\b(ROW_NUMBER|RANK|DENSE_RANK|NTILE|LAG|LEAD|FIRST_VALUE|LAST_VALUE|NTH_VALUE|CUME_DIST|PERCENT_RANK|RATIO_TO_REPORT|WIDTH_BUCKET|CONDITIONAL_TRUE_EVENT|CONDITIONAL_CHANGE_EVENT)\\\\b(?=\\\\s*\\\\()\",\n      \"name\": \"support.function.window.sql\"\n    },\n    \"sql-function-date\": {\n      \"match\": \"(?i)\\\\b(DATE_TRUNC|DATEADD|DATEDIFF|DATE_PART|DATEPART|EXTRACT|YEAR|MONTH|DAY|HOUR|MINUTE|SECOND|DAYOFWEEK|DAYOFYEAR|WEEKOFYEAR|QUARTER|LAST_DAY|NEXT_DAY|PREVIOUS_DAY|ADD_MONTHS|MONTHS_BETWEEN|TIMESTAMPADD|TIMESTAMPDIFF|TO_DATE|TO_TIMESTAMP|TO_TIMESTAMP_NTZ|TO_TIMESTAMP_LTZ|TO_TIMESTAMP_TZ|TO_CHAR|TO_VARCHAR|DATE_FROM_PARTS|TIME_FROM_PARTS|TIMESTAMP_FROM_PARTS|CURRENT_DATE|CURRENT_TIMESTAMP|CURRENT_TIME|GETDATE|SYSDATE|NOW|CONVERT_TIMEZONE|TIMEDIFF|TIMEADD|TIMESLICE)\\\\b(?=\\\\s*\\\\(?)\",\n      \"name\": \"support.function.datetime.sql\"\n    },\n    \"sql-function-string\": {\n      \"match\": \"(?i)\\\\b(CONCAT|UPPER|LOWER|TRIM|LTRIM|RTRIM|LPAD|RPAD|LENGTH|LEN|LEFT|RIGHT|SUBSTRING|SUBSTR|REPLACE|TRANSLATE|REVERSE|REPEAT|SPACE|SPLIT|SPLIT_PART|STRTOK|STRTOK_TO_ARRAY|REGEXP_REPLACE|REGEXP_SUBSTR|REGEXP_LIKE|REGEXP_COUNT|REGEXP_INSTR|INITCAP|CHARINDEX|POSITION|LOCATE|CONTAINS|STARTSWITH|ENDSWITH|CHR|ASCII|UNICODE|ENCODE|DECODE|BASE64_ENCODE|BASE64_DECODE|HEX_ENCODE|HEX_DECODE|MD5|SHA1|SHA2|HASH|COLLATE|SOUNDEX|EDITDISTANCE)\\\\b(?=\\\\s*\\\\()\",\n      \"name\": \"support.function.string.sql\"\n    },\n    \"sql-function-conditional\": {\n      \"match\": \"(?i)\\\\b(COALESCE|NVL|NVL2|NULLIF|NULLIFZERO|ZEROIFNULL|IFF|IF|IFNULL|DECODE|GREATEST|LEAST|EQUAL_NULL)\\\\b(?=\\\\s*\\\\()\",\n      \"name\": \"support.function.conditional.sql\"\n    },\n    \"sql-function-conversion\": {\n      \"match\": \"(?i)\\\\b(CAST|TRY_CAST|CONVERT|TRY_CONVERT|TO_NUMBER|TO_DECIMAL|TO_NUMERIC|TO_DOUBLE|TO_BOOLEAN|TO_BINARY|TO_VARIANT|TO_OBJECT|TO_ARRAY|PARSE_JSON|TRY_PARSE_JSON|PARSE_XML|TYPEOF|OBJECT_CONSTRUCT|OBJECT_INSERT|OBJECT_DELETE|OBJECT_KEYS|ARRAY_CONSTRUCT|ARRAY_APPEND|ARRAY_PREPEND|ARRAY_CAT|ARRAY_COMPACT|ARRAY_CONTAINS|ARRAY_DISTINCT|ARRAY_FLATTEN|ARRAY_INSERT|ARRAY_INTERSECTION|ARRAY_SIZE|ARRAY_SLICE|ARRAY_SORT|ARRAY_TO_STRING|FLATTEN|GET|GET_PATH|LATERAL|SYSTEM\\\\$TYPEOF)\\\\b(?=\\\\s*\\\\()\",\n      \"name\": \"support.function.conversion.sql\"\n    },\n    \"sql-constant\": {\n      \"match\": \"(?i)\\\\b(TRUE|FALSE|NULL|CURRENT_USER|CURRENT_ROLE|CURRENT_ACCOUNT|CURRENT_REGION|CURRENT_SESSION|CURRENT_SCHEMA|CURRENT_DATABASE|CURRENT_WAREHOUSE)\\\\b\",\n      \"name\": \"constant.language.sql\"\n    },\n    \"sql-operator\": {\n      \"match\": \"\\\\+|-|\\\\*|/|%|=|!=|<>|<=?|>=?|\\\\|\\\\||::\",\n      \"name\": \"keyword.operator.sql\"\n    },\n    \"sql-identifier\": {\n      \"match\": \"\\\\b[a-zA-Z_][a-zA-Z0-9_]*\\\\b\",\n      \"name\": \"variable.other.sql\"\n    }\n  }\n}\n"
  },
  {
    "path": "syntaxes/jinja-yaml.tmLanguage.json",
    "content": "{\n  \"$schema\": \"https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json\",\n  \"name\": \"Jinja YAML Injection\",\n  \"scopeName\": \"source.yaml.jinja\",\n  \"injectionSelector\": \"L:source.yaml\",\n  \"patterns\": [\n    { \"include\": \"#jinja-comment\" },\n    { \"include\": \"#jinja-statement\" },\n    { \"include\": \"#jinja-expression\" }\n  ],\n  \"repository\": {\n    \"jinja-comment\": {\n      \"name\": \"comment.block.jinja\",\n      \"begin\": \"\\\\{#\",\n      \"end\": \"#\\\\}\",\n      \"beginCaptures\": { \"0\": { \"name\": \"punctuation.definition.comment.begin.jinja\" } },\n      \"endCaptures\": { \"0\": { \"name\": \"punctuation.definition.comment.end.jinja\" } }\n    },\n    \"jinja-statement\": {\n      \"name\": \"meta.statement.jinja\",\n      \"begin\": \"\\\\{%-?\",\n      \"end\": \"-?%\\\\}\",\n      \"beginCaptures\": { \"0\": { \"name\": \"punctuation.definition.tag.begin.jinja\" } },\n      \"endCaptures\": { \"0\": { \"name\": \"punctuation.definition.tag.end.jinja\" } },\n      \"patterns\": [\n        { \"include\": \"#jinja-keyword\" },\n        { \"include\": \"#jinja-dbt-function\" },\n        { \"include\": \"#jinja-filter\" },\n        { \"include\": \"#jinja-operator\" },\n        { \"include\": \"#jinja-string-single\" },\n        { \"include\": \"#jinja-string-double\" },\n        { \"include\": \"#jinja-number\" },\n        { \"include\": \"#jinja-boolean\" },\n        { \"include\": \"#jinja-variable\" }\n      ]\n    },\n    \"jinja-expression\": {\n      \"name\": \"meta.expression.jinja\",\n      \"begin\": \"\\\\{\\\\{-?\",\n      \"end\": \"-?\\\\}\\\\}\",\n      \"beginCaptures\": { \"0\": { \"name\": \"punctuation.definition.expression.begin.jinja\" } },\n      \"endCaptures\": { \"0\": { \"name\": \"punctuation.definition.expression.end.jinja\" } },\n      \"patterns\": [\n        { \"include\": \"#jinja-dbt-function\" },\n        { \"include\": \"#jinja-filter\" },\n        { \"include\": \"#jinja-operator\" },\n        { \"include\": \"#jinja-string-single\" },\n        { \"include\": \"#jinja-string-double\" },\n        { \"include\": \"#jinja-number\" },\n        { \"include\": \"#jinja-boolean\" },\n        { \"include\": \"#jinja-variable\" }\n      ]\n    },\n    \"jinja-keyword\": {\n      \"match\": \"(?i)\\\\b(for|endfor|if|elif|else|endif|set|macro|endmacro|call|endcall|block|endblock|filter|endfilter|raw|endraw|extends|include|import|from|do|with|endwith)\\\\b\",\n      \"name\": \"keyword.control.jinja\"\n    },\n    \"jinja-dbt-function\": {\n      \"match\": \"\\\\b(ref|source|config|var|env_var|adapter|return|log|run_query|execute|this|graph|flags|target|project_name|schema|database|model|modules|exceptions|is_incremental|builtins)\\\\b(?=\\\\s*\\\\(|\\\\s*\\\\.)\",\n      \"name\": \"support.function.dbt.jinja\"\n    },\n    \"jinja-filter\": {\n      \"match\": \"(?<=\\\\|\\\\s{0,4})\\\\b(trim|lower|upper|title|capitalize|default|d|int|float|string|list|join|replace|regex_replace|length|count|sort|reverse|unique|first|last|map|select|reject|selectattr|rejectattr|groupby|as_bool|as_number|as_text|as_native|log|set|tojson|fromjson|fromyaml|toyaml)\\\\b\",\n      \"name\": \"support.function.filter.jinja\"\n    },\n    \"jinja-operator\": {\n      \"match\": \"\\\\b(and|or|not|in|is)\\\\b|~|\\\\|(?!\\\\})\",\n      \"name\": \"keyword.operator.jinja\"\n    },\n    \"jinja-string-single\": {\n      \"name\": \"string.quoted.single.jinja\",\n      \"begin\": \"'\",\n      \"end\": \"'\",\n      \"patterns\": [\n        { \"match\": \"\\\\\\\\.\", \"name\": \"constant.character.escape.jinja\" }\n      ]\n    },\n    \"jinja-string-double\": {\n      \"name\": \"string.quoted.double.jinja\",\n      \"begin\": \"\\\"\",\n      \"end\": \"\\\"\",\n      \"patterns\": [\n        { \"match\": \"\\\\\\\\.\", \"name\": \"constant.character.escape.jinja\" }\n      ]\n    },\n    \"jinja-number\": {\n      \"match\": \"\\\\b\\\\d+(\\\\.\\\\d+)?\\\\b\",\n      \"name\": \"constant.numeric.jinja\"\n    },\n    \"jinja-boolean\": {\n      \"match\": \"\\\\b(true|false|True|False|none|None)\\\\b\",\n      \"name\": \"constant.language.jinja\"\n    },\n    \"jinja-variable\": {\n      \"match\": \"\\\\b[a-zA-Z_][a-zA-Z0-9_]*\\\\b\",\n      \"name\": \"variable.other.jinja\"\n    }\n  }\n}\n"
  },
  {
    "path": "test-fixtures/.gitignore",
    "content": "# dbt artifacts\ntarget/\ndbt_packages/\ndbt_modules/\nlogs/\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/.coveragerc",
    "content": "[run]\nrelative_files = True\nsource = shared_utils\n\n[report]\nomit =\n    */__init__.py\n    tests/*\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/.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://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file\n\nversion: 2\nupdates:\n  - package-ecosystem: \"\" # See documentation for possible values\n    directory: \"/\" # Location of package manifests\n    schedule:\n      interval: \"weekly\"\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/.github/workflows/gosales_ci_pylint.yml",
    "content": "# -------------------------------------------------------------------------------\n# Program:        gosales_ci\n# Project:        dbt-core-sample-duckdb\n# Description:    CI workflow for Flake8 and Pylint linting of Python code\n# Author:         Manzar Ahmed\n# First Created:  Jun 2025\n# -------------------------------------------------------------------------------\n# Program history:\n# -------------------------------------------------------------------------------\n# Date        Programmer             Description\n# ----------  ---------------------  --------------------------------------------\n# 2025-06-25  Manzar Ahmed           v0.01/Initial version for Flake8 & Pylint CI\n# -------------------------------------------------------------------------------\n\nname: GOSALES CI - Flake8 & Pylint\n\non: [push]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        python-version: [\"3.10\"]\n\n    steps:\n    - name: Checkout repository\n      uses: actions/checkout@v4\n\n    - name: Set up Python ${{ matrix.python-version }}\n      uses: actions/setup-python@v3\n      with:\n        python-version: ${{ matrix.python-version }}\n\n    - name: Install dependencies\n      run: |\n        python -m pip install --upgrade pip\n        pip install pylint\n        pip install pytest pytest-cov\n        python -m pip install flake8 pytest\n        pip install pandas\n        pip install mysql-connector-python\n        \n    - name: Set PYTHONPATH\n      run: echo \"PYTHONPATH=${{ github.workspace }}\" >> $GITHUB_ENV\n      \n    - name: Run pylint\n      run: |\n        pylint $(git ls-files '*.py')\n\n    - name: Run unit tests and generate coverage\n      run: |\n        pytest --cov=shared_utils --cov-report=xml\n\n    - name: flake8\n      run: |\n        # stop the build if there are Python syntax errors or undefined names\n        flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics\n        # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide\n        flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/.github/workflows/gosales_ci_sonarcloud.yml",
    "content": "name: GOSALES CI - SonarCloud\n\non:\n  push:\n    branches:\n      - dbt-core-sample-duckdb\n  pull_request:\n    branches:\n      - dbt-core-sample-duckdb\n\njobs:\n  sonarcloud:\n    name: SonarCloud Analysis\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v4\n\n    - name: Set up Python\n      uses: actions/setup-python@v4\n      with:\n        python-version: '3.10'\n\n    - name: Install dependencies\n      run: |\n        pip install -r requirements.txt\n        pip install pytest pytest-cov\n\n    - name: Set PYTHONPATH\n      run: echo \"PYTHONPATH=${{ github.workspace }}\" >> $GITHUB_ENV\n\n    - name: Create .coveragerc\n      run: |\n        echo \"[run]\" > .coveragerc\n        echo \"relative_files = True\" >> .coveragerc\n        echo \"source = shared_utils\" >> .coveragerc\n        echo \"[report]\" >> .coveragerc\n        echo \"omit =\" >> .coveragerc\n        echo \"    */__init__.py\" >> .coveragerc\n        echo \"    tests/*\" >> .coveragerc\n\n    - name: Run tests with coverage\n      run: |\n        pytest shared_utils tests \\\n          --cov=shared_utils \\\n          --cov-report=xml:coverage.xml \\\n          --cov-config=.coveragerc\n\n    - name: SonarCloud Scan\n      uses: SonarSource/sonarcloud-github-action@v2\n      with:\n        args: >\n          -Dsonar.projectKey=manz01_dbt-core-sample-duckdb\n          -Dsonar.organization=manz01\n          -Dsonar.python.coverage.reportPaths=coverage.xml\n          -Dsonar.sources=shared_utils\n          -Dsonar.tests=tests\n          -Dsonar.sourceEncoding=UTF-8\n      env:\n        SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/.github/workflows/gosales_ci_sqlfluff.yml",
    "content": "# -------------------------------------------------------------------------------\n# Program:        gosales_ci\n# Project:        dbt-core-sample-duckdb\n# Description:    CI workflow for SQLFluff linting of dbt models\n# Author:         Manzar Ahmed\n# First Created:  Jun 2025\n# -------------------------------------------------------------------------------\n# Program history:\n# -------------------------------------------------------------------------------\n# Date        Programmer             Description\n# ----------  ---------------------  ---------------------------------------------\n# 2025-06-25  Manzar Ahmed           v0.01/Initial version\n# -------------------------------------------------------------------------------\n\nname: GOSALES CI - SQLFluff\n\non:\n  push:\n    branches:\n      - '**'        # run on main and all feature branches\n  pull_request:\n    branches:\n      - main        # block PRs merging into main if lint fails\n\npermissions:\n  checks: write\n  contents: read\n\njobs:\n  sqlfluff-lint:\n    name: SQLFluff Lint\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v4\n\n      - name: Set up Python\n        uses: actions/setup-python@v5\n        with:\n          python-version: \"3.10\"\n\n      - name: Install SQLFluff and dbt (DuckDB)\n        run: |\n          python -m pip install --upgrade pip\n          pip install -r requirements.txt\n\n      - name: Create minimal dbt profile (DuckDB in-memory)\n        run: |\n          mkdir -p ~/.dbt\n          cat > ~/.dbt/profiles.yml <<'YAML'\n          dbt_core_sample_duckdb:\n            target: ci\n            outputs:\n              ci:\n                type: duckdb\n                path: \":memory:\"\n                threads: 4\n          YAML\n\n      - name: Install dbt packages (if packages.yml present)\n        run: dbt deps || true\n\n      # 1) Lint → capture exit code (don't fail this step)\n      - name: SQLFluff lint (capture exit code + write annotations)\n        id: lint\n        env:\n          DBT_PROFILES_DIR: ~/.dbt\n        run: |\n          set -o pipefail\n          set +e\n          \n          sqlfluff lint models/ \\\n            --templater dbt \\\n            --dialect duckdb \\\n            --format github-annotation \\\n            --annotation-level failure \\\n            --write-output annotations.json \\\n            | tee sqlfluff_machine.log\n          rc=$?\n          set -e\n          echo \"exit_code=$rc\" >> \"$GITHUB_OUTPUT\"\n\n      # 2) Human-readable table in the job log (always prints)\n      - name: SQLFluff human summary (for logs)\n        env:\n          DBT_PROFILES_DIR: ~/.dbt\n        run: |\n          set +e\n          sqlfluff lint --dialect duckdb models/\n            --format human --nocolor --verbose 2 \n            \n          set -e\n\n      # (nice to have) Add a short markdown summary to the run\n      # - name: Publish step summary\n      #   run: |\n      #     echo \"## SQLFluff Summary\" >> \"$GITHUB_STEP_SUMMARY\"\n      #     echo \"\" >> \"$GITHUB_STEP_SUMMARY\"\n      #     echo \"\\`\\`\\`\" >> \"$GITHUB_STEP_SUMMARY\"\n      #     sed -n '1,200p' sqlfluff_human.log >> \"$GITHUB_STEP_SUMMARY\"\n      #     echo \"\\`\\`\\`\" >> \"$GITHUB_STEP_SUMMARY\"\n\n      # 3) Post PR annotations even if lint failed\n      - name: Annotate PR with SQLFluff output\n        if: always()\n        uses: yuzutech/annotations-action@v0.4.0\n        with:\n          repo-token: \"${{ secrets.GITHUB_TOKEN }}\"\n          title: \"SQLFluff Lint\"\n          input: \"./annotations.json\"\n          ignore-missing-file: false\n\n      # 4) Fail the job (block PR) if there were violations\n      - name: Fail if lint failed\n        if: steps.lint.outputs.exit_code != '0'\n        run: |\n          echo \"SQLFluff reported violations. See the human summary above and PR annotations.\"\n          exit 1\n\n      # 5) Keep artifacts for debugging (optional)\n      - name: Upload lint logs\n        if: always()\n        uses: actions/upload-artifact@v4\n        with:\n          name: sqlfluff-logs\n          path: |\n            annotations.json\n            sqlfluff_machine.log\n            sqlfluff_human.log\n\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/.github/workflows/static.yml",
    "content": "# Simple workflow for deploying static content to GitHub Pages\nname: Deploy static content to Pages\n\non:\n  # Runs on pushes targeting the default branch\n  push:\n    branches: [\"dbt-core-sample-duckdb\"]\n\n  # Allows you to run this workflow manually from the Actions tab\n  workflow_dispatch:\n\n# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages\npermissions:\n  contents: read\n  pages: write\n  id-token: write\n\n# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.\n# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.\nconcurrency:\n  group: \"pages\"\n  cancel-in-progress: false\n\njobs:\n  # Single deploy job since we're just deploying\n  deploy:\n    environment:\n      name: github-pages\n      url: ${{ steps.deployment.outputs.page_url }}\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n      - name: Setup Pages\n        uses: actions/configure-pages@v5\n      - name: Upload artifact\n        uses: actions/upload-pages-artifact@v3\n        with:\n          # Upload entire repository\n          path: '.'\n      - name: Deploy to GitHub Pages\n        id: deployment\n        uses: actions/deploy-pages@v4\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/.sqlfluff",
    "content": "#-------------------------------------------------------------------------------\n#  Prerequisites:\n#-------------------------------------------------------------------------------\n#  1. Install SQLFluff support:\n#     pip install sqlfluff\n#\n#  2. Verify installation:\n#     sqlfluff --version\n#\n#  3. (Optional) Install pre-commit for local checks:\n#     pip install pre-commit\n#-------------------------------------------------------------------------------\n#  Example usage:  \n#\n#  1. All files in models/ directory:\n#  sqlfluff lint --dialect duckdb models/\n#\n#  sqlfluff fix --dialect duckdb models/\n#-------------------------------------------------------------------------------\n\n[sqlfluff]\ndialect = duckdb\ntemplater = dbt\nrunaway_limit = 10\nmax_line_length = 80\nindent_unit = space\n\n[sqlfluff:indentation]\ntab_space_size = 4\n\n[sqlfluff:layout:type:comma]\nspacing_before = touch\nline_position = trailing\n\n[sqlfluff:rules:capitalisation.keywords] \ncapitalisation_policy = lower\n\n[sqlfluff:rules:aliasing.table]\naliasing = explicit\n\n[sqlfluff:rules:aliasing.column]\naliasing = explicit\n\n[sqlfluff:rules:aliasing.expression]\nallow_scalar = False\n\n[sqlfluff:rules:capitalisation.identifiers]\nextended_capitalisation_policy = lower\n\n[sqlfluff:rules:capitalisation.functions]\ncapitalisation_policy = lower\n\n[sqlfluff:rules:capitalisation.literals]\ncapitalisation_policy = lower\n\n[sqlfluff:rules:ambiguous.column_references]  # Number in group by\ngroup_by_and_order_by_style = implicit"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/.user.yml",
    "content": "id: 28418d79-2960-4e89-9f76-a47c848b037c\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/README.md",
    "content": "[![GOSALES CI - Flake8 & Pylint](https://github.com/manz01/dbt-core-sample-duckdb/actions/workflows/gosales_ci_pylint.yml/badge.svg)](https://github.com/manz01/dbt-core-sample-duckdb/actions/workflows/gosales_ci_pylint.yml)\n[![GOSALES CI - SonarCloud](https://github.com/manz01/dbt-core-sample-duckdb/actions/workflows/gosales_ci_sonarcloud.yml/badge.svg)](https://github.com/manz01/dbt-core-sample-duckdb/actions/workflows/gosales_ci_sonarcloud.yml)\n<br>\n<img alt=\"SQL\" src=\"https://img.shields.io/badge/SQL-4479A1?style=for-the-badge&logo=sqlite&logoColor=white\" height=\"25px\"/>\n<img alt=\"dbt\" src=\"https://img.shields.io/badge/dbt-FD6D6D?style=for-the-badge&logo=dbt&logoColor=white\" height=\"25px\"/>\n<img alt=\"DuckDB\" src=\"https://img.shields.io/badge/DuckDB-FFF500?style=for-the-badge&logo=duckduckgo&logoColor=black\" height=\"25px\"/>\n<img alt=\"Python\" src=\"https://img.shields.io/badge/Python-14354C?style=for-the-badge&logo=python&logoColor=white\" height=\"25px\"/>\n\n> **_NOTE:_** ✅ **CI/CD Integration**: This repository now includes static code analysis via [Pylint](https://pylint.pycqa.org/) and quality gate validation via [SonarCloud](https://sonarcloud.io/summary/new_code?id=manz01_dbt-core-sample-duckdb)..\n\n<img src=\"assets/GO_SALES_LOGO.png\" alt=\"GO Sales Logo\" width=\"500px\" />\n\n# Go Sales 🦆 DuckDB dbt Sample Project\n\nThis repository contains a sample dbt project that demonstrates how to model and transform the GO Sales IBM sample data using dbt (data build tool) with DuckDB as the database engine.\n\n### Document Control\n\n| Version | Date       | Author       | Description of Change            |\n| ------- | ---------- | ------------ | -------------------------------- |\n| 1.0     | 2025-05-18 | Manzar Ahmed | Initial Version                  |\n| 1.1     | 2025-06-12 | Manzar Ahmed | Added DET and MRT model sections |\n| 1.2     | 2025-06-22 | Manzar Ahmed | Added section with dbt docs      |\n| 1.3     | 2025-06-23 | Manzar Ahmed | Added section High level design  |\n| 1.4     | 2025-07-23 | Manzar Ahmed | Added section Low level design   |\n\n## Table of Content\n\n<div class=\"alert alert-block alert-info\" style=\"margin-top: 20px\">\n\n1. [Background](#1)<br>\n2. [High Level Design](#2)<br>\n3. [Run dbt Models](#3)<br>\n   3.1. [Raw Models](#31)<br>\n   3.2. [Staging Models](#32)<br>\n   3.3. [Detailed Models (DET)](#33)<br>\n   3.4. [Mart Models (MRT)](#34)<br>\n4. [Visualise Lineage with dbt Docs](#4)<br>\n5. [Low-Level Design (LLD)](#5)<br>\n5.1.1. [Models - raw layer](#511)<br>\n5.1.2. [Models - stg layer](#512)<br>\n5.1.3. [Models - det layer](#513)<br>\n5.1.4. [Models - mrt layer](#514)<br>\n5.1.5. [Macros](#515)<br>\n5.1.6. [Python Utils](#516)<br>\n</div>\n<hr>\n\n> NOTE: This sample project utlizes the [GO Sales IBM sample data](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/dcf7b09bd340e6ff9a2d1869631f3753) to demonstrate dbt modeling techniques. It is designed to be run with DuckDB as the database engine, but can be adapted for other engines like Snowflake, BigQuery, or Redshift with minor modifications to the dbt profiles and SQL syntax. The GO Sales dataset is a fictional retail dataset that simulates sales operations for a global retailer, and available under the MIT License.\n\n## 1. Background <a id=\"1\"></a>\n\nThe GO Sales IBM sample data is a fictional retail dataset designed to demonstrate business analytics, reporting, and data warehousing techniques. It simulates sales operations for a global retailer and contains various interconnected tables that model business domains. A copy of the entity relationship diagram is provided below for reference.\n\n<img src=\"assets/go-sales-erd.png\" alt=\"GO Sales Entity Relationship Diagram\" width=\"1000px\" />\n\n## 2. High Level Design <a id=\"2\"></a>\n\nThe dbt-core project follows a **layered design architecture** that systematically structures data transformations through a series of increasingly refined stages. This layered approach promotes modularity, reusability, and transparency in the data pipeline.\n\n<img src=\"assets/hld-duckdb-dbt-sample.png\" alt=\"High Level Design\" width=\"1000px\">\n\n### Layer Breakdown:\n\n1. **Raw Layer (`raw`)**\n\n   - This layer ingests raw data directly from the **MySQL DB instance**.\n   - It performs minimal transformation (if any), mainly focused on standardizing data types and storing source extracts as-is.\n\n2. **Staging Layer (`stg`)**\n\n   - This layer acts as a clean-up zone where raw data is normalized, renamed, and prepared for further transformation.\n   - Typical operations include renaming columns to snake_case, handling nulls, and deduplicating rows.\n\n3. **Detailed Layer (`det`)**\n   - This is the business logic layer, where transformations are applied to derive meaningful metrics and dimensions.\n   - It includes joins, surrogate key generation, Slowly Changing Dimensions (SCD), and other enrichment logic.\n   - The detailed layer will build a star schema for the go sales data\n\n```text\n +------------------+  +--------------+\n |t_dim_order_method|  |t_dim_products|\n +------------------+  +--------------+\n         \\              /\n          \\            /\n           +-----------+\n           |t_fct_sales|\n           +-----------+\n           /          \\\n          /            \\\n   +-----------+    +---------------+\n   |t_dim_dates|    |t_dim_retailers|\n   +-----------+    +---------------+\n```\n\n4. **Mart Layer (`mrt`)**\n   - This final layer presents the data in a business-consumable format.\n   - It aggregates and filters data for reporting, dashboards, and analytics use cases.\n\nEach layer feeds into the next, ensuring that transformations are traceable and logically separated.\n\n## 3. Run dbt Models <a id=\"3\"></a>\n\nThis section outlines how to set up your environment and run different layers of the GO Sales dbt models using convenient shell commands.\n\n**Create Aliases & Global Vars**\n\nFirst, set the required environment variables to specify the paths for the dbt project and profile directory. Also, set the `PYTHONPATH` so that any custom Python modules within your project can be properly resolved.\n\n```sh\nexport DBT_PROJ_DIR='/home/u0001/dbt-core-sample-duckdb'\nexport DBT_PROFILE_DIR='/home/u0001/dbt-core-sample-duckdb'\nexport PYTHONPATH=$DBT_PROJ_DIR\n```\n\n**Create dbt run go sales alias shorthand**\n\nDefine a shell alias to simplify running the dbt project with the correct profile and target. This avoids repeating long command strings every time you want to run a model.\n\n```sh\nalias dbt_run_go_sales='dbt run --project-dir $DBT_PROJ_DIR --profiles-dir $DBT_PROFILE_DIR --target go_sales'\n```\n\n### 3.1. Raw Models <a id=\"31\"></a>\n\nRun all models tagged with `GO_SALES_RAW`. These models typically ingest and prepare raw data, often performing minimal transformations.\n\n```sh\ndbt_run_go_sales --select tag:GO_SALES_RAW\n```\n\n### 3.2. Staging Models <a id=\"32\"></a>\n\nRun staging layer models tagged with `GO_SALES_STG`. These models clean and standardize raw data into a more analysis-ready format.\n\n```sh\ndbt_run_go_sales --select tag:GO_SALES_STG\n```\n\n### 3.3. Detailed Models (DET) <a id=\"33\"></a>\n\nRun detailed transformation models tagged with `GO_SALES_DET`. These models perform more complex business logic and enrichment tasks.\n\n```sh\ndbt_run_go_sales --select tag:GO_SALES_DET\n```\n\n### 3.4. Mart Models (MRT) <a id=\"34\"></a>\n\nRun mart layer models tagged with `GO_SALES_MRT`. These are the final outputs optimized for reporting and analytics.\n\n```sh\ndbt_run_go_sales --select tag:GO_SALES_MRT\n```\n\n## 4. Visualise Lineage with dbt Docs <a id=\"4\"></a>\n\ndbt provides an interactive lineage graph that visually represents how models are built from raw data through staging, transformation, and into marts. This helps developers, analysts, and stakeholders understand data dependencies and relationships.\n\nTo generate and view the lineage diagram:\n\n**Step 1: Generate dbt docs**\n\n```sh\ndbt docs generate --project-dir $DBT_PROJ_DIR --profiles-dir $DBT_PROFILE_DIR --target go_sales\n```\n\n**Step 2: Serve dbt docs**\n\n```sh\ndbt docs serve --project-dir $DBT_PROJ_DIR --profiles-dir $DBT_PROFILE_DIR --target go_sales\n```\n\nThis will start a local web server and open a browser where you can explore:\n\n- Model-level documentation\n- Column-level metadata\n- Tags and descriptions\n- The DAG (Directed Acyclic Graph) lineage diagram\n\nThe diagram includes paths from:\n\n- Raw sources (e.g., t_raw_go_daily_sales)\n- Through staging models (e.g., t_stg_go_daily_sales)\n- Into dimensional tables (e.g., t_dim_products)\n- Finally into fact and mart tables (e.g., t_fct_sales → t_mrt_sales)\n\nThe following diagram provides a visual representation of the dbt model lineage for the GO Sales project, illustrating how raw data flows through staging, dimension, fact, and mart layers:\n\n![](assets/gosales-dbt-dag.png)\n\n# 5. Low-Level Design (LLD) <a id=\"5\"></a>\n\n## 5.1.1. Models - raw layer <a id=\"511\"></a>\n\n| #   | Object Name                                                                                                                                     | Object Type | Description                        |\n| --- | ----------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | ---------------------------------- |\n| 1   | [t_raw_go_1k.py](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/01-raw/t_raw_go_1k.py)                     | Python File | Python script for GO 1k data       |\n| 2   | [t_raw_go_1k.yml](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/01-raw/t_raw_go_1k.yml)                   | YAML File   | Metadata/config for GO 1k          |\n| 3   | [t_raw_go_daily_sales.py](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/01-raw/t_raw_go_daily_sales.py)   | Python File | Python script for daily sales data |\n| 4   | [t_raw_go_daily_sales.yml](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/01-raw/t_raw_go_daily_sales.yml) | YAML File   | Metadata/config for daily sales    |\n| 5   | [t_raw_go_methods.py](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/01-raw/t_raw_go_methods.py)           | Python File | Python script for GO methods       |\n| 6   | [t_raw_go_methods.yml](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/01-raw/t_raw_go_methods.yml)         | YAML File   | Metadata/config for GO methods     |\n| 7   | [t_raw_go_products.py](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/01-raw/t_raw_go_products.py)         | Python File | Python script for GO products      |\n| 8   | [t_raw_go_products.yml](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/01-raw/t_raw_go_products.yml)       | YAML File   | Metadata/config for GO products    |\n| 9   | [t_raw_go_retailers.py](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/01-raw/t_raw_go_retailers.py)       | Python File | Python script for GO retailers     |\n| 10  | [t_raw_go_retailers.yml](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/01-raw/t_raw_go_retailers.yml)     | YAML File   | Metadata/config for GO retailers   |\n\n## 5.1.2. Models - stg layer <a id=\"512\"></a>\n\n| #   | Object Name                                                                                                                                   | Object Type | Description                          |\n| --- | --------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | ------------------------------------ |\n| 1   | [t_dim_dates.sql](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/02-stg/t_dim_dates.sql)                 | SQL File    | Staging logic for date dimension     |\n| 2   | [t_dim_dates.yml](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/02-stg/t_dim_dates.yml)                 | YAML File   | Metadata/config for date dimension   |\n| 3   | [t_dim_order_methods.sql](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/02-stg/t_dim_order_methods.sql) | SQL File    | Staging logic for order methods      |\n| 4   | [t_dim_order_methods.yml](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/02-stg/t_dim_order_methods.yml) | YAML File   | Metadata/config for order methods    |\n| 5   | [t_dim_products.sql](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/02-stg/t_dim_products.sql)           | SQL File    | Staging logic for products           |\n| 6   | [t_dim_products.yml](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/02-stg/t_dim_products.yml)           | YAML File   | Metadata/config for products         |\n| 7   | [t_dim_retailers.sql](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/02-stg/t_dim_retailers.sql)         | SQL File    | Staging logic for retailers          |\n| 8   | [t_dim_retailers.yml](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/02-stg/t_dim_retailers.yml)         | YAML File   | Metadata/config for retailers        |\n| 9   | [t_fct_sales.sql](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/02-stg/t_fct_sales.sql)                 | SQL File    | Staging logic for sales fact table   |\n| 10  | [t_fct_sales.yml](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/02-stg/t_fct_sales.yml)                 | YAML File   | Metadata/config for sales fact table |\n\n---\n\n## 5.1.3. Models - det layer <a id=\"513\"></a>\n\n| #   | Object Name                                                                                                                                   | Object Type | Description                             |\n| --- | --------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | --------------------------------------- |\n| 1   | [t_dim_dates.sql](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/03-det/t_dim_dates.sql)                 | SQL File    | Detail-layer model for date dimension   |\n| 2   | [t_dim_dates.yml](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/03-det/t_dim_dates.yml)                 | YAML File   | Metadata/config for date dimension      |\n| 3   | [t_dim_order_methods.sql](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/03-det/t_dim_order_methods.sql) | SQL File    | Detail-layer model for order methods    |\n| 4   | [t_dim_order_methods.yml](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/03-det/t_dim_order_methods.yml) | YAML File   | Metadata/config for order methods       |\n| 5   | [t_dim_products.sql](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/03-det/t_dim_products.sql)           | SQL File    | Detail-layer model for products         |\n| 6   | [t_dim_products.yml](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/03-det/t_dim_products.yml)           | YAML File   | Metadata/config for products            |\n| 7   | [t_dim_retailers.sql](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/03-det/t_dim_retailers.sql)         | SQL File    | Detail-layer model for retailers        |\n| 8   | [t_dim_retailers.yml](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/03-det/t_dim_retailers.yml)         | YAML File   | Metadata/config for retailers           |\n| 9   | [t_fct_sales.sql](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/03-det/t_fct_sales.sql)                 | SQL File    | Detail-layer model for sales fact table |\n| 10  | [t_fct_sales.yml](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/03-det/t_fct_sales.yml)                 | YAML File   | Metadata/config for sales fact table    |\n\n---\n\n## 5.1.4. Models - mrt layer <a id=\"514\"></a>\n\n| #   | Object Name                                                                                                                   | Object Type | Description                    |\n| --- | ----------------------------------------------------------------------------------------------------------------------------- | ----------- | ------------------------------ |\n| 1   | [t_mrt_sales.sql](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/04-mrt/t_mrt_sales.sql) | SQL File    | Final mart model for sales     |\n| 2   | [t_mrt_sales.yml](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/models/04-mrt/t_mrt_sales.yml) | YAML File   | Metadata/config for mart sales |\n\n---\n\n## 5.1.5. Macros <a id=\"515\"></a>\n\n| #   | Object Name                                                                                                                | Object Type      | Description                                                               |\n| --- | -------------------------------------------------------------------------------------------------------------------------- | ---------------- | ------------------------------------------------------------------------- |\n| 1   | [custom_schema.sql](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/macros/custom_schema.sql) | SQL (Jinja) File | Macro to dynamically assign custom schemas based on environment or config |\n| 2   | [scd2_ts.sql](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/macros/scd2_ts.sql)             | SQL (Jinja) File | Macro to implement SCD Type 2 logic with timestamp-based tracking         |\n\n## 5.1.6. Python Utils <a id=\"516\"></a>\n\n| #   | Object Name                                                                                                            | Object Type | Description                                       |\n| --- | ---------------------------------------------------------------------------------------------------------------------- | ----------- | ------------------------------------------------- |\n| 1   | [`__init__.py`](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/shared_utils/__init__.py) | Python File | Marks the directory as a Python package           |\n| 2   | [`config.py`](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/shared_utils/config.py)     | Python File | Contains shared configuration values and helpers  |\n| 3   | [`db_utils.py`](https://github.com/manz01/dbt-core-sample-duckdb/blob/dbt-core-sample-duckdb/shared_utils/db_utils.py) | Python File | Utility functions for database access and queries |\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/SECURITY.md",
    "content": "# Security Policy\n\n## Supported Versions\n\nUse this section to tell people about which versions of your project are\ncurrently being supported with security updates.\n\n| Version | Supported          |\n| ------- | ------------------ |\n| 5.1.x   | :white_check_mark: |\n| 5.0.x   | :x:                |\n| 4.0.x   | :white_check_mark: |\n| < 4.0   | :x:                |\n\n## Reporting a Vulnerability\n\nUse this section to tell people how to report a vulnerability.\n\nTell them where to go, how often they can expect to get an update on a\nreported vulnerability, what to expect if the vulnerability is accepted or\ndeclined, etc.\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/assets/go-sales-erd.drawio",
    "content": "<mxfile host=\"app.diagrams.net\" agent=\"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0\" version=\"28.0.6\">\n  <diagram name=\"Page-1\" id=\"pstnZ0oE3ZVDdVmqrJVm\">\n    <mxGraphModel dx=\"777\" dy=\"1596\" grid=\"1\" gridSize=\"10\" guides=\"1\" tooltips=\"1\" connect=\"1\" arrows=\"1\" fold=\"1\" page=\"1\" pageScale=\"1\" pageWidth=\"827\" pageHeight=\"1169\" math=\"0\" shadow=\"0\">\n      <root>\n        <mxCell id=\"0\" />\n        <mxCell id=\"1\" parent=\"0\" />\n        <mxCell id=\"EJF4n1PkTf2hh2ZpsZZ7-1\" value=\"&lt;div&gt;Daily Sales&lt;/div&gt;\" style=\"swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;\" vertex=\"1\" parent=\"1\">\n          <mxGeometry x=\"290\" y=\"160\" width=\"140\" height=\"208\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"EJF4n1PkTf2hh2ZpsZZ7-2\" value=\"Retailer code\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"EJF4n1PkTf2hh2ZpsZZ7-1\">\n          <mxGeometry y=\"26\" width=\"140\" height=\"26\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"EJF4n1PkTf2hh2ZpsZZ7-3\" value=\"Product number\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"EJF4n1PkTf2hh2ZpsZZ7-1\">\n          <mxGeometry y=\"52\" width=\"140\" height=\"26\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"EJF4n1PkTf2hh2ZpsZZ7-4\" value=\"Order method code\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"EJF4n1PkTf2hh2ZpsZZ7-1\">\n          <mxGeometry y=\"78\" width=\"140\" height=\"26\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"EJF4n1PkTf2hh2ZpsZZ7-5\" value=\"Date\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"EJF4n1PkTf2hh2ZpsZZ7-1\">\n          <mxGeometry y=\"104\" width=\"140\" height=\"26\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"EJF4n1PkTf2hh2ZpsZZ7-6\" value=\"Quantity\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"EJF4n1PkTf2hh2ZpsZZ7-1\">\n          <mxGeometry y=\"130\" width=\"140\" height=\"26\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"EJF4n1PkTf2hh2ZpsZZ7-7\" value=\"Unit price\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"EJF4n1PkTf2hh2ZpsZZ7-1\">\n          <mxGeometry y=\"156\" width=\"140\" height=\"26\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"EJF4n1PkTf2hh2ZpsZZ7-8\" value=\"Unit sale price\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"EJF4n1PkTf2hh2ZpsZZ7-1\">\n          <mxGeometry y=\"182\" width=\"140\" height=\"26\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"EJF4n1PkTf2hh2ZpsZZ7-9\" value=\"Order Method\" style=\"swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;\" vertex=\"1\" parent=\"1\">\n          <mxGeometry x=\"500\" y=\"230\" width=\"140\" height=\"78\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"EJF4n1PkTf2hh2ZpsZZ7-10\" value=\"Order method code\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"EJF4n1PkTf2hh2ZpsZZ7-9\">\n          <mxGeometry y=\"26\" width=\"140\" height=\"26\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"EJF4n1PkTf2hh2ZpsZZ7-11\" value=\"Order method type\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"EJF4n1PkTf2hh2ZpsZZ7-9\">\n          <mxGeometry y=\"52\" width=\"140\" height=\"26\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"EJF4n1PkTf2hh2ZpsZZ7-46\" value=\"&lt;div&gt;Products&lt;/div&gt;\" style=\"swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;\" vertex=\"1\" parent=\"1\">\n          <mxGeometry x=\"70\" y=\"147\" width=\"140\" height=\"234\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"EJF4n1PkTf2hh2ZpsZZ7-47\" value=\"Product number\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"EJF4n1PkTf2hh2ZpsZZ7-46\">\n          <mxGeometry y=\"26\" width=\"140\" height=\"26\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"EJF4n1PkTf2hh2ZpsZZ7-48\" value=\"Product line\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"EJF4n1PkTf2hh2ZpsZZ7-46\">\n          <mxGeometry y=\"52\" width=\"140\" height=\"26\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"EJF4n1PkTf2hh2ZpsZZ7-49\" value=\"&lt;div&gt;Product type&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"EJF4n1PkTf2hh2ZpsZZ7-46\">\n          <mxGeometry y=\"78\" width=\"140\" height=\"26\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"EJF4n1PkTf2hh2ZpsZZ7-50\" value=\"&lt;div&gt;Product&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"EJF4n1PkTf2hh2ZpsZZ7-46\">\n          <mxGeometry y=\"104\" width=\"140\" height=\"26\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"EJF4n1PkTf2hh2ZpsZZ7-51\" value=\"&lt;div&gt;Product brand&lt;/div&gt;\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"EJF4n1PkTf2hh2ZpsZZ7-46\">\n          <mxGeometry y=\"130\" width=\"140\" height=\"26\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"EJF4n1PkTf2hh2ZpsZZ7-53\" value=\"Product color\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"EJF4n1PkTf2hh2ZpsZZ7-46\">\n          <mxGeometry y=\"156\" width=\"140\" height=\"26\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"EJF4n1PkTf2hh2ZpsZZ7-54\" value=\"Unit cost\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"EJF4n1PkTf2hh2ZpsZZ7-46\">\n          <mxGeometry y=\"182\" width=\"140\" height=\"26\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"EJF4n1PkTf2hh2ZpsZZ7-55\" value=\"&lt;div&gt;Unit price&lt;/div&gt;\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"EJF4n1PkTf2hh2ZpsZZ7-46\">\n          <mxGeometry y=\"208\" width=\"140\" height=\"26\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"EJF4n1PkTf2hh2ZpsZZ7-68\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=ERone;startFill=0;endArrow=ERmany;endFill=0;\" edge=\"1\" parent=\"1\" source=\"EJF4n1PkTf2hh2ZpsZZ7-56\" target=\"EJF4n1PkTf2hh2ZpsZZ7-1\">\n          <mxGeometry relative=\"1\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"EJF4n1PkTf2hh2ZpsZZ7-56\" value=\"Retailers\" style=\"swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;\" vertex=\"1\" parent=\"1\">\n          <mxGeometry x=\"290\" y=\"-30\" width=\"140\" height=\"130\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"EJF4n1PkTf2hh2ZpsZZ7-57\" value=\"Retailer code\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"EJF4n1PkTf2hh2ZpsZZ7-56\">\n          <mxGeometry y=\"26\" width=\"140\" height=\"26\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"EJF4n1PkTf2hh2ZpsZZ7-58\" value=\"Retailer name\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"EJF4n1PkTf2hh2ZpsZZ7-56\">\n          <mxGeometry y=\"52\" width=\"140\" height=\"26\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"EJF4n1PkTf2hh2ZpsZZ7-59\" value=\"Retailer type\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"EJF4n1PkTf2hh2ZpsZZ7-56\">\n          <mxGeometry y=\"78\" width=\"140\" height=\"26\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"EJF4n1PkTf2hh2ZpsZZ7-60\" value=\"Country\" style=\"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"EJF4n1PkTf2hh2ZpsZZ7-56\">\n          <mxGeometry y=\"104\" width=\"140\" height=\"26\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"EJF4n1PkTf2hh2ZpsZZ7-66\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=ERmany;endFill=0;startArrow=ERone;startFill=0;\" edge=\"1\" parent=\"1\" source=\"EJF4n1PkTf2hh2ZpsZZ7-47\" target=\"EJF4n1PkTf2hh2ZpsZZ7-3\">\n          <mxGeometry relative=\"1\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"EJF4n1PkTf2hh2ZpsZZ7-67\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=ERmany;startFill=0;endArrow=ERone;endFill=0;\" edge=\"1\" parent=\"1\" source=\"EJF4n1PkTf2hh2ZpsZZ7-4\" target=\"EJF4n1PkTf2hh2ZpsZZ7-10\">\n          <mxGeometry relative=\"1\" as=\"geometry\" />\n        </mxCell>\n      </root>\n    </mxGraphModel>\n  </diagram>\n</mxfile>\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/assets/hld-duckdb-dbt-sample.drawio",
    "content": "<mxfile host=\"app.diagrams.net\" agent=\"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:139.0) Gecko/20100101 Firefox/139.0\" version=\"27.1.6\">\n  <diagram name=\"Page-1\" id=\"t-7ryS07TdfXU4A_LWZS\">\n    <mxGraphModel dx=\"1426\" dy=\"709\" grid=\"1\" gridSize=\"10\" guides=\"1\" tooltips=\"1\" connect=\"1\" arrows=\"1\" fold=\"1\" page=\"1\" pageScale=\"1\" pageWidth=\"827\" pageHeight=\"1169\" math=\"0\" shadow=\"0\">\n      <root>\n        <mxCell id=\"0\" />\n        <mxCell id=\"1\" parent=\"0\" />\n        <mxCell id=\"_NgO_lHHNO2xxo2B9zYM-18\" value=\"dbt-core\" style=\"rounded=1;whiteSpace=wrap;html=1;imageVerticalAlign=top;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;dashed=1;\" vertex=\"1\" parent=\"1\">\n          <mxGeometry x=\"210\" y=\"280\" width=\"550\" height=\"150\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"_NgO_lHHNO2xxo2B9zYM-5\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;\" edge=\"1\" parent=\"1\" source=\"_NgO_lHHNO2xxo2B9zYM-3\" target=\"_NgO_lHHNO2xxo2B9zYM-10\">\n          <mxGeometry relative=\"1\" as=\"geometry\">\n            <mxPoint x=\"200\" y=\"350\" as=\"targetPoint\" />\n          </mxGeometry>\n        </mxCell>\n        <mxCell id=\"_NgO_lHHNO2xxo2B9zYM-3\" value=\"MySQL DB &#xa;instance\" style=\"sketch=0;outlineConnect=0;fontColor=#232F3E;gradientColor=none;strokeColor=#232F3E;fillColor=#ffffff;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.mysql_db_instance;\" vertex=\"1\" parent=\"1\">\n          <mxGeometry x=\"60\" y=\"320\" width=\"60\" height=\"60\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"_NgO_lHHNO2xxo2B9zYM-10\" value=\"1. raw\" style=\"shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;\" vertex=\"1\" parent=\"1\">\n          <mxGeometry x=\"260\" y=\"310\" width=\"60\" height=\"80\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"_NgO_lHHNO2xxo2B9zYM-15\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;\" edge=\"1\" parent=\"1\" source=\"_NgO_lHHNO2xxo2B9zYM-11\" target=\"_NgO_lHHNO2xxo2B9zYM-14\">\n          <mxGeometry relative=\"1\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"_NgO_lHHNO2xxo2B9zYM-11\" value=\"2. stg\" style=\"shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;\" vertex=\"1\" parent=\"1\">\n          <mxGeometry x=\"400\" y=\"310\" width=\"60\" height=\"80\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"_NgO_lHHNO2xxo2B9zYM-13\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;\" edge=\"1\" parent=\"1\" source=\"_NgO_lHHNO2xxo2B9zYM-10\" target=\"_NgO_lHHNO2xxo2B9zYM-11\">\n          <mxGeometry relative=\"1\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"_NgO_lHHNO2xxo2B9zYM-17\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;\" edge=\"1\" parent=\"1\" source=\"_NgO_lHHNO2xxo2B9zYM-14\" target=\"_NgO_lHHNO2xxo2B9zYM-16\">\n          <mxGeometry relative=\"1\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"_NgO_lHHNO2xxo2B9zYM-14\" value=\"3. det\" style=\"shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;\" vertex=\"1\" parent=\"1\">\n          <mxGeometry x=\"530\" y=\"310\" width=\"60\" height=\"80\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"_NgO_lHHNO2xxo2B9zYM-16\" value=\"4. mrt\" style=\"shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;\" vertex=\"1\" parent=\"1\">\n          <mxGeometry x=\"660\" y=\"310\" width=\"60\" height=\"80\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"_NgO_lHHNO2xxo2B9zYM-19\" value=\"tag:GO_SALES_RAW\" style=\"text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;\" vertex=\"1\" parent=\"1\">\n          <mxGeometry x=\"260\" y=\"390\" width=\"60\" height=\"30\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"_NgO_lHHNO2xxo2B9zYM-20\" value=\"tag:GO_SALES_STG\" style=\"text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;\" vertex=\"1\" parent=\"1\">\n          <mxGeometry x=\"400\" y=\"390\" width=\"60\" height=\"30\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"_NgO_lHHNO2xxo2B9zYM-21\" value=\"tag:GO_SALES_DET\" style=\"text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;\" vertex=\"1\" parent=\"1\">\n          <mxGeometry x=\"530\" y=\"390\" width=\"60\" height=\"30\" as=\"geometry\" />\n        </mxCell>\n        <mxCell id=\"_NgO_lHHNO2xxo2B9zYM-22\" value=\"tag:GO_SALES_MRT\" style=\"text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;\" vertex=\"1\" parent=\"1\">\n          <mxGeometry x=\"660\" y=\"390\" width=\"60\" height=\"30\" as=\"geometry\" />\n        </mxCell>\n      </root>\n    </mxGraphModel>\n  </diagram>\n</mxfile>\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/coverage.xml",
    "content": "<?xml version=\"1.0\" ?>\n<coverage version=\"7.9.1\" timestamp=\"1750707770959\" lines-valid=\"55\" lines-covered=\"55\" line-rate=\"1\" branches-covered=\"0\" branches-valid=\"0\" branch-rate=\"0\" complexity=\"0\">\n\t<!-- Generated by coverage.py: https://coverage.readthedocs.io/en/7.9.1 -->\n\t<!-- Based on https://raw.githubusercontent.com/cobertura/web/master/htdocs/xml/coverage-04.dtd -->\n\t<sources>\n\t\t<source>/home/u001/dbt-core-sample-duckdb/shared_utils</source>\n\t\t<source>/home/u001/dbt-core-sample-duckdb/tests</source>\n\t</sources>\n\t<packages>\n\t\t<package name=\".\" line-rate=\"1\" branch-rate=\"0\" complexity=\"0\">\n\t\t\t<classes>\n\t\t\t\t<class name=\"__init__.py\" filename=\"__init__.py\" complexity=\"0\" line-rate=\"1\" branch-rate=\"0\">\n\t\t\t\t\t<methods/>\n\t\t\t\t\t<lines/>\n\t\t\t\t</class>\n\t\t\t\t<class name=\"config.py\" filename=\"config.py\" complexity=\"0\" line-rate=\"1\" branch-rate=\"0\">\n\t\t\t\t\t<methods/>\n\t\t\t\t\t<lines>\n\t\t\t\t\t\t<line number=\"3\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"4\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"7\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"20\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"26\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"27\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"29\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"30\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"32\" hits=\"1\"/>\n\t\t\t\t\t</lines>\n\t\t\t\t</class>\n\t\t\t\t<class name=\"db_utils.py\" filename=\"db_utils.py\" complexity=\"0\" line-rate=\"1\" branch-rate=\"0\">\n\t\t\t\t\t<methods/>\n\t\t\t\t\t<lines>\n\t\t\t\t\t\t<line number=\"6\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"7\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"8\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"11\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"27\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"29\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"30\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"32\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"33\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"35\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"37\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"38\" hits=\"1\"/>\n\t\t\t\t\t</lines>\n\t\t\t\t</class>\n\t\t\t\t<class name=\"test_config.py\" filename=\"test_config.py\" complexity=\"0\" line-rate=\"1\" branch-rate=\"0\">\n\t\t\t\t\t<methods/>\n\t\t\t\t\t<lines>\n\t\t\t\t\t\t<line number=\"3\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"4\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"5\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"6\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"7\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"10\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"11\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"13\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"14\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"17\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"18\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"20\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"21\" hits=\"1\"/>\n\t\t\t\t\t</lines>\n\t\t\t\t</class>\n\t\t\t\t<class name=\"test_data.py\" filename=\"test_data.py\" complexity=\"0\" line-rate=\"1\" branch-rate=\"0\">\n\t\t\t\t\t<methods/>\n\t\t\t\t\t<lines>\n\t\t\t\t\t\t<line number=\"11\" hits=\"1\"/>\n\t\t\t\t\t</lines>\n\t\t\t\t</class>\n\t\t\t\t<class name=\"test_db_utils.py\" filename=\"test_db_utils.py\" complexity=\"0\" line-rate=\"1\" branch-rate=\"0\">\n\t\t\t\t\t<methods/>\n\t\t\t\t\t<lines>\n\t\t\t\t\t\t<line number=\"3\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"4\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"5\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"6\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"9\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"10\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"11\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"12\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"14\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"15\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"16\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"17\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"19\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"20\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"22\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"24\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"25\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"26\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"27\" hits=\"1\"/>\n\t\t\t\t\t\t<line number=\"28\" hits=\"1\"/>\n\t\t\t\t\t</lines>\n\t\t\t\t</class>\n\t\t\t</classes>\n\t\t</package>\n\t</packages>\n</coverage>\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/dbt_project.yml",
    "content": "# Name your project! Project names should contain only lowercase characters\n# and underscores. A good package name should reflect your organization's\n# name or the intended use of these models\nname: 'dbt_core_sample_duckdb'\nversion: '1.0.0'\n\n# This setting configures which \"profile\" dbt uses for this project.\nprofile: 'dbt_core_sample_duckdb'\n\n# These configurations specify where dbt should look for different types of files.\n# The `model-paths` config, for example, states that models in this project can be\n# found in the \"models/\" directory. You probably won't need to change these!\nmodel-paths: [\"models\"]\nanalysis-paths: [\"analyses\"]\ntest-paths: [\"tests\"]\nseed-paths: [\"seeds\"]\nmacro-paths: [\"macros\"]\ndocs-paths: [\"docs\"]      \nasset-paths: [\"assets\"]   \nclean-targets:         # directories to be removed by `dbt clean`\n  - \"target\"\n  - \"dbt_packages\"\n\n\n# Configuring models\n# Full documentation: https://docs.getdbt.com/docs/configuring-models\n\n# In this example config, we tell dbt to build all models in the example/\n# directory as views. These settings can be overridden in the individual model\n# files using the `{{ config(...) }}` macro.\nmodels:\n  dbt_core_sample_duckdb:\n    01-raw:\n      +schema: raw\n      +materialized: table\n    02-stg:\n      +schema: stg\n      +materialized: view\n    03-det:\n      +schema: det\n      +materialized: incremental\n      +incremental_strategy: merge\n    04-mrt:\n      +schema: mrt\n      +materialized: table\n\nseeds:\n  +schema: ref"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/macros/.gitkeep",
    "content": ""
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/macros/custom_schema.sql",
    "content": "{% macro generate_schema_name(custom_schema_name, node) -%}\n\n    {%- set default_schema = target.schema -%}\n    {%- if custom_schema_name is none or custom_schema_name == \"\" -%}\n        {{ default_schema }}\n    {%- else -%}\n        {{ custom_schema_name | trim }}\n    {%- endif -%}\n\n{%- endmacro %}\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/macros/scd2_hash.sql",
    "content": "{%- macro scd2_hash(field_list) -%}\n    {%- set default_null_value = '_null_' -%}\n\n    {%- set fields = [] -%}\n\n    {%- for field in field_list -%}\n        {%- do fields.append(\n            \"coalesce(cast(\" ~ field ~ \" as \" ~ dbt.type_string() ~ \"), '\" ~ default_null_value  ~\"')\"\n        ) -%}\n        {%- if not loop.last %}\n            {%- do fields.append(\"'|'\") -%}\n        {%- endif -%}\n    {%- endfor -%}\n\n    {{ dbt.hash(dbt.concat(fields)) }}\n{%- endmacro -%}\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/macros/scd2_ts.sql",
    "content": "{% macro get_scd2_vars(format='%Y-%m-%d %H:%M:%S') %}\n\n  {% set datetime = modules.datetime %}\n  {% set start_ts = datetime.datetime.now().replace(microsecond=0) %}\n  {% set end_ts = start_ts - datetime.timedelta(seconds=1) %}\n  {% set high_date = '9999-12-31 00:00:00' %}\n  {% set result = {\n      \"start_ts\": start_ts.strftime(format),\n      \"end_ts\": end_ts.strftime(format),\n      \"high_date\": high_date\n  } %}\n  {{ return(result) }}\n  \n{% endmacro %}"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/01-raw/t_raw_go_1k.py",
    "content": "\"\"\"   \n--------------------------------------------------------------------------------\nPath:           models/01-raw\nProgram:        t_raw_go_1k.py\nProject:        duckdb-core-sample-go-sales\nDescription:    Raw model for the GO Sales data go_daily_sales\nAuthor:         Manzar Ahmed\n--------------------------------------------------------------------------------\nProgram history:\n--------------------------------------------------------------------------------\nDate        Programmer             Description\n----------  ---------------------  ---------------------------------------------\n2025-06-11  Manzar Ahmed           v0.01/Initial version\n--------------------------------------------------------------------------------\n\"\"\"\n\nfrom shared_utils.db_utils import db_query\n\n\ndef model(dbt, session):  # pylint: disable=unused-argument # noqa: ARG001\n    \"\"\"\n    Executes a SQL query against the 'GOSales' database using the provided SQL\n    from dbt configuration, and returns the result as a DataFrame.\n    \"\"\"\n    sql = dbt.config.get('sql')\n    df = db_query(sql, 'GOSales')\n    return df\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/01-raw/t_raw_go_1k.yml",
    "content": "version: 2\nmodels:\n  - name: t_raw_go_1k\n    config:\n      materialized: table  \n      schema: raw     \n      tags:\n        - GO_SALES_RAW\n      sql: \"SELECT * FROM go_1k\"\n    columns:\n      - name: Retailer code\n      - name: Product number\n      - name: Date\n      - name: Quantity\n      "
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/01-raw/t_raw_go_daily_sales.py",
    "content": "\"\"\"              \n--------------------------------------------------------------------------------\nPath:           models/01-raw\nProgram:        t_raw_go_daily_sales.py\nProject:        duckdb-core-sample-go-sales\nDescription:    Raw model for the GO Sales data go_daily_sales\nInput(s):       msql go_sales.go_daily_sales\nOutput(s):      raw.t_raw_go_daily_sales\nAuthor:         Manzar Ahmed\n--------------------------------------------------------------------------------\nProgram history:\n--------------------------------------------------------------------------------\nDate        Programmer             Description\n----------  ---------------------  ---------------------------------------------\n2025-06-11  Manzar Ahmed           v0.01/Initial version\n--------------------------------------------------------------------------------\n\"\"\"\n\nfrom shared_utils.db_utils import db_query\n\n\ndef model(dbt, session):  # pylint: disable=unused-argument # noqa: ARG001\n    \"\"\"\n    Executes a SQL query against the 'GOSales' database using the provided SQL\n    from dbt configuration, and returns the result as a DataFrame.\n    \"\"\"\n    sql = dbt.config.get('sql')\n    df = db_query(sql, 'GOSales')\n    return df\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/01-raw/t_raw_go_daily_sales.yml",
    "content": "version: 2\nmodels:\n  - name: t_raw_go_daily_sales\n    config:\n      materialized: table  \n      schema: raw     \n      tags:\n        - GO_SALES_RAW\n      sql: \"SELECT * FROM go_daily_sales\"\n    columns:\n      - name: Retailer code\n      - name: Product number\n      - name: Order method code\n      - name: Date\n      - name: Quantity\n      - name: Unit price\n      - name: Unit sale price\n      "
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/01-raw/t_raw_go_products.py",
    "content": "\"\"\"       \n--------------------------------------------------------------------------------\nPath:           models/01-raw\nProgram:        t_raw_go_products.py\nProject:        duckdb-core-sample-go-sales\nDescription:    Raw model for the GO Sales data go_products\nAuthor:         Manzar Ahmed\nFirst Created:  Jun 2025\n--------------------------------------------------------------------------------\nProgram history:\n--------------------------------------------------------------------------------\nDate        Programmer             Description\n----------  ---------------------  ---------------------------------------------\n2025-06-11  Manzar Ahmed           v0.01/Initial version\n--------------------------------------------------------------------------------\n\"\"\"\n\nfrom shared_utils.db_utils import db_query\n\n\ndef model(dbt, session):  # pylint: disable=unused-argument # noqa: ARG001\n    \"\"\"\n    Executes a SQL query against the 'GOSales' database using the provided SQL\n    from dbt configuration, and returns the result as a DataFrame.\n    \"\"\"\n    sql = dbt.config.get('sql')\n    df = db_query(sql, 'GOSales')\n    return df\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/01-raw/t_raw_go_products.yml",
    "content": "#-----------------------------------------------------------------------------\n# Author:     Manzar Ahmed \n# Date:       2025-05-18\n#-----------------------------------------------------------------------------\n# Version Control\n#-----------------------------------------------------------------------------\n# Ver  Date      Name          Description     \n#-----------------------------------------------------------------------------\n# 1.0  20250518  Manzar Ahmed  Initial         \n#----------------------------------------------------------------------------\nversion: 2\nmodels:\n  - name: t_raw_go_products\n    config:\n      materialized: table  \n      schema: raw   \n      tags:\n        - GO_SALES_RAW\n      sql: \"SELECT * FROM go_products\"\n    # columns:\n    #   - name: Order method code\n    #   - name: Order method type\n      "
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/01-raw/t_raw_go_retailers.py",
    "content": "\"\"\"            \n--------------------------------------------------------------------------------\nPath:           models/01-raw\nProgram:        t_raw_go_retailers.py\nProject:        duckdb-core-sample-go-sales\nDescription:    Raw model for the GO Sales data go_retailers\nAuthor:         Manzar Ahmed\nFirst Created:  Jun 2025\n--------------------------------------------------------------------------------\nProgram history:\n--------------------------------------------------------------------------------\nDate        Programmer             Description\n----------  ---------------------  ---------------------------------------------\n2025-06-11  Manzar Ahmed           v0.01/Initial version\n--------------------------------------------------------------------------------\n\"\"\"\n\nfrom shared_utils.db_utils import db_query\n\n\ndef model(dbt, session):  # pylint: disable=unused-argument # noqa: ARG001\n    \"\"\"\n    Executes a SQL query against the 'GOSales' database using the provided SQL\n    from dbt configuration, and returns the result as a DataFrame.\n    \"\"\"\n    sql = dbt.config.get('sql')\n    df = db_query(sql, 'GOSales')\n    return df\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/01-raw/t_raw_go_retailers.yml",
    "content": "#-----------------------------------------------------------------------------\n# Author:     Manzar Ahmed \n# Date:       2025-05-18\n#-----------------------------------------------------------------------------\n# Version Control\n#-----------------------------------------------------------------------------\n# Ver  Date      Name          Description     \n#-----------------------------------------------------------------------------\n# 1.0  20250518  Manzar Ahmed  Initial         \n#----------------------------------------------------------------------------\nversion: 2\nmodels:\n  - name: t_raw_go_retailers\n    config:\n      materialized: table  \n      schema: raw  \n      tags:\n        - GO_SALES_RAW\n      sql: \"SELECT * FROM go_retailers\"\n    # columns:\n    #   - name: Order method code\n    #   - name: Order method type\n      "
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/02-stg/t_stg_go_1k.sql",
    "content": "/*\n  ******************************************************************************\n  *               _____          _____       _                                 *\n  *              / ____|        / ____|     | |                                *\n  *             | |  __  ___   | (___   __ _| | ___  ___                       *\n  *             | | |_ |/ _ \\   \\___ \\ / _` | |/ _ \\/ __|                      *\n  *             | |__| | (_) |  ____) | (_| | |  __/\\__ \\                      *\n  *              \\_____|\\___/  |_____/ \\__,_|_|\\___||___/                      *\n  *                                                                            *\n  ******************************************************************************\n  * Path:           models/02-stg\n  * Program:        t_stg_go_1k.sql\n  * Project:        dbt_core_sample_duckdb\n  * Description:    Staging model for GO Sales products transactions\n  * Author:         Manzar Ahmed\n  * First Created:  Jun 2025\n  ******************************************************************************\n  * Program history:\n  ******************************************************************************\n  * Date        Programmer             Description\n  * ----------  ---------------------- -----------------------------------------\n  * 2025-06-11  Manzar Ahmed           v0.01/Initial version\n  ******************************************************************************\n*/\n\nselect\n    \"Retailer code\" as retailer_code,\n    \"Product number\" as product_number,\n    date::date as transaction_date,\n    quantity\n\nfrom {{ ref('t_raw_go_1k') }}\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/02-stg/t_stg_go_1k.yml",
    "content": "version: 2\nmodels:\n  - name: t_stg_go_1k\n    config:\n      materialized: table  \n      schema: stg\n      tags: GO_SALES_STG\n    columns:\n      - name: retailer_code\n      - name: product_number\n      - name: transaction_date\n      - name: quantity\n      "
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/02-stg/t_stg_go_daily_sales.sql",
    "content": "/*\n  ******************************************************************************\n  *               _____          _____       _                                 *\n  *              / ____|        / ____|     | |                                *\n  *             | |  __  ___   | (___   __ _| | ___  ___                       *\n  *             | | |_ |/ _ \\   \\___ \\ / _` | |/ _ \\/ __|                      *\n  *             | |__| | (_) |  ____) | (_| | |  __/\\__ \\                      *\n  *              \\_____|\\___/  |_____/ \\__,_|_|\\___||___/                      *\n  *                                                                            *\n  ******************************************************************************\n  * Path:           models/02-stg\n  * Program:        t_stg_go_daily_sales.sql\n  * Project:        dbt_core_sample_duckdb\n  * Description:    Staging model for GO Sales products daily sales\n  * Author:         Manzar Ahmed\n  * First Created:  Jun 2025\n  ******************************************************************************\n  * Program history:\n  ******************************************************************************\n  * Date        Programmer             Description\n  * ----------  ---------------------- -----------------------------------------\n  * 2025-06-11  Manzar Ahmed           v0.01/Initial version\n  ******************************************************************************\n*/\n\nselect\n    \"Retailer code\" as retailer_code,\n    \"Product number\" as product_number,\n    \"Order method code\" as order_method_code,\n    date::date as transaction_date,\n    quantity,\n    \"Unit price\" as unit_price,\n    \"Unit sale price\" as unit_sale_price\n\nfrom {{ ref('t_raw_go_daily_sales') }}\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/02-stg/t_stg_go_daily_sales.yml",
    "content": "version: 2\nmodels:\n  - name: t_stg_go_daily_sales\n    config:\n      materialized: table  \n      schema: stg\n      tags: GO_SALES_STG\n    columns:\n      - name: retailer_code\n      - name: product_number\n      - name: order_method_code\n      - name: transaction_date\n      - name: quantity\n      - name: unit_price\n      - name: unit_sale_price\n      \n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/02-stg/t_stg_go_methods.sql",
    "content": "/*\n  ******************************************************************************\n  *               _____          _____       _                                 *\n  *              / ____|        / ____|     | |                                *\n  *             | |  __  ___   | (___   __ _| | ___  ___                       *\n  *             | | |_ |/ _ \\   \\___ \\ / _` | |/ _ \\/ __|                      *\n  *             | |__| | (_) |  ____) | (_| | |  __/\\__ \\                      *\n  *              \\_____|\\___/  |_____/ \\__,_|_|\\___||___/                      *\n  *                                                                            *\n  ******************************************************************************\n  * Path:           models/02-stg\n  * Program:        t_stg_go_methods.sql\n  * Project:        dbt_core_sample_duckdb\n  * Description:    Staging model for GO Sales order methods\n  * Author:         Manzar Ahmed\n  * First Created:  Jun 2025\n  ******************************************************************************\n  * Program history:\n  ******************************************************************************\n  * Date        Programmer             Description\n  * ----------  ---------------------- -----------------------------------------\n  * 2025-06-11  Manzar Ahmed           v0.01/Initial version\n  * 2025-06-12  Manzar Ahmed           v0.02/Run from seed instead of source\n  ******************************************************************************\n*/\n\nselect\n    \"Order method code\" as order_method_code,\n    \"Order method type\" as order_method_type\nfrom {{ ref('ref_go_methods') }}\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/02-stg/t_stg_go_methods.yml",
    "content": "#-----------------------------------------------------------------------------\n# Author:     Manzar Ahmed \n# Date:       2025-05-18\n#-----------------------------------------------------------------------------\n# Version Control\n#-----------------------------------------------------------------------------\n# Ver  Date      Name          Description     \n#-----------------------------------------------------------------------------\n# 1.0  20250518  Manzar Ahmed  Initial         \n#----------------------------------------------------------------------------\nversion: 2\nmodels:\n  - name: t_stg_go_methods\n    config:\n      materialized: table  \n      schema: stg\n      tags: \n        - GO_SALES_STG\n    columns:\n      - name: retailer_code\n        description: \"Unique identifier for the retailer\"\n      - name: product_number\n        description: \"Unique identifier for the product\"\n      - name: order_method_code\n        description: \"Code representing the order method used\"\n      - name: transaction_date\n        description: \"Date of the transaction\"\n      - name: quantity\n        description: \"Quantity of products sold in the transaction\"\n      - name: unit_price\n        description: \"Price per unit of the product at the time of sale\"\n      - name: unit_sale_price\n        description: \"Sale price per unit of the product at the time of sale\"\n\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/02-stg/t_stg_go_products.sql",
    "content": "/*\n  ******************************************************************************\n  *               _____          _____       _                                 *\n  *              / ____|        / ____|     | |                                *\n  *             | |  __  ___   | (___   __ _| | ___  ___                       *\n  *             | | |_ |/ _ \\   \\___ \\ / _` | |/ _ \\/ __|                      *\n  *             | |__| | (_) |  ____) | (_| | |  __/\\__ \\                      *\n  *              \\_____|\\___/  |_____/ \\__,_|_|\\___||___/                      *\n  *                                                                            *\n  ******************************************************************************\n  * Path:           models/02-stg\n  * Program:        t_stg_go_products.sql\n  * Project:        dbt_core_sample_duckdb\n  * Description:    Staging model for GO Sales products\n  * Author:         Manzar Ahmed\n  * First Created:  Jun 2025\n  ******************************************************************************\n  * Program history:\n  ******************************************************************************\n  * Date        Programmer             Description\n  * ----------  ---------------------- -----------------------------------------\n  * 2025-06-11  Manzar Ahmed           v0.01/Initial version\n  ******************************************************************************\n*/\n\nwith stg_products as (\n    select\n        \"Product number\" as product_number,\n        \"Product line\" as product_line,\n        \"Product type\" as product_type,\n        \"product\" as product,\n        \"Product brand\" as product_brand,\n        \"Product color\" as product_color,\n        \"Unit cost\" as unit_cost,\n        \"Unit price\" as unit_price\n    from {{ ref('t_raw_go_products') }}\n    qualify row_number() over (\n        partition by \n            product_number,\n            product_line,\n            product_type,\n            product,\n            product_brand,\n            product_color,\n        order by\n            product_number desc\n        ) = 1    \n)\nselect\n    product_number,\n    product_line,\n    product_type,\n    product,\n    product_brand,\n    product_color,\n    unit_cost,\n    unit_price\n\nfrom stg_products"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/02-stg/t_stg_go_products.yml",
    "content": "version: 2\nmodels:\n  - name: t_stg_go_products\n    config:\n      materialized: table  \n      schema: stg\n      tags: GO_SALES_STG\n    columns:\n      - name: product_number\n        description: \"Unique identifier for the product\"\n      - name: product_line\n        description: \"Line to which the product belongs\"\n      - name: product_type\n        description: \"Type of the product\"\n      - name: product\n        description: \"Name or description of the product\"\n      - name: product_brand\n        description: \"Brand of the product\"\n      - name: product_color\n        description: \"Color of the product\"\n      - name: unit_cost\n        description: \"Cost per unit of the product\"\n      - name: unit_price\n        description: \"Selling price per unit of the product\"\n      - name: unit_sale_price         \n        description: \"Sale price per unit of the product\"\n      - name: product_size\n        description: \"Size of the product\"\n      - name: product_weight                                                                                                            \n        "
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/02-stg/t_stg_go_retailers.sql",
    "content": "/*\n  ******************************************************************************\n  *               _____          _____       _                                 *\n  *              / ____|        / ____|     | |                                *\n  *             | |  __  ___   | (___   __ _| | ___  ___                       *\n  *             | | |_ |/ _ \\   \\___ \\ / _` | |/ _ \\/ __|                      *\n  *             | |__| | (_) |  ____) | (_| | |  __/\\__ \\                      *\n  *              \\_____|\\___/  |_____/ \\__,_|_|\\___||___/                      *\n  *                                                                            *\n  ******************************************************************************\n  * Path:           models/02-stg\n  * Program:        t_stg_go_retailers.sql\n  * Project:        dbt_core_sample_duckdb\n  * Description:    Staging model for GO Sales products\n  * Author:         Manzar Ahmed\n  * First Created:  Jun 2025\n  ******************************************************************************\n  * Program history:\n  ******************************************************************************\n  * Date        Programmer             Description\n  * ----------  ---------------------- -----------------------------------------\n  * 2025-06-11  Manzar Ahmed           v0.01/Initial version\n  ******************************************************************************\n*/\n\nselect\n    \"Retailer code\" as retailer_code,\n    \"Retailer name\" as retailer_name,\n    type,\n    country\nfrom {{ ref('t_raw_go_retailers') }}\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/02-stg/t_stg_go_retailers.yml",
    "content": "version: 2\nmodels:\n  - name: t_stg_go_retailers \n    description: \"This model contains the details of retailers including their unique codes and names.\" \n    config:\n      materialized: table  \n      schema: stg\n      tags: GO_SALES_STG\n    columns:  \n      - name: retailer_code\n        description: \"Unique identifier for the retailer\"\n      - name: retailer_name\n        description: \"Name of the retailer\"\n      - name: retailer_type\n        description: \"Type of the retailer (e.g., online, physical store)\"\n      - name: country\n        description: \"Country where the retailer is located\"\n      - name: state\n        description: \"State where the retailer is located\"\n      - name: city\n        description: \"City where the retailer is located\"\n      - name: postal_code\n        description: \"Postal code of the retailer's location\"\n      - name: address\n        description: \"Physical address of the retailer\"\n      - name: phone_number\n        description: \"Contact phone number of the retailer\"\n      - name: email \n        description: \"Contact email address of the retailer\"\n      - name: website\n        description: \"Website URL of the retailer\"\n      - name: created_at\n        description: \"Timestamp when the retailer record was created\"\n      - name: updated_at\n        description: \"Timestamp when the retailer record was last updated\"\n      - name: is_active\n        description: \"Indicates whether the retailer is currently active (1 for active, 0 for inactive)\"\n      - name: notes\n        description: \"Additional notes or comments about the retailer\"\n      - name: last_order_date\n        description: \"Date of the last order placed by the retailer\"\n      - name: total_orders  \n        description: \"Total number of orders placed by the retailer\"\n      - name: total_sales           \n\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/03-det/t_dim_dates.sql",
    "content": "/*\n  ******************************************************************************\n  *               _____          _____       _                                 *\n  *              / ____|        / ____|     | |                                *\n  *             | |  __  ___   | (___   __ _| | ___  ___                       *\n  *             | | |_ |/ _ \\   \\___ \\ / _` | |/ _ \\/ __|                      *\n  *             | |__| | (_) |  ____) | (_| | |  __/\\__ \\                      *\n  *              \\_____|\\___/  |_____/ \\__,_|_|\\___||___/                      *\n  *                                                                            *\n  ******************************************************************************\n  * Path:           models/03-det\n  * Program:        t_dim_dates.sql\n  * Project:        dbt_core_sample_duckdb\n  * Description:    Staging model for GO Sales products\n  * Author:         Manzar Ahmed\n  * First Created:  Jul 2025\n  ******************************************************************************\n  * Program history:\n  ******************************************************************************\n  * Date        Programmer             Description\n  * ----------  ---------------------- -----------------------------------------\n  * 2025-07-06  Manzar Ahmed           v0.01/Initial version\n  ******************************************************************************\n*/\n{{ config(\n    materialized = 'table',\n    schema = 'det'\n) }}\n\nwith date_span as (\n    select cast('2000-01-01' as date) + cast(i as integer) as full_date\n    from range(0, 365 * 50)\n),\n\ndim_dates as (\n    select\n        cast(full_date as date) as date_key,\n        full_date,\n        cast(strftime('%Y', full_date) as integer) as year,\n        cast(strftime('%m', full_date) as integer) as month,\n        cast(strftime('%d', full_date) as integer) as day,\n        cast(strftime('%W', full_date) as integer) as week_of_year,\n        cast(strftime('%w', full_date) as integer) as weekday_number,\n        cast(strftime('%j', full_date) as integer) as day_of_year,\n        strftime('%Y-%m', full_date) as month_label,\n        strftime('%Y-%W', full_date) as week_label,\n        strftime('%Y-Q', full_date)\n        || cast(\n            (\n                (cast(strftime('%m', full_date) as integer) - 1) / 3 + 1\n            ) as integer\n        ) as quarter_label,\n        coalesce(strftime('%w', full_date) in ('0', '6'), false) as is_weekend,\n        coalesce(strftime('%w', full_date) in ('1', '2', '3', '4', '5'),\n        false) as is_weekday\n    from date_span\n)\n\nselect * from dim_dates\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/03-det/t_dim_dates.yml",
    "content": "version: 2\n\nmodels:\n  - name: t_dim_dates\n    description: >\n      Dimension table for dates used in GO Sales data warehouse. Contains date attributes\n      such as year, month, day, quarter, and fiscal year.\n    config:\n      materialized: table\n      schema: det\n      tags:\n        - GO_SALES_DET  "
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/03-det/t_dim_order_methods.sql",
    "content": "/*\n  ******************************************************************************\n  *               _____          _____       _                                 *\n  *              / ____|        / ____|     | |                                *\n  *             | |  __  ___   | (___   __ _| | ___  ___                       *\n  *             | | |_ |/ _ \\   \\___ \\ / _` | |/ _ \\/ __|                      *\n  *             | |__| | (_) |  ____) | (_| | |  __/\\__ \\                      *\n  *              \\_____|\\___/  |_____/ \\__,_|_|\\___||___/                      *\n  *                                                                            *\n  ******************************************************************************\n  * Path:           models/03-det\n  * Program:        t_dim_order_methods\n  * Project:        dbt_core_sample_duckdb\n  * Description:    SCD1 dimension model for GO Sales order methods with \n  *                 surrogate key and audit columns\n  * Author:         Manzar Ahmed\n  * First Created:  Jul 2025\n  ******************************************************************************\n  * Program history:\n  ******************************************************************************\n  * Date        Programmer             Description\n  * ----------  ---------------------- -----------------------------------------\n  * 2025-07-06  Manzar Ahmed           v0.01/Initial version\n  ******************************************************************************\n*/\n\n{{ config(\n    materialized = 'incremental',\n    schema = 'det',\n    unique_key = 'order_method_code',\n    pre_hook = [\"create sequence if not exists \n                  seq_dim_order_method_sk start 1 increment 1\"\n             ]\n) }}\n\nwith source_data as (\n    select\n        order_method_code,\n        order_method_type\n    from {{ ref('t_stg_go_methods') }}\n    order by order_method_code\n)\n\n{% if is_incremental() %}\n\n    , existing_data as (\n        select\n            order_method_code,\n            order_method_type,\n            dim_order_method_sk,\n            create_ts,\n            update_ts\n        from {{ this }}\n    ),\n\n    new_or_changed as (\n        select\n            s.order_method_code,\n            s.order_method_type,\n            coalesce(\n                e.dim_order_method_sk, nextval('seq_dim_order_method_sk')\n            ) as dim_order_method_sk,\n            coalesce(e.create_ts, current_timestamp) as create_ts,\n            current_timestamp as update_ts\n        from source_data as s\n        left join existing_data as e\n            on s.order_method_code = e.order_method_code\n        where\n            e.order_method_code is null\n            or s.order_method_type != e.order_method_type\n    )\n\n    select * from new_or_changed\n\n{% else %}\n\nselect\n    nextval('seq_dim_order_method_sk') as dim_order_method_sk,\n    order_method_code,\n    order_method_type,\n    current_timestamp as create_ts,\n    current_timestamp as update_ts\nfrom source_data\n\n{% endif %}\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/03-det/t_dim_order_methods.yml",
    "content": "version: 2\n\nmodels:\n  - name: t_dim_order_methods\n    description: \"SCD1 dimension model for GO Sales order methods with surrogate key and audit columns\"\n    config:\n      materialized: incremental\n      schema: det\n      tags:\n        - GO_SALES_DET\n      unique_key: order_method_code\n\n\n    columns:\n      - name: dim_order_method_sk\n        description: \"Surrogate key for the order method record\"\n        tests:\n          - not_null\n\n      - name: order_method_code\n        description: \"Business key representing the order method\"\n        tests:\n          - not_null\n          - unique\n\n      - name: order_method_type\n        description: \"Description of the order method type (e.g., Web, Phone, Fax)\"\n\n      - name: create_ts\n        description: \"Timestamp when the record was first created\"\n\n      - name: update_ts\n        description: \"Timestamp when the record was last updated\"\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/03-det/t_dim_products.sql",
    "content": "/*\n  ******************************************************************************\n  *               _____          _____       _                                 *\n  *              / ____|        / ____|     | |                                *\n  *             | |  __  ___   | (___   __ _| | ___  ___                       *\n  *             | | |_ |/ _ \\   \\___ \\ / _` | |/ _ \\/ __|                      *\n  *             | |__| | (_) |  ____) | (_| | |  __/\\__ \\                      *\n  *              \\_____|\\___/  |_____/ \\__,_|_|\\___||___/                      *\n  *                                                                            *\n  ******************************************************************************\n  * Path:           models/03-det\n  * Program:        t_dim_products.sql\n  * Project:        dbt_core_sample_duckdb\n  * Description:    SCD2 dimension model for GO Sales products with surrogate \n  *                 key and change hash\n  * Author:         Manzar Ahmed\n  * First Created:  Jul 2025\n  ******************************************************************************\n  * Program history:\n  ******************************************************************************\n  * Date        Programmer             Description\n  * ----------  ---------------------- -----------------------------------------\n  * 2025-06-11  Manzar Ahmed           v0.01/Initial version\n  * 2025-06-23  Manzar Ahmed           v0.02/Utilising SCD2 vars for start and \n  *                                    end timestamps\n  * 2025-06-23  Manzar Ahmed           v0.03/SonarQube issues fixed:\n  *                                    Define a constant instead of duplicating \n  *                                    this literal 5 times (plsql:S1192)\n  * 2025-07-07  Manzar Ahmed           v0.04/Added version number, \n  *                                    current_version and prior surrogate key \n  *                                    to SCD2\n  * 2025-08-07  Manzar Ahmed           v0.05/scd2 enhancements, added\n  ******************************************************************************\n*/\n\n{{ config(\n    materialized = 'incremental',\n    schema = 'det',\n    unique_key = ['dim_product_sk'],\n    pre_hook = [\"create sequence if not exists seq_dim_product_sk start 1 increment 1\"]\n) }}\n\n{% set vars = get_scd2_vars() %}\n{% set start_ts = \"('\" ~ vars.start_ts ~ \"')::timestamp\" %}\n{% set end_ts = \"('\" ~ vars.end_ts ~ \"')::timestamp\" %}\n{% set high_date_ts = \"('\" ~ vars.high_date ~ \"')::timestamp\" %}\n\nwith current_data as (\n    select\n        *,\n            {{ scd2_hash([\n            'product_number',        \n            'product_line',\n            'product_type',\n            'product',\n            'product_brand',\n            'product_color',\n            'cast(unit_cost as decimal(18,2))',\n            'cast(unit_price as decimal(18,2))'\n        ]) }} as scd2_hash\n    from {{ ref('t_stg_go_products') }}\n)\n\n{% if is_incremental() %}\n    ,\n\n    existing_records as (\n        select *\n        from {{ this }}\n        where current_version = true\n    ),\n\n    ordered_changes as (\n        select\n            c.product_number,\n            c.product_line,\n            c.product_type,\n            c.product,\n            c.product_brand,\n            c.product_color,\n            c.unit_cost,\n            c.unit_price,\n            c.scd2_hash,\n            e.dim_product_sk as prior_dim_product_sk,\n            coalesce(e.version_number, 0) + 1 as version_number\n        from current_data as c\n        left join existing_records as e\n            on c.product_number = e.product_number\n        where\n            e.product_number is null\n            or c.scd2_hash != e.scd2_hash\n        order by c.product_number\n    ),\n\n    changes as (\n        select\n            nextval('seq_dim_product_sk') as dim_product_sk,\n            oc.product_number,\n            oc.product_line,\n            oc.product_type,\n            oc.product,\n            oc.product_brand,\n            oc.product_color,\n            oc.unit_cost,\n            oc.unit_price,\n            oc.scd2_hash,\n            {{ start_ts }} as start_ts,\n            {{ high_date_ts }} as end_ts,\n            oc.version_number,\n            true as current_version,\n            oc.prior_dim_product_sk\n        from ordered_changes as oc\n    ),\n\n    updates as (\n        select\n            e.dim_product_sk,\n            e.product_number,\n            e.product_line,\n            e.product_type,\n            e.product,\n            e.product_brand,\n            e.product_color,\n            e.unit_cost,\n            e.unit_price,\n            e.scd2_hash,\n            e.start_ts,\n            {{ end_ts }} as end_ts,\n            e.version_number,\n            false as current_version,\n            e.prior_dim_product_sk\n        from existing_records as e\n        inner join changes as c\n            on e.product_number = c.product_number\n        where e.current_version = true\n    )\n\n    select * from changes\n    union all\n    select * from updates\n\n{% else %}\n\nselect  nextval('seq_dim_product_sk') as dim_product_sk,\n        product_number,\n        product_line,\n        product_type,\n        product,\n        product_brand,\n        product_color,\n        unit_cost,\n        unit_price,\n        scd2_hash,\n        {{ start_ts }} as start_ts,\n        {{ high_date_ts }} as end_ts,\n        1 as version_number,\n        true as current_version,\n        -1 as prior_dim_product_sk\nfrom    current_data\norder by product_number\n\n{% endif %}\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/03-det/t_dim_products.yml",
    "content": "version: 2\n\nmodels:\n  - name: t_dim_products\n    description: \"SCD2 dimension model for GO Sales products with surrogate key and change hash\"\n    config:\n      materialized: incremental\n      schema: det\n      tags:\n        - GO_SALES_DET\n      unique_key: product_number\n\n    columns:\n      - name: dim_product_sk\n        description: \"Surrogate key for each SCD2 version of the product\"\n        tests:\n          - not_null\n\n      - name: product_number\n        description: \"Natural key for the product\"\n        tests:\n          - not_null\n          - unique\n\n      - name: product_line\n        description: \"Product line category\"\n\n      - name: product_type\n        description: \"Product type or classification\"\n\n      - name: product\n        description: \"Product name or label\"\n\n      - name: product_brand\n        description: \"Brand associated with the product\"\n\n      - name: product_color\n        description: \"Color variant of the product\"\n\n      - name: unit_cost\n        description: \"Cost to produce or acquire the product\"\n\n      - name: unit_price\n        description: \"Retail price of the product\"\n\n      - name: scd2_hash\n        description: \"MD5 hash of tracked columns used for change detection\"\n\n      - name: start_ts\n        description: \"Timestamp when the product record became active\"\n\n      - name: end_ts\n        description: \"Timestamp when the product record was deactivated (or high_date if still active)\"\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/03-det/t_dim_retailers.sql",
    "content": "/*\n  ******************************************************************************\n  *               _____          _____       _                                 *\n  *              / ____|        / ____|     | |                                *\n  *             | |  __  ___   | (___   __ _| | ___  ___                       *\n  *             | | |_ |/ _ \\   \\___ \\ / _` | |/ _ \\/ __|                      *\n  *             | |__| | (_) |  ____) | (_| | |  __/\\__ \\                      *\n  *              \\_____|\\___/  |_____/ \\__,_|_|\\___||___/                      *\n  *                                                                            *\n  ******************************************************************************\n  * Path:           models/03-det\n  * Program:        t_det_go_retailers.sql\n  * Project:        dbt_core_sample_duckdb\n  * Description:    SCD2 dimension model for GO Sales retailers with surrogate \n  *                 key and change hash\n  * Author:         Manzar Ahmed\n  * First Created:  Jun 2025\n  ******************************************************************************\n  * Program history:\n  ******************************************************************************\n  * Date        Programmer             Description\n  * ----------  ---------------------- -----------------------------------------\n  * 2025-06-11  Manzar Ahmed           v0.01/Initial version\n  * 2025-06-23  Manzar Ahmed           v0.02/Utilising SCD2 vars for start and \n  *                                    end timestamps\n  * 2025-06-23  Manzar Ahmed           v0.03/SonarQube issues fixed:\n  *                                    Define a constant instead of duplicating \n  *                                    this literal 5 times (plsql:S1192)\n  * 2025-08-07  Manzar Ahmed           v0.04/scd2 enhancements, added\n  ******************************************************************************\n*/\n{{ config(\n    materialized = 'incremental',\n    schema = 'det',\n    unique_key = ['dim_retailer_sk'],\n    pre_hook = [\"create sequence if not exists seq_dim_retailer_sk start 1 increment 1\"]\n) }}\n\n{% set vars = get_scd2_vars() %}\n{% set start_ts = \"('\" ~ vars.start_ts ~ \"')::timestamp\" %}\n{% set end_ts = \"('\" ~ vars.end_ts ~ \"')::timestamp\" %}\n{% set high_date_ts = \"('\" ~ vars.high_date ~ \"')::timestamp\" %}\n\nwith current_data as (\n    select\n        retailer_code,\n        retailer_name,\n        type,\n        country,\n            {{ scd2_hash([\n                'retailer_code',\n                'retailer_name',        \n                'type',\n                'country'\n            ]) }} as scd2_hash\n    from {{ ref('t_stg_go_retailers') }}\n)\n\n{% if is_incremental() %},\n\nexisting_records as (\n    select      retailer_code,\n                retailer_name,\n                type,\n                country,\n                scd2_hash,\n                start_ts,\n                end_ts\n    from        {{ this }}\n    where       end_ts = {{ high_date_ts }}\n),\n\nordered_changes as (\n    select      c.retailer_code,\n                c.retailer_name,\n                c.type,\n                c.country,\n                c.scd2_hash\n    from        current_data c\n    left join   existing_records e\n    on          c.retailer_code = e.retailer_code\n    where       e.retailer_code is null\n    or          c.scd2_hash != e.scd2_hash\n    order by    c.retailer_code\n),\n\nchanges as (\n    select  nextval('seq_dim_retailer_sk') as dim_retailer_sk,\n            oc.retailer_code,\n            oc.retailer_name,\n            oc.type,\n            oc.country,\n            oc.scd2_hash,\n            {{ start_ts }} start_ts,\n            {{ high_date_ts }} as end_ts\n    from    ordered_changes oc\n),\n\nupdates as (\n    select  e.dim_retailer_sk,\n            e.retailer_code,\n            e.retailer_name,\n            e.type,\n            e.country,\n            e.scd2_hash,\n            e.start_ts,\n            ('{{ end_ts }}')::timestamp  as end_ts\n    from    existing_records e\n    join    changes c\n    on      e.retailer_code = c.retailer_code\n    where   e.end_ts = {{ high_date_ts }}\n)\n\nselect * from changes\nunion all\nselect * from updates\n\n{% else %}\n\n    select\n        nextval('seq_dim_retailer_sk') as dim_retailer_sk,\n        retailer_code,\n        retailer_name,\n        type,\n        country,\n        scd2_hash,\n        {{ start_ts }} as start_ts,\n        {{ high_date_ts }}as as end_ts\n    from current_data\n    order by retailer_code\n\n{% endif %}\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/03-det/t_dim_retailers.yml",
    "content": "version: 2\n\nmodels:\n  - name: t_dim_retailers\n    description: \"SCD2 dimension model for GO Sales retailers\"\n    config:\n      materialized: incremental\n      schema: det\n      tags:\n        - GO_SALES_DET\n      unique_key: retailer_code\n\n    columns:\n      - name: dim_retailer_sk\n        description: \"Surrogate key for each SCD2 version of the retailer record\"\n\n      - name: retailer_code\n        description: \"Natural key representing the retailer\"\n        tests:\n          - not_null\n          - unique\n\n      - name: retailer_name\n        description: \"Name of the retailer\"\n\n      - name: type\n        description: \"Retailer type/category\"\n\n      - name: country\n        description: \"Country where the retailer operates\"\n\n      - name: scd2_hash\n        description: \"MD5 hash of tracked columns used for change detection\"\n\n      - name: start_ts\n        description: \"Timestamp when the record became effective\"\n\n      - name: end_ts\n        description: \"Timestamp when the record became outdated (or high_date if current)\"\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/03-det/t_fct_sales.sql",
    "content": "/*\n  ******************************************************************************\n  *               _____          _____       _                                 *\n  *              / ____|        / ____|     | |                                *\n  *             | |  __  ___   | (___   __ _| | ___  ___                       *\n  *             | | |_ |/ _ \\   \\___ \\ / _` | |/ _ \\/ __|                      *\n  *             | |__| | (_) |  ____) | (_| | |  __/\\__ \\                      *\n  *              \\_____|\\___/  |_____/ \\__,_|_|\\___||___/                      *\n  *                                                                            *\n  ******************************************************************************\n  * Path:           models/03-det\n  * Program:        t_fct_sales.sql\n  * Project:        dbt_core_sample_duckdb\n  * Description:    Fact table for GO Sales with surrogate keys from dimensions\n  *                 key and change hash\n  * Author:         Manzar Ahmed\n  * First Created:  Jun 2025\n  ******************************************************************************\n  * Program history:\n  ******************************************************************************\n  * Date        Programmer             Description\n  * ----------  ---------------------- -----------------------------------------\n  * 2025-06-11  Manzar Ahmed           v0.01/Initial version\n  ******************************************************************************\n*/\n{{ config(\n    materialized='incremental',\n    schema='det',\n    unique_key='fct_sales_sk',\n    on_schema_change='sync_all_columns',\n    pre_hook=[\"create sequence if not exists seq_fct_sales_sk start 1 increment 1\"]\n) }}\n\n{% do run_query(\"SET VARIABLE current_ts = (SELECT date_trunc('second', current_timestamp));\") %}\n{%- set high_date = '9999-12-31 00:00:00' %}\n\nwith base as (\n    select\n        s.retailer_code,\n        s.product_number,\n        s.order_method_code,\n        s.transaction_date::date as transaction_date,\n        s.quantity,\n        s.unit_price,\n        s.unit_sale_price\n    from {{ ref('t_stg_go_daily_sales') }} as s\n    order by\n        s.transaction_date,\n        s.retailer_code,\n        s.product_number,\n        s.order_method_code\n),\n\njoined as (\n    select\n        r.dim_retailer_sk,\n        p.dim_product_sk,\n        m.dim_order_method_sk,\n        b.transaction_date,\n        b.quantity,\n        b.unit_price,\n        b.unit_sale_price,\n        nextval('seq_fct_sales_sk') as fct_sales_sk,\n        getvariable('current_ts') as create_ts,\n        getvariable('current_ts') as update_ts\n    from base as b\n    left join {{ ref('t_dim_retailers') }} as r\n        on\n            b.retailer_code = r.retailer_code\n            and r.end_ts = ('{{ high_date }}')::timestamp\n    left join {{ ref('t_dim_products') }} as p\n        on\n            b.product_number = p.product_number\n            and p.end_ts = ('{{ high_date }}')::timestamp\n    left join {{ ref('t_dim_order_methods') }} as m\n        on b.order_method_code = m.order_method_code\n)\n\nselect\n    fct_sales_sk,\n    dim_retailer_sk,\n    dim_product_sk,\n    dim_order_method_sk,\n    transaction_date,\n    quantity,\n    unit_price,\n    unit_sale_price,\n    create_ts,\n    update_ts\nfrom joined\n\n{% if is_incremental() %}\nwhere (\n    dim_retailer_sk,\n    dim_product_sk,\n    dim_order_method_sk,\n    transaction_date\n) not in (\n    select\n        dim_retailer_sk,\n        dim_product_sk,\n        dim_order_method_sk,\n        transaction_date\n    from {{ this }}\n)\n{% endif %}\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/03-det/t_fct_sales.yml",
    "content": "version: 2\n\nmodels:\n  - name: t_fct_sales\n    description: >\n      Detail-level integrated sales fact table built incrementally from staging. Includes surrogate key, audit columns, and tracks order and price details by retailer/product/method/date.\n\n    config:\n      materialized: incremental\n      schema: det     \n      tags:\n        - GO_SALES_DET\n      unique_key: fct_sales_sk\n\n    columns:\n      - name: fct_sales_sk\n        description: Numeric surrogate key generated via DuckDB sequence.\n        tests:\n          - not_null\n          - unique\n\n      - name: retailer_code\n        description: Retailer identifier from sales data.\n        tests:\n          - not_null\n\n      - name: product_number\n        description: Product SKU identifier.\n        tests:\n          - not_null\n\n      - name: order_method_code\n        description: Code representing the ordering channel (e.g., online, store).\n        tests:\n          - not_null\n\n      - name: transaction_date\n        description: Date of the sales transaction.\n        tests:\n          - not_null\n\n      - name: quantity\n        description: Number of units sold.\n\n      - name: unit_price\n        description: Regular price per unit.\n\n      - name: unit_sale_price\n        description: Final sale price per unit.\n\n      - name: create_ts\n        description: Timestamp when the record was first loaded into the detail layer.\n\n      - name: update_ts\n        description: Timestamp when the record was last updated.\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/04-mrt/t_mrt_sales.sql",
    "content": "/*\n  ******************************************************************************\n  *               _____          _____       _                                 *\n  *              / ____|        / ____|     | |                                *\n  *             | |  __  ___   | (___   __ _| | ___  ___                       *\n  *             | | |_ |/ _ \\   \\___ \\ / _` | |/ _ \\/ __|                      *\n  *             | |__| | (_) |  ____) | (_| | |  __/\\__ \\                      *\n  *              \\_____|\\___/  |_____/ \\__,_|_|\\___||___/                      *\n  *                                                                            *\n  ******************************************************************************\n  * Path:           models/04-mrt\n  * Program:        t_mrt_sales.sql\n  * Project:        dbt_core_sample_duckdb\n  * Description:    Mart sales model combining fact and dimension tables\n  * Author:         Manzar Ahmed\n  * First Created:  Jun 2025\n  ******************************************************************************\n  * Program history:\n  ******************************************************************************\n  * Date        Programmer             Description\n  * ----------  ---------------------- -----------------------------------------\n  * 2025-06-11  Manzar Ahmed           v0.01/Initial version\n  ******************************************************************************\n*/\n{%- set high_date = '9999-12-31 00:00:00' %}\n\nwith fact as (\n    select *\n    from {{ ref('t_fct_sales') }}\n),\n\norder_methods as (\n    select *\n    from {{ ref('t_dim_order_methods') }}\n),\n\nproduct as (\n    select *\n    from {{ ref('t_dim_products') }}\n    where end_ts = ('{{ high_date }}')::timestamp\n),\n\nretailer as (\n    select *\n    from {{ ref('t_dim_retailers') }}\n    where end_ts = ('{{ high_date }}')::timestamp\n)\n\nselect\n    -- Fact fields\n    f.fct_sales_sk,\n    f.transaction_date,\n    f.quantity,\n    f.unit_price,\n    f.unit_sale_price,\n\n    -- Order Method dimension\n    om.order_method_code,\n    om.order_method_type,\n\n    -- Product dimension\n    p.product_number,\n    p.product_line,\n    p.product_type,\n    p.product,\n    p.product_brand,\n    p.product_color,\n\n    -- Retailer dimension\n    r.retailer_code,\n    r.retailer_name,\n    r.country as retailer_country,\n    r.type as retailer_type\n\nfrom fact as f\nleft join order_methods as om\n    on f.dim_order_method_sk = om.dim_order_method_sk\n\nleft join product as p\n    on f.dim_product_sk = p.dim_product_sk\n\nleft join retailer as r\n    on f.dim_retailer_sk = r.dim_retailer_sk\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/models/04-mrt/t_mrt_sales.yml",
    "content": "version: 2\n\nmodels:\n  - name: t_mrt_sales\n    description: >\n      Flattened mart table joining fct_go_sales with active (current) dimension\n      records from product, retailer, and order method dimensions.\n    config:\n      materialized: table\n      schema: mrt \n      tags:\n        - GO_SALES_MRT\n      \n    columns:\n      - name: fct_sales_sk\n        description: \"Surrogate key for the sales fact record\"\n        tests:\n          - not_null\n          - unique\n\n      - name: transaction_date\n        description: \"Date when the transaction occurred\"\n        tests:\n          - not_null\n\n      - name: quantity\n        description: \"Number of units sold\"\n\n      - name: unit_price\n        description: \"Price per unit sold\"\n\n      - name: total_amount\n        description: \"Calculated total (quantity * unit_price)\"\n\n      - name: order_method_code\n        description: \"Natural key for order method\"\n\n      - name: order_method_type\n        description: \"Descriptive type of order method (e.g., Web, Direct)\"\n\n      - name: product_number\n        description: \"Unique identifier for product\"\n\n      - name: product_description\n        description: \"Product description\"\n\n      - name: product_line\n        description: \"Category or grouping of product\"\n\n      - name: product_type\n        description: \"Product classification\"\n\n      - name: product_brand\n        description: \"Brand under which the product is sold\"\n\n      - name: retailer_code\n        description: \"Retailer's unique code\"\n\n      - name: retailer_name\n        description: \"Name of the retailer\"\n\n      - name: retailer_country\n        description: \"Country where retailer operates\"\n\n      - name: retailer_type\n        description: \"Type or classification of the retailer (e.g., Online, Physical)\"\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/packages.yml",
    "content": "packages:\n  - package: dbt-labs/dbt_utils\n    version: [\">=1.0.0\", \"<2.0.0\"]"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/profiles.yml",
    "content": "dbt_core_sample_duckdb:\n  target: go_sales\n  outputs:\n    go_sales:\n      type: duckdb\n      path: '/home/u0001/dbt-core-sample-duckdb/go_sales.db'\n  # target: dev\n  # outputs:\n  #   dev:\n  #     type: snowflake\n  #     account: hlutnos.ge96755\n  #     role: gos_dbt_role\n  #     database: go_sales\n  #     warehouse: gos_wh\n  #     schema: det   \n  #     threads: 1\n  #     authenticator: snowflake\n  #     private_key_path: /home/u0001/.snowflake/rsa_key.pem\n  #     private_key_passphrase: \"{{ env_var('SNOWFLAKE_KEY_PASSPHRASE') }}\"\n  #     client_session_keep_alive: false\n  \n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/requirements.txt",
    "content": "# Core dbt and adapters\ndbt-core==1.9.6       \ndbt-duckdb==1.9.3     \n\n# MySQL connectivity (via mysql-connector-python)\nmysql-connector-python==9.3.0\n\n# Data wrangling\npandas==2.2.3\n\n# Unit testing\npytest==8.2.1\n\n# Optional development tools\npylint==3.3.7\nsqlfluff~=3.4.0\nsqlfluff-templater-dbt~=3.4.0\n\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/seeds/ref_go_methods.csv",
    "content": "Order method code,Order method type\n1,Fax\n2,Telephone\n3,Mail\n4,E-mail\n5,Web\n6,Sales visit\n7,Special\n8,Other\n9,Other\n10,Other\n11,Other\n12,Other"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/seeds/seeds.yml",
    "content": "version: 2\n\nseeds:\n  - name: \"Order method code\"\n    description: \"GO Sales order method lookup.\"\n    columns:\n      - name: order_method_code\n        description: \"Numeric code for the order method.\"\n      - name: \"Order method type\"\n        description: \"Human-readable order method label.\"\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/shared_utils/__init__.py",
    "content": ""
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/shared_utils/config.py",
    "content": "\"\"\"Configuration utility to provide database connection settings.\"\"\"\n\nimport json\nimport os\n\n\ndef get_db_config(database: str) -> dict:\n    \"\"\"\n    Returns database connection configuration for the specified database.\n\n    Args:\n        database (str): The name of the database.\n\n    Returns:\n        dict: A dictionary with connection parameters.\n\n    Raises:\n        ValueError: If the specified database is not supported.\n    \"\"\"\n    config_path = os.path.join(\n        os.path.dirname(os.path.dirname(__file__)),\n        \"credentials\",\n        \"go-sales.json\"\n    )\n\n    with open(config_path, \"r\", encoding=\"utf-8\") as f:\n        config_map = json.load(f)\n\n    if database not in config_map:\n        raise ValueError(f\"Unsupported database: {database}\")\n\n    return config_map[database]\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/shared_utils/db_utils.py",
    "content": "\"\"\"\nThis module provides a function to execute SQL queries on supported databases\nand return the result as a pandas DataFrame.\n\"\"\"\n\nimport mysql.connector\nimport pandas as pd\nfrom shared_utils.config import get_db_config\n\n\ndef db_query(sql: str, database: str) -> pd.DataFrame:\n    \"\"\"\n    Executes a SQL query on the specified database and returns the result\n    as a pandas DataFrame.\n\n    Args:\n        sql (str): The SQL query to execute.\n        database (str): The name of the database to connect to.\n                        Supported values are keys in the config_map.\n\n    Returns:\n        pd.DataFrame: The result of the SQL query.\n\n    Raises:\n        ValueError: If the specified database is not supported.\n    \"\"\"\n    config = get_db_config(database)\n\n    print(f\"\\nRunning SQL query:\\n{sql}\")\n    conn = mysql.connector.connect(**config)\n\n    try:\n        df = pd.read_sql(sql, conn)\n    finally:\n        conn.close()\n\n    print(f\"\\nshape: {df.shape} \\n\")\n    return df\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/snapshots/.gitkeep",
    "content": ""
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/sonar-project.properites",
    "content": "# Project metadata\nsonar.projectKey=go-sales\nsonar.projectName=GO Sales Data Warehouse\nsonar.organization=manz01\n\n# Python settings\nsonar.language=py\nsonar.python.version=3.10\nsonar.sourceEncoding=UTF-8\n\n# Source and tests\nsonar.sources=shared_utils\nsonar.tests=tests\nsonar.python.coverage.reportPaths=coverage.xml\n\n# Optional: pylint integration\nsonar.python.pylint.reportPath=pylint-report.txt\nsonar.inclusions=shared_utils/**/*.py\nsonar.test.inclusions=tests/**/*.py\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/tests/.gitkeep",
    "content": ""
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/tests/test_config.py",
    "content": "\"\"\"Unit tests for shared_utils.config.get_db_config.\"\"\"\n\nimport json\nfrom unittest import mock\nimport pytest\nfrom shared_utils.config import get_db_config\nfrom tests.test_data import mock_config_data\n\n\n@mock.patch(\"builtins.open\", new_callable=mock.mock_open, read_data=json.dumps(mock_config_data))\ndef test_get_db_config_valid(_):\n    \"\"\"Test get_db_config returns config for valid DB key.\"\"\"\n    result = get_db_config(\"GOSales\")\n    assert result == mock_config_data[\"GOSales\"]\n\n\n@mock.patch(\"builtins.open\", new_callable=mock.mock_open, read_data=json.dumps(mock_config_data))\ndef test_get_db_config_invalid(_):\n    \"\"\"Test get_db_config raises ValueError for unsupported DB key.\"\"\"\n    with pytest.raises(ValueError, match=\"Unsupported database: InvalidDB\"):\n        get_db_config(\"InvalidDB\")\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/tests/test_data.py",
    "content": "# tests/test_data.py\n\"\"\"\nThis module contains mock configuration data for testing purposes.\n\nAttributes:\n    mock_config_data (dict): A dictionary containing mock database connection\n        configurations for various databases, such as \"GOSales\". The configuration\n        includes host, port, user, password, and database name.\n\"\"\"\n\nmock_config_data = {\n    \"GOSales\": {\n        \"host\": \"dummy-host.local\",\n        \"port\": 1234,\n        \"user\": \"test_user\",\n        \"password\": \"test_password\",\n        \"database\": \"dummy_db\"\n    }\n}\n"
  },
  {
    "path": "test-fixtures/dbt-core-sample-duckdb/tests/test_db_utils.py",
    "content": "\"\"\"Unit tests for db_query function.\"\"\"\n\nfrom unittest import mock\nimport pandas as pd\nfrom shared_utils.db_utils import db_query\nfrom tests.test_data import mock_config_data\n\n\n@mock.patch(\"shared_utils.db_utils.get_db_config\")\n@mock.patch(\"shared_utils.db_utils.mysql.connector.connect\")\n@mock.patch(\"shared_utils.db_utils.pd.read_sql\")\ndef test_db_query_success(mock_read_sql, mock_connect, mock_get_config):\n    \"\"\"Test db_query runs SQL and returns DataFrame correctly.\"\"\"\n    fake_config = mock_config_data[\"GOSales\"]\n    mock_conn = mock.Mock()\n    mock_get_config.return_value = fake_config\n    mock_connect.return_value = mock_conn\n\n    expected_df = pd.DataFrame({\"id\": [1], \"name\": [\"Test\"]})\n    mock_read_sql.return_value = expected_df\n\n    result = db_query(\"SELECT * FROM dummy_table\", \"GOSales\")\n\n    mock_get_config.assert_called_once_with(\"GOSales\")\n    mock_connect.assert_called_once_with(**fake_config)\n    mock_read_sql.assert_called_once_with(\"SELECT * FROM dummy_table\", mock_conn)\n    mock_conn.close.assert_called_once()\n    pd.testing.assert_frame_equal(result, expected_df)\n"
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/.devcontainer.json",
    "content": "{\n  \"name\": \"dbt\",\n  \"dockerFile\": \"Dockerfile\",\n  \"settings\": {\n    \"terminal.integrated.defaultProfile.linux#\": \"/bin/sh\",\n    \"files.associations\": {\n      \"*.sql\": \"jinja-sql\",\n      \"*.sqlfluff\": \"ini\",\n      \"*.yml\": \"yaml\",\n      \"**/target/**\": \"\"\n    },\n    \"sql.linter.executablePath\": \"/usr/local/bin/sqlfluff\",\n    \"sql.format.enable\": true,\n    \"sql.linter.run\": \"onType\",\n    \"files.exclude\": {\n      \"**/.git\": true,\n      \"**/.svn\": true,\n      \"**/.hg\": true,\n      \"**/CVS\": true,\n      \"**/.DS_Store\": true,\n      \"**/__pycache__\": true\n    },\n    \"findrelated.workspaceRulesets\": [\n      {\n        \"name\": \"sql\",\n        \"rules\": [\n          {\n            \"pattern\": \"^(.*/)?models/(.*/)?(.+\\\\.sql)$\",\n            \"locators\": [\"**/compiled/**/$3\"]\n          },\n          {\n            \"pattern\": \"^(.*/)?compiled/(.*/)?(.+\\\\.sql)$\",\n            \"locators\": [\"**/run/**/$3\"]\n          },\n          {\n            \"pattern\": \"^(.*/)?run/(.*/)?(.+\\\\.sql)$\",\n            \"locators\": [\"**/models/**/$3\"]\n          }\n        ]\n      }\n    ],\n    \"findrelated.applyRulesets\": [\"sql\"],\n    \"findrelated.applyWorkspaceRulesets\": [\"sql\"],\n    \"workbench.editor.highlightModifiedTabs\": true,\n    \"workbench.editor.labelFormat\": \"medium\",\n    \"workbench.editor.revealIfOpen\": true,\n    \"editor.rulers\": [99],\n    \"yaml.schemas\": {\n      \"https://raw.githubusercontent.com/dbt-labs/dbt-jsonschema/main/schemas/dbt_yml_files.json\": [\n        \"/*.yml\",\n        \"!profiles.yml\",\n        \"!dbt_project.yml\",\n        \"!packages.yml\",\n        \"!selectors.yml\",\n        \"!profile_template.yml\"\n      ],\n      \"https://raw.githubusercontent.com/dbt-labs/dbt-jsonschema/main/schemas/dbt_project.json\": [\n        \"dbt_project.yml\"\n      ],\n      \"https://raw.githubusercontent.com/dbt-labs/dbt-jsonschema/main/schemas/selectors.json\": [\n        \"selectors.yml\"\n      ],\n      \"https://raw.githubusercontent.com/dbt-labs/dbt-jsonschema/main/schemas/packages.json\": [\n        \"packages.yml\"\n      ]\n    }\n  },\n  \"extensions\": [\n    \"bastienboutonnet.vscode-dbt\",\n    \"dorzey.vscode-sqlfluff\",\n    \"editorconfig.editorconfig\",\n    \"amodio.find-related\",\n    \"ms-azuretools.vscode-docker\",\n    \"ms-python.python\",\n    \"visualstudioexptteam.vscodeintellicode\",\n    \"samuelcolvin.jinjahtml\",\n    \"redhat.vscode-yaml\"\n  ],\n\n  \"remoteUser\": \"vscode\"\n}\n"
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/.github/CODEOWNERS",
    "content": "* @dbt-labs/dx\n"
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/.github/workflows/validate_on_platforms.yml",
    "content": "name: Platform Validation\n\non:\n  push:\n    branches: [duckdb]\n  pull_request:\n    branches: [duckdb]\n\njobs:\n  build-macos:\n      name: Validate Getting Started works on macOS\n      runs-on: macos-latest\n      steps:\n        - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744  # actions/checkout@v3\n        - name: Set up Python\n          uses: actions/setup-python@7f4fc3e22c37d6ff65e88745f38bd3157c663f7c  # actions/setup-python@v4\n        - name: Install uv\n          uses: astral-sh/setup-uv@e58605a9b6da7c637471fab8847a5e5a6b8df081  # astral-sh/setup-uv@v5\n        - name: Full Deploy Commands\n          run: |\n            uv sync\n            source .venv/bin/activate\n            which dbt\n            dbt --version\n            dbt debug\n            dbt build\n            dbt docs generate\n            python -c \"import duckdb; conn = duckdb.connect('jaffle_shop.duckdb'); conn.sql('select * from customers where customer_id = 42').show(); conn.close()\"\n          shell: bash\n\n  build-linux:\n      name: Validate Getting Started works on linux\n      runs-on: ubuntu-latest\n      steps:\n        - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744  # actions/checkout@v3\n        - name: Set up Python\n          uses: actions/setup-python@7f4fc3e22c37d6ff65e88745f38bd3157c663f7c  # actions/setup-python@v4\n        - name: Install uv\n          uses: astral-sh/setup-uv@e58605a9b6da7c637471fab8847a5e5a6b8df081  # astral-sh/setup-uv@v5\n        - name: Full Deploy Commands\n          run: |\n            uv sync\n            source .venv/bin/activate\n            which dbt\n            dbt --version\n            dbt debug\n            dbt build\n            dbt docs generate\n            python -c \"import duckdb; conn = duckdb.connect('jaffle_shop.duckdb'); conn.sql('select * from customers where customer_id = 42').show(); conn.close()\"\n          shell: bash\n\n  build-linux-powershell-core:\n      name: Validate Getting Started works on Linux PowerShell Core\n      runs-on: ubuntu-latest\n      steps:\n        - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744  # actions/checkout@v3\n        - name: Set up Python\n          uses: actions/setup-python@7f4fc3e22c37d6ff65e88745f38bd3157c663f7c  # actions/setup-python@v4\n        - name: Install uv\n          uses: astral-sh/setup-uv@e58605a9b6da7c637471fab8847a5e5a6b8df081  # astral-sh/setup-uv@v5\n        - name: Full Deploy Commands\n          run: |\n            uv sync\n            uv run dbt --version\n            uv run dbt debug\n            uv run dbt build\n            uv run dbt docs generate\n            uv run python -c \"import duckdb; conn = duckdb.connect('jaffle_shop.duckdb'); print(conn.sql('select * from customers where customer_id = 42').fetchall()); conn.close()\"\n          shell: pwsh\n\n  build-windows-powershell:\n      name: Validate Getting Started works on Windows PowerShell\n      runs-on: windows-latest\n      steps:\n        - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744  # actions/checkout@v3\n        - name: Set up Python\n          uses: actions/setup-python@7f4fc3e22c37d6ff65e88745f38bd3157c663f7c  # actions/setup-python@v4\n        - name: Install uv\n          uses: astral-sh/setup-uv@e58605a9b6da7c637471fab8847a5e5a6b8df081  # astral-sh/setup-uv@v5\n        - name: Full Deploy Commands\n          run: |\n            uv sync\n            uv run dbt --version\n            uv run dbt debug\n            uv run dbt build\n            uv run dbt docs generate\n            uv run python -c \"import duckdb; conn = duckdb.connect('jaffle_shop.duckdb'); print(conn.sql('select * from customers where customer_id = 42').fetchall()); conn.close()\"\n          shell: powershell\n\n  build-windows-cmd:\n      name: Validate Getting Started works on Windows cmd.exe\n      runs-on: windows-latest\n      steps:\n        - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744  # actions/checkout@v3\n        - name: Set up Python\n          uses: actions/setup-python@7f4fc3e22c37d6ff65e88745f38bd3157c663f7c  # actions/setup-python@v4\n        - name: Install uv\n          uses: astral-sh/setup-uv@e58605a9b6da7c637471fab8847a5e5a6b8df081  # astral-sh/setup-uv@v5\n        - name: Full Deploy Commands\n          run: |\n            uv sync\n            .venv\\Scripts\\activate.bat\n            where dbt\n            dbt --version\n            dbt debug\n            dbt build\n            dbt docs generate\n            python -c \"import duckdb; conn = duckdb.connect('jaffle_shop.duckdb'); conn.sql('select * from customers where customer_id = 42').show(); conn.close()\"\n          shell: cmd\n"
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/.gitignore",
    "content": "\ntarget/\ndbt_packages/\ndbt_internal_packages/\nfs_internal_packages/\ndbt_modules/\nlogs/\n**/.DS_Store\n.user.yml\nvenv/\n.venv/\nenv/\n**/*.duckdb\n**/*.duckdb.wal\n"
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/.python-version",
    "content": "3.13\n"
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/.sqlfluff",
    "content": "[sqlfluff]\n\ndialect = duckdb\n"
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/.sqlfluffignore",
    "content": ""
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/Dockerfile",
    "content": "FROM mcr.microsoft.com/vscode/devcontainers/python:3.13\n\nARG USER_UID=1000\nARG USER_GID=$USER_UID\n\nRUN if [ \"$USER_GID\" != \"1000\" ] || [ \"$USER_UID\" != \"1000\" ]; then groupmod --gid $USER_GID vscode && usermod --uid $USER_UID --gid $USER_GID vscode; fi\n\nCOPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv\nCOPY pyproject.toml uv.lock /tmp/\nRUN uv pip install --system --requirement /tmp/pyproject.toml\n"
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright {yyyy} {name of copyright owner}\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       http://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"
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/README.md",
    "content": "# Testing dbt project: `jaffle_shop`\n\n`jaffle_shop` is a fictional ecommerce store. This dbt project transforms raw data from an app database into a customers and orders model ready for analytics.\n\n<details>\n<summary>\n\n## What is this repo?\n\n</summary>\n\nWhat this repo _is_:\n\n- A self-contained playground dbt project, useful for testing out scripts, and communicating some of the core dbt concepts.\n\nWhat this repo _is not_:\n\n- A tutorial — check out the [Getting Started Tutorial](https://docs.getdbt.com/tutorial/setting-up) for that. Notably, this repo contains some anti-patterns to make it self-contained, namely the use of seeds instead of sources.\n- A demonstration of best practices — check out the [dbt Learn Demo](https://github.com/dbt-labs/dbt-learn-demo) repo instead. We want to keep this project as simple as possible. As such, we chose not to implement:\n  - our standard file naming patterns (which make more sense on larger projects, rather than this five-model project)\n  - a pull request flow\n  - CI/CD integrations\n- A demonstration of using dbt for a high-complex project, or a demo of advanced features (e.g. macros, packages, hooks, operations) — we're just trying to keep things simple here!\n\n</details>\n\n<details>\n<summary>\n\n## What's in this repo?\n\n</summary>\n\nThis repo contains [seeds](https://docs.getdbt.com/docs/building-a-dbt-project/seeds) that includes some (fake) raw data from a fictional app along with some basic dbt [models](https://docs.getdbt.com/docs/building-a-dbt-project/building-models), tests, and docs for this data.\n\nThe raw data consists of customers, orders, and payments, with the following entity-relationship diagram:\n\n![Jaffle Shop ERD](/etc/jaffle_shop_erd.png)\n\n</details>\n\n## Why should I care about this repo?\n\nIf you're just starting your cloud data warehouse journey and are hungry to get started with dbt before your organization officially gets a data warehouse, you should check out this repo.\n\nIf you want to run 28 SQL operations with dbt in less than `1 second`, for free, and all on your local machine, you should check out this repo.\n![dbt_performance](images/dbt_performance.png)\n\nIf you want an adrenaline rush from a process that used to take dbt newcomers `1 hour` and is now less than `1 minute`, you should check out this repo.\n\n![dbt_full_deploy_commands](images/dbt_full_deploy_commands.png)\n\n[Verified GitHub Action on dbt Performance](https://github.com/dbt-labs/jaffle_shop_duckdb/runs/7141529753?check_suite_focus=true#step:4:306)\n\n## Running this project\n\nPrerequisities: Python >= 3.13\n\n> **Tip:** We recommend using [uv](https://docs.astral.sh/uv/getting-started/installation/) for faster dependency installation. If you have `uv` installed, you can replace all the venv and pip steps with `uv sync`, then activate the `.venv` virtual environment it creates.\n\n### Mach Speed: No explanation needed\n\n> Run `dbt` as fast as possible in a single copy and paste motion!\n\n<details open>\n<summary>POSIX bash/zsh</summary>\n\n```shell\ngit clone https://github.com/dbt-labs/jaffle_shop_duckdb.git\ncd jaffle_shop_duckdb\npython3 -m venv venv\nsource venv/bin/activate\npython3 -m pip install --upgrade pip\npython3 -m pip install -r requirements.txt\nsource venv/bin/activate\ndbt build\ndbt docs generate\ndbt docs serve\n```\n\n</details>\n\n<details>\n<summary>POSIX fish</summary>\n\n```shell\ngit clone https://github.com/dbt-labs/jaffle_shop_duckdb.git\ncd jaffle_shop_duckdb\npython3 -m venv venv\nsource venv/bin/activate.fish\npython3 -m pip install --upgrade pip\npython3 -m pip install -r requirements.txt\nsource venv/bin/activate.fish\ndbt build\ndbt docs generate\ndbt docs serve\n```\n\n</details>\n\n<details>\n<summary>POSIX csh/tcsh</summary>\n\n```shell\ngit clone https://github.com/dbt-labs/jaffle_shop_duckdb.git\ncd jaffle_shop_duckdb\npython3 -m venv venv\nsource venv/bin/activate.csh\npython3 -m pip install --upgrade pip\npython3 -m pip install -r requirements.txt\nsource venv/bin/activate.csh\ndbt build\ndbt docs generate\ndbt docs serve\n```\n\n</details>\n\n<details>\n<summary>POSIX PowerShell Core</summary>\n\n```shell\ngit clone https://github.com/dbt-labs/jaffle_shop_duckdb.git\ncd jaffle_shop_duckdb\npython3 -m venv venv\nvenv/bin/Activate.ps1\npython3 -m pip install --upgrade pip\npython3 -m pip install -r requirements.txt\nvenv/bin/Activate.ps1\ndbt build\ndbt docs generate\ndbt docs serve\n```\n\n</details>\n\n<details>\n<summary>Windows cmd.exe</summary>\n\n```shell\ngit clone https://github.com/dbt-labs/jaffle_shop_duckdb.git\ncd jaffle_shop_duckdb\npython -m venv venv\nvenv\\Scripts\\activate.bat\npython -m pip install --upgrade pip\npython -m pip install -r requirements.txt\nvenv\\Scripts\\activate.bat\ndbt build\ndbt docs generate\ndbt docs serve\n```\n\n</details>\n\n<details>\n<summary>Windows PowerShell</summary>\n\n```shell\ngit clone https://github.com/dbt-labs/jaffle_shop_duckdb.git\ncd jaffle_shop_duckdb\npython -m venv venv\nvenv\\Scripts\\Activate.ps1\npython -m pip install --upgrade pip\npython -m pip install -r requirements.txt\nvenv\\Scripts\\Activate.ps1\ndbt build\ndbt docs generate\ndbt docs serve\n```\n\n</details>\n\n<details>\n<summary>GitHub Codespaces / Dev Containers </summary>\n\n#### Steps\n\n1. Ensure you have [Codespaces](https://github.com/features/codespaces) enabled for your GitHub organization or turned on as a beta feature if you're an individual user\n2. Click the green **Code** button on near the top right of the page of this repo's homepage (you may already be on it)\n3. Instead of cloning the repo like you normally would, instead select the **Codespaces** tab of the pop out, then \"Create codespace on `duckdb`\"\n   ![dbt_full_deploy_commands](images/open_in_codespaces.png)\n4. Wait for codespace to boot (~1 min?)\n5. Decide whether you'd like to use the Web IDE or open the codespace in your local environment\n6. When the codespace opens, a Task pane will show up and call `dbt build` just to show you how it's done\n7. Decide whether or not you'd like the recommended extensions installed (like **dbt Power User extension**)\n8. Open up a new terminal and type:\n   ```\n   dbt build\n   ```\n9. Explore some of the bells and whistles (see below)\n\nIf you don't have Codespaces or would like to just run the environment in a local Docker container, you can by:\n\n1. Install [Docker Desktop](https://www.docker.com/products/docker-desktop/)\n2. Install the VSCode [Dev Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) extension (formerly known as the \"Remote - Containers\" extension). Video tutorial [here](https://learn.microsoft.com/en-us/shows/beginners-series-to-dev-containers/installing-the-remote-containers-extension-2-of-8--beginners-series-to-dev-containers).\n3. Clone this repo and open it in VSCode\n4. First time: View > Command Palette > Remote-Containers: Open Folder in Container\n   - Wait for container to build -- expected to take several minutes\n   - Open a new terminal\n5. Subsequent times: Click **Reopen in Container** and wait for container to spin up\n   ![Reopen in Container](https://user-images.githubusercontent.com/8158673/181360469-c6f3eb94-6b65-4a8f-93a0-3438d182ee66.png)\n6. Continue on step 7 above\n\n#### bells and whistles\n\nThere's some bells and whistles defined in the [.devcontainer.json]().devcontainer.json) that are worth calling out. Also a great reference is the [Setting up VSCode for dbt](https://dbt-msft.github.io/dbt-msft-docs/docs/guides/vscode_setup/) guide.\n\n1. there is syntax highlighting provided by the `vdcode-dbt` extension. However, it is configured such that files in your `target/run` and `target/compiled` folder are not syntax highlighted, as a reminder that these files are not where you should be making changes!\n2. basic `sqlfluff` linting is enabled as you type. Syntax errors will be underlined in red at the error, and will also be surfaced in the **Problems** tab of the Terminal pane. It's configured to lint as you type.\n3. Autocompletion is enabled for generic dbt macros via the `vdcode-dbt` extension. For example, if you type `macro` you'll notice a pop up that you can select with the arrow keys then click tab to get a macro snippet.\n   ![image](https://user-images.githubusercontent.com/8158673/181362230-2c00d666-6131-4619-93aa-2e30d9c2bfea.png)\n   ![image](https://user-images.githubusercontent.com/8158673/181362274-fa7d71ff-07fc-4b4a-97c3-a0464fbe4c7d.png)\n4. the `find-related` extension allows an easy shortcut to navigating using `CMD`+`R`to jump from\n   - a model file to it's corresponding compiled version,\n   - from a compiled file to either the original model file or the version in `target/run`\n5. The `vscode-yaml` YAML, combined with the JSON schema defined in [dbt-labs/dbt-jsonschema](https://github.com/dbt-labs/dbt-jsonschema), autocomplete options while working with dbt's YAML files: i.e. :\n   - Project definition files (`dbt_project.yml`)\n   - Package files (`packages.yml`)\n   - Selectors files (`selectors.yml`)\n   - Property files (`models/whatever.yml`)\n\n</details>\n\n### Step-by-step explanation\n\nTo get up and running with this project:\n\n1. Clone this repository.\n\n1. Change into the `jaffle_shop_duck` directory from the command line:\n\n   ```shell\n   cd jaffle_shop_duckdb\n   ```\n\n1. Install dbt and DuckDB in a virtual environment.\n\n   Expand your shell below:\n\n   <details open>\n   <summary>POSIX bash/zsh</summary>\n\n   ```shell\n   python3 -m venv venv\n   source venv/bin/activate\n   python3 -m pip install --upgrade pip\n   python3 -m pip install -r requirements.txt\n   source venv/bin/activate\n   ```\n\n   </details>\n\n   <details>\n   <summary>POSIX fish</summary>\n\n   ```shell\n   python3 -m venv venv\n   source venv/bin/activate.fish\n   python3 -m pip install --upgrade pip\n   python3 -m pip install -r requirements.txt\n   source venv/bin/activate.fish\n   ```\n\n   </details>\n\n   <details>\n   <summary>POSIX csh/tcsh</summary>\n\n   ```shell\n   python3 -m venv venv\n   source venv/bin/activate.csh\n   python3 -m pip install --upgrade pip\n   python3 -m pip install -r requirements.txt\n   source venv/bin/activate.csh\n   ```\n\n   </details>\n\n   <details>\n   <summary>POSIX PowerShell Core</summary>\n\n   ```shell\n   python3 -m venv venv\n   venv/bin/Activate.ps1\n   python3 -m pip install --upgrade pip\n   python3 -m pip install -r requirements.txt\n   venv/bin/Activate.ps1\n   ```\n\n   </details>\n\n   <details>\n   <summary>Windows cmd.exe</summary>\n\n   ```shell\n   python -m venv venv\n   venv\\Scripts\\activate.bat\n   python -m pip install --upgrade pip\n   python -m pip install -r requirements.txt\n   venv\\Scripts\\activate.bat\n   ```\n\n   </details>\n\n   <details>\n   <summary>Windows PowerShell</summary>\n\n   ```shell\n   python -m venv venv\n   venv\\Scripts\\Activate.ps1\n   python -m pip install --upgrade pip\n   python -m pip install -r requirements.txt\n   venv\\Scripts\\Activate.ps1\n   ```\n\n   </details>\n\n   _Why a 2nd activation of the virtual environment?_\n   <details>\n   <summary>This may not be necessary for many users, but might be for some. Read on for a first-person report from @dbeatty10.</summary>\n\n   I use `zsh` as my shell on my MacBook Pro, and I use `pyenv` to manage my Python environments. I already had an alpha version of dbt Core 1.2 installed (and yet another via [pipx](https://pypa.github.io/pipx/installation/)):\n\n   ```shell\n   $ which dbt\n   /Users/dbeatty/.pyenv/shims/dbt\n   ```\n\n   ```shell\n   $ dbt --version\n   Core:\n     - installed: 1.2.0-a1\n     - latest:    1.1.1    - Ahead of latest version!\n\n   Plugins:\n     - bigquery:  1.2.0a1 - Ahead of latest version!\n     - snowflake: 1.2.0a1 - Ahead of latest version!\n     - redshift:  1.2.0a1 - Ahead of latest version!\n     - postgres:  1.2.0a1 - Ahead of latest version!\n   ```\n\n   Then I ran all the steps to create a virtual environment and install the requirements of our DuckDB-based Jaffle Shop repo:\n\n   ```shell\n   $ python3 -m venv venv\n   $ source venv/bin/activate\n   (venv) $ python3 -m pip install --upgrade pip\n   (venv) $ python3 -m pip install -r requirements.txt\n   ```\n\n   Let's examine where `dbt` is installed and which version it is reporting:\n\n   ```shell\n   (venv) $ which dbt\n   /Users/dbeatty/projects/jaffle_duck/venv/bin/dbt\n   ```\n\n   ```shell\n   (venv) $ dbt --version\n   Core:\n     - installed: 1.2.0-a1\n     - latest:    1.1.1    - Ahead of latest version!\n\n   Plugins:\n     - bigquery:  1.2.0a1 - Ahead of latest version!\n     - snowflake: 1.2.0a1 - Ahead of latest version!\n     - redshift:  1.2.0a1 - Ahead of latest version!\n     - postgres:  1.2.0a1 - Ahead of latest version!\n   ```\n\n   ❌ That isn't what we expected -- something isn't right. 😢\n\n   So let's reactivate the virtual environment and try again...\n\n   ```shell\n   (venv) $ source venv/bin/activate\n   ```\n\n   ```shell\n   (venv) $ dbt --version\n   Core:\n     - installed: 1.1.1\n     - latest:    1.1.1 - Up to date!\n\n   Plugins:\n     - postgres: 1.1.1 - Up to date!\n     - duckdb:   1.1.3 - Up to date!\n   ```\n\n   ✅ This is what we want -- the 2nd reactivation worked. 😎\n   </details>\n\n1. Ensure your [profile](https://docs.getdbt.com/reference/profiles.yml) is setup correctly from the command line:\n\n   ```shell\n   dbt --version\n   dbt debug\n   ```\n\n1. Load the CSVs with the demo data set, run the models, and test the output of the models using the [dbt build](https://docs.getdbt.com/reference/commands/build) command:\n\n   ```shell\n   dbt build\n   ```\n\n1. Query the data:\n\n   Launch the [DuckDB CLI](https://duckdb.org/docs/installation/?environment=cli):\n\n   ```shell\n   duckdb jaffle_shop.duckdb\n   ```\n\n   Run a query at the prompt and exit:\n\n   ```\n   select * from customers where customer_id = 42;\n   .exit\n   ```\n\n   Alternatively, use a single-liner to perform the query:\n\n   ```shell\n   duckdb jaffle_shop.duckdb -c \"select * from customers where customer_id = 42\"\n   ```\n\n   or:\n\n   ```shell\n   echo 'select * from customers where customer_id = 42' | duckdb jaffle_shop.duckdb\n   ```\n\n1. Generate and view the documentation for the project:\n   ```shell\n   dbt docs generate\n   dbt docs serve\n   ```\n\n## Running `build` steps independently\n\n1. Load the CSVs with the demo data set. This materializes the CSVs as tables in your target schema. Note that a typical dbt project **does not require this step** since dbt assumes your raw data is already in your warehouse.\n\n   ```shell\n   dbt seed\n   ```\n\n1. Run the models:\n\n   ```shell\n   dbt run\n   ```\n\n   > **NOTE:** If you decide to run this project in your own data warehouse (outside of this DuckDB demo) and steps fail, it might mean that you need to make small changes to the SQL in the models folder to adjust for the flavor of SQL of your target database. Definitely consider this if you are using a community-contributed adapter.\n\n1. Test the output of the models using the [test](https://docs.getdbt.com/reference/commands/test) command:\n   ```shell\n   dbt test\n   ```\n\n## Browsing the data\n\nSome options:\n\n- [DuckDB UI](https://duckdb.org/docs/stable/extensions/ui.html)\n- [DuckDB CLI](https://duckdb.org/docs/installation/?environment=cli)\n- [How to set up DBeaver SQL IDE for DuckDB](https://duckdb.org/docs/guides/sql_editors/dbeaver)\n\n### Troubleshooting\n\nYou may get an error like this, in which case you will need to disconnect from any sessions that are locking the database:\n\n```\nIO Error: Could not set lock on file \"jaffle_shop.duckdb\": Resource temporarily unavailable\n```\n\nThis is a known issue in DuckDB. If you are using DBeaver, this means shutting down DBeaver (merely disconnecting didn't work for me).\n\nVery worst-case, deleting the database file will get you back in action (BUT you will lose all your data).\n\n#### GitHub Codespaces and VSCode Remote Container\n\nIf you're using a privacy-forward browser such as Firefox and Brave, or a tracking-cookie-blocking extension like UBlock Origin or Privacy Badger, you may see the below error. You can either change your cookie settings, use a browser like Chrome, or just ignore the error because it doesn't affect the demo\n\n![image](https://user-images.githubusercontent.com/8158673/181361459-294f807c-d990-4366-a4ab-d91cefcbc820.png)\n\n---\n\nFor more information on dbt:\n\n- Read the [introduction to dbt](https://docs.getdbt.com/docs/introduction)\n- Read the [dbt viewpoint](https://docs.getdbt.com/docs/about/viewpoint)\n- Join the [dbt Community](http://community.getdbt.com/)\n"
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/RELEASE.md",
    "content": "# Release instructions\n\n1. Update dependencies in `pyproject.toml` as needed.\n1. Run `uv lock` to update the lockfile:\n   ```shell\n   uv lock\n   ```\n1. Regenerate `requirements.txt` for pip users:\n   ```shell\n   uv pip compile pyproject.toml -o requirements.txt\n   ```\n1. Commit the result.\n1. Open a PR.\n"
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/dbt-completion.bash",
    "content": "#/usr/bin/env bash\n\n# OVERVIEW\n#   Adds autocompletion to dbt CLI by:\n#       1. Finding the root of the repo (identified by dbt_project.yml\n#       2. Parsing target/manifest.json file, extracting valid model selectors\n#       3. Doing some bash magic to autocomplete selectors for:\n#           -m\n#           --model[s]\n#           -s\n#           --select\n#           --exclude\n#\n# NOTE: This script uses the manifest (assumed to be at target/manifest.json)\n#       to _quickly_ provide a list of existing selectors. As such, a dbt\n#       resource must be compiled before it will be available for tab completion.\n#       In the future, this script should use dbt directly to parse the project\n#       directory and generate possible selectors. Until then, brand new\n#       models/sources/tags/packages will not be displayed in the tab complete menu\n#\n# INSTALLATION\n#   1. Copy dbt-completion.bash to your home directory (as a dotfile, probably)\n#     cp dbt-completion.bash ~/.dbt-completion.bash\n#\n#   2. Source it\n#     source ~/.dbt-completion.bash\n#\n#   3. Install it into your ~/.profile file\n#     echo 'source ~/.dbt-completion.bash' >> ~/.bash_profile\n#\n#   4. Use it with:\n#     dbt run --models snow<tab>\n#\n#\n# CREDITS\n#   Made possible by this great tutorial on bash completion:\n#   https://iridakos.com/tutorials/2018/03/01/bash-programmable-completion-tutorial.html\n#\n#  Inspired by git-completion.bash\n#  https://github.com/git/git/blob/master/contrib/completion/git-completion.bash\n\n\n# Inline a python script so we can deploy this as a single file\n# the idea of doing this in bash natively is... daunting\n_parse_manifest() {\nmanifest_path=$1\nprefix=$2\nprog=$(cat <<EOF\n# Use a big try/catch so any errors (maybe from a corrupted or\n# missing manifest?) are not printed on tab-complete\n\ntry:\n    import fileinput, json, sys\n\n    # If a prefix is given as an argument, include it in the\n    # generated selector list. The bash completion logic below\n    # will match these generated selectors against partially\n    # written args when table completed. This helps the script\n    # match selectors when a user does something like:\n    #   dbt run --models +order<tab>\n\n    prefix = sys.argv.pop() if len(sys.argv) == 2 else \"\"\n\n    manifest = json.loads(\"\\n\".join([line for line in fileinput.input()]))\n\n    models = set(\n        \"{}{}\".format(prefix, node['name'])\n        for node in manifest['nodes'].values()\n        if node['resource_type'] in ['model', 'seed']\n    )\n\n    tags = set(\n        \"{}tag:{}\".format(prefix, tag)\n        for node in manifest['nodes'].values()\n        for tag in node.get('tags', [])\n        if node['resource_type'] == 'model'\n    )\n\n    # The + prefix for sources is not sensible, but allowed.\n    # This script shouldn't be opinionated about these things\n    sources = set(\n        \"{}source:{}\".format(prefix, node['source_name'])\n        for node in manifest['nodes'].values()\n        if node['resource_type'] == 'source'\n    ) | set(\n        \"{}source:{}.{}\".format(prefix, node['source_name'], node['name'])\n        for node in manifest['nodes'].values()\n        if node['resource_type'] == 'source'\n    )\n\n    # Generate partial Fully Qualified Names with a wildcard\n    # suffix. This matches things like directories and packag names\n    fqns = set(\n        \"{}{}.*\".format(prefix, \".\".join(node['fqn'][:i-1]))\n        for node in manifest['nodes'].values()\n        for i in range(len(node.get('fqn', [])))\n        if node['resource_type'] == 'model'\n    )\n\n    selectors = [\n        selector\n        for selector in (models | tags | sources | fqns)\n        if selector != ''\n    ]\n\n    print(\"\\n\".join(selectors))\nexcept Exception as e:\n    print(e)\n    # oops!\n    pass\nEOF\n)\n\ncat \"$manifest_path\" | python -c \"$prog\" $prefix\n}\n\n# Iterate backwards in the arg list from the index\n# and return the first flag that we find (ie. an\n# argument that begins with a '-'\n_get_last_flag() {\n    arg_index=$1\n    shift\n    arg_list=(\"$@\")\n\n    first_flag=\"\"\n    for i in $(seq $arg_index -1 0); do\n        arg=${arg_list[$i]}\n        if [[ $arg == -* ]] ; then\n            first_flag=$arg\n            break\n        fi\n    done\n\n    echo $first_flag\n}\n\n# Return 0 if the supplied flag accepts a selector as an argument\n# or 1 if it does not. Python's argparse supports flag prefixes\n# so, this method matches both --model and --models. Probably not\n# appropriate to support prefixes of exclude, for instance\n_flag_is_selector() {\n    flag=$1\n\n    if [[ $flag == '-m' ]] || \\\n       [[ $flag == --model* ]] || \\\n       [[ $flag == '-s' ]] || \\\n       [[ $flag == '--select' ]] || \\\n       [[ $flag ==  '--exclude' ]] ;\n    then\n        echo 0\n    else\n        echo 1\n    fi\n}\n\n# Pluck out and return the first character in the arg if it is\n# a supported node selection modifier (ie. + or @)\n_get_arg_prefix() {\n    arg=$1\n    first_char=${arg:0:1}\n    if [[ $first_char == '+' ]] || [[ $first_char == '@' ]] ; then\n        echo \"$first_char\"\n    else\n        echo \"\"\n    fi\n}\n\n# Walk up the filesystem until we find a dbt_project.yml file,\n# then return the path which contains it (if found)\n_get_project_root() {\n  slashes=${PWD//[^\\/]/}\n  directory=\"$PWD\"\n  for (( n=${#slashes}; n>0; --n ))\n  do\n    test -e \"$directory/dbt_project.yml\" && echo \"$directory\" && return\n    directory=\"$directory/..\"\n  done\n}\n\n\n# Core bash completion logic\n_complete_it() {\n    # Requires bash-completion, used to handle ':' chars in args\n    if [[ -n \"$BASH\" ]] && [[ $(type -t _get_comp_words_by_ref) == 'function' ]]; then\n        local cur\n        _get_comp_words_by_ref -n : cur\n    fi\n\n    # Find the first present flag to the left of the cursor, then\n    # determine if the flag operates as a node selector\n    last_flag=$(_get_last_flag $COMP_CWORD \"${COMP_WORDS[@]}\")\n    is_selector=$(_flag_is_selector $last_flag)\n\n    if [[ $is_selector == 0 ]] ; then\n        current_arg=\"${COMP_WORDS[$COMP_CWORD]}\"\n        prefix=$(_get_arg_prefix $current_arg)\n        project_dir=$(_get_project_root)\n        manifest_path=\"${project_dir}/target/manifest.json\"\n\n        # Bail out if we can't find a manifest\n        if [ ! -f \"$manifest_path\" ] ; then\n            return\n        fi\n\n        selectors=$(_parse_manifest \"$manifest_path\" $prefix)\n\n        # If the cursor is in the middle of a flag, don't try to tab complete\n        # it. This would lead to errors with compgen. Otherwise, supply the\n        # possible selectors to the compgen program\n        if [[ $current_arg == -* ]] ; then\n            COMPREPLY=($(compgen -W \"$selectors\" \"\"))\n        else\n            COMPREPLY=($(compgen -W \"$selectors\" \"$current_arg\"))\n        fi\n\n        # Requires bash-completion, used to handle ':' chars in args\n        if [[ -n \"$BASH\" ]] && [[ $(type -t __ltrim_colon_completions ) == 'function' ]] ; then\n            __ltrim_colon_completions \"$cur\"\n        fi\n    fi\n}\n\ncomplete -F _complete_it dbt\n"
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/dbt_project.yml",
    "content": "name: 'jaffle_shop'\n\nconfig-version: 2\nversion: '0.1'\n\nprofile: 'jaffle_shop'\n\nmodel-paths: [\"models\"]\nseed-paths: [\"seeds\"]\ntest-paths: [\"tests\"]\nanalysis-paths: [\"analysis\"]\nmacro-paths: [\"macros\"]\n\ntarget-path: \"target\"\nclean-targets:\n    - \"target\"\n    - \"dbt_modules\"\n    - \"logs\"\n\nrequire-dbt-version: [\">=1.11.0\", \"<2.0.0\"]\n\nseeds: \n  +docs:\n    node_color: '#cd7f32'\n\nmodels:\n  jaffle_shop:\n    +materialized: table\n    staging:\n      +materialized: view\n      +docs:\n        node_color: 'silver'\n    +docs:\n      node_color: 'gold'\n"
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/etc/dbdiagram_definition.txt",
    "content": "Table orders {\n  id int PK\n  user_id int\n  order_date date\n  status varchar\n}\n\nTable payments {\n  id int\n  order_id int\n  payment_method int\n  amount int\n}\n\nTable customers {\n  id int PK\n  first_name varchar\n  last_name varchar\n}\n\nRef: orders.user_id > customers.id\n\nRef: payments.order_id > orders.id\n"
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/models/customers.sql",
    "content": "with customers as (\n\n    select * from {{ ref('stg_customers') }}\n\n),\n\norders as (\n\n    select * from {{ ref('stg_orders') }}\n\n),\n\npayments as (\n\n    select * from {{ ref('stg_payments') }}\n\n),\n\ncustomer_orders as (\n\n        select\n        customer_id,\n\n        min(order_date) as first_order,\n        max(order_date) as most_recent_order,\n        count(order_id) as number_of_orders\n    from orders\n\n    group by customer_id\n\n),\n\ncustomer_payments as (\n\n    select\n        orders.customer_id,\n        sum(amount) as total_amount\n\n    from payments\n\n    left join orders on\n         payments.order_id = orders.order_id\n\n    group by orders.customer_id\n\n),\n\nfinal as (\n\n    select\n        customers.customer_id,\n        customers.first_name,\n        customers.last_name,\n        customer_orders.first_order,\n        customer_orders.most_recent_order,\n        customer_orders.number_of_orders,\n        customer_payments.total_amount as customer_lifetime_value\n\n    from customers\n\n    left join customer_orders\n        on customers.customer_id = customer_orders.customer_id\n\n    left join customer_payments\n        on  customers.customer_id = customer_payments.customer_id\n\n)\n\nselect * from final\n"
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/models/docs.md",
    "content": "{% docs orders_status %}\n\nOrders can be one of the following statuses:\n\n| status         | description                                                                                                            |\n| -------------- | ---------------------------------------------------------------------------------------------------------------------- |\n| placed         | The order has been placed but has not yet left the warehouse                                                           |\n| shipped        | The order has ben shipped to the customer and is currently in transit                                                  |\n| completed      | The order has been received by the customer                                                                            |\n| return_pending | The customer has indicated that they would like to return the order, but it has not yet been received at the warehouse |\n| returned       | The order has been returned by the customer and received at the warehouse                                              |\n\n{% enddocs %}\n"
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/models/orders.sql",
    "content": "{% set payment_methods = ['credit_card', 'coupon', 'bank_transfer', 'gift_card'] %}\n\nwith orders as (\n\n    select * from {{ ref('stg_orders') }}\n\n),\n\npayments as (\n\n    select * from {{ ref('stg_payments') }}\n\n),\n\norder_payments as (\n\n    select\n        order_id,\n\n        {% for payment_method in payment_methods -%}\n        sum(case when payment_method = '{{ payment_method }}' then amount else 0 end) as {{ payment_method }}_amount,\n        {% endfor -%}\n\n        sum(amount) as total_amount\n\n    from payments\n\n    group by order_id\n\n),\n\nfinal as (\n\n    select\n        orders.order_id,\n        orders.customer_id,\n        orders.order_date,\n        orders.status,\n\n        {% for payment_method in payment_methods -%}\n\n        order_payments.{{ payment_method }}_amount,\n\n        {% endfor -%}\n\n        order_payments.total_amount as amount\n\n    from orders\n\n\n    left join order_payments\n        on orders.order_id = order_payments.order_id\n\n)\n\nselect * from final\n"
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/models/overview.md",
    "content": "{% docs __overview__ %}\n\n## Data Documentation for Jaffle Shop\n\n`jaffle_shop` is a fictional ecommerce store.\n\nThis [dbt](https://www.getdbt.com/) project is for testing out code.\n\nThe source code can be found [here](https://github.com/dbt-labs/jaffle_shop_duckdb).\n\n{% enddocs %}\n"
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/models/schema.yml",
    "content": "version: 2\n\nmodels:\n  - name: customers\n    description: This table has basic information about a customer, as well as some derived facts based on a customer's orders\n\n    columns:\n      - name: customer_id\n        description: This is a unique identifier for a customer\n        tests:\n          - unique\n          - not_null\n\n      - name: first_name\n        description: Customer's first name. PII.\n\n      - name: last_name\n        description: Customer's last name. PII.\n\n      - name: first_order\n        description: Date (UTC) of a customer's first order\n\n      - name: most_recent_order\n        description: Date (UTC) of a customer's most recent order\n\n      - name: number_of_orders\n        description: Count of the number of orders a customer has placed\n\n      - name: total_order_amount\n        description: Total value (AUD) of a customer's orders\n\n  - name: orders\n    description: This table has basic information about orders, as well as some derived facts based on payments\n\n    columns:\n      - name: order_id\n        tests:\n          - unique\n          - not_null\n        description: This is a unique identifier for an order\n\n      - name: customer_id\n        description: Foreign key to the customers table\n        tests:\n          - not_null\n          - relationships:\n              arguments:\n                to: ref('customers')\n                field: customer_id\n\n      - name: order_date\n        description: Date (UTC) that the order was placed\n\n      - name: status\n        description: '{{ doc(\"orders_status\") }}'\n        tests:\n          - accepted_values:\n              arguments:\n                values: ['placed', 'shipped', 'completed', 'return_pending', 'returned']\n\n      - name: amount\n        description: Total amount (AUD) of the order\n        tests:\n          - not_null\n\n      - name: credit_card_amount\n        description: Amount of the order (AUD) paid for by credit card\n        tests:\n          - not_null\n\n      - name: coupon_amount\n        description: Amount of the order (AUD) paid for by coupon\n        tests:\n          - not_null\n\n      - name: bank_transfer_amount\n        description: Amount of the order (AUD) paid for by bank transfer\n        tests:\n          - not_null\n\n      - name: gift_card_amount\n        description: Amount of the order (AUD) paid for by gift card\n        tests:\n          - not_null\n"
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/models/staging/schema.yml",
    "content": "version: 2\n\nmodels:\n  - name: stg_customers\n    columns:\n      - name: customer_id\n        tests:\n          - unique\n          - not_null\n\n  - name: stg_orders\n    columns:\n      - name: order_id\n        tests:\n          - unique\n          - not_null\n      - name: status\n        tests:\n          - accepted_values:\n              arguments:\n                values: ['placed', 'shipped', 'completed', 'return_pending', 'returned']\n\n  - name: stg_payments\n    columns:\n      - name: payment_id\n        tests:\n          - unique\n          - not_null\n      - name: payment_method\n        tests:\n          - accepted_values:\n              arguments:\n                values: ['credit_card', 'coupon', 'bank_transfer', 'gift_card']\n"
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/models/staging/stg_customers.sql",
    "content": "with source as (\n\n    {#-\n    Normally we would select from the table here, but we are using seeds to load\n    our data in this project\n    #}\n    select * from {{ ref('raw_customers') }}\n\n),\n\nrenamed as (\n\n    select\n        id as customer_id,\n        first_name,\n        last_name\n\n    from source\n\n)\n\nselect * from renamed\n"
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/models/staging/stg_orders.sql",
    "content": "with source as (\n\n    {#-\n    Normally we would select from the table here, but we are using seeds to load\n    our data in this project\n    #}\n    select * from {{ ref('raw_orders') }}\n\n),\n\nrenamed as (\n\n    select\n        id as order_id,\n        user_id as customer_id,\n        order_date,\n        status\n\n    from source\n\n)\n\nselect * from renamed\n"
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/models/staging/stg_payments.sql",
    "content": "with source as (\n    \n    {#-\n    Normally we would select from the table here, but we are using seeds to load\n    our data in this project\n    #}\n    select * from {{ ref('raw_payments') }}\n\n),\n\nrenamed as (\n\n    select\n        id as payment_id,\n        order_id,\n        payment_method,\n\n        -- `amount` is currently stored in cents, so we convert it to dollars\n        amount / 100 as amount\n\n    from source\n\n)\n\nselect * from renamed\n"
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/profiles.yml",
    "content": "jaffle_shop:\n\n  target: dev\n  outputs:\n    dev:\n      type: duckdb\n      path: 'jaffle_shop.duckdb'\n      threads: 24\n"
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/pyproject.toml",
    "content": "[project]\nname = \"jaffle-shop\"\nversion = \"0.1.0\"\ndescription = \"A self-contained dbt project using DuckDB\"\nrequires-python = \">=3.13\"\ndependencies = [\n    \"dbt-duckdb>=1.10.1\",\n    \"dbt-core>=1.11.0\",\n    \"sqlfluff>=3\",\n    # Constrain chardet to avoid RequestsDependencyWarning from requests\n    \"chardet<6\",\n]\n"
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/requirements.txt",
    "content": "# This file was autogenerated by uv via the following command:\n#    uv pip compile pyproject.toml -o requirements.txt\nagate==1.9.1\n    # via\n    #   dbt-adapters\n    #   dbt-common\n    #   dbt-core\nannotated-types==0.7.0\n    # via pydantic\nattrs==25.4.0\n    # via\n    #   jsonschema\n    #   referencing\nbabel==2.18.0\n    # via agate\ncertifi==2026.2.25\n    # via requests\nchardet==5.2.0\n    # via\n    #   jaffle-shop (pyproject.toml)\n    #   diff-cover\n    #   sqlfluff\ncharset-normalizer==3.4.4\n    # via requests\nclick==8.3.1\n    # via\n    #   dbt-core\n    #   dbt-semantic-interfaces\n    #   sqlfluff\ncolorama==0.4.6\n    # via\n    #   dbt-common\n    #   sqlfluff\ndaff==1.4.2\n    # via dbt-core\ndbt-adapters==1.22.6\n    # via\n    #   dbt-core\n    #   dbt-duckdb\ndbt-common==1.37.2\n    # via\n    #   dbt-adapters\n    #   dbt-core\n    #   dbt-duckdb\ndbt-core==1.11.6\n    # via\n    #   jaffle-shop (pyproject.toml)\n    #   dbt-duckdb\ndbt-duckdb==1.10.1\n    # via jaffle-shop (pyproject.toml)\ndbt-extractor==0.6.0\n    # via dbt-core\ndbt-protos==1.0.431\n    # via\n    #   dbt-adapters\n    #   dbt-common\n    #   dbt-core\ndbt-semantic-interfaces==0.9.0\n    # via dbt-core\ndeepdiff==8.6.1\n    # via dbt-common\ndiff-cover==10.2.0\n    # via sqlfluff\nduckdb==1.4.4\n    # via dbt-duckdb\nidna==3.11\n    # via requests\nimportlib-metadata==8.7.1\n    # via dbt-semantic-interfaces\niniconfig==2.3.0\n    # via pytest\nisodate==0.7.2\n    # via\n    #   agate\n    #   dbt-common\njinja2==3.1.6\n    # via\n    #   dbt-common\n    #   dbt-core\n    #   dbt-semantic-interfaces\n    #   diff-cover\n    #   sqlfluff\njsonschema==4.26.0\n    # via\n    #   dbt-common\n    #   dbt-core\n    #   dbt-semantic-interfaces\njsonschema-specifications==2025.9.1\n    # via jsonschema\nleather==0.4.1\n    # via agate\nmarkupsafe==3.0.3\n    # via jinja2\nmashumaro==3.14\n    # via\n    #   dbt-adapters\n    #   dbt-common\n    #   dbt-core\nmore-itertools==10.8.0\n    # via dbt-semantic-interfaces\nmsgpack==1.1.2\n    # via mashumaro\nnetworkx==3.6.1\n    # via dbt-core\norderly-set==5.5.0\n    # via deepdiff\npackaging==26.0\n    # via\n    #   dbt-core\n    #   pytest\nparsedatetime==2.6\n    # via agate\npathspec==0.12.1\n    # via\n    #   dbt-common\n    #   dbt-core\n    #   sqlfluff\nplatformdirs==4.9.2\n    # via sqlfluff\npluggy==1.6.0\n    # via\n    #   diff-cover\n    #   pytest\nprotobuf==6.33.5\n    # via\n    #   dbt-adapters\n    #   dbt-common\n    #   dbt-core\n    #   dbt-protos\npydantic==2.12.5\n    # via\n    #   dbt-core\n    #   dbt-semantic-interfaces\npydantic-core==2.41.5\n    # via pydantic\npygments==2.19.2\n    # via\n    #   diff-cover\n    #   pytest\npytest==9.0.2\n    # via sqlfluff\npython-dateutil==2.9.0.post0\n    # via\n    #   dbt-common\n    #   dbt-semantic-interfaces\npython-slugify==8.0.4\n    # via agate\npytimeparse==1.1.8\n    # via agate\npytz==2025.2\n    # via\n    #   dbt-adapters\n    #   dbt-core\npyyaml==6.0.3\n    # via\n    #   dbt-core\n    #   dbt-semantic-interfaces\n    #   sqlfluff\nreferencing==0.37.0\n    # via\n    #   jsonschema\n    #   jsonschema-specifications\nregex==2026.2.28\n    # via sqlfluff\nrequests==2.32.5\n    # via\n    #   dbt-common\n    #   dbt-core\n    #   snowplow-tracker\nrpds-py==0.30.0\n    # via\n    #   jsonschema\n    #   referencing\nsix==1.17.0\n    # via python-dateutil\nsnowplow-tracker==1.1.0\n    # via dbt-core\nsqlfluff==4.0.4\n    # via jaffle-shop (pyproject.toml)\nsqlparse==0.5.4\n    # via dbt-core\ntblib==3.2.2\n    # via sqlfluff\ntext-unidecode==1.3\n    # via python-slugify\ntqdm==4.67.3\n    # via sqlfluff\ntyping-extensions==4.15.0\n    # via\n    #   dbt-adapters\n    #   dbt-common\n    #   dbt-core\n    #   dbt-semantic-interfaces\n    #   mashumaro\n    #   pydantic\n    #   pydantic-core\n    #   snowplow-tracker\n    #   typing-inspection\ntyping-inspection==0.4.2\n    # via pydantic\nurllib3==2.6.3\n    # via requests\nzipp==3.23.0\n    # via importlib-metadata\n"
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/seeds/.gitkeep",
    "content": ""
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/seeds/raw_customers.csv",
    "content": "id,first_name,last_name\n1,Michael,P.\n2,Shawn,M.\n3,Kathleen,P.\n4,Jimmy,C.\n5,Katherine,R.\n6,Sarah,R.\n7,Martin,M.\n8,Frank,R.\n9,Jennifer,F.\n10,Henry,W.\n11,Fred,S.\n12,Amy,D.\n13,Kathleen,M.\n14,Steve,F.\n15,Teresa,H.\n16,Amanda,H.\n17,Kimberly,R.\n18,Johnny,K.\n19,Virginia,F.\n20,Anna,A.\n21,Willie,H.\n22,Sean,H.\n23,Mildred,A.\n24,David,G.\n25,Victor,H.\n26,Aaron,R.\n27,Benjamin,B.\n28,Lisa,W.\n29,Benjamin,K.\n30,Christina,W.\n31,Jane,G.\n32,Thomas,O.\n33,Katherine,M.\n34,Jennifer,S.\n35,Sara,T.\n36,Harold,O.\n37,Shirley,J.\n38,Dennis,J.\n39,Louise,W.\n40,Maria,A.\n41,Gloria,C.\n42,Diana,S.\n43,Kelly,N.\n44,Jane,R.\n45,Scott,B.\n46,Norma,C.\n47,Marie,P.\n48,Lillian,C.\n49,Judy,N.\n50,Billy,L.\n51,Howard,R.\n52,Laura,F.\n53,Anne,B.\n54,Rose,M.\n55,Nicholas,R.\n56,Joshua,K.\n57,Paul,W.\n58,Kathryn,K.\n59,Adam,A.\n60,Norma,W.\n61,Timothy,R.\n62,Elizabeth,P.\n63,Edward,G.\n64,David,C.\n65,Brenda,W.\n66,Adam,W.\n67,Michael,H.\n68,Jesse,E.\n69,Janet,P.\n70,Helen,F.\n71,Gerald,C.\n72,Kathryn,O.\n73,Alan,B.\n74,Harry,A.\n75,Andrea,H.\n76,Barbara,W.\n77,Anne,W.\n78,Harry,H.\n79,Jack,R.\n80,Phillip,H.\n81,Shirley,H.\n82,Arthur,D.\n83,Virginia,R.\n84,Christina,R.\n85,Theresa,M.\n86,Jason,C.\n87,Phillip,B.\n88,Adam,T.\n89,Margaret,J.\n90,Paul,P.\n91,Todd,W.\n92,Willie,O.\n93,Frances,R.\n94,Gregory,H.\n95,Lisa,P.\n96,Jacqueline,A.\n97,Shirley,D.\n98,Nicole,M.\n99,Mary,G.\n100,Jean,M.\n"
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/seeds/raw_orders.csv",
    "content": "id,user_id,order_date,status\n1,1,2018-01-01,returned\n2,3,2018-01-02,completed\n3,94,2018-01-04,completed\n4,50,2018-01-05,completed\n5,64,2018-01-05,completed\n6,54,2018-01-07,completed\n7,88,2018-01-09,completed\n8,2,2018-01-11,returned\n9,53,2018-01-12,completed\n10,7,2018-01-14,completed\n11,99,2018-01-14,completed\n12,59,2018-01-15,completed\n13,84,2018-01-17,completed\n14,40,2018-01-17,returned\n15,25,2018-01-17,completed\n16,39,2018-01-18,completed\n17,71,2018-01-18,completed\n18,64,2018-01-20,returned\n19,54,2018-01-22,completed\n20,20,2018-01-23,completed\n21,71,2018-01-23,completed\n22,86,2018-01-24,completed\n23,22,2018-01-26,return_pending\n24,3,2018-01-27,completed\n25,51,2018-01-28,completed\n26,32,2018-01-28,completed\n27,94,2018-01-29,completed\n28,8,2018-01-29,completed\n29,57,2018-01-31,completed\n30,69,2018-02-02,completed\n31,16,2018-02-02,completed\n32,28,2018-02-04,completed\n33,42,2018-02-04,completed\n34,38,2018-02-06,completed\n35,80,2018-02-08,completed\n36,85,2018-02-10,completed\n37,1,2018-02-10,completed\n38,51,2018-02-10,completed\n39,26,2018-02-11,completed\n40,33,2018-02-13,completed\n41,99,2018-02-14,completed\n42,92,2018-02-16,completed\n43,31,2018-02-17,completed\n44,66,2018-02-17,completed\n45,22,2018-02-17,completed\n46,6,2018-02-19,completed\n47,50,2018-02-20,completed\n48,27,2018-02-21,completed\n49,35,2018-02-21,completed\n50,51,2018-02-23,completed\n51,71,2018-02-24,completed\n52,54,2018-02-25,return_pending\n53,34,2018-02-26,completed\n54,54,2018-02-26,completed\n55,18,2018-02-27,completed\n56,79,2018-02-28,completed\n57,93,2018-03-01,completed\n58,22,2018-03-01,completed\n59,30,2018-03-02,completed\n60,12,2018-03-03,completed\n61,63,2018-03-03,completed\n62,57,2018-03-05,completed\n63,70,2018-03-06,completed\n64,13,2018-03-07,completed\n65,26,2018-03-08,completed\n66,36,2018-03-10,completed\n67,79,2018-03-11,completed\n68,53,2018-03-11,completed\n69,3,2018-03-11,completed\n70,8,2018-03-12,completed\n71,42,2018-03-12,shipped\n72,30,2018-03-14,shipped\n73,19,2018-03-16,completed\n74,9,2018-03-17,shipped\n75,69,2018-03-18,completed\n76,25,2018-03-20,completed\n77,35,2018-03-21,shipped\n78,90,2018-03-23,shipped\n79,52,2018-03-23,shipped\n80,11,2018-03-23,shipped\n81,76,2018-03-23,shipped\n82,46,2018-03-24,shipped\n83,54,2018-03-24,shipped\n84,70,2018-03-26,placed\n85,47,2018-03-26,shipped\n86,68,2018-03-26,placed\n87,46,2018-03-27,placed\n88,91,2018-03-27,shipped\n89,21,2018-03-28,placed\n90,66,2018-03-30,shipped\n91,47,2018-03-31,placed\n92,84,2018-04-02,placed\n93,66,2018-04-03,placed\n94,63,2018-04-03,placed\n95,27,2018-04-04,placed\n96,90,2018-04-06,placed\n97,89,2018-04-07,placed\n98,41,2018-04-07,placed\n99,85,2018-04-09,placed\n"
  },
  {
    "path": "test-fixtures/jaffle-shop-duckdb/seeds/raw_payments.csv",
    "content": "id,order_id,payment_method,amount\n1,1,credit_card,1000\n2,2,credit_card,2000\n3,3,coupon,100\n4,4,coupon,2500\n5,5,bank_transfer,1700\n6,6,credit_card,600\n7,7,credit_card,1600\n8,8,credit_card,2300\n9,9,gift_card,2300\n10,9,bank_transfer,0\n11,10,bank_transfer,2600\n12,11,credit_card,2700\n13,12,credit_card,100\n14,13,credit_card,500\n15,13,bank_transfer,1400\n16,14,bank_transfer,300\n17,15,coupon,2200\n18,16,credit_card,1000\n19,17,bank_transfer,200\n20,18,credit_card,500\n21,18,credit_card,800\n22,19,gift_card,600\n23,20,bank_transfer,1500\n24,21,credit_card,1200\n25,22,bank_transfer,800\n26,23,gift_card,2300\n27,24,coupon,2600\n28,25,bank_transfer,2000\n29,25,credit_card,2200\n30,25,coupon,1600\n31,26,credit_card,3000\n32,27,credit_card,2300\n33,28,bank_transfer,1900\n34,29,bank_transfer,1200\n35,30,credit_card,1300\n36,31,credit_card,1200\n37,32,credit_card,300\n38,33,credit_card,2200\n39,34,bank_transfer,1500\n40,35,credit_card,2900\n41,36,bank_transfer,900\n42,37,credit_card,2300\n43,38,credit_card,1500\n44,39,bank_transfer,800\n45,40,credit_card,1400\n46,41,credit_card,1700\n47,42,coupon,1700\n48,43,gift_card,1800\n49,44,gift_card,1100\n50,45,bank_transfer,500\n51,46,bank_transfer,800\n52,47,credit_card,2200\n53,48,bank_transfer,300\n54,49,credit_card,600\n55,49,credit_card,900\n56,50,credit_card,2600\n57,51,credit_card,2900\n58,51,credit_card,100\n59,52,bank_transfer,1500\n60,53,credit_card,300\n61,54,credit_card,1800\n62,54,bank_transfer,1100\n63,55,credit_card,2900\n64,56,credit_card,400\n65,57,bank_transfer,200\n66,58,coupon,1800\n67,58,gift_card,600\n68,59,gift_card,2800\n69,60,credit_card,400\n70,61,bank_transfer,1600\n71,62,gift_card,1400\n72,63,credit_card,2900\n73,64,bank_transfer,2600\n74,65,credit_card,0\n75,66,credit_card,2800\n76,67,bank_transfer,400\n77,67,credit_card,1900\n78,68,credit_card,1600\n79,69,credit_card,1900\n80,70,credit_card,2600\n81,71,credit_card,500\n82,72,credit_card,2900\n83,73,bank_transfer,300\n84,74,credit_card,3000\n85,75,credit_card,1900\n86,76,coupon,200\n87,77,credit_card,0\n88,77,bank_transfer,1900\n89,78,bank_transfer,2600\n90,79,credit_card,1800\n91,79,credit_card,900\n92,80,gift_card,300\n93,81,coupon,200\n94,82,credit_card,800\n95,83,credit_card,100\n96,84,bank_transfer,2500\n97,85,bank_transfer,1700\n98,86,coupon,2300\n99,87,gift_card,3000\n100,87,credit_card,2600\n101,88,credit_card,2900\n102,89,bank_transfer,2200\n103,90,bank_transfer,200\n104,91,credit_card,1900\n105,92,bank_transfer,1500\n106,92,coupon,200\n107,93,gift_card,2600\n108,94,coupon,700\n109,95,coupon,2400\n110,96,gift_card,1700\n111,97,bank_transfer,1400\n112,98,bank_transfer,1000\n113,99,credit_card,2400\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"module\": \"commonjs\",\n    \"target\": \"ES2020\",\n    \"outDir\": \"out\",\n    \"lib\": [\"ES2020\"],\n    \"sourceMap\": true,\n    \"rootDir\": \"src\",\n    // \"rootDirs\": [\"src\", \"../altimate-dbt-integration/src\"],\n    \"strict\": true,\n    \"skipLibCheck\": true,\n    \"resolveJsonModule\": true,\n    \"esModuleInterop\": true,\n    \"allowJs\": true,\n    \"checkJs\": false,\n    \"moduleResolution\": \"node\",\n    \"types\": [\"node\", \"jest\", \"mocha\", \"vscode\"],\n    \"baseUrl\": \".\",\n    \"paths\": {\n      // \"@altimateai/dbt-integration\": [\"../altimate-dbt-integration/src/index.ts\"],\n      \"@extension\": [\"./src/modules.ts\"],\n      \"@lib\": [\"./src/lib/index\"]\n    },\n    \"experimentalDecorators\": true,\n    \"emitDecoratorMetadata\": true\n  },\n  \"include\": [\"src/**/*\"],\n  \"exclude\": [\"node_modules\", \".vscode-test\", \"webview_panels\", \"dist\", \"out\"]\n}\n"
  },
  {
    "path": "typings.d.ts",
    "content": "declare module \"*.json\";\n"
  },
  {
    "path": "webview_panels/.eslintrc.cjs",
    "content": "const typescriptRules = require(\"./eslint/typescript.cjs\");\n\nconst isPreCommit = process.env.PRE_COMMIT === \"true\";\n\nmodule.exports = {\n  root: true,\n  env: { browser: true, es2020: true },\n  extends: [\n    \"eslint:recommended\",\n    \"plugin:react/recommended\",\n    \"plugin:react/jsx-runtime\",\n    \"plugin:@typescript-eslint/recommended-type-checked\",\n    \"plugin:@typescript-eslint/stylistic-type-checked\",\n    \"prettier\",\n    \"plugin:you-dont-need-lodash-underscore/compatible\",\n    \"plugin:storybook/recommended\",\n  ],\n  ignorePatterns: [\"dist\", \".eslintrc.cjs\", \"src/lib/altimate/*\"],\n  parser: \"@typescript-eslint/parser\",\n  settings: {\n    react: {\n      version: \"detect\",\n    },\n  },\n  parserOptions: {\n    ecmaVersion: \"latest\",\n    extraFileExtensions: [\".json\"],\n    sourceType: \"module\",\n    project: [\"./tsconfig.json\", \"./tsconfig.node.json\"],\n    tsconfigRootDir: __dirname,\n    ecmaFeatures: {\n      jsx: true,\n    },\n  },\n  plugins: [\n    \"react\",\n    \"@typescript-eslint\",\n    \"jest\",\n    \"testing-library\",\n    \"typescript-sort-keys\",\n    \"promise\",\n    \"react-refresh\",\n  ],\n  rules: {\n    ...typescriptRules,\n    \"react-refresh/only-export-components\": [\n      \"warn\",\n      { allowConstantExport: true },\n    ],\n    \"no-console\": \"error\",\n    \"class-methods-use-this\": \"off\",\n    // import\n    \"import/no-extraneous-dependencies\": \"off\", // off because there are too many false positives\n    \"import/extensions\": \"off\", // off because having file extensions is unnecessary\n    \"import/no-default-export\": \"off\",\n    \"import/prefer-default-export\": \"off\",\n\n    // react\n    \"react/react-in-jsx-scope\": \"off\", // off because unnecessary for react 17+\n    \"react/prop-types\": \"off\", // off because it's not able to correctly evaluate TS prop types\n    \"react/require-default-props\": \"off\", // off because it's not able to correctly evaluate TS prop types\n    \"react/jsx-no-target-blank\": [\"error\", { allowReferrer: false }], // allowReferrer is disabled because we don't support IE\n    \"react/jsx-props-no-spreading\": \"off\", // off because prop spreading is useful\n    \"react/no-unused-prop-types\": \"warn\", // warn because of occasional false positives\n\n    /** next rules require whole codebase TS transpiling */\n    \"@typescript-eslint/dot-notation\": isPreCommit ? \"off\" : \"warn\",\n    \"@typescript-eslint/no-implied-eval\": isPreCommit ? \"off\" : \"error\",\n    \"@typescript-eslint/no-throw-literal\": isPreCommit ? \"off\" : \"error\",\n    \"@typescript-eslint/return-await\": isPreCommit ? \"off\" : \"warn\", // Redundant use of `await` on a return value\n    \"@typescript-eslint/default-param-last\": \"off\", //off because it conflicts with redux\n    /** end rules which require whole codebase TS transpiling */\n\n    \"no-restricted-exports\": \"off\",\n    \"no-underscore-dangle\": [\"error\"],\n    \"no-param-reassign\": [\n      // ignore 'state' variables for immer mutability in redux-toolkit\n      // https://redux-toolkit.js.org/usage/immer-reducers#linting-state-mutations\n      \"warn\",\n      {\n        props: true,\n        ignorePropertyModificationsFor: [\"state\", \"beforeUnloadEvent\", \"acc\"],\n      },\n    ],\n    \"react/function-component-definition\": [\n      \"error\",\n      {\n        namedComponents: \"arrow-function\",\n        unnamedComponents: \"arrow-function\",\n      },\n    ],\n  },\n  overrides: [\n    {\n      files: [\"src/modules/**\"],\n      rules: {\n        \"no-restricted-imports\": [\n          \"error\",\n          {\n            paths: [\n              {\n                name: \"reactstrap\",\n                message: \"Use `@uicore`\",\n              },\n            ],\n            patterns: [],\n          },\n        ],\n      },\n    }\n  ],\n};\n"
  },
  {
    "path": "webview_panels/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"
  },
  {
    "path": "webview_panels/.storybook/__mocks__/crypto.ts",
    "content": "export {};\n"
  },
  {
    "path": "webview_panels/.storybook/__mocks__/vscode.ts",
    "content": "let data = undefined;\nlet timer = 0;\nlet func = undefined;\n\nexport const vscode = {\n  postMessage: async (args: Record<string, unknown>) => {\n    if (args.syncRequestId) {\n      let response;\n      let status = true;\n      try {\n        const body =\n          typeof func === \"function\" ? await (func as (args: Record<string, unknown>) => unknown)(args) : data;\n        response = { body };\n      } catch (error) {\n        response = {\n          error: (error as Error).message,\n        };\n        status = false;\n      }\n      setTimeout(() => {\n        window.postMessage({\n          command: \"response\",\n          args: {\n            syncRequestId: args.syncRequestId,\n            ...response,\n            status,\n          },\n        });\n      }, timer);\n      return;\n    }\n    return new Promise((resolve) =>\n      setTimeout(() => {\n        resolve({\n          command: \"response\",\n          args: {\n            syncRequestId: args.syncRequestId,\n            body: data,\n            status: true,\n          },\n        });\n      }, timer)\n    );\n  },\n};\n\nexport function decorator(story, { parameters }) {\n  if (parameters && parameters.vscode) {\n    data = parameters.vscode.data;\n    timer = parameters.vscode.timer || 0;\n    func = parameters.vscode.func || 0;\n  } else {\n    data = undefined;\n    timer = 0;\n  }\n  return story();\n}\n"
  },
  {
    "path": "webview_panels/.storybook/main.ts",
    "content": "import type { StorybookConfig } from \"@storybook/react-vite\";\nimport { mergeConfig } from \"vite\";\n\nconst config: StorybookConfig = {\n  stories: [\"../src/**/*.mdx\", \"../src/**/*.stories.@(js|jsx|mjs|ts|tsx)\"],\n  addons: [\n    \"@storybook/addon-links\",\n    \"@storybook/addon-essentials\",\n    \"@storybook/addon-interactions\",\n  ],\n  staticDirs: [\"../src/assets\"],\n  framework: {\n    name: \"@storybook/react-vite\",\n    options: {},\n  },\n  typescript: {\n    reactDocgen: false,\n  },\n  core: {\n    builder: \"@storybook/builder-vite\",\n  },\n  docs: {\n    autodocs: \"tag\",\n  },\n  async viteFinal(config) {\n    if (config.resolve?.alias) {\n      config.resolve.alias[\"@vscodeApi\"] = require.resolve(\n        \"./__mocks__/vscode.ts\"\n      );\n\n      config.resolve.alias[\"crypto\"] = require.resolve(\"./__mocks__/crypto.ts\");\n    }\n    // Merge custom configuration into the default config\n    return mergeConfig(config, {\n      // Add dependencies to pre-optimization\n      optimizeDeps: {\n        include: [\"storybook-dark-mode\"],\n      },\n    });\n  },\n};\nexport default config;\n"
  },
  {
    "path": "webview_panels/.storybook/preview-head.html",
    "content": "<!-- <meta\n  http-equiv=\"Content-Security-Policy\"\n  content=\"default-src 'none'; worker-src blob:; font-src http://localhost:6006; style-src 'unsafe-inline' self; img-src self http://localhost:6006 data:; script-src self 'unsafe-eval' http://localhost:6006; connect-src http://localhost:6006 ws://localhost:6006/\"\n/> -->\n\n<style>\n  body {\n    --vscode-panel-background: rgb(248, 248, 248);\n  }\n  body.vscode-dark {\n    --vscode-panel-background: rgb(30, 30, 30);\n  }\n  perspective-viewer {\n    height: 100vh !important;\n  }\n</style>\n"
  },
  {
    "path": "webview_panels/.storybook/preview.tsx",
    "content": "import React from \"react\";\nimport type { Preview } from \"@storybook/react\";\nimport \"bootstrap/dist/css/bootstrap.min.css\";\nimport \"../src/main.scss\";\nimport \"../node_modules/@vscode/codicons/dist/codicon.css\";\nimport \"../src/uiCore/theme.scss\";\nimport { decorator as VsCodeDecorator } from \"./__mocks__/vscode\";\nimport AppProvider from \"../src/modules/app/AppProvider\";\n\nconst theme = \"vscode-dark\"; // vscode-light\nconst css = `\n    .sb-show-main.vscode-dark {\n      --vscode-panel-background: #1e1e1e;\n    }\n`;\n\nconst preview: Preview = {\n  decorators: [\n    (story) => {\n      document.body.classList.add(theme);\n      return story();\n    },\n    VsCodeDecorator,\n    (Story) => (\n      <AppProvider>\n        <style>{css}</style>\n        <Story />\n      </AppProvider>\n    ),\n  ],\n  parameters: {\n    actions: { argTypesRegex: \"^on[A-Z].*\" },\n    controls: {\n      matchers: {\n        color: /(background|color)$/i,\n        date: /Date$/i,\n      },\n    },\n  },\n};\n\nexport default preview;\n"
  },
  {
    "path": "webview_panels/README.md",
    "content": "# Webview for extension\n\n### Overview\n\n```mermaid\n---\ntitle: Webview setup\n---\nclassDiagram\n    AltimateWebviewProvider <|-- InsightsPanel : extends\n    <<Baseclass>> AltimateWebviewProvider\n\n    note for InsightsPanel \"Mandatory overrides: \\n viewType\\n viewType\\n description\"\n    note for InsightsPanel \"Optional overrides: \\n handleCommand\"\n    AltimateWebviewProvider <|-- DocumentationEditor : extends\n    AltimateWebviewProvider : +String viewType\n    AltimateWebviewProvider : #String viewPath\n    AltimateWebviewProvider : #String description\n    AltimateWebviewProvider: #renderWebviewView()\n    AltimateWebviewProvider: #handleCommand()\n    class InsightsPanel{\n      #handleCommand\n    }\n    class DocumentationEditor{\n      #handleCommand\n    }\n\n    class Webview_panels[\"webview_panels/src/main.tsx\"]\n    Webview_panels <|-- AltimateWebviewProvider : renders\n    <<reactapp>> Webview_panels\n    note for Webview_panels \"AppConstants.tsx defines routes for each panel \\n main.tsx will render route defined in viewPath variable in Provider\"\n\n\n    click AltimateWebviewProvider href \"../src/webview_provider/altimateWebviewProvider.ts\" \"\"\n    click InsightsPanel href \"../src/webview_provider/insightsPanel.ts\" \"\"\n    click Webview_panels href \"./src/main.tsx\" \"\"\n\n```\n\n### Setup notes\n\n#### AltimateWebviewProvider\n\n- Base class for rendering webview\n- Also handles security practices like CSP and noonce as recommended [here](https://code.visualstudio.com/api/extension-guides/webview#security)\n- Each new panel needs to have its own provider which extends this class and should override\n  - `viewPath`\n  - `description`\n  - `viewType`\n  - each panel can also override `handleCommand` function to handle incoming messages from webview\n\n#### webview_panels react app\n\n- Uses react-router-dom for handling different routes for each panel\n- Route will be determined by the `viewPath` value set in `AltimateWebviewProvider`\n- Uses [reduxjstoolkit](https://redux-toolkit.js.org/) with useReducer in [AppProvider](./src/modules/app/AppProvider.tsx)\n  - This helps us to setup reducers in more readable and maintainable way\n  - This comes with [RTK Query](https://redux-toolkit.js.org/rtk-query/overview) similar to react-query\n- [useListeners](./src/modules/app/useListeners.ts) - common place to listen for incoming messages\n  - Component specific message can be listened within component/respective hook\n- Assets are stored here [./src/assets](./src/assets)\n  - can be accessed via `index.ts` in the same directory\n\n### How to add new panel?\n\n- In `package.json`, add an entry in `viewsContainers -> panel` with expected values\n  - add corresponding entry in `views -> dbt_view`\n- Create new provider in [../src/webview_provider](../src/webview_provider) by extending `AltimateWebviewProvider` with `viewType` same as the one added in package.json above\n- Add the new provider in [../src/webview_provider/index.ts](../src/webview_provider/index.ts)\n- Add new route in [./src/AppConstants.tsx](./src/AppConstants.tsx)\n- Use the new view route added in AppConstants in new webview provider created in step 2 and update value for `viewPath` variable\n- Update the value for `panelDescription` in provider\n- Launch the extension and test the new panel\n\n### Guidelines\n\n- UI components are built in [./src/uiCore](./src/uiCore/index.ts) package. Any new UI component should be imported only from this package. This will enable us to apply consistent styling, create ui toolkit and ability to switch to new UI library easily if needed\n- `reactstrap` (which is the current ui library) import is restricted in components in `src/modules`, to avoid importing the ui components directly from reactstrap. Instead export the necessary component from [./src/uiCore](./src/uiCore/index.ts) and use it in components\n- [Storybook](https://storybook.js.org/) is integrated and [ui tool kit](./src/uiCore/uiToolkitStories) is built in storybook to check the available UI components, typography, colors. If you add any new component to uiCore, add that component to above storybook.\n- use `panelLogger` for logging from webview panels. We can make this to use console or any logger in future\n\n### Communication with DataPilot\n\n- From webview react app, call `postMessageToDataPilot({ test: '123' });` in `useAppContext`\n- This message will be received by `altimateWebviewProvider` and posted to `SharedStateService`\n- `datapilotPanel` will listen for message from `SharedStateService` and relays that to data pilot webview panel\n- Datapilot storybook is available [here](./src/modules/dataPilot/DataPilot.stories.tsx)\n\n### Making API calls\n\n- Webview panel does not make api calls directly. Instead the request will be sent to webview providers and in turn call backend apis\n- For achieving this, helper methods are available\n  - [requestExecutor](./src/modules/app/requestExecutor.ts) - handles sending messages to providers\n    - `executeRequestInSync` can be used for getting response back from provider for an action\n    - `executeRequestInAsync` can be used for just sending message to provider without need for response\n\n### Storybook\n\n- vscode api integration is added using manual mock as in [here](./.storybook/__mocks__/vscode.ts).\n- Sample code (use `vscode` field in `parameters` to pass your mock data):\n  ```\n  export const QueryAnalysisDefaultView = {\n  render: (): JSX.Element => {\n    return <DataPilotPanel />;\n  },\n  parameters: {\n    vscode: {\n      data: { key: \"value\" },\n      timer: 3000,\n    },\n  },\n  }\n  ```\n\n### Streaming api response\n\n- use `executeStreamRequest` defined in [requestExecutor](./src/modules/app/requestExecutor.ts) to send an api request (which could send streaming response) through webview provider and add `progress` callback\n- In webview providers (ex: [datapilotPanel](../src/webview_provider/datapilotPanel.ts)), handle the incoming command and trigger backend api request using `fetchAsStream` defined in [StreamingService](../src/services/streamingService.ts)\n- `StreamingService` will take care of sending chunks to webview_panels which will be listened by `response` message event and `progress` will be called with chunks\n- Once the stream is completed, `executeStreamRequest` will resolve to the response\n"
  },
  {
    "path": "webview_panels/eslint/typescript.cjs",
    "content": "module.exports = {\n  \"@typescript-eslint/no-explicit-any\": \"error\",\n  \"@typescript-eslint/explicit-module-boundary-types\": \"warn\", // on because it's good\n  \"@typescript-eslint/indent\": \"off\", // off because https://github.com/typescript-eslint/typescript-eslint/issues/1824\n  \"@typescript-eslint/no-shadow\": \"warn\", // on because it's good\n  \"@typescript-eslint/naming-convention\": [\n    \"error\",\n    {\n      selector: \"variable\",\n      format: [\"camelCase\", \"PascalCase\", \"UPPER_CASE\"],\n      filter: {\n        regex: \"_id\",\n        match: false,\n      },\n    },\n    {\n      selector: \"function\",\n      format: [\"camelCase\"],\n    },\n    {\n      selector: \"typeLike\",\n      format: [\"PascalCase\"],\n    },\n  ],\n  \"@typescript-eslint/no-loop-func\": \"warn\", // on because it's good\n  \"@typescript-eslint/no-inferrable-types\": \"warn\", // on because it's good\n  \"@typescript-eslint/no-var-requires\": \"off\", // allow top level require,\n  \"@typescript-eslint/no-misused-promises\": [\n    \"error\",\n    {\n      checksVoidReturn: false,\n    },\n  ],\n  \"@typescript-eslint/ban-types\": [\n    \"warn\",\n    {\n      types: {\n        \"React.FC\": {\n          message:\n            \"React.FC is problematic. [More info here](https://kentcdodds.com/blog/how-to-write-a-react-component-in-typescript)\",\n        },\n        \"React.FunctionalComponent\": {\n          message:\n            \"React.FunctionalComponent is problematic. [More info here](https://kentcdodds.com/blog/how-to-write-a-react-component-in-typescript)\",\n        },\n        \"React.VFC\": {\n          message:\n            \"React.VFC is problematic. [More info here](https://kentcdodds.com/blog/how-to-write-a-react-component-in-typescript)\",\n        },\n        \"React.VoidFunctionComponent\": {\n          message:\n            \"React.VoidFunctionComponent is problematic. [More info here](https://kentcdodds.com/blog/how-to-write-a-react-component-in-typescript)\",\n        },\n      },\n    },\n  ],\n  \"@typescript-eslint/no-unused-vars\": [\n    \"error\",\n    { varsIgnorePattern: \"^_\", argsIgnorePattern: \"^_\" },\n  ],\n  \"typescript-sort-keys/string-enum\": [\"warn\", \"asc\", { caseSensitive: true }],\n};\n"
  },
  {
    "path": "webview_panels/index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Vscode DBT Power user extension</title>\n    <style>\n      @import url(\"https://fonts.googleapis.com/css2?family=Lexend:wght@300;400;500&display=swap\");\n    </style>\n  </head>\n  <body>\n    <div id=\"root\"></div>\n    <script nonce=\"__NONCE__\" type=\"module\" src=\"/src/main.tsx\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "webview_panels/package.json",
    "content": "{\n  \"name\": \"webview_panels\",\n  \"private\": true,\n  \"version\": \"0.0.0\",\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \"18.x\",\n    \"npm\": \"^9.x\"\n  },\n  \"packageManager\": \"npm@9.6.7\",\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"watch\": \"rm -Rf ./dist; tsc && vite build --watch\",\n    \"build\": \"rm -Rf ./dist; NODE_OPTIONS=--max-old-space-size=16384 tsc && concurrently \\\"vite build\\\"  \\\"vite build --config vite.config.renderer.ts --emptyOutDir=false\\\"\",\n    \"lint\": \"eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 7\",\n    \"preview\": \"vite preview\",\n    \"storybook\": \"storybook dev -p 6006\",\n    \"build-storybook\": \"storybook build\"\n  },\n  \"dependencies\": {\n    \"@altimateai/ui-components\": \"0.0.82-beta.4\",\n    \"@ant-design/pro-chat\": \"^1.15.2\",\n    \"@finos/perspective\": \"^2.10.0\",\n    \"@finos/perspective-viewer\": \"^2.10.0\",\n    \"@finos/perspective-viewer-d3fc\": \"^2.10.0\",\n    \"@finos/perspective-viewer-datagrid\": \"^2.10.0\",\n    \"@hookform/resolvers\": \"^3.3.4\",\n    \"@jupyter-widgets/base\": \"^4.1.6\",\n    \"@jupyter-widgets/controls\": \"^3.1.7\",\n    \"@jupyter-widgets/schema\": \"^0.5.5\",\n    \"@reduxjs/toolkit\": \"^2.0.1\",\n    \"@vscode/codicons\": \"^0.0.35\",\n    \"antd\": \"^5.21.0\",\n    \"antd-style\": \"^3.6.3\",\n    \"bootstrap\": \"^5.3.2\",\n    \"formik\": \"^2.4.6\",\n    \"idb\": \"^8.0.0\",\n    \"react\": \"^18.2.0\",\n    \"react-code-blocks\": \"^0.1.6\",\n    \"react-copy-to-clipboard\": \"^5.1.0\",\n    \"react-dom\": \"^18.2.0\",\n    \"react-error-boundary\": \"^4.0.13\",\n    \"react-hook-form\": \"^7.49.3\",\n    \"react-markdown\": \"^9.0.1\",\n    \"react-plotly.js\": \"^2.6.0\",\n    \"react-router-dom\": \"^6.21.1\",\n    \"react-select\": \"^5.8.0\",\n    \"react-syntax-highlighter\": \"^15.5.0\",\n    \"react-textarea-autosize\": \"^8.5.3\",\n    \"reactstrap\": \"^9.2.3\",\n    \"remark-gfm\": \"^4.0.0\",\n    \"use-debounce\": \"^10.0.1\",\n    \"vite-plugin-css-injected-by-js\": \"^3.5.1\",\n    \"vite-plugin-svgr\": \"^4.2.0\",\n    \"yaml\": \"^2.4.1\",\n    \"yup\": \"^1.3.3\",\n    \"zod\": \"^3.23.8\"\n  },\n  \"devDependencies\": {\n    \"@faker-js/faker\": \"^8.4.0\",\n    \"@rollup/plugin-commonjs\": \"^26.0.1\",\n    \"@rollup/plugin-node-resolve\": \"^15.2.3\",\n    \"@rollup/plugin-typescript\": \"^11.1.6\",\n    \"@storybook/addon-essentials\": \"^7.6.6\",\n    \"@storybook/addon-interactions\": \"^7.6.6\",\n    \"@storybook/addon-links\": \"^7.6.6\",\n    \"@storybook/blocks\": \"^7.6.6\",\n    \"@storybook/builder-vite\": \"^7.6.6\",\n    \"@storybook/jest\": \"^0.2.3\",\n    \"@storybook/react\": \"^7.6.6\",\n    \"@storybook/react-vite\": \"^7.6.6\",\n    \"@storybook/testing-library\": \"^0.2.2\",\n    \"@types/react\": \"^18.2.43\",\n    \"@types/react-copy-to-clipboard\": \"^5.0.7\",\n    \"@types/react-dom\": \"^18.2.17\",\n    \"@types/react-syntax-highlighter\": \"^15.5.11\",\n    \"@types/vscode-notebook-renderer\": \"^1.72.3\",\n    \"@types/vscode-webview\": \"^1.57.4\",\n    \"@typescript-eslint/eslint-plugin\": \"^6.14.0\",\n    \"@typescript-eslint/parser\": \"^6.14.0\",\n    \"@vitejs/plugin-react\": \"^4.2.1\",\n    \"autoprefixer\": \"^10.4.27\",\n    \"date-fns\": \"^3.2.0\",\n    \"eslint\": \"^8.55.0\",\n    \"eslint-config-prettier\": \"^9.1.0\",\n    \"eslint-plugin-import\": \"^2.29.1\",\n    \"eslint-plugin-jest\": \"^27.6.0\",\n    \"eslint-plugin-jsx-a11y\": \"^6.8.0\",\n    \"eslint-plugin-local\": \"^1.0.0\",\n    \"eslint-plugin-promise\": \"^6.1.1\",\n    \"eslint-plugin-react\": \"^7.33.2\",\n    \"eslint-plugin-react-hooks\": \"^4.6.0\",\n    \"eslint-plugin-react-refresh\": \"^0.4.5\",\n    \"eslint-plugin-storybook\": \"^0.6.15\",\n    \"eslint-plugin-testing-library\": \"^6.2.0\",\n    \"eslint-plugin-typescript-sort-keys\": \"^3.1.0\",\n    \"eslint-plugin-you-dont-need-lodash-underscore\": \"^6.13.0\",\n    \"factory.ts\": \"^1.4.1\",\n    \"postcss\": \"^8.5.8\",\n    \"rollup-plugin-legacy\": \"^1.0.0\",\n    \"rollup-plugin-terser\": \"^7.0.2\",\n    \"sass\": \"^1.69.6\",\n    \"sass-loader\": \"^13.3.3\",\n    \"storybook\": \"^7.6.6\",\n    \"storybook-react-context\": \"^0.6.0\",\n    \"tailwindcss\": \"^3.4.19\",\n    \"typescript\": \"^5.2.2\",\n    \"vite\": \"^5.0.8\"\n  }\n}\n"
  },
  {
    "path": "webview_panels/postcss.config.mjs",
    "content": "import tailwindcss from \"tailwindcss\";\nimport autoprefixer from \"autoprefixer\";\n\nexport default {\n  plugins: [tailwindcss, autoprefixer],\n};\n"
  },
  {
    "path": "webview_panels/public/.gitkeep",
    "content": ""
  },
  {
    "path": "webview_panels/src/App.tsx",
    "content": "import { Suspense } from \"react\";\nimport \"bootstrap/dist/css/bootstrap.min.css\";\nimport \"@uicore/theme.scss\";\nimport { AppRoutes } from \"./AppRoutes\";\nimport AppProvider from \"./modules/app/AppProvider\";\nimport { TeamMateProvider } from \"@lib\";\n\nconst Loader = () => <div>Loading...</div>;\nconst App = (): JSX.Element => (\n  <AppProvider>\n    <TeamMateProvider>\n      <Suspense fallback={<Loader />}>\n        <AppRoutes />\n      </Suspense>\n    </TeamMateProvider>\n  </AppProvider>\n);\n\nexport default App;\n"
  },
  {
    "path": "webview_panels/src/AppConstants.tsx",
    "content": "// import { lazy } from \"react\";\nimport DataPilotPanel from \"@modules/dataPilot\";\nimport DbtDocsView from \"@modules/dbtDocs/DbtDocsView\";\nimport DocumentationProvider from \"@modules/documentationEditor/DocumentationProvider\";\nimport LineageView from \"@modules/lineage/LineageView\";\nimport Onboarding from \"@modules/onboarding/Onboarding\";\nimport QueryPanelProvider from \"@modules/queryPanel/QueryPanelProvider\";\nimport Home from \"./modules/home/Home\";\nimport Insights from \"./modules/insights/Insights\";\n\n// TODO: lazy loading breaks loading dynamic webviews when having css because of vite dynamic loading\n// research on how to fix that and then use lazy loading\n// Using lazy loading for routes to load only necessary files for each panel\n// const DocumentationEditor = lazy(\n//   () => import(\"./modules/documentationEditor/DocumentationEditor\"),\n// );\n// const Insights = lazy(() => import(\"./modules/insights/Insights\"));\n\n// This is the list of routes that are available in the webview\n// The key should be used as viewPath value in providers ex: src/webview_provider/insightsPanel.ts\nexport const AvailableRoutes = {\n  \"/\": { component: <Home /> },\n  \"/insights\": { component: <Insights /> },\n  \"/datapilot\": { component: <DataPilotPanel /> },\n  \"/docs-generator\": {\n    component: <DocumentationProvider />,\n  },\n  \"/dbt-docs\": { component: <DbtDocsView /> },\n  \"/query-panel\": { component: <QueryPanelProvider /> },\n  \"/lineage\": { component: <LineageView /> },\n  \"/onboarding\": { component: <Onboarding /> },\n};\n"
  },
  {
    "path": "webview_panels/src/AppRoutes.tsx",
    "content": "import { Routes, Route } from \"react-router-dom\";\nimport { AvailableRoutes } from \"./AppConstants\";\nimport NoMatch from \"./NoMatch\";\n\nexport const AppRoutes = (): JSX.Element => (\n  <Routes>\n    <Route path=\"/\">\n      {Object.entries(AvailableRoutes).map(([routeEntry, { component }]) => (\n        <Route path={routeEntry} element={component} key={routeEntry} />\n      ))}\n\n      <Route path=\"*\" element={<NoMatch />} />\n    </Route>\n  </Routes>\n);\n"
  },
  {
    "path": "webview_panels/src/NoMatch.tsx",
    "content": "const NoMatch = (): JSX.Element => <div>Panel not found!</div>;\n\nexport default NoMatch;\n"
  },
  {
    "path": "webview_panels/src/_variables.scss",
    "content": "$primaryColor: #247efe;\n"
  },
  {
    "path": "webview_panels/src/assets/icons/Images.stories.tsx",
    "content": "import type { Meta } from \"@storybook/react\";\nimport { useState } from \"react\";\nimport * as Icons from \"./index\";\nimport { panelLogger } from \"@modules/logger\";\n\nconst meta = {\n  title: \"UiToolKit/Images\",\n  parameters: {\n    layout: \"padded\",\n  },\n  tags: [\"autodocs\"],\n  argTypes: {\n    backgroundColor: { control: \"color\" },\n  },\n} satisfies Meta;\n\nexport default meta;\n\nexport const Default = {\n  render: (): JSX.Element => {\n    const [searchTerm, setSearchTerm] = useState(\"\");\n\n    const handleSearch = (e: React.ChangeEvent<HTMLInputElement>) => {\n      setSearchTerm(e.target.value.toLowerCase());\n    };\n\n    const filteredIcons = searchTerm\n      ? Object.keys(Icons).filter((name) =>\n          name.toLowerCase().includes(searchTerm)\n        )\n      : Object.keys(Icons);\n\n    return (\n      <div style={{ overflowY: \"auto\", height: \"100vh\" }}>\n        <h2>Icons</h2>\n        <div style={{ margin: \"20px 0\" }}>\n          <input\n            type=\"text\"\n            placeholder=\"Search icons...\"\n            style={{\n              width: \"100%\",\n              padding: \"10px\",\n              fontSize: \"16px\",\n              border: \"1px solid #ccc\",\n              borderRadius: \"4px\",\n            }}\n            onChange={handleSearch}\n          />\n        </div>\n        <div\n          style={{\n            display: \"grid\",\n            gridTemplateColumns: \"repeat(auto-fill, minmax(100px, 1fr))\",\n            gap: \"20px\",\n            color: \"#333\"\n          }}\n        >\n          {filteredIcons.map((name) => {\n            const IconComponent = Icons[name as keyof typeof Icons];\n            if (!IconComponent) {  \n              panelLogger.warn(`Icon ${name} not found`);  \n              return null;  \n            }  \n            return (\n              <div key={name} style={{ textAlign: \"center\" }}>\n                <IconComponent width=\"48px\" height=\"48px\" />\n                <p>{name}</p>\n              </div>\n            );\n          })}\n        </div>\n      </div>\n    );\n  },\n};\n"
  },
  {
    "path": "webview_panels/src/assets/icons/index.tsx",
    "content": "import { HTMLAttributes } from \"react\";\nimport LineageGif from \"./lineage.gif\";\nimport LoadingSpinnerUrl from \"./spinner.gif\";\nimport \"./styles.css\";\nexport { default as AddOutlineIcon } from \"./add-outline.svg?react\";\nexport { default as AltimateIcon } from \"./altimate.svg?react\";\nexport { default as BlogIcon } from \"./blog.svg?react\";\nexport { default as CheckBlueIcon } from \"./check-blue.svg?react\";\nexport { default as CheckedSquareIcon } from \"./checked-square.svg?react\";\nexport { default as CoachAIIcon } from \"./coachAi.svg?react\";\nexport { default as ContactUsIcon } from \"./contact.svg?react\";\nexport { default as DislikeIcon } from \"./dislike.svg?react\";\nexport { default as DocsIcon } from \"./docs.svg?react\";\nexport { default as EditIcon } from \"./edit.svg?react\";\nexport { default as ErrorIcon } from \"./error.svg?react\";\nexport { default as FeedbackIcon } from \"./feedback.svg?react\";\nexport { default as FolderIcon } from \"./folder.svg?react\";\nexport { default as HelpIcon } from \"./help.svg?react\";\nexport { default as LikeIcon } from \"./like.svg?react\";\nexport { default as LoaderIcon } from \"./loader.svg?react\";\nexport { default as NoBookmarksIcon } from \"./no-bookmarks.svg?react\";\nexport { default as NoHistoryIcon } from \"./no-history.svg?react\";\nexport { default as NoNotebooksIcon } from \"./notebook.svg?react\";\nexport { default as PreviewIcon } from \"./preview.svg?react\";\nexport { default as PropagateIcon } from \"./propagate.svg?react\";\nexport { default as SelectCheckedIcon } from \"./select-checked.svg?react\";\nexport { default as SelectUncheckedIcon } from \"./select-unchecked.svg?react\";\nexport { default as ShinesIcon } from \"./shines.svg?react\";\nexport { default as SlackIcon } from \"./slack.svg?react\";\nexport { default as EmptySquareIcon } from \"./square.svg?react\";\nexport { default as TestsIcon } from \"./tests.svg?react\";\nexport { default as ThinkingIcon } from \"./thinking.svg?react\";\nexport { default as UncheckIcon } from \"./uncheck.svg?react\";\nexport { default as UserIcon } from \"./user.svg?react\";\n\ninterface Props {\n  icon: string;\n}\nconst Icon = ({\n  icon,\n  className = \"\",\n  ...rest\n}: Props & HTMLAttributes<HTMLElement>) => (\n  <i className={`${className} codicon codicon-${icon}`} {...rest} />\n);\n\nexport const PlayIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n  <Icon icon=\"play\" {...props} />\n);\n\nexport const RemoveIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n  <Icon icon=\"remove\" {...props} />\n);\n\nexport const AddIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n  <Icon icon=\"add\" {...props} />\n);\n\nexport const DeleteIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n  <Icon icon=\"trash\" {...props} />\n);\n\nexport const GlobeIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n  <Icon icon=\"globe\" {...props} />\n);\n\nexport const GithubIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n  <Icon icon=\"github-inverted\" {...props} />\n);\n\nexport const FilesIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n  <Icon icon=\"files\" {...props} />\n);\n\nexport const ArrowUpIcon = (\n  props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"chevron-up\" {...props} />;\n\nexport const ArrowDownIcon = (\n  props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"chevron-down\" {...props} />;\n\nexport const ArrowRightIcon = (\n  props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"chevron-right\" {...props} />;\n\nexport const ArrowLeftIcon = (\n  props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"chevron-left\" {...props} />;\n\nexport const CheckedIcon = (\n  props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"pass-filled\" {...props} />;\n\nexport const RefreshIcon = (\n  props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"debug-restart\" {...props} />;\n\nexport const SettingsIcon = (\n  props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"gear\" {...props} />;\n\nexport const ChevronDownIcon = (\n  props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"chevron-down\" {...props} />;\n\nexport const ChevronRightIcon = (\n  props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"chevron-right\" {...props} />;\n\nexport const ChevronLeftIcon = (\n  props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"chevron-left\" {...props} />;\n\nexport const MoreIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n  <Icon icon=\"more\" {...props} />\n);\n\nexport const InfoCircleIcon = (\n  props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"info\" {...props} />;\n\nexport const AskIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n  <Icon icon=\"send\" {...props} />\n);\n\nexport const CloseIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n  <Icon icon=\"close\" {...props} />\n);\n\nexport const CommentIcon = (\n  props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"comment\" {...props} />;\n\nexport const LoadingSpinner = (): JSX.Element => (\n  <img\n    // @ts-expect-error added in altimateWebViewProvider\n    src={(window.spinnerUrl as string) ?? LoadingSpinnerUrl}\n    alt=\"Altimate loader\"\n  />\n);\n\nexport const LineageDemo = (): JSX.Element => (\n  <img\n    // @ts-expect-error added in altimateWebViewProvider\n    src={(window.lineageGif as string) ?? LineageGif}\n    alt=\"Lineage demo\"\n  />\n);\n\nexport const LoadingIcon = (\n  props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"loading\" className=\"rotate\" {...props} />;\n\nexport const PlayCircleIcon = (\n  props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"play-circle\" {...props} />;\n\nexport const BookmarkIcon = (\n  props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"bookmark\" {...props} />;\n\nexport const ShareIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n  <Icon icon=\"live-share\" {...props} />\n);\n\nexport const FilterIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n  <Icon icon=\"filter\" {...props} />\n);\n\nexport const SearchIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n  <Icon icon=\"search\" {...props} />\n);\n\nexport const FileCodeIcon = (\n  props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"file-code\" {...props} />;\n\nexport const OpenNewIcon = (\n  props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"link-external\" {...props} />;\n\nexport const SparkleIcon = (\n  props: HTMLAttributes<HTMLElement>,\n): JSX.Element => <Icon icon=\"sparkle\" {...props} />;\n"
  },
  {
    "path": "webview_panels/src/assets/icons/styles.css",
    "content": "@keyframes rotateAnimation {\n  0% {\n    transform: rotate(0deg);\n  }\n  100% {\n    transform: rotate(359deg);\n  }\n}\n\n.rotate {\n  animation: rotateAnimation 5s linear infinite;\n}\n"
  },
  {
    "path": "webview_panels/src/lib/altimate/DbtDocsRenderer.js",
    "content": "import { u as Yu, a as Xu, b as Zu, g as Qu, c as Gu, d as Ju, e as Ku, j as pr, f as tc, s as ec } from \"./main.js\";\nimport { useRef as rc, useCallback as nc, useEffect as ic } from \"react\";\n(function(L) {\n  var T = {};\n  function e(u) {\n    if (T[u]) return T[u].exports;\n    var A = T[u] = { i: u, l: !1, exports: {} };\n    return L[u].call(A.exports, A, A.exports, e), A.l = !0, A.exports;\n  }\n  e.m = L, e.c = T, e.d = function(u, A, w) {\n    e.o(u, A) || Object.defineProperty(u, A, { enumerable: !0, get: w });\n  }, e.r = function(u) {\n    typeof Symbol < \"u\" && Symbol.toStringTag && Object.defineProperty(u, Symbol.toStringTag, { value: \"Module\" }), Object.defineProperty(u, \"__esModule\", { value: !0 });\n  }, e.t = function(u, A) {\n    if (1 & A && (u = e(u)), 8 & A || 4 & A && typeof u == \"object\" && u && u.__esModule) return u;\n    var w = /* @__PURE__ */ Object.create(null);\n    if (e.r(w), Object.defineProperty(w, \"default\", { enumerable: !0, value: u }), 2 & A && typeof u != \"string\")\n      for (var E in u)\n        e.d(\n          w,\n          E,\n          (function(y) {\n            return u[y];\n          }).bind(null, E)\n        );\n    return w;\n  }, e.n = function(u) {\n    var A = u && u.__esModule ? function() {\n      return u.default;\n    } : function() {\n      return u;\n    };\n    return e.d(A, \"a\", A), A;\n  }, e.o = function(u, A) {\n    return Object.prototype.hasOwnProperty.call(u, A);\n  }, e.p = \"\", e(e.s = 207);\n})([\n  function(L, T, e) {\n    (function(u) {\n      e.d(T, \"M\", function() {\n        return x;\n      }), e.d(T, \"x\", function() {\n        return o;\n      }), e.d(T, \"Q\", function() {\n        return c;\n      }), e.d(T, \"w\", function() {\n        return a;\n      }), e.d(T, \"r\", function() {\n        return n;\n      }), e.d(T, \"q\", function() {\n        return t;\n      }), e.d(T, \"y\", function() {\n        return r;\n      }), e.d(T, \"E\", function() {\n        return l;\n      }), e.d(T, \"n\", function() {\n        return h;\n      }), e.d(T, \"A\", function() {\n        return i;\n      }), e.d(T, \"z\", function() {\n        return d;\n      }), e.d(T, \"b\", function() {\n        return p;\n      }), e.d(T, \"L\", function() {\n        return f;\n      }), e.d(T, \"d\", function() {\n        return v;\n      }), e.d(T, \"K\", function() {\n        return k;\n      }), e.d(T, \"c\", function() {\n        return s;\n      }), e.d(T, \"p\", function() {\n        return S;\n      }), e.d(T, \"o\", function() {\n        return j;\n      }), e.d(T, \"D\", function() {\n        return I;\n      }), e.d(T, \"f\", function() {\n        return R;\n      }), e.d(T, \"H\", function() {\n        return M;\n      }), e.d(T, \"F\", function() {\n        return z;\n      }), e.d(T, \"I\", function() {\n        return V;\n      }), e.d(T, \"s\", function() {\n        return G;\n      }), e.d(T, \"t\", function() {\n        return Y;\n      }), e.d(T, \"C\", function() {\n        return tt;\n      }), e.d(T, \"B\", function() {\n        return Z;\n      }), e.d(T, \"U\", function() {\n        return at;\n      }), e.d(T, \"e\", function() {\n        return nt;\n      }), e.d(T, \"g\", function() {\n        return ht;\n      }), e.d(T, \"T\", function() {\n        return ct;\n      }), e.d(T, \"v\", function() {\n        return ot;\n      }), e.d(T, \"J\", function() {\n        return gt;\n      }), e.d(T, \"R\", function() {\n        return xt;\n      }), e.d(T, \"S\", function() {\n        return St;\n      }), e.d(T, \"u\", function() {\n        return zt;\n      }), e.d(T, \"l\", function() {\n        return Nt;\n      }), e.d(T, \"k\", function() {\n        return re;\n      }), e.d(T, \"j\", function() {\n        return be;\n      }), e.d(T, \"G\", function() {\n        return ne;\n      }), e.d(T, \"i\", function() {\n        return ce;\n      }), e.d(T, \"h\", function() {\n        return xe;\n      }), e.d(T, \"P\", function() {\n        return we;\n      }), e.d(T, \"m\", function() {\n        return ae;\n      }), e.d(T, \"a\", function() {\n        return Le;\n      }), e.d(T, \"N\", function() {\n        return kt;\n      }), e.d(T, \"O\", function() {\n        return Dt;\n      });\n      var A = e(1), w = e(3), E = e(6), y = function() {\n        for (var yt = 0, ft = 0, Rt = arguments.length; ft < Rt; ft++)\n          yt += arguments[ft].length;\n        var Wt = Array(yt), le = 0;\n        for (ft = 0; ft < Rt; ft++)\n          for (var ye = arguments[ft], pe = 0, je = ye.length; pe < je; pe++, le++)\n            Wt[le] = ye[pe];\n        return Wt;\n      }, x = typeof self == \"object\" && self.self === self && self || typeof u == \"object\" && u.global === u && u || void 0, g = x.angular || {}, o = g.fromJson || JSON.parse.bind(JSON), c = g.toJson || JSON.stringify.bind(JSON), a = g.forEach || function(yt, ft, Rt) {\n        if (Object(A.a)(yt)) return yt.forEach(ft, Rt);\n        Object.keys(yt).forEach(function(Wt) {\n          return ft(yt[Wt], Wt);\n        });\n      }, n = Object.assign || Le, t = g.equals || lt;\n      function r(yt) {\n        return yt;\n      }\n      function l() {\n      }\n      function h(yt, ft, Rt, Wt, le) {\n        le === void 0 && (le = !1);\n        var ye = function(pe) {\n          return yt()[pe].bind(Rt());\n        };\n        return (Wt = Wt || Object.keys(yt())).reduce(function(pe, je) {\n          var Me;\n          return pe[je] = le ? (Me = je, function() {\n            return ft[Me] = ye(Me), ft[Me].apply(null, arguments);\n          }) : ye(je), pe;\n        }, ft);\n      }\n      var i = function(yt, ft) {\n        return n(Object.create(yt), ft);\n      }, d = Object(w.e)(p);\n      function p(yt, ft) {\n        return yt.indexOf(ft) !== -1;\n      }\n      var f = Object(w.e)(v);\n      function v(yt, ft) {\n        var Rt = yt.indexOf(ft);\n        return Rt >= 0 && yt.splice(Rt, 1), yt;\n      }\n      var k = Object(w.e)(s);\n      function s(yt, ft) {\n        return yt.push(ft), ft;\n      }\n      var S = function(yt) {\n        return yt.slice().forEach(function(ft) {\n          typeof ft == \"function\" && ft(), f(yt, ft);\n        });\n      };\n      function j(yt) {\n        for (var ft = [], Rt = 1; Rt < arguments.length; Rt++)\n          ft[Rt - 1] = arguments[Rt];\n        var Wt = n.apply(void 0, y([{}], ft.reverse()));\n        return n(Wt, M(yt || {}, Object.keys(Wt)));\n      }\n      var I = function(yt, ft) {\n        return n(yt, ft);\n      };\n      function R(yt, ft) {\n        var Rt = [];\n        for (var Wt in yt.path) {\n          if (yt.path[Wt] !== ft.path[Wt]) break;\n          Rt.push(yt.path[Wt]);\n        }\n        return Rt;\n      }\n      function M(yt, ft) {\n        var Rt = {};\n        for (var Wt in yt) ft.indexOf(Wt) !== -1 && (Rt[Wt] = yt[Wt]);\n        return Rt;\n      }\n      function z(yt, ft) {\n        return Object.keys(yt).filter(Object(w.i)(d(ft))).reduce(function(Rt, Wt) {\n          return Rt[Wt] = yt[Wt], Rt;\n        }, {});\n      }\n      function V(yt, ft) {\n        return Z(yt, Object(w.n)(ft));\n      }\n      function G(yt, ft) {\n        var Rt = Object(A.a)(yt), Wt = Rt ? [] : {}, le = Rt ? function(ye) {\n          return Wt.push(ye);\n        } : function(ye, pe) {\n          return Wt[pe] = ye;\n        };\n        return a(yt, function(ye, pe) {\n          ft(ye, pe) && le(ye, pe);\n        }), Wt;\n      }\n      function Y(yt, ft) {\n        var Rt;\n        return a(yt, function(Wt, le) {\n          Rt || ft(Wt, le) && (Rt = Wt);\n        }), Rt;\n      }\n      var tt = Z;\n      function Z(yt, ft, Rt) {\n        return Rt = Rt || (Object(A.a)(yt) ? [] : {}), a(yt, function(Wt, le) {\n          return Rt[le] = ft(Wt, le);\n        }), Rt;\n      }\n      var at = function(yt) {\n        return Object.keys(yt).map(function(ft) {\n          return yt[ft];\n        });\n      }, nt = function(yt, ft) {\n        return yt && ft;\n      }, ht = function(yt, ft) {\n        return yt || ft;\n      }, ct = function(yt, ft) {\n        return yt.concat(ft);\n      }, ot = function(yt, ft) {\n        return Object(A.a)(ft) ? yt.concat(ft.reduce(ot, [])) : gt(yt, ft);\n      };\n      function gt(yt, ft) {\n        return yt.push(ft), yt;\n      }\n      var xt = function(yt, ft) {\n        return d(yt, ft) ? yt : gt(yt, ft);\n      }, St = function(yt) {\n        return yt.reduce(ct, []);\n      }, zt = function(yt) {\n        return yt.reduce(ot, []);\n      }, Nt = be, re = be;\n      function be(yt, ft) {\n        return ft === void 0 && (ft = \"assert failure\"), function(Rt) {\n          var Wt = yt(Rt);\n          if (!Wt) throw new Error(Object(A.d)(ft) ? ft(Rt) : ft);\n          return Wt;\n        };\n      }\n      var ne = function(yt) {\n        return Object.keys(yt).map(function(ft) {\n          return [ft, yt[ft]];\n        });\n      };\n      function ce() {\n        for (var yt = [], ft = 0; ft < arguments.length; ft++) yt[ft] = arguments[ft];\n        if (yt.length === 0) return [];\n        for (var Rt = yt.reduce(function(pe, je) {\n          return Math.min(je.length, pe);\n        }, 9007199254740991), Wt = [], le = function(pe) {\n          switch (yt.length) {\n            case 1:\n              Wt.push([yt[0][pe]]);\n              break;\n            case 2:\n              Wt.push([yt[0][pe], yt[1][pe]]);\n              break;\n            case 3:\n              Wt.push([yt[0][pe], yt[1][pe], yt[2][pe]]);\n              break;\n            case 4:\n              Wt.push([yt[0][pe], yt[1][pe], yt[2][pe], yt[3][pe]]);\n              break;\n            default:\n              Wt.push(\n                yt.map(function(je) {\n                  return je[pe];\n                })\n              );\n          }\n        }, ye = 0; ye < Rt; ye++)\n          le(ye);\n        return Wt;\n      }\n      function xe(yt, ft) {\n        var Rt, Wt;\n        if (Object(A.a)(ft) && (Rt = ft[0], Wt = ft[1]), !Object(A.l)(Rt))\n          throw new Error(\"invalid parameters to applyPairs\");\n        return yt[Rt] = Wt, yt;\n      }\n      function we(yt) {\n        return yt.length && yt[yt.length - 1] || void 0;\n      }\n      function ae(yt, ft) {\n        return ft && Object.keys(ft).forEach(function(Rt) {\n          return delete ft[Rt];\n        }), ft || (ft = {}), n(ft, yt);\n      }\n      function Le(yt) {\n        for (var ft = 1; ft < arguments.length; ft++) {\n          var Rt = arguments[ft];\n          if (Rt)\n            for (var Wt = Object.keys(Rt), le = 0; le < Wt.length; le++)\n              yt[Wt[le]] = Rt[Wt[le]];\n        }\n        return yt;\n      }\n      function lt(yt, ft) {\n        if (yt === ft) return !0;\n        if (yt === null || ft === null) return !1;\n        if (yt != yt && ft != ft) return !0;\n        var Rt = typeof yt;\n        if (Rt !== typeof ft || Rt !== \"object\") return !1;\n        var Wt, le, ye = [yt, ft];\n        if (Object(w.a)(A.a)(ye))\n          return le = ft, (Wt = yt).length === le.length && ce(Wt, le).reduce(function(Me, Ze) {\n            return Me && lt(Ze[0], Ze[1]);\n          }, !0);\n        if (Object(w.a)(A.b)(ye)) return yt.getTime() === ft.getTime();\n        if (Object(w.a)(A.k)(ye)) return yt.toString() === ft.toString();\n        if (Object(w.a)(A.d)(ye)) return !0;\n        if ([A.d, A.a, A.b, A.k].map(w.c).reduce(function(Me, Ze) {\n          return Me || !!Ze(ye);\n        }, !1))\n          return !1;\n        var pe = {};\n        for (var je in yt) {\n          if (!lt(yt[je], ft[je])) return !1;\n          pe[je] = !0;\n        }\n        for (var je in ft) if (!pe[je]) return !1;\n        return !0;\n      }\n      var kt = function(yt) {\n        return yt.catch(function(ft) {\n          return 0;\n        }) && yt;\n      }, Dt = function(yt) {\n        return kt(E.b.$q.reject(yt));\n      };\n    }).call(this, e(35));\n  },\n  function(L, T, e) {\n    e.d(T, \"m\", function() {\n      return E;\n    }), e.d(T, \"c\", function() {\n      return y;\n    }), e.d(T, \"f\", function() {\n      return x;\n    }), e.d(T, \"g\", function() {\n      return g;\n    }), e.d(T, \"d\", function() {\n      return o;\n    }), e.d(T, \"h\", function() {\n      return c;\n    }), e.d(T, \"l\", function() {\n      return a;\n    }), e.d(T, \"i\", function() {\n      return n;\n    }), e.d(T, \"a\", function() {\n      return t;\n    }), e.d(T, \"b\", function() {\n      return r;\n    }), e.d(T, \"k\", function() {\n      return l;\n    }), e.d(T, \"e\", function() {\n      return h;\n    }), e.d(T, \"j\", function() {\n      return i;\n    });\n    var u = e(3), A = Object.prototype.toString, w = function(d) {\n      return function(p) {\n        return typeof p === d;\n      };\n    }, E = w(\"undefined\"), y = Object(u.i)(E), x = function(d) {\n      return d === null;\n    }, g = Object(u.j)(x, E), o = w(\"function\"), c = w(\"number\"), a = w(\"string\"), n = function(d) {\n      return d !== null && typeof d == \"object\";\n    }, t = Array.isArray, r = function(d) {\n      return A.call(d) === \"[object Date]\";\n    }, l = function(d) {\n      return A.call(d) === \"[object RegExp]\";\n    };\n    function h(d) {\n      if (t(d) && d.length) {\n        var p = d.slice(0, -1), f = d.slice(-1);\n        return !(p.filter(Object(u.i)(a)).length || f.filter(Object(u.i)(o)).length);\n      }\n      return o(d);\n    }\n    var i = Object(u.b)(n, Object(u.m)(Object(u.n)(\"then\"), o));\n  },\n  function(L, T, e) {\n    e.r(T);\n    var u = e(4);\n    e.d(T, \"root\", function() {\n      return u.Bb;\n    }), e.d(T, \"fromJson\", function() {\n      return u.J;\n    }), e.d(T, \"toJson\", function() {\n      return u.Mb;\n    }), e.d(T, \"forEach\", function() {\n      return u.I;\n    }), e.d(T, \"extend\", function() {\n      return u.C;\n    }), e.d(T, \"equals\", function() {\n      return u.B;\n    }), e.d(T, \"identity\", function() {\n      return u.M;\n    }), e.d(T, \"noop\", function() {\n      return u.lb;\n    }), e.d(T, \"createProxyFunctions\", function() {\n      return u.w;\n    }), e.d(T, \"inherit\", function() {\n      return u.O;\n    }), e.d(T, \"inArray\", function() {\n      return u.N;\n    }), e.d(T, \"_inArray\", function() {\n      return u.f;\n    }), e.d(T, \"removeFrom\", function() {\n      return u.Ab;\n    }), e.d(T, \"_removeFrom\", function() {\n      return u.h;\n    }), e.d(T, \"pushTo\", function() {\n      return u.zb;\n    }), e.d(T, \"_pushTo\", function() {\n      return u.g;\n    }), e.d(T, \"deregAll\", function() {\n      return u.z;\n    }), e.d(T, \"defaults\", function() {\n      return u.y;\n    }), e.d(T, \"mergeR\", function() {\n      return u.kb;\n    }), e.d(T, \"ancestors\", function() {\n      return u.k;\n    }), e.d(T, \"pick\", function() {\n      return u.tb;\n    }), e.d(T, \"omit\", function() {\n      return u.nb;\n    }), e.d(T, \"pluck\", function() {\n      return u.vb;\n    }), e.d(T, \"filter\", function() {\n      return u.D;\n    }), e.d(T, \"find\", function() {\n      return u.E;\n    }), e.d(T, \"mapObj\", function() {\n      return u.ib;\n    }), e.d(T, \"map\", function() {\n      return u.hb;\n    }), e.d(T, \"values\", function() {\n      return u.Tb;\n    }), e.d(T, \"allTrueR\", function() {\n      return u.j;\n    }), e.d(T, \"anyTrueR\", function() {\n      return u.n;\n    }), e.d(T, \"unnestR\", function() {\n      return u.Rb;\n    }), e.d(T, \"flattenR\", function() {\n      return u.G;\n    }), e.d(T, \"pushR\", function() {\n      return u.yb;\n    }), e.d(T, \"uniqR\", function() {\n      return u.Pb;\n    }), e.d(T, \"unnest\", function() {\n      return u.Qb;\n    }), e.d(T, \"flatten\", function() {\n      return u.F;\n    }), e.d(T, \"assertPredicate\", function() {\n      return u.s;\n    }), e.d(T, \"assertMap\", function() {\n      return u.r;\n    }), e.d(T, \"assertFn\", function() {\n      return u.q;\n    }), e.d(T, \"pairs\", function() {\n      return u.qb;\n    }), e.d(T, \"arrayTuples\", function() {\n      return u.p;\n    }), e.d(T, \"applyPairs\", function() {\n      return u.o;\n    }), e.d(T, \"tail\", function() {\n      return u.Lb;\n    }), e.d(T, \"copy\", function() {\n      return u.v;\n    }), e.d(T, \"_extend\", function() {\n      return u.e;\n    }), e.d(T, \"silenceUncaughtInPromise\", function() {\n      return u.Db;\n    }), e.d(T, \"silentRejection\", function() {\n      return u.Eb;\n    }), e.d(T, \"makeStub\", function() {\n      return u.gb;\n    }), e.d(T, \"services\", function() {\n      return u.Cb;\n    }), e.d(T, \"Glob\", function() {\n      return u.b;\n    }), e.d(T, \"curry\", function() {\n      return u.x;\n    }), e.d(T, \"compose\", function() {\n      return u.u;\n    }), e.d(T, \"pipe\", function() {\n      return u.ub;\n    }), e.d(T, \"prop\", function() {\n      return u.wb;\n    }), e.d(T, \"propEq\", function() {\n      return u.xb;\n    }), e.d(T, \"parse\", function() {\n      return u.rb;\n    }), e.d(T, \"not\", function() {\n      return u.mb;\n    }), e.d(T, \"and\", function() {\n      return u.l;\n    }), e.d(T, \"or\", function() {\n      return u.ob;\n    }), e.d(T, \"all\", function() {\n      return u.i;\n    }), e.d(T, \"any\", function() {\n      return u.m;\n    }), e.d(T, \"is\", function() {\n      return u.Q;\n    }), e.d(T, \"eq\", function() {\n      return u.A;\n    }), e.d(T, \"val\", function() {\n      return u.Sb;\n    }), e.d(T, \"invoke\", function() {\n      return u.P;\n    }), e.d(T, \"pattern\", function() {\n      return u.sb;\n    }), e.d(T, \"isUndefined\", function() {\n      return u.db;\n    }), e.d(T, \"isDefined\", function() {\n      return u.T;\n    }), e.d(T, \"isNull\", function() {\n      return u.W;\n    }), e.d(T, \"isNullOrUndefined\", function() {\n      return u.X;\n    }), e.d(T, \"isFunction\", function() {\n      return u.U;\n    }), e.d(T, \"isNumber\", function() {\n      return u.Y;\n    }), e.d(T, \"isString\", function() {\n      return u.cb;\n    }), e.d(T, \"isObject\", function() {\n      return u.Z;\n    }), e.d(T, \"isArray\", function() {\n      return u.R;\n    }), e.d(T, \"isDate\", function() {\n      return u.S;\n    }), e.d(T, \"isRegExp\", function() {\n      return u.bb;\n    }), e.d(T, \"isInjectable\", function() {\n      return u.V;\n    }), e.d(T, \"isPromise\", function() {\n      return u.ab;\n    }), e.d(T, \"Queue\", function() {\n      return u.c;\n    }), e.d(T, \"maxLength\", function() {\n      return u.jb;\n    }), e.d(T, \"padString\", function() {\n      return u.pb;\n    }), e.d(T, \"kebobString\", function() {\n      return u.fb;\n    }), e.d(T, \"functionToString\", function() {\n      return u.K;\n    }), e.d(T, \"fnToString\", function() {\n      return u.H;\n    }), e.d(T, \"stringify\", function() {\n      return u.Jb;\n    }), e.d(T, \"beforeAfterSubstr\", function() {\n      return u.t;\n    }), e.d(T, \"hostRegex\", function() {\n      return u.L;\n    }), e.d(T, \"stripLastPathElement\", function() {\n      return u.Kb;\n    }), e.d(T, \"splitHash\", function() {\n      return u.Gb;\n    }), e.d(T, \"splitQuery\", function() {\n      return u.Ib;\n    }), e.d(T, \"splitEqual\", function() {\n      return u.Fb;\n    }), e.d(T, \"trimHashVal\", function() {\n      return u.Ob;\n    }), e.d(T, \"splitOnDelim\", function() {\n      return u.Hb;\n    }), e.d(T, \"joinNeighborsR\", function() {\n      return u.eb;\n    }), e.d(T, \"Category\", function() {\n      return u.a;\n    }), e.d(T, \"Trace\", function() {\n      return u.d;\n    }), e.d(T, \"trace\", function() {\n      return u.Nb;\n    });\n    var A = e(26);\n    for (var w in A)\n      [\n        \"default\",\n        \"root\",\n        \"fromJson\",\n        \"toJson\",\n        \"forEach\",\n        \"extend\",\n        \"equals\",\n        \"identity\",\n        \"noop\",\n        \"createProxyFunctions\",\n        \"inherit\",\n        \"inArray\",\n        \"_inArray\",\n        \"removeFrom\",\n        \"_removeFrom\",\n        \"pushTo\",\n        \"_pushTo\",\n        \"deregAll\",\n        \"defaults\",\n        \"mergeR\",\n        \"ancestors\",\n        \"pick\",\n        \"omit\",\n        \"pluck\",\n        \"filter\",\n        \"find\",\n        \"mapObj\",\n        \"map\",\n        \"values\",\n        \"allTrueR\",\n        \"anyTrueR\",\n        \"unnestR\",\n        \"flattenR\",\n        \"pushR\",\n        \"uniqR\",\n        \"unnest\",\n        \"flatten\",\n        \"assertPredicate\",\n        \"assertMap\",\n        \"assertFn\",\n        \"pairs\",\n        \"arrayTuples\",\n        \"applyPairs\",\n        \"tail\",\n        \"copy\",\n        \"_extend\",\n        \"silenceUncaughtInPromise\",\n        \"silentRejection\",\n        \"makeStub\",\n        \"services\",\n        \"Glob\",\n        \"curry\",\n        \"compose\",\n        \"pipe\",\n        \"prop\",\n        \"propEq\",\n        \"parse\",\n        \"not\",\n        \"and\",\n        \"or\",\n        \"all\",\n        \"any\",\n        \"is\",\n        \"eq\",\n        \"val\",\n        \"invoke\",\n        \"pattern\",\n        \"isUndefined\",\n        \"isDefined\",\n        \"isNull\",\n        \"isNullOrUndefined\",\n        \"isFunction\",\n        \"isNumber\",\n        \"isString\",\n        \"isObject\",\n        \"isArray\",\n        \"isDate\",\n        \"isRegExp\",\n        \"isInjectable\",\n        \"isPromise\",\n        \"Queue\",\n        \"maxLength\",\n        \"padString\",\n        \"kebobString\",\n        \"functionToString\",\n        \"fnToString\",\n        \"stringify\",\n        \"beforeAfterSubstr\",\n        \"hostRegex\",\n        \"stripLastPathElement\",\n        \"splitHash\",\n        \"splitQuery\",\n        \"splitEqual\",\n        \"trimHashVal\",\n        \"splitOnDelim\",\n        \"joinNeighborsR\",\n        \"Category\",\n        \"Trace\",\n        \"trace\"\n      ].indexOf(w) < 0 && function(l) {\n        e.d(T, l, function() {\n          return A[l];\n        });\n      }(w);\n    var E = e(136);\n    e.d(T, \"PathNode\", function() {\n      return E.a;\n    }), e.d(T, \"PathUtils\", function() {\n      return E.b;\n    });\n    var y = e(38);\n    e.d(T, \"resolvePolicies\", function() {\n      return y.e;\n    }), e.d(T, \"defaultResolvePolicy\", function() {\n      return y.d;\n    }), e.d(T, \"Resolvable\", function() {\n      return y.b;\n    }), e.d(T, \"NATIVE_INJECTOR_TOKEN\", function() {\n      return y.a;\n    }), e.d(T, \"ResolveContext\", function() {\n      return y.c;\n    });\n    var x = e(43);\n    for (var w in x)\n      [\n        \"default\",\n        \"root\",\n        \"fromJson\",\n        \"toJson\",\n        \"forEach\",\n        \"extend\",\n        \"equals\",\n        \"identity\",\n        \"noop\",\n        \"createProxyFunctions\",\n        \"inherit\",\n        \"inArray\",\n        \"_inArray\",\n        \"removeFrom\",\n        \"_removeFrom\",\n        \"pushTo\",\n        \"_pushTo\",\n        \"deregAll\",\n        \"defaults\",\n        \"mergeR\",\n        \"ancestors\",\n        \"pick\",\n        \"omit\",\n        \"pluck\",\n        \"filter\",\n        \"find\",\n        \"mapObj\",\n        \"map\",\n        \"values\",\n        \"allTrueR\",\n        \"anyTrueR\",\n        \"unnestR\",\n        \"flattenR\",\n        \"pushR\",\n        \"uniqR\",\n        \"unnest\",\n        \"flatten\",\n        \"assertPredicate\",\n        \"assertMap\",\n        \"assertFn\",\n        \"pairs\",\n        \"arrayTuples\",\n        \"applyPairs\",\n        \"tail\",\n        \"copy\",\n        \"_extend\",\n        \"silenceUncaughtInPromise\",\n        \"silentRejection\",\n        \"makeStub\",\n        \"services\",\n        \"Glob\",\n        \"curry\",\n        \"compose\",\n        \"pipe\",\n        \"prop\",\n        \"propEq\",\n        \"parse\",\n        \"not\",\n        \"and\",\n        \"or\",\n        \"all\",\n        \"any\",\n        \"is\",\n        \"eq\",\n        \"val\",\n        \"invoke\",\n        \"pattern\",\n        \"isUndefined\",\n        \"isDefined\",\n        \"isNull\",\n        \"isNullOrUndefined\",\n        \"isFunction\",\n        \"isNumber\",\n        \"isString\",\n        \"isObject\",\n        \"isArray\",\n        \"isDate\",\n        \"isRegExp\",\n        \"isInjectable\",\n        \"isPromise\",\n        \"Queue\",\n        \"maxLength\",\n        \"padString\",\n        \"kebobString\",\n        \"functionToString\",\n        \"fnToString\",\n        \"stringify\",\n        \"beforeAfterSubstr\",\n        \"hostRegex\",\n        \"stripLastPathElement\",\n        \"splitHash\",\n        \"splitQuery\",\n        \"splitEqual\",\n        \"trimHashVal\",\n        \"splitOnDelim\",\n        \"joinNeighborsR\",\n        \"Category\",\n        \"Trace\",\n        \"trace\",\n        \"PathNode\",\n        \"PathUtils\",\n        \"resolvePolicies\",\n        \"defaultResolvePolicy\",\n        \"Resolvable\",\n        \"NATIVE_INJECTOR_TOKEN\",\n        \"ResolveContext\"\n      ].indexOf(w) < 0 && function(h) {\n        e.d(T, h, function() {\n          return x[h];\n        });\n      }(w);\n    var g = e(138);\n    e.d(T, \"TransitionHookPhase\", function() {\n      return g.h;\n    }), e.d(T, \"TransitionHookScope\", function() {\n      return g.i;\n    }), e.d(T, \"HookBuilder\", function() {\n      return g.a;\n    }), e.d(T, \"matchState\", function() {\n      return g.m;\n    }), e.d(T, \"RegisteredHook\", function() {\n      return g.b;\n    }), e.d(T, \"makeEvent\", function() {\n      return g.l;\n    }), e.d(T, \"RejectType\", function() {\n      return g.c;\n    }), e.d(T, \"Rejection\", function() {\n      return g.d;\n    }), e.d(T, \"Transition\", function() {\n      return g.e;\n    }), e.d(T, \"TransitionHook\", function() {\n      return g.g;\n    }), e.d(T, \"TransitionEventType\", function() {\n      return g.f;\n    }), e.d(T, \"defaultTransOpts\", function() {\n      return g.k;\n    }), e.d(T, \"TransitionService\", function() {\n      return g.j;\n    });\n    var o = e(139);\n    for (var w in o)\n      [\n        \"default\",\n        \"root\",\n        \"fromJson\",\n        \"toJson\",\n        \"forEach\",\n        \"extend\",\n        \"equals\",\n        \"identity\",\n        \"noop\",\n        \"createProxyFunctions\",\n        \"inherit\",\n        \"inArray\",\n        \"_inArray\",\n        \"removeFrom\",\n        \"_removeFrom\",\n        \"pushTo\",\n        \"_pushTo\",\n        \"deregAll\",\n        \"defaults\",\n        \"mergeR\",\n        \"ancestors\",\n        \"pick\",\n        \"omit\",\n        \"pluck\",\n        \"filter\",\n        \"find\",\n        \"mapObj\",\n        \"map\",\n        \"values\",\n        \"allTrueR\",\n        \"anyTrueR\",\n        \"unnestR\",\n        \"flattenR\",\n        \"pushR\",\n        \"uniqR\",\n        \"unnest\",\n        \"flatten\",\n        \"assertPredicate\",\n        \"assertMap\",\n        \"assertFn\",\n        \"pairs\",\n        \"arrayTuples\",\n        \"applyPairs\",\n        \"tail\",\n        \"copy\",\n        \"_extend\",\n        \"silenceUncaughtInPromise\",\n        \"silentRejection\",\n        \"makeStub\",\n        \"services\",\n        \"Glob\",\n        \"curry\",\n        \"compose\",\n        \"pipe\",\n        \"prop\",\n        \"propEq\",\n        \"parse\",\n        \"not\",\n        \"and\",\n        \"or\",\n        \"all\",\n        \"any\",\n        \"is\",\n        \"eq\",\n        \"val\",\n        \"invoke\",\n        \"pattern\",\n        \"isUndefined\",\n        \"isDefined\",\n        \"isNull\",\n        \"isNullOrUndefined\",\n        \"isFunction\",\n        \"isNumber\",\n        \"isString\",\n        \"isObject\",\n        \"isArray\",\n        \"isDate\",\n        \"isRegExp\",\n        \"isInjectable\",\n        \"isPromise\",\n        \"Queue\",\n        \"maxLength\",\n        \"padString\",\n        \"kebobString\",\n        \"functionToString\",\n        \"fnToString\",\n        \"stringify\",\n        \"beforeAfterSubstr\",\n        \"hostRegex\",\n        \"stripLastPathElement\",\n        \"splitHash\",\n        \"splitQuery\",\n        \"splitEqual\",\n        \"trimHashVal\",\n        \"splitOnDelim\",\n        \"joinNeighborsR\",\n        \"Category\",\n        \"Trace\",\n        \"trace\",\n        \"PathNode\",\n        \"PathUtils\",\n        \"resolvePolicies\",\n        \"defaultResolvePolicy\",\n        \"Resolvable\",\n        \"NATIVE_INJECTOR_TOKEN\",\n        \"ResolveContext\",\n        \"TransitionHookPhase\",\n        \"TransitionHookScope\",\n        \"HookBuilder\",\n        \"matchState\",\n        \"RegisteredHook\",\n        \"makeEvent\",\n        \"RejectType\",\n        \"Rejection\",\n        \"Transition\",\n        \"TransitionHook\",\n        \"TransitionEventType\",\n        \"defaultTransOpts\",\n        \"TransitionService\"\n      ].indexOf(w) < 0 && function(h) {\n        e.d(T, h, function() {\n          return o[h];\n        });\n      }(w);\n    var c = e(141);\n    for (var w in c)\n      [\n        \"default\",\n        \"root\",\n        \"fromJson\",\n        \"toJson\",\n        \"forEach\",\n        \"extend\",\n        \"equals\",\n        \"identity\",\n        \"noop\",\n        \"createProxyFunctions\",\n        \"inherit\",\n        \"inArray\",\n        \"_inArray\",\n        \"removeFrom\",\n        \"_removeFrom\",\n        \"pushTo\",\n        \"_pushTo\",\n        \"deregAll\",\n        \"defaults\",\n        \"mergeR\",\n        \"ancestors\",\n        \"pick\",\n        \"omit\",\n        \"pluck\",\n        \"filter\",\n        \"find\",\n        \"mapObj\",\n        \"map\",\n        \"values\",\n        \"allTrueR\",\n        \"anyTrueR\",\n        \"unnestR\",\n        \"flattenR\",\n        \"pushR\",\n        \"uniqR\",\n        \"unnest\",\n        \"flatten\",\n        \"assertPredicate\",\n        \"assertMap\",\n        \"assertFn\",\n        \"pairs\",\n        \"arrayTuples\",\n        \"applyPairs\",\n        \"tail\",\n        \"copy\",\n        \"_extend\",\n        \"silenceUncaughtInPromise\",\n        \"silentRejection\",\n        \"makeStub\",\n        \"services\",\n        \"Glob\",\n        \"curry\",\n        \"compose\",\n        \"pipe\",\n        \"prop\",\n        \"propEq\",\n        \"parse\",\n        \"not\",\n        \"and\",\n        \"or\",\n        \"all\",\n        \"any\",\n        \"is\",\n        \"eq\",\n        \"val\",\n        \"invoke\",\n        \"pattern\",\n        \"isUndefined\",\n        \"isDefined\",\n        \"isNull\",\n        \"isNullOrUndefined\",\n        \"isFunction\",\n        \"isNumber\",\n        \"isString\",\n        \"isObject\",\n        \"isArray\",\n        \"isDate\",\n        \"isRegExp\",\n        \"isInjectable\",\n        \"isPromise\",\n        \"Queue\",\n        \"maxLength\",\n        \"padString\",\n        \"kebobString\",\n        \"functionToString\",\n        \"fnToString\",\n        \"stringify\",\n        \"beforeAfterSubstr\",\n        \"hostRegex\",\n        \"stripLastPathElement\",\n        \"splitHash\",\n        \"splitQuery\",\n        \"splitEqual\",\n        \"trimHashVal\",\n        \"splitOnDelim\",\n        \"joinNeighborsR\",\n        \"Category\",\n        \"Trace\",\n        \"trace\",\n        \"PathNode\",\n        \"PathUtils\",\n        \"resolvePolicies\",\n        \"defaultResolvePolicy\",\n        \"Resolvable\",\n        \"NATIVE_INJECTOR_TOKEN\",\n        \"ResolveContext\",\n        \"TransitionHookPhase\",\n        \"TransitionHookScope\",\n        \"HookBuilder\",\n        \"matchState\",\n        \"RegisteredHook\",\n        \"makeEvent\",\n        \"RejectType\",\n        \"Rejection\",\n        \"Transition\",\n        \"TransitionHook\",\n        \"TransitionEventType\",\n        \"defaultTransOpts\",\n        \"TransitionService\"\n      ].indexOf(w) < 0 && function(h) {\n        e.d(T, h, function() {\n          return c[h];\n        });\n      }(w);\n    var a = e(103);\n    e.d(T, \"UIRouterGlobals\", function() {\n      return a.a;\n    });\n    var n = e(99);\n    e.d(T, \"UIRouter\", function() {\n      return n.a;\n    });\n    var t = e(143);\n    for (var w in t)\n      [\n        \"default\",\n        \"root\",\n        \"fromJson\",\n        \"toJson\",\n        \"forEach\",\n        \"extend\",\n        \"equals\",\n        \"identity\",\n        \"noop\",\n        \"createProxyFunctions\",\n        \"inherit\",\n        \"inArray\",\n        \"_inArray\",\n        \"removeFrom\",\n        \"_removeFrom\",\n        \"pushTo\",\n        \"_pushTo\",\n        \"deregAll\",\n        \"defaults\",\n        \"mergeR\",\n        \"ancestors\",\n        \"pick\",\n        \"omit\",\n        \"pluck\",\n        \"filter\",\n        \"find\",\n        \"mapObj\",\n        \"map\",\n        \"values\",\n        \"allTrueR\",\n        \"anyTrueR\",\n        \"unnestR\",\n        \"flattenR\",\n        \"pushR\",\n        \"uniqR\",\n        \"unnest\",\n        \"flatten\",\n        \"assertPredicate\",\n        \"assertMap\",\n        \"assertFn\",\n        \"pairs\",\n        \"arrayTuples\",\n        \"applyPairs\",\n        \"tail\",\n        \"copy\",\n        \"_extend\",\n        \"silenceUncaughtInPromise\",\n        \"silentRejection\",\n        \"makeStub\",\n        \"services\",\n        \"Glob\",\n        \"curry\",\n        \"compose\",\n        \"pipe\",\n        \"prop\",\n        \"propEq\",\n        \"parse\",\n        \"not\",\n        \"and\",\n        \"or\",\n        \"all\",\n        \"any\",\n        \"is\",\n        \"eq\",\n        \"val\",\n        \"invoke\",\n        \"pattern\",\n        \"isUndefined\",\n        \"isDefined\",\n        \"isNull\",\n        \"isNullOrUndefined\",\n        \"isFunction\",\n        \"isNumber\",\n        \"isString\",\n        \"isObject\",\n        \"isArray\",\n        \"isDate\",\n        \"isRegExp\",\n        \"isInjectable\",\n        \"isPromise\",\n        \"Queue\",\n        \"maxLength\",\n        \"padString\",\n        \"kebobString\",\n        \"functionToString\",\n        \"fnToString\",\n        \"stringify\",\n        \"beforeAfterSubstr\",\n        \"hostRegex\",\n        \"stripLastPathElement\",\n        \"splitHash\",\n        \"splitQuery\",\n        \"splitEqual\",\n        \"trimHashVal\",\n        \"splitOnDelim\",\n        \"joinNeighborsR\",\n        \"Category\",\n        \"Trace\",\n        \"trace\",\n        \"PathNode\",\n        \"PathUtils\",\n        \"resolvePolicies\",\n        \"defaultResolvePolicy\",\n        \"Resolvable\",\n        \"NATIVE_INJECTOR_TOKEN\",\n        \"ResolveContext\",\n        \"TransitionHookPhase\",\n        \"TransitionHookScope\",\n        \"HookBuilder\",\n        \"matchState\",\n        \"RegisteredHook\",\n        \"makeEvent\",\n        \"RejectType\",\n        \"Rejection\",\n        \"Transition\",\n        \"TransitionHook\",\n        \"TransitionEventType\",\n        \"defaultTransOpts\",\n        \"TransitionService\",\n        \"UIRouterGlobals\",\n        \"UIRouter\"\n      ].indexOf(w) < 0 && function(h) {\n        e.d(T, h, function() {\n          return t[h];\n        });\n      }(w);\n    var r = e(147);\n    e.d(T, \"UIRouterPluginBase\", function() {\n      return r.a;\n    });\n  },\n  function(L, T, e) {\n    e.d(T, \"e\", function() {\n      return A;\n    }), e.d(T, \"d\", function() {\n      return w;\n    }), e.d(T, \"m\", function() {\n      return E;\n    }), e.d(T, \"n\", function() {\n      return y;\n    }), e.d(T, \"o\", function() {\n      return x;\n    }), e.d(T, \"k\", function() {\n      return g;\n    }), e.d(T, \"i\", function() {\n      return o;\n    }), e.d(T, \"b\", function() {\n      return c;\n    }), e.d(T, \"j\", function() {\n      return a;\n    }), e.d(T, \"a\", function() {\n      return n;\n    }), e.d(T, \"c\", function() {\n      return t;\n    }), e.d(T, \"h\", function() {\n      return r;\n    }), e.d(T, \"f\", function() {\n      return l;\n    }), e.d(T, \"p\", function() {\n      return h;\n    }), e.d(T, \"g\", function() {\n      return i;\n    }), e.d(T, \"l\", function() {\n      return d;\n    });\n    var u = function() {\n      for (var p = 0, f = 0, v = arguments.length; f < v; f++)\n        p += arguments[f].length;\n      var k = Array(p), s = 0;\n      for (f = 0; f < v; f++)\n        for (var S = arguments[f], j = 0, I = S.length; j < I; j++, s++)\n          k[s] = S[j];\n      return k;\n    };\n    function A(p) {\n      return function f() {\n        if (arguments.length >= p.length) return p.apply(this, arguments);\n        var v = Array.prototype.slice.call(arguments);\n        return f.bind.apply(f, u([this], v));\n      };\n    }\n    function w() {\n      var p = arguments, f = p.length - 1;\n      return function() {\n        for (var v = f, k = p[f].apply(this, arguments); v--; )\n          k = p[v].call(this, k);\n        return k;\n      };\n    }\n    function E() {\n      for (var p = [], f = 0; f < arguments.length; f++) p[f] = arguments[f];\n      return w.apply(null, [].slice.call(arguments).reverse());\n    }\n    var y = function(p) {\n      return function(f) {\n        return f && f[p];\n      };\n    }, x = A(function(p, f, v) {\n      return v && v[p] === f;\n    }), g = function(p) {\n      return E.apply(null, p.split(\".\").map(y));\n    }, o = function(p) {\n      return function() {\n        for (var f = [], v = 0; v < arguments.length; v++)\n          f[v] = arguments[v];\n        return !p.apply(null, f);\n      };\n    };\n    function c(p, f) {\n      return function() {\n        for (var v = [], k = 0; k < arguments.length; k++) v[k] = arguments[k];\n        return p.apply(null, v) && f.apply(null, v);\n      };\n    }\n    function a(p, f) {\n      return function() {\n        for (var v = [], k = 0; k < arguments.length; k++) v[k] = arguments[k];\n        return p.apply(null, v) || f.apply(null, v);\n      };\n    }\n    var n = function(p) {\n      return function(f) {\n        return f.reduce(function(v, k) {\n          return v && !!p(k);\n        }, !0);\n      };\n    }, t = function(p) {\n      return function(f) {\n        return f.reduce(function(v, k) {\n          return v || !!p(k);\n        }, !1);\n      };\n    }, r = function(p) {\n      return function(f) {\n        return f != null && f.constructor === p || f instanceof p;\n      };\n    }, l = function(p) {\n      return function(f) {\n        return p === f;\n      };\n    }, h = function(p) {\n      return function() {\n        return p;\n      };\n    };\n    function i(p, f) {\n      return function(v) {\n        return v[p].apply(v, f);\n      };\n    }\n    function d(p) {\n      return function(f) {\n        for (var v = 0; v < p.length; v++) if (p[v][0](f)) return p[v][1](f);\n      };\n    }\n  },\n  function(L, T, e) {\n    var u = e(0);\n    e.d(T, \"e\", function() {\n      return u.a;\n    }), e.d(T, \"f\", function() {\n      return u.b;\n    }), e.d(T, \"g\", function() {\n      return u.c;\n    }), e.d(T, \"h\", function() {\n      return u.d;\n    }), e.d(T, \"j\", function() {\n      return u.e;\n    }), e.d(T, \"k\", function() {\n      return u.f;\n    }), e.d(T, \"n\", function() {\n      return u.g;\n    }), e.d(T, \"o\", function() {\n      return u.h;\n    }), e.d(T, \"p\", function() {\n      return u.i;\n    }), e.d(T, \"q\", function() {\n      return u.j;\n    }), e.d(T, \"r\", function() {\n      return u.k;\n    }), e.d(T, \"s\", function() {\n      return u.l;\n    }), e.d(T, \"v\", function() {\n      return u.m;\n    }), e.d(T, \"w\", function() {\n      return u.n;\n    }), e.d(T, \"y\", function() {\n      return u.o;\n    }), e.d(T, \"z\", function() {\n      return u.p;\n    }), e.d(T, \"B\", function() {\n      return u.q;\n    }), e.d(T, \"C\", function() {\n      return u.r;\n    }), e.d(T, \"D\", function() {\n      return u.s;\n    }), e.d(T, \"E\", function() {\n      return u.t;\n    }), e.d(T, \"F\", function() {\n      return u.u;\n    }), e.d(T, \"G\", function() {\n      return u.v;\n    }), e.d(T, \"I\", function() {\n      return u.w;\n    }), e.d(T, \"J\", function() {\n      return u.x;\n    }), e.d(T, \"M\", function() {\n      return u.y;\n    }), e.d(T, \"N\", function() {\n      return u.z;\n    }), e.d(T, \"O\", function() {\n      return u.A;\n    }), e.d(T, \"hb\", function() {\n      return u.B;\n    }), e.d(T, \"ib\", function() {\n      return u.C;\n    }), e.d(T, \"kb\", function() {\n      return u.D;\n    }), e.d(T, \"lb\", function() {\n      return u.E;\n    }), e.d(T, \"nb\", function() {\n      return u.F;\n    }), e.d(T, \"qb\", function() {\n      return u.G;\n    }), e.d(T, \"tb\", function() {\n      return u.H;\n    }), e.d(T, \"vb\", function() {\n      return u.I;\n    }), e.d(T, \"yb\", function() {\n      return u.J;\n    }), e.d(T, \"zb\", function() {\n      return u.K;\n    }), e.d(T, \"Ab\", function() {\n      return u.L;\n    }), e.d(T, \"Bb\", function() {\n      return u.M;\n    }), e.d(T, \"Db\", function() {\n      return u.N;\n    }), e.d(T, \"Eb\", function() {\n      return u.O;\n    }), e.d(T, \"Lb\", function() {\n      return u.P;\n    }), e.d(T, \"Mb\", function() {\n      return u.Q;\n    }), e.d(T, \"Pb\", function() {\n      return u.R;\n    }), e.d(T, \"Qb\", function() {\n      return u.S;\n    }), e.d(T, \"Rb\", function() {\n      return u.T;\n    }), e.d(T, \"Tb\", function() {\n      return u.U;\n    });\n    var A = e(6);\n    e.d(T, \"gb\", function() {\n      return A.a;\n    }), e.d(T, \"Cb\", function() {\n      return A.b;\n    });\n    var w = e(62);\n    e.d(T, \"b\", function() {\n      return w.a;\n    });\n    var E = e(3);\n    e.d(T, \"i\", function() {\n      return E.a;\n    }), e.d(T, \"l\", function() {\n      return E.b;\n    }), e.d(T, \"m\", function() {\n      return E.c;\n    }), e.d(T, \"u\", function() {\n      return E.d;\n    }), e.d(T, \"x\", function() {\n      return E.e;\n    }), e.d(T, \"A\", function() {\n      return E.f;\n    }), e.d(T, \"P\", function() {\n      return E.g;\n    }), e.d(T, \"Q\", function() {\n      return E.h;\n    }), e.d(T, \"mb\", function() {\n      return E.i;\n    }), e.d(T, \"ob\", function() {\n      return E.j;\n    }), e.d(T, \"rb\", function() {\n      return E.k;\n    }), e.d(T, \"sb\", function() {\n      return E.l;\n    }), e.d(T, \"ub\", function() {\n      return E.m;\n    }), e.d(T, \"wb\", function() {\n      return E.n;\n    }), e.d(T, \"xb\", function() {\n      return E.o;\n    }), e.d(T, \"Sb\", function() {\n      return E.p;\n    });\n    var y = e(1);\n    e.d(T, \"R\", function() {\n      return y.a;\n    }), e.d(T, \"S\", function() {\n      return y.b;\n    }), e.d(T, \"T\", function() {\n      return y.c;\n    }), e.d(T, \"U\", function() {\n      return y.d;\n    }), e.d(T, \"V\", function() {\n      return y.e;\n    }), e.d(T, \"W\", function() {\n      return y.f;\n    }), e.d(T, \"X\", function() {\n      return y.g;\n    }), e.d(T, \"Y\", function() {\n      return y.h;\n    }), e.d(T, \"Z\", function() {\n      return y.i;\n    }), e.d(T, \"ab\", function() {\n      return y.j;\n    }), e.d(T, \"bb\", function() {\n      return y.k;\n    }), e.d(T, \"cb\", function() {\n      return y.l;\n    }), e.d(T, \"db\", function() {\n      return y.m;\n    });\n    var x = e(50);\n    e.d(T, \"c\", function() {\n      return x.a;\n    });\n    var g = e(7);\n    e.d(T, \"t\", function() {\n      return g.a;\n    }), e.d(T, \"H\", function() {\n      return g.b;\n    }), e.d(T, \"K\", function() {\n      return g.c;\n    }), e.d(T, \"L\", function() {\n      return g.d;\n    }), e.d(T, \"eb\", function() {\n      return g.e;\n    }), e.d(T, \"fb\", function() {\n      return g.f;\n    }), e.d(T, \"jb\", function() {\n      return g.g;\n    }), e.d(T, \"pb\", function() {\n      return g.h;\n    }), e.d(T, \"Fb\", function() {\n      return g.i;\n    }), e.d(T, \"Gb\", function() {\n      return g.j;\n    }), e.d(T, \"Hb\", function() {\n      return g.k;\n    }), e.d(T, \"Ib\", function() {\n      return g.l;\n    }), e.d(T, \"Jb\", function() {\n      return g.m;\n    }), e.d(T, \"Kb\", function() {\n      return g.n;\n    }), e.d(T, \"Ob\", function() {\n      return g.o;\n    });\n    var o = e(10);\n    e.d(T, \"a\", function() {\n      return o.a;\n    }), e.d(T, \"d\", function() {\n      return o.b;\n    }), e.d(T, \"Nb\", function() {\n      return o.c;\n    });\n  },\n  function(L, T, e) {\n    (function(u) {\n      e.d(T, \"e\", function() {\n        return A;\n      }), e.d(T, \"p\", function() {\n        return w;\n      }), e.d(T, \"a\", function() {\n        return E;\n      }), e.d(T, \"c\", function() {\n        return y;\n      }), e.d(T, \"d\", function() {\n        return x;\n      }), e.d(T, \"o\", function() {\n        return g;\n      }), e.d(T, \"q\", function() {\n        return o;\n      }), e.d(T, \"t\", function() {\n        return c;\n      }), e.d(T, \"i\", function() {\n        return a;\n      }), e.d(T, \"r\", function() {\n        return n;\n      }), e.d(T, \"s\", function() {\n        return t;\n      }), e.d(T, \"k\", function() {\n        return r;\n      }), e.d(T, \"m\", function() {\n        return l;\n      }), e.d(T, \"j\", function() {\n        return h;\n      }), e.d(T, \"l\", function() {\n        return i;\n      }), e.d(T, \"g\", function() {\n        return d;\n      }), e.d(T, \"f\", function() {\n        return p;\n      }), e.d(T, \"h\", function() {\n        return f;\n      }), e.d(T, \"n\", function() {\n        return v;\n      }), e.d(T, \"b\", function() {\n        return k;\n      });\n      var A = \"1.13.4\", w = typeof self == \"object\" && self.self === self && self || typeof u == \"object\" && u.global === u && u || Function(\"return this\")() || {}, E = Array.prototype, y = Object.prototype, x = typeof Symbol < \"u\" ? Symbol.prototype : null, g = E.push, o = E.slice, c = y.toString, a = y.hasOwnProperty, n = typeof ArrayBuffer < \"u\", t = typeof DataView < \"u\", r = Array.isArray, l = Object.keys, h = Object.create, i = n && ArrayBuffer.isView, d = isNaN, p = isFinite, f = !{ toString: null }.propertyIsEnumerable(\"toString\"), v = [\n        \"valueOf\",\n        \"isPrototypeOf\",\n        \"toString\",\n        \"propertyIsEnumerable\",\n        \"hasOwnProperty\",\n        \"toLocaleString\"\n      ], k = Math.pow(2, 53) - 1;\n    }).call(this, e(35));\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return u;\n    }), e.d(T, \"b\", function() {\n      return A;\n    });\n    var u = function(w, E) {\n      return E.reduce(function(y, x) {\n        return y[x] = (g = w + \".\" + x + \"()\", function() {\n          throw new Error(\n            \"No implementation for \" + g + \". The framework specific code did not implement this method.\"\n          );\n        }), y;\n        var g;\n      }, {});\n    }, A = { $q: void 0, $injector: void 0 };\n  },\n  function(L, T, e) {\n    e.d(T, \"g\", function() {\n      return y;\n    }), e.d(T, \"h\", function() {\n      return x;\n    }), e.d(T, \"f\", function() {\n      return g;\n    }), e.d(T, \"c\", function() {\n      return o;\n    }), e.d(T, \"b\", function() {\n      return c;\n    }), e.d(T, \"m\", function() {\n      return t;\n    }), e.d(T, \"a\", function() {\n      return r;\n    }), e.d(T, \"d\", function() {\n      return l;\n    }), e.d(T, \"n\", function() {\n      return h;\n    }), e.d(T, \"j\", function() {\n      return i;\n    }), e.d(T, \"l\", function() {\n      return d;\n    }), e.d(T, \"i\", function() {\n      return p;\n    }), e.d(T, \"o\", function() {\n      return f;\n    }), e.d(T, \"k\", function() {\n      return v;\n    }), e.d(T, \"e\", function() {\n      return k;\n    });\n    var u = e(1), A = e(8), w = e(0), E = e(3);\n    function y(s, S) {\n      return S.length <= s ? S : S.substr(0, s - 3) + \"...\";\n    }\n    function x(s, S) {\n      for (; S.length < s; ) S += \" \";\n      return S;\n    }\n    function g(s) {\n      return s.replace(/^([A-Z])/, function(S) {\n        return S.toLowerCase();\n      }).replace(/([A-Z])/g, function(S) {\n        return \"-\" + S.toLowerCase();\n      });\n    }\n    function o(s) {\n      var S = c(s), j = S.match(/^(function [^ ]+\\([^)]*\\))/), I = j ? j[1] : S, R = s.name || \"\";\n      return R && I.match(/function \\(/) ? \"function \" + R + I.substr(9) : I;\n    }\n    function c(s) {\n      var S = Object(u.a)(s) ? s.slice(-1)[0] : s;\n      return S && S.toString() || \"undefined\";\n    }\n    var a = A.b.isRejectionPromise, n = Object(E.l)([\n      [u.m, Object(E.p)(\"undefined\")],\n      [u.f, Object(E.p)(\"null\")],\n      [u.j, Object(E.p)(\"[Promise]\")],\n      [\n        a,\n        function(s) {\n          return s._transitionRejection.toString();\n        }\n      ],\n      [\n        function(s) {\n          return Object(u.i)(s) && !Object(u.a)(s) && s.constructor !== Object && Object(u.d)(s.toString);\n        },\n        function(s) {\n          return s.toString();\n        }\n      ],\n      [u.e, o],\n      [Object(E.p)(!0), w.y]\n    ]);\n    function t(s) {\n      var S = [];\n      function j(I) {\n        if (Object(u.i)(I)) {\n          if (S.indexOf(I) !== -1) return \"[circular ref]\";\n          S.push(I);\n        }\n        return n(I);\n      }\n      return Object(u.m)(s) ? j(s) : JSON.stringify(s, function(I, R) {\n        return j(R);\n      }).replace(/\\\\\"/g, '\"');\n    }\n    var r = function(s) {\n      return function(S) {\n        if (!S) return [\"\", \"\"];\n        var j = S.indexOf(s);\n        return j === -1 ? [S, \"\"] : [S.substr(0, j), S.substr(j + 1)];\n      };\n    }, l = new RegExp(\"^(?:[a-z]+:)?//[^/]+/\"), h = function(s) {\n      return s.replace(/\\/[^/]*$/, \"\");\n    }, i = r(\"#\"), d = r(\"?\"), p = r(\"=\"), f = function(s) {\n      return s ? s.replace(/^#/, \"\") : \"\";\n    };\n    function v(s) {\n      var S = new RegExp(\"(\" + s + \")\", \"g\");\n      return function(j) {\n        return j.split(S).filter(w.y);\n      };\n    }\n    function k(s, S) {\n      return Object(u.l)(Object(w.P)(s)) && Object(u.l)(S) ? s.slice(0, -1).concat(Object(w.P)(s) + S) : Object(w.J)(s, S);\n    }\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return u;\n    }), e.d(T, \"b\", function() {\n      return x;\n    });\n    var u, A = e(0), w = e(7), E = e(3);\n    (function(g) {\n      g[g.SUPERSEDED = 2] = \"SUPERSEDED\", g[g.ABORTED = 3] = \"ABORTED\", g[g.INVALID = 4] = \"INVALID\", g[g.IGNORED = 5] = \"IGNORED\", g[g.ERROR = 6] = \"ERROR\";\n    })(u || (u = {}));\n    var y = 0, x = function() {\n      function g(o, c, a) {\n        this.$id = y++, this.type = o, this.message = c, this.detail = a;\n      }\n      return g.isRejectionPromise = function(o) {\n        return o && typeof o.then == \"function\" && Object(E.h)(g)(o._transitionRejection);\n      }, g.superseded = function(o, c) {\n        var a = new g(\n          u.SUPERSEDED,\n          \"The transition has been superseded by a different transition\",\n          o\n        );\n        return c && c.redirected && (a.redirected = !0), a;\n      }, g.redirected = function(o) {\n        return g.superseded(o, { redirected: !0 });\n      }, g.invalid = function(o) {\n        return new g(u.INVALID, \"This transition is invalid\", o);\n      }, g.ignored = function(o) {\n        return new g(u.IGNORED, \"The transition was ignored\", o);\n      }, g.aborted = function(o) {\n        return new g(u.ABORTED, \"The transition has been aborted\", o);\n      }, g.errored = function(o) {\n        return new g(u.ERROR, \"The transition errored\", o);\n      }, g.normalize = function(o) {\n        return Object(E.h)(g)(o) ? o : g.errored(o);\n      }, g.prototype.toString = function() {\n        var o, c = (o = this.detail) && o.toString !== Object.prototype.toString ? o.toString() : Object(w.m)(o);\n        return \"Transition Rejection($id: \" + this.$id + \" type: \" + this.type + \", message: \" + this.message + \", detail: \" + c + \")\";\n      }, g.prototype.toPromise = function() {\n        return Object(A.r)(Object(A.O)(this), {\n          _transitionRejection: this\n        });\n      }, g;\n    }();\n  },\n  function(L, T, e) {\n    e(208), L.exports = angular;\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return x;\n    }), e.d(T, \"b\", function() {\n      return n;\n    }), e.d(T, \"c\", function() {\n      return t;\n    });\n    var u = e(3), A = e(1), w = e(7), E = e(19);\n    function y(r) {\n      if (!r) return \"ui-view (defunct)\";\n      var l = r.creationContext ? r.creationContext.name || \"(root)\" : \"(none)\";\n      return \"[ui-view#\" + r.id + \" \" + r.$type + \":\" + r.fqn + \" (\" + r.name + \"@\" + l + \")]\";\n    }\n    var x;\n    function g(r) {\n      return Object(A.h)(r) ? x[r] : x[x[r]];\n    }\n    (function(r) {\n      r[r.RESOLVE = 0] = \"RESOLVE\", r[r.TRANSITION = 1] = \"TRANSITION\", r[r.HOOK = 2] = \"HOOK\", r[r.UIVIEW = 3] = \"UIVIEW\", r[r.VIEWCONFIG = 4] = \"VIEWCONFIG\";\n    })(x || (x = {}));\n    var o = Object(u.k)(\"$id\"), c = Object(u.k)(\"router.$id\"), a = function(r) {\n      return \"Transition #\" + o(r) + \"-\" + c(r);\n    }, n = function() {\n      function r() {\n        this._enabled = {}, this.approximateDigests = 0;\n      }\n      return r.prototype._set = function(l, h) {\n        var i = this;\n        h.length || (h = Object.keys(x).map(function(d) {\n          return parseInt(d, 10);\n        }).filter(function(d) {\n          return !isNaN(d);\n        }).map(function(d) {\n          return x[d];\n        })), h.map(g).forEach(function(d) {\n          return i._enabled[d] = l;\n        });\n      }, r.prototype.enable = function() {\n        for (var l = [], h = 0; h < arguments.length; h++)\n          l[h] = arguments[h];\n        this._set(!0, l);\n      }, r.prototype.disable = function() {\n        for (var l = [], h = 0; h < arguments.length; h++)\n          l[h] = arguments[h];\n        this._set(!1, l);\n      }, r.prototype.enabled = function(l) {\n        return !!this._enabled[g(l)];\n      }, r.prototype.traceTransitionStart = function(l) {\n        this.enabled(x.TRANSITION) && E.a.log(a(l) + \": Started  -> \" + Object(w.m)(l));\n      }, r.prototype.traceTransitionIgnored = function(l) {\n        this.enabled(x.TRANSITION) && E.a.log(a(l) + \": Ignored  <> \" + Object(w.m)(l));\n      }, r.prototype.traceHookInvocation = function(l, h, i) {\n        if (this.enabled(x.HOOK)) {\n          var d = Object(u.k)(\"traceData.hookType\")(i) || \"internal\", p = Object(u.k)(\"traceData.context.state.name\")(i) || Object(u.k)(\"traceData.context\")(i) || \"unknown\", f = Object(w.c)(l.registeredHook.callback);\n          E.a.log(\n            a(h) + \":   Hook -> \" + d + \" context: \" + p + \", \" + Object(w.g)(200, f)\n          );\n        }\n      }, r.prototype.traceHookResult = function(l, h, i) {\n        this.enabled(x.HOOK) && E.a.log(\n          a(h) + \":   <- Hook returned: \" + Object(w.g)(200, Object(w.m)(l))\n        );\n      }, r.prototype.traceResolvePath = function(l, h, i) {\n        this.enabled(x.RESOLVE) && E.a.log(a(i) + \":         Resolving \" + l + \" (\" + h + \")\");\n      }, r.prototype.traceResolvableResolved = function(l, h) {\n        this.enabled(x.RESOLVE) && E.a.log(\n          a(h) + \":               <- Resolved  \" + l + \" to: \" + Object(w.g)(200, Object(w.m)(l.data))\n        );\n      }, r.prototype.traceError = function(l, h) {\n        this.enabled(x.TRANSITION) && E.a.log(\n          a(h) + \": <- Rejected \" + Object(w.m)(h) + \", reason: \" + l\n        );\n      }, r.prototype.traceSuccess = function(l, h) {\n        this.enabled(x.TRANSITION) && E.a.log(\n          a(h) + \": <- Success  \" + Object(w.m)(h) + \", final state: \" + l.name\n        );\n      }, r.prototype.traceUIViewEvent = function(l, h, i) {\n        i === void 0 && (i = \"\"), this.enabled(x.UIVIEW) && E.a.log(\"ui-view: \" + Object(w.h)(30, l) + \" \" + y(h) + i);\n      }, r.prototype.traceUIViewConfigUpdated = function(l, h) {\n        this.enabled(x.UIVIEW) && this.traceUIViewEvent(\n          \"Updating\",\n          l,\n          \" with ViewConfig from context='\" + h + \"'\"\n        );\n      }, r.prototype.traceUIViewFill = function(l, h) {\n        this.enabled(x.UIVIEW) && this.traceUIViewEvent(\"Fill\", l, \" with: \" + Object(w.g)(200, h));\n      }, r.prototype.traceViewSync = function(l) {\n        if (this.enabled(x.VIEWCONFIG)) {\n          var h = \"uiview component fqn\", i = l.map(function(d) {\n            var p, f = d.uiView, v = d.viewConfig, k = f && f.fqn, s = v && v.viewDecl.$context.name + \": (\" + v.viewDecl.$name + \")\";\n            return (p = {})[h] = k, p[\"view config state (view name)\"] = s, p;\n          }).sort(function(d, p) {\n            return (d[h] || \"\").localeCompare(p[h] || \"\");\n          });\n          E.a.table(i);\n        }\n      }, r.prototype.traceViewServiceEvent = function(l, h) {\n        this.enabled(x.VIEWCONFIG) && E.a.log(\n          \"VIEWCONFIG: \" + l + \" \" + function(i) {\n            var d = i.viewDecl, p = d.$context.name || \"(root)\";\n            return \"[View#\" + i.$id + \" from '\" + p + \"' state]: target ui-view: '\" + d.$uiViewName + \"@\" + d.$uiViewContextAnchor + \"'\";\n          }(h)\n        );\n      }, r.prototype.traceViewServiceUIViewEvent = function(l, h) {\n        this.enabled(x.VIEWCONFIG) && E.a.log(\"VIEWCONFIG: \" + l + \" \" + y(h));\n      }, r;\n    }(), t = new n();\n  },\n  function(L, T, e) {\n    var u;\n    try {\n      u = {\n        cloneDeep: e(360),\n        constant: e(126),\n        defaults: e(361),\n        each: e(167),\n        filter: e(170),\n        find: e(362),\n        flatten: e(197),\n        forEach: e(168),\n        forIn: e(369),\n        has: e(181),\n        isUndefined: e(182),\n        last: e(370),\n        map: e(183),\n        mapValues: e(371),\n        max: e(372),\n        merge: e(374),\n        min: e(380),\n        minBy: e(381),\n        now: e(382),\n        pick: e(383),\n        range: e(388),\n        reduce: e(185),\n        sortBy: e(391),\n        uniqueId: e(396),\n        values: e(190),\n        zipObject: e(397)\n      };\n    } catch {\n    }\n    u || (u = window._), L.exports = u;\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return w;\n    });\n    var u = e(9), A = angular, w = u && u.module ? u : A;\n  },\n  function(L, T) {\n    var e = Array.isArray;\n    L.exports = e;\n  },\n  function(L, T, e) {\n    var u, A;\n    e.d(T, \"a\", function() {\n      return u;\n    }), e.d(T, \"b\", function() {\n      return A;\n    }), function(w) {\n      w[w.CREATE = 0] = \"CREATE\", w[w.BEFORE = 1] = \"BEFORE\", w[w.RUN = 2] = \"RUN\", w[w.SUCCESS = 3] = \"SUCCESS\", w[w.ERROR = 4] = \"ERROR\";\n    }(u || (u = {})), function(w) {\n      w[w.TRANSITION = 0] = \"TRANSITION\", w[w.STATE = 1] = \"STATE\";\n    }(A || (A = {}));\n  },\n  function(L, T, e) {\n    e.d(T, \"b\", function() {\n      return x;\n    }), e.d(T, \"a\", function() {\n      return g;\n    });\n    var u = e(0), A = e(6), w = e(10), E = e(7), y = e(1), x = { when: \"LAZY\", async: \"WAIT\" }, g = function() {\n      function o(c, a, n, t, r) {\n        if (this.resolved = !1, this.promise = void 0, c instanceof o)\n          Object(u.r)(this, c);\n        else if (Object(y.d)(a)) {\n          if (Object(y.g)(c))\n            throw new Error(\"new Resolvable(): token argument is required\");\n          if (!Object(y.d)(a))\n            throw new Error(\n              \"new Resolvable(): resolveFn argument must be a function\"\n            );\n          this.token = c, this.policy = t, this.resolveFn = a, this.deps = n || [], this.data = r, this.resolved = r !== void 0, this.promise = this.resolved ? A.b.$q.when(this.data) : void 0;\n        } else if (Object(y.i)(c) && c.token && (c.hasOwnProperty(\"resolveFn\") || c.hasOwnProperty(\"data\"))) {\n          var l = c;\n          return new o(l.token, l.resolveFn, l.deps, l.policy, l.data);\n        }\n      }\n      return o.prototype.getPolicy = function(c) {\n        var a = this.policy || {}, n = c && c.resolvePolicy || {};\n        return {\n          when: a.when || n.when || x.when,\n          async: a.async || n.async || x.async\n        };\n      }, o.prototype.resolve = function(c, a) {\n        var n = this, t = A.b.$q, r = c.findNode(this), l = r && r.state, h = this.getPolicy(l).async, i = Object(y.d)(h) ? h : u.y;\n        return this.promise = t.when().then(function() {\n          return t.all(\n            c.getDependencies(n).map(function(d) {\n              return d.get(c, a);\n            })\n          );\n        }).then(function(d) {\n          return n.resolveFn.apply(null, d);\n        }).then(i).then(function(d) {\n          return n.data = d, n.resolved = !0, n.resolveFn = null, w.c.traceResolvableResolved(n, a), n.data;\n        });\n      }, o.prototype.get = function(c, a) {\n        return this.promise || this.resolve(c, a);\n      }, o.prototype.toString = function() {\n        return \"Resolvable(token: \" + Object(E.m)(this.token) + \", requires: [\" + this.deps.map(E.m) + \"])\";\n      }, o.prototype.clone = function() {\n        return new o(this);\n      }, o.fromData = function(c, a) {\n        return new o(\n          c,\n          function() {\n            return a;\n          },\n          null,\n          null,\n          a\n        );\n      }, o;\n    }();\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return u;\n    }), e.d(T, \"b\", function() {\n      return c;\n    });\n    var u, A = e(0), w = e(3), E = e(1), y = e(6), x = e(51), g = Object.prototype.hasOwnProperty;\n    function o(a, n, t) {\n      var r = t.reloadOnSearch === !1 && n === u.SEARCH || void 0, l = Object(A.t)([t.dynamic, r], E.c), h = Object(E.c)(l) ? { dynamic: l } : {}, i = function(d) {\n        function p() {\n          return d.value;\n        }\n        d = function(v) {\n          return [\"value\", \"type\", \"squash\", \"array\", \"dynamic\"].filter(\n            g.bind(v || {})\n          ).length === 0;\n        }(d) ? { value: d } : d, p.__cacheable = !0;\n        var f = Object(E.e)(d.value) ? d.value : p;\n        return Object(A.r)(d, { $$fn: f });\n      }(t && t.params && t.params[a]);\n      return Object(A.r)(h, i);\n    }\n    (function(a) {\n      a[a.PATH = 0] = \"PATH\", a[a.SEARCH = 1] = \"SEARCH\", a[a.CONFIG = 2] = \"CONFIG\";\n    })(u || (u = {}));\n    var c = function() {\n      function a(n, t, r, l, h) {\n        var i = o(n, r, h);\n        t = function(R, M, z, V, G) {\n          if (R.type && M && M.name !== \"string\")\n            throw new Error(\"Param '\" + V + \"' has two type configurations.\");\n          if (R.type && M && M.name === \"string\" && G.type(R.type))\n            return G.type(R.type);\n          if (M) return M;\n          if (!R.type) {\n            var Y = z === u.CONFIG ? \"any\" : z === u.PATH ? \"path\" : z === u.SEARCH ? \"query\" : \"string\";\n            return G.type(Y);\n          }\n          return R.type instanceof x.a ? R.type : G.type(R.type);\n        }(i, t, r, n, l.paramTypes);\n        var d, p, f = (d = { array: r === u.SEARCH && \"auto\" }, p = n.match(/\\[\\]$/) ? { array: !0 } : {}, Object(A.r)(d, p, i).array);\n        t = f ? t.$asArray(f, r === u.SEARCH) : t;\n        var v = i.value !== void 0 || r === u.SEARCH, k = Object(E.c)(i.dynamic) ? !!i.dynamic : !!t.dynamic, s = Object(E.c)(i.raw) ? !!i.raw : !!t.raw, S = function(R, M, z) {\n          var V = R.squash;\n          if (!M || V === !1) return !1;\n          if (!Object(E.c)(V) || V == null) return z;\n          if (V === !0 || Object(E.l)(V)) return V;\n          throw new Error(\n            \"Invalid squash policy: '\" + V + \"'. Valid policies: false, true, or arbitrary string\"\n          );\n        }(i, v, l.defaultSquashPolicy()), j = function(R, M, z, V) {\n          var G = [\n            { from: \"\", to: z || M ? void 0 : \"\" },\n            { from: null, to: z || M ? void 0 : \"\" }\n          ], Y = Object(E.a)(R.replace) ? R.replace : [];\n          Object(E.l)(V) && Y.push({ from: V, to: void 0 });\n          var tt = Object(A.B)(Y, Object(w.n)(\"from\"));\n          return Object(A.s)(G, function(Z) {\n            return tt.indexOf(Z.from) === -1;\n          }).concat(Y);\n        }(i, f, v, S), I = Object(E.c)(i.inherit) ? !!i.inherit : !!t.inherit;\n        Object(A.r)(this, {\n          id: n,\n          type: t,\n          location: r,\n          isOptional: v,\n          dynamic: k,\n          raw: s,\n          squash: S,\n          replace: j,\n          inherit: I,\n          array: f,\n          config: i\n        });\n      }\n      return a.values = function(n, t) {\n        t === void 0 && (t = {});\n        for (var r = {}, l = 0, h = n; l < h.length; l++) {\n          var i = h[l];\n          r[i.id] = i.value(t[i.id]);\n        }\n        return r;\n      }, a.changed = function(n, t, r) {\n        return t === void 0 && (t = {}), r === void 0 && (r = {}), n.filter(function(l) {\n          return !l.type.equals(t[l.id], r[l.id]);\n        });\n      }, a.equals = function(n, t, r) {\n        return t === void 0 && (t = {}), r === void 0 && (r = {}), a.changed(n, t, r).length === 0;\n      }, a.validates = function(n, t) {\n        return t === void 0 && (t = {}), n.map(function(r) {\n          return r.validates(t[r.id]);\n        }).reduce(A.e, !0);\n      }, a.prototype.isDefaultValue = function(n) {\n        return this.isOptional && this.type.equals(this.value(), n);\n      }, a.prototype.value = function(n) {\n        var t = this;\n        return n = function(r) {\n          for (var l = 0, h = t.replace; l < h.length; l++) {\n            var i = h[l];\n            if (i.from === r) return i.to;\n          }\n          return r;\n        }(n), Object(E.m)(n) ? function() {\n          if (t._defaultValueCache)\n            return t._defaultValueCache.defaultValue;\n          if (!y.b.$injector)\n            throw new Error(\n              \"Injectable functions cannot be called at configuration time\"\n            );\n          var r = y.b.$injector.invoke(t.config.$$fn);\n          if (r != null && !t.type.is(r))\n            throw new Error(\n              \"Default value (\" + r + \") for parameter '\" + t.id + \"' is not an instance of ParamType (\" + t.type.name + \")\"\n            );\n          return t.config.$$fn.__cacheable && (t._defaultValueCache = { defaultValue: r }), r;\n        }() : this.type.$normalize(n);\n      }, a.prototype.isSearch = function() {\n        return this.location === u.SEARCH;\n      }, a.prototype.validates = function(n) {\n        if ((Object(E.m)(n) || n === null) && this.isOptional) return !0;\n        var t = this.type.$normalize(n);\n        if (!this.type.is(t)) return !1;\n        var r = this.type.encode(t);\n        return !(Object(E.l)(r) && !this.type.pattern.exec(r));\n      }, a.prototype.toString = function() {\n        return \"{Param:\" + this.id + \" \" + this.type + \" squash: '\" + this.squash + \"' optional: \" + this.isOptional + \"}\";\n      }, a;\n    }();\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return n;\n    });\n    var u = e(14), A = e(0), w = e(7), E = e(1), y = e(3), x = e(10), g = e(6), o = e(8), c = e(24), a = { current: A.E, transition: null, traceData: {}, bind: null }, n = function() {\n      function t(r, l, h, i) {\n        var d = this;\n        this.transition = r, this.stateContext = l, this.registeredHook = h, this.options = i, this.isSuperseded = function() {\n          return d.type.hookPhase === u.a.RUN && !d.options.transition.isActive();\n        }, this.options = Object(A.o)(i, a), this.type = h.eventType;\n      }\n      return t.chain = function(r, l) {\n        return r.reduce(function(h, i) {\n          return h.then(function() {\n            return i.invokeHook();\n          });\n        }, l || g.b.$q.when());\n      }, t.invokeHooks = function(r, l) {\n        for (var h = 0; h < r.length; h++) {\n          var i = r[h].invokeHook();\n          if (Object(E.j)(i)) {\n            var d = r.slice(h + 1);\n            return t.chain(d, i).then(l);\n          }\n        }\n        return l();\n      }, t.runAllHooks = function(r) {\n        r.forEach(function(l) {\n          return l.invokeHook();\n        });\n      }, t.prototype.logError = function(r) {\n        this.transition.router.stateService.defaultErrorHandler()(r);\n      }, t.prototype.invokeHook = function() {\n        var r = this, l = this.registeredHook;\n        if (!l._deregistered) {\n          var h = this.getNotCurrentRejection();\n          if (h) return h;\n          var i = this.options;\n          x.c.traceHookInvocation(this, this.transition, i);\n          var d = function(v) {\n            return l.eventType.getErrorHandler(r)(v);\n          }, p = function(v) {\n            return l.eventType.getResultHandler(r)(v);\n          };\n          try {\n            var f = l.callback.call(i.bind, r.transition, r.stateContext);\n            return !this.type.synchronous && Object(E.j)(f) ? f.catch(function(v) {\n              return o.b.normalize(v).toPromise();\n            }).then(p, d) : p(f);\n          } catch (v) {\n            return d(o.b.normalize(v));\n          } finally {\n            l.invokeLimit && ++l.invokeCount >= l.invokeLimit && l.deregister();\n          }\n        }\n      }, t.prototype.handleHookResult = function(r) {\n        var l = this, h = this.getNotCurrentRejection();\n        return h || (Object(E.j)(r) ? r.then(function(i) {\n          return l.handleHookResult(i);\n        }) : (x.c.traceHookResult(r, this.transition, this.options), r === !1 ? o.b.aborted(\"Hook aborted transition\").toPromise() : Object(y.h)(c.a)(r) ? o.b.redirected(r).toPromise() : void 0));\n      }, t.prototype.getNotCurrentRejection = function() {\n        var r = this.transition.router;\n        return r._disposed ? o.b.aborted(\n          \"UIRouter instance #\" + r.$id + \" has been stopped (disposed)\"\n        ).toPromise() : this.transition._aborted ? o.b.aborted().toPromise() : this.isSuperseded() ? o.b.superseded(this.options.current()).toPromise() : void 0;\n      }, t.prototype.toString = function() {\n        var r = this.options, l = this.registeredHook, h = Object(y.k)(\"traceData.hookType\")(r) || \"internal\", i = Object(y.k)(\"traceData.context.state.name\")(r) || Object(y.k)(\"traceData.context\")(r) || \"unknown\", d = Object(w.b)(l.callback);\n        return h + \" context: \" + i + \", \" + Object(w.g)(200, d);\n      }, t.HANDLE_RESULT = function(r) {\n        return function(l) {\n          return r.handleHookResult(l);\n        };\n      }, t.LOG_REJECTED_RESULT = function(r) {\n        return function(l) {\n          Object(E.j)(l) && l.catch(function(h) {\n            return r.logError(o.b.normalize(h));\n          });\n        };\n      }, t.LOG_ERROR = function(r) {\n        return function(l) {\n          return r.logError(l);\n        };\n      }, t.REJECT_ERROR = function(r) {\n        return function(l) {\n          return Object(A.O)(l);\n        };\n      }, t.THROW_ERROR = function(r) {\n        return function(l) {\n          throw l;\n        };\n      }, t;\n    }();\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return y;\n    });\n    var u = e(0), A = e(3), w = e(24), E = e(52), y = function() {\n      function x() {\n      }\n      return x.makeTargetState = function(g, o) {\n        var c = Object(u.P)(o).state;\n        return new w.a(\n          g,\n          c,\n          o.map(Object(A.n)(\"paramValues\")).reduce(u.D, {}),\n          {}\n        );\n      }, x.buildPath = function(g) {\n        var o = g.params();\n        return g.$state().path.map(function(c) {\n          return new E.a(c).applyRawParams(o);\n        });\n      }, x.buildToPath = function(g, o) {\n        var c = x.buildPath(o);\n        return o.options().inherit ? x.inheritParams(g, c, Object.keys(o.params())) : c;\n      }, x.applyViewConfigs = function(g, o, c) {\n        o.filter(function(a) {\n          return Object(u.z)(c, a.state);\n        }).forEach(function(a) {\n          var n = Object(u.U)(a.state.views || {}), t = x.subPath(o, function(l) {\n            return l === a;\n          }), r = n.map(function(l) {\n            return g.createViewConfig(t, l);\n          });\n          a.views = r.reduce(u.T, []);\n        });\n      }, x.inheritParams = function(g, o, c) {\n        c === void 0 && (c = []);\n        var a = g.map(function(n) {\n          return n.paramSchema;\n        }).reduce(u.T, []).filter(function(n) {\n          return !n.inherit;\n        }).map(Object(A.n)(\"id\"));\n        return o.map(function(n) {\n          var t = Object(u.r)({}, n && n.paramValues), r = Object(u.H)(t, c);\n          t = Object(u.F)(t, c);\n          var l, h, i, d = Object(u.F)(\n            (l = g, h = n.state, i = Object(u.t)(l, Object(A.o)(\"state\", h)), Object(u.r)({}, i && i.paramValues) || {}),\n            a\n          ), p = Object(u.r)(t, d, r);\n          return new E.a(n.state).applyRawParams(p);\n        });\n      }, x.treeChanges = function(g, o, c) {\n        for (var a, n, t, r, l, h, i = Math.min(g.length, o.length), d = 0; d < i && g[d].state !== c && (a = g[d], n = o[d], a.equals(n, x.nonDynamicParams)); )\n          d++;\n        r = (t = g).slice(0, d), l = t.slice(d);\n        var p = r.map(function(f, v) {\n          var k = f.clone();\n          return k.paramValues = o[v].paramValues, k;\n        });\n        return h = o.slice(d), {\n          from: t,\n          to: p.concat(h),\n          retained: r,\n          retainedWithToParams: p,\n          exiting: l,\n          entering: h\n        };\n      }, x.matching = function(g, o, c) {\n        var a = !1;\n        return Object(u.i)(g, o).reduce(function(n, t) {\n          var r = t[0], l = t[1];\n          return (a = a || !r.equals(l, c)) ? n : n.concat(r);\n        }, []);\n      }, x.equals = function(g, o, c) {\n        return g.length === o.length && x.matching(g, o, c).length === g.length;\n      }, x.subPath = function(g, o) {\n        var c = Object(u.t)(g, o), a = g.indexOf(c);\n        return a === -1 ? void 0 : g.slice(0, a + 1);\n      }, x.nonDynamicParams = function(g) {\n        return g.state.parameters({ inherit: !1 }).filter(function(o) {\n          return !o.dynamic;\n        });\n      }, x.paramValues = function(g) {\n        return g.reduce(function(o, c) {\n          return Object(u.r)(o, c.paramValues);\n        }, {});\n      }, x;\n    }();\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return w;\n    });\n    var u = e(0), A = { log: u.E, error: u.E, table: u.E }, w = typeof document < \"u\" && document.documentMode && document.documentMode === 9 ? window && window.console ? function(E) {\n      var y = function(x) {\n        return Function.prototype.bind.call(x, E);\n      };\n      return { log: y(E.log), error: y(E.log), table: y(E.log) };\n    }(window.console) : A : console.table && console.error ? console : function(E) {\n      var y = E.log.bind(E);\n      return {\n        log: y,\n        error: E.error ? E.error.bind(E) : y,\n        table: E.table ? E.table.bind(E) : y\n      };\n    }(console);\n  },\n  function(L, T, e) {\n    var u = e(11), A = e(28).Graph;\n    function w(y, x, g, o) {\n      var c;\n      do\n        c = u.uniqueId(o);\n      while (y.hasNode(c));\n      return g.dummy = x, y.setNode(c, g), c;\n    }\n    function E(y) {\n      return u.max(\n        u.map(y.nodes(), function(x) {\n          var g = y.node(x).rank;\n          if (!u.isUndefined(g)) return g;\n        })\n      );\n    }\n    L.exports = {\n      addDummyNode: w,\n      simplify: function(y) {\n        var x = new A().setGraph(y.graph());\n        return u.forEach(y.nodes(), function(g) {\n          x.setNode(g, y.node(g));\n        }), u.forEach(y.edges(), function(g) {\n          var o = x.edge(g.v, g.w) || { weight: 0, minlen: 1 }, c = y.edge(g);\n          x.setEdge(g.v, g.w, {\n            weight: o.weight + c.weight,\n            minlen: Math.max(o.minlen, c.minlen)\n          });\n        }), x;\n      },\n      asNonCompoundGraph: function(y) {\n        var x = new A({ multigraph: y.isMultigraph() }).setGraph(y.graph());\n        return u.forEach(y.nodes(), function(g) {\n          y.children(g).length || x.setNode(g, y.node(g));\n        }), u.forEach(y.edges(), function(g) {\n          x.setEdge(g, y.edge(g));\n        }), x;\n      },\n      successorWeights: function(y) {\n        var x = u.map(y.nodes(), function(g) {\n          var o = {};\n          return u.forEach(y.outEdges(g), function(c) {\n            o[c.w] = (o[c.w] || 0) + y.edge(c).weight;\n          }), o;\n        });\n        return u.zipObject(y.nodes(), x);\n      },\n      predecessorWeights: function(y) {\n        var x = u.map(y.nodes(), function(g) {\n          var o = {};\n          return u.forEach(y.inEdges(g), function(c) {\n            o[c.v] = (o[c.v] || 0) + y.edge(c).weight;\n          }), o;\n        });\n        return u.zipObject(y.nodes(), x);\n      },\n      intersectRect: function(y, x) {\n        var g, o, c = y.x, a = y.y, n = x.x - c, t = x.y - a, r = y.width / 2, l = y.height / 2;\n        if (!n && !t)\n          throw new Error(\n            \"Not possible to find intersection inside of the rectangle\"\n          );\n        return Math.abs(t) * r > Math.abs(n) * l ? (t < 0 && (l = -l), g = l * n / t, o = l) : (n < 0 && (r = -r), g = r, o = r * t / n), { x: c + g, y: a + o };\n      },\n      buildLayerMatrix: function(y) {\n        var x = u.map(u.range(E(y) + 1), function() {\n          return [];\n        });\n        return u.forEach(y.nodes(), function(g) {\n          var o = y.node(g), c = o.rank;\n          u.isUndefined(c) || (x[c][o.order] = g);\n        }), x;\n      },\n      normalizeRanks: function(y) {\n        var x = u.min(\n          u.map(y.nodes(), function(g) {\n            return y.node(g).rank;\n          })\n        );\n        u.forEach(y.nodes(), function(g) {\n          var o = y.node(g);\n          u.has(o, \"rank\") && (o.rank -= x);\n        });\n      },\n      removeEmptyRanks: function(y) {\n        var x = u.min(\n          u.map(y.nodes(), function(a) {\n            return y.node(a).rank;\n          })\n        ), g = [];\n        u.forEach(y.nodes(), function(a) {\n          var n = y.node(a).rank - x;\n          g[n] || (g[n] = []), g[n].push(a);\n        });\n        var o = 0, c = y.graph().nodeRankFactor;\n        u.forEach(g, function(a, n) {\n          u.isUndefined(a) && n % c != 0 ? --o : o && u.forEach(a, function(t) {\n            y.node(t).rank += o;\n          });\n        });\n      },\n      addBorderNode: function(y, x, g, o) {\n        var c = { width: 0, height: 0 };\n        return arguments.length >= 4 && (c.rank = g, c.order = o), w(y, \"border\", c, x);\n      },\n      maxRank: E,\n      partition: function(y, x) {\n        var g = { lhs: [], rhs: [] };\n        return u.forEach(y, function(o) {\n          x(o) ? g.lhs.push(o) : g.rhs.push(o);\n        }), g;\n      },\n      time: function(y, x) {\n        var g = u.now();\n        try {\n          return x();\n        } finally {\n          console.log(y + \" time: \" + (u.now() - g) + \"ms\");\n        }\n      },\n      notime: function(y, x) {\n        return x();\n      }\n    };\n  },\n  function(L, T, e) {\n    e.r(T), e.d(T, \"default\", function() {\n      return Or;\n    }), e.d(T, \"VERSION\", function() {\n      return A.e;\n    }), e.d(T, \"restArguments\", function() {\n      return w;\n    }), e.d(T, \"isObject\", function() {\n      return E;\n    }), e.d(T, \"isNull\", function() {\n      return y;\n    }), e.d(T, \"isUndefined\", function() {\n      return x;\n    }), e.d(T, \"isBoolean\", function() {\n      return g;\n    }), e.d(T, \"isElement\", function() {\n      return o;\n    }), e.d(T, \"isString\", function() {\n      return a;\n    }), e.d(T, \"isNumber\", function() {\n      return n;\n    }), e.d(T, \"isDate\", function() {\n      return t;\n    }), e.d(T, \"isRegExp\", function() {\n      return r;\n    }), e.d(T, \"isError\", function() {\n      return l;\n    }), e.d(T, \"isSymbol\", function() {\n      return h;\n    }), e.d(T, \"isArrayBuffer\", function() {\n      return i;\n    }), e.d(T, \"isDataView\", function() {\n      return j;\n    }), e.d(T, \"isArray\", function() {\n      return I;\n    }), e.d(T, \"isFunction\", function() {\n      return f;\n    }), e.d(T, \"isArguments\", function() {\n      return z;\n    }), e.d(T, \"isFinite\", function() {\n      return V;\n    }), e.d(T, \"isNaN\", function() {\n      return G;\n    }), e.d(T, \"isTypedArray\", function() {\n      return ct;\n    }), e.d(T, \"isEmpty\", function() {\n      return St;\n    }), e.d(T, \"isMatch\", function() {\n      return zt;\n    }), e.d(T, \"isEqual\", function() {\n      return ne;\n    }), e.d(T, \"isMap\", function() {\n      return yt;\n    }), e.d(T, \"isWeakMap\", function() {\n      return ft;\n    }), e.d(T, \"isSet\", function() {\n      return Rt;\n    }), e.d(T, \"isWeakSet\", function() {\n      return Wt;\n    }), e.d(T, \"keys\", function() {\n      return xt;\n    }), e.d(T, \"allKeys\", function() {\n      return ce;\n    }), e.d(T, \"values\", function() {\n      return le;\n    }), e.d(T, \"pairs\", function() {\n      return ye;\n    }), e.d(T, \"invert\", function() {\n      return pe;\n    }), e.d(T, \"functions\", function() {\n      return je;\n    }), e.d(T, \"methods\", function() {\n      return je;\n    }), e.d(T, \"extend\", function() {\n      return Ze;\n    }), e.d(T, \"extendOwn\", function() {\n      return ir;\n    }), e.d(T, \"assign\", function() {\n      return ir;\n    }), e.d(T, \"defaults\", function() {\n      return Ar;\n    }), e.d(T, \"create\", function() {\n      return zr;\n    }), e.d(T, \"clone\", function() {\n      return ln;\n    }), e.d(T, \"tap\", function() {\n      return mn;\n    }), e.d(T, \"get\", function() {\n      return nn;\n    }), e.d(T, \"has\", function() {\n      return Ei;\n    }), e.d(T, \"mapObject\", function() {\n      return Yr;\n    }), e.d(T, \"identity\", function() {\n      return ri;\n    }), e.d(T, \"constant\", function() {\n      return Y;\n    }), e.d(T, \"noop\", function() {\n      return gn;\n    }), e.d(T, \"toPath\", function() {\n      return un;\n    }), e.d(T, \"property\", function() {\n      return tn;\n    }), e.d(T, \"propertyOf\", function() {\n      return vn;\n    }), e.d(T, \"matcher\", function() {\n      return Yn;\n    }), e.d(T, \"matches\", function() {\n      return Yn;\n    }), e.d(T, \"times\", function() {\n      return Wr;\n    }), e.d(T, \"random\", function() {\n      return Ur;\n    }), e.d(T, \"now\", function() {\n      return Pn;\n    }), e.d(T, \"escape\", function() {\n      return ni;\n    }), e.d(T, \"unescape\", function() {\n      return Xn;\n    }), e.d(T, \"templateSettings\", function() {\n      return ur;\n    }), e.d(T, \"template\", function() {\n      return wo;\n    }), e.d(T, \"result\", function() {\n      return Vn;\n    }), e.d(T, \"uniqueId\", function() {\n      return ko;\n    }), e.d(T, \"chain\", function() {\n      return Ao;\n    }), e.d(T, \"iteratee\", function() {\n      return Kn;\n    }), e.d(T, \"partial\", function() {\n      return pi;\n    }), e.d(T, \"bind\", function() {\n      return Fo;\n    }), e.d(T, \"bindAll\", function() {\n      return qo;\n    }), e.d(T, \"memoize\", function() {\n      return wn;\n    }), e.d(T, \"delay\", function() {\n      return Sn;\n    }), e.d(T, \"defer\", function() {\n      return Do;\n    }), e.d(T, \"throttle\", function() {\n      return Dn;\n    }), e.d(T, \"debounce\", function() {\n      return Wi;\n    }), e.d(T, \"wrap\", function() {\n      return Eo;\n    }), e.d(T, \"negate\", function() {\n      return hi;\n    }), e.d(T, \"compose\", function() {\n      return ro;\n    }), e.d(T, \"after\", function() {\n      return Ro;\n    }), e.d(T, \"before\", function() {\n      return sr;\n    }), e.d(T, \"once\", function() {\n      return Ci;\n    }), e.d(T, \"findKey\", function() {\n      return gi;\n    }), e.d(T, \"findIndex\", function() {\n      return Io;\n    }), e.d(T, \"findLastIndex\", function() {\n      return $i;\n    }), e.d(T, \"sortedIndex\", function() {\n      return _i;\n    }), e.d(T, \"indexOf\", function() {\n      return ci;\n    }), e.d(T, \"lastIndexOf\", function() {\n      return Ii;\n    }), e.d(T, \"find\", function() {\n      return xi;\n    }), e.d(T, \"detect\", function() {\n      return xi;\n    }), e.d(T, \"findWhere\", function() {\n      return Xi;\n    }), e.d(T, \"each\", function() {\n      return fn;\n    }), e.d(T, \"forEach\", function() {\n      return fn;\n    }), e.d(T, \"map\", function() {\n      return mi;\n    }), e.d(T, \"collect\", function() {\n      return mi;\n    }), e.d(T, \"reduce\", function() {\n      return no;\n    }), e.d(T, \"foldl\", function() {\n      return no;\n    }), e.d(T, \"inject\", function() {\n      return no;\n    }), e.d(T, \"reduceRight\", function() {\n      return di;\n    }), e.d(T, \"foldr\", function() {\n      return di;\n    }), e.d(T, \"filter\", function() {\n      return Zi;\n    }), e.d(T, \"select\", function() {\n      return Zi;\n    }), e.d(T, \"reject\", function() {\n      return qn;\n    }), e.d(T, \"every\", function() {\n      return co;\n    }), e.d(T, \"all\", function() {\n      return co;\n    }), e.d(T, \"some\", function() {\n      return fo;\n    }), e.d(T, \"any\", function() {\n      return fo;\n    }), e.d(T, \"contains\", function() {\n      return wi;\n    }), e.d(T, \"includes\", function() {\n      return wi;\n    }), e.d(T, \"include\", function() {\n      return wi;\n    }), e.d(T, \"invoke\", function() {\n      return Oi;\n    }), e.d(T, \"pluck\", function() {\n      return Uo;\n    }), e.d(T, \"where\", function() {\n      return ga;\n    }), e.d(T, \"max\", function() {\n      return Vo;\n    }), e.d(T, \"min\", function() {\n      return io;\n    }), e.d(T, \"shuffle\", function() {\n      return Mn;\n    }), e.d(T, \"sample\", function() {\n      return Ni;\n    }), e.d(T, \"sortBy\", function() {\n      return Mi;\n    }), e.d(T, \"groupBy\", function() {\n      return Li;\n    }), e.d(T, \"indexBy\", function() {\n      return ki;\n    }), e.d(T, \"countBy\", function() {\n      return ji;\n    }), e.d(T, \"partition\", function() {\n      return zi;\n    }), e.d(T, \"toArray\", function() {\n      return Hn;\n    }), e.d(T, \"size\", function() {\n      return oo;\n    }), e.d(T, \"pick\", function() {\n      return ke;\n    }), e.d(T, \"omit\", function() {\n      return $;\n    }), e.d(T, \"first\", function() {\n      return U;\n    }), e.d(T, \"head\", function() {\n      return U;\n    }), e.d(T, \"take\", function() {\n      return U;\n    }), e.d(T, \"initial\", function() {\n      return P;\n    }), e.d(T, \"last\", function() {\n      return et;\n    }), e.d(T, \"rest\", function() {\n      return W;\n    }), e.d(T, \"tail\", function() {\n      return W;\n    }), e.d(T, \"drop\", function() {\n      return W;\n    }), e.d(T, \"compact\", function() {\n      return dt;\n    }), e.d(T, \"flatten\", function() {\n      return mt;\n    }), e.d(T, \"without\", function() {\n      return Ut;\n    }), e.d(T, \"uniq\", function() {\n      return Zt;\n    }), e.d(T, \"unique\", function() {\n      return Zt;\n    }), e.d(T, \"union\", function() {\n      return ve;\n    }), e.d(T, \"intersection\", function() {\n      return Ae;\n    }), e.d(T, \"difference\", function() {\n      return Mt;\n    }), e.d(T, \"unzip\", function() {\n      return de;\n    }), e.d(T, \"transpose\", function() {\n      return de;\n    }), e.d(T, \"zip\", function() {\n      return me;\n    }), e.d(T, \"object\", function() {\n      return Be;\n    }), e.d(T, \"range\", function() {\n      return We;\n    }), e.d(T, \"chunk\", function() {\n      return tr;\n    }), e.d(T, \"mixin\", function() {\n      return Rn;\n    });\n    var u = {};\n    e.r(u), e.d(u, \"VERSION\", function() {\n      return A.e;\n    }), e.d(u, \"restArguments\", function() {\n      return w;\n    }), e.d(u, \"isObject\", function() {\n      return E;\n    }), e.d(u, \"isNull\", function() {\n      return y;\n    }), e.d(u, \"isUndefined\", function() {\n      return x;\n    }), e.d(u, \"isBoolean\", function() {\n      return g;\n    }), e.d(u, \"isElement\", function() {\n      return o;\n    }), e.d(u, \"isString\", function() {\n      return a;\n    }), e.d(u, \"isNumber\", function() {\n      return n;\n    }), e.d(u, \"isDate\", function() {\n      return t;\n    }), e.d(u, \"isRegExp\", function() {\n      return r;\n    }), e.d(u, \"isError\", function() {\n      return l;\n    }), e.d(u, \"isSymbol\", function() {\n      return h;\n    }), e.d(u, \"isArrayBuffer\", function() {\n      return i;\n    }), e.d(u, \"isDataView\", function() {\n      return j;\n    }), e.d(u, \"isArray\", function() {\n      return I;\n    }), e.d(u, \"isFunction\", function() {\n      return f;\n    }), e.d(u, \"isArguments\", function() {\n      return z;\n    }), e.d(u, \"isFinite\", function() {\n      return V;\n    }), e.d(u, \"isNaN\", function() {\n      return G;\n    }), e.d(u, \"isTypedArray\", function() {\n      return ct;\n    }), e.d(u, \"isEmpty\", function() {\n      return St;\n    }), e.d(u, \"isMatch\", function() {\n      return zt;\n    }), e.d(u, \"isEqual\", function() {\n      return ne;\n    }), e.d(u, \"isMap\", function() {\n      return yt;\n    }), e.d(u, \"isWeakMap\", function() {\n      return ft;\n    }), e.d(u, \"isSet\", function() {\n      return Rt;\n    }), e.d(u, \"isWeakSet\", function() {\n      return Wt;\n    }), e.d(u, \"keys\", function() {\n      return xt;\n    }), e.d(u, \"allKeys\", function() {\n      return ce;\n    }), e.d(u, \"values\", function() {\n      return le;\n    }), e.d(u, \"pairs\", function() {\n      return ye;\n    }), e.d(u, \"invert\", function() {\n      return pe;\n    }), e.d(u, \"functions\", function() {\n      return je;\n    }), e.d(u, \"methods\", function() {\n      return je;\n    }), e.d(u, \"extend\", function() {\n      return Ze;\n    }), e.d(u, \"extendOwn\", function() {\n      return ir;\n    }), e.d(u, \"assign\", function() {\n      return ir;\n    }), e.d(u, \"defaults\", function() {\n      return Ar;\n    }), e.d(u, \"create\", function() {\n      return zr;\n    }), e.d(u, \"clone\", function() {\n      return ln;\n    }), e.d(u, \"tap\", function() {\n      return mn;\n    }), e.d(u, \"get\", function() {\n      return nn;\n    }), e.d(u, \"has\", function() {\n      return Ei;\n    }), e.d(u, \"mapObject\", function() {\n      return Yr;\n    }), e.d(u, \"identity\", function() {\n      return ri;\n    }), e.d(u, \"constant\", function() {\n      return Y;\n    }), e.d(u, \"noop\", function() {\n      return gn;\n    }), e.d(u, \"toPath\", function() {\n      return un;\n    }), e.d(u, \"property\", function() {\n      return tn;\n    }), e.d(u, \"propertyOf\", function() {\n      return vn;\n    }), e.d(u, \"matcher\", function() {\n      return Yn;\n    }), e.d(u, \"matches\", function() {\n      return Yn;\n    }), e.d(u, \"times\", function() {\n      return Wr;\n    }), e.d(u, \"random\", function() {\n      return Ur;\n    }), e.d(u, \"now\", function() {\n      return Pn;\n    }), e.d(u, \"escape\", function() {\n      return ni;\n    }), e.d(u, \"unescape\", function() {\n      return Xn;\n    }), e.d(u, \"templateSettings\", function() {\n      return ur;\n    }), e.d(u, \"template\", function() {\n      return wo;\n    }), e.d(u, \"result\", function() {\n      return Vn;\n    }), e.d(u, \"uniqueId\", function() {\n      return ko;\n    }), e.d(u, \"chain\", function() {\n      return Ao;\n    }), e.d(u, \"iteratee\", function() {\n      return Kn;\n    }), e.d(u, \"partial\", function() {\n      return pi;\n    }), e.d(u, \"bind\", function() {\n      return Fo;\n    }), e.d(u, \"bindAll\", function() {\n      return qo;\n    }), e.d(u, \"memoize\", function() {\n      return wn;\n    }), e.d(u, \"delay\", function() {\n      return Sn;\n    }), e.d(u, \"defer\", function() {\n      return Do;\n    }), e.d(u, \"throttle\", function() {\n      return Dn;\n    }), e.d(u, \"debounce\", function() {\n      return Wi;\n    }), e.d(u, \"wrap\", function() {\n      return Eo;\n    }), e.d(u, \"negate\", function() {\n      return hi;\n    }), e.d(u, \"compose\", function() {\n      return ro;\n    }), e.d(u, \"after\", function() {\n      return Ro;\n    }), e.d(u, \"before\", function() {\n      return sr;\n    }), e.d(u, \"once\", function() {\n      return Ci;\n    }), e.d(u, \"findKey\", function() {\n      return gi;\n    }), e.d(u, \"findIndex\", function() {\n      return Io;\n    }), e.d(u, \"findLastIndex\", function() {\n      return $i;\n    }), e.d(u, \"sortedIndex\", function() {\n      return _i;\n    }), e.d(u, \"indexOf\", function() {\n      return ci;\n    }), e.d(u, \"lastIndexOf\", function() {\n      return Ii;\n    }), e.d(u, \"find\", function() {\n      return xi;\n    }), e.d(u, \"detect\", function() {\n      return xi;\n    }), e.d(u, \"findWhere\", function() {\n      return Xi;\n    }), e.d(u, \"each\", function() {\n      return fn;\n    }), e.d(u, \"forEach\", function() {\n      return fn;\n    }), e.d(u, \"map\", function() {\n      return mi;\n    }), e.d(u, \"collect\", function() {\n      return mi;\n    }), e.d(u, \"reduce\", function() {\n      return no;\n    }), e.d(u, \"foldl\", function() {\n      return no;\n    }), e.d(u, \"inject\", function() {\n      return no;\n    }), e.d(u, \"reduceRight\", function() {\n      return di;\n    }), e.d(u, \"foldr\", function() {\n      return di;\n    }), e.d(u, \"filter\", function() {\n      return Zi;\n    }), e.d(u, \"select\", function() {\n      return Zi;\n    }), e.d(u, \"reject\", function() {\n      return qn;\n    }), e.d(u, \"every\", function() {\n      return co;\n    }), e.d(u, \"all\", function() {\n      return co;\n    }), e.d(u, \"some\", function() {\n      return fo;\n    }), e.d(u, \"any\", function() {\n      return fo;\n    }), e.d(u, \"contains\", function() {\n      return wi;\n    }), e.d(u, \"includes\", function() {\n      return wi;\n    }), e.d(u, \"include\", function() {\n      return wi;\n    }), e.d(u, \"invoke\", function() {\n      return Oi;\n    }), e.d(u, \"pluck\", function() {\n      return Uo;\n    }), e.d(u, \"where\", function() {\n      return ga;\n    }), e.d(u, \"max\", function() {\n      return Vo;\n    }), e.d(u, \"min\", function() {\n      return io;\n    }), e.d(u, \"shuffle\", function() {\n      return Mn;\n    }), e.d(u, \"sample\", function() {\n      return Ni;\n    }), e.d(u, \"sortBy\", function() {\n      return Mi;\n    }), e.d(u, \"groupBy\", function() {\n      return Li;\n    }), e.d(u, \"indexBy\", function() {\n      return ki;\n    }), e.d(u, \"countBy\", function() {\n      return ji;\n    }), e.d(u, \"partition\", function() {\n      return zi;\n    }), e.d(u, \"toArray\", function() {\n      return Hn;\n    }), e.d(u, \"size\", function() {\n      return oo;\n    }), e.d(u, \"pick\", function() {\n      return ke;\n    }), e.d(u, \"omit\", function() {\n      return $;\n    }), e.d(u, \"first\", function() {\n      return U;\n    }), e.d(u, \"head\", function() {\n      return U;\n    }), e.d(u, \"take\", function() {\n      return U;\n    }), e.d(u, \"initial\", function() {\n      return P;\n    }), e.d(u, \"last\", function() {\n      return et;\n    }), e.d(u, \"rest\", function() {\n      return W;\n    }), e.d(u, \"tail\", function() {\n      return W;\n    }), e.d(u, \"drop\", function() {\n      return W;\n    }), e.d(u, \"compact\", function() {\n      return dt;\n    }), e.d(u, \"flatten\", function() {\n      return mt;\n    }), e.d(u, \"without\", function() {\n      return Ut;\n    }), e.d(u, \"uniq\", function() {\n      return Zt;\n    }), e.d(u, \"unique\", function() {\n      return Zt;\n    }), e.d(u, \"union\", function() {\n      return ve;\n    }), e.d(u, \"intersection\", function() {\n      return Ae;\n    }), e.d(u, \"difference\", function() {\n      return Mt;\n    }), e.d(u, \"unzip\", function() {\n      return de;\n    }), e.d(u, \"transpose\", function() {\n      return de;\n    }), e.d(u, \"zip\", function() {\n      return me;\n    }), e.d(u, \"object\", function() {\n      return Be;\n    }), e.d(u, \"range\", function() {\n      return We;\n    }), e.d(u, \"chunk\", function() {\n      return tr;\n    }), e.d(u, \"mixin\", function() {\n      return Rn;\n    }), e.d(u, \"default\", function() {\n      return Qi;\n    });\n    var A = e(5);\n    function w(rt, pt) {\n      return pt = pt == null ? rt.length - 1 : +pt, function() {\n        for (var $t = Math.max(arguments.length - pt, 0), It = Array($t), ee = 0; ee < $t; ee++)\n          It[ee] = arguments[ee + pt];\n        switch (pt) {\n          case 0:\n            return rt.call(this, It);\n          case 1:\n            return rt.call(this, arguments[0], It);\n          case 2:\n            return rt.call(this, arguments[0], arguments[1], It);\n        }\n        var Ht = Array(pt + 1);\n        for (ee = 0; ee < pt; ee++) Ht[ee] = arguments[ee];\n        return Ht[pt] = It, rt.apply(this, Ht);\n      };\n    }\n    function E(rt) {\n      var pt = typeof rt;\n      return pt === \"function\" || pt === \"object\" && !!rt;\n    }\n    function y(rt) {\n      return rt === null;\n    }\n    function x(rt) {\n      return rt === void 0;\n    }\n    function g(rt) {\n      return rt === !0 || rt === !1 || A.t.call(rt) === \"[object Boolean]\";\n    }\n    function o(rt) {\n      return !(!rt || rt.nodeType !== 1);\n    }\n    function c(rt) {\n      var pt = \"[object \" + rt + \"]\";\n      return function($t) {\n        return A.t.call($t) === pt;\n      };\n    }\n    var a = c(\"String\"), n = c(\"Number\"), t = c(\"Date\"), r = c(\"RegExp\"), l = c(\"Error\"), h = c(\"Symbol\"), i = c(\"ArrayBuffer\"), d = c(\"Function\"), p = A.p.document && A.p.document.childNodes;\n    typeof Int8Array != \"object\" && typeof p != \"function\" && (d = function(rt) {\n      return typeof rt == \"function\" || !1;\n    });\n    var f = d, v = c(\"Object\"), k = A.s && v(new DataView(new ArrayBuffer(8))), s = typeof Map < \"u\" && v(/* @__PURE__ */ new Map()), S = c(\"DataView\"), j = k ? function(rt) {\n      return rt != null && f(rt.getInt8) && i(rt.buffer);\n    } : S, I = A.k || c(\"Array\");\n    function R(rt, pt) {\n      return rt != null && A.i.call(rt, pt);\n    }\n    var M = c(\"Arguments\");\n    (function() {\n      M(arguments) || (M = function(rt) {\n        return R(rt, \"callee\");\n      });\n    })();\n    var z = M;\n    function V(rt) {\n      return !h(rt) && Object(A.f)(rt) && !isNaN(parseFloat(rt));\n    }\n    function G(rt) {\n      return n(rt) && Object(A.g)(rt);\n    }\n    function Y(rt) {\n      return function() {\n        return rt;\n      };\n    }\n    function tt(rt) {\n      return function(pt) {\n        var $t = rt(pt);\n        return typeof $t == \"number\" && $t >= 0 && $t <= A.b;\n      };\n    }\n    function Z(rt) {\n      return function(pt) {\n        return pt == null ? void 0 : pt[rt];\n      };\n    }\n    var at = Z(\"byteLength\"), nt = tt(at), ht = /\\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\\]/, ct = A.r ? function(rt) {\n      return A.l ? Object(A.l)(rt) && !j(rt) : nt(rt) && ht.test(A.t.call(rt));\n    } : Y(!1), ot = Z(\"length\");\n    function gt(rt, pt) {\n      pt = function(he) {\n        for (var Ee = {}, nr = he.length, fr = 0; fr < nr; ++fr) Ee[he[fr]] = !0;\n        return {\n          contains: function(Rr) {\n            return Ee[Rr] === !0;\n          },\n          push: function(Rr) {\n            return Ee[Rr] = !0, he.push(Rr);\n          }\n        };\n      }(pt);\n      var $t = A.n.length, It = rt.constructor, ee = f(It) && It.prototype || A.c, Ht = \"constructor\";\n      for (R(rt, Ht) && !pt.contains(Ht) && pt.push(Ht); $t--; )\n        (Ht = A.n[$t]) in rt && rt[Ht] !== ee[Ht] && !pt.contains(Ht) && pt.push(Ht);\n    }\n    function xt(rt) {\n      if (!E(rt)) return [];\n      if (A.m) return Object(A.m)(rt);\n      var pt = [];\n      for (var $t in rt) R(rt, $t) && pt.push($t);\n      return A.h && gt(rt, pt), pt;\n    }\n    function St(rt) {\n      if (rt == null) return !0;\n      var pt = ot(rt);\n      return typeof pt == \"number\" && (I(rt) || a(rt) || z(rt)) ? pt === 0 : ot(xt(rt)) === 0;\n    }\n    function zt(rt, pt) {\n      var $t = xt(pt), It = $t.length;\n      if (rt == null) return !It;\n      for (var ee = Object(rt), Ht = 0; Ht < It; Ht++) {\n        var he = $t[Ht];\n        if (pt[he] !== ee[he] || !(he in ee)) return !1;\n      }\n      return !0;\n    }\n    function Nt(rt) {\n      return rt instanceof Nt ? rt : this instanceof Nt ? void (this._wrapped = rt) : new Nt(rt);\n    }\n    function re(rt) {\n      return new Uint8Array(rt.buffer || rt, rt.byteOffset || 0, at(rt));\n    }\n    Nt.VERSION = A.e, Nt.prototype.value = function() {\n      return this._wrapped;\n    }, Nt.prototype.valueOf = Nt.prototype.toJSON = Nt.prototype.value, Nt.prototype.toString = function() {\n      return String(this._wrapped);\n    };\n    function be(rt, pt, $t, It) {\n      if (rt === pt) return rt !== 0 || 1 / rt == 1 / pt;\n      if (rt == null || pt == null) return !1;\n      if (rt != rt) return pt != pt;\n      var ee = typeof rt;\n      return (ee === \"function\" || ee === \"object\" || typeof pt == \"object\") && function Ht(he, Ee, nr, fr) {\n        he instanceof Nt && (he = he._wrapped), Ee instanceof Nt && (Ee = Ee._wrapped);\n        var Rr = A.t.call(he);\n        if (Rr !== A.t.call(Ee)) return !1;\n        if (k && Rr == \"[object Object]\" && j(he)) {\n          if (!j(Ee)) return !1;\n          Rr = \"[object DataView]\";\n        }\n        switch (Rr) {\n          case \"[object RegExp]\":\n          case \"[object String]\":\n            return \"\" + he == \"\" + Ee;\n          case \"[object Number]\":\n            return +he != +he ? +Ee != +Ee : +he == 0 ? 1 / +he == 1 / Ee : +he == +Ee;\n          case \"[object Date]\":\n          case \"[object Boolean]\":\n            return +he == +Ee;\n          case \"[object Symbol]\":\n            return A.d.valueOf.call(he) === A.d.valueOf.call(Ee);\n          case \"[object ArrayBuffer]\":\n          case \"[object DataView]\":\n            return Ht(re(he), re(Ee), nr, fr);\n        }\n        var Fr = Rr === \"[object Array]\";\n        if (!Fr && ct(he)) {\n          if (at(he) !== at(Ee)) return !1;\n          if (he.buffer === Ee.buffer && he.byteOffset === Ee.byteOffset)\n            return !0;\n          Fr = !0;\n        }\n        if (!Fr) {\n          if (typeof he != \"object\" || typeof Ee != \"object\") return !1;\n          var ii = he.constructor, Gn = Ee.constructor;\n          if (ii !== Gn && !(f(ii) && ii instanceof ii && f(Gn) && Gn instanceof Gn) && \"constructor\" in he && \"constructor\" in Ee)\n            return !1;\n        }\n        fr = fr || [];\n        for (var Wn = (nr = nr || []).length; Wn--; ) if (nr[Wn] === he) return fr[Wn] === Ee;\n        if (nr.push(he), fr.push(Ee), Fr) {\n          if ((Wn = he.length) !== Ee.length) return !1;\n          for (; Wn--; ) if (!be(he[Wn], Ee[Wn], nr, fr)) return !1;\n        } else {\n          var yr, Xr = xt(he);\n          if (Wn = Xr.length, xt(Ee).length !== Wn) return !1;\n          for (; Wn--; )\n            if (yr = Xr[Wn], !R(Ee, yr) || !be(he[yr], Ee[yr], nr, fr)) return !1;\n        }\n        return nr.pop(), fr.pop(), !0;\n      }(rt, pt, $t, It);\n    }\n    function ne(rt, pt) {\n      return be(rt, pt);\n    }\n    function ce(rt) {\n      if (!E(rt)) return [];\n      var pt = [];\n      for (var $t in rt) pt.push($t);\n      return A.h && gt(rt, pt), pt;\n    }\n    function xe(rt) {\n      var pt = ot(rt);\n      return function($t) {\n        if ($t == null) return !1;\n        var It = ce($t);\n        if (ot(It)) return !1;\n        for (var ee = 0; ee < pt; ee++) if (!f($t[rt[ee]])) return !1;\n        return rt !== kt || !f($t[we]);\n      };\n    }\n    var we = \"forEach\", ae = [\"clear\", \"delete\"], Le = [\"get\", \"has\", \"set\"], lt = ae.concat(we, Le), kt = ae.concat(Le), Dt = [\"add\"].concat(ae, we, \"has\"), yt = s ? xe(lt) : c(\"Map\"), ft = s ? xe(kt) : c(\"WeakMap\"), Rt = s ? xe(Dt) : c(\"Set\"), Wt = c(\"WeakSet\");\n    function le(rt) {\n      for (var pt = xt(rt), $t = pt.length, It = Array($t), ee = 0; ee < $t; ee++)\n        It[ee] = rt[pt[ee]];\n      return It;\n    }\n    function ye(rt) {\n      for (var pt = xt(rt), $t = pt.length, It = Array($t), ee = 0; ee < $t; ee++)\n        It[ee] = [pt[ee], rt[pt[ee]]];\n      return It;\n    }\n    function pe(rt) {\n      for (var pt = {}, $t = xt(rt), It = 0, ee = $t.length; It < ee; It++)\n        pt[rt[$t[It]]] = $t[It];\n      return pt;\n    }\n    function je(rt) {\n      var pt = [];\n      for (var $t in rt) f(rt[$t]) && pt.push($t);\n      return pt.sort();\n    }\n    function Me(rt, pt) {\n      return function($t) {\n        var It = arguments.length;\n        if (pt && ($t = Object($t)), It < 2 || $t == null) return $t;\n        for (var ee = 1; ee < It; ee++)\n          for (var Ht = arguments[ee], he = rt(Ht), Ee = he.length, nr = 0; nr < Ee; nr++) {\n            var fr = he[nr];\n            pt && $t[fr] !== void 0 || ($t[fr] = Ht[fr]);\n          }\n        return $t;\n      };\n    }\n    var Ze = Me(ce), ir = Me(xt), Ar = Me(ce, !0);\n    function rr(rt) {\n      if (!E(rt)) return {};\n      if (A.j) return Object(A.j)(rt);\n      var pt = function() {\n      };\n      pt.prototype = rt;\n      var $t = new pt();\n      return pt.prototype = null, $t;\n    }\n    function zr(rt, pt) {\n      var $t = rr(rt);\n      return pt && ir($t, pt), $t;\n    }\n    function ln(rt) {\n      return E(rt) ? I(rt) ? rt.slice() : Ze({}, rt) : rt;\n    }\n    function mn(rt, pt) {\n      return pt(rt), rt;\n    }\n    function un(rt) {\n      return I(rt) ? rt : [rt];\n    }\n    function Kr(rt) {\n      return Nt.toPath(rt);\n    }\n    function yn(rt, pt) {\n      for (var $t = pt.length, It = 0; It < $t; It++) {\n        if (rt == null) return;\n        rt = rt[pt[It]];\n      }\n      return $t ? rt : void 0;\n    }\n    function nn(rt, pt, $t) {\n      var It = yn(rt, Kr(pt));\n      return x(It) ? $t : It;\n    }\n    function Ei(rt, pt) {\n      for (var $t = (pt = Kr(pt)).length, It = 0; It < $t; It++) {\n        var ee = pt[It];\n        if (!R(rt, ee)) return !1;\n        rt = rt[ee];\n      }\n      return !!$t;\n    }\n    function ri(rt) {\n      return rt;\n    }\n    function Yn(rt) {\n      return rt = ir({}, rt), function(pt) {\n        return zt(pt, rt);\n      };\n    }\n    function tn(rt) {\n      return rt = Kr(rt), function(pt) {\n        return yn(pt, rt);\n      };\n    }\n    function xn(rt, pt, $t) {\n      if (pt === void 0) return rt;\n      switch ($t ?? 3) {\n        case 1:\n          return function(It) {\n            return rt.call(pt, It);\n          };\n        case 3:\n          return function(It, ee, Ht) {\n            return rt.call(pt, It, ee, Ht);\n          };\n        case 4:\n          return function(It, ee, Ht, he) {\n            return rt.call(pt, It, ee, Ht, he);\n          };\n      }\n      return function() {\n        return rt.apply(pt, arguments);\n      };\n    }\n    function Tn(rt, pt, $t) {\n      return rt == null ? ri : f(rt) ? xn(rt, pt, $t) : E(rt) && !I(rt) ? Yn(rt) : tn(rt);\n    }\n    function Kn(rt, pt) {\n      return Tn(rt, pt, 1 / 0);\n    }\n    function ar(rt, pt, $t) {\n      return Nt.iteratee !== Kn ? Nt.iteratee(rt, pt) : Tn(rt, pt, $t);\n    }\n    function Yr(rt, pt, $t) {\n      pt = ar(pt, $t);\n      for (var It = xt(rt), ee = It.length, Ht = {}, he = 0; he < ee; he++) {\n        var Ee = It[he];\n        Ht[Ee] = pt(rt[Ee], Ee, rt);\n      }\n      return Ht;\n    }\n    function gn() {\n    }\n    function vn(rt) {\n      return rt == null ? gn : function(pt) {\n        return nn(rt, pt);\n      };\n    }\n    function Wr(rt, pt, $t) {\n      var It = Array(Math.max(0, rt));\n      pt = xn(pt, $t, 1);\n      for (var ee = 0; ee < rt; ee++) It[ee] = pt(ee);\n      return It;\n    }\n    function Ur(rt, pt) {\n      return pt == null && (pt = rt, rt = 0), rt + Math.floor(Math.random() * (pt - rt + 1));\n    }\n    Nt.toPath = un, Nt.iteratee = Kn;\n    var Pn = Date.now || function() {\n      return (/* @__PURE__ */ new Date()).getTime();\n    };\n    function Fn(rt) {\n      var pt = function(Ht) {\n        return rt[Ht];\n      }, $t = \"(?:\" + xt(rt).join(\"|\") + \")\", It = RegExp($t), ee = RegExp($t, \"g\");\n      return function(Ht) {\n        return Ht = Ht == null ? \"\" : \"\" + Ht, It.test(Ht) ? Ht.replace(ee, pt) : Ht;\n      };\n    }\n    var In = {\n      \"&\": \"&amp;\",\n      \"<\": \"&lt;\",\n      \">\": \"&gt;\",\n      '\"': \"&quot;\",\n      \"'\": \"&#x27;\",\n      \"`\": \"&#x60;\"\n    }, ni = Fn(In), Xn = Fn(pe(In)), ur = Nt.templateSettings = {\n      evaluate: /<%([\\s\\S]+?)%>/g,\n      interpolate: /<%=([\\s\\S]+?)%>/g,\n      escape: /<%-([\\s\\S]+?)%>/g\n    }, _r = /(.)^/, Gi = {\n      \"'\": \"'\",\n      \"\\\\\": \"\\\\\",\n      \"\\r\": \"r\",\n      \"\\n\": \"n\",\n      \"\\u2028\": \"u2028\",\n      \"\\u2029\": \"u2029\"\n    }, Si = /\\\\|'|\\r|\\n|\\u2028|\\u2029/g;\n    function $a(rt) {\n      return \"\\\\\" + Gi[rt];\n    }\n    var To = /^\\s*(\\w|\\$)+\\s*$/;\n    function wo(rt, pt, $t) {\n      !pt && $t && (pt = $t), pt = Ar({}, pt, Nt.templateSettings);\n      var It = RegExp(\n        [\n          (pt.escape || _r).source,\n          (pt.interpolate || _r).source,\n          (pt.evaluate || _r).source\n        ].join(\"|\") + \"|$\",\n        \"g\"\n      ), ee = 0, Ht = \"__p+='\";\n      rt.replace(It, function(fr, Rr, Fr, ii, Gn) {\n        return Ht += rt.slice(ee, Gn).replace(Si, $a), ee = Gn + fr.length, Rr ? Ht += `'+\n((__t=(` + Rr + `))==null?'':_.escape(__t))+\n'` : Fr ? Ht += `'+\n((__t=(` + Fr + `))==null?'':__t)+\n'` : ii && (Ht += `';\n` + ii + `\n__p+='`), fr;\n      }), Ht += `';\n`;\n      var he, Ee = pt.variable;\n      if (Ee) {\n        if (!To.test(Ee))\n          throw new Error(\"variable is not a bare identifier: \" + Ee);\n      } else Ht = `with(obj||{}){\n` + Ht + `}\n`, Ee = \"obj\";\n      Ht = `var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n` + Ht + `return __p;\n`;\n      try {\n        he = new Function(Ee, \"_\", Ht);\n      } catch (fr) {\n        throw fr.source = Ht, fr;\n      }\n      var nr = function(fr) {\n        return he.call(this, fr, Nt);\n      };\n      return nr.source = \"function(\" + Ee + `){\n` + Ht + \"}\", nr;\n    }\n    function Vn(rt, pt, $t) {\n      var It = (pt = Kr(pt)).length;\n      if (!It) return f($t) ? $t.call(rt) : $t;\n      for (var ee = 0; ee < It; ee++) {\n        var Ht = rt == null ? void 0 : rt[pt[ee]];\n        Ht === void 0 && (Ht = $t, ee = It), rt = f(Ht) ? Ht.call(rt) : Ht;\n      }\n      return rt;\n    }\n    var pa = 0;\n    function ko(rt) {\n      var pt = ++pa + \"\";\n      return rt ? rt + pt : pt;\n    }\n    function Ao(rt) {\n      var pt = Nt(rt);\n      return pt._chain = !0, pt;\n    }\n    function Po(rt, pt, $t, It, ee) {\n      if (!(It instanceof pt)) return rt.apply($t, ee);\n      var Ht = rr(rt.prototype), he = rt.apply(Ht, ee);\n      return E(he) ? he : Ht;\n    }\n    var Nn = w(function(rt, pt) {\n      var $t = Nn.placeholder, It = function() {\n        for (var ee = 0, Ht = pt.length, he = Array(Ht), Ee = 0; Ee < Ht; Ee++)\n          he[Ee] = pt[Ee] === $t ? arguments[ee++] : pt[Ee];\n        for (; ee < arguments.length; ) he.push(arguments[ee++]);\n        return Po(rt, It, this, this, he);\n      };\n      return It;\n    });\n    Nn.placeholder = Nt;\n    var pi = Nn, Fo = w(function(rt, pt, $t) {\n      if (!f(rt)) throw new TypeError(\"Bind must be called on a function\");\n      var It = w(function(ee) {\n        return Po(rt, It, pt, this, $t.concat(ee));\n      });\n      return It;\n    }), ui = tt(ot);\n    function Ri(rt, pt, $t, It) {\n      if (It = It || [], pt || pt === 0) {\n        if (pt <= 0) return It.concat(rt);\n      } else pt = 1 / 0;\n      for (var ee = It.length, Ht = 0, he = ot(rt); Ht < he; Ht++) {\n        var Ee = rt[Ht];\n        if (ui(Ee) && (I(Ee) || z(Ee)))\n          if (pt > 1) Ri(Ee, pt - 1, $t, It), ee = It.length;\n          else for (var nr = 0, fr = Ee.length; nr < fr; ) It[ee++] = Ee[nr++];\n        else $t || (It[ee++] = Ee);\n      }\n      return It;\n    }\n    var qo = w(function(rt, pt) {\n      var $t = (pt = Ri(pt, !1, !1)).length;\n      if ($t < 1) throw new Error(\"bindAll must be passed function names\");\n      for (; $t--; ) {\n        var It = pt[$t];\n        rt[It] = Fo(rt[It], rt);\n      }\n      return rt;\n    });\n    function wn(rt, pt) {\n      var $t = function(It) {\n        var ee = $t.cache, Ht = \"\" + (pt ? pt.apply(this, arguments) : It);\n        return R(ee, Ht) || (ee[Ht] = rt.apply(this, arguments)), ee[Ht];\n      };\n      return $t.cache = {}, $t;\n    }\n    var Sn = w(function(rt, pt, $t) {\n      return setTimeout(function() {\n        return rt.apply(null, $t);\n      }, pt);\n    }), Do = pi(Sn, Nt, 1);\n    function Dn(rt, pt, $t) {\n      var It, ee, Ht, he, Ee = 0;\n      $t || ($t = {});\n      var nr = function() {\n        Ee = $t.leading === !1 ? 0 : Pn(), It = null, he = rt.apply(ee, Ht), It || (ee = Ht = null);\n      }, fr = function() {\n        var Rr = Pn();\n        Ee || $t.leading !== !1 || (Ee = Rr);\n        var Fr = pt - (Rr - Ee);\n        return ee = this, Ht = arguments, Fr <= 0 || Fr > pt ? (It && (clearTimeout(It), It = null), Ee = Rr, he = rt.apply(ee, Ht), It || (ee = Ht = null)) : It || $t.trailing === !1 || (It = setTimeout(nr, Fr)), he;\n      };\n      return fr.cancel = function() {\n        clearTimeout(It), Ee = 0, It = ee = Ht = null;\n      }, fr;\n    }\n    function Wi(rt, pt, $t) {\n      var It, ee, Ht, he, Ee, nr = function() {\n        var Rr = Pn() - ee;\n        pt > Rr ? It = setTimeout(nr, pt - Rr) : (It = null, $t || (he = rt.apply(Ee, Ht)), It || (Ht = Ee = null));\n      }, fr = w(function(Rr) {\n        return Ee = this, Ht = Rr, ee = Pn(), It || (It = setTimeout(nr, pt), $t && (he = rt.apply(Ee, Ht))), he;\n      });\n      return fr.cancel = function() {\n        clearTimeout(It), It = Ht = Ee = null;\n      }, fr;\n    }\n    function Eo(rt, pt) {\n      return pi(pt, rt);\n    }\n    function hi(rt) {\n      return function() {\n        return !rt.apply(this, arguments);\n      };\n    }\n    function ro() {\n      var rt = arguments, pt = rt.length - 1;\n      return function() {\n        for (var $t = pt, It = rt[pt].apply(this, arguments); $t--; )\n          It = rt[$t].call(this, It);\n        return It;\n      };\n    }\n    function Ro(rt, pt) {\n      return function() {\n        if (--rt < 1) return pt.apply(this, arguments);\n      };\n    }\n    function sr(rt, pt) {\n      var $t;\n      return function() {\n        return --rt > 0 && ($t = pt.apply(this, arguments)), rt <= 1 && (pt = null), $t;\n      };\n    }\n    var Ci = pi(sr, 2);\n    function gi(rt, pt, $t) {\n      pt = ar(pt, $t);\n      for (var It, ee = xt(rt), Ht = 0, he = ee.length; Ht < he; Ht++)\n        if (pt(rt[It = ee[Ht]], It, rt)) return It;\n    }\n    function ha(rt) {\n      return function(pt, $t, It) {\n        $t = ar($t, It);\n        for (var ee = ot(pt), Ht = rt > 0 ? 0 : ee - 1; Ht >= 0 && Ht < ee; Ht += rt)\n          if ($t(pt[Ht], Ht, pt)) return Ht;\n        return -1;\n      };\n    }\n    var Io = ha(1), $i = ha(-1);\n    function _i(rt, pt, $t, It) {\n      for (var ee = ($t = ar($t, It, 1))(pt), Ht = 0, he = ot(rt); Ht < he; ) {\n        var Ee = Math.floor((Ht + he) / 2);\n        $t(rt[Ee]) < ee ? Ht = Ee + 1 : he = Ee;\n      }\n      return Ht;\n    }\n    function Yi(rt, pt, $t) {\n      return function(It, ee, Ht) {\n        var he = 0, Ee = ot(It);\n        if (typeof Ht == \"number\")\n          rt > 0 ? he = Ht >= 0 ? Ht : Math.max(Ht + Ee, he) : Ee = Ht >= 0 ? Math.min(Ht + 1, Ee) : Ht + Ee + 1;\n        else if ($t && Ht && Ee) return It[Ht = $t(It, ee)] === ee ? Ht : -1;\n        if (ee != ee) return (Ht = pt(A.q.call(It, he, Ee), G)) >= 0 ? Ht + he : -1;\n        for (Ht = rt > 0 ? he : Ee - 1; Ht >= 0 && Ht < Ee; Ht += rt)\n          if (It[Ht] === ee) return Ht;\n        return -1;\n      };\n    }\n    var ci = Yi(1, Io, _i), Ii = Yi(-1, $i);\n    function xi(rt, pt, $t) {\n      var It = (ui(rt) ? Io : gi)(rt, pt, $t);\n      if (It !== void 0 && It !== -1) return rt[It];\n    }\n    function Xi(rt, pt) {\n      return xi(rt, Yn(pt));\n    }\n    function fn(rt, pt, $t) {\n      var It, ee;\n      if (pt = xn(pt, $t), ui(rt))\n        for (It = 0, ee = rt.length; It < ee; It++) pt(rt[It], It, rt);\n      else {\n        var Ht = xt(rt);\n        for (It = 0, ee = Ht.length; It < ee; It++) pt(rt[Ht[It]], Ht[It], rt);\n      }\n      return rt;\n    }\n    function mi(rt, pt, $t) {\n      pt = ar(pt, $t);\n      for (var It = !ui(rt) && xt(rt), ee = (It || rt).length, Ht = Array(ee), he = 0; he < ee; he++) {\n        var Ee = It ? It[he] : he;\n        Ht[he] = pt(rt[Ee], Ee, rt);\n      }\n      return Ht;\n    }\n    function No(rt) {\n      var pt = function($t, It, ee, Ht) {\n        var he = !ui($t) && xt($t), Ee = (he || $t).length, nr = rt > 0 ? 0 : Ee - 1;\n        for (Ht || (ee = $t[he ? he[nr] : nr], nr += rt); nr >= 0 && nr < Ee; nr += rt) {\n          var fr = he ? he[nr] : nr;\n          ee = It(ee, $t[fr], fr, $t);\n        }\n        return ee;\n      };\n      return function($t, It, ee, Ht) {\n        var he = arguments.length >= 3;\n        return pt($t, xn(It, Ht, 4), ee, he);\n      };\n    }\n    var no = No(1), di = No(-1);\n    function Zi(rt, pt, $t) {\n      var It = [];\n      return pt = ar(pt, $t), fn(rt, function(ee, Ht, he) {\n        pt(ee, Ht, he) && It.push(ee);\n      }), It;\n    }\n    function qn(rt, pt, $t) {\n      return Zi(rt, hi(ar(pt)), $t);\n    }\n    function co(rt, pt, $t) {\n      pt = ar(pt, $t);\n      for (var It = !ui(rt) && xt(rt), ee = (It || rt).length, Ht = 0; Ht < ee; Ht++) {\n        var he = It ? It[Ht] : Ht;\n        if (!pt(rt[he], he, rt)) return !1;\n      }\n      return !0;\n    }\n    function fo(rt, pt, $t) {\n      pt = ar(pt, $t);\n      for (var It = !ui(rt) && xt(rt), ee = (It || rt).length, Ht = 0; Ht < ee; Ht++) {\n        var he = It ? It[Ht] : Ht;\n        if (pt(rt[he], he, rt)) return !0;\n      }\n      return !1;\n    }\n    function wi(rt, pt, $t, It) {\n      return ui(rt) || (rt = le(rt)), (typeof $t != \"number\" || It) && ($t = 0), ci(rt, pt, $t) >= 0;\n    }\n    var Oi = w(function(rt, pt, $t) {\n      var It, ee;\n      return f(pt) ? ee = pt : (pt = Kr(pt), It = pt.slice(0, -1), pt = pt[pt.length - 1]), mi(rt, function(Ht) {\n        var he = ee;\n        if (!he) {\n          if (It && It.length && (Ht = yn(Ht, It)), Ht == null) return;\n          he = Ht[pt];\n        }\n        return he == null ? he : he.apply(Ht, $t);\n      });\n    });\n    function Uo(rt, pt) {\n      return mi(rt, tn(pt));\n    }\n    function ga(rt, pt) {\n      return Zi(rt, Yn(pt));\n    }\n    function Vo(rt, pt, $t) {\n      var It, ee, Ht = -1 / 0, he = -1 / 0;\n      if (pt == null || typeof pt == \"number\" && typeof rt[0] != \"object\" && rt != null)\n        for (var Ee = 0, nr = (rt = ui(rt) ? rt : le(rt)).length; Ee < nr; Ee++)\n          (It = rt[Ee]) != null && It > Ht && (Ht = It);\n      else\n        pt = ar(pt, $t), fn(rt, function(fr, Rr, Fr) {\n          ((ee = pt(fr, Rr, Fr)) > he || ee === -1 / 0 && Ht === -1 / 0) && (Ht = fr, he = ee);\n        });\n      return Ht;\n    }\n    function io(rt, pt, $t) {\n      var It, ee, Ht = 1 / 0, he = 1 / 0;\n      if (pt == null || typeof pt == \"number\" && typeof rt[0] != \"object\" && rt != null)\n        for (var Ee = 0, nr = (rt = ui(rt) ? rt : le(rt)).length; Ee < nr; Ee++)\n          (It = rt[Ee]) != null && It < Ht && (Ht = It);\n      else\n        pt = ar(pt, $t), fn(rt, function(fr, Rr, Fr) {\n          ((ee = pt(fr, Rr, Fr)) < he || ee === 1 / 0 && Ht === 1 / 0) && (Ht = fr, he = ee);\n        });\n      return Ht;\n    }\n    var po = /[^\\ud800-\\udfff]|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff]/g;\n    function Hn(rt) {\n      return rt ? I(rt) ? A.q.call(rt) : a(rt) ? rt.match(po) : ui(rt) ? mi(rt, ri) : le(rt) : [];\n    }\n    function Ni(rt, pt, $t) {\n      if (pt == null || $t) return ui(rt) || (rt = le(rt)), rt[Ur(rt.length - 1)];\n      var It = Hn(rt), ee = ot(It);\n      pt = Math.max(Math.min(pt, ee), 0);\n      for (var Ht = ee - 1, he = 0; he < pt; he++) {\n        var Ee = Ur(he, Ht), nr = It[he];\n        It[he] = It[Ee], It[Ee] = nr;\n      }\n      return It.slice(0, pt);\n    }\n    function Mn(rt) {\n      return Ni(rt, 1 / 0);\n    }\n    function Mi(rt, pt, $t) {\n      var It = 0;\n      return pt = ar(pt, $t), Uo(\n        mi(rt, function(ee, Ht, he) {\n          return { value: ee, index: It++, criteria: pt(ee, Ht, he) };\n        }).sort(function(ee, Ht) {\n          var he = ee.criteria, Ee = Ht.criteria;\n          if (he !== Ee) {\n            if (he > Ee || he === void 0) return 1;\n            if (he < Ee || Ee === void 0) return -1;\n          }\n          return ee.index - Ht.index;\n        }),\n        \"value\"\n      );\n    }\n    function So(rt, pt) {\n      return function($t, It, ee) {\n        var Ht = pt ? [[], []] : {};\n        return It = ar(It, ee), fn($t, function(he, Ee) {\n          var nr = It(he, Ee, $t);\n          rt(Ht, he, nr);\n        }), Ht;\n      };\n    }\n    var Li = So(function(rt, pt, $t) {\n      R(rt, $t) ? rt[$t].push(pt) : rt[$t] = [pt];\n    }), ki = So(function(rt, pt, $t) {\n      rt[$t] = pt;\n    }), ji = So(function(rt, pt, $t) {\n      R(rt, $t) ? rt[$t]++ : rt[$t] = 1;\n    }), zi = So(function(rt, pt, $t) {\n      rt[$t ? 0 : 1].push(pt);\n    }, !0);\n    function oo(rt) {\n      return rt == null ? 0 : ui(rt) ? rt.length : xt(rt).length;\n    }\n    function Xt(rt, pt, $t) {\n      return pt in $t;\n    }\n    var ke = w(function(rt, pt) {\n      var $t = {}, It = pt[0];\n      if (rt == null) return $t;\n      f(It) ? (pt.length > 1 && (It = xn(It, pt[1])), pt = ce(rt)) : (It = Xt, pt = Ri(pt, !1, !1), rt = Object(rt));\n      for (var ee = 0, Ht = pt.length; ee < Ht; ee++) {\n        var he = pt[ee], Ee = rt[he];\n        It(Ee, he, rt) && ($t[he] = Ee);\n      }\n      return $t;\n    }), $ = w(function(rt, pt) {\n      var $t, It = pt[0];\n      return f(It) ? (It = hi(It), pt.length > 1 && ($t = pt[1])) : (pt = mi(Ri(pt, !1, !1), String), It = function(ee, Ht) {\n        return !wi(pt, Ht);\n      }), ke(rt, It, $t);\n    });\n    function P(rt, pt, $t) {\n      return A.q.call(rt, 0, Math.max(0, rt.length - (pt == null || $t ? 1 : pt)));\n    }\n    function U(rt, pt, $t) {\n      return rt == null || rt.length < 1 ? pt == null || $t ? void 0 : [] : pt == null || $t ? rt[0] : P(rt, rt.length - pt);\n    }\n    function W(rt, pt, $t) {\n      return A.q.call(rt, pt == null || $t ? 1 : pt);\n    }\n    function et(rt, pt, $t) {\n      return rt == null || rt.length < 1 ? pt == null || $t ? void 0 : [] : pt == null || $t ? rt[rt.length - 1] : W(rt, Math.max(0, rt.length - pt));\n    }\n    function dt(rt) {\n      return Zi(rt, Boolean);\n    }\n    function mt(rt, pt) {\n      return Ri(rt, pt, !1);\n    }\n    var Mt = w(function(rt, pt) {\n      return pt = Ri(pt, !0, !0), Zi(rt, function($t) {\n        return !wi(pt, $t);\n      });\n    }), Ut = w(function(rt, pt) {\n      return Mt(rt, pt);\n    });\n    function Zt(rt, pt, $t, It) {\n      g(pt) || (It = $t, $t = pt, pt = !1), $t != null && ($t = ar($t, It));\n      for (var ee = [], Ht = [], he = 0, Ee = ot(rt); he < Ee; he++) {\n        var nr = rt[he], fr = $t ? $t(nr, he, rt) : nr;\n        pt && !$t ? (he && Ht === fr || ee.push(nr), Ht = fr) : $t ? wi(Ht, fr) || (Ht.push(fr), ee.push(nr)) : wi(ee, nr) || ee.push(nr);\n      }\n      return ee;\n    }\n    var ve = w(function(rt) {\n      return Zt(Ri(rt, !0, !0));\n    });\n    function Ae(rt) {\n      for (var pt = [], $t = arguments.length, It = 0, ee = ot(rt); It < ee; It++) {\n        var Ht = rt[It];\n        if (!wi(pt, Ht)) {\n          var he;\n          for (he = 1; he < $t && wi(arguments[he], Ht); he++) ;\n          he === $t && pt.push(Ht);\n        }\n      }\n      return pt;\n    }\n    function de(rt) {\n      for (var pt = rt && Vo(rt, ot).length || 0, $t = Array(pt), It = 0; It < pt; It++)\n        $t[It] = Uo(rt, It);\n      return $t;\n    }\n    var me = w(de);\n    function Be(rt, pt) {\n      for (var $t = {}, It = 0, ee = ot(rt); It < ee; It++)\n        pt ? $t[rt[It]] = pt[It] : $t[rt[It][0]] = rt[It][1];\n      return $t;\n    }\n    function We(rt, pt, $t) {\n      pt == null && (pt = rt || 0, rt = 0), $t || ($t = pt < rt ? -1 : 1);\n      for (var It = Math.max(Math.ceil((pt - rt) / $t), 0), ee = Array(It), Ht = 0; Ht < It; Ht++, rt += $t)\n        ee[Ht] = rt;\n      return ee;\n    }\n    function tr(rt, pt) {\n      if (pt == null || pt < 1) return [];\n      for (var $t = [], It = 0, ee = rt.length; It < ee; )\n        $t.push(A.q.call(rt, It, It += pt));\n      return $t;\n    }\n    function bn(rt, pt) {\n      return rt._chain ? Nt(pt).chain() : pt;\n    }\n    function Rn(rt) {\n      return fn(je(rt), function(pt) {\n        var $t = Nt[pt] = rt[pt];\n        Nt.prototype[pt] = function() {\n          var It = [this._wrapped];\n          return A.o.apply(It, arguments), bn(this, $t.apply(Nt, It));\n        };\n      }), Nt;\n    }\n    fn(\n      [\"pop\", \"push\", \"reverse\", \"shift\", \"sort\", \"splice\", \"unshift\"],\n      function(rt) {\n        var pt = A.a[rt];\n        Nt.prototype[rt] = function() {\n          var $t = this._wrapped;\n          return $t != null && (pt.apply($t, arguments), rt !== \"shift\" && rt !== \"splice\" || $t.length !== 0 || delete $t[0]), bn(this, $t);\n        };\n      }\n    ), fn([\"concat\", \"join\", \"slice\"], function(rt) {\n      var pt = A.a[rt];\n      Nt.prototype[rt] = function() {\n        var $t = this._wrapped;\n        return $t != null && ($t = pt.apply($t, arguments)), bn(this, $t);\n      };\n    });\n    var Qi = Nt, Br = Rn(u);\n    Br._ = Br;\n    var Or = Br;\n  },\n  function(L, T, e) {\n    var u;\n    try {\n      u = {\n        clone: e(248),\n        constant: e(126),\n        each: e(167),\n        filter: e(170),\n        has: e(181),\n        isArray: e(13),\n        isEmpty: e(324),\n        isFunction: e(64),\n        isUndefined: e(182),\n        keys: e(41),\n        map: e(183),\n        reduce: e(185),\n        size: e(327),\n        transform: e(333),\n        union: e(334),\n        values: e(190)\n      };\n    } catch {\n    }\n    u || (u = window._), L.exports = u;\n  },\n  function(L, T) {\n    L.exports = function(e) {\n      var u = typeof e;\n      return e != null && (u == \"object\" || u == \"function\");\n    };\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return E;\n    });\n    var u = e(1), A = e(7), w = e(4), E = function() {\n      function y(x, g, o, c) {\n        this._stateRegistry = x, this._identifier = g, this._identifier = g, this._params = Object(w.C)({}, o || {}), this._options = Object(w.C)({}, c || {}), this._definition = x.matcher.find(g, this._options.relative);\n      }\n      return y.prototype.name = function() {\n        return this._definition && this._definition.name || this._identifier;\n      }, y.prototype.identifier = function() {\n        return this._identifier;\n      }, y.prototype.params = function() {\n        return this._params;\n      }, y.prototype.$state = function() {\n        return this._definition;\n      }, y.prototype.state = function() {\n        return this._definition && this._definition.self;\n      }, y.prototype.options = function() {\n        return this._options;\n      }, y.prototype.exists = function() {\n        return !(!this._definition || !this._definition.self);\n      }, y.prototype.valid = function() {\n        return !this.error();\n      }, y.prototype.error = function() {\n        var x = this.options().relative;\n        if (!this._definition && x) {\n          var g = x.name ? x.name : x;\n          return \"Could not resolve '\" + this.name() + \"' from state '\" + g + \"'\";\n        }\n        return this._definition ? this._definition.self ? void 0 : \"State '\" + this.name() + \"' has an invalid definition\" : \"No such state '\" + this.name() + \"'\";\n      }, y.prototype.toString = function() {\n        return \"'\" + this.name() + \"'\" + Object(A.m)(this.params());\n      }, y.prototype.withState = function(x) {\n        return new y(this._stateRegistry, x, this._params, this._options);\n      }, y.prototype.withParams = function(x, g) {\n        g === void 0 && (g = !1);\n        var o = g ? x : Object(w.C)({}, this._params, x);\n        return new y(\n          this._stateRegistry,\n          this._identifier,\n          o,\n          this._options\n        );\n      }, y.prototype.withOptions = function(x, g) {\n        g === void 0 && (g = !1);\n        var o = g ? x : Object(w.C)({}, this._options, x);\n        return new y(\n          this._stateRegistry,\n          this._identifier,\n          this._params,\n          o\n        );\n      }, y.isDef = function(x) {\n        return x && x.state && (Object(u.l)(x.state) || Object(u.i)(x.state) && Object(u.l)(x.state.name));\n      }, y;\n    }();\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return r;\n    }), e.d(T, \"b\", function() {\n      return l;\n    });\n    var u = e(0), A = e(3), w = e(10), E = e(6), y = e(69), x = e(15), g = e(18), o = e(7), c = e(4), a = y.a.when, n = [a.EAGER, a.LAZY], t = [a.EAGER], r = \"Native Injector\", l = function() {\n      function i(d) {\n        this._path = d;\n      }\n      return i.prototype.getTokens = function() {\n        return this._path.reduce(function(d, p) {\n          return d.concat(\n            p.resolvables.map(function(f) {\n              return f.token;\n            })\n          );\n        }, []).reduce(u.R, []);\n      }, i.prototype.getResolvable = function(d) {\n        var p = this._path.map(function(f) {\n          return f.resolvables;\n        }).reduce(u.T, []).filter(function(f) {\n          return f.token === d;\n        });\n        return Object(u.P)(p);\n      }, i.prototype.getPolicy = function(d) {\n        var p = this.findNode(d);\n        return d.getPolicy(p.state);\n      }, i.prototype.subContext = function(d) {\n        return new i(\n          g.a.subPath(this._path, function(p) {\n            return p.state === d;\n          })\n        );\n      }, i.prototype.addResolvables = function(d, p) {\n        var f = Object(u.t)(this._path, Object(A.o)(\"state\", p)), v = d.map(function(k) {\n          return k.token;\n        });\n        f.resolvables = f.resolvables.filter(function(k) {\n          return v.indexOf(k.token) === -1;\n        }).concat(d);\n      }, i.prototype.resolvePath = function(d, p) {\n        var f = this;\n        d === void 0 && (d = \"LAZY\");\n        var v = (Object(u.z)(n, d) ? d : \"LAZY\") === y.a.when.EAGER ? t : n;\n        w.c.traceResolvePath(this._path, d, p);\n        var k = function(S, j) {\n          return function(I) {\n            return Object(u.z)(S, f.getPolicy(I)[j]);\n          };\n        }, s = this._path.reduce(function(S, j) {\n          var I = j.resolvables.filter(k(v, \"when\")), R = I.filter(k([\"NOWAIT\"], \"async\")), M = I.filter(Object(A.i)(k([\"NOWAIT\"], \"async\"))), z = f.subContext(j.state), V = function(G) {\n            return G.get(z, p).then(function(Y) {\n              return { token: G.token, value: Y };\n            });\n          };\n          return R.forEach(V), S.concat(M.map(V));\n        }, []);\n        return E.b.$q.all(s);\n      }, i.prototype.injector = function() {\n        return this._injector || (this._injector = new h(this));\n      }, i.prototype.findNode = function(d) {\n        return Object(u.t)(this._path, function(p) {\n          return Object(u.z)(p.resolvables, d);\n        });\n      }, i.prototype.getDependencies = function(d) {\n        var p = this, f = this.findNode(d), v = (g.a.subPath(this._path, function(k) {\n          return k === f;\n        }) || this._path).reduce(function(k, s) {\n          return k.concat(s.resolvables);\n        }, []).filter(function(k) {\n          return k !== d;\n        });\n        return d.deps.map(function(k) {\n          var s = v.filter(function(j) {\n            return j.token === k;\n          });\n          if (s.length) return Object(u.P)(s);\n          var S = p.injector().getNative(k);\n          if (Object(c.db)(S))\n            throw new Error(\n              \"Could not find Dependency Injection token: \" + Object(o.m)(k)\n            );\n          return new x.a(\n            k,\n            function() {\n              return S;\n            },\n            [],\n            S\n          );\n        });\n      }, i;\n    }(), h = function() {\n      function i(d) {\n        this.context = d, this.native = this.get(r) || E.b.$injector;\n      }\n      return i.prototype.get = function(d) {\n        var p = this.context.getResolvable(d);\n        if (p) {\n          if (this.context.getPolicy(p).async === \"NOWAIT\")\n            return p.get(this.context);\n          if (!p.resolved)\n            throw new Error(\n              \"Resolvable async .get() not complete:\" + Object(o.m)(p.token)\n            );\n          return p.data;\n        }\n        return this.getNative(d);\n      }, i.prototype.getAsync = function(d) {\n        var p = this.context.getResolvable(d);\n        return p ? p.get(this.context) : E.b.$q.when(this.native.get(d));\n      }, i.prototype.getNative = function(d) {\n        return this.native && this.native.get(d);\n      }, i;\n    }();\n  },\n  function(L, T, e) {\n    e.r(T);\n    var u = e(134);\n    for (var A in u)\n      [\"default\"].indexOf(A) < 0 && function(g) {\n        e.d(T, g, function() {\n          return u[g];\n        });\n      }(A);\n    var w = e(16);\n    e.d(T, \"DefType\", function() {\n      return w.a;\n    }), e.d(T, \"Param\", function() {\n      return w.b;\n    });\n    var E = e(135);\n    e.d(T, \"ParamTypes\", function() {\n      return E.a;\n    });\n    var y = e(92);\n    e.d(T, \"StateParams\", function() {\n      return y.a;\n    });\n    var x = e(51);\n    e.d(T, \"ParamType\", function() {\n      return x.a;\n    });\n  },\n  function(L, T, e) {\n    e.d(T, \"c\", function() {\n      return A;\n    }), e.d(T, \"b\", function() {\n      return w;\n    }), e.d(T, \"e\", function() {\n      return E;\n    }), e.d(T, \"a\", function() {\n      return y;\n    }), e.d(T, \"d\", function() {\n      return x;\n    });\n    var u = e(4), A = function(g, o) {\n      var c = o[0], a = o[1];\n      return g.hasOwnProperty(c) ? Object(u.R)(g[c]) ? g[c].push(a) : g[c] = [g[c], a] : g[c] = a, g;\n    }, w = function(g) {\n      return g.split(\"&\").filter(u.M).map(u.Fb).reduce(A, {});\n    };\n    function E(g) {\n      var o = function(r) {\n        return r || \"\";\n      }, c = Object(u.Gb)(g).map(o), a = c[0], n = c[1], t = Object(u.Ib)(a).map(o);\n      return { path: t[0], search: t[1], hash: n, url: g };\n    }\n    var y = function(g) {\n      var o = g.path(), c = g.search(), a = g.hash(), n = Object.keys(c).map(function(t) {\n        var r = c[t];\n        return (Object(u.R)(r) ? r : [r]).map(function(l) {\n          return t + \"=\" + l;\n        });\n      }).reduce(u.Rb, []).join(\"&\");\n      return o + (n ? \"?\" + n : \"\") + (a ? \"#\" + a : \"\");\n    };\n    function x(g, o, c, a) {\n      return function(n) {\n        var t = n.locationService = new c(n), r = n.locationConfig = new a(n, o);\n        return {\n          name: g,\n          service: t,\n          configuration: r,\n          dispose: function(l) {\n            l.dispose(t), l.dispose(r);\n          }\n        };\n      };\n    }\n  },\n  function(L, T, e) {\n    var u;\n    try {\n      u = e(148);\n    } catch {\n    }\n    u || (u = window.graphlib), L.exports = u;\n  },\n  function(L, T, e) {\n    var u = e(150), A = typeof self == \"object\" && self && self.Object === Object && self, w = u || A || Function(\"return this\")();\n    L.exports = w;\n  },\n  function(L, T, e) {\n    e.r(T), e.d(T, \"getReferences\", function() {\n      return A;\n    }), e.d(T, \"getParents\", function() {\n      return w;\n    }), e.d(T, \"getMacroReferences\", function() {\n      return E;\n    }), e.d(T, \"getMacroParents\", function() {\n      return y;\n    });\n    const u = e(21);\n    function A(x, g) {\n      let o = u.filter(x.nodes, function(c) {\n        return !!(c.depends_on && c.depends_on.nodes && c.depends_on.nodes.length && u.contains(c.depends_on.nodes, g.unique_id));\n      });\n      return u.groupBy(o, \"resource_type\");\n    }\n    function w(x, g) {\n      let o = u.filter(x.nodes, function(a) {\n        return !!(g.depends_on && g.depends_on.nodes && g.depends_on.nodes.length && u.contains(g.depends_on.nodes, a.unique_id));\n      }), c = u.filter(x.macros, function(a) {\n        return !!(g.depends_on && g.depends_on.macros && g.depends_on.macros.length && u.contains(g.depends_on.macros, a.unique_id));\n      });\n      return u.groupBy(o.concat(c), \"resource_type\");\n    }\n    function E(x, g) {\n      let o = u.filter(x.nodes, function(a) {\n        return !!(a.depends_on && a.depends_on.macros && a.depends_on.macros.length && u.contains(a.depends_on.macros, g.unique_id));\n      }), c = u.filter(x.macros, function(a) {\n        return !!(a.depends_on && a.depends_on.macros && a.depends_on.macros.length && u.contains(a.depends_on.macros, g.unique_id));\n      });\n      return u.groupBy(o.concat(c), \"resource_type\");\n    }\n    function y(x, g) {\n      let o = u.filter(x.macros, function(c) {\n        return !!(g.depends_on && g.depends_on.macros && g.depends_on.macros.length && u.contains(g.depends_on.macros, c.unique_id));\n      });\n      return u.groupBy(o, \"resource_type\");\n    }\n  },\n  function(L, T, e) {\n    var u = e(447);\n    typeof u == \"string\" && (u = [[L.i, u, \"\"]]);\n    var A = { hmr: !0, transform: void 0, insertInto: void 0 };\n    e(40)(u, A), u.locals && (L.exports = u.locals);\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return a;\n    });\n    var u = e(0), A = e(3), w = e(1), E = e(16), y = e(7), x = e(4);\n    function g(n, t) {\n      var r = [\"\", \"\"], l = n.replace(/[\\\\\\[\\]\\^$*+?.()|{}]/g, \"\\\\$&\");\n      if (!t) return l;\n      switch (t.squash) {\n        case !1:\n          r = [\"(\", \")\" + (t.isOptional ? \"?\" : \"\")];\n          break;\n        case !0:\n          l = l.replace(/\\/$/, \"\"), r = [\"(?:/(\", \")|/)?\"];\n          break;\n        default:\n          r = [\"(\" + t.squash + \"|\", \")?\"];\n      }\n      return l + r[0] + t.type.pattern.source + r[1];\n    }\n    var o = Object(y.k)(\"/\"), c = {\n      state: { params: {} },\n      strict: !0,\n      caseInsensitive: !0,\n      decodeParams: !0\n    }, a = function() {\n      function n(t, r, l, h) {\n        var i = this;\n        this._cache = { path: [this] }, this._children = [], this._params = [], this._segments = [], this._compiled = [], this.config = h = Object(x.y)(h, c), this.pattern = t;\n        for (var d, p, f, v = /([:*])([\\w\\[\\]]+)|\\{([\\w\\[\\]]+)(?:\\:\\s*((?:[^{}\\\\]+|\\\\.|\\{(?:[^{}\\\\]+|\\\\.)*\\})+))?\\}/g, k = /([:]?)([\\w\\[\\].-]+)|\\{([\\w\\[\\].-]+)(?:\\:\\s*((?:[^{}\\\\]+|\\\\.|\\{(?:[^{}\\\\]+|\\\\.)*\\})+))?\\}/g, s = [], S = 0, j = function(z) {\n          if (!n.nameValidator.test(z))\n            throw new Error(\n              \"Invalid parameter name '\" + z + \"' in pattern '\" + t + \"'\"\n            );\n          if (Object(u.t)(i._params, Object(A.o)(\"id\", z)))\n            throw new Error(\n              \"Duplicate parameter name '\" + z + \"' in pattern '\" + t + \"'\"\n            );\n        }, I = function(z, V) {\n          var G, Y = z[2] || z[3], tt = V ? z[4] : z[4] || (z[1] === \"*\" ? \"[\\\\s\\\\S]*\" : null);\n          return {\n            id: Y,\n            regexp: tt,\n            segment: t.substring(S, z.index),\n            type: tt ? r.type(tt) || (G = tt, Object(u.A)(r.type(V ? \"query\" : \"path\"), {\n              pattern: new RegExp(\n                G,\n                i.config.caseInsensitive ? \"i\" : void 0\n              )\n            })) : null\n          };\n        }; (d = v.exec(t)) && !((p = I(d, !1)).segment.indexOf(\"?\") >= 0); )\n          j(p.id), this._params.push(l.fromPath(p.id, p.type, h.state)), this._segments.push(p.segment), s.push([p.segment, Object(u.P)(this._params)]), S = v.lastIndex;\n        var R = (f = t.substring(S)).indexOf(\"?\");\n        if (R >= 0) {\n          var M = f.substring(R);\n          if (f = f.substring(0, R), M.length > 0)\n            for (S = 0; d = k.exec(M); )\n              j((p = I(d, !0)).id), this._params.push(l.fromSearch(p.id, p.type, h.state)), S = v.lastIndex;\n        }\n        this._segments.push(f), this._compiled = s.map(function(z) {\n          return g.apply(null, z);\n        }).concat(g(f));\n      }\n      return n.encodeDashes = function(t) {\n        return encodeURIComponent(t).replace(/-/g, function(r) {\n          return \"%5C%\" + r.charCodeAt(0).toString(16).toUpperCase();\n        });\n      }, n.pathSegmentsAndParams = function(t) {\n        var r = t._segments, l = t._params.filter(function(h) {\n          return h.location === E.a.PATH;\n        });\n        return Object(u.i)(r, l.concat(void 0)).reduce(u.T, []).filter(function(h) {\n          return h !== \"\" && Object(w.c)(h);\n        });\n      }, n.queryParams = function(t) {\n        return t._params.filter(function(r) {\n          return r.location === E.a.SEARCH;\n        });\n      }, n.compare = function(t, r) {\n        var l = function(v) {\n          return v._cache.weights = v._cache.weights || function(k) {\n            return k._cache.segments = k._cache.segments || k._cache.path.map(n.pathSegmentsAndParams).reduce(u.T, []).reduce(y.e, []).map(function(s) {\n              return Object(w.l)(s) ? o(s) : s;\n            }).reduce(u.T, []);\n          }(v).map(function(k) {\n            return k === \"/\" ? 1 : Object(w.l)(k) ? 2 : k instanceof E.b ? 3 : void 0;\n          });\n        }, h = l(t), i = l(r);\n        (function(v, k, s) {\n          for (var S = Math.max(v.length, k.length); v.length < S; )\n            v.push(s);\n          for (; k.length < S; ) k.push(s);\n        })(h, i, 0);\n        var d, p, f = Object(u.i)(h, i);\n        for (p = 0; p < f.length; p++)\n          if ((d = f[p][0] - f[p][1]) !== 0) return d;\n        return 0;\n      }, n.prototype.append = function(t) {\n        return this._children.push(t), t._cache = {\n          path: this._cache.path.concat(t),\n          parent: this,\n          pattern: null\n        }, t;\n      }, n.prototype.isRoot = function() {\n        return this._cache.path[0] === this;\n      }, n.prototype.toString = function() {\n        return this.pattern;\n      }, n.prototype._getDecodedParamValue = function(t, r) {\n        return Object(w.c)(t) && (this.config.decodeParams && !r.type.raw && (t = Object(w.a)(t) ? t.map(function(l) {\n          return decodeURIComponent(l);\n        }) : decodeURIComponent(t)), t = r.type.decode(t)), r.value(t);\n      }, n.prototype.exec = function(t, r, l, h) {\n        var i = this;\n        r === void 0 && (r = {});\n        var d, p, f, v = (d = this._cache, p = \"pattern\", f = function() {\n          return new RegExp(\n            [\n              \"^\",\n              Object(u.S)(\n                i._cache.path.map(Object(A.n)(\"_compiled\"))\n              ).join(\"\"),\n              i.config.strict === !1 ? \"/?\" : \"\",\n              \"$\"\n            ].join(\"\"),\n            i.config.caseInsensitive ? \"i\" : void 0\n          );\n        }, d[p] = d[p] || f()).exec(t);\n        if (!v) return null;\n        var k, s, S, j = this.parameters(), I = j.filter(function(Z) {\n          return !Z.isSearch();\n        }), R = j.filter(function(Z) {\n          return Z.isSearch();\n        }), M = this._cache.path.map(function(Z) {\n          return Z._segments.length - 1;\n        }).reduce(function(Z, at) {\n          return Z + at;\n        }), z = {};\n        if (M !== v.length - 1)\n          throw new Error(\n            \"Unbalanced capture group in route '\" + this.pattern + \"'\"\n          );\n        for (var V = 0; V < M; V++) {\n          for (var G = I[V], Y = v[V + 1], tt = 0; tt < G.replace.length; tt++)\n            G.replace[tt].from === Y && (Y = G.replace[tt].to);\n          Y && G.array === !0 && (k = void 0, s = void 0, S = void 0, s = (k = function(Z) {\n            return Z.split(\"\").reverse().join(\"\");\n          })(Y).split(/-(?!\\\\)/), S = Object(u.B)(s, k), Y = Object(u.B)(S, function(Z) {\n            return Z.replace(/\\\\-/g, \"-\");\n          }).reverse()), z[G.id] = this._getDecodedParamValue(Y, G);\n        }\n        return R.forEach(function(Z) {\n          for (var at = r[Z.id], nt = 0; nt < Z.replace.length; nt++)\n            Z.replace[nt].from === at && (at = Z.replace[nt].to);\n          z[Z.id] = i._getDecodedParamValue(at, Z);\n        }), l && (z[\"#\"] = l), z;\n      }, n.prototype.parameters = function(t) {\n        return t === void 0 && (t = {}), t.inherit === !1 ? this._params : Object(u.S)(\n          this._cache.path.map(function(r) {\n            return r._params;\n          })\n        );\n      }, n.prototype.parameter = function(t, r) {\n        var l = this;\n        r === void 0 && (r = {});\n        var h = this._cache.parent;\n        return function() {\n          for (var i = 0, d = l._params; i < d.length; i++) {\n            var p = d[i];\n            if (p.id === t) return p;\n          }\n        }() || r.inherit !== !1 && h && h.parameter(t, r) || null;\n      }, n.prototype.validates = function(t) {\n        return t = t || {}, this.parameters().filter(function(r) {\n          return t.hasOwnProperty(r.id);\n        }).map(function(r) {\n          return l = r, h = t[r.id], !l || l.validates(h);\n          var l, h;\n        }).reduce(u.e, !0);\n      }, n.prototype.format = function(t) {\n        t === void 0 && (t = {});\n        var r = this._cache.path, l = r.map(n.pathSegmentsAndParams).reduce(u.T, []).map(function(f) {\n          return Object(w.l)(f) ? f : i(f);\n        }), h = r.map(n.queryParams).reduce(u.T, []).map(i);\n        if (l.concat(h).filter(function(f) {\n          return f.isValid === !1;\n        }).length)\n          return null;\n        function i(f) {\n          var v = f.value(t[f.id]), k = f.validates(v), s = f.isDefaultValue(v), S = !!s && f.squash, j = f.type.encode(v);\n          return {\n            param: f,\n            value: v,\n            isValid: k,\n            isDefaultValue: s,\n            squash: S,\n            encoded: j\n          };\n        }\n        var d = l.reduce(function(f, v) {\n          if (Object(w.l)(v)) return f + v;\n          var k = v.squash, s = v.encoded, S = v.param;\n          return k === !0 ? f.match(/\\/$/) ? f.slice(0, -1) : f : Object(w.l)(k) ? f + k : k !== !1 || s == null ? f : Object(w.a)(s) ? f + Object(u.B)(s, n.encodeDashes).join(\"-\") : S.raw ? f + s : f + encodeURIComponent(s);\n        }, \"\"), p = h.map(function(f) {\n          var v = f.param, k = f.squash, s = f.encoded, S = f.isDefaultValue;\n          if (!(s == null || S && k !== !1) && (Object(w.a)(s) || (s = [s]), s.length !== 0))\n            return v.raw || (s = Object(u.B)(s, encodeURIComponent)), s.map(function(j) {\n              return v.id + \"=\" + j;\n            });\n        }).filter(u.y).reduce(u.T, []).join(\"&\");\n        return d + (p ? \"?\" + p : \"\") + (t[\"#\"] ? \"#\" + t[\"#\"] : \"\");\n      }, n.nameValidator = /^\\w+([-.]+\\w+)*(?:\\[\\])?$/, n;\n    }();\n  },\n  function(L, T, e) {\n    var u;\n    /*!\n     * jQuery JavaScript Library v3.5.1\n     * https://jquery.com/\n     *\n     * Includes Sizzle.js\n     * https://sizzlejs.com/\n     *\n     * Copyright JS Foundation and other contributors\n     * Released under the MIT license\n     * https://jquery.org/license\n     *\n     * Date: 2020-05-04T22:49Z\n     */\n    (function(A, w) {\n      typeof L.exports == \"object\" ? L.exports = A.document ? w(A, !0) : function(E) {\n        if (!E.document)\n          throw new Error(\"jQuery requires a window with a document\");\n        return w(E);\n      } : w(A);\n    })(typeof window < \"u\" ? window : this, function(A, w) {\n      var E = [], y = Object.getPrototypeOf, x = E.slice, g = E.flat ? function($) {\n        return E.flat.call($);\n      } : function($) {\n        return E.concat.apply([], $);\n      }, o = E.push, c = E.indexOf, a = {}, n = a.toString, t = a.hasOwnProperty, r = t.toString, l = r.call(Object), h = {}, i = function($) {\n        return typeof $ == \"function\" && typeof $.nodeType != \"number\";\n      }, d = function($) {\n        return $ != null && $ === $.window;\n      }, p = A.document, f = { type: !0, src: !0, nonce: !0, noModule: !0 };\n      function v($, P, U) {\n        var W, et, dt = (U = U || p).createElement(\"script\");\n        if (dt.text = $, P)\n          for (W in f)\n            (et = P[W] || P.getAttribute && P.getAttribute(W)) && dt.setAttribute(W, et);\n        U.head.appendChild(dt).parentNode.removeChild(dt);\n      }\n      function k($) {\n        return $ == null ? $ + \"\" : typeof $ == \"object\" || typeof $ == \"function\" ? a[n.call($)] || \"object\" : typeof $;\n      }\n      var s = function($, P) {\n        return new s.fn.init($, P);\n      };\n      function S($) {\n        var P = !!$ && \"length\" in $ && $.length, U = k($);\n        return !i($) && !d($) && (U === \"array\" || P === 0 || typeof P == \"number\" && P > 0 && P - 1 in $);\n      }\n      s.fn = s.prototype = {\n        jquery: \"3.5.1\",\n        constructor: s,\n        length: 0,\n        toArray: function() {\n          return x.call(this);\n        },\n        get: function($) {\n          return $ == null ? x.call(this) : $ < 0 ? this[$ + this.length] : this[$];\n        },\n        pushStack: function($) {\n          var P = s.merge(this.constructor(), $);\n          return P.prevObject = this, P;\n        },\n        each: function($) {\n          return s.each(this, $);\n        },\n        map: function($) {\n          return this.pushStack(\n            s.map(this, function(P, U) {\n              return $.call(P, U, P);\n            })\n          );\n        },\n        slice: function() {\n          return this.pushStack(x.apply(this, arguments));\n        },\n        first: function() {\n          return this.eq(0);\n        },\n        last: function() {\n          return this.eq(-1);\n        },\n        even: function() {\n          return this.pushStack(\n            s.grep(this, function($, P) {\n              return (P + 1) % 2;\n            })\n          );\n        },\n        odd: function() {\n          return this.pushStack(\n            s.grep(this, function($, P) {\n              return P % 2;\n            })\n          );\n        },\n        eq: function($) {\n          var P = this.length, U = +$ + ($ < 0 ? P : 0);\n          return this.pushStack(U >= 0 && U < P ? [this[U]] : []);\n        },\n        end: function() {\n          return this.prevObject || this.constructor();\n        },\n        push: o,\n        sort: E.sort,\n        splice: E.splice\n      }, s.extend = s.fn.extend = function() {\n        var $, P, U, W, et, dt, mt = arguments[0] || {}, Mt = 1, Ut = arguments.length, Zt = !1;\n        for (typeof mt == \"boolean\" && (Zt = mt, mt = arguments[Mt] || {}, Mt++), typeof mt == \"object\" || i(mt) || (mt = {}), Mt === Ut && (mt = this, Mt--); Mt < Ut; Mt++)\n          if (($ = arguments[Mt]) != null)\n            for (P in $)\n              W = $[P], P !== \"__proto__\" && mt !== W && (Zt && W && (s.isPlainObject(W) || (et = Array.isArray(W))) ? (U = mt[P], dt = et && !Array.isArray(U) ? [] : et || s.isPlainObject(U) ? U : {}, et = !1, mt[P] = s.extend(Zt, dt, W)) : W !== void 0 && (mt[P] = W));\n        return mt;\n      }, s.extend({\n        expando: \"jQuery\" + (\"3.5.1\" + Math.random()).replace(/\\D/g, \"\"),\n        isReady: !0,\n        error: function($) {\n          throw new Error($);\n        },\n        noop: function() {\n        },\n        isPlainObject: function($) {\n          var P, U;\n          return !(!$ || n.call($) !== \"[object Object]\") && (!(P = y($)) || typeof (U = t.call(P, \"constructor\") && P.constructor) == \"function\" && r.call(U) === l);\n        },\n        isEmptyObject: function($) {\n          var P;\n          for (P in $) return !1;\n          return !0;\n        },\n        globalEval: function($, P, U) {\n          v($, { nonce: P && P.nonce }, U);\n        },\n        each: function($, P) {\n          var U, W = 0;\n          if (S($))\n            for (U = $.length; W < U && P.call($[W], W, $[W]) !== !1; W++) ;\n          else for (W in $) if (P.call($[W], W, $[W]) === !1) break;\n          return $;\n        },\n        makeArray: function($, P) {\n          var U = P || [];\n          return $ != null && (S(Object($)) ? s.merge(U, typeof $ == \"string\" ? [$] : $) : o.call(U, $)), U;\n        },\n        inArray: function($, P, U) {\n          return P == null ? -1 : c.call(P, $, U);\n        },\n        merge: function($, P) {\n          for (var U = +P.length, W = 0, et = $.length; W < U; W++)\n            $[et++] = P[W];\n          return $.length = et, $;\n        },\n        grep: function($, P, U) {\n          for (var W = [], et = 0, dt = $.length, mt = !U; et < dt; et++)\n            !P($[et], et) !== mt && W.push($[et]);\n          return W;\n        },\n        map: function($, P, U) {\n          var W, et, dt = 0, mt = [];\n          if (S($))\n            for (W = $.length; dt < W; dt++)\n              (et = P($[dt], dt, U)) != null && mt.push(et);\n          else for (dt in $) (et = P($[dt], dt, U)) != null && mt.push(et);\n          return g(mt);\n        },\n        guid: 1,\n        support: h\n      }), typeof Symbol == \"function\" && (s.fn[Symbol.iterator] = E[Symbol.iterator]), s.each(\n        \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split(\n          \" \"\n        ),\n        function($, P) {\n          a[\"[object \" + P + \"]\"] = P.toLowerCase();\n        }\n      );\n      var j = (\n        /*!\n         * Sizzle CSS Selector Engine v2.3.5\n         * https://sizzlejs.com/\n         *\n         * Copyright JS Foundation and other contributors\n         * Released under the MIT license\n         * https://js.foundation/\n         *\n         * Date: 2020-03-14\n         */\n        function($) {\n          var P, U, W, et, dt, mt, Mt, Ut, Zt, ve, Ae, de, me, Be, We, tr, bn, Rn, Qi, Br = \"sizzle\" + 1 * /* @__PURE__ */ new Date(), Or = $.document, rt = 0, pt = 0, $t = Ho(), It = Ho(), ee = Ho(), Ht = Ho(), he = function(bt, Pt) {\n            return bt === Pt && (Ae = !0), 0;\n          }, Ee = {}.hasOwnProperty, nr = [], fr = nr.pop, Rr = nr.push, Fr = nr.push, ii = nr.slice, Gn = function(bt, Pt) {\n            for (var Jt = 0, Se = bt.length; Jt < Se; Jt++)\n              if (bt[Jt] === Pt) return Jt;\n            return -1;\n          }, Wn = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\", yr = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\", Xr = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + yr + \"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\", Zn = \"\\\\[\" + yr + \"*(\" + Xr + \")(?:\" + yr + \"*([*^$|!~]?=)\" + yr + `*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\"((?:\\\\\\\\.|[^\\\\\\\\\"])*)\"|(` + Xr + \"))|)\" + yr + \"*\\\\]\", ao = \":(\" + Xr + `)(?:\\\\((('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\"((?:\\\\\\\\.|[^\\\\\\\\\"])*)\")|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|` + Zn + \")*)|.*)\\\\)|)\", ti = new RegExp(yr + \"+\", \"g\"), so = new RegExp(\n            \"^\" + yr + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + yr + \"+$\",\n            \"g\"\n          ), ea = new RegExp(\"^\" + yr + \"*,\" + yr + \"*\"), ei = new RegExp(\"^\" + yr + \"*([>+~]|\" + yr + \")\" + yr + \"*\"), Bi = new RegExp(yr + \"|>\"), el = new RegExp(ao), ma = new RegExp(\"^\" + Xr + \"$\"), Ia = {\n            ID: new RegExp(\"^#(\" + Xr + \")\"),\n            CLASS: new RegExp(\"^\\\\.(\" + Xr + \")\"),\n            TAG: new RegExp(\"^(\" + Xr + \"|[*])\"),\n            ATTR: new RegExp(\"^\" + Zn),\n            PSEUDO: new RegExp(\"^\" + ao),\n            CHILD: new RegExp(\n              \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + yr + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + yr + \"*(?:([+-]|)\" + yr + \"*(\\\\d+)|))\" + yr + \"*\\\\)|)\",\n              \"i\"\n            ),\n            bool: new RegExp(\"^(?:\" + Wn + \")$\", \"i\"),\n            needsContext: new RegExp(\n              \"^\" + yr + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + yr + \"*((?:-\\\\d)?\\\\d*)\" + yr + \"*\\\\)|)(?=[^-]|$)\",\n              \"i\"\n            )\n          }, rl = /HTML$/i, cs = /^(?:input|select|textarea|button)$/i, Na = /^h\\d$/i, va = /^[^{]+\\{\\s*\\[native \\w/, _a = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/, ba = /[+~]/, Ti = new RegExp(\n            \"\\\\\\\\[\\\\da-fA-F]{1,6}\" + yr + \"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\",\n            \"g\"\n          ), Co = function(bt, Pt) {\n            var Jt = \"0x\" + bt.slice(1) - 65536;\n            return Pt || (Jt < 0 ? String.fromCharCode(Jt + 65536) : String.fromCharCode(Jt >> 10 | 55296, 1023 & Jt | 56320));\n          }, ra = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g, Ps = function(bt, Pt) {\n            return Pt ? bt === \"\\0\" ? \"�\" : bt.slice(0, -1) + \"\\\\\" + bt.charCodeAt(bt.length - 1).toString(16) + \" \" : \"\\\\\" + bt;\n          }, ds = function() {\n            de();\n          }, fs = mo(\n            function(bt) {\n              return bt.disabled === !0 && bt.nodeName.toLowerCase() === \"fieldset\";\n            },\n            { dir: \"parentNode\", next: \"legend\" }\n          );\n          try {\n            Fr.apply(nr = ii.call(Or.childNodes), Or.childNodes), nr[Or.childNodes.length].nodeType;\n          } catch {\n            Fr = {\n              apply: nr.length ? function(Pt, Jt) {\n                Rr.apply(Pt, ii.call(Jt));\n              } : function(Pt, Jt) {\n                for (var Se = Pt.length, se = 0; Pt[Se++] = Jt[se++]; ) ;\n                Pt.length = Se - 1;\n              }\n            };\n          }\n          function on(bt, Pt, Jt, Se) {\n            var se, Oe, De, Ve, Ye, hr, jr, Er = Pt && Pt.ownerDocument, Vr = Pt ? Pt.nodeType : 9;\n            if (Jt = Jt || [], typeof bt != \"string\" || !bt || Vr !== 1 && Vr !== 9 && Vr !== 11)\n              return Jt;\n            if (!Se && (de(Pt), Pt = Pt || me, We)) {\n              if (Vr !== 11 && (Ye = _a.exec(bt)))\n                if (se = Ye[1]) {\n                  if (Vr === 9) {\n                    if (!(De = Pt.getElementById(se))) return Jt;\n                    if (De.id === se) return Jt.push(De), Jt;\n                  } else if (Er && (De = Er.getElementById(se)) && Qi(Pt, De) && De.id === se)\n                    return Jt.push(De), Jt;\n                } else {\n                  if (Ye[2]) return Fr.apply(Jt, Pt.getElementsByTagName(bt)), Jt;\n                  if ((se = Ye[3]) && U.getElementsByClassName && Pt.getElementsByClassName)\n                    return Fr.apply(Jt, Pt.getElementsByClassName(se)), Jt;\n                }\n              if (U.qsa && !Ht[bt + \" \"] && (!tr || !tr.test(bt)) && (Vr !== 1 || Pt.nodeName.toLowerCase() !== \"object\")) {\n                if (jr = bt, Er = Pt, Vr === 1 && (Bi.test(bt) || ei.test(bt))) {\n                  for ((Er = ba.test(bt) && lo(Pt.parentNode) || Pt) === Pt && U.scope || ((Ve = Pt.getAttribute(\"id\")) ? Ve = Ve.replace(ra, Ps) : Pt.setAttribute(\"id\", Ve = Br)), Oe = (hr = mt(bt)).length; Oe--; )\n                    hr[Oe] = (Ve ? \"#\" + Ve : \":scope\") + \" \" + go(hr[Oe]);\n                  jr = hr.join(\",\");\n                }\n                try {\n                  return Fr.apply(Jt, Er.querySelectorAll(jr)), Jt;\n                } catch {\n                  Ht(bt, !0);\n                } finally {\n                  Ve === Br && Pt.removeAttribute(\"id\");\n                }\n              }\n            }\n            return Ut(bt.replace(so, \"$1\"), Pt, Jt, Se);\n          }\n          function Ho() {\n            var bt = [];\n            return function Pt(Jt, Se) {\n              return bt.push(Jt + \" \") > W.cacheLength && delete Pt[bt.shift()], Pt[Jt + \" \"] = Se;\n            };\n          }\n          function Fi(bt) {\n            return bt[Br] = !0, bt;\n          }\n          function Pi(bt) {\n            var Pt = me.createElement(\"fieldset\");\n            try {\n              return !!bt(Pt);\n            } catch {\n              return !1;\n            } finally {\n              Pt.parentNode && Pt.parentNode.removeChild(Pt), Pt = null;\n            }\n          }\n          function Ma(bt, Pt) {\n            for (var Jt = bt.split(\"|\"), Se = Jt.length; Se--; )\n              W.attrHandle[Jt[Se]] = Pt;\n          }\n          function vt(bt, Pt) {\n            var Jt = Pt && bt, Se = Jt && bt.nodeType === 1 && Pt.nodeType === 1 && bt.sourceIndex - Pt.sourceIndex;\n            if (Se) return Se;\n            if (Jt) {\n              for (; Jt = Jt.nextSibling; ) if (Jt === Pt) return -1;\n            }\n            return bt ? 1 : -1;\n          }\n          function Qo(bt) {\n            return function(Pt) {\n              return Pt.nodeName.toLowerCase() === \"input\" && Pt.type === bt;\n            };\n          }\n          function La(bt) {\n            return function(Pt) {\n              var Jt = Pt.nodeName.toLowerCase();\n              return (Jt === \"input\" || Jt === \"button\") && Pt.type === bt;\n            };\n          }\n          function ho(bt) {\n            return function(Pt) {\n              return \"form\" in Pt ? Pt.parentNode && Pt.disabled === !1 ? \"label\" in Pt ? \"label\" in Pt.parentNode ? Pt.parentNode.disabled === bt : Pt.disabled === bt : Pt.isDisabled === bt || Pt.isDisabled !== !bt && fs(Pt) === bt : Pt.disabled === bt : \"label\" in Pt && Pt.disabled === bt;\n            };\n          }\n          function qr(bt) {\n            return Fi(function(Pt) {\n              return Pt = +Pt, Fi(function(Jt, Se) {\n                for (var se, Oe = bt([], Jt.length, Pt), De = Oe.length; De--; )\n                  Jt[se = Oe[De]] && (Jt[se] = !(Se[se] = Jt[se]));\n              });\n            });\n          }\n          function lo(bt) {\n            return bt && bt.getElementsByTagName !== void 0 && bt;\n          }\n          for (P in U = on.support = {}, dt = on.isXML = function(bt) {\n            var Pt = bt.namespaceURI, Jt = (bt.ownerDocument || bt).documentElement;\n            return !rl.test(Pt || Jt && Jt.nodeName || \"HTML\");\n          }, de = on.setDocument = function(bt) {\n            var Pt, Jt, Se = bt ? bt.ownerDocument || bt : Or;\n            return Se != me && Se.nodeType === 9 && Se.documentElement && (Be = (me = Se).documentElement, We = !dt(me), Or != me && (Jt = me.defaultView) && Jt.top !== Jt && (Jt.addEventListener ? Jt.addEventListener(\"unload\", ds, !1) : Jt.attachEvent && Jt.attachEvent(\"onunload\", ds)), U.scope = Pi(function(se) {\n              return Be.appendChild(se).appendChild(me.createElement(\"div\")), se.querySelectorAll !== void 0 && !se.querySelectorAll(\":scope fieldset div\").length;\n            }), U.attributes = Pi(function(se) {\n              return se.className = \"i\", !se.getAttribute(\"className\");\n            }), U.getElementsByTagName = Pi(function(se) {\n              return se.appendChild(me.createComment(\"\")), !se.getElementsByTagName(\"*\").length;\n            }), U.getElementsByClassName = va.test(me.getElementsByClassName), U.getById = Pi(function(se) {\n              return Be.appendChild(se).id = Br, !me.getElementsByName || !me.getElementsByName(Br).length;\n            }), U.getById ? (W.filter.ID = function(se) {\n              var Oe = se.replace(Ti, Co);\n              return function(De) {\n                return De.getAttribute(\"id\") === Oe;\n              };\n            }, W.find.ID = function(se, Oe) {\n              if (Oe.getElementById !== void 0 && We) {\n                var De = Oe.getElementById(se);\n                return De ? [De] : [];\n              }\n            }) : (W.filter.ID = function(se) {\n              var Oe = se.replace(Ti, Co);\n              return function(De) {\n                var Ve = De.getAttributeNode !== void 0 && De.getAttributeNode(\"id\");\n                return Ve && Ve.value === Oe;\n              };\n            }, W.find.ID = function(se, Oe) {\n              if (Oe.getElementById !== void 0 && We) {\n                var De, Ve, Ye, hr = Oe.getElementById(se);\n                if (hr) {\n                  if ((De = hr.getAttributeNode(\"id\")) && De.value === se)\n                    return [hr];\n                  for (Ye = Oe.getElementsByName(se), Ve = 0; hr = Ye[Ve++]; )\n                    if ((De = hr.getAttributeNode(\"id\")) && De.value === se)\n                      return [hr];\n                }\n                return [];\n              }\n            }), W.find.TAG = U.getElementsByTagName ? function(se, Oe) {\n              return Oe.getElementsByTagName !== void 0 ? Oe.getElementsByTagName(se) : U.qsa ? Oe.querySelectorAll(se) : void 0;\n            } : function(se, Oe) {\n              var De, Ve = [], Ye = 0, hr = Oe.getElementsByTagName(se);\n              if (se === \"*\") {\n                for (; De = hr[Ye++]; ) De.nodeType === 1 && Ve.push(De);\n                return Ve;\n              }\n              return hr;\n            }, W.find.CLASS = U.getElementsByClassName && function(se, Oe) {\n              if (Oe.getElementsByClassName !== void 0 && We)\n                return Oe.getElementsByClassName(se);\n            }, bn = [], tr = [], (U.qsa = va.test(me.querySelectorAll)) && (Pi(function(se) {\n              var Oe;\n              Be.appendChild(se).innerHTML = \"<a id='\" + Br + \"'></a><select id='\" + Br + \"-\\r\\\\' msallowcapture=''><option selected=''></option></select>\", se.querySelectorAll(\"[msallowcapture^='']\").length && tr.push(\"[*^$]=\" + yr + `*(?:''|\"\")`), se.querySelectorAll(\"[selected]\").length || tr.push(\"\\\\[\" + yr + \"*(?:value|\" + Wn + \")\"), se.querySelectorAll(\"[id~=\" + Br + \"-]\").length || tr.push(\"~=\"), (Oe = me.createElement(\"input\")).setAttribute(\"name\", \"\"), se.appendChild(Oe), se.querySelectorAll(\"[name='']\").length || tr.push(\n                \"\\\\[\" + yr + \"*name\" + yr + \"*=\" + yr + `*(?:''|\"\")`\n              ), se.querySelectorAll(\":checked\").length || tr.push(\":checked\"), se.querySelectorAll(\"a#\" + Br + \"+*\").length || tr.push(\".#.+[+~]\"), se.querySelectorAll(\"\\\\\\f\"), tr.push(\"[\\\\r\\\\n\\\\f]\");\n            }), Pi(function(se) {\n              se.innerHTML = \"<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>\";\n              var Oe = me.createElement(\"input\");\n              Oe.setAttribute(\"type\", \"hidden\"), se.appendChild(Oe).setAttribute(\"name\", \"D\"), se.querySelectorAll(\"[name=d]\").length && tr.push(\"name\" + yr + \"*[*^$|!~]?=\"), se.querySelectorAll(\":enabled\").length !== 2 && tr.push(\":enabled\", \":disabled\"), Be.appendChild(se).disabled = !0, se.querySelectorAll(\":disabled\").length !== 2 && tr.push(\":enabled\", \":disabled\"), se.querySelectorAll(\"*,:x\"), tr.push(\",.*:\");\n            })), (U.matchesSelector = va.test(\n              Rn = Be.matches || Be.webkitMatchesSelector || Be.mozMatchesSelector || Be.oMatchesSelector || Be.msMatchesSelector\n            )) && Pi(function(se) {\n              U.disconnectedMatch = Rn.call(se, \"*\"), Rn.call(se, \"[s!='']:x\"), bn.push(\"!=\", ao);\n            }), tr = tr.length && new RegExp(tr.join(\"|\")), bn = bn.length && new RegExp(bn.join(\"|\")), Pt = va.test(Be.compareDocumentPosition), Qi = Pt || va.test(Be.contains) ? function(se, Oe) {\n              var De = se.nodeType === 9 ? se.documentElement : se, Ve = Oe && Oe.parentNode;\n              return se === Ve || !(!Ve || Ve.nodeType !== 1 || !(De.contains ? De.contains(Ve) : se.compareDocumentPosition && 16 & se.compareDocumentPosition(Ve)));\n            } : function(se, Oe) {\n              if (Oe) {\n                for (; Oe = Oe.parentNode; ) if (Oe === se) return !0;\n              }\n              return !1;\n            }, he = Pt ? function(se, Oe) {\n              if (se === Oe) return Ae = !0, 0;\n              var De = !se.compareDocumentPosition - !Oe.compareDocumentPosition;\n              return De || (1 & (De = (se.ownerDocument || se) == (Oe.ownerDocument || Oe) ? se.compareDocumentPosition(Oe) : 1) || !U.sortDetached && Oe.compareDocumentPosition(se) === De ? se == me || se.ownerDocument == Or && Qi(Or, se) ? -1 : Oe == me || Oe.ownerDocument == Or && Qi(Or, Oe) ? 1 : ve ? Gn(ve, se) - Gn(ve, Oe) : 0 : 4 & De ? -1 : 1);\n            } : function(se, Oe) {\n              if (se === Oe) return Ae = !0, 0;\n              var De, Ve = 0, Ye = se.parentNode, hr = Oe.parentNode, jr = [se], Er = [Oe];\n              if (!Ye || !hr)\n                return se == me ? -1 : Oe == me ? 1 : Ye ? -1 : hr ? 1 : ve ? Gn(ve, se) - Gn(ve, Oe) : 0;\n              if (Ye === hr) return vt(se, Oe);\n              for (De = se; De = De.parentNode; ) jr.unshift(De);\n              for (De = Oe; De = De.parentNode; ) Er.unshift(De);\n              for (; jr[Ve] === Er[Ve]; ) Ve++;\n              return Ve ? vt(jr[Ve], Er[Ve]) : jr[Ve] == Or ? -1 : Er[Ve] == Or ? 1 : 0;\n            }), me;\n          }, on.matches = function(bt, Pt) {\n            return on(bt, null, null, Pt);\n          }, on.matchesSelector = function(bt, Pt) {\n            if (de(bt), U.matchesSelector && We && !Ht[Pt + \" \"] && (!bn || !bn.test(Pt)) && (!tr || !tr.test(Pt)))\n              try {\n                var Jt = Rn.call(bt, Pt);\n                if (Jt || U.disconnectedMatch || bt.document && bt.document.nodeType !== 11)\n                  return Jt;\n              } catch {\n                Ht(Pt, !0);\n              }\n            return on(Pt, me, null, [bt]).length > 0;\n          }, on.contains = function(bt, Pt) {\n            return (bt.ownerDocument || bt) != me && de(bt), Qi(bt, Pt);\n          }, on.attr = function(bt, Pt) {\n            (bt.ownerDocument || bt) != me && de(bt);\n            var Jt = W.attrHandle[Pt.toLowerCase()], Se = Jt && Ee.call(W.attrHandle, Pt.toLowerCase()) ? Jt(bt, Pt, !We) : void 0;\n            return Se !== void 0 ? Se : U.attributes || !We ? bt.getAttribute(Pt) : (Se = bt.getAttributeNode(Pt)) && Se.specified ? Se.value : null;\n          }, on.escape = function(bt) {\n            return (bt + \"\").replace(ra, Ps);\n          }, on.error = function(bt) {\n            throw new Error(\"Syntax error, unrecognized expression: \" + bt);\n          }, on.uniqueSort = function(bt) {\n            var Pt, Jt = [], Se = 0, se = 0;\n            if (Ae = !U.detectDuplicates, ve = !U.sortStable && bt.slice(0), bt.sort(he), Ae) {\n              for (; Pt = bt[se++]; ) Pt === bt[se] && (Se = Jt.push(se));\n              for (; Se--; ) bt.splice(Jt[Se], 1);\n            }\n            return ve = null, bt;\n          }, et = on.getText = function(bt) {\n            var Pt, Jt = \"\", Se = 0, se = bt.nodeType;\n            if (se) {\n              if (se === 1 || se === 9 || se === 11) {\n                if (typeof bt.textContent == \"string\") return bt.textContent;\n                for (bt = bt.firstChild; bt; bt = bt.nextSibling) Jt += et(bt);\n              } else if (se === 3 || se === 4) return bt.nodeValue;\n            } else for (; Pt = bt[Se++]; ) Jt += et(Pt);\n            return Jt;\n          }, (W = on.selectors = {\n            cacheLength: 50,\n            createPseudo: Fi,\n            match: Ia,\n            attrHandle: {},\n            find: {},\n            relative: {\n              \">\": { dir: \"parentNode\", first: !0 },\n              \" \": { dir: \"parentNode\" },\n              \"+\": { dir: \"previousSibling\", first: !0 },\n              \"~\": { dir: \"previousSibling\" }\n            },\n            preFilter: {\n              ATTR: function(bt) {\n                return bt[1] = bt[1].replace(Ti, Co), bt[3] = (bt[3] || bt[4] || bt[5] || \"\").replace(Ti, Co), bt[2] === \"~=\" && (bt[3] = \" \" + bt[3] + \" \"), bt.slice(0, 4);\n              },\n              CHILD: function(bt) {\n                return bt[1] = bt[1].toLowerCase(), bt[1].slice(0, 3) === \"nth\" ? (bt[3] || on.error(bt[0]), bt[4] = +(bt[4] ? bt[5] + (bt[6] || 1) : 2 * (bt[3] === \"even\" || bt[3] === \"odd\")), bt[5] = +(bt[7] + bt[8] || bt[3] === \"odd\")) : bt[3] && on.error(bt[0]), bt;\n              },\n              PSEUDO: function(bt) {\n                var Pt, Jt = !bt[6] && bt[2];\n                return Ia.CHILD.test(bt[0]) ? null : (bt[3] ? bt[2] = bt[4] || bt[5] || \"\" : Jt && el.test(Jt) && (Pt = mt(Jt, !0)) && (Pt = Jt.indexOf(\")\", Jt.length - Pt) - Jt.length) && (bt[0] = bt[0].slice(0, Pt), bt[2] = Jt.slice(0, Pt)), bt.slice(0, 3));\n              }\n            },\n            filter: {\n              TAG: function(bt) {\n                var Pt = bt.replace(Ti, Co).toLowerCase();\n                return bt === \"*\" ? function() {\n                  return !0;\n                } : function(Jt) {\n                  return Jt.nodeName && Jt.nodeName.toLowerCase() === Pt;\n                };\n              },\n              CLASS: function(bt) {\n                var Pt = $t[bt + \" \"];\n                return Pt || (Pt = new RegExp(\"(^|\" + yr + \")\" + bt + \"(\" + yr + \"|$)\")) && $t(bt, function(Jt) {\n                  return Pt.test(\n                    typeof Jt.className == \"string\" && Jt.className || Jt.getAttribute !== void 0 && Jt.getAttribute(\"class\") || \"\"\n                  );\n                });\n              },\n              ATTR: function(bt, Pt, Jt) {\n                return function(Se) {\n                  var se = on.attr(Se, bt);\n                  return se == null ? Pt === \"!=\" : !Pt || (se += \"\", Pt === \"=\" ? se === Jt : Pt === \"!=\" ? se !== Jt : Pt === \"^=\" ? Jt && se.indexOf(Jt) === 0 : Pt === \"*=\" ? Jt && se.indexOf(Jt) > -1 : Pt === \"$=\" ? Jt && se.slice(-Jt.length) === Jt : Pt === \"~=\" ? (\" \" + se.replace(ti, \" \") + \" \").indexOf(Jt) > -1 : Pt === \"|=\" && (se === Jt || se.slice(0, Jt.length + 1) === Jt + \"-\"));\n                };\n              },\n              CHILD: function(bt, Pt, Jt, Se, se) {\n                var Oe = bt.slice(0, 3) !== \"nth\", De = bt.slice(-4) !== \"last\", Ve = Pt === \"of-type\";\n                return Se === 1 && se === 0 ? function(Ye) {\n                  return !!Ye.parentNode;\n                } : function(Ye, hr, jr) {\n                  var Er, Vr, Cn, Tr, fi, oi, qi = Oe !== De ? \"nextSibling\" : \"previousSibling\", Lr = Ye.parentNode, vi = Ve && Ye.nodeName.toLowerCase(), Zr = !jr && !Ve, $n = !1;\n                  if (Lr) {\n                    if (Oe) {\n                      for (; qi; ) {\n                        for (Tr = Ye; Tr = Tr[qi]; )\n                          if (Ve ? Tr.nodeName.toLowerCase() === vi : Tr.nodeType === 1)\n                            return !1;\n                        oi = qi = bt === \"only\" && !oi && \"nextSibling\";\n                      }\n                      return !0;\n                    }\n                    if (oi = [De ? Lr.firstChild : Lr.lastChild], De && Zr) {\n                      for ($n = (fi = (Er = (Vr = (Cn = (Tr = Lr)[Br] || (Tr[Br] = {}))[Tr.uniqueID] || (Cn[Tr.uniqueID] = {}))[bt] || [])[0] === rt && Er[1]) && Er[2], Tr = fi && Lr.childNodes[fi]; Tr = ++fi && Tr && Tr[qi] || ($n = fi = 0) || oi.pop(); )\n                        if (Tr.nodeType === 1 && ++$n && Tr === Ye) {\n                          Vr[bt] = [rt, fi, $n];\n                          break;\n                        }\n                    } else if (Zr && ($n = fi = (Er = (Vr = (Cn = (Tr = Ye)[Br] || (Tr[Br] = {}))[Tr.uniqueID] || (Cn[Tr.uniqueID] = {}))[bt] || [])[0] === rt && Er[1]), $n === !1)\n                      for (; (Tr = ++fi && Tr && Tr[qi] || ($n = fi = 0) || oi.pop()) && ((Ve ? Tr.nodeName.toLowerCase() !== vi : Tr.nodeType !== 1) || !++$n || (Zr && ((Vr = (Cn = Tr[Br] || (Tr[Br] = {}))[Tr.uniqueID] || (Cn[Tr.uniqueID] = {}))[bt] = [rt, $n]), Tr !== Ye)); ) ;\n                    return ($n -= se) === Se || $n % Se == 0 && $n / Se >= 0;\n                  }\n                };\n              },\n              PSEUDO: function(bt, Pt) {\n                var Jt, Se = W.pseudos[bt] || W.setFilters[bt.toLowerCase()] || on.error(\"unsupported pseudo: \" + bt);\n                return Se[Br] ? Se(Pt) : Se.length > 1 ? (Jt = [bt, bt, \"\", Pt], W.setFilters.hasOwnProperty(bt.toLowerCase()) ? Fi(function(se, Oe) {\n                  for (var De, Ve = Se(se, Pt), Ye = Ve.length; Ye--; )\n                    se[De = Gn(se, Ve[Ye])] = !(Oe[De] = Ve[Ye]);\n                }) : function(se) {\n                  return Se(se, 0, Jt);\n                }) : Se;\n              }\n            },\n            pseudos: {\n              not: Fi(function(bt) {\n                var Pt = [], Jt = [], Se = Mt(bt.replace(so, \"$1\"));\n                return Se[Br] ? Fi(function(se, Oe, De, Ve) {\n                  for (var Ye, hr = Se(se, null, Ve, []), jr = se.length; jr--; )\n                    (Ye = hr[jr]) && (se[jr] = !(Oe[jr] = Ye));\n                }) : function(se, Oe, De) {\n                  return Pt[0] = se, Se(Pt, null, De, Jt), Pt[0] = null, !Jt.pop();\n                };\n              }),\n              has: Fi(function(bt) {\n                return function(Pt) {\n                  return on(bt, Pt).length > 0;\n                };\n              }),\n              contains: Fi(function(bt) {\n                return bt = bt.replace(Ti, Co), function(Pt) {\n                  return (Pt.textContent || et(Pt)).indexOf(bt) > -1;\n                };\n              }),\n              lang: Fi(function(bt) {\n                return ma.test(bt || \"\") || on.error(\"unsupported lang: \" + bt), bt = bt.replace(Ti, Co).toLowerCase(), function(Pt) {\n                  var Jt;\n                  do\n                    if (Jt = We ? Pt.lang : Pt.getAttribute(\"xml:lang\") || Pt.getAttribute(\"lang\"))\n                      return (Jt = Jt.toLowerCase()) === bt || Jt.indexOf(bt + \"-\") === 0;\n                  while ((Pt = Pt.parentNode) && Pt.nodeType === 1);\n                  return !1;\n                };\n              }),\n              target: function(bt) {\n                var Pt = $.location && $.location.hash;\n                return Pt && Pt.slice(1) === bt.id;\n              },\n              root: function(bt) {\n                return bt === Be;\n              },\n              focus: function(bt) {\n                return bt === me.activeElement && (!me.hasFocus || me.hasFocus()) && !!(bt.type || bt.href || ~bt.tabIndex);\n              },\n              enabled: ho(!1),\n              disabled: ho(!0),\n              checked: function(bt) {\n                var Pt = bt.nodeName.toLowerCase();\n                return Pt === \"input\" && !!bt.checked || Pt === \"option\" && !!bt.selected;\n              },\n              selected: function(bt) {\n                return bt.parentNode && bt.parentNode.selectedIndex, bt.selected === !0;\n              },\n              empty: function(bt) {\n                for (bt = bt.firstChild; bt; bt = bt.nextSibling)\n                  if (bt.nodeType < 6) return !1;\n                return !0;\n              },\n              parent: function(bt) {\n                return !W.pseudos.empty(bt);\n              },\n              header: function(bt) {\n                return Na.test(bt.nodeName);\n              },\n              input: function(bt) {\n                return cs.test(bt.nodeName);\n              },\n              button: function(bt) {\n                var Pt = bt.nodeName.toLowerCase();\n                return Pt === \"input\" && bt.type === \"button\" || Pt === \"button\";\n              },\n              text: function(bt) {\n                var Pt;\n                return bt.nodeName.toLowerCase() === \"input\" && bt.type === \"text\" && ((Pt = bt.getAttribute(\"type\")) == null || Pt.toLowerCase() === \"text\");\n              },\n              first: qr(function() {\n                return [0];\n              }),\n              last: qr(function(bt, Pt) {\n                return [Pt - 1];\n              }),\n              eq: qr(function(bt, Pt, Jt) {\n                return [Jt < 0 ? Jt + Pt : Jt];\n              }),\n              even: qr(function(bt, Pt) {\n                for (var Jt = 0; Jt < Pt; Jt += 2) bt.push(Jt);\n                return bt;\n              }),\n              odd: qr(function(bt, Pt) {\n                for (var Jt = 1; Jt < Pt; Jt += 2) bt.push(Jt);\n                return bt;\n              }),\n              lt: qr(function(bt, Pt, Jt) {\n                for (var Se = Jt < 0 ? Jt + Pt : Jt > Pt ? Pt : Jt; --Se >= 0; )\n                  bt.push(Se);\n                return bt;\n              }),\n              gt: qr(function(bt, Pt, Jt) {\n                for (var Se = Jt < 0 ? Jt + Pt : Jt; ++Se < Pt; ) bt.push(Se);\n                return bt;\n              })\n            }\n          }).pseudos.nth = W.pseudos.eq, { radio: !0, checkbox: !0, file: !0, password: !0, image: !0 })\n            W.pseudos[P] = Qo(P);\n          for (P in { submit: !0, reset: !0 }) W.pseudos[P] = La(P);\n          function Go() {\n          }\n          function go(bt) {\n            for (var Pt = 0, Jt = bt.length, Se = \"\"; Pt < Jt; Pt++) Se += bt[Pt].value;\n            return Se;\n          }\n          function mo(bt, Pt, Jt) {\n            var Se = Pt.dir, se = Pt.next, Oe = se || Se, De = Jt && Oe === \"parentNode\", Ve = pt++;\n            return Pt.first ? function(Ye, hr, jr) {\n              for (; Ye = Ye[Se]; )\n                if (Ye.nodeType === 1 || De) return bt(Ye, hr, jr);\n              return !1;\n            } : function(Ye, hr, jr) {\n              var Er, Vr, Cn, Tr = [rt, Ve];\n              if (jr) {\n                for (; Ye = Ye[Se]; )\n                  if ((Ye.nodeType === 1 || De) && bt(Ye, hr, jr)) return !0;\n              } else\n                for (; Ye = Ye[Se]; )\n                  if (Ye.nodeType === 1 || De)\n                    if (Vr = (Cn = Ye[Br] || (Ye[Br] = {}))[Ye.uniqueID] || (Cn[Ye.uniqueID] = {}), se && se === Ye.nodeName.toLowerCase())\n                      Ye = Ye[Se] || Ye;\n                    else {\n                      if ((Er = Vr[Oe]) && Er[0] === rt && Er[1] === Ve)\n                        return Tr[2] = Er[2];\n                      if (Vr[Oe] = Tr, Tr[2] = bt(Ye, hr, jr)) return !0;\n                    }\n              return !1;\n            };\n          }\n          function vo(bt) {\n            return bt.length > 1 ? function(Pt, Jt, Se) {\n              for (var se = bt.length; se--; ) if (!bt[se](Pt, Jt, Se)) return !1;\n              return !0;\n            } : bt[0];\n          }\n          function na(bt, Pt, Jt, Se, se) {\n            for (var Oe, De = [], Ve = 0, Ye = bt.length, hr = Pt != null; Ve < Ye; Ve++)\n              (Oe = bt[Ve]) && (Jt && !Jt(Oe, Se, se) || (De.push(Oe), hr && Pt.push(Ve)));\n            return De;\n          }\n          function Ne(bt, Pt, Jt, Se, se, Oe) {\n            return Se && !Se[Br] && (Se = Ne(Se)), se && !se[Br] && (se = Ne(se, Oe)), Fi(function(De, Ve, Ye, hr) {\n              var jr, Er, Vr, Cn = [], Tr = [], fi = Ve.length, oi = De || function(vi, Zr, $n) {\n                for (var Ji = 0, ia = Zr.length; Ji < ia; Ji++) on(vi, Zr[Ji], $n);\n                return $n;\n              }(Pt || \"*\", Ye.nodeType ? [Ye] : Ye, []), qi = !bt || !De && Pt ? oi : na(oi, Cn, bt, Ye, hr), Lr = Jt ? se || (De ? bt : fi || Se) ? [] : Ve : qi;\n              if (Jt && Jt(qi, Lr, Ye, hr), Se)\n                for (jr = na(Lr, Tr), Se(jr, [], Ye, hr), Er = jr.length; Er--; )\n                  (Vr = jr[Er]) && (Lr[Tr[Er]] = !(qi[Tr[Er]] = Vr));\n              if (De) {\n                if (se || bt) {\n                  if (se) {\n                    for (jr = [], Er = Lr.length; Er--; )\n                      (Vr = Lr[Er]) && jr.push(qi[Er] = Vr);\n                    se(null, Lr = [], jr, hr);\n                  }\n                  for (Er = Lr.length; Er--; )\n                    (Vr = Lr[Er]) && (jr = se ? Gn(De, Vr) : Cn[Er]) > -1 && (De[jr] = !(Ve[jr] = Vr));\n                }\n              } else Lr = na(Lr === Ve ? Lr.splice(fi, Lr.length) : Lr), se ? se(null, Ve, Lr, hr) : Fr.apply(Ve, Lr);\n            });\n          }\n          function ps(bt) {\n            for (var Pt, Jt, Se, se = bt.length, Oe = W.relative[bt[0].type], De = Oe || W.relative[\" \"], Ve = Oe ? 1 : 0, Ye = mo(\n              function(Er) {\n                return Er === Pt;\n              },\n              De,\n              !0\n            ), hr = mo(\n              function(Er) {\n                return Gn(Pt, Er) > -1;\n              },\n              De,\n              !0\n            ), jr = [\n              function(Er, Vr, Cn) {\n                var Tr = !Oe && (Cn || Vr !== Zt) || ((Pt = Vr).nodeType ? Ye(Er, Vr, Cn) : hr(Er, Vr, Cn));\n                return Pt = null, Tr;\n              }\n            ]; Ve < se; Ve++)\n              if (Jt = W.relative[bt[Ve].type]) jr = [mo(vo(jr), Jt)];\n              else {\n                if ((Jt = W.filter[bt[Ve].type].apply(null, bt[Ve].matches))[Br]) {\n                  for (Se = ++Ve; Se < se && !W.relative[bt[Se].type]; Se++) ;\n                  return Ne(\n                    Ve > 1 && vo(jr),\n                    Ve > 1 && go(\n                      bt.slice(0, Ve - 1).concat({ value: bt[Ve - 2].type === \" \" ? \"*\" : \"\" })\n                    ).replace(so, \"$1\"),\n                    Jt,\n                    Ve < Se && ps(bt.slice(Ve, Se)),\n                    Se < se && ps(bt = bt.slice(Se)),\n                    Se < se && go(bt)\n                  );\n                }\n                jr.push(Jt);\n              }\n            return vo(jr);\n          }\n          return Go.prototype = W.filters = W.pseudos, W.setFilters = new Go(), mt = on.tokenize = function(bt, Pt) {\n            var Jt, Se, se, Oe, De, Ve, Ye, hr = It[bt + \" \"];\n            if (hr) return Pt ? 0 : hr.slice(0);\n            for (De = bt, Ve = [], Ye = W.preFilter; De; ) {\n              for (Oe in Jt && !(Se = ea.exec(De)) || (Se && (De = De.slice(Se[0].length) || De), Ve.push(se = [])), Jt = !1, (Se = ei.exec(De)) && (Jt = Se.shift(), se.push({ value: Jt, type: Se[0].replace(so, \" \") }), De = De.slice(Jt.length)), W.filter)\n                !(Se = Ia[Oe].exec(De)) || Ye[Oe] && !(Se = Ye[Oe](Se)) || (Jt = Se.shift(), se.push({ value: Jt, type: Oe, matches: Se }), De = De.slice(Jt.length));\n              if (!Jt) break;\n            }\n            return Pt ? De.length : De ? on.error(bt) : It(bt, Ve).slice(0);\n          }, Mt = on.compile = function(bt, Pt) {\n            var Jt, Se = [], se = [], Oe = ee[bt + \" \"];\n            if (!Oe) {\n              for (Pt || (Pt = mt(bt)), Jt = Pt.length; Jt--; )\n                (Oe = ps(Pt[Jt]))[Br] ? Se.push(Oe) : se.push(Oe);\n              (Oe = ee(\n                bt,\n                function(De, Ve) {\n                  var Ye = Ve.length > 0, hr = De.length > 0, jr = function(Er, Vr, Cn, Tr, fi) {\n                    var oi, qi, Lr, vi = 0, Zr = \"0\", $n = Er && [], Ji = [], ia = Zt, oa = Er || hr && W.find.TAG(\"*\", fi), hs = rt += ia == null ? 1 : Math.random() || 0.1, Ki = oa.length;\n                    for (fi && (Zt = Vr == me || Vr || fi); Zr !== Ki && (oi = oa[Zr]) != null; Zr++) {\n                      if (hr && oi) {\n                        for (qi = 0, Vr || oi.ownerDocument == me || (de(oi), Cn = !We); Lr = De[qi++]; )\n                          if (Lr(oi, Vr || me, Cn)) {\n                            Tr.push(oi);\n                            break;\n                          }\n                        fi && (rt = hs);\n                      }\n                      Ye && ((oi = !Lr && oi) && vi--, Er && $n.push(oi));\n                    }\n                    if (vi += Zr, Ye && Zr !== vi) {\n                      for (qi = 0; Lr = Ve[qi++]; ) Lr($n, Ji, Vr, Cn);\n                      if (Er) {\n                        if (vi > 0)\n                          for (; Zr--; )\n                            $n[Zr] || Ji[Zr] || (Ji[Zr] = fr.call(Tr));\n                        Ji = na(Ji);\n                      }\n                      Fr.apply(Tr, Ji), fi && !Er && Ji.length > 0 && vi + Ve.length > 1 && on.uniqueSort(Tr);\n                    }\n                    return fi && (rt = hs, Zt = ia), $n;\n                  };\n                  return Ye ? Fi(jr) : jr;\n                }(se, Se)\n              )).selector = bt;\n            }\n            return Oe;\n          }, Ut = on.select = function(bt, Pt, Jt, Se) {\n            var se, Oe, De, Ve, Ye, hr = typeof bt == \"function\" && bt, jr = !Se && mt(bt = hr.selector || bt);\n            if (Jt = Jt || [], jr.length === 1) {\n              if ((Oe = jr[0] = jr[0].slice(0)).length > 2 && (De = Oe[0]).type === \"ID\" && Pt.nodeType === 9 && We && W.relative[Oe[1].type]) {\n                if (!(Pt = (W.find.ID(De.matches[0].replace(Ti, Co), Pt) || [])[0]))\n                  return Jt;\n                hr && (Pt = Pt.parentNode), bt = bt.slice(Oe.shift().value.length);\n              }\n              for (se = Ia.needsContext.test(bt) ? 0 : Oe.length; se-- && (De = Oe[se], !W.relative[Ve = De.type]); )\n                if ((Ye = W.find[Ve]) && (Se = Ye(\n                  De.matches[0].replace(Ti, Co),\n                  ba.test(Oe[0].type) && lo(Pt.parentNode) || Pt\n                ))) {\n                  if (Oe.splice(se, 1), !(bt = Se.length && go(Oe)))\n                    return Fr.apply(Jt, Se), Jt;\n                  break;\n                }\n            }\n            return (hr || Mt(bt, jr))(\n              Se,\n              Pt,\n              !We,\n              Jt,\n              !Pt || ba.test(bt) && lo(Pt.parentNode) || Pt\n            ), Jt;\n          }, U.sortStable = Br.split(\"\").sort(he).join(\"\") === Br, U.detectDuplicates = !!Ae, de(), U.sortDetached = Pi(function(bt) {\n            return 1 & bt.compareDocumentPosition(me.createElement(\"fieldset\"));\n          }), Pi(function(bt) {\n            return bt.innerHTML = \"<a href='#'></a>\", bt.firstChild.getAttribute(\"href\") === \"#\";\n          }) || Ma(\"type|href|height|width\", function(bt, Pt, Jt) {\n            if (!Jt)\n              return bt.getAttribute(Pt, Pt.toLowerCase() === \"type\" ? 1 : 2);\n          }), U.attributes && Pi(function(bt) {\n            return bt.innerHTML = \"<input/>\", bt.firstChild.setAttribute(\"value\", \"\"), bt.firstChild.getAttribute(\"value\") === \"\";\n          }) || Ma(\"value\", function(bt, Pt, Jt) {\n            if (!Jt && bt.nodeName.toLowerCase() === \"input\")\n              return bt.defaultValue;\n          }), Pi(function(bt) {\n            return bt.getAttribute(\"disabled\") == null;\n          }) || Ma(Wn, function(bt, Pt, Jt) {\n            var Se;\n            if (!Jt)\n              return bt[Pt] === !0 ? Pt.toLowerCase() : (Se = bt.getAttributeNode(Pt)) && Se.specified ? Se.value : null;\n          }), on;\n        }(A)\n      );\n      s.find = j, s.expr = j.selectors, s.expr[\":\"] = s.expr.pseudos, s.uniqueSort = s.unique = j.uniqueSort, s.text = j.getText, s.isXMLDoc = j.isXML, s.contains = j.contains, s.escapeSelector = j.escape;\n      var I = function($, P, U) {\n        for (var W = [], et = U !== void 0; ($ = $[P]) && $.nodeType !== 9; )\n          if ($.nodeType === 1) {\n            if (et && s($).is(U)) break;\n            W.push($);\n          }\n        return W;\n      }, R = function($, P) {\n        for (var U = []; $; $ = $.nextSibling)\n          $.nodeType === 1 && $ !== P && U.push($);\n        return U;\n      }, M = s.expr.match.needsContext;\n      function z($, P) {\n        return $.nodeName && $.nodeName.toLowerCase() === P.toLowerCase();\n      }\n      var V = /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i;\n      function G($, P, U) {\n        return i(P) ? s.grep($, function(W, et) {\n          return !!P.call(W, et, W) !== U;\n        }) : P.nodeType ? s.grep($, function(W) {\n          return W === P !== U;\n        }) : typeof P != \"string\" ? s.grep($, function(W) {\n          return c.call(P, W) > -1 !== U;\n        }) : s.filter(P, $, U);\n      }\n      s.filter = function($, P, U) {\n        var W = P[0];\n        return U && ($ = \":not(\" + $ + \")\"), P.length === 1 && W.nodeType === 1 ? s.find.matchesSelector(W, $) ? [W] : [] : s.find.matches(\n          $,\n          s.grep(P, function(et) {\n            return et.nodeType === 1;\n          })\n        );\n      }, s.fn.extend({\n        find: function($) {\n          var P, U, W = this.length, et = this;\n          if (typeof $ != \"string\")\n            return this.pushStack(\n              s($).filter(function() {\n                for (P = 0; P < W; P++) if (s.contains(et[P], this)) return !0;\n              })\n            );\n          for (U = this.pushStack([]), P = 0; P < W; P++) s.find($, et[P], U);\n          return W > 1 ? s.uniqueSort(U) : U;\n        },\n        filter: function($) {\n          return this.pushStack(G(this, $ || [], !1));\n        },\n        not: function($) {\n          return this.pushStack(G(this, $ || [], !0));\n        },\n        is: function($) {\n          return !!G(\n            this,\n            typeof $ == \"string\" && M.test($) ? s($) : $ || [],\n            !1\n          ).length;\n        }\n      });\n      var Y, tt = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/;\n      (s.fn.init = function($, P, U) {\n        var W, et;\n        if (!$) return this;\n        if (U = U || Y, typeof $ == \"string\") {\n          if (!(W = $[0] === \"<\" && $[$.length - 1] === \">\" && $.length >= 3 ? [null, $, null] : tt.exec($)) || !W[1] && P)\n            return !P || P.jquery ? (P || U).find($) : this.constructor(P).find($);\n          if (W[1]) {\n            if (P = P instanceof s ? P[0] : P, s.merge(\n              this,\n              s.parseHTML(\n                W[1],\n                P && P.nodeType ? P.ownerDocument || P : p,\n                !0\n              )\n            ), V.test(W[1]) && s.isPlainObject(P))\n              for (W in P) i(this[W]) ? this[W](P[W]) : this.attr(W, P[W]);\n            return this;\n          }\n          return (et = p.getElementById(W[2])) && (this[0] = et, this.length = 1), this;\n        }\n        return $.nodeType ? (this[0] = $, this.length = 1, this) : i($) ? U.ready !== void 0 ? U.ready($) : $(s) : s.makeArray($, this);\n      }).prototype = s.fn, Y = s(p);\n      var Z = /^(?:parents|prev(?:Until|All))/, at = { children: !0, contents: !0, next: !0, prev: !0 };\n      function nt($, P) {\n        for (; ($ = $[P]) && $.nodeType !== 1; ) ;\n        return $;\n      }\n      s.fn.extend({\n        has: function($) {\n          var P = s($, this), U = P.length;\n          return this.filter(function() {\n            for (var W = 0; W < U; W++) if (s.contains(this, P[W])) return !0;\n          });\n        },\n        closest: function($, P) {\n          var U, W = 0, et = this.length, dt = [], mt = typeof $ != \"string\" && s($);\n          if (!M.test($)) {\n            for (; W < et; W++)\n              for (U = this[W]; U && U !== P; U = U.parentNode)\n                if (U.nodeType < 11 && (mt ? mt.index(U) > -1 : U.nodeType === 1 && s.find.matchesSelector(U, $))) {\n                  dt.push(U);\n                  break;\n                }\n          }\n          return this.pushStack(dt.length > 1 ? s.uniqueSort(dt) : dt);\n        },\n        index: function($) {\n          return $ ? typeof $ == \"string\" ? c.call(s($), this[0]) : c.call(this, $.jquery ? $[0] : $) : this[0] && this[0].parentNode ? this.first().prevAll().length : -1;\n        },\n        add: function($, P) {\n          return this.pushStack(s.uniqueSort(s.merge(this.get(), s($, P))));\n        },\n        addBack: function($) {\n          return this.add(\n            $ == null ? this.prevObject : this.prevObject.filter($)\n          );\n        }\n      }), s.each(\n        {\n          parent: function($) {\n            var P = $.parentNode;\n            return P && P.nodeType !== 11 ? P : null;\n          },\n          parents: function($) {\n            return I($, \"parentNode\");\n          },\n          parentsUntil: function($, P, U) {\n            return I($, \"parentNode\", U);\n          },\n          next: function($) {\n            return nt($, \"nextSibling\");\n          },\n          prev: function($) {\n            return nt($, \"previousSibling\");\n          },\n          nextAll: function($) {\n            return I($, \"nextSibling\");\n          },\n          prevAll: function($) {\n            return I($, \"previousSibling\");\n          },\n          nextUntil: function($, P, U) {\n            return I($, \"nextSibling\", U);\n          },\n          prevUntil: function($, P, U) {\n            return I($, \"previousSibling\", U);\n          },\n          siblings: function($) {\n            return R(($.parentNode || {}).firstChild, $);\n          },\n          children: function($) {\n            return R($.firstChild);\n          },\n          contents: function($) {\n            return $.contentDocument != null && y($.contentDocument) ? $.contentDocument : (z($, \"template\") && ($ = $.content || $), s.merge([], $.childNodes));\n          }\n        },\n        function($, P) {\n          s.fn[$] = function(U, W) {\n            var et = s.map(this, P, U);\n            return $.slice(-5) !== \"Until\" && (W = U), W && typeof W == \"string\" && (et = s.filter(W, et)), this.length > 1 && (at[$] || s.uniqueSort(et), Z.test($) && et.reverse()), this.pushStack(et);\n          };\n        }\n      );\n      var ht = /[^\\x20\\t\\r\\n\\f]+/g;\n      function ct($) {\n        return $;\n      }\n      function ot($) {\n        throw $;\n      }\n      function gt($, P, U, W) {\n        var et;\n        try {\n          $ && i(et = $.promise) ? et.call($).done(P).fail(U) : $ && i(et = $.then) ? et.call($, P, U) : P.apply(void 0, [$].slice(W));\n        } catch (dt) {\n          U.apply(void 0, [dt]);\n        }\n      }\n      s.Callbacks = function($) {\n        $ = typeof $ == \"string\" ? function(ve) {\n          var Ae = {};\n          return s.each(ve.match(ht) || [], function(de, me) {\n            Ae[me] = !0;\n          }), Ae;\n        }($) : s.extend({}, $);\n        var P, U, W, et, dt = [], mt = [], Mt = -1, Ut = function() {\n          for (et = et || $.once, W = P = !0; mt.length; Mt = -1)\n            for (U = mt.shift(); ++Mt < dt.length; )\n              dt[Mt].apply(U[0], U[1]) === !1 && $.stopOnFalse && (Mt = dt.length, U = !1);\n          $.memory || (U = !1), P = !1, et && (dt = U ? [] : \"\");\n        }, Zt = {\n          add: function() {\n            return dt && (U && !P && (Mt = dt.length - 1, mt.push(U)), function ve(Ae) {\n              s.each(Ae, function(de, me) {\n                i(me) ? $.unique && Zt.has(me) || dt.push(me) : me && me.length && k(me) !== \"string\" && ve(me);\n              });\n            }(arguments), U && !P && Ut()), this;\n          },\n          remove: function() {\n            return s.each(arguments, function(ve, Ae) {\n              for (var de; (de = s.inArray(Ae, dt, de)) > -1; )\n                dt.splice(de, 1), de <= Mt && Mt--;\n            }), this;\n          },\n          has: function(ve) {\n            return ve ? s.inArray(ve, dt) > -1 : dt.length > 0;\n          },\n          empty: function() {\n            return dt && (dt = []), this;\n          },\n          disable: function() {\n            return et = mt = [], dt = U = \"\", this;\n          },\n          disabled: function() {\n            return !dt;\n          },\n          lock: function() {\n            return et = mt = [], U || P || (dt = U = \"\"), this;\n          },\n          locked: function() {\n            return !!et;\n          },\n          fireWith: function(ve, Ae) {\n            return et || (Ae = [ve, (Ae = Ae || []).slice ? Ae.slice() : Ae], mt.push(Ae), P || Ut()), this;\n          },\n          fire: function() {\n            return Zt.fireWith(this, arguments), this;\n          },\n          fired: function() {\n            return !!W;\n          }\n        };\n        return Zt;\n      }, s.extend({\n        Deferred: function($) {\n          var P = [\n            [\n              \"notify\",\n              \"progress\",\n              s.Callbacks(\"memory\"),\n              s.Callbacks(\"memory\"),\n              2\n            ],\n            [\n              \"resolve\",\n              \"done\",\n              s.Callbacks(\"once memory\"),\n              s.Callbacks(\"once memory\"),\n              0,\n              \"resolved\"\n            ],\n            [\n              \"reject\",\n              \"fail\",\n              s.Callbacks(\"once memory\"),\n              s.Callbacks(\"once memory\"),\n              1,\n              \"rejected\"\n            ]\n          ], U = \"pending\", W = {\n            state: function() {\n              return U;\n            },\n            always: function() {\n              return et.done(arguments).fail(arguments), this;\n            },\n            catch: function(dt) {\n              return W.then(null, dt);\n            },\n            pipe: function() {\n              var dt = arguments;\n              return s.Deferred(function(mt) {\n                s.each(P, function(Mt, Ut) {\n                  var Zt = i(dt[Ut[4]]) && dt[Ut[4]];\n                  et[Ut[1]](function() {\n                    var ve = Zt && Zt.apply(this, arguments);\n                    ve && i(ve.promise) ? ve.promise().progress(mt.notify).done(mt.resolve).fail(mt.reject) : mt[Ut[0] + \"With\"](this, Zt ? [ve] : arguments);\n                  });\n                }), dt = null;\n              }).promise();\n            },\n            then: function(dt, mt, Mt) {\n              var Ut = 0;\n              function Zt(ve, Ae, de, me) {\n                return function() {\n                  var Be = this, We = arguments, tr = function() {\n                    var Rn, Qi;\n                    if (!(ve < Ut)) {\n                      if ((Rn = de.apply(Be, We)) === Ae.promise())\n                        throw new TypeError(\"Thenable self-resolution\");\n                      Qi = Rn && (typeof Rn == \"object\" || typeof Rn == \"function\") && Rn.then, i(Qi) ? me ? Qi.call(Rn, Zt(Ut, Ae, ct, me), Zt(Ut, Ae, ot, me)) : (Ut++, Qi.call(\n                        Rn,\n                        Zt(Ut, Ae, ct, me),\n                        Zt(Ut, Ae, ot, me),\n                        Zt(Ut, Ae, ct, Ae.notifyWith)\n                      )) : (de !== ct && (Be = void 0, We = [Rn]), (me || Ae.resolveWith)(Be, We));\n                    }\n                  }, bn = me ? tr : function() {\n                    try {\n                      tr();\n                    } catch (Rn) {\n                      s.Deferred.exceptionHook && s.Deferred.exceptionHook(Rn, bn.stackTrace), ve + 1 >= Ut && (de !== ot && (Be = void 0, We = [Rn]), Ae.rejectWith(Be, We));\n                    }\n                  };\n                  ve ? bn() : (s.Deferred.getStackHook && (bn.stackTrace = s.Deferred.getStackHook()), A.setTimeout(bn));\n                };\n              }\n              return s.Deferred(function(ve) {\n                P[0][3].add(Zt(0, ve, i(Mt) ? Mt : ct, ve.notifyWith)), P[1][3].add(Zt(0, ve, i(dt) ? dt : ct)), P[2][3].add(Zt(0, ve, i(mt) ? mt : ot));\n              }).promise();\n            },\n            promise: function(dt) {\n              return dt != null ? s.extend(dt, W) : W;\n            }\n          }, et = {};\n          return s.each(P, function(dt, mt) {\n            var Mt = mt[2], Ut = mt[5];\n            W[mt[1]] = Mt.add, Ut && Mt.add(\n              function() {\n                U = Ut;\n              },\n              P[3 - dt][2].disable,\n              P[3 - dt][3].disable,\n              P[0][2].lock,\n              P[0][3].lock\n            ), Mt.add(mt[3].fire), et[mt[0]] = function() {\n              return et[mt[0] + \"With\"](this === et ? void 0 : this, arguments), this;\n            }, et[mt[0] + \"With\"] = Mt.fireWith;\n          }), W.promise(et), $ && $.call(et, et), et;\n        },\n        when: function($) {\n          var P = arguments.length, U = P, W = Array(U), et = x.call(arguments), dt = s.Deferred(), mt = function(Mt) {\n            return function(Ut) {\n              W[Mt] = this, et[Mt] = arguments.length > 1 ? x.call(arguments) : Ut, --P || dt.resolveWith(W, et);\n            };\n          };\n          if (P <= 1 && (gt($, dt.done(mt(U)).resolve, dt.reject, !P), dt.state() === \"pending\" || i(et[U] && et[U].then)))\n            return dt.then();\n          for (; U--; ) gt(et[U], mt(U), dt.reject);\n          return dt.promise();\n        }\n      });\n      var xt = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n      s.Deferred.exceptionHook = function($, P) {\n        A.console && A.console.warn && $ && xt.test($.name) && A.console.warn(\"jQuery.Deferred exception: \" + $.message, $.stack, P);\n      }, s.readyException = function($) {\n        A.setTimeout(function() {\n          throw $;\n        });\n      };\n      var St = s.Deferred();\n      function zt() {\n        p.removeEventListener(\"DOMContentLoaded\", zt), A.removeEventListener(\"load\", zt), s.ready();\n      }\n      s.fn.ready = function($) {\n        return St.then($).catch(function(P) {\n          s.readyException(P);\n        }), this;\n      }, s.extend({\n        isReady: !1,\n        readyWait: 1,\n        ready: function($) {\n          ($ === !0 ? --s.readyWait : s.isReady) || (s.isReady = !0, $ !== !0 && --s.readyWait > 0 || St.resolveWith(p, [s]));\n        }\n      }), s.ready.then = St.then, p.readyState === \"complete\" || p.readyState !== \"loading\" && !p.documentElement.doScroll ? A.setTimeout(s.ready) : (p.addEventListener(\"DOMContentLoaded\", zt), A.addEventListener(\"load\", zt));\n      var Nt = function($, P, U, W, et, dt, mt) {\n        var Mt = 0, Ut = $.length, Zt = U == null;\n        if (k(U) === \"object\")\n          for (Mt in et = !0, U) Nt($, P, Mt, U[Mt], !0, dt, mt);\n        else if (W !== void 0 && (et = !0, i(W) || (mt = !0), Zt && (mt ? (P.call($, W), P = null) : (Zt = P, P = function(ve, Ae, de) {\n          return Zt.call(s(ve), de);\n        })), P))\n          for (; Mt < Ut; Mt++) P($[Mt], U, mt ? W : W.call($[Mt], Mt, P($[Mt], U)));\n        return et ? $ : Zt ? P.call($) : Ut ? P($[0], U) : dt;\n      }, re = /^-ms-/, be = /-([a-z])/g;\n      function ne($, P) {\n        return P.toUpperCase();\n      }\n      function ce($) {\n        return $.replace(re, \"ms-\").replace(be, ne);\n      }\n      var xe = function($) {\n        return $.nodeType === 1 || $.nodeType === 9 || !+$.nodeType;\n      };\n      function we() {\n        this.expando = s.expando + we.uid++;\n      }\n      we.uid = 1, we.prototype = {\n        cache: function($) {\n          var P = $[this.expando];\n          return P || (P = {}, xe($) && ($.nodeType ? $[this.expando] = P : Object.defineProperty($, this.expando, {\n            value: P,\n            configurable: !0\n          }))), P;\n        },\n        set: function($, P, U) {\n          var W, et = this.cache($);\n          if (typeof P == \"string\") et[ce(P)] = U;\n          else for (W in P) et[ce(W)] = P[W];\n          return et;\n        },\n        get: function($, P) {\n          return P === void 0 ? this.cache($) : $[this.expando] && $[this.expando][ce(P)];\n        },\n        access: function($, P, U) {\n          return P === void 0 || P && typeof P == \"string\" && U === void 0 ? this.get($, P) : (this.set($, P, U), U !== void 0 ? U : P);\n        },\n        remove: function($, P) {\n          var U, W = $[this.expando];\n          if (W !== void 0) {\n            if (P !== void 0)\n              for (U = (P = Array.isArray(P) ? P.map(ce) : (P = ce(P)) in W ? [P] : P.match(ht) || []).length; U--; ) delete W[P[U]];\n            (P === void 0 || s.isEmptyObject(W)) && ($.nodeType ? $[this.expando] = void 0 : delete $[this.expando]);\n          }\n        },\n        hasData: function($) {\n          var P = $[this.expando];\n          return P !== void 0 && !s.isEmptyObject(P);\n        }\n      };\n      var ae = new we(), Le = new we(), lt = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/, kt = /[A-Z]/g;\n      function Dt($, P, U) {\n        var W;\n        if (U === void 0 && $.nodeType === 1)\n          if (W = \"data-\" + P.replace(kt, \"-$&\").toLowerCase(), typeof (U = $.getAttribute(W)) == \"string\") {\n            try {\n              U = function(et) {\n                return et === \"true\" || et !== \"false\" && (et === \"null\" ? null : et === +et + \"\" ? +et : lt.test(et) ? JSON.parse(et) : et);\n              }(U);\n            } catch {\n            }\n            Le.set($, P, U);\n          } else U = void 0;\n        return U;\n      }\n      s.extend({\n        hasData: function($) {\n          return Le.hasData($) || ae.hasData($);\n        },\n        data: function($, P, U) {\n          return Le.access($, P, U);\n        },\n        removeData: function($, P) {\n          Le.remove($, P);\n        },\n        _data: function($, P, U) {\n          return ae.access($, P, U);\n        },\n        _removeData: function($, P) {\n          ae.remove($, P);\n        }\n      }), s.fn.extend({\n        data: function($, P) {\n          var U, W, et, dt = this[0], mt = dt && dt.attributes;\n          if ($ === void 0) {\n            if (this.length && (et = Le.get(dt), dt.nodeType === 1 && !ae.get(dt, \"hasDataAttrs\"))) {\n              for (U = mt.length; U--; )\n                mt[U] && (W = mt[U].name).indexOf(\"data-\") === 0 && (W = ce(W.slice(5)), Dt(dt, W, et[W]));\n              ae.set(dt, \"hasDataAttrs\", !0);\n            }\n            return et;\n          }\n          return typeof $ == \"object\" ? this.each(function() {\n            Le.set(this, $);\n          }) : Nt(\n            this,\n            function(Mt) {\n              var Ut;\n              if (dt && Mt === void 0)\n                return (Ut = Le.get(dt, $)) !== void 0 || (Ut = Dt(dt, $)) !== void 0 ? Ut : void 0;\n              this.each(function() {\n                Le.set(this, $, Mt);\n              });\n            },\n            null,\n            P,\n            arguments.length > 1,\n            null,\n            !0\n          );\n        },\n        removeData: function($) {\n          return this.each(function() {\n            Le.remove(this, $);\n          });\n        }\n      }), s.extend({\n        queue: function($, P, U) {\n          var W;\n          if ($)\n            return P = (P || \"fx\") + \"queue\", W = ae.get($, P), U && (!W || Array.isArray(U) ? W = ae.access($, P, s.makeArray(U)) : W.push(U)), W || [];\n        },\n        dequeue: function($, P) {\n          P = P || \"fx\";\n          var U = s.queue($, P), W = U.length, et = U.shift(), dt = s._queueHooks($, P);\n          et === \"inprogress\" && (et = U.shift(), W--), et && (P === \"fx\" && U.unshift(\"inprogress\"), delete dt.stop, et.call(\n            $,\n            function() {\n              s.dequeue($, P);\n            },\n            dt\n          )), !W && dt && dt.empty.fire();\n        },\n        _queueHooks: function($, P) {\n          var U = P + \"queueHooks\";\n          return ae.get($, U) || ae.access($, U, {\n            empty: s.Callbacks(\"once memory\").add(function() {\n              ae.remove($, [P + \"queue\", U]);\n            })\n          });\n        }\n      }), s.fn.extend({\n        queue: function($, P) {\n          var U = 2;\n          return typeof $ != \"string\" && (P = $, $ = \"fx\", U--), arguments.length < U ? s.queue(this[0], $) : P === void 0 ? this : this.each(function() {\n            var W = s.queue(this, $, P);\n            s._queueHooks(this, $), $ === \"fx\" && W[0] !== \"inprogress\" && s.dequeue(this, $);\n          });\n        },\n        dequeue: function($) {\n          return this.each(function() {\n            s.dequeue(this, $);\n          });\n        },\n        clearQueue: function($) {\n          return this.queue($ || \"fx\", []);\n        },\n        promise: function($, P) {\n          var U, W = 1, et = s.Deferred(), dt = this, mt = this.length, Mt = function() {\n            --W || et.resolveWith(dt, [dt]);\n          };\n          for (typeof $ != \"string\" && (P = $, $ = void 0), $ = $ || \"fx\"; mt--; )\n            (U = ae.get(dt[mt], $ + \"queueHooks\")) && U.empty && (W++, U.empty.add(Mt));\n          return Mt(), et.promise(P);\n        }\n      });\n      var yt = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source, ft = new RegExp(\"^(?:([+-])=|)(\" + yt + \")([a-z%]*)$\", \"i\"), Rt = [\"Top\", \"Right\", \"Bottom\", \"Left\"], Wt = p.documentElement, le = function($) {\n        return s.contains($.ownerDocument, $);\n      }, ye = { composed: !0 };\n      Wt.getRootNode && (le = function($) {\n        return s.contains($.ownerDocument, $) || $.getRootNode(ye) === $.ownerDocument;\n      });\n      var pe = function($, P) {\n        return ($ = P || $).style.display === \"none\" || $.style.display === \"\" && le($) && s.css($, \"display\") === \"none\";\n      };\n      function je($, P, U, W) {\n        var et, dt, mt = 20, Mt = W ? function() {\n          return W.cur();\n        } : function() {\n          return s.css($, P, \"\");\n        }, Ut = Mt(), Zt = U && U[3] || (s.cssNumber[P] ? \"\" : \"px\"), ve = $.nodeType && (s.cssNumber[P] || Zt !== \"px\" && +Ut) && ft.exec(s.css($, P));\n        if (ve && ve[3] !== Zt) {\n          for (Ut /= 2, Zt = Zt || ve[3], ve = +Ut || 1; mt--; )\n            s.style($, P, ve + Zt), (1 - dt) * (1 - (dt = Mt() / Ut || 0.5)) <= 0 && (mt = 0), ve /= dt;\n          ve *= 2, s.style($, P, ve + Zt), U = U || [];\n        }\n        return U && (ve = +ve || +Ut || 0, et = U[1] ? ve + (U[1] + 1) * U[2] : +U[2], W && (W.unit = Zt, W.start = ve, W.end = et)), et;\n      }\n      var Me = {};\n      function Ze($) {\n        var P, U = $.ownerDocument, W = $.nodeName, et = Me[W];\n        return et || (P = U.body.appendChild(U.createElement(W)), et = s.css(P, \"display\"), P.parentNode.removeChild(P), et === \"none\" && (et = \"block\"), Me[W] = et, et);\n      }\n      function ir($, P) {\n        for (var U, W, et = [], dt = 0, mt = $.length; dt < mt; dt++)\n          (W = $[dt]).style && (U = W.style.display, P ? (U === \"none\" && (et[dt] = ae.get(W, \"display\") || null, et[dt] || (W.style.display = \"\")), W.style.display === \"\" && pe(W) && (et[dt] = Ze(W))) : U !== \"none\" && (et[dt] = \"none\", ae.set(W, \"display\", U)));\n        for (dt = 0; dt < mt; dt++) et[dt] != null && ($[dt].style.display = et[dt]);\n        return $;\n      }\n      s.fn.extend({\n        show: function() {\n          return ir(this, !0);\n        },\n        hide: function() {\n          return ir(this);\n        },\n        toggle: function($) {\n          return typeof $ == \"boolean\" ? $ ? this.show() : this.hide() : this.each(function() {\n            pe(this) ? s(this).show() : s(this).hide();\n          });\n        }\n      });\n      var Ar, rr, zr = /^(?:checkbox|radio)$/i, ln = /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i, mn = /^$|^module$|\\/(?:java|ecma)script/i;\n      Ar = p.createDocumentFragment().appendChild(p.createElement(\"div\")), (rr = p.createElement(\"input\")).setAttribute(\"type\", \"radio\"), rr.setAttribute(\"checked\", \"checked\"), rr.setAttribute(\"name\", \"t\"), Ar.appendChild(rr), h.checkClone = Ar.cloneNode(!0).cloneNode(!0).lastChild.checked, Ar.innerHTML = \"<textarea>x</textarea>\", h.noCloneChecked = !!Ar.cloneNode(!0).lastChild.defaultValue, Ar.innerHTML = \"<option></option>\", h.option = !!Ar.lastChild;\n      var un = {\n        thead: [1, \"<table>\", \"</table>\"],\n        col: [2, \"<table><colgroup>\", \"</colgroup></table>\"],\n        tr: [2, \"<table><tbody>\", \"</tbody></table>\"],\n        td: [3, \"<table><tbody><tr>\", \"</tr></tbody></table>\"],\n        _default: [0, \"\", \"\"]\n      };\n      function Kr($, P) {\n        var U;\n        return U = $.getElementsByTagName !== void 0 ? $.getElementsByTagName(P || \"*\") : $.querySelectorAll !== void 0 ? $.querySelectorAll(P || \"*\") : [], P === void 0 || P && z($, P) ? s.merge([$], U) : U;\n      }\n      function yn($, P) {\n        for (var U = 0, W = $.length; U < W; U++)\n          ae.set($[U], \"globalEval\", !P || ae.get(P[U], \"globalEval\"));\n      }\n      un.tbody = un.tfoot = un.colgroup = un.caption = un.thead, un.th = un.td, h.option || (un.optgroup = un.option = [1, \"<select multiple='multiple'>\", \"</select>\"]);\n      var nn = /<|&#?\\w+;/;\n      function Ei($, P, U, W, et) {\n        for (var dt, mt, Mt, Ut, Zt, ve, Ae = P.createDocumentFragment(), de = [], me = 0, Be = $.length; me < Be; me++)\n          if ((dt = $[me]) || dt === 0)\n            if (k(dt) === \"object\") s.merge(de, dt.nodeType ? [dt] : dt);\n            else if (nn.test(dt)) {\n              for (mt = mt || Ae.appendChild(P.createElement(\"div\")), Mt = (ln.exec(dt) || [\"\", \"\"])[1].toLowerCase(), Ut = un[Mt] || un._default, mt.innerHTML = Ut[1] + s.htmlPrefilter(dt) + Ut[2], ve = Ut[0]; ve--; )\n                mt = mt.lastChild;\n              s.merge(de, mt.childNodes), (mt = Ae.firstChild).textContent = \"\";\n            } else de.push(P.createTextNode(dt));\n        for (Ae.textContent = \"\", me = 0; dt = de[me++]; )\n          if (W && s.inArray(dt, W) > -1) et && et.push(dt);\n          else if (Zt = le(dt), mt = Kr(Ae.appendChild(dt), \"script\"), Zt && yn(mt), U)\n            for (ve = 0; dt = mt[ve++]; ) mn.test(dt.type || \"\") && U.push(dt);\n        return Ae;\n      }\n      var ri = /^key/, Yn = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, tn = /^([^.]*)(?:\\.(.+)|)/;\n      function xn() {\n        return !0;\n      }\n      function Tn() {\n        return !1;\n      }\n      function Kn($, P) {\n        return $ === function() {\n          try {\n            return p.activeElement;\n          } catch {\n          }\n        }() == (P === \"focus\");\n      }\n      function ar($, P, U, W, et, dt) {\n        var mt, Mt;\n        if (typeof P == \"object\") {\n          for (Mt in typeof U != \"string\" && (W = W || U, U = void 0), P)\n            ar($, Mt, U, W, P[Mt], dt);\n          return $;\n        }\n        if (W == null && et == null ? (et = U, W = U = void 0) : et == null && (typeof U == \"string\" ? (et = W, W = void 0) : (et = W, W = U, U = void 0)), et === !1)\n          et = Tn;\n        else if (!et) return $;\n        return dt === 1 && (mt = et, (et = function(Ut) {\n          return s().off(Ut), mt.apply(this, arguments);\n        }).guid = mt.guid || (mt.guid = s.guid++)), $.each(function() {\n          s.event.add(this, P, et, W, U);\n        });\n      }\n      function Yr($, P, U) {\n        U ? (ae.set($, P, !1), s.event.add($, P, {\n          namespace: !1,\n          handler: function(W) {\n            var et, dt, mt = ae.get(this, P);\n            if (1 & W.isTrigger && this[P]) {\n              if (mt.length)\n                (s.event.special[P] || {}).delegateType && W.stopPropagation();\n              else if (mt = x.call(arguments), ae.set(this, P, mt), et = U(this, P), this[P](), mt !== (dt = ae.get(this, P)) || et ? ae.set(this, P, !1) : dt = {}, mt !== dt)\n                return W.stopImmediatePropagation(), W.preventDefault(), dt.value;\n            } else\n              mt.length && (ae.set(this, P, {\n                value: s.event.trigger(\n                  s.extend(mt[0], s.Event.prototype),\n                  mt.slice(1),\n                  this\n                )\n              }), W.stopImmediatePropagation());\n          }\n        })) : ae.get($, P) === void 0 && s.event.add($, P, xn);\n      }\n      s.event = {\n        global: {},\n        add: function($, P, U, W, et) {\n          var dt, mt, Mt, Ut, Zt, ve, Ae, de, me, Be, We, tr = ae.get($);\n          if (xe($))\n            for (U.handler && (U = (dt = U).handler, et = dt.selector), et && s.find.matchesSelector(Wt, et), U.guid || (U.guid = s.guid++), (Ut = tr.events) || (Ut = tr.events = /* @__PURE__ */ Object.create(null)), (mt = tr.handle) || (mt = tr.handle = function(bn) {\n              return s !== void 0 && s.event.triggered !== bn.type ? s.event.dispatch.apply($, arguments) : void 0;\n            }), Zt = (P = (P || \"\").match(ht) || [\"\"]).length; Zt--; )\n              me = We = (Mt = tn.exec(P[Zt]) || [])[1], Be = (Mt[2] || \"\").split(\".\").sort(), me && (Ae = s.event.special[me] || {}, me = (et ? Ae.delegateType : Ae.bindType) || me, Ae = s.event.special[me] || {}, ve = s.extend(\n                {\n                  type: me,\n                  origType: We,\n                  data: W,\n                  handler: U,\n                  guid: U.guid,\n                  selector: et,\n                  needsContext: et && s.expr.match.needsContext.test(et),\n                  namespace: Be.join(\".\")\n                },\n                dt\n              ), (de = Ut[me]) || ((de = Ut[me] = []).delegateCount = 0, Ae.setup && Ae.setup.call($, W, Be, mt) !== !1 || $.addEventListener && $.addEventListener(me, mt)), Ae.add && (Ae.add.call($, ve), ve.handler.guid || (ve.handler.guid = U.guid)), et ? de.splice(de.delegateCount++, 0, ve) : de.push(ve), s.event.global[me] = !0);\n        },\n        remove: function($, P, U, W, et) {\n          var dt, mt, Mt, Ut, Zt, ve, Ae, de, me, Be, We, tr = ae.hasData($) && ae.get($);\n          if (tr && (Ut = tr.events)) {\n            for (Zt = (P = (P || \"\").match(ht) || [\"\"]).length; Zt--; )\n              if (me = We = (Mt = tn.exec(P[Zt]) || [])[1], Be = (Mt[2] || \"\").split(\".\").sort(), me) {\n                for (Ae = s.event.special[me] || {}, de = Ut[me = (W ? Ae.delegateType : Ae.bindType) || me] || [], Mt = Mt[2] && new RegExp(\n                  \"(^|\\\\.)\" + Be.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\"\n                ), mt = dt = de.length; dt--; )\n                  ve = de[dt], !et && We !== ve.origType || U && U.guid !== ve.guid || Mt && !Mt.test(ve.namespace) || W && W !== ve.selector && (W !== \"**\" || !ve.selector) || (de.splice(dt, 1), ve.selector && de.delegateCount--, Ae.remove && Ae.remove.call($, ve));\n                mt && !de.length && (Ae.teardown && Ae.teardown.call($, Be, tr.handle) !== !1 || s.removeEvent($, me, tr.handle), delete Ut[me]);\n              } else for (me in Ut) s.event.remove($, me + P[Zt], U, W, !0);\n            s.isEmptyObject(Ut) && ae.remove($, \"handle events\");\n          }\n        },\n        dispatch: function($) {\n          var P, U, W, et, dt, mt, Mt = new Array(arguments.length), Ut = s.event.fix($), Zt = (ae.get(this, \"events\") || /* @__PURE__ */ Object.create(null))[Ut.type] || [], ve = s.event.special[Ut.type] || {};\n          for (Mt[0] = Ut, P = 1; P < arguments.length; P++) Mt[P] = arguments[P];\n          if (Ut.delegateTarget = this, !ve.preDispatch || ve.preDispatch.call(this, Ut) !== !1) {\n            for (mt = s.event.handlers.call(this, Ut, Zt), P = 0; (et = mt[P++]) && !Ut.isPropagationStopped(); )\n              for (Ut.currentTarget = et.elem, U = 0; (dt = et.handlers[U++]) && !Ut.isImmediatePropagationStopped(); )\n                Ut.rnamespace && dt.namespace !== !1 && !Ut.rnamespace.test(dt.namespace) || (Ut.handleObj = dt, Ut.data = dt.data, (W = ((s.event.special[dt.origType] || {}).handle || dt.handler).apply(et.elem, Mt)) !== void 0 && (Ut.result = W) === !1 && (Ut.preventDefault(), Ut.stopPropagation()));\n            return ve.postDispatch && ve.postDispatch.call(this, Ut), Ut.result;\n          }\n        },\n        handlers: function($, P) {\n          var U, W, et, dt, mt, Mt = [], Ut = P.delegateCount, Zt = $.target;\n          if (Ut && Zt.nodeType && !($.type === \"click\" && $.button >= 1)) {\n            for (; Zt !== this; Zt = Zt.parentNode || this)\n              if (Zt.nodeType === 1 && ($.type !== \"click\" || Zt.disabled !== !0)) {\n                for (dt = [], mt = {}, U = 0; U < Ut; U++)\n                  mt[et = (W = P[U]).selector + \" \"] === void 0 && (mt[et] = W.needsContext ? s(et, this).index(Zt) > -1 : s.find(et, this, null, [Zt]).length), mt[et] && dt.push(W);\n                dt.length && Mt.push({ elem: Zt, handlers: dt });\n              }\n          }\n          return Zt = this, Ut < P.length && Mt.push({ elem: Zt, handlers: P.slice(Ut) }), Mt;\n        },\n        addProp: function($, P) {\n          Object.defineProperty(s.Event.prototype, $, {\n            enumerable: !0,\n            configurable: !0,\n            get: i(P) ? function() {\n              if (this.originalEvent) return P(this.originalEvent);\n            } : function() {\n              if (this.originalEvent) return this.originalEvent[$];\n            },\n            set: function(U) {\n              Object.defineProperty(this, $, {\n                enumerable: !0,\n                configurable: !0,\n                writable: !0,\n                value: U\n              });\n            }\n          });\n        },\n        fix: function($) {\n          return $[s.expando] ? $ : new s.Event($);\n        },\n        special: {\n          load: { noBubble: !0 },\n          click: {\n            setup: function($) {\n              var P = this || $;\n              return zr.test(P.type) && P.click && z(P, \"input\") && Yr(P, \"click\", xn), !1;\n            },\n            trigger: function($) {\n              var P = this || $;\n              return zr.test(P.type) && P.click && z(P, \"input\") && Yr(P, \"click\"), !0;\n            },\n            _default: function($) {\n              var P = $.target;\n              return zr.test(P.type) && P.click && z(P, \"input\") && ae.get(P, \"click\") || z(P, \"a\");\n            }\n          },\n          beforeunload: {\n            postDispatch: function($) {\n              $.result !== void 0 && $.originalEvent && ($.originalEvent.returnValue = $.result);\n            }\n          }\n        }\n      }, s.removeEvent = function($, P, U) {\n        $.removeEventListener && $.removeEventListener(P, U);\n      }, s.Event = function($, P) {\n        if (!(this instanceof s.Event)) return new s.Event($, P);\n        $ && $.type ? (this.originalEvent = $, this.type = $.type, this.isDefaultPrevented = $.defaultPrevented || $.defaultPrevented === void 0 && $.returnValue === !1 ? xn : Tn, this.target = $.target && $.target.nodeType === 3 ? $.target.parentNode : $.target, this.currentTarget = $.currentTarget, this.relatedTarget = $.relatedTarget) : this.type = $, P && s.extend(this, P), this.timeStamp = $ && $.timeStamp || Date.now(), this[s.expando] = !0;\n      }, s.Event.prototype = {\n        constructor: s.Event,\n        isDefaultPrevented: Tn,\n        isPropagationStopped: Tn,\n        isImmediatePropagationStopped: Tn,\n        isSimulated: !1,\n        preventDefault: function() {\n          var $ = this.originalEvent;\n          this.isDefaultPrevented = xn, $ && !this.isSimulated && $.preventDefault();\n        },\n        stopPropagation: function() {\n          var $ = this.originalEvent;\n          this.isPropagationStopped = xn, $ && !this.isSimulated && $.stopPropagation();\n        },\n        stopImmediatePropagation: function() {\n          var $ = this.originalEvent;\n          this.isImmediatePropagationStopped = xn, $ && !this.isSimulated && $.stopImmediatePropagation(), this.stopPropagation();\n        }\n      }, s.each(\n        {\n          altKey: !0,\n          bubbles: !0,\n          cancelable: !0,\n          changedTouches: !0,\n          ctrlKey: !0,\n          detail: !0,\n          eventPhase: !0,\n          metaKey: !0,\n          pageX: !0,\n          pageY: !0,\n          shiftKey: !0,\n          view: !0,\n          char: !0,\n          code: !0,\n          charCode: !0,\n          key: !0,\n          keyCode: !0,\n          button: !0,\n          buttons: !0,\n          clientX: !0,\n          clientY: !0,\n          offsetX: !0,\n          offsetY: !0,\n          pointerId: !0,\n          pointerType: !0,\n          screenX: !0,\n          screenY: !0,\n          targetTouches: !0,\n          toElement: !0,\n          touches: !0,\n          which: function($) {\n            var P = $.button;\n            return $.which == null && ri.test($.type) ? $.charCode != null ? $.charCode : $.keyCode : !$.which && P !== void 0 && Yn.test($.type) ? 1 & P ? 1 : 2 & P ? 3 : 4 & P ? 2 : 0 : $.which;\n          }\n        },\n        s.event.addProp\n      ), s.each({ focus: \"focusin\", blur: \"focusout\" }, function($, P) {\n        s.event.special[$] = {\n          setup: function() {\n            return Yr(this, $, Kn), !1;\n          },\n          trigger: function() {\n            return Yr(this, $), !0;\n          },\n          delegateType: P\n        };\n      }), s.each(\n        {\n          mouseenter: \"mouseover\",\n          mouseleave: \"mouseout\",\n          pointerenter: \"pointerover\",\n          pointerleave: \"pointerout\"\n        },\n        function($, P) {\n          s.event.special[$] = {\n            delegateType: P,\n            bindType: P,\n            handle: function(U) {\n              var W, et = this, dt = U.relatedTarget, mt = U.handleObj;\n              return dt && (dt === et || s.contains(et, dt)) || (U.type = mt.origType, W = mt.handler.apply(this, arguments), U.type = P), W;\n            }\n          };\n        }\n      ), s.fn.extend({\n        on: function($, P, U, W) {\n          return ar(this, $, P, U, W);\n        },\n        one: function($, P, U, W) {\n          return ar(this, $, P, U, W, 1);\n        },\n        off: function($, P, U) {\n          var W, et;\n          if ($ && $.preventDefault && $.handleObj)\n            return W = $.handleObj, s($.delegateTarget).off(\n              W.namespace ? W.origType + \".\" + W.namespace : W.origType,\n              W.selector,\n              W.handler\n            ), this;\n          if (typeof $ == \"object\") {\n            for (et in $) this.off(et, P, $[et]);\n            return this;\n          }\n          return P !== !1 && typeof P != \"function\" || (U = P, P = void 0), U === !1 && (U = Tn), this.each(function() {\n            s.event.remove(this, $, U, P);\n          });\n        }\n      });\n      var gn = /<script|<style|<link/i, vn = /checked\\s*(?:[^=]|=\\s*.checked.)/i, Wr = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\n      function Ur($, P) {\n        return z($, \"table\") && z(P.nodeType !== 11 ? P : P.firstChild, \"tr\") && s($).children(\"tbody\")[0] || $;\n      }\n      function Pn($) {\n        return $.type = ($.getAttribute(\"type\") !== null) + \"/\" + $.type, $;\n      }\n      function Fn($) {\n        return ($.type || \"\").slice(0, 5) === \"true/\" ? $.type = $.type.slice(5) : $.removeAttribute(\"type\"), $;\n      }\n      function In($, P) {\n        var U, W, et, dt, mt, Mt;\n        if (P.nodeType === 1) {\n          if (ae.hasData($) && (Mt = ae.get($).events))\n            for (et in ae.remove(P, \"handle events\"), Mt)\n              for (U = 0, W = Mt[et].length; U < W; U++)\n                s.event.add(P, et, Mt[et][U]);\n          Le.hasData($) && (dt = Le.access($), mt = s.extend({}, dt), Le.set(P, mt));\n        }\n      }\n      function ni($, P) {\n        var U = P.nodeName.toLowerCase();\n        U === \"input\" && zr.test($.type) ? P.checked = $.checked : U !== \"input\" && U !== \"textarea\" || (P.defaultValue = $.defaultValue);\n      }\n      function Xn($, P, U, W) {\n        P = g(P);\n        var et, dt, mt, Mt, Ut, Zt, ve = 0, Ae = $.length, de = Ae - 1, me = P[0], Be = i(me);\n        if (Be || Ae > 1 && typeof me == \"string\" && !h.checkClone && vn.test(me))\n          return $.each(function(We) {\n            var tr = $.eq(We);\n            Be && (P[0] = me.call(this, We, tr.html())), Xn(tr, P, U, W);\n          });\n        if (Ae && (dt = (et = Ei(P, $[0].ownerDocument, !1, $, W)).firstChild, et.childNodes.length === 1 && (et = dt), dt || W)) {\n          for (Mt = (mt = s.map(Kr(et, \"script\"), Pn)).length; ve < Ae; ve++)\n            Ut = et, ve !== de && (Ut = s.clone(Ut, !0, !0), Mt && s.merge(mt, Kr(Ut, \"script\"))), U.call($[ve], Ut, ve);\n          if (Mt)\n            for (Zt = mt[mt.length - 1].ownerDocument, s.map(mt, Fn), ve = 0; ve < Mt; ve++)\n              Ut = mt[ve], mn.test(Ut.type || \"\") && !ae.access(Ut, \"globalEval\") && s.contains(Zt, Ut) && (Ut.src && (Ut.type || \"\").toLowerCase() !== \"module\" ? s._evalUrl && !Ut.noModule && s._evalUrl(\n                Ut.src,\n                { nonce: Ut.nonce || Ut.getAttribute(\"nonce\") },\n                Zt\n              ) : v(Ut.textContent.replace(Wr, \"\"), Ut, Zt));\n        }\n        return $;\n      }\n      function ur($, P, U) {\n        for (var W, et = P ? s.filter(P, $) : $, dt = 0; (W = et[dt]) != null; dt++)\n          U || W.nodeType !== 1 || s.cleanData(Kr(W)), W.parentNode && (U && le(W) && yn(Kr(W, \"script\")), W.parentNode.removeChild(W));\n        return $;\n      }\n      s.extend({\n        htmlPrefilter: function($) {\n          return $;\n        },\n        clone: function($, P, U) {\n          var W, et, dt, mt, Mt = $.cloneNode(!0), Ut = le($);\n          if (!(h.noCloneChecked || $.nodeType !== 1 && $.nodeType !== 11 || s.isXMLDoc($)))\n            for (mt = Kr(Mt), W = 0, et = (dt = Kr($)).length; W < et; W++)\n              ni(dt[W], mt[W]);\n          if (P)\n            if (U)\n              for (dt = dt || Kr($), mt = mt || Kr(Mt), W = 0, et = dt.length; W < et; W++)\n                In(dt[W], mt[W]);\n            else In($, Mt);\n          return (mt = Kr(Mt, \"script\")).length > 0 && yn(mt, !Ut && Kr($, \"script\")), Mt;\n        },\n        cleanData: function($) {\n          for (var P, U, W, et = s.event.special, dt = 0; (U = $[dt]) !== void 0; dt++)\n            if (xe(U)) {\n              if (P = U[ae.expando]) {\n                if (P.events)\n                  for (W in P.events)\n                    et[W] ? s.event.remove(U, W) : s.removeEvent(U, W, P.handle);\n                U[ae.expando] = void 0;\n              }\n              U[Le.expando] && (U[Le.expando] = void 0);\n            }\n        }\n      }), s.fn.extend({\n        detach: function($) {\n          return ur(this, $, !0);\n        },\n        remove: function($) {\n          return ur(this, $);\n        },\n        text: function($) {\n          return Nt(\n            this,\n            function(P) {\n              return P === void 0 ? s.text(this) : this.empty().each(function() {\n                this.nodeType !== 1 && this.nodeType !== 11 && this.nodeType !== 9 || (this.textContent = P);\n              });\n            },\n            null,\n            $,\n            arguments.length\n          );\n        },\n        append: function() {\n          return Xn(this, arguments, function($) {\n            this.nodeType !== 1 && this.nodeType !== 11 && this.nodeType !== 9 || Ur(this, $).appendChild($);\n          });\n        },\n        prepend: function() {\n          return Xn(this, arguments, function($) {\n            if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {\n              var P = Ur(this, $);\n              P.insertBefore($, P.firstChild);\n            }\n          });\n        },\n        before: function() {\n          return Xn(this, arguments, function($) {\n            this.parentNode && this.parentNode.insertBefore($, this);\n          });\n        },\n        after: function() {\n          return Xn(this, arguments, function($) {\n            this.parentNode && this.parentNode.insertBefore($, this.nextSibling);\n          });\n        },\n        empty: function() {\n          for (var $, P = 0; ($ = this[P]) != null; P++)\n            $.nodeType === 1 && (s.cleanData(Kr($, !1)), $.textContent = \"\");\n          return this;\n        },\n        clone: function($, P) {\n          return $ = $ != null && $, P = P ?? $, this.map(function() {\n            return s.clone(this, $, P);\n          });\n        },\n        html: function($) {\n          return Nt(\n            this,\n            function(P) {\n              var U = this[0] || {}, W = 0, et = this.length;\n              if (P === void 0 && U.nodeType === 1) return U.innerHTML;\n              if (typeof P == \"string\" && !gn.test(P) && !un[(ln.exec(P) || [\"\", \"\"])[1].toLowerCase()]) {\n                P = s.htmlPrefilter(P);\n                try {\n                  for (; W < et; W++)\n                    (U = this[W] || {}).nodeType === 1 && (s.cleanData(Kr(U, !1)), U.innerHTML = P);\n                  U = 0;\n                } catch {\n                }\n              }\n              U && this.empty().append(P);\n            },\n            null,\n            $,\n            arguments.length\n          );\n        },\n        replaceWith: function() {\n          var $ = [];\n          return Xn(\n            this,\n            arguments,\n            function(P) {\n              var U = this.parentNode;\n              s.inArray(this, $) < 0 && (s.cleanData(Kr(this)), U && U.replaceChild(P, this));\n            },\n            $\n          );\n        }\n      }), s.each(\n        {\n          appendTo: \"append\",\n          prependTo: \"prepend\",\n          insertBefore: \"before\",\n          insertAfter: \"after\",\n          replaceAll: \"replaceWith\"\n        },\n        function($, P) {\n          s.fn[$] = function(U) {\n            for (var W, et = [], dt = s(U), mt = dt.length - 1, Mt = 0; Mt <= mt; Mt++)\n              W = Mt === mt ? this : this.clone(!0), s(dt[Mt])[P](W), o.apply(et, W.get());\n            return this.pushStack(et);\n          };\n        }\n      );\n      var _r = new RegExp(\"^(\" + yt + \")(?!px)[a-z%]+$\", \"i\"), Gi = function($) {\n        var P = $.ownerDocument.defaultView;\n        return P && P.opener || (P = A), P.getComputedStyle($);\n      }, Si = function($, P, U) {\n        var W, et, dt = {};\n        for (et in P) dt[et] = $.style[et], $.style[et] = P[et];\n        for (et in W = U.call($), P) $.style[et] = dt[et];\n        return W;\n      }, $a = new RegExp(Rt.join(\"|\"), \"i\");\n      function To($, P, U) {\n        var W, et, dt, mt, Mt = $.style;\n        return (U = U || Gi($)) && ((mt = U.getPropertyValue(P) || U[P]) !== \"\" || le($) || (mt = s.style($, P)), !h.pixelBoxStyles() && _r.test(mt) && $a.test(P) && (W = Mt.width, et = Mt.minWidth, dt = Mt.maxWidth, Mt.minWidth = Mt.maxWidth = Mt.width = mt, mt = U.width, Mt.width = W, Mt.minWidth = et, Mt.maxWidth = dt)), mt !== void 0 ? mt + \"\" : mt;\n      }\n      function wo($, P) {\n        return {\n          get: function() {\n            if (!$()) return (this.get = P).apply(this, arguments);\n            delete this.get;\n          }\n        };\n      }\n      (function() {\n        function $() {\n          if (Zt) {\n            Ut.style.cssText = \"position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0\", Zt.style.cssText = \"position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%\", Wt.appendChild(Ut).appendChild(Zt);\n            var ve = A.getComputedStyle(Zt);\n            U = ve.top !== \"1%\", Mt = P(ve.marginLeft) === 12, Zt.style.right = \"60%\", dt = P(ve.right) === 36, W = P(ve.width) === 36, Zt.style.position = \"absolute\", et = P(Zt.offsetWidth / 3) === 12, Wt.removeChild(Ut), Zt = null;\n          }\n        }\n        function P(ve) {\n          return Math.round(parseFloat(ve));\n        }\n        var U, W, et, dt, mt, Mt, Ut = p.createElement(\"div\"), Zt = p.createElement(\"div\");\n        Zt.style && (Zt.style.backgroundClip = \"content-box\", Zt.cloneNode(!0).style.backgroundClip = \"\", h.clearCloneStyle = Zt.style.backgroundClip === \"content-box\", s.extend(h, {\n          boxSizingReliable: function() {\n            return $(), W;\n          },\n          pixelBoxStyles: function() {\n            return $(), dt;\n          },\n          pixelPosition: function() {\n            return $(), U;\n          },\n          reliableMarginLeft: function() {\n            return $(), Mt;\n          },\n          scrollboxSize: function() {\n            return $(), et;\n          },\n          reliableTrDimensions: function() {\n            var ve, Ae, de, me;\n            return mt == null && (ve = p.createElement(\"table\"), Ae = p.createElement(\"tr\"), de = p.createElement(\"div\"), ve.style.cssText = \"position:absolute;left:-11111px\", Ae.style.height = \"1px\", de.style.height = \"9px\", Wt.appendChild(ve).appendChild(Ae).appendChild(de), me = A.getComputedStyle(Ae), mt = parseInt(me.height) > 3, Wt.removeChild(ve)), mt;\n          }\n        }));\n      })();\n      var Vn = [\"Webkit\", \"Moz\", \"ms\"], pa = p.createElement(\"div\").style, ko = {};\n      function Ao($) {\n        var P = s.cssProps[$] || ko[$];\n        return P || ($ in pa ? $ : ko[$] = function(U) {\n          for (var W = U[0].toUpperCase() + U.slice(1), et = Vn.length; et--; )\n            if ((U = Vn[et] + W) in pa) return U;\n        }($) || $);\n      }\n      var Po = /^(none|table(?!-c[ea]).+)/, Nn = /^--/, pi = { position: \"absolute\", visibility: \"hidden\", display: \"block\" }, Fo = { letterSpacing: \"0\", fontWeight: \"400\" };\n      function ui($, P, U) {\n        var W = ft.exec(P);\n        return W ? Math.max(0, W[2] - (U || 0)) + (W[3] || \"px\") : P;\n      }\n      function Ri($, P, U, W, et, dt) {\n        var mt = P === \"width\" ? 1 : 0, Mt = 0, Ut = 0;\n        if (U === (W ? \"border\" : \"content\")) return 0;\n        for (; mt < 4; mt += 2)\n          U === \"margin\" && (Ut += s.css($, U + Rt[mt], !0, et)), W ? (U === \"content\" && (Ut -= s.css($, \"padding\" + Rt[mt], !0, et)), U !== \"margin\" && (Ut -= s.css($, \"border\" + Rt[mt] + \"Width\", !0, et))) : (Ut += s.css($, \"padding\" + Rt[mt], !0, et), U !== \"padding\" ? Ut += s.css($, \"border\" + Rt[mt] + \"Width\", !0, et) : Mt += s.css($, \"border\" + Rt[mt] + \"Width\", !0, et));\n        return !W && dt >= 0 && (Ut += Math.max(\n          0,\n          Math.ceil(\n            $[\"offset\" + P[0].toUpperCase() + P.slice(1)] - dt - Ut - Mt - 0.5\n          )\n        ) || 0), Ut;\n      }\n      function qo($, P, U) {\n        var W = Gi($), et = (!h.boxSizingReliable() || U) && s.css($, \"boxSizing\", !1, W) === \"border-box\", dt = et, mt = To($, P, W), Mt = \"offset\" + P[0].toUpperCase() + P.slice(1);\n        if (_r.test(mt)) {\n          if (!U) return mt;\n          mt = \"auto\";\n        }\n        return (!h.boxSizingReliable() && et || !h.reliableTrDimensions() && z($, \"tr\") || mt === \"auto\" || !parseFloat(mt) && s.css($, \"display\", !1, W) === \"inline\") && $.getClientRects().length && (et = s.css($, \"boxSizing\", !1, W) === \"border-box\", (dt = Mt in $) && (mt = $[Mt])), (mt = parseFloat(mt) || 0) + Ri($, P, U || (et ? \"border\" : \"content\"), dt, W, mt) + \"px\";\n      }\n      function wn($, P, U, W, et) {\n        return new wn.prototype.init($, P, U, W, et);\n      }\n      s.extend({\n        cssHooks: {\n          opacity: {\n            get: function($, P) {\n              if (P) {\n                var U = To($, \"opacity\");\n                return U === \"\" ? \"1\" : U;\n              }\n            }\n          }\n        },\n        cssNumber: {\n          animationIterationCount: !0,\n          columnCount: !0,\n          fillOpacity: !0,\n          flexGrow: !0,\n          flexShrink: !0,\n          fontWeight: !0,\n          gridArea: !0,\n          gridColumn: !0,\n          gridColumnEnd: !0,\n          gridColumnStart: !0,\n          gridRow: !0,\n          gridRowEnd: !0,\n          gridRowStart: !0,\n          lineHeight: !0,\n          opacity: !0,\n          order: !0,\n          orphans: !0,\n          widows: !0,\n          zIndex: !0,\n          zoom: !0\n        },\n        cssProps: {},\n        style: function($, P, U, W) {\n          if ($ && $.nodeType !== 3 && $.nodeType !== 8 && $.style) {\n            var et, dt, mt, Mt = ce(P), Ut = Nn.test(P), Zt = $.style;\n            if (Ut || (P = Ao(Mt)), mt = s.cssHooks[P] || s.cssHooks[Mt], U === void 0)\n              return mt && \"get\" in mt && (et = mt.get($, !1, W)) !== void 0 ? et : Zt[P];\n            (dt = typeof U) == \"string\" && (et = ft.exec(U)) && et[1] && (U = je($, P, et), dt = \"number\"), U != null && U == U && (dt !== \"number\" || Ut || (U += et && et[3] || (s.cssNumber[Mt] ? \"\" : \"px\")), h.clearCloneStyle || U !== \"\" || P.indexOf(\"background\") !== 0 || (Zt[P] = \"inherit\"), mt && \"set\" in mt && (U = mt.set($, U, W)) === void 0 || (Ut ? Zt.setProperty(P, U) : Zt[P] = U));\n          }\n        },\n        css: function($, P, U, W) {\n          var et, dt, mt, Mt = ce(P);\n          return Nn.test(P) || (P = Ao(Mt)), (mt = s.cssHooks[P] || s.cssHooks[Mt]) && \"get\" in mt && (et = mt.get($, !0, U)), et === void 0 && (et = To($, P, W)), et === \"normal\" && P in Fo && (et = Fo[P]), U === \"\" || U ? (dt = parseFloat(et), U === !0 || isFinite(dt) ? dt || 0 : et) : et;\n        }\n      }), s.each([\"height\", \"width\"], function($, P) {\n        s.cssHooks[P] = {\n          get: function(U, W, et) {\n            if (W)\n              return !Po.test(s.css(U, \"display\")) || U.getClientRects().length && U.getBoundingClientRect().width ? qo(U, P, et) : Si(U, pi, function() {\n                return qo(U, P, et);\n              });\n          },\n          set: function(U, W, et) {\n            var dt, mt = Gi(U), Mt = !h.scrollboxSize() && mt.position === \"absolute\", Ut = (Mt || et) && s.css(U, \"boxSizing\", !1, mt) === \"border-box\", Zt = et ? Ri(U, P, et, Ut, mt) : 0;\n            return Ut && Mt && (Zt -= Math.ceil(\n              U[\"offset\" + P[0].toUpperCase() + P.slice(1)] - parseFloat(mt[P]) - Ri(U, P, \"border\", !1, mt) - 0.5\n            )), Zt && (dt = ft.exec(W)) && (dt[3] || \"px\") !== \"px\" && (U.style[P] = W, W = s.css(U, P)), ui(0, W, Zt);\n          }\n        };\n      }), s.cssHooks.marginLeft = wo(h.reliableMarginLeft, function($, P) {\n        if (P)\n          return (parseFloat(To($, \"marginLeft\")) || $.getBoundingClientRect().left - Si($, { marginLeft: 0 }, function() {\n            return $.getBoundingClientRect().left;\n          })) + \"px\";\n      }), s.each({ margin: \"\", padding: \"\", border: \"Width\" }, function($, P) {\n        s.cssHooks[$ + P] = {\n          expand: function(U) {\n            for (var W = 0, et = {}, dt = typeof U == \"string\" ? U.split(\" \") : [U]; W < 4; W++)\n              et[$ + Rt[W] + P] = dt[W] || dt[W - 2] || dt[0];\n            return et;\n          }\n        }, $ !== \"margin\" && (s.cssHooks[$ + P].set = ui);\n      }), s.fn.extend({\n        css: function($, P) {\n          return Nt(\n            this,\n            function(U, W, et) {\n              var dt, mt, Mt = {}, Ut = 0;\n              if (Array.isArray(W)) {\n                for (dt = Gi(U), mt = W.length; Ut < mt; Ut++)\n                  Mt[W[Ut]] = s.css(U, W[Ut], !1, dt);\n                return Mt;\n              }\n              return et !== void 0 ? s.style(U, W, et) : s.css(U, W);\n            },\n            $,\n            P,\n            arguments.length > 1\n          );\n        }\n      }), s.Tween = wn, wn.prototype = {\n        constructor: wn,\n        init: function($, P, U, W, et, dt) {\n          this.elem = $, this.prop = U, this.easing = et || s.easing._default, this.options = P, this.start = this.now = this.cur(), this.end = W, this.unit = dt || (s.cssNumber[U] ? \"\" : \"px\");\n        },\n        cur: function() {\n          var $ = wn.propHooks[this.prop];\n          return $ && $.get ? $.get(this) : wn.propHooks._default.get(this);\n        },\n        run: function($) {\n          var P, U = wn.propHooks[this.prop];\n          return this.options.duration ? this.pos = P = s.easing[this.easing](\n            $,\n            this.options.duration * $,\n            0,\n            1,\n            this.options.duration\n          ) : this.pos = P = $, this.now = (this.end - this.start) * P + this.start, this.options.step && this.options.step.call(this.elem, this.now, this), U && U.set ? U.set(this) : wn.propHooks._default.set(this), this;\n        }\n      }, wn.prototype.init.prototype = wn.prototype, wn.propHooks = {\n        _default: {\n          get: function($) {\n            var P;\n            return $.elem.nodeType !== 1 || $.elem[$.prop] != null && $.elem.style[$.prop] == null ? $.elem[$.prop] : (P = s.css($.elem, $.prop, \"\")) && P !== \"auto\" ? P : 0;\n          },\n          set: function($) {\n            s.fx.step[$.prop] ? s.fx.step[$.prop]($) : $.elem.nodeType !== 1 || !s.cssHooks[$.prop] && $.elem.style[Ao($.prop)] == null ? $.elem[$.prop] = $.now : s.style($.elem, $.prop, $.now + $.unit);\n          }\n        }\n      }, wn.propHooks.scrollTop = wn.propHooks.scrollLeft = {\n        set: function($) {\n          $.elem.nodeType && $.elem.parentNode && ($.elem[$.prop] = $.now);\n        }\n      }, s.easing = {\n        linear: function($) {\n          return $;\n        },\n        swing: function($) {\n          return 0.5 - Math.cos($ * Math.PI) / 2;\n        },\n        _default: \"swing\"\n      }, s.fx = wn.prototype.init, s.fx.step = {};\n      var Sn, Do, Dn = /^(?:toggle|show|hide)$/, Wi = /queueHooks$/;\n      function Eo() {\n        Do && (p.hidden === !1 && A.requestAnimationFrame ? A.requestAnimationFrame(Eo) : A.setTimeout(Eo, s.fx.interval), s.fx.tick());\n      }\n      function hi() {\n        return A.setTimeout(function() {\n          Sn = void 0;\n        }), Sn = Date.now();\n      }\n      function ro($, P) {\n        var U, W = 0, et = { height: $ };\n        for (P = P ? 1 : 0; W < 4; W += 2 - P)\n          et[\"margin\" + (U = Rt[W])] = et[\"padding\" + U] = $;\n        return P && (et.opacity = et.width = $), et;\n      }\n      function Ro($, P, U) {\n        for (var W, et = (sr.tweeners[P] || []).concat(sr.tweeners[\"*\"]), dt = 0, mt = et.length; dt < mt; dt++)\n          if (W = et[dt].call(U, P, $)) return W;\n      }\n      function sr($, P, U) {\n        var W, et, dt = 0, mt = sr.prefilters.length, Mt = s.Deferred().always(function() {\n          delete Ut.elem;\n        }), Ut = function() {\n          if (et) return !1;\n          for (var Ae = Sn || hi(), de = Math.max(0, Zt.startTime + Zt.duration - Ae), me = 1 - (de / Zt.duration || 0), Be = 0, We = Zt.tweens.length; Be < We; Be++)\n            Zt.tweens[Be].run(me);\n          return Mt.notifyWith($, [Zt, me, de]), me < 1 && We ? de : (We || Mt.notifyWith($, [Zt, 1, 0]), Mt.resolveWith($, [Zt]), !1);\n        }, Zt = Mt.promise({\n          elem: $,\n          props: s.extend({}, P),\n          opts: s.extend(\n            !0,\n            { specialEasing: {}, easing: s.easing._default },\n            U\n          ),\n          originalProperties: P,\n          originalOptions: U,\n          startTime: Sn || hi(),\n          duration: U.duration,\n          tweens: [],\n          createTween: function(Ae, de) {\n            var me = s.Tween(\n              $,\n              Zt.opts,\n              Ae,\n              de,\n              Zt.opts.specialEasing[Ae] || Zt.opts.easing\n            );\n            return Zt.tweens.push(me), me;\n          },\n          stop: function(Ae) {\n            var de = 0, me = Ae ? Zt.tweens.length : 0;\n            if (et) return this;\n            for (et = !0; de < me; de++) Zt.tweens[de].run(1);\n            return Ae ? (Mt.notifyWith($, [Zt, 1, 0]), Mt.resolveWith($, [Zt, Ae])) : Mt.rejectWith($, [Zt, Ae]), this;\n          }\n        }), ve = Zt.props;\n        for (!function(Ae, de) {\n          var me, Be, We, tr, bn;\n          for (me in Ae)\n            if (We = de[Be = ce(me)], tr = Ae[me], Array.isArray(tr) && (We = tr[1], tr = Ae[me] = tr[0]), me !== Be && (Ae[Be] = tr, delete Ae[me]), (bn = s.cssHooks[Be]) && \"expand\" in bn)\n              for (me in tr = bn.expand(tr), delete Ae[Be], tr)\n                me in Ae || (Ae[me] = tr[me], de[me] = We);\n            else de[Be] = We;\n        }(ve, Zt.opts.specialEasing); dt < mt; dt++)\n          if (W = sr.prefilters[dt].call(Zt, $, ve, Zt.opts))\n            return i(W.stop) && (s._queueHooks(Zt.elem, Zt.opts.queue).stop = W.stop.bind(W)), W;\n        return s.map(ve, Ro, Zt), i(Zt.opts.start) && Zt.opts.start.call($, Zt), Zt.progress(Zt.opts.progress).done(Zt.opts.done, Zt.opts.complete).fail(Zt.opts.fail).always(Zt.opts.always), s.fx.timer(s.extend(Ut, { elem: $, anim: Zt, queue: Zt.opts.queue })), Zt;\n      }\n      s.Animation = s.extend(sr, {\n        tweeners: {\n          \"*\": [\n            function($, P) {\n              var U = this.createTween($, P);\n              return je(U.elem, $, ft.exec(P), U), U;\n            }\n          ]\n        },\n        tweener: function($, P) {\n          i($) ? (P = $, $ = [\"*\"]) : $ = $.match(ht);\n          for (var U, W = 0, et = $.length; W < et; W++)\n            U = $[W], sr.tweeners[U] = sr.tweeners[U] || [], sr.tweeners[U].unshift(P);\n        },\n        prefilters: [\n          function($, P, U) {\n            var W, et, dt, mt, Mt, Ut, Zt, ve, Ae = \"width\" in P || \"height\" in P, de = this, me = {}, Be = $.style, We = $.nodeType && pe($), tr = ae.get($, \"fxshow\");\n            for (W in U.queue || ((mt = s._queueHooks($, \"fx\")).unqueued == null && (mt.unqueued = 0, Mt = mt.empty.fire, mt.empty.fire = function() {\n              mt.unqueued || Mt();\n            }), mt.unqueued++, de.always(function() {\n              de.always(function() {\n                mt.unqueued--, s.queue($, \"fx\").length || mt.empty.fire();\n              });\n            })), P)\n              if (et = P[W], Dn.test(et)) {\n                if (delete P[W], dt = dt || et === \"toggle\", et === (We ? \"hide\" : \"show\")) {\n                  if (et !== \"show\" || !tr || tr[W] === void 0) continue;\n                  We = !0;\n                }\n                me[W] = tr && tr[W] || s.style($, W);\n              }\n            if ((Ut = !s.isEmptyObject(P)) || !s.isEmptyObject(me))\n              for (W in Ae && $.nodeType === 1 && (U.overflow = [Be.overflow, Be.overflowX, Be.overflowY], (Zt = tr && tr.display) == null && (Zt = ae.get($, \"display\")), (ve = s.css($, \"display\")) === \"none\" && (Zt ? ve = Zt : (ir([$], !0), Zt = $.style.display || Zt, ve = s.css($, \"display\"), ir([$]))), (ve === \"inline\" || ve === \"inline-block\" && Zt != null) && s.css($, \"float\") === \"none\" && (Ut || (de.done(function() {\n                Be.display = Zt;\n              }), Zt == null && (ve = Be.display, Zt = ve === \"none\" ? \"\" : ve)), Be.display = \"inline-block\")), U.overflow && (Be.overflow = \"hidden\", de.always(function() {\n                Be.overflow = U.overflow[0], Be.overflowX = U.overflow[1], Be.overflowY = U.overflow[2];\n              })), Ut = !1, me)\n                Ut || (tr ? \"hidden\" in tr && (We = tr.hidden) : tr = ae.access($, \"fxshow\", { display: Zt }), dt && (tr.hidden = !We), We && ir([$], !0), de.done(function() {\n                  for (W in We || ir([$]), ae.remove($, \"fxshow\"), me)\n                    s.style($, W, me[W]);\n                })), Ut = Ro(We ? tr[W] : 0, W, de), W in tr || (tr[W] = Ut.start, We && (Ut.end = Ut.start, Ut.start = 0));\n          }\n        ],\n        prefilter: function($, P) {\n          P ? sr.prefilters.unshift($) : sr.prefilters.push($);\n        }\n      }), s.speed = function($, P, U) {\n        var W = $ && typeof $ == \"object\" ? s.extend({}, $) : {\n          complete: U || !U && P || i($) && $,\n          duration: $,\n          easing: U && P || P && !i(P) && P\n        };\n        return s.fx.off ? W.duration = 0 : typeof W.duration != \"number\" && (W.duration in s.fx.speeds ? W.duration = s.fx.speeds[W.duration] : W.duration = s.fx.speeds._default), W.queue != null && W.queue !== !0 || (W.queue = \"fx\"), W.old = W.complete, W.complete = function() {\n          i(W.old) && W.old.call(this), W.queue && s.dequeue(this, W.queue);\n        }, W;\n      }, s.fn.extend({\n        fadeTo: function($, P, U, W) {\n          return this.filter(pe).css(\"opacity\", 0).show().end().animate({ opacity: P }, $, U, W);\n        },\n        animate: function($, P, U, W) {\n          var et = s.isEmptyObject($), dt = s.speed(P, U, W), mt = function() {\n            var Mt = sr(this, s.extend({}, $), dt);\n            (et || ae.get(this, \"finish\")) && Mt.stop(!0);\n          };\n          return mt.finish = mt, et || dt.queue === !1 ? this.each(mt) : this.queue(dt.queue, mt);\n        },\n        stop: function($, P, U) {\n          var W = function(et) {\n            var dt = et.stop;\n            delete et.stop, dt(U);\n          };\n          return typeof $ != \"string\" && (U = P, P = $, $ = void 0), P && this.queue($ || \"fx\", []), this.each(function() {\n            var et = !0, dt = $ != null && $ + \"queueHooks\", mt = s.timers, Mt = ae.get(this);\n            if (dt) Mt[dt] && Mt[dt].stop && W(Mt[dt]);\n            else for (dt in Mt) Mt[dt] && Mt[dt].stop && Wi.test(dt) && W(Mt[dt]);\n            for (dt = mt.length; dt--; )\n              mt[dt].elem !== this || $ != null && mt[dt].queue !== $ || (mt[dt].anim.stop(U), et = !1, mt.splice(dt, 1));\n            !et && U || s.dequeue(this, $);\n          });\n        },\n        finish: function($) {\n          return $ !== !1 && ($ = $ || \"fx\"), this.each(function() {\n            var P, U = ae.get(this), W = U[$ + \"queue\"], et = U[$ + \"queueHooks\"], dt = s.timers, mt = W ? W.length : 0;\n            for (U.finish = !0, s.queue(this, $, []), et && et.stop && et.stop.call(this, !0), P = dt.length; P--; )\n              dt[P].elem === this && dt[P].queue === $ && (dt[P].anim.stop(!0), dt.splice(P, 1));\n            for (P = 0; P < mt; P++)\n              W[P] && W[P].finish && W[P].finish.call(this);\n            delete U.finish;\n          });\n        }\n      }), s.each([\"toggle\", \"show\", \"hide\"], function($, P) {\n        var U = s.fn[P];\n        s.fn[P] = function(W, et, dt) {\n          return W == null || typeof W == \"boolean\" ? U.apply(this, arguments) : this.animate(ro(P, !0), W, et, dt);\n        };\n      }), s.each(\n        {\n          slideDown: ro(\"show\"),\n          slideUp: ro(\"hide\"),\n          slideToggle: ro(\"toggle\"),\n          fadeIn: { opacity: \"show\" },\n          fadeOut: { opacity: \"hide\" },\n          fadeToggle: { opacity: \"toggle\" }\n        },\n        function($, P) {\n          s.fn[$] = function(U, W, et) {\n            return this.animate(P, U, W, et);\n          };\n        }\n      ), s.timers = [], s.fx.tick = function() {\n        var $, P = 0, U = s.timers;\n        for (Sn = Date.now(); P < U.length; P++)\n          ($ = U[P])() || U[P] !== $ || U.splice(P--, 1);\n        U.length || s.fx.stop(), Sn = void 0;\n      }, s.fx.timer = function($) {\n        s.timers.push($), s.fx.start();\n      }, s.fx.interval = 13, s.fx.start = function() {\n        Do || (Do = !0, Eo());\n      }, s.fx.stop = function() {\n        Do = null;\n      }, s.fx.speeds = { slow: 600, fast: 200, _default: 400 }, s.fn.delay = function($, P) {\n        return $ = s.fx && s.fx.speeds[$] || $, P = P || \"fx\", this.queue(P, function(U, W) {\n          var et = A.setTimeout(U, $);\n          W.stop = function() {\n            A.clearTimeout(et);\n          };\n        });\n      }, function() {\n        var $ = p.createElement(\"input\"), P = p.createElement(\"select\").appendChild(p.createElement(\"option\"));\n        $.type = \"checkbox\", h.checkOn = $.value !== \"\", h.optSelected = P.selected, ($ = p.createElement(\"input\")).value = \"t\", $.type = \"radio\", h.radioValue = $.value === \"t\";\n      }();\n      var Ci, gi = s.expr.attrHandle;\n      s.fn.extend({\n        attr: function($, P) {\n          return Nt(this, s.attr, $, P, arguments.length > 1);\n        },\n        removeAttr: function($) {\n          return this.each(function() {\n            s.removeAttr(this, $);\n          });\n        }\n      }), s.extend({\n        attr: function($, P, U) {\n          var W, et, dt = $.nodeType;\n          if (dt !== 3 && dt !== 8 && dt !== 2)\n            return $.getAttribute === void 0 ? s.prop($, P, U) : (dt === 1 && s.isXMLDoc($) || (et = s.attrHooks[P.toLowerCase()] || (s.expr.match.bool.test(P) ? Ci : void 0)), U !== void 0 ? U === null ? void s.removeAttr($, P) : et && \"set\" in et && (W = et.set($, U, P)) !== void 0 ? W : ($.setAttribute(P, U + \"\"), U) : et && \"get\" in et && (W = et.get($, P)) !== null ? W : (W = s.find.attr($, P)) == null ? void 0 : W);\n        },\n        attrHooks: {\n          type: {\n            set: function($, P) {\n              if (!h.radioValue && P === \"radio\" && z($, \"input\")) {\n                var U = $.value;\n                return $.setAttribute(\"type\", P), U && ($.value = U), P;\n              }\n            }\n          }\n        },\n        removeAttr: function($, P) {\n          var U, W = 0, et = P && P.match(ht);\n          if (et && $.nodeType === 1)\n            for (; U = et[W++]; ) $.removeAttribute(U);\n        }\n      }), Ci = {\n        set: function($, P, U) {\n          return P === !1 ? s.removeAttr($, U) : $.setAttribute(U, U), U;\n        }\n      }, s.each(s.expr.match.bool.source.match(/\\w+/g), function($, P) {\n        var U = gi[P] || s.find.attr;\n        gi[P] = function(W, et, dt) {\n          var mt, Mt, Ut = et.toLowerCase();\n          return dt || (Mt = gi[Ut], gi[Ut] = mt, mt = U(W, et, dt) != null ? Ut : null, gi[Ut] = Mt), mt;\n        };\n      });\n      var ha = /^(?:input|select|textarea|button)$/i, Io = /^(?:a|area)$/i;\n      function $i($) {\n        return ($.match(ht) || []).join(\" \");\n      }\n      function _i($) {\n        return $.getAttribute && $.getAttribute(\"class\") || \"\";\n      }\n      function Yi($) {\n        return Array.isArray($) ? $ : typeof $ == \"string\" && $.match(ht) || [];\n      }\n      s.fn.extend({\n        prop: function($, P) {\n          return Nt(this, s.prop, $, P, arguments.length > 1);\n        },\n        removeProp: function($) {\n          return this.each(function() {\n            delete this[s.propFix[$] || $];\n          });\n        }\n      }), s.extend({\n        prop: function($, P, U) {\n          var W, et, dt = $.nodeType;\n          if (dt !== 3 && dt !== 8 && dt !== 2)\n            return dt === 1 && s.isXMLDoc($) || (P = s.propFix[P] || P, et = s.propHooks[P]), U !== void 0 ? et && \"set\" in et && (W = et.set($, U, P)) !== void 0 ? W : $[P] = U : et && \"get\" in et && (W = et.get($, P)) !== null ? W : $[P];\n        },\n        propHooks: {\n          tabIndex: {\n            get: function($) {\n              var P = s.find.attr($, \"tabindex\");\n              return P ? parseInt(P, 10) : ha.test($.nodeName) || Io.test($.nodeName) && $.href ? 0 : -1;\n            }\n          }\n        },\n        propFix: { for: \"htmlFor\", class: \"className\" }\n      }), h.optSelected || (s.propHooks.selected = {\n        get: function($) {\n          var P = $.parentNode;\n          return P && P.parentNode && P.parentNode.selectedIndex, null;\n        },\n        set: function($) {\n          var P = $.parentNode;\n          P && (P.selectedIndex, P.parentNode && P.parentNode.selectedIndex);\n        }\n      }), s.each(\n        [\n          \"tabIndex\",\n          \"readOnly\",\n          \"maxLength\",\n          \"cellSpacing\",\n          \"cellPadding\",\n          \"rowSpan\",\n          \"colSpan\",\n          \"useMap\",\n          \"frameBorder\",\n          \"contentEditable\"\n        ],\n        function() {\n          s.propFix[this.toLowerCase()] = this;\n        }\n      ), s.fn.extend({\n        addClass: function($) {\n          var P, U, W, et, dt, mt, Mt, Ut = 0;\n          if (i($))\n            return this.each(function(Zt) {\n              s(this).addClass($.call(this, Zt, _i(this)));\n            });\n          if ((P = Yi($)).length) {\n            for (; U = this[Ut++]; )\n              if (et = _i(U), W = U.nodeType === 1 && \" \" + $i(et) + \" \") {\n                for (mt = 0; dt = P[mt++]; )\n                  W.indexOf(\" \" + dt + \" \") < 0 && (W += dt + \" \");\n                et !== (Mt = $i(W)) && U.setAttribute(\"class\", Mt);\n              }\n          }\n          return this;\n        },\n        removeClass: function($) {\n          var P, U, W, et, dt, mt, Mt, Ut = 0;\n          if (i($))\n            return this.each(function(Zt) {\n              s(this).removeClass($.call(this, Zt, _i(this)));\n            });\n          if (!arguments.length) return this.attr(\"class\", \"\");\n          if ((P = Yi($)).length) {\n            for (; U = this[Ut++]; )\n              if (et = _i(U), W = U.nodeType === 1 && \" \" + $i(et) + \" \") {\n                for (mt = 0; dt = P[mt++]; )\n                  for (; W.indexOf(\" \" + dt + \" \") > -1; )\n                    W = W.replace(\" \" + dt + \" \", \" \");\n                et !== (Mt = $i(W)) && U.setAttribute(\"class\", Mt);\n              }\n          }\n          return this;\n        },\n        toggleClass: function($, P) {\n          var U = typeof $, W = U === \"string\" || Array.isArray($);\n          return typeof P == \"boolean\" && W ? P ? this.addClass($) : this.removeClass($) : i($) ? this.each(function(et) {\n            s(this).toggleClass($.call(this, et, _i(this), P), P);\n          }) : this.each(function() {\n            var et, dt, mt, Mt;\n            if (W)\n              for (dt = 0, mt = s(this), Mt = Yi($); et = Mt[dt++]; )\n                mt.hasClass(et) ? mt.removeClass(et) : mt.addClass(et);\n            else\n              $ !== void 0 && U !== \"boolean\" || ((et = _i(this)) && ae.set(this, \"__className__\", et), this.setAttribute && this.setAttribute(\n                \"class\",\n                et || $ === !1 ? \"\" : ae.get(this, \"__className__\") || \"\"\n              ));\n          });\n        },\n        hasClass: function($) {\n          var P, U, W = 0;\n          for (P = \" \" + $ + \" \"; U = this[W++]; )\n            if (U.nodeType === 1 && (\" \" + $i(_i(U)) + \" \").indexOf(P) > -1)\n              return !0;\n          return !1;\n        }\n      });\n      var ci = /\\r/g;\n      s.fn.extend({\n        val: function($) {\n          var P, U, W, et = this[0];\n          return arguments.length ? (W = i($), this.each(function(dt) {\n            var mt;\n            this.nodeType === 1 && ((mt = W ? $.call(this, dt, s(this).val()) : $) == null ? mt = \"\" : typeof mt == \"number\" ? mt += \"\" : Array.isArray(mt) && (mt = s.map(mt, function(Mt) {\n              return Mt == null ? \"\" : Mt + \"\";\n            })), (P = s.valHooks[this.type] || s.valHooks[this.nodeName.toLowerCase()]) && \"set\" in P && P.set(this, mt, \"value\") !== void 0 || (this.value = mt));\n          })) : et ? (P = s.valHooks[et.type] || s.valHooks[et.nodeName.toLowerCase()]) && \"get\" in P && (U = P.get(et, \"value\")) !== void 0 ? U : typeof (U = et.value) == \"string\" ? U.replace(ci, \"\") : U ?? \"\" : void 0;\n        }\n      }), s.extend({\n        valHooks: {\n          option: {\n            get: function($) {\n              var P = s.find.attr($, \"value\");\n              return P ?? $i(s.text($));\n            }\n          },\n          select: {\n            get: function($) {\n              var P, U, W, et = $.options, dt = $.selectedIndex, mt = $.type === \"select-one\", Mt = mt ? null : [], Ut = mt ? dt + 1 : et.length;\n              for (W = dt < 0 ? Ut : mt ? dt : 0; W < Ut; W++)\n                if (((U = et[W]).selected || W === dt) && !U.disabled && (!U.parentNode.disabled || !z(U.parentNode, \"optgroup\"))) {\n                  if (P = s(U).val(), mt) return P;\n                  Mt.push(P);\n                }\n              return Mt;\n            },\n            set: function($, P) {\n              for (var U, W, et = $.options, dt = s.makeArray(P), mt = et.length; mt--; )\n                ((W = et[mt]).selected = s.inArray(s.valHooks.option.get(W), dt) > -1) && (U = !0);\n              return U || ($.selectedIndex = -1), dt;\n            }\n          }\n        }\n      }), s.each([\"radio\", \"checkbox\"], function() {\n        s.valHooks[this] = {\n          set: function($, P) {\n            if (Array.isArray(P))\n              return $.checked = s.inArray(s($).val(), P) > -1;\n          }\n        }, h.checkOn || (s.valHooks[this].get = function($) {\n          return $.getAttribute(\"value\") === null ? \"on\" : $.value;\n        });\n      }), h.focusin = \"onfocusin\" in A;\n      var Ii = /^(?:focusinfocus|focusoutblur)$/, xi = function($) {\n        $.stopPropagation();\n      };\n      s.extend(s.event, {\n        trigger: function($, P, U, W) {\n          var et, dt, mt, Mt, Ut, Zt, ve, Ae, de = [U || p], me = t.call($, \"type\") ? $.type : $, Be = t.call($, \"namespace\") ? $.namespace.split(\".\") : [];\n          if (dt = Ae = mt = U = U || p, U.nodeType !== 3 && U.nodeType !== 8 && !Ii.test(me + s.event.triggered) && (me.indexOf(\".\") > -1 && (Be = me.split(\".\"), me = Be.shift(), Be.sort()), Ut = me.indexOf(\":\") < 0 && \"on\" + me, ($ = $[s.expando] ? $ : new s.Event(me, typeof $ == \"object\" && $)).isTrigger = W ? 2 : 3, $.namespace = Be.join(\".\"), $.rnamespace = $.namespace ? new RegExp(\"(^|\\\\.)\" + Be.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\") : null, $.result = void 0, $.target || ($.target = U), P = P == null ? [$] : s.makeArray(P, [$]), ve = s.event.special[me] || {}, W || !ve.trigger || ve.trigger.apply(U, P) !== !1)) {\n            if (!W && !ve.noBubble && !d(U)) {\n              for (Mt = ve.delegateType || me, Ii.test(Mt + me) || (dt = dt.parentNode); dt; dt = dt.parentNode)\n                de.push(dt), mt = dt;\n              mt === (U.ownerDocument || p) && de.push(mt.defaultView || mt.parentWindow || A);\n            }\n            for (et = 0; (dt = de[et++]) && !$.isPropagationStopped(); )\n              Ae = dt, $.type = et > 1 ? Mt : ve.bindType || me, (Zt = (ae.get(dt, \"events\") || /* @__PURE__ */ Object.create(null))[$.type] && ae.get(dt, \"handle\")) && Zt.apply(dt, P), (Zt = Ut && dt[Ut]) && Zt.apply && xe(dt) && ($.result = Zt.apply(dt, P), $.result === !1 && $.preventDefault());\n            return $.type = me, W || $.isDefaultPrevented() || ve._default && ve._default.apply(de.pop(), P) !== !1 || !xe(U) || Ut && i(U[me]) && !d(U) && ((mt = U[Ut]) && (U[Ut] = null), s.event.triggered = me, $.isPropagationStopped() && Ae.addEventListener(me, xi), U[me](), $.isPropagationStopped() && Ae.removeEventListener(me, xi), s.event.triggered = void 0, mt && (U[Ut] = mt)), $.result;\n          }\n        },\n        simulate: function($, P, U) {\n          var W = s.extend(new s.Event(), U, { type: $, isSimulated: !0 });\n          s.event.trigger(W, null, P);\n        }\n      }), s.fn.extend({\n        trigger: function($, P) {\n          return this.each(function() {\n            s.event.trigger($, P, this);\n          });\n        },\n        triggerHandler: function($, P) {\n          var U = this[0];\n          if (U) return s.event.trigger($, P, U, !0);\n        }\n      }), h.focusin || s.each({ focus: \"focusin\", blur: \"focusout\" }, function($, P) {\n        var U = function(W) {\n          s.event.simulate(P, W.target, s.event.fix(W));\n        };\n        s.event.special[P] = {\n          setup: function() {\n            var W = this.ownerDocument || this.document || this, et = ae.access(W, P);\n            et || W.addEventListener($, U, !0), ae.access(W, P, (et || 0) + 1);\n          },\n          teardown: function() {\n            var W = this.ownerDocument || this.document || this, et = ae.access(W, P) - 1;\n            et ? ae.access(W, P, et) : (W.removeEventListener($, U, !0), ae.remove(W, P));\n          }\n        };\n      });\n      var Xi = A.location, fn = { guid: Date.now() }, mi = /\\?/;\n      s.parseXML = function($) {\n        var P;\n        if (!$ || typeof $ != \"string\") return null;\n        try {\n          P = new A.DOMParser().parseFromString($, \"text/xml\");\n        } catch {\n          P = void 0;\n        }\n        return P && !P.getElementsByTagName(\"parsererror\").length || s.error(\"Invalid XML: \" + $), P;\n      };\n      var No = /\\[\\]$/, no = /\\r?\\n/g, di = /^(?:submit|button|image|reset|file)$/i, Zi = /^(?:input|select|textarea|keygen)/i;\n      function qn($, P, U, W) {\n        var et;\n        if (Array.isArray(P))\n          s.each(P, function(dt, mt) {\n            U || No.test($) ? W($, mt) : qn(\n              $ + \"[\" + (typeof mt == \"object\" && mt != null ? dt : \"\") + \"]\",\n              mt,\n              U,\n              W\n            );\n          });\n        else if (U || k(P) !== \"object\") W($, P);\n        else for (et in P) qn($ + \"[\" + et + \"]\", P[et], U, W);\n      }\n      s.param = function($, P) {\n        var U, W = [], et = function(dt, mt) {\n          var Mt = i(mt) ? mt() : mt;\n          W[W.length] = encodeURIComponent(dt) + \"=\" + encodeURIComponent(Mt ?? \"\");\n        };\n        if ($ == null) return \"\";\n        if (Array.isArray($) || $.jquery && !s.isPlainObject($))\n          s.each($, function() {\n            et(this.name, this.value);\n          });\n        else for (U in $) qn(U, $[U], P, et);\n        return W.join(\"&\");\n      }, s.fn.extend({\n        serialize: function() {\n          return s.param(this.serializeArray());\n        },\n        serializeArray: function() {\n          return this.map(function() {\n            var $ = s.prop(this, \"elements\");\n            return $ ? s.makeArray($) : this;\n          }).filter(function() {\n            var $ = this.type;\n            return this.name && !s(this).is(\":disabled\") && Zi.test(this.nodeName) && !di.test($) && (this.checked || !zr.test($));\n          }).map(function($, P) {\n            var U = s(this).val();\n            return U == null ? null : Array.isArray(U) ? s.map(U, function(W) {\n              return { name: P.name, value: W.replace(no, `\\r\n`) };\n            }) : { name: P.name, value: U.replace(no, `\\r\n`) };\n          }).get();\n        }\n      });\n      var co = /%20/g, fo = /#.*$/, wi = /([?&])_=[^&]*/, Oi = /^(.*?):[ \\t]*([^\\r\\n]*)$/gm, Uo = /^(?:GET|HEAD)$/, ga = /^\\/\\//, Vo = {}, io = {}, po = \"*/\".concat(\"*\"), Hn = p.createElement(\"a\");\n      function Ni($) {\n        return function(P, U) {\n          typeof P != \"string\" && (U = P, P = \"*\");\n          var W, et = 0, dt = P.toLowerCase().match(ht) || [];\n          if (i(U))\n            for (; W = dt[et++]; )\n              W[0] === \"+\" ? (W = W.slice(1) || \"*\", ($[W] = $[W] || []).unshift(U)) : ($[W] = $[W] || []).push(U);\n        };\n      }\n      function Mn($, P, U, W) {\n        var et = {}, dt = $ === io;\n        function mt(Mt) {\n          var Ut;\n          return et[Mt] = !0, s.each($[Mt] || [], function(Zt, ve) {\n            var Ae = ve(P, U, W);\n            return typeof Ae != \"string\" || dt || et[Ae] ? dt ? !(Ut = Ae) : void 0 : (P.dataTypes.unshift(Ae), mt(Ae), !1);\n          }), Ut;\n        }\n        return mt(P.dataTypes[0]) || !et[\"*\"] && mt(\"*\");\n      }\n      function Mi($, P) {\n        var U, W, et = s.ajaxSettings.flatOptions || {};\n        for (U in P) P[U] !== void 0 && ((et[U] ? $ : W || (W = {}))[U] = P[U]);\n        return W && s.extend(!0, $, W), $;\n      }\n      Hn.href = Xi.href, s.extend({\n        active: 0,\n        lastModified: {},\n        etag: {},\n        ajaxSettings: {\n          url: Xi.href,\n          type: \"GET\",\n          isLocal: /^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(\n            Xi.protocol\n          ),\n          global: !0,\n          processData: !0,\n          async: !0,\n          contentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n          accepts: {\n            \"*\": po,\n            text: \"text/plain\",\n            html: \"text/html\",\n            xml: \"application/xml, text/xml\",\n            json: \"application/json, text/javascript\"\n          },\n          contents: { xml: /\\bxml\\b/, html: /\\bhtml/, json: /\\bjson\\b/ },\n          responseFields: {\n            xml: \"responseXML\",\n            text: \"responseText\",\n            json: \"responseJSON\"\n          },\n          converters: {\n            \"* text\": String,\n            \"text html\": !0,\n            \"text json\": JSON.parse,\n            \"text xml\": s.parseXML\n          },\n          flatOptions: { url: !0, context: !0 }\n        },\n        ajaxSetup: function($, P) {\n          return P ? Mi(Mi($, s.ajaxSettings), P) : Mi(s.ajaxSettings, $);\n        },\n        ajaxPrefilter: Ni(Vo),\n        ajaxTransport: Ni(io),\n        ajax: function($, P) {\n          typeof $ == \"object\" && (P = $, $ = void 0), P = P || {};\n          var U, W, et, dt, mt, Mt, Ut, Zt, ve, Ae, de = s.ajaxSetup({}, P), me = de.context || de, Be = de.context && (me.nodeType || me.jquery) ? s(me) : s.event, We = s.Deferred(), tr = s.Callbacks(\"once memory\"), bn = de.statusCode || {}, Rn = {}, Qi = {}, Br = \"canceled\", Or = {\n            readyState: 0,\n            getResponseHeader: function(pt) {\n              var $t;\n              if (Ut) {\n                if (!dt)\n                  for (dt = {}; $t = Oi.exec(et); )\n                    dt[$t[1].toLowerCase() + \" \"] = (dt[$t[1].toLowerCase() + \" \"] || []).concat($t[2]);\n                $t = dt[pt.toLowerCase() + \" \"];\n              }\n              return $t == null ? null : $t.join(\", \");\n            },\n            getAllResponseHeaders: function() {\n              return Ut ? et : null;\n            },\n            setRequestHeader: function(pt, $t) {\n              return Ut == null && (pt = Qi[pt.toLowerCase()] = Qi[pt.toLowerCase()] || pt, Rn[pt] = $t), this;\n            },\n            overrideMimeType: function(pt) {\n              return Ut == null && (de.mimeType = pt), this;\n            },\n            statusCode: function(pt) {\n              var $t;\n              if (pt)\n                if (Ut) Or.always(pt[Or.status]);\n                else for ($t in pt) bn[$t] = [bn[$t], pt[$t]];\n              return this;\n            },\n            abort: function(pt) {\n              var $t = pt || Br;\n              return U && U.abort($t), rt(0, $t), this;\n            }\n          };\n          if (We.promise(Or), de.url = (($ || de.url || Xi.href) + \"\").replace(\n            ga,\n            Xi.protocol + \"//\"\n          ), de.type = P.method || P.type || de.method || de.type, de.dataTypes = (de.dataType || \"*\").toLowerCase().match(ht) || [\n            \"\"\n          ], de.crossDomain == null) {\n            Mt = p.createElement(\"a\");\n            try {\n              Mt.href = de.url, Mt.href = Mt.href, de.crossDomain = Hn.protocol + \"//\" + Hn.host != Mt.protocol + \"//\" + Mt.host;\n            } catch {\n              de.crossDomain = !0;\n            }\n          }\n          if (de.data && de.processData && typeof de.data != \"string\" && (de.data = s.param(de.data, de.traditional)), Mn(Vo, de, P, Or), Ut)\n            return Or;\n          for (ve in (Zt = s.event && de.global) && s.active++ == 0 && s.event.trigger(\"ajaxStart\"), de.type = de.type.toUpperCase(), de.hasContent = !Uo.test(de.type), W = de.url.replace(fo, \"\"), de.hasContent ? de.data && de.processData && (de.contentType || \"\").indexOf(\n            \"application/x-www-form-urlencoded\"\n          ) === 0 && (de.data = de.data.replace(co, \"+\")) : (Ae = de.url.slice(W.length), de.data && (de.processData || typeof de.data == \"string\") && (W += (mi.test(W) ? \"&\" : \"?\") + de.data, delete de.data), de.cache === !1 && (W = W.replace(wi, \"$1\"), Ae = (mi.test(W) ? \"&\" : \"?\") + \"_=\" + fn.guid++ + Ae), de.url = W + Ae), de.ifModified && (s.lastModified[W] && Or.setRequestHeader(\"If-Modified-Since\", s.lastModified[W]), s.etag[W] && Or.setRequestHeader(\"If-None-Match\", s.etag[W])), (de.data && de.hasContent && de.contentType !== !1 || P.contentType) && Or.setRequestHeader(\"Content-Type\", de.contentType), Or.setRequestHeader(\n            \"Accept\",\n            de.dataTypes[0] && de.accepts[de.dataTypes[0]] ? de.accepts[de.dataTypes[0]] + (de.dataTypes[0] !== \"*\" ? \", \" + po + \"; q=0.01\" : \"\") : de.accepts[\"*\"]\n          ), de.headers)\n            Or.setRequestHeader(ve, de.headers[ve]);\n          if (de.beforeSend && (de.beforeSend.call(me, Or, de) === !1 || Ut))\n            return Or.abort();\n          if (Br = \"abort\", tr.add(de.complete), Or.done(de.success), Or.fail(de.error), U = Mn(io, de, P, Or)) {\n            if (Or.readyState = 1, Zt && Be.trigger(\"ajaxSend\", [Or, de]), Ut)\n              return Or;\n            de.async && de.timeout > 0 && (mt = A.setTimeout(function() {\n              Or.abort(\"timeout\");\n            }, de.timeout));\n            try {\n              Ut = !1, U.send(Rn, rt);\n            } catch (pt) {\n              if (Ut) throw pt;\n              rt(-1, pt);\n            }\n          } else rt(-1, \"No Transport\");\n          function rt(pt, $t, It, ee) {\n            var Ht, he, Ee, nr, fr, Rr = $t;\n            Ut || (Ut = !0, mt && A.clearTimeout(mt), U = void 0, et = ee || \"\", Or.readyState = pt > 0 ? 4 : 0, Ht = pt >= 200 && pt < 300 || pt === 304, It && (nr = function(Fr, ii, Gn) {\n              for (var Wn, yr, Xr, Zn, ao = Fr.contents, ti = Fr.dataTypes; ti[0] === \"*\"; )\n                ti.shift(), Wn === void 0 && (Wn = Fr.mimeType || ii.getResponseHeader(\"Content-Type\"));\n              if (Wn) {\n                for (yr in ao)\n                  if (ao[yr] && ao[yr].test(Wn)) {\n                    ti.unshift(yr);\n                    break;\n                  }\n              }\n              if (ti[0] in Gn) Xr = ti[0];\n              else {\n                for (yr in Gn) {\n                  if (!ti[0] || Fr.converters[yr + \" \" + ti[0]]) {\n                    Xr = yr;\n                    break;\n                  }\n                  Zn || (Zn = yr);\n                }\n                Xr = Xr || Zn;\n              }\n              if (Xr) return Xr !== ti[0] && ti.unshift(Xr), Gn[Xr];\n            }(de, Or, It)), !Ht && s.inArray(\"script\", de.dataTypes) > -1 && (de.converters[\"text script\"] = function() {\n            }), nr = function(Fr, ii, Gn, Wn) {\n              var yr, Xr, Zn, ao, ti, so = {}, ea = Fr.dataTypes.slice();\n              if (ea[1])\n                for (Zn in Fr.converters)\n                  so[Zn.toLowerCase()] = Fr.converters[Zn];\n              for (Xr = ea.shift(); Xr; )\n                if (Fr.responseFields[Xr] && (Gn[Fr.responseFields[Xr]] = ii), !ti && Wn && Fr.dataFilter && (ii = Fr.dataFilter(ii, Fr.dataType)), ti = Xr, Xr = ea.shift()) {\n                  if (Xr === \"*\") Xr = ti;\n                  else if (ti !== \"*\" && ti !== Xr) {\n                    if (!(Zn = so[ti + \" \" + Xr] || so[\"* \" + Xr])) {\n                      for (yr in so)\n                        if ((ao = yr.split(\" \"))[1] === Xr && (Zn = so[ti + \" \" + ao[0]] || so[\"* \" + ao[0]])) {\n                          Zn === !0 ? Zn = so[yr] : so[yr] !== !0 && (Xr = ao[0], ea.unshift(ao[1]));\n                          break;\n                        }\n                    }\n                    if (Zn !== !0)\n                      if (Zn && Fr.throws) ii = Zn(ii);\n                      else\n                        try {\n                          ii = Zn(ii);\n                        } catch (ei) {\n                          return {\n                            state: \"parsererror\",\n                            error: Zn ? ei : \"No conversion from \" + ti + \" to \" + Xr\n                          };\n                        }\n                  }\n                }\n              return { state: \"success\", data: ii };\n            }(de, nr, Or, Ht), Ht ? (de.ifModified && ((fr = Or.getResponseHeader(\"Last-Modified\")) && (s.lastModified[W] = fr), (fr = Or.getResponseHeader(\"etag\")) && (s.etag[W] = fr)), pt === 204 || de.type === \"HEAD\" ? Rr = \"nocontent\" : pt === 304 ? Rr = \"notmodified\" : (Rr = nr.state, he = nr.data, Ht = !(Ee = nr.error))) : (Ee = Rr, !pt && Rr || (Rr = \"error\", pt < 0 && (pt = 0))), Or.status = pt, Or.statusText = ($t || Rr) + \"\", Ht ? We.resolveWith(me, [he, Rr, Or]) : We.rejectWith(me, [Or, Rr, Ee]), Or.statusCode(bn), bn = void 0, Zt && Be.trigger(Ht ? \"ajaxSuccess\" : \"ajaxError\", [Or, de, Ht ? he : Ee]), tr.fireWith(me, [Or, Rr]), Zt && (Be.trigger(\"ajaxComplete\", [Or, de]), --s.active || s.event.trigger(\"ajaxStop\")));\n          }\n          return Or;\n        },\n        getJSON: function($, P, U) {\n          return s.get($, P, U, \"json\");\n        },\n        getScript: function($, P) {\n          return s.get($, void 0, P, \"script\");\n        }\n      }), s.each([\"get\", \"post\"], function($, P) {\n        s[P] = function(U, W, et, dt) {\n          return i(W) && (dt = dt || et, et = W, W = void 0), s.ajax(\n            s.extend(\n              { url: U, type: P, dataType: dt, data: W, success: et },\n              s.isPlainObject(U) && U\n            )\n          );\n        };\n      }), s.ajaxPrefilter(function($) {\n        var P;\n        for (P in $.headers)\n          P.toLowerCase() === \"content-type\" && ($.contentType = $.headers[P] || \"\");\n      }), s._evalUrl = function($, P, U) {\n        return s.ajax({\n          url: $,\n          type: \"GET\",\n          dataType: \"script\",\n          cache: !0,\n          async: !1,\n          global: !1,\n          converters: { \"text script\": function() {\n          } },\n          dataFilter: function(W) {\n            s.globalEval(W, P, U);\n          }\n        });\n      }, s.fn.extend({\n        wrapAll: function($) {\n          var P;\n          return this[0] && (i($) && ($ = $.call(this[0])), P = s($, this[0].ownerDocument).eq(0).clone(!0), this[0].parentNode && P.insertBefore(this[0]), P.map(function() {\n            for (var U = this; U.firstElementChild; )\n              U = U.firstElementChild;\n            return U;\n          }).append(this)), this;\n        },\n        wrapInner: function($) {\n          return i($) ? this.each(function(P) {\n            s(this).wrapInner($.call(this, P));\n          }) : this.each(function() {\n            var P = s(this), U = P.contents();\n            U.length ? U.wrapAll($) : P.append($);\n          });\n        },\n        wrap: function($) {\n          var P = i($);\n          return this.each(function(U) {\n            s(this).wrapAll(P ? $.call(this, U) : $);\n          });\n        },\n        unwrap: function($) {\n          return this.parent($).not(\"body\").each(function() {\n            s(this).replaceWith(this.childNodes);\n          }), this;\n        }\n      }), s.expr.pseudos.hidden = function($) {\n        return !s.expr.pseudos.visible($);\n      }, s.expr.pseudos.visible = function($) {\n        return !!($.offsetWidth || $.offsetHeight || $.getClientRects().length);\n      }, s.ajaxSettings.xhr = function() {\n        try {\n          return new A.XMLHttpRequest();\n        } catch {\n        }\n      };\n      var So = { 0: 200, 1223: 204 }, Li = s.ajaxSettings.xhr();\n      h.cors = !!Li && \"withCredentials\" in Li, h.ajax = Li = !!Li, s.ajaxTransport(function($) {\n        var P, U;\n        if (h.cors || Li && !$.crossDomain)\n          return {\n            send: function(W, et) {\n              var dt, mt = $.xhr();\n              if (mt.open($.type, $.url, $.async, $.username, $.password), $.xhrFields)\n                for (dt in $.xhrFields) mt[dt] = $.xhrFields[dt];\n              for (dt in $.mimeType && mt.overrideMimeType && mt.overrideMimeType($.mimeType), $.crossDomain || W[\"X-Requested-With\"] || (W[\"X-Requested-With\"] = \"XMLHttpRequest\"), W)\n                mt.setRequestHeader(dt, W[dt]);\n              P = function(Mt) {\n                return function() {\n                  P && (P = U = mt.onload = mt.onerror = mt.onabort = mt.ontimeout = mt.onreadystatechange = null, Mt === \"abort\" ? mt.abort() : Mt === \"error\" ? typeof mt.status != \"number\" ? et(0, \"error\") : et(mt.status, mt.statusText) : et(\n                    So[mt.status] || mt.status,\n                    mt.statusText,\n                    (mt.responseType || \"text\") !== \"text\" || typeof mt.responseText != \"string\" ? { binary: mt.response } : { text: mt.responseText },\n                    mt.getAllResponseHeaders()\n                  ));\n                };\n              }, mt.onload = P(), U = mt.onerror = mt.ontimeout = P(\"error\"), mt.onabort !== void 0 ? mt.onabort = U : mt.onreadystatechange = function() {\n                mt.readyState === 4 && A.setTimeout(function() {\n                  P && U();\n                });\n              }, P = P(\"abort\");\n              try {\n                mt.send($.hasContent && $.data || null);\n              } catch (Mt) {\n                if (P) throw Mt;\n              }\n            },\n            abort: function() {\n              P && P();\n            }\n          };\n      }), s.ajaxPrefilter(function($) {\n        $.crossDomain && ($.contents.script = !1);\n      }), s.ajaxSetup({\n        accepts: {\n          script: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n        },\n        contents: { script: /\\b(?:java|ecma)script\\b/ },\n        converters: {\n          \"text script\": function($) {\n            return s.globalEval($), $;\n          }\n        }\n      }), s.ajaxPrefilter(\"script\", function($) {\n        $.cache === void 0 && ($.cache = !1), $.crossDomain && ($.type = \"GET\");\n      }), s.ajaxTransport(\"script\", function($) {\n        var P, U;\n        if ($.crossDomain || $.scriptAttrs)\n          return {\n            send: function(W, et) {\n              P = s(\"<script>\").attr($.scriptAttrs || {}).prop({ charset: $.scriptCharset, src: $.url }).on(\n                \"load error\",\n                U = function(dt) {\n                  P.remove(), U = null, dt && et(dt.type === \"error\" ? 404 : 200, dt.type);\n                }\n              ), p.head.appendChild(P[0]);\n            },\n            abort: function() {\n              U && U();\n            }\n          };\n      });\n      var ki, ji = [], zi = /(=)\\?(?=&|$)|\\?\\?/;\n      s.ajaxSetup({\n        jsonp: \"callback\",\n        jsonpCallback: function() {\n          var $ = ji.pop() || s.expando + \"_\" + fn.guid++;\n          return this[$] = !0, $;\n        }\n      }), s.ajaxPrefilter(\"json jsonp\", function($, P, U) {\n        var W, et, dt, mt = $.jsonp !== !1 && (zi.test($.url) ? \"url\" : typeof $.data == \"string\" && ($.contentType || \"\").indexOf(\n          \"application/x-www-form-urlencoded\"\n        ) === 0 && zi.test($.data) && \"data\");\n        if (mt || $.dataTypes[0] === \"jsonp\")\n          return W = $.jsonpCallback = i($.jsonpCallback) ? $.jsonpCallback() : $.jsonpCallback, mt ? $[mt] = $[mt].replace(zi, \"$1\" + W) : $.jsonp !== !1 && ($.url += (mi.test($.url) ? \"&\" : \"?\") + $.jsonp + \"=\" + W), $.converters[\"script json\"] = function() {\n            return dt || s.error(W + \" was not called\"), dt[0];\n          }, $.dataTypes[0] = \"json\", et = A[W], A[W] = function() {\n            dt = arguments;\n          }, U.always(function() {\n            et === void 0 ? s(A).removeProp(W) : A[W] = et, $[W] && ($.jsonpCallback = P.jsonpCallback, ji.push(W)), dt && i(et) && et(dt[0]), dt = et = void 0;\n          }), \"script\";\n      }), h.createHTMLDocument = ((ki = p.implementation.createHTMLDocument(\"\").body).innerHTML = \"<form></form><form></form>\", ki.childNodes.length === 2), s.parseHTML = function($, P, U) {\n        return typeof $ != \"string\" ? [] : (typeof P == \"boolean\" && (U = P, P = !1), P || (h.createHTMLDocument ? ((W = (P = p.implementation.createHTMLDocument(\"\")).createElement(\n          \"base\"\n        )).href = p.location.href, P.head.appendChild(W)) : P = p), dt = !U && [], (et = V.exec($)) ? [P.createElement(et[1])] : (et = Ei([$], P, dt), dt && dt.length && s(dt).remove(), s.merge([], et.childNodes)));\n        var W, et, dt;\n      }, s.fn.load = function($, P, U) {\n        var W, et, dt, mt = this, Mt = $.indexOf(\" \");\n        return Mt > -1 && (W = $i($.slice(Mt)), $ = $.slice(0, Mt)), i(P) ? (U = P, P = void 0) : P && typeof P == \"object\" && (et = \"POST\"), mt.length > 0 && s.ajax({ url: $, type: et || \"GET\", dataType: \"html\", data: P }).done(function(Ut) {\n          dt = arguments, mt.html(W ? s(\"<div>\").append(s.parseHTML(Ut)).find(W) : Ut);\n        }).always(\n          U && function(Ut, Zt) {\n            mt.each(function() {\n              U.apply(this, dt || [Ut.responseText, Zt, Ut]);\n            });\n          }\n        ), this;\n      }, s.expr.pseudos.animated = function($) {\n        return s.grep(s.timers, function(P) {\n          return $ === P.elem;\n        }).length;\n      }, s.offset = {\n        setOffset: function($, P, U) {\n          var W, et, dt, mt, Mt, Ut, Zt = s.css($, \"position\"), ve = s($), Ae = {};\n          Zt === \"static\" && ($.style.position = \"relative\"), Mt = ve.offset(), dt = s.css($, \"top\"), Ut = s.css($, \"left\"), (Zt === \"absolute\" || Zt === \"fixed\") && (dt + Ut).indexOf(\"auto\") > -1 ? (mt = (W = ve.position()).top, et = W.left) : (mt = parseFloat(dt) || 0, et = parseFloat(Ut) || 0), i(P) && (P = P.call($, U, s.extend({}, Mt))), P.top != null && (Ae.top = P.top - Mt.top + mt), P.left != null && (Ae.left = P.left - Mt.left + et), \"using\" in P ? P.using.call($, Ae) : (typeof Ae.top == \"number\" && (Ae.top += \"px\"), typeof Ae.left == \"number\" && (Ae.left += \"px\"), ve.css(Ae));\n        }\n      }, s.fn.extend({\n        offset: function($) {\n          if (arguments.length)\n            return $ === void 0 ? this : this.each(function(et) {\n              s.offset.setOffset(this, $, et);\n            });\n          var P, U, W = this[0];\n          return W ? W.getClientRects().length ? (P = W.getBoundingClientRect(), U = W.ownerDocument.defaultView, { top: P.top + U.pageYOffset, left: P.left + U.pageXOffset }) : { top: 0, left: 0 } : void 0;\n        },\n        position: function() {\n          if (this[0]) {\n            var $, P, U, W = this[0], et = { top: 0, left: 0 };\n            if (s.css(W, \"position\") === \"fixed\")\n              P = W.getBoundingClientRect();\n            else {\n              for (P = this.offset(), U = W.ownerDocument, $ = W.offsetParent || U.documentElement; $ && ($ === U.body || $ === U.documentElement) && s.css($, \"position\") === \"static\"; )\n                $ = $.parentNode;\n              $ && $ !== W && $.nodeType === 1 && ((et = s($).offset()).top += s.css($, \"borderTopWidth\", !0), et.left += s.css($, \"borderLeftWidth\", !0));\n            }\n            return {\n              top: P.top - et.top - s.css(W, \"marginTop\", !0),\n              left: P.left - et.left - s.css(W, \"marginLeft\", !0)\n            };\n          }\n        },\n        offsetParent: function() {\n          return this.map(function() {\n            for (var $ = this.offsetParent; $ && s.css($, \"position\") === \"static\"; )\n              $ = $.offsetParent;\n            return $ || Wt;\n          });\n        }\n      }), s.each(\n        { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" },\n        function($, P) {\n          var U = P === \"pageYOffset\";\n          s.fn[$] = function(W) {\n            return Nt(\n              this,\n              function(et, dt, mt) {\n                var Mt;\n                if (d(et) ? Mt = et : et.nodeType === 9 && (Mt = et.defaultView), mt === void 0)\n                  return Mt ? Mt[P] : et[dt];\n                Mt ? Mt.scrollTo(U ? Mt.pageXOffset : mt, U ? mt : Mt.pageYOffset) : et[dt] = mt;\n              },\n              $,\n              W,\n              arguments.length\n            );\n          };\n        }\n      ), s.each([\"top\", \"left\"], function($, P) {\n        s.cssHooks[P] = wo(h.pixelPosition, function(U, W) {\n          if (W)\n            return W = To(U, P), _r.test(W) ? s(U).position()[P] + \"px\" : W;\n        });\n      }), s.each({ Height: \"height\", Width: \"width\" }, function($, P) {\n        s.each(\n          { padding: \"inner\" + $, content: P, \"\": \"outer\" + $ },\n          function(U, W) {\n            s.fn[W] = function(et, dt) {\n              var mt = arguments.length && (U || typeof et != \"boolean\"), Mt = U || (et === !0 || dt === !0 ? \"margin\" : \"border\");\n              return Nt(\n                this,\n                function(Ut, Zt, ve) {\n                  var Ae;\n                  return d(Ut) ? W.indexOf(\"outer\") === 0 ? Ut[\"inner\" + $] : Ut.document.documentElement[\"client\" + $] : Ut.nodeType === 9 ? (Ae = Ut.documentElement, Math.max(\n                    Ut.body[\"scroll\" + $],\n                    Ae[\"scroll\" + $],\n                    Ut.body[\"offset\" + $],\n                    Ae[\"offset\" + $],\n                    Ae[\"client\" + $]\n                  )) : ve === void 0 ? s.css(Ut, Zt, Mt) : s.style(Ut, Zt, ve, Mt);\n                },\n                P,\n                mt ? et : void 0,\n                mt\n              );\n            };\n          }\n        );\n      }), s.each(\n        [\n          \"ajaxStart\",\n          \"ajaxStop\",\n          \"ajaxComplete\",\n          \"ajaxError\",\n          \"ajaxSuccess\",\n          \"ajaxSend\"\n        ],\n        function($, P) {\n          s.fn[P] = function(U) {\n            return this.on(P, U);\n          };\n        }\n      ), s.fn.extend({\n        bind: function($, P, U) {\n          return this.on($, null, P, U);\n        },\n        unbind: function($, P) {\n          return this.off($, null, P);\n        },\n        delegate: function($, P, U, W) {\n          return this.on(P, $, U, W);\n        },\n        undelegate: function($, P, U) {\n          return arguments.length === 1 ? this.off($, \"**\") : this.off(P, $ || \"**\", U);\n        },\n        hover: function($, P) {\n          return this.mouseenter($).mouseleave(P || $);\n        }\n      }), s.each(\n        \"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu\".split(\n          \" \"\n        ),\n        function($, P) {\n          s.fn[P] = function(U, W) {\n            return arguments.length > 0 ? this.on(P, null, U, W) : this.trigger(P);\n          };\n        }\n      );\n      var oo = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n      s.proxy = function($, P) {\n        var U, W, et;\n        if (typeof P == \"string\" && (U = $[P], P = $, $ = U), i($))\n          return W = x.call(arguments, 2), (et = function() {\n            return $.apply(P || this, W.concat(x.call(arguments)));\n          }).guid = $.guid = $.guid || s.guid++, et;\n      }, s.holdReady = function($) {\n        $ ? s.readyWait++ : s.ready(!0);\n      }, s.isArray = Array.isArray, s.parseJSON = JSON.parse, s.nodeName = z, s.isFunction = i, s.isWindow = d, s.camelCase = ce, s.type = k, s.now = Date.now, s.isNumeric = function($) {\n        var P = s.type($);\n        return (P === \"number\" || P === \"string\") && !isNaN($ - parseFloat($));\n      }, s.trim = function($) {\n        return $ == null ? \"\" : ($ + \"\").replace(oo, \"\");\n      }, (u = (function() {\n        return s;\n      }).apply(T, [])) === void 0 || (L.exports = u);\n      var Xt = A.jQuery, ke = A.$;\n      return s.noConflict = function($) {\n        return A.$ === s && (A.$ = ke), $ && A.jQuery === s && (A.jQuery = Xt), s;\n      }, w === void 0 && (A.jQuery = A.$ = s), s;\n    });\n  },\n  function(L, T) {\n    L.exports = function(e) {\n      return e != null && typeof e == \"object\";\n    };\n  },\n  function(L, T) {\n    var e;\n    e = /* @__PURE__ */ function() {\n      return this;\n    }();\n    try {\n      e = e || new Function(\"return this\")();\n    } catch {\n      typeof window == \"object\" && (e = window);\n    }\n    L.exports = e;\n  },\n  function(L, T, e) {\n    var u = e(64), A = e(120);\n    L.exports = function(w) {\n      return w != null && A(w.length) && !u(w);\n    };\n  },\n  function(L, T, e) {\n    var u = e(304), A = e(314), w = e(49), E = e(13), y = e(321);\n    L.exports = function(x) {\n      return typeof x == \"function\" ? x : x == null ? w : typeof x == \"object\" ? E(x) ? A(x[0], x[1]) : u(x) : y(x);\n    };\n  },\n  function(L, T, e) {\n    var u = e(69);\n    e.d(T, \"e\", function() {\n      return u.a;\n    });\n    var A = e(15);\n    e.d(T, \"b\", function() {\n      return A.a;\n    }), e.d(T, \"d\", function() {\n      return A.b;\n    });\n    var w = e(25);\n    e.d(T, \"a\", function() {\n      return w.a;\n    }), e.d(T, \"c\", function() {\n      return w.b;\n    });\n  },\n  function(L, T) {\n    L.exports = function(e) {\n      var u = [];\n      return u.toString = function() {\n        return this.map(function(A) {\n          var w = function(E, y) {\n            var x = E[1] || \"\", g = E[3];\n            if (!g) return x;\n            if (y && typeof btoa == \"function\") {\n              var o = (a = g, \"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,\" + btoa(unescape(encodeURIComponent(JSON.stringify(a)))) + \" */\"), c = g.sources.map(function(n) {\n                return \"/*# sourceURL=\" + g.sourceRoot + n + \" */\";\n              });\n              return [x].concat(c).concat([o]).join(`\n`);\n            }\n            var a;\n            return [x].join(`\n`);\n          }(A, e);\n          return A[2] ? \"@media \" + A[2] + \"{\" + w + \"}\" : w;\n        }).join(\"\");\n      }, u.i = function(A, w) {\n        typeof A == \"string\" && (A = [[null, A, \"\"]]);\n        for (var E = {}, y = 0; y < this.length; y++) {\n          var x = this[y][0];\n          typeof x == \"number\" && (E[x] = !0);\n        }\n        for (y = 0; y < A.length; y++) {\n          var g = A[y];\n          typeof g[0] == \"number\" && E[g[0]] || (w && !g[2] ? g[2] = w : w && (g[2] = \"(\" + g[2] + \") and (\" + w + \")\"), u.push(g));\n        }\n      }, u;\n    };\n  },\n  function(L, T, e) {\n    var u, A, w = {}, E = (u = function() {\n      return window && document && document.all && !window.atob;\n    }, function() {\n      return A === void 0 && (A = u.apply(this, arguments)), A;\n    }), y = function(S) {\n      return document.querySelector(S);\n    }, x = /* @__PURE__ */ function(S) {\n      var j = {};\n      return function(I) {\n        if (typeof I == \"function\") return I();\n        if (j[I] === void 0) {\n          var R = y.call(this, I);\n          if (window.HTMLIFrameElement && R instanceof window.HTMLIFrameElement)\n            try {\n              R = R.contentDocument.head;\n            } catch {\n              R = null;\n            }\n          j[I] = R;\n        }\n        return j[I];\n      };\n    }(), g = null, o = 0, c = [], a = e(216);\n    function n(S, j) {\n      for (var I = 0; I < S.length; I++) {\n        var R = S[I], M = w[R.id];\n        if (M) {\n          M.refs++;\n          for (var z = 0; z < M.parts.length; z++) M.parts[z](R.parts[z]);\n          for (; z < R.parts.length; z++) M.parts.push(d(R.parts[z], j));\n        } else {\n          var V = [];\n          for (z = 0; z < R.parts.length; z++) V.push(d(R.parts[z], j));\n          w[R.id] = { id: R.id, refs: 1, parts: V };\n        }\n      }\n    }\n    function t(S, j) {\n      for (var I = [], R = {}, M = 0; M < S.length; M++) {\n        var z = S[M], V = j.base ? z[0] + j.base : z[0], G = { css: z[1], media: z[2], sourceMap: z[3] };\n        R[V] ? R[V].parts.push(G) : I.push(R[V] = { id: V, parts: [G] });\n      }\n      return I;\n    }\n    function r(S, j) {\n      var I = x(S.insertInto);\n      if (!I)\n        throw new Error(\n          \"Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid.\"\n        );\n      var R = c[c.length - 1];\n      if (S.insertAt === \"top\")\n        R ? R.nextSibling ? I.insertBefore(j, R.nextSibling) : I.appendChild(j) : I.insertBefore(j, I.firstChild), c.push(j);\n      else if (S.insertAt === \"bottom\") I.appendChild(j);\n      else {\n        if (typeof S.insertAt != \"object\" || !S.insertAt.before)\n          throw new Error(\n            `[Style Loader]\n\n Invalid value for parameter 'insertAt' ('options.insertAt') found.\n Must be 'top', 'bottom', or Object.\n (https://github.com/webpack-contrib/style-loader#insertat)\n`\n          );\n        var M = x(S.insertInto + \" \" + S.insertAt.before);\n        I.insertBefore(j, M);\n      }\n    }\n    function l(S) {\n      if (S.parentNode === null) return !1;\n      S.parentNode.removeChild(S);\n      var j = c.indexOf(S);\n      j >= 0 && c.splice(j, 1);\n    }\n    function h(S) {\n      var j = document.createElement(\"style\");\n      return S.attrs.type === void 0 && (S.attrs.type = \"text/css\"), i(j, S.attrs), r(S, j), j;\n    }\n    function i(S, j) {\n      Object.keys(j).forEach(function(I) {\n        S.setAttribute(I, j[I]);\n      });\n    }\n    function d(S, j) {\n      var I, R, M, z;\n      if (j.transform && S.css) {\n        if (!(z = j.transform(S.css))) return function() {\n        };\n        S.css = z;\n      }\n      if (j.singleton) {\n        var V = o++;\n        I = g || (g = h(j)), R = v.bind(null, I, V, !1), M = v.bind(null, I, V, !0);\n      } else\n        S.sourceMap && typeof URL == \"function\" && typeof URL.createObjectURL == \"function\" && typeof URL.revokeObjectURL == \"function\" && typeof Blob == \"function\" && typeof btoa == \"function\" ? (I = function(G) {\n          var Y = document.createElement(\"link\");\n          return G.attrs.type === void 0 && (G.attrs.type = \"text/css\"), G.attrs.rel = \"stylesheet\", i(Y, G.attrs), r(G, Y), Y;\n        }(j), R = s.bind(null, I, j), M = function() {\n          l(I), I.href && URL.revokeObjectURL(I.href);\n        }) : (I = h(j), R = k.bind(null, I), M = function() {\n          l(I);\n        });\n      return R(S), function(G) {\n        if (G) {\n          if (G.css === S.css && G.media === S.media && G.sourceMap === S.sourceMap)\n            return;\n          R(S = G);\n        } else M();\n      };\n    }\n    L.exports = function(S, j) {\n      if (typeof DEBUG < \"u\" && DEBUG && typeof document != \"object\")\n        throw new Error(\n          \"The style-loader cannot be used in a non-browser environment\"\n        );\n      (j = j || {}).attrs = typeof j.attrs == \"object\" ? j.attrs : {}, j.singleton || typeof j.singleton == \"boolean\" || (j.singleton = E()), j.insertInto || (j.insertInto = \"head\"), j.insertAt || (j.insertAt = \"bottom\");\n      var I = t(S, j);\n      return n(I, j), function(R) {\n        for (var M = [], z = 0; z < I.length; z++) {\n          var V = I[z];\n          (G = w[V.id]).refs--, M.push(G);\n        }\n        for (R && n(t(R, j), j), z = 0; z < M.length; z++) {\n          var G;\n          if ((G = M[z]).refs === 0) {\n            for (var Y = 0; Y < G.parts.length; Y++) G.parts[Y]();\n            delete w[G.id];\n          }\n        }\n      };\n    };\n    var p, f = (p = [], function(S, j) {\n      return p[S] = j, p.filter(Boolean).join(`\n`);\n    });\n    function v(S, j, I, R) {\n      var M = I ? \"\" : R.css;\n      if (S.styleSheet) S.styleSheet.cssText = f(j, M);\n      else {\n        var z = document.createTextNode(M), V = S.childNodes;\n        V[j] && S.removeChild(V[j]), V.length ? S.insertBefore(z, V[j]) : S.appendChild(z);\n      }\n    }\n    function k(S, j) {\n      var I = j.css, R = j.media;\n      if (R && S.setAttribute(\"media\", R), S.styleSheet)\n        S.styleSheet.cssText = I;\n      else {\n        for (; S.firstChild; ) S.removeChild(S.firstChild);\n        S.appendChild(document.createTextNode(I));\n      }\n    }\n    function s(S, j, I) {\n      var R = I.css, M = I.sourceMap, z = j.convertToAbsoluteUrls === void 0 && M;\n      (j.convertToAbsoluteUrls || z) && (R = a(R)), M && (R += `\n/*# sourceMappingURL=data:application/json;base64,` + btoa(unescape(encodeURIComponent(JSON.stringify(M)))) + \" */\");\n      var V = new Blob([R], { type: \"text/css\" }), G = S.href;\n      S.href = URL.createObjectURL(V), G && URL.revokeObjectURL(G);\n    }\n  },\n  function(L, T, e) {\n    var u = e(153), A = e(122), w = e(36);\n    L.exports = function(E) {\n      return w(E) ? u(E) : A(E);\n    };\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return w;\n    });\n    var u = e(4), A = e(27), w = function() {\n      function E(y, x) {\n        var g = this;\n        this.fireAfterUpdate = x, this._listeners = [], this._listener = function(o) {\n          return g._listeners.forEach(function(c) {\n            return c(o);\n          });\n        }, this.hash = function() {\n          return Object(A.e)(g._get()).hash;\n        }, this.path = function() {\n          return Object(A.e)(g._get()).path;\n        }, this.search = function() {\n          return Object(A.b)(Object(A.e)(g._get()).search);\n        }, this._location = u.Bb.location, this._history = u.Bb.history;\n      }\n      return E.prototype.url = function(y, x) {\n        return x === void 0 && (x = !0), Object(u.T)(y) && y !== this._get() && (this._set(null, null, y, x), this.fireAfterUpdate && this._listeners.forEach(function(g) {\n          return g({ url: y });\n        })), Object(A.a)(this);\n      }, E.prototype.onChange = function(y) {\n        var x = this;\n        return this._listeners.push(y), function() {\n          return Object(u.Ab)(x._listeners, y);\n        };\n      }, E.prototype.dispose = function(y) {\n        Object(u.z)(this._listeners);\n      }, E;\n    }();\n  },\n  function(L, T, e) {\n    e.r(T);\n    var u = e(137);\n    for (var A in u)\n      [\"default\"].indexOf(A) < 0 && function(a) {\n        e.d(T, a, function() {\n          return u[a];\n        });\n      }(A);\n    var w = e(93);\n    e.d(T, \"resolvablesBuilder\", function() {\n      return w.b;\n    }), e.d(T, \"StateBuilder\", function() {\n      return w.a;\n    });\n    var E = e(44);\n    e.d(T, \"StateObject\", function() {\n      return E.a;\n    });\n    var y = e(94);\n    e.d(T, \"StateMatcher\", function() {\n      return y.a;\n    });\n    var x = e(95);\n    e.d(T, \"StateQueueManager\", function() {\n      return x.a;\n    });\n    var g = e(96);\n    e.d(T, \"StateRegistry\", function() {\n      return g.a;\n    });\n    var o = e(97);\n    e.d(T, \"StateService\", function() {\n      return o.a;\n    });\n    var c = e(24);\n    e.d(T, \"TargetState\", function() {\n      return c.a;\n    });\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return y;\n    });\n    var u = e(0), A = e(3), w = e(62), E = e(1), y = function() {\n      function x(g) {\n        return x.create(g || {});\n      }\n      return x.create = function(g) {\n        g = x.isStateClass(g) ? new g() : g;\n        var o = Object(u.A)(Object(u.A)(g, x.prototype));\n        return g.$$state = function() {\n          return o;\n        }, o.self = g, o.__stateObjectCache = { nameGlob: w.a.fromString(o.name) }, o;\n      }, x.prototype.is = function(g) {\n        return this === g || this.self === g || this.fqn() === g;\n      }, x.prototype.fqn = function() {\n        if (!(this.parent && this.parent instanceof this.constructor))\n          return this.name;\n        var g = this.parent.fqn();\n        return g ? g + \".\" + this.name : this.name;\n      }, x.prototype.root = function() {\n        return this.parent && this.parent.root() || this;\n      }, x.prototype.parameters = function(g) {\n        return ((g = Object(u.o)(g, { inherit: !0, matchingKeys: null })).inherit && this.parent && this.parent.parameters() || []).concat(Object(u.U)(this.params)).filter(function(o) {\n          return !g.matchingKeys || g.matchingKeys.hasOwnProperty(o.id);\n        });\n      }, x.prototype.parameter = function(g, o) {\n        return o === void 0 && (o = {}), this.url && this.url.parameter(g, o) || Object(u.t)(Object(u.U)(this.params), Object(A.o)(\"id\", g)) || o.inherit && this.parent && this.parent.parameter(g);\n      }, x.prototype.toString = function() {\n        return this.fqn();\n      }, x.isStateClass = function(g) {\n        return Object(E.d)(g) && g.__uiRouterState === !0;\n      }, x.isStateDeclaration = function(g) {\n        return Object(E.d)(g.$$state);\n      }, x.isState = function(g) {\n        return Object(E.i)(g.__stateObjectCache);\n      }, x;\n    }();\n  },\n  function(L, T, e) {\n    e.d(T, \"c\", function() {\n      return w;\n    }), e.d(T, \"a\", function() {\n      return E;\n    }), e.d(T, \"b\", function() {\n      return y;\n    });\n    var u = e(4), A = e(14);\n    function w(x, g, o) {\n      var c = Object(u.cb)(g) ? [g] : g;\n      return !!(Object(u.U)(c) ? c : function(a) {\n        for (var n = c, t = 0; t < n.length; t++) {\n          var r = new u.b(n[t]);\n          if (r && r.matches(a.name) || !r && n[t] === a.name)\n            return !0;\n        }\n        return !1;\n      })(x, o);\n    }\n    var E = function() {\n      function x(g, o, c, a, n, t) {\n        t === void 0 && (t = {}), this.tranSvc = g, this.eventType = o, this.callback = c, this.matchCriteria = a, this.removeHookFromRegistry = n, this.invokeCount = 0, this._deregistered = !1, this.priority = t.priority || 0, this.bind = t.bind || null, this.invokeLimit = t.invokeLimit;\n      }\n      return x.prototype._matchingNodes = function(g, o, c) {\n        if (o === !0) return g;\n        var a = g.filter(function(n) {\n          return w(n.state, o, c);\n        });\n        return a.length ? a : null;\n      }, x.prototype._getDefaultMatchCriteria = function() {\n        return Object(u.ib)(\n          this.tranSvc._pluginapi._getPathTypes(),\n          function() {\n            return !0;\n          }\n        );\n      }, x.prototype._getMatchingNodes = function(g, o) {\n        var c = this, a = Object(u.C)(\n          this._getDefaultMatchCriteria(),\n          this.matchCriteria\n        );\n        return Object(u.Tb)(this.tranSvc._pluginapi._getPathTypes()).reduce(\n          function(n, t) {\n            var r = t.scope === A.b.STATE, l = g[t.name] || [], h = r ? l : [Object(u.Lb)(l)];\n            return n[t.name] = c._matchingNodes(h, a[t.name], o), n;\n          },\n          {}\n        );\n      }, x.prototype.matches = function(g, o) {\n        var c = this._getMatchingNodes(g, o);\n        return Object(u.Tb)(c).every(u.M) ? c : null;\n      }, x.prototype.deregister = function() {\n        this.removeHookFromRegistry(this), this._deregistered = !0;\n      }, x;\n    }();\n    function y(x, g, o) {\n      var c = (x._registeredHooks = x._registeredHooks || {})[o.name] = [], a = Object(u.Ab)(c);\n      function n(t, r, l) {\n        l === void 0 && (l = {});\n        var h = new E(g, o, r, t, a, l);\n        return c.push(h), h.deregister.bind(h);\n      }\n      return x[o.name] = n, n;\n    }\n  },\n  function(L, T, e) {\n    var u = e(259), A = e(264);\n    L.exports = function(w, E) {\n      var y = A(w, E);\n      return u(y) ? y : void 0;\n    };\n  },\n  function(L, T, e) {\n    var u = e(58), A = e(260), w = e(261), E = u ? u.toStringTag : void 0;\n    L.exports = function(y) {\n      return y == null ? y === void 0 ? \"[object Undefined]\" : \"[object Null]\" : E && E in Object(y) ? A(y) : w(y);\n    };\n  },\n  function(L, T, e) {\n    var u = e(153), A = e(284), w = e(36);\n    L.exports = function(E) {\n      return w(E) ? u(E, !0) : A(E);\n    };\n  },\n  function(L, T) {\n    L.exports = function(e) {\n      return e;\n    };\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return A;\n    });\n    var u = e(0), A = function() {\n      function w(E, y) {\n        E === void 0 && (E = []), y === void 0 && (y = null), this._items = E, this._limit = y, this._evictListeners = [], this.onEvict = Object(u.K)(this._evictListeners);\n      }\n      return w.prototype.enqueue = function(E) {\n        var y = this._items;\n        return y.push(E), this._limit && y.length > this._limit && this.evict(), E;\n      }, w.prototype.evict = function() {\n        var E = this._items.shift();\n        return this._evictListeners.forEach(function(y) {\n          return y(E);\n        }), E;\n      }, w.prototype.dequeue = function() {\n        if (this.size()) return this._items.splice(0, 1)[0];\n      }, w.prototype.clear = function() {\n        var E = this._items;\n        return this._items = [], E;\n      }, w.prototype.size = function() {\n        return this._items.length;\n      }, w.prototype.remove = function(E) {\n        var y = this._items.indexOf(E);\n        return y > -1 && this._items.splice(y, 1)[0];\n      }, w.prototype.peekTail = function() {\n        return this._items[this._items.length - 1];\n      }, w.prototype.peekHead = function() {\n        if (this.size()) return this._items[0];\n      }, w;\n    }();\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return w;\n    });\n    var u = e(0), A = e(1), w = function() {\n      function y(x) {\n        this.pattern = /.*/, this.inherit = !0, Object(u.r)(this, x);\n      }\n      return y.prototype.is = function(x, g) {\n        return !0;\n      }, y.prototype.encode = function(x, g) {\n        return x;\n      }, y.prototype.decode = function(x, g) {\n        return x;\n      }, y.prototype.equals = function(x, g) {\n        return x == g;\n      }, y.prototype.$subPattern = function() {\n        var x = this.pattern.toString();\n        return x.substr(1, x.length - 2);\n      }, y.prototype.toString = function() {\n        return \"{ParamType:\" + this.name + \"}\";\n      }, y.prototype.$normalize = function(x) {\n        return this.is(x) ? x : this.decode(x);\n      }, y.prototype.$asArray = function(x, g) {\n        if (!x) return this;\n        if (x === \"auto\" && !g)\n          throw new Error(\"'auto' array mode is for query parameters only\");\n        return new E(this, x);\n      }, y;\n    }();\n    function E(y, x) {\n      var g = this;\n      function o(n) {\n        return Object(A.a)(n) ? n : Object(A.c)(n) ? [n] : [];\n      }\n      function c(n, t) {\n        return function(r) {\n          if (Object(A.a)(r) && r.length === 0) return r;\n          var l = o(r), h = Object(u.B)(l, n);\n          return t === !0 ? Object(u.s)(h, function(i) {\n            return !i;\n          }).length === 0 : function(i) {\n            switch (i.length) {\n              case 0:\n                return;\n              case 1:\n                return x === \"auto\" ? i[0] : i;\n              default:\n                return i;\n            }\n          }(h);\n        };\n      }\n      function a(n) {\n        return function(t, r) {\n          var l = o(t), h = o(r);\n          if (l.length !== h.length) return !1;\n          for (var i = 0; i < l.length; i++) if (!n(l[i], h[i])) return !1;\n          return !0;\n        };\n      }\n      [\"encode\", \"decode\", \"equals\", \"$normalize\"].forEach(function(n) {\n        var t = y[n].bind(y), r = n === \"equals\" ? a : c;\n        g[n] = r(t);\n      }), Object(u.r)(this, {\n        dynamic: y.dynamic,\n        name: y.name,\n        pattern: y.pattern,\n        inherit: y.inherit,\n        raw: y.raw,\n        is: c(y.is.bind(y), !0),\n        $arrayMode: x\n      });\n    }\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return E;\n    });\n    var u = e(0), A = e(3), w = e(16), E = function() {\n      function y(x) {\n        if (x instanceof y) {\n          var g = x;\n          this.state = g.state, this.paramSchema = g.paramSchema.slice(), this.paramValues = Object(u.r)({}, g.paramValues), this.resolvables = g.resolvables.slice(), this.views = g.views && g.views.slice();\n        } else {\n          var o = x;\n          this.state = o, this.paramSchema = o.parameters({ inherit: !1 }), this.paramValues = {}, this.resolvables = o.resolvables.map(function(c) {\n            return c.clone();\n          });\n        }\n      }\n      return y.prototype.clone = function() {\n        return new y(this);\n      }, y.prototype.applyRawParams = function(x) {\n        return this.paramValues = this.paramSchema.reduce(function(g, o) {\n          return Object(u.h)(g, [(c = o).id, c.value(x[c.id])]);\n          var c;\n        }, {}), this;\n      }, y.prototype.parameter = function(x) {\n        return Object(u.t)(this.paramSchema, Object(A.o)(\"id\", x));\n      }, y.prototype.equals = function(x, g) {\n        var o = this.diff(x, g);\n        return o && o.length === 0;\n      }, y.prototype.diff = function(x, g) {\n        if (this.state !== x.state) return !1;\n        var o = g ? g(this) : this.paramSchema;\n        return w.b.changed(o, this.paramValues, x.paramValues);\n      }, y.clone = function(x) {\n        return x.clone();\n      }, y;\n    }();\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return p;\n    });\n    var u = e(10), A = e(6), w = e(7), E = e(0), y = e(1), x = e(3), g = e(14), o = e(17), c = e(45), a = e(98), n = e(18), t = e(16), r = e(15), l = e(25), h = e(8), i = e(4), d = Object(x.n)(\"self\"), p = function() {\n      function f(v, k, s) {\n        var S = this;\n        if (this._deferred = A.b.$q.defer(), this.promise = this._deferred.promise, this._registeredHooks = {}, this._hookBuilder = new a.a(this), this.isActive = function() {\n          return S.router.globals.transition === S;\n        }, this.router = s, this._targetState = k, !k.valid())\n          throw new Error(k.error());\n        this._options = Object(E.r)(\n          { current: Object(x.p)(this) },\n          k.options()\n        ), this.$id = s.transitionService._transitionCount++;\n        var j = n.a.buildToPath(v, k);\n        this._treeChanges = n.a.treeChanges(\n          v,\n          j,\n          this._options.reloadState\n        ), this.createTransitionHookRegFns();\n        var I = this._hookBuilder.buildHooksForPhase(g.a.CREATE);\n        o.a.invokeHooks(I, function() {\n          return null;\n        }), this.applyViewConfigs(s);\n      }\n      return f.prototype.onBefore = function(v, k, s) {\n      }, f.prototype.onStart = function(v, k, s) {\n      }, f.prototype.onExit = function(v, k, s) {\n      }, f.prototype.onRetain = function(v, k, s) {\n      }, f.prototype.onEnter = function(v, k, s) {\n      }, f.prototype.onFinish = function(v, k, s) {\n      }, f.prototype.onSuccess = function(v, k, s) {\n      }, f.prototype.onError = function(v, k, s) {\n      }, f.prototype.createTransitionHookRegFns = function() {\n        var v = this;\n        this.router.transitionService._pluginapi._getEvents().filter(function(k) {\n          return k.hookPhase !== g.a.CREATE;\n        }).forEach(function(k) {\n          return Object(c.b)(v, v.router.transitionService, k);\n        });\n      }, f.prototype.getHooks = function(v) {\n        return this._registeredHooks[v];\n      }, f.prototype.applyViewConfigs = function(v) {\n        var k = this._treeChanges.entering.map(function(s) {\n          return s.state;\n        });\n        n.a.applyViewConfigs(\n          v.transitionService.$view,\n          this._treeChanges.to,\n          k\n        );\n      }, f.prototype.$from = function() {\n        return Object(E.P)(this._treeChanges.from).state;\n      }, f.prototype.$to = function() {\n        return Object(E.P)(this._treeChanges.to).state;\n      }, f.prototype.from = function() {\n        return this.$from().self;\n      }, f.prototype.to = function() {\n        return this.$to().self;\n      }, f.prototype.targetState = function() {\n        return this._targetState;\n      }, f.prototype.is = function(v) {\n        return v instanceof f ? this.is({ to: v.$to().name, from: v.$from().name }) : !(v.to && !Object(c.c)(this.$to(), v.to, this) || v.from && !Object(c.c)(this.$from(), v.from, this));\n      }, f.prototype.params = function(v) {\n        return v === void 0 && (v = \"to\"), Object.freeze(\n          this._treeChanges[v].map(Object(x.n)(\"paramValues\")).reduce(E.D, {})\n        );\n      }, f.prototype.paramsChanged = function() {\n        var v = this.params(\"from\"), k = this.params(\"to\"), s = [].concat(this._treeChanges.to).concat(this._treeChanges.from).map(function(S) {\n          return S.paramSchema;\n        }).reduce(i.G, []).reduce(i.Pb, []);\n        return t.b.changed(s, v, k).reduce(function(S, j) {\n          return S[j.id] = k[j.id], S;\n        }, {});\n      }, f.prototype.injector = function(v, k) {\n        k === void 0 && (k = \"to\");\n        var s = this._treeChanges[k];\n        return v && (s = n.a.subPath(s, function(S) {\n          return S.state === v || S.state.name === v;\n        })), new l.b(s).injector();\n      }, f.prototype.getResolveTokens = function(v) {\n        return v === void 0 && (v = \"to\"), new l.b(this._treeChanges[v]).getTokens();\n      }, f.prototype.addResolvable = function(v, k) {\n        k === void 0 && (k = \"\"), v = Object(x.h)(r.a)(v) ? v : new r.a(v);\n        var s = typeof k == \"string\" ? k : k.name, S = this._treeChanges.to, j = Object(E.t)(S, function(I) {\n          return I.state.name === s;\n        });\n        new l.b(S).addResolvables([v], j.state);\n      }, f.prototype.redirectedFrom = function() {\n        return this._options.redirectedFrom || null;\n      }, f.prototype.originalTransition = function() {\n        var v = this.redirectedFrom();\n        return v && v.originalTransition() || this;\n      }, f.prototype.options = function() {\n        return this._options;\n      }, f.prototype.entering = function() {\n        return Object(E.B)(\n          this._treeChanges.entering,\n          Object(x.n)(\"state\")\n        ).map(d);\n      }, f.prototype.exiting = function() {\n        return Object(E.B)(this._treeChanges.exiting, Object(x.n)(\"state\")).map(d).reverse();\n      }, f.prototype.retained = function() {\n        return Object(E.B)(\n          this._treeChanges.retained,\n          Object(x.n)(\"state\")\n        ).map(d);\n      }, f.prototype.views = function(v, k) {\n        v === void 0 && (v = \"entering\");\n        var s = this._treeChanges[v];\n        return (s = k ? s.filter(Object(x.o)(\"state\", k)) : s).map(Object(x.n)(\"views\")).filter(E.y).reduce(E.T, []);\n      }, f.prototype.treeChanges = function(v) {\n        return v ? this._treeChanges[v] : this._treeChanges;\n      }, f.prototype.redirect = function(v) {\n        for (var k = 1, s = this; (s = s.redirectedFrom()) != null; )\n          if (++k > 20)\n            throw new Error(\n              \"Too many consecutive Transition redirects (20+)\"\n            );\n        var S = { redirectedFrom: this, source: \"redirect\" };\n        this.options().source === \"url\" && v.options().location !== !1 && (S.location = \"replace\");\n        var j = Object(E.r)({}, this.options(), v.options(), S);\n        v = v.withOptions(j, !0);\n        var I, R = this.router.transitionService.create(\n          this._treeChanges.from,\n          v\n        ), M = this._treeChanges.entering, z = R._treeChanges.entering;\n        return n.a.matching(z, M, n.a.nonDynamicParams).filter(\n          Object(x.i)(\n            (I = v.options().reloadState, function(V) {\n              return I && V.state.includes[I.name];\n            })\n          )\n        ).forEach(function(V, G) {\n          V.resolvables = M[G].resolvables;\n        }), R;\n      }, f.prototype._changedParams = function() {\n        var v = this._treeChanges;\n        if (!this._options.reload && !v.exiting.length && !v.entering.length && v.to.length === v.from.length && !Object(E.i)(v.to, v.from).map(function(I) {\n          return I[0].state !== I[1].state;\n        }).reduce(E.g, !1)) {\n          var k = v.to.map(function(I) {\n            return I.paramSchema;\n          }), s = [v.to, v.from].map(function(I) {\n            return I.map(function(R) {\n              return R.paramValues;\n            });\n          }), S = s[0], j = s[1];\n          return Object(E.i)(k, S, j).map(function(I) {\n            var R = I[0], M = I[1], z = I[2];\n            return t.b.changed(R, M, z);\n          }).reduce(E.T, []);\n        }\n      }, f.prototype.dynamic = function() {\n        var v = this._changedParams();\n        return !!v && v.map(function(k) {\n          return k.dynamic;\n        }).reduce(E.g, !1);\n      }, f.prototype.ignored = function() {\n        return !!this._ignoredReason();\n      }, f.prototype._ignoredReason = function() {\n        var v = this.router.globals.transition, k = this._options.reloadState, s = function(I, R) {\n          if (I.length !== R.length) return !1;\n          var M = n.a.matching(I, R);\n          return I.length === M.filter(function(z) {\n            return !k || !z.state.includes[k.name];\n          }).length;\n        }, S = this.treeChanges(), j = v && v.treeChanges();\n        return j && s(j.to, S.to) && s(j.exiting, S.exiting) ? \"SameAsPending\" : S.exiting.length === 0 && S.entering.length === 0 && s(S.from, S.to) ? \"SameAsCurrent\" : void 0;\n      }, f.prototype.run = function() {\n        var v = this, k = o.a.runAllHooks, s = function(j) {\n          return v._hookBuilder.buildHooksForPhase(j);\n        }, S = s(g.a.BEFORE);\n        return o.a.invokeHooks(S, function() {\n          var j = v.router.globals;\n          return j.lastStartedTransitionId = v.$id, j.transition = v, j.transitionHistory.enqueue(v), u.c.traceTransitionStart(v), A.b.$q.when(void 0);\n        }).then(function() {\n          var j = s(g.a.RUN);\n          return o.a.invokeHooks(j, function() {\n            return A.b.$q.when(void 0);\n          });\n        }).then(\n          function() {\n            u.c.traceSuccess(v.$to(), v), v.success = !0, v._deferred.resolve(v.to()), k(s(g.a.SUCCESS));\n          },\n          function(j) {\n            u.c.traceError(j, v), v.success = !1, v._deferred.reject(j), v._error = j, k(s(g.a.ERROR));\n          }\n        ), this.promise;\n      }, f.prototype.valid = function() {\n        return !this.error() || this.success !== void 0;\n      }, f.prototype.abort = function() {\n        Object(y.m)(this.success) && (this._aborted = !0);\n      }, f.prototype.error = function() {\n        var v = this.$to();\n        if (v.self.abstract)\n          return h.b.invalid(\n            \"Cannot transition to abstract state '\" + v.name + \"'\"\n          );\n        var k = v.parameters(), s = this.params(), S = k.filter(function(R) {\n          return !R.validates(s[R.id]);\n        });\n        if (S.length) {\n          var j = S.map(function(R) {\n            return \"[\" + R.id + \":\" + Object(w.m)(s[R.id]) + \"]\";\n          }).join(\", \"), I = \"The following parameter values are not valid for state '\" + v.name + \"': \" + j;\n          return h.b.invalid(I);\n        }\n        return this.success === !1 ? this._error : void 0;\n      }, f.prototype.toString = function() {\n        var v = this.from(), k = this.to(), s = function(S) {\n          return S[\"#\"] !== null && S[\"#\"] !== void 0 ? S : Object(E.F)(S, [\"#\"]);\n        };\n        return \"Transition#\" + this.$id + \"( '\" + (Object(y.i)(v) ? v.name : v) + \"'\" + Object(w.m)(\n          s(\n            this._treeChanges.from.map(Object(x.n)(\"paramValues\")).reduce(E.D, {})\n          )\n        ) + \" -> \" + (this.valid() ? \"\" : \"(X) \") + \"'\" + (Object(y.i)(k) ? k.name : k) + \"'\" + Object(w.m)(s(this.params())) + \" )\";\n      }, f.diToken = f, f;\n    }();\n  },\n  function(L, T, e) {\n    e.d(T, \"b\", function() {\n      return x;\n    }), e.d(T, \"a\", function() {\n      return g;\n    });\n    var u = e(32), A = e(1), w = e(0), E = e(3), y = e(44), x = function() {\n      function o(c) {\n        this.router = c;\n      }\n      return o.prototype.compile = function(c) {\n        return this.router.urlMatcherFactory.compile(c);\n      }, o.prototype.create = function(c, a) {\n        var n = this, t = y.a.isState, r = y.a.isStateDeclaration, l = Object(E.l)([\n          [\n            A.l,\n            function(i) {\n              return l(n.compile(i));\n            }\n          ],\n          [\n            Object(E.h)(u.a),\n            function(i) {\n              return n.fromUrlMatcher(i, a);\n            }\n          ],\n          [\n            Object(E.j)(t, r),\n            function(i) {\n              return n.fromState(i, n.router);\n            }\n          ],\n          [\n            Object(E.h)(RegExp),\n            function(i) {\n              return n.fromRegExp(i, a);\n            }\n          ],\n          [\n            A.d,\n            function(i) {\n              return new g(i, a);\n            }\n          ]\n        ]), h = l(c);\n        if (!h) throw new Error(\"invalid 'what' in when()\");\n        return h;\n      }, o.prototype.fromUrlMatcher = function(c, a) {\n        var n = a;\n        Object(A.l)(a) && (a = this.router.urlMatcherFactory.compile(a)), Object(E.h)(u.a)(a) && (n = function(r) {\n          return a.format(r);\n        });\n        var t = {\n          urlMatcher: c,\n          matchPriority: function(r) {\n            var l = c.parameters().filter(function(h) {\n              return h.isOptional;\n            });\n            return l.length ? l.filter(function(h) {\n              return r[h.id];\n            }).length / l.length : 1e-6;\n          },\n          type: \"URLMATCHER\"\n        };\n        return Object(w.r)(\n          new g(function(r) {\n            var l = c.exec(r.path, r.search, r.hash);\n            return c.validates(l) && l;\n          }, n),\n          t\n        );\n      }, o.prototype.fromState = function(c, a) {\n        var n = y.a.isStateDeclaration(c) ? c.$$state() : c, t = { state: n, type: \"STATE\" };\n        return Object(w.r)(\n          this.fromUrlMatcher(n.url, function(r) {\n            var l = a.stateService, h = a.globals;\n            l.href(n, r) !== l.href(h.current, h.params) && l.transitionTo(n, r, { inherit: !0, source: \"url\" });\n          }),\n          t\n        );\n      }, o.prototype.fromRegExp = function(c, a) {\n        if (c.global || c.sticky)\n          throw new Error(\"Rule RegExp must not be global or sticky\");\n        var n = Object(A.l)(a) ? function(r) {\n          return a.replace(/\\$(\\$|\\d{1,2})/, function(l, h) {\n            return r[h === \"$\" ? 0 : Number(h)];\n          });\n        } : a, t = { regexp: c, type: \"REGEXP\" };\n        return Object(w.r)(\n          new g(function(r) {\n            return c.exec(r.path);\n          }, n),\n          t\n        );\n      }, o.isUrlRule = function(c) {\n        return c && [\"type\", \"match\", \"handler\"].every(function(a) {\n          return Object(A.c)(c[a]);\n        });\n      }, o;\n    }(), g = function(o, c) {\n      var a = this;\n      this.match = o, this.type = \"RAW\", this.matchPriority = function(n) {\n        return 0 - a.$id;\n      }, this.handler = c || w.y;\n    };\n  },\n  function(L, T, e) {\n    e.d(T, \"b\", function() {\n      return A;\n    }), e.d(T, \"c\", function() {\n      return E;\n    }), e.d(T, \"a\", function() {\n      return x;\n    });\n    var u = e(2);\n    function A() {\n      var g = null;\n      return function(o, c) {\n        return g = g || u.services.$injector.get(\"$templateFactory\"), [new x(o, c, g)];\n      };\n    }\n    var w = function(g, o) {\n      return g.reduce(function(c, a) {\n        return c || Object(u.isDefined)(o[a]);\n      }, !1);\n    };\n    function E(g) {\n      if (!g.parent) return {};\n      var o = [\"component\", \"bindings\", \"componentProvider\"], c = [\n        \"templateProvider\",\n        \"templateUrl\",\n        \"template\",\n        \"notify\",\n        \"async\"\n      ].concat([\n        \"controller\",\n        \"controllerProvider\",\n        \"controllerAs\",\n        \"resolveAs\"\n      ]), a = o.concat(c);\n      if (Object(u.isDefined)(g.views) && w(a, g))\n        throw new Error(\n          \"State '\" + g.name + `' has a 'views' object. It cannot also have \"view properties\" at the state level.  Move the following properties into a view (in the 'views' object):  ` + a.filter(function(r) {\n            return Object(u.isDefined)(g[r]);\n          }).join(\", \")\n        );\n      var n = {}, t = g.views || { $default: Object(u.pick)(g, a) };\n      return Object(u.forEach)(t, function(r, l) {\n        if (l = l || \"$default\", Object(u.isString)(r) && (r = { component: r }), r = Object(u.extend)({}, r), w(o, r) && w(c, r))\n          throw new Error(\n            \"Cannot combine: \" + o.join(\"|\") + \" with: \" + c.join(\"|\") + \" in stateview: '\" + l + \"@\" + g.name + \"'\"\n          );\n        r.resolveAs = r.resolveAs || \"$resolve\", r.$type = \"ng1\", r.$context = g, r.$name = l;\n        var h = u.ViewService.normalizeUIViewTarget(r.$context, r.$name);\n        r.$uiViewName = h.uiViewName, r.$uiViewContextAnchor = h.uiViewContextAnchor, n[l] = r;\n      }), n;\n    }\n    var y = 0, x = function() {\n      function g(o, c, a) {\n        var n = this;\n        this.path = o, this.viewDecl = c, this.factory = a, this.$id = y++, this.loaded = !1, this.getTemplate = function(t, r) {\n          return n.component ? n.factory.makeComponentTemplate(\n            t,\n            r,\n            n.component,\n            n.viewDecl.bindings\n          ) : n.template;\n        };\n      }\n      return g.prototype.load = function() {\n        var o = this, c = u.services.$q, a = new u.ResolveContext(this.path), n = this.path.reduce(function(r, l) {\n          return Object(u.extend)(r, l.paramValues);\n        }, {}), t = {\n          template: c.when(this.factory.fromConfig(this.viewDecl, n, a)),\n          controller: c.when(this.getController(a))\n        };\n        return c.all(t).then(function(r) {\n          return u.trace.traceViewServiceEvent(\"Loaded\", o), o.controller = r.controller, Object(u.extend)(o, r.template), o;\n        });\n      }, g.prototype.getController = function(o) {\n        var c = this.viewDecl.controllerProvider;\n        if (!Object(u.isInjectable)(c)) return this.viewDecl.controller;\n        var a = u.services.$injector.annotate(c), n = Object(u.isArray)(c) ? Object(u.tail)(c) : c;\n        return new u.Resolvable(\"\", n, a).get(o);\n      }, g;\n    }();\n  },\n  function(L, T, e) {\n    e.d(T, \"b\", function() {\n      return ht;\n    }), e.d(T, \"a\", function() {\n      return ct;\n    });\n    var u = e(14), A = e(53), w = e(45), E = e(99), y = e(38), x = e(4);\n    function g(ot) {\n      ot.addResolvable(y.b.fromData(E.a, ot.router), \"\"), ot.addResolvable(y.b.fromData(A.a, ot), \"\"), ot.addResolvable(y.b.fromData(\"$transition$\", ot), \"\"), ot.addResolvable(y.b.fromData(\"$stateParams\", ot.params()), \"\"), ot.entering().forEach(function(gt) {\n        ot.addResolvable(y.b.fromData(\"$state$\", gt), gt);\n      });\n    }\n    var o = [\"$transition$\", A.a], c = Object(x.N)(o), a = function(ot) {\n      var gt = Object(x.Tb)(ot.treeChanges()).reduce(x.Rb, []).reduce(x.Pb, []), xt = function(St) {\n        return c(St.token) ? y.b.fromData(St.token, null) : St;\n      };\n      gt.forEach(function(St) {\n        St.resolvables = St.resolvables.map(xt);\n      });\n    }, n = e(1), t = e(6), r = e(24), l = function(ot) {\n      var gt = ot.to().redirectTo;\n      if (gt) {\n        var xt = ot.router.stateService;\n        return Object(n.d)(gt) ? t.b.$q.when(gt(ot)).then(St) : St(gt);\n      }\n      function St(zt) {\n        if (zt)\n          return zt instanceof r.a ? zt : Object(n.l)(zt) ? xt.target(zt, ot.params(), ot.options()) : zt.state || zt.params ? xt.target(zt.state || ot.to(), zt.params || ot.params(), ot.options()) : void 0;\n      }\n    };\n    function h(ot) {\n      return function(gt, xt) {\n        return (0, xt.$$state()[ot])(gt, xt);\n      };\n    }\n    var i = h(\"onExit\"), d = h(\"onRetain\"), p = h(\"onEnter\"), f = e(0), v = e(25), k = e(3), s = function(ot) {\n      return new v.b(ot.treeChanges().to).resolvePath(\"EAGER\", ot).then(f.E);\n    }, S = function(ot, gt) {\n      return new v.b(ot.treeChanges().to).subContext(gt.$$state()).resolvePath(\"LAZY\", ot).then(f.E);\n    }, j = function(ot) {\n      return new v.b(ot.treeChanges().to).resolvePath(\"LAZY\", ot).then(f.E);\n    }, I = function(ot) {\n      var gt = t.b.$q, xt = ot.views(\"entering\");\n      if (xt.length)\n        return gt.all(\n          xt.map(function(St) {\n            return gt.when(St.load());\n          })\n        ).then(f.E);\n    }, R = function(ot) {\n      var gt = ot.views(\"entering\"), xt = ot.views(\"exiting\");\n      if (gt.length || xt.length) {\n        var St = ot.router.viewService;\n        xt.forEach(function(zt) {\n          return St.deactivateViewConfig(zt);\n        }), gt.forEach(function(zt) {\n          return St.activateViewConfig(zt);\n        }), St.sync();\n      }\n    }, M = function(ot) {\n      var gt = ot.router.globals, xt = function() {\n        gt.transition === ot && (gt.transition = null);\n      };\n      ot.onSuccess(\n        {},\n        function() {\n          gt.successfulTransitions.enqueue(ot), gt.$current = ot.$to(), gt.current = gt.$current.self, Object(f.m)(ot.params(), gt.params);\n        },\n        { priority: 1e4 }\n      ), ot.promise.then(xt, xt);\n    }, z = function(ot) {\n      var gt = ot.options(), xt = ot.router.stateService, St = ot.router.urlRouter;\n      if (gt.source !== \"url\" && gt.location && xt.$current.navigable) {\n        var zt = { replace: gt.location === \"replace\" };\n        St.push(xt.$current.navigable.url, xt.params, zt);\n      }\n      St.update(!0);\n    }, V = e(115), G = e(107), Y = e(17), tt = e(10), Z = e(8);\n    function at(ot) {\n      var gt = ot._ignoredReason();\n      if (gt) {\n        tt.c.traceTransitionIgnored(ot);\n        var xt = ot.router.globals.transition;\n        return gt === \"SameAsCurrent\" && xt && xt.abort(), Z.b.ignored().toPromise();\n      }\n    }\n    function nt(ot) {\n      if (!ot.valid()) throw new Error(ot.error().toString());\n    }\n    var ht = {\n      location: !0,\n      relative: null,\n      inherit: !1,\n      notify: !0,\n      reload: !1,\n      supercede: !0,\n      custom: {},\n      current: function() {\n        return null;\n      },\n      source: \"unknown\"\n    }, ct = function() {\n      function ot(gt) {\n        this._transitionCount = 0, this._eventTypes = [], this._registeredHooks = {}, this._criteriaPaths = {}, this._router = gt, this.$view = gt.viewService, this._deregisterHookFns = {}, this._pluginapi = Object(f.n)(\n          Object(k.p)(this),\n          {},\n          Object(k.p)(this),\n          [\n            \"_definePathType\",\n            \"_defineEvent\",\n            \"_getPathTypes\",\n            \"_getEvents\",\n            \"getHooks\"\n          ]\n        ), this._defineCorePaths(), this._defineCoreEvents(), this._registerCoreTransitionHooks(), gt.globals.successfulTransitions.onEvict(a);\n      }\n      return ot.prototype.onCreate = function(gt, xt, St) {\n      }, ot.prototype.onBefore = function(gt, xt, St) {\n      }, ot.prototype.onStart = function(gt, xt, St) {\n      }, ot.prototype.onExit = function(gt, xt, St) {\n      }, ot.prototype.onRetain = function(gt, xt, St) {\n      }, ot.prototype.onEnter = function(gt, xt, St) {\n      }, ot.prototype.onFinish = function(gt, xt, St) {\n      }, ot.prototype.onSuccess = function(gt, xt, St) {\n      }, ot.prototype.onError = function(gt, xt, St) {\n      }, ot.prototype.dispose = function(gt) {\n        Object(f.U)(this._registeredHooks).forEach(function(xt) {\n          return xt.forEach(function(St) {\n            St._deregistered = !0, Object(f.L)(xt, St);\n          });\n        });\n      }, ot.prototype.create = function(gt, xt) {\n        return new A.a(gt, xt, this._router);\n      }, ot.prototype._defineCoreEvents = function() {\n        var gt = u.a, xt = Y.a, St = this._criteriaPaths;\n        this._defineEvent(\n          \"onCreate\",\n          gt.CREATE,\n          0,\n          St.to,\n          !1,\n          xt.LOG_REJECTED_RESULT,\n          xt.THROW_ERROR,\n          !0\n        ), this._defineEvent(\"onBefore\", gt.BEFORE, 0, St.to), this._defineEvent(\"onStart\", gt.RUN, 0, St.to), this._defineEvent(\"onExit\", gt.RUN, 100, St.exiting, !0), this._defineEvent(\"onRetain\", gt.RUN, 200, St.retained), this._defineEvent(\"onEnter\", gt.RUN, 300, St.entering), this._defineEvent(\"onFinish\", gt.RUN, 400, St.to), this._defineEvent(\n          \"onSuccess\",\n          gt.SUCCESS,\n          0,\n          St.to,\n          !1,\n          xt.LOG_REJECTED_RESULT,\n          xt.LOG_ERROR,\n          !0\n        ), this._defineEvent(\n          \"onError\",\n          gt.ERROR,\n          0,\n          St.to,\n          !1,\n          xt.LOG_REJECTED_RESULT,\n          xt.LOG_ERROR,\n          !0\n        );\n      }, ot.prototype._defineCorePaths = function() {\n        var gt = u.b.STATE, xt = u.b.TRANSITION;\n        this._definePathType(\"to\", xt), this._definePathType(\"from\", xt), this._definePathType(\"exiting\", gt), this._definePathType(\"retained\", gt), this._definePathType(\"entering\", gt);\n      }, ot.prototype._defineEvent = function(gt, xt, St, zt, Nt, re, be, ne) {\n        Nt === void 0 && (Nt = !1), re === void 0 && (re = Y.a.HANDLE_RESULT), be === void 0 && (be = Y.a.REJECT_ERROR), ne === void 0 && (ne = !1);\n        var ce = new G.a(gt, xt, St, zt, Nt, re, be, ne);\n        this._eventTypes.push(ce), Object(w.b)(this, this, ce);\n      }, ot.prototype._getEvents = function(gt) {\n        return (Object(n.c)(gt) ? this._eventTypes.filter(function(xt) {\n          return xt.hookPhase === gt;\n        }) : this._eventTypes.slice()).sort(function(xt, St) {\n          var zt = xt.hookPhase - St.hookPhase;\n          return zt === 0 ? xt.hookOrder - St.hookOrder : zt;\n        });\n      }, ot.prototype._definePathType = function(gt, xt) {\n        this._criteriaPaths[gt] = { name: gt, scope: xt };\n      }, ot.prototype._getPathTypes = function() {\n        return this._criteriaPaths;\n      }, ot.prototype.getHooks = function(gt) {\n        return this._registeredHooks[gt];\n      }, ot.prototype._registerCoreTransitionHooks = function() {\n        var gt = this._deregisterHookFns;\n        gt.addCoreResolves = this.onCreate({}, g), gt.ignored = function(xt) {\n          return xt.onBefore({}, at, { priority: -9999 });\n        }(this), gt.invalid = function(xt) {\n          return xt.onBefore({}, nt, { priority: -1e4 });\n        }(this), gt.redirectTo = function(xt) {\n          return xt.onStart(\n            {\n              to: function(St) {\n                return !!St.redirectTo;\n              }\n            },\n            l\n          );\n        }(this), gt.onExit = function(xt) {\n          return xt.onExit(\n            {\n              exiting: function(St) {\n                return !!St.onExit;\n              }\n            },\n            i\n          );\n        }(this), gt.onRetain = function(xt) {\n          return xt.onRetain(\n            {\n              retained: function(St) {\n                return !!St.onRetain;\n              }\n            },\n            d\n          );\n        }(this), gt.onEnter = function(xt) {\n          return xt.onEnter(\n            {\n              entering: function(St) {\n                return !!St.onEnter;\n              }\n            },\n            p\n          );\n        }(this), gt.eagerResolve = function(xt) {\n          return xt.onStart({}, s, { priority: 1e3 });\n        }(this), gt.lazyResolve = function(xt) {\n          return xt.onEnter({ entering: Object(k.p)(!0) }, S, {\n            priority: 1e3\n          });\n        }(this), gt.resolveAll = function(xt) {\n          return xt.onFinish({}, j, { priority: 1e3 });\n        }(this), gt.loadViews = function(xt) {\n          return xt.onFinish({}, I);\n        }(this), gt.activateViews = function(xt) {\n          return xt.onSuccess({}, R);\n        }(this), gt.updateGlobals = function(xt) {\n          return xt.onCreate({}, M);\n        }(this), gt.updateUrl = function(xt) {\n          return xt.onSuccess({}, z, { priority: 9999 });\n        }(this), gt.lazyLoad = Object(V.b)(this);\n      }, ot;\n    }();\n  },\n  function(L, T) {\n    L.exports = function(e, u) {\n      return e === u || e != e && u != u;\n    };\n  },\n  function(L, T, e) {\n    var u = e(29).Symbol;\n    L.exports = u;\n  },\n  function(L, T, e) {\n    (function(u) {\n      var A = e(29), w = e(280), E = T && !T.nodeType && T, y = E && typeof u == \"object\" && u && !u.nodeType && u, x = y && y.exports === E ? A.Buffer : void 0, g = (x ? x.isBuffer : void 0) || w;\n      u.exports = g;\n    }).call(this, e(80)(L));\n  },\n  function(L, T, e) {\n    var u = e(289), A = e(117), w = e(290), E = e(162), y = e(291), x = e(47), g = e(151), o = g(u), c = g(A), a = g(w), n = g(E), t = g(y), r = x;\n    (u && r(new u(new ArrayBuffer(1))) != \"[object DataView]\" || A && r(new A()) != \"[object Map]\" || w && r(w.resolve()) != \"[object Promise]\" || E && r(new E()) != \"[object Set]\" || y && r(new y()) != \"[object WeakMap]\") && (r = function(l) {\n      var h = x(l), i = h == \"[object Object]\" ? l.constructor : void 0, d = i ? g(i) : \"\";\n      if (d)\n        switch (d) {\n          case o:\n            return \"[object DataView]\";\n          case c:\n            return \"[object Map]\";\n          case a:\n            return \"[object Promise]\";\n          case n:\n            return \"[object Set]\";\n          case t:\n            return \"[object WeakMap]\";\n        }\n      return h;\n    }), L.exports = r;\n  },\n  function(L, T, e) {\n    var u = e(47), A = e(34);\n    L.exports = function(w) {\n      return typeof w == \"symbol\" || A(w) && u(w) == \"[object Symbol]\";\n    };\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return u;\n    });\n    var u = function() {\n      function A(w) {\n        this.text = w, this.glob = w.split(\".\");\n        var E = this.text.split(\".\").map(function(y) {\n          return y === \"**\" ? \"(?:|(?:\\\\.[^.]*)*)\" : y === \"*\" ? \"\\\\.[^.]*\" : \"\\\\.\" + y;\n        }).join(\"\");\n        this.regexp = new RegExp(\"^\" + E + \"$\");\n      }\n      return A.is = function(w) {\n        return !!/[!,*]+/.exec(w);\n      }, A.fromString = function(w) {\n        return A.is(w) ? new A(w) : null;\n      }, A.prototype.matches = function(w) {\n        return this.regexp.test(\".\" + w);\n      }, A;\n    }();\n  },\n  function(L, T, e) {\n    (function(u) {\n      var A = function(w) {\n        var E = /(?:^|\\s)lang(?:uage)?-([\\w-]+)(?=\\s|$)/i, y = 0, x = {}, g = {\n          manual: w.Prism && w.Prism.manual,\n          disableWorkerMessageHandler: w.Prism && w.Prism.disableWorkerMessageHandler,\n          util: {\n            encode: function i(d) {\n              return d instanceof o ? new o(d.type, i(d.content), d.alias) : Array.isArray(d) ? d.map(i) : d.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/\\u00a0/g, \" \");\n            },\n            type: function(i) {\n              return Object.prototype.toString.call(i).slice(8, -1);\n            },\n            objId: function(i) {\n              return i.__id || Object.defineProperty(i, \"__id\", { value: ++y }), i.__id;\n            },\n            clone: function i(d, p) {\n              var f, v;\n              switch (p = p || {}, g.util.type(d)) {\n                case \"Object\":\n                  if (v = g.util.objId(d), p[v]) return p[v];\n                  for (var k in f = {}, p[v] = f, d)\n                    d.hasOwnProperty(k) && (f[k] = i(d[k], p));\n                  return f;\n                case \"Array\":\n                  return v = g.util.objId(d), p[v] ? p[v] : (f = [], p[v] = f, d.forEach(function(s, S) {\n                    f[S] = i(s, p);\n                  }), f);\n                default:\n                  return d;\n              }\n            },\n            getLanguage: function(i) {\n              for (; i; ) {\n                var d = E.exec(i.className);\n                if (d) return d[1].toLowerCase();\n                i = i.parentElement;\n              }\n              return \"none\";\n            },\n            setLanguage: function(i, d) {\n              i.className = i.className.replace(RegExp(E, \"gi\"), \"\"), i.classList.add(\"language-\" + d);\n            },\n            currentScript: function() {\n              if (typeof document > \"u\") return null;\n              if (\"currentScript\" in document) return document.currentScript;\n              try {\n                throw new Error();\n              } catch (f) {\n                var i = (/at [^(\\r\\n]*\\((.*):[^:]+:[^:]+\\)$/i.exec(f.stack) || [])[1];\n                if (i) {\n                  var d = document.getElementsByTagName(\"script\");\n                  for (var p in d) if (d[p].src == i) return d[p];\n                }\n                return null;\n              }\n            },\n            isActive: function(i, d, p) {\n              for (var f = \"no-\" + d; i; ) {\n                var v = i.classList;\n                if (v.contains(d)) return !0;\n                if (v.contains(f)) return !1;\n                i = i.parentElement;\n              }\n              return !!p;\n            }\n          },\n          languages: {\n            plain: x,\n            plaintext: x,\n            text: x,\n            txt: x,\n            extend: function(i, d) {\n              var p = g.util.clone(g.languages[i]);\n              for (var f in d) p[f] = d[f];\n              return p;\n            },\n            insertBefore: function(i, d, p, f) {\n              var v = (f = f || g.languages)[i], k = {};\n              for (var s in v)\n                if (v.hasOwnProperty(s)) {\n                  if (s == d)\n                    for (var S in p) p.hasOwnProperty(S) && (k[S] = p[S]);\n                  p.hasOwnProperty(s) || (k[s] = v[s]);\n                }\n              var j = f[i];\n              return f[i] = k, g.languages.DFS(g.languages, function(I, R) {\n                R === j && I != i && (this[I] = k);\n              }), k;\n            },\n            DFS: function i(d, p, f, v) {\n              v = v || {};\n              var k = g.util.objId;\n              for (var s in d)\n                if (d.hasOwnProperty(s)) {\n                  p.call(d, s, d[s], f || s);\n                  var S = d[s], j = g.util.type(S);\n                  j !== \"Object\" || v[k(S)] ? j !== \"Array\" || v[k(S)] || (v[k(S)] = !0, i(S, p, s, v)) : (v[k(S)] = !0, i(S, p, null, v));\n                }\n            }\n          },\n          plugins: {},\n          highlightAll: function(i, d) {\n            g.highlightAllUnder(document, i, d);\n          },\n          highlightAllUnder: function(i, d, p) {\n            var f = {\n              callback: p,\n              container: i,\n              selector: 'code[class*=\"language-\"], [class*=\"language-\"] code, code[class*=\"lang-\"], [class*=\"lang-\"] code'\n            };\n            g.hooks.run(\"before-highlightall\", f), f.elements = Array.prototype.slice.apply(\n              f.container.querySelectorAll(f.selector)\n            ), g.hooks.run(\"before-all-elements-highlight\", f);\n            for (var v, k = 0; v = f.elements[k++]; )\n              g.highlightElement(v, d === !0, f.callback);\n          },\n          highlightElement: function(i, d, p) {\n            var f = g.util.getLanguage(i), v = g.languages[f];\n            g.util.setLanguage(i, f);\n            var k = i.parentElement;\n            k && k.nodeName.toLowerCase() === \"pre\" && g.util.setLanguage(k, f);\n            var s = {\n              element: i,\n              language: f,\n              grammar: v,\n              code: i.textContent\n            };\n            function S(I) {\n              s.highlightedCode = I, g.hooks.run(\"before-insert\", s), s.element.innerHTML = s.highlightedCode, g.hooks.run(\"after-highlight\", s), g.hooks.run(\"complete\", s), p && p.call(s.element);\n            }\n            if (g.hooks.run(\"before-sanity-check\", s), (k = s.element.parentElement) && k.nodeName.toLowerCase() === \"pre\" && !k.hasAttribute(\"tabindex\") && k.setAttribute(\"tabindex\", \"0\"), !s.code)\n              return g.hooks.run(\"complete\", s), void (p && p.call(s.element));\n            if (g.hooks.run(\"before-highlight\", s), s.grammar)\n              if (d && w.Worker) {\n                var j = new Worker(g.filename);\n                j.onmessage = function(I) {\n                  S(I.data);\n                }, j.postMessage(\n                  JSON.stringify({\n                    language: s.language,\n                    code: s.code,\n                    immediateClose: !0\n                  })\n                );\n              } else S(g.highlight(s.code, s.grammar, s.language));\n            else S(g.util.encode(s.code));\n          },\n          highlight: function(i, d, p) {\n            var f = { code: i, grammar: d, language: p };\n            if (g.hooks.run(\"before-tokenize\", f), !f.grammar)\n              throw new Error(\n                'The language \"' + f.language + '\" has no grammar.'\n              );\n            return f.tokens = g.tokenize(f.code, f.grammar), g.hooks.run(\"after-tokenize\", f), o.stringify(g.util.encode(f.tokens), f.language);\n          },\n          tokenize: function(i, d) {\n            var p = d.rest;\n            if (p) {\n              for (var f in p) d[f] = p[f];\n              delete d.rest;\n            }\n            var v = new a();\n            return n(v, v.head, i), function k(s, S, j, I, R, M) {\n              for (var z in j)\n                if (j.hasOwnProperty(z) && j[z]) {\n                  var V = j[z];\n                  V = Array.isArray(V) ? V : [V];\n                  for (var G = 0; G < V.length; ++G) {\n                    if (M && M.cause == z + \",\" + G) return;\n                    var Y = V[G], tt = Y.inside, Z = !!Y.lookbehind, at = !!Y.greedy, nt = Y.alias;\n                    if (at && !Y.pattern.global) {\n                      var ht = Y.pattern.toString().match(/[imsuy]*$/)[0];\n                      Y.pattern = RegExp(Y.pattern.source, ht + \"g\");\n                    }\n                    for (var ct = Y.pattern || Y, ot = I.next, gt = R; ot !== S.tail && !(M && gt >= M.reach); gt += ot.value.length, ot = ot.next) {\n                      var xt = ot.value;\n                      if (S.length > s.length) return;\n                      if (!(xt instanceof o)) {\n                        var St, zt = 1;\n                        if (at) {\n                          if (!(St = c(ct, gt, s, Z)) || St.index >= s.length)\n                            break;\n                          var Nt = St.index, re = St.index + St[0].length, be = gt;\n                          for (be += ot.value.length; Nt >= be; )\n                            ot = ot.next, be += ot.value.length;\n                          if (be -= ot.value.length, gt = be, ot.value instanceof o)\n                            continue;\n                          for (var ne = ot; ne !== S.tail && (be < re || typeof ne.value == \"string\"); ne = ne.next)\n                            zt++, be += ne.value.length;\n                          zt--, xt = s.slice(gt, be), St.index -= gt;\n                        } else if (!(St = c(ct, 0, xt, Z))) continue;\n                        Nt = St.index;\n                        var ce = St[0], xe = xt.slice(0, Nt), we = xt.slice(Nt + ce.length), ae = gt + xt.length;\n                        M && ae > M.reach && (M.reach = ae);\n                        var Le = ot.prev;\n                        xe && (Le = n(S, Le, xe), gt += xe.length), t(S, Le, zt);\n                        var lt = new o(z, tt ? g.tokenize(ce, tt) : ce, nt, ce);\n                        if (ot = n(S, Le, lt), we && n(S, ot, we), zt > 1) {\n                          var kt = { cause: z + \",\" + G, reach: ae };\n                          k(s, S, j, ot.prev, gt, kt), M && kt.reach > M.reach && (M.reach = kt.reach);\n                        }\n                      }\n                    }\n                  }\n                }\n            }(i, v, d, v.head, 0), function(k) {\n              for (var s = [], S = k.head.next; S !== k.tail; ) s.push(S.value), S = S.next;\n              return s;\n            }(v);\n          },\n          hooks: {\n            all: {},\n            add: function(i, d) {\n              var p = g.hooks.all;\n              p[i] = p[i] || [], p[i].push(d);\n            },\n            run: function(i, d) {\n              var p = g.hooks.all[i];\n              if (p && p.length) for (var f, v = 0; f = p[v++]; ) f(d);\n            }\n          },\n          Token: o\n        };\n        function o(i, d, p, f) {\n          this.type = i, this.content = d, this.alias = p, this.length = 0 | (f || \"\").length;\n        }\n        function c(i, d, p, f) {\n          i.lastIndex = d;\n          var v = i.exec(p);\n          if (v && f && v[1]) {\n            var k = v[1].length;\n            v.index += k, v[0] = v[0].slice(k);\n          }\n          return v;\n        }\n        function a() {\n          var i = { value: null, prev: null, next: null }, d = { value: null, prev: i, next: null };\n          i.next = d, this.head = i, this.tail = d, this.length = 0;\n        }\n        function n(i, d, p) {\n          var f = d.next, v = { value: p, prev: d, next: f };\n          return d.next = v, f.prev = v, i.length++, v;\n        }\n        function t(i, d, p) {\n          for (var f = d.next, v = 0; v < p && f !== i.tail; v++) f = f.next;\n          d.next = f, f.prev = d, i.length -= v;\n        }\n        if (w.Prism = g, o.stringify = function i(d, p) {\n          if (typeof d == \"string\") return d;\n          if (Array.isArray(d)) {\n            var f = \"\";\n            return d.forEach(function(j) {\n              f += i(j, p);\n            }), f;\n          }\n          var v = {\n            type: d.type,\n            content: i(d.content, p),\n            tag: \"span\",\n            classes: [\"token\", d.type],\n            attributes: {},\n            language: p\n          }, k = d.alias;\n          k && (Array.isArray(k) ? Array.prototype.push.apply(v.classes, k) : v.classes.push(k)), g.hooks.run(\"wrap\", v);\n          var s = \"\";\n          for (var S in v.attributes)\n            s += \" \" + S + '=\"' + (v.attributes[S] || \"\").replace(/\"/g, \"&quot;\") + '\"';\n          return \"<\" + v.tag + ' class=\"' + v.classes.join(\" \") + '\"' + s + \">\" + v.content + \"</\" + v.tag + \">\";\n        }, !w.document)\n          return w.addEventListener && (g.disableWorkerMessageHandler || w.addEventListener(\n            \"message\",\n            function(i) {\n              var d = JSON.parse(i.data), p = d.language, f = d.code, v = d.immediateClose;\n              w.postMessage(g.highlight(f, g.languages[p], p)), v && w.close();\n            },\n            !1\n          )), g;\n        var r = g.util.currentScript();\n        function l() {\n          g.manual || g.highlightAll();\n        }\n        if (r && (g.filename = r.src, r.hasAttribute(\"data-manual\") && (g.manual = !0)), !g.manual) {\n          var h = document.readyState;\n          h === \"loading\" || h === \"interactive\" && r && r.defer ? document.addEventListener(\"DOMContentLoaded\", l) : window.requestAnimationFrame ? window.requestAnimationFrame(l) : window.setTimeout(l, 16);\n        }\n        return g;\n      }(\n        typeof window < \"u\" ? window : typeof WorkerGlobalScope < \"u\" && self instanceof WorkerGlobalScope ? self : {}\n      );\n      /**\n       * Prism: Lightweight, robust, elegant syntax highlighting\n       *\n       * @license MIT <https://opensource.org/licenses/MIT>\n       * @author Lea Verou <https://lea.verou.me>\n       * @namespace\n       * @public\n       */\n      L.exports && (L.exports = A), u !== void 0 && (u.Prism = A), A.languages.markup = {\n        comment: { pattern: /<!--(?:(?!<!--)[\\s\\S])*?-->/, greedy: !0 },\n        prolog: { pattern: /<\\?[\\s\\S]+?\\?>/, greedy: !0 },\n        doctype: {\n          pattern: /<!DOCTYPE(?:[^>\"'[\\]]|\"[^\"]*\"|'[^']*')+(?:\\[(?:[^<\"'\\]]|\"[^\"]*\"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\\]\\s*)?>/i,\n          greedy: !0,\n          inside: {\n            \"internal-subset\": {\n              pattern: /(^[^\\[]*\\[)[\\s\\S]+(?=\\]>$)/,\n              lookbehind: !0,\n              greedy: !0,\n              inside: null\n            },\n            string: { pattern: /\"[^\"]*\"|'[^']*'/, greedy: !0 },\n            punctuation: /^<!|>$|[[\\]]/,\n            \"doctype-tag\": /^DOCTYPE/i,\n            name: /[^\\s<>'\"]+/\n          }\n        },\n        cdata: { pattern: /<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/i, greedy: !0 },\n        tag: {\n          pattern: /<\\/?(?!\\d)[^\\s>\\/=$<%]+(?:\\s(?:\\s*[^\\s>\\/=]+(?:\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))|(?=[\\s/>])))+)?\\s*\\/?>/,\n          greedy: !0,\n          inside: {\n            tag: {\n              pattern: /^<\\/?[^\\s>\\/]+/,\n              inside: { punctuation: /^<\\/?/, namespace: /^[^\\s>\\/:]+:/ }\n            },\n            \"special-attr\": [],\n            \"attr-value\": {\n              pattern: /=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+)/,\n              inside: {\n                punctuation: [{ pattern: /^=/, alias: \"attr-equals\" }, /\"|'/]\n              }\n            },\n            punctuation: /\\/?>/,\n            \"attr-name\": {\n              pattern: /[^\\s>\\/]+/,\n              inside: { namespace: /^[^\\s>\\/:]+:/ }\n            }\n          }\n        },\n        entity: [\n          { pattern: /&[\\da-z]{1,8};/i, alias: \"named-entity\" },\n          /&#x?[\\da-f]{1,8};/i\n        ]\n      }, A.languages.markup.tag.inside[\"attr-value\"].inside.entity = A.languages.markup.entity, A.languages.markup.doctype.inside[\"internal-subset\"].inside = A.languages.markup, A.hooks.add(\"wrap\", function(w) {\n        w.type === \"entity\" && (w.attributes.title = w.content.replace(/&amp;/, \"&\"));\n      }), Object.defineProperty(A.languages.markup.tag, \"addInlined\", {\n        value: function(w, E) {\n          var y = {};\n          y[\"language-\" + E] = {\n            pattern: /(^<!\\[CDATA\\[)[\\s\\S]+?(?=\\]\\]>$)/i,\n            lookbehind: !0,\n            inside: A.languages[E]\n          }, y.cdata = /^<!\\[CDATA\\[|\\]\\]>$/i;\n          var x = {\n            \"included-cdata\": {\n              pattern: /<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/i,\n              inside: y\n            }\n          };\n          x[\"language-\" + E] = { pattern: /[\\s\\S]+/, inside: A.languages[E] };\n          var g = {};\n          g[w] = {\n            pattern: RegExp(\n              /(<__[^>]*>)(?:<!\\[CDATA\\[(?:[^\\]]|\\](?!\\]>))*\\]\\]>|(?!<!\\[CDATA\\[)[\\s\\S])*?(?=<\\/__>)/.source.replace(\n                /__/g,\n                function() {\n                  return w;\n                }\n              ),\n              \"i\"\n            ),\n            lookbehind: !0,\n            greedy: !0,\n            inside: x\n          }, A.languages.insertBefore(\"markup\", \"cdata\", g);\n        }\n      }), Object.defineProperty(A.languages.markup.tag, \"addAttribute\", {\n        value: function(w, E) {\n          A.languages.markup.tag.inside[\"special-attr\"].push({\n            pattern: RegExp(\n              /(^|[\"'\\s])/.source + \"(?:\" + w + \")\" + /\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))/.source,\n              \"i\"\n            ),\n            lookbehind: !0,\n            inside: {\n              \"attr-name\": /^[^\\s=]+/,\n              \"attr-value\": {\n                pattern: /=[\\s\\S]+/,\n                inside: {\n                  value: {\n                    pattern: /(^=\\s*([\"']|(?![\"'])))\\S[\\s\\S]*(?=\\2$)/,\n                    lookbehind: !0,\n                    alias: [E, \"language-\" + E],\n                    inside: A.languages[E]\n                  },\n                  punctuation: [\n                    { pattern: /^=/, alias: \"attr-equals\" },\n                    /\"|'/\n                  ]\n                }\n              }\n            }\n          });\n        }\n      }), A.languages.html = A.languages.markup, A.languages.mathml = A.languages.markup, A.languages.svg = A.languages.markup, A.languages.xml = A.languages.extend(\"markup\", {}), A.languages.ssml = A.languages.xml, A.languages.atom = A.languages.xml, A.languages.rss = A.languages.xml, function(w) {\n        var E = /(?:\"(?:\\\\(?:\\r\\n|[\\s\\S])|[^\"\\\\\\r\\n])*\"|'(?:\\\\(?:\\r\\n|[\\s\\S])|[^'\\\\\\r\\n])*')/;\n        w.languages.css = {\n          comment: /\\/\\*[\\s\\S]*?\\*\\//,\n          atrule: {\n            pattern: /@[\\w-](?:[^;{\\s]|\\s+(?![\\s{]))*(?:;|(?=\\s*\\{))/,\n            inside: {\n              rule: /^@[\\w-]+/,\n              \"selector-function-argument\": {\n                pattern: /(\\bselector\\s*\\(\\s*(?![\\s)]))(?:[^()\\s]|\\s+(?![\\s)])|\\((?:[^()]|\\([^()]*\\))*\\))+(?=\\s*\\))/,\n                lookbehind: !0,\n                alias: \"selector\"\n              },\n              keyword: {\n                pattern: /(^|[^\\w-])(?:and|not|only|or)(?![\\w-])/,\n                lookbehind: !0\n              }\n            }\n          },\n          url: {\n            pattern: RegExp(\n              \"\\\\burl\\\\((?:\" + E.source + \"|\" + /(?:[^\\\\\\r\\n()\"']|\\\\[\\s\\S])*/.source + \")\\\\)\",\n              \"i\"\n            ),\n            greedy: !0,\n            inside: {\n              function: /^url/i,\n              punctuation: /^\\(|\\)$/,\n              string: { pattern: RegExp(\"^\" + E.source + \"$\"), alias: \"url\" }\n            }\n          },\n          selector: {\n            pattern: RegExp(\n              `(^|[{}\\\\s])[^{}\\\\s](?:[^{};\"'\\\\s]|\\\\s+(?![\\\\s{])|` + E.source + \")*(?=\\\\s*\\\\{)\"\n            ),\n            lookbehind: !0\n          },\n          string: { pattern: E, greedy: !0 },\n          property: {\n            pattern: /(^|[^-\\w\\xA0-\\uFFFF])(?!\\s)[-_a-z\\xA0-\\uFFFF](?:(?!\\s)[-\\w\\xA0-\\uFFFF])*(?=\\s*:)/i,\n            lookbehind: !0\n          },\n          important: /!important\\b/i,\n          function: {\n            pattern: /(^|[^-a-z0-9])[-a-z0-9]+(?=\\()/i,\n            lookbehind: !0\n          },\n          punctuation: /[(){};:,]/\n        }, w.languages.css.atrule.inside.rest = w.languages.css;\n        var y = w.languages.markup;\n        y && (y.tag.addInlined(\"style\", \"css\"), y.tag.addAttribute(\"style\", \"css\"));\n      }(A), A.languages.clike = {\n        comment: [\n          {\n            pattern: /(^|[^\\\\])\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,\n            lookbehind: !0,\n            greedy: !0\n          },\n          { pattern: /(^|[^\\\\:])\\/\\/.*/, lookbehind: !0, greedy: !0 }\n        ],\n        string: {\n          pattern: /([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,\n          greedy: !0\n        },\n        \"class-name\": {\n          pattern: /(\\b(?:class|extends|implements|instanceof|interface|new|trait)\\s+|\\bcatch\\s+\\()[\\w.\\\\]+/i,\n          lookbehind: !0,\n          inside: { punctuation: /[.\\\\]/ }\n        },\n        keyword: /\\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\\b/,\n        boolean: /\\b(?:false|true)\\b/,\n        function: /\\b\\w+(?=\\()/,\n        number: /\\b0x[\\da-f]+\\b|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?/i,\n        operator: /[<>]=?|[!=]=?=?|--?|\\+\\+?|&&?|\\|\\|?|[?*/~^%]/,\n        punctuation: /[{}[\\];(),.:]/\n      }, A.languages.javascript = A.languages.extend(\"clike\", {\n        \"class-name\": [\n          A.languages.clike[\"class-name\"],\n          {\n            pattern: /(^|[^$\\w\\xA0-\\uFFFF])(?!\\s)[_$A-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\.(?:constructor|prototype))/,\n            lookbehind: !0\n          }\n        ],\n        keyword: [\n          { pattern: /((?:^|\\})\\s*)catch\\b/, lookbehind: !0 },\n          {\n            pattern: /(^|[^.]|\\.\\.\\.\\s*)\\b(?:as|assert(?=\\s*\\{)|async(?=\\s*(?:function\\b|\\(|[$\\w\\xA0-\\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\\s*(?:\\{|$))|for|from(?=\\s*(?:['\"]|$))|function|(?:get|set)(?=\\s*(?:[#\\[$\\w\\xA0-\\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\\b/,\n            lookbehind: !0\n          }\n        ],\n        function: /#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*(?:\\.\\s*(?:apply|bind|call)\\s*)?\\()/,\n        number: {\n          pattern: RegExp(\n            /(^|[^\\w$])/.source + \"(?:\" + /NaN|Infinity/.source + \"|\" + /0[bB][01]+(?:_[01]+)*n?/.source + \"|\" + /0[oO][0-7]+(?:_[0-7]+)*n?/.source + \"|\" + /0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?/.source + \"|\" + /\\d+(?:_\\d+)*n/.source + \"|\" + /(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?/.source + \")\" + /(?![\\w$])/.source\n          ),\n          lookbehind: !0\n        },\n        operator: /--|\\+\\+|\\*\\*=?|=>|&&=?|\\|\\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\\.{3}|\\?\\?=?|\\?\\.?|[~:]/\n      }), A.languages.javascript[\"class-name\"][0].pattern = /(\\b(?:class|extends|implements|instanceof|interface|new)\\s+)[\\w.\\\\]+/, A.languages.insertBefore(\"javascript\", \"keyword\", {\n        regex: {\n          pattern: RegExp(\n            /((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/.source + /\\//.source + \"(?:\" + /(?:\\[(?:[^\\]\\\\\\r\\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\\r\\n])+\\/[dgimyus]{0,7}/.source + \"|\" + /(?:\\[(?:[^[\\]\\\\\\r\\n]|\\\\.|\\[(?:[^[\\]\\\\\\r\\n]|\\\\.|\\[(?:[^[\\]\\\\\\r\\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\\r\\n])+\\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source + \")\" + /(?=(?:\\s|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/)*(?:$|[\\r\\n,.;:})\\]]|\\/\\/))/.source\n          ),\n          lookbehind: !0,\n          greedy: !0,\n          inside: {\n            \"regex-source\": {\n              pattern: /^(\\/)[\\s\\S]+(?=\\/[a-z]*$)/,\n              lookbehind: !0,\n              alias: \"language-regex\",\n              inside: A.languages.regex\n            },\n            \"regex-delimiter\": /^\\/|\\/$/,\n            \"regex-flags\": /^[a-z]+$/\n          }\n        },\n        \"function-variable\": {\n          pattern: /#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*[=:]\\s*(?:async\\s*)?(?:\\bfunction\\b|(?:\\((?:[^()]|\\([^()]*\\))*\\)|(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*)\\s*=>))/,\n          alias: \"function\"\n        },\n        parameter: [\n          {\n            pattern: /(function(?:\\s+(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*)?\\s*\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\))/,\n            lookbehind: !0,\n            inside: A.languages.javascript\n          },\n          {\n            pattern: /(^|[^$\\w\\xA0-\\uFFFF])(?!\\s)[_$a-z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*=>)/i,\n            lookbehind: !0,\n            inside: A.languages.javascript\n          },\n          {\n            pattern: /(\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\)\\s*=>)/,\n            lookbehind: !0,\n            inside: A.languages.javascript\n          },\n          {\n            pattern: /((?:\\b|\\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\\w\\xA0-\\uFFFF]))(?:(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*\\s*)\\(\\s*|\\]\\s*\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\)\\s*\\{)/,\n            lookbehind: !0,\n            inside: A.languages.javascript\n          }\n        ],\n        constant: /\\b[A-Z](?:[A-Z_]|\\dx?)*\\b/\n      }), A.languages.insertBefore(\"javascript\", \"string\", {\n        hashbang: { pattern: /^#!.*/, greedy: !0, alias: \"comment\" },\n        \"template-string\": {\n          pattern: /`(?:\\\\[\\s\\S]|\\$\\{(?:[^{}]|\\{(?:[^{}]|\\{[^}]*\\})*\\})+\\}|(?!\\$\\{)[^\\\\`])*`/,\n          greedy: !0,\n          inside: {\n            \"template-punctuation\": { pattern: /^`|`$/, alias: \"string\" },\n            interpolation: {\n              pattern: /((?:^|[^\\\\])(?:\\\\{2})*)\\$\\{(?:[^{}]|\\{(?:[^{}]|\\{[^}]*\\})*\\})+\\}/,\n              lookbehind: !0,\n              inside: {\n                \"interpolation-punctuation\": {\n                  pattern: /^\\$\\{|\\}$/,\n                  alias: \"punctuation\"\n                },\n                rest: A.languages.javascript\n              }\n            },\n            string: /[\\s\\S]+/\n          }\n        },\n        \"string-property\": {\n          pattern: /((?:^|[,{])[ \\t]*)([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\2)[^\\\\\\r\\n])*\\2(?=\\s*:)/m,\n          lookbehind: !0,\n          greedy: !0,\n          alias: \"property\"\n        }\n      }), A.languages.insertBefore(\"javascript\", \"operator\", {\n        \"literal-property\": {\n          pattern: /((?:^|[,{])[ \\t]*)(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*:)/m,\n          lookbehind: !0,\n          alias: \"property\"\n        }\n      }), A.languages.markup && (A.languages.markup.tag.addInlined(\"script\", \"javascript\"), A.languages.markup.tag.addAttribute(\n        /on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,\n        \"javascript\"\n      )), A.languages.js = A.languages.javascript, function() {\n        if (A !== void 0 && typeof document < \"u\") {\n          Element.prototype.matches || (Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector);\n          var w = {\n            js: \"javascript\",\n            py: \"python\",\n            rb: \"ruby\",\n            ps1: \"powershell\",\n            psm1: \"powershell\",\n            sh: \"bash\",\n            bat: \"batch\",\n            h: \"c\",\n            tex: \"latex\"\n          }, E = 'pre[data-src]:not([data-src-status=\"loaded\"]):not([data-src-status=\"loading\"])';\n          A.hooks.add(\"before-highlightall\", function(x) {\n            x.selector += \", \" + E;\n          }), A.hooks.add(\"before-sanity-check\", function(x) {\n            var g = x.element;\n            if (g.matches(E)) {\n              x.code = \"\", g.setAttribute(\"data-src-status\", \"loading\");\n              var o = g.appendChild(document.createElement(\"CODE\"));\n              o.textContent = \"Loading…\";\n              var c = g.getAttribute(\"data-src\"), a = x.language;\n              if (a === \"none\") {\n                var n = (/\\.(\\w+)$/.exec(c) || [, \"none\"])[1];\n                a = w[n] || n;\n              }\n              A.util.setLanguage(o, a), A.util.setLanguage(g, a);\n              var t = A.plugins.autoloader;\n              t && t.loadLanguages(a), function(r, l, h) {\n                var i = new XMLHttpRequest();\n                i.open(\"GET\", r, !0), i.onreadystatechange = function() {\n                  var d, p;\n                  i.readyState == 4 && (i.status < 400 && i.responseText ? l(i.responseText) : i.status >= 400 ? h(\n                    (d = i.status, p = i.statusText, \"✖ Error \" + d + \" while fetching file: \" + p)\n                  ) : h(\"✖ Error: File does not exist or is empty\"));\n                }, i.send(null);\n              }(\n                c,\n                function(r) {\n                  g.setAttribute(\"data-src-status\", \"loaded\");\n                  var l = function(p) {\n                    var f = /^\\s*(\\d+)\\s*(?:(,)\\s*(?:(\\d+)\\s*)?)?$/.exec(\n                      p || \"\"\n                    );\n                    if (f) {\n                      var v = Number(f[1]), k = f[2], s = f[3];\n                      return k ? s ? [v, Number(s)] : [v, void 0] : [v, v];\n                    }\n                  }(g.getAttribute(\"data-range\"));\n                  if (l) {\n                    var h = r.split(/\\r\\n?|\\n/g), i = l[0], d = l[1] == null ? h.length : l[1];\n                    i < 0 && (i += h.length), i = Math.max(0, Math.min(i - 1, h.length)), d < 0 && (d += h.length), d = Math.max(0, Math.min(d, h.length)), r = h.slice(i, d).join(`\n`), g.hasAttribute(\"data-start\") || g.setAttribute(\"data-start\", String(i + 1));\n                  }\n                  o.textContent = r, A.highlightElement(o);\n                },\n                function(r) {\n                  g.setAttribute(\"data-src-status\", \"failed\"), o.textContent = r;\n                }\n              );\n            }\n          }), A.plugins.fileHighlight = {\n            highlight: function(x) {\n              for (var g, o = (x || document).querySelectorAll(E), c = 0; g = o[c++]; )\n                A.highlightElement(g);\n            }\n          };\n          var y = !1;\n          A.fileHighlight = function() {\n            y || (console.warn(\n              \"Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead.\"\n            ), y = !0), A.plugins.fileHighlight.highlight.apply(this, arguments);\n          };\n        }\n      }();\n    }).call(this, e(35));\n  },\n  function(L, T, e) {\n    var u = e(47), A = e(23);\n    L.exports = function(w) {\n      if (!A(w)) return !1;\n      var E = u(w);\n      return E == \"[object Function]\" || E == \"[object GeneratorFunction]\" || E == \"[object AsyncFunction]\" || E == \"[object Proxy]\";\n    };\n  },\n  function(L, T, e) {\n    var u = e(78), A = e(79);\n    L.exports = function(w, E, y, x) {\n      var g = !y;\n      y || (y = {});\n      for (var o = -1, c = E.length; ++o < c; ) {\n        var a = E[o], n = x ? x(y[a], w[a], a, y, w) : void 0;\n        n === void 0 && (n = w[a]), g ? A(y, a, n) : u(y, a, n);\n      }\n      return y;\n    };\n  },\n  function(L, T, e) {\n    var u = e(279), A = e(34), w = Object.prototype, E = w.hasOwnProperty, y = w.propertyIsEnumerable, x = u(\n      /* @__PURE__ */ function() {\n        return arguments;\n      }()\n    ) ? u : function(g) {\n      return A(g) && E.call(g, \"callee\") && !y.call(g, \"callee\");\n    };\n    L.exports = x;\n  },\n  function(L, T, e) {\n    var u = e(281), A = e(82), w = e(121), E = w && w.isTypedArray, y = E ? A(E) : u;\n    L.exports = y;\n  },\n  function(L, T, e) {\n    var u = e(61);\n    L.exports = function(A) {\n      if (typeof A == \"string\" || u(A)) return A;\n      var w = A + \"\";\n      return w == \"0\" && 1 / A == -1 / 0 ? \"-0\" : w;\n    };\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return u;\n    });\n    var u = {\n      when: { LAZY: \"LAZY\", EAGER: \"EAGER\" },\n      async: { WAIT: \"WAIT\", NOWAIT: \"NOWAIT\" }\n    };\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return A;\n    });\n    var u = e(4), A = {\n      when: function(w) {\n        return new Promise(function(E, y) {\n          return E(w);\n        });\n      },\n      reject: function(w) {\n        return new Promise(function(E, y) {\n          y(w);\n        });\n      },\n      defer: function() {\n        var w = {};\n        return w.promise = new Promise(function(E, y) {\n          w.resolve = E, w.reject = y;\n        }), w;\n      },\n      all: function(w) {\n        if (Object(u.R)(w)) return Promise.all(w);\n        if (Object(u.Z)(w)) {\n          var E = Object.keys(w).map(function(y) {\n            return w[y].then(function(x) {\n              return { key: y, val: x };\n            });\n          });\n          return A.all(E).then(function(y) {\n            return y.reduce(function(x, g) {\n              return x[g.key] = g.val, x;\n            }, {});\n          });\n        }\n      }\n    };\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return y;\n    });\n    var u = e(4), A = {}, w = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/gm, E = /([^\\s,]+)/g, y = {\n      get: function(x) {\n        return A[x];\n      },\n      has: function(x) {\n        return y.get(x) != null;\n      },\n      invoke: function(x, g, o) {\n        var c = Object(u.C)({}, A, o || {}), a = y.annotate(x), n = Object(u.s)(\n          function(r) {\n            return c.hasOwnProperty(r);\n          },\n          function(r) {\n            return \"DI can't find injectable: '\" + r + \"'\";\n          }\n        ), t = a.filter(n).map(function(r) {\n          return c[r];\n        });\n        return Object(u.U)(x) ? x.apply(g, t) : x.slice(-1)[0].apply(g, t);\n      },\n      annotate: function(x) {\n        if (!Object(u.V)(x))\n          throw new Error(\"Not an injectable function: \" + x);\n        if (x && x.$inject) return x.$inject;\n        if (Object(u.R)(x)) return x.slice(0, -1);\n        var g = x.toString().replace(w, \"\");\n        return g.slice(g.indexOf(\"(\") + 1, g.indexOf(\")\")).match(E) || [];\n      }\n    };\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return A;\n    });\n    var u = e(1), A = function() {\n      function w(E, y) {\n        y === void 0 && (y = !1), this._isHtml5 = y, this._baseHref = void 0, this._hashPrefix = \"\";\n      }\n      return w.prototype.port = function() {\n        return location.port ? Number(location.port) : this.protocol() === \"https\" ? 443 : 80;\n      }, w.prototype.protocol = function() {\n        return location.protocol.replace(/:/g, \"\");\n      }, w.prototype.host = function() {\n        return location.hostname;\n      }, w.prototype.html5Mode = function() {\n        return this._isHtml5;\n      }, w.prototype.hashPrefix = function(E) {\n        return Object(u.c)(E) ? this._hashPrefix = E : this._hashPrefix;\n      }, w.prototype.baseHref = function(E) {\n        return Object(u.c)(E) && (this._baseHref = E), Object(u.m)(this._baseHref) && (this._baseHref = this.getBaseHref()), this._baseHref;\n      }, w.prototype.getBaseHref = function() {\n        var E = document.getElementsByTagName(\"base\")[0];\n        return E && E.href ? E.href.replace(/^([^/:]*:)?\\/\\/[^/]*/, \"\") : this._isHtml5 ? \"/\" : location.pathname || \"/\";\n      }, w.prototype.dispose = function() {\n      }, w;\n    }();\n  },\n  function(L, T, e) {\n    var u = e(74), A = e(254), w = e(255), E = e(256), y = e(257), x = e(258);\n    function g(o) {\n      var c = this.__data__ = new u(o);\n      this.size = c.size;\n    }\n    g.prototype.clear = A, g.prototype.delete = w, g.prototype.get = E, g.prototype.has = y, g.prototype.set = x, L.exports = g;\n  },\n  function(L, T, e) {\n    var u = e(249), A = e(250), w = e(251), E = e(252), y = e(253);\n    function x(g) {\n      var o = -1, c = g == null ? 0 : g.length;\n      for (this.clear(); ++o < c; ) {\n        var a = g[o];\n        this.set(a[0], a[1]);\n      }\n    }\n    x.prototype.clear = u, x.prototype.delete = A, x.prototype.get = w, x.prototype.has = E, x.prototype.set = y, L.exports = x;\n  },\n  function(L, T, e) {\n    var u = e(57);\n    L.exports = function(A, w) {\n      for (var E = A.length; E--; ) if (u(A[E][0], w)) return E;\n      return -1;\n    };\n  },\n  function(L, T, e) {\n    var u = e(46)(Object, \"create\");\n    L.exports = u;\n  },\n  function(L, T, e) {\n    var u = e(273);\n    L.exports = function(A, w) {\n      var E = A.__data__;\n      return u(w) ? E[typeof w == \"string\" ? \"string\" : \"hash\"] : E.map;\n    };\n  },\n  function(L, T, e) {\n    var u = e(79), A = e(57), w = Object.prototype.hasOwnProperty;\n    L.exports = function(E, y, x) {\n      var g = E[y];\n      w.call(E, y) && A(g, x) && (x !== void 0 || y in E) || u(E, y, x);\n    };\n  },\n  function(L, T, e) {\n    var u = e(152);\n    L.exports = function(A, w, E) {\n      w == \"__proto__\" && u ? u(A, w, { configurable: !0, enumerable: !0, value: E, writable: !0 }) : A[w] = E;\n    };\n  },\n  function(L, T) {\n    L.exports = function(e) {\n      return e.webpackPolyfill || (e.deprecate = function() {\n      }, e.paths = [], e.children || (e.children = []), Object.defineProperty(e, \"loaded\", {\n        enumerable: !0,\n        get: function() {\n          return e.l;\n        }\n      }), Object.defineProperty(e, \"id\", {\n        enumerable: !0,\n        get: function() {\n          return e.i;\n        }\n      }), e.webpackPolyfill = 1), e;\n    };\n  },\n  function(L, T) {\n    var e = /^(?:0|[1-9]\\d*)$/;\n    L.exports = function(u, A) {\n      var w = typeof u;\n      return !!(A = A ?? 9007199254740991) && (w == \"number\" || w != \"symbol\" && e.test(u)) && u > -1 && u % 1 == 0 && u < A;\n    };\n  },\n  function(L, T) {\n    L.exports = function(e) {\n      return function(u) {\n        return e(u);\n      };\n    };\n  },\n  function(L, T) {\n    var e = Object.prototype;\n    L.exports = function(u) {\n      var A = u && u.constructor;\n      return u === (typeof A == \"function\" && A.prototype || e);\n    };\n  },\n  function(L, T, e) {\n    var u = e(154)(Object.getPrototypeOf, Object);\n    L.exports = u;\n  },\n  function(L, T, e) {\n    var u = e(127), A = e(302)(u);\n    L.exports = A;\n  },\n  function(L, T, e) {\n    var u = e(87), A = e(68);\n    L.exports = function(w, E) {\n      for (var y = 0, x = (E = u(E, w)).length; w != null && y < x; )\n        w = w[A(E[y++])];\n      return y && y == x ? w : void 0;\n    };\n  },\n  function(L, T, e) {\n    var u = e(13), A = e(130), w = e(316), E = e(177);\n    L.exports = function(y, x) {\n      return u(y) ? y : A(y, x) ? [y] : w(E(y));\n    };\n  },\n  function(L, T) {\n    L.exports = function(e, u) {\n      for (var A = -1, w = e == null ? 0 : e.length, E = Array(w); ++A < w; )\n        E[A] = u(e[A], A, e);\n      return E;\n    };\n  },\n  function(L, T, e) {\n    var u = e(49), A = e(186), w = e(187);\n    L.exports = function(E, y) {\n      return w(A(E, y, u), E + \"\");\n    };\n  },\n  function(L, T, e) {\n    var u = e(57), A = e(36), w = e(81), E = e(23);\n    L.exports = function(y, x, g) {\n      if (!E(g)) return !1;\n      var o = typeof x;\n      return !!(o == \"number\" ? A(g) && w(x, g.length) : o == \"string\" && x in g) && u(g[x], y);\n    };\n  },\n  function(L, T, e) {\n    var u = e(11);\n    L.exports = {\n      longestPath: function(A) {\n        var w = {};\n        u.forEach(A.sources(), function E(y) {\n          var x = A.node(y);\n          if (u.has(w, y)) return x.rank;\n          w[y] = !0;\n          var g = u.min(\n            u.map(A.outEdges(y), function(o) {\n              return E(o.w) - A.edge(o).minlen;\n            })\n          );\n          return g !== Number.POSITIVE_INFINITY && g != null || (g = 0), x.rank = g;\n        });\n      },\n      slack: function(A, w) {\n        return A.node(w.w).rank - A.node(w.v).rank - A.edge(w).minlen;\n      }\n    };\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return A;\n    });\n    var u = e(0), A = function() {\n      function w(E) {\n        E === void 0 && (E = {}), Object(u.r)(this, E);\n      }\n      return w.prototype.$inherit = function(E, y, x) {\n        var g, o = Object(u.f)(y, x), c = {}, a = [];\n        for (var n in o)\n          if (o[n] && o[n].params && (g = Object.keys(o[n].params)).length)\n            for (var t in g)\n              a.indexOf(g[t]) >= 0 || (a.push(g[t]), c[g[t]] = this[g[t]]);\n        return Object(u.r)({}, c, E);\n      }, w;\n    }();\n  },\n  function(L, T, e) {\n    e.d(T, \"b\", function() {\n      return l;\n    }), e.d(T, \"a\", function() {\n      return h;\n    });\n    var u = e(0), A = e(1), w = e(7), E = e(3), y = e(15), x = e(6);\n    function g(i) {\n      return i.name;\n    }\n    function o(i) {\n      return i.self.$$state = function() {\n        return i;\n      }, i.self;\n    }\n    function c(i) {\n      return i.parent && i.parent.data && (i.data = i.self.data = Object(u.A)(i.parent.data, i.data)), i.data;\n    }\n    var a = function(i, d) {\n      return function(p) {\n        var f = p.self;\n        if (f && f.url && f.name && f.name.match(/\\.\\*\\*$/)) {\n          var v = {};\n          Object(u.m)(f, v), v.url += \"{remainder:any}\", f = v;\n        }\n        var k = p.parent, s = function(j) {\n          if (!Object(A.l)(j)) return !1;\n          var I = j.charAt(0) === \"^\";\n          return { val: I ? j.substring(1) : j, root: I };\n        }(f.url), S = s ? i.compile(s.val, { state: f }) : f.url;\n        if (!S) return null;\n        if (!i.isMatcher(S))\n          throw new Error(\"Invalid url '\" + S + \"' in state '\" + p + \"'\");\n        return s && s.root ? S : (k && k.navigable || d()).url.append(S);\n      };\n    }, n = function(i) {\n      return function(d) {\n        return !i(d) && d.url ? d : d.parent ? d.parent.navigable : null;\n      };\n    };\n    function t(i) {\n      return i.parent ? i.parent.path.concat(i) : [i];\n    }\n    function r(i) {\n      var d = i.parent ? Object(u.r)({}, i.parent.includes) : {};\n      return d[i.name] = !0, d;\n    }\n    function l(i) {\n      var d, p, f = function(j) {\n        return j.provide || j.token;\n      }, v = Object(E.l)([\n        [\n          Object(E.n)(\"resolveFn\"),\n          function(j) {\n            return new y.a(f(j), j.resolveFn, j.deps, j.policy);\n          }\n        ],\n        [\n          Object(E.n)(\"useFactory\"),\n          function(j) {\n            return new y.a(\n              f(j),\n              j.useFactory,\n              j.deps || j.dependencies,\n              j.policy\n            );\n          }\n        ],\n        [\n          Object(E.n)(\"useClass\"),\n          function(j) {\n            return new y.a(\n              f(j),\n              function() {\n                return new j.useClass();\n              },\n              [],\n              j.policy\n            );\n          }\n        ],\n        [\n          Object(E.n)(\"useValue\"),\n          function(j) {\n            return new y.a(\n              f(j),\n              function() {\n                return j.useValue;\n              },\n              [],\n              j.policy,\n              j.useValue\n            );\n          }\n        ],\n        [\n          Object(E.n)(\"useExisting\"),\n          function(j) {\n            return new y.a(f(j), u.y, [j.useExisting], j.policy);\n          }\n        ]\n      ]), k = Object(E.l)([\n        [\n          Object(E.m)(Object(E.n)(\"val\"), A.l),\n          function(j) {\n            return new y.a(j.token, u.y, [j.val], j.policy);\n          }\n        ],\n        [\n          Object(E.m)(Object(E.n)(\"val\"), A.a),\n          function(j) {\n            return new y.a(\n              j.token,\n              Object(u.P)(j.val),\n              j.val.slice(0, -1),\n              j.policy\n            );\n          }\n        ],\n        [\n          Object(E.m)(Object(E.n)(\"val\"), A.d),\n          function(j) {\n            return new y.a(\n              j.token,\n              j.val,\n              (I = j.val, R = x.b.$injector, I.$inject || R && R.annotate(I, R.strictDi) || \"deferred\"),\n              j.policy\n            );\n            var I, R;\n          }\n        ]\n      ]), s = Object(E.l)([\n        [\n          Object(E.h)(y.a),\n          function(j) {\n            return j;\n          }\n        ],\n        [\n          function(j) {\n            return !(!j.token || !j.resolveFn);\n          },\n          v\n        ],\n        [\n          function(j) {\n            return !(!j.provide && !j.token || !(j.useValue || j.useFactory || j.useExisting || j.useClass));\n          },\n          v\n        ],\n        [\n          function(j) {\n            return !!(j && j.val && (Object(A.l)(j.val) || Object(A.a)(j.val) || Object(A.d)(j.val)));\n          },\n          k\n        ],\n        [\n          Object(E.p)(!0),\n          function(j) {\n            throw new Error(\"Invalid resolve value: \" + Object(w.m)(j));\n          }\n        ]\n      ]), S = i.resolve;\n      return (Object(A.a)(S) ? S : (d = S, p = i.resolvePolicy || {}, Object.keys(d || {}).map(function(j) {\n        return { token: j, val: d[j], deps: void 0, policy: p[j] };\n      }))).map(s);\n    }\n    var h = function() {\n      function i(d, p) {\n        this.matcher = d;\n        var f, v = this, k = function() {\n          return d.find(\"\");\n        }, s = function(S) {\n          return S.name === \"\";\n        };\n        this.builders = {\n          name: [g],\n          self: [o],\n          parent: [\n            function(S) {\n              return s(S) ? null : d.find(v.parentName(S)) || k();\n            }\n          ],\n          data: [c],\n          url: [a(p, k)],\n          navigable: [n(s)],\n          params: [\n            (f = p.paramFactory, function(S) {\n              var j = S.url && S.url.parameters({ inherit: !1 }) || [], I = Object(u.U)(\n                Object(u.C)(\n                  Object(u.F)(S.params || {}, j.map(Object(E.n)(\"id\"))),\n                  function(R, M) {\n                    return f.fromConfig(M, null, S.self);\n                  }\n                )\n              );\n              return j.concat(I).map(function(R) {\n                return [R.id, R];\n              }).reduce(u.h, {});\n            })\n          ],\n          views: [],\n          path: [t],\n          includes: [r],\n          resolvables: [l]\n        };\n      }\n      return i.prototype.builder = function(d, p) {\n        var f = this.builders, v = f[d] || [];\n        return Object(A.l)(d) && !Object(A.c)(p) ? v.length > 1 ? v : v[0] : Object(A.l)(d) && Object(A.d)(p) ? (f[d] = v, f[d].push(p), function() {\n          return f[d].splice(f[d].indexOf(p, 1)) && null;\n        }) : void 0;\n      }, i.prototype.build = function(d) {\n        var p = this.matcher, f = this.builders, v = this.parentName(d);\n        if (v && !p.find(v, void 0, !1)) return null;\n        for (var k in f)\n          if (f.hasOwnProperty(k)) {\n            var s = f[k].reduce(function(S, j) {\n              return function(I) {\n                return j(I, S);\n              };\n            }, u.E);\n            d[k] = s(d);\n          }\n        return d;\n      }, i.prototype.parentName = function(d) {\n        var p = d.name || \"\", f = p.split(\".\");\n        if (f.pop() === \"**\" && f.pop(), f.length) {\n          if (d.parent)\n            throw new Error(\n              \"States that specify the 'parent:' property should not have a '.' in their name (\" + p + \")\"\n            );\n          return f.join(\".\");\n        }\n        return d.parent ? Object(A.l)(d.parent) ? d.parent : d.parent.name : \"\";\n      }, i.prototype.name = function(d) {\n        var p = d.name;\n        if (p.indexOf(\".\") !== -1 || !d.parent) return p;\n        var f = Object(A.l)(d.parent) ? d.parent : d.parent.name;\n        return f ? f + \".\" + p : p;\n      }, i;\n    }();\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return E;\n    });\n    var u = e(1), A = e(0), w = e(19), E = function() {\n      function y(x) {\n        this._states = x;\n      }\n      return y.prototype.isRelative = function(x) {\n        return (x = x || \"\").indexOf(\".\") === 0 || x.indexOf(\"^\") === 0;\n      }, y.prototype.find = function(x, g, o) {\n        if (o === void 0 && (o = !0), x || x === \"\") {\n          var c = Object(u.l)(x), a = c ? x : x.name;\n          this.isRelative(a) && (a = this.resolvePath(a, g));\n          var n = this._states[a];\n          if (n && (c || !(c || n !== x && n.self !== x))) return n;\n          if (c && o) {\n            var t = Object(A.U)(this._states).filter(function(r) {\n              return r.__stateObjectCache.nameGlob && r.__stateObjectCache.nameGlob.matches(a);\n            });\n            return t.length > 1 && w.a.error(\n              \"stateMatcher.find: Found multiple matches for \" + a + \" using glob: \",\n              t.map(function(r) {\n                return r.name;\n              })\n            ), t[0];\n          }\n        }\n      }, y.prototype.resolvePath = function(x, g) {\n        if (!g)\n          throw new Error(\"No reference point given for path '\" + x + \"'\");\n        for (var o = this.find(g), c = x.split(\".\"), a = c.length, n = 0, t = o; n < a; n++)\n          if (c[n] !== \"\" || n !== 0) {\n            if (c[n] !== \"^\") break;\n            if (!t.parent)\n              throw new Error(\n                \"Path '\" + x + \"' not valid for state '\" + o.name + \"'\"\n              );\n            t = t.parent;\n          } else t = o;\n        var r = c.slice(n).join(\".\");\n        return t.name + (t.name && r ? \".\" : \"\") + r;\n      }, y;\n    }();\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return w;\n    });\n    var u = e(4), A = e(44), w = function() {\n      function E(y, x, g, o) {\n        this.router = y, this.states = x, this.builder = g, this.listeners = o, this.queue = [];\n      }\n      return E.prototype.dispose = function() {\n        this.queue = [];\n      }, E.prototype.register = function(y) {\n        var x = this.queue, g = A.a.create(y), o = g.name;\n        if (!Object(u.cb)(o))\n          throw new Error(\"State must have a valid name\");\n        if (this.states.hasOwnProperty(o) || Object(u.N)(x.map(Object(u.wb)(\"name\")), o))\n          throw new Error(\"State '\" + o + \"' is already defined\");\n        return x.push(g), this.flush(), g;\n      }, E.prototype.flush = function() {\n        for (var y = this, x = this.queue, g = this.states, o = this.builder, c = [], a = [], n = {}, t = function(k) {\n          return y.states.hasOwnProperty(k) && y.states[k];\n        }, r = function() {\n          c.length && y.listeners.forEach(function(k) {\n            return k(\n              \"registered\",\n              c.map(function(s) {\n                return s.self;\n              })\n            );\n          });\n        }; x.length > 0; ) {\n          var l = x.shift(), h = l.name, i = o.build(l), d = a.indexOf(l);\n          if (i) {\n            var p = t(h);\n            if (p && p.name === h)\n              throw new Error(\"State '\" + h + \"' is already defined\");\n            var f = t(h + \".**\");\n            f && this.router.stateRegistry.deregister(f), g[h] = l, this.attachRoute(l), d >= 0 && a.splice(d, 1), c.push(l);\n          } else {\n            var v = n[h];\n            if (n[h] = x.length, d >= 0 && v === x.length)\n              return x.push(l), r(), g;\n            d < 0 && a.push(l), x.push(l);\n          }\n        }\n        return r(), g;\n      }, E.prototype.attachRoute = function(y) {\n        if (!y.abstract && y.url) {\n          var x = this.router.urlService.rules;\n          x.rule(x.urlRuleFactory.create(y));\n        }\n      }, E;\n    }();\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return x;\n    });\n    var u = e(94), A = e(93), w = e(95), E = e(0), y = e(3), x = function() {\n      function g(o) {\n        this.router = o, this.states = {}, this.listeners = [], this.matcher = new u.a(this.states), this.builder = new A.a(this.matcher, o.urlMatcherFactory), this.stateQueue = new w.a(\n          o,\n          this.states,\n          this.builder,\n          this.listeners\n        ), this._registerRoot();\n      }\n      return g.prototype._registerRoot = function() {\n        (this._root = this.stateQueue.register({\n          name: \"\",\n          url: \"^\",\n          views: null,\n          params: { \"#\": { value: null, type: \"hash\", dynamic: !0 } },\n          abstract: !0\n        })).navigable = null;\n      }, g.prototype.dispose = function() {\n        var o = this;\n        this.stateQueue.dispose(), this.listeners = [], this.get().forEach(function(c) {\n          return o.get(c) && o.deregister(c);\n        });\n      }, g.prototype.onStatesChanged = function(o) {\n        return this.listeners.push(o), (function() {\n          Object(E.L)(this.listeners)(o);\n        }).bind(this);\n      }, g.prototype.root = function() {\n        return this._root;\n      }, g.prototype.register = function(o) {\n        return this.stateQueue.register(o);\n      }, g.prototype._deregisterTree = function(o) {\n        var c = this, a = this.get().map(function(l) {\n          return l.$$state();\n        }), n = function(l) {\n          var h = a.filter(function(i) {\n            return l.indexOf(i.parent) !== -1;\n          });\n          return h.length === 0 ? h : h.concat(n(h));\n        }, t = n([o]), r = [o].concat(t).reverse();\n        return r.forEach(function(l) {\n          var h = c.router.urlService.rules;\n          h.rules().filter(Object(y.o)(\"state\", l)).forEach(function(i) {\n            return h.removeRule(i);\n          }), delete c.states[l.name];\n        }), r;\n      }, g.prototype.deregister = function(o) {\n        var c = this.get(o);\n        if (!c) throw new Error(\"Can't deregister state; not found: \" + o);\n        var a = this._deregisterTree(c.$$state());\n        return this.listeners.forEach(function(n) {\n          return n(\n            \"deregistered\",\n            a.map(function(t) {\n              return t.self;\n            })\n          );\n        }), a;\n      }, g.prototype.get = function(o, c) {\n        var a = this;\n        if (arguments.length === 0)\n          return Object.keys(this.states).map(function(t) {\n            return a.states[t].self;\n          });\n        var n = this.matcher.find(o, c);\n        return n && n.self || null;\n      }, g.prototype.decorator = function(o, c) {\n        return this.builder.builder(o, c);\n      }, g;\n    }();\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return h;\n    });\n    var u = e(0), A = e(1), w = e(50), E = e(6), y = e(18), x = e(52), g = e(56), o = e(8), c = e(24), a = e(16), n = e(62), t = e(25), r = e(115), l = e(3), h = function() {\n      function i(d) {\n        this.router = d, this.invalidCallbacks = [], this._defaultErrorHandler = function(f) {\n          f instanceof Error && f.stack ? (console.error(f), console.error(f.stack)) : f instanceof o.b ? (console.error(f.toString()), f.detail && f.detail.stack && console.error(f.detail.stack)) : console.error(f);\n        };\n        var p = Object.keys(i.prototype).filter(\n          Object(l.i)(\n            Object(u.z)([\"current\", \"$current\", \"params\", \"transition\"])\n          )\n        );\n        Object(u.n)(Object(l.p)(i.prototype), this, Object(l.p)(this), p);\n      }\n      return Object.defineProperty(i.prototype, \"transition\", {\n        get: function() {\n          return this.router.globals.transition;\n        },\n        enumerable: !1,\n        configurable: !0\n      }), Object.defineProperty(i.prototype, \"params\", {\n        get: function() {\n          return this.router.globals.params;\n        },\n        enumerable: !1,\n        configurable: !0\n      }), Object.defineProperty(i.prototype, \"current\", {\n        get: function() {\n          return this.router.globals.current;\n        },\n        enumerable: !1,\n        configurable: !0\n      }), Object.defineProperty(i.prototype, \"$current\", {\n        get: function() {\n          return this.router.globals.$current;\n        },\n        enumerable: !1,\n        configurable: !0\n      }), i.prototype.dispose = function() {\n        this.defaultErrorHandler(u.E), this.invalidCallbacks = [];\n      }, i.prototype._handleInvalidTargetState = function(d, p) {\n        var f = this, v = y.a.makeTargetState(this.router.stateRegistry, d), k = this.router.globals, s = function() {\n          return k.transitionHistory.peekTail();\n        }, S = s(), j = new w.a(this.invalidCallbacks.slice()), I = new t.b(d).injector(), R = function(M) {\n          if (M instanceof c.a) {\n            var z = M;\n            return (z = f.target(\n              z.identifier(),\n              z.params(),\n              z.options()\n            )).valid() ? s() !== S ? o.b.superseded().toPromise() : f.transitionTo(z.identifier(), z.params(), z.options()) : o.b.invalid(z.error()).toPromise();\n          }\n        };\n        return function M() {\n          var z = j.dequeue();\n          return z === void 0 ? o.b.invalid(p.error()).toPromise() : E.b.$q.when(z(p, v, I)).then(R).then(function(V) {\n            return V || M();\n          });\n        }();\n      }, i.prototype.onInvalid = function(d) {\n        return this.invalidCallbacks.push(d), (function() {\n          Object(u.L)(this.invalidCallbacks)(d);\n        }).bind(this);\n      }, i.prototype.reload = function(d) {\n        return this.transitionTo(this.current, this.params, {\n          reload: !Object(A.c)(d) || d,\n          inherit: !1,\n          notify: !1\n        });\n      }, i.prototype.go = function(d, p, f) {\n        var v = { relative: this.$current, inherit: !0 }, k = Object(u.o)(f, v, g.b);\n        return this.transitionTo(d, p, k);\n      }, i.prototype.target = function(d, p, f) {\n        if (f === void 0 && (f = {}), Object(A.i)(f.reload) && !f.reload.name)\n          throw new Error(\"Invalid reload state object\");\n        var v = this.router.stateRegistry;\n        if (f.reloadState = f.reload === !0 ? v.root() : v.matcher.find(f.reload, f.relative), f.reload && !f.reloadState)\n          throw new Error(\n            \"No such reload state '\" + (Object(A.l)(f.reload) ? f.reload : f.reload.name) + \"'\"\n          );\n        return new c.a(this.router.stateRegistry, d, p, f);\n      }, i.prototype.getCurrentPath = function() {\n        var d = this, p = this.router.globals.successfulTransitions.peekTail();\n        return p ? p.treeChanges().to : [new x.a(d.router.stateRegistry.root())];\n      }, i.prototype.transitionTo = function(d, p, f) {\n        var v = this;\n        p === void 0 && (p = {}), f === void 0 && (f = {});\n        var k = this.router, s = k.globals;\n        f = Object(u.o)(f, g.b);\n        var S = function() {\n          return s.transition;\n        };\n        f = Object(u.r)(f, { current: S });\n        var j = this.target(d, p, f), I = this.getCurrentPath();\n        if (!j.exists()) return this._handleInvalidTargetState(I, j);\n        if (!j.valid()) return Object(u.O)(j.error());\n        if (f.supercede === !1 && S())\n          return o.b.ignored(\n            \"Another transition is in progress and supercede has been set to false in TransitionOptions for the transition. So the transition was ignored in favour of the existing one in progress.\"\n          ).toPromise();\n        var R = function(V) {\n          return function(G) {\n            if (G instanceof o.b) {\n              var Y = k.globals.lastStartedTransitionId <= V.$id;\n              if (G.type === o.a.IGNORED)\n                return Y && k.urlRouter.update(), E.b.$q.when(s.current);\n              var tt = G.detail;\n              if (G.type === o.a.SUPERSEDED && G.redirected && tt instanceof c.a) {\n                var Z = V.redirect(tt);\n                return Z.run().catch(R(Z));\n              }\n              if (G.type === o.a.ABORTED)\n                return Y && k.urlRouter.update(), E.b.$q.reject(G);\n            }\n            return v.defaultErrorHandler()(G), E.b.$q.reject(G);\n          };\n        }, M = this.router.transitionService.create(I, j), z = M.run().catch(R(M));\n        return Object(u.N)(z), Object(u.r)(z, { transition: M });\n      }, i.prototype.is = function(d, p, f) {\n        f = Object(u.o)(f, { relative: this.$current });\n        var v = this.router.stateRegistry.matcher.find(d, f.relative);\n        if (Object(A.c)(v)) {\n          if (this.$current !== v) return !1;\n          if (!p) return !0;\n          var k = v.parameters({ inherit: !0, matchingKeys: p });\n          return a.b.equals(k, a.b.values(k, p), this.params);\n        }\n      }, i.prototype.includes = function(d, p, f) {\n        f = Object(u.o)(f, { relative: this.$current });\n        var v = Object(A.l)(d) && n.a.fromString(d);\n        if (v) {\n          if (!v.matches(this.$current.name)) return !1;\n          d = this.$current.name;\n        }\n        var k = this.router.stateRegistry.matcher.find(d, f.relative), s = this.$current.includes;\n        if (Object(A.c)(k)) {\n          if (!Object(A.c)(s[k.name])) return !1;\n          if (!p) return !0;\n          var S = k.parameters({ inherit: !0, matchingKeys: p });\n          return a.b.equals(S, a.b.values(S, p), this.params);\n        }\n      }, i.prototype.href = function(d, p, f) {\n        var v = {\n          lossy: !0,\n          inherit: !0,\n          absolute: !1,\n          relative: this.$current\n        };\n        f = Object(u.o)(f, v), p = p || {};\n        var k = this.router.stateRegistry.matcher.find(d, f.relative);\n        if (!Object(A.c)(k)) return null;\n        f.inherit && (p = this.params.$inherit(p, this.$current, k));\n        var s = k && f.lossy ? k.navigable : k;\n        return s && s.url !== void 0 && s.url !== null ? this.router.urlRouter.href(s.url, p, { absolute: f.absolute }) : null;\n      }, i.prototype.defaultErrorHandler = function(d) {\n        return this._defaultErrorHandler = d || this._defaultErrorHandler;\n      }, i.prototype.get = function(d, p) {\n        var f = this.router.stateRegistry;\n        return arguments.length === 0 ? f.get() : f.get(d, p || this.$current);\n      }, i.prototype.lazyLoad = function(d, p) {\n        var f = this.get(d);\n        if (!f || !f.lazyLoad) throw new Error(\"Can not lazy load \" + d);\n        var v = this.getCurrentPath(), k = y.a.makeTargetState(this.router.stateRegistry, v);\n        return p = p || this.router.transitionService.create(v, k), Object(r.a)(p, f);\n      }, i;\n    }();\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return y;\n    });\n    var u = e(0), A = e(1), w = e(14), E = e(17), y = function() {\n      function x(g) {\n        this.transition = g;\n      }\n      return x.prototype.buildHooksForPhase = function(g) {\n        var o = this;\n        return this.transition.router.transitionService._pluginapi._getEvents(g).map(function(c) {\n          return o.buildHooks(c);\n        }).reduce(u.T, []).filter(u.y);\n      }, x.prototype.buildHooks = function(g) {\n        var o = this.transition, c = o.treeChanges(), a = this.getMatchingHooks(g, c, o);\n        if (!a) return [];\n        var n = { transition: o, current: o.options().current };\n        return a.map(function(t) {\n          return t.matches(c, o)[g.criteriaMatchPath.name].map(function(r) {\n            var l = Object(u.r)(\n              {\n                bind: t.bind,\n                traceData: { hookType: g.name, context: r }\n              },\n              n\n            ), h = g.criteriaMatchPath.scope === w.b.STATE ? r.state.self : null, i = new E.a(o, h, t, l);\n            return { hook: t, node: r, transitionHook: i };\n          });\n        }).reduce(u.T, []).sort(\n          function(t) {\n            return t === void 0 && (t = !1), function(r, l) {\n              var h = t ? -1 : 1, i = (r.node.state.path.length - l.node.state.path.length) * h;\n              return i !== 0 ? i : l.hook.priority - r.hook.priority;\n            };\n          }(g.reverseSort)\n        ).map(function(t) {\n          return t.transitionHook;\n        });\n      }, x.prototype.getMatchingHooks = function(g, o, c) {\n        var a = g.hookPhase === w.a.CREATE, n = this.transition.router.transitionService;\n        return (a ? [n] : [this.transition, n]).map(function(t) {\n          return t.getHooks(g.name);\n        }).filter(Object(u.l)(A.a, \"broken event named: \" + g.name)).reduce(u.T, []).filter(function(t) {\n          return t.matches(o, c);\n        });\n      }, x;\n    }();\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return i;\n    });\n    var u = e(100), A = e(101), w = e(56), E = e(102), y = e(96), x = e(97), g = e(103), o = e(0), c = e(1), a = e(104), n = e(10), t = e(4), r = 0, l = Object(t.gb)(\"LocationServices\", [\n      \"url\",\n      \"path\",\n      \"search\",\n      \"hash\",\n      \"onChange\"\n    ]), h = Object(t.gb)(\"LocationConfig\", [\n      \"port\",\n      \"protocol\",\n      \"host\",\n      \"baseHref\",\n      \"html5Mode\",\n      \"hashPrefix\"\n    ]), i = function() {\n      function d(p, f) {\n        p === void 0 && (p = l), f === void 0 && (f = h), this.locationService = p, this.locationConfig = f, this.$id = r++, this._disposed = !1, this._disposables = [], this.trace = n.c, this.viewService = new E.a(this), this.globals = new g.a(), this.transitionService = new w.a(this), this.urlMatcherFactory = new u.b(this), this.urlRouter = new A.a(this), this.urlService = new a.a(this), this.stateRegistry = new y.a(this), this.stateService = new x.a(this), this._plugins = {}, this.viewService._pluginapi._rootViewContext(\n          this.stateRegistry.root()\n        ), this.globals.$current = this.stateRegistry.root(), this.globals.current = this.globals.$current.self, this.disposable(this.globals), this.disposable(this.stateService), this.disposable(this.stateRegistry), this.disposable(this.transitionService), this.disposable(this.urlService), this.disposable(p), this.disposable(f);\n      }\n      return d.prototype.disposable = function(p) {\n        this._disposables.push(p);\n      }, d.prototype.dispose = function(p) {\n        var f = this;\n        p && Object(c.d)(p.dispose) ? p.dispose(this) : (this._disposed = !0, this._disposables.slice().forEach(function(v) {\n          try {\n            typeof v.dispose == \"function\" && v.dispose(f), Object(o.L)(f._disposables, v);\n          } catch {\n          }\n        }));\n      }, d.prototype.plugin = function(p, f) {\n        f === void 0 && (f = {});\n        var v = new p(this, f);\n        if (!v.name)\n          throw new Error(\n            \"Required property `name` missing on plugin: \" + v\n          );\n        return this._disposables.push(v), this._plugins[v.name] = v;\n      }, d.prototype.getPlugin = function(p) {\n        return p ? this._plugins[p] : Object(o.U)(this._plugins);\n      }, d;\n    }();\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return y;\n    }), e.d(T, \"b\", function() {\n      return x;\n    });\n    var u = e(4), A = e(32), w = e(26), E = function() {\n      return (E = Object.assign || function(g) {\n        for (var o, c = 1, a = arguments.length; c < a; c++)\n          for (var n in o = arguments[c])\n            Object.prototype.hasOwnProperty.call(o, n) && (g[n] = o[n]);\n        return g;\n      }).apply(this, arguments);\n    }, y = function() {\n      function g(o) {\n        this.router = o;\n      }\n      return g.prototype.fromConfig = function(o, c, a) {\n        return new w.Param(\n          o,\n          c,\n          w.DefType.CONFIG,\n          this.router.urlService.config,\n          a\n        );\n      }, g.prototype.fromPath = function(o, c, a) {\n        return new w.Param(\n          o,\n          c,\n          w.DefType.PATH,\n          this.router.urlService.config,\n          a\n        );\n      }, g.prototype.fromSearch = function(o, c, a) {\n        return new w.Param(\n          o,\n          c,\n          w.DefType.SEARCH,\n          this.router.urlService.config,\n          a\n        );\n      }, g;\n    }(), x = function() {\n      function g(o) {\n        var c = this;\n        this.router = o, this.paramFactory = new y(this.router), this.UrlMatcher = A.a, this.Param = w.Param, this.caseInsensitive = function(a) {\n          return c.router.urlService.config.caseInsensitive(a);\n        }, this.defaultSquashPolicy = function(a) {\n          return c.router.urlService.config.defaultSquashPolicy(a);\n        }, this.strictMode = function(a) {\n          return c.router.urlService.config.strictMode(a);\n        }, this.type = function(a, n, t) {\n          return c.router.urlService.config.type(a, n, t) || c;\n        };\n      }\n      return g.prototype.compile = function(o, c) {\n        var a = this.router.urlService.config, n = c && !c.state && c.params;\n        c = n ? E({ state: { params: n } }, c) : c;\n        var t = {\n          strict: a._isStrictMode,\n          caseInsensitive: a._isCaseInsensitive,\n          decodeParams: a._decodeParams\n        };\n        return new A.a(\n          o,\n          a.paramTypes,\n          this.paramFactory,\n          Object(u.C)(t, c)\n        );\n      }, g.prototype.isMatcher = function(o) {\n        if (!Object(u.Z)(o)) return !1;\n        var c = !0;\n        return Object(u.I)(A.a.prototype, function(a, n) {\n          Object(u.U)(a) && (c = c && Object(u.T)(o[n]) && Object(u.U)(o[n]));\n        }), c;\n      }, g.prototype.$get = function() {\n        var o = this.router.urlService.config;\n        return o.paramTypes.enqueue = !1, o.paramTypes._flushTypeQueue(), this;\n      }, g;\n    }();\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return w;\n    });\n    var u = e(4), A = e(54), w = function() {\n      function E(y) {\n        var x = this;\n        this.router = y, this.sync = function(g) {\n          return x.router.urlService.sync(g);\n        }, this.listen = function(g) {\n          return x.router.urlService.listen(g);\n        }, this.deferIntercept = function(g) {\n          return x.router.urlService.deferIntercept(g);\n        }, this.match = function(g) {\n          return x.router.urlService.match(g);\n        }, this.initial = function(g) {\n          return x.router.urlService.rules.initial(g);\n        }, this.otherwise = function(g) {\n          return x.router.urlService.rules.otherwise(g);\n        }, this.removeRule = function(g) {\n          return x.router.urlService.rules.removeRule(g);\n        }, this.rule = function(g) {\n          return x.router.urlService.rules.rule(g);\n        }, this.rules = function() {\n          return x.router.urlService.rules.rules();\n        }, this.sort = function(g) {\n          return x.router.urlService.rules.sort(g);\n        }, this.when = function(g, o, c) {\n          return x.router.urlService.rules.when(g, o, c);\n        }, this.urlRuleFactory = new A.b(y);\n      }\n      return E.prototype.update = function(y) {\n        var x = this.router.locationService;\n        y ? this.location = x.url() : x.url() !== this.location && x.url(this.location, !0);\n      }, E.prototype.push = function(y, x, g) {\n        var o = g && !!g.replace;\n        this.router.urlService.url(y.format(x || {}), o);\n      }, E.prototype.href = function(y, x, g) {\n        var o = y.format(x);\n        if (o == null) return null;\n        g = g || { absolute: !1 };\n        var c = this.router.urlService.config, a = c.html5Mode();\n        if (a || o === null || (o = \"#\" + c.hashPrefix() + o), o = function(l, h, i, d) {\n          return d === \"/\" ? l : h ? Object(u.Kb)(d) + l : i ? d.slice(1) + l : l;\n        }(o, a, g.absolute, c.baseHref()), !g.absolute || !o)\n          return o;\n        var n = !a && o ? \"/\" : \"\", t = c.port(), r = t === 80 || t === 443 ? \"\" : \":\" + t;\n        return [c.protocol(), \"://\", c.host(), r, n, o].join(\"\");\n      }, Object.defineProperty(E.prototype, \"interceptDeferred\", {\n        get: function() {\n          return this.router.urlService.interceptDeferred;\n        },\n        enumerable: !1,\n        configurable: !0\n      }), E;\n    }();\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return y;\n    });\n    var u = e(0), A = e(3), w = e(1), E = e(10), y = function() {\n      function x(g) {\n        var o = this;\n        this.router = g, this._uiViews = [], this._viewConfigs = [], this._viewConfigFactories = {}, this._listeners = [], this._pluginapi = {\n          _rootViewContext: this._rootViewContext.bind(this),\n          _viewConfigFactory: this._viewConfigFactory.bind(this),\n          _registeredUIView: function(c) {\n            return Object(u.t)(o._uiViews, function(a) {\n              return o.router.$id + \".\" + a.id === c;\n            });\n          },\n          _registeredUIViews: function() {\n            return o._uiViews;\n          },\n          _activeViewConfigs: function() {\n            return o._viewConfigs;\n          },\n          _onSync: function(c) {\n            return o._listeners.push(c), function() {\n              return Object(u.L)(o._listeners, c);\n            };\n          }\n        };\n      }\n      return x.normalizeUIViewTarget = function(g, o) {\n        o === void 0 && (o = \"\");\n        var c = o.split(\"@\"), a = c[0] || \"$default\", n = Object(w.l)(c[1]) ? c[1] : \"^\", t = /^(\\^(?:\\.\\^)*)\\.(.*$)/.exec(a);\n        if (t && (n = t[1], a = t[2]), a.charAt(0) === \"!\" && (a = a.substr(1), n = \"\"), /^(\\^(?:\\.\\^)*)$/.exec(n)) {\n          var r = n.split(\".\").reduce(function(l, h) {\n            return l.parent;\n          }, g);\n          n = r.name;\n        } else n === \".\" && (n = g.name);\n        return { uiViewName: a, uiViewContextAnchor: n };\n      }, x.prototype._rootViewContext = function(g) {\n        return this._rootContext = g || this._rootContext;\n      }, x.prototype._viewConfigFactory = function(g, o) {\n        this._viewConfigFactories[g] = o;\n      }, x.prototype.createViewConfig = function(g, o) {\n        var c = this._viewConfigFactories[o.$type];\n        if (!c)\n          throw new Error(\n            \"ViewService: No view config factory registered for type \" + o.$type\n          );\n        var a = c(g, o);\n        return Object(w.a)(a) ? a : [a];\n      }, x.prototype.deactivateViewConfig = function(g) {\n        E.c.traceViewServiceEvent(\"<- Removing\", g), Object(u.L)(this._viewConfigs, g);\n      }, x.prototype.activateViewConfig = function(g) {\n        E.c.traceViewServiceEvent(\"-> Registering\", g), this._viewConfigs.push(g);\n      }, x.prototype.sync = function() {\n        var g = this, o = this._uiViews.map(function(h) {\n          return [h.fqn, h];\n        }).reduce(u.h, {});\n        function c(h) {\n          for (var i = h.viewDecl.$context, d = 0; ++d && i.parent; )\n            i = i.parent;\n          return d;\n        }\n        var a = Object(A.e)(function(h, i, d, p) {\n          return i * (h(d) - h(p));\n        }), n = this._uiViews.sort(\n          a(function(h) {\n            var i = function(d) {\n              return d && d.parent ? i(d.parent) + 1 : 1;\n            };\n            return 1e4 * h.fqn.split(\".\").length + i(h.creationContext);\n          }, 1)\n        ).map(function(h) {\n          var i = g._viewConfigs.filter(x.matches(o, h));\n          return i.length > 1 && i.sort(a(c, -1)), { uiView: h, viewConfig: i[0] };\n        }), t = n.map(function(h) {\n          return h.viewConfig;\n        }), r = this._viewConfigs.filter(function(h) {\n          return !Object(u.z)(t, h);\n        }).map(function(h) {\n          return { uiView: void 0, viewConfig: h };\n        });\n        n.forEach(function(h) {\n          g._uiViews.indexOf(h.uiView) !== -1 && h.uiView.configUpdated(h.viewConfig);\n        });\n        var l = n.concat(r);\n        this._listeners.forEach(function(h) {\n          return h(l);\n        }), E.c.traceViewSync(l);\n      }, x.prototype.registerUIView = function(g) {\n        E.c.traceViewServiceUIViewEvent(\"-> Registering\", g);\n        var o = this._uiViews;\n        return o.filter(function(c) {\n          return c.fqn === g.fqn && c.$type === g.$type;\n        }).length && E.c.traceViewServiceUIViewEvent(\n          \"!!!! duplicate uiView named:\",\n          g\n        ), o.push(g), this.sync(), function() {\n          o.indexOf(g) !== -1 ? (E.c.traceViewServiceUIViewEvent(\"<- Deregistering\", g), Object(u.L)(o)(g)) : E.c.traceViewServiceUIViewEvent(\n            \"Tried removing non-registered uiView\",\n            g\n          );\n        };\n      }, x.prototype.available = function() {\n        return this._uiViews.map(Object(A.n)(\"fqn\"));\n      }, x.prototype.active = function() {\n        return this._uiViews.filter(Object(A.n)(\"$config\")).map(Object(A.n)(\"name\"));\n      }, x.matches = function(g, o) {\n        return function(c) {\n          if (o.$type !== c.viewDecl.$type) return !1;\n          var a = c.viewDecl, n = a.$uiViewName.split(\".\"), t = o.fqn.split(\".\");\n          if (!Object(u.q)(n, t.slice(0 - n.length))) return !1;\n          var r = 1 - n.length || void 0, l = t.slice(0, r).join(\".\"), h = g[l].creationContext;\n          return a.$uiViewContextAnchor === (h && h.name);\n        };\n      }, x;\n    }();\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return w;\n    });\n    var u = e(92), A = e(50), w = function() {\n      function E() {\n        this.params = new u.a(), this.lastStartedTransitionId = -1, this.transitionHistory = new A.a([], 1), this.successfulTransitions = new A.a([], 1);\n      }\n      return E.prototype.dispose = function() {\n        this.transitionHistory.clear(), this.successfulTransitions.clear(), this.transition = null;\n      }, E;\n    }();\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return y;\n    });\n    var u = e(4), A = e(105), w = e(106), E = e(43), y = function() {\n      function x(g) {\n        var o = this;\n        this.router = g, this.interceptDeferred = !1, this.rules = new A.a(this.router), this.config = new w.a(this.router), this.url = function(c, a, n) {\n          return o.router.locationService.url(c, a, n);\n        }, this.path = function() {\n          return o.router.locationService.path();\n        }, this.search = function() {\n          return o.router.locationService.search();\n        }, this.hash = function() {\n          return o.router.locationService.hash();\n        }, this.onChange = function(c) {\n          return o.router.locationService.onChange(c);\n        };\n      }\n      return x.prototype.dispose = function() {\n        this.listen(!1), this.rules.dispose();\n      }, x.prototype.parts = function() {\n        return {\n          path: this.path(),\n          search: this.search(),\n          hash: this.hash()\n        };\n      }, x.prototype.sync = function(g) {\n        if (!g || !g.defaultPrevented) {\n          var o = this.router, c = o.urlService, a = o.stateService, n = { path: c.path(), search: c.search(), hash: c.hash() }, t = this.match(n);\n          Object(u.sb)([\n            [\n              u.cb,\n              function(r) {\n                return c.url(r, !0);\n              }\n            ],\n            [\n              E.TargetState.isDef,\n              function(r) {\n                return a.go(r.state, r.params, r.options);\n              }\n            ],\n            [\n              Object(u.Q)(E.TargetState),\n              function(r) {\n                return a.go(r.state(), r.params(), r.options());\n              }\n            ]\n          ])(t && t.rule.handler(t.match, n, this.router));\n        }\n      }, x.prototype.listen = function(g) {\n        var o = this;\n        if (g !== !1)\n          return this._stopListeningFn = this._stopListeningFn || this.router.urlService.onChange(function(c) {\n            return o.sync(c);\n          });\n        this._stopListeningFn && this._stopListeningFn(), delete this._stopListeningFn;\n      }, x.prototype.deferIntercept = function(g) {\n        g === void 0 && (g = !0), this.interceptDeferred = g;\n      }, x.prototype.match = function(g) {\n        var o = this;\n        g = Object(u.C)({ path: \"\", search: {}, hash: \"\" }, g);\n        for (var c, a, n, t = this.rules.rules(), r = 0; r < t.length && (!c || c.rule._group === t[r]._group); r++) {\n          var l = (a = t[r], n = void 0, (n = a.match(g, o.router)) && {\n            match: n,\n            rule: a,\n            weight: a.matchPriority(n)\n          });\n          c = !c || l && l.weight > c.weight ? l : c;\n        }\n        return c;\n      }, x;\n    }();\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return g;\n    });\n    var u, A = e(43), w = e(32), E = e(4), y = e(54);\n    function x(o) {\n      if (!(Object(E.U)(o) || Object(E.cb)(o) || Object(E.Q)(A.TargetState)(o) || A.TargetState.isDef(o)))\n        throw new Error(\n          \"'handler' must be a string, function, TargetState, or have a state: 'newtarget' property\"\n        );\n      return Object(E.U)(o) ? o : Object(E.Sb)(o);\n    }\n    u = function(o, c) {\n      var a = function(n, t) {\n        return (t.priority || 0) - (n.priority || 0);\n      }(o, c);\n      return a !== 0 || (a = function(n, t) {\n        var r = { STATE: 4, URLMATCHER: 4, REGEXP: 3, RAW: 2, OTHER: 1 };\n        return (r[n.type] || 0) - (r[t.type] || 0);\n      }(o, c)) !== 0 || (a = function(n, t) {\n        return n.urlMatcher && t.urlMatcher ? w.a.compare(n.urlMatcher, t.urlMatcher) : 0;\n      }(o, c)) !== 0 ? a : function(n, t) {\n        var r = { STATE: !0, URLMATCHER: !0 };\n        return r[n.type] && r[t.type] ? 0 : (n.$id || 0) - (t.$id || 0);\n      }(o, c);\n    };\n    var g = function() {\n      function o(c) {\n        this.router = c, this._sortFn = u, this._rules = [], this._id = 0, this.urlRuleFactory = new y.b(c);\n      }\n      return o.prototype.dispose = function(c) {\n        this._rules = [], delete this._otherwiseFn;\n      }, o.prototype.initial = function(c) {\n        var a = x(c);\n        this.rule(\n          this.urlRuleFactory.create(function(n, t) {\n            return t.globals.transitionHistory.size() === 0 && !!/^\\/?$/.exec(n.path);\n          }, a)\n        );\n      }, o.prototype.otherwise = function(c) {\n        var a = x(c);\n        this._otherwiseFn = this.urlRuleFactory.create(Object(E.Sb)(!0), a), this._sorted = !1;\n      }, o.prototype.removeRule = function(c) {\n        Object(E.Ab)(this._rules, c);\n      }, o.prototype.rule = function(c) {\n        var a = this;\n        if (!y.b.isUrlRule(c)) throw new Error(\"invalid rule\");\n        return c.$id = this._id++, c.priority = c.priority || 0, this._rules.push(c), this._sorted = !1, function() {\n          return a.removeRule(c);\n        };\n      }, o.prototype.rules = function() {\n        return this.ensureSorted(), this._rules.concat(this._otherwiseFn ? [this._otherwiseFn] : []);\n      }, o.prototype.sort = function(c) {\n        for (var a = this.stableSort(\n          this._rules,\n          this._sortFn = c || this._sortFn\n        ), n = 0, t = 0; t < a.length; t++)\n          a[t]._group = n, t < a.length - 1 && this._sortFn(a[t], a[t + 1]) !== 0 && n++;\n        this._rules = a, this._sorted = !0;\n      }, o.prototype.ensureSorted = function() {\n        this._sorted || this.sort();\n      }, o.prototype.stableSort = function(c, a) {\n        var n = c.map(function(t, r) {\n          return { elem: t, idx: r };\n        });\n        return n.sort(function(t, r) {\n          var l = a(t.elem, r.elem);\n          return l === 0 ? t.idx - r.idx : l;\n        }), n.map(function(t) {\n          return t.elem;\n        });\n      }, o.prototype.when = function(c, a, n) {\n        var t = this.urlRuleFactory.create(c, a);\n        return Object(E.T)(n && n.priority) && (t.priority = n.priority), this.rule(t), t;\n      }, o;\n    }();\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return w;\n    });\n    var u = e(26), A = e(4), w = function() {\n      function E(y) {\n        var x = this;\n        this.router = y, this.paramTypes = new u.ParamTypes(), this._decodeParams = !0, this._isCaseInsensitive = !1, this._isStrictMode = !0, this._defaultSquashPolicy = !1, this.dispose = function() {\n          return x.paramTypes.dispose();\n        }, this.baseHref = function() {\n          return x.router.locationConfig.baseHref();\n        }, this.hashPrefix = function(g) {\n          return x.router.locationConfig.hashPrefix(g);\n        }, this.host = function() {\n          return x.router.locationConfig.host();\n        }, this.html5Mode = function() {\n          return x.router.locationConfig.html5Mode();\n        }, this.port = function() {\n          return x.router.locationConfig.port();\n        }, this.protocol = function() {\n          return x.router.locationConfig.protocol();\n        };\n      }\n      return E.prototype.caseInsensitive = function(y) {\n        return this._isCaseInsensitive = Object(A.T)(y) ? y : this._isCaseInsensitive;\n      }, E.prototype.defaultSquashPolicy = function(y) {\n        if (Object(A.T)(y) && y !== !0 && y !== !1 && !Object(A.cb)(y))\n          throw new Error(\n            \"Invalid squash policy: \" + y + \". Valid policies: false, true, arbitrary-string\"\n          );\n        return this._defaultSquashPolicy = Object(A.T)(y) ? y : this._defaultSquashPolicy;\n      }, E.prototype.strictMode = function(y) {\n        return this._isStrictMode = Object(A.T)(y) ? y : this._isStrictMode;\n      }, E.prototype.type = function(y, x, g) {\n        var o = this.paramTypes.type(y, x, g);\n        return Object(A.T)(x) ? this : o;\n      }, E;\n    }();\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return A;\n    });\n    var u = e(17), A = function(w, E, y, x, g, o, c, a) {\n      g === void 0 && (g = !1), o === void 0 && (o = u.a.HANDLE_RESULT), c === void 0 && (c = u.a.REJECT_ERROR), a === void 0 && (a = !1), this.name = w, this.hookPhase = E, this.hookOrder = y, this.criteriaMatchPath = x, this.reverseSort = g, this.getResultHandler = o, this.getErrorHandler = c, this.synchronous = a;\n    };\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return y;\n    });\n    var u, A = e(4), w = e(42), E = (u = function(x, g) {\n      return (u = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(o, c) {\n        o.__proto__ = c;\n      } || function(o, c) {\n        for (var a in c) c.hasOwnProperty(a) && (o[a] = c[a]);\n      })(x, g);\n    }, function(x, g) {\n      function o() {\n        this.constructor = x;\n      }\n      u(x, g), x.prototype = g === null ? Object.create(g) : (o.prototype = g.prototype, new o());\n    }), y = function(x) {\n      function g(o) {\n        var c = x.call(this, o, !1) || this;\n        return A.Bb.addEventListener(\"hashchange\", c._listener, !1), c;\n      }\n      return E(g, x), g.prototype._get = function() {\n        return Object(A.Ob)(this._location.hash);\n      }, g.prototype._set = function(o, c, a, n) {\n        this._location.hash = a;\n      }, g.prototype.dispose = function(o) {\n        x.prototype.dispose.call(this, o), A.Bb.removeEventListener(\"hashchange\", this._listener);\n      }, g;\n    }(w.a);\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return E;\n    });\n    var u, A = e(42), w = (u = function(y, x) {\n      return (u = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(g, o) {\n        g.__proto__ = o;\n      } || function(g, o) {\n        for (var c in o) o.hasOwnProperty(c) && (g[c] = o[c]);\n      })(y, x);\n    }, function(y, x) {\n      function g() {\n        this.constructor = y;\n      }\n      u(y, x), y.prototype = x === null ? Object.create(x) : (g.prototype = x.prototype, new g());\n    }), E = function(y) {\n      function x(g) {\n        return y.call(this, g, !0) || this;\n      }\n      return w(x, y), x.prototype._get = function() {\n        return this._url;\n      }, x.prototype._set = function(g, o, c, a) {\n        this._url = c;\n      }, x;\n    }(A.a);\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return y;\n    });\n    var u, A = e(42), w = e(4), E = (u = function(x, g) {\n      return (u = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(o, c) {\n        o.__proto__ = c;\n      } || function(o, c) {\n        for (var a in c) c.hasOwnProperty(a) && (o[a] = c[a]);\n      })(x, g);\n    }, function(x, g) {\n      function o() {\n        this.constructor = x;\n      }\n      u(x, g), x.prototype = g === null ? Object.create(g) : (o.prototype = g.prototype, new o());\n    }), y = function(x) {\n      function g(o) {\n        var c = x.call(this, o, !0) || this;\n        return c._config = o.urlService.config, w.Bb.addEventListener(\"popstate\", c._listener, !1), c;\n      }\n      return E(g, x), g.prototype._getBasePrefix = function() {\n        return Object(w.Kb)(this._config.baseHref());\n      }, g.prototype._get = function() {\n        var o = this._location, c = o.pathname, a = o.hash, n = o.search;\n        n = Object(w.Ib)(n)[1], a = Object(w.Gb)(a)[1];\n        var t = this._getBasePrefix(), r = c === this._config.baseHref(), l = c.substr(0, t.length) === t;\n        return (c = r ? \"/\" : l ? c.substring(t.length) : c) + (n ? \"?\" + n : \"\") + (a ? \"#\" + a : \"\");\n      }, g.prototype._set = function(o, c, a, n) {\n        var t = this._getBasePrefix(), r = a && a[0] !== \"/\" ? \"/\" : \"\", l = a === \"\" || a === \"/\" ? this._config.baseHref() : t + r + a;\n        n ? this._history.replaceState(o, c, l) : this._history.pushState(o, c, l);\n      }, g.prototype.dispose = function(o) {\n        x.prototype.dispose.call(this, o), w.Bb.removeEventListener(\"popstate\", this._listener);\n      }, g;\n    }(A.a);\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return w;\n    });\n    var u = e(1), A = e(0), w = function() {\n      var E = this;\n      this.dispose = A.E, this._baseHref = \"\", this._port = 80, this._protocol = \"http\", this._host = \"localhost\", this._hashPrefix = \"\", this.port = function() {\n        return E._port;\n      }, this.protocol = function() {\n        return E._protocol;\n      }, this.host = function() {\n        return E._host;\n      }, this.baseHref = function() {\n        return E._baseHref;\n      }, this.html5Mode = function() {\n        return !1;\n      }, this.hashPrefix = function(y) {\n        return Object(u.c)(y) ? E._hashPrefix = y : E._hashPrefix;\n      };\n    };\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return A;\n    });\n    var u = e(2), A = function() {\n      function w(E, y) {\n        this.stateRegistry = E, this.stateService = y, Object(u.createProxyFunctions)(\n          Object(u.val)(w.prototype),\n          this,\n          Object(u.val)(this)\n        );\n      }\n      return w.prototype.decorator = function(E, y) {\n        return this.stateRegistry.decorator(E, y) || this;\n      }, w.prototype.state = function(E, y) {\n        return Object(u.isObject)(E) ? y = E : y.name = E, this.stateRegistry.register(y), this;\n      }, w.prototype.onInvalid = function(E) {\n        return this.stateService.onInvalid(E);\n      }, w;\n    }();\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return A;\n    });\n    var u = e(2), A = function() {\n      function w(E) {\n        this.router = E;\n      }\n      return w.injectableHandler = function(E, y) {\n        return function(x) {\n          return u.services.$injector.invoke(y, null, {\n            $match: x,\n            $stateParams: E.globals.params\n          });\n        };\n      }, w.prototype.$get = function() {\n        var E = this.router.urlService;\n        return this.router.urlRouter.update(!0), E.interceptDeferred || E.listen(), this.router.urlRouter;\n      }, w.prototype.rule = function(E) {\n        var y = this;\n        if (!Object(u.isFunction)(E))\n          throw new Error(\"'rule' must be a function\");\n        var x = new u.BaseUrlRule(function() {\n          return E(u.services.$injector, y.router.locationService);\n        }, u.identity);\n        return this.router.urlService.rules.rule(x), this;\n      }, w.prototype.otherwise = function(E) {\n        var y = this, x = this.router.urlService.rules;\n        if (Object(u.isString)(E)) x.otherwise(E);\n        else {\n          if (!Object(u.isFunction)(E))\n            throw new Error(\"'rule' must be a string or function\");\n          x.otherwise(function() {\n            return E(u.services.$injector, y.router.locationService);\n          });\n        }\n        return this;\n      }, w.prototype.when = function(E, y) {\n        return (Object(u.isArray)(y) || Object(u.isFunction)(y)) && (y = w.injectableHandler(this.router, y)), this.router.urlService.rules.when(E, y), this;\n      }, w.prototype.deferIntercept = function(E) {\n        this.router.urlService.deferIntercept(E);\n      }, w;\n    }();\n  },\n  function(L, T, e) {\n    e.d(T, \"b\", function() {\n      return v;\n    }), e.d(T, \"a\", function() {\n      return k;\n    });\n    var u = e(12), A = e(2), w = e(55), E = function() {\n      function s() {\n        var S = this;\n        this._useHttp = u.a.version.minor < 3, this.$get = [\n          \"$http\",\n          \"$templateCache\",\n          \"$injector\",\n          function(j, I, R) {\n            return S.$templateRequest = R.has && R.has(\"$templateRequest\") && R.get(\"$templateRequest\"), S.$http = j, S.$templateCache = I, S;\n          }\n        ];\n      }\n      return s.prototype.useHttpService = function(S) {\n        this._useHttp = S;\n      }, s.prototype.fromConfig = function(S, j, I) {\n        var R = function(z) {\n          return A.services.$q.when(z).then(function(V) {\n            return { template: V };\n          });\n        }, M = function(z) {\n          return A.services.$q.when(z).then(function(V) {\n            return { component: V };\n          });\n        };\n        return Object(A.isDefined)(S.template) ? R(this.fromString(S.template, j)) : Object(A.isDefined)(S.templateUrl) ? R(this.fromUrl(S.templateUrl, j)) : Object(A.isDefined)(S.templateProvider) ? R(this.fromProvider(S.templateProvider, j, I)) : Object(A.isDefined)(S.component) ? M(S.component) : Object(A.isDefined)(S.componentProvider) ? M(this.fromComponentProvider(S.componentProvider, j, I)) : R(\"<ui-view></ui-view>\");\n      }, s.prototype.fromString = function(S, j) {\n        return Object(A.isFunction)(S) ? S(j) : S;\n      }, s.prototype.fromUrl = function(S, j) {\n        return Object(A.isFunction)(S) && (S = S(j)), S == null ? null : this._useHttp ? this.$http.get(S, {\n          cache: this.$templateCache,\n          headers: { Accept: \"text/html\" }\n        }).then(function(I) {\n          return I.data;\n        }) : this.$templateRequest(S);\n      }, s.prototype.fromProvider = function(S, j, I) {\n        var R = A.services.$injector.annotate(S), M = Object(A.isArray)(S) ? Object(A.tail)(S) : S;\n        return new A.Resolvable(\"\", M, R).get(I);\n      }, s.prototype.fromComponentProvider = function(S, j, I) {\n        var R = A.services.$injector.annotate(S), M = Object(A.isArray)(S) ? Object(A.tail)(S) : S;\n        return new A.Resolvable(\"\", M, R).get(I);\n      }, s.prototype.makeComponentTemplate = function(S, j, I, R) {\n        R = R || {};\n        var M = u.a.version.minor >= 3 ? \"::\" : \"\", z = function(Y) {\n          var tt = Object(A.kebobString)(Y);\n          return /^(x|data)-/.exec(tt) ? \"x-\" + tt : tt;\n        }, V = function(Y) {\n          var tt = A.services.$injector.get(Y + \"Directive\");\n          if (!tt || !tt.length)\n            throw new Error(\"Unable to find component named '\" + Y + \"'\");\n          return tt.map(y).reduce(A.unnestR, []);\n        }(I).map(function(Y) {\n          var tt = Y.name, Z = Y.type, at = z(tt);\n          if (S.attr(at) && !R[tt]) return at + \"='\" + S.attr(at) + \"'\";\n          var nt = R[tt] || tt;\n          if (Z === \"@\")\n            return at + \"='{{\" + M + \"$resolve.\" + nt + \"}}'\";\n          if (Z === \"&\") {\n            var ht = j.getResolvable(nt), ct = ht && ht.data, ot = ct && A.services.$injector.annotate(ct) || [];\n            return at + \"='$resolve.\" + nt + (Object(A.isArray)(ct) ? \"[\" + (ct.length - 1) + \"]\" : \"\") + \"(\" + ot.join(\",\") + \")'\";\n          }\n          return at + \"='\" + M + \"$resolve.\" + nt + \"'\";\n        }).join(\" \"), G = z(I);\n        return \"<\" + G + \" \" + V + \"></\" + G + \">\";\n      }, s;\n    }(), y = function(s) {\n      return Object(A.isObject)(s.bindToController) ? x(s.bindToController) : x(s.scope);\n    }, x = function(s) {\n      return Object.keys(s || {}).map(function(S) {\n        return [S, /^([=<@&])[?]?(.*)/.exec(s[S])];\n      }).filter(function(S) {\n        return Object(A.isDefined)(S) && Object(A.isArray)(S[1]);\n      }).map(function(S) {\n        return { name: S[1][2] || S[0], type: S[1][1] };\n      });\n    }, g = e(112), o = function(s) {\n      return function(S) {\n        var j = S[s], I = s === \"onExit\" ? \"from\" : \"to\";\n        return j ? function(R, M) {\n          var z = new A.ResolveContext(R.treeChanges(I)).subContext(\n            M.$$state()\n          ), V = Object(A.extend)(k(z), { $state$: M, $transition$: R });\n          return A.services.$injector.invoke(j, this, V);\n        } : void 0;\n      };\n    }, c = function() {\n      function s(S) {\n        this._urlListeners = [], this.$locationProvider = S;\n        var j = Object(A.val)(S);\n        Object(A.createProxyFunctions)(j, this, j, [\"hashPrefix\"]);\n      }\n      return s.monkeyPatchPathParameterType = function(S) {\n        var j = S.urlMatcherFactory.type(\"path\");\n        j.encode = function(I) {\n          return I != null ? I.toString().replace(/(~|\\/)/g, function(R) {\n            return { \"~\": \"~~\", \"/\": \"~2F\" }[R];\n          }) : I;\n        }, j.decode = function(I) {\n          return I != null ? I.toString().replace(/(~~|~2F)/g, function(R) {\n            return { \"~~\": \"~\", \"~2F\": \"/\" }[R];\n          }) : I;\n        };\n      }, s.prototype.dispose = function() {\n      }, s.prototype.onChange = function(S) {\n        var j = this;\n        return this._urlListeners.push(S), function() {\n          return Object(A.removeFrom)(j._urlListeners)(S);\n        };\n      }, s.prototype.html5Mode = function() {\n        var S = this.$locationProvider.html5Mode();\n        return (S = Object(A.isObject)(S) ? S.enabled : S) && this.$sniffer.history;\n      }, s.prototype.baseHref = function() {\n        return this._baseHref || (this._baseHref = this.$browser.baseHref() || this.$window.location.pathname);\n      }, s.prototype.url = function(S, j, I) {\n        return j === void 0 && (j = !1), Object(A.isDefined)(S) && this.$location.url(S), j && this.$location.replace(), I && this.$location.state(I), this.$location.url();\n      }, s.prototype._runtimeServices = function(S, j, I, R, M) {\n        var z = this;\n        this.$location = j, this.$sniffer = I, this.$browser = R, this.$window = M, S.$on(\"$locationChangeSuccess\", function(G) {\n          return z._urlListeners.forEach(function(Y) {\n            return Y(G);\n          });\n        });\n        var V = Object(A.val)(j);\n        Object(A.createProxyFunctions)(V, this, V, [\n          \"replace\",\n          \"path\",\n          \"search\",\n          \"hash\"\n        ]), Object(A.createProxyFunctions)(V, this, V, [\n          \"port\",\n          \"protocol\",\n          \"host\"\n        ]);\n      }, s;\n    }(), a = e(113);\n    u.a.module(\"ui.router.angular1\", []);\n    var n = u.a.module(\"ui.router.init\", [\"ng\"]), t = u.a.module(\"ui.router.util\", [\"ui.router.init\"]), r = u.a.module(\"ui.router.router\", [\"ui.router.util\"]), l = u.a.module(\"ui.router.state\", [\n      \"ui.router.router\",\n      \"ui.router.util\",\n      \"ui.router.angular1\"\n    ]), h = u.a.module(\"ui.router\", [\n      \"ui.router.init\",\n      \"ui.router.state\",\n      \"ui.router.angular1\"\n    ]), i = (u.a.module(\"ui.router.compat\", [\"ui.router\"]), null);\n    function d(s) {\n      (i = this.router = new A.UIRouter()).stateProvider = new g.a(\n        i.stateRegistry,\n        i.stateService\n      ), i.stateRegistry.decorator(\"views\", w.c), i.stateRegistry.decorator(\"onExit\", o(\"onExit\")), i.stateRegistry.decorator(\"onRetain\", o(\"onRetain\")), i.stateRegistry.decorator(\"onEnter\", o(\"onEnter\")), i.viewService._pluginapi._viewConfigFactory(\"ng1\", Object(w.b)()), i.urlService.config._decodeParams = !1;\n      var S = i.locationService = i.locationConfig = new c(s);\n      function j(I, R, M, z, V, G, Y) {\n        return S._runtimeServices(V, I, z, R, M), delete i.router, delete i.$get, i;\n      }\n      return c.monkeyPatchPathParameterType(i), i.router = i, i.$get = j, j.$inject = [\n        \"$location\",\n        \"$browser\",\n        \"$window\",\n        \"$sniffer\",\n        \"$rootScope\",\n        \"$http\",\n        \"$templateCache\"\n      ], i;\n    }\n    d.$inject = [\"$locationProvider\"];\n    var p = function(s) {\n      return [\n        \"$uiRouterProvider\",\n        function(S) {\n          var j = S.router[s];\n          return j.$get = function() {\n            return j;\n          }, j;\n        }\n      ];\n    };\n    function f(s, S, j) {\n      if (A.services.$injector = s, A.services.$q = S, !Object.prototype.hasOwnProperty.call(s, \"strictDi\"))\n        try {\n          s.invoke(function(I) {\n          });\n        } catch (I) {\n          s.strictDi = !!/strict mode/.exec(I && I.toString());\n        }\n      j.stateRegistry.get().map(function(I) {\n        return I.$$state().resolvables;\n      }).reduce(A.unnestR, []).filter(function(I) {\n        return I.deps === \"deferred\";\n      }).forEach(function(I) {\n        return I.deps = s.annotate(I.resolveFn, s.strictDi);\n      });\n    }\n    f.$inject = [\"$injector\", \"$q\", \"$uiRouter\"];\n    function v(s) {\n      s.$watch(function() {\n        A.trace.approximateDigests++;\n      });\n    }\n    v.$inject = [\"$rootScope\"], n.provider(\"$uiRouter\", d), r.provider(\"$urlRouter\", [\n      \"$uiRouterProvider\",\n      function(s) {\n        return s.urlRouterProvider = new a.a(s);\n      }\n    ]), t.provider(\"$urlService\", p(\"urlService\")), t.provider(\"$urlMatcherFactory\", [\n      \"$uiRouterProvider\",\n      function() {\n        return i.urlMatcherFactory;\n      }\n    ]), t.provider(\"$templateFactory\", function() {\n      return new E();\n    }), l.provider(\"$stateRegistry\", p(\"stateRegistry\")), l.provider(\"$uiRouterGlobals\", p(\"globals\")), l.provider(\"$transitions\", p(\"transitionService\")), l.provider(\"$state\", [\n      \"$uiRouterProvider\",\n      function() {\n        return Object(A.extend)(i.stateProvider, {\n          $get: function() {\n            return i.stateService;\n          }\n        });\n      }\n    ]), l.factory(\"$stateParams\", [\n      \"$uiRouter\",\n      function(s) {\n        return s.globals.params;\n      }\n    ]), h.factory(\"$view\", function() {\n      return i.viewService;\n    }), h.service(\"$trace\", function() {\n      return A.trace;\n    }), h.run(v), t.run([\"$urlMatcherFactory\", function(s) {\n    }]), l.run([\"$state\", function(s) {\n    }]), r.run([\"$urlRouter\", function(s) {\n    }]), n.run(f);\n    var k = function(s) {\n      return s.getTokens().filter(A.isString).map(function(S) {\n        var j = s.getResolvable(S);\n        return [S, s.getPolicy(j).async === \"NOWAIT\" ? j.promise : j.data];\n      }).reduce(A.applyPairs, {});\n    };\n  },\n  function(L, T, e) {\n    e.d(T, \"b\", function() {\n      return w;\n    }), e.d(T, \"a\", function() {\n      return E;\n    });\n    var u = e(6), A = function(y) {\n      var x = y.router, g = y.entering().filter(function(o) {\n        return !!o.$$state().lazyLoad;\n      }).map(function(o) {\n        return E(y, o);\n      });\n      return u.b.$q.all(g).then(function() {\n        if (y.originalTransition().options().source !== \"url\") {\n          var o = y.targetState();\n          return x.stateService.target(\n            o.identifier(),\n            o.params(),\n            o.options()\n          );\n        }\n        var c = x.urlService, a = c.match(c.parts()), n = a && a.rule;\n        if (n && n.type === \"STATE\") {\n          var t = n.state, r = a.match;\n          return x.stateService.target(t, r, y.options());\n        }\n        x.urlService.sync();\n      });\n    }, w = function(y) {\n      return y.onBefore(\n        {\n          entering: function(x) {\n            return !!x.lazyLoad;\n          }\n        },\n        A\n      );\n    };\n    function E(y, x) {\n      var g = x.$$state().lazyLoad, o = g._promise;\n      return o || (o = g._promise = u.b.$q.when(g(y, x)).then(function(c) {\n        return c && Array.isArray(c.states) && c.states.forEach(function(a) {\n          return y.router.stateRegistry.register(a);\n        }), c;\n      }).then(\n        function(c) {\n          return delete x.lazyLoad, delete x.$$state().lazyLoad, delete g._promise, c;\n        },\n        function(c) {\n          return delete g._promise, u.b.$q.reject(c);\n        }\n      )), o;\n    }\n  },\n  function(L, T, e) {\n    var u = e(22);\n    L.exports = A;\n    function A(o) {\n      this._isDirected = !u.has(o, \"directed\") || o.directed, this._isMultigraph = !!u.has(o, \"multigraph\") && o.multigraph, this._isCompound = !!u.has(o, \"compound\") && o.compound, this._label = void 0, this._defaultNodeLabelFn = u.constant(void 0), this._defaultEdgeLabelFn = u.constant(void 0), this._nodes = {}, this._isCompound && (this._parent = {}, this._children = {}, this._children[\"\\0\"] = {}), this._in = {}, this._preds = {}, this._out = {}, this._sucs = {}, this._edgeObjs = {}, this._edgeLabels = {};\n    }\n    function w(o, c) {\n      o[c] ? o[c]++ : o[c] = 1;\n    }\n    function E(o, c) {\n      --o[c] || delete o[c];\n    }\n    function y(o, c, a, n) {\n      var t = \"\" + c, r = \"\" + a;\n      if (!o && t > r) {\n        var l = t;\n        t = r, r = l;\n      }\n      return t + \"\u0001\" + r + \"\u0001\" + (u.isUndefined(n) ? \"\\0\" : n);\n    }\n    function x(o, c, a, n) {\n      var t = \"\" + c, r = \"\" + a;\n      if (!o && t > r) {\n        var l = t;\n        t = r, r = l;\n      }\n      var h = { v: t, w: r };\n      return n && (h.name = n), h;\n    }\n    function g(o, c) {\n      return y(o, c.v, c.w, c.name);\n    }\n    A.prototype._nodeCount = 0, A.prototype._edgeCount = 0, A.prototype.isDirected = function() {\n      return this._isDirected;\n    }, A.prototype.isMultigraph = function() {\n      return this._isMultigraph;\n    }, A.prototype.isCompound = function() {\n      return this._isCompound;\n    }, A.prototype.setGraph = function(o) {\n      return this._label = o, this;\n    }, A.prototype.graph = function() {\n      return this._label;\n    }, A.prototype.setDefaultNodeLabel = function(o) {\n      return u.isFunction(o) || (o = u.constant(o)), this._defaultNodeLabelFn = o, this;\n    }, A.prototype.nodeCount = function() {\n      return this._nodeCount;\n    }, A.prototype.nodes = function() {\n      return u.keys(this._nodes);\n    }, A.prototype.sources = function() {\n      var o = this;\n      return u.filter(this.nodes(), function(c) {\n        return u.isEmpty(o._in[c]);\n      });\n    }, A.prototype.sinks = function() {\n      var o = this;\n      return u.filter(this.nodes(), function(c) {\n        return u.isEmpty(o._out[c]);\n      });\n    }, A.prototype.setNodes = function(o, c) {\n      var a = arguments, n = this;\n      return u.each(o, function(t) {\n        a.length > 1 ? n.setNode(t, c) : n.setNode(t);\n      }), this;\n    }, A.prototype.setNode = function(o, c) {\n      return u.has(this._nodes, o) ? (arguments.length > 1 && (this._nodes[o] = c), this) : (this._nodes[o] = arguments.length > 1 ? c : this._defaultNodeLabelFn(o), this._isCompound && (this._parent[o] = \"\\0\", this._children[o] = {}, this._children[\"\\0\"][o] = !0), this._in[o] = {}, this._preds[o] = {}, this._out[o] = {}, this._sucs[o] = {}, ++this._nodeCount, this);\n    }, A.prototype.node = function(o) {\n      return this._nodes[o];\n    }, A.prototype.hasNode = function(o) {\n      return u.has(this._nodes, o);\n    }, A.prototype.removeNode = function(o) {\n      var c = this;\n      if (u.has(this._nodes, o)) {\n        var a = function(n) {\n          c.removeEdge(c._edgeObjs[n]);\n        };\n        delete this._nodes[o], this._isCompound && (this._removeFromParentsChildList(o), delete this._parent[o], u.each(this.children(o), function(n) {\n          c.setParent(n);\n        }), delete this._children[o]), u.each(u.keys(this._in[o]), a), delete this._in[o], delete this._preds[o], u.each(u.keys(this._out[o]), a), delete this._out[o], delete this._sucs[o], --this._nodeCount;\n      }\n      return this;\n    }, A.prototype.setParent = function(o, c) {\n      if (!this._isCompound)\n        throw new Error(\"Cannot set parent in a non-compound graph\");\n      if (u.isUndefined(c)) c = \"\\0\";\n      else {\n        for (var a = c += \"\"; !u.isUndefined(a); a = this.parent(a))\n          if (a === o)\n            throw new Error(\n              \"Setting \" + c + \" as parent of \" + o + \" would create a cycle\"\n            );\n        this.setNode(c);\n      }\n      return this.setNode(o), this._removeFromParentsChildList(o), this._parent[o] = c, this._children[c][o] = !0, this;\n    }, A.prototype._removeFromParentsChildList = function(o) {\n      delete this._children[this._parent[o]][o];\n    }, A.prototype.parent = function(o) {\n      if (this._isCompound) {\n        var c = this._parent[o];\n        if (c !== \"\\0\") return c;\n      }\n    }, A.prototype.children = function(o) {\n      if (u.isUndefined(o) && (o = \"\\0\"), this._isCompound) {\n        var c = this._children[o];\n        if (c) return u.keys(c);\n      } else {\n        if (o === \"\\0\") return this.nodes();\n        if (this.hasNode(o)) return [];\n      }\n    }, A.prototype.predecessors = function(o) {\n      var c = this._preds[o];\n      if (c) return u.keys(c);\n    }, A.prototype.successors = function(o) {\n      var c = this._sucs[o];\n      if (c) return u.keys(c);\n    }, A.prototype.neighbors = function(o) {\n      var c = this.predecessors(o);\n      if (c) return u.union(c, this.successors(o));\n    }, A.prototype.isLeaf = function(o) {\n      return (this.isDirected() ? this.successors(o) : this.neighbors(o)).length === 0;\n    }, A.prototype.filterNodes = function(o) {\n      var c = new this.constructor({\n        directed: this._isDirected,\n        multigraph: this._isMultigraph,\n        compound: this._isCompound\n      });\n      c.setGraph(this.graph());\n      var a = this;\n      u.each(this._nodes, function(t, r) {\n        o(r) && c.setNode(r, t);\n      }), u.each(this._edgeObjs, function(t) {\n        c.hasNode(t.v) && c.hasNode(t.w) && c.setEdge(t, a.edge(t));\n      });\n      var n = {};\n      return this._isCompound && u.each(c.nodes(), function(t) {\n        c.setParent(\n          t,\n          function r(l) {\n            var h = a.parent(l);\n            return h === void 0 || c.hasNode(h) ? (n[l] = h, h) : h in n ? n[h] : r(h);\n          }(t)\n        );\n      }), c;\n    }, A.prototype.setDefaultEdgeLabel = function(o) {\n      return u.isFunction(o) || (o = u.constant(o)), this._defaultEdgeLabelFn = o, this;\n    }, A.prototype.edgeCount = function() {\n      return this._edgeCount;\n    }, A.prototype.edges = function() {\n      return u.values(this._edgeObjs);\n    }, A.prototype.setPath = function(o, c) {\n      var a = this, n = arguments;\n      return u.reduce(o, function(t, r) {\n        return n.length > 1 ? a.setEdge(t, r, c) : a.setEdge(t, r), r;\n      }), this;\n    }, A.prototype.setEdge = function() {\n      var o, c, a, n, t = !1, r = arguments[0];\n      typeof r == \"object\" && r !== null && \"v\" in r ? (o = r.v, c = r.w, a = r.name, arguments.length === 2 && (n = arguments[1], t = !0)) : (o = r, c = arguments[1], a = arguments[3], arguments.length > 2 && (n = arguments[2], t = !0)), o = \"\" + o, c = \"\" + c, u.isUndefined(a) || (a = \"\" + a);\n      var l = y(this._isDirected, o, c, a);\n      if (u.has(this._edgeLabels, l))\n        return t && (this._edgeLabels[l] = n), this;\n      if (!u.isUndefined(a) && !this._isMultigraph)\n        throw new Error(\"Cannot set a named edge when isMultigraph = false\");\n      this.setNode(o), this.setNode(c), this._edgeLabels[l] = t ? n : this._defaultEdgeLabelFn(o, c, a);\n      var h = x(this._isDirected, o, c, a);\n      return o = h.v, c = h.w, Object.freeze(h), this._edgeObjs[l] = h, w(this._preds[c], o), w(this._sucs[o], c), this._in[c][l] = h, this._out[o][l] = h, this._edgeCount++, this;\n    }, A.prototype.edge = function(o, c, a) {\n      var n = arguments.length === 1 ? g(this._isDirected, arguments[0]) : y(this._isDirected, o, c, a);\n      return this._edgeLabels[n];\n    }, A.prototype.hasEdge = function(o, c, a) {\n      var n = arguments.length === 1 ? g(this._isDirected, arguments[0]) : y(this._isDirected, o, c, a);\n      return u.has(this._edgeLabels, n);\n    }, A.prototype.removeEdge = function(o, c, a) {\n      var n = arguments.length === 1 ? g(this._isDirected, arguments[0]) : y(this._isDirected, o, c, a), t = this._edgeObjs[n];\n      return t && (o = t.v, c = t.w, delete this._edgeLabels[n], delete this._edgeObjs[n], E(this._preds[c], o), E(this._sucs[o], c), delete this._in[c][n], delete this._out[o][n], this._edgeCount--), this;\n    }, A.prototype.inEdges = function(o, c) {\n      var a = this._in[o];\n      if (a) {\n        var n = u.values(a);\n        return c ? u.filter(n, function(t) {\n          return t.v === c;\n        }) : n;\n      }\n    }, A.prototype.outEdges = function(o, c) {\n      var a = this._out[o];\n      if (a) {\n        var n = u.values(a);\n        return c ? u.filter(n, function(t) {\n          return t.w === c;\n        }) : n;\n      }\n    }, A.prototype.nodeEdges = function(o, c) {\n      var a = this.inEdges(o, c);\n      if (a) return a.concat(this.outEdges(o, c));\n    };\n  },\n  function(L, T, e) {\n    var u = e(46)(e(29), \"Map\");\n    L.exports = u;\n  },\n  function(L, T, e) {\n    var u = e(265), A = e(272), w = e(274), E = e(275), y = e(276);\n    function x(g) {\n      var o = -1, c = g == null ? 0 : g.length;\n      for (this.clear(); ++o < c; ) {\n        var a = g[o];\n        this.set(a[0], a[1]);\n      }\n    }\n    x.prototype.clear = u, x.prototype.delete = A, x.prototype.get = w, x.prototype.has = E, x.prototype.set = y, L.exports = x;\n  },\n  function(L, T) {\n    L.exports = function(e, u) {\n      for (var A = -1, w = e == null ? 0 : e.length; ++A < w && u(e[A], A, e) !== !1; ) ;\n      return e;\n    };\n  },\n  function(L, T) {\n    L.exports = function(e) {\n      return typeof e == \"number\" && e > -1 && e % 1 == 0 && e <= 9007199254740991;\n    };\n  },\n  function(L, T, e) {\n    (function(u) {\n      var A = e(150), w = T && !T.nodeType && T, E = w && typeof u == \"object\" && u && !u.nodeType && u, y = E && E.exports === w && A.process, x = function() {\n        try {\n          var g = E && E.require && E.require(\"util\").types;\n          return g || y && y.binding && y.binding(\"util\");\n        } catch {\n        }\n      }();\n      u.exports = x;\n    }).call(this, e(80)(L));\n  },\n  function(L, T, e) {\n    var u = e(83), A = e(282), w = Object.prototype.hasOwnProperty;\n    L.exports = function(E) {\n      if (!u(E)) return A(E);\n      var y = [];\n      for (var x in Object(E)) w.call(E, x) && x != \"constructor\" && y.push(x);\n      return y;\n    };\n  },\n  function(L, T, e) {\n    var u = e(157), A = e(158), w = Object.prototype.propertyIsEnumerable, E = Object.getOwnPropertySymbols, y = E ? function(x) {\n      return x == null ? [] : (x = Object(x), u(E(x), function(g) {\n        return w.call(x, g);\n      }));\n    } : A;\n    L.exports = y;\n  },\n  function(L, T) {\n    L.exports = function(e, u) {\n      for (var A = -1, w = u.length, E = e.length; ++A < w; ) e[E + A] = u[A];\n      return e;\n    };\n  },\n  function(L, T, e) {\n    var u = e(163);\n    L.exports = function(A) {\n      var w = new A.constructor(A.byteLength);\n      return new u(w).set(new u(A)), w;\n    };\n  },\n  function(L, T) {\n    L.exports = function(e) {\n      return function() {\n        return e;\n      };\n    };\n  },\n  function(L, T, e) {\n    var u = e(128), A = e(41);\n    L.exports = function(w, E) {\n      return w && u(w, E, A);\n    };\n  },\n  function(L, T, e) {\n    var u = e(301)();\n    L.exports = u;\n  },\n  function(L, T) {\n    L.exports = function(e) {\n      var u = -1, A = Array(e.size);\n      return e.forEach(function(w) {\n        A[++u] = w;\n      }), A;\n    };\n  },\n  function(L, T, e) {\n    var u = e(13), A = e(61), w = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/, E = /^\\w*$/;\n    L.exports = function(y, x) {\n      if (u(y)) return !1;\n      var g = typeof y;\n      return !(g != \"number\" && g != \"symbol\" && g != \"boolean\" && y != null && !A(y)) || E.test(y) || !w.test(y) || x != null && y in Object(x);\n    };\n  },\n  function(L, T, e) {\n    var u = e(124), A = e(335);\n    L.exports = function w(E, y, x, g, o) {\n      var c = -1, a = E.length;\n      for (x || (x = A), o || (o = []); ++c < a; ) {\n        var n = E[c];\n        y > 0 && x(n) ? y > 1 ? w(n, y - 1, x, g, o) : u(o, n) : g || (o[o.length] = n);\n      }\n      return o;\n    };\n  },\n  function(L, T, e) {\n    var u = e(61);\n    L.exports = function(A, w, E) {\n      for (var y = -1, x = A.length; ++y < x; ) {\n        var g = A[y], o = w(g);\n        if (o != null && (c === void 0 ? o == o && !u(o) : E(o, c)))\n          var c = o, a = g;\n      }\n      return a;\n    };\n  },\n  function(L, T) {\n  },\n  function(L, T) {\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return g;\n    });\n    var u, A = e(0), w = e(1), E = e(3), y = e(6), x = e(51), g = function() {\n      function o() {\n        this.enqueue = !0, this.typeQueue = [], this.defaultTypes = Object(A.H)(o.prototype, [\n          \"hash\",\n          \"string\",\n          \"query\",\n          \"path\",\n          \"int\",\n          \"bool\",\n          \"date\",\n          \"json\",\n          \"any\"\n        ]), this.types = Object(A.A)(\n          Object(A.B)(this.defaultTypes, function(c, a) {\n            return new x.a(Object(A.r)({ name: a }, c));\n          }),\n          {}\n        );\n      }\n      return o.prototype.dispose = function() {\n        this.types = {};\n      }, o.prototype.type = function(c, a, n) {\n        if (!Object(w.c)(a)) return this.types[c];\n        if (this.types.hasOwnProperty(c))\n          throw new Error(\n            \"A type named '\" + c + \"' has already been defined.\"\n          );\n        return this.types[c] = new x.a(Object(A.r)({ name: c }, a)), n && (this.typeQueue.push({ name: c, def: n }), this.enqueue || this._flushTypeQueue()), this;\n      }, o.prototype._flushTypeQueue = function() {\n        for (; this.typeQueue.length; ) {\n          var c = this.typeQueue.shift();\n          if (c.pattern)\n            throw new Error(\n              \"You cannot override a type's .pattern at runtime.\"\n            );\n          Object(A.r)(this.types[c.name], y.b.$injector.invoke(c.def));\n        }\n      }, o;\n    }();\n    u = function(o) {\n      var c = function(n) {\n        return n != null ? n.toString() : n;\n      }, a = {\n        encode: c,\n        decode: c,\n        is: Object(E.h)(String),\n        pattern: /.*/,\n        equals: function(n, t) {\n          return n == t;\n        }\n      };\n      return Object(A.r)({}, a, o);\n    }, Object(A.r)(g.prototype, {\n      string: u({}),\n      path: u({ pattern: /[^/]*/ }),\n      query: u({}),\n      hash: u({ inherit: !1 }),\n      int: u({\n        decode: function(o) {\n          return parseInt(o, 10);\n        },\n        is: function(o) {\n          return !Object(w.g)(o) && this.decode(o.toString()) === o;\n        },\n        pattern: /-?\\d+/\n      }),\n      bool: u({\n        encode: function(o) {\n          return o ? 1 : 0;\n        },\n        decode: function(o) {\n          return parseInt(o, 10) !== 0;\n        },\n        is: Object(E.h)(Boolean),\n        pattern: /0|1/\n      }),\n      date: u({\n        encode: function(o) {\n          return this.is(o) ? [\n            o.getFullYear(),\n            (\"0\" + (o.getMonth() + 1)).slice(-2),\n            (\"0\" + o.getDate()).slice(-2)\n          ].join(\"-\") : void 0;\n        },\n        decode: function(o) {\n          if (this.is(o)) return o;\n          var c = this.capture.exec(o);\n          return c ? new Date(c[1], c[2] - 1, c[3]) : void 0;\n        },\n        is: function(o) {\n          return o instanceof Date && !isNaN(o.valueOf());\n        },\n        equals: function(o, c) {\n          return [\"getFullYear\", \"getMonth\", \"getDate\"].reduce(\n            function(a, n) {\n              return a && o[n]() === c[n]();\n            },\n            !0\n          );\n        },\n        pattern: /[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2][0-9]|3[0-1])/,\n        capture: /([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/\n      }),\n      json: u({\n        encode: A.Q,\n        decode: A.x,\n        is: Object(E.h)(Object),\n        equals: A.q,\n        pattern: /[^/]*/\n      }),\n      any: u({\n        encode: A.y,\n        decode: A.y,\n        is: function() {\n          return !0;\n        },\n        equals: A.q\n      })\n    });\n  },\n  function(L, T, e) {\n    var u = e(52);\n    e.d(T, \"a\", function() {\n      return u.a;\n    });\n    var A = e(18);\n    e.d(T, \"b\", function() {\n      return A.a;\n    });\n  },\n  function(L, T) {\n  },\n  function(L, T, e) {\n    var u = e(14);\n    e.d(T, \"h\", function() {\n      return u.a;\n    }), e.d(T, \"i\", function() {\n      return u.b;\n    });\n    var A = e(98);\n    e.d(T, \"a\", function() {\n      return A.a;\n    });\n    var w = e(45);\n    e.d(T, \"b\", function() {\n      return w.a;\n    }), e.d(T, \"l\", function() {\n      return w.b;\n    }), e.d(T, \"m\", function() {\n      return w.c;\n    });\n    var E = e(8);\n    e.d(T, \"c\", function() {\n      return E.a;\n    }), e.d(T, \"d\", function() {\n      return E.b;\n    });\n    var y = e(53);\n    e.d(T, \"e\", function() {\n      return y.a;\n    });\n    var x = e(17);\n    e.d(T, \"g\", function() {\n      return x.a;\n    });\n    var g = e(107);\n    e.d(T, \"f\", function() {\n      return g.a;\n    });\n    var o = e(56);\n    e.d(T, \"j\", function() {\n      return o.a;\n    }), e.d(T, \"k\", function() {\n      return o.b;\n    });\n  },\n  function(L, T, e) {\n    e.r(T);\n    var u = e(140);\n    for (var A in u)\n      [\"default\", \"UrlRules\", \"UrlConfig\"].indexOf(A) < 0 && function(a) {\n        e.d(T, a, function() {\n          return u[a];\n        });\n      }(A);\n    var w = e(32);\n    e.d(T, \"UrlMatcher\", function() {\n      return w.a;\n    });\n    var E = e(100);\n    e.d(T, \"ParamFactory\", function() {\n      return E.a;\n    }), e.d(T, \"UrlMatcherFactory\", function() {\n      return E.b;\n    });\n    var y = e(101);\n    e.d(T, \"UrlRouter\", function() {\n      return y.a;\n    });\n    var x = e(54);\n    e.d(T, \"UrlRuleFactory\", function() {\n      return x.b;\n    }), e.d(T, \"BaseUrlRule\", function() {\n      return x.a;\n    });\n    var g = e(104);\n    e.d(T, \"UrlService\", function() {\n      return g.a;\n    });\n    var o = e(105);\n    e.d(T, \"UrlRules\", function() {\n      return o.a;\n    });\n    var c = e(106);\n    e.d(T, \"UrlConfig\", function() {\n      return c.a;\n    });\n  },\n  function(L, T) {\n  },\n  function(L, T, e) {\n    e.r(T);\n    var u = e(142);\n    for (var A in u)\n      [\"default\"].indexOf(A) < 0 && function(E) {\n        e.d(T, E, function() {\n          return u[E];\n        });\n      }(A);\n    var w = e(102);\n    e.d(T, \"ViewService\", function() {\n      return w.a;\n    });\n  },\n  function(L, T) {\n  },\n  function(L, T, e) {\n    e.r(T);\n    var u = e(144);\n    for (var A in u)\n      [\"default\"].indexOf(A) < 0 && function(w) {\n        e.d(T, w, function() {\n          return u[w];\n        });\n      }(A);\n  },\n  function(L, T, e) {\n    e.r(T);\n    var u = e(145);\n    for (var A in u)\n      [\"default\"].indexOf(A) < 0 && function(r) {\n        e.d(T, r, function() {\n          return u[r];\n        });\n      }(A);\n    var w = e(70);\n    e.d(T, \"$q\", function() {\n      return w.a;\n    });\n    var E = e(71);\n    e.d(T, \"$injector\", function() {\n      return E.a;\n    });\n    var y = e(42);\n    e.d(T, \"BaseLocationServices\", function() {\n      return y.a;\n    });\n    var x = e(108);\n    e.d(T, \"HashLocationService\", function() {\n      return x.a;\n    });\n    var g = e(109);\n    e.d(T, \"MemoryLocationService\", function() {\n      return g.a;\n    });\n    var o = e(110);\n    e.d(T, \"PushStateLocationService\", function() {\n      return o.a;\n    });\n    var c = e(111);\n    e.d(T, \"MemoryLocationConfig\", function() {\n      return c.a;\n    });\n    var a = e(72);\n    e.d(T, \"BrowserLocationConfig\", function() {\n      return a.a;\n    });\n    var n = e(27);\n    e.d(T, \"keyValsToObjectR\", function() {\n      return n.c;\n    }), e.d(T, \"getParams\", function() {\n      return n.b;\n    }), e.d(T, \"parseUrl\", function() {\n      return n.e;\n    }), e.d(T, \"buildUrl\", function() {\n      return n.a;\n    }), e.d(T, \"locationPluginFactory\", function() {\n      return n.d;\n    });\n    var t = e(146);\n    e.d(T, \"servicesPlugin\", function() {\n      return t.d;\n    }), e.d(T, \"hashLocationPlugin\", function() {\n      return t.a;\n    }), e.d(T, \"pushStateLocationPlugin\", function() {\n      return t.c;\n    }), e.d(T, \"memoryLocationPlugin\", function() {\n      return t.b;\n    });\n  },\n  function(L, T) {\n  },\n  function(L, T, e) {\n    e.d(T, \"d\", function() {\n      return a;\n    }), e.d(T, \"a\", function() {\n      return n;\n    }), e.d(T, \"c\", function() {\n      return t;\n    }), e.d(T, \"b\", function() {\n      return r;\n    });\n    var u = e(72), A = e(108), w = e(27), E = e(110), y = e(109), x = e(111), g = e(71), o = e(70), c = e(6);\n    function a(l) {\n      return c.b.$injector = g.a, c.b.$q = o.a, {\n        name: \"vanilla.services\",\n        $q: o.a,\n        $injector: g.a,\n        dispose: function() {\n          return null;\n        }\n      };\n    }\n    var n = Object(w.d)(\"vanilla.hashBangLocation\", !1, A.a, u.a), t = Object(w.d)(\"vanilla.pushStateLocation\", !0, E.a, u.a), r = Object(w.d)(\"vanilla.memoryLocation\", !1, y.a, x.a);\n  },\n  function(L, T, e) {\n    e.d(T, \"a\", function() {\n      return u;\n    });\n    var u = function() {\n      function A() {\n      }\n      return A.prototype.dispose = function(w) {\n      }, A;\n    }();\n  },\n  function(L, T, e) {\n    var u = e(247);\n    L.exports = {\n      Graph: u.Graph,\n      json: e(349),\n      alg: e(350),\n      version: u.version\n    };\n  },\n  function(L, T, e) {\n    var u = e(73), A = e(119), w = e(78), E = e(277), y = e(283), x = e(155), g = e(156), o = e(286), c = e(287), a = e(160), n = e(288), t = e(60), r = e(292), l = e(293), h = e(165), i = e(13), d = e(59), p = e(297), f = e(23), v = e(299), k = e(41), s = e(48), S = {};\n    S[\"[object Arguments]\"] = S[\"[object Array]\"] = S[\"[object ArrayBuffer]\"] = S[\"[object DataView]\"] = S[\"[object Boolean]\"] = S[\"[object Date]\"] = S[\"[object Float32Array]\"] = S[\"[object Float64Array]\"] = S[\"[object Int8Array]\"] = S[\"[object Int16Array]\"] = S[\"[object Int32Array]\"] = S[\"[object Map]\"] = S[\"[object Number]\"] = S[\"[object Object]\"] = S[\"[object RegExp]\"] = S[\"[object Set]\"] = S[\"[object String]\"] = S[\"[object Symbol]\"] = S[\"[object Uint8Array]\"] = S[\"[object Uint8ClampedArray]\"] = S[\"[object Uint16Array]\"] = S[\"[object Uint32Array]\"] = !0, S[\"[object Error]\"] = S[\"[object Function]\"] = S[\"[object WeakMap]\"] = !1, L.exports = function j(I, R, M, z, V, G) {\n      var Y, tt = 1 & R, Z = 2 & R, at = 4 & R;\n      if (M && (Y = V ? M(I, z, V, G) : M(I)), Y !== void 0) return Y;\n      if (!f(I)) return I;\n      var nt = i(I);\n      if (nt) {\n        if (Y = r(I), !tt) return g(I, Y);\n      } else {\n        var ht = t(I), ct = ht == \"[object Function]\" || ht == \"[object GeneratorFunction]\";\n        if (d(I)) return x(I, tt);\n        if (ht == \"[object Object]\" || ht == \"[object Arguments]\" || ct && !V) {\n          if (Y = Z || ct ? {} : h(I), !tt)\n            return Z ? c(I, y(Y, I)) : o(I, E(Y, I));\n        } else {\n          if (!S[ht]) return V ? I : {};\n          Y = l(I, ht, tt);\n        }\n      }\n      G || (G = new u());\n      var ot = G.get(I);\n      if (ot) return ot;\n      G.set(I, Y), v(I) ? I.forEach(function(xt) {\n        Y.add(j(xt, R, M, xt, I, G));\n      }) : p(I) && I.forEach(function(xt, St) {\n        Y.set(St, j(xt, R, M, St, I, G));\n      });\n      var gt = nt ? void 0 : (at ? Z ? n : a : Z ? s : k)(I);\n      return A(gt || I, function(xt, St) {\n        gt && (xt = I[St = xt]), w(Y, St, j(xt, R, M, St, I, G));\n      }), Y;\n    };\n  },\n  function(L, T, e) {\n    (function(u) {\n      var A = typeof u == \"object\" && u && u.Object === Object && u;\n      L.exports = A;\n    }).call(this, e(35));\n  },\n  function(L, T) {\n    var e = Function.prototype.toString;\n    L.exports = function(u) {\n      if (u != null) {\n        try {\n          return e.call(u);\n        } catch {\n        }\n        try {\n          return u + \"\";\n        } catch {\n        }\n      }\n      return \"\";\n    };\n  },\n  function(L, T, e) {\n    var u = e(46), A = function() {\n      try {\n        var w = u(Object, \"defineProperty\");\n        return w({}, \"\", {}), w;\n      } catch {\n      }\n    }();\n    L.exports = A;\n  },\n  function(L, T, e) {\n    var u = e(278), A = e(66), w = e(13), E = e(59), y = e(81), x = e(67), g = Object.prototype.hasOwnProperty;\n    L.exports = function(o, c) {\n      var a = w(o), n = !a && A(o), t = !a && !n && E(o), r = !a && !n && !t && x(o), l = a || n || t || r, h = l ? u(o.length, String) : [], i = h.length;\n      for (var d in o)\n        !c && !g.call(o, d) || l && (d == \"length\" || t && (d == \"offset\" || d == \"parent\") || r && (d == \"buffer\" || d == \"byteLength\" || d == \"byteOffset\") || y(d, i)) || h.push(d);\n      return h;\n    };\n  },\n  function(L, T) {\n    L.exports = function(e, u) {\n      return function(A) {\n        return e(u(A));\n      };\n    };\n  },\n  function(L, T, e) {\n    (function(u) {\n      var A = e(29), w = T && !T.nodeType && T, E = w && typeof u == \"object\" && u && !u.nodeType && u, y = E && E.exports === w ? A.Buffer : void 0, x = y ? y.allocUnsafe : void 0;\n      u.exports = function(g, o) {\n        if (o) return g.slice();\n        var c = g.length, a = x ? x(c) : new g.constructor(c);\n        return g.copy(a), a;\n      };\n    }).call(this, e(80)(L));\n  },\n  function(L, T) {\n    L.exports = function(e, u) {\n      var A = -1, w = e.length;\n      for (u || (u = Array(w)); ++A < w; ) u[A] = e[A];\n      return u;\n    };\n  },\n  function(L, T) {\n    L.exports = function(e, u) {\n      for (var A = -1, w = e == null ? 0 : e.length, E = 0, y = []; ++A < w; ) {\n        var x = e[A];\n        u(x, A, e) && (y[E++] = x);\n      }\n      return y;\n    };\n  },\n  function(L, T) {\n    L.exports = function() {\n      return [];\n    };\n  },\n  function(L, T, e) {\n    var u = e(124), A = e(84), w = e(123), E = e(158), y = Object.getOwnPropertySymbols ? function(x) {\n      for (var g = []; x; ) u(g, w(x)), x = A(x);\n      return g;\n    } : E;\n    L.exports = y;\n  },\n  function(L, T, e) {\n    var u = e(161), A = e(123), w = e(41);\n    L.exports = function(E) {\n      return u(E, w, A);\n    };\n  },\n  function(L, T, e) {\n    var u = e(124), A = e(13);\n    L.exports = function(w, E, y) {\n      var x = E(w);\n      return A(w) ? x : u(x, y(w));\n    };\n  },\n  function(L, T, e) {\n    var u = e(46)(e(29), \"Set\");\n    L.exports = u;\n  },\n  function(L, T, e) {\n    var u = e(29).Uint8Array;\n    L.exports = u;\n  },\n  function(L, T, e) {\n    var u = e(125);\n    L.exports = function(A, w) {\n      var E = w ? u(A.buffer) : A.buffer;\n      return new A.constructor(E, A.byteOffset, A.length);\n    };\n  },\n  function(L, T, e) {\n    var u = e(166), A = e(84), w = e(83);\n    L.exports = function(E) {\n      return typeof E.constructor != \"function\" || w(E) ? {} : u(A(E));\n    };\n  },\n  function(L, T, e) {\n    var u = e(23), A = Object.create, w = /* @__PURE__ */ function() {\n      function E() {\n      }\n      return function(y) {\n        if (!u(y)) return {};\n        if (A) return A(y);\n        E.prototype = y;\n        var x = new E();\n        return E.prototype = void 0, x;\n      };\n    }();\n    L.exports = w;\n  },\n  function(L, T, e) {\n    L.exports = e(168);\n  },\n  function(L, T, e) {\n    var u = e(119), A = e(85), w = e(169), E = e(13);\n    L.exports = function(y, x) {\n      return (E(y) ? u : A)(y, w(x));\n    };\n  },\n  function(L, T, e) {\n    var u = e(49);\n    L.exports = function(A) {\n      return typeof A == \"function\" ? A : u;\n    };\n  },\n  function(L, T, e) {\n    var u = e(157), A = e(303), w = e(37), E = e(13);\n    L.exports = function(y, x) {\n      return (E(y) ? u : A)(y, w(x, 3));\n    };\n  },\n  function(L, T, e) {\n    var u = e(306), A = e(34);\n    L.exports = function w(E, y, x, g, o) {\n      return E === y || (E == null || y == null || !A(E) && !A(y) ? E != E && y != y : u(E, y, x, g, w, o));\n    };\n  },\n  function(L, T, e) {\n    var u = e(173), A = e(309), w = e(174);\n    L.exports = function(E, y, x, g, o, c) {\n      var a = 1 & x, n = E.length, t = y.length;\n      if (n != t && !(a && t > n)) return !1;\n      var r = c.get(E), l = c.get(y);\n      if (r && l) return r == y && l == E;\n      var h = -1, i = !0, d = 2 & x ? new u() : void 0;\n      for (c.set(E, y), c.set(y, E); ++h < n; ) {\n        var p = E[h], f = y[h];\n        if (g) var v = a ? g(f, p, h, y, E, c) : g(p, f, h, E, y, c);\n        if (v !== void 0) {\n          if (v) continue;\n          i = !1;\n          break;\n        }\n        if (d) {\n          if (!A(y, function(k, s) {\n            if (!w(d, s) && (p === k || o(p, k, x, g, c))) return d.push(s);\n          })) {\n            i = !1;\n            break;\n          }\n        } else if (p !== f && !o(p, f, x, g, c)) {\n          i = !1;\n          break;\n        }\n      }\n      return c.delete(E), c.delete(y), i;\n    };\n  },\n  function(L, T, e) {\n    var u = e(118), A = e(307), w = e(308);\n    function E(y) {\n      var x = -1, g = y == null ? 0 : y.length;\n      for (this.__data__ = new u(); ++x < g; ) this.add(y[x]);\n    }\n    E.prototype.add = E.prototype.push = A, E.prototype.has = w, L.exports = E;\n  },\n  function(L, T) {\n    L.exports = function(e, u) {\n      return e.has(u);\n    };\n  },\n  function(L, T, e) {\n    var u = e(23);\n    L.exports = function(A) {\n      return A == A && !u(A);\n    };\n  },\n  function(L, T) {\n    L.exports = function(e, u) {\n      return function(A) {\n        return A != null && A[e] === u && (u !== void 0 || e in Object(A));\n      };\n    };\n  },\n  function(L, T, e) {\n    var u = e(319);\n    L.exports = function(A) {\n      return A == null ? \"\" : u(A);\n    };\n  },\n  function(L, T, e) {\n    var u = e(320), A = e(179);\n    L.exports = function(w, E) {\n      return w != null && A(w, E, u);\n    };\n  },\n  function(L, T, e) {\n    var u = e(87), A = e(66), w = e(13), E = e(81), y = e(120), x = e(68);\n    L.exports = function(g, o, c) {\n      for (var a = -1, n = (o = u(o, g)).length, t = !1; ++a < n; ) {\n        var r = x(o[a]);\n        if (!(t = g != null && c(g, r))) break;\n        g = g[r];\n      }\n      return t || ++a != n ? t : !!(n = g == null ? 0 : g.length) && y(n) && E(r, n) && (w(g) || A(g));\n    };\n  },\n  function(L, T) {\n    L.exports = function(e) {\n      return function(u) {\n        return u == null ? void 0 : u[e];\n      };\n    };\n  },\n  function(L, T, e) {\n    var u = e(323), A = e(179);\n    L.exports = function(w, E) {\n      return w != null && A(w, E, u);\n    };\n  },\n  function(L, T) {\n    L.exports = function(e) {\n      return e === void 0;\n    };\n  },\n  function(L, T, e) {\n    var u = e(88), A = e(37), w = e(184), E = e(13);\n    L.exports = function(y, x) {\n      return (E(y) ? u : w)(y, A(x, 3));\n    };\n  },\n  function(L, T, e) {\n    var u = e(85), A = e(36);\n    L.exports = function(w, E) {\n      var y = -1, x = A(w) ? Array(w.length) : [];\n      return u(w, function(g, o, c) {\n        x[++y] = E(g, o, c);\n      }), x;\n    };\n  },\n  function(L, T, e) {\n    var u = e(325), A = e(85), w = e(37), E = e(326), y = e(13);\n    L.exports = function(x, g, o) {\n      var c = y(x) ? u : E, a = arguments.length < 3;\n      return c(x, w(g, 4), o, a, A);\n    };\n  },\n  function(L, T, e) {\n    var u = e(336), A = Math.max;\n    L.exports = function(w, E, y) {\n      return E = A(E === void 0 ? w.length - 1 : E, 0), function() {\n        for (var x = arguments, g = -1, o = A(x.length - E, 0), c = Array(o); ++g < o; )\n          c[g] = x[E + g];\n        g = -1;\n        for (var a = Array(E + 1); ++g < E; ) a[g] = x[g];\n        return a[E] = y(c), u(w, this, a);\n      };\n    };\n  },\n  function(L, T, e) {\n    var u = e(337), A = e(338)(u);\n    L.exports = A;\n  },\n  function(L, T) {\n    L.exports = function(e, u, A, w) {\n      for (var E = e.length, y = A + (w ? 1 : -1); w ? y-- : ++y < E; )\n        if (u(e[y], y, e)) return y;\n      return -1;\n    };\n  },\n  function(L, T, e) {\n    var u = e(36), A = e(34);\n    L.exports = function(w) {\n      return A(w) && u(w);\n    };\n  },\n  function(L, T, e) {\n    var u = e(347), A = e(41);\n    L.exports = function(w) {\n      return w == null ? [] : u(w, A(w));\n    };\n  },\n  function(L, T, e) {\n    var u = e(22), A = e(192);\n    L.exports = function(E, y, x, g) {\n      return function(o, c, a, n) {\n        var t, r, l = {}, h = new A(), i = function(d) {\n          var p = d.v !== t ? d.v : d.w, f = l[p], v = a(d), k = r.distance + v;\n          if (v < 0)\n            throw new Error(\n              \"dijkstra does not allow negative edge weights. Bad edge: \" + d + \" Weight: \" + v\n            );\n          k < f.distance && (f.distance = k, f.predecessor = t, h.decrease(p, k));\n        };\n        for (o.nodes().forEach(function(d) {\n          var p = d === c ? 0 : Number.POSITIVE_INFINITY;\n          l[d] = { distance: p }, h.add(d, p);\n        }); h.size() > 0 && (t = h.removeMin(), (r = l[t]).distance !== Number.POSITIVE_INFINITY); )\n          n(t).forEach(i);\n        return l;\n      }(\n        E,\n        String(y),\n        x || w,\n        g || function(o) {\n          return E.outEdges(o);\n        }\n      );\n    };\n    var w = u.constant(1);\n  },\n  function(L, T, e) {\n    var u = e(22);\n    function A() {\n      this._arr = [], this._keyIndices = {};\n    }\n    L.exports = A, A.prototype.size = function() {\n      return this._arr.length;\n    }, A.prototype.keys = function() {\n      return this._arr.map(function(w) {\n        return w.key;\n      });\n    }, A.prototype.has = function(w) {\n      return u.has(this._keyIndices, w);\n    }, A.prototype.priority = function(w) {\n      var E = this._keyIndices[w];\n      if (E !== void 0) return this._arr[E].priority;\n    }, A.prototype.min = function() {\n      if (this.size() === 0) throw new Error(\"Queue underflow\");\n      return this._arr[0].key;\n    }, A.prototype.add = function(w, E) {\n      var y = this._keyIndices;\n      if (w = String(w), !u.has(y, w)) {\n        var x = this._arr, g = x.length;\n        return y[w] = g, x.push({ key: w, priority: E }), this._decrease(g), !0;\n      }\n      return !1;\n    }, A.prototype.removeMin = function() {\n      this._swap(0, this._arr.length - 1);\n      var w = this._arr.pop();\n      return delete this._keyIndices[w.key], this._heapify(0), w.key;\n    }, A.prototype.decrease = function(w, E) {\n      var y = this._keyIndices[w];\n      if (E > this._arr[y].priority)\n        throw new Error(\n          \"New priority is greater than current priority. Key: \" + w + \" Old: \" + this._arr[y].priority + \" New: \" + E\n        );\n      this._arr[y].priority = E, this._decrease(y);\n    }, A.prototype._heapify = function(w) {\n      var E = this._arr, y = 2 * w, x = y + 1, g = w;\n      y < E.length && (g = E[y].priority < E[g].priority ? y : g, x < E.length && (g = E[x].priority < E[g].priority ? x : g), g !== w && (this._swap(w, g), this._heapify(g)));\n    }, A.prototype._decrease = function(w) {\n      for (var E, y = this._arr, x = y[w].priority; w !== 0 && !(y[E = w >> 1].priority < x); )\n        this._swap(w, E), w = E;\n    }, A.prototype._swap = function(w, E) {\n      var y = this._arr, x = this._keyIndices, g = y[w], o = y[E];\n      y[w] = o, y[E] = g, x[o.key] = w, x[g.key] = E;\n    };\n  },\n  function(L, T, e) {\n    var u = e(22);\n    L.exports = function(A) {\n      var w = 0, E = [], y = {}, x = [];\n      return A.nodes().forEach(function(g) {\n        u.has(y, g) || function o(c) {\n          var a = y[c] = { onStack: !0, lowlink: w, index: w++ };\n          if (E.push(c), A.successors(c).forEach(function(r) {\n            u.has(y, r) ? y[r].onStack && (a.lowlink = Math.min(a.lowlink, y[r].index)) : (o(r), a.lowlink = Math.min(a.lowlink, y[r].lowlink));\n          }), a.lowlink === a.index) {\n            var n, t = [];\n            do\n              n = E.pop(), y[n].onStack = !1, t.push(n);\n            while (c !== n);\n            x.push(t);\n          }\n        }(g);\n      }), x;\n    };\n  },\n  function(L, T, e) {\n    var u = e(22);\n    function A(E) {\n      var y = {}, x = {}, g = [];\n      if (u.each(E.sinks(), function o(c) {\n        if (u.has(x, c)) throw new w();\n        u.has(y, c) || (x[c] = !0, y[c] = !0, u.each(E.predecessors(c), o), delete x[c], g.push(c));\n      }), u.size(y) !== E.nodeCount())\n        throw new w();\n      return g;\n    }\n    function w() {\n    }\n    L.exports = A, A.CycleException = w, w.prototype = new Error();\n  },\n  function(L, T, e) {\n    var u = e(22);\n    L.exports = function(A, w, E) {\n      u.isArray(w) || (w = [w]);\n      var y = (A.isDirected() ? A.successors : A.neighbors).bind(A), x = [], g = {};\n      return u.each(w, function(o) {\n        if (!A.hasNode(o)) throw new Error(\"Graph does not have node: \" + o);\n        (function c(a, n, t, r, l, h) {\n          u.has(r, n) || (r[n] = !0, t || h.push(n), u.each(l(n), function(i) {\n            c(a, i, t, r, l, h);\n          }), t && h.push(n));\n        })(A, o, E === \"post\", g, y, x);\n      }), x;\n    };\n  },\n  function(L, T, e) {\n    var u = e(366);\n    L.exports = function(A) {\n      return A ? (A = u(A)) === 1 / 0 || A === -1 / 0 ? 17976931348623157e292 * (A < 0 ? -1 : 1) : A == A ? A : 0 : A === 0 ? A : 0;\n    };\n  },\n  function(L, T, e) {\n    var u = e(131);\n    L.exports = function(A) {\n      return A != null && A.length ? u(A, 1) : [];\n    };\n  },\n  function(L, T, e) {\n    var u = e(79), A = e(57);\n    L.exports = function(w, E, y) {\n      (y !== void 0 && !A(w[E], y) || y === void 0 && !(E in w)) && u(w, E, y);\n    };\n  },\n  function(L, T) {\n    L.exports = function(e, u) {\n      if ((u !== \"constructor\" || typeof e[u] != \"function\") && u != \"__proto__\")\n        return e[u];\n    };\n  },\n  function(L, T) {\n    L.exports = function(e, u) {\n      return e < u;\n    };\n  },\n  function(L, T, e) {\n    var u = e(11), A = e(28).Graph, w = e(91).slack;\n    function E(g, o) {\n      return u.forEach(g.nodes(), function c(a) {\n        u.forEach(o.nodeEdges(a), function(n) {\n          var t = n.v, r = a === t ? n.w : t;\n          g.hasNode(r) || w(o, n) || (g.setNode(r, {}), g.setEdge(a, r, {}), c(r));\n        });\n      }), g.nodeCount();\n    }\n    function y(g, o) {\n      return u.minBy(o.edges(), function(c) {\n        if (g.hasNode(c.v) !== g.hasNode(c.w)) return w(o, c);\n      });\n    }\n    function x(g, o, c) {\n      u.forEach(g.nodes(), function(a) {\n        o.node(a).rank += c;\n      });\n    }\n    L.exports = function(g) {\n      var o, c, a = new A({ directed: !1 }), n = g.nodes()[0], t = g.nodeCount();\n      for (a.setNode(n, {}); E(a, g) < t; )\n        o = y(a, g), c = a.hasNode(o.v) ? w(g, o) : -w(g, o), x(a, g, c);\n      return a;\n    };\n  },\n  function(L, T, e) {\n    (function(u, A) {\n      var w;\n      /**\n       * @license\n       * Lodash <https://lodash.com/>\n       * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n       * Released under MIT license <https://lodash.com/license>\n       * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n       * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n       */\n      (function() {\n        var E = \"Expected a function\", y = \"__lodash_placeholder__\", x = [\n          [\"ary\", 128],\n          [\"bind\", 1],\n          [\"bindKey\", 2],\n          [\"curry\", 8],\n          [\"curryRight\", 16],\n          [\"flip\", 512],\n          [\"partial\", 32],\n          [\"partialRight\", 64],\n          [\"rearg\", 256]\n        ], g = \"[object Arguments]\", o = \"[object Array]\", c = \"[object Boolean]\", a = \"[object Date]\", n = \"[object Error]\", t = \"[object Function]\", r = \"[object GeneratorFunction]\", l = \"[object Map]\", h = \"[object Number]\", i = \"[object Object]\", d = \"[object RegExp]\", p = \"[object Set]\", f = \"[object String]\", v = \"[object Symbol]\", k = \"[object WeakMap]\", s = \"[object ArrayBuffer]\", S = \"[object DataView]\", j = \"[object Float32Array]\", I = \"[object Float64Array]\", R = \"[object Int8Array]\", M = \"[object Int16Array]\", z = \"[object Int32Array]\", V = \"[object Uint8Array]\", G = \"[object Uint16Array]\", Y = \"[object Uint32Array]\", tt = /\\b__p \\+= '';/g, Z = /\\b(__p \\+=) '' \\+/g, at = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g, nt = /&(?:amp|lt|gt|quot|#39);/g, ht = /[&<>\"']/g, ct = RegExp(nt.source), ot = RegExp(ht.source), gt = /<%-([\\s\\S]+?)%>/g, xt = /<%([\\s\\S]+?)%>/g, St = /<%=([\\s\\S]+?)%>/g, zt = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/, Nt = /^\\w*$/, re = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g, be = /[\\\\^$.*+?()[\\]{}|]/g, ne = RegExp(be.source), ce = /^\\s+/, xe = /\\s/, we = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/, ae = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/, Le = /,? & /, lt = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g, kt = /[()=,{}\\[\\]\\/\\s]/, Dt = /\\\\(\\\\)?/g, yt = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g, ft = /\\w*$/, Rt = /^[-+]0x[0-9a-f]+$/i, Wt = /^0b[01]+$/i, le = /^\\[object .+?Constructor\\]$/, ye = /^0o[0-7]+$/i, pe = /^(?:0|[1-9]\\d*)$/, je = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g, Me = /($^)/, Ze = /['\\n\\r\\u2028\\u2029\\\\]/g, ir = \"\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff\", Ar = \"\\\\xac\\\\xb1\\\\xd7\\\\xf7\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf\\\\u2000-\\\\u206f \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\", rr = \"[\\\\ud800-\\\\udfff]\", zr = \"[\" + Ar + \"]\", ln = \"[\" + ir + \"]\", mn = \"\\\\d+\", un = \"[\\\\u2700-\\\\u27bf]\", Kr = \"[a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff]\", yn = \"[^\\\\ud800-\\\\udfff\" + Ar + mn + \"\\\\u2700-\\\\u27bfa-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xffA-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde]\", nn = \"\\\\ud83c[\\\\udffb-\\\\udfff]\", Ei = \"[^\\\\ud800-\\\\udfff]\", ri = \"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\", Yn = \"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\", tn = \"[A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde]\", xn = \"(?:\" + Kr + \"|\" + yn + \")\", Tn = \"(?:\" + tn + \"|\" + yn + \")\", Kn = \"(?:\" + ln + \"|\" + nn + \")?\", ar = \"[\\\\ufe0e\\\\ufe0f]?\" + Kn + (\"(?:\\\\u200d(?:\" + [Ei, ri, Yn].join(\"|\") + \")[\\\\ufe0e\\\\ufe0f]?\" + Kn + \")*\"), Yr = \"(?:\" + [un, ri, Yn].join(\"|\") + \")\" + ar, gn = \"(?:\" + [Ei + ln + \"?\", ln, ri, Yn, rr].join(\"|\") + \")\", vn = RegExp(\"['’]\", \"g\"), Wr = RegExp(ln, \"g\"), Ur = RegExp(nn + \"(?=\" + nn + \")|\" + gn + ar, \"g\"), Pn = RegExp(\n          [\n            tn + \"?\" + Kr + \"+(?:['’](?:d|ll|m|re|s|t|ve))?(?=\" + [zr, tn, \"$\"].join(\"|\") + \")\",\n            Tn + \"+(?:['’](?:D|LL|M|RE|S|T|VE))?(?=\" + [zr, tn + xn, \"$\"].join(\"|\") + \")\",\n            tn + \"?\" + xn + \"+(?:['’](?:d|ll|m|re|s|t|ve))?\",\n            tn + \"+(?:['’](?:D|LL|M|RE|S|T|VE))?\",\n            \"\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])\",\n            \"\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])\",\n            mn,\n            Yr\n          ].join(\"|\"),\n          \"g\"\n        ), Fn = RegExp(\"[\\\\u200d\\\\ud800-\\\\udfff\" + ir + \"\\\\ufe0e\\\\ufe0f]\"), In = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/, ni = [\n          \"Array\",\n          \"Buffer\",\n          \"DataView\",\n          \"Date\",\n          \"Error\",\n          \"Float32Array\",\n          \"Float64Array\",\n          \"Function\",\n          \"Int8Array\",\n          \"Int16Array\",\n          \"Int32Array\",\n          \"Map\",\n          \"Math\",\n          \"Object\",\n          \"Promise\",\n          \"RegExp\",\n          \"Set\",\n          \"String\",\n          \"Symbol\",\n          \"TypeError\",\n          \"Uint8Array\",\n          \"Uint8ClampedArray\",\n          \"Uint16Array\",\n          \"Uint32Array\",\n          \"WeakMap\",\n          \"_\",\n          \"clearTimeout\",\n          \"isFinite\",\n          \"parseInt\",\n          \"setTimeout\"\n        ], Xn = -1, ur = {};\n        ur[j] = ur[I] = ur[R] = ur[M] = ur[z] = ur[V] = ur[\"[object Uint8ClampedArray]\"] = ur[G] = ur[Y] = !0, ur[g] = ur[o] = ur[s] = ur[c] = ur[S] = ur[a] = ur[n] = ur[t] = ur[l] = ur[h] = ur[i] = ur[d] = ur[p] = ur[f] = ur[k] = !1;\n        var _r = {};\n        _r[g] = _r[o] = _r[s] = _r[S] = _r[c] = _r[a] = _r[j] = _r[I] = _r[R] = _r[M] = _r[z] = _r[l] = _r[h] = _r[i] = _r[d] = _r[p] = _r[f] = _r[v] = _r[V] = _r[\"[object Uint8ClampedArray]\"] = _r[G] = _r[Y] = !0, _r[n] = _r[t] = _r[k] = !1;\n        var Gi = {\n          \"\\\\\": \"\\\\\",\n          \"'\": \"'\",\n          \"\\n\": \"n\",\n          \"\\r\": \"r\",\n          \"\\u2028\": \"u2028\",\n          \"\\u2029\": \"u2029\"\n        }, Si = parseFloat, $a = parseInt, To = typeof u == \"object\" && u && u.Object === Object && u, wo = typeof self == \"object\" && self && self.Object === Object && self, Vn = To || wo || Function(\"return this\")(), pa = T && !T.nodeType && T, ko = pa && typeof A == \"object\" && A && !A.nodeType && A, Ao = ko && ko.exports === pa, Po = Ao && To.process, Nn = function() {\n          try {\n            var Xt = ko && ko.require && ko.require(\"util\").types;\n            return Xt || Po && Po.binding && Po.binding(\"util\");\n          } catch {\n          }\n        }(), pi = Nn && Nn.isArrayBuffer, Fo = Nn && Nn.isDate, ui = Nn && Nn.isMap, Ri = Nn && Nn.isRegExp, qo = Nn && Nn.isSet, wn = Nn && Nn.isTypedArray;\n        function Sn(Xt, ke, $) {\n          switch ($.length) {\n            case 0:\n              return Xt.call(ke);\n            case 1:\n              return Xt.call(ke, $[0]);\n            case 2:\n              return Xt.call(ke, $[0], $[1]);\n            case 3:\n              return Xt.call(ke, $[0], $[1], $[2]);\n          }\n          return Xt.apply(ke, $);\n        }\n        function Do(Xt, ke, $, P) {\n          for (var U = -1, W = Xt == null ? 0 : Xt.length; ++U < W; ) {\n            var et = Xt[U];\n            ke(P, et, $(et), Xt);\n          }\n          return P;\n        }\n        function Dn(Xt, ke) {\n          for (var $ = -1, P = Xt == null ? 0 : Xt.length; ++$ < P && ke(Xt[$], $, Xt) !== !1; ) ;\n          return Xt;\n        }\n        function Wi(Xt, ke) {\n          for (var $ = Xt == null ? 0 : Xt.length; $-- && ke(Xt[$], $, Xt) !== !1; ) ;\n          return Xt;\n        }\n        function Eo(Xt, ke) {\n          for (var $ = -1, P = Xt == null ? 0 : Xt.length; ++$ < P; )\n            if (!ke(Xt[$], $, Xt)) return !1;\n          return !0;\n        }\n        function hi(Xt, ke) {\n          for (var $ = -1, P = Xt == null ? 0 : Xt.length, U = 0, W = []; ++$ < P; ) {\n            var et = Xt[$];\n            ke(et, $, Xt) && (W[U++] = et);\n          }\n          return W;\n        }\n        function ro(Xt, ke) {\n          return !!(Xt != null && Xt.length) && ci(Xt, ke, 0) > -1;\n        }\n        function Ro(Xt, ke, $) {\n          for (var P = -1, U = Xt == null ? 0 : Xt.length; ++P < U; )\n            if ($(ke, Xt[P])) return !0;\n          return !1;\n        }\n        function sr(Xt, ke) {\n          for (var $ = -1, P = Xt == null ? 0 : Xt.length, U = Array(P); ++$ < P; )\n            U[$] = ke(Xt[$], $, Xt);\n          return U;\n        }\n        function Ci(Xt, ke) {\n          for (var $ = -1, P = ke.length, U = Xt.length; ++$ < P; )\n            Xt[U + $] = ke[$];\n          return Xt;\n        }\n        function gi(Xt, ke, $, P) {\n          var U = -1, W = Xt == null ? 0 : Xt.length;\n          for (P && W && ($ = Xt[++U]); ++U < W; ) $ = ke($, Xt[U], U, Xt);\n          return $;\n        }\n        function ha(Xt, ke, $, P) {\n          var U = Xt == null ? 0 : Xt.length;\n          for (P && U && ($ = Xt[--U]); U--; ) $ = ke($, Xt[U], U, Xt);\n          return $;\n        }\n        function Io(Xt, ke) {\n          for (var $ = -1, P = Xt == null ? 0 : Xt.length; ++$ < P; )\n            if (ke(Xt[$], $, Xt)) return !0;\n          return !1;\n        }\n        var $i = fn(\"length\");\n        function _i(Xt, ke, $) {\n          var P;\n          return $(Xt, function(U, W, et) {\n            if (ke(U, W, et)) return P = W, !1;\n          }), P;\n        }\n        function Yi(Xt, ke, $, P) {\n          for (var U = Xt.length, W = $ + (P ? 1 : -1); P ? W-- : ++W < U; )\n            if (ke(Xt[W], W, Xt)) return W;\n          return -1;\n        }\n        function ci(Xt, ke, $) {\n          return ke == ke ? function(P, U, W) {\n            for (var et = W - 1, dt = P.length; ++et < dt; ) if (P[et] === U) return et;\n            return -1;\n          }(Xt, ke, $) : Yi(Xt, xi, $);\n        }\n        function Ii(Xt, ke, $, P) {\n          for (var U = $ - 1, W = Xt.length; ++U < W; ) if (P(Xt[U], ke)) return U;\n          return -1;\n        }\n        function xi(Xt) {\n          return Xt != Xt;\n        }\n        function Xi(Xt, ke) {\n          var $ = Xt == null ? 0 : Xt.length;\n          return $ ? no(Xt, ke) / $ : NaN;\n        }\n        function fn(Xt) {\n          return function(ke) {\n            return ke == null ? void 0 : ke[Xt];\n          };\n        }\n        function mi(Xt) {\n          return function(ke) {\n            return Xt == null ? void 0 : Xt[ke];\n          };\n        }\n        function No(Xt, ke, $, P, U) {\n          return U(Xt, function(W, et, dt) {\n            $ = P ? (P = !1, W) : ke($, W, et, dt);\n          }), $;\n        }\n        function no(Xt, ke) {\n          for (var $, P = -1, U = Xt.length; ++P < U; ) {\n            var W = ke(Xt[P]);\n            W !== void 0 && ($ = $ === void 0 ? W : $ + W);\n          }\n          return $;\n        }\n        function di(Xt, ke) {\n          for (var $ = -1, P = Array(Xt); ++$ < Xt; ) P[$] = ke($);\n          return P;\n        }\n        function Zi(Xt) {\n          return Xt && Xt.slice(0, ji(Xt) + 1).replace(ce, \"\");\n        }\n        function qn(Xt) {\n          return function(ke) {\n            return Xt(ke);\n          };\n        }\n        function co(Xt, ke) {\n          return sr(ke, function($) {\n            return Xt[$];\n          });\n        }\n        function fo(Xt, ke) {\n          return Xt.has(ke);\n        }\n        function wi(Xt, ke) {\n          for (var $ = -1, P = Xt.length; ++$ < P && ci(ke, Xt[$], 0) > -1; ) ;\n          return $;\n        }\n        function Oi(Xt, ke) {\n          for (var $ = Xt.length; $-- && ci(ke, Xt[$], 0) > -1; ) ;\n          return $;\n        }\n        function Uo(Xt, ke) {\n          for (var $ = Xt.length, P = 0; $--; ) Xt[$] === ke && ++P;\n          return P;\n        }\n        var ga = mi({\n          À: \"A\",\n          Á: \"A\",\n          Â: \"A\",\n          Ã: \"A\",\n          Ä: \"A\",\n          Å: \"A\",\n          à: \"a\",\n          á: \"a\",\n          â: \"a\",\n          ã: \"a\",\n          ä: \"a\",\n          å: \"a\",\n          Ç: \"C\",\n          ç: \"c\",\n          Ð: \"D\",\n          ð: \"d\",\n          È: \"E\",\n          É: \"E\",\n          Ê: \"E\",\n          Ë: \"E\",\n          è: \"e\",\n          é: \"e\",\n          ê: \"e\",\n          ë: \"e\",\n          Ì: \"I\",\n          Í: \"I\",\n          Î: \"I\",\n          Ï: \"I\",\n          ì: \"i\",\n          í: \"i\",\n          î: \"i\",\n          ï: \"i\",\n          Ñ: \"N\",\n          ñ: \"n\",\n          Ò: \"O\",\n          Ó: \"O\",\n          Ô: \"O\",\n          Õ: \"O\",\n          Ö: \"O\",\n          Ø: \"O\",\n          ò: \"o\",\n          ó: \"o\",\n          ô: \"o\",\n          õ: \"o\",\n          ö: \"o\",\n          ø: \"o\",\n          Ù: \"U\",\n          Ú: \"U\",\n          Û: \"U\",\n          Ü: \"U\",\n          ù: \"u\",\n          ú: \"u\",\n          û: \"u\",\n          ü: \"u\",\n          Ý: \"Y\",\n          ý: \"y\",\n          ÿ: \"y\",\n          Æ: \"Ae\",\n          æ: \"ae\",\n          Þ: \"Th\",\n          þ: \"th\",\n          ß: \"ss\",\n          Ā: \"A\",\n          Ă: \"A\",\n          Ą: \"A\",\n          ā: \"a\",\n          ă: \"a\",\n          ą: \"a\",\n          Ć: \"C\",\n          Ĉ: \"C\",\n          Ċ: \"C\",\n          Č: \"C\",\n          ć: \"c\",\n          ĉ: \"c\",\n          ċ: \"c\",\n          č: \"c\",\n          Ď: \"D\",\n          Đ: \"D\",\n          ď: \"d\",\n          đ: \"d\",\n          Ē: \"E\",\n          Ĕ: \"E\",\n          Ė: \"E\",\n          Ę: \"E\",\n          Ě: \"E\",\n          ē: \"e\",\n          ĕ: \"e\",\n          ė: \"e\",\n          ę: \"e\",\n          ě: \"e\",\n          Ĝ: \"G\",\n          Ğ: \"G\",\n          Ġ: \"G\",\n          Ģ: \"G\",\n          ĝ: \"g\",\n          ğ: \"g\",\n          ġ: \"g\",\n          ģ: \"g\",\n          Ĥ: \"H\",\n          Ħ: \"H\",\n          ĥ: \"h\",\n          ħ: \"h\",\n          Ĩ: \"I\",\n          Ī: \"I\",\n          Ĭ: \"I\",\n          Į: \"I\",\n          İ: \"I\",\n          ĩ: \"i\",\n          ī: \"i\",\n          ĭ: \"i\",\n          į: \"i\",\n          ı: \"i\",\n          Ĵ: \"J\",\n          ĵ: \"j\",\n          Ķ: \"K\",\n          ķ: \"k\",\n          ĸ: \"k\",\n          Ĺ: \"L\",\n          Ļ: \"L\",\n          Ľ: \"L\",\n          Ŀ: \"L\",\n          Ł: \"L\",\n          ĺ: \"l\",\n          ļ: \"l\",\n          ľ: \"l\",\n          ŀ: \"l\",\n          ł: \"l\",\n          Ń: \"N\",\n          Ņ: \"N\",\n          Ň: \"N\",\n          Ŋ: \"N\",\n          ń: \"n\",\n          ņ: \"n\",\n          ň: \"n\",\n          ŋ: \"n\",\n          Ō: \"O\",\n          Ŏ: \"O\",\n          Ő: \"O\",\n          ō: \"o\",\n          ŏ: \"o\",\n          ő: \"o\",\n          Ŕ: \"R\",\n          Ŗ: \"R\",\n          Ř: \"R\",\n          ŕ: \"r\",\n          ŗ: \"r\",\n          ř: \"r\",\n          Ś: \"S\",\n          Ŝ: \"S\",\n          Ş: \"S\",\n          Š: \"S\",\n          ś: \"s\",\n          ŝ: \"s\",\n          ş: \"s\",\n          š: \"s\",\n          Ţ: \"T\",\n          Ť: \"T\",\n          Ŧ: \"T\",\n          ţ: \"t\",\n          ť: \"t\",\n          ŧ: \"t\",\n          Ũ: \"U\",\n          Ū: \"U\",\n          Ŭ: \"U\",\n          Ů: \"U\",\n          Ű: \"U\",\n          Ų: \"U\",\n          ũ: \"u\",\n          ū: \"u\",\n          ŭ: \"u\",\n          ů: \"u\",\n          ű: \"u\",\n          ų: \"u\",\n          Ŵ: \"W\",\n          ŵ: \"w\",\n          Ŷ: \"Y\",\n          ŷ: \"y\",\n          Ÿ: \"Y\",\n          Ź: \"Z\",\n          Ż: \"Z\",\n          Ž: \"Z\",\n          ź: \"z\",\n          ż: \"z\",\n          ž: \"z\",\n          Ĳ: \"IJ\",\n          ĳ: \"ij\",\n          Œ: \"Oe\",\n          œ: \"oe\",\n          ŉ: \"'n\",\n          ſ: \"s\"\n        }), Vo = mi({\n          \"&\": \"&amp;\",\n          \"<\": \"&lt;\",\n          \">\": \"&gt;\",\n          '\"': \"&quot;\",\n          \"'\": \"&#39;\"\n        });\n        function io(Xt) {\n          return \"\\\\\" + Gi[Xt];\n        }\n        function po(Xt) {\n          return Fn.test(Xt);\n        }\n        function Hn(Xt) {\n          var ke = -1, $ = Array(Xt.size);\n          return Xt.forEach(function(P, U) {\n            $[++ke] = [U, P];\n          }), $;\n        }\n        function Ni(Xt, ke) {\n          return function($) {\n            return Xt(ke($));\n          };\n        }\n        function Mn(Xt, ke) {\n          for (var $ = -1, P = Xt.length, U = 0, W = []; ++$ < P; ) {\n            var et = Xt[$];\n            et !== ke && et !== y || (Xt[$] = y, W[U++] = $);\n          }\n          return W;\n        }\n        function Mi(Xt) {\n          var ke = -1, $ = Array(Xt.size);\n          return Xt.forEach(function(P) {\n            $[++ke] = P;\n          }), $;\n        }\n        function So(Xt) {\n          var ke = -1, $ = Array(Xt.size);\n          return Xt.forEach(function(P) {\n            $[++ke] = [P, P];\n          }), $;\n        }\n        function Li(Xt) {\n          return po(Xt) ? function(ke) {\n            for (var $ = Ur.lastIndex = 0; Ur.test(ke); ) ++$;\n            return $;\n          }(Xt) : $i(Xt);\n        }\n        function ki(Xt) {\n          return po(Xt) ? function(ke) {\n            return ke.match(Ur) || [];\n          }(Xt) : function(ke) {\n            return ke.split(\"\");\n          }(Xt);\n        }\n        function ji(Xt) {\n          for (var ke = Xt.length; ke-- && xe.test(Xt.charAt(ke)); ) ;\n          return ke;\n        }\n        var zi = mi({\n          \"&amp;\": \"&\",\n          \"&lt;\": \"<\",\n          \"&gt;\": \">\",\n          \"&quot;\": '\"',\n          \"&#39;\": \"'\"\n        }), oo = function Xt(ke) {\n          var $, P = (ke = ke == null ? Vn : oo.defaults(Vn.Object(), ke, oo.pick(Vn, ni))).Array, U = ke.Date, W = ke.Error, et = ke.Function, dt = ke.Math, mt = ke.Object, Mt = ke.RegExp, Ut = ke.String, Zt = ke.TypeError, ve = P.prototype, Ae = et.prototype, de = mt.prototype, me = ke[\"__core-js_shared__\"], Be = Ae.toString, We = de.hasOwnProperty, tr = 0, bn = ($ = /[^.]+$/.exec(me && me.keys && me.keys.IE_PROTO || \"\")) ? \"Symbol(src)_1.\" + $ : \"\", Rn = de.toString, Qi = Be.call(mt), Br = Vn._, Or = Mt(\n            \"^\" + Be.call(We).replace(be, \"\\\\$&\").replace(\n              /hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\n              \"$1.*?\"\n            ) + \"$\"\n          ), rt = Ao ? ke.Buffer : void 0, pt = ke.Symbol, $t = ke.Uint8Array, It = rt ? rt.allocUnsafe : void 0, ee = Ni(mt.getPrototypeOf, mt), Ht = mt.create, he = de.propertyIsEnumerable, Ee = ve.splice, nr = pt ? pt.isConcatSpreadable : void 0, fr = pt ? pt.iterator : void 0, Rr = pt ? pt.toStringTag : void 0, Fr = function() {\n            try {\n              var b = Va(mt, \"defineProperty\");\n              return b({}, \"\", {}), b;\n            } catch {\n            }\n          }(), ii = ke.clearTimeout !== Vn.clearTimeout && ke.clearTimeout, Gn = U && U.now !== Vn.Date.now && U.now, Wn = ke.setTimeout !== Vn.setTimeout && ke.setTimeout, yr = dt.ceil, Xr = dt.floor, Zn = mt.getOwnPropertySymbols, ao = rt ? rt.isBuffer : void 0, ti = ke.isFinite, so = ve.join, ea = Ni(mt.keys, mt), ei = dt.max, Bi = dt.min, el = U.now, ma = ke.parseInt, Ia = dt.random, rl = ve.reverse, cs = Va(ke, \"DataView\"), Na = Va(ke, \"Map\"), va = Va(ke, \"Promise\"), _a = Va(ke, \"Set\"), ba = Va(ke, \"WeakMap\"), Ti = Va(mt, \"create\"), Co = ba && new ba(), ra = {}, Ps = Ga(cs), ds = Ga(Na), fs = Ga(va), on = Ga(_a), Ho = Ga(ba), Fi = pt ? pt.prototype : void 0, Pi = Fi ? Fi.valueOf : void 0, Ma = Fi ? Fi.toString : void 0;\n          function vt(b) {\n            if (Un(b) && !er(b) && !(b instanceof qr)) {\n              if (b instanceof ho) return b;\n              if (We.call(b, \"__wrapped__\")) return lu(b);\n            }\n            return new ho(b);\n          }\n          var Qo = /* @__PURE__ */ function() {\n            function b() {\n            }\n            return function(C) {\n              if (!ai(C)) return {};\n              if (Ht) return Ht(C);\n              b.prototype = C;\n              var B = new b();\n              return b.prototype = void 0, B;\n            };\n          }();\n          function La() {\n          }\n          function ho(b, C) {\n            this.__wrapped__ = b, this.__actions__ = [], this.__chain__ = !!C, this.__index__ = 0, this.__values__ = void 0;\n          }\n          function qr(b) {\n            this.__wrapped__ = b, this.__actions__ = [], this.__dir__ = 1, this.__filtered__ = !1, this.__iteratees__ = [], this.__takeCount__ = 4294967295, this.__views__ = [];\n          }\n          function lo(b) {\n            var C = -1, B = b == null ? 0 : b.length;\n            for (this.clear(); ++C < B; ) {\n              var J = b[C];\n              this.set(J[0], J[1]);\n            }\n          }\n          function Go(b) {\n            var C = -1, B = b == null ? 0 : b.length;\n            for (this.clear(); ++C < B; ) {\n              var J = b[C];\n              this.set(J[0], J[1]);\n            }\n          }\n          function go(b) {\n            var C = -1, B = b == null ? 0 : b.length;\n            for (this.clear(); ++C < B; ) {\n              var J = b[C];\n              this.set(J[0], J[1]);\n            }\n          }\n          function mo(b) {\n            var C = -1, B = b == null ? 0 : b.length;\n            for (this.__data__ = new go(); ++C < B; ) this.add(b[C]);\n          }\n          function vo(b) {\n            var C = this.__data__ = new Go(b);\n            this.size = C.size;\n          }\n          function na(b, C) {\n            var B = er(b), J = !B && Ln(b), ut = !B && !J && Ai(b), Et = !B && !J && !ut && Za(b), Lt = B || J || ut || Et, Gt = Lt ? di(b.length, Ut) : [], fe = Gt.length;\n            for (var $e in b)\n              !C && !We.call(b, $e) || Lt && ($e == \"length\" || ut && ($e == \"offset\" || $e == \"parent\") || Et && ($e == \"buffer\" || $e == \"byteLength\" || $e == \"byteOffset\") || Yo($e, fe)) || Gt.push($e);\n            return Gt;\n          }\n          function Ne(b) {\n            var C = b.length;\n            return C ? b[Is(0, C - 1)] : void 0;\n          }\n          function ps(b, C) {\n            return Ys(yo(b), Ye(C, 0, b.length));\n          }\n          function bt(b) {\n            return Ys(yo(b));\n          }\n          function Pt(b, C, B) {\n            (B !== void 0 && !cr(b[C], B) || B === void 0 && !(C in b)) && De(b, C, B);\n          }\n          function Jt(b, C, B) {\n            var J = b[C];\n            We.call(b, C) && cr(J, B) && (B !== void 0 || C in b) || De(b, C, B);\n          }\n          function Se(b, C) {\n            for (var B = b.length; B--; ) if (cr(b[B][0], C)) return B;\n            return -1;\n          }\n          function se(b, C, B, J) {\n            return Cn(b, function(ut, Et, Lt) {\n              C(J, ut, B(ut), Lt);\n            }), J;\n          }\n          function Oe(b, C) {\n            return b && Jo(C, Gr(C), b);\n          }\n          function De(b, C, B) {\n            C == \"__proto__\" && Fr ? Fr(b, C, {\n              configurable: !0,\n              enumerable: !0,\n              value: B,\n              writable: !0\n            }) : b[C] = B;\n          }\n          function Ve(b, C) {\n            for (var B = -1, J = C.length, ut = P(J), Et = b == null; ++B < J; )\n              ut[B] = Et ? void 0 : En(b, C[B]);\n            return ut;\n          }\n          function Ye(b, C, B) {\n            return b == b && (B !== void 0 && (b = b <= B ? b : B), C !== void 0 && (b = b >= C ? b : C)), b;\n          }\n          function hr(b, C, B, J, ut, Et) {\n            var Lt, Gt = 1 & C, fe = 2 & C, $e = 4 & C;\n            if (B && (Lt = ut ? B(b, J, ut, Et) : B(b)), Lt !== void 0) return Lt;\n            if (!ai(b)) return b;\n            var _e = er(b);\n            if (_e) {\n              if (Lt = function(Re) {\n                var Ge = Re.length, Ir = new Re.constructor(Ge);\n                return Ge && typeof Re[0] == \"string\" && We.call(Re, \"index\") && (Ir.index = Re.index, Ir.input = Re.input), Ir;\n              }(b), !Gt)\n                return yo(b, Lt);\n            } else {\n              var Fe = bi(b), dr = Fe == t || Fe == r;\n              if (Ai(b)) return Wl(b, Gt);\n              if (Fe == i || Fe == g || dr && !ut) {\n                if (Lt = fe || dr ? {} : os(b), !Gt)\n                  return fe ? function(Re, Ge) {\n                    return Jo(Re, wl(Re), Ge);\n                  }(\n                    b,\n                    function(Re, Ge) {\n                      return Re && Jo(Ge, pn(Ge), Re);\n                    }(Lt, b)\n                  ) : function(Re, Ge) {\n                    return Jo(Re, Ha(Re), Ge);\n                  }(b, Oe(Lt, b));\n              } else {\n                if (!_r[Fe]) return ut ? b : {};\n                Lt = function(Re, Ge, Ir) {\n                  var or = Re.constructor;\n                  switch (Ge) {\n                    case s:\n                      return pl(Re);\n                    case c:\n                    case a:\n                      return new or(+Re);\n                    case S:\n                      return function(Mr, sn) {\n                        var wr = sn ? pl(Mr.buffer) : Mr.buffer;\n                        return new Mr.constructor(wr, Mr.byteOffset, Mr.byteLength);\n                      }(Re, Ir);\n                    case j:\n                    case I:\n                    case R:\n                    case M:\n                    case z:\n                    case V:\n                    case \"[object Uint8ClampedArray]\":\n                    case G:\n                    case Y:\n                      return Yl(Re, Ir);\n                    case l:\n                      return new or();\n                    case h:\n                    case f:\n                      return new or(Re);\n                    case d:\n                      return function(Mr) {\n                        var sn = new Mr.constructor(Mr.source, ft.exec(Mr));\n                        return sn.lastIndex = Mr.lastIndex, sn;\n                      }(Re);\n                    case p:\n                      return new or();\n                    case v:\n                      return Nr = Re, Pi ? mt(Pi.call(Nr)) : {};\n                  }\n                  var Nr;\n                }(b, Fe, Gt);\n              }\n            }\n            Et || (Et = new vo());\n            var gr = Et.get(b);\n            if (gr) return gr;\n            Et.set(b, Lt), mu(b) ? b.forEach(function(Re) {\n              Lt.add(hr(Re, C, B, Re, b, Et));\n            }) : Qs(b) && b.forEach(function(Re, Ge) {\n              Lt.set(Ge, hr(Re, C, B, Ge, b, Et));\n            });\n            var $r = _e ? void 0 : ($e ? fe ? Vs : bl : fe ? pn : Gr)(b);\n            return Dn($r || b, function(Re, Ge) {\n              $r && (Re = b[Ge = Re]), Jt(Lt, Ge, hr(Re, C, B, Ge, b, Et));\n            }), Lt;\n          }\n          function jr(b, C, B) {\n            var J = B.length;\n            if (b == null) return !J;\n            for (b = mt(b); J--; ) {\n              var ut = B[J], Et = C[ut], Lt = b[ut];\n              if (Lt === void 0 && !(ut in b) || !Et(Lt)) return !1;\n            }\n            return !0;\n          }\n          function Er(b, C, B) {\n            if (typeof b != \"function\") throw new Zt(E);\n            return $s(function() {\n              b.apply(void 0, B);\n            }, C);\n          }\n          function Vr(b, C, B, J) {\n            var ut = -1, Et = ro, Lt = !0, Gt = b.length, fe = [], $e = C.length;\n            if (!Gt) return fe;\n            B && (C = sr(C, qn(B))), J ? (Et = Ro, Lt = !1) : C.length >= 200 && (Et = fo, Lt = !1, C = new mo(C));\n            t: for (; ++ut < Gt; ) {\n              var _e = b[ut], Fe = B == null ? _e : B(_e);\n              if (_e = J || _e !== 0 ? _e : 0, Lt && Fe == Fe) {\n                for (var dr = $e; dr--; ) if (C[dr] === Fe) continue t;\n                fe.push(_e);\n              } else Et(C, Fe, J) || fe.push(_e);\n            }\n            return fe;\n          }\n          vt.templateSettings = {\n            escape: gt,\n            evaluate: xt,\n            interpolate: St,\n            variable: \"\",\n            imports: { _: vt }\n          }, vt.prototype = La.prototype, vt.prototype.constructor = vt, ho.prototype = Qo(La.prototype), ho.prototype.constructor = ho, qr.prototype = Qo(La.prototype), qr.prototype.constructor = qr, lo.prototype.clear = function() {\n            this.__data__ = Ti ? Ti(null) : {}, this.size = 0;\n          }, lo.prototype.delete = function(b) {\n            var C = this.has(b) && delete this.__data__[b];\n            return this.size -= C ? 1 : 0, C;\n          }, lo.prototype.get = function(b) {\n            var C = this.__data__;\n            if (Ti) {\n              var B = C[b];\n              return B === \"__lodash_hash_undefined__\" ? void 0 : B;\n            }\n            return We.call(C, b) ? C[b] : void 0;\n          }, lo.prototype.has = function(b) {\n            var C = this.__data__;\n            return Ti ? C[b] !== void 0 : We.call(C, b);\n          }, lo.prototype.set = function(b, C) {\n            var B = this.__data__;\n            return this.size += this.has(b) ? 0 : 1, B[b] = Ti && C === void 0 ? \"__lodash_hash_undefined__\" : C, this;\n          }, Go.prototype.clear = function() {\n            this.__data__ = [], this.size = 0;\n          }, Go.prototype.delete = function(b) {\n            var C = this.__data__, B = Se(C, b);\n            return !(B < 0) && (B == C.length - 1 ? C.pop() : Ee.call(C, B, 1), --this.size, !0);\n          }, Go.prototype.get = function(b) {\n            var C = this.__data__, B = Se(C, b);\n            return B < 0 ? void 0 : C[B][1];\n          }, Go.prototype.has = function(b) {\n            return Se(this.__data__, b) > -1;\n          }, Go.prototype.set = function(b, C) {\n            var B = this.__data__, J = Se(B, b);\n            return J < 0 ? (++this.size, B.push([b, C])) : B[J][1] = C, this;\n          }, go.prototype.clear = function() {\n            this.size = 0, this.__data__ = {\n              hash: new lo(),\n              map: new (Na || Go)(),\n              string: new lo()\n            };\n          }, go.prototype.delete = function(b) {\n            var C = Hs(this, b).delete(b);\n            return this.size -= C ? 1 : 0, C;\n          }, go.prototype.get = function(b) {\n            return Hs(this, b).get(b);\n          }, go.prototype.has = function(b) {\n            return Hs(this, b).has(b);\n          }, go.prototype.set = function(b, C) {\n            var B = Hs(this, b), J = B.size;\n            return B.set(b, C), this.size += B.size == J ? 0 : 1, this;\n          }, mo.prototype.add = mo.prototype.push = function(b) {\n            return this.__data__.set(b, \"__lodash_hash_undefined__\"), this;\n          }, mo.prototype.has = function(b) {\n            return this.__data__.has(b);\n          }, vo.prototype.clear = function() {\n            this.__data__ = new Go(), this.size = 0;\n          }, vo.prototype.delete = function(b) {\n            var C = this.__data__, B = C.delete(b);\n            return this.size = C.size, B;\n          }, vo.prototype.get = function(b) {\n            return this.__data__.get(b);\n          }, vo.prototype.has = function(b) {\n            return this.__data__.has(b);\n          }, vo.prototype.set = function(b, C) {\n            var B = this.__data__;\n            if (B instanceof Go) {\n              var J = B.__data__;\n              if (!Na || J.length < 199)\n                return J.push([b, C]), this.size = ++B.size, this;\n              B = this.__data__ = new go(J);\n            }\n            return B.set(b, C), this.size = B.size, this;\n          };\n          var Cn = zs($n), Tr = zs(Ji, !0);\n          function fi(b, C) {\n            var B = !0;\n            return Cn(b, function(J, ut, Et) {\n              return B = !!C(J, ut, Et);\n            }), B;\n          }\n          function oi(b, C, B) {\n            for (var J = -1, ut = b.length; ++J < ut; ) {\n              var Et = b[J], Lt = C(Et);\n              if (Lt != null && (Gt === void 0 ? Lt == Lt && !_o(Lt) : B(Lt, Gt)))\n                var Gt = Lt, fe = Et;\n            }\n            return fe;\n          }\n          function qi(b, C) {\n            var B = [];\n            return Cn(b, function(J, ut, Et) {\n              C(J, ut, Et) && B.push(J);\n            }), B;\n          }\n          function Lr(b, C, B, J, ut) {\n            var Et = -1, Lt = b.length;\n            for (B || (B = Gs), ut || (ut = []); ++Et < Lt; ) {\n              var Gt = b[Et];\n              C > 0 && B(Gt) ? C > 1 ? Lr(Gt, C - 1, B, J, ut) : Ci(ut, Gt) : J || (ut[ut.length] = Gt);\n            }\n            return ut;\n          }\n          var vi = qa(), Zr = qa(!0);\n          function $n(b, C) {\n            return b && vi(b, C, Gr);\n          }\n          function Ji(b, C) {\n            return b && Zr(b, C, Gr);\n          }\n          function ia(b, C) {\n            return hi(C, function(B) {\n              return Zo(b[B]);\n            });\n          }\n          function oa(b, C) {\n            for (var B = 0, J = (C = xa(C, b)).length; b != null && B < J; )\n              b = b[sa(C[B++])];\n            return B && B == J ? b : void 0;\n          }\n          function hs(b, C, B) {\n            var J = C(b);\n            return er(b) ? J : Ci(J, B(b));\n          }\n          function Ki(b) {\n            return b == null ? b === void 0 ? \"[object Undefined]\" : \"[object Null]\" : Rr && Rr in mt(b) ? function(C) {\n              var B = We.call(C, Rr), J = C[Rr];\n              try {\n                C[Rr] = void 0;\n                var ut = !0;\n              } catch {\n              }\n              var Et = Rn.call(C);\n              return ut && (B ? C[Rr] = J : delete C[Rr]), Et;\n            }(b) : function(C) {\n              return Rn.call(C);\n            }(b);\n          }\n          function nl(b, C) {\n            return b > C;\n          }\n          function ju(b, C) {\n            return b != null && We.call(b, C);\n          }\n          function Tu(b, C) {\n            return b != null && C in mt(b);\n          }\n          function il(b, C, B) {\n            for (var J = B ? Ro : ro, ut = b[0].length, Et = b.length, Lt = Et, Gt = P(Et), fe = 1 / 0, $e = []; Lt--; ) {\n              var _e = b[Lt];\n              Lt && C && (_e = sr(_e, qn(C))), fe = Bi(_e.length, fe), Gt[Lt] = !B && (C || ut >= 120 && _e.length >= 120) ? new mo(Lt && _e) : void 0;\n            }\n            _e = b[0];\n            var Fe = -1, dr = Gt[0];\n            t: for (; ++Fe < ut && $e.length < fe; ) {\n              var gr = _e[Fe], $r = C ? C(gr) : gr;\n              if (gr = B || gr !== 0 ? gr : 0, !(dr ? fo(dr, $r) : J($e, $r, B))) {\n                for (Lt = Et; --Lt; ) {\n                  var Re = Gt[Lt];\n                  if (!(Re ? fo(Re, $r) : J(b[Lt], $r, B))) continue t;\n                }\n                dr && dr.push($r), $e.push(gr);\n              }\n            }\n            return $e;\n          }\n          function gs(b, C, B) {\n            var J = (b = nu(b, C = xa(C, b))) == null ? b : b[sa(Lo(C))];\n            return J == null ? void 0 : Sn(J, b, B);\n          }\n          function Nl(b) {\n            return Un(b) && Ki(b) == g;\n          }\n          function ms(b, C, B, J, ut) {\n            return b === C || (b == null || C == null || !Un(b) && !Un(C) ? b != b && C != C : function(Et, Lt, Gt, fe, $e, _e) {\n              var Fe = er(Et), dr = er(Lt), gr = Fe ? o : bi(Et), $r = dr ? o : bi(Lt), Re = (gr = gr == g ? i : gr) == i, Ge = ($r = $r == g ? i : $r) == i, Ir = gr == $r;\n              if (Ir && Ai(Et)) {\n                if (!Ai(Lt)) return !1;\n                Fe = !0, Re = !1;\n              }\n              if (Ir && !Re)\n                return _e || (_e = new vo()), Fe || Za(Et) ? Kl(Et, Lt, Gt, fe, $e, _e) : function(wr, Dr, to, Bo, Ra, eo, Ja) {\n                  switch (to) {\n                    case S:\n                      if (wr.byteLength != Dr.byteLength || wr.byteOffset != Dr.byteOffset)\n                        return !1;\n                      wr = wr.buffer, Dr = Dr.buffer;\n                    case s:\n                      return !(wr.byteLength != Dr.byteLength || !eo(new $t(wr), new $t(Dr)));\n                    case c:\n                    case a:\n                    case h:\n                      return cr(+wr, +Dr);\n                    case n:\n                      return wr.name == Dr.name && wr.message == Dr.message;\n                    case d:\n                    case f:\n                      return wr == Dr + \"\";\n                    case l:\n                      var ls = Hn;\n                    case p:\n                      var Il = 1 & Bo;\n                      if (ls || (ls = Mi), wr.size != Dr.size && !Il)\n                        return !1;\n                      var Au = Ja.get(wr);\n                      if (Au) return Au == Dr;\n                      Bo |= 2, Ja.set(wr, Dr);\n                      var tl = Kl(ls(wr), ls(Dr), Bo, Ra, eo, Ja);\n                      return Ja.delete(wr), tl;\n                    case v:\n                      if (Pi) return Pi.call(wr) == Pi.call(Dr);\n                  }\n                  return !1;\n                }(Et, Lt, gr, Gt, fe, $e, _e);\n              if (!(1 & Gt)) {\n                var or = Re && We.call(Et, \"__wrapped__\"), Nr = Ge && We.call(Lt, \"__wrapped__\");\n                if (or || Nr) {\n                  var Mr = or ? Et.value() : Et, sn = Nr ? Lt.value() : Lt;\n                  return _e || (_e = new vo()), $e(Mr, sn, Gt, fe, _e);\n                }\n              }\n              return Ir ? (_e || (_e = new vo()), function(wr, Dr, to, Bo, Ra, eo) {\n                var Ja = 1 & to, ls = bl(wr), Il = ls.length, Au = bl(Dr).length;\n                if (Il != Au && !Ja) return !1;\n                for (var tl = Il; tl--; ) {\n                  var us = ls[tl];\n                  if (!(Ja ? us in Dr : We.call(Dr, us))) return !1;\n                }\n                var Uu = eo.get(wr), Vu = eo.get(Dr);\n                if (Uu && Vu) return Uu == Dr && Vu == wr;\n                var Eu = !0;\n                eo.set(wr, Dr), eo.set(Dr, wr);\n                for (var Fu = Ja; ++tl < Il; ) {\n                  us = ls[tl];\n                  var Su = wr[us], Cu = Dr[us];\n                  if (Bo)\n                    var Hu = Ja ? Bo(Cu, Su, us, Dr, wr, eo) : Bo(Su, Cu, us, wr, Dr, eo);\n                  if (!(Hu === void 0 ? Su === Cu || Ra(Su, Cu, to, Bo, eo) : Hu)) {\n                    Eu = !1;\n                    break;\n                  }\n                  Fu || (Fu = us == \"constructor\");\n                }\n                if (Eu && !Fu) {\n                  var $u = wr.constructor, _u = Dr.constructor;\n                  $u == _u || !(\"constructor\" in wr) || !(\"constructor\" in Dr) || typeof $u == \"function\" && $u instanceof $u && typeof _u == \"function\" && _u instanceof _u || (Eu = !1);\n                }\n                return eo.delete(wr), eo.delete(Dr), Eu;\n              }(Et, Lt, Gt, fe, $e, _e)) : !1;\n            }(b, C, B, J, ms, ut));\n          }\n          function za(b, C, B, J) {\n            var ut = B.length, Et = ut, Lt = !J;\n            if (b == null) return !Et;\n            for (b = mt(b); ut--; ) {\n              var Gt = B[ut];\n              if (Lt && Gt[2] ? Gt[1] !== b[Gt[0]] : !(Gt[0] in b)) return !1;\n            }\n            for (; ++ut < Et; ) {\n              var fe = (Gt = B[ut])[0], $e = b[fe], _e = Gt[1];\n              if (Lt && Gt[2]) {\n                if ($e === void 0 && !(fe in b)) return !1;\n              } else {\n                var Fe = new vo();\n                if (J) var dr = J($e, _e, fe, b, C, Fe);\n                if (!(dr === void 0 ? ms(_e, $e, 3, J, Fe) : dr)) return !1;\n              }\n            }\n            return !0;\n          }\n          function Di(b) {\n            return !(!ai(b) || (C = b, bn && bn in C)) && (Zo(b) ? Or : le).test(Ga(b));\n            var C;\n          }\n          function ol(b) {\n            return typeof b == \"function\" ? b : b == null ? rn : typeof b == \"object\" ? er(b) ? Ll(b[0], b[1]) : sl(b) : ss(b);\n          }\n          function al(b) {\n            if (!as(b)) return ea(b);\n            var C = [];\n            for (var B in mt(b))\n              We.call(b, B) && B != \"constructor\" && C.push(B);\n            return C;\n          }\n          function $o(b) {\n            if (!ai(b))\n              return function(ut) {\n                var Et = [];\n                if (ut != null) for (var Lt in mt(ut)) Et.push(Lt);\n                return Et;\n              }(b);\n            var C = as(b), B = [];\n            for (var J in b)\n              (J != \"constructor\" || !C && We.call(b, J)) && B.push(J);\n            return B;\n          }\n          function vs(b, C) {\n            return b < C;\n          }\n          function Ml(b, C) {\n            var B = -1, J = Qn(b) ? P(b.length) : [];\n            return Cn(b, function(ut, Et, Lt) {\n              J[++B] = C(ut, Et, Lt);\n            }), J;\n          }\n          function sl(b) {\n            var C = xl(b);\n            return C.length == 1 && C[0][2] ? eu(C[0][0], C[0][1]) : function(B) {\n              return B === b || za(B, b, C);\n            };\n          }\n          function Ll(b, C) {\n            return kl(b) && tu(C) ? eu(sa(b), C) : function(B) {\n              var J = En(B, b);\n              return J === void 0 && J === C ? an(B, b) : ms(C, J, 3);\n            };\n          }\n          function bs(b, C, B, J, ut) {\n            b !== C && vi(\n              C,\n              function(Et, Lt) {\n                if (ut || (ut = new vo()), ai(Et))\n                  (function(fe, $e, _e, Fe, dr, gr, $r) {\n                    var Re = Ws(fe, _e), Ge = Ws($e, _e), Ir = $r.get(Ge);\n                    if (Ir) return void Pt(fe, _e, Ir);\n                    var or = gr ? gr(Re, Ge, _e + \"\", fe, $e, $r) : void 0, Nr = or === void 0;\n                    if (Nr) {\n                      var Mr = er(Ge), sn = !Mr && Ai(Ge), wr = !Mr && !sn && Za(Ge);\n                      or = Ge, Mr || sn || wr ? er(Re) ? or = Re : zn(Re) ? or = yo(Re) : sn ? (Nr = !1, or = Wl(Ge, !0)) : wr ? (Nr = !1, or = Yl(Ge, !0)) : or = [] : _s(Ge) || Ln(Ge) ? (or = Re, Ln(Re) ? or = ze(Re) : ai(Re) && !Zo(Re) || (or = os(Ge))) : Nr = !1;\n                    }\n                    Nr && ($r.set(Ge, or), dr(or, Ge, Fe, gr, $r), $r.delete(Ge)), Pt(fe, _e, or);\n                  })(b, C, Lt, B, bs, J, ut);\n                else {\n                  var Gt = J ? J(Ws(b, Lt), Et, Lt + \"\", b, C, ut) : void 0;\n                  Gt === void 0 && (Gt = Et), Pt(b, Lt, Gt);\n                }\n              },\n              pn\n            );\n          }\n          function zl(b, C) {\n            var B = b.length;\n            if (B) return Yo(C += C < 0 ? B : 0, B) ? b[C] : void 0;\n          }\n          function Oa(b, C, B) {\n            C = C.length ? sr(C, function(ut) {\n              return er(ut) ? function(Et) {\n                return oa(Et, ut.length === 1 ? ut[0] : ut);\n              } : ut;\n            }) : [rn];\n            var J = -1;\n            return C = sr(C, qn(Sr())), function(ut, Et) {\n              var Lt = ut.length;\n              for (ut.sort(Et); Lt--; ) ut[Lt] = ut[Lt].value;\n              return ut;\n            }(\n              Ml(b, function(ut, Et, Lt) {\n                return {\n                  criteria: sr(C, function(Gt) {\n                    return Gt(ut);\n                  }),\n                  index: ++J,\n                  value: ut\n                };\n              }),\n              function(ut, Et) {\n                return function(Lt, Gt, fe) {\n                  for (var $e = -1, _e = Lt.criteria, Fe = Gt.criteria, dr = _e.length, gr = fe.length; ++$e < dr; ) {\n                    var $r = hl(_e[$e], Fe[$e]);\n                    if ($r) {\n                      if ($e >= gr) return $r;\n                      var Re = fe[$e];\n                      return $r * (Re == \"desc\" ? -1 : 1);\n                    }\n                  }\n                  return Lt.index - Gt.index;\n                }(ut, Et, B);\n              }\n            );\n          }\n          function Ds(b, C, B) {\n            for (var J = -1, ut = C.length, Et = {}; ++J < ut; ) {\n              var Lt = C[J], Gt = oa(b, Lt);\n              B(Gt, Lt) && ts(Et, xa(Lt, b), Gt);\n            }\n            return Et;\n          }\n          function Rs(b, C, B, J) {\n            var ut = J ? Ii : ci, Et = -1, Lt = C.length, Gt = b;\n            for (b === C && (C = yo(C)), B && (Gt = sr(b, qn(B))); ++Et < Lt; )\n              for (var fe = 0, $e = C[Et], _e = B ? B($e) : $e; (fe = ut(Gt, _e, fe, J)) > -1; )\n                Gt !== b && Ee.call(Gt, fe, 1), Ee.call(b, fe, 1);\n            return b;\n          }\n          function ll(b, C) {\n            for (var B = b ? C.length : 0, J = B - 1; B--; ) {\n              var ut = C[B];\n              if (B == J || ut !== Et) {\n                var Et = ut;\n                Yo(ut) ? Ee.call(b, ut, 1) : ja(b, ut);\n              }\n            }\n            return b;\n          }\n          function Is(b, C) {\n            return b + Xr(Ia() * (C - b + 1));\n          }\n          function Ka(b, C) {\n            var B = \"\";\n            if (!b || C < 1 || C > 9007199254740991) return B;\n            do\n              C % 2 && (B += b), (C = Xr(C / 2)) && (b += b);\n            while (C);\n            return B;\n          }\n          function xr(b, C) {\n            return Al(ru(b, C, rn), b + \"\");\n          }\n          function ys(b) {\n            return Ne(Jn(b));\n          }\n          function Bl(b, C) {\n            var B = Jn(b);\n            return Ys(B, Ye(C, 0, B.length));\n          }\n          function ts(b, C, B, J) {\n            if (!ai(b)) return b;\n            for (var ut = -1, Et = (C = xa(C, b)).length, Lt = Et - 1, Gt = b; Gt != null && ++ut < Et; ) {\n              var fe = sa(C[ut]), $e = B;\n              if (fe === \"__proto__\" || fe === \"constructor\" || fe === \"prototype\")\n                return b;\n              if (ut != Lt) {\n                var _e = Gt[fe];\n                ($e = J ? J(_e, fe, Gt) : void 0) === void 0 && ($e = ai(_e) ? _e : Yo(C[ut + 1]) ? [] : {});\n              }\n              Jt(Gt, fe, $e), Gt = Gt[fe];\n            }\n            return b;\n          }\n          var Ns = Co ? function(b, C) {\n            return Co.set(b, C), b;\n          } : rn, Pu = Fr ? function(b, C) {\n            return Fr(b, \"toString\", {\n              configurable: !0,\n              enumerable: !1,\n              value: Os(C),\n              writable: !0\n            });\n          } : rn;\n          function Du(b) {\n            return Ys(Jn(b));\n          }\n          function Wo(b, C, B) {\n            var J = -1, ut = b.length;\n            C < 0 && (C = -C > ut ? 0 : ut + C), (B = B > ut ? ut : B) < 0 && (B += ut), ut = C > B ? 0 : B - C >>> 0, C >>>= 0;\n            for (var Et = P(ut); ++J < ut; ) Et[J] = b[J + C];\n            return Et;\n          }\n          function Fl(b, C) {\n            var B;\n            return Cn(b, function(J, ut, Et) {\n              return !(B = C(J, ut, Et));\n            }), !!B;\n          }\n          function Ms(b, C, B) {\n            var J = 0, ut = b == null ? J : b.length;\n            if (typeof C == \"number\" && C == C && ut <= 2147483647) {\n              for (; J < ut; ) {\n                var Et = J + ut >>> 1, Lt = b[Et];\n                Lt !== null && !_o(Lt) && (B ? Lt <= C : Lt < C) ? J = Et + 1 : ut = Et;\n              }\n              return ut;\n            }\n            return ul(b, C, rn, B);\n          }\n          function ul(b, C, B, J) {\n            var ut = 0, Et = b == null ? 0 : b.length;\n            if (Et === 0) return 0;\n            for (var Lt = (C = B(C)) != C, Gt = C === null, fe = _o(C), $e = C === void 0; ut < Et; ) {\n              var _e = Xr((ut + Et) / 2), Fe = B(b[_e]), dr = Fe !== void 0, gr = Fe === null, $r = Fe == Fe, Re = _o(Fe);\n              if (Lt) var Ge = J || $r;\n              else\n                Ge = $e ? $r && (J || dr) : Gt ? $r && dr && (J || !gr) : fe ? $r && dr && !gr && (J || !Re) : !gr && !Re && (J ? Fe <= C : Fe < C);\n              Ge ? ut = _e + 1 : Et = _e;\n            }\n            return Bi(Et, 4294967294);\n          }\n          function ql(b, C) {\n            for (var B = -1, J = b.length, ut = 0, Et = []; ++B < J; ) {\n              var Lt = b[B], Gt = C ? C(Lt) : Lt;\n              if (!B || !cr(Gt, fe)) {\n                var fe = Gt;\n                Et[ut++] = Lt === 0 ? 0 : Lt;\n              }\n            }\n            return Et;\n          }\n          function Ul(b) {\n            return typeof b == \"number\" ? b : _o(b) ? NaN : +b;\n          }\n          function bo(b) {\n            if (typeof b == \"string\") return b;\n            if (er(b)) return sr(b, bo) + \"\";\n            if (_o(b)) return Ma ? Ma.call(b) : \"\";\n            var C = b + \"\";\n            return C == \"0\" && 1 / b == -1 / 0 ? \"-0\" : C;\n          }\n          function ya(b, C, B) {\n            var J = -1, ut = ro, Et = b.length, Lt = !0, Gt = [], fe = Gt;\n            if (B) Lt = !1, ut = Ro;\n            else if (Et >= 200) {\n              var $e = C ? null : Ru(b);\n              if ($e) return Mi($e);\n              Lt = !1, ut = fo, fe = new mo();\n            } else fe = C ? [] : Gt;\n            t: for (; ++J < Et; ) {\n              var _e = b[J], Fe = C ? C(_e) : _e;\n              if (_e = B || _e !== 0 ? _e : 0, Lt && Fe == Fe) {\n                for (var dr = fe.length; dr--; ) if (fe[dr] === Fe) continue t;\n                C && fe.push(Fe), Gt.push(_e);\n              } else ut(fe, Fe, B) || (fe !== Gt && fe.push(Fe), Gt.push(_e));\n            }\n            return Gt;\n          }\n          function ja(b, C) {\n            return (b = nu(b, C = xa(C, b))) == null || delete b[sa(Lo(C))];\n          }\n          function Vl(b, C, B, J) {\n            return ts(b, C, B(oa(b, C)), J);\n          }\n          function Ba(b, C, B, J) {\n            for (var ut = b.length, Et = J ? ut : -1; (J ? Et-- : ++Et < ut) && C(b[Et], Et, b); ) ;\n            return B ? Wo(b, J ? 0 : Et, J ? Et + 1 : ut) : Wo(b, J ? Et + 1 : 0, J ? ut : Et);\n          }\n          function es(b, C) {\n            var B = b;\n            return B instanceof qr && (B = B.value()), gi(\n              C,\n              function(J, ut) {\n                return ut.func.apply(ut.thisArg, Ci([J], ut.args));\n              },\n              B\n            );\n          }\n          function rs(b, C, B) {\n            var J = b.length;\n            if (J < 2) return J ? ya(b[0]) : [];\n            for (var ut = -1, Et = P(J); ++ut < J; )\n              for (var Lt = b[ut], Gt = -1; ++Gt < J; )\n                Gt != ut && (Et[ut] = Vr(Et[ut] || Lt, b[Gt], C, B));\n            return ya(Lr(Et, 1), C, B);\n          }\n          function cl(b, C, B) {\n            for (var J = -1, ut = b.length, Et = C.length, Lt = {}; ++J < ut; ) {\n              var Gt = J < Et ? C[J] : void 0;\n              B(Lt, b[J], Gt);\n            }\n            return Lt;\n          }\n          function dl(b) {\n            return zn(b) ? b : [];\n          }\n          function fl(b) {\n            return typeof b == \"function\" ? b : rn;\n          }\n          function xa(b, C) {\n            return er(b) ? b : kl(b, C) ? [b] : su(qe(b));\n          }\n          var Hl = xr;\n          function wa(b, C, B) {\n            var J = b.length;\n            return B = B === void 0 ? J : B, !C && B >= J ? b : Wo(b, C, B);\n          }\n          var Gl = ii || function(b) {\n            return Vn.clearTimeout(b);\n          };\n          function Wl(b, C) {\n            if (C) return b.slice();\n            var B = b.length, J = It ? It(B) : new b.constructor(B);\n            return b.copy(J), J;\n          }\n          function pl(b) {\n            var C = new b.constructor(b.byteLength);\n            return new $t(C).set(new $t(b)), C;\n          }\n          function Yl(b, C) {\n            var B = C ? pl(b.buffer) : b.buffer;\n            return new b.constructor(B, b.byteOffset, b.length);\n          }\n          function hl(b, C) {\n            if (b !== C) {\n              var B = b !== void 0, J = b === null, ut = b == b, Et = _o(b), Lt = C !== void 0, Gt = C === null, fe = C == C, $e = _o(C);\n              if (!Gt && !$e && !Et && b > C || Et && Lt && fe && !Gt && !$e || J && Lt && fe || !B && fe || !ut)\n                return 1;\n              if (!J && !Et && !$e && b < C || $e && B && ut && !J && !Et || Gt && B && ut || !Lt && ut || !fe)\n                return -1;\n            }\n            return 0;\n          }\n          function gl(b, C, B, J) {\n            for (var ut = -1, Et = b.length, Lt = B.length, Gt = -1, fe = C.length, $e = ei(Et - Lt, 0), _e = P(fe + $e), Fe = !J; ++Gt < fe; )\n              _e[Gt] = C[Gt];\n            for (; ++ut < Lt; ) (Fe || ut < Et) && (_e[B[ut]] = b[ut]);\n            for (; $e--; ) _e[Gt++] = b[ut++];\n            return _e;\n          }\n          function Ls(b, C, B, J) {\n            for (var ut = -1, Et = b.length, Lt = -1, Gt = B.length, fe = -1, $e = C.length, _e = ei(Et - Gt, 0), Fe = P(_e + $e), dr = !J; ++ut < _e; )\n              Fe[ut] = b[ut];\n            for (var gr = ut; ++fe < $e; ) Fe[gr + fe] = C[fe];\n            for (; ++Lt < Gt; ) (dr || ut < Et) && (Fe[gr + B[Lt]] = b[ut++]);\n            return Fe;\n          }\n          function yo(b, C) {\n            var B = -1, J = b.length;\n            for (C || (C = P(J)); ++B < J; ) C[B] = b[B];\n            return C;\n          }\n          function Jo(b, C, B, J) {\n            var ut = !B;\n            B || (B = {});\n            for (var Et = -1, Lt = C.length; ++Et < Lt; ) {\n              var Gt = C[Et], fe = J ? J(B[Gt], b[Gt], Gt, B, b) : void 0;\n              fe === void 0 && (fe = b[Gt]), ut ? De(B, Gt, fe) : Jt(B, Gt, fe);\n            }\n            return B;\n          }\n          function xs(b, C) {\n            return function(B, J) {\n              var ut = er(B) ? Do : se, Et = C ? C() : {};\n              return ut(B, b, Sr(J, 2), Et);\n            };\n          }\n          function Fa(b) {\n            return xr(function(C, B) {\n              var J = -1, ut = B.length, Et = ut > 1 ? B[ut - 1] : void 0, Lt = ut > 2 ? B[2] : void 0;\n              for (Et = b.length > 3 && typeof Et == \"function\" ? (ut--, Et) : void 0, Lt && xo(B[0], B[1], Lt) && (Et = ut < 3 ? void 0 : Et, ut = 1), C = mt(C); ++J < ut; ) {\n                var Gt = B[J];\n                Gt && b(C, Gt, J, Et);\n              }\n              return C;\n            });\n          }\n          function zs(b, C) {\n            return function(B, J) {\n              if (B == null) return B;\n              if (!Qn(B)) return b(B, J);\n              for (var ut = B.length, Et = C ? ut : -1, Lt = mt(B); (C ? Et-- : ++Et < ut) && J(Lt[Et], Et, Lt) !== !1; ) ;\n              return B;\n            };\n          }\n          function qa(b) {\n            return function(C, B, J) {\n              for (var ut = -1, Et = mt(C), Lt = J(C), Gt = Lt.length; Gt--; ) {\n                var fe = Lt[b ? Gt : ++ut];\n                if (B(Et[fe], fe, Et) === !1) break;\n              }\n              return C;\n            };\n          }\n          function ws(b) {\n            return function(C) {\n              var B = po(C = qe(C)) ? ki(C) : void 0, J = B ? B[0] : C.charAt(0), ut = B ? wa(B, 1).join(\"\") : C.slice(1);\n              return J[b]() + ut;\n            };\n          }\n          function aa(b) {\n            return function(C) {\n              return gi(jl(Pa(C).replace(vn, \"\")), b, \"\");\n            };\n          }\n          function Ua(b) {\n            return function() {\n              var C = arguments;\n              switch (C.length) {\n                case 0:\n                  return new b();\n                case 1:\n                  return new b(C[0]);\n                case 2:\n                  return new b(C[0], C[1]);\n                case 3:\n                  return new b(C[0], C[1], C[2]);\n                case 4:\n                  return new b(C[0], C[1], C[2], C[3]);\n                case 5:\n                  return new b(C[0], C[1], C[2], C[3], C[4]);\n                case 6:\n                  return new b(C[0], C[1], C[2], C[3], C[4], C[5]);\n                case 7:\n                  return new b(C[0], C[1], C[2], C[3], C[4], C[5], C[6]);\n              }\n              var B = Qo(b.prototype), J = b.apply(B, C);\n              return ai(J) ? J : B;\n            };\n          }\n          function ml(b) {\n            return function(C, B, J) {\n              var ut = mt(C);\n              if (!Qn(C)) {\n                var Et = Sr(B, 3);\n                C = Gr(C), B = function(Gt) {\n                  return Et(ut[Gt], Gt, ut);\n                };\n              }\n              var Lt = b(C, B, J);\n              return Lt > -1 ? ut[Et ? C[Lt] : Lt] : void 0;\n            };\n          }\n          function Mo(b) {\n            return Aa(function(C) {\n              var B = C.length, J = B, ut = ho.prototype.thru;\n              for (b && C.reverse(); J--; ) {\n                var Et = C[J];\n                if (typeof Et != \"function\") throw new Zt(E);\n                if (ut && !Lt && Es(Et) == \"wrapper\") var Lt = new ho([], !0);\n              }\n              for (J = Lt ? J : B; ++J < B; ) {\n                var Gt = Es(Et = C[J]), fe = Gt == \"wrapper\" ? yl(Et) : void 0;\n                Lt = fe && Cs(fe[0]) && fe[1] == 424 && !fe[4].length && fe[9] == 1 ? Lt[Es(fe[0])].apply(Lt, fe[3]) : Et.length == 1 && Cs(Et) ? Lt[Gt]() : Lt.thru(Et);\n              }\n              return function() {\n                var $e = arguments, _e = $e[0];\n                if (Lt && $e.length == 1 && er(_e)) return Lt.plant(_e).value();\n                for (var Fe = 0, dr = B ? C[Fe].apply(this, $e) : _e; ++Fe < B; )\n                  dr = C[Fe].call(this, dr);\n                return dr;\n              };\n            });\n          }\n          function ns(b, C, B, J, ut, Et, Lt, Gt, fe, $e) {\n            var _e = 128 & C, Fe = 1 & C, dr = 2 & C, gr = 24 & C, $r = 512 & C, Re = dr ? void 0 : Ua(b);\n            return function Ge() {\n              for (var Ir = arguments.length, or = P(Ir), Nr = Ir; Nr--; )\n                or[Nr] = arguments[Nr];\n              if (gr)\n                var Mr = is(Ge), sn = Uo(or, Mr);\n              if (J && (or = gl(or, J, ut, gr)), Et && (or = Ls(or, Et, Lt, gr)), Ir -= sn, gr && Ir < $e) {\n                var wr = Mn(or, Mr);\n                return Zl(b, C, ns, Ge.placeholder, B, or, wr, Gt, fe, $e - Ir);\n              }\n              var Dr = Fe ? B : this, to = dr ? Dr[b] : b;\n              return Ir = or.length, Gt ? or = Mu(or, Gt) : $r && Ir > 1 && or.reverse(), _e && fe < Ir && (or.length = fe), this && this !== Vn && this instanceof Ge && (to = Re || Ua(to)), to.apply(Dr, or);\n            };\n          }\n          function Bs(b, C) {\n            return function(B, J) {\n              return function(ut, Et, Lt, Gt) {\n                return $n(ut, function(fe, $e, _e) {\n                  Et(Gt, Lt(fe), $e, _e);\n                }), Gt;\n              }(B, b, C(J), {});\n            };\n          }\n          function ks(b, C) {\n            return function(B, J) {\n              var ut;\n              if (B === void 0 && J === void 0) return C;\n              if (B !== void 0 && (ut = B), J !== void 0) {\n                if (ut === void 0) return J;\n                typeof B == \"string\" || typeof J == \"string\" ? (B = bo(B), J = bo(J)) : (B = Ul(B), J = Ul(J)), ut = b(B, J);\n              }\n              return ut;\n            };\n          }\n          function Fs(b) {\n            return Aa(function(C) {\n              return C = sr(C, qn(Sr())), xr(function(B) {\n                var J = this;\n                return b(C, function(ut) {\n                  return Sn(ut, J, B);\n                });\n              });\n            });\n          }\n          function As(b, C) {\n            var B = (C = C === void 0 ? \" \" : bo(C)).length;\n            if (B < 2) return B ? Ka(C, b) : C;\n            var J = Ka(C, yr(b / Li(C)));\n            return po(C) ? wa(ki(J), 0, b).join(\"\") : J.slice(0, b);\n          }\n          function Xl(b) {\n            return function(C, B, J) {\n              return J && typeof J != \"number\" && xo(C, B, J) && (B = J = void 0), C = Kt(C), B === void 0 ? (B = C, C = 0) : B = Kt(B), function(ut, Et, Lt, Gt) {\n                for (var fe = -1, $e = ei(yr((Et - ut) / (Lt || 1)), 0), _e = P($e); $e--; )\n                  _e[Gt ? $e : ++fe] = ut, ut += Lt;\n                return _e;\n              }(C, B, J = J === void 0 ? C < B ? 1 : -1 : Kt(J), b);\n            };\n          }\n          function qs(b) {\n            return function(C, B) {\n              return typeof C == \"string\" && typeof B == \"string\" || (C = Pe(C), B = Pe(B)), b(C, B);\n            };\n          }\n          function Zl(b, C, B, J, ut, Et, Lt, Gt, fe, $e) {\n            var _e = 8 & C;\n            C |= _e ? 32 : 64, 4 & (C &= ~(_e ? 64 : 32)) || (C &= -4);\n            var Fe = [\n              b,\n              C,\n              ut,\n              _e ? Et : void 0,\n              _e ? Lt : void 0,\n              _e ? void 0 : Et,\n              _e ? void 0 : Lt,\n              Gt,\n              fe,\n              $e\n            ], dr = B.apply(void 0, Fe);\n            return Cs(b) && iu(dr, Fe), dr.placeholder = J, ou(dr, b, C);\n          }\n          function vl(b) {\n            var C = dt[b];\n            return function(B, J) {\n              if (B = Pe(B), (J = J == null ? 0 : Bi(te(J), 292)) && ti(B)) {\n                var ut = (qe(B) + \"e\").split(\"e\");\n                return +((ut = (qe(C(ut[0] + \"e\" + (+ut[1] + J))) + \"e\").split(\"e\"))[0] + \"e\" + (+ut[1] - J));\n              }\n              return C(B);\n            };\n          }\n          var Ru = _a && 1 / Mi(new _a([, -0]))[1] == 1 / 0 ? function(b) {\n            return new _a(b);\n          } : ua;\n          function Ql(b) {\n            return function(C) {\n              var B = bi(C);\n              return B == l ? Hn(C) : B == p ? So(C) : function(J, ut) {\n                return sr(ut, function(Et) {\n                  return [Et, J[Et]];\n                });\n              }(C, b(C));\n            };\n          }\n          function ka(b, C, B, J, ut, Et, Lt, Gt) {\n            var fe = 2 & C;\n            if (!fe && typeof b != \"function\") throw new Zt(E);\n            var $e = J ? J.length : 0;\n            if ($e || (C &= -97, J = ut = void 0), Lt = Lt === void 0 ? Lt : ei(te(Lt), 0), Gt = Gt === void 0 ? Gt : te(Gt), $e -= ut ? ut.length : 0, 64 & C) {\n              var _e = J, Fe = ut;\n              J = ut = void 0;\n            }\n            var dr = fe ? void 0 : yl(b), gr = [b, C, B, J, ut, _e, Fe, Et, Lt, Gt];\n            if (dr && function(Re, Ge) {\n              var Ir = Re[1], or = Ge[1], Nr = Ir | or, Mr = Nr < 131, sn = or == 128 && Ir == 8 || or == 128 && Ir == 256 && Re[7].length <= Ge[8] || or == 384 && Ge[7].length <= Ge[8] && Ir == 8;\n              if (!Mr && !sn) return Re;\n              1 & or && (Re[2] = Ge[2], Nr |= 1 & Ir ? 0 : 4);\n              var wr = Ge[3];\n              if (wr) {\n                var Dr = Re[3];\n                Re[3] = Dr ? gl(Dr, wr, Ge[4]) : wr, Re[4] = Dr ? Mn(Re[3], y) : Ge[4];\n              }\n              (wr = Ge[5]) && (Dr = Re[5], Re[5] = Dr ? Ls(Dr, wr, Ge[6]) : wr, Re[6] = Dr ? Mn(Re[5], y) : Ge[6]), (wr = Ge[7]) && (Re[7] = wr), 128 & or && (Re[8] = Re[8] == null ? Ge[8] : Bi(Re[8], Ge[8])), Re[9] == null && (Re[9] = Ge[9]), Re[0] = Ge[0], Re[1] = Nr;\n            }(gr, dr), b = gr[0], C = gr[1], B = gr[2], J = gr[3], ut = gr[4], !(Gt = gr[9] = gr[9] === void 0 ? fe ? 0 : b.length : ei(gr[9] - $e, 0)) && 24 & C && (C &= -25), C && C != 1)\n              $r = C == 8 || C == 16 ? function(Re, Ge, Ir) {\n                var or = Ua(Re);\n                return function Nr() {\n                  for (var Mr = arguments.length, sn = P(Mr), wr = Mr, Dr = is(Nr); wr--; )\n                    sn[wr] = arguments[wr];\n                  var to = Mr < 3 && sn[0] !== Dr && sn[Mr - 1] !== Dr ? [] : Mn(sn, Dr);\n                  if ((Mr -= to.length) < Ir)\n                    return Zl(\n                      Re,\n                      Ge,\n                      ns,\n                      Nr.placeholder,\n                      void 0,\n                      sn,\n                      to,\n                      void 0,\n                      void 0,\n                      Ir - Mr\n                    );\n                  var Bo = this && this !== Vn && this instanceof Nr ? or : Re;\n                  return Sn(Bo, this, sn);\n                };\n              }(b, C, Gt) : C != 32 && C != 33 || ut.length ? ns.apply(void 0, gr) : function(Re, Ge, Ir, or) {\n                var Nr = 1 & Ge, Mr = Ua(Re);\n                return function sn() {\n                  for (var wr = -1, Dr = arguments.length, to = -1, Bo = or.length, Ra = P(Bo + Dr), eo = this && this !== Vn && this instanceof sn ? Mr : Re; ++to < Bo; )\n                    Ra[to] = or[to];\n                  for (; Dr--; ) Ra[to++] = arguments[++wr];\n                  return Sn(eo, Nr ? Ir : this, Ra);\n                };\n              }(b, C, B, J);\n            else\n              var $r = function(Re, Ge, Ir) {\n                var or = 1 & Ge, Nr = Ua(Re);\n                return function Mr() {\n                  var sn = this && this !== Vn && this instanceof Mr ? Nr : Re;\n                  return sn.apply(or ? Ir : this, arguments);\n                };\n              }(b, C, B);\n            return ou((dr ? Ns : iu)($r, gr), b, C);\n          }\n          function Us(b, C, B, J) {\n            return b === void 0 || cr(b, de[B]) && !We.call(J, B) ? C : b;\n          }\n          function Jl(b, C, B, J, ut, Et) {\n            return ai(b) && ai(C) && (Et.set(C, b), bs(b, C, void 0, Jl, Et), Et.delete(C)), b;\n          }\n          function Iu(b) {\n            return _s(b) ? void 0 : b;\n          }\n          function Kl(b, C, B, J, ut, Et) {\n            var Lt = 1 & B, Gt = b.length, fe = C.length;\n            if (Gt != fe && !(Lt && fe > Gt)) return !1;\n            var $e = Et.get(b), _e = Et.get(C);\n            if ($e && _e) return $e == C && _e == b;\n            var Fe = -1, dr = !0, gr = 2 & B ? new mo() : void 0;\n            for (Et.set(b, C), Et.set(C, b); ++Fe < Gt; ) {\n              var $r = b[Fe], Re = C[Fe];\n              if (J) var Ge = Lt ? J(Re, $r, Fe, C, b, Et) : J($r, Re, Fe, b, C, Et);\n              if (Ge !== void 0) {\n                if (Ge) continue;\n                dr = !1;\n                break;\n              }\n              if (gr) {\n                if (!Io(C, function(Ir, or) {\n                  if (!fo(gr, or) && ($r === Ir || ut($r, Ir, B, J, Et)))\n                    return gr.push(or);\n                })) {\n                  dr = !1;\n                  break;\n                }\n              } else if ($r !== Re && !ut($r, Re, B, J, Et)) {\n                dr = !1;\n                break;\n              }\n            }\n            return Et.delete(b), Et.delete(C), dr;\n          }\n          function Aa(b) {\n            return Al(ru(b, void 0, du), b + \"\");\n          }\n          function bl(b) {\n            return hs(b, Gr, Ha);\n          }\n          function Vs(b) {\n            return hs(b, pn, wl);\n          }\n          var yl = Co ? function(b) {\n            return Co.get(b);\n          } : ua;\n          function Es(b) {\n            for (var C = b.name + \"\", B = ra[C], J = We.call(ra, C) ? B.length : 0; J--; ) {\n              var ut = B[J], Et = ut.func;\n              if (Et == null || Et == b) return ut.name;\n            }\n            return C;\n          }\n          function is(b) {\n            return (We.call(vt, \"placeholder\") ? vt : b).placeholder;\n          }\n          function Sr() {\n            var b = vt.iteratee || jn;\n            return b = b === jn ? ol : b, arguments.length ? b(arguments[0], arguments[1]) : b;\n          }\n          function Hs(b, C) {\n            var B, J, ut = b.__data__;\n            return ((J = typeof (B = C)) == \"string\" || J == \"number\" || J == \"symbol\" || J == \"boolean\" ? B !== \"__proto__\" : B === null) ? ut[typeof C == \"string\" ? \"string\" : \"hash\"] : ut.map;\n          }\n          function xl(b) {\n            for (var C = Gr(b), B = C.length; B--; ) {\n              var J = C[B], ut = b[J];\n              C[B] = [J, ut, tu(ut)];\n            }\n            return C;\n          }\n          function Va(b, C) {\n            var B = function(J, ut) {\n              return J == null ? void 0 : J[ut];\n            }(b, C);\n            return Di(B) ? B : void 0;\n          }\n          var Ha = Zn ? function(b) {\n            return b == null ? [] : (b = mt(b), hi(Zn(b), function(C) {\n              return he.call(b, C);\n            }));\n          } : uo, wl = Zn ? function(b) {\n            for (var C = []; b; ) Ci(C, Ha(b)), b = ee(b);\n            return C;\n          } : uo, bi = Ki;\n          function Ss(b, C, B) {\n            for (var J = -1, ut = (C = xa(C, b)).length, Et = !1; ++J < ut; ) {\n              var Lt = sa(C[J]);\n              if (!(Et = b != null && B(b, Lt))) break;\n              b = b[Lt];\n            }\n            return Et || ++J != ut ? Et : !!(ut = b == null ? 0 : b.length) && Zs(ut) && Yo(Lt, ut) && (er(b) || Ln(b));\n          }\n          function os(b) {\n            return typeof b.constructor != \"function\" || as(b) ? {} : Qo(ee(b));\n          }\n          function Gs(b) {\n            return er(b) || Ln(b) || !!(nr && b && b[nr]);\n          }\n          function Yo(b, C) {\n            var B = typeof b;\n            return !!(C = C ?? 9007199254740991) && (B == \"number\" || B != \"symbol\" && pe.test(b)) && b > -1 && b % 1 == 0 && b < C;\n          }\n          function xo(b, C, B) {\n            if (!ai(B)) return !1;\n            var J = typeof C;\n            return !!(J == \"number\" ? Qn(B) && Yo(C, B.length) : J == \"string\" && C in B) && cr(B[C], b);\n          }\n          function kl(b, C) {\n            if (er(b)) return !1;\n            var B = typeof b;\n            return !(B != \"number\" && B != \"symbol\" && B != \"boolean\" && b != null && !_o(b)) || Nt.test(b) || !zt.test(b) || C != null && b in mt(C);\n          }\n          function Cs(b) {\n            var C = Es(b), B = vt[C];\n            if (typeof B != \"function\" || !(C in qr.prototype)) return !1;\n            if (b === B) return !0;\n            var J = yl(B);\n            return !!J && b === J[0];\n          }\n          (cs && bi(new cs(new ArrayBuffer(1))) != S || Na && bi(new Na()) != l || va && bi(va.resolve()) != \"[object Promise]\" || _a && bi(new _a()) != p || ba && bi(new ba()) != k) && (bi = function(b) {\n            var C = Ki(b), B = C == i ? b.constructor : void 0, J = B ? Ga(B) : \"\";\n            if (J)\n              switch (J) {\n                case Ps:\n                  return S;\n                case ds:\n                  return l;\n                case fs:\n                  return \"[object Promise]\";\n                case on:\n                  return p;\n                case Ho:\n                  return k;\n              }\n            return C;\n          });\n          var Nu = me ? Zo : Ca;\n          function as(b) {\n            var C = b && b.constructor;\n            return b === (typeof C == \"function\" && C.prototype || de);\n          }\n          function tu(b) {\n            return b == b && !ai(b);\n          }\n          function eu(b, C) {\n            return function(B) {\n              return B != null && B[b] === C && (C !== void 0 || b in mt(B));\n            };\n          }\n          function ru(b, C, B) {\n            return C = ei(C === void 0 ? b.length - 1 : C, 0), function() {\n              for (var J = arguments, ut = -1, Et = ei(J.length - C, 0), Lt = P(Et); ++ut < Et; )\n                Lt[ut] = J[C + ut];\n              ut = -1;\n              for (var Gt = P(C + 1); ++ut < C; ) Gt[ut] = J[ut];\n              return Gt[C] = B(Lt), Sn(b, this, Gt);\n            };\n          }\n          function nu(b, C) {\n            return C.length < 2 ? b : oa(b, Wo(C, 0, -1));\n          }\n          function Mu(b, C) {\n            for (var B = b.length, J = Bi(C.length, B), ut = yo(b); J--; ) {\n              var Et = C[J];\n              b[J] = Yo(Et, B) ? ut[Et] : void 0;\n            }\n            return b;\n          }\n          function Ws(b, C) {\n            if ((C !== \"constructor\" || typeof b[C] != \"function\") && C != \"__proto__\")\n              return b[C];\n          }\n          var iu = au(Ns), $s = Wn || function(b, C) {\n            return Vn.setTimeout(b, C);\n          }, Al = au(Pu);\n          function ou(b, C, B) {\n            var J = C + \"\";\n            return Al(\n              b,\n              function(ut, Et) {\n                var Lt = Et.length;\n                if (!Lt) return ut;\n                var Gt = Lt - 1;\n                return Et[Gt] = (Lt > 1 ? \"& \" : \"\") + Et[Gt], Et = Et.join(Lt > 2 ? \", \" : \" \"), ut.replace(we, `{\n/* [wrapped with ` + Et + `] */\n`);\n              }(\n                J,\n                function(ut, Et) {\n                  return Dn(x, function(Lt) {\n                    var Gt = \"_.\" + Lt[0];\n                    Et & Lt[1] && !ro(ut, Gt) && ut.push(Gt);\n                  }), ut.sort();\n                }(\n                  function(ut) {\n                    var Et = ut.match(ae);\n                    return Et ? Et[1].split(Le) : [];\n                  }(J),\n                  B\n                )\n              )\n            );\n          }\n          function au(b) {\n            var C = 0, B = 0;\n            return function() {\n              var J = el(), ut = 16 - (J - B);\n              if (B = J, ut > 0) {\n                if (++C >= 800) return arguments[0];\n              } else C = 0;\n              return b.apply(void 0, arguments);\n            };\n          }\n          function Ys(b, C) {\n            var B = -1, J = b.length, ut = J - 1;\n            for (C = C === void 0 ? J : C; ++B < C; ) {\n              var Et = Is(B, ut), Lt = b[Et];\n              b[Et] = b[B], b[B] = Lt;\n            }\n            return b.length = C, b;\n          }\n          var su = function(b) {\n            var C = dn(b, function(J) {\n              return B.size === 500 && B.clear(), J;\n            }), B = C.cache;\n            return C;\n          }(function(b) {\n            var C = [];\n            return b.charCodeAt(0) === 46 && C.push(\"\"), b.replace(re, function(B, J, ut, Et) {\n              C.push(ut ? Et.replace(Dt, \"$1\") : J || B);\n            }), C;\n          });\n          function sa(b) {\n            if (typeof b == \"string\" || _o(b)) return b;\n            var C = b + \"\";\n            return C == \"0\" && 1 / b == -1 / 0 ? \"-0\" : C;\n          }\n          function Ga(b) {\n            if (b != null) {\n              try {\n                return Be.call(b);\n              } catch {\n              }\n              try {\n                return b + \"\";\n              } catch {\n              }\n            }\n            return \"\";\n          }\n          function lu(b) {\n            if (b instanceof qr) return b.clone();\n            var C = new ho(b.__wrapped__, b.__chain__);\n            return C.__actions__ = yo(b.__actions__), C.__index__ = b.__index__, C.__values__ = b.__values__, C;\n          }\n          var Lu = xr(function(b, C) {\n            return zn(b) ? Vr(b, Lr(C, 1, zn, !0)) : [];\n          }), zu = xr(function(b, C) {\n            var B = Lo(C);\n            return zn(B) && (B = void 0), zn(b) ? Vr(b, Lr(C, 1, zn, !0), Sr(B, 2)) : [];\n          }), Wa = xr(function(b, C) {\n            var B = Lo(C);\n            return zn(B) && (B = void 0), zn(b) ? Vr(b, Lr(C, 1, zn, !0), void 0, B) : [];\n          });\n          function uu(b, C, B) {\n            var J = b == null ? 0 : b.length;\n            if (!J) return -1;\n            var ut = B == null ? 0 : te(B);\n            return ut < 0 && (ut = ei(J + ut, 0)), Yi(b, Sr(C, 3), ut);\n          }\n          function cu(b, C, B) {\n            var J = b == null ? 0 : b.length;\n            if (!J) return -1;\n            var ut = J - 1;\n            return B !== void 0 && (ut = te(B), ut = B < 0 ? ei(J + ut, 0) : Bi(ut, J - 1)), Yi(b, Sr(C, 3), ut, !0);\n          }\n          function du(b) {\n            return b != null && b.length ? Lr(b, 1) : [];\n          }\n          function El(b) {\n            return b && b.length ? b[0] : void 0;\n          }\n          var fu = xr(function(b) {\n            var C = sr(b, dl);\n            return C.length && C[0] === b[0] ? il(C) : [];\n          }), pu = xr(function(b) {\n            var C = Lo(b), B = sr(b, dl);\n            return C === Lo(B) ? C = void 0 : B.pop(), B.length && B[0] === b[0] ? il(B, Sr(C, 2)) : [];\n          }), hu = xr(function(b) {\n            var C = Lo(b), B = sr(b, dl);\n            return (C = typeof C == \"function\" ? C : void 0) && B.pop(), B.length && B[0] === b[0] ? il(B, void 0, C) : [];\n          });\n          function Lo(b) {\n            var C = b == null ? 0 : b.length;\n            return C ? b[C - 1] : void 0;\n          }\n          var Xs = xr(m);\n          function m(b, C) {\n            return b && b.length && C && C.length ? Rs(b, C) : b;\n          }\n          var O = Aa(function(b, C) {\n            var B = b == null ? 0 : b.length, J = Ve(b, C);\n            return ll(\n              b,\n              sr(C, function(ut) {\n                return Yo(ut, B) ? +ut : ut;\n              }).sort(hl)\n            ), J;\n          });\n          function D(b) {\n            return b == null ? b : rl.call(b);\n          }\n          var N = xr(function(b) {\n            return ya(Lr(b, 1, zn, !0));\n          }), q = xr(function(b) {\n            var C = Lo(b);\n            return zn(C) && (C = void 0), ya(Lr(b, 1, zn, !0), Sr(C, 2));\n          }), X = xr(function(b) {\n            var C = Lo(b);\n            return C = typeof C == \"function\" ? C : void 0, ya(Lr(b, 1, zn, !0), void 0, C);\n          });\n          function H(b) {\n            if (!b || !b.length) return [];\n            var C = 0;\n            return b = hi(b, function(B) {\n              if (zn(B)) return C = ei(B.length, C), !0;\n            }), di(C, function(B) {\n              return sr(b, fn(B));\n            });\n          }\n          function F(b, C) {\n            if (!b || !b.length) return [];\n            var B = H(b);\n            return C == null ? B : sr(B, function(J) {\n              return Sn(C, void 0, J);\n            });\n          }\n          var Q = xr(function(b, C) {\n            return zn(b) ? Vr(b, C) : [];\n          }), K = xr(function(b) {\n            return rs(hi(b, zn));\n          }), it = xr(function(b) {\n            var C = Lo(b);\n            return zn(C) && (C = void 0), rs(hi(b, zn), Sr(C, 2));\n          }), st = xr(function(b) {\n            var C = Lo(b);\n            return C = typeof C == \"function\" ? C : void 0, rs(hi(b, zn), void 0, C);\n          }), Ct = xr(H), jt = xr(function(b) {\n            var C = b.length, B = C > 1 ? b[C - 1] : void 0;\n            return B = typeof B == \"function\" ? (b.pop(), B) : void 0, F(b, B);\n          });\n          function Tt(b) {\n            var C = vt(b);\n            return C.__chain__ = !0, C;\n          }\n          function Vt(b, C) {\n            return C(b);\n          }\n          var oe = Aa(function(b) {\n            var C = b.length, B = C ? b[0] : 0, J = this.__wrapped__, ut = function(Et) {\n              return Ve(Et, b);\n            };\n            return !(C > 1 || this.__actions__.length) && J instanceof qr && Yo(B) ? ((J = J.slice(B, +B + (C ? 1 : 0))).__actions__.push({\n              func: Vt,\n              args: [ut],\n              thisArg: void 0\n            }), new ho(J, this.__chain__).thru(function(Et) {\n              return C && !Et.length && Et.push(void 0), Et;\n            })) : this.thru(ut);\n          }), _t = xs(function(b, C, B) {\n            We.call(b, B) ? ++b[B] : De(b, B, 1);\n          }), Bt = ml(uu), Qt = ml(cu);\n          function At(b, C) {\n            return (er(b) ? Dn : Cn)(b, Sr(C, 3));\n          }\n          function wt(b, C) {\n            return (er(b) ? Wi : Tr)(b, Sr(C, 3));\n          }\n          var Ot = xs(function(b, C, B) {\n            We.call(b, B) ? b[B].push(C) : De(b, B, [C]);\n          }), Ft = xr(function(b, C, B) {\n            var J = -1, ut = typeof C == \"function\", Et = Qn(b) ? P(b.length) : [];\n            return Cn(b, function(Lt) {\n              Et[++J] = ut ? Sn(C, Lt, B) : gs(Lt, C, B);\n            }), Et;\n          }), qt = xs(function(b, C, B) {\n            De(b, B, C);\n          });\n          function ue(b, C) {\n            return (er(b) ? sr : Ml)(b, Sr(C, 3));\n          }\n          var ie = xs(\n            function(b, C, B) {\n              b[B ? 0 : 1].push(C);\n            },\n            function() {\n              return [[], []];\n            }\n          ), ge = xr(function(b, C) {\n            if (b == null) return [];\n            var B = C.length;\n            return B > 1 && xo(b, C[0], C[1]) ? C = [] : B > 2 && xo(C[0], C[1], C[2]) && (C = [C[0]]), Oa(b, Lr(C, 1), []);\n          }), Te = Gn || function() {\n            return Vn.Date.now();\n          };\n          function Xe(b, C, B) {\n            return C = B ? void 0 : C, ka(\n              b,\n              128,\n              void 0,\n              void 0,\n              void 0,\n              void 0,\n              C = b && C == null ? b.length : C\n            );\n          }\n          function He(b, C) {\n            var B;\n            if (typeof C != \"function\") throw new Zt(E);\n            return b = te(b), function() {\n              return --b > 0 && (B = C.apply(this, arguments)), b <= 1 && (C = void 0), B;\n            };\n          }\n          var Qr = xr(function(b, C, B) {\n            var J = 1;\n            if (B.length) {\n              var ut = Mn(B, is(Qr));\n              J |= 32;\n            }\n            return ka(b, J, C, B, ut);\n          }), vr = xr(function(b, C, B) {\n            var J = 3;\n            if (B.length) {\n              var ut = Mn(B, is(vr));\n              J |= 32;\n            }\n            return ka(C, J, b, B, ut);\n          });\n          function Cr(b, C, B) {\n            var J, ut, Et, Lt, Gt, fe, $e = 0, _e = !1, Fe = !1, dr = !0;\n            if (typeof b != \"function\") throw new Zt(E);\n            function gr(Nr) {\n              var Mr = J, sn = ut;\n              return J = ut = void 0, $e = Nr, Lt = b.apply(sn, Mr);\n            }\n            function $r(Nr) {\n              return $e = Nr, Gt = $s(Ge, C), _e ? gr(Nr) : Lt;\n            }\n            function Re(Nr) {\n              var Mr = Nr - fe;\n              return fe === void 0 || Mr >= C || Mr < 0 || Fe && Nr - $e >= Et;\n            }\n            function Ge() {\n              var Nr = Te();\n              if (Re(Nr)) return Ir(Nr);\n              Gt = $s(\n                Ge,\n                function(Mr) {\n                  var sn = C - (Mr - fe);\n                  return Fe ? Bi(sn, Et - (Mr - $e)) : sn;\n                }(Nr)\n              );\n            }\n            function Ir(Nr) {\n              return Gt = void 0, dr && J ? gr(Nr) : (J = ut = void 0, Lt);\n            }\n            function or() {\n              var Nr = Te(), Mr = Re(Nr);\n              if (J = arguments, ut = this, fe = Nr, Mr) {\n                if (Gt === void 0) return $r(fe);\n                if (Fe) return Gl(Gt), Gt = $s(Ge, C), gr(fe);\n              }\n              return Gt === void 0 && (Gt = $s(Ge, C)), Lt;\n            }\n            return C = Pe(C) || 0, ai(B) && (_e = !!B.leading, Et = (Fe = \"maxWait\" in B) ? ei(Pe(B.maxWait) || 0, C) : Et, dr = \"trailing\" in B ? !!B.trailing : dr), or.cancel = function() {\n              Gt !== void 0 && Gl(Gt), $e = 0, J = fe = ut = Gt = void 0;\n            }, or.flush = function() {\n              return Gt === void 0 ? Lt : Ir(Te());\n            }, or;\n          }\n          var cn = xr(function(b, C) {\n            return Er(b, 1, C);\n          }), Pr = xr(function(b, C, B) {\n            return Er(b, Pe(C) || 0, B);\n          });\n          function dn(b, C) {\n            if (typeof b != \"function\" || C != null && typeof C != \"function\")\n              throw new Zt(E);\n            var B = function() {\n              var J = arguments, ut = C ? C.apply(this, J) : J[0], Et = B.cache;\n              if (Et.has(ut)) return Et.get(ut);\n              var Lt = b.apply(this, J);\n              return B.cache = Et.set(ut, Lt) || Et, Lt;\n            };\n            return B.cache = new (dn.Cache || go)(), B;\n          }\n          function _n(b) {\n            if (typeof b != \"function\") throw new Zt(E);\n            return function() {\n              var C = arguments;\n              switch (C.length) {\n                case 0:\n                  return !b.call(this);\n                case 1:\n                  return !b.call(this, C[0]);\n                case 2:\n                  return !b.call(this, C[0], C[1]);\n                case 3:\n                  return !b.call(this, C[0], C[1], C[2]);\n              }\n              return !b.apply(this, C);\n            };\n          }\n          dn.Cache = go;\n          var On = Hl(function(b, C) {\n            var B = (C = C.length == 1 && er(C[0]) ? sr(C[0], qn(Sr())) : sr(Lr(C, 1), qn(Sr()))).length;\n            return xr(function(J) {\n              for (var ut = -1, Et = Bi(J.length, B); ++ut < Et; )\n                J[ut] = C[ut].call(this, J[ut]);\n              return Sn(b, this, J);\n            });\n          }), kn = xr(function(b, C) {\n            return ka(b, 32, void 0, C, Mn(C, is(kn)));\n          }), zo = xr(function(b, C) {\n            return ka(b, 64, void 0, C, Mn(C, is(zo)));\n          }), br = Aa(function(b, C) {\n            return ka(b, 256, void 0, void 0, void 0, C);\n          });\n          function cr(b, C) {\n            return b === C || b != b && C != C;\n          }\n          var Jr = qs(nl), An = qs(function(b, C) {\n            return b >= C;\n          }), Ln = Nl(\n            /* @__PURE__ */ function() {\n              return arguments;\n            }()\n          ) ? Nl : function(b) {\n            return Un(b) && We.call(b, \"callee\") && !he.call(b, \"callee\");\n          }, er = P.isArray, Xo = pi ? qn(pi) : function(b) {\n            return Un(b) && Ki(b) == s;\n          };\n          function Qn(b) {\n            return b != null && Zs(b.length) && !Zo(b);\n          }\n          function zn(b) {\n            return Un(b) && Qn(b);\n          }\n          var Ai = ao || Ca, Ya = Fo ? qn(Fo) : function(b) {\n            return Un(b) && Ki(b) == a;\n          };\n          function Ko(b) {\n            if (!Un(b)) return !1;\n            var C = Ki(b);\n            return C == n || C == \"[object DOMException]\" || typeof b.message == \"string\" && typeof b.name == \"string\" && !_s(b);\n          }\n          function Zo(b) {\n            if (!ai(b)) return !1;\n            var C = Ki(b);\n            return C == t || C == r || C == \"[object AsyncFunction]\" || C == \"[object Proxy]\";\n          }\n          function Ta(b) {\n            return typeof b == \"number\" && b == te(b);\n          }\n          function Zs(b) {\n            return typeof b == \"number\" && b > -1 && b % 1 == 0 && b <= 9007199254740991;\n          }\n          function ai(b) {\n            var C = typeof b;\n            return b != null && (C == \"object\" || C == \"function\");\n          }\n          function Un(b) {\n            return b != null && typeof b == \"object\";\n          }\n          var Qs = ui ? qn(ui) : function(b) {\n            return Un(b) && bi(b) == l;\n          };\n          function gu(b) {\n            return typeof b == \"number\" || Un(b) && Ki(b) == h;\n          }\n          function _s(b) {\n            if (!Un(b) || Ki(b) != i) return !1;\n            var C = ee(b);\n            if (C === null) return !0;\n            var B = We.call(C, \"constructor\") && C.constructor;\n            return typeof B == \"function\" && B instanceof B && Be.call(B) == Qi;\n          }\n          var Sl = Ri ? qn(Ri) : function(b) {\n            return Un(b) && Ki(b) == d;\n          }, mu = qo ? qn(qo) : function(b) {\n            return Un(b) && bi(b) == p;\n          };\n          function Xa(b) {\n            return typeof b == \"string\" || !er(b) && Un(b) && Ki(b) == f;\n          }\n          function _o(b) {\n            return typeof b == \"symbol\" || Un(b) && Ki(b) == v;\n          }\n          var Za = wn ? qn(wn) : function(b) {\n            return Un(b) && Zs(b.length) && !!ur[Ki(b)];\n          }, Js = qs(vs), vu = qs(function(b, C) {\n            return b <= C;\n          });\n          function Yt(b) {\n            if (!b) return [];\n            if (Qn(b)) return Xa(b) ? ki(b) : yo(b);\n            if (fr && b[fr])\n              return function(B) {\n                for (var J, ut = []; !(J = B.next()).done; ) ut.push(J.value);\n                return ut;\n              }(b[fr]());\n            var C = bi(b);\n            return (C == l ? Hn : C == p ? Mi : Jn)(b);\n          }\n          function Kt(b) {\n            return b ? (b = Pe(b)) === 1 / 0 || b === -1 / 0 ? 17976931348623157e292 * (b < 0 ? -1 : 1) : b == b ? b : 0 : b === 0 ? b : 0;\n          }\n          function te(b) {\n            var C = Kt(b), B = C % 1;\n            return C == C ? B ? C - B : C : 0;\n          }\n          function Ce(b) {\n            return b ? Ye(te(b), 0, 4294967295) : 0;\n          }\n          function Pe(b) {\n            if (typeof b == \"number\") return b;\n            if (_o(b)) return NaN;\n            if (ai(b)) {\n              var C = typeof b.valueOf == \"function\" ? b.valueOf() : b;\n              b = ai(C) ? C + \"\" : C;\n            }\n            if (typeof b != \"string\") return b === 0 ? b : +b;\n            b = Zi(b);\n            var B = Wt.test(b);\n            return B || ye.test(b) ? $a(b.slice(2), B ? 2 : 8) : Rt.test(b) ? NaN : +b;\n          }\n          function ze(b) {\n            return Jo(b, pn(b));\n          }\n          function qe(b) {\n            return b == null ? \"\" : bo(b);\n          }\n          var mr = Fa(function(b, C) {\n            if (as(C) || Qn(C)) Jo(C, Gr(C), b);\n            else for (var B in C) We.call(C, B) && Jt(b, B, C[B]);\n          }), Je = Fa(function(b, C) {\n            Jo(C, pn(C), b);\n          }), Ie = Fa(function(b, C, B, J) {\n            Jo(C, pn(C), b, J);\n          }), Ke = Fa(function(b, C, B, J) {\n            Jo(C, Gr(C), b, J);\n          }), Ue = Aa(Ve), Qe = xr(function(b, C) {\n            b = mt(b);\n            var B = -1, J = C.length, ut = J > 2 ? C[2] : void 0;\n            for (ut && xo(C[0], C[1], ut) && (J = 1); ++B < J; )\n              for (var Et = C[B], Lt = pn(Et), Gt = -1, fe = Lt.length; ++Gt < fe; ) {\n                var $e = Lt[Gt], _e = b[$e];\n                (_e === void 0 || cr(_e, de[$e]) && !We.call(b, $e)) && (b[$e] = Et[$e]);\n              }\n            return b;\n          }), kr = xr(function(b) {\n            return b.push(void 0, Jl), Sn(hn, void 0, b);\n          });\n          function En(b, C, B) {\n            var J = b == null ? void 0 : oa(b, C);\n            return J === void 0 ? B : J;\n          }\n          function an(b, C) {\n            return b != null && Ss(b, C, Tu);\n          }\n          var Hr = Bs(function(b, C, B) {\n            C != null && typeof C.toString != \"function\" && (C = Rn.call(C)), b[C] = B;\n          }, Os(rn)), lr = Bs(function(b, C, B) {\n            C != null && typeof C.toString != \"function\" && (C = Rn.call(C)), We.call(b, C) ? b[C].push(B) : b[C] = [B];\n          }, Sr), Bn = xr(gs);\n          function Gr(b) {\n            return Qn(b) ? na(b) : al(b);\n          }\n          function pn(b) {\n            return Qn(b) ? na(b, !0) : $o(b);\n          }\n          var si = Fa(function(b, C, B) {\n            bs(b, C, B);\n          }), hn = Fa(function(b, C, B, J) {\n            bs(b, C, B, J);\n          }), en = Aa(function(b, C) {\n            var B = {};\n            if (b == null) return B;\n            var J = !1;\n            C = sr(C, function(Et) {\n              return Et = xa(Et, b), J || (J = Et.length > 1), Et;\n            }), Jo(b, Vs(b), B), J && (B = hr(B, 7, Iu));\n            for (var ut = C.length; ut--; ) ja(B, C[ut]);\n            return B;\n          }), yi = Aa(function(b, C) {\n            return b == null ? {} : function(B, J) {\n              return Ds(B, J, function(ut, Et) {\n                return an(B, Et);\n              });\n            }(b, C);\n          });\n          function Ui(b, C) {\n            if (b == null) return {};\n            var B = sr(Vs(b), function(J) {\n              return [J];\n            });\n            return C = Sr(C), Ds(b, B, function(J, ut) {\n              return C(J, ut[0]);\n            });\n          }\n          var Vi = Ql(Gr), Oo = Ql(pn);\n          function Jn(b) {\n            return b == null ? [] : co(b, Gr(b));\n          }\n          var jo = aa(function(b, C, B) {\n            return C = C.toLowerCase(), b + (B ? la(C) : C);\n          });\n          function la(b) {\n            return Ol(qe(b).toLowerCase());\n          }\n          function Pa(b) {\n            return (b = qe(b)) && b.replace(je, ga).replace(Wr, \"\");\n          }\n          var Ea = aa(function(b, C, B) {\n            return b + (B ? \"-\" : \"\") + C.toLowerCase();\n          }), Cl = aa(function(b, C, B) {\n            return b + (B ? \" \" : \"\") + C.toLowerCase();\n          }), Sa = ws(\"toLowerCase\"), bu = aa(function(b, C, B) {\n            return b + (B ? \"_\" : \"\") + C.toLowerCase();\n          }), $l = aa(function(b, C, B) {\n            return b + (B ? \" \" : \"\") + Ol(C);\n          }), _l = aa(function(b, C, B) {\n            return b + (B ? \" \" : \"\") + C.toUpperCase();\n          }), Ol = ws(\"toUpperCase\");\n          function jl(b, C, B) {\n            return b = qe(b), (C = B ? void 0 : C) === void 0 ? function(J) {\n              return In.test(J);\n            }(b) ? function(J) {\n              return J.match(Pn) || [];\n            }(b) : function(J) {\n              return J.match(lt) || [];\n            }(b) : b.match(C) || [];\n          }\n          var Tl = xr(function(b, C) {\n            try {\n              return Sn(b, void 0, C);\n            } catch (B) {\n              return Ko(B) ? B : new W(B);\n            }\n          }), Bu = Aa(function(b, C) {\n            return Dn(C, function(B) {\n              B = sa(B), De(b, B, Qr(b[B], b));\n            }), b;\n          });\n          function Os(b) {\n            return function() {\n              return b;\n            };\n          }\n          var yu = Mo(), Qa = Mo(!0);\n          function rn(b) {\n            return b;\n          }\n          function jn(b) {\n            return ol(typeof b == \"function\" ? b : hr(b, 1));\n          }\n          var ta = xr(function(b, C) {\n            return function(B) {\n              return gs(B, b, C);\n            };\n          }), Pl = xr(function(b, C) {\n            return function(B) {\n              return gs(b, B, C);\n            };\n          });\n          function Da(b, C, B) {\n            var J = Gr(C), ut = ia(C, J);\n            B != null || ai(C) && (ut.length || !J.length) || (B = C, C = b, b = this, ut = ia(C, Gr(C)));\n            var Et = !(ai(B) && \"chain\" in B && !B.chain), Lt = Zo(b);\n            return Dn(ut, function(Gt) {\n              var fe = C[Gt];\n              b[Gt] = fe, Lt && (b.prototype[Gt] = function() {\n                var $e = this.__chain__;\n                if (Et || $e) {\n                  var _e = b(this.__wrapped__), Fe = _e.__actions__ = yo(this.__actions__);\n                  return Fe.push({ func: fe, args: arguments, thisArg: b }), _e.__chain__ = $e, _e;\n                }\n                return fe.apply(b, Ci([this.value()], arguments));\n              });\n            }), b;\n          }\n          function ua() {\n          }\n          var xu = Fs(sr), ca = Fs(Eo), da = Fs(Io);\n          function ss(b) {\n            return kl(b) ? fn(sa(b)) : /* @__PURE__ */ function(C) {\n              return function(B) {\n                return oa(B, C);\n              };\n            }(b);\n          }\n          var fa = Xl(), js = Xl(!0);\n          function uo() {\n            return [];\n          }\n          function Ca() {\n            return !1;\n          }\n          var wu = ks(function(b, C) {\n            return b + C;\n          }, 0), ku = vl(\"ceil\"), Dl = ks(function(b, C) {\n            return b / C;\n          }, 1), Ts = vl(\"floor\"), Rl, Ks = ks(function(b, C) {\n            return b * C;\n          }, 1), Hi = vl(\"round\"), li = ks(function(b, C) {\n            return b - C;\n          }, 0);\n          return vt.after = function(b, C) {\n            if (typeof C != \"function\") throw new Zt(E);\n            return b = te(b), function() {\n              if (--b < 1) return C.apply(this, arguments);\n            };\n          }, vt.ary = Xe, vt.assign = mr, vt.assignIn = Je, vt.assignInWith = Ie, vt.assignWith = Ke, vt.at = Ue, vt.before = He, vt.bind = Qr, vt.bindAll = Bu, vt.bindKey = vr, vt.castArray = function() {\n            if (!arguments.length) return [];\n            var b = arguments[0];\n            return er(b) ? b : [b];\n          }, vt.chain = Tt, vt.chunk = function(b, C, B) {\n            C = (B ? xo(b, C, B) : C === void 0) ? 1 : ei(te(C), 0);\n            var J = b == null ? 0 : b.length;\n            if (!J || C < 1) return [];\n            for (var ut = 0, Et = 0, Lt = P(yr(J / C)); ut < J; )\n              Lt[Et++] = Wo(b, ut, ut += C);\n            return Lt;\n          }, vt.compact = function(b) {\n            for (var C = -1, B = b == null ? 0 : b.length, J = 0, ut = []; ++C < B; ) {\n              var Et = b[C];\n              Et && (ut[J++] = Et);\n            }\n            return ut;\n          }, vt.concat = function() {\n            var b = arguments.length;\n            if (!b) return [];\n            for (var C = P(b - 1), B = arguments[0], J = b; J--; )\n              C[J - 1] = arguments[J];\n            return Ci(er(B) ? yo(B) : [B], Lr(C, 1));\n          }, vt.cond = function(b) {\n            var C = b == null ? 0 : b.length, B = Sr();\n            return b = C ? sr(b, function(J) {\n              if (typeof J[1] != \"function\") throw new Zt(E);\n              return [B(J[0]), J[1]];\n            }) : [], xr(function(J) {\n              for (var ut = -1; ++ut < C; ) {\n                var Et = b[ut];\n                if (Sn(Et[0], this, J)) return Sn(Et[1], this, J);\n              }\n            });\n          }, vt.conforms = function(b) {\n            return function(C) {\n              var B = Gr(C);\n              return function(J) {\n                return jr(J, C, B);\n              };\n            }(hr(b, 1));\n          }, vt.constant = Os, vt.countBy = _t, vt.create = function(b, C) {\n            var B = Qo(b);\n            return C == null ? B : Oe(B, C);\n          }, vt.curry = function b(C, B, J) {\n            var ut = ka(\n              C,\n              8,\n              void 0,\n              void 0,\n              void 0,\n              void 0,\n              void 0,\n              B = J ? void 0 : B\n            );\n            return ut.placeholder = b.placeholder, ut;\n          }, vt.curryRight = function b(C, B, J) {\n            var ut = ka(\n              C,\n              16,\n              void 0,\n              void 0,\n              void 0,\n              void 0,\n              void 0,\n              B = J ? void 0 : B\n            );\n            return ut.placeholder = b.placeholder, ut;\n          }, vt.debounce = Cr, vt.defaults = Qe, vt.defaultsDeep = kr, vt.defer = cn, vt.delay = Pr, vt.difference = Lu, vt.differenceBy = zu, vt.differenceWith = Wa, vt.drop = function(b, C, B) {\n            var J = b == null ? 0 : b.length;\n            return J ? Wo(b, (C = B || C === void 0 ? 1 : te(C)) < 0 ? 0 : C, J) : [];\n          }, vt.dropRight = function(b, C, B) {\n            var J = b == null ? 0 : b.length;\n            return J ? Wo(\n              b,\n              0,\n              (C = J - (C = B || C === void 0 ? 1 : te(C))) < 0 ? 0 : C\n            ) : [];\n          }, vt.dropRightWhile = function(b, C) {\n            return b && b.length ? Ba(b, Sr(C, 3), !0, !0) : [];\n          }, vt.dropWhile = function(b, C) {\n            return b && b.length ? Ba(b, Sr(C, 3), !0) : [];\n          }, vt.fill = function(b, C, B, J) {\n            var ut = b == null ? 0 : b.length;\n            return ut ? (B && typeof B != \"number\" && xo(b, C, B) && (B = 0, J = ut), function(Et, Lt, Gt, fe) {\n              var $e = Et.length;\n              for ((Gt = te(Gt)) < 0 && (Gt = -Gt > $e ? 0 : $e + Gt), (fe = fe === void 0 || fe > $e ? $e : te(fe)) < 0 && (fe += $e), fe = Gt > fe ? 0 : Ce(fe); Gt < fe; )\n                Et[Gt++] = Lt;\n              return Et;\n            }(b, C, B, J)) : [];\n          }, vt.filter = function(b, C) {\n            return (er(b) ? hi : qi)(b, Sr(C, 3));\n          }, vt.flatMap = function(b, C) {\n            return Lr(ue(b, C), 1);\n          }, vt.flatMapDeep = function(b, C) {\n            return Lr(ue(b, C), 1 / 0);\n          }, vt.flatMapDepth = function(b, C, B) {\n            return B = B === void 0 ? 1 : te(B), Lr(ue(b, C), B);\n          }, vt.flatten = du, vt.flattenDeep = function(b) {\n            return b != null && b.length ? Lr(b, 1 / 0) : [];\n          }, vt.flattenDepth = function(b, C) {\n            return b != null && b.length ? Lr(b, C = C === void 0 ? 1 : te(C)) : [];\n          }, vt.flip = function(b) {\n            return ka(b, 512);\n          }, vt.flow = yu, vt.flowRight = Qa, vt.fromPairs = function(b) {\n            for (var C = -1, B = b == null ? 0 : b.length, J = {}; ++C < B; ) {\n              var ut = b[C];\n              J[ut[0]] = ut[1];\n            }\n            return J;\n          }, vt.functions = function(b) {\n            return b == null ? [] : ia(b, Gr(b));\n          }, vt.functionsIn = function(b) {\n            return b == null ? [] : ia(b, pn(b));\n          }, vt.groupBy = Ot, vt.initial = function(b) {\n            return b != null && b.length ? Wo(b, 0, -1) : [];\n          }, vt.intersection = fu, vt.intersectionBy = pu, vt.intersectionWith = hu, vt.invert = Hr, vt.invertBy = lr, vt.invokeMap = Ft, vt.iteratee = jn, vt.keyBy = qt, vt.keys = Gr, vt.keysIn = pn, vt.map = ue, vt.mapKeys = function(b, C) {\n            var B = {};\n            return C = Sr(C, 3), $n(b, function(J, ut, Et) {\n              De(B, C(J, ut, Et), J);\n            }), B;\n          }, vt.mapValues = function(b, C) {\n            var B = {};\n            return C = Sr(C, 3), $n(b, function(J, ut, Et) {\n              De(B, ut, C(J, ut, Et));\n            }), B;\n          }, vt.matches = function(b) {\n            return sl(hr(b, 1));\n          }, vt.matchesProperty = function(b, C) {\n            return Ll(b, hr(C, 1));\n          }, vt.memoize = dn, vt.merge = si, vt.mergeWith = hn, vt.method = ta, vt.methodOf = Pl, vt.mixin = Da, vt.negate = _n, vt.nthArg = function(b) {\n            return b = te(b), xr(function(C) {\n              return zl(C, b);\n            });\n          }, vt.omit = en, vt.omitBy = function(b, C) {\n            return Ui(b, _n(Sr(C)));\n          }, vt.once = function(b) {\n            return He(2, b);\n          }, vt.orderBy = function(b, C, B, J) {\n            return b == null ? [] : (er(C) || (C = C == null ? [] : [C]), er(B = J ? void 0 : B) || (B = B == null ? [] : [B]), Oa(b, C, B));\n          }, vt.over = xu, vt.overArgs = On, vt.overEvery = ca, vt.overSome = da, vt.partial = kn, vt.partialRight = zo, vt.partition = ie, vt.pick = yi, vt.pickBy = Ui, vt.property = ss, vt.propertyOf = function(b) {\n            return function(C) {\n              return b == null ? void 0 : oa(b, C);\n            };\n          }, vt.pull = Xs, vt.pullAll = m, vt.pullAllBy = function(b, C, B) {\n            return b && b.length && C && C.length ? Rs(b, C, Sr(B, 2)) : b;\n          }, vt.pullAllWith = function(b, C, B) {\n            return b && b.length && C && C.length ? Rs(b, C, void 0, B) : b;\n          }, vt.pullAt = O, vt.range = fa, vt.rangeRight = js, vt.rearg = br, vt.reject = function(b, C) {\n            return (er(b) ? hi : qi)(b, _n(Sr(C, 3)));\n          }, vt.remove = function(b, C) {\n            var B = [];\n            if (!b || !b.length) return B;\n            var J = -1, ut = [], Et = b.length;\n            for (C = Sr(C, 3); ++J < Et; ) {\n              var Lt = b[J];\n              C(Lt, J, b) && (B.push(Lt), ut.push(J));\n            }\n            return ll(b, ut), B;\n          }, vt.rest = function(b, C) {\n            if (typeof b != \"function\") throw new Zt(E);\n            return xr(b, C = C === void 0 ? C : te(C));\n          }, vt.reverse = D, vt.sampleSize = function(b, C, B) {\n            return C = (B ? xo(b, C, B) : C === void 0) ? 1 : te(C), (er(b) ? ps : Bl)(b, C);\n          }, vt.set = function(b, C, B) {\n            return b == null ? b : ts(b, C, B);\n          }, vt.setWith = function(b, C, B, J) {\n            return J = typeof J == \"function\" ? J : void 0, b == null ? b : ts(b, C, B, J);\n          }, vt.shuffle = function(b) {\n            return (er(b) ? bt : Du)(b);\n          }, vt.slice = function(b, C, B) {\n            var J = b == null ? 0 : b.length;\n            return J ? (B && typeof B != \"number\" && xo(b, C, B) ? (C = 0, B = J) : (C = C == null ? 0 : te(C), B = B === void 0 ? J : te(B)), Wo(b, C, B)) : [];\n          }, vt.sortBy = ge, vt.sortedUniq = function(b) {\n            return b && b.length ? ql(b) : [];\n          }, vt.sortedUniqBy = function(b, C) {\n            return b && b.length ? ql(b, Sr(C, 2)) : [];\n          }, vt.split = function(b, C, B) {\n            return B && typeof B != \"number\" && xo(b, C, B) && (C = B = void 0), (B = B === void 0 ? 4294967295 : B >>> 0) ? (b = qe(b)) && (typeof C == \"string\" || C != null && !Sl(C)) && !(C = bo(C)) && po(b) ? wa(ki(b), 0, B) : b.split(C, B) : [];\n          }, vt.spread = function(b, C) {\n            if (typeof b != \"function\") throw new Zt(E);\n            return C = C == null ? 0 : ei(te(C), 0), xr(function(B) {\n              var J = B[C], ut = wa(B, 0, C);\n              return J && Ci(ut, J), Sn(b, this, ut);\n            });\n          }, vt.tail = function(b) {\n            var C = b == null ? 0 : b.length;\n            return C ? Wo(b, 1, C) : [];\n          }, vt.take = function(b, C, B) {\n            return b && b.length ? Wo(b, 0, (C = B || C === void 0 ? 1 : te(C)) < 0 ? 0 : C) : [];\n          }, vt.takeRight = function(b, C, B) {\n            var J = b == null ? 0 : b.length;\n            return J ? Wo(\n              b,\n              (C = J - (C = B || C === void 0 ? 1 : te(C))) < 0 ? 0 : C,\n              J\n            ) : [];\n          }, vt.takeRightWhile = function(b, C) {\n            return b && b.length ? Ba(b, Sr(C, 3), !1, !0) : [];\n          }, vt.takeWhile = function(b, C) {\n            return b && b.length ? Ba(b, Sr(C, 3)) : [];\n          }, vt.tap = function(b, C) {\n            return C(b), b;\n          }, vt.throttle = function(b, C, B) {\n            var J = !0, ut = !0;\n            if (typeof b != \"function\") throw new Zt(E);\n            return ai(B) && (J = \"leading\" in B ? !!B.leading : J, ut = \"trailing\" in B ? !!B.trailing : ut), Cr(b, C, { leading: J, maxWait: C, trailing: ut });\n          }, vt.thru = Vt, vt.toArray = Yt, vt.toPairs = Vi, vt.toPairsIn = Oo, vt.toPath = function(b) {\n            return er(b) ? sr(b, sa) : _o(b) ? [b] : yo(su(qe(b)));\n          }, vt.toPlainObject = ze, vt.transform = function(b, C, B) {\n            var J = er(b), ut = J || Ai(b) || Za(b);\n            if (C = Sr(C, 4), B == null) {\n              var Et = b && b.constructor;\n              B = ut ? J ? new Et() : [] : ai(b) && Zo(Et) ? Qo(ee(b)) : {};\n            }\n            return (ut ? Dn : $n)(b, function(Lt, Gt, fe) {\n              return C(B, Lt, Gt, fe);\n            }), B;\n          }, vt.unary = function(b) {\n            return Xe(b, 1);\n          }, vt.union = N, vt.unionBy = q, vt.unionWith = X, vt.uniq = function(b) {\n            return b && b.length ? ya(b) : [];\n          }, vt.uniqBy = function(b, C) {\n            return b && b.length ? ya(b, Sr(C, 2)) : [];\n          }, vt.uniqWith = function(b, C) {\n            return C = typeof C == \"function\" ? C : void 0, b && b.length ? ya(b, void 0, C) : [];\n          }, vt.unset = function(b, C) {\n            return b == null || ja(b, C);\n          }, vt.unzip = H, vt.unzipWith = F, vt.update = function(b, C, B) {\n            return b == null ? b : Vl(b, C, fl(B));\n          }, vt.updateWith = function(b, C, B, J) {\n            return J = typeof J == \"function\" ? J : void 0, b == null ? b : Vl(b, C, fl(B), J);\n          }, vt.values = Jn, vt.valuesIn = function(b) {\n            return b == null ? [] : co(b, pn(b));\n          }, vt.without = Q, vt.words = jl, vt.wrap = function(b, C) {\n            return kn(fl(C), b);\n          }, vt.xor = K, vt.xorBy = it, vt.xorWith = st, vt.zip = Ct, vt.zipObject = function(b, C) {\n            return cl(b || [], C || [], Jt);\n          }, vt.zipObjectDeep = function(b, C) {\n            return cl(b || [], C || [], ts);\n          }, vt.zipWith = jt, vt.entries = Vi, vt.entriesIn = Oo, vt.extend = Je, vt.extendWith = Ie, Da(vt, vt), vt.add = wu, vt.attempt = Tl, vt.camelCase = jo, vt.capitalize = la, vt.ceil = ku, vt.clamp = function(b, C, B) {\n            return B === void 0 && (B = C, C = void 0), B !== void 0 && (B = (B = Pe(B)) == B ? B : 0), C !== void 0 && (C = (C = Pe(C)) == C ? C : 0), Ye(Pe(b), C, B);\n          }, vt.clone = function(b) {\n            return hr(b, 4);\n          }, vt.cloneDeep = function(b) {\n            return hr(b, 5);\n          }, vt.cloneDeepWith = function(b, C) {\n            return hr(b, 5, C = typeof C == \"function\" ? C : void 0);\n          }, vt.cloneWith = function(b, C) {\n            return hr(b, 4, C = typeof C == \"function\" ? C : void 0);\n          }, vt.conformsTo = function(b, C) {\n            return C == null || jr(b, C, Gr(C));\n          }, vt.deburr = Pa, vt.defaultTo = function(b, C) {\n            return b == null || b != b ? C : b;\n          }, vt.divide = Dl, vt.endsWith = function(b, C, B) {\n            b = qe(b), C = bo(C);\n            var J = b.length, ut = B = B === void 0 ? J : Ye(te(B), 0, J);\n            return (B -= C.length) >= 0 && b.slice(B, ut) == C;\n          }, vt.eq = cr, vt.escape = function(b) {\n            return (b = qe(b)) && ot.test(b) ? b.replace(ht, Vo) : b;\n          }, vt.escapeRegExp = function(b) {\n            return (b = qe(b)) && ne.test(b) ? b.replace(be, \"\\\\$&\") : b;\n          }, vt.every = function(b, C, B) {\n            var J = er(b) ? Eo : fi;\n            return B && xo(b, C, B) && (C = void 0), J(b, Sr(C, 3));\n          }, vt.find = Bt, vt.findIndex = uu, vt.findKey = function(b, C) {\n            return _i(b, Sr(C, 3), $n);\n          }, vt.findLast = Qt, vt.findLastIndex = cu, vt.findLastKey = function(b, C) {\n            return _i(b, Sr(C, 3), Ji);\n          }, vt.floor = Ts, vt.forEach = At, vt.forEachRight = wt, vt.forIn = function(b, C) {\n            return b == null ? b : vi(b, Sr(C, 3), pn);\n          }, vt.forInRight = function(b, C) {\n            return b == null ? b : Zr(b, Sr(C, 3), pn);\n          }, vt.forOwn = function(b, C) {\n            return b && $n(b, Sr(C, 3));\n          }, vt.forOwnRight = function(b, C) {\n            return b && Ji(b, Sr(C, 3));\n          }, vt.get = En, vt.gt = Jr, vt.gte = An, vt.has = function(b, C) {\n            return b != null && Ss(b, C, ju);\n          }, vt.hasIn = an, vt.head = El, vt.identity = rn, vt.includes = function(b, C, B, J) {\n            b = Qn(b) ? b : Jn(b), B = B && !J ? te(B) : 0;\n            var ut = b.length;\n            return B < 0 && (B = ei(ut + B, 0)), Xa(b) ? B <= ut && b.indexOf(C, B) > -1 : !!ut && ci(b, C, B) > -1;\n          }, vt.indexOf = function(b, C, B) {\n            var J = b == null ? 0 : b.length;\n            if (!J) return -1;\n            var ut = B == null ? 0 : te(B);\n            return ut < 0 && (ut = ei(J + ut, 0)), ci(b, C, ut);\n          }, vt.inRange = function(b, C, B) {\n            return C = Kt(C), B === void 0 ? (B = C, C = 0) : B = Kt(B), function(J, ut, Et) {\n              return J >= Bi(ut, Et) && J < ei(ut, Et);\n            }(b = Pe(b), C, B);\n          }, vt.invoke = Bn, vt.isArguments = Ln, vt.isArray = er, vt.isArrayBuffer = Xo, vt.isArrayLike = Qn, vt.isArrayLikeObject = zn, vt.isBoolean = function(b) {\n            return b === !0 || b === !1 || Un(b) && Ki(b) == c;\n          }, vt.isBuffer = Ai, vt.isDate = Ya, vt.isElement = function(b) {\n            return Un(b) && b.nodeType === 1 && !_s(b);\n          }, vt.isEmpty = function(b) {\n            if (b == null) return !0;\n            if (Qn(b) && (er(b) || typeof b == \"string\" || typeof b.splice == \"function\" || Ai(b) || Za(b) || Ln(b)))\n              return !b.length;\n            var C = bi(b);\n            if (C == l || C == p) return !b.size;\n            if (as(b)) return !al(b).length;\n            for (var B in b) if (We.call(b, B)) return !1;\n            return !0;\n          }, vt.isEqual = function(b, C) {\n            return ms(b, C);\n          }, vt.isEqualWith = function(b, C, B) {\n            var J = (B = typeof B == \"function\" ? B : void 0) ? B(b, C) : void 0;\n            return J === void 0 ? ms(b, C, void 0, B) : !!J;\n          }, vt.isError = Ko, vt.isFinite = function(b) {\n            return typeof b == \"number\" && ti(b);\n          }, vt.isFunction = Zo, vt.isInteger = Ta, vt.isLength = Zs, vt.isMap = Qs, vt.isMatch = function(b, C) {\n            return b === C || za(b, C, xl(C));\n          }, vt.isMatchWith = function(b, C, B) {\n            return B = typeof B == \"function\" ? B : void 0, za(b, C, xl(C), B);\n          }, vt.isNaN = function(b) {\n            return gu(b) && b != +b;\n          }, vt.isNative = function(b) {\n            if (Nu(b))\n              throw new W(\n                \"Unsupported core-js use. Try https://npms.io/search?q=ponyfill.\"\n              );\n            return Di(b);\n          }, vt.isNil = function(b) {\n            return b == null;\n          }, vt.isNull = function(b) {\n            return b === null;\n          }, vt.isNumber = gu, vt.isObject = ai, vt.isObjectLike = Un, vt.isPlainObject = _s, vt.isRegExp = Sl, vt.isSafeInteger = function(b) {\n            return Ta(b) && b >= -9007199254740991 && b <= 9007199254740991;\n          }, vt.isSet = mu, vt.isString = Xa, vt.isSymbol = _o, vt.isTypedArray = Za, vt.isUndefined = function(b) {\n            return b === void 0;\n          }, vt.isWeakMap = function(b) {\n            return Un(b) && bi(b) == k;\n          }, vt.isWeakSet = function(b) {\n            return Un(b) && Ki(b) == \"[object WeakSet]\";\n          }, vt.join = function(b, C) {\n            return b == null ? \"\" : so.call(b, C);\n          }, vt.kebabCase = Ea, vt.last = Lo, vt.lastIndexOf = function(b, C, B) {\n            var J = b == null ? 0 : b.length;\n            if (!J) return -1;\n            var ut = J;\n            return B !== void 0 && (ut = (ut = te(B)) < 0 ? ei(J + ut, 0) : Bi(ut, J - 1)), C == C ? function(Et, Lt, Gt) {\n              for (var fe = Gt + 1; fe--; ) if (Et[fe] === Lt) return fe;\n              return fe;\n            }(b, C, ut) : Yi(b, xi, ut, !0);\n          }, vt.lowerCase = Cl, vt.lowerFirst = Sa, vt.lt = Js, vt.lte = vu, vt.max = function(b) {\n            return b && b.length ? oi(b, rn, nl) : void 0;\n          }, vt.maxBy = function(b, C) {\n            return b && b.length ? oi(b, Sr(C, 2), nl) : void 0;\n          }, vt.mean = function(b) {\n            return Xi(b, rn);\n          }, vt.meanBy = function(b, C) {\n            return Xi(b, Sr(C, 2));\n          }, vt.min = function(b) {\n            return b && b.length ? oi(b, rn, vs) : void 0;\n          }, vt.minBy = function(b, C) {\n            return b && b.length ? oi(b, Sr(C, 2), vs) : void 0;\n          }, vt.stubArray = uo, vt.stubFalse = Ca, vt.stubObject = function() {\n            return {};\n          }, vt.stubString = function() {\n            return \"\";\n          }, vt.stubTrue = function() {\n            return !0;\n          }, vt.multiply = Ks, vt.nth = function(b, C) {\n            return b && b.length ? zl(b, te(C)) : void 0;\n          }, vt.noConflict = function() {\n            return Vn._ === this && (Vn._ = Br), this;\n          }, vt.noop = ua, vt.now = Te, vt.pad = function(b, C, B) {\n            b = qe(b);\n            var J = (C = te(C)) ? Li(b) : 0;\n            if (!C || J >= C) return b;\n            var ut = (C - J) / 2;\n            return As(Xr(ut), B) + b + As(yr(ut), B);\n          }, vt.padEnd = function(b, C, B) {\n            b = qe(b);\n            var J = (C = te(C)) ? Li(b) : 0;\n            return C && J < C ? b + As(C - J, B) : b;\n          }, vt.padStart = function(b, C, B) {\n            b = qe(b);\n            var J = (C = te(C)) ? Li(b) : 0;\n            return C && J < C ? As(C - J, B) + b : b;\n          }, vt.parseInt = function(b, C, B) {\n            return B || C == null ? C = 0 : C && (C = +C), ma(qe(b).replace(ce, \"\"), C || 0);\n          }, vt.random = function(b, C, B) {\n            if (B && typeof B != \"boolean\" && xo(b, C, B) && (C = B = void 0), B === void 0 && (typeof C == \"boolean\" ? (B = C, C = void 0) : typeof b == \"boolean\" && (B = b, b = void 0)), b === void 0 && C === void 0 ? (b = 0, C = 1) : (b = Kt(b), C === void 0 ? (C = b, b = 0) : C = Kt(C)), b > C) {\n              var J = b;\n              b = C, C = J;\n            }\n            if (B || b % 1 || C % 1) {\n              var ut = Ia();\n              return Bi(\n                b + ut * (C - b + Si(\"1e-\" + ((ut + \"\").length - 1))),\n                C\n              );\n            }\n            return Is(b, C);\n          }, vt.reduce = function(b, C, B) {\n            var J = er(b) ? gi : No, ut = arguments.length < 3;\n            return J(b, Sr(C, 4), B, ut, Cn);\n          }, vt.reduceRight = function(b, C, B) {\n            var J = er(b) ? ha : No, ut = arguments.length < 3;\n            return J(b, Sr(C, 4), B, ut, Tr);\n          }, vt.repeat = function(b, C, B) {\n            return C = (B ? xo(b, C, B) : C === void 0) ? 1 : te(C), Ka(qe(b), C);\n          }, vt.replace = function() {\n            var b = arguments, C = qe(b[0]);\n            return b.length < 3 ? C : C.replace(b[1], b[2]);\n          }, vt.result = function(b, C, B) {\n            var J = -1, ut = (C = xa(C, b)).length;\n            for (ut || (ut = 1, b = void 0); ++J < ut; ) {\n              var Et = b == null ? void 0 : b[sa(C[J])];\n              Et === void 0 && (J = ut, Et = B), b = Zo(Et) ? Et.call(b) : Et;\n            }\n            return b;\n          }, vt.round = Hi, vt.runInContext = Xt, vt.sample = function(b) {\n            return (er(b) ? Ne : ys)(b);\n          }, vt.size = function(b) {\n            if (b == null) return 0;\n            if (Qn(b)) return Xa(b) ? Li(b) : b.length;\n            var C = bi(b);\n            return C == l || C == p ? b.size : al(b).length;\n          }, vt.snakeCase = bu, vt.some = function(b, C, B) {\n            var J = er(b) ? Io : Fl;\n            return B && xo(b, C, B) && (C = void 0), J(b, Sr(C, 3));\n          }, vt.sortedIndex = function(b, C) {\n            return Ms(b, C);\n          }, vt.sortedIndexBy = function(b, C, B) {\n            return ul(b, C, Sr(B, 2));\n          }, vt.sortedIndexOf = function(b, C) {\n            var B = b == null ? 0 : b.length;\n            if (B) {\n              var J = Ms(b, C);\n              if (J < B && cr(b[J], C)) return J;\n            }\n            return -1;\n          }, vt.sortedLastIndex = function(b, C) {\n            return Ms(b, C, !0);\n          }, vt.sortedLastIndexBy = function(b, C, B) {\n            return ul(b, C, Sr(B, 2), !0);\n          }, vt.sortedLastIndexOf = function(b, C) {\n            if (b != null && b.length) {\n              var B = Ms(b, C, !0) - 1;\n              if (cr(b[B], C)) return B;\n            }\n            return -1;\n          }, vt.startCase = $l, vt.startsWith = function(b, C, B) {\n            return b = qe(b), B = B == null ? 0 : Ye(te(B), 0, b.length), C = bo(C), b.slice(B, B + C.length) == C;\n          }, vt.subtract = li, vt.sum = function(b) {\n            return b && b.length ? no(b, rn) : 0;\n          }, vt.sumBy = function(b, C) {\n            return b && b.length ? no(b, Sr(C, 2)) : 0;\n          }, vt.template = function(b, C, B) {\n            var J = vt.templateSettings;\n            B && xo(b, C, B) && (C = void 0), b = qe(b), C = Ie({}, C, J, Us);\n            var ut, Et, Lt = Ie({}, C.imports, J.imports, Us), Gt = Gr(Lt), fe = co(Lt, Gt), $e = 0, _e = C.interpolate || Me, Fe = \"__p += '\", dr = Mt(\n              (C.escape || Me).source + \"|\" + _e.source + \"|\" + (_e === St ? yt : Me).source + \"|\" + (C.evaluate || Me).source + \"|$\",\n              \"g\"\n            ), gr = \"//# sourceURL=\" + (We.call(C, \"sourceURL\") ? (C.sourceURL + \"\").replace(/\\s/g, \" \") : \"lodash.templateSources[\" + ++Xn + \"]\") + `\n`;\n            b.replace(dr, function(Ge, Ir, or, Nr, Mr, sn) {\n              return or || (or = Nr), Fe += b.slice($e, sn).replace(Ze, io), Ir && (ut = !0, Fe += `' +\n__e(` + Ir + `) +\n'`), Mr && (Et = !0, Fe += `';\n` + Mr + `;\n__p += '`), or && (Fe += `' +\n((__t = (` + or + `)) == null ? '' : __t) +\n'`), $e = sn + Ge.length, Ge;\n            }), Fe += `';\n`;\n            var $r = We.call(C, \"variable\") && C.variable;\n            if ($r) {\n              if (kt.test($r))\n                throw new W(\n                  \"Invalid `variable` option passed into `_.template`\"\n                );\n            } else Fe = `with (obj) {\n` + Fe + `\n}\n`;\n            Fe = (Et ? Fe.replace(tt, \"\") : Fe).replace(Z, \"$1\").replace(at, \"$1;\"), Fe = \"function(\" + ($r || \"obj\") + `) {\n` + ($r ? \"\" : `obj || (obj = {});\n`) + \"var __t, __p = ''\" + (ut ? \", __e = _.escape\" : \"\") + (Et ? `, __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n` : `;\n`) + Fe + `return __p\n}`;\n            var Re = Tl(function() {\n              return et(Gt, gr + \"return \" + Fe).apply(void 0, fe);\n            });\n            if (Re.source = Fe, Ko(Re)) throw Re;\n            return Re;\n          }, vt.times = function(b, C) {\n            if ((b = te(b)) < 1 || b > 9007199254740991) return [];\n            var B = 4294967295, J = Bi(b, 4294967295);\n            b -= 4294967295;\n            for (var ut = di(J, C = Sr(C)); ++B < b; ) C(B);\n            return ut;\n          }, vt.toFinite = Kt, vt.toInteger = te, vt.toLength = Ce, vt.toLower = function(b) {\n            return qe(b).toLowerCase();\n          }, vt.toNumber = Pe, vt.toSafeInteger = function(b) {\n            return b ? Ye(te(b), -9007199254740991, 9007199254740991) : b === 0 ? b : 0;\n          }, vt.toString = qe, vt.toUpper = function(b) {\n            return qe(b).toUpperCase();\n          }, vt.trim = function(b, C, B) {\n            if ((b = qe(b)) && (B || C === void 0)) return Zi(b);\n            if (!b || !(C = bo(C))) return b;\n            var J = ki(b), ut = ki(C);\n            return wa(J, wi(J, ut), Oi(J, ut) + 1).join(\"\");\n          }, vt.trimEnd = function(b, C, B) {\n            if ((b = qe(b)) && (B || C === void 0))\n              return b.slice(0, ji(b) + 1);\n            if (!b || !(C = bo(C))) return b;\n            var J = ki(b);\n            return wa(J, 0, Oi(J, ki(C)) + 1).join(\"\");\n          }, vt.trimStart = function(b, C, B) {\n            if ((b = qe(b)) && (B || C === void 0)) return b.replace(ce, \"\");\n            if (!b || !(C = bo(C))) return b;\n            var J = ki(b);\n            return wa(J, wi(J, ki(C))).join(\"\");\n          }, vt.truncate = function(b, C) {\n            var B = 30, J = \"...\";\n            if (ai(C)) {\n              var ut = \"separator\" in C ? C.separator : ut;\n              B = \"length\" in C ? te(C.length) : B, J = \"omission\" in C ? bo(C.omission) : J;\n            }\n            var Et = (b = qe(b)).length;\n            if (po(b)) {\n              var Lt = ki(b);\n              Et = Lt.length;\n            }\n            if (B >= Et) return b;\n            var Gt = B - Li(J);\n            if (Gt < 1) return J;\n            var fe = Lt ? wa(Lt, 0, Gt).join(\"\") : b.slice(0, Gt);\n            if (ut === void 0) return fe + J;\n            if (Lt && (Gt += fe.length - Gt), Sl(ut)) {\n              if (b.slice(Gt).search(ut)) {\n                var $e, _e = fe;\n                for (ut.global || (ut = Mt(ut.source, qe(ft.exec(ut)) + \"g\")), ut.lastIndex = 0; $e = ut.exec(_e); )\n                  var Fe = $e.index;\n                fe = fe.slice(0, Fe === void 0 ? Gt : Fe);\n              }\n            } else if (b.indexOf(bo(ut), Gt) != Gt) {\n              var dr = fe.lastIndexOf(ut);\n              dr > -1 && (fe = fe.slice(0, dr));\n            }\n            return fe + J;\n          }, vt.unescape = function(b) {\n            return (b = qe(b)) && ct.test(b) ? b.replace(nt, zi) : b;\n          }, vt.uniqueId = function(b) {\n            var C = ++tr;\n            return qe(b) + C;\n          }, vt.upperCase = _l, vt.upperFirst = Ol, vt.each = At, vt.eachRight = wt, vt.first = El, Da(\n            vt,\n            (Rl = {}, $n(vt, function(b, C) {\n              We.call(vt.prototype, C) || (Rl[C] = b);\n            }), Rl),\n            { chain: !1 }\n          ), vt.VERSION = \"4.17.21\", Dn(\n            [\n              \"bind\",\n              \"bindKey\",\n              \"curry\",\n              \"curryRight\",\n              \"partial\",\n              \"partialRight\"\n            ],\n            function(b) {\n              vt[b].placeholder = vt;\n            }\n          ), Dn([\"drop\", \"take\"], function(b, C) {\n            qr.prototype[b] = function(B) {\n              B = B === void 0 ? 1 : ei(te(B), 0);\n              var J = this.__filtered__ && !C ? new qr(this) : this.clone();\n              return J.__filtered__ ? J.__takeCount__ = Bi(B, J.__takeCount__) : J.__views__.push({\n                size: Bi(B, 4294967295),\n                type: b + (J.__dir__ < 0 ? \"Right\" : \"\")\n              }), J;\n            }, qr.prototype[b + \"Right\"] = function(B) {\n              return this.reverse()[b](B).reverse();\n            };\n          }), Dn([\"filter\", \"map\", \"takeWhile\"], function(b, C) {\n            var B = C + 1, J = B == 1 || B == 3;\n            qr.prototype[b] = function(ut) {\n              var Et = this.clone();\n              return Et.__iteratees__.push({ iteratee: Sr(ut, 3), type: B }), Et.__filtered__ = Et.__filtered__ || J, Et;\n            };\n          }), Dn([\"head\", \"last\"], function(b, C) {\n            var B = \"take\" + (C ? \"Right\" : \"\");\n            qr.prototype[b] = function() {\n              return this[B](1).value()[0];\n            };\n          }), Dn([\"initial\", \"tail\"], function(b, C) {\n            var B = \"drop\" + (C ? \"\" : \"Right\");\n            qr.prototype[b] = function() {\n              return this.__filtered__ ? new qr(this) : this[B](1);\n            };\n          }), qr.prototype.compact = function() {\n            return this.filter(rn);\n          }, qr.prototype.find = function(b) {\n            return this.filter(b).head();\n          }, qr.prototype.findLast = function(b) {\n            return this.reverse().find(b);\n          }, qr.prototype.invokeMap = xr(function(b, C) {\n            return typeof b == \"function\" ? new qr(this) : this.map(function(B) {\n              return gs(B, b, C);\n            });\n          }), qr.prototype.reject = function(b) {\n            return this.filter(_n(Sr(b)));\n          }, qr.prototype.slice = function(b, C) {\n            b = te(b);\n            var B = this;\n            return B.__filtered__ && (b > 0 || C < 0) ? new qr(B) : (b < 0 ? B = B.takeRight(-b) : b && (B = B.drop(b)), C !== void 0 && (B = (C = te(C)) < 0 ? B.dropRight(-C) : B.take(C - b)), B);\n          }, qr.prototype.takeRightWhile = function(b) {\n            return this.reverse().takeWhile(b).reverse();\n          }, qr.prototype.toArray = function() {\n            return this.take(4294967295);\n          }, $n(qr.prototype, function(b, C) {\n            var B = /^(?:filter|find|map|reject)|While$/.test(C), J = /^(?:head|last)$/.test(C), ut = vt[J ? \"take\" + (C == \"last\" ? \"Right\" : \"\") : C], Et = J || /^find/.test(C);\n            ut && (vt.prototype[C] = function() {\n              var Lt = this.__wrapped__, Gt = J ? [1] : arguments, fe = Lt instanceof qr, $e = Gt[0], _e = fe || er(Lt), Fe = function(Ir) {\n                var or = ut.apply(vt, Ci([Ir], Gt));\n                return J && dr ? or[0] : or;\n              };\n              _e && B && typeof $e == \"function\" && $e.length != 1 && (fe = _e = !1);\n              var dr = this.__chain__, gr = !!this.__actions__.length, $r = Et && !dr, Re = fe && !gr;\n              if (!Et && _e) {\n                Lt = Re ? Lt : new qr(this);\n                var Ge = b.apply(Lt, Gt);\n                return Ge.__actions__.push({\n                  func: Vt,\n                  args: [Fe],\n                  thisArg: void 0\n                }), new ho(Ge, dr);\n              }\n              return $r && Re ? b.apply(this, Gt) : (Ge = this.thru(Fe), $r ? J ? Ge.value()[0] : Ge.value() : Ge);\n            });\n          }), Dn(\n            [\"pop\", \"push\", \"shift\", \"sort\", \"splice\", \"unshift\"],\n            function(b) {\n              var C = ve[b], B = /^(?:push|sort|unshift)$/.test(b) ? \"tap\" : \"thru\", J = /^(?:pop|shift)$/.test(b);\n              vt.prototype[b] = function() {\n                var ut = arguments;\n                if (J && !this.__chain__) {\n                  var Et = this.value();\n                  return C.apply(er(Et) ? Et : [], ut);\n                }\n                return this[B](function(Lt) {\n                  return C.apply(er(Lt) ? Lt : [], ut);\n                });\n              };\n            }\n          ), $n(qr.prototype, function(b, C) {\n            var B = vt[C];\n            if (B) {\n              var J = B.name + \"\";\n              We.call(ra, J) || (ra[J] = []), ra[J].push({ name: C, func: B });\n            }\n          }), ra[ns(void 0, 2).name] = [{ name: \"wrapper\", func: void 0 }], qr.prototype.clone = function() {\n            var b = new qr(this.__wrapped__);\n            return b.__actions__ = yo(this.__actions__), b.__dir__ = this.__dir__, b.__filtered__ = this.__filtered__, b.__iteratees__ = yo(this.__iteratees__), b.__takeCount__ = this.__takeCount__, b.__views__ = yo(this.__views__), b;\n          }, qr.prototype.reverse = function() {\n            if (this.__filtered__) {\n              var b = new qr(this);\n              b.__dir__ = -1, b.__filtered__ = !0;\n            } else (b = this.clone()).__dir__ *= -1;\n            return b;\n          }, qr.prototype.value = function() {\n            var b = this.__wrapped__.value(), C = this.__dir__, B = er(b), J = C < 0, ut = B ? b.length : 0, Et = function(sn, wr, Dr) {\n              for (var to = -1, Bo = Dr.length; ++to < Bo; ) {\n                var Ra = Dr[to], eo = Ra.size;\n                switch (Ra.type) {\n                  case \"drop\":\n                    sn += eo;\n                    break;\n                  case \"dropRight\":\n                    wr -= eo;\n                    break;\n                  case \"take\":\n                    wr = Bi(wr, sn + eo);\n                    break;\n                  case \"takeRight\":\n                    sn = ei(sn, wr - eo);\n                }\n              }\n              return { start: sn, end: wr };\n            }(0, ut, this.__views__), Lt = Et.start, Gt = Et.end, fe = Gt - Lt, $e = J ? Gt : Lt - 1, _e = this.__iteratees__, Fe = _e.length, dr = 0, gr = Bi(fe, this.__takeCount__);\n            if (!B || !J && ut == fe && gr == fe)\n              return es(b, this.__actions__);\n            var $r = [];\n            t: for (; fe-- && dr < gr; ) {\n              for (var Re = -1, Ge = b[$e += C]; ++Re < Fe; ) {\n                var Ir = _e[Re], or = Ir.iteratee, Nr = Ir.type, Mr = or(Ge);\n                if (Nr == 2) Ge = Mr;\n                else if (!Mr) {\n                  if (Nr == 1) continue t;\n                  break t;\n                }\n              }\n              $r[dr++] = Ge;\n            }\n            return $r;\n          }, vt.prototype.at = oe, vt.prototype.chain = function() {\n            return Tt(this);\n          }, vt.prototype.commit = function() {\n            return new ho(this.value(), this.__chain__);\n          }, vt.prototype.next = function() {\n            this.__values__ === void 0 && (this.__values__ = Yt(this.value()));\n            var b = this.__index__ >= this.__values__.length;\n            return {\n              done: b,\n              value: b ? void 0 : this.__values__[this.__index__++]\n            };\n          }, vt.prototype.plant = function(b) {\n            for (var C, B = this; B instanceof La; ) {\n              var J = lu(B);\n              J.__index__ = 0, J.__values__ = void 0, C ? ut.__wrapped__ = J : C = J;\n              var ut = J;\n              B = B.__wrapped__;\n            }\n            return ut.__wrapped__ = b, C;\n          }, vt.prototype.reverse = function() {\n            var b = this.__wrapped__;\n            if (b instanceof qr) {\n              var C = b;\n              return this.__actions__.length && (C = new qr(this)), (C = C.reverse()).__actions__.push({\n                func: Vt,\n                args: [D],\n                thisArg: void 0\n              }), new ho(C, this.__chain__);\n            }\n            return this.thru(D);\n          }, vt.prototype.toJSON = vt.prototype.valueOf = vt.prototype.value = function() {\n            return es(this.__wrapped__, this.__actions__);\n          }, vt.prototype.first = vt.prototype.head, fr && (vt.prototype[fr] = function() {\n            return this;\n          }), vt;\n        }();\n        Vn._ = oo, (w = (function() {\n          return oo;\n        }).call(T, e, T, A)) === void 0 || (A.exports = w);\n      }).call(this);\n    }).call(this, e(35), e(80)(L));\n  },\n  function(L, T, e) {\n    const u = e(21);\n    function A(y) {\n      return !u.isNull(y) && !u.isUndefined(y);\n    }\n    function w(y, x, g, o) {\n      o || (o = 1);\n      var c = y.predecessors(x);\n      if (!c || g == 0) return [];\n      var a = c.concat(\n        c.reduce(function(n, t) {\n          return o >= g && A(g) ? n : n.concat(w(y, t, g, o + 1));\n        }, [])\n      );\n      return u.uniq(a);\n    }\n    function E(y, x, g, o) {\n      o || (o = 1);\n      var c = y.successors(x);\n      if (!c || g == 0) return [];\n      var a = c.concat(\n        c.reduce(function(n, t) {\n          return o >= g && A(g) ? n : n.concat(E(y, t, g, o + 1));\n        }, [])\n      );\n      return u.uniq(a);\n    }\n    L.exports = {\n      selectAt: function(y, x) {\n        var g = [x], o = u.union([x], E(y, x));\n        return u.each(o, function(c) {\n          var a = w(y, c);\n          g = u.union(g, a, [c]);\n        }), g;\n      },\n      ancestorNodes: w,\n      descendentNodes: E\n    };\n  },\n  function(L, T) {\n    var e = {\n      utf8: {\n        stringToBytes: function(u) {\n          return e.bin.stringToBytes(unescape(encodeURIComponent(u)));\n        },\n        bytesToString: function(u) {\n          return decodeURIComponent(escape(e.bin.bytesToString(u)));\n        }\n      },\n      bin: {\n        stringToBytes: function(u) {\n          for (var A = [], w = 0; w < u.length; w++)\n            A.push(255 & u.charCodeAt(w));\n          return A;\n        },\n        bytesToString: function(u) {\n          for (var A = [], w = 0; w < u.length; w++)\n            A.push(String.fromCharCode(u[w]));\n          return A.join(\"\");\n        }\n      }\n    };\n    L.exports = e;\n  },\n  function(L, T) {\n    var e = \"/docs/source.html\";\n    window.angular.module(\"ng\").run([\n      \"$templateCache\",\n      function(u) {\n        u.put(\n          e,\n          `<style>\n/* TODO */\n.section-target {\n    top: -8em;\n}\n\n.noflex {\n    flex: 0 0 160px !important;\n}\n\n.highlight {\n    color: #24292e;\n    background-color: white;\n}\n\n</style>\n\n<div class='app-scroll'>\n    <div class=\"app-links app-sticky\">\n        <div class=\"app-title\">\n            <div class=\"app-frame app-pad app-flush-bottom\">\n                <h1>\n                    <span class=\"break\">{{ model.source_name }}.{{ model.name }}</span>\n                    <small>source table</small>\n                </h1>\n            </div>\n        </div>\n        <div class=\"app-frame app-pad-h\">\n            <ul class=\"nav nav-tabs\">\n                <li ui-sref-active='active'><a ui-sref=\"dbt.source({'#': 'details'})\">Details</a></li>\n                <li ui-sref-active='active'><a ui-sref=\"dbt.source({'#': 'description'})\">Description</a></li>\n                <li ui-sref-active='active'><a ui-sref=\"dbt.source({'#': 'columns'})\">Columns</a></li>\n                <li ui-sref-active='active' ng-show = \"referencesLength != 0\"><a ui-sref=\"dbt.source({'#': 'referenced_by'})\">Referenced By</a></li>\n                <li ui-sref-active='active'><a ui-sref=\"dbt.source({'#': 'code'})\">SQL</a></li>\n            </ul>\n        </div>\n    </div>\n    <div class=\"app-details\">\n        <div class=\"app-frame app-pad\">\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"details\"></div>\n                <table-details model=\"model\" extras=\"extra_table_fields\"/>\n            </section>\n\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"description\"></div>\n                <div class=\"section-content\">\n                    <h6>Description</h6>\n                    <div class=\"panel\">\n                        <div class=\"panel-body\">\n                            <div ng-if=\"model.description\" class=\"model-markdown\" marked=\"model.description\"></div>\n                            <div ng-if=\"!model.description\">This {{ model.resource_type }} is not currently documented</div>\n                        </div>\n                    </div>\n                </div>\n            </section>\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"columns\"></div>\n                <div class=\"section-content\">\n                    <h6>Columns</h6>\n                    <column-details model=\"model\" />\n                </div>\n            </section>\n\n            <section class=\"section\" ng-show = \"referencesLength != 0\">\n                <div class=\"section-target\" id=\"referenced_by\"></div>\n                <div class=\"section-content\">\n                    <h6>Referenced By</h6>\n                    <reference-list references=\"references\" node=\"model\" />\n                </div>\n            </section>\n\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"code\"></div>\n                <div class=\"section-content\">\n                    <code-block versions=\"versions\" default=\"default_version\" language=\"language\"></code-block>\n                </div>\n            </section>\n        </div>\n    </div>\n</div>\n`\n        );\n      }\n    ]), L.exports = e;\n  },\n  function(L, T, e) {\n    e.r(T);\n    var u = function(a) {\n      return /* @__PURE__ */ function(n) {\n        return !!n && typeof n == \"object\";\n      }(a) && !function(n) {\n        var t = Object.prototype.toString.call(n);\n        return t === \"[object RegExp]\" || t === \"[object Date]\" || function(r) {\n          return r.$$typeof === A;\n        }(n);\n      }(a);\n    }, A = typeof Symbol == \"function\" && Symbol.for ? Symbol.for(\"react.element\") : 60103;\n    function w(a, n) {\n      return n.clone !== !1 && n.isMergeableObject(a) ? y((t = a, Array.isArray(t) ? [] : {}), a, n) : a;\n      var t;\n    }\n    function E(a, n, t) {\n      return a.concat(n).map(function(r) {\n        return w(r, t);\n      });\n    }\n    function y(a, n, t) {\n      (t = t || {}).arrayMerge = t.arrayMerge || E, t.isMergeableObject = t.isMergeableObject || u;\n      var r = Array.isArray(n);\n      return r === Array.isArray(a) ? r ? t.arrayMerge(a, n, t) : function(l, h, i) {\n        var d = {};\n        return i.isMergeableObject(l) && Object.keys(l).forEach(function(p) {\n          d[p] = w(l[p], i);\n        }), Object.keys(h).forEach(function(p) {\n          i.isMergeableObject(h[p]) && l[p] ? d[p] = y(l[p], h[p], i) : d[p] = w(h[p], i);\n        }), d;\n      }(a, n, t) : w(n, t);\n    }\n    y.all = function(a, n) {\n      if (!Array.isArray(a))\n        throw new Error(\"first argument should be an array\");\n      return a.reduce(function(t, r) {\n        return y(t, r, n);\n      }, {});\n    };\n    var x = y;\n    const g = e(9), o = (e(33), e(202)), { getQuoteChar: c } = e(430);\n    g.module(\"dbt\").factory(\"project\", [\n      \"$q\",\n      \"$http\",\n      function(a, n) {\n        var t = {\n          manifest: \"MANIFEST.JSON INLINE DATA\",\n          catalog: \"CATALOG.JSON INLINE DATA\"\n        }, r = {\n          project: {},\n          tree: { project: [], database: [], sources: [] },\n          files: { manifest: {}, catalog: {} },\n          loaded: a.defer()\n        };\n        function l(i, d) {\n          return o.each(d.sources, function(p, f) {\n            d.nodes[f] = p;\n          }), o.each(i.nodes, function(p, f) {\n            var v = d.nodes[f];\n            if (v) {\n              var k, s, S, j = o.keys(v.columns), I = p.columns, R = (k = j, s = I, S = {}, o.each(s, function(M, z) {\n                var V = o.find(k, function(G) {\n                  return G.toLowerCase() == z.toLowerCase();\n                });\n                V ? S[V] = M : S[z] = M;\n              }), S);\n              p.columns = R;\n            }\n          }), x(d, i);\n        }\n        function h(i, d) {\n          return i in t && typeof t[i] == \"object\" ? { label: i, data: t[i] } : n({ method: \"GET\", url: d }).then(\n            function(p) {\n              return { label: i, data: p.data };\n            },\n            function(p) {\n              console.error(p), alert(\n                \"dbt Docs was unable to load the \" + i + ` file at path: \n  ` + d + `\n\nError: ` + p.statusText + \" (\" + p.status + `)\n\nThe dbt Docs site may not work as expected if this file cannot be found.Please try again, and contact support if this error persists.`\n              );\n            }\n          );\n        }\n        return r.find_by_id = function(i, d) {\n          r.ready(function() {\n            if (i) {\n              var p = r.node(i);\n              d(p);\n            }\n          });\n        }, r.node = function(i) {\n          return o.find(r.project.nodes, { unique_id: i });\n        }, r.loadProject = function() {\n          var i = \"?cb=\" + (/* @__PURE__ */ new Date()).getTime(), d = [\n            h(\"manifest\", \"manifest.json\" + i),\n            h(\"catalog\", \"catalog.json\" + i)\n          ];\n          a.all(d).then(function(p) {\n            o.each(p, function(M) {\n              M ? r.files[M.label] = M.data : console.error(\"FILE FAILED TO LOAD!\");\n            }), o.each(r.files.manifest.nodes, function(M) {\n              M.resource_type == \"model\" && M.version != null ? M.label = M.name + \"_v\" + M.version : M.label = M.name;\n            }), o.each(r.files.manifest.sources, function(M) {\n              M.label = M.source_name + \".\" + M.name, r.files.manifest.nodes[M.unique_id] = M;\n            }), o.each(r.files.manifest.exposures, function(M) {\n              M.label || (M.label = M.name), r.files.manifest.nodes[M.unique_id] = M;\n            }), o.each(r.files.manifest.metrics, function(M) {\n              r.files.manifest.nodes[M.unique_id] = M;\n            }), o.each(r.files.manifest.semantic_models, function(M) {\n              r.files.manifest.nodes[M.unique_id] = M, M.label = M.name;\n            });\n            var f = r.files.manifest.metadata.adapter_type, v = function(M, z) {\n              var V = M || [], G = {};\n              return o.each(V, function(Y) {\n                G[Y.package_name] || (G[Y.package_name] = {}), G[Y.package_name][Y.name] = Y;\n              }), M = [], o.each(G, function(Y, tt) {\n                if (tt != \"dbt\" && tt != \"dbt_\" + z) {\n                  var Z = function(at, nt) {\n                    var ht = {};\n                    o.each(at, function(xt) {\n                      xt.macro_sql.match(\n                        /{{\\s*adapter_macro\\([^)]+\\)\\s+}}/\n                      ) && (xt.impls = { \"Adapter Macro\": xt.macro_sql }, xt.is_adapter_macro = !0, ht[xt.name] = xt);\n                    });\n                    var ct = [\n                      \"postgres\",\n                      \"redshift\",\n                      \"bigquery\",\n                      \"snowflake\",\n                      \"spark\",\n                      \"presto\",\n                      \"default\"\n                    ], ot = o.values(ht), gt = o.filter(at, function(xt) {\n                      var St = xt.name.split(\"__\"), zt = St.shift(), Nt = St.join(\"__\");\n                      return !(ct.indexOf(zt) >= 0 && ht[Nt]) || (ht[Nt].impls[zt] = xt.macro_sql, xt.is_adapter_macro_impl = !0, !1);\n                    });\n                    return ot.concat(gt);\n                  }(Y);\n                  M = M.concat(Z);\n                }\n              }), o.keyBy(M, \"unique_id\");\n            }(r.files.manifest.macros, f);\n            r.files.manifest.macros = v;\n            var k = l(r.files.manifest, r.files.catalog), s = k.nodes, S = o.keyBy(s, \"name\"), j = o.filter(k.nodes, { resource_type: \"test\" });\n            o.each(j, function(M) {\n              if (M.hasOwnProperty(\"test_metadata\")) {\n                var z, V = {\n                  test_name: z = M.test_metadata.namespace ? M.test_metadata.namespace + \".\" + M.test_metadata.name : M.test_metadata.name\n                };\n                if (M.test_metadata.name == \"not_null\")\n                  V.short = \"N\", V.label = \"Not Null\";\n                else if (M.test_metadata.name == \"unique\")\n                  V.short = \"U\", V.label = \"Unique\";\n                else if (M.test_metadata.name == \"relationships\") {\n                  var G = M.refs[0], Y = S[G];\n                  Y && M.test_metadata.kwargs.field && (V.fk_field = M.test_metadata.kwargs.field, V.fk_model = Y), V.short = \"F\", V.label = \"Foreign Key\";\n                } else if (M.test_metadata.name == \"accepted_values\") {\n                  if (Array.isArray(M.test_metadata.kwargs.values))\n                    var tt = M.test_metadata.kwargs.values.join(\", \");\n                  else tt = JSON.stringify(M.test_metadata.kwargs.values);\n                  V.short = \"A\", V.label = \"Accepted Values: \" + tt;\n                } else {\n                  var Z = o.omit(M.test_metadata.kwargs, \"column_name\");\n                  V.short = \"+\", V.label = z + \"(\" + JSON.stringify(Z) + \")\";\n                }\n                var at = M.depends_on.nodes, nt = M.column_name || M.test_metadata.kwargs.column_name || M.test_metadata.kwargs.arg;\n                if (at.length && nt) {\n                  if (M.test_metadata.name == \"relationships\")\n                    var ht = at[at.length - 1];\n                  else ht = at[0];\n                  var ct = k.nodes[ht], ot = c(k.metadata), gt = o.find(ct.columns, function(xt, St) {\n                    let zt = nt;\n                    return nt.startsWith(ot) && nt.endsWith(ot) && (zt = nt.substring(1, nt.length - 1)), St.toLowerCase() == zt.toLowerCase();\n                  });\n                  gt && (gt.tests = gt.tests || [], gt.tests.push(V));\n                }\n              }\n            }), r.project = k;\n            var I = o.filter(r.project.macros, function(M) {\n              return !M.is_adapter_macro_impl;\n            }), R = o.filter(r.project.nodes, function(M) {\n              return o.includes(\n                [\n                  \"model\",\n                  \"source\",\n                  \"seed\",\n                  \"snapshot\",\n                  \"analysis\",\n                  \"exposure\",\n                  \"metric\",\n                  \"semantic_model\"\n                ],\n                M.resource_type\n              );\n            });\n            r.project.searchable = o.filter(R.concat(I), function(M) {\n              return !M.docs || M.docs.show;\n            }), r.loaded.resolve();\n          });\n        }, r.ready = function(i) {\n          r.loaded.promise.then(function() {\n            i(r.project);\n          });\n        }, r.search = function(i) {\n          if (i.length == 0)\n            return o.map(r.project.searchable, function(p) {\n              return { model: p, matches: [] };\n            });\n          var d = [];\n          return o.each(r.project.searchable, function(p) {\n            var f = function(v, k) {\n              var s = [], S = {\n                name: \"string\",\n                description: \"string\",\n                raw_code: \"string\",\n                columns: \"object\",\n                column_description: \"n/a\",\n                tags: \"array\",\n                arguments: \"array\",\n                label: \"string\"\n              };\n              let j = o.words(v.toLowerCase());\n              for (var I in S)\n                if (I === \"column_description\")\n                  for (var R in k.columns)\n                    k.columns[R].description != null && j.every(\n                      (z) => k.columns[R].description.toLowerCase().indexOf(z) != -1\n                    ) && s.push({ key: I, value: v });\n                else {\n                  if (!k[I]) continue;\n                  if (S[I] === \"string\" && j.every((z) => k[I].toLowerCase().indexOf(z) != -1))\n                    s.push({ key: I, value: v });\n                  else if (S[I] === \"object\")\n                    for (var R in k[I])\n                      k[I][R].name != null && j.every(\n                        (V) => k[I][R].name.toLowerCase().indexOf(V) != -1\n                      ) && s.push({ key: I, value: v });\n                  else if (S[I] === \"array\")\n                    for (var M of k[I])\n                      j.every(\n                        (z) => JSON.stringify(M).toLowerCase().indexOf(z) != -1\n                      ) && s.push({ key: I, value: v });\n                }\n              return s;\n            }(i, p);\n            f.length && d.push({ model: p, matches: f });\n          }), d;\n        }, r.getModelTree = function(i, d) {\n          r.loaded.promise.then(function() {\n            var p = o.values(r.project.macros), f = o.filter(r.project.nodes, function(j) {\n              return j.resource_type == \"test\" && !j.hasOwnProperty(\"test_metadata\") ? !0 : o.includes(\n                [\n                  \"snapshot\",\n                  \"source\",\n                  \"seed\",\n                  \"model\",\n                  \"analysis\",\n                  \"exposure\",\n                  \"metric\",\n                  \"semantic_model\"\n                ],\n                j.resource_type\n              );\n            });\n            r.tree.database = function(j, I) {\n              var R = {}, M = o.filter(j, function(G) {\n                return !!o.get(G, [\"docs\", \"show\"], !0) && (o.indexOf(\n                  [\"source\", \"snapshot\", \"seed\"],\n                  G.resource_type\n                ) != -1 || (G.resource_type == \"model\" ? G.config.materialized != \"ephemeral\" : void 0));\n              }), z = o.sortBy(M, function(G) {\n                return G.database + \".\" + G.schema + \".\" + (G.identifier || G.alias || G.name);\n              }), V = o.groupBy(z, \"database\");\n              return o.each(V, function(G, Y) {\n                var tt = {\n                  type: \"database\",\n                  name: Y,\n                  active: !1,\n                  items: []\n                };\n                R[Y] = tt;\n                var Z = o.groupBy(G, \"schema\");\n                o.each(Z, function(at, nt) {\n                  nt = { type: \"schema\", name: nt, active: !1, items: [] }, tt.items.push(nt), o.each(at, function(ht) {\n                    var ct = ht.unique_id == I;\n                    ct && (tt.active = !0, nt.active = !0), nt.items.push({\n                      type: \"table\",\n                      name: ht.identifier || ht.alias || ht.name,\n                      node: ht,\n                      active: ct,\n                      unique_id: ht.unique_id,\n                      node_type: \"model\"\n                    });\n                  });\n                });\n              }), R;\n            }(f, i), r.tree.groups = function(j, I) {\n              var R = {};\n              return o.each(j, function(M) {\n                const z = o.get(M, [\"docs\", \"show\"], !0);\n                if (!(M.resource_type in [\"source\", \"exposure\", \"seed\", \"macro\"]) && z && M.access !== \"private\") {\n                  if (M.resource_type == \"model\" && M.version != null)\n                    var V = M.name + \"_v\" + M.version;\n                  else V = M.name;\n                  var G = M.access === \"protected\" ? V + \" (protected)\" : V, Y = M.group, tt = M.unique_id == I;\n                  R[Y] ? tt && (R[Y].active = !0) : R[Y] = {\n                    type: \"group\",\n                    name: Y,\n                    active: tt,\n                    items: []\n                  }, R[Y].items.push({\n                    type: \"file\",\n                    name: G,\n                    node: M,\n                    active: tt,\n                    unique_id: M.unique_id,\n                    node_type: \"model\"\n                  });\n                }\n              }), R = o.sortBy(o.values(R), \"name\"), o.each(R, function(M) {\n                M.items = o.sortBy(M.items, \"name\");\n              }), R;\n            }(f, i), r.tree.project = function(j, I, R) {\n              var M = {};\n              return j = j || [], I = I || [], o.each(j.concat(I), function(z) {\n                var V = o.get(z, [\"docs\", \"show\"], !0);\n                if (z.resource_type != \"source\" && z.resource_type != \"exposure\" && z.resource_type != \"metric\" && z.resource_type != \"semantic_model\" && V) {\n                  if (z.original_file_path.indexOf(\"\\\\\") != -1)\n                    var G = z.original_file_path.split(\"\\\\\");\n                  else G = z.original_file_path.split(\"/\");\n                  var Y = [z.package_name].concat(G), tt = z.unique_id == R, Z = o.initial(Y);\n                  if (z.resource_type == \"macro\") var at = z.name;\n                  else at = o.last(Y);\n                  if (z.resource_type == \"model\" && z.version != null)\n                    var nt = z.name + \"_v\" + z.version;\n                  else nt = z.name;\n                  var ht = M;\n                  o.each(Z, function(ct) {\n                    ht[ct] ? tt && (ht[ct].active = !0) : ht[ct] = {\n                      type: \"folder\",\n                      name: ct,\n                      active: tt,\n                      items: {}\n                    }, ht = ht[ct].items;\n                  }), ht[at] = {\n                    type: \"file\",\n                    name: nt,\n                    node: z,\n                    active: tt,\n                    unique_id: z.unique_id,\n                    node_type: z.resource_type\n                  };\n                }\n              }), function z(V) {\n                var G = [], Y = o.values(V);\n                return o.each(Y, function(tt) {\n                  if (tt.items) {\n                    var Z = z(tt.items), at = o.sortBy(Z, \"name\");\n                    tt.items = at;\n                  }\n                  G.push(tt);\n                }), G;\n              }(M);\n            }(f, p, i);\n            var v = o.values(r.project.sources);\n            r.tree.sources = function(j, I) {\n              var R = {};\n              return o.each(j, function(M) {\n                var z = M.source_name, V = M.name, G = M.unique_id == I;\n                R[z] ? G && (R[z].active = !0) : R[z] = {\n                  type: \"folder\",\n                  name: z,\n                  active: G,\n                  items: []\n                }, R[z].items.push({\n                  type: \"file\",\n                  name: V,\n                  node: M,\n                  active: G,\n                  unique_id: M.unique_id,\n                  node_type: \"source\"\n                });\n              }), R = o.sortBy(o.values(R), \"name\"), o.each(R, function(M) {\n                M.items = o.sortBy(M.items, \"name\");\n              }), R;\n            }(v, i);\n            var k = o.values(r.project.exposures);\n            r.tree.exposures = function(j, I) {\n              var R = {};\n              return o.each(j, function(M) {\n                M.name;\n                var z = M.type || \"Uncategorized\";\n                z = function(G) {\n                  var Y = { ml: \"ML\" };\n                  return Y.hasOwnProperty(G) ? Y[G] : G.charAt(0).toUpperCase() + G.slice(1);\n                }(z);\n                var V = M.unique_id == I;\n                R[z] ? V && (R[z].active = !0) : R[z] = {\n                  type: \"folder\",\n                  name: z,\n                  active: V,\n                  items: []\n                }, R[z].items.push({\n                  type: \"file\",\n                  name: M.label,\n                  node: M,\n                  active: V,\n                  unique_id: M.unique_id,\n                  node_type: \"exposure\"\n                });\n              }), R = o.sortBy(o.values(R), \"name\"), o.each(R, function(M) {\n                M.items = o.sortBy(M.items, \"name\");\n              }), R;\n            }(k, i);\n            var s = o.values(r.project.metrics);\n            r.tree.metrics = function(j, I) {\n              var R = {};\n              return o.each(j, function(M) {\n                M.name;\n                var z = M.package_name, V = M.unique_id == I;\n                R[z] ? V && (R[z].active = !0) : R[z] = {\n                  type: \"folder\",\n                  name: z,\n                  active: V,\n                  items: []\n                }, R[z].items.push({\n                  type: \"file\",\n                  name: M.label,\n                  node: M,\n                  active: V,\n                  unique_id: M.unique_id,\n                  node_type: \"metric\"\n                });\n              }), R = o.sortBy(o.values(R), \"name\"), o.each(R, function(M) {\n                R.items = o.sortBy(R.items, \"name\");\n              }), R;\n            }(s, i);\n            var S = o.values(r.project.semantic_models);\n            r.tree.semantic_models = function(j, I) {\n              var R = {};\n              return o.each(j, function(M) {\n                M.name;\n                var z = M.package_name, V = M.unique_id == I;\n                R[z] ? V && (R[z].active = !0) : R[z] = {\n                  type: \"folder\",\n                  name: z,\n                  active: V,\n                  items: []\n                }, R[z].items.push({\n                  type: \"file\",\n                  name: M.name,\n                  node: M,\n                  active: V,\n                  unique_id: M.unique_id,\n                  node_type: \"semantic_model\"\n                });\n              }), R = o.sortBy(o.values(R), \"name\"), o.each(R, function(M) {\n                R.items = o.sortBy(R.items, \"name\");\n              }), R;\n            }(S, i), d(r.tree);\n          });\n        }, r.updateSelectedInTree = function(i, d) {\n          var p = !1;\n          return o.each(d, function(f) {\n            f.node && f.node.unique_id == i ? (f.active = !0, p = !0) : f.node && f.node.unique_id != i ? f.active = !1 : r.updateSelectedInTree(i, f.items) && (f.active = !0, p = !0);\n          }), p;\n        }, r.updateSelected = function(i) {\n          return r.updateSelectedInTree(i, r.tree.project), r.updateSelectedInTree(i, r.tree.database), r.updateSelectedInTree(i, r.tree.groups), r.updateSelectedInTree(i, r.tree.sources), r.updateSelectedInTree(i, r.tree.exposures), r.updateSelectedInTree(i, r.tree.metrics), r.updateSelectedInTree(i, r.tree.semantic_models), r.tree;\n        }, r.caseColumn = function(i) {\n          return r.project.metadata.adapter_type == \"snowflake\" && i.toUpperCase() == i ? i.toLowerCase() : i;\n        }, r.init = function() {\n          r.loadProject();\n        }, r;\n      }\n    ]);\n  },\n  function(L, T, e) {\n    const u = e(9);\n    e(209), e(230), e(445), e(458), e(459), e(479), e(480), e(481), u.module(\"dbt\").run([\n      \"$rootScope\",\n      \"$state\",\n      \"$stateParams\",\n      function(A, w, E) {\n        A.$state = w, A.$stateParams = E;\n      }\n    ]);\n  },\n  function(L, T) {\n    /**\n     * @license AngularJS v1.8.2\n     * (c) 2010-2020 Google LLC. http://angularjs.org\n     * License: MIT\n     */\n    (function(e) {\n      var u = { objectMaxDepth: 5, urlErrorParamsEnabled: !0 };\n      function A(m) {\n        if (!gt(m)) return u;\n        ot(m.objectMaxDepth) && (u.objectMaxDepth = w(m.objectMaxDepth) ? m.objectMaxDepth : NaN), ot(m.urlErrorParamsEnabled) && ae(m.urlErrorParamsEnabled) && (u.urlErrorParamsEnabled = m.urlErrorParamsEnabled);\n      }\n      function w(m) {\n        return zt(m) && m > 0;\n      }\n      function E(m, O) {\n        O = O || Error;\n        var D = \"https://errors.angularjs.org/1.8.2/\", N = D.replace(\".\", \"\\\\.\") + \"[\\\\s\\\\S]*\", q = new RegExp(N, \"g\");\n        return function() {\n          var X, H, F = arguments[0], Q = arguments[1], K = \"[\" + (m ? m + \":\" : \"\") + F + \"] \", it = ir(arguments, 2).map(function(st) {\n            return $a(st, u.objectMaxDepth);\n          });\n          if (K += Q.replace(/\\{\\d+\\}/g, function(st) {\n            var Ct = +st.slice(1, -1);\n            return Ct < it.length ? it[Ct].replace(q, \"\") : st;\n          }), K += `\n` + D + (m ? m + \"/\" : \"\") + F, u.urlErrorParamsEnabled)\n            for (H = 0, X = \"?\"; H < it.length; H++, X = \"&\")\n              K += X + \"p\" + H + \"=\" + encodeURIComponent(it[H]);\n          return new O(K);\n        };\n      }\n      var y, x, g, o, c = /^\\/(.+)\\/([a-z]*)$/, a = Object.prototype.hasOwnProperty, n = function(m) {\n        return St(m) ? m.toLowerCase() : m;\n      }, t = function(m) {\n        return St(m) ? m.toUpperCase() : m;\n      }, r = [].slice, l = [].splice, h = [].push, i = Object.prototype.toString, d = Object.getPrototypeOf, p = E(\"ng\"), f = e.angular || (e.angular = {}), v = 0;\n      function k(m) {\n        if (m == null || xe(m)) return !1;\n        if (re(m) || St(m) || x && m instanceof x) return !0;\n        var O = \"length\" in Object(m) && m.length;\n        return zt(O) && (O >= 0 && O - 1 in m || typeof m.item == \"function\");\n      }\n      function s(m, O, D) {\n        var N, q;\n        if (m)\n          if (ne(m))\n            for (N in m)\n              N !== \"prototype\" && N !== \"length\" && N !== \"name\" && m.hasOwnProperty(N) && O.call(D, m[N], N, m);\n          else if (re(m) || k(m)) {\n            var X = typeof m != \"object\";\n            for (N = 0, q = m.length; N < q; N++)\n              (X || N in m) && O.call(D, m[N], N, m);\n          } else if (m.forEach && m.forEach !== s) m.forEach(O, D, m);\n          else if (xt(m)) for (N in m) O.call(D, m[N], N, m);\n          else if (typeof m.hasOwnProperty == \"function\")\n            for (N in m) m.hasOwnProperty(N) && O.call(D, m[N], N, m);\n          else for (N in m) a.call(m, N) && O.call(D, m[N], N, m);\n        return m;\n      }\n      function S(m, O, D) {\n        for (var N = Object.keys(m).sort(), q = 0; q < N.length; q++)\n          O.call(D, m[N[q]], N[q]);\n        return N;\n      }\n      function j(m) {\n        return function(O, D) {\n          m(D, O);\n        };\n      }\n      function I() {\n        return ++v;\n      }\n      function R(m, O) {\n        O ? m.$$hashKey = O : delete m.$$hashKey;\n      }\n      function M(m, O, D) {\n        for (var N = m.$$hashKey, q = 0, X = O.length; q < X; ++q) {\n          var H = O[q];\n          if (gt(H) || ne(H))\n            for (var F = Object.keys(H), Q = 0, K = F.length; Q < K; Q++) {\n              var it = F[Q], st = H[it];\n              D && gt(st) ? Nt(st) ? m[it] = new Date(st.valueOf()) : ce(st) ? m[it] = new RegExp(st) : st.nodeName ? m[it] = st.cloneNode(!0) : yt(st) ? m[it] = st.clone() : it !== \"__proto__\" && (gt(m[it]) || (m[it] = re(st) ? [] : {}), M(m[it], [st], !0)) : m[it] = st;\n            }\n        }\n        return R(m, N), m;\n      }\n      function z(m) {\n        return M(m, r.call(arguments, 1), !1);\n      }\n      function V(m) {\n        return M(m, r.call(arguments, 1), !0);\n      }\n      function G(m) {\n        return parseInt(m, 10);\n      }\n      y = e.document.documentMode;\n      var Y = Number.isNaN || function(m) {\n        return m != m;\n      };\n      function tt(m, O) {\n        return z(Object.create(m), O);\n      }\n      function Z() {\n      }\n      function at(m) {\n        return m;\n      }\n      function nt(m) {\n        return function() {\n          return m;\n        };\n      }\n      function ht(m) {\n        return ne(m.toString) && m.toString !== i;\n      }\n      function ct(m) {\n        return m === void 0;\n      }\n      function ot(m) {\n        return m !== void 0;\n      }\n      function gt(m) {\n        return m !== null && typeof m == \"object\";\n      }\n      function xt(m) {\n        return m !== null && typeof m == \"object\" && !d(m);\n      }\n      function St(m) {\n        return typeof m == \"string\";\n      }\n      function zt(m) {\n        return typeof m == \"number\";\n      }\n      function Nt(m) {\n        return i.call(m) === \"[object Date]\";\n      }\n      function re(m) {\n        return Array.isArray(m) || m instanceof Array;\n      }\n      function be(m) {\n        switch (i.call(m)) {\n          case \"[object Error]\":\n          case \"[object Exception]\":\n          case \"[object DOMException]\":\n            return !0;\n          default:\n            return m instanceof Error;\n        }\n      }\n      function ne(m) {\n        return typeof m == \"function\";\n      }\n      function ce(m) {\n        return i.call(m) === \"[object RegExp]\";\n      }\n      function xe(m) {\n        return m && m.window === m;\n      }\n      function we(m) {\n        return m && m.$evalAsync && m.$watch;\n      }\n      function ae(m) {\n        return typeof m == \"boolean\";\n      }\n      function Le(m) {\n        return m && ne(m.then);\n      }\n      Z.$inject = [], at.$inject = [];\n      var lt = /^\\[object (?:Uint8|Uint8Clamped|Uint16|Uint32|Int8|Int16|Int32|Float32|Float64)Array]$/, kt = function(m) {\n        return St(m) ? m.trim() : m;\n      }, Dt = function(m) {\n        return m.replace(/([-()[\\]{}+?*.$^|,:#<!\\\\])/g, \"\\\\$1\").replace(/\\x08/g, \"\\\\x08\");\n      };\n      function yt(m) {\n        return !(!m || !(m.nodeName || m.prop && m.attr && m.find));\n      }\n      function ft(m) {\n        return n(m.nodeName || m[0] && m[0].nodeName);\n      }\n      function Rt(m, O) {\n        return Array.prototype.indexOf.call(m, O) !== -1;\n      }\n      function Wt(m, O) {\n        var D = m.indexOf(O);\n        return D >= 0 && m.splice(D, 1), D;\n      }\n      function le(m, O, D) {\n        var N, q, X = [], H = [];\n        if (D = w(D) ? D : NaN, O) {\n          if ((q = O) && zt(q.length) && lt.test(i.call(q)) || (N = O, i.call(N) === \"[object ArrayBuffer]\"))\n            throw p(\n              \"cpta\",\n              \"Can't copy! TypedArray destination cannot be mutated.\"\n            );\n          if (m === O)\n            throw p(\"cpi\", \"Can't copy! Source and destination are identical.\");\n          return re(O) ? O.length = 0 : s(O, function(K, it) {\n            it !== \"$$hashKey\" && delete O[it];\n          }), X.push(m), H.push(O), F(m, O, D);\n        }\n        return Q(m, D);\n        function F(K, it, st) {\n          if (--st < 0) return \"...\";\n          var Ct, jt = it.$$hashKey;\n          if (re(K))\n            for (var Tt = 0, Vt = K.length; Tt < Vt; Tt++) it.push(Q(K[Tt], st));\n          else if (xt(K)) for (Ct in K) it[Ct] = Q(K[Ct], st);\n          else if (K && typeof K.hasOwnProperty == \"function\")\n            for (Ct in K) K.hasOwnProperty(Ct) && (it[Ct] = Q(K[Ct], st));\n          else for (Ct in K) a.call(K, Ct) && (it[Ct] = Q(K[Ct], st));\n          return R(it, jt), it;\n        }\n        function Q(K, it) {\n          if (!gt(K)) return K;\n          var st = X.indexOf(K);\n          if (st !== -1) return H[st];\n          if (xe(K) || we(K))\n            throw p(\n              \"cpws\",\n              \"Can't copy! Making copies of Window or Scope instances is not supported.\"\n            );\n          var Ct = !1, jt = function(Tt) {\n            switch (i.call(Tt)) {\n              case \"[object Int8Array]\":\n              case \"[object Int16Array]\":\n              case \"[object Int32Array]\":\n              case \"[object Float32Array]\":\n              case \"[object Float64Array]\":\n              case \"[object Uint8Array]\":\n              case \"[object Uint8ClampedArray]\":\n              case \"[object Uint16Array]\":\n              case \"[object Uint32Array]\":\n                return new Tt.constructor(Q(Tt.buffer), Tt.byteOffset, Tt.length);\n              case \"[object ArrayBuffer]\":\n                if (!Tt.slice) {\n                  var Vt = new ArrayBuffer(Tt.byteLength);\n                  return new Uint8Array(Vt).set(new Uint8Array(Tt)), Vt;\n                }\n                return Tt.slice(0);\n              case \"[object Boolean]\":\n              case \"[object Number]\":\n              case \"[object String]\":\n              case \"[object Date]\":\n                return new Tt.constructor(Tt.valueOf());\n              case \"[object RegExp]\":\n                var oe = new RegExp(Tt.source, Tt.toString().match(/[^/]*$/)[0]);\n                return oe.lastIndex = Tt.lastIndex, oe;\n              case \"[object Blob]\":\n                return new Tt.constructor([Tt], { type: Tt.type });\n            }\n            if (ne(Tt.cloneNode)) return Tt.cloneNode(!0);\n          }(K);\n          return jt === void 0 && (jt = re(K) ? [] : Object.create(d(K)), Ct = !0), X.push(K), H.push(jt), Ct ? F(K, jt, it) : jt;\n        }\n      }\n      function ye(m, O) {\n        return m === O || m != m && O != O;\n      }\n      function pe(m, O) {\n        if (m === O) return !0;\n        if (m === null || O === null) return !1;\n        if (m != m && O != O) return !0;\n        var D, N, q, X = typeof m;\n        if (X === typeof O && X === \"object\") {\n          if (!re(m)) {\n            if (Nt(m)) return !!Nt(O) && ye(m.getTime(), O.getTime());\n            if (ce(m)) return !!ce(O) && m.toString() === O.toString();\n            if (we(m) || we(O) || xe(m) || xe(O) || re(O) || Nt(O) || ce(O)) return !1;\n            for (N in q = ur(), m)\n              if (N.charAt(0) !== \"$\" && !ne(m[N])) {\n                if (!pe(m[N], O[N])) return !1;\n                q[N] = !0;\n              }\n            for (N in O)\n              if (!(N in q) && N.charAt(0) !== \"$\" && ot(O[N]) && !ne(O[N]))\n                return !1;\n            return !0;\n          }\n          if (!re(O)) return !1;\n          if ((D = m.length) === O.length) {\n            for (N = 0; N < D; N++) if (!pe(m[N], O[N])) return !1;\n            return !0;\n          }\n        }\n        return !1;\n      }\n      var je = function() {\n        if (!ot(je.rules)) {\n          var m = e.document.querySelector(\"[ng-csp]\") || e.document.querySelector(\"[data-ng-csp]\");\n          if (m) {\n            var O = m.getAttribute(\"ng-csp\") || m.getAttribute(\"data-ng-csp\");\n            je.rules = {\n              noUnsafeEval: !O || O.indexOf(\"no-unsafe-eval\") !== -1,\n              noInlineStyle: !O || O.indexOf(\"no-inline-style\") !== -1\n            };\n          } else\n            je.rules = {\n              noUnsafeEval: function() {\n                try {\n                  return new Function(\"\"), !1;\n                } catch {\n                  return !0;\n                }\n              }(),\n              noInlineStyle: !1\n            };\n        }\n        return je.rules;\n      }, Me = function() {\n        if (ot(Me.name_)) return Me.name_;\n        var m, O, D, N, q = xn.length;\n        for (O = 0; O < q; ++O)\n          if (D = xn[O], m = e.document.querySelector(\n            \"[\" + D.replace(\":\", \"\\\\:\") + \"jq]\"\n          )) {\n            N = m.getAttribute(D + \"jq\");\n            break;\n          }\n        return Me.name_ = N;\n      };\n      function Ze(m, O, D) {\n        return m.concat(r.call(O, D));\n      }\n      function ir(m, O) {\n        return r.call(m, O || 0);\n      }\n      function Ar(m, O) {\n        var D = arguments.length > 2 ? ir(arguments, 2) : [];\n        return !ne(O) || O instanceof RegExp ? O : D.length ? function() {\n          return arguments.length ? O.apply(m, Ze(D, arguments, 0)) : O.apply(m, D);\n        } : function() {\n          return arguments.length ? O.apply(m, arguments) : O.call(m);\n        };\n      }\n      function rr(m, O) {\n        var D = O;\n        return typeof m == \"string\" && m.charAt(0) === \"$\" && m.charAt(1) === \"$\" ? D = void 0 : xe(O) ? D = \"$WINDOW\" : O && e.document === O ? D = \"$DOCUMENT\" : we(O) && (D = \"$SCOPE\"), D;\n      }\n      function zr(m, O) {\n        if (!ct(m)) return zt(O) || (O = O ? 2 : null), JSON.stringify(m, rr, O);\n      }\n      function ln(m) {\n        return St(m) ? JSON.parse(m) : m;\n      }\n      var mn = /:/g;\n      function un(m, O) {\n        m = m.replace(mn, \"\");\n        var D = Date.parse(\"Jan 01, 1970 00:00:00 \" + m) / 6e4;\n        return Y(D) ? O : D;\n      }\n      function Kr(m, O) {\n        return (m = new Date(m.getTime())).setMinutes(m.getMinutes() + O), m;\n      }\n      function yn(m, O, D) {\n        D = D ? -1 : 1;\n        var N = m.getTimezoneOffset();\n        return Kr(m, D * (un(O, N) - N));\n      }\n      function nn(m) {\n        m = x(m).clone().empty();\n        var O = x(\"<div></div>\").append(m).html();\n        try {\n          return m[0].nodeType === Gi ? n(O) : O.match(/^(<[^>]+>)/)[1].replace(/^<([\\w-]+)/, function(D, N) {\n            return \"<\" + n(N);\n          });\n        } catch {\n          return n(O);\n        }\n      }\n      function Ei(m) {\n        try {\n          return decodeURIComponent(m);\n        } catch {\n        }\n      }\n      function ri(m) {\n        var O = {};\n        return s((m || \"\").split(\"&\"), function(D) {\n          var N, q, X;\n          D && (q = D = D.replace(/\\+/g, \"%20\"), (N = D.indexOf(\"=\")) !== -1 && (q = D.substring(0, N), X = D.substring(N + 1)), ot(q = Ei(q)) && (X = !ot(X) || Ei(X), a.call(O, q) ? re(O[q]) ? O[q].push(X) : O[q] = [O[q], X] : O[q] = X));\n        }), O;\n      }\n      function Yn(m) {\n        return tn(m, !0).replace(/%26/gi, \"&\").replace(/%3D/gi, \"=\").replace(/%2B/gi, \"+\");\n      }\n      function tn(m, O) {\n        return encodeURIComponent(m).replace(/%40/gi, \"@\").replace(/%3A/gi, \":\").replace(/%24/g, \"$\").replace(/%2C/gi, \",\").replace(/%3B/gi, \";\").replace(/%20/g, O ? \"%20\" : \"+\");\n      }\n      var xn = [\"ng-\", \"data-ng-\", \"ng:\", \"x-ng-\"], Tn = function(m) {\n        var O = m.currentScript;\n        if (!O) return !0;\n        if (!(O instanceof e.HTMLScriptElement || O instanceof e.SVGScriptElement))\n          return !1;\n        var D = O.attributes;\n        return [\n          D.getNamedItem(\"src\"),\n          D.getNamedItem(\"href\"),\n          D.getNamedItem(\"xlink:href\")\n        ].every(function(N) {\n          if (!N) return !0;\n          if (!N.value) return !1;\n          var q = m.createElement(\"a\");\n          if (q.href = N.value, m.location.origin === q.origin) return !0;\n          switch (q.protocol) {\n            case \"http:\":\n            case \"https:\":\n            case \"ftp:\":\n            case \"blob:\":\n            case \"file:\":\n            case \"data:\":\n              return !0;\n            default:\n              return !1;\n          }\n        });\n      }(e.document);\n      function Kn(m, O) {\n        var D, N, q = {};\n        if (s(xn, function(X) {\n          var H = X + \"app\";\n          !D && m.hasAttribute && m.hasAttribute(H) && (D = m, N = m.getAttribute(H));\n        }), s(xn, function(X) {\n          var H, F = X + \"app\";\n          !D && (H = m.querySelector(\"[\" + F.replace(\":\", \"\\\\:\") + \"]\")) && (D = H, N = H.getAttribute(F));\n        }), D) {\n          if (!Tn)\n            return void e.console.error(\n              \"AngularJS: disabling automatic bootstrap. <script> protocol indicates an extension, document.location.href does not match.\"\n            );\n          q.strictDi = function(X, H) {\n            var F, Q, K = xn.length;\n            for (Q = 0; Q < K; ++Q)\n              if (F = xn[Q] + H, St(F = X.getAttribute(F))) return F;\n            return null;\n          }(D, \"strict-di\") !== null, O(D, N ? [N] : [], q);\n        }\n      }\n      function ar(m, O, D) {\n        gt(D) || (D = {}), D = z({ strictDi: !1 }, D);\n        var N = function() {\n          if ((m = x(m)).injector()) {\n            var H = m[0] === e.document ? \"document\" : nn(m);\n            throw p(\n              \"btstrpd\",\n              \"App already bootstrapped with this element '{0}'\",\n              H.replace(/</, \"&lt;\").replace(/>/, \"&gt;\")\n            );\n          }\n          (O = O || []).unshift([\n            \"$provide\",\n            function(Q) {\n              Q.value(\"$rootElement\", m);\n            }\n          ]), D.debugInfoEnabled && O.push([\n            \"$compileProvider\",\n            function(Q) {\n              Q.debugInfoEnabled(!0);\n            }\n          ]), O.unshift(\"ng\");\n          var F = ke(O, D.strictDi);\n          return F.invoke([\n            \"$rootScope\",\n            \"$rootElement\",\n            \"$compile\",\n            \"$injector\",\n            function(Q, K, it, st) {\n              Q.$apply(function() {\n                K.data(\"$injector\", st), it(K)(Q);\n              });\n            }\n          ]), F;\n        }, q = /^NG_ENABLE_DEBUG_INFO!/, X = /^NG_DEFER_BOOTSTRAP!/;\n        if (e && q.test(e.name) && (D.debugInfoEnabled = !0, e.name = e.name.replace(q, \"\")), e && !X.test(e.name))\n          return N();\n        e.name = e.name.replace(X, \"\"), f.resumeBootstrap = function(H) {\n          return s(H, function(F) {\n            O.push(F);\n          }), N();\n        }, ne(f.resumeDeferredBootstrap) && f.resumeDeferredBootstrap();\n      }\n      function Yr() {\n        e.name = \"NG_ENABLE_DEBUG_INFO!\" + e.name, e.location.reload();\n      }\n      function gn(m) {\n        var O = f.element(m).injector();\n        if (!O)\n          throw p(\n            \"test\",\n            \"no injector found for element argument to getTestability\"\n          );\n        return O.get(\"$$testability\");\n      }\n      var vn = /[A-Z]/g;\n      function Wr(m, O) {\n        return O = O || \"_\", m.replace(vn, function(D, N) {\n          return (N ? O : \"\") + D.toLowerCase();\n        });\n      }\n      var Ur = !1;\n      function Pn() {\n        sr.legacyXHTMLReplacement = !0;\n      }\n      function Fn(m, O, D) {\n        if (!m)\n          throw p(\"areq\", \"Argument '{0}' is {1}\", O || \"?\", D || \"required\");\n        return m;\n      }\n      function In(m, O, D) {\n        return D && re(m) && (m = m[m.length - 1]), Fn(\n          ne(m),\n          O,\n          \"not a function, got \" + (m && typeof m == \"object\" ? m.constructor.name || \"Object\" : typeof m)\n        ), m;\n      }\n      function ni(m, O) {\n        if (m === \"hasOwnProperty\")\n          throw p(\"badname\", \"hasOwnProperty is not a valid {0} name\", O);\n      }\n      function Xn(m) {\n        for (var O, D = m[0], N = m[m.length - 1], q = 1; D !== N && (D = D.nextSibling); q++)\n          (O || m[q] !== D) && (O || (O = x(r.call(m, 0, q))), O.push(D));\n        return O || m;\n      }\n      function ur() {\n        return /* @__PURE__ */ Object.create(null);\n      }\n      function _r(m) {\n        if (m == null) return \"\";\n        switch (typeof m) {\n          case \"string\":\n            break;\n          case \"number\":\n            m = \"\" + m;\n            break;\n          default:\n            m = !ht(m) || re(m) || Nt(m) ? zr(m) : m.toString();\n        }\n        return m;\n      }\n      var Gi = 3;\n      function Si(m, O) {\n        if (re(m)) {\n          O = O || [];\n          for (var D = 0, N = m.length; D < N; D++) O[D] = m[D];\n        } else if (gt(m))\n          for (var q in O = O || {}, m)\n            q.charAt(0) === \"$\" && q.charAt(1) === \"$\" || (O[q] = m[q]);\n        return O || m;\n      }\n      function $a(m, O) {\n        return typeof m == \"function\" ? m.toString().replace(/ \\{[\\s\\S]*$/, \"\") : ct(m) ? \"undefined\" : typeof m != \"string\" ? function(D, N) {\n          var q = [];\n          return w(N) && (D = f.copy(D, null, N)), JSON.stringify(D, function(X, H) {\n            if (gt(H = rr(X, H))) {\n              if (q.indexOf(H) >= 0) return \"...\";\n              q.push(H);\n            }\n            return H;\n          });\n        }(m, O) : m;\n      }\n      var To = {\n        full: \"1.8.2\",\n        major: 1,\n        minor: 8,\n        dot: 2,\n        codeName: \"meteoric-mining\"\n      };\n      sr.expando = \"ng339\";\n      var wo = sr.cache = {}, Vn = 1;\n      sr._data = function(m) {\n        return this.cache[m[this.expando]] || {};\n      };\n      var pa = /-([a-z])/g, ko = /^-ms-/, Ao = { mouseleave: \"mouseout\", mouseenter: \"mouseover\" }, Po = E(\"jqLite\");\n      function Nn(m, O) {\n        return O.toUpperCase();\n      }\n      function pi(m) {\n        return m.replace(pa, Nn);\n      }\n      var Fo = /^<([\\w-]+)\\s*\\/?>(?:<\\/\\1>|)$/, ui = /<|&#?\\w+;/, Ri = /<([\\w:-]+)/, qo = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:-]+)[^>]*)\\/>/gi, wn = {\n        thead: [\"table\"],\n        col: [\"colgroup\", \"table\"],\n        tr: [\"tbody\", \"table\"],\n        td: [\"tr\", \"tbody\", \"table\"]\n      };\n      wn.tbody = wn.tfoot = wn.colgroup = wn.caption = wn.thead, wn.th = wn.td;\n      var Sn = {\n        option: [1, '<select multiple=\"multiple\">', \"</select>\"],\n        _default: [0, \"\", \"\"]\n      };\n      for (var Do in wn) {\n        var Dn = wn[Do], Wi = Dn.slice().reverse();\n        Sn[Do] = [\n          Wi.length,\n          \"<\" + Wi.join(\"><\") + \">\",\n          \"</\" + Dn.join(\"></\") + \">\"\n        ];\n      }\n      function Eo(m) {\n        return !ui.test(m);\n      }\n      function hi(m) {\n        var O = m.nodeType;\n        return O === 1 || !O || O === 9;\n      }\n      function ro(m, O) {\n        var D, N, q, X, H, F = O.createDocumentFragment(), Q = [];\n        if (Eo(m)) Q.push(O.createTextNode(m));\n        else {\n          if (D = F.appendChild(O.createElement(\"div\")), N = (Ri.exec(m) || [\"\", \"\"])[1].toLowerCase(), X = sr.legacyXHTMLReplacement ? m.replace(qo, \"<$1></$2>\") : m, y < 10)\n            for (q = Sn[N] || Sn._default, D.innerHTML = q[1] + X + q[2], H = q[0]; H--; )\n              D = D.firstChild;\n          else {\n            for (H = (q = wn[N] || []).length; --H > -1; )\n              D.appendChild(e.document.createElement(q[H])), D = D.firstChild;\n            D.innerHTML = X;\n          }\n          Q = Ze(Q, D.childNodes), (D = F.firstChild).textContent = \"\";\n        }\n        return F.textContent = \"\", F.innerHTML = \"\", s(Q, function(K) {\n          F.appendChild(K);\n        }), F;\n      }\n      Sn.optgroup = Sn.option;\n      var Ro = e.Node.prototype.contains || function(m) {\n        return !!(16 & this.compareDocumentPosition(m));\n      };\n      function sr(m) {\n        if (m instanceof sr) return m;\n        var O, D, N, q;\n        if (St(m) && (m = kt(m), O = !0), !(this instanceof sr)) {\n          if (O && m.charAt(0) !== \"<\")\n            throw Po(\n              \"nosel\",\n              \"Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element\"\n            );\n          return new sr(m);\n        }\n        O ? fn(\n          this,\n          (D = m, N = N || e.document, (q = Fo.exec(D)) ? [N.createElement(q[1])] : (q = ro(D, N)) ? q.childNodes : [])\n        ) : ne(m) ? Zi(m) : fn(this, m);\n      }\n      function Ci(m) {\n        return m.cloneNode(!0);\n      }\n      function gi(m, O) {\n        !O && hi(m) && x.cleanData([m]), m.querySelectorAll && x.cleanData(m.querySelectorAll(\"*\"));\n      }\n      function ha(m) {\n        var O;\n        for (O in m) return !1;\n        return !0;\n      }\n      function Io(m) {\n        var O = m.ng339, D = O && wo[O], N = D && D.events, q = D && D.data;\n        q && !ha(q) || N && !ha(N) || (delete wo[O], m.ng339 = void 0);\n      }\n      function $i(m, O, D, N) {\n        if (ot(N))\n          throw Po(\n            \"offargs\",\n            \"jqLite#off() does not support the `selector` argument\"\n          );\n        var q = Yi(m), X = q && q.events, H = q && q.handle;\n        if (H) {\n          if (O) {\n            var F = function(Q) {\n              var K = X[Q];\n              ot(D) && Wt(K || [], D), ot(D) && K && K.length > 0 || (m.removeEventListener(Q, H), delete X[Q]);\n            };\n            s(O.split(\" \"), function(Q) {\n              F(Q), Ao[Q] && F(Ao[Q]);\n            });\n          } else\n            for (O in X)\n              O !== \"$destroy\" && m.removeEventListener(O, H), delete X[O];\n          Io(m);\n        }\n      }\n      function _i(m, O) {\n        var D = m.ng339, N = D && wo[D];\n        N && (O ? delete N.data[O] : N.data = {}, Io(m));\n      }\n      function Yi(m, O) {\n        var D = m.ng339, N = D && wo[D];\n        return O && !N && (m.ng339 = D = ++Vn, N = wo[D] = { events: {}, data: {}, handle: void 0 }), N;\n      }\n      function ci(m, O, D) {\n        if (hi(m)) {\n          var N, q = ot(D), X = !q && O && !gt(O), H = !O, F = Yi(m, !X), Q = F && F.data;\n          if (q) Q[pi(O)] = D;\n          else {\n            if (H) return Q;\n            if (X) return Q && Q[pi(O)];\n            for (N in O) Q[pi(N)] = O[N];\n          }\n        }\n      }\n      function Ii(m, O) {\n        return !!m.getAttribute && (\" \" + (m.getAttribute(\"class\") || \"\") + \" \").replace(/[\\n\\t]/g, \" \").indexOf(\" \" + O + \" \") > -1;\n      }\n      function xi(m, O) {\n        if (O && m.setAttribute) {\n          var D = (\" \" + (m.getAttribute(\"class\") || \"\") + \" \").replace(\n            /[\\n\\t]/g,\n            \" \"\n          ), N = D;\n          s(O.split(\" \"), function(q) {\n            q = kt(q), N = N.replace(\" \" + q + \" \", \" \");\n          }), N !== D && m.setAttribute(\"class\", kt(N));\n        }\n      }\n      function Xi(m, O) {\n        if (O && m.setAttribute) {\n          var D = (\" \" + (m.getAttribute(\"class\") || \"\") + \" \").replace(\n            /[\\n\\t]/g,\n            \" \"\n          ), N = D;\n          s(O.split(\" \"), function(q) {\n            q = kt(q), N.indexOf(\" \" + q + \" \") === -1 && (N += q + \" \");\n          }), N !== D && m.setAttribute(\"class\", kt(N));\n        }\n      }\n      function fn(m, O) {\n        if (O)\n          if (O.nodeType) m[m.length++] = O;\n          else {\n            var D = O.length;\n            if (typeof D == \"number\" && O.window !== O) {\n              if (D) for (var N = 0; N < D; N++) m[m.length++] = O[N];\n            } else m[m.length++] = O;\n          }\n      }\n      function mi(m, O) {\n        return No(m, \"$\" + (O || \"ngController\") + \"Controller\");\n      }\n      function No(m, O, D) {\n        m.nodeType === 9 && (m = m.documentElement);\n        for (var N = re(O) ? O : [O]; m; ) {\n          for (var q = 0, X = N.length; q < X; q++)\n            if (ot(D = x.data(m, N[q]))) return D;\n          m = m.parentNode || m.nodeType === 11 && m.host;\n        }\n      }\n      function no(m) {\n        for (gi(m, !0); m.firstChild; ) m.removeChild(m.firstChild);\n      }\n      function di(m, O) {\n        O || gi(m);\n        var D = m.parentNode;\n        D && D.removeChild(m);\n      }\n      function Zi(m) {\n        function O() {\n          e.document.removeEventListener(\"DOMContentLoaded\", O), e.removeEventListener(\"load\", O), m();\n        }\n        e.document.readyState === \"complete\" ? e.setTimeout(m) : (e.document.addEventListener(\"DOMContentLoaded\", O), e.addEventListener(\"load\", O));\n      }\n      var qn = sr.prototype = {\n        ready: Zi,\n        toString: function() {\n          var m = [];\n          return s(this, function(O) {\n            m.push(\"\" + O);\n          }), \"[\" + m.join(\", \") + \"]\";\n        },\n        eq: function(m) {\n          return x(m >= 0 ? this[m] : this[this.length + m]);\n        },\n        length: 0,\n        push: h,\n        sort: [].sort,\n        splice: [].splice\n      }, co = {};\n      s(\n        \"multiple,selected,checked,disabled,readOnly,required,open\".split(\",\"),\n        function(m) {\n          co[n(m)] = m;\n        }\n      );\n      var fo = {};\n      s(\n        \"input,select,option,textarea,button,form,details\".split(\",\"),\n        function(m) {\n          fo[m] = !0;\n        }\n      );\n      var wi = {\n        ngMinlength: \"minlength\",\n        ngMaxlength: \"maxlength\",\n        ngMin: \"min\",\n        ngMax: \"max\",\n        ngPattern: \"pattern\",\n        ngStep: \"step\"\n      };\n      function Oi(m, O) {\n        var D = co[O.toLowerCase()];\n        return D && fo[ft(m)] && D;\n      }\n      function Uo(m, O, D) {\n        D.call(m, O);\n      }\n      function ga(m, O, D) {\n        var N = O.relatedTarget;\n        N && (N === m || Ro.call(m, N)) || D.call(m, O);\n      }\n      function Vo() {\n        this.$get = function() {\n          return z(sr, {\n            hasClass: function(m, O) {\n              return m.attr && (m = m[0]), Ii(m, O);\n            },\n            addClass: function(m, O) {\n              return m.attr && (m = m[0]), Xi(m, O);\n            },\n            removeClass: function(m, O) {\n              return m.attr && (m = m[0]), xi(m, O);\n            }\n          });\n        };\n      }\n      function io(m, O) {\n        var D = m && m.$$hashKey;\n        if (D) return typeof D == \"function\" && (D = m.$$hashKey()), D;\n        var N = typeof m;\n        return D = N === \"function\" || N === \"object\" && m !== null ? m.$$hashKey = N + \":\" + (O || I)() : N + \":\" + m;\n      }\n      s(\n        {\n          data: ci,\n          removeData: _i,\n          hasData: function(m) {\n            for (var O in wo[m.ng339]) return !0;\n            return !1;\n          },\n          cleanData: function(m) {\n            for (var O = 0, D = m.length; O < D; O++) _i(m[O]), $i(m[O]);\n          }\n        },\n        function(m, O) {\n          sr[O] = m;\n        }\n      ), s(\n        {\n          data: ci,\n          inheritedData: No,\n          scope: function(m) {\n            return x.data(m, \"$scope\") || No(m.parentNode || m, [\"$isolateScope\", \"$scope\"]);\n          },\n          isolateScope: function(m) {\n            return x.data(m, \"$isolateScope\") || x.data(m, \"$isolateScopeNoTemplate\");\n          },\n          controller: mi,\n          injector: function(m) {\n            return No(m, \"$injector\");\n          },\n          removeAttr: function(m, O) {\n            m.removeAttribute(O);\n          },\n          hasClass: Ii,\n          css: function(m, O, D) {\n            if (O = function(N) {\n              return pi(N.replace(ko, \"ms-\"));\n            }(O), !ot(D))\n              return m.style[O];\n            m.style[O] = D;\n          },\n          attr: function(m, O, D) {\n            var N, q = m.nodeType;\n            if (q !== Gi && q !== 2 && q !== 8 && m.getAttribute) {\n              var X = n(O), H = co[X];\n              if (!ot(D))\n                return N = m.getAttribute(O), H && N !== null && (N = X), N === null ? void 0 : N;\n              D === null || D === !1 && H ? m.removeAttribute(O) : m.setAttribute(O, H ? X : D);\n            }\n          },\n          prop: function(m, O, D) {\n            if (!ot(D)) return m[O];\n            m[O] = D;\n          },\n          text: function() {\n            return m.$dv = \"\", m;\n            function m(O, D) {\n              if (ct(D)) {\n                var N = O.nodeType;\n                return N === 1 || N === Gi ? O.textContent : \"\";\n              }\n              O.textContent = D;\n            }\n          }(),\n          val: function(m, O) {\n            if (ct(O)) {\n              if (m.multiple && ft(m) === \"select\") {\n                var D = [];\n                return s(m.options, function(N) {\n                  N.selected && D.push(N.value || N.text);\n                }), D;\n              }\n              return m.value;\n            }\n            m.value = O;\n          },\n          html: function(m, O) {\n            if (ct(O)) return m.innerHTML;\n            gi(m, !0), m.innerHTML = O;\n          },\n          empty: no\n        },\n        function(m, O) {\n          sr.prototype[O] = function(D, N) {\n            var q, X, H = this.length;\n            if (m !== no && ct(m.length === 2 && m !== Ii && m !== mi ? D : N)) {\n              if (gt(D)) {\n                for (q = 0; q < H; q++)\n                  if (m === ci) m(this[q], D);\n                  else for (X in D) m(this[q], X, D[X]);\n                return this;\n              }\n              for (var F = m.$dv, Q = ct(F) ? Math.min(H, 1) : H, K = 0; K < Q; K++) {\n                var it = m(this[K], D, N);\n                F = F ? F + it : it;\n              }\n              return F;\n            }\n            for (q = 0; q < H; q++) m(this[q], D, N);\n            return this;\n          };\n        }\n      ), s(\n        {\n          removeData: _i,\n          on: function(m, O, D, N) {\n            if (ot(N))\n              throw Po(\n                \"onargs\",\n                \"jqLite#on() does not support the `selector` or `eventData` parameters\"\n              );\n            if (hi(m)) {\n              var q = Yi(m, !0), X = q.events, H = q.handle;\n              H || (H = q.handle = function(it, st) {\n                var Ct = function(jt, Tt) {\n                  jt.isDefaultPrevented = function() {\n                    return jt.defaultPrevented;\n                  };\n                  var Vt = st[Tt || jt.type], oe = Vt ? Vt.length : 0;\n                  if (oe) {\n                    if (ct(jt.immediatePropagationStopped)) {\n                      var _t = jt.stopImmediatePropagation;\n                      jt.stopImmediatePropagation = function() {\n                        jt.immediatePropagationStopped = !0, jt.stopPropagation && jt.stopPropagation(), _t && _t.call(jt);\n                      };\n                    }\n                    jt.isImmediatePropagationStopped = function() {\n                      return jt.immediatePropagationStopped === !0;\n                    };\n                    var Bt = Vt.specialHandlerWrapper || Uo;\n                    oe > 1 && (Vt = Si(Vt));\n                    for (var Qt = 0; Qt < oe; Qt++)\n                      jt.isImmediatePropagationStopped() || Bt(it, jt, Vt[Qt]);\n                  }\n                };\n                return Ct.elem = it, Ct;\n              }(m, X));\n              for (var F = O.indexOf(\" \") >= 0 ? O.split(\" \") : [O], Q = F.length, K = function(it, st, Ct) {\n                var jt = X[it];\n                jt || ((jt = X[it] = []).specialHandlerWrapper = st, it === \"$destroy\" || Ct || m.addEventListener(it, H)), jt.push(D);\n              }; Q--; )\n                O = F[Q], Ao[O] ? (K(Ao[O], ga), K(O, void 0, !0)) : K(O);\n            }\n          },\n          off: $i,\n          one: function(m, O, D) {\n            (m = x(m)).on(O, function N() {\n              m.off(O, D), m.off(O, N);\n            }), m.on(O, D);\n          },\n          replaceWith: function(m, O) {\n            var D, N = m.parentNode;\n            gi(m), s(new sr(O), function(q) {\n              D ? N.insertBefore(q, D.nextSibling) : N.replaceChild(q, m), D = q;\n            });\n          },\n          children: function(m) {\n            var O = [];\n            return s(m.childNodes, function(D) {\n              D.nodeType === 1 && O.push(D);\n            }), O;\n          },\n          contents: function(m) {\n            return m.contentDocument || m.childNodes || [];\n          },\n          append: function(m, O) {\n            var D = m.nodeType;\n            if (D === 1 || D === 11)\n              for (var N = 0, q = (O = new sr(O)).length; N < q; N++) {\n                var X = O[N];\n                m.appendChild(X);\n              }\n          },\n          prepend: function(m, O) {\n            if (m.nodeType === 1) {\n              var D = m.firstChild;\n              s(new sr(O), function(N) {\n                m.insertBefore(N, D);\n              });\n            }\n          },\n          wrap: function(m, O) {\n            var D, N, q;\n            D = m, N = x(O).eq(0).clone()[0], (q = D.parentNode) && q.replaceChild(N, D), N.appendChild(D);\n          },\n          remove: di,\n          detach: function(m) {\n            di(m, !0);\n          },\n          after: function(m, O) {\n            var D = m, N = m.parentNode;\n            if (N)\n              for (var q = 0, X = (O = new sr(O)).length; q < X; q++) {\n                var H = O[q];\n                N.insertBefore(H, D.nextSibling), D = H;\n              }\n          },\n          addClass: Xi,\n          removeClass: xi,\n          toggleClass: function(m, O, D) {\n            O && s(O.split(\" \"), function(N) {\n              var q = D;\n              ct(q) && (q = !Ii(m, N)), (q ? Xi : xi)(m, N);\n            });\n          },\n          parent: function(m) {\n            var O = m.parentNode;\n            return O && O.nodeType !== 11 ? O : null;\n          },\n          next: function(m) {\n            return m.nextElementSibling;\n          },\n          find: function(m, O) {\n            return m.getElementsByTagName ? m.getElementsByTagName(O) : [];\n          },\n          clone: Ci,\n          triggerHandler: function(m, O, D) {\n            var N, q, X, H = O.type || O, F = Yi(m), Q = F && F.events, K = Q && Q[H];\n            K && (N = {\n              preventDefault: function() {\n                this.defaultPrevented = !0;\n              },\n              isDefaultPrevented: function() {\n                return this.defaultPrevented === !0;\n              },\n              stopImmediatePropagation: function() {\n                this.immediatePropagationStopped = !0;\n              },\n              isImmediatePropagationStopped: function() {\n                return this.immediatePropagationStopped === !0;\n              },\n              stopPropagation: Z,\n              type: H,\n              target: m\n            }, O.type && (N = z(N, O)), q = Si(K), X = D ? [N].concat(D) : [N], s(q, function(it) {\n              N.isImmediatePropagationStopped() || it.apply(m, X);\n            }));\n          }\n        },\n        function(m, O) {\n          sr.prototype[O] = function(D, N, q) {\n            for (var X, H = 0, F = this.length; H < F; H++)\n              ct(X) ? ot(X = m(this[H], D, N, q)) && (X = x(X)) : fn(X, m(this[H], D, N, q));\n            return ot(X) ? X : this;\n          };\n        }\n      ), sr.prototype.bind = sr.prototype.on, sr.prototype.unbind = sr.prototype.off;\n      var po = /* @__PURE__ */ Object.create(null);\n      function Hn() {\n        this._keys = [], this._values = [], this._lastKey = NaN, this._lastIndex = -1;\n      }\n      Hn.prototype = {\n        _idx: function(m) {\n          return m !== this._lastKey && (this._lastKey = m, this._lastIndex = this._keys.indexOf(m)), this._lastIndex;\n        },\n        _transformKey: function(m) {\n          return Y(m) ? po : m;\n        },\n        get: function(m) {\n          m = this._transformKey(m);\n          var O = this._idx(m);\n          if (O !== -1) return this._values[O];\n        },\n        has: function(m) {\n          return m = this._transformKey(m), this._idx(m) !== -1;\n        },\n        set: function(m, O) {\n          m = this._transformKey(m);\n          var D = this._idx(m);\n          D === -1 && (D = this._lastIndex = this._keys.length), this._keys[D] = m, this._values[D] = O;\n        },\n        delete: function(m) {\n          m = this._transformKey(m);\n          var O = this._idx(m);\n          return O !== -1 && (this._keys.splice(O, 1), this._values.splice(O, 1), this._lastKey = NaN, this._lastIndex = -1, !0);\n        }\n      };\n      var Ni = Hn, Mn = [\n        function() {\n          this.$get = [\n            function() {\n              return Ni;\n            }\n          ];\n        }\n      ], Mi = /^([^(]+?)=>/, So = /^[^(]*\\(\\s*([^)]*)\\)/m, Li = /,/, ki = /^\\s*(_?)(\\S+?)\\1\\s*$/, ji = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/gm, zi = E(\"$injector\");\n      function oo(m) {\n        return Function.prototype.toString.call(m);\n      }\n      function Xt(m) {\n        var O = oo(m).replace(ji, \"\");\n        return O.match(Mi) || O.match(So);\n      }\n      function ke(m, O) {\n        O = O === !0;\n        var D = {}, N = [], q = new Ni(), X = {\n          $provide: {\n            provider: st(Ct),\n            factory: st(Tt),\n            service: st(function(_t, Bt) {\n              return Tt(_t, [\n                \"$injector\",\n                function(Qt) {\n                  return Qt.instantiate(Bt);\n                }\n              ]);\n            }),\n            value: st(function(_t, Bt) {\n              return Tt(_t, nt(Bt), !1);\n            }),\n            constant: st(function(_t, Bt) {\n              ni(_t, \"constant\"), X[_t] = Bt, F[_t] = Bt;\n            }),\n            decorator: function(_t, Bt) {\n              var Qt = H.get(_t + \"Provider\"), At = Qt.$get;\n              Qt.$get = function() {\n                var wt = K.invoke(At, Qt);\n                return K.invoke(Bt, null, { $delegate: wt });\n              };\n            }\n          }\n        }, H = X.$injector = oe(X, function(_t, Bt) {\n          throw f.isString(Bt) && N.push(Bt), zi(\"unpr\", \"Unknown provider: {0}\", N.join(\" <- \"));\n        }), F = {}, Q = oe(F, function(_t, Bt) {\n          var Qt = H.get(_t + \"Provider\", Bt);\n          return K.invoke(Qt.$get, Qt, void 0, _t);\n        }), K = Q;\n        X.$injectorProvider = { $get: nt(Q) }, K.modules = H.modules = ur();\n        var it = Vt(m);\n        return (K = Q.get(\"$injector\")).strictDi = O, s(it, function(_t) {\n          _t && K.invoke(_t);\n        }), K.loadNewModules = function(_t) {\n          s(Vt(_t), function(Bt) {\n            Bt && K.invoke(Bt);\n          });\n        }, K;\n        function st(_t) {\n          return function(Bt, Qt) {\n            if (!gt(Bt)) return _t(Bt, Qt);\n            s(Bt, j(_t));\n          };\n        }\n        function Ct(_t, Bt) {\n          if (ni(_t, \"service\"), (ne(Bt) || re(Bt)) && (Bt = H.instantiate(Bt)), !Bt.$get)\n            throw zi(\n              \"pget\",\n              \"Provider '{0}' must define $get factory method.\",\n              _t\n            );\n          return X[_t + \"Provider\"] = Bt;\n        }\n        function jt(_t, Bt) {\n          return function() {\n            var Qt = K.invoke(Bt, this);\n            if (ct(Qt))\n              throw zi(\n                \"undef\",\n                \"Provider '{0}' must return a value from $get factory method.\",\n                _t\n              );\n            return Qt;\n          };\n        }\n        function Tt(_t, Bt, Qt) {\n          return Ct(_t, { $get: Qt !== !1 ? jt(_t, Bt) : Bt });\n        }\n        function Vt(_t) {\n          Fn(ct(_t) || re(_t), \"modulesToLoad\", \"not an array\");\n          var Bt, Qt = [];\n          return s(_t, function(At) {\n            if (!q.get(At)) {\n              q.set(At, !0);\n              try {\n                St(At) ? (Bt = o(At), K.modules[At] = Bt, Qt = Qt.concat(Vt(Bt.requires)).concat(Bt._runBlocks), wt(Bt._invokeQueue), wt(Bt._configBlocks)) : ne(At) || re(At) ? Qt.push(H.invoke(At)) : In(At, \"module\");\n              } catch (Ot) {\n                throw re(At) && (At = At[At.length - 1]), Ot.message && Ot.stack && Ot.stack.indexOf(Ot.message) === -1 && (Ot = Ot.message + `\n` + Ot.stack), zi(\n                  \"modulerr\",\n                  `Failed to instantiate module {0} due to:\n{1}`,\n                  At,\n                  Ot.stack || Ot.message || Ot\n                );\n              }\n            }\n            function wt(Ot) {\n              var Ft, qt;\n              for (Ft = 0, qt = Ot.length; Ft < qt; Ft++) {\n                var ue = Ot[Ft], ie = H.get(ue[0]);\n                ie[ue[1]].apply(ie, ue[2]);\n              }\n            }\n          }), Qt;\n        }\n        function oe(_t, Bt) {\n          function Qt(wt, Ot) {\n            if (_t.hasOwnProperty(wt)) {\n              if (_t[wt] === D)\n                throw zi(\n                  \"cdep\",\n                  \"Circular dependency found: {0}\",\n                  wt + \" <- \" + N.join(\" <- \")\n                );\n              return _t[wt];\n            }\n            try {\n              return N.unshift(wt), _t[wt] = D, _t[wt] = Bt(wt, Ot), _t[wt];\n            } catch (Ft) {\n              throw _t[wt] === D && delete _t[wt], Ft;\n            } finally {\n              N.shift();\n            }\n          }\n          function At(wt, Ot, Ft) {\n            for (var qt = [], ue = ke.$$annotate(wt, O, Ft), ie = 0, ge = ue.length; ie < ge; ie++) {\n              var Te = ue[ie];\n              if (typeof Te != \"string\")\n                throw zi(\n                  \"itkn\",\n                  \"Incorrect injection token! Expected service name as string, got {0}\",\n                  Te\n                );\n              qt.push(Ot && Ot.hasOwnProperty(Te) ? Ot[Te] : Qt(Te, Ft));\n            }\n            return qt;\n          }\n          return {\n            invoke: function(wt, Ot, Ft, qt) {\n              typeof Ft == \"string\" && (qt = Ft, Ft = null);\n              var ue = At(wt, Ft, qt);\n              return re(wt) && (wt = wt[wt.length - 1]), function(ie) {\n                if (y || typeof ie != \"function\") return !1;\n                var ge = ie.$$ngIsClass;\n                return ae(ge) || (ge = ie.$$ngIsClass = /^class\\b/.test(oo(ie))), ge;\n              }(wt) ? (ue.unshift(null), new (Function.prototype.bind.apply(wt, ue))()) : wt.apply(Ot, ue);\n            },\n            instantiate: function(wt, Ot, Ft) {\n              var qt = re(wt) ? wt[wt.length - 1] : wt, ue = At(wt, Ot, Ft);\n              return ue.unshift(null), new (Function.prototype.bind.apply(qt, ue))();\n            },\n            get: Qt,\n            annotate: ke.$$annotate,\n            has: function(wt) {\n              return X.hasOwnProperty(wt + \"Provider\") || _t.hasOwnProperty(wt);\n            }\n          };\n        }\n      }\n      function $() {\n        var m = !0;\n        this.disableAutoScrolling = function() {\n          m = !1;\n        }, this.$get = [\n          \"$window\",\n          \"$location\",\n          \"$rootScope\",\n          function(O, D, N) {\n            var q = O.document;\n            function X(F) {\n              if (F) {\n                F.scrollIntoView();\n                var Q = function() {\n                  var it = H.yOffset;\n                  if (ne(it)) it = it();\n                  else if (yt(it)) {\n                    var st = it[0];\n                    it = O.getComputedStyle(st).position !== \"fixed\" ? 0 : st.getBoundingClientRect().bottom;\n                  } else zt(it) || (it = 0);\n                  return it;\n                }();\n                if (Q) {\n                  var K = F.getBoundingClientRect().top;\n                  O.scrollBy(0, K - Q);\n                }\n              } else O.scrollTo(0, 0);\n            }\n            function H(F) {\n              var Q, K, it;\n              (F = St(F) ? F : zt(F) ? F.toString() : D.hash()) ? (Q = q.getElementById(F)) ? X(Q) : (K = q.getElementsByName(F), it = null, Array.prototype.some.call(K, function(st) {\n                if (ft(st) === \"a\") return it = st, !0;\n              }), (Q = it) ? X(Q) : F === \"top\" && X(null)) : X(null);\n            }\n            return m && N.$watch(\n              function() {\n                return D.hash();\n              },\n              function(F, Q) {\n                var K, it;\n                F === Q && F === \"\" || (K = function() {\n                  N.$evalAsync(H);\n                }, (it = it || e).document.readyState === \"complete\" ? it.setTimeout(K) : x(it).on(\"load\", K));\n              }\n            ), H;\n          }\n        ];\n      }\n      ke.$$annotate = function(m, O, D) {\n        var N, q;\n        if (typeof m == \"function\") {\n          if (!(N = m.$inject)) {\n            if (N = [], m.length) {\n              if (O)\n                throw St(D) && D || (D = m.name || function(X) {\n                  var H = Xt(X);\n                  return H ? \"function(\" + (H[1] || \"\").replace(/[\\s\\r\\n]+/, \" \") + \")\" : \"fn\";\n                }(m)), zi(\n                  \"strictdi\",\n                  \"{0} is not using explicit annotation and cannot be invoked in strict mode\",\n                  D\n                );\n              s(Xt(m)[1].split(Li), function(X) {\n                X.replace(ki, function(H, F, Q) {\n                  N.push(Q);\n                });\n              });\n            }\n            m.$inject = N;\n          }\n        } else\n          re(m) ? (In(m[q = m.length - 1], \"fn\"), N = m.slice(0, q)) : In(m, \"fn\", !0);\n        return N;\n      };\n      var P = E(\"$animate\");\n      function U(m, O) {\n        return m || O ? m ? O ? (re(m) && (m = m.join(\" \")), re(O) && (O = O.join(\" \")), m + \" \" + O) : m : O : \"\";\n      }\n      function W(m) {\n        return gt(m) ? m : {};\n      }\n      var et = function() {\n        this.$get = Z;\n      }, dt = function() {\n        var m = new Ni(), O = [];\n        this.$get = [\n          \"$$AnimateRunner\",\n          \"$rootScope\",\n          function(D, N) {\n            return {\n              enabled: Z,\n              on: Z,\n              off: Z,\n              pin: Z,\n              push: function(H, F, Q, K) {\n                K && K(), (Q = Q || {}).from && H.css(Q.from), Q.to && H.css(Q.to), (Q.addClass || Q.removeClass) && function(st, Ct, jt) {\n                  var Tt = m.get(st) || {}, Vt = q(Tt, Ct, !0), oe = q(Tt, jt, !1);\n                  (Vt || oe) && (m.set(st, Tt), O.push(st), O.length === 1 && N.$$postDigest(X));\n                }(H, Q.addClass, Q.removeClass);\n                var it = new D();\n                return it.complete(), it;\n              }\n            };\n            function q(H, F, Q) {\n              var K = !1;\n              return F && s(F = St(F) ? F.split(\" \") : re(F) ? F : [], function(it) {\n                it && (K = !0, H[it] = Q);\n              }), K;\n            }\n            function X() {\n              s(O, function(H) {\n                var F = m.get(H);\n                if (F) {\n                  var Q = function(st) {\n                    St(st) && (st = st.split(\" \"));\n                    var Ct = ur();\n                    return s(st, function(jt) {\n                      jt.length && (Ct[jt] = !0);\n                    }), Ct;\n                  }(H.attr(\"class\")), K = \"\", it = \"\";\n                  s(F, function(st, Ct) {\n                    st !== !!Q[Ct] && (st ? K += (K.length ? \" \" : \"\") + Ct : it += (it.length ? \" \" : \"\") + Ct);\n                  }), s(H, function(st) {\n                    K && Xi(st, K), it && xi(st, it);\n                  }), m.delete(H);\n                }\n              }), O.length = 0;\n            }\n          }\n        ];\n      }, mt = [\n        \"$provide\",\n        function(m) {\n          var O = this, D = null, N = null;\n          this.$$registeredAnimations = /* @__PURE__ */ Object.create(null), this.register = function(q, X) {\n            if (q && q.charAt(0) !== \".\")\n              throw P(\n                \"notcsel\",\n                \"Expecting class selector starting with '.' got '{0}'.\",\n                q\n              );\n            var H = q + \"-animation\";\n            O.$$registeredAnimations[q.substr(1)] = H, m.factory(H, X);\n          }, this.customFilter = function(q) {\n            return arguments.length === 1 && (N = ne(q) ? q : null), N;\n          }, this.classNameFilter = function(q) {\n            if (arguments.length === 1 && (D = q instanceof RegExp ? q : null)) {\n              var X = new RegExp(\"[(\\\\s|\\\\/)]ng-animate[(\\\\s|\\\\/)]\");\n              if (X.test(D.toString()))\n                throw D = null, P(\n                  \"nongcls\",\n                  '$animateProvider.classNameFilter(regex) prohibits accepting a regex value which matches/contains the \"{0}\" CSS class.',\n                  \"ng-animate\"\n                );\n            }\n            return D;\n          }, this.$get = [\n            \"$$animateQueue\",\n            function(q) {\n              function X(H, F, Q) {\n                if (Q) {\n                  var K = function(it) {\n                    for (var st = 0; st < it.length; st++) {\n                      var Ct = it[st];\n                      if (Ct.nodeType === 1) return Ct;\n                    }\n                  }(Q);\n                  !K || K.parentNode || K.previousElementSibling || (Q = null);\n                }\n                Q ? Q.after(H) : F.prepend(H);\n              }\n              return {\n                on: q.on,\n                off: q.off,\n                pin: q.pin,\n                enabled: q.enabled,\n                cancel: function(H) {\n                  H.cancel && H.cancel();\n                },\n                enter: function(H, F, Q, K) {\n                  return F = F && x(F), Q = Q && x(Q), X(H, F = F || Q.parent(), Q), q.push(H, \"enter\", W(K));\n                },\n                move: function(H, F, Q, K) {\n                  return F = F && x(F), Q = Q && x(Q), X(H, F = F || Q.parent(), Q), q.push(H, \"move\", W(K));\n                },\n                leave: function(H, F) {\n                  return q.push(H, \"leave\", W(F), function() {\n                    H.remove();\n                  });\n                },\n                addClass: function(H, F, Q) {\n                  return (Q = W(Q)).addClass = U(Q.addclass, F), q.push(H, \"addClass\", Q);\n                },\n                removeClass: function(H, F, Q) {\n                  return (Q = W(Q)).removeClass = U(Q.removeClass, F), q.push(H, \"removeClass\", Q);\n                },\n                setClass: function(H, F, Q, K) {\n                  return (K = W(K)).addClass = U(K.addClass, F), K.removeClass = U(K.removeClass, Q), q.push(H, \"setClass\", K);\n                },\n                animate: function(H, F, Q, K, it) {\n                  return (it = W(it)).from = it.from ? z(it.from, F) : F, it.to = it.to ? z(it.to, Q) : Q, K = K || \"ng-inline-animate\", it.tempClasses = U(it.tempClasses, K), q.push(H, \"animate\", it);\n                }\n              };\n            }\n          ];\n        }\n      ], Mt = function() {\n        this.$get = [\n          \"$$rAF\",\n          function(m) {\n            var O = [];\n            function D(N) {\n              O.push(N), O.length > 1 || m(function() {\n                for (var q = 0; q < O.length; q++) O[q]();\n                O = [];\n              });\n            }\n            return function() {\n              var N = !1;\n              return D(function() {\n                N = !0;\n              }), function(q) {\n                N ? q() : D(q);\n              };\n            };\n          }\n        ];\n      }, Ut = function() {\n        this.$get = [\n          \"$q\",\n          \"$sniffer\",\n          \"$$animateAsyncRun\",\n          \"$$isDocumentHidden\",\n          \"$timeout\",\n          function(m, O, D, N, q) {\n            function X(H) {\n              this.setHost(H);\n              var F = D();\n              this._doneCallbacks = [], this._tick = function(Q) {\n                N() ? function(K) {\n                  q(K, 0, !1);\n                }(Q) : F(Q);\n              }, this._state = 0;\n            }\n            return X.chain = function(H, F) {\n              var Q = 0;\n              (function K() {\n                if (Q === H.length) return void F(!0);\n                H[Q](function(it) {\n                  it !== !1 ? (Q++, K()) : F(!1);\n                });\n              })();\n            }, X.all = function(H, F) {\n              var Q = 0, K = !0;\n              function it(st) {\n                K = K && st, ++Q === H.length && F(K);\n              }\n              s(H, function(st) {\n                st.done(it);\n              });\n            }, X.prototype = {\n              setHost: function(H) {\n                this.host = H || {};\n              },\n              done: function(H) {\n                this._state === 2 ? H() : this._doneCallbacks.push(H);\n              },\n              progress: Z,\n              getPromise: function() {\n                if (!this.promise) {\n                  var H = this;\n                  this.promise = m(function(F, Q) {\n                    H.done(function(K) {\n                      K === !1 ? Q() : F();\n                    });\n                  });\n                }\n                return this.promise;\n              },\n              then: function(H, F) {\n                return this.getPromise().then(H, F);\n              },\n              catch: function(H) {\n                return this.getPromise().catch(H);\n              },\n              finally: function(H) {\n                return this.getPromise().finally(H);\n              },\n              pause: function() {\n                this.host.pause && this.host.pause();\n              },\n              resume: function() {\n                this.host.resume && this.host.resume();\n              },\n              end: function() {\n                this.host.end && this.host.end(), this._resolve(!0);\n              },\n              cancel: function() {\n                this.host.cancel && this.host.cancel(), this._resolve(!1);\n              },\n              complete: function(H) {\n                var F = this;\n                F._state === 0 && (F._state = 1, F._tick(function() {\n                  F._resolve(H);\n                }));\n              },\n              _resolve: function(H) {\n                this._state !== 2 && (s(this._doneCallbacks, function(F) {\n                  F(H);\n                }), this._doneCallbacks.length = 0, this._state = 2);\n              }\n            }, X;\n          }\n        ];\n      }, Zt = function() {\n        this.$get = [\n          \"$$rAF\",\n          \"$q\",\n          \"$$AnimateRunner\",\n          function(m, O, D) {\n            return function(N, q) {\n              var X = q || {};\n              X.$$prepared || (X = le(X)), X.cleanupStyles && (X.from = X.to = null), X.from && (N.css(X.from), X.from = null);\n              var H, F = new D();\n              return { start: Q, end: Q };\n              function Q() {\n                return m(function() {\n                  (function() {\n                    X.addClass && (N.addClass(X.addClass), X.addClass = null), X.removeClass && (N.removeClass(X.removeClass), X.removeClass = null), X.to && (N.css(X.to), X.to = null);\n                  })(), H || F.complete(), H = !0;\n                }), F;\n              }\n            };\n          }\n        ];\n      };\n      function ve(m, O, D, N, q) {\n        var X = this, H = m.location, F = m.history, Q = m.setTimeout, K = m.clearTimeout, it = {}, st = q(D);\n        X.isMock = !1, X.$$completeOutstandingRequest = st.completeTask, X.$$incOutstandingRequestCount = st.incTaskCount, X.notifyWhenNoOutstandingRequests = st.notifyWhenNoPendingTasks;\n        var Ct, jt, Tt = H.href, Vt = O.find(\"base\"), oe = null, _t = N.history ? function() {\n          try {\n            return F.state;\n          } catch {\n          }\n        } : Z;\n        Ot(), X.url = function(qt, ue, ie) {\n          if (ct(ie) && (ie = null), H !== m.location && (H = m.location), F !== m.history && (F = m.history), qt) {\n            var ge = jt === ie;\n            if (qt = $o(qt).href, Tt === qt && (!N.history || ge)) return X;\n            var Te = Tt && Ho(Tt) === Ho(qt);\n            return Tt = qt, jt = ie, !N.history || Te && ge ? (Te || (oe = qt), ue ? H.replace(qt) : Te ? H.hash = function(Xe) {\n              var He = Xe.indexOf(\"#\");\n              return He === -1 ? \"\" : Xe.substr(He);\n            }(qt) : H.href = qt, H.href !== qt && (oe = qt)) : (F[ue ? \"replaceState\" : \"pushState\"](ie, \"\", qt), Ot()), oe && (oe = qt), X;\n          }\n          return function(Xe) {\n            return Xe.replace(/#$/, \"\");\n          }(oe || H.href);\n        }, X.state = function() {\n          return Ct;\n        };\n        var Bt = [], Qt = !1;\n        function At() {\n          oe = null, Ft();\n        }\n        var wt = null;\n        function Ot() {\n          pe(Ct = ct(Ct = _t()) ? null : Ct, wt) && (Ct = wt), wt = Ct, jt = Ct;\n        }\n        function Ft() {\n          var qt = jt;\n          Ot(), Tt === X.url() && qt === Ct || (Tt = X.url(), jt = Ct, s(Bt, function(ue) {\n            ue(X.url(), Ct);\n          }));\n        }\n        X.onUrlChange = function(qt) {\n          return Qt || (N.history && x(m).on(\"popstate\", At), x(m).on(\"hashchange\", At), Qt = !0), Bt.push(qt), qt;\n        }, X.$$applicationDestroyed = function() {\n          x(m).off(\"hashchange popstate\", At);\n        }, X.$$checkUrlChange = Ft, X.baseHref = function() {\n          var qt = Vt.attr(\"href\");\n          return qt ? qt.replace(/^(https?:)?\\/\\/[^/]*/, \"\") : \"\";\n        }, X.defer = function(qt, ue, ie) {\n          var ge;\n          return ue = ue || 0, ie = ie || st.DEFAULT_TASK_TYPE, st.incTaskCount(ie), ge = Q(function() {\n            delete it[ge], st.completeTask(qt, ie);\n          }, ue), it[ge] = ie, ge;\n        }, X.defer.cancel = function(qt) {\n          if (it.hasOwnProperty(qt)) {\n            var ue = it[qt];\n            return delete it[qt], K(qt), st.completeTask(Z, ue), !0;\n          }\n          return !1;\n        };\n      }\n      function Ae() {\n        this.$get = [\n          \"$window\",\n          \"$log\",\n          \"$sniffer\",\n          \"$document\",\n          \"$$taskTrackerFactory\",\n          function(m, O, D, N, q) {\n            return new ve(m, N, O, D, q);\n          }\n        ];\n      }\n      function de() {\n        this.$get = function() {\n          var m = {};\n          function O(D, N) {\n            if (D in m)\n              throw E(\"$cacheFactory\")(\n                \"iid\",\n                \"CacheId '{0}' is already taken!\",\n                D\n              );\n            var q = 0, X = z({}, N, { id: D }), H = ur(), F = N && N.capacity || Number.MAX_VALUE, Q = ur(), K = null, it = null;\n            return m[D] = {\n              put: function(jt, Tt) {\n                if (!ct(Tt))\n                  return F < Number.MAX_VALUE && st(Q[jt] || (Q[jt] = { key: jt })), jt in H || q++, H[jt] = Tt, q > F && this.remove(it.key), Tt;\n              },\n              get: function(jt) {\n                if (F < Number.MAX_VALUE) {\n                  var Tt = Q[jt];\n                  if (!Tt) return;\n                  st(Tt);\n                }\n                return H[jt];\n              },\n              remove: function(jt) {\n                if (F < Number.MAX_VALUE) {\n                  var Tt = Q[jt];\n                  if (!Tt) return;\n                  Tt === K && (K = Tt.p), Tt === it && (it = Tt.n), Ct(Tt.n, Tt.p), delete Q[jt];\n                }\n                jt in H && (delete H[jt], q--);\n              },\n              removeAll: function() {\n                H = ur(), q = 0, Q = ur(), K = it = null;\n              },\n              destroy: function() {\n                H = null, X = null, Q = null, delete m[D];\n              },\n              info: function() {\n                return z({}, X, { size: q });\n              }\n            };\n            function st(jt) {\n              jt !== K && (it ? it === jt && (it = jt.n) : it = jt, Ct(jt.n, jt.p), Ct(jt, K), (K = jt).n = null);\n            }\n            function Ct(jt, Tt) {\n              jt !== Tt && (jt && (jt.p = Tt), Tt && (Tt.n = jt));\n            }\n          }\n          return O.info = function() {\n            var D = {};\n            return s(m, function(N, q) {\n              D[q] = N.info();\n            }), D;\n          }, O.get = function(D) {\n            return m[D];\n          }, O;\n        };\n      }\n      function me() {\n        this.$get = [\n          \"$cacheFactory\",\n          function(m) {\n            return m(\"templates\");\n          }\n        ];\n      }\n      var Be = E(\"$compile\"), We = new function() {\n      }();\n      function tr(m, O) {\n        var D = {}, N = /^\\s*directive:\\s*([\\w-]+)\\s+(.*)$/, q = /(([\\w-]+)(?::([^;]+))?;?)/, X = function(_t) {\n          var Bt, Qt = {}, At = _t.split(\",\");\n          for (Bt = 0; Bt < At.length; Bt++) Qt[At[Bt]] = !0;\n          return Qt;\n        }(\"ngSrc,ngSrcset,src,srcset\"), H = /^(?:(\\^\\^?)?(\\?)?(\\^\\^?)?)?/, F = /^(on[a-z]+|formaction)$/, Q = ur();\n        function K(_t, Bt, Qt) {\n          var At = /^([@&]|[=<](\\*?))(\\??)\\s*([\\w$]*)$/, wt = ur();\n          return s(_t, function(Ot, Ft) {\n            if ((Ot = Ot.trim()) in Q) wt[Ft] = Q[Ot];\n            else {\n              var qt = Ot.match(At);\n              if (!qt)\n                throw Be(\n                  \"iscp\",\n                  \"Invalid {3} for directive '{0}'. Definition: {... {1}: '{2}' ...}\",\n                  Bt,\n                  Ft,\n                  Ot,\n                  Qt ? \"controller bindings definition\" : \"isolate scope definition\"\n                );\n              wt[Ft] = {\n                mode: qt[1][0],\n                collection: qt[2] === \"*\",\n                optional: qt[3] === \"?\",\n                attrName: qt[4] || Ft\n              }, qt[4] && (Q[Ot] = wt[Ft]);\n            }\n          }), wt;\n        }\n        function it(_t, Bt) {\n          var Qt = { isolateScope: null, bindToController: null };\n          if (gt(_t.scope) && (_t.bindToController === !0 ? (Qt.bindToController = K(_t.scope, Bt, !0), Qt.isolateScope = {}) : Qt.isolateScope = K(_t.scope, Bt, !1)), gt(_t.bindToController) && (Qt.bindToController = K(_t.bindToController, Bt, !0)), Qt.bindToController && !_t.controller)\n            throw Be(\n              \"noctrl\",\n              \"Cannot bind to controller without directive '{0}'s controller.\",\n              Bt\n            );\n          return Qt;\n        }\n        this.directive = function _t(Bt, Qt) {\n          return Fn(Bt, \"name\"), ni(Bt, \"directive\"), St(Bt) ? (function(At) {\n            var wt = At.charAt(0);\n            if (!wt || wt !== n(wt))\n              throw Be(\n                \"baddir\",\n                \"Directive/Component name '{0}' is invalid. The first character must be a lowercase letter\",\n                At\n              );\n            if (At !== At.trim())\n              throw Be(\n                \"baddir\",\n                \"Directive/Component name '{0}' is invalid. The name should not contain leading or trailing whitespaces\",\n                At\n              );\n          }(Bt), Fn(Qt, \"directiveFactory\"), D.hasOwnProperty(Bt) || (D[Bt] = [], m.factory(Bt + \"Directive\", [\n            \"$injector\",\n            \"$exceptionHandler\",\n            function(At, wt) {\n              var Ot = [];\n              return s(D[Bt], function(Ft, qt) {\n                try {\n                  var ue = At.invoke(Ft);\n                  ne(ue) ? ue = { compile: nt(ue) } : !ue.compile && ue.link && (ue.compile = nt(ue.link)), ue.priority = ue.priority || 0, ue.index = qt, ue.name = ue.name || Bt, ue.require = function(ie) {\n                    var ge = ie.require || ie.controller && ie.name;\n                    return !re(ge) && gt(ge) && s(ge, function(Te, Xe) {\n                      var He = Te.match(H);\n                      Te.substring(He[0].length) || (ge[Xe] = He[0] + Xe);\n                    }), ge;\n                  }(ue), ue.restrict = function(ie, ge) {\n                    if (ie && (!St(ie) || !/[EACM]/.test(ie)))\n                      throw Be(\n                        \"badrestrict\",\n                        \"Restrict property '{0}' of directive '{1}' is invalid\",\n                        ie,\n                        ge\n                      );\n                    return ie || \"EA\";\n                  }(ue.restrict, Bt), ue.$$moduleName = Ft.$$moduleName, Ot.push(ue);\n                } catch (ie) {\n                  wt(ie);\n                }\n              }), Ot;\n            }\n          ])), D[Bt].push(Qt)) : s(Bt, j(_t)), this;\n        }, this.component = function _t(Bt, Qt) {\n          if (!St(Bt)) return s(Bt, j(Ar(this, _t))), this;\n          var At = Qt.controller || function() {\n          };\n          function wt(Ot) {\n            function Ft(ie) {\n              return ne(ie) || re(ie) ? function(ge, Te) {\n                return Ot.invoke(ie, this, { $element: ge, $attrs: Te });\n              } : ie;\n            }\n            var qt = Qt.template || Qt.templateUrl ? Qt.template : \"\", ue = {\n              controller: At,\n              controllerAs: It(Qt.controller) || Qt.controllerAs || \"$ctrl\",\n              template: Ft(qt),\n              templateUrl: Ft(Qt.templateUrl),\n              transclude: Qt.transclude,\n              scope: {},\n              bindToController: Qt.bindings || {},\n              restrict: \"E\",\n              require: Qt.require\n            };\n            return s(Qt, function(ie, ge) {\n              ge.charAt(0) === \"$\" && (ue[ge] = ie);\n            }), ue;\n          }\n          return s(Qt, function(Ot, Ft) {\n            Ft.charAt(0) === \"$\" && (wt[Ft] = Ot, ne(At) && (At[Ft] = Ot));\n          }), wt.$inject = [\"$injector\"], this.directive(Bt, wt);\n        }, this.aHrefSanitizationTrustedUrlList = function(_t) {\n          return ot(_t) ? (O.aHrefSanitizationTrustedUrlList(_t), this) : O.aHrefSanitizationTrustedUrlList();\n        }, Object.defineProperty(this, \"aHrefSanitizationWhitelist\", {\n          get: function() {\n            return this.aHrefSanitizationTrustedUrlList;\n          },\n          set: function(_t) {\n            this.aHrefSanitizationTrustedUrlList = _t;\n          }\n        }), this.imgSrcSanitizationTrustedUrlList = function(_t) {\n          return ot(_t) ? (O.imgSrcSanitizationTrustedUrlList(_t), this) : O.imgSrcSanitizationTrustedUrlList();\n        }, Object.defineProperty(this, \"imgSrcSanitizationWhitelist\", {\n          get: function() {\n            return this.imgSrcSanitizationTrustedUrlList;\n          },\n          set: function(_t) {\n            this.imgSrcSanitizationTrustedUrlList = _t;\n          }\n        });\n        var st = !0;\n        this.debugInfoEnabled = function(_t) {\n          return ot(_t) ? (st = _t, this) : st;\n        };\n        var Ct = !1;\n        this.strictComponentBindingsEnabled = function(_t) {\n          return ot(_t) ? (Ct = _t, this) : Ct;\n        };\n        var jt = 10;\n        this.onChangesTtl = function(_t) {\n          return arguments.length ? (jt = _t, this) : jt;\n        };\n        var Tt = !0;\n        this.commentDirectivesEnabled = function(_t) {\n          return arguments.length ? (Tt = _t, this) : Tt;\n        };\n        var Vt = !0;\n        this.cssClassDirectivesEnabled = function(_t) {\n          return arguments.length ? (Vt = _t, this) : Vt;\n        };\n        var oe = ur();\n        this.addPropertySecurityContext = function(_t, Bt, Qt) {\n          var At = _t.toLowerCase() + \"|\" + Bt.toLowerCase();\n          if (At in oe && oe[At] !== Qt)\n            throw Be(\n              \"ctxoverride\",\n              \"Property context '{0}.{1}' already set to '{2}', cannot override to '{3}'.\",\n              _t,\n              Bt,\n              oe[At],\n              Qt\n            );\n          return oe[At] = Qt, this;\n        }, function() {\n          function _t(Bt, Qt) {\n            s(Qt, function(At) {\n              oe[At.toLowerCase()] = Bt;\n            });\n          }\n          _t(Zr.HTML, [\"iframe|srcdoc\", \"*|innerHTML\", \"*|outerHTML\"]), _t(Zr.CSS, [\"*|style\"]), _t(Zr.URL, [\n            \"area|href\",\n            \"area|ping\",\n            \"a|href\",\n            \"a|ping\",\n            \"blockquote|cite\",\n            \"body|background\",\n            \"del|cite\",\n            \"input|src\",\n            \"ins|cite\",\n            \"q|cite\"\n          ]), _t(Zr.MEDIA_URL, [\n            \"audio|src\",\n            \"img|src\",\n            \"img|srcset\",\n            \"source|src\",\n            \"source|srcset\",\n            \"track|src\",\n            \"video|src\",\n            \"video|poster\"\n          ]), _t(Zr.RESOURCE_URL, [\n            \"*|formAction\",\n            \"applet|code\",\n            \"applet|codebase\",\n            \"base|href\",\n            \"embed|src\",\n            \"frame|src\",\n            \"form|action\",\n            \"head|profile\",\n            \"html|manifest\",\n            \"iframe|src\",\n            \"link|href\",\n            \"media|src\",\n            \"object|codebase\",\n            \"object|data\",\n            \"script|src\"\n          ]);\n        }(), this.$get = [\n          \"$injector\",\n          \"$interpolate\",\n          \"$exceptionHandler\",\n          \"$templateRequest\",\n          \"$parse\",\n          \"$controller\",\n          \"$rootScope\",\n          \"$sce\",\n          \"$animate\",\n          function(_t, Bt, Qt, At, wt, Ot, Ft, qt, ue) {\n            var ie, ge = /^\\w/, Te = e.document.createElement(\"div\"), Xe = Tt, He = Vt, Qr = jt;\n            function vr() {\n              try {\n                if (!--Qr)\n                  throw ie = void 0, Be(\n                    \"infchng\",\n                    `{0} $onChanges() iterations reached. Aborting!\n`,\n                    jt\n                  );\n                Ft.$apply(function() {\n                  for (var Yt = 0, Kt = ie.length; Yt < Kt; ++Yt)\n                    try {\n                      ie[Yt]();\n                    } catch (te) {\n                      Qt(te);\n                    }\n                  ie = void 0;\n                });\n              } finally {\n                Qr++;\n              }\n            }\n            function Cr(Yt, Kt) {\n              if (!Yt) return Yt;\n              if (!St(Yt))\n                throw Be(\n                  \"srcset\",\n                  'Can\\'t pass trusted values to `{0}`: \"{1}\"',\n                  Kt,\n                  Yt.toString()\n                );\n              for (var te = \"\", Ce = kt(Yt), Pe = /\\s/.test(Ce) ? /(\\s+\\d+x\\s*,|\\s+\\d+w\\s*,|\\s+,|,\\s+)/ : /(,)/, ze = Ce.split(Pe), qe = Math.floor(ze.length / 2), mr = 0; mr < qe; mr++) {\n                var Je = 2 * mr;\n                te += qt.getTrustedMediaUrl(kt(ze[Je])), te += \" \" + kt(ze[Je + 1]);\n              }\n              var Ie = kt(ze[2 * mr]).split(/\\s/);\n              return te += qt.getTrustedMediaUrl(kt(Ie[0])), Ie.length === 2 && (te += \" \" + kt(Ie[1])), te;\n            }\n            function cn(Yt, Kt) {\n              if (Kt) {\n                var te, Ce, Pe, ze = Object.keys(Kt);\n                for (te = 0, Ce = ze.length; te < Ce; te++) this[Pe = ze[te]] = Kt[Pe];\n              } else this.$attr = {};\n              this.$$element = Yt;\n            }\n            function Pr(Yt, Kt) {\n              try {\n                Yt.addClass(Kt);\n              } catch {\n              }\n            }\n            cn.prototype = {\n              $normalize: Br,\n              $addClass: function(Yt) {\n                Yt && Yt.length > 0 && ue.addClass(this.$$element, Yt);\n              },\n              $removeClass: function(Yt) {\n                Yt && Yt.length > 0 && ue.removeClass(this.$$element, Yt);\n              },\n              $updateClass: function(Yt, Kt) {\n                var te = Or(Yt, Kt);\n                te && te.length && ue.addClass(this.$$element, te);\n                var Ce = Or(Kt, Yt);\n                Ce && Ce.length && ue.removeClass(this.$$element, Ce);\n              },\n              $set: function(Yt, Kt, te, Ce) {\n                var Pe = Oi(this.$$element[0], Yt), ze = wi[Yt], qe = Yt;\n                Pe ? (this.$$element.prop(Yt, Kt), Ce = Pe) : ze && (this[ze] = Kt, qe = ze), this[Yt] = Kt, Ce ? this.$attr[Yt] = Ce : (Ce = this.$attr[Yt]) || (this.$attr[Yt] = Ce = Wr(Yt, \"-\")), ft(this.$$element) === \"img\" && Yt === \"srcset\" && (this[Yt] = Kt = Cr(Kt, \"$set('srcset', value)\")), te !== !1 && (Kt === null || ct(Kt) ? this.$$element.removeAttr(Ce) : ge.test(Ce) ? Pe && Kt === !1 ? this.$$element.removeAttr(Ce) : this.$$element.attr(Ce, Kt) : function(Je, Ie, Ke) {\n                  Te.innerHTML = \"<span \" + Ie + \">\";\n                  var Ue = Te.firstChild.attributes, Qe = Ue[0];\n                  Ue.removeNamedItem(Qe.name), Qe.value = Ke, Je.attributes.setNamedItem(Qe);\n                }(this.$$element[0], Ce, Kt));\n                var mr = this.$$observers;\n                mr && s(mr[qe], function(Je) {\n                  try {\n                    Je(Kt);\n                  } catch (Ie) {\n                    Qt(Ie);\n                  }\n                });\n              },\n              $observe: function(Yt, Kt) {\n                var te = this, Ce = te.$$observers || (te.$$observers = ur()), Pe = Ce[Yt] || (Ce[Yt] = []);\n                return Pe.push(Kt), Ft.$evalAsync(function() {\n                  Pe.$$inter || !te.hasOwnProperty(Yt) || ct(te[Yt]) || Kt(te[Yt]);\n                }), function() {\n                  Wt(Pe, Kt);\n                };\n              }\n            };\n            var dn = Bt.startSymbol(), _n = Bt.endSymbol(), On = dn === \"{{\" && _n === \"}}\" ? at : function(Yt) {\n              return Yt.replace(/\\{\\{/g, dn).replace(/}}/g, _n);\n            }, kn = /^ng(Attr|Prop|On)([A-Z].*)$/, zo = /^(.+)Start$/;\n            return br.$$addBindingInfo = st ? function(Yt, Kt) {\n              var te = Yt.data(\"$binding\") || [];\n              re(Kt) ? te = te.concat(Kt) : te.push(Kt), Yt.data(\"$binding\", te);\n            } : Z, br.$$addBindingClass = st ? function(Yt) {\n              Pr(Yt, \"ng-binding\");\n            } : Z, br.$$addScopeInfo = st ? function(Yt, Kt, te, Ce) {\n              var Pe = te ? Ce ? \"$isolateScopeNoTemplate\" : \"$isolateScope\" : \"$scope\";\n              Yt.data(Pe, Kt);\n            } : Z, br.$$addScopeClass = st ? function(Yt, Kt) {\n              Pr(Yt, Kt ? \"ng-isolate-scope\" : \"ng-scope\");\n            } : Z, br.$$createComment = function(Yt, Kt) {\n              var te = \"\";\n              return st && (te = \" \" + (Yt || \"\") + \": \", Kt && (te += Kt + \" \")), e.document.createComment(te);\n            }, br;\n            function br(Yt, Kt, te, Ce, Pe) {\n              Yt instanceof x || (Yt = x(Yt));\n              var ze = cr(Yt, Kt, Yt, te, Ce, Pe);\n              br.$$addScopeClass(Yt);\n              var qe = null;\n              return function(mr, Je, Ie) {\n                if (!Yt)\n                  throw Be(\n                    \"multilink\",\n                    \"This element has already been linked.\"\n                  );\n                Fn(mr, \"scope\"), Pe && Pe.needsNewScope && (mr = mr.$parent.$new());\n                var Ke, Ue, Qe, kr = (Ie = Ie || {}).parentBoundTranscludeFn, En = Ie.transcludeControllers, an = Ie.futureParentElement;\n                if (kr && kr.$$boundTransclude && (kr = kr.$$boundTransclude), qe || (Ue = (Ke = an) && Ke[0], qe = Ue && ft(Ue) !== \"foreignobject\" && i.call(Ue).match(/SVG/) ? \"svg\" : \"html\"), Qe = qe !== \"html\" ? x(Qs(qe, x(\"<div></div>\").append(Yt).html())) : Je ? qn.clone.call(Yt) : Yt, En)\n                  for (var Hr in En)\n                    Qe.data(\"$\" + Hr + \"Controller\", En[Hr].instance);\n                return br.$$addScopeInfo(Qe, mr), Je && Je(Qe, mr), ze && ze(mr, Qe, Qe, kr), Je || (Yt = ze = null), Qe;\n              };\n            }\n            function cr(Yt, Kt, te, Ce, Pe, ze) {\n              for (var qe, mr, Je, Ie, Ke, Ue, Qe, kr = [], En = re(Yt) || Yt instanceof x, an = 0; an < Yt.length; an++)\n                qe = new cn(), y === 11 && Jr(Yt, an, En), (Je = (mr = Ln(Yt[an], [], qe, an === 0 ? Ce : void 0, Pe)).length ? zn(mr, Yt[an], qe, Kt, te, null, [], [], ze) : null) && Je.scope && br.$$addScopeClass(qe.$$element), Ke = Je && Je.terminal || !(Ie = Yt[an].childNodes) || !Ie.length ? null : cr(\n                  Ie,\n                  Je ? (Je.transcludeOnThisElement || !Je.templateOnThisElement) && Je.transclude : Kt\n                ), (Je || Ke) && (kr.push(an, Je, Ke), Ue = !0, Qe = Qe || Je), ze = null;\n              return Ue ? function(Hr, lr, Bn, Gr) {\n                var pn, si, hn, en, yi, Ui, Vi, Oo, Jn;\n                if (Qe) {\n                  var jo = lr.length;\n                  for (Jn = new Array(jo), yi = 0; yi < kr.length; yi += 3)\n                    Vi = kr[yi], Jn[Vi] = lr[Vi];\n                } else Jn = lr;\n                for (yi = 0, Ui = kr.length; yi < Ui; )\n                  hn = Jn[kr[yi++]], pn = kr[yi++], si = kr[yi++], pn ? (pn.scope ? (en = Hr.$new(), br.$$addScopeInfo(x(hn), en)) : en = Hr, Oo = pn.transcludeOnThisElement ? An(Hr, pn.transclude, Gr) : !pn.templateOnThisElement && Gr ? Gr : !Gr && Kt ? An(Hr, Kt) : null, pn(si, en, hn, Bn, Oo)) : si && si(Hr, hn.childNodes, void 0, Gr);\n              } : null;\n            }\n            function Jr(Yt, Kt, te) {\n              var Ce, Pe = Yt[Kt], ze = Pe.parentNode;\n              if (Pe.nodeType === Gi)\n                for (; (Ce = ze ? Pe.nextSibling : Yt[Kt + 1]) && Ce.nodeType === Gi; )\n                  Pe.nodeValue = Pe.nodeValue + Ce.nodeValue, Ce.parentNode && Ce.parentNode.removeChild(Ce), te && Ce === Yt[Kt + 1] && Yt.splice(Kt + 1, 1);\n            }\n            function An(Yt, Kt, te) {\n              function Ce(qe, mr, Je, Ie, Ke) {\n                return qe || ((qe = Yt.$new(!1, Ke)).$$transcluded = !0), Kt(qe, mr, {\n                  parentBoundTranscludeFn: te,\n                  transcludeControllers: Je,\n                  futureParentElement: Ie\n                });\n              }\n              var Pe = Ce.$$slots = ur();\n              for (var ze in Kt.$$slots)\n                Kt.$$slots[ze] ? Pe[ze] = An(Yt, Kt.$$slots[ze], te) : Pe[ze] = null;\n              return Ce;\n            }\n            function Ln(Yt, Kt, te, Ce, Pe) {\n              var ze, qe, mr, Je = Yt.nodeType, Ie = te.$attr;\n              switch (Je) {\n                case 1:\n                  Ko(Kt, Br(qe = ft(Yt)), \"E\", Ce, Pe);\n                  for (var Ke, Ue, Qe, kr, En, an = Yt.attributes, Hr = 0, lr = an && an.length; Hr < lr; Hr++) {\n                    var Bn, Gr = !1, pn = !1, si = !1, hn = !1, en = !1;\n                    Ue = (Ke = an[Hr]).name, kr = Ke.value, (En = (Qe = Br(Ue.toLowerCase())).match(kn)) ? (si = En[1] === \"Attr\", hn = En[1] === \"Prop\", en = En[1] === \"On\", Ue = Ue.replace(Rn, \"\").toLowerCase().substr(4 + En[1].length).replace(/_(.)/g, function(yi, Ui) {\n                      return Ui.toUpperCase();\n                    })) : (Bn = Qe.match(zo)) && Zo(Bn[1]) && (Gr = Ue, pn = Ue.substr(0, Ue.length - 5) + \"end\", Ue = Ue.substr(0, Ue.length - 6)), hn || en ? (te[Qe] = kr, Ie[Qe] = Ke.name, hn ? _s(Yt, Kt, Qe, Ue) : Sl(Kt, Qe, Ue)) : (Ie[Qe = Br(Ue.toLowerCase())] = Ue, !si && te.hasOwnProperty(Qe) || (te[Qe] = kr, Oi(Yt, Qe) && (te[Qe] = !0)), mu(Yt, Kt, kr, Qe, si), Ko(Kt, Qe, \"A\", Ce, Pe, Gr, pn));\n                  }\n                  if (qe === \"input\" && Yt.getAttribute(\"type\") === \"hidden\" && Yt.setAttribute(\"autocomplete\", \"off\"), !He)\n                    break;\n                  if (gt(mr = Yt.className) && (mr = mr.animVal), St(mr) && mr !== \"\")\n                    for (; ze = q.exec(mr); )\n                      Ko(Kt, Qe = Br(ze[2]), \"C\", Ce, Pe) && (te[Qe] = kt(ze[3])), mr = mr.substr(ze.index + ze[0].length);\n                  break;\n                case Gi:\n                  (function(yi, Ui) {\n                    var Vi = Bt(Ui, !0);\n                    Vi && yi.push({\n                      priority: 0,\n                      compile: function(Oo) {\n                        var Jn = Oo.parent(), jo = !!Jn.length;\n                        return jo && br.$$addBindingClass(Jn), function(la, Pa) {\n                          var Ea = Pa.parent();\n                          jo || br.$$addBindingClass(Ea), br.$$addBindingInfo(Ea, Vi.expressions), la.$watch(Vi, function(Cl) {\n                            Pa[0].nodeValue = Cl;\n                          });\n                        };\n                      }\n                    });\n                  })(Kt, Yt.nodeValue);\n                  break;\n                case 8:\n                  if (!Xe) break;\n                  (function(yi, Ui, Vi, Oo, Jn) {\n                    try {\n                      var jo = N.exec(yi.nodeValue);\n                      if (jo) {\n                        var la = Br(jo[1]);\n                        Ko(Ui, la, \"M\", Oo, Jn) && (Vi[la] = kt(jo[2]));\n                      }\n                    } catch {\n                    }\n                  })(Yt, Kt, te, Ce, Pe);\n              }\n              return Kt.sort(ai), Kt;\n            }\n            function er(Yt, Kt, te) {\n              var Ce = [], Pe = 0;\n              if (Kt && Yt.hasAttribute && Yt.hasAttribute(Kt))\n                do {\n                  if (!Yt)\n                    throw Be(\n                      \"uterdir\",\n                      \"Unterminated attribute, found '{0}' but no matching '{1}' found.\",\n                      Kt,\n                      te\n                    );\n                  Yt.nodeType === 1 && (Yt.hasAttribute(Kt) && Pe++, Yt.hasAttribute(te) && Pe--), Ce.push(Yt), Yt = Yt.nextSibling;\n                } while (Pe > 0);\n              else Ce.push(Yt);\n              return x(Ce);\n            }\n            function Xo(Yt, Kt, te) {\n              return function(Ce, Pe, ze, qe, mr) {\n                return Pe = er(Pe[0], Kt, te), Yt(Ce, Pe, ze, qe, mr);\n              };\n            }\n            function Qn(Yt, Kt, te, Ce, Pe, ze) {\n              var qe;\n              return Yt ? br(Kt, te, Ce, Pe, ze) : function() {\n                return qe || (qe = br(Kt, te, Ce, Pe, ze), Kt = te = ze = null), qe.apply(this, arguments);\n              };\n            }\n            function zn(Yt, Kt, te, Ce, Pe, ze, qe, mr, Je) {\n              Je = Je || {};\n              for (var Ie, Ke, Ue, Qe, kr, En = -Number.MAX_VALUE, an = Je.newScopeDirective, Hr = Je.controllerDirectives, lr = Je.newIsolateScopeDirective, Bn = Je.templateDirective, Gr = Je.nonTlbTranscludeDirective, pn = !1, si = !1, hn = Je.hasElementTranscludeDirective, en = te.$$element = x(Kt), yi = ze, Ui = Ce, Vi = !1, Oo = !1, Jn = 0, jo = Yt.length; Jn < jo; Jn++) {\n                var la = (Ie = Yt[Jn]).$$start, Pa = Ie.$$end;\n                if (la && (en = er(Kt, la, Pa)), Ue = void 0, En > Ie.priority)\n                  break;\n                if ((kr = Ie.scope) && (Ie.templateUrl || (gt(kr) ? (Un(\"new/isolated scope\", lr || an, Ie, en), lr = Ie) : Un(\"new/isolated scope\", lr, Ie, en)), an = an || Ie), Ke = Ie.name, !Vi && (Ie.replace && (Ie.templateUrl || Ie.template) || Ie.transclude && !Ie.$$tlb)) {\n                  for (var Ea, Cl = Jn + 1; Ea = Yt[Cl++]; )\n                    if (Ea.transclude && !Ea.$$tlb || Ea.replace && (Ea.templateUrl || Ea.template)) {\n                      Oo = !0;\n                      break;\n                    }\n                  Vi = !0;\n                }\n                if (!Ie.templateUrl && Ie.controller && (Hr = Hr || ur(), Un(\"'\" + Ke + \"' controller\", Hr[Ke], Ie, en), Hr[Ke] = Ie), kr = Ie.transclude)\n                  if (pn = !0, Ie.$$tlb || (Un(\"transclusion\", Gr, Ie, en), Gr = Ie), kr === \"element\")\n                    hn = !0, En = Ie.priority, Ue = en, en = te.$$element = x(br.$$createComment(Ke, te[Ke])), Kt = en[0], Xa(Pe, ir(Ue), Kt), Ui = Qn(Oo, Ue, Ce, En, yi && yi.name, {\n                      nonTlbTranscludeDirective: Gr\n                    });\n                  else {\n                    var Sa = ur();\n                    if (gt(kr)) {\n                      Ue = e.document.createDocumentFragment();\n                      var bu = ur(), $l = ur();\n                      for (var _l in s(kr, function(rn, jn) {\n                        var ta = rn.charAt(0) === \"?\";\n                        rn = ta ? rn.substring(1) : rn, bu[rn] = jn, Sa[jn] = null, $l[jn] = ta;\n                      }), s(en.contents(), function(rn) {\n                        var jn = bu[Br(ft(rn))];\n                        jn ? ($l[jn] = !0, Sa[jn] = Sa[jn] || e.document.createDocumentFragment(), Sa[jn].appendChild(rn)) : Ue.appendChild(rn);\n                      }), s($l, function(rn, jn) {\n                        if (!rn)\n                          throw Be(\n                            \"reqslot\",\n                            \"Required transclusion slot `{0}` was not filled.\",\n                            jn\n                          );\n                      }), Sa)\n                        if (Sa[_l]) {\n                          var Ol = x(Sa[_l].childNodes);\n                          Sa[_l] = Qn(Oo, Ol, Ce);\n                        }\n                      Ue = x(Ue.childNodes);\n                    } else Ue = x(Ci(Kt)).contents();\n                    en.empty(), (Ui = Qn(Oo, Ue, Ce, void 0, void 0, {\n                      needsNewScope: Ie.$$isolateScope || Ie.$$newScope\n                    })).$$slots = Sa;\n                  }\n                if (Ie.template)\n                  if (si = !0, Un(\"template\", Bn, Ie, en), Bn = Ie, kr = ne(Ie.template) ? Ie.template(en, te) : Ie.template, kr = On(kr), Ie.replace) {\n                    if (yi = Ie, Ue = Eo(kr) ? [] : rt(Qs(Ie.templateNamespace, kt(kr))), Kt = Ue[0], Ue.length !== 1 || Kt.nodeType !== 1)\n                      throw Be(\n                        \"tplrt\",\n                        \"Template for directive '{0}' must have exactly one root element. {1}\",\n                        Ke,\n                        \"\"\n                      );\n                    Xa(Pe, en, Kt);\n                    var jl = { $attr: {} }, Tl = Ln(Kt, [], jl), Bu = Yt.splice(Jn + 1, Yt.length - (Jn + 1));\n                    (lr || an) && Ya(Tl, lr, an), Yt = Yt.concat(Tl).concat(Bu), Ta(te, jl), jo = Yt.length;\n                  } else en.html(kr);\n                if (Ie.templateUrl)\n                  si = !0, Un(\"template\", Bn, Ie, en), Bn = Ie, Ie.replace && (yi = Ie), Qa = Zs(\n                    Yt.splice(Jn, Yt.length - Jn),\n                    en,\n                    te,\n                    Pe,\n                    pn && Ui,\n                    qe,\n                    mr,\n                    {\n                      controllerDirectives: Hr,\n                      newScopeDirective: an !== Ie && an,\n                      newIsolateScopeDirective: lr,\n                      templateDirective: Bn,\n                      nonTlbTranscludeDirective: Gr\n                    }\n                  ), jo = Yt.length;\n                else if (Ie.compile)\n                  try {\n                    Qe = Ie.compile(en, te, Ui);\n                    var Os = Ie.$$originalDirective || Ie;\n                    ne(Qe) ? yu(null, Ar(Os, Qe), la, Pa) : Qe && yu(Ar(Os, Qe.pre), Ar(Os, Qe.post), la, Pa);\n                  } catch (rn) {\n                    Qt(rn, nn(en));\n                  }\n                Ie.terminal && (Qa.terminal = !0, En = Math.max(En, Ie.priority));\n              }\n              return Qa.scope = an && an.scope === !0, Qa.transcludeOnThisElement = pn, Qa.templateOnThisElement = si, Qa.transclude = Ui, Je.hasElementTranscludeDirective = hn, Qa;\n              function yu(rn, jn, ta, Pl) {\n                rn && (ta && (rn = Xo(rn, ta, Pl)), rn.require = Ie.require, rn.directiveName = Ke, (lr === Ie || Ie.$$isolateScope) && (rn = _o(rn, { isolateScope: !0 })), qe.push(rn)), jn && (ta && (jn = Xo(jn, ta, Pl)), jn.require = Ie.require, jn.directiveName = Ke, (lr === Ie || Ie.$$isolateScope) && (jn = _o(jn, { isolateScope: !0 })), mr.push(jn));\n              }\n              function Qa(rn, jn, ta, Pl, Da) {\n                var ua, xu, ca, da, ss, fa, js, uo, Ca, wu;\n                for (var ku in Kt === ta ? (Ca = te, uo = te.$$element) : Ca = new cn(uo = x(ta), te), ss = jn, lr ? da = jn.$new(!0) : an && (ss = jn.$parent), Da && ((js = function(Hi, li, b, C) {\n                  var B;\n                  if (we(Hi) || (C = b, b = li, li = Hi, Hi = void 0), hn && (B = fa), b || (b = hn ? uo.parent() : uo), !C) return Da(Hi, li, B, b, Ks);\n                  var J = Da.$$slots[C];\n                  if (J) return J(Hi, li, B, b, Ks);\n                  if (ct(J))\n                    throw Be(\n                      \"noslot\",\n                      'No parent directive that requires a transclusion with slot name \"{0}\". Element: {1}',\n                      C,\n                      nn(uo)\n                    );\n                }).$$boundTransclude = Da, js.isSlotFilled = function(Hi) {\n                  return !!Da.$$slots[Hi];\n                }), Hr && (fa = function(Hi, li, b, C, B, J, ut) {\n                  var Et = ur();\n                  for (var Lt in C) {\n                    var Gt = C[Lt], fe = {\n                      $scope: Gt === ut || Gt.$$isolateScope ? B : J,\n                      $element: Hi,\n                      $attrs: li,\n                      $transclude: b\n                    }, $e = Gt.controller;\n                    $e === \"@\" && ($e = li[Gt.name]);\n                    var _e = Ot($e, fe, !0, Gt.controllerAs);\n                    Et[Gt.name] = _e, Hi.data(\"$\" + Gt.name + \"Controller\", _e.instance);\n                  }\n                  return Et;\n                }(uo, Ca, js, Hr, da, jn, lr)), lr && (br.$$addScopeInfo(\n                  uo,\n                  da,\n                  !0,\n                  !(Bn && (Bn === lr || Bn === lr.$$originalDirective))\n                ), br.$$addScopeClass(uo, !0), da.$$isolateBindings = lr.$$isolateBindings, (wu = vu(jn, Ca, da, da.$$isolateBindings, lr)).removeWatches && da.$on(\"$destroy\", wu.removeWatches)), fa) {\n                  var Dl = Hr[ku], Ts = fa[ku], Rl = Dl.$$bindings.bindToController;\n                  Ts.instance = Ts(), uo.data(\"$\" + Dl.name + \"Controller\", Ts.instance), Ts.bindingInfo = vu(ss, Ca, Ts.instance, Rl, Dl);\n                }\n                for (s(Hr, function(Hi, li) {\n                  var b = Hi.require;\n                  Hi.bindToController && !re(b) && gt(b) && z(fa[li].instance, Ai(li, b, uo, fa));\n                }), s(fa, function(Hi) {\n                  var li = Hi.instance;\n                  if (ne(li.$onChanges))\n                    try {\n                      li.$onChanges(Hi.bindingInfo.initialChanges);\n                    } catch (b) {\n                      Qt(b);\n                    }\n                  if (ne(li.$onInit))\n                    try {\n                      li.$onInit();\n                    } catch (b) {\n                      Qt(b);\n                    }\n                  ne(li.$doCheck) && (ss.$watch(function() {\n                    li.$doCheck();\n                  }), li.$doCheck()), ne(li.$onDestroy) && ss.$on(\"$destroy\", function() {\n                    li.$onDestroy();\n                  });\n                }), ua = 0, xu = qe.length; ua < xu; ua++)\n                  Za(\n                    ca = qe[ua],\n                    ca.isolateScope ? da : jn,\n                    uo,\n                    Ca,\n                    ca.require && Ai(ca.directiveName, ca.require, uo, fa),\n                    js\n                  );\n                var Ks = jn;\n                for (lr && (lr.template || lr.templateUrl === null) && (Ks = da), rn && rn(Ks, ta.childNodes, void 0, Da), ua = mr.length - 1; ua >= 0; ua--)\n                  Za(\n                    ca = mr[ua],\n                    ca.isolateScope ? da : jn,\n                    uo,\n                    Ca,\n                    ca.require && Ai(ca.directiveName, ca.require, uo, fa),\n                    js\n                  );\n                s(fa, function(Hi) {\n                  var li = Hi.instance;\n                  ne(li.$postLink) && li.$postLink();\n                });\n              }\n            }\n            function Ai(Yt, Kt, te, Ce) {\n              var Pe;\n              if (St(Kt)) {\n                var ze = Kt.match(H), qe = Kt.substring(ze[0].length), mr = ze[1] || ze[3], Je = ze[2] === \"?\";\n                if (mr === \"^^\" ? te = te.parent() : Pe = (Pe = Ce && Ce[qe]) && Pe.instance, !Pe) {\n                  var Ie = \"$\" + qe + \"Controller\";\n                  Pe = mr === \"^^\" && te[0] && te[0].nodeType === 9 ? null : mr ? te.inheritedData(Ie) : te.data(Ie);\n                }\n                if (!Pe && !Je)\n                  throw Be(\n                    \"ctreq\",\n                    \"Controller '{0}', required by directive '{1}', can't be found!\",\n                    qe,\n                    Yt\n                  );\n              } else if (re(Kt)) {\n                Pe = [];\n                for (var Ke = 0, Ue = Kt.length; Ke < Ue; Ke++)\n                  Pe[Ke] = Ai(Yt, Kt[Ke], te, Ce);\n              } else\n                gt(Kt) && (Pe = {}, s(Kt, function(Qe, kr) {\n                  Pe[kr] = Ai(Yt, Qe, te, Ce);\n                }));\n              return Pe || null;\n            }\n            function Ya(Yt, Kt, te) {\n              for (var Ce = 0, Pe = Yt.length; Ce < Pe; Ce++)\n                Yt[Ce] = tt(Yt[Ce], { $$isolateScope: Kt, $$newScope: te });\n            }\n            function Ko(Yt, Kt, te, Ce, Pe, ze, qe) {\n              if (Kt === Pe) return null;\n              var mr = null;\n              if (D.hasOwnProperty(Kt)) {\n                for (var Je, Ie = _t.get(Kt + \"Directive\"), Ke = 0, Ue = Ie.length; Ke < Ue; Ke++)\n                  if (Je = Ie[Ke], (ct(Ce) || Ce > Je.priority) && Je.restrict.indexOf(te) !== -1) {\n                    if (ze && (Je = tt(Je, { $$start: ze, $$end: qe })), !Je.$$bindings) {\n                      var Qe = Je.$$bindings = it(Je, Je.name);\n                      gt(Qe.isolateScope) && (Je.$$isolateBindings = Qe.isolateScope);\n                    }\n                    Yt.push(Je), mr = Je;\n                  }\n              }\n              return mr;\n            }\n            function Zo(Yt) {\n              if (D.hasOwnProperty(Yt)) {\n                for (var Kt = _t.get(Yt + \"Directive\"), te = 0, Ce = Kt.length; te < Ce; te++)\n                  if (Kt[te].multiElement) return !0;\n              }\n              return !1;\n            }\n            function Ta(Yt, Kt) {\n              var te = Kt.$attr, Ce = Yt.$attr;\n              s(Yt, function(Pe, ze) {\n                ze.charAt(0) !== \"$\" && (Kt[ze] && Kt[ze] !== Pe && (Pe.length ? Pe += (ze === \"style\" ? \";\" : \" \") + Kt[ze] : Pe = Kt[ze]), Yt.$set(ze, Pe, !0, te[ze]));\n              }), s(Kt, function(Pe, ze) {\n                Yt.hasOwnProperty(ze) || ze.charAt(0) === \"$\" || (Yt[ze] = Pe, ze !== \"class\" && ze !== \"style\" && (Ce[ze] = te[ze]));\n              });\n            }\n            function Zs(Yt, Kt, te, Ce, Pe, ze, qe, mr) {\n              var Je, Ie, Ke = [], Ue = Kt[0], Qe = Yt.shift(), kr = tt(Qe, {\n                templateUrl: null,\n                transclude: null,\n                replace: null,\n                $$originalDirective: Qe\n              }), En = ne(Qe.templateUrl) ? Qe.templateUrl(Kt, te) : Qe.templateUrl, an = Qe.templateNamespace;\n              return Kt.empty(), At(En).then(function(Hr) {\n                var lr, Bn, Gr, pn;\n                if (Hr = On(Hr), Qe.replace) {\n                  if (Gr = Eo(Hr) ? [] : rt(Qs(an, kt(Hr))), lr = Gr[0], Gr.length !== 1 || lr.nodeType !== 1)\n                    throw Be(\n                      \"tplrt\",\n                      \"Template for directive '{0}' must have exactly one root element. {1}\",\n                      Qe.name,\n                      En\n                    );\n                  Bn = { $attr: {} }, Xa(Ce, Kt, lr);\n                  var si = Ln(lr, [], Bn);\n                  gt(Qe.scope) && Ya(si, !0), Yt = si.concat(Yt), Ta(te, Bn);\n                } else lr = Ue, Kt.html(Hr);\n                for (Yt.unshift(kr), Je = zn(Yt, lr, te, Pe, Kt, Qe, ze, qe, mr), s(Ce, function(Jn, jo) {\n                  Jn === lr && (Ce[jo] = Kt[0]);\n                }), Ie = cr(Kt[0].childNodes, Pe); Ke.length; ) {\n                  var hn = Ke.shift(), en = Ke.shift(), yi = Ke.shift(), Ui = Ke.shift(), Vi = Kt[0];\n                  if (!hn.$$destroyed) {\n                    if (en !== Ue) {\n                      var Oo = en.className;\n                      mr.hasElementTranscludeDirective && Qe.replace || (Vi = Ci(lr)), Xa(yi, x(en), Vi), Pr(x(Vi), Oo);\n                    }\n                    pn = Je.transcludeOnThisElement ? An(hn, Je.transclude, Ui) : Ui, Je(Ie, hn, Vi, Ce, pn);\n                  }\n                }\n                Ke = null;\n              }).catch(function(Hr) {\n                be(Hr) && Qt(Hr);\n              }), function(Hr, lr, Bn, Gr, pn) {\n                var si = pn;\n                lr.$$destroyed || (Ke ? Ke.push(lr, Bn, Gr, si) : (Je.transcludeOnThisElement && (si = An(lr, Je.transclude, pn)), Je(Ie, lr, Bn, Gr, si)));\n              };\n            }\n            function ai(Yt, Kt) {\n              var te = Kt.priority - Yt.priority;\n              return te !== 0 ? te : Yt.name !== Kt.name ? Yt.name < Kt.name ? -1 : 1 : Yt.index - Kt.index;\n            }\n            function Un(Yt, Kt, te, Ce) {\n              function Pe(ze) {\n                return ze ? \" (module: \" + ze + \")\" : \"\";\n              }\n              if (Kt)\n                throw Be(\n                  \"multidir\",\n                  \"Multiple directives [{0}{1}, {2}{3}] asking for {4} on: {5}\",\n                  Kt.name,\n                  Pe(Kt.$$moduleName),\n                  te.name,\n                  Pe(te.$$moduleName),\n                  Yt,\n                  nn(Ce)\n                );\n            }\n            function Qs(Yt, Kt) {\n              switch (Yt = n(Yt || \"html\")) {\n                case \"svg\":\n                case \"math\":\n                  var te = e.document.createElement(\"div\");\n                  return te.innerHTML = \"<\" + Yt + \">\" + Kt + \"</\" + Yt + \">\", te.childNodes[0].childNodes;\n                default:\n                  return Kt;\n              }\n            }\n            function gu(Yt) {\n              return Cr(qt.valueOf(Yt), \"ng-prop-srcset\");\n            }\n            function _s(Yt, Kt, te, Ce) {\n              if (F.test(Ce))\n                throw Be(\n                  \"nodomevents\",\n                  \"Property bindings for HTML DOM event properties are disallowed\"\n                );\n              var Pe = ft(Yt), ze = function(mr, Je) {\n                var Ie = Je.toLowerCase();\n                return oe[mr + \"|\" + Ie] || oe[\"*|\" + Ie];\n              }(Pe, Ce), qe = at;\n              Ce !== \"srcset\" || Pe !== \"img\" && Pe !== \"source\" ? ze && (qe = qt.getTrusted.bind(qt, ze)) : qe = gu, Kt.push({\n                priority: 100,\n                compile: function(mr, Je) {\n                  var Ie = wt(Je[te]), Ke = wt(Je[te], function(Ue) {\n                    return qt.valueOf(Ue);\n                  });\n                  return {\n                    pre: function(Ue, Qe) {\n                      function kr() {\n                        var En = Ie(Ue);\n                        Qe[0][Ce] = qe(En);\n                      }\n                      kr(), Ue.$watch(Ke, kr);\n                    }\n                  };\n                }\n              });\n            }\n            function Sl(Yt, Kt, te) {\n              Yt.push(Es(wt, Ft, Qt, Kt, te, !1));\n            }\n            function mu(Yt, Kt, te, Ce, Pe) {\n              var ze = ft(Yt), qe = function(Ke, Ue) {\n                return Ue === \"srcdoc\" ? qt.HTML : Ue === \"src\" || Ue === \"ngSrc\" ? [\"img\", \"video\", \"audio\", \"source\", \"track\"].indexOf(Ke) === -1 ? qt.RESOURCE_URL : qt.MEDIA_URL : Ue === \"xlinkHref\" ? Ke === \"image\" ? qt.MEDIA_URL : Ke === \"a\" ? qt.URL : qt.RESOURCE_URL : Ke === \"form\" && Ue === \"action\" || Ke === \"base\" && Ue === \"href\" || Ke === \"link\" && Ue === \"href\" ? qt.RESOURCE_URL : Ke !== \"a\" || Ue !== \"href\" && Ue !== \"ngHref\" ? void 0 : qt.URL;\n              }(ze, Ce), mr = !Pe, Je = X[Ce] || Pe, Ie = Bt(te, mr, qe, Je);\n              if (Ie) {\n                if (Ce === \"multiple\" && ze === \"select\")\n                  throw Be(\n                    \"selmulti\",\n                    \"Binding to the 'multiple' attribute is not supported. Element: {0}\",\n                    nn(Yt)\n                  );\n                if (F.test(Ce))\n                  throw Be(\n                    \"nodomevents\",\n                    \"Interpolations for HTML DOM event attributes are disallowed\"\n                  );\n                Kt.push({\n                  priority: 100,\n                  compile: function() {\n                    return {\n                      pre: function(Ke, Ue, Qe) {\n                        var kr = Qe.$$observers || (Qe.$$observers = ur()), En = Qe[Ce];\n                        En !== te && (Ie = En && Bt(En, !0, qe, Je), te = En), Ie && (Qe[Ce] = Ie(Ke), (kr[Ce] || (kr[Ce] = [])).$$inter = !0, (Qe.$$observers && Qe.$$observers[Ce].$$scope || Ke).$watch(Ie, function(an, Hr) {\n                          Ce === \"class\" && an !== Hr ? Qe.$updateClass(an, Hr) : Qe.$set(Ce, an);\n                        }));\n                      }\n                    };\n                  }\n                });\n              }\n            }\n            function Xa(Yt, Kt, te) {\n              var Ce, Pe, ze = Kt[0], qe = Kt.length, mr = ze.parentNode;\n              if (Yt) {\n                for (Ce = 0, Pe = Yt.length; Ce < Pe; Ce++)\n                  if (Yt[Ce] === ze) {\n                    Yt[Ce++] = te;\n                    for (var Je = Ce, Ie = Je + qe - 1, Ke = Yt.length; Je < Ke; Je++, Ie++)\n                      Ie < Ke ? Yt[Je] = Yt[Ie] : delete Yt[Je];\n                    Yt.length -= qe - 1, Yt.context === ze && (Yt.context = te);\n                    break;\n                  }\n              }\n              mr && mr.replaceChild(te, ze);\n              var Ue = e.document.createDocumentFragment();\n              for (Ce = 0; Ce < qe; Ce++) Ue.appendChild(Kt[Ce]);\n              for (x.hasData(ze) && (x.data(te, x.data(ze)), x(ze).off(\"$destroy\")), x.cleanData(Ue.querySelectorAll(\"*\")), Ce = 1; Ce < qe; Ce++)\n                delete Kt[Ce];\n              Kt[0] = te, Kt.length = 1;\n            }\n            function _o(Yt, Kt) {\n              return z(\n                function() {\n                  return Yt.apply(null, arguments);\n                },\n                Yt,\n                Kt\n              );\n            }\n            function Za(Yt, Kt, te, Ce, Pe, ze) {\n              try {\n                Yt(Kt, te, Ce, Pe, ze);\n              } catch (qe) {\n                Qt(qe, nn(te));\n              }\n            }\n            function Js(Yt, Kt) {\n              if (Ct)\n                throw Be(\n                  \"missingattr\",\n                  \"Attribute '{0}' of '{1}' is non-optional and must be set!\",\n                  Yt,\n                  Kt\n                );\n            }\n            function vu(Yt, Kt, te, Ce, Pe) {\n              var ze, qe = [], mr = {};\n              function Je(Ke, Ue, Qe) {\n                ne(te.$onChanges) && !ye(Ue, Qe) && (ie || (Yt.$$postDigest(vr), ie = []), ze || (ze = {}, ie.push(Ie)), ze[Ke] && (Qe = ze[Ke].previousValue), ze[Ke] = new bn(Qe, Ue));\n              }\n              function Ie() {\n                te.$onChanges(ze), ze = void 0;\n              }\n              return s(Ce, function(Ke, Ue) {\n                var Qe, kr, En, an, Hr, lr = Ke.attrName, Bn = Ke.optional;\n                switch (Ke.mode) {\n                  case \"@\":\n                    Bn || a.call(Kt, lr) || (Js(lr, Pe.name), te[Ue] = Kt[lr] = void 0), Hr = Kt.$observe(lr, function(hn) {\n                      if (St(hn) || ae(hn)) {\n                        var en = te[Ue];\n                        Je(Ue, hn, en), te[Ue] = hn;\n                      }\n                    }), Kt.$$observers[lr].$$scope = Yt, St(Qe = Kt[lr]) ? te[Ue] = Bt(Qe)(Yt) : ae(Qe) && (te[Ue] = Qe), mr[Ue] = new bn(We, te[Ue]), qe.push(Hr);\n                    break;\n                  case \"=\":\n                    if (!a.call(Kt, lr)) {\n                      if (Bn) break;\n                      Js(lr, Pe.name), Kt[lr] = void 0;\n                    }\n                    if (Bn && !Kt[lr]) break;\n                    kr = wt(Kt[lr]), an = kr.literal ? pe : ye, En = kr.assign || function() {\n                      throw Qe = te[Ue] = kr(Yt), Be(\n                        \"nonassign\",\n                        \"Expression '{0}' in attribute '{1}' used with directive '{2}' is non-assignable!\",\n                        Kt[lr],\n                        lr,\n                        Pe.name\n                      );\n                    }, Qe = te[Ue] = kr(Yt);\n                    var Gr = function(hn) {\n                      return an(hn, te[Ue]) || (an(hn, Qe) ? En(Yt, hn = te[Ue]) : te[Ue] = hn), Qe = hn;\n                    };\n                    Gr.$stateful = !0, Hr = Ke.collection ? Yt.$watchCollection(Kt[lr], Gr) : Yt.$watch(wt(Kt[lr], Gr), null, kr.literal), qe.push(Hr);\n                    break;\n                  case \"<\":\n                    if (!a.call(Kt, lr)) {\n                      if (Bn) break;\n                      Js(lr, Pe.name), Kt[lr] = void 0;\n                    }\n                    if (Bn && !Kt[lr]) break;\n                    var pn = (kr = wt(Kt[lr])).literal, si = te[Ue] = kr(Yt);\n                    mr[Ue] = new bn(We, te[Ue]), Hr = Yt[Ke.collection ? \"$watchCollection\" : \"$watch\"](\n                      kr,\n                      function(hn, en) {\n                        if (en === hn) {\n                          if (en === si || pn && pe(en, si)) return;\n                          en = si;\n                        }\n                        Je(Ue, hn, en), te[Ue] = hn;\n                      }\n                    ), qe.push(Hr);\n                    break;\n                  case \"&\":\n                    if (Bn || a.call(Kt, lr) || Js(lr, Pe.name), (kr = Kt.hasOwnProperty(lr) ? wt(Kt[lr]) : Z) === Z && Bn)\n                      break;\n                    te[Ue] = function(hn) {\n                      return kr(Yt, hn);\n                    };\n                }\n              }), {\n                initialChanges: mr,\n                removeWatches: qe.length && function() {\n                  for (var Ke = 0, Ue = qe.length; Ke < Ue; ++Ke) qe[Ke]();\n                }\n              };\n            }\n          }\n        ];\n      }\n      function bn(m, O) {\n        this.previousValue = m, this.currentValue = O;\n      }\n      tr.$inject = [\"$provide\", \"$$sanitizeUriProvider\"], bn.prototype.isFirstChange = function() {\n        return this.previousValue === We;\n      };\n      var Rn = /^((?:x|data)[:\\-_])/i, Qi = /[:\\-_]+(.)/g;\n      function Br(m) {\n        return m.replace(Rn, \"\").replace(Qi, function(O, D, N) {\n          return N ? D.toUpperCase() : D;\n        });\n      }\n      function Or(m, O) {\n        var D = \"\", N = m.split(/\\s+/), q = O.split(/\\s+/);\n        t: for (var X = 0; X < N.length; X++) {\n          for (var H = N[X], F = 0; F < q.length; F++)\n            if (H === q[F]) continue t;\n          D += (D.length > 0 ? \" \" : \"\") + H;\n        }\n        return D;\n      }\n      function rt(m) {\n        var O = (m = x(m)).length;\n        if (O <= 1) return m;\n        for (; O--; ) {\n          var D = m[O];\n          (D.nodeType === 8 || D.nodeType === Gi && D.nodeValue.trim() === \"\") && l.call(m, O, 1);\n        }\n        return m;\n      }\n      var pt = E(\"$controller\"), $t = /^(\\S+)(\\s+as\\s+([\\w$]+))?$/;\n      function It(m, O) {\n        if (St(m)) {\n          var D = $t.exec(m);\n          if (D) return D[3];\n        }\n      }\n      function ee() {\n        var m = {};\n        this.has = function(O) {\n          return m.hasOwnProperty(O);\n        }, this.register = function(O, D) {\n          ni(O, \"controller\"), gt(O) ? z(m, O) : m[O] = D;\n        }, this.$get = [\n          \"$injector\",\n          function(O) {\n            return function(N, q, X, H) {\n              var F, Q, K, it;\n              if (X = X === !0, H && St(H) && (it = H), St(N)) {\n                if (!(Q = N.match($t)))\n                  throw pt(\n                    \"ctrlfmt\",\n                    \"Badly formed controller string '{0}'. Must match `__name__ as __id__` or `__name__`.\",\n                    N\n                  );\n                if (K = Q[1], it = it || Q[3], !(N = m.hasOwnProperty(K) ? m[K] : function(Ct, jt, Tt) {\n                  if (!jt) return Ct;\n                  for (var Vt, oe = jt.split(\".\"), _t = Ct, Bt = oe.length, Qt = 0; Qt < Bt; Qt++)\n                    Vt = oe[Qt], Ct && (Ct = (_t = Ct)[Vt]);\n                  return !Tt && ne(Ct) ? Ar(_t, Ct) : Ct;\n                }(q.$scope, K, !0)))\n                  throw pt(\n                    \"ctrlreg\",\n                    \"The controller with the name '{0}' is not registered.\",\n                    K\n                  );\n                In(N, K, !0);\n              }\n              if (X) {\n                var st = (re(N) ? N[N.length - 1] : N).prototype;\n                return F = Object.create(st || null), it && D(q, it, F, K || N.name), z(\n                  function() {\n                    var Ct = O.invoke(N, F, q, K);\n                    return Ct !== F && (gt(Ct) || ne(Ct)) && (F = Ct, it && D(q, it, F, K || N.name)), F;\n                  },\n                  { instance: F, identifier: it }\n                );\n              }\n              return F = O.instantiate(N, q, K), it && D(q, it, F, K || N.name), F;\n            };\n            function D(N, q, X, H) {\n              if (!N || !gt(N.$scope))\n                throw E(\"$controller\")(\n                  \"noscp\",\n                  \"Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.\",\n                  H,\n                  q\n                );\n              N.$scope[q] = X;\n            }\n          }\n        ];\n      }\n      function Ht() {\n        this.$get = [\n          \"$window\",\n          function(m) {\n            return x(m.document);\n          }\n        ];\n      }\n      function he() {\n        this.$get = [\n          \"$document\",\n          \"$rootScope\",\n          function(m, O) {\n            var D = m[0], N = D && D.hidden;\n            function q() {\n              N = D.hidden;\n            }\n            return m.on(\"visibilitychange\", q), O.$on(\"$destroy\", function() {\n              m.off(\"visibilitychange\", q);\n            }), function() {\n              return N;\n            };\n          }\n        ];\n      }\n      function Ee() {\n        this.$get = [\n          \"$log\",\n          function(m) {\n            return function(O, D) {\n              m.error.apply(m, arguments);\n            };\n          }\n        ];\n      }\n      var nr = function() {\n        this.$get = [\n          \"$document\",\n          function(m) {\n            return function(O) {\n              return O ? !O.nodeType && O instanceof x && (O = O[0]) : O = m[0].body, O.offsetWidth + 1;\n            };\n          }\n        ];\n      }, fr = { \"Content-Type\": \"application/json;charset=utf-8\" }, Rr = /^\\[|^\\{(?!\\{)/, Fr = { \"[\": /]$/, \"{\": /}$/ }, ii = /^\\)]\\}',?\\n/, Gn = E(\"$http\");\n      function Wn(m) {\n        return gt(m) ? Nt(m) ? m.toISOString() : zr(m) : m;\n      }\n      function yr() {\n        this.$get = function() {\n          return function(m) {\n            if (!m) return \"\";\n            var O = [];\n            return S(m, function(D, N) {\n              D === null || ct(D) || ne(D) || (re(D) ? s(D, function(q) {\n                O.push(tn(N) + \"=\" + tn(Wn(q)));\n              }) : O.push(tn(N) + \"=\" + tn(Wn(D))));\n            }), O.join(\"&\");\n          };\n        };\n      }\n      function Xr() {\n        this.$get = function() {\n          return function(m) {\n            if (!m) return \"\";\n            var O = [];\n            return function D(N, q, X) {\n              re(N) ? s(N, function(H, F) {\n                D(H, q + \"[\" + (gt(H) ? F : \"\") + \"]\");\n              }) : gt(N) && !Nt(N) ? S(N, function(H, F) {\n                D(H, q + (X ? \"\" : \"[\") + F + (X ? \"\" : \"]\"));\n              }) : (ne(N) && (N = N()), O.push(tn(q) + \"=\" + (N == null ? \"\" : tn(Wn(N)))));\n            }(m, \"\", !0), O.join(\"&\");\n          };\n        };\n      }\n      function Zn(m, O) {\n        if (St(m)) {\n          var D = m.replace(ii, \"\").trim();\n          if (D) {\n            var N = O(\"Content-Type\"), q = N && N.indexOf(\"application/json\") === 0;\n            if (q || (H = (X = D).match(Rr)) && Fr[H[0]].test(X))\n              try {\n                m = ln(D);\n              } catch (F) {\n                if (!q) return m;\n                throw Gn(\n                  \"baddata\",\n                  'Data must be a valid JSON object. Received: \"{0}\". Parse error: \"{1}\"',\n                  m,\n                  F\n                );\n              }\n          }\n        }\n        var X, H;\n        return m;\n      }\n      function ao(m) {\n        var O, D = ur();\n        function N(q, X) {\n          q && (D[q] = D[q] ? D[q] + \", \" + X : X);\n        }\n        return St(m) ? s(m.split(`\n`), function(q) {\n          O = q.indexOf(\":\"), N(n(kt(q.substr(0, O))), kt(q.substr(O + 1)));\n        }) : gt(m) && s(m, function(q, X) {\n          N(n(X), kt(q));\n        }), D;\n      }\n      function ti(m) {\n        var O;\n        return function(D) {\n          if (O || (O = ao(m)), D) {\n            var N = O[n(D)];\n            return N === void 0 && (N = null), N;\n          }\n          return O;\n        };\n      }\n      function so(m, O, D, N) {\n        return ne(N) ? N(m, O, D) : (s(N, function(q) {\n          m = q(m, O, D);\n        }), m);\n      }\n      function ea(m) {\n        return 200 <= m && m < 300;\n      }\n      function ei() {\n        var m = this.defaults = {\n          transformResponse: [Zn],\n          transformRequest: [\n            function(q) {\n              return !gt(q) || (X = q, i.call(X) === \"[object File]\") || function(H) {\n                return i.call(H) === \"[object Blob]\";\n              }(q) || function(H) {\n                return i.call(H) === \"[object FormData]\";\n              }(q) ? q : zr(q);\n              var X;\n            }\n          ],\n          headers: {\n            common: { Accept: \"application/json, text/plain, */*\" },\n            post: Si(fr),\n            put: Si(fr),\n            patch: Si(fr)\n          },\n          xsrfCookieName: \"XSRF-TOKEN\",\n          xsrfHeaderName: \"X-XSRF-TOKEN\",\n          paramSerializer: \"$httpParamSerializer\",\n          jsonpCallbackParam: \"callback\"\n        }, O = !1;\n        this.useApplyAsync = function(q) {\n          return ot(q) ? (O = !!q, this) : O;\n        };\n        var D = this.interceptors = [], N = this.xsrfTrustedOrigins = [];\n        Object.defineProperty(this, \"xsrfWhitelistedOrigins\", {\n          get: function() {\n            return this.xsrfTrustedOrigins;\n          },\n          set: function(q) {\n            this.xsrfTrustedOrigins = q;\n          }\n        }), this.$get = [\n          \"$browser\",\n          \"$httpBackend\",\n          \"$$cookieReader\",\n          \"$cacheFactory\",\n          \"$rootScope\",\n          \"$q\",\n          \"$injector\",\n          \"$sce\",\n          function(q, X, H, F, Q, K, it, st) {\n            var Ct = F(\"$http\");\n            m.paramSerializer = St(m.paramSerializer) ? it.get(m.paramSerializer) : m.paramSerializer;\n            var jt = [];\n            s(D, function(_t) {\n              jt.unshift(St(_t) ? it.get(_t) : it.invoke(_t));\n            });\n            var Tt, Vt = (Tt = [ol].concat(N.map($o)), function(_t) {\n              var Bt = $o(_t);\n              return Tt.some(vs.bind(null, Bt));\n            });\n            function oe(_t) {\n              if (!gt(_t))\n                throw E(\"$http\")(\n                  \"badreq\",\n                  \"Http request configuration must be an object.  Received: {0}\",\n                  _t\n                );\n              if (!St(st.valueOf(_t.url)))\n                throw E(\"$http\")(\n                  \"badreq\",\n                  \"Http request configuration url must be a string or a $sce trusted object.  Received: {0}\",\n                  _t.url\n                );\n              var Bt = z(\n                {\n                  method: \"get\",\n                  transformRequest: m.transformRequest,\n                  transformResponse: m.transformResponse,\n                  paramSerializer: m.paramSerializer,\n                  jsonpCallbackParam: m.jsonpCallbackParam\n                },\n                _t\n              );\n              Bt.headers = function(qt) {\n                var ue, ie, ge, Te = m.headers, Xe = z({}, qt.headers);\n                Te = z({}, Te.common, Te[n(qt.method)]);\n                t: for (ue in Te) {\n                  for (ge in ie = n(ue), Xe) if (n(ge) === ie) continue t;\n                  Xe[ue] = Te[ue];\n                }\n                return function(He, Qr) {\n                  var vr, Cr = {};\n                  return s(He, function(cn, Pr) {\n                    ne(cn) ? (vr = cn(Qr)) != null && (Cr[Pr] = vr) : Cr[Pr] = cn;\n                  }), Cr;\n                }(Xe, Si(qt));\n              }(_t), Bt.method = t(Bt.method), Bt.paramSerializer = St(Bt.paramSerializer) ? it.get(Bt.paramSerializer) : Bt.paramSerializer, q.$$incOutstandingRequestCount(\"$http\");\n              var Qt = [], At = [], wt = K.resolve(Bt);\n              return s(jt, function(qt) {\n                (qt.request || qt.requestError) && Qt.unshift(qt.request, qt.requestError), (qt.response || qt.responseError) && At.push(qt.response, qt.responseError);\n              }), wt = Ot(wt, Qt), wt = (wt = Ot(\n                wt = wt.then(function(qt) {\n                  var ue = qt.headers, ie = so(qt.data, ti(ue), void 0, qt.transformRequest);\n                  return ct(ie) && s(ue, function(ge, Te) {\n                    n(Te) === \"content-type\" && delete ue[Te];\n                  }), ct(qt.withCredentials) && !ct(m.withCredentials) && (qt.withCredentials = m.withCredentials), function(ge, Te) {\n                    var Xe, He, Qr = K.defer(), vr = Qr.promise, Cr = ge.headers, cn = n(ge.method) === \"jsonp\", Pr = ge.url;\n                    if (cn ? Pr = st.getTrustedResourceUrl(Pr) : St(Pr) || (Pr = st.valueOf(Pr)), Pr = function(br, cr) {\n                      return cr.length > 0 && (br += (br.indexOf(\"?\") === -1 ? \"?\" : \"&\") + cr), br;\n                    }(Pr, ge.paramSerializer(ge.params)), cn && (Pr = function(br, cr) {\n                      var Jr = br.split(\"?\");\n                      if (Jr.length > 2)\n                        throw Gn(\n                          \"badjsonp\",\n                          'Illegal use more than one \"?\", in url, \"{1}\"',\n                          br\n                        );\n                      return s(ri(Jr[1]), function(An, Ln) {\n                        if (An === \"JSON_CALLBACK\")\n                          throw Gn(\n                            \"badjsonp\",\n                            'Illegal use of JSON_CALLBACK in url, \"{0}\"',\n                            br\n                          );\n                        if (Ln === cr)\n                          throw Gn(\n                            \"badjsonp\",\n                            'Illegal use of callback param, \"{0}\", in url, \"{1}\"',\n                            cr,\n                            br\n                          );\n                      }), br += (br.indexOf(\"?\") === -1 ? \"?\" : \"&\") + cr + \"=JSON_CALLBACK\";\n                    }(Pr, ge.jsonpCallbackParam)), oe.pendingRequests.push(ge), vr.then(zo, zo), !ge.cache && !m.cache || ge.cache === !1 || ge.method !== \"GET\" && ge.method !== \"JSONP\" || (Xe = gt(ge.cache) ? ge.cache : gt(m.cache) ? m.cache : Ct), Xe && (ot(He = Xe.get(Pr)) ? Le(He) ? He.then(kn, kn) : re(He) ? On(He[1], He[0], Si(He[2]), He[3], He[4]) : On(He, 200, {}, \"OK\", \"complete\") : Xe.put(Pr, vr)), ct(He)) {\n                      var dn = Vt(ge.url) ? H()[ge.xsrfCookieName || m.xsrfCookieName] : void 0;\n                      dn && (Cr[ge.xsrfHeaderName || m.xsrfHeaderName] = dn), X(\n                        ge.method,\n                        Pr,\n                        Te,\n                        function(br, cr, Jr, An, Ln) {\n                          Xe && (ea(br) ? Xe.put(Pr, [br, cr, ao(Jr), An, Ln]) : Xe.remove(Pr));\n                          function er() {\n                            On(cr, br, Jr, An, Ln);\n                          }\n                          O ? Q.$applyAsync(er) : (er(), Q.$$phase || Q.$apply());\n                        },\n                        Cr,\n                        ge.timeout,\n                        ge.withCredentials,\n                        ge.responseType,\n                        _n(ge.eventHandlers),\n                        _n(ge.uploadEventHandlers)\n                      );\n                    }\n                    return vr;\n                    function _n(br) {\n                      if (br) {\n                        var cr = {};\n                        return s(br, function(Jr, An) {\n                          cr[An] = function(Ln) {\n                            function er() {\n                              Jr(Ln);\n                            }\n                            O ? Q.$applyAsync(er) : Q.$$phase ? er() : Q.$apply(er);\n                          };\n                        }), cr;\n                      }\n                    }\n                    function On(br, cr, Jr, An, Ln) {\n                      (ea(cr = cr >= -1 ? cr : 0) ? Qr.resolve : Qr.reject)({\n                        data: br,\n                        status: cr,\n                        headers: ti(Jr),\n                        config: ge,\n                        statusText: An,\n                        xhrStatus: Ln\n                      });\n                    }\n                    function kn(br) {\n                      On(\n                        br.data,\n                        br.status,\n                        Si(br.headers()),\n                        br.statusText,\n                        br.xhrStatus\n                      );\n                    }\n                    function zo() {\n                      var br = oe.pendingRequests.indexOf(ge);\n                      br !== -1 && oe.pendingRequests.splice(br, 1);\n                    }\n                  }(qt, ie).then(Ft, Ft);\n                }),\n                At\n              )).finally(function() {\n                q.$$completeOutstandingRequest(Z, \"$http\");\n              });\n              function Ot(qt, ue) {\n                for (var ie = 0, ge = ue.length; ie < ge; ) {\n                  var Te = ue[ie++], Xe = ue[ie++];\n                  qt = qt.then(Te, Xe);\n                }\n                return ue.length = 0, qt;\n              }\n              function Ft(qt) {\n                var ue = z({}, qt);\n                return ue.data = so(\n                  qt.data,\n                  qt.headers,\n                  qt.status,\n                  Bt.transformResponse\n                ), ea(qt.status) ? ue : K.reject(ue);\n              }\n            }\n            return oe.pendingRequests = [], function(_t) {\n              s(arguments, function(Bt) {\n                oe[Bt] = function(Qt, At) {\n                  return oe(z({}, At || {}, { method: Bt, url: Qt }));\n                };\n              });\n            }(\"get\", \"delete\", \"head\", \"jsonp\"), function(_t) {\n              s(arguments, function(Bt) {\n                oe[Bt] = function(Qt, At, wt) {\n                  return oe(z({}, wt || {}, { method: Bt, url: Qt, data: At }));\n                };\n              });\n            }(\"post\", \"put\", \"patch\"), oe.defaults = m, oe;\n          }\n        ];\n      }\n      function Bi() {\n        this.$get = function() {\n          return function() {\n            return new e.XMLHttpRequest();\n          };\n        };\n      }\n      function el() {\n        this.$get = [\n          \"$browser\",\n          \"$jsonpCallbacks\",\n          \"$document\",\n          \"$xhrFactory\",\n          function(m, O, D, N) {\n            return /* @__PURE__ */ function(q, X, H, F, Q) {\n              return function(K, it, st, Ct, jt, Tt, Vt, oe, _t, Bt) {\n                if (it = it || q.url(), n(K) === \"jsonp\")\n                  var Qt = F.createCallback(it), At = function(ie, ge, Te) {\n                    ie = ie.replace(\"JSON_CALLBACK\", ge);\n                    var Xe = Q.createElement(\"script\"), He = null;\n                    return Xe.type = \"text/javascript\", Xe.src = ie, Xe.async = !0, He = function(Qr) {\n                      Xe.removeEventListener(\"load\", He), Xe.removeEventListener(\"error\", He), Q.body.removeChild(Xe), Xe = null;\n                      var vr = -1, Cr = \"unknown\";\n                      Qr && (Qr.type !== \"load\" || F.wasCalled(ge) || (Qr = { type: \"error\" }), Cr = Qr.type, vr = Qr.type === \"error\" ? 404 : 200), Te && Te(vr, Cr);\n                    }, Xe.addEventListener(\"load\", He), Xe.addEventListener(\"error\", He), Q.body.appendChild(Xe), He;\n                  }(it, Qt, function(ie, ge) {\n                    var Te = ie === 200 && F.getResponse(Qt);\n                    ue(Ct, ie, Te, \"\", ge, \"complete\"), F.removeCallback(Qt);\n                  });\n                else {\n                  var wt = X(K, it), Ot = !1;\n                  if (wt.open(K, it, !0), s(jt, function(ie, ge) {\n                    ot(ie) && wt.setRequestHeader(ge, ie);\n                  }), wt.onload = function() {\n                    var ie = wt.statusText || \"\", ge = \"response\" in wt ? wt.response : wt.responseText, Te = wt.status === 1223 ? 204 : wt.status;\n                    Te === 0 && (Te = ge ? 200 : $o(it).protocol === \"file\" ? 404 : 0), ue(Ct, Te, ge, wt.getAllResponseHeaders(), ie, \"complete\");\n                  }, wt.onerror = function() {\n                    ue(Ct, -1, null, null, \"\", \"error\");\n                  }, wt.ontimeout = function() {\n                    ue(Ct, -1, null, null, \"\", \"timeout\");\n                  }, wt.onabort = function() {\n                    ue(Ct, -1, null, null, \"\", Ot ? \"timeout\" : \"abort\");\n                  }, s(_t, function(ie, ge) {\n                    wt.addEventListener(ge, ie);\n                  }), s(Bt, function(ie, ge) {\n                    wt.upload.addEventListener(ge, ie);\n                  }), Vt && (wt.withCredentials = !0), oe)\n                    try {\n                      wt.responseType = oe;\n                    } catch (ie) {\n                      if (oe !== \"json\") throw ie;\n                    }\n                  wt.send(ct(st) ? null : st);\n                }\n                if (Tt > 0)\n                  var Ft = H(function() {\n                    qt(\"timeout\");\n                  }, Tt);\n                else\n                  Le(Tt) && Tt.then(function() {\n                    qt(ot(Tt.$$timeoutId) ? \"timeout\" : \"abort\");\n                  });\n                function qt(ie) {\n                  Ot = ie === \"timeout\", At && At(), wt && wt.abort();\n                }\n                function ue(ie, ge, Te, Xe, He, Qr) {\n                  ot(Ft) && H.cancel(Ft), At = wt = null, ie(ge, Te, Xe, He, Qr);\n                }\n              };\n            }(m, N, m.defer, O, D[0]);\n          }\n        ];\n      }\n      var ma = f.$interpolateMinErr = E(\"$interpolate\");\n      function Ia() {\n        var m = \"{{\", O = \"}}\";\n        this.startSymbol = function(D) {\n          return D ? (m = D, this) : m;\n        }, this.endSymbol = function(D) {\n          return D ? (O = D, this) : O;\n        }, this.$get = [\n          \"$parse\",\n          \"$exceptionHandler\",\n          \"$sce\",\n          function(D, N, q) {\n            var X = m.length, H = O.length, F = new RegExp(m.replace(/./g, K), \"g\"), Q = new RegExp(O.replace(/./g, K), \"g\");\n            function K(jt) {\n              return \"\\\\\\\\\\\\\" + jt;\n            }\n            function it(jt) {\n              return jt.replace(F, m).replace(Q, O);\n            }\n            function st(jt, Tt, Vt, oe) {\n              var _t = jt.$watch(\n                function(Bt) {\n                  return _t(), oe(Bt);\n                },\n                Tt,\n                Vt\n              );\n              return _t;\n            }\n            function Ct(jt, Tt, Vt, oe) {\n              var _t = Vt === q.URL || Vt === q.MEDIA_URL;\n              if (!jt.length || jt.indexOf(m) === -1) {\n                if (Tt) return;\n                var Bt = it(jt);\n                _t && (Bt = q.getTrusted(Vt, Bt));\n                var Qt = nt(Bt);\n                return Qt.exp = jt, Qt.expressions = [], Qt.$$watchDelegate = st, Qt;\n              }\n              oe = !!oe;\n              for (var At, wt, Ot, Ft, qt, ue = 0, ie = [], ge = jt.length, Te = [], Xe = []; ue < ge; ) {\n                if ((At = jt.indexOf(m, ue)) === -1 || (wt = jt.indexOf(O, At + X)) === -1) {\n                  ue !== ge && Te.push(it(jt.substring(ue)));\n                  break;\n                }\n                ue !== At && Te.push(it(jt.substring(ue, At))), Ft = jt.substring(At + X, wt), ie.push(Ft), ue = wt + H, Xe.push(Te.length), Te.push(\"\");\n              }\n              qt = Te.length === 1 && Xe.length === 1;\n              var He = _t && qt ? void 0 : function(vr) {\n                try {\n                  return vr = Vt && !_t ? q.getTrusted(Vt, vr) : q.valueOf(vr), oe && !ot(vr) ? vr : _r(vr);\n                } catch (Cr) {\n                  N(ma.interr(jt, Cr));\n                }\n              };\n              if (Ot = ie.map(function(vr) {\n                return D(vr, He);\n              }), !Tt || ie.length) {\n                var Qr = function(vr) {\n                  for (var Cr = 0, cn = ie.length; Cr < cn; Cr++) {\n                    if (oe && ct(vr[Cr])) return;\n                    Te[Xe[Cr]] = vr[Cr];\n                  }\n                  return _t ? q.getTrusted(Vt, qt ? Te[0] : Te.join(\"\")) : (Vt && Te.length > 1 && ma.throwNoconcat(jt), Te.join(\"\"));\n                };\n                return z(\n                  function(vr) {\n                    var Cr = 0, cn = ie.length, Pr = new Array(cn);\n                    try {\n                      for (; Cr < cn; Cr++) Pr[Cr] = Ot[Cr](vr);\n                      return Qr(Pr);\n                    } catch (dn) {\n                      N(ma.interr(jt, dn));\n                    }\n                  },\n                  {\n                    exp: jt,\n                    expressions: ie,\n                    $$watchDelegate: function(vr, Cr) {\n                      var cn;\n                      return vr.$watchGroup(Ot, function(Pr, dn) {\n                        var _n = Qr(Pr);\n                        Cr.call(this, _n, Pr !== dn ? cn : _n, vr), cn = _n;\n                      });\n                    }\n                  }\n                );\n              }\n            }\n            return Ct.startSymbol = function() {\n              return m;\n            }, Ct.endSymbol = function() {\n              return O;\n            }, Ct;\n          }\n        ];\n      }\n      ma.throwNoconcat = function(m) {\n        throw ma(\n          \"noconcat\",\n          `Error while interpolating: {0}\nStrict Contextual Escaping disallows interpolations that concatenate multiple expressions when a trusted value is required.  See http://docs.angularjs.org/api/ng.$sce`,\n          m\n        );\n      }, ma.interr = function(m, O) {\n        return ma(\"interr\", `Can't interpolate: {0}\n{1}`, m, O.toString());\n      };\n      var rl = E(\"$interval\");\n      function cs() {\n        this.$get = [\n          \"$$intervalFactory\",\n          \"$window\",\n          function(m, O) {\n            var D = {}, N = function(X) {\n              O.clearInterval(X), delete D[X];\n            }, q = m(function(X, H, F) {\n              var Q = O.setInterval(X, H);\n              return D[Q] = F, Q;\n            }, N);\n            return q.cancel = function(X) {\n              if (!X) return !1;\n              if (!X.hasOwnProperty(\"$$intervalId\"))\n                throw rl(\n                  \"badprom\",\n                  \"`$interval.cancel()` called with a promise that was not generated by `$interval()`.\"\n                );\n              if (!D.hasOwnProperty(X.$$intervalId)) return !1;\n              var H = X.$$intervalId, F = D[H];\n              return fi(F.promise), F.reject(\"canceled\"), N(H), !0;\n            }, q;\n          }\n        ];\n      }\n      function Na() {\n        this.$get = [\n          \"$browser\",\n          \"$q\",\n          \"$$q\",\n          \"$rootScope\",\n          function(m, O, D, N) {\n            return function(q, X) {\n              return function(H, F, Q, K) {\n                var it = arguments.length > 4, st = it ? ir(arguments, 4) : [], Ct = 0, jt = ot(K) && !K, Tt = (jt ? D : O).defer(), Vt = Tt.promise;\n                function oe() {\n                  it ? H.apply(null, st) : H(Ct);\n                }\n                function _t() {\n                  jt ? m.defer(oe) : N.$evalAsync(oe), Tt.notify(Ct++), Q > 0 && Ct >= Q && (Tt.resolve(Ct), X(Vt.$$intervalId)), jt || N.$apply();\n                }\n                return Q = ot(Q) ? Q : 0, Vt.$$intervalId = q(_t, F, Tt, jt), Vt;\n              };\n            };\n          }\n        ];\n      }\n      var va = function() {\n        this.$get = function() {\n          var m = f.callbacks, O = {};\n          return {\n            createCallback: function(D) {\n              var N = \"_\" + (m.$$counter++).toString(36), q = \"angular.callbacks.\" + N, X = function(H) {\n                var F = function(Q) {\n                  F.data = Q, F.called = !0;\n                };\n                return F.id = H, F;\n              }(N);\n              return O[q] = m[N] = X, q;\n            },\n            wasCalled: function(D) {\n              return O[D].called;\n            },\n            getResponse: function(D) {\n              return O[D].data;\n            },\n            removeCallback: function(D) {\n              var N = O[D];\n              delete m[N.id], delete O[D];\n            }\n          };\n        };\n      }, _a = /^([^?#]*)(\\?([^#]*))?(#(.*))?$/, ba = { http: 80, https: 443, ftp: 21 }, Ti = E(\"$location\");\n      function Co(m, O, D) {\n        var N, q = (N = [], s(O, function(H, F) {\n          re(H) ? s(H, function(Q) {\n            N.push(tn(F, !0) + (Q === !0 ? \"\" : \"=\" + tn(Q, !0)));\n          }) : N.push(tn(F, !0) + (H === !0 ? \"\" : \"=\" + tn(H, !0)));\n        }), N.length ? N.join(\"&\") : \"\"), X = D ? \"#\" + Yn(D) : \"\";\n        return function(H) {\n          for (var F = H.split(\"/\"), Q = F.length; Q--; )\n            F[Q] = Yn(F[Q].replace(/%2F/g, \"/\"));\n          return F.join(\"/\");\n        }(m) + (q ? \"?\" + q : \"\") + X;\n      }\n      function ra(m, O) {\n        var D = $o(m);\n        O.$$protocol = D.protocol, O.$$host = D.hostname, O.$$port = G(D.port) || ba[D.protocol] || null;\n      }\n      var Ps = /^\\s*[\\\\/]{2,}/;\n      function ds(m, O, D) {\n        if (Ps.test(m)) throw Ti(\"badpath\", 'Invalid url \"{0}\".', m);\n        var N = m.charAt(0) !== \"/\";\n        N && (m = \"/\" + m);\n        var q = $o(m), X = N && q.pathname.charAt(0) === \"/\" ? q.pathname.substring(1) : q.pathname;\n        O.$$path = function(H, F) {\n          for (var Q = H.split(\"/\"), K = Q.length; K--; )\n            Q[K] = decodeURIComponent(Q[K]), F && (Q[K] = Q[K].replace(/\\//g, \"%2F\"));\n          return Q.join(\"/\");\n        }(X, D), O.$$search = ri(q.search), O.$$hash = decodeURIComponent(q.hash), O.$$path && O.$$path.charAt(0) !== \"/\" && (O.$$path = \"/\" + O.$$path);\n      }\n      function fs(m, O) {\n        return m.slice(0, O.length) === O;\n      }\n      function on(m, O) {\n        if (fs(O, m)) return O.substr(m.length);\n      }\n      function Ho(m) {\n        var O = m.indexOf(\"#\");\n        return O === -1 ? m : m.substr(0, O);\n      }\n      function Fi(m, O, D) {\n        this.$$html5 = !0, D = D || \"\", ra(m, this), this.$$parse = function(N) {\n          var q = on(O, N);\n          if (!St(q))\n            throw Ti(\n              \"ipthprfx\",\n              'Invalid url \"{0}\", missing path prefix \"{1}\".',\n              N,\n              O\n            );\n          ds(q, this, !0), this.$$path || (this.$$path = \"/\"), this.$$compose();\n        }, this.$$normalizeUrl = function(N) {\n          return O + N.substr(1);\n        }, this.$$parseLinkUrl = function(N, q) {\n          return q && q[0] === \"#\" ? (this.hash(q.slice(1)), !0) : (ot(X = on(m, N)) ? (H = X, F = D && ot(X = on(D, X)) ? O + (on(\"/\", X) || X) : m + H) : ot(X = on(O, N)) ? F = O + X : O === N + \"/\" && (F = O), F && this.$$parse(F), !!F);\n          var X, H, F;\n        };\n      }\n      function Pi(m, O, D) {\n        ra(m, this), this.$$parse = function(N) {\n          var q, X = on(m, N) || on(O, N);\n          ct(X) || X.charAt(0) !== \"#\" ? this.$$html5 ? q = X : (q = \"\", ct(X) && (m = N, this.replace())) : ct(q = on(D, X)) && (q = X), ds(q, this, !1), this.$$path = function(H, F, Q) {\n            var K, it = /^\\/[A-Z]:(\\/.*)/;\n            return fs(F, Q) && (F = F.replace(Q, \"\")), it.exec(F) ? H : (K = it.exec(H)) ? K[1] : H;\n          }(this.$$path, q, m), this.$$compose();\n        }, this.$$normalizeUrl = function(N) {\n          return m + (N ? D + N : \"\");\n        }, this.$$parseLinkUrl = function(N, q) {\n          return Ho(m) === Ho(N) && (this.$$parse(N), !0);\n        };\n      }\n      function Ma(m, O, D) {\n        this.$$html5 = !0, Pi.apply(this, arguments), this.$$parseLinkUrl = function(N, q) {\n          return q && q[0] === \"#\" ? (this.hash(q.slice(1)), !0) : (m === Ho(N) ? X = N : (H = on(O, N)) ? X = m + D + H : O === N + \"/\" && (X = O), X && this.$$parse(X), !!X);\n          var X, H;\n        }, this.$$normalizeUrl = function(N) {\n          return m + D + N;\n        };\n      }\n      var vt = {\n        $$absUrl: \"\",\n        $$html5: !1,\n        $$replace: !1,\n        $$compose: function() {\n          this.$$url = Co(this.$$path, this.$$search, this.$$hash), this.$$absUrl = this.$$normalizeUrl(this.$$url), this.$$urlUpdatedByLocation = !0;\n        },\n        absUrl: Qo(\"$$absUrl\"),\n        url: function(m) {\n          if (ct(m)) return this.$$url;\n          var O = _a.exec(m);\n          return (O[1] || m === \"\") && this.path(decodeURIComponent(O[1])), (O[2] || O[1] || m === \"\") && this.search(O[3] || \"\"), this.hash(O[5] || \"\"), this;\n        },\n        protocol: Qo(\"$$protocol\"),\n        host: Qo(\"$$host\"),\n        port: Qo(\"$$port\"),\n        path: La(\"$$path\", function(m) {\n          return (m = m !== null ? m.toString() : \"\").charAt(0) === \"/\" ? m : \"/\" + m;\n        }),\n        search: function(m, O) {\n          switch (arguments.length) {\n            case 0:\n              return this.$$search;\n            case 1:\n              if (St(m) || zt(m)) m = m.toString(), this.$$search = ri(m);\n              else {\n                if (!gt(m))\n                  throw Ti(\n                    \"isrcharg\",\n                    \"The first argument of the `$location#search()` call must be a string or an object.\"\n                  );\n                s(m = le(m, {}), function(D, N) {\n                  D == null && delete m[N];\n                }), this.$$search = m;\n              }\n              break;\n            default:\n              ct(O) || O === null ? delete this.$$search[m] : this.$$search[m] = O;\n          }\n          return this.$$compose(), this;\n        },\n        hash: La(\"$$hash\", function(m) {\n          return m !== null ? m.toString() : \"\";\n        }),\n        replace: function() {\n          return this.$$replace = !0, this;\n        }\n      };\n      function Qo(m) {\n        return function() {\n          return this[m];\n        };\n      }\n      function La(m, O) {\n        return function(D) {\n          return ct(D) ? this[m] : (this[m] = O(D), this.$$compose(), this);\n        };\n      }\n      function ho() {\n        var m = \"!\", O = { enabled: !1, requireBase: !0, rewriteLinks: !0 };\n        this.hashPrefix = function(D) {\n          return ot(D) ? (m = D, this) : m;\n        }, this.html5Mode = function(D) {\n          return ae(D) ? (O.enabled = D, this) : gt(D) ? (ae(D.enabled) && (O.enabled = D.enabled), ae(D.requireBase) && (O.requireBase = D.requireBase), (ae(D.rewriteLinks) || St(D.rewriteLinks)) && (O.rewriteLinks = D.rewriteLinks), this) : O;\n        }, this.$get = [\n          \"$rootScope\",\n          \"$browser\",\n          \"$sniffer\",\n          \"$rootElement\",\n          \"$window\",\n          function(D, N, q, X, H) {\n            var F, Q, K, it, st = N.baseHref(), Ct = N.url();\n            if (O.enabled) {\n              if (!st && O.requireBase)\n                throw Ti(\n                  \"nobase\",\n                  \"$location in HTML5 mode requires a <base> tag to be present!\"\n                );\n              K = (it = Ct).substring(0, it.indexOf(\"/\", it.indexOf(\"//\") + 2)) + (st || \"/\"), Q = q.history ? Fi : Ma;\n            } else K = Ho(Ct), Q = Pi;\n            var jt = function(Bt) {\n              return Bt.substr(0, Ho(Bt).lastIndexOf(\"/\") + 1);\n            }(K);\n            (F = new Q(K, jt, \"#\" + m)).$$parseLinkUrl(Ct, Ct), F.$$state = N.state();\n            var Tt = /^\\s*(javascript|mailto):/i;\n            function Vt(Bt, Qt, At) {\n              var wt = F.url(), Ot = F.$$state;\n              try {\n                N.url(Bt, Qt, At), F.$$state = N.state();\n              } catch (Ft) {\n                throw F.url(wt), F.$$state = Ot, Ft;\n              }\n            }\n            X.on(\"click\", function(Bt) {\n              var Qt = O.rewriteLinks;\n              if (Qt && !Bt.ctrlKey && !Bt.metaKey && !Bt.shiftKey && Bt.which !== 2 && Bt.button !== 2) {\n                for (var At = x(Bt.target); ft(At[0]) !== \"a\"; )\n                  if (At[0] === X[0] || !(At = At.parent())[0]) return;\n                if (!St(Qt) || !ct(At.attr(Qt))) {\n                  var wt = At.prop(\"href\"), Ot = At.attr(\"href\") || At.attr(\"xlink:href\");\n                  gt(wt) && wt.toString() === \"[object SVGAnimatedString]\" && (wt = $o(wt.animVal).href), Tt.test(wt) || !wt || At.attr(\"target\") || Bt.isDefaultPrevented() || F.$$parseLinkUrl(wt, Ot) && (Bt.preventDefault(), F.absUrl() !== N.url() && D.$apply());\n                }\n              }\n            }), F.absUrl() !== Ct && N.url(F.absUrl(), !0);\n            var oe = !0;\n            return N.onUrlChange(function(Bt, Qt) {\n              fs(Bt, jt) ? (D.$evalAsync(function() {\n                var At, wt = F.absUrl(), Ot = F.$$state;\n                F.$$parse(Bt), F.$$state = Qt, At = D.$broadcast(\n                  \"$locationChangeStart\",\n                  Bt,\n                  wt,\n                  Qt,\n                  Ot\n                ).defaultPrevented, F.absUrl() === Bt && (At ? (F.$$parse(wt), F.$$state = Ot, Vt(wt, !1, Ot)) : (oe = !1, _t(wt, Ot)));\n              }), D.$$phase || D.$digest()) : H.location.href = Bt;\n            }), D.$watch(function() {\n              if (oe || F.$$urlUpdatedByLocation) {\n                F.$$urlUpdatedByLocation = !1;\n                var Bt = N.url(), Qt = F.absUrl(), At = N.state(), wt = F.$$replace, Ot = !((Ft = Bt) === (qt = Qt) || $o(Ft).href === $o(qt).href) || F.$$html5 && q.history && At !== F.$$state;\n                (oe || Ot) && (oe = !1, D.$evalAsync(function() {\n                  var ue = F.absUrl(), ie = D.$broadcast(\n                    \"$locationChangeStart\",\n                    ue,\n                    Bt,\n                    F.$$state,\n                    At\n                  ).defaultPrevented;\n                  F.absUrl() === ue && (ie ? (F.$$parse(Bt), F.$$state = At) : (Ot && Vt(ue, wt, At === F.$$state ? null : F.$$state), _t(Bt, At)));\n                }));\n              }\n              var Ft, qt;\n              F.$$replace = !1;\n            }), F;\n            function _t(Bt, Qt) {\n              D.$broadcast(\n                \"$locationChangeSuccess\",\n                F.absUrl(),\n                Bt,\n                F.$$state,\n                Qt\n              );\n            }\n          }\n        ];\n      }\n      function qr() {\n        var m = !0, O = this;\n        this.debugEnabled = function(D) {\n          return ot(D) ? (m = D, this) : m;\n        }, this.$get = [\n          \"$window\",\n          function(D) {\n            var N, q = y || /\\bEdge\\//.test(D.navigator && D.navigator.userAgent);\n            return {\n              log: H(\"log\"),\n              info: H(\"info\"),\n              warn: H(\"warn\"),\n              error: H(\"error\"),\n              debug: (N = H(\"debug\"), function() {\n                m && N.apply(O, arguments);\n              })\n            };\n            function X(F) {\n              return be(F) && (F.stack && q ? F = F.message && F.stack.indexOf(F.message) === -1 ? \"Error: \" + F.message + `\n` + F.stack : F.stack : F.sourceURL && (F = F.message + `\n` + F.sourceURL + \":\" + F.line)), F;\n            }\n            function H(F) {\n              var Q = D.console || {}, K = Q[F] || Q.log || Z;\n              return function() {\n                var it = [];\n                return s(arguments, function(st) {\n                  it.push(X(st));\n                }), Function.prototype.apply.call(K, Q, it);\n              };\n            }\n          }\n        ];\n      }\n      s([Ma, Pi, Fi], function(m) {\n        m.prototype = Object.create(vt), m.prototype.state = function(O) {\n          if (!arguments.length) return this.$$state;\n          if (m !== Fi || !this.$$html5)\n            throw Ti(\n              \"nostate\",\n              \"History API state support is available only in HTML5 mode and only in browsers supporting HTML5 History API\"\n            );\n          return this.$$state = ct(O) ? null : O, this.$$urlUpdatedByLocation = !0, this;\n        };\n      });\n      var lo = E(\"$parse\"), Go = {}.constructor.prototype.valueOf;\n      function go(m) {\n        return m + \"\";\n      }\n      var mo = ur();\n      s(\n        \"+ - * / % === !== == != < > <= >= && || ! = |\".split(\" \"),\n        function(m) {\n          mo[m] = !0;\n        }\n      );\n      var vo = {\n        n: `\n`,\n        f: \"\\f\",\n        r: \"\\r\",\n        t: \"\t\",\n        v: \"\\v\",\n        \"'\": \"'\",\n        '\"': '\"'\n      }, na = function(m) {\n        this.options = m;\n      };\n      na.prototype = {\n        constructor: na,\n        lex: function(m) {\n          for (this.text = m, this.index = 0, this.tokens = []; this.index < this.text.length; ) {\n            var O = this.text.charAt(this.index);\n            if (O === '\"' || O === \"'\") this.readString(O);\n            else if (this.isNumber(O) || O === \".\" && this.isNumber(this.peek()))\n              this.readNumber();\n            else if (this.isIdentifierStart(this.peekMultichar()))\n              this.readIdent();\n            else if (this.is(O, \"(){}[].,;:?\"))\n              this.tokens.push({ index: this.index, text: O }), this.index++;\n            else if (this.isWhitespace(O)) this.index++;\n            else {\n              var D = O + this.peek(), N = D + this.peek(2), q = mo[O], X = mo[D], H = mo[N];\n              if (q || X || H) {\n                var F = H ? N : X ? D : O;\n                this.tokens.push({ index: this.index, text: F, operator: !0 }), this.index += F.length;\n              } else\n                this.throwError(\n                  \"Unexpected next character \",\n                  this.index,\n                  this.index + 1\n                );\n            }\n          }\n          return this.tokens;\n        },\n        is: function(m, O) {\n          return O.indexOf(m) !== -1;\n        },\n        peek: function(m) {\n          var O = m || 1;\n          return this.index + O < this.text.length && this.text.charAt(this.index + O);\n        },\n        isNumber: function(m) {\n          return \"0\" <= m && m <= \"9\" && typeof m == \"string\";\n        },\n        isWhitespace: function(m) {\n          return m === \" \" || m === \"\\r\" || m === \"\t\" || m === `\n` || m === \"\\v\" || m === \" \";\n        },\n        isIdentifierStart: function(m) {\n          return this.options.isIdentifierStart ? this.options.isIdentifierStart(m, this.codePointAt(m)) : this.isValidIdentifierStart(m);\n        },\n        isValidIdentifierStart: function(m) {\n          return \"a\" <= m && m <= \"z\" || \"A\" <= m && m <= \"Z\" || m === \"_\" || m === \"$\";\n        },\n        isIdentifierContinue: function(m) {\n          return this.options.isIdentifierContinue ? this.options.isIdentifierContinue(m, this.codePointAt(m)) : this.isValidIdentifierContinue(m);\n        },\n        isValidIdentifierContinue: function(m, O) {\n          return this.isValidIdentifierStart(m, O) || this.isNumber(m);\n        },\n        codePointAt: function(m) {\n          return m.length === 1 ? m.charCodeAt(0) : (m.charCodeAt(0) << 10) + m.charCodeAt(1) - 56613888;\n        },\n        peekMultichar: function() {\n          var m = this.text.charAt(this.index), O = this.peek();\n          if (!O) return m;\n          var D = m.charCodeAt(0), N = O.charCodeAt(0);\n          return D >= 55296 && D <= 56319 && N >= 56320 && N <= 57343 ? m + O : m;\n        },\n        isExpOperator: function(m) {\n          return m === \"-\" || m === \"+\" || this.isNumber(m);\n        },\n        throwError: function(m, O, D) {\n          D = D || this.index;\n          var N = ot(O) ? \"s \" + O + \"-\" + this.index + \" [\" + this.text.substring(O, D) + \"]\" : \" \" + D;\n          throw lo(\n            \"lexerr\",\n            \"Lexer Error: {0} at column{1} in expression [{2}].\",\n            m,\n            N,\n            this.text\n          );\n        },\n        readNumber: function() {\n          for (var m = \"\", O = this.index; this.index < this.text.length; ) {\n            var D = n(this.text.charAt(this.index));\n            if (D === \".\" || this.isNumber(D)) m += D;\n            else {\n              var N = this.peek();\n              if (D === \"e\" && this.isExpOperator(N)) m += D;\n              else if (this.isExpOperator(D) && N && this.isNumber(N) && m.charAt(m.length - 1) === \"e\")\n                m += D;\n              else {\n                if (!this.isExpOperator(D) || N && this.isNumber(N) || m.charAt(m.length - 1) !== \"e\")\n                  break;\n                this.throwError(\"Invalid exponent\");\n              }\n            }\n            this.index++;\n          }\n          this.tokens.push({\n            index: O,\n            text: m,\n            constant: !0,\n            value: Number(m)\n          });\n        },\n        readIdent: function() {\n          var m = this.index;\n          for (this.index += this.peekMultichar().length; this.index < this.text.length; ) {\n            var O = this.peekMultichar();\n            if (!this.isIdentifierContinue(O)) break;\n            this.index += O.length;\n          }\n          this.tokens.push({\n            index: m,\n            text: this.text.slice(m, this.index),\n            identifier: !0\n          });\n        },\n        readString: function(m) {\n          var O = this.index;\n          this.index++;\n          for (var D = \"\", N = m, q = !1; this.index < this.text.length; ) {\n            var X = this.text.charAt(this.index);\n            if (N += X, q) {\n              if (X === \"u\") {\n                var H = this.text.substring(this.index + 1, this.index + 5);\n                H.match(/[\\da-f]{4}/i) || this.throwError(\"Invalid unicode escape [\\\\u\" + H + \"]\"), this.index += 4, D += String.fromCharCode(parseInt(H, 16));\n              } else\n                D += vo[X] || X;\n              q = !1;\n            } else if (X === \"\\\\\") q = !0;\n            else {\n              if (X === m)\n                return this.index++, void this.tokens.push({\n                  index: O,\n                  text: N,\n                  constant: !0,\n                  value: D\n                });\n              D += X;\n            }\n            this.index++;\n          }\n          this.throwError(\"Unterminated quote\", O);\n        }\n      };\n      var Ne = function(m, O) {\n        this.lexer = m, this.options = O;\n      };\n      function ps(m, O) {\n        return m !== void 0 ? m : O;\n      }\n      function bt(m, O) {\n        return m === void 0 ? O : O === void 0 ? m : m + O;\n      }\n      Ne.Program = \"Program\", Ne.ExpressionStatement = \"ExpressionStatement\", Ne.AssignmentExpression = \"AssignmentExpression\", Ne.ConditionalExpression = \"ConditionalExpression\", Ne.LogicalExpression = \"LogicalExpression\", Ne.BinaryExpression = \"BinaryExpression\", Ne.UnaryExpression = \"UnaryExpression\", Ne.CallExpression = \"CallExpression\", Ne.MemberExpression = \"MemberExpression\", Ne.Identifier = \"Identifier\", Ne.Literal = \"Literal\", Ne.ArrayExpression = \"ArrayExpression\", Ne.Property = \"Property\", Ne.ObjectExpression = \"ObjectExpression\", Ne.ThisExpression = \"ThisExpression\", Ne.LocalsExpression = \"LocalsExpression\", Ne.NGValueParameter = \"NGValueParameter\", Ne.prototype = {\n        ast: function(m) {\n          this.text = m, this.tokens = this.lexer.lex(m);\n          var O = this.program();\n          return this.tokens.length !== 0 && this.throwError(\"is an unexpected token\", this.tokens[0]), O;\n        },\n        program: function() {\n          for (var m = []; ; )\n            if (this.tokens.length > 0 && !this.peek(\"}\", \")\", \";\", \"]\") && m.push(this.expressionStatement()), !this.expect(\";\"))\n              return { type: Ne.Program, body: m };\n        },\n        expressionStatement: function() {\n          return {\n            type: Ne.ExpressionStatement,\n            expression: this.filterChain()\n          };\n        },\n        filterChain: function() {\n          for (var m = this.expression(); this.expect(\"|\"); )\n            m = this.filter(m);\n          return m;\n        },\n        expression: function() {\n          return this.assignment();\n        },\n        assignment: function() {\n          var m = this.ternary();\n          if (this.expect(\"=\")) {\n            if (!Se(m))\n              throw lo(\"lval\", \"Trying to assign a value to a non l-value\");\n            m = {\n              type: Ne.AssignmentExpression,\n              left: m,\n              right: this.assignment(),\n              operator: \"=\"\n            };\n          }\n          return m;\n        },\n        ternary: function() {\n          var m, O, D = this.logicalOR();\n          return this.expect(\"?\") && (m = this.expression(), this.consume(\":\")) ? (O = this.expression(), {\n            type: Ne.ConditionalExpression,\n            test: D,\n            alternate: m,\n            consequent: O\n          }) : D;\n        },\n        logicalOR: function() {\n          for (var m = this.logicalAND(); this.expect(\"||\"); )\n            m = {\n              type: Ne.LogicalExpression,\n              operator: \"||\",\n              left: m,\n              right: this.logicalAND()\n            };\n          return m;\n        },\n        logicalAND: function() {\n          for (var m = this.equality(); this.expect(\"&&\"); )\n            m = {\n              type: Ne.LogicalExpression,\n              operator: \"&&\",\n              left: m,\n              right: this.equality()\n            };\n          return m;\n        },\n        equality: function() {\n          for (var m, O = this.relational(); m = this.expect(\"==\", \"!=\", \"===\", \"!==\"); )\n            O = {\n              type: Ne.BinaryExpression,\n              operator: m.text,\n              left: O,\n              right: this.relational()\n            };\n          return O;\n        },\n        relational: function() {\n          for (var m, O = this.additive(); m = this.expect(\"<\", \">\", \"<=\", \">=\"); )\n            O = {\n              type: Ne.BinaryExpression,\n              operator: m.text,\n              left: O,\n              right: this.additive()\n            };\n          return O;\n        },\n        additive: function() {\n          for (var m, O = this.multiplicative(); m = this.expect(\"+\", \"-\"); )\n            O = {\n              type: Ne.BinaryExpression,\n              operator: m.text,\n              left: O,\n              right: this.multiplicative()\n            };\n          return O;\n        },\n        multiplicative: function() {\n          for (var m, O = this.unary(); m = this.expect(\"*\", \"/\", \"%\"); )\n            O = {\n              type: Ne.BinaryExpression,\n              operator: m.text,\n              left: O,\n              right: this.unary()\n            };\n          return O;\n        },\n        unary: function() {\n          var m;\n          return (m = this.expect(\"+\", \"-\", \"!\")) ? {\n            type: Ne.UnaryExpression,\n            operator: m.text,\n            prefix: !0,\n            argument: this.unary()\n          } : this.primary();\n        },\n        primary: function() {\n          var m, O;\n          for (this.expect(\"(\") ? (m = this.filterChain(), this.consume(\")\")) : this.expect(\"[\") ? m = this.arrayDeclaration() : this.expect(\"{\") ? m = this.object() : this.selfReferential.hasOwnProperty(this.peek().text) ? m = le(this.selfReferential[this.consume().text]) : this.options.literals.hasOwnProperty(this.peek().text) ? m = {\n            type: Ne.Literal,\n            value: this.options.literals[this.consume().text]\n          } : this.peek().identifier ? m = this.identifier() : this.peek().constant ? m = this.constant() : this.throwError(\"not a primary expression\", this.peek()); O = this.expect(\"(\", \"[\", \".\"); )\n            O.text === \"(\" ? (m = {\n              type: Ne.CallExpression,\n              callee: m,\n              arguments: this.parseArguments()\n            }, this.consume(\")\")) : O.text === \"[\" ? (m = {\n              type: Ne.MemberExpression,\n              object: m,\n              property: this.expression(),\n              computed: !0\n            }, this.consume(\"]\")) : O.text === \".\" ? m = {\n              type: Ne.MemberExpression,\n              object: m,\n              property: this.identifier(),\n              computed: !1\n            } : this.throwError(\"IMPOSSIBLE\");\n          return m;\n        },\n        filter: function(m) {\n          for (var O = [m], D = {\n            type: Ne.CallExpression,\n            callee: this.identifier(),\n            arguments: O,\n            filter: !0\n          }; this.expect(\":\"); )\n            O.push(this.expression());\n          return D;\n        },\n        parseArguments: function() {\n          var m = [];\n          if (this.peekToken().text !== \")\")\n            do\n              m.push(this.filterChain());\n            while (this.expect(\",\"));\n          return m;\n        },\n        identifier: function() {\n          var m = this.consume();\n          return m.identifier || this.throwError(\"is not a valid identifier\", m), { type: Ne.Identifier, name: m.text };\n        },\n        constant: function() {\n          return { type: Ne.Literal, value: this.consume().value };\n        },\n        arrayDeclaration: function() {\n          var m = [];\n          if (this.peekToken().text !== \"]\")\n            do {\n              if (this.peek(\"]\")) break;\n              m.push(this.expression());\n            } while (this.expect(\",\"));\n          return this.consume(\"]\"), { type: Ne.ArrayExpression, elements: m };\n        },\n        object: function() {\n          var m, O = [];\n          if (this.peekToken().text !== \"}\")\n            do {\n              if (this.peek(\"}\")) break;\n              m = { type: Ne.Property, kind: \"init\" }, this.peek().constant ? (m.key = this.constant(), m.computed = !1, this.consume(\":\"), m.value = this.expression()) : this.peek().identifier ? (m.key = this.identifier(), m.computed = !1, this.peek(\":\") ? (this.consume(\":\"), m.value = this.expression()) : m.value = m.key) : this.peek(\"[\") ? (this.consume(\"[\"), m.key = this.expression(), this.consume(\"]\"), m.computed = !0, this.consume(\":\"), m.value = this.expression()) : this.throwError(\"invalid key\", this.peek()), O.push(m);\n            } while (this.expect(\",\"));\n          return this.consume(\"}\"), { type: Ne.ObjectExpression, properties: O };\n        },\n        throwError: function(m, O) {\n          throw lo(\n            \"syntax\",\n            \"Syntax Error: Token '{0}' {1} at column {2} of the expression [{3}] starting at [{4}].\",\n            O.text,\n            m,\n            O.index + 1,\n            this.text,\n            this.text.substring(O.index)\n          );\n        },\n        consume: function(m) {\n          if (this.tokens.length === 0)\n            throw lo(\"ueoe\", \"Unexpected end of expression: {0}\", this.text);\n          var O = this.expect(m);\n          return O || this.throwError(\n            \"is unexpected, expecting [\" + m + \"]\",\n            this.peek()\n          ), O;\n        },\n        peekToken: function() {\n          if (this.tokens.length === 0)\n            throw lo(\"ueoe\", \"Unexpected end of expression: {0}\", this.text);\n          return this.tokens[0];\n        },\n        peek: function(m, O, D, N) {\n          return this.peekAhead(0, m, O, D, N);\n        },\n        peekAhead: function(m, O, D, N, q) {\n          if (this.tokens.length > m) {\n            var X = this.tokens[m], H = X.text;\n            if (H === O || H === D || H === N || H === q || !O && !D && !N && !q)\n              return X;\n          }\n          return !1;\n        },\n        expect: function(m, O, D, N) {\n          var q = this.peek(m, O, D, N);\n          return !!q && (this.tokens.shift(), q);\n        },\n        selfReferential: {\n          this: { type: Ne.ThisExpression },\n          $locals: { type: Ne.LocalsExpression }\n        }\n      };\n      function Pt(m, O, D) {\n        var N, q, X, H = m.isPure = function(F, Q) {\n          switch (F.type) {\n            case Ne.MemberExpression:\n              if (F.computed) return !1;\n              break;\n            case Ne.UnaryExpression:\n              return 1;\n            case Ne.BinaryExpression:\n              return F.operator !== \"+\" && 1;\n            case Ne.CallExpression:\n              return !1;\n          }\n          return Q === void 0 ? 2 : Q;\n        }(m, D);\n        switch (m.type) {\n          case Ne.Program:\n            N = !0, s(m.body, function(F) {\n              Pt(F.expression, O, H), N = N && F.expression.constant;\n            }), m.constant = N;\n            break;\n          case Ne.Literal:\n            m.constant = !0, m.toWatch = [];\n            break;\n          case Ne.UnaryExpression:\n            Pt(m.argument, O, H), m.constant = m.argument.constant, m.toWatch = m.argument.toWatch;\n            break;\n          case Ne.BinaryExpression:\n            Pt(m.left, O, H), Pt(m.right, O, H), m.constant = m.left.constant && m.right.constant, m.toWatch = m.left.toWatch.concat(m.right.toWatch);\n            break;\n          case Ne.LogicalExpression:\n            Pt(m.left, O, H), Pt(m.right, O, H), m.constant = m.left.constant && m.right.constant, m.toWatch = m.constant ? [] : [m];\n            break;\n          case Ne.ConditionalExpression:\n            Pt(m.test, O, H), Pt(m.alternate, O, H), Pt(m.consequent, O, H), m.constant = m.test.constant && m.alternate.constant && m.consequent.constant, m.toWatch = m.constant ? [] : [m];\n            break;\n          case Ne.Identifier:\n            m.constant = !1, m.toWatch = [m];\n            break;\n          case Ne.MemberExpression:\n            Pt(m.object, O, H), m.computed && Pt(m.property, O, H), m.constant = m.object.constant && (!m.computed || m.property.constant), m.toWatch = m.constant ? [] : [m];\n            break;\n          case Ne.CallExpression:\n            X = !!m.filter && function(F, Q) {\n              return !F(Q).$stateful;\n            }(O, m.callee.name), N = X, q = [], s(m.arguments, function(F) {\n              Pt(F, O, H), N = N && F.constant, q.push.apply(q, F.toWatch);\n            }), m.constant = N, m.toWatch = X ? q : [m];\n            break;\n          case Ne.AssignmentExpression:\n            Pt(m.left, O, H), Pt(m.right, O, H), m.constant = m.left.constant && m.right.constant, m.toWatch = [m];\n            break;\n          case Ne.ArrayExpression:\n            N = !0, q = [], s(m.elements, function(F) {\n              Pt(F, O, H), N = N && F.constant, q.push.apply(q, F.toWatch);\n            }), m.constant = N, m.toWatch = q;\n            break;\n          case Ne.ObjectExpression:\n            N = !0, q = [], s(m.properties, function(F) {\n              Pt(F.value, O, H), N = N && F.value.constant, q.push.apply(q, F.value.toWatch), F.computed && (Pt(F.key, O, !1), N = N && F.key.constant, q.push.apply(q, F.key.toWatch));\n            }), m.constant = N, m.toWatch = q;\n            break;\n          case Ne.ThisExpression:\n          case Ne.LocalsExpression:\n            m.constant = !1, m.toWatch = [];\n        }\n      }\n      function Jt(m) {\n        if (m.length === 1) {\n          var O = m[0].expression, D = O.toWatch;\n          return D.length !== 1 || D[0] !== O ? D : void 0;\n        }\n      }\n      function Se(m) {\n        return m.type === Ne.Identifier || m.type === Ne.MemberExpression;\n      }\n      function se(m) {\n        if (m.body.length === 1 && Se(m.body[0].expression))\n          return {\n            type: Ne.AssignmentExpression,\n            left: m.body[0].expression,\n            right: { type: Ne.NGValueParameter },\n            operator: \"=\"\n          };\n      }\n      function Oe(m) {\n        this.$filter = m;\n      }\n      function De(m) {\n        this.$filter = m;\n      }\n      function Ve(m, O, D) {\n        this.ast = new Ne(m, D), this.astCompiler = D.csp ? new De(O) : new Oe(O);\n      }\n      function Ye(m) {\n        return ne(m.valueOf) ? m.valueOf() : Go.call(m);\n      }\n      function hr() {\n        var m, O, D = ur(), N = { true: !0, false: !1, null: null, undefined: void 0 };\n        this.addLiteral = function(q, X) {\n          N[q] = X;\n        }, this.setIdentifierFns = function(q, X) {\n          return m = q, O = X, this;\n        }, this.$get = [\n          \"$filter\",\n          function(q) {\n            var X = {\n              csp: je().noUnsafeEval,\n              literals: le(N),\n              isIdentifierStart: ne(m) && m,\n              isIdentifierContinue: ne(O) && O\n            };\n            return H.$$getAst = function(Tt) {\n              return new Ve(new na(X), q, X).getAst(Tt).ast;\n            }, H;\n            function H(Tt, Vt) {\n              var oe, _t;\n              switch (typeof Tt) {\n                case \"string\":\n                  return Tt = Tt.trim(), !(oe = D[_t = Tt]) && (oe = new Ve(new na(X), q, X).parse(Tt), D[_t] = Ct(oe)), jt(oe, Vt);\n                case \"function\":\n                  return jt(Tt, Vt);\n                default:\n                  return jt(Z, Vt);\n              }\n            }\n            function F(Tt, Vt, oe) {\n              return Tt == null || Vt == null ? Tt === Vt : !(typeof Tt == \"object\" && typeof (Tt = Ye(Tt)) == \"object\" && !oe) && (Tt === Vt || Tt != Tt && Vt != Vt);\n            }\n            function Q(Tt, Vt, oe, _t, Bt) {\n              var Qt, At = _t.inputs;\n              if (At.length === 1) {\n                var wt = F;\n                return At = At[0], Tt.$watch(\n                  function(ie) {\n                    var ge = At(ie);\n                    return F(ge, wt, At.isPure) || (Qt = _t(ie, void 0, void 0, [ge]), wt = ge && Ye(ge)), Qt;\n                  },\n                  Vt,\n                  oe,\n                  Bt\n                );\n              }\n              for (var Ot = [], Ft = [], qt = 0, ue = At.length; qt < ue; qt++)\n                Ot[qt] = F, Ft[qt] = null;\n              return Tt.$watch(\n                function(ie) {\n                  for (var ge = !1, Te = 0, Xe = At.length; Te < Xe; Te++) {\n                    var He = At[Te](ie);\n                    (ge || (ge = !F(He, Ot[Te], At[Te].isPure))) && (Ft[Te] = He, Ot[Te] = He && Ye(He));\n                  }\n                  return ge && (Qt = _t(ie, void 0, void 0, Ft)), Qt;\n                },\n                Vt,\n                oe,\n                Bt\n              );\n            }\n            function K(Tt, Vt, oe, _t, Bt) {\n              var Qt, At, wt = _t.literal ? it : ot, Ot = _t.$$intercepted || _t, Ft = _t.$$interceptor || at, qt = _t.inputs && !Ot.inputs;\n              return ie.literal = _t.literal, ie.constant = _t.constant, ie.inputs = _t.inputs, Ct(ie), Qt = Tt.$watch(ie, Vt, oe, Bt);\n              function ue() {\n                wt(At) && Qt();\n              }\n              function ie(ge, Te, Xe, He) {\n                return At = qt && He ? He[0] : Ot(ge, Te, Xe, He), wt(At) && ge.$$postDigest(ue), Ft(At);\n              }\n            }\n            function it(Tt) {\n              var Vt = !0;\n              return s(Tt, function(oe) {\n                ot(oe) || (Vt = !1);\n              }), Vt;\n            }\n            function st(Tt, Vt, oe, _t) {\n              var Bt = Tt.$watch(\n                function(Qt) {\n                  return Bt(), _t(Qt);\n                },\n                Vt,\n                oe\n              );\n              return Bt;\n            }\n            function Ct(Tt) {\n              return Tt.constant ? Tt.$$watchDelegate = st : Tt.oneTime ? Tt.$$watchDelegate = K : Tt.inputs && (Tt.$$watchDelegate = Q), Tt;\n            }\n            function jt(Tt, Vt) {\n              if (!Vt) return Tt;\n              Tt.$$interceptor && (Vt = function(Bt, Qt) {\n                function At(wt) {\n                  return Qt(Bt(wt));\n                }\n                return At.$stateful = Bt.$stateful || Qt.$stateful, At.$$pure = Bt.$$pure && Qt.$$pure, At;\n              }(Tt.$$interceptor, Vt), Tt = Tt.$$intercepted);\n              var oe = !1, _t = function(Bt, Qt, At, wt) {\n                var Ot = oe && wt ? wt[0] : Tt(Bt, Qt, At, wt);\n                return Vt(Ot);\n              };\n              return _t.$$intercepted = Tt, _t.$$interceptor = Vt, _t.literal = Tt.literal, _t.oneTime = Tt.oneTime, _t.constant = Tt.constant, Vt.$stateful || (oe = !Tt.inputs, _t.inputs = Tt.inputs ? Tt.inputs : [Tt], Vt.$$pure || (_t.inputs = _t.inputs.map(function(Bt) {\n                return Bt.isPure === 2 ? function(Qt) {\n                  return Bt(Qt);\n                } : Bt;\n              }))), Ct(_t);\n            }\n          }\n        ];\n      }\n      function jr() {\n        var m = !0;\n        this.$get = [\n          \"$rootScope\",\n          \"$exceptionHandler\",\n          function(O, D) {\n            return Vr(\n              function(N) {\n                O.$evalAsync(N);\n              },\n              D,\n              m\n            );\n          }\n        ], this.errorOnUnhandledRejections = function(O) {\n          return ot(O) ? (m = O, this) : m;\n        };\n      }\n      function Er() {\n        var m = !0;\n        this.$get = [\n          \"$browser\",\n          \"$exceptionHandler\",\n          function(O, D) {\n            return Vr(\n              function(N) {\n                O.defer(N);\n              },\n              D,\n              m\n            );\n          }\n        ], this.errorOnUnhandledRejections = function(O) {\n          return ot(O) ? (m = O, this) : m;\n        };\n      }\n      function Vr(m, O, D) {\n        var N = E(\"$q\", TypeError), q = 0, X = [];\n        function H() {\n          return new F();\n        }\n        function F() {\n          var At = this.promise = new Q();\n          this.resolve = function(wt) {\n            st(At, wt);\n          }, this.reject = function(wt) {\n            Ct(At, wt);\n          }, this.notify = function(wt) {\n            Tt(At, wt);\n          };\n        }\n        function Q() {\n          this.$$state = { status: 0 };\n        }\n        function K() {\n          for (; !q && X.length; ) {\n            var At = X.shift();\n            if (!Cn(At)) {\n              Tr(At);\n              var wt = \"Possibly unhandled rejection: \" + $a(At.value);\n              be(At.value) ? O(At.value, wt) : O(wt);\n            }\n          }\n        }\n        function it(At) {\n          !D || At.pending || At.status !== 2 || Cn(At) || (q === 0 && X.length === 0 && m(K), X.push(At)), !At.processScheduled && At.pending && (At.processScheduled = !0, ++q, m(function() {\n            (function(wt) {\n              var Ot, Ft, qt;\n              qt = wt.pending, wt.processScheduled = !1, wt.pending = void 0;\n              try {\n                for (var ue = 0, ie = qt.length; ue < ie; ++ue) {\n                  Tr(wt), Ft = qt[ue][0], Ot = qt[ue][wt.status];\n                  try {\n                    ne(Ot) ? st(Ft, Ot(wt.value)) : wt.status === 1 ? st(Ft, wt.value) : Ct(Ft, wt.value);\n                  } catch (ge) {\n                    Ct(Ft, ge), ge && ge.$$passToExceptionHandler === !0 && O(ge);\n                  }\n                }\n              } finally {\n                --q, D && q === 0 && m(K);\n              }\n            })(At);\n          }));\n        }\n        function st(At, wt) {\n          At.$$state.status || (wt === At ? jt(\n            At,\n            N(\n              \"qcycle\",\n              \"Expected promise to be resolved with value other than itself '{0}'\",\n              wt\n            )\n          ) : function Ot(Ft, qt) {\n            var ue, ie = !1;\n            try {\n              (gt(qt) || ne(qt)) && (ue = qt.then), ne(ue) ? (Ft.$$state.status = -1, ue.call(qt, ge, Te, function(Xe) {\n                Tt(Ft, Xe);\n              })) : (Ft.$$state.value = qt, Ft.$$state.status = 1, it(Ft.$$state));\n            } catch (Xe) {\n              Te(Xe);\n            }\n            function ge(Xe) {\n              ie || (ie = !0, Ot(Ft, Xe));\n            }\n            function Te(Xe) {\n              ie || (ie = !0, jt(Ft, Xe));\n            }\n          }(At, wt));\n        }\n        function Ct(At, wt) {\n          At.$$state.status || jt(At, wt);\n        }\n        function jt(At, wt) {\n          At.$$state.value = wt, At.$$state.status = 2, it(At.$$state);\n        }\n        function Tt(At, wt) {\n          var Ot = At.$$state.pending;\n          At.$$state.status <= 0 && Ot && Ot.length && m(function() {\n            for (var Ft, qt, ue = 0, ie = Ot.length; ue < ie; ue++) {\n              qt = Ot[ue][0], Ft = Ot[ue][3];\n              try {\n                Tt(qt, ne(Ft) ? Ft(wt) : wt);\n              } catch (ge) {\n                O(ge);\n              }\n            }\n          });\n        }\n        function Vt(At) {\n          var wt = new Q();\n          return Ct(wt, At), wt;\n        }\n        function oe(At, wt, Ot) {\n          var Ft = null;\n          try {\n            ne(Ot) && (Ft = Ot());\n          } catch (qt) {\n            return Vt(qt);\n          }\n          return Le(Ft) ? Ft.then(function() {\n            return wt(At);\n          }, Vt) : wt(At);\n        }\n        function _t(At, wt, Ot, Ft) {\n          var qt = new Q();\n          return st(qt, At), qt.then(wt, Ot, Ft);\n        }\n        z(Q.prototype, {\n          then: function(At, wt, Ot) {\n            if (ct(At) && ct(wt) && ct(Ot)) return this;\n            var Ft = new Q();\n            return this.$$state.pending = this.$$state.pending || [], this.$$state.pending.push([Ft, At, wt, Ot]), this.$$state.status > 0 && it(this.$$state), Ft;\n          },\n          catch: function(At) {\n            return this.then(null, At);\n          },\n          finally: function(At, wt) {\n            return this.then(\n              function(Ot) {\n                return oe(Ot, Bt, At);\n              },\n              function(Ot) {\n                return oe(Ot, Vt, At);\n              },\n              wt\n            );\n          }\n        });\n        var Bt = _t;\n        function Qt(At) {\n          if (!ne(At)) throw N(\"norslvr\", \"Expected resolverFn, got '{0}'\", At);\n          var wt = new Q();\n          return At(\n            function(Ot) {\n              st(wt, Ot);\n            },\n            function(Ot) {\n              Ct(wt, Ot);\n            }\n          ), wt;\n        }\n        return Qt.prototype = Q.prototype, Qt.defer = H, Qt.reject = Vt, Qt.when = _t, Qt.resolve = Bt, Qt.all = function(At) {\n          var wt = new Q(), Ot = 0, Ft = re(At) ? [] : {};\n          return s(At, function(qt, ue) {\n            Ot++, _t(qt).then(\n              function(ie) {\n                Ft[ue] = ie, --Ot || st(wt, Ft);\n              },\n              function(ie) {\n                Ct(wt, ie);\n              }\n            );\n          }), Ot === 0 && st(wt, Ft), wt;\n        }, Qt.race = function(At) {\n          var wt = H();\n          return s(At, function(Ot) {\n            _t(Ot).then(wt.resolve, wt.reject);\n          }), wt.promise;\n        }, Qt;\n      }\n      function Cn(m) {\n        return !!m.pur;\n      }\n      function Tr(m) {\n        m.pur = !0;\n      }\n      function fi(m) {\n        m.$$state && Tr(m.$$state);\n      }\n      function oi() {\n        this.$get = [\n          \"$window\",\n          \"$timeout\",\n          function(m, O) {\n            var D = m.requestAnimationFrame || m.webkitRequestAnimationFrame, N = m.cancelAnimationFrame || m.webkitCancelAnimationFrame || m.webkitCancelRequestAnimationFrame, q = !!D, X = q ? function(H) {\n              var F = D(H);\n              return function() {\n                N(F);\n              };\n            } : function(H) {\n              var F = O(H, 16.66, !1);\n              return function() {\n                O.cancel(F);\n              };\n            };\n            return X.supported = q, X;\n          }\n        ];\n      }\n      function qi() {\n        var m = 10, O = E(\"$rootScope\"), D = null, N = null;\n        this.digestTtl = function(q) {\n          return arguments.length && (m = q), m;\n        }, this.$get = [\n          \"$exceptionHandler\",\n          \"$parse\",\n          \"$browser\",\n          function(q, X, H) {\n            function F(At) {\n              At.currentScope.$$destroyed = !0;\n            }\n            function Q() {\n              this.$id = I(), this.$$phase = this.$parent = this.$$watchers = this.$$nextSibling = this.$$prevSibling = this.$$childHead = this.$$childTail = null, this.$root = this, this.$$destroyed = !1, this.$$suspended = !1, this.$$listeners = {}, this.$$listenerCount = {}, this.$$watchersCount = 0, this.$$isolateBindings = null;\n            }\n            Q.prototype = {\n              constructor: Q,\n              $new: function(At, wt) {\n                var Ot;\n                return wt = wt || this, At ? (Ot = new Q()).$root = this.$root : (this.$$ChildScope || (this.$$ChildScope = function(Ft) {\n                  function qt() {\n                    this.$$watchers = this.$$nextSibling = this.$$childHead = this.$$childTail = null, this.$$listeners = {}, this.$$listenerCount = {}, this.$$watchersCount = 0, this.$id = I(), this.$$ChildScope = null, this.$$suspended = !1;\n                  }\n                  return qt.prototype = Ft, qt;\n                }(this)), Ot = new this.$$ChildScope()), Ot.$parent = wt, Ot.$$prevSibling = wt.$$childTail, wt.$$childHead ? (wt.$$childTail.$$nextSibling = Ot, wt.$$childTail = Ot) : wt.$$childHead = wt.$$childTail = Ot, (At || wt !== this) && Ot.$on(\"$destroy\", F), Ot;\n              },\n              $watch: function(At, wt, Ot, Ft) {\n                var qt = X(At), ue = ne(wt) ? wt : Z;\n                if (qt.$$watchDelegate)\n                  return qt.$$watchDelegate(this, ue, Ot, qt, At);\n                var ie = this, ge = ie.$$watchers, Te = { fn: ue, last: Bt, get: qt, exp: Ft || At, eq: !!Ot };\n                return D = null, ge || ((ge = ie.$$watchers = []).$$digestWatchIndex = -1), ge.unshift(Te), ge.$$digestWatchIndex++, oe(this, 1), function() {\n                  var Xe = Wt(ge, Te);\n                  Xe >= 0 && (oe(ie, -1), Xe < ge.$$digestWatchIndex && ge.$$digestWatchIndex--), D = null;\n                };\n              },\n              $watchGroup: function(At, wt) {\n                var Ot = new Array(At.length), Ft = new Array(At.length), qt = [], ue = this, ie = !1, ge = !0;\n                if (!At.length) {\n                  var Te = !0;\n                  return ue.$evalAsync(function() {\n                    Te && wt(Ft, Ft, ue);\n                  }), function() {\n                    Te = !1;\n                  };\n                }\n                if (At.length === 1)\n                  return this.$watch(At[0], function(He, Qr, vr) {\n                    Ft[0] = He, Ot[0] = Qr, wt(Ft, He === Qr ? Ft : Ot, vr);\n                  });\n                function Xe() {\n                  ie = !1;\n                  try {\n                    ge ? (ge = !1, wt(Ft, Ft, ue)) : wt(Ft, Ot, ue);\n                  } finally {\n                    for (var He = 0; He < At.length; He++) Ot[He] = Ft[He];\n                  }\n                }\n                return s(At, function(He, Qr) {\n                  var vr = ue.$watch(He, function(Cr) {\n                    Ft[Qr] = Cr, ie || (ie = !0, ue.$evalAsync(Xe));\n                  });\n                  qt.push(vr);\n                }), function() {\n                  for (; qt.length; ) qt.shift()();\n                };\n              },\n              $watchCollection: function(At, wt) {\n                Cr.$$pure = X(At).literal, Cr.$stateful = !Cr.$$pure;\n                var Ot, Ft, qt, ue = this, ie = wt.length > 1, ge = 0, Te = X(At, Cr), Xe = [], He = {}, Qr = !0, vr = 0;\n                function Cr(cn) {\n                  var Pr, dn, _n, On;\n                  if (!ct(Ot = cn)) {\n                    if (gt(Ot))\n                      if (k(Ot)) {\n                        Ft !== Xe && (vr = (Ft = Xe).length = 0, ge++), Pr = Ot.length, vr !== Pr && (ge++, Ft.length = vr = Pr);\n                        for (var kn = 0; kn < Pr; kn++)\n                          On = Ft[kn], _n = Ot[kn], On != On && _n != _n || On === _n || (ge++, Ft[kn] = _n);\n                      } else {\n                        for (dn in Ft !== He && (Ft = He = {}, vr = 0, ge++), Pr = 0, Ot)\n                          a.call(Ot, dn) && (Pr++, _n = Ot[dn], On = Ft[dn], dn in Ft ? On != On && _n != _n || On === _n || (ge++, Ft[dn] = _n) : (vr++, Ft[dn] = _n, ge++));\n                        if (vr > Pr)\n                          for (dn in ge++, Ft)\n                            a.call(Ot, dn) || (vr--, delete Ft[dn]);\n                      }\n                    else Ft !== Ot && (Ft = Ot, ge++);\n                    return ge;\n                  }\n                }\n                return this.$watch(Te, function() {\n                  if (Qr ? (Qr = !1, wt(Ot, Ot, ue)) : wt(Ot, qt, ue), ie)\n                    if (gt(Ot))\n                      if (k(Ot)) {\n                        qt = new Array(Ot.length);\n                        for (var cn = 0; cn < Ot.length; cn++) qt[cn] = Ot[cn];\n                      } else\n                        for (var Pr in qt = {}, Ot)\n                          a.call(Ot, Pr) && (qt[Pr] = Ot[Pr]);\n                    else qt = Ot;\n                });\n              },\n              $digest: function() {\n                var At, wt, Ot, Ft, qt, ue, ie, ge, Te, Xe = m, He = it.length ? K : this, Qr = [];\n                Tt(\"$digest\"), H.$$checkUrlChange(), this === K && N !== null && (H.defer.cancel(N), Qt()), D = null;\n                do {\n                  qt = !1, ie = He;\n                  for (var vr = 0; vr < it.length; vr++) {\n                    try {\n                      (0, (Te = it[vr]).fn)(Te.scope, Te.locals);\n                    } catch (Cr) {\n                      q(Cr);\n                    }\n                    D = null;\n                  }\n                  it.length = 0;\n                  t: do {\n                    if (Ft = !ie.$$suspended && ie.$$watchers)\n                      for (Ft.$$digestWatchIndex = Ft.length; Ft.$$digestWatchIndex--; )\n                        try {\n                          if (At = Ft[Ft.$$digestWatchIndex])\n                            if ((wt = (0, At.get)(ie)) === (Ot = At.last) || (At.eq ? pe(wt, Ot) : Y(wt) && Y(Ot))) {\n                              if (At === D) {\n                                qt = !1;\n                                break t;\n                              }\n                            } else\n                              qt = !0, D = At, At.last = At.eq ? le(wt, null) : wt, (0, At.fn)(wt, Ot === Bt ? wt : Ot, ie), Xe < 5 && (Qr[ge = 4 - Xe] || (Qr[ge] = []), Qr[ge].push({\n                                msg: ne(At.exp) ? \"fn: \" + (At.exp.name || At.exp.toString()) : At.exp,\n                                newVal: wt,\n                                oldVal: Ot\n                              }));\n                        } catch (Cr) {\n                          q(Cr);\n                        }\n                    if (!(ue = !ie.$$suspended && ie.$$watchersCount && ie.$$childHead || ie !== He && ie.$$nextSibling))\n                      for (; ie !== He && !(ue = ie.$$nextSibling); )\n                        ie = ie.$parent;\n                  } while (ie = ue);\n                  if ((qt || it.length) && !Xe--)\n                    throw Vt(), O(\n                      \"infdig\",\n                      `{0} $digest() iterations reached. Aborting!\nWatchers fired in the last 5 iterations: {1}`,\n                      m,\n                      Qr\n                    );\n                } while (qt || it.length);\n                for (Vt(); jt < st.length; )\n                  try {\n                    st[jt++]();\n                  } catch (Cr) {\n                    q(Cr);\n                  }\n                st.length = jt = 0, H.$$checkUrlChange();\n              },\n              $suspend: function() {\n                this.$$suspended = !0;\n              },\n              $isSuspended: function() {\n                return this.$$suspended;\n              },\n              $resume: function() {\n                this.$$suspended = !1;\n              },\n              $destroy: function() {\n                if (!this.$$destroyed) {\n                  var At = this.$parent;\n                  for (var wt in this.$broadcast(\"$destroy\"), this.$$destroyed = !0, this === K && H.$$applicationDestroyed(), oe(this, -this.$$watchersCount), this.$$listenerCount)\n                    _t(this, this.$$listenerCount[wt], wt);\n                  At && At.$$childHead === this && (At.$$childHead = this.$$nextSibling), At && At.$$childTail === this && (At.$$childTail = this.$$prevSibling), this.$$prevSibling && (this.$$prevSibling.$$nextSibling = this.$$nextSibling), this.$$nextSibling && (this.$$nextSibling.$$prevSibling = this.$$prevSibling), this.$destroy = this.$digest = this.$apply = this.$evalAsync = this.$applyAsync = Z, this.$on = this.$watch = this.$watchGroup = function() {\n                    return Z;\n                  }, this.$$listeners = {}, this.$$nextSibling = null, function Ot(Ft) {\n                    y === 9 && (Ft.$$childHead && Ot(Ft.$$childHead), Ft.$$nextSibling && Ot(Ft.$$nextSibling)), Ft.$parent = Ft.$$nextSibling = Ft.$$prevSibling = Ft.$$childHead = Ft.$$childTail = Ft.$root = Ft.$$watchers = null;\n                  }(this);\n                }\n              },\n              $eval: function(At, wt) {\n                return X(At)(this, wt);\n              },\n              $evalAsync: function(At, wt) {\n                K.$$phase || it.length || H.defer(\n                  function() {\n                    it.length && K.$digest();\n                  },\n                  null,\n                  \"$evalAsync\"\n                ), it.push({ scope: this, fn: X(At), locals: wt });\n              },\n              $$postDigest: function(At) {\n                st.push(At);\n              },\n              $apply: function(At) {\n                try {\n                  Tt(\"$apply\");\n                  try {\n                    return this.$eval(At);\n                  } finally {\n                    Vt();\n                  }\n                } catch (wt) {\n                  q(wt);\n                } finally {\n                  try {\n                    K.$digest();\n                  } catch (wt) {\n                    throw q(wt), wt;\n                  }\n                }\n              },\n              $applyAsync: function(At) {\n                var wt = this;\n                At && Ct.push(function() {\n                  wt.$eval(At);\n                }), At = X(At), N === null && (N = H.defer(\n                  function() {\n                    K.$apply(Qt);\n                  },\n                  null,\n                  \"$applyAsync\"\n                ));\n              },\n              $on: function(At, wt) {\n                var Ot = this.$$listeners[At];\n                Ot || (this.$$listeners[At] = Ot = []), Ot.push(wt);\n                var Ft = this;\n                do\n                  Ft.$$listenerCount[At] || (Ft.$$listenerCount[At] = 0), Ft.$$listenerCount[At]++;\n                while (Ft = Ft.$parent);\n                var qt = this;\n                return function() {\n                  var ue = Ot.indexOf(wt);\n                  ue !== -1 && (delete Ot[ue], _t(qt, 1, At));\n                };\n              },\n              $emit: function(At, wt) {\n                var Ot, Ft, qt, ue = [], ie = this, ge = !1, Te = {\n                  name: At,\n                  targetScope: ie,\n                  stopPropagation: function() {\n                    ge = !0;\n                  },\n                  preventDefault: function() {\n                    Te.defaultPrevented = !0;\n                  },\n                  defaultPrevented: !1\n                }, Xe = Ze([Te], arguments, 1);\n                do {\n                  for (Ot = ie.$$listeners[At] || ue, Te.currentScope = ie, Ft = 0, qt = Ot.length; Ft < qt; Ft++)\n                    if (Ot[Ft])\n                      try {\n                        Ot[Ft].apply(null, Xe);\n                      } catch (He) {\n                        q(He);\n                      }\n                    else Ot.splice(Ft, 1), Ft--, qt--;\n                  if (ge) break;\n                  ie = ie.$parent;\n                } while (ie);\n                return Te.currentScope = null, Te;\n              },\n              $broadcast: function(At, wt) {\n                var Ot = this, Ft = Ot, qt = Ot, ue = {\n                  name: At,\n                  targetScope: Ot,\n                  preventDefault: function() {\n                    ue.defaultPrevented = !0;\n                  },\n                  defaultPrevented: !1\n                };\n                if (!Ot.$$listenerCount[At]) return ue;\n                for (var ie, ge, Te, Xe = Ze([ue], arguments, 1); Ft = qt; ) {\n                  for (ue.currentScope = Ft, ge = 0, Te = (ie = Ft.$$listeners[At] || []).length; ge < Te; ge++)\n                    if (ie[ge])\n                      try {\n                        ie[ge].apply(null, Xe);\n                      } catch (He) {\n                        q(He);\n                      }\n                    else ie.splice(ge, 1), ge--, Te--;\n                  if (!(qt = Ft.$$listenerCount[At] && Ft.$$childHead || Ft !== Ot && Ft.$$nextSibling))\n                    for (; Ft !== Ot && !(qt = Ft.$$nextSibling); ) Ft = Ft.$parent;\n                }\n                return ue.currentScope = null, ue;\n              }\n            };\n            var K = new Q(), it = K.$$asyncQueue = [], st = K.$$postDigestQueue = [], Ct = K.$$applyAsyncQueue = [], jt = 0;\n            return K;\n            function Tt(At) {\n              if (K.$$phase)\n                throw O(\"inprog\", \"{0} already in progress\", K.$$phase);\n              K.$$phase = At;\n            }\n            function Vt() {\n              K.$$phase = null;\n            }\n            function oe(At, wt) {\n              do\n                At.$$watchersCount += wt;\n              while (At = At.$parent);\n            }\n            function _t(At, wt, Ot) {\n              do\n                At.$$listenerCount[Ot] -= wt, At.$$listenerCount[Ot] === 0 && delete At.$$listenerCount[Ot];\n              while (At = At.$parent);\n            }\n            function Bt() {\n            }\n            function Qt() {\n              for (; Ct.length; )\n                try {\n                  Ct.shift()();\n                } catch (At) {\n                  q(At);\n                }\n              N = null;\n            }\n          }\n        ];\n      }\n      function Lr() {\n        var m = /^\\s*(https?|s?ftp|mailto|tel|file):/, O = /^\\s*((https?|ftp|file|blob):|data:image\\/)/;\n        this.aHrefSanitizationTrustedUrlList = function(D) {\n          return ot(D) ? (m = D, this) : m;\n        }, this.imgSrcSanitizationTrustedUrlList = function(D) {\n          return ot(D) ? (O = D, this) : O;\n        }, this.$get = function() {\n          return function(D, N) {\n            var q = N ? O : m, X = $o(D && D.trim()).href;\n            return X === \"\" || X.match(q) ? D : \"unsafe:\" + X;\n          };\n        };\n      }\n      Oe.prototype = {\n        compile: function(m) {\n          var O = this;\n          this.state = {\n            nextId: 0,\n            filters: {},\n            fn: { vars: [], body: [], own: {} },\n            assign: { vars: [], body: [], own: {} },\n            inputs: []\n          }, Pt(m, O.$filter);\n          var D, N = \"\";\n          if (this.stage = \"assign\", D = se(m)) {\n            this.state.computing = \"assign\";\n            var q = this.nextId();\n            this.recurse(D, q), this.return_(q), N = \"fn.assign=\" + this.generateFunction(\"assign\", \"s,v,l\");\n          }\n          var X = Jt(m.body);\n          O.stage = \"inputs\", s(X, function(Q, K) {\n            var it = \"fn\" + K;\n            O.state[it] = { vars: [], body: [], own: {} }, O.state.computing = it;\n            var st = O.nextId();\n            O.recurse(Q, st), O.return_(st), O.state.inputs.push({ name: it, isPure: Q.isPure }), Q.watchId = K;\n          }), this.state.computing = \"fn\", this.stage = \"main\", this.recurse(m);\n          var H = '\"' + this.USE + \" \" + this.STRICT + `\";\n` + this.filterPrefix() + \"var fn=\" + this.generateFunction(\"fn\", \"s,l,a,i\") + N + this.watchFns() + \"return fn;\", F = new Function(\n            \"$filter\",\n            \"getStringValue\",\n            \"ifDefined\",\n            \"plus\",\n            H\n          )(this.$filter, go, ps, bt);\n          return this.state = this.stage = void 0, F;\n        },\n        USE: \"use\",\n        STRICT: \"strict\",\n        watchFns: function() {\n          var m = [], O = this.state.inputs, D = this;\n          return s(O, function(N) {\n            m.push(\"var \" + N.name + \"=\" + D.generateFunction(N.name, \"s\")), N.isPure && m.push(N.name, \".isPure=\" + JSON.stringify(N.isPure) + \";\");\n          }), O.length && m.push(\n            \"fn.inputs=[\" + O.map(function(N) {\n              return N.name;\n            }).join(\",\") + \"];\"\n          ), m.join(\"\");\n        },\n        generateFunction: function(m, O) {\n          return \"function(\" + O + \"){\" + this.varsPrefix(m) + this.body(m) + \"};\";\n        },\n        filterPrefix: function() {\n          var m = [], O = this;\n          return s(this.state.filters, function(D, N) {\n            m.push(D + \"=$filter(\" + O.escape(N) + \")\");\n          }), m.length ? \"var \" + m.join(\",\") + \";\" : \"\";\n        },\n        varsPrefix: function(m) {\n          return this.state[m].vars.length ? \"var \" + this.state[m].vars.join(\",\") + \";\" : \"\";\n        },\n        body: function(m) {\n          return this.state[m].body.join(\"\");\n        },\n        recurse: function(m, O, D, N, q, X) {\n          var H, F, Q, K, it, st = this;\n          if (N = N || Z, !X && ot(m.watchId))\n            return O = O || this.nextId(), void this.if_(\n              \"i\",\n              this.lazyAssign(O, this.computedMember(\"i\", m.watchId)),\n              this.lazyRecurse(m, O, D, N, q, !0)\n            );\n          switch (m.type) {\n            case Ne.Program:\n              s(m.body, function(Ct, jt) {\n                st.recurse(Ct.expression, void 0, void 0, function(Tt) {\n                  F = Tt;\n                }), jt !== m.body.length - 1 ? st.current().body.push(F, \";\") : st.return_(F);\n              });\n              break;\n            case Ne.Literal:\n              K = this.escape(m.value), this.assign(O, K), N(O || K);\n              break;\n            case Ne.UnaryExpression:\n              this.recurse(m.argument, void 0, void 0, function(Ct) {\n                F = Ct;\n              }), K = m.operator + \"(\" + this.ifDefined(F, 0) + \")\", this.assign(O, K), N(K);\n              break;\n            case Ne.BinaryExpression:\n              this.recurse(m.left, void 0, void 0, function(Ct) {\n                H = Ct;\n              }), this.recurse(m.right, void 0, void 0, function(Ct) {\n                F = Ct;\n              }), K = m.operator === \"+\" ? this.plus(H, F) : m.operator === \"-\" ? this.ifDefined(H, 0) + m.operator + this.ifDefined(F, 0) : \"(\" + H + \")\" + m.operator + \"(\" + F + \")\", this.assign(O, K), N(K);\n              break;\n            case Ne.LogicalExpression:\n              O = O || this.nextId(), st.recurse(m.left, O), st.if_(\n                m.operator === \"&&\" ? O : st.not(O),\n                st.lazyRecurse(m.right, O)\n              ), N(O);\n              break;\n            case Ne.ConditionalExpression:\n              O = O || this.nextId(), st.recurse(m.test, O), st.if_(\n                O,\n                st.lazyRecurse(m.alternate, O),\n                st.lazyRecurse(m.consequent, O)\n              ), N(O);\n              break;\n            case Ne.Identifier:\n              O = O || this.nextId(), D && (D.context = st.stage === \"inputs\" ? \"s\" : this.assign(\n                this.nextId(),\n                this.getHasOwnProperty(\"l\", m.name) + \"?l:s\"\n              ), D.computed = !1, D.name = m.name), st.if_(\n                st.stage === \"inputs\" || st.not(st.getHasOwnProperty(\"l\", m.name)),\n                function() {\n                  st.if_(st.stage === \"inputs\" || \"s\", function() {\n                    q && q !== 1 && st.if_(\n                      st.isNull(st.nonComputedMember(\"s\", m.name)),\n                      st.lazyAssign(st.nonComputedMember(\"s\", m.name), \"{}\")\n                    ), st.assign(O, st.nonComputedMember(\"s\", m.name));\n                  });\n                },\n                O && st.lazyAssign(O, st.nonComputedMember(\"l\", m.name))\n              ), N(O);\n              break;\n            case Ne.MemberExpression:\n              H = D && (D.context = this.nextId()) || this.nextId(), O = O || this.nextId(), st.recurse(\n                m.object,\n                H,\n                void 0,\n                function() {\n                  st.if_(\n                    st.notNull(H),\n                    function() {\n                      m.computed ? (F = st.nextId(), st.recurse(m.property, F), st.getStringValue(F), q && q !== 1 && st.if_(\n                        st.not(st.computedMember(H, F)),\n                        st.lazyAssign(st.computedMember(H, F), \"{}\")\n                      ), K = st.computedMember(H, F), st.assign(O, K), D && (D.computed = !0, D.name = F)) : (q && q !== 1 && st.if_(\n                        st.isNull(\n                          st.nonComputedMember(H, m.property.name)\n                        ),\n                        st.lazyAssign(\n                          st.nonComputedMember(H, m.property.name),\n                          \"{}\"\n                        )\n                      ), K = st.nonComputedMember(H, m.property.name), st.assign(O, K), D && (D.computed = !1, D.name = m.property.name));\n                    },\n                    function() {\n                      st.assign(O, \"undefined\");\n                    }\n                  ), N(O);\n                },\n                !!q\n              );\n              break;\n            case Ne.CallExpression:\n              O = O || this.nextId(), m.filter ? (F = st.filter(m.callee.name), Q = [], s(m.arguments, function(Ct) {\n                var jt = st.nextId();\n                st.recurse(Ct, jt), Q.push(jt);\n              }), K = F + \"(\" + Q.join(\",\") + \")\", st.assign(O, K), N(O)) : (F = st.nextId(), H = {}, Q = [], st.recurse(m.callee, F, H, function() {\n                st.if_(\n                  st.notNull(F),\n                  function() {\n                    s(m.arguments, function(Ct) {\n                      st.recurse(\n                        Ct,\n                        m.constant ? void 0 : st.nextId(),\n                        void 0,\n                        function(jt) {\n                          Q.push(jt);\n                        }\n                      );\n                    }), K = H.name ? st.member(H.context, H.name, H.computed) + \"(\" + Q.join(\",\") + \")\" : F + \"(\" + Q.join(\",\") + \")\", st.assign(O, K);\n                  },\n                  function() {\n                    st.assign(O, \"undefined\");\n                  }\n                ), N(O);\n              }));\n              break;\n            case Ne.AssignmentExpression:\n              F = this.nextId(), H = {}, this.recurse(\n                m.left,\n                void 0,\n                H,\n                function() {\n                  st.if_(st.notNull(H.context), function() {\n                    st.recurse(m.right, F), K = st.member(H.context, H.name, H.computed) + m.operator + F, st.assign(O, K), N(O || K);\n                  });\n                },\n                1\n              );\n              break;\n            case Ne.ArrayExpression:\n              Q = [], s(m.elements, function(Ct) {\n                st.recurse(\n                  Ct,\n                  m.constant ? void 0 : st.nextId(),\n                  void 0,\n                  function(jt) {\n                    Q.push(jt);\n                  }\n                );\n              }), K = \"[\" + Q.join(\",\") + \"]\", this.assign(O, K), N(O || K);\n              break;\n            case Ne.ObjectExpression:\n              Q = [], it = !1, s(m.properties, function(Ct) {\n                Ct.computed && (it = !0);\n              }), it ? (O = O || this.nextId(), this.assign(O, \"{}\"), s(m.properties, function(Ct) {\n                Ct.computed ? (H = st.nextId(), st.recurse(Ct.key, H)) : H = Ct.key.type === Ne.Identifier ? Ct.key.name : \"\" + Ct.key.value, F = st.nextId(), st.recurse(Ct.value, F), st.assign(st.member(O, H, Ct.computed), F);\n              })) : (s(m.properties, function(Ct) {\n                st.recurse(\n                  Ct.value,\n                  m.constant ? void 0 : st.nextId(),\n                  void 0,\n                  function(jt) {\n                    Q.push(\n                      st.escape(\n                        Ct.key.type === Ne.Identifier ? Ct.key.name : \"\" + Ct.key.value\n                      ) + \":\" + jt\n                    );\n                  }\n                );\n              }), K = \"{\" + Q.join(\",\") + \"}\", this.assign(O, K)), N(O || K);\n              break;\n            case Ne.ThisExpression:\n              this.assign(O, \"s\"), N(O || \"s\");\n              break;\n            case Ne.LocalsExpression:\n              this.assign(O, \"l\"), N(O || \"l\");\n              break;\n            case Ne.NGValueParameter:\n              this.assign(O, \"v\"), N(O || \"v\");\n          }\n        },\n        getHasOwnProperty: function(m, O) {\n          var D = m + \".\" + O, N = this.current().own;\n          return N.hasOwnProperty(D) || (N[D] = this.nextId(\n            !1,\n            m + \"&&(\" + this.escape(O) + \" in \" + m + \")\"\n          )), N[D];\n        },\n        assign: function(m, O) {\n          if (m) return this.current().body.push(m, \"=\", O, \";\"), m;\n        },\n        filter: function(m) {\n          return this.state.filters.hasOwnProperty(m) || (this.state.filters[m] = this.nextId(!0)), this.state.filters[m];\n        },\n        ifDefined: function(m, O) {\n          return \"ifDefined(\" + m + \",\" + this.escape(O) + \")\";\n        },\n        plus: function(m, O) {\n          return \"plus(\" + m + \",\" + O + \")\";\n        },\n        return_: function(m) {\n          this.current().body.push(\"return \", m, \";\");\n        },\n        if_: function(m, O, D) {\n          if (m === !0) O();\n          else {\n            var N = this.current().body;\n            N.push(\"if(\", m, \"){\"), O(), N.push(\"}\"), D && (N.push(\"else{\"), D(), N.push(\"}\"));\n          }\n        },\n        not: function(m) {\n          return \"!(\" + m + \")\";\n        },\n        isNull: function(m) {\n          return m + \"==null\";\n        },\n        notNull: function(m) {\n          return m + \"!=null\";\n        },\n        nonComputedMember: function(m, O) {\n          return /^[$_a-zA-Z][$_a-zA-Z0-9]*$/.test(O) ? m + \".\" + O : m + '[\"' + O.replace(/[^$_a-zA-Z0-9]/g, this.stringEscapeFn) + '\"]';\n        },\n        computedMember: function(m, O) {\n          return m + \"[\" + O + \"]\";\n        },\n        member: function(m, O, D) {\n          return D ? this.computedMember(m, O) : this.nonComputedMember(m, O);\n        },\n        getStringValue: function(m) {\n          this.assign(m, \"getStringValue(\" + m + \")\");\n        },\n        lazyRecurse: function(m, O, D, N, q, X) {\n          var H = this;\n          return function() {\n            H.recurse(m, O, D, N, q, X);\n          };\n        },\n        lazyAssign: function(m, O) {\n          var D = this;\n          return function() {\n            D.assign(m, O);\n          };\n        },\n        stringEscapeRegex: /[^ a-zA-Z0-9]/g,\n        stringEscapeFn: function(m) {\n          return \"\\\\u\" + (\"0000\" + m.charCodeAt(0).toString(16)).slice(-4);\n        },\n        escape: function(m) {\n          if (St(m))\n            return \"'\" + m.replace(this.stringEscapeRegex, this.stringEscapeFn) + \"'\";\n          if (zt(m)) return m.toString();\n          if (m === !0) return \"true\";\n          if (m === !1) return \"false\";\n          if (m === null) return \"null\";\n          if (m === void 0) return \"undefined\";\n          throw lo(\"esc\", \"IMPOSSIBLE\");\n        },\n        nextId: function(m, O) {\n          var D = \"v\" + this.state.nextId++;\n          return m || this.current().vars.push(D + (O ? \"=\" + O : \"\")), D;\n        },\n        current: function() {\n          return this.state[this.state.computing];\n        }\n      }, De.prototype = {\n        compile: function(m) {\n          var O, D, N = this;\n          Pt(m, N.$filter), (O = se(m)) && (D = this.recurse(O));\n          var q, X = Jt(m.body);\n          X && (q = [], s(X, function(Q, K) {\n            var it = N.recurse(Q);\n            it.isPure = Q.isPure, Q.input = it, q.push(it), Q.watchId = K;\n          }));\n          var H = [];\n          s(m.body, function(Q) {\n            H.push(N.recurse(Q.expression));\n          });\n          var F = m.body.length === 0 ? Z : m.body.length === 1 ? H[0] : function(Q, K) {\n            var it;\n            return s(H, function(st) {\n              it = st(Q, K);\n            }), it;\n          };\n          return D && (F.assign = function(Q, K, it) {\n            return D(Q, it, K);\n          }), q && (F.inputs = q), F;\n        },\n        recurse: function(m, O, D) {\n          var N, q, X, H = this;\n          if (m.input) return this.inputs(m.input, m.watchId);\n          switch (m.type) {\n            case Ne.Literal:\n              return this.value(m.value, O);\n            case Ne.UnaryExpression:\n              return q = this.recurse(m.argument), this[\"unary\" + m.operator](q, O);\n            case Ne.BinaryExpression:\n            case Ne.LogicalExpression:\n              return N = this.recurse(m.left), q = this.recurse(m.right), this[\"binary\" + m.operator](N, q, O);\n            case Ne.ConditionalExpression:\n              return this[\"ternary?:\"](\n                this.recurse(m.test),\n                this.recurse(m.alternate),\n                this.recurse(m.consequent),\n                O\n              );\n            case Ne.Identifier:\n              return H.identifier(m.name, O, D);\n            case Ne.MemberExpression:\n              return N = this.recurse(m.object, !1, !!D), m.computed || (q = m.property.name), m.computed && (q = this.recurse(m.property)), m.computed ? this.computedMember(N, q, O, D) : this.nonComputedMember(N, q, O, D);\n            case Ne.CallExpression:\n              return X = [], s(m.arguments, function(F) {\n                X.push(H.recurse(F));\n              }), m.filter && (q = this.$filter(m.callee.name)), m.filter || (q = this.recurse(m.callee, !0)), m.filter ? function(F, Q, K, it) {\n                for (var st = [], Ct = 0; Ct < X.length; ++Ct)\n                  st.push(X[Ct](F, Q, K, it));\n                var jt = q.apply(void 0, st, it);\n                return O ? { context: void 0, name: void 0, value: jt } : jt;\n              } : function(F, Q, K, it) {\n                var st, Ct = q(F, Q, K, it);\n                if (Ct.value != null) {\n                  for (var jt = [], Tt = 0; Tt < X.length; ++Tt)\n                    jt.push(X[Tt](F, Q, K, it));\n                  st = Ct.value.apply(Ct.context, jt);\n                }\n                return O ? { value: st } : st;\n              };\n            case Ne.AssignmentExpression:\n              return N = this.recurse(m.left, !0, 1), q = this.recurse(m.right), function(F, Q, K, it) {\n                var st = N(F, Q, K, it), Ct = q(F, Q, K, it);\n                return st.context[st.name] = Ct, O ? { value: Ct } : Ct;\n              };\n            case Ne.ArrayExpression:\n              return X = [], s(m.elements, function(F) {\n                X.push(H.recurse(F));\n              }), function(F, Q, K, it) {\n                for (var st = [], Ct = 0; Ct < X.length; ++Ct)\n                  st.push(X[Ct](F, Q, K, it));\n                return O ? { value: st } : st;\n              };\n            case Ne.ObjectExpression:\n              return X = [], s(m.properties, function(F) {\n                F.computed ? X.push({\n                  key: H.recurse(F.key),\n                  computed: !0,\n                  value: H.recurse(F.value)\n                }) : X.push({\n                  key: F.key.type === Ne.Identifier ? F.key.name : \"\" + F.key.value,\n                  computed: !1,\n                  value: H.recurse(F.value)\n                });\n              }), function(F, Q, K, it) {\n                for (var st = {}, Ct = 0; Ct < X.length; ++Ct)\n                  X[Ct].computed ? st[X[Ct].key(F, Q, K, it)] = X[Ct].value(F, Q, K, it) : st[X[Ct].key] = X[Ct].value(F, Q, K, it);\n                return O ? { value: st } : st;\n              };\n            case Ne.ThisExpression:\n              return function(F) {\n                return O ? { value: F } : F;\n              };\n            case Ne.LocalsExpression:\n              return function(F, Q) {\n                return O ? { value: Q } : Q;\n              };\n            case Ne.NGValueParameter:\n              return function(F, Q, K) {\n                return O ? { value: K } : K;\n              };\n          }\n        },\n        \"unary+\": function(m, O) {\n          return function(D, N, q, X) {\n            var H = m(D, N, q, X);\n            return H = ot(H) ? +H : 0, O ? { value: H } : H;\n          };\n        },\n        \"unary-\": function(m, O) {\n          return function(D, N, q, X) {\n            var H = m(D, N, q, X);\n            return H = ot(H) ? -H : -0, O ? { value: H } : H;\n          };\n        },\n        \"unary!\": function(m, O) {\n          return function(D, N, q, X) {\n            var H = !m(D, N, q, X);\n            return O ? { value: H } : H;\n          };\n        },\n        \"binary+\": function(m, O, D) {\n          return function(N, q, X, H) {\n            var F = bt(m(N, q, X, H), O(N, q, X, H));\n            return D ? { value: F } : F;\n          };\n        },\n        \"binary-\": function(m, O, D) {\n          return function(N, q, X, H) {\n            var F = m(N, q, X, H), Q = O(N, q, X, H), K = (ot(F) ? F : 0) - (ot(Q) ? Q : 0);\n            return D ? { value: K } : K;\n          };\n        },\n        \"binary*\": function(m, O, D) {\n          return function(N, q, X, H) {\n            var F = m(N, q, X, H) * O(N, q, X, H);\n            return D ? { value: F } : F;\n          };\n        },\n        \"binary/\": function(m, O, D) {\n          return function(N, q, X, H) {\n            var F = m(N, q, X, H) / O(N, q, X, H);\n            return D ? { value: F } : F;\n          };\n        },\n        \"binary%\": function(m, O, D) {\n          return function(N, q, X, H) {\n            var F = m(N, q, X, H) % O(N, q, X, H);\n            return D ? { value: F } : F;\n          };\n        },\n        \"binary===\": function(m, O, D) {\n          return function(N, q, X, H) {\n            var F = m(N, q, X, H) === O(N, q, X, H);\n            return D ? { value: F } : F;\n          };\n        },\n        \"binary!==\": function(m, O, D) {\n          return function(N, q, X, H) {\n            var F = m(N, q, X, H) !== O(N, q, X, H);\n            return D ? { value: F } : F;\n          };\n        },\n        \"binary==\": function(m, O, D) {\n          return function(N, q, X, H) {\n            var F = m(N, q, X, H) == O(N, q, X, H);\n            return D ? { value: F } : F;\n          };\n        },\n        \"binary!=\": function(m, O, D) {\n          return function(N, q, X, H) {\n            var F = m(N, q, X, H) != O(N, q, X, H);\n            return D ? { value: F } : F;\n          };\n        },\n        \"binary<\": function(m, O, D) {\n          return function(N, q, X, H) {\n            var F = m(N, q, X, H) < O(N, q, X, H);\n            return D ? { value: F } : F;\n          };\n        },\n        \"binary>\": function(m, O, D) {\n          return function(N, q, X, H) {\n            var F = m(N, q, X, H) > O(N, q, X, H);\n            return D ? { value: F } : F;\n          };\n        },\n        \"binary<=\": function(m, O, D) {\n          return function(N, q, X, H) {\n            var F = m(N, q, X, H) <= O(N, q, X, H);\n            return D ? { value: F } : F;\n          };\n        },\n        \"binary>=\": function(m, O, D) {\n          return function(N, q, X, H) {\n            var F = m(N, q, X, H) >= O(N, q, X, H);\n            return D ? { value: F } : F;\n          };\n        },\n        \"binary&&\": function(m, O, D) {\n          return function(N, q, X, H) {\n            var F = m(N, q, X, H) && O(N, q, X, H);\n            return D ? { value: F } : F;\n          };\n        },\n        \"binary||\": function(m, O, D) {\n          return function(N, q, X, H) {\n            var F = m(N, q, X, H) || O(N, q, X, H);\n            return D ? { value: F } : F;\n          };\n        },\n        \"ternary?:\": function(m, O, D, N) {\n          return function(q, X, H, F) {\n            var Q = m(q, X, H, F) ? O(q, X, H, F) : D(q, X, H, F);\n            return N ? { value: Q } : Q;\n          };\n        },\n        value: function(m, O) {\n          return function() {\n            return O ? { context: void 0, name: void 0, value: m } : m;\n          };\n        },\n        identifier: function(m, O, D) {\n          return function(N, q, X, H) {\n            var F = q && m in q ? q : N;\n            D && D !== 1 && F && F[m] == null && (F[m] = {});\n            var Q = F ? F[m] : void 0;\n            return O ? { context: F, name: m, value: Q } : Q;\n          };\n        },\n        computedMember: function(m, O, D, N) {\n          return function(q, X, H, F) {\n            var Q, K, it = m(q, X, H, F);\n            return it != null && (Q = go(Q = O(q, X, H, F)), N && N !== 1 && it && !it[Q] && (it[Q] = {}), K = it[Q]), D ? { context: it, name: Q, value: K } : K;\n          };\n        },\n        nonComputedMember: function(m, O, D, N) {\n          return function(q, X, H, F) {\n            var Q = m(q, X, H, F);\n            N && N !== 1 && Q && Q[O] == null && (Q[O] = {});\n            var K = Q != null ? Q[O] : void 0;\n            return D ? { context: Q, name: O, value: K } : K;\n          };\n        },\n        inputs: function(m, O) {\n          return function(D, N, q, X) {\n            return X ? X[O] : m(D, N, q);\n          };\n        }\n      }, Ve.prototype = {\n        constructor: Ve,\n        parse: function(m) {\n          var O = this.getAst(m), D = this.astCompiler.compile(O.ast);\n          return D.literal = function(N) {\n            return N.body.length === 0 || N.body.length === 1 && (N.body[0].expression.type === Ne.Literal || N.body[0].expression.type === Ne.ArrayExpression || N.body[0].expression.type === Ne.ObjectExpression);\n          }(O.ast), D.constant = function(N) {\n            return N.constant;\n          }(O.ast), D.oneTime = O.oneTime, D;\n        },\n        getAst: function(m) {\n          var O = !1;\n          return (m = m.trim()).charAt(0) === \":\" && m.charAt(1) === \":\" && (O = !0, m = m.substring(2)), { ast: this.ast.ast(m), oneTime: O };\n        }\n      };\n      var vi = E(\"$sce\"), Zr = {\n        HTML: \"html\",\n        CSS: \"css\",\n        MEDIA_URL: \"mediaUrl\",\n        URL: \"url\",\n        RESOURCE_URL: \"resourceUrl\",\n        JS: \"js\"\n      }, $n = /_([a-z])/g;\n      function Ji(m) {\n        return m.replace($n, Nn);\n      }\n      function ia(m) {\n        var O = [];\n        return ot(m) && s(m, function(D) {\n          O.push(\n            function(N) {\n              if (N === \"self\") return N;\n              if (St(N)) {\n                if (N.indexOf(\"***\") > -1)\n                  throw vi(\n                    \"iwcard\",\n                    \"Illegal sequence *** in string matcher.  String: {0}\",\n                    N\n                  );\n                return N = Dt(N).replace(/\\\\\\*\\\\\\*/g, \".*\").replace(/\\\\\\*/g, \"[^:/.?&;]*\"), new RegExp(\"^\" + N + \"$\");\n              }\n              if (ce(N)) return new RegExp(\"^\" + N.source + \"$\");\n              throw vi(\n                \"imatcher\",\n                'Matchers may only be \"self\", string patterns or RegExp objects'\n              );\n            }(D)\n          );\n        }), O;\n      }\n      function oa() {\n        this.SCE_CONTEXTS = Zr;\n        var m = [\"self\"], O = [];\n        this.trustedResourceUrlList = function(D) {\n          return arguments.length && (m = ia(D)), m;\n        }, Object.defineProperty(this, \"resourceUrlWhitelist\", {\n          get: function() {\n            return this.trustedResourceUrlList;\n          },\n          set: function(D) {\n            this.trustedResourceUrlList = D;\n          }\n        }), this.bannedResourceUrlList = function(D) {\n          return arguments.length && (O = ia(D)), O;\n        }, Object.defineProperty(this, \"resourceUrlBlacklist\", {\n          get: function() {\n            return this.bannedResourceUrlList;\n          },\n          set: function(D) {\n            this.bannedResourceUrlList = D;\n          }\n        }), this.$get = [\n          \"$injector\",\n          \"$$sanitizeUri\",\n          function(D, N) {\n            var q = function(K) {\n              throw vi(\n                \"unsafe\",\n                \"Attempting to use an unsafe value in a safe context.\"\n              );\n            };\n            function X(K, it) {\n              return K === \"self\" ? vs(it, ol) || function(st) {\n                return vs(\n                  st,\n                  function() {\n                    return e.document.baseURI ? e.document.baseURI : (za || ((za = e.document.createElement(\"a\")).href = \".\", za = za.cloneNode(!1)), za.href);\n                  }()\n                );\n              }(it) : !!K.exec(it.href);\n            }\n            function H(K) {\n              var it = function(st) {\n                this.$$unwrapTrustedValue = function() {\n                  return st;\n                };\n              };\n              return K && (it.prototype = new K()), it.prototype.valueOf = function() {\n                return this.$$unwrapTrustedValue();\n              }, it.prototype.toString = function() {\n                return this.$$unwrapTrustedValue().toString();\n              }, it;\n            }\n            D.has(\"$sanitize\") && (q = D.get(\"$sanitize\"));\n            var F = H(), Q = {};\n            return Q[Zr.HTML] = H(F), Q[Zr.CSS] = H(F), Q[Zr.MEDIA_URL] = H(F), Q[Zr.URL] = H(Q[Zr.MEDIA_URL]), Q[Zr.JS] = H(F), Q[Zr.RESOURCE_URL] = H(Q[Zr.URL]), {\n              trustAs: function(K, it) {\n                var st = Q.hasOwnProperty(K) ? Q[K] : null;\n                if (!st)\n                  throw vi(\n                    \"icontext\",\n                    \"Attempted to trust a value in invalid context. Context: {0}; Value: {1}\",\n                    K,\n                    it\n                  );\n                if (it === null || ct(it) || it === \"\") return it;\n                if (typeof it != \"string\")\n                  throw vi(\n                    \"itype\",\n                    \"Attempted to trust a non-string value in a content requiring a string: Context: {0}\",\n                    K\n                  );\n                return new st(it);\n              },\n              getTrusted: function(K, it) {\n                if (it === null || ct(it) || it === \"\") return it;\n                var st = Q.hasOwnProperty(K) ? Q[K] : null;\n                if (st && it instanceof st) return it.$$unwrapTrustedValue();\n                if (ne(it.$$unwrapTrustedValue) && (it = it.$$unwrapTrustedValue()), K === Zr.MEDIA_URL || K === Zr.URL)\n                  return N(it.toString(), K === Zr.MEDIA_URL);\n                if (K === Zr.RESOURCE_URL) {\n                  if (function(Ct) {\n                    var jt, Tt, Vt = $o(Ct.toString()), oe = !1;\n                    for (jt = 0, Tt = m.length; jt < Tt; jt++)\n                      if (X(m[jt], Vt)) {\n                        oe = !0;\n                        break;\n                      }\n                    if (oe) {\n                      for (jt = 0, Tt = O.length; jt < Tt; jt++)\n                        if (X(O[jt], Vt)) {\n                          oe = !1;\n                          break;\n                        }\n                    }\n                    return oe;\n                  }(it))\n                    return it;\n                  throw vi(\n                    \"insecurl\",\n                    \"Blocked loading resource from url not allowed by $sceDelegate policy.  URL: {0}\",\n                    it.toString()\n                  );\n                }\n                if (K === Zr.HTML) return q(it);\n                throw vi(\n                  \"unsafe\",\n                  \"Attempting to use an unsafe value in a safe context.\"\n                );\n              },\n              valueOf: function(K) {\n                return K instanceof F ? K.$$unwrapTrustedValue() : K;\n              }\n            };\n          }\n        ];\n      }\n      function hs() {\n        var m = !0;\n        this.enabled = function(O) {\n          return arguments.length && (m = !!O), m;\n        }, this.$get = [\n          \"$parse\",\n          \"$sceDelegate\",\n          function(O, D) {\n            if (m && y < 8)\n              throw vi(\n                \"iequirks\",\n                \"Strict Contextual Escaping does not support Internet Explorer version < 11 in quirks mode.  You can fix this by adding the text <!doctype html> to the top of your HTML document.  See http://docs.angularjs.org/api/ng.$sce for more information.\"\n              );\n            var N = Si(Zr);\n            N.isEnabled = function() {\n              return m;\n            }, N.trustAs = D.trustAs, N.getTrusted = D.getTrusted, N.valueOf = D.valueOf, m || (N.trustAs = N.getTrusted = function(F, Q) {\n              return Q;\n            }, N.valueOf = at), N.parseAs = function(F, Q) {\n              var K = O(Q);\n              return K.literal && K.constant ? K : O(Q, function(it) {\n                return N.getTrusted(F, it);\n              });\n            };\n            var q = N.parseAs, X = N.getTrusted, H = N.trustAs;\n            return s(Zr, function(F, Q) {\n              var K = n(Q);\n              N[Ji(\"parse_as_\" + K)] = function(it) {\n                return q(F, it);\n              }, N[Ji(\"get_trusted_\" + K)] = function(it) {\n                return X(F, it);\n              }, N[Ji(\"trust_as_\" + K)] = function(it) {\n                return H(F, it);\n              };\n            }), N;\n          }\n        ];\n      }\n      function Ki() {\n        this.$get = [\n          \"$window\",\n          \"$document\",\n          function(m, O) {\n            var D = {}, N = !(!(m.nw && m.nw.process) && m.chrome && (m.chrome.app && m.chrome.app.runtime || !m.chrome.app && m.chrome.runtime && m.chrome.runtime.id)) && m.history && m.history.pushState, q = G(\n              (/android (\\d+)/.exec(n((m.navigator || {}).userAgent)) || [])[1]\n            ), X = /Boxee/i.test((m.navigator || {}).userAgent), H = O[0] || {}, F = H.body && H.body.style, Q = !1, K = !1;\n            return F && (Q = !(!(\"transition\" in F) && !(\"webkitTransition\" in F)), K = !(!(\"animation\" in F) && !(\"webkitAnimation\" in F))), {\n              history: !(!N || q < 4 || X),\n              hasEvent: function(it) {\n                if (it === \"input\" && y) return !1;\n                if (ct(D[it])) {\n                  var st = H.createElement(\"div\");\n                  D[it] = \"on\" + it in st;\n                }\n                return D[it];\n              },\n              csp: je(),\n              transitions: Q,\n              animations: K,\n              android: q\n            };\n          }\n        ];\n      }\n      function nl() {\n        this.$get = nt(function(m) {\n          return new ju(m);\n        });\n      }\n      function ju(m) {\n        var O = {}, D = [], N = this.ALL_TASKS_TYPE = \"$$all$$\", q = this.DEFAULT_TASK_TYPE = \"$$default$$\";\n        function X() {\n          var F = D.pop();\n          return F && F.cb;\n        }\n        function H(F) {\n          for (var Q = D.length - 1; Q >= 0; --Q) {\n            var K = D[Q];\n            if (K.type === F) return D.splice(Q, 1), K.cb;\n          }\n        }\n        this.completeTask = function(F, Q) {\n          Q = Q || q;\n          try {\n            F();\n          } finally {\n            (function(jt) {\n              O[jt = jt || q] && (O[jt]--, O[N]--);\n            })(Q);\n            var K = O[Q], it = O[N];\n            if (!it || !K)\n              for (var st, Ct = it ? H : X; st = Ct(Q); )\n                try {\n                  st();\n                } catch (jt) {\n                  m.error(jt);\n                }\n          }\n        }, this.incTaskCount = function(F) {\n          O[F = F || q] = (O[F] || 0) + 1, O[N] = (O[N] || 0) + 1;\n        }, this.notifyWhenNoPendingTasks = function(F, Q) {\n          O[Q = Q || N] ? D.push({ type: Q, cb: F }) : F();\n        };\n      }\n      var Tu = E(\"$templateRequest\");\n      function il() {\n        var m;\n        this.httpOptions = function(O) {\n          return O ? (m = O, this) : m;\n        }, this.$get = [\n          \"$exceptionHandler\",\n          \"$templateCache\",\n          \"$http\",\n          \"$q\",\n          \"$sce\",\n          function(O, D, N, q, X) {\n            function H(F, Q) {\n              H.totalPendingRequests++, St(F) && !ct(D.get(F)) || (F = X.getTrustedResourceUrl(F));\n              var K = N.defaults && N.defaults.transformResponse;\n              return re(K) ? K = K.filter(function(it) {\n                return it !== Zn;\n              }) : K === Zn && (K = null), N.get(F, z({ cache: D, transformResponse: K }, m)).finally(function() {\n                H.totalPendingRequests--;\n              }).then(\n                function(it) {\n                  return D.put(F, it.data);\n                },\n                function(it) {\n                  return Q || (it = Tu(\n                    \"tpload\",\n                    \"Failed to load template: {0} (HTTP status: {1} {2})\",\n                    F,\n                    it.status,\n                    it.statusText\n                  ), O(it)), q.reject(it);\n                }\n              );\n            }\n            return H.totalPendingRequests = 0, H;\n          }\n        ];\n      }\n      function gs() {\n        this.$get = [\n          \"$rootScope\",\n          \"$browser\",\n          \"$location\",\n          function(m, O, D) {\n            var N = {\n              findBindings: function(q, X, H) {\n                var F = q.getElementsByClassName(\"ng-binding\"), Q = [];\n                return s(F, function(K) {\n                  var it = f.element(K).data(\"$binding\");\n                  it && s(it, function(st) {\n                    H ? new RegExp(\"(^|\\\\s)\" + Dt(X) + \"(\\\\s|\\\\||$)\").test(\n                      st\n                    ) && Q.push(K) : st.indexOf(X) !== -1 && Q.push(K);\n                  });\n                }), Q;\n              },\n              findModels: function(q, X, H) {\n                for (var F = [\"ng-\", \"data-ng-\", \"ng\\\\:\"], Q = 0; Q < F.length; ++Q) {\n                  var K = \"[\" + F[Q] + \"model\" + (H ? \"=\" : \"*=\") + '\"' + X + '\"]', it = q.querySelectorAll(K);\n                  if (it.length) return it;\n                }\n              },\n              getLocation: function() {\n                return D.url();\n              },\n              setLocation: function(q) {\n                q !== D.url() && (D.url(q), m.$digest());\n              },\n              whenStable: function(q) {\n                O.notifyWhenNoOutstandingRequests(q);\n              }\n            };\n            return N;\n          }\n        ];\n      }\n      var Nl = E(\"$timeout\");\n      function ms() {\n        this.$get = [\n          \"$rootScope\",\n          \"$browser\",\n          \"$q\",\n          \"$$q\",\n          \"$exceptionHandler\",\n          function(m, O, D, N, q) {\n            var X = {};\n            function H(F, Q, K) {\n              ne(F) || (K = Q, Q = F, F = Z);\n              var it, st = ir(arguments, 3), Ct = ot(K) && !K, jt = (Ct ? N : D).defer(), Tt = jt.promise;\n              return it = O.defer(\n                function() {\n                  try {\n                    jt.resolve(F.apply(null, st));\n                  } catch (Vt) {\n                    jt.reject(Vt), q(Vt);\n                  } finally {\n                    delete X[Tt.$$timeoutId];\n                  }\n                  Ct || m.$apply();\n                },\n                Q,\n                \"$timeout\"\n              ), Tt.$$timeoutId = it, X[it] = jt, Tt;\n            }\n            return H.cancel = function(F) {\n              if (!F) return !1;\n              if (!F.hasOwnProperty(\"$$timeoutId\"))\n                throw Nl(\n                  \"badprom\",\n                  \"`$timeout.cancel()` called with a promise that was not generated by `$timeout()`.\"\n                );\n              if (!X.hasOwnProperty(F.$$timeoutId)) return !1;\n              var Q = F.$$timeoutId, K = X[Q];\n              return fi(K.promise), K.reject(\"canceled\"), delete X[Q], O.defer.cancel(Q);\n            }, H;\n          }\n        ];\n      }\n      var za, Di = e.document.createElement(\"a\"), ol = $o(e.location.href);\n      Di.href = \"http://[::1]\";\n      var al = Di.hostname === \"[::1]\";\n      function $o(m) {\n        if (!St(m)) return m;\n        var O = m;\n        y && (Di.setAttribute(\"href\", O), O = Di.href), Di.setAttribute(\"href\", O);\n        var D = Di.hostname;\n        return !al && D.indexOf(\":\") > -1 && (D = \"[\" + D + \"]\"), {\n          href: Di.href,\n          protocol: Di.protocol ? Di.protocol.replace(/:$/, \"\") : \"\",\n          host: Di.host,\n          search: Di.search ? Di.search.replace(/^\\?/, \"\") : \"\",\n          hash: Di.hash ? Di.hash.replace(/^#/, \"\") : \"\",\n          hostname: D,\n          port: Di.port,\n          pathname: Di.pathname.charAt(0) === \"/\" ? Di.pathname : \"/\" + Di.pathname\n        };\n      }\n      function vs(m, O) {\n        return m = $o(m), O = $o(O), m.protocol === O.protocol && m.host === O.host;\n      }\n      function Ml() {\n        this.$get = nt(e);\n      }\n      function sl(m) {\n        var O = m[0] || {}, D = {}, N = \"\";\n        function q(X) {\n          try {\n            return decodeURIComponent(X);\n          } catch {\n            return X;\n          }\n        }\n        return function() {\n          var X, H, F, Q, K, it = function(st) {\n            try {\n              return st.cookie || \"\";\n            } catch {\n              return \"\";\n            }\n          }(O);\n          if (it !== N)\n            for (X = (N = it).split(\"; \"), D = {}, F = 0; F < X.length; F++)\n              (Q = (H = X[F]).indexOf(\"=\")) > 0 && (K = q(H.substring(0, Q)), ct(D[K]) && (D[K] = q(H.substring(Q + 1))));\n          return D;\n        };\n      }\n      function Ll() {\n        this.$get = sl;\n      }\n      function bs(m) {\n        function O(D, N) {\n          if (gt(D)) {\n            var q = {};\n            return s(D, function(X, H) {\n              q[H] = O(H, X);\n            }), q;\n          }\n          return m.factory(D + \"Filter\", N);\n        }\n        this.register = O, this.$get = [\n          \"$injector\",\n          function(D) {\n            return function(N) {\n              return D.get(N + \"Filter\");\n            };\n          }\n        ], O(\"currency\", Rs), O(\"date\", Fl), O(\"filter\", zl), O(\"json\", Ms), O(\"limitTo\", Ul), O(\"lowercase\", ul), O(\"number\", ll), O(\"orderBy\", ya), O(\"uppercase\", ql);\n      }\n      function zl() {\n        return function(m, O, D, N) {\n          if (!k(m)) {\n            if (m == null) return m;\n            throw E(\"filter\")(\n              \"notarray\",\n              \"Expected array but received: {0}\",\n              m\n            );\n          }\n          var q, X;\n          switch (N = N || \"$\", Ds(O)) {\n            case \"function\":\n              q = O;\n              break;\n            case \"boolean\":\n            case \"null\":\n            case \"number\":\n            case \"string\":\n              X = !0;\n            case \"object\":\n              q = function(H, F, Q, K) {\n                var it = gt(H) && Q in H;\n                return F === !0 ? F = pe : ne(F) || (F = function(st, Ct) {\n                  return !ct(st) && (st === null || Ct === null ? st === Ct : !(gt(Ct) || gt(st) && !ht(st)) && (st = n(\"\" + st), Ct = n(\"\" + Ct), st.indexOf(Ct) !== -1));\n                }), function(st) {\n                  return it && !gt(st) ? Oa(st, H[Q], F, Q, !1) : Oa(st, H, F, Q, K);\n                };\n              }(O, D, N, X);\n              break;\n            default:\n              return m;\n          }\n          return Array.prototype.filter.call(m, q);\n        };\n      }\n      function Oa(m, O, D, N, q, X) {\n        var H = Ds(m), F = Ds(O);\n        if (F === \"string\" && O.charAt(0) === \"!\")\n          return !Oa(m, O.substring(1), D, N, q);\n        if (re(m))\n          return m.some(function(st) {\n            return Oa(st, O, D, N, q);\n          });\n        switch (H) {\n          case \"object\":\n            var Q;\n            if (q) {\n              for (Q in m)\n                if (Q.charAt && Q.charAt(0) !== \"$\" && Oa(m[Q], O, D, N, !0))\n                  return !0;\n              return !X && Oa(m, O, D, N, !1);\n            }\n            if (F === \"object\") {\n              for (Q in O) {\n                var K = O[Q];\n                if (!ne(K) && !ct(K)) {\n                  var it = Q === N;\n                  if (!Oa(it ? m : m[Q], K, D, N, it, it)) return !1;\n                }\n              }\n              return !0;\n            }\n            return D(m, O);\n          case \"function\":\n            return !1;\n          default:\n            return D(m, O);\n        }\n      }\n      function Ds(m) {\n        return m === null ? \"null\" : typeof m;\n      }\n      sl.$inject = [\"$document\"], bs.$inject = [\"$provide\"];\n      function Rs(m) {\n        var O = m.NUMBER_FORMATS;\n        return function(D, N, q) {\n          ct(N) && (N = O.CURRENCY_SYM), ct(q) && (q = O.PATTERNS[1].maxFrac);\n          var X = N ? /\\u00A4/g : /\\s*\\u00A4\\s*/g;\n          return D == null ? D : Is(D, O.PATTERNS[1], O.GROUP_SEP, O.DECIMAL_SEP, q).replace(X, N);\n        };\n      }\n      function ll(m) {\n        var O = m.NUMBER_FORMATS;\n        return function(D, N) {\n          return D == null ? D : Is(D, O.PATTERNS[0], O.GROUP_SEP, O.DECIMAL_SEP, N);\n        };\n      }\n      function Is(m, O, D, N, q) {\n        if (!St(m) && !zt(m) || isNaN(m)) return \"\";\n        var X, H = !isFinite(m), F = !1, Q = Math.abs(m) + \"\", K = \"\";\n        if (H) K = \"∞\";\n        else {\n          (function(Vt, oe, _t, Bt) {\n            var Qt = Vt.d, At = Qt.length - Vt.i, wt = (oe = ct(oe) ? Math.min(Math.max(_t, At), Bt) : +oe) + Vt.i, Ot = Qt[wt];\n            if (wt > 0) {\n              Qt.splice(Math.max(Vt.i, wt));\n              for (var Ft = wt; Ft < Qt.length; Ft++) Qt[Ft] = 0;\n            } else {\n              At = Math.max(0, At), Vt.i = 1, Qt.length = Math.max(1, wt = oe + 1), Qt[0] = 0;\n              for (var qt = 1; qt < wt; qt++) Qt[qt] = 0;\n            }\n            if (Ot >= 5)\n              if (wt - 1 < 0) {\n                for (var ue = 0; ue > wt; ue--) Qt.unshift(0), Vt.i++;\n                Qt.unshift(1), Vt.i++;\n              } else Qt[wt - 1]++;\n            for (; At < Math.max(0, oe); At++) Qt.push(0);\n            var ie = Qt.reduceRight(function(ge, Te, Xe, He) {\n              return Te += ge, He[Xe] = Te % 10, Math.floor(Te / 10);\n            }, 0);\n            ie && (Qt.unshift(ie), Vt.i++);\n          })(\n            X = function(Vt) {\n              var oe, _t, Bt, Qt, At, wt = 0;\n              for ((_t = Vt.indexOf(\".\")) > -1 && (Vt = Vt.replace(\".\", \"\")), (Bt = Vt.search(/e/i)) > 0 ? (_t < 0 && (_t = Bt), _t += +Vt.slice(Bt + 1), Vt = Vt.substring(0, Bt)) : _t < 0 && (_t = Vt.length), Bt = 0; Vt.charAt(Bt) === \"0\"; Bt++) ;\n              if (Bt === (At = Vt.length)) oe = [0], _t = 1;\n              else {\n                for (At--; Vt.charAt(At) === \"0\"; ) At--;\n                for (_t -= Bt, oe = [], Qt = 0; Bt <= At; Bt++, Qt++)\n                  oe[Qt] = +Vt.charAt(Bt);\n              }\n              return _t > 22 && (oe = oe.splice(0, 21), wt = _t - 1, _t = 1), { d: oe, e: wt, i: _t };\n            }(Q),\n            q,\n            O.minFrac,\n            O.maxFrac\n          );\n          var it = X.d, st = X.i, Ct = X.e, jt = [];\n          for (F = it.reduce(function(Vt, oe) {\n            return Vt && !oe;\n          }, !0); st < 0; )\n            it.unshift(0), st++;\n          st > 0 ? jt = it.splice(st, it.length) : (jt = it, it = [0]);\n          var Tt = [];\n          for (it.length >= O.lgSize && Tt.unshift(it.splice(-O.lgSize, it.length).join(\"\")); it.length > O.gSize; )\n            Tt.unshift(it.splice(-O.gSize, it.length).join(\"\"));\n          it.length && Tt.unshift(it.join(\"\")), K = Tt.join(D), jt.length && (K += N + jt.join(\"\")), Ct && (K += \"e+\" + Ct);\n        }\n        return m < 0 && !F ? O.negPre + K + O.negSuf : O.posPre + K + O.posSuf;\n      }\n      function Ka(m, O, D, N) {\n        var q = \"\";\n        for ((m < 0 || N && m <= 0) && (N ? m = 1 - m : (m = -m, q = \"-\")), m = \"\" + m; m.length < O; )\n          m = \"0\" + m;\n        return D && (m = m.substr(m.length - O)), q + m;\n      }\n      function xr(m, O, D, N, q) {\n        return D = D || 0, function(X) {\n          var H = X[\"get\" + m]();\n          return (D > 0 || H > -D) && (H += D), H === 0 && D === -12 && (H = 12), Ka(H, O, N, q);\n        };\n      }\n      function ys(m, O, D) {\n        return function(N, q) {\n          var X = N[\"get\" + m]();\n          return q[t((D ? \"STANDALONE\" : \"\") + (O ? \"SHORT\" : \"\") + m)][X];\n        };\n      }\n      function Bl(m) {\n        var O = new Date(m, 0, 1).getDay();\n        return new Date(m, 0, (O <= 4 ? 5 : 12) - O);\n      }\n      function ts(m) {\n        return function(O) {\n          var D, N = Bl(O.getFullYear()), q = (D = O, +new Date(\n            D.getFullYear(),\n            D.getMonth(),\n            D.getDate() + (4 - D.getDay())\n          ) - +N);\n          return Ka(1 + Math.round(q / 6048e5), m);\n        };\n      }\n      function Ns(m, O) {\n        return m.getFullYear() <= 0 ? O.ERAS[0] : O.ERAS[1];\n      }\n      Rs.$inject = [\"$locale\"], ll.$inject = [\"$locale\"];\n      var Pu = {\n        yyyy: xr(\"FullYear\", 4, 0, !1, !0),\n        yy: xr(\"FullYear\", 2, 0, !0, !0),\n        y: xr(\"FullYear\", 1, 0, !1, !0),\n        MMMM: ys(\"Month\"),\n        MMM: ys(\"Month\", !0),\n        MM: xr(\"Month\", 2, 1),\n        M: xr(\"Month\", 1, 1),\n        LLLL: ys(\"Month\", !1, !0),\n        dd: xr(\"Date\", 2),\n        d: xr(\"Date\", 1),\n        HH: xr(\"Hours\", 2),\n        H: xr(\"Hours\", 1),\n        hh: xr(\"Hours\", 2, -12),\n        h: xr(\"Hours\", 1, -12),\n        mm: xr(\"Minutes\", 2),\n        m: xr(\"Minutes\", 1),\n        ss: xr(\"Seconds\", 2),\n        s: xr(\"Seconds\", 1),\n        sss: xr(\"Milliseconds\", 3),\n        EEEE: ys(\"Day\"),\n        EEE: ys(\"Day\", !0),\n        a: function(m, O) {\n          return m.getHours() < 12 ? O.AMPMS[0] : O.AMPMS[1];\n        },\n        Z: function(m, O, D) {\n          var N = -1 * D, q = N >= 0 ? \"+\" : \"\";\n          return q += Ka(Math[N > 0 ? \"floor\" : \"ceil\"](N / 60), 2) + Ka(Math.abs(N % 60), 2);\n        },\n        ww: ts(2),\n        w: ts(1),\n        G: Ns,\n        GG: Ns,\n        GGG: Ns,\n        GGGG: function(m, O) {\n          return m.getFullYear() <= 0 ? O.ERANAMES[0] : O.ERANAMES[1];\n        }\n      }, Du = /((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))([\\s\\S]*)/, Wo = /^-?\\d+$/;\n      function Fl(m) {\n        var O = /^(\\d{4})-?(\\d\\d)-?(\\d\\d)(?:T(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:\\.(\\d+))?)?)?(Z|([+-])(\\d\\d):?(\\d\\d))?)?$/;\n        return function(D, N, q) {\n          var X, H, F = \"\", Q = [];\n          if (N = N || \"mediumDate\", N = m.DATETIME_FORMATS[N] || N, St(D) && (D = Wo.test(D) ? G(D) : function(it) {\n            var st;\n            if (st = it.match(O)) {\n              var Ct = /* @__PURE__ */ new Date(0), jt = 0, Tt = 0, Vt = st[8] ? Ct.setUTCFullYear : Ct.setFullYear, oe = st[8] ? Ct.setUTCHours : Ct.setHours;\n              st[9] && (jt = G(st[9] + st[10]), Tt = G(st[9] + st[11])), Vt.call(Ct, G(st[1]), G(st[2]) - 1, G(st[3]));\n              var _t = G(st[4] || 0) - jt, Bt = G(st[5] || 0) - Tt, Qt = G(st[6] || 0), At = Math.round(1e3 * parseFloat(\"0.\" + (st[7] || 0)));\n              return oe.call(Ct, _t, Bt, Qt, At), Ct;\n            }\n            return it;\n          }(D)), zt(D) && (D = new Date(D)), !Nt(D) || !isFinite(D.getTime()))\n            return D;\n          for (; N; )\n            (H = Du.exec(N)) ? N = (Q = Ze(Q, H, 1)).pop() : (Q.push(N), N = null);\n          var K = D.getTimezoneOffset();\n          return q && (K = un(q, K), D = yn(D, q, !0)), s(Q, function(it) {\n            F += (X = Pu[it]) ? X(D, m.DATETIME_FORMATS, K) : it === \"''\" ? \"'\" : it.replace(/(^'|'$)/g, \"\").replace(/''/g, \"'\");\n          }), F;\n        };\n      }\n      function Ms() {\n        return function(m, O) {\n          return ct(O) && (O = 2), zr(m, O);\n        };\n      }\n      Fl.$inject = [\"$locale\"];\n      var ul = nt(n), ql = nt(t);\n      function Ul() {\n        return function(m, O, D) {\n          return O = Math.abs(Number(O)) === 1 / 0 ? Number(O) : G(O), Y(O) ? m : (zt(m) && (m = m.toString()), k(m) ? (D = (D = !D || isNaN(D) ? 0 : G(D)) < 0 ? Math.max(0, m.length + D) : D, O >= 0 ? bo(m, D, D + O) : D === 0 ? bo(m, O, m.length) : bo(m, Math.max(0, D + O), D)) : m);\n        };\n      }\n      function bo(m, O, D) {\n        return St(m) ? m.slice(O, D) : r.call(m, O, D);\n      }\n      function ya(m) {\n        return function(N, q, X, H) {\n          if (N == null) return N;\n          if (!k(N))\n            throw E(\"orderBy\")(\n              \"notarray\",\n              \"Expected array but received: {0}\",\n              N\n            );\n          re(q) || (q = [q]), q.length === 0 && (q = [\"+\"]);\n          var F = q.map(function(st) {\n            var Ct = 1, jt = at;\n            if (ne(st)) jt = st;\n            else if (St(st) && (st.charAt(0) !== \"+\" && st.charAt(0) !== \"-\" || (Ct = st.charAt(0) === \"-\" ? -1 : 1, st = st.substring(1)), st !== \"\" && (jt = m(st)).constant)) {\n              var Tt = jt();\n              jt = function(Vt) {\n                return Vt[Tt];\n              };\n            }\n            return { get: jt, descending: Ct };\n          }), Q = X ? -1 : 1, K = ne(H) ? H : D, it = Array.prototype.map.call(N, function(st, Ct) {\n            return {\n              value: st,\n              tieBreaker: { value: Ct, type: \"number\", index: Ct },\n              predicateValues: F.map(function(jt) {\n                return function(Tt, Vt) {\n                  var oe = typeof Tt;\n                  return Tt === null ? oe = \"null\" : oe === \"object\" && (Tt = function(_t) {\n                    return ne(_t.valueOf) && O(_t = _t.valueOf()) || ht(_t) && O(_t = _t.toString()), _t;\n                  }(Tt)), { value: Tt, type: oe, index: Vt };\n                }(jt.get(st), Ct);\n              })\n            };\n          });\n          return it.sort(function(st, Ct) {\n            for (var jt = 0, Tt = F.length; jt < Tt; jt++) {\n              var Vt = K(st.predicateValues[jt], Ct.predicateValues[jt]);\n              if (Vt) return Vt * F[jt].descending * Q;\n            }\n            return (K(st.tieBreaker, Ct.tieBreaker) || D(st.tieBreaker, Ct.tieBreaker)) * Q;\n          }), N = it.map(function(st) {\n            return st.value;\n          });\n        };\n        function O(N) {\n          switch (typeof N) {\n            case \"number\":\n            case \"boolean\":\n            case \"string\":\n              return !0;\n            default:\n              return !1;\n          }\n        }\n        function D(N, q) {\n          var X = 0, H = N.type, F = q.type;\n          if (H === F) {\n            var Q = N.value, K = q.value;\n            H === \"string\" ? (Q = Q.toLowerCase(), K = K.toLowerCase()) : H === \"object\" && (gt(Q) && (Q = N.index), gt(K) && (K = q.index)), Q !== K && (X = Q < K ? -1 : 1);\n          } else\n            X = H === \"undefined\" ? 1 : F === \"undefined\" ? -1 : H === \"null\" ? 1 : F === \"null\" || H < F ? -1 : 1;\n          return X;\n        }\n      }\n      function ja(m) {\n        return ne(m) && (m = { link: m }), m.restrict = m.restrict || \"AC\", nt(m);\n      }\n      ya.$inject = [\"$parse\"];\n      var Vl = nt({\n        restrict: \"E\",\n        compile: function(m, O) {\n          if (!O.href && !O.xlinkHref)\n            return function(D, N) {\n              if (N[0].nodeName.toLowerCase() === \"a\") {\n                var q = i.call(N.prop(\"href\")) === \"[object SVGAnimatedString]\" ? \"xlink:href\" : \"href\";\n                N.on(\"click\", function(X) {\n                  N.attr(q) || X.preventDefault();\n                });\n              }\n            };\n        }\n      }), Ba = {};\n      s(co, function(m, O) {\n        if (m !== \"multiple\") {\n          var D = Br(\"ng-\" + O), N = q;\n          m === \"checked\" && (N = function(X, H, F) {\n            F.ngModel !== F[D] && q(X, 0, F);\n          }), Ba[D] = function() {\n            return { restrict: \"A\", priority: 100, link: N };\n          };\n        }\n        function q(X, H, F) {\n          X.$watch(F[D], function(Q) {\n            F.$set(O, !!Q);\n          });\n        }\n      }), s(wi, function(m, O) {\n        Ba[O] = function() {\n          return {\n            priority: 100,\n            link: function(D, N, q) {\n              if (O === \"ngPattern\" && q.ngPattern.charAt(0) === \"/\") {\n                var X = q.ngPattern.match(c);\n                if (X)\n                  return void q.$set(\"ngPattern\", new RegExp(X[1], X[2]));\n              }\n              D.$watch(q[O], function(H) {\n                q.$set(O, H);\n              });\n            }\n          };\n        };\n      }), s([\"src\", \"srcset\", \"href\"], function(m) {\n        var O = Br(\"ng-\" + m);\n        Ba[O] = [\n          \"$sce\",\n          function(D) {\n            return {\n              priority: 99,\n              link: function(N, q, X) {\n                var H = m, F = m;\n                m === \"href\" && i.call(q.prop(\"href\")) === \"[object SVGAnimatedString]\" && (F = \"xlinkHref\", X.$attr[F] = \"xlink:href\", H = null), X.$set(O, D.getTrustedMediaUrl(X[O])), X.$observe(O, function(Q) {\n                  Q ? (X.$set(F, Q), y && H && q.prop(H, X[F])) : m === \"href\" && X.$set(F, null);\n                });\n              }\n            };\n          }\n        ];\n      });\n      var es = {\n        $addControl: Z,\n        $getControls: nt([]),\n        $$renameControl: function(m, O) {\n          m.$name = O;\n        },\n        $removeControl: Z,\n        $setValidity: Z,\n        $setDirty: Z,\n        $setPristine: Z,\n        $setSubmitted: Z,\n        $$setSubmitted: Z\n      };\n      function rs(m, O, D, N, q) {\n        this.$$controls = [], this.$error = {}, this.$$success = {}, this.$pending = void 0, this.$name = q(O.name || O.ngForm || \"\")(D), this.$dirty = !1, this.$pristine = !0, this.$valid = !0, this.$invalid = !1, this.$submitted = !1, this.$$parentForm = es, this.$$element = m, this.$$animate = N, xa(this);\n      }\n      rs.$inject = [\n        \"$element\",\n        \"$attrs\",\n        \"$scope\",\n        \"$animate\",\n        \"$interpolate\"\n      ], rs.prototype = {\n        $rollbackViewValue: function() {\n          s(this.$$controls, function(m) {\n            m.$rollbackViewValue();\n          });\n        },\n        $commitViewValue: function() {\n          s(this.$$controls, function(m) {\n            m.$commitViewValue();\n          });\n        },\n        $addControl: function(m) {\n          ni(m.$name, \"input\"), this.$$controls.push(m), m.$name && (this[m.$name] = m), m.$$parentForm = this;\n        },\n        $getControls: function() {\n          return Si(this.$$controls);\n        },\n        $$renameControl: function(m, O) {\n          var D = m.$name;\n          this[D] === m && delete this[D], this[O] = m, m.$name = O;\n        },\n        $removeControl: function(m) {\n          m.$name && this[m.$name] === m && delete this[m.$name], s(\n            this.$pending,\n            function(O, D) {\n              this.$setValidity(D, null, m);\n            },\n            this\n          ), s(\n            this.$error,\n            function(O, D) {\n              this.$setValidity(D, null, m);\n            },\n            this\n          ), s(\n            this.$$success,\n            function(O, D) {\n              this.$setValidity(D, null, m);\n            },\n            this\n          ), Wt(this.$$controls, m), m.$$parentForm = es;\n        },\n        $setDirty: function() {\n          this.$$animate.removeClass(this.$$element, bi), this.$$animate.addClass(this.$$element, Ss), this.$dirty = !0, this.$pristine = !1, this.$$parentForm.$setDirty();\n        },\n        $setPristine: function() {\n          this.$$animate.setClass(this.$$element, bi, Ss + \" ng-submitted\"), this.$dirty = !1, this.$pristine = !0, this.$submitted = !1, s(this.$$controls, function(m) {\n            m.$setPristine();\n          });\n        },\n        $setUntouched: function() {\n          s(this.$$controls, function(m) {\n            m.$setUntouched();\n          });\n        },\n        $setSubmitted: function() {\n          for (var m = this; m.$$parentForm && m.$$parentForm !== es; )\n            m = m.$$parentForm;\n          m.$$setSubmitted();\n        },\n        $$setSubmitted: function() {\n          this.$$animate.addClass(this.$$element, \"ng-submitted\"), this.$submitted = !0, s(this.$$controls, function(m) {\n            m.$$setSubmitted && m.$$setSubmitted();\n          });\n        }\n      }, Hl({\n        clazz: rs,\n        set: function(m, O, D) {\n          var N = m[O];\n          N ? N.indexOf(D) === -1 && N.push(D) : m[O] = [D];\n        },\n        unset: function(m, O, D) {\n          var N = m[O];\n          N && (Wt(N, D), N.length === 0 && delete m[O]);\n        }\n      });\n      var cl = function(m) {\n        return [\n          \"$timeout\",\n          \"$parse\",\n          function(O, D) {\n            return {\n              name: \"form\",\n              restrict: m ? \"EAC\" : \"E\",\n              require: [\"form\", \"^^?form\"],\n              controller: rs,\n              compile: function(q, X) {\n                q.addClass(bi).addClass(Ha);\n                var H = X.name ? \"name\" : !(!m || !X.ngForm) && \"ngForm\";\n                return {\n                  pre: function(F, Q, K, it) {\n                    var st = it[0];\n                    if (!(\"action\" in K)) {\n                      var Ct = function(Tt) {\n                        F.$apply(function() {\n                          st.$commitViewValue(), st.$setSubmitted();\n                        }), Tt.preventDefault();\n                      };\n                      Q[0].addEventListener(\"submit\", Ct), Q.on(\"$destroy\", function() {\n                        O(\n                          function() {\n                            Q[0].removeEventListener(\"submit\", Ct);\n                          },\n                          0,\n                          !1\n                        );\n                      });\n                    }\n                    (it[1] || st.$$parentForm).$addControl(st);\n                    var jt = H ? N(st.$name) : Z;\n                    H && (jt(F, st), K.$observe(H, function(Tt) {\n                      st.$name !== Tt && (jt(F, void 0), st.$$parentForm.$$renameControl(st, Tt), (jt = N(st.$name))(F, st));\n                    })), Q.on(\"$destroy\", function() {\n                      st.$$parentForm.$removeControl(st), jt(F, void 0), z(st, es);\n                    });\n                  }\n                };\n              }\n            };\n            function N(q) {\n              return q === \"\" ? D('this[\"\"]').assign : D(q).assign || Z;\n            }\n          }\n        ];\n      }, dl = cl(), fl = cl(!0);\n      function xa(m) {\n        m.$$classCache = {}, m.$$classCache[wl] = !(m.$$classCache[Ha] = m.$$element.hasClass(Ha));\n      }\n      function Hl(m) {\n        var O = m.clazz, D = m.set, N = m.unset;\n        function q(H, F, Q) {\n          Q && !H.$$classCache[F] ? (H.$$animate.addClass(H.$$element, F), H.$$classCache[F] = !0) : !Q && H.$$classCache[F] && (H.$$animate.removeClass(H.$$element, F), H.$$classCache[F] = !1);\n        }\n        function X(H, F, Q) {\n          F = F ? \"-\" + Wr(F, \"-\") : \"\", q(H, Ha + F, Q === !0), q(H, wl + F, Q === !1);\n        }\n        O.prototype.$setValidity = function(H, F, Q) {\n          var K;\n          ct(F) ? function(it, st, Ct, jt) {\n            it[st] || (it[st] = {}), D(it[st], Ct, jt);\n          }(this, \"$pending\", H, Q) : function(it, st, Ct, jt) {\n            it[st] && N(it[st], Ct, jt), wa(it[st]) && (it[st] = void 0);\n          }(this, \"$pending\", H, Q), ae(F) ? F ? (N(this.$error, H, Q), D(this.$$success, H, Q)) : (D(this.$error, H, Q), N(this.$$success, H, Q)) : (N(this.$error, H, Q), N(this.$$success, H, Q)), this.$pending ? (q(this, \"ng-pending\", !0), this.$valid = this.$invalid = void 0, X(this, \"\", null)) : (q(this, \"ng-pending\", !1), this.$valid = wa(this.$error), this.$invalid = !this.$valid, X(this, \"\", this.$valid)), X(\n            this,\n            H,\n            K = this.$pending && this.$pending[H] ? void 0 : !this.$error[H] && (!!this.$$success[H] || null)\n          ), this.$$parentForm.$setValidity(H, K, this);\n        };\n      }\n      function wa(m) {\n        if (m) {\n          for (var O in m) if (m.hasOwnProperty(O)) return !1;\n        }\n        return !0;\n      }\n      var Gl = /^\\d{4,}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+(?:[+-][0-2]\\d:[0-5]\\d|Z)$/, Wl = /^[a-z][a-z\\d.+-]*:\\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\\s:/?#]+|\\[[a-f\\d:]+])(?::\\d+)?(?:\\/[^?#]*)?(?:\\?[^#]*)?(?:#.*)?$/i, pl = /^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/, Yl = /^\\s*(-|\\+)?(\\d+|(\\d*(\\.\\d*)))([eE][+-]?\\d+)?\\s*$/, hl = /^(\\d{4,})-(\\d{2})-(\\d{2})$/, gl = /^(\\d{4,})-(\\d\\d)-(\\d\\d)T(\\d\\d):(\\d\\d)(?::(\\d\\d)(\\.\\d{1,3})?)?$/, Ls = /^(\\d{4,})-W(\\d\\d)$/, yo = /^(\\d{4,})-(\\d\\d)$/, Jo = /^(\\d\\d):(\\d\\d)(?::(\\d\\d)(\\.\\d{1,3})?)?$/, xs = ur();\n      s(\"date,datetime-local,month,time,week\".split(\",\"), function(m) {\n        xs[m] = !0;\n      });\n      var Fa = {\n        text: function(m, O, D, N, q, X) {\n          qa(m, O, D, N, q, X), zs(N);\n        },\n        date: aa(\"date\", hl, ws(hl, [\"yyyy\", \"MM\", \"dd\"]), \"yyyy-MM-dd\"),\n        \"datetime-local\": aa(\n          \"datetimelocal\",\n          gl,\n          ws(gl, [\"yyyy\", \"MM\", \"dd\", \"HH\", \"mm\", \"ss\", \"sss\"]),\n          \"yyyy-MM-ddTHH:mm:ss.sss\"\n        ),\n        time: aa(\"time\", Jo, ws(Jo, [\"HH\", \"mm\", \"ss\", \"sss\"]), \"HH:mm:ss.sss\"),\n        week: aa(\n          \"week\",\n          Ls,\n          function(m, O) {\n            if (Nt(m)) return m;\n            if (St(m)) {\n              Ls.lastIndex = 0;\n              var D = Ls.exec(m);\n              if (D) {\n                var N = +D[1], q = +D[2], X = 0, H = 0, F = 0, Q = 0, K = Bl(N), it = 7 * (q - 1);\n                return O && (X = O.getHours(), H = O.getMinutes(), F = O.getSeconds(), Q = O.getMilliseconds()), new Date(N, 0, K.getDate() + it, X, H, F, Q);\n              }\n            }\n            return NaN;\n          },\n          \"yyyy-Www\"\n        ),\n        month: aa(\"month\", yo, ws(yo, [\"yyyy\", \"MM\"]), \"yyyy-MM\"),\n        number: function(m, O, D, N, q, X, H, F) {\n          var Q;\n          if (Ua(m, O, D, N, \"number\"), ml(N), qa(m, O, D, N, q, X), ot(D.min) || D.ngMin) {\n            var K = D.min || F(D.ngMin)(m);\n            Q = Mo(K), N.$validators.min = function(Tt, Vt) {\n              return N.$isEmpty(Vt) || ct(Q) || Vt >= Q;\n            }, D.$observe(\"min\", function(Tt) {\n              Tt !== K && (Q = Mo(Tt), K = Tt, N.$validate());\n            });\n          }\n          if (ot(D.max) || D.ngMax) {\n            var it = D.max || F(D.ngMax)(m), st = Mo(it);\n            N.$validators.max = function(Tt, Vt) {\n              return N.$isEmpty(Vt) || ct(st) || Vt <= st;\n            }, D.$observe(\"max\", function(Tt) {\n              Tt !== it && (st = Mo(Tt), it = Tt, N.$validate());\n            });\n          }\n          if (ot(D.step) || D.ngStep) {\n            var Ct = D.step || F(D.ngStep)(m), jt = Mo(Ct);\n            N.$validators.step = function(Tt, Vt) {\n              return N.$isEmpty(Vt) || ct(jt) || ks(Vt, Q || 0, jt);\n            }, D.$observe(\"step\", function(Tt) {\n              Tt !== Ct && (jt = Mo(Tt), Ct = Tt, N.$validate());\n            });\n          }\n        },\n        url: function(m, O, D, N, q, X) {\n          qa(m, O, D, N, q, X), zs(N), N.$validators.url = function(H, F) {\n            var Q = H || F;\n            return N.$isEmpty(Q) || Wl.test(Q);\n          };\n        },\n        email: function(m, O, D, N, q, X) {\n          qa(m, O, D, N, q, X), zs(N), N.$validators.email = function(H, F) {\n            var Q = H || F;\n            return N.$isEmpty(Q) || pl.test(Q);\n          };\n        },\n        radio: function(m, O, D, N) {\n          var q = !D.ngTrim || kt(D.ngTrim) !== \"false\";\n          ct(D.name) && O.attr(\"name\", I()), O.on(\"change\", function(X) {\n            var H;\n            O[0].checked && (H = D.value, q && (H = kt(H)), N.$setViewValue(H, X && X.type));\n          }), N.$render = function() {\n            var X = D.value;\n            q && (X = kt(X)), O[0].checked = X === N.$viewValue;\n          }, D.$observe(\"value\", N.$render);\n        },\n        range: function(m, O, D, N, q, X) {\n          Ua(m, O, D, N, \"range\"), ml(N), qa(m, O, D, N, q, X);\n          var H = N.$$hasNativeValidators && O[0].type === \"range\", F = H ? 0 : void 0, Q = H ? 100 : void 0, K = H ? 1 : void 0, it = O[0].validity, st = ot(D.min), Ct = ot(D.max), jt = ot(D.step), Tt = N.$render;\n          N.$render = H && ot(it.rangeUnderflow) && ot(it.rangeOverflow) ? function() {\n            Tt(), N.$setViewValue(O.val());\n          } : Tt, st && (F = Mo(D.min), N.$validators.min = H ? function() {\n            return !0;\n          } : function(oe, _t) {\n            return N.$isEmpty(_t) || ct(F) || _t >= F;\n          }, Vt(\"min\", function(oe) {\n            if (F = Mo(oe), !Y(N.$modelValue))\n              if (H) {\n                var _t = O.val();\n                F > _t && (_t = F, O.val(_t)), N.$setViewValue(_t);\n              } else N.$validate();\n          })), Ct && (Q = Mo(D.max), N.$validators.max = H ? function() {\n            return !0;\n          } : function(oe, _t) {\n            return N.$isEmpty(_t) || ct(Q) || _t <= Q;\n          }, Vt(\"max\", function(oe) {\n            if (Q = Mo(oe), !Y(N.$modelValue))\n              if (H) {\n                var _t = O.val();\n                Q < _t && (O.val(Q), _t = Q < F ? F : Q), N.$setViewValue(_t);\n              } else N.$validate();\n          })), jt && (K = Mo(D.step), N.$validators.step = H ? function() {\n            return !it.stepMismatch;\n          } : function(oe, _t) {\n            return N.$isEmpty(_t) || ct(K) || ks(_t, F || 0, K);\n          }, Vt(\"step\", function(oe) {\n            K = Mo(oe), !Y(N.$modelValue) && (H ? N.$viewValue !== O.val() && N.$setViewValue(O.val()) : N.$validate());\n          }));\n          function Vt(oe, _t) {\n            O.attr(oe, D[oe]);\n            var Bt = D[oe];\n            D.$observe(oe, function(Qt) {\n              Qt !== Bt && (Bt = Qt, _t(Qt));\n            });\n          }\n        },\n        checkbox: function(m, O, D, N, q, X, H, F) {\n          var Q = Fs(F, m, \"ngTrueValue\", D.ngTrueValue, !0), K = Fs(F, m, \"ngFalseValue\", D.ngFalseValue, !1);\n          O.on(\"change\", function(it) {\n            N.$setViewValue(O[0].checked, it && it.type);\n          }), N.$render = function() {\n            O[0].checked = N.$viewValue;\n          }, N.$isEmpty = function(it) {\n            return it === !1;\n          }, N.$formatters.push(function(it) {\n            return pe(it, Q);\n          }), N.$parsers.push(function(it) {\n            return it ? Q : K;\n          });\n        },\n        hidden: Z,\n        button: Z,\n        submit: Z,\n        reset: Z,\n        file: Z\n      };\n      function zs(m) {\n        m.$formatters.push(function(O) {\n          return m.$isEmpty(O) ? O : O.toString();\n        });\n      }\n      function qa(m, O, D, N, q, X) {\n        var H, F = n(O[0].type);\n        if (!q.android) {\n          var Q = !1;\n          O.on(\"compositionstart\", function() {\n            Q = !0;\n          }), O.on(\"compositionupdate\", function(st) {\n            (ct(st.data) || st.data === \"\") && (Q = !1);\n          }), O.on(\"compositionend\", function() {\n            Q = !1, K();\n          });\n        }\n        var K = function(st) {\n          if (H && (X.defer.cancel(H), H = null), !Q) {\n            var Ct = O.val(), jt = st && st.type;\n            F === \"password\" || D.ngTrim && D.ngTrim === \"false\" || (Ct = kt(Ct)), (N.$viewValue !== Ct || Ct === \"\" && N.$$hasNativeValidators) && N.$setViewValue(Ct, jt);\n          }\n        };\n        if (q.hasEvent(\"input\")) O.on(\"input\", K);\n        else {\n          var it = function(st, Ct, jt) {\n            H || (H = X.defer(function() {\n              H = null, Ct && Ct.value === jt || K(st);\n            }));\n          };\n          O.on(\"keydown\", function(st) {\n            var Ct = st.keyCode;\n            Ct === 91 || 15 < Ct && Ct < 19 || 37 <= Ct && Ct <= 40 || it(st, this, this.value);\n          }), q.hasEvent(\"paste\") && O.on(\"paste cut drop\", it);\n        }\n        O.on(\"change\", K), xs[F] && N.$$hasNativeValidators && F === D.type && O.on(\"keydown wheel mousedown\", function(st) {\n          if (!H) {\n            var Ct = this.validity, jt = Ct.badInput, Tt = Ct.typeMismatch;\n            H = X.defer(function() {\n              H = null, Ct.badInput === jt && Ct.typeMismatch === Tt || K(st);\n            });\n          }\n        }), N.$render = function() {\n          var st = N.$isEmpty(N.$viewValue) ? \"\" : N.$viewValue;\n          O.val() !== st && O.val(st);\n        };\n      }\n      function ws(m, O) {\n        return function(D, N) {\n          var q, X;\n          if (Nt(D)) return D;\n          if (St(D)) {\n            if (D.charAt(0) === '\"' && D.charAt(D.length - 1) === '\"' && (D = D.substring(1, D.length - 1)), Gl.test(D))\n              return new Date(D);\n            if (m.lastIndex = 0, q = m.exec(D)) {\n              q.shift(), X = N ? {\n                yyyy: N.getFullYear(),\n                MM: N.getMonth() + 1,\n                dd: N.getDate(),\n                HH: N.getHours(),\n                mm: N.getMinutes(),\n                ss: N.getSeconds(),\n                sss: N.getMilliseconds() / 1e3\n              } : { yyyy: 1970, MM: 1, dd: 1, HH: 0, mm: 0, ss: 0, sss: 0 }, s(q, function(F, Q) {\n                Q < O.length && (X[O[Q]] = +F);\n              });\n              var H = new Date(\n                X.yyyy,\n                X.MM - 1,\n                X.dd,\n                X.HH,\n                X.mm,\n                X.ss || 0,\n                1e3 * X.sss || 0\n              );\n              return X.yyyy < 100 && H.setFullYear(X.yyyy), H;\n            }\n          }\n          return NaN;\n        };\n      }\n      function aa(m, O, D, N) {\n        return function(q, X, H, F, Q, K, it, st) {\n          Ua(q, X, H, F, m), qa(0, X, H, F, Q, K);\n          var Ct, jt, Tt = m === \"time\" || m === \"datetimelocal\";\n          if (F.$parsers.push(function(Ot) {\n            return F.$isEmpty(Ot) ? null : O.test(Ot) ? wt(Ot, Ct) : void (F.$$parserName = m);\n          }), F.$formatters.push(function(Ot) {\n            if (Ot && !Nt(Ot))\n              throw os(\"datefmt\", \"Expected `{0}` to be a date\", Ot);\n            if (Qt(Ot)) {\n              Ct = Ot;\n              var Ft = F.$options.getOption(\"timezone\");\n              return Ft && (jt = Ft, Ct = yn(Ct, Ft, !0)), function(qt, ue) {\n                var ie = N;\n                Tt && St(F.$options.getOption(\"timeSecondsFormat\")) && (ie = N.replace(\n                  \"ss.sss\",\n                  F.$options.getOption(\"timeSecondsFormat\")\n                ).replace(/:$/, \"\"));\n                var ge = it(\"date\")(qt, ie, ue);\n                return Tt && F.$options.getOption(\"timeStripZeroSeconds\") && (ge = ge.replace(/(?::00)?(?:\\.000)?$/, \"\")), ge;\n              }(Ot, Ft);\n            }\n            return Ct = null, jt = null, \"\";\n          }), ot(H.min) || H.ngMin) {\n            var Vt = H.min || st(H.ngMin)(q), oe = At(Vt);\n            F.$validators.min = function(Ot) {\n              return !Qt(Ot) || ct(oe) || D(Ot) >= oe;\n            }, H.$observe(\"min\", function(Ot) {\n              Ot !== Vt && (oe = At(Ot), Vt = Ot, F.$validate());\n            });\n          }\n          if (ot(H.max) || H.ngMax) {\n            var _t = H.max || st(H.ngMax)(q), Bt = At(_t);\n            F.$validators.max = function(Ot) {\n              return !Qt(Ot) || ct(Bt) || D(Ot) <= Bt;\n            }, H.$observe(\"max\", function(Ot) {\n              Ot !== _t && (Bt = At(Ot), _t = Ot, F.$validate());\n            });\n          }\n          function Qt(Ot) {\n            return Ot && !(Ot.getTime && Ot.getTime() != Ot.getTime());\n          }\n          function At(Ot) {\n            return ot(Ot) && !Nt(Ot) ? wt(Ot) || void 0 : Ot;\n          }\n          function wt(Ot, Ft) {\n            var qt = F.$options.getOption(\"timezone\");\n            jt && jt !== qt && (Ft = Kr(Ft, un(jt)));\n            var ue = D(Ot, Ft);\n            return !isNaN(ue) && qt && (ue = yn(ue, qt)), ue;\n          }\n        };\n      }\n      function Ua(m, O, D, N, q) {\n        var X = O[0];\n        (N.$$hasNativeValidators = gt(X.validity)) && N.$parsers.push(function(H) {\n          var F = O.prop(\"validity\") || {};\n          if (!F.badInput && !F.typeMismatch) return H;\n          N.$$parserName = q;\n        });\n      }\n      function ml(m) {\n        m.$parsers.push(function(O) {\n          return m.$isEmpty(O) ? null : Yl.test(O) ? parseFloat(O) : void (m.$$parserName = \"number\");\n        }), m.$formatters.push(function(O) {\n          if (!m.$isEmpty(O)) {\n            if (!zt(O)) throw os(\"numfmt\", \"Expected `{0}` to be a number\", O);\n            O = O.toString();\n          }\n          return O;\n        });\n      }\n      function Mo(m) {\n        return ot(m) && !zt(m) && (m = parseFloat(m)), Y(m) ? void 0 : m;\n      }\n      function ns(m) {\n        return (0 | m) === m;\n      }\n      function Bs(m) {\n        var O = m.toString(), D = O.indexOf(\".\");\n        if (D === -1) {\n          if (-1 < m && m < 1) {\n            var N = /e-(\\d+)$/.exec(O);\n            if (N) return Number(N[1]);\n          }\n          return 0;\n        }\n        return O.length - D - 1;\n      }\n      function ks(m, O, D) {\n        var N = Number(m), q = !ns(N), X = !ns(O), H = !ns(D);\n        if (q || X || H) {\n          var F = q ? Bs(N) : 0, Q = X ? Bs(O) : 0, K = H ? Bs(D) : 0, it = Math.max(F, Q, K), st = Math.pow(10, it);\n          N *= st, O *= st, D *= st, q && (N = Math.round(N)), X && (O = Math.round(O)), H && (D = Math.round(D));\n        }\n        return (N - O) % D == 0;\n      }\n      function Fs(m, O, D, N, q) {\n        var X;\n        if (ot(N)) {\n          if (!(X = m(N)).constant)\n            throw os(\n              \"constexpr\",\n              \"Expected constant expression for `{0}`, but saw `{1}`.\",\n              D,\n              N\n            );\n          return X(O);\n        }\n        return q;\n      }\n      var As = [\n        \"$browser\",\n        \"$sniffer\",\n        \"$filter\",\n        \"$parse\",\n        function(m, O, D, N) {\n          return {\n            restrict: \"E\",\n            require: [\"?ngModel\"],\n            link: {\n              pre: function(q, X, H, F) {\n                F[0] && (Fa[n(H.type)] || Fa.text)(q, X, H, F[0], O, m, D, N);\n              }\n            }\n          };\n        }\n      ], Xl = function() {\n        var m = {\n          configurable: !0,\n          enumerable: !1,\n          get: function() {\n            return this.getAttribute(\"value\") || \"\";\n          },\n          set: function(O) {\n            this.setAttribute(\"value\", O);\n          }\n        };\n        return {\n          restrict: \"E\",\n          priority: 200,\n          compile: function(O, D) {\n            if (n(D.type) === \"hidden\")\n              return {\n                pre: function(N, q, X, H) {\n                  var F = q[0];\n                  F.parentNode && F.parentNode.insertBefore(F, F.nextSibling), Object.defineProperty && Object.defineProperty(F, \"value\", m);\n                }\n              };\n          }\n        };\n      }, qs = /^(true|false|\\d+)$/, Zl = function() {\n        function m(O, D, N) {\n          var q = ot(N) ? N : y === 9 ? \"\" : null;\n          O.prop(\"value\", q), D.$set(\"value\", N);\n        }\n        return {\n          restrict: \"A\",\n          priority: 100,\n          compile: function(O, D) {\n            return qs.test(D.ngValue) ? function(N, q, X) {\n              m(q, X, N.$eval(X.ngValue));\n            } : function(N, q, X) {\n              N.$watch(X.ngValue, function(H) {\n                m(q, X, H);\n              });\n            };\n          }\n        };\n      }, vl = [\n        \"$compile\",\n        function(m) {\n          return {\n            restrict: \"AC\",\n            compile: function(O) {\n              return m.$$addBindingClass(O), function(D, N, q) {\n                m.$$addBindingInfo(N, q.ngBind), N = N[0], D.$watch(q.ngBind, function(X) {\n                  N.textContent = _r(X);\n                });\n              };\n            }\n          };\n        }\n      ], Ru = [\n        \"$interpolate\",\n        \"$compile\",\n        function(m, O) {\n          return {\n            compile: function(D) {\n              return O.$$addBindingClass(D), function(N, q, X) {\n                var H = m(q.attr(X.$attr.ngBindTemplate));\n                O.$$addBindingInfo(q, H.expressions), q = q[0], X.$observe(\"ngBindTemplate\", function(F) {\n                  q.textContent = ct(F) ? \"\" : F;\n                });\n              };\n            }\n          };\n        }\n      ], Ql = [\n        \"$sce\",\n        \"$parse\",\n        \"$compile\",\n        function(m, O, D) {\n          return {\n            restrict: \"A\",\n            compile: function(N, q) {\n              var X = O(q.ngBindHtml), H = O(q.ngBindHtml, function(F) {\n                return m.valueOf(F);\n              });\n              return D.$$addBindingClass(N), function(F, Q, K) {\n                D.$$addBindingInfo(Q, K.ngBindHtml), F.$watch(H, function() {\n                  var it = X(F);\n                  Q.html(m.getTrustedHtml(it) || \"\");\n                });\n              };\n            }\n          };\n        }\n      ], ka = nt({\n        restrict: \"A\",\n        require: \"ngModel\",\n        link: function(m, O, D, N) {\n          N.$viewChangeListeners.push(function() {\n            m.$eval(D.ngChange);\n          });\n        }\n      });\n      function Us(m, O) {\n        var D;\n        return m = \"ngClass\" + m, [\n          \"$parse\",\n          function(H) {\n            return {\n              restrict: \"AC\",\n              link: function(F, Q, K) {\n                var it, st = Q.data(\"$classCounts\"), Ct = !0;\n                function jt(Tt, Vt) {\n                  var oe = [];\n                  return s(Tt, function(_t) {\n                    (Vt > 0 || st[_t]) && (st[_t] = (st[_t] || 0) + Vt, st[_t] === +(Vt > 0) && oe.push(_t));\n                  }), oe.join(\" \");\n                }\n                st || (st = ur(), Q.data(\"$classCounts\", st)), m !== \"ngClass\" && (D || (D = H(\"$index\", function(Tt) {\n                  return 1 & Tt;\n                })), F.$watch(D, function(Tt) {\n                  Tt === O ? (Vt = jt(q(Vt = it), 1), K.$addClass(Vt)) : function(oe) {\n                    oe = jt(q(oe), -1), K.$removeClass(oe);\n                  }(it);\n                  var Vt;\n                  Ct = Tt;\n                })), F.$watch(H(K[m], X), function(Tt) {\n                  Ct === O && function(Vt, oe) {\n                    var _t = q(Vt), Bt = q(oe), Qt = N(_t, Bt), At = N(Bt, _t), wt = jt(Qt, -1), Ot = jt(At, 1);\n                    K.$addClass(Ot), K.$removeClass(wt);\n                  }(it, Tt), it = Tt;\n                });\n              }\n            };\n          }\n        ];\n        function N(H, F) {\n          if (!H || !H.length) return [];\n          if (!F || !F.length) return H;\n          var Q = [];\n          t: for (var K = 0; K < H.length; K++) {\n            for (var it = H[K], st = 0; st < F.length; st++)\n              if (it === F[st]) continue t;\n            Q.push(it);\n          }\n          return Q;\n        }\n        function q(H) {\n          return H && H.split(\" \");\n        }\n        function X(H) {\n          if (!H) return H;\n          var F = H;\n          return re(H) ? F = H.map(X).join(\" \") : gt(H) ? F = Object.keys(H).filter(function(Q) {\n            return H[Q];\n          }).join(\" \") : St(H) || (F = H + \"\"), F;\n        }\n      }\n      var Jl = Us(\"\", !0), Iu = Us(\"Odd\", 0), Kl = Us(\"Even\", 1), Aa = ja({\n        compile: function(m, O) {\n          O.$set(\"ngCloak\", void 0), m.removeClass(\"ng-cloak\");\n        }\n      }), bl = [\n        function() {\n          return { restrict: \"A\", scope: !0, controller: \"@\", priority: 500 };\n        }\n      ], Vs = {}, yl = { blur: !0, focus: !0 };\n      function Es(m, O, D, N, q, X) {\n        return {\n          restrict: \"A\",\n          compile: function(H, F) {\n            var Q = m(F[N]);\n            return function(K, it) {\n              it.on(q, function(st) {\n                var Ct = function() {\n                  Q(K, { $event: st });\n                };\n                if (O.$$phase)\n                  if (X) K.$evalAsync(Ct);\n                  else\n                    try {\n                      Ct();\n                    } catch (jt) {\n                      D(jt);\n                    }\n                else K.$apply(Ct);\n              });\n            };\n          }\n        };\n      }\n      s(\n        \"click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste\".split(\n          \" \"\n        ),\n        function(m) {\n          var O = Br(\"ng-\" + m);\n          Vs[O] = [\n            \"$parse\",\n            \"$rootScope\",\n            \"$exceptionHandler\",\n            function(D, N, q) {\n              return Es(D, N, q, O, m, yl[m]);\n            }\n          ];\n        }\n      );\n      var is = [\n        \"$animate\",\n        \"$compile\",\n        function(m, O) {\n          return {\n            multiElement: !0,\n            transclude: \"element\",\n            priority: 600,\n            terminal: !0,\n            restrict: \"A\",\n            $$tlb: !0,\n            link: function(D, N, q, X, H) {\n              var F, Q, K;\n              D.$watch(q.ngIf, function(it) {\n                it ? Q || H(function(st, Ct) {\n                  Q = Ct, st[st.length++] = O.$$createComment(\n                    \"end ngIf\",\n                    q.ngIf\n                  ), F = { clone: st }, m.enter(st, N.parent(), N);\n                }) : (K && (K.remove(), K = null), Q && (Q.$destroy(), Q = null), F && (K = Xn(F.clone), m.leave(K).done(function(st) {\n                  st !== !1 && (K = null);\n                }), F = null));\n              });\n            }\n          };\n        }\n      ], Sr = [\n        \"$templateRequest\",\n        \"$anchorScroll\",\n        \"$animate\",\n        function(m, O, D) {\n          return {\n            restrict: \"ECA\",\n            priority: 400,\n            terminal: !0,\n            transclude: \"element\",\n            controller: f.noop,\n            compile: function(N, q) {\n              var X = q.ngInclude || q.src, H = q.onload || \"\", F = q.autoscroll;\n              return function(Q, K, it, st, Ct) {\n                var jt, Tt, Vt, oe = 0, _t = function() {\n                  Tt && (Tt.remove(), Tt = null), jt && (jt.$destroy(), jt = null), Vt && (D.leave(Vt).done(function(Bt) {\n                    Bt !== !1 && (Tt = null);\n                  }), Tt = Vt, Vt = null);\n                };\n                Q.$watch(X, function(Bt) {\n                  var Qt = function(wt) {\n                    wt === !1 || !ot(F) || F && !Q.$eval(F) || O();\n                  }, At = ++oe;\n                  Bt ? (m(Bt, !0).then(\n                    function(wt) {\n                      if (!Q.$$destroyed && At === oe) {\n                        var Ot = Q.$new();\n                        st.template = wt;\n                        var Ft = Ct(Ot, function(qt) {\n                          _t(), D.enter(qt, null, K).done(Qt);\n                        });\n                        Vt = Ft, (jt = Ot).$emit(\"$includeContentLoaded\", Bt), Q.$eval(H);\n                      }\n                    },\n                    function() {\n                      Q.$$destroyed || At === oe && (_t(), Q.$emit(\"$includeContentError\", Bt));\n                    }\n                  ), Q.$emit(\"$includeContentRequested\", Bt)) : (_t(), st.template = null);\n                });\n              };\n            }\n          };\n        }\n      ], Hs = [\n        \"$compile\",\n        function(m) {\n          return {\n            restrict: \"ECA\",\n            priority: -400,\n            require: \"ngInclude\",\n            link: function(O, D, N, q) {\n              if (i.call(D[0]).match(/SVG/))\n                return D.empty(), void m(ro(q.template, e.document).childNodes)(\n                  O,\n                  function(X) {\n                    D.append(X);\n                  },\n                  { futureParentElement: D }\n                );\n              D.html(q.template), m(D.contents())(O);\n            }\n          };\n        }\n      ], xl = ja({\n        priority: 450,\n        compile: function() {\n          return {\n            pre: function(m, O, D) {\n              m.$eval(D.ngInit);\n            }\n          };\n        }\n      }), Va = function() {\n        return {\n          restrict: \"A\",\n          priority: 100,\n          require: \"ngModel\",\n          link: function(m, O, D, N) {\n            var q = D.ngList || \", \", X = D.ngTrim !== \"false\", H = X ? kt(q) : q;\n            N.$parsers.push(function(F) {\n              if (!ct(F)) {\n                var Q = [];\n                return F && s(F.split(H), function(K) {\n                  K && Q.push(X ? kt(K) : K);\n                }), Q;\n              }\n            }), N.$formatters.push(function(F) {\n              if (re(F)) return F.join(q);\n            }), N.$isEmpty = function(F) {\n              return !F || !F.length;\n            };\n          }\n        };\n      }, Ha = \"ng-valid\", wl = \"ng-invalid\", bi = \"ng-pristine\", Ss = \"ng-dirty\", os = E(\"ngModel\");\n      function Gs(m, O, D, N, q, X, H, F, Q) {\n        var K;\n        this.$viewValue = Number.NaN, this.$modelValue = Number.NaN, this.$$rawModelValue = void 0, this.$validators = {}, this.$asyncValidators = {}, this.$parsers = [], this.$formatters = [], this.$viewChangeListeners = [], this.$untouched = !0, this.$touched = !1, this.$pristine = !0, this.$dirty = !1, this.$valid = !0, this.$invalid = !1, this.$error = {}, this.$$success = {}, this.$pending = void 0, this.$name = Q(D.name || \"\", !1)(m), this.$$parentForm = es, this.$options = Yo, this.$$updateEvents = \"\", this.$$updateEventHandler = this.$$updateEventHandler.bind(this), this.$$parsedNgModel = q(D.ngModel), this.$$parsedNgModelAssign = this.$$parsedNgModel.assign, this.$$ngModelGet = this.$$parsedNgModel, this.$$ngModelSet = this.$$parsedNgModelAssign, this.$$pendingDebounce = null, this.$$parserValid = void 0, this.$$parserName = \"parse\", this.$$currentValidationRunId = 0, this.$$scope = m, this.$$rootScope = m.$root, this.$$attr = D, this.$$element = N, this.$$animate = X, this.$$timeout = H, this.$$parse = q, this.$$q = F, this.$$exceptionHandler = O, xa(this), (K = this).$$scope.$watch(function(it) {\n          var st = K.$$ngModelGet(it);\n          return st === K.$modelValue || K.$modelValue != K.$modelValue && st != st || K.$$setModelValue(st), st;\n        });\n      }\n      Gs.$inject = [\n        \"$scope\",\n        \"$exceptionHandler\",\n        \"$attrs\",\n        \"$element\",\n        \"$parse\",\n        \"$animate\",\n        \"$timeout\",\n        \"$q\",\n        \"$interpolate\"\n      ], Gs.prototype = {\n        $$initGetterSetters: function() {\n          if (this.$options.getOption(\"getterSetter\")) {\n            var m = this.$$parse(this.$$attr.ngModel + \"()\"), O = this.$$parse(this.$$attr.ngModel + \"($$$p)\");\n            this.$$ngModelGet = function(D) {\n              var N = this.$$parsedNgModel(D);\n              return ne(N) && (N = m(D)), N;\n            }, this.$$ngModelSet = function(D, N) {\n              ne(this.$$parsedNgModel(D)) ? O(D, { $$$p: N }) : this.$$parsedNgModelAssign(D, N);\n            };\n          } else if (!this.$$parsedNgModel.assign)\n            throw os(\n              \"nonassign\",\n              \"Expression '{0}' is non-assignable. Element: {1}\",\n              this.$$attr.ngModel,\n              nn(this.$$element)\n            );\n        },\n        $render: Z,\n        $isEmpty: function(m) {\n          return ct(m) || m === \"\" || m === null || m != m;\n        },\n        $$updateEmptyClasses: function(m) {\n          this.$isEmpty(m) ? (this.$$animate.removeClass(this.$$element, \"ng-not-empty\"), this.$$animate.addClass(this.$$element, \"ng-empty\")) : (this.$$animate.removeClass(this.$$element, \"ng-empty\"), this.$$animate.addClass(this.$$element, \"ng-not-empty\"));\n        },\n        $setPristine: function() {\n          this.$dirty = !1, this.$pristine = !0, this.$$animate.removeClass(this.$$element, Ss), this.$$animate.addClass(this.$$element, bi);\n        },\n        $setDirty: function() {\n          this.$dirty = !0, this.$pristine = !1, this.$$animate.removeClass(this.$$element, bi), this.$$animate.addClass(this.$$element, Ss), this.$$parentForm.$setDirty();\n        },\n        $setUntouched: function() {\n          this.$touched = !1, this.$untouched = !0, this.$$animate.setClass(\n            this.$$element,\n            \"ng-untouched\",\n            \"ng-touched\"\n          );\n        },\n        $setTouched: function() {\n          this.$touched = !0, this.$untouched = !1, this.$$animate.setClass(\n            this.$$element,\n            \"ng-touched\",\n            \"ng-untouched\"\n          );\n        },\n        $rollbackViewValue: function() {\n          this.$$timeout.cancel(this.$$pendingDebounce), this.$viewValue = this.$$lastCommittedViewValue, this.$render();\n        },\n        $validate: function() {\n          if (!Y(this.$modelValue)) {\n            var m = this.$$lastCommittedViewValue, O = this.$$rawModelValue, D = this.$valid, N = this.$modelValue, q = this.$options.getOption(\"allowInvalid\"), X = this;\n            this.$$runValidators(O, m, function(H) {\n              q || D === H || (X.$modelValue = H ? O : void 0, X.$modelValue !== N && X.$$writeModelToScope());\n            });\n          }\n        },\n        $$runValidators: function(m, O, D) {\n          this.$$currentValidationRunId++;\n          var N, q, X = this.$$currentValidationRunId, H = this;\n          (function() {\n            var K = H.$$parserName;\n            return ct(H.$$parserValid) ? (F(K, null), !0) : (H.$$parserValid || (s(H.$validators, function(it, st) {\n              F(st, null);\n            }), s(H.$asyncValidators, function(it, st) {\n              F(st, null);\n            })), F(K, H.$$parserValid), H.$$parserValid);\n          })() && function() {\n            var K = !0;\n            return s(H.$validators, function(it, st) {\n              var Ct = !!it(m, O);\n              K = K && Ct, F(st, Ct);\n            }), K ? !0 : (s(H.$asyncValidators, function(it, st) {\n              F(st, null);\n            }), !1);\n          }() ? (N = [], q = !0, s(H.$asyncValidators, function(K, it) {\n            var st = K(m, O);\n            if (!Le(st))\n              throw os(\n                \"nopromise\",\n                \"Expected asynchronous validator to return a promise but got '{0}' instead.\",\n                st\n              );\n            F(it, void 0), N.push(\n              st.then(\n                function() {\n                  F(it, !0);\n                },\n                function() {\n                  q = !1, F(it, !1);\n                }\n              )\n            );\n          }), N.length ? H.$$q.all(N).then(function() {\n            Q(q);\n          }, Z) : Q(!0)) : Q(!1);\n          function F(K, it) {\n            X === H.$$currentValidationRunId && H.$setValidity(K, it);\n          }\n          function Q(K) {\n            X === H.$$currentValidationRunId && D(K);\n          }\n        },\n        $commitViewValue: function() {\n          var m = this.$viewValue;\n          this.$$timeout.cancel(this.$$pendingDebounce), (this.$$lastCommittedViewValue !== m || m === \"\" && this.$$hasNativeValidators) && (this.$$updateEmptyClasses(m), this.$$lastCommittedViewValue = m, this.$pristine && this.$setDirty(), this.$$parseAndValidate());\n        },\n        $$parseAndValidate: function() {\n          var m = this.$$lastCommittedViewValue, O = this;\n          if (this.$$parserValid = !ct(m) || void 0, this.$setValidity(this.$$parserName, null), this.$$parserName = \"parse\", this.$$parserValid) {\n            for (var D = 0; D < this.$parsers.length; D++)\n              if (ct(m = this.$parsers[D](m))) {\n                this.$$parserValid = !1;\n                break;\n              }\n          }\n          Y(this.$modelValue) && (this.$modelValue = this.$$ngModelGet(this.$$scope));\n          var N = this.$modelValue, q = this.$options.getOption(\"allowInvalid\");\n          function X() {\n            O.$modelValue !== N && O.$$writeModelToScope();\n          }\n          this.$$rawModelValue = m, q && (this.$modelValue = m, X()), this.$$runValidators(\n            m,\n            this.$$lastCommittedViewValue,\n            function(H) {\n              q || (O.$modelValue = H ? m : void 0, X());\n            }\n          );\n        },\n        $$writeModelToScope: function() {\n          this.$$ngModelSet(this.$$scope, this.$modelValue), s(\n            this.$viewChangeListeners,\n            function(m) {\n              try {\n                m();\n              } catch (O) {\n                this.$$exceptionHandler(O);\n              }\n            },\n            this\n          );\n        },\n        $setViewValue: function(m, O) {\n          this.$viewValue = m, this.$options.getOption(\"updateOnDefault\") && this.$$debounceViewValueCommit(O);\n        },\n        $$debounceViewValueCommit: function(m) {\n          var O = this.$options.getOption(\"debounce\");\n          zt(O[m]) ? O = O[m] : zt(O.default) && this.$options.getOption(\"updateOn\").indexOf(m) === -1 ? O = O.default : zt(O[\"*\"]) && (O = O[\"*\"]), this.$$timeout.cancel(this.$$pendingDebounce);\n          var D = this;\n          O > 0 ? this.$$pendingDebounce = this.$$timeout(function() {\n            D.$commitViewValue();\n          }, O) : this.$$rootScope.$$phase ? this.$commitViewValue() : this.$$scope.$apply(function() {\n            D.$commitViewValue();\n          });\n        },\n        $overrideModelOptions: function(m) {\n          this.$options = this.$options.createChild(m), this.$$setUpdateOnEvents();\n        },\n        $processModelValue: function() {\n          var m = this.$$format();\n          this.$viewValue !== m && (this.$$updateEmptyClasses(m), this.$viewValue = this.$$lastCommittedViewValue = m, this.$render(), this.$$runValidators(this.$modelValue, this.$viewValue, Z));\n        },\n        $$format: function() {\n          for (var m = this.$formatters, O = m.length, D = this.$modelValue; O--; )\n            D = m[O](D);\n          return D;\n        },\n        $$setModelValue: function(m) {\n          this.$modelValue = this.$$rawModelValue = m, this.$$parserValid = void 0, this.$processModelValue();\n        },\n        $$setUpdateOnEvents: function() {\n          this.$$updateEvents && this.$$element.off(\n            this.$$updateEvents,\n            this.$$updateEventHandler\n          ), this.$$updateEvents = this.$options.getOption(\"updateOn\"), this.$$updateEvents && this.$$element.on(\n            this.$$updateEvents,\n            this.$$updateEventHandler\n          );\n        },\n        $$updateEventHandler: function(m) {\n          this.$$debounceViewValueCommit(m && m.type);\n        }\n      }, Hl({\n        clazz: Gs,\n        set: function(m, O) {\n          m[O] = !0;\n        },\n        unset: function(m, O) {\n          delete m[O];\n        }\n      });\n      var Yo, xo = [\n        \"$rootScope\",\n        function(m) {\n          return {\n            restrict: \"A\",\n            require: [\"ngModel\", \"^?form\", \"^?ngModelOptions\"],\n            controller: Gs,\n            priority: 1,\n            compile: function(O) {\n              return O.addClass(bi).addClass(\"ng-untouched\").addClass(Ha), {\n                pre: function(D, N, q, X) {\n                  var H = X[0], F = X[1] || H.$$parentForm, Q = X[2];\n                  Q && (H.$options = Q.$options), H.$$initGetterSetters(), F.$addControl(H), q.$observe(\"name\", function(K) {\n                    H.$name !== K && H.$$parentForm.$$renameControl(H, K);\n                  }), D.$on(\"$destroy\", function() {\n                    H.$$parentForm.$removeControl(H);\n                  });\n                },\n                post: function(D, N, q, X) {\n                  var H = X[0];\n                  function F() {\n                    H.$setTouched();\n                  }\n                  H.$$setUpdateOnEvents(), N.on(\"blur\", function() {\n                    H.$touched || (m.$$phase ? D.$evalAsync(F) : D.$apply(F));\n                  });\n                }\n              };\n            }\n          };\n        }\n      ], kl = /(\\s+|^)default(\\s+|$)/;\n      function Cs(m) {\n        this.$$options = m;\n      }\n      Cs.prototype = {\n        getOption: function(m) {\n          return this.$$options[m];\n        },\n        createChild: function(m) {\n          var O = !1;\n          return s(\n            m = z({}, m),\n            function(D, N) {\n              D === \"$inherit\" ? N === \"*\" ? O = !0 : (m[N] = this.$$options[N], N === \"updateOn\" && (m.updateOnDefault = this.$$options.updateOnDefault)) : N === \"updateOn\" && (m.updateOnDefault = !1, m[N] = kt(\n                D.replace(kl, function() {\n                  return m.updateOnDefault = !0, \" \";\n                })\n              ));\n            },\n            this\n          ), O && (delete m[\"*\"], as(m, this.$$options)), as(m, Yo.$$options), new Cs(m);\n        }\n      }, Yo = new Cs({\n        updateOn: \"\",\n        updateOnDefault: !0,\n        debounce: 0,\n        getterSetter: !1,\n        allowInvalid: !1,\n        timezone: null\n      });\n      var Nu = function() {\n        function m(O, D) {\n          this.$$attrs = O, this.$$scope = D;\n        }\n        return m.$inject = [\"$attrs\", \"$scope\"], m.prototype = {\n          $onInit: function() {\n            var O = this.parentCtrl ? this.parentCtrl.$options : Yo, D = this.$$scope.$eval(this.$$attrs.ngModelOptions);\n            this.$options = O.createChild(D);\n          }\n        }, {\n          restrict: \"A\",\n          priority: 10,\n          require: { parentCtrl: \"?^^ngModelOptions\" },\n          bindToController: !0,\n          controller: m\n        };\n      };\n      function as(m, O) {\n        s(O, function(D, N) {\n          ot(m[N]) || (m[N] = D);\n        });\n      }\n      var tu = ja({ terminal: !0, priority: 1e3 }), eu = E(\"ngOptions\"), ru = /^\\s*([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?(?:\\s+group\\s+by\\s+([\\s\\S]+?))?(?:\\s+disable\\s+when\\s+([\\s\\S]+?))?\\s+for\\s+(?:([$\\w][$\\w]*)|(?:\\(\\s*([$\\w][$\\w]*)\\s*,\\s*([$\\w][$\\w]*)\\s*\\)))\\s+in\\s+([\\s\\S]+?)(?:\\s+track\\s+by\\s+([\\s\\S]+?))?$/, nu = [\n        \"$compile\",\n        \"$document\",\n        \"$parse\",\n        function(m, O, D) {\n          var N = e.document.createElement(\"option\"), q = e.document.createElement(\"optgroup\");\n          return {\n            restrict: \"A\",\n            terminal: !0,\n            require: [\"select\", \"ngModel\"],\n            link: {\n              pre: function(X, H, F, Q) {\n                Q[0].registerOption = Z;\n              },\n              post: function(X, H, F, Q) {\n                for (var K = Q[0], it = Q[1], st = F.multiple, Ct = 0, jt = H.children(), Tt = jt.length; Ct < Tt; Ct++)\n                  if (jt[Ct].value === \"\") {\n                    K.hasEmptyOption = !0, K.emptyOption = jt.eq(Ct);\n                    break;\n                  }\n                H.empty();\n                var Vt, oe = !!K.emptyOption;\n                x(N.cloneNode(!1)).val(\"?\");\n                var _t = function(wt, Ot, Ft) {\n                  var qt = wt.match(ru);\n                  if (!qt)\n                    throw eu(\n                      \"iexp\",\n                      \"Expected expression in form of '_select_ (as _label_)? for (_key_,)?_value_ in _collection_' but got '{0}'. Element: {1}\",\n                      wt,\n                      nn(Ot)\n                    );\n                  var ue = qt[5] || qt[7], ie = qt[6], ge = / as /.test(qt[0]) && qt[1], Te = qt[9], Xe = D(qt[2] ? qt[1] : ue), He = ge && D(ge) || Xe, Qr = Te && D(Te), vr = Te ? function(cr, Jr) {\n                    return Qr(Ft, Jr);\n                  } : function(cr) {\n                    return io(cr);\n                  }, Cr = function(cr, Jr) {\n                    return vr(cr, kn(cr, Jr));\n                  }, cn = D(qt[2] || qt[1]), Pr = D(qt[3] || \"\"), dn = D(qt[4] || \"\"), _n = D(qt[8]), On = {}, kn = ie ? function(cr, Jr) {\n                    return On[ie] = Jr, On[ue] = cr, On;\n                  } : function(cr) {\n                    return On[ue] = cr, On;\n                  };\n                  function zo(cr, Jr, An, Ln, er) {\n                    this.selectValue = cr, this.viewValue = Jr, this.label = An, this.group = Ln, this.disabled = er;\n                  }\n                  function br(cr) {\n                    var Jr;\n                    if (!ie && k(cr)) Jr = cr;\n                    else\n                      for (var An in Jr = [], cr)\n                        cr.hasOwnProperty(An) && An.charAt(0) !== \"$\" && Jr.push(An);\n                    return Jr;\n                  }\n                  return {\n                    trackBy: Te,\n                    getTrackByValue: Cr,\n                    getWatchables: D(_n, function(cr) {\n                      for (var Jr = [], An = br(cr = cr || []), Ln = An.length, er = 0; er < Ln; er++) {\n                        var Xo = cr === An ? er : An[er], Qn = cr[Xo], zn = kn(Qn, Xo), Ai = vr(Qn, zn);\n                        if (Jr.push(Ai), qt[2] || qt[1]) {\n                          var Ya = cn(Ft, zn);\n                          Jr.push(Ya);\n                        }\n                        if (qt[4]) {\n                          var Ko = dn(Ft, zn);\n                          Jr.push(Ko);\n                        }\n                      }\n                      return Jr;\n                    }),\n                    getOptions: function() {\n                      for (var cr = [], Jr = {}, An = _n(Ft) || [], Ln = br(An), er = Ln.length, Xo = 0; Xo < er; Xo++) {\n                        var Qn = An === Ln ? Xo : Ln[Xo], zn = An[Qn], Ai = kn(zn, Qn), Ya = He(Ft, Ai), Ko = vr(Ya, Ai), Zo = new zo(Ko, Ya, cn(Ft, Ai), Pr(Ft, Ai), dn(Ft, Ai));\n                        cr.push(Zo), Jr[Ko] = Zo;\n                      }\n                      return {\n                        items: cr,\n                        selectValueMap: Jr,\n                        getOptionFromViewValue: function(Ta) {\n                          return Jr[Cr(Ta)];\n                        },\n                        getViewValueFromOption: function(Ta) {\n                          return Te ? le(Ta.viewValue) : Ta.viewValue;\n                        }\n                      };\n                    }\n                  };\n                }(F.ngOptions, H, X), Bt = O[0].createDocumentFragment();\n                function Qt(wt, Ot) {\n                  var Ft = N.cloneNode(!1);\n                  Ot.appendChild(Ft), function(qt, ue) {\n                    qt.element = ue, ue.disabled = qt.disabled, qt.label !== ue.label && (ue.label = qt.label, ue.textContent = qt.label), ue.value = qt.selectValue;\n                  }(wt, Ft);\n                }\n                function At(wt) {\n                  var Ot = Vt.getOptionFromViewValue(wt), Ft = Ot && Ot.element;\n                  return Ft && !Ft.selected && (Ft.selected = !0), Ot;\n                }\n                K.generateUnknownOptionValue = function(wt) {\n                  return \"?\";\n                }, st ? (K.writeValue = function(wt) {\n                  if (Vt) {\n                    var Ot = wt && wt.map(At) || [];\n                    Vt.items.forEach(function(Ft) {\n                      Ft.element.selected && !Rt(Ot, Ft) && (Ft.element.selected = !1);\n                    });\n                  }\n                }, K.readValue = function() {\n                  var wt = H.val() || [], Ot = [];\n                  return s(wt, function(Ft) {\n                    var qt = Vt.selectValueMap[Ft];\n                    qt && !qt.disabled && Ot.push(Vt.getViewValueFromOption(qt));\n                  }), Ot;\n                }, _t.trackBy && X.$watchCollection(\n                  function() {\n                    if (re(it.$viewValue))\n                      return it.$viewValue.map(function(wt) {\n                        return _t.getTrackByValue(wt);\n                      });\n                  },\n                  function() {\n                    it.$render();\n                  }\n                )) : (K.writeValue = function(wt) {\n                  if (Vt) {\n                    var Ot = H[0].options[H[0].selectedIndex], Ft = Vt.getOptionFromViewValue(wt);\n                    Ot && Ot.removeAttribute(\"selected\"), Ft ? (H[0].value !== Ft.selectValue && (K.removeUnknownOption(), H[0].value = Ft.selectValue, Ft.element.selected = !0), Ft.element.setAttribute(\n                      \"selected\",\n                      \"selected\"\n                    )) : K.selectUnknownOrEmptyOption(wt);\n                  }\n                }, K.readValue = function() {\n                  var wt = Vt.selectValueMap[H.val()];\n                  return wt && !wt.disabled ? (K.unselectEmptyOption(), K.removeUnknownOption(), Vt.getViewValueFromOption(wt)) : null;\n                }, _t.trackBy && X.$watch(\n                  function() {\n                    return _t.getTrackByValue(it.$viewValue);\n                  },\n                  function() {\n                    it.$render();\n                  }\n                )), oe && (m(K.emptyOption)(X), H.prepend(K.emptyOption), K.emptyOption[0].nodeType === 8 ? (K.hasEmptyOption = !1, K.registerOption = function(wt, Ot) {\n                  Ot.val() === \"\" && (K.hasEmptyOption = !0, K.emptyOption = Ot, K.emptyOption.removeClass(\"ng-scope\"), it.$render(), Ot.on(\"$destroy\", function() {\n                    var Ft = K.$isEmptyOptionSelected();\n                    K.hasEmptyOption = !1, K.emptyOption = void 0, Ft && it.$render();\n                  }));\n                }) : K.emptyOption.removeClass(\"ng-scope\")), X.$watchCollection(_t.getWatchables, function() {\n                  var wt = Vt && K.readValue();\n                  if (Vt)\n                    for (var Ot = Vt.items.length - 1; Ot >= 0; Ot--) {\n                      var Ft = Vt.items[Ot];\n                      ot(Ft.group) ? di(Ft.element.parentNode) : di(Ft.element);\n                    }\n                  Vt = _t.getOptions();\n                  var qt = {};\n                  if (Vt.items.forEach(function(ie) {\n                    var ge;\n                    ot(ie.group) ? ((ge = qt[ie.group]) || (ge = q.cloneNode(!1), Bt.appendChild(ge), ge.label = ie.group === null ? \"null\" : ie.group, qt[ie.group] = ge), Qt(ie, ge)) : Qt(ie, Bt);\n                  }), H[0].appendChild(Bt), it.$render(), !it.$isEmpty(wt)) {\n                    var ue = K.readValue();\n                    (_t.trackBy || st ? pe(wt, ue) : wt === ue) || (it.$setViewValue(ue), it.$render());\n                  }\n                });\n              }\n            }\n          };\n        }\n      ], Mu = [\n        \"$locale\",\n        \"$interpolate\",\n        \"$log\",\n        function(m, O, D) {\n          var N = /{}/g, q = /^when(Minus)?(.+)$/;\n          return {\n            link: function(X, H, F) {\n              var Q, K = F.count, it = F.$attr.when && H.attr(F.$attr.when), st = F.offset || 0, Ct = X.$eval(it) || {}, jt = {}, Tt = O.startSymbol(), Vt = O.endSymbol(), oe = Tt + K + \"-\" + st + Vt, _t = f.noop;\n              function Bt(Qt) {\n                H.text(Qt || \"\");\n              }\n              s(F, function(Qt, At) {\n                var wt = q.exec(At);\n                if (wt) {\n                  var Ot = (wt[1] ? \"-\" : \"\") + n(wt[2]);\n                  Ct[Ot] = H.attr(F.$attr[At]);\n                }\n              }), s(Ct, function(Qt, At) {\n                jt[At] = O(Qt.replace(N, oe));\n              }), X.$watch(K, function(Qt) {\n                var At = parseFloat(Qt), wt = Y(At);\n                if (wt || At in Ct || (At = m.pluralCat(At - st)), !(At === Q || wt && Y(Q))) {\n                  _t();\n                  var Ot = jt[At];\n                  ct(Ot) ? (Qt != null && D.debug(\n                    \"ngPluralize: no rule defined for '\" + At + \"' in \" + it\n                  ), _t = Z, Bt()) : _t = X.$watch(Ot, Bt), Q = At;\n                }\n              });\n            }\n          };\n        }\n      ], Ws = E(\"ngRef\"), iu = [\n        \"$parse\",\n        function(m) {\n          return {\n            priority: -1,\n            restrict: \"A\",\n            compile: function(O, D) {\n              var N = Br(ft(O)), q = m(D.ngRef), X = q.assign || function() {\n                throw Ws(\n                  \"nonassign\",\n                  'Expression in ngRef=\"{0}\" is non-assignable!',\n                  D.ngRef\n                );\n              };\n              return function(H, F, Q) {\n                var K;\n                if (Q.hasOwnProperty(\"ngRefRead\")) {\n                  if (Q.ngRefRead === \"$element\") K = F;\n                  else if (!(K = F.data(\"$\" + Q.ngRefRead + \"Controller\")))\n                    throw Ws(\n                      \"noctrl\",\n                      'The controller for ngRefRead=\"{0}\" could not be found on ngRef=\"{1}\"',\n                      Q.ngRefRead,\n                      D.ngRef\n                    );\n                } else K = F.data(\"$\" + N + \"Controller\");\n                X(H, K = K || F), F.on(\"$destroy\", function() {\n                  q(H) === K && X(H, null);\n                });\n              };\n            }\n          };\n        }\n      ], $s = [\n        \"$parse\",\n        \"$animate\",\n        \"$compile\",\n        function(m, O, D) {\n          var N = E(\"ngRepeat\"), q = function(K, it, st, Ct, jt, Tt, Vt) {\n            K[st] = Ct, jt && (K[jt] = Tt), K.$index = it, K.$first = it === 0, K.$last = it === Vt - 1, K.$middle = !(K.$first || K.$last), K.$odd = !(K.$even = (1 & it) == 0);\n          }, X = function(K) {\n            return K.clone[0];\n          }, H = function(K) {\n            return K.clone[K.clone.length - 1];\n          }, F = function(K, it, st) {\n            return io(st);\n          }, Q = function(K, it) {\n            return it;\n          };\n          return {\n            restrict: \"A\",\n            multiElement: !0,\n            transclude: \"element\",\n            priority: 1e3,\n            terminal: !0,\n            $$tlb: !0,\n            compile: function(K, it) {\n              var st = it.ngRepeat, Ct = D.$$createComment(\"end ngRepeat\", st), jt = st.match(\n                /^\\s*([\\s\\S]+?)\\s+in\\s+([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?(?:\\s+track\\s+by\\s+([\\s\\S]+?))?\\s*$/\n              );\n              if (!jt)\n                throw N(\n                  \"iexp\",\n                  \"Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.\",\n                  st\n                );\n              var Tt = jt[1], Vt = jt[2], oe = jt[3], _t = jt[4];\n              if (!(jt = Tt.match(\n                /^(?:(\\s*[$\\w]+)|\\(\\s*([$\\w]+)\\s*,\\s*([$\\w]+)\\s*\\))$/\n              )))\n                throw N(\n                  \"iidexp\",\n                  \"'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.\",\n                  Tt\n                );\n              var Bt, Qt = jt[3] || jt[1], At = jt[2];\n              if (oe && (!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(oe) || /^(null|undefined|this|\\$index|\\$first|\\$middle|\\$last|\\$even|\\$odd|\\$parent|\\$root|\\$id)$/.test(\n                oe\n              )))\n                throw N(\n                  \"badident\",\n                  \"alias '{0}' is invalid --- must be a valid JS identifier which is not a reserved name.\",\n                  oe\n                );\n              if (_t) {\n                var wt = { $id: io }, Ot = m(_t);\n                Bt = function(Ft, qt, ue, ie) {\n                  return At && (wt[At] = qt), wt[Qt] = ue, wt.$index = ie, Ot(Ft, wt);\n                };\n              }\n              return function(Ft, qt, ue, ie, ge) {\n                var Te = ur();\n                Ft.$watchCollection(Vt, function(Xe) {\n                  var He, Qr, vr, Cr, cn, Pr, dn, _n, On, kn, zo, br, cr = qt[0], Jr = ur();\n                  if (oe && (Ft[oe] = Xe), k(Xe)) On = Xe, _n = Bt || F;\n                  else\n                    for (var An in _n = Bt || Q, On = [], Xe)\n                      a.call(Xe, An) && An.charAt(0) !== \"$\" && On.push(An);\n                  for (Cr = On.length, zo = new Array(Cr), He = 0; He < Cr; He++)\n                    if (cn = Xe === On ? He : On[He], Pr = Xe[cn], dn = _n(Ft, cn, Pr, He), Te[dn])\n                      kn = Te[dn], delete Te[dn], Jr[dn] = kn, zo[He] = kn;\n                    else {\n                      if (Jr[dn])\n                        throw s(zo, function(er) {\n                          er && er.scope && (Te[er.id] = er);\n                        }), N(\n                          \"dupes\",\n                          \"Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}, Duplicate value: {2}\",\n                          st,\n                          dn,\n                          Pr\n                        );\n                      zo[He] = { id: dn, scope: void 0, clone: void 0 }, Jr[dn] = !0;\n                    }\n                  for (var Ln in wt && (wt[Qt] = void 0), Te) {\n                    if (br = Xn((kn = Te[Ln]).clone), O.leave(br), br[0].parentNode)\n                      for (He = 0, Qr = br.length; He < Qr; He++)\n                        br[He].$$NG_REMOVED = !0;\n                    kn.scope.$destroy();\n                  }\n                  for (He = 0; He < Cr; He++)\n                    if (cn = Xe === On ? He : On[He], Pr = Xe[cn], (kn = zo[He]).scope) {\n                      vr = cr;\n                      do\n                        vr = vr.nextSibling;\n                      while (vr && vr.$$NG_REMOVED);\n                      X(kn) !== vr && O.move(Xn(kn.clone), null, cr), cr = H(kn), q(kn.scope, He, Qt, Pr, At, cn, Cr);\n                    } else\n                      ge(function(er, Xo) {\n                        kn.scope = Xo;\n                        var Qn = Ct.cloneNode(!1);\n                        er[er.length++] = Qn, O.enter(er, null, cr), cr = Qn, kn.clone = er, Jr[kn.id] = kn, q(kn.scope, He, Qt, Pr, At, cn, Cr);\n                      });\n                  Te = Jr;\n                });\n              };\n            }\n          };\n        }\n      ], Al = [\n        \"$animate\",\n        function(m) {\n          return {\n            restrict: \"A\",\n            multiElement: !0,\n            link: function(O, D, N) {\n              O.$watch(N.ngShow, function(q) {\n                m[q ? \"removeClass\" : \"addClass\"](D, \"ng-hide\", {\n                  tempClasses: \"ng-hide-animate\"\n                });\n              });\n            }\n          };\n        }\n      ], ou = [\n        \"$animate\",\n        function(m) {\n          return {\n            restrict: \"A\",\n            multiElement: !0,\n            link: function(O, D, N) {\n              O.$watch(N.ngHide, function(q) {\n                m[q ? \"addClass\" : \"removeClass\"](D, \"ng-hide\", {\n                  tempClasses: \"ng-hide-animate\"\n                });\n              });\n            }\n          };\n        }\n      ], au = ja(function(m, O, D) {\n        m.$watchCollection(D.ngStyle, function(N, q) {\n          q && N !== q && s(q, function(X, H) {\n            O.css(H, \"\");\n          }), N && O.css(N);\n        });\n      }), Ys = [\n        \"$animate\",\n        \"$compile\",\n        function(m, O) {\n          return {\n            require: \"ngSwitch\",\n            controller: [\n              \"$scope\",\n              function() {\n                this.cases = {};\n              }\n            ],\n            link: function(D, N, q, X) {\n              var H = q.ngSwitch || q.on, F = [], Q = [], K = [], it = [], st = function(Ct, jt) {\n                return function(Tt) {\n                  Tt !== !1 && Ct.splice(jt, 1);\n                };\n              };\n              D.$watch(H, function(Ct) {\n                for (var jt, Tt; K.length; ) m.cancel(K.pop());\n                for (jt = 0, Tt = it.length; jt < Tt; ++jt) {\n                  var Vt = Xn(Q[jt].clone);\n                  it[jt].$destroy(), (K[jt] = m.leave(Vt)).done(st(K, jt));\n                }\n                Q.length = 0, it.length = 0, (F = X.cases[\"!\" + Ct] || X.cases[\"?\"]) && s(F, function(oe) {\n                  oe.transclude(function(_t, Bt) {\n                    it.push(Bt);\n                    var Qt = oe.element;\n                    _t[_t.length++] = O.$$createComment(\"end ngSwitchWhen\");\n                    var At = { clone: _t };\n                    Q.push(At), m.enter(_t, Qt.parent(), Qt);\n                  });\n                });\n              });\n            }\n          };\n        }\n      ], su = ja({\n        transclude: \"element\",\n        priority: 1200,\n        require: \"^ngSwitch\",\n        multiElement: !0,\n        link: function(m, O, D, N, q) {\n          s(\n            D.ngSwitchWhen.split(D.ngSwitchWhenSeparator).sort().filter(function(X, H, F) {\n              return F[H - 1] !== X;\n            }),\n            function(X) {\n              N.cases[\"!\" + X] = N.cases[\"!\" + X] || [], N.cases[\"!\" + X].push({ transclude: q, element: O });\n            }\n          );\n        }\n      }), sa = ja({\n        transclude: \"element\",\n        priority: 1200,\n        require: \"^ngSwitch\",\n        multiElement: !0,\n        link: function(m, O, D, N, q) {\n          N.cases[\"?\"] = N.cases[\"?\"] || [], N.cases[\"?\"].push({ transclude: q, element: O });\n        }\n      }), Ga = E(\"ngTransclude\"), lu = [\n        \"$compile\",\n        function(m) {\n          return {\n            restrict: \"EAC\",\n            compile: function(O) {\n              var D = m(O.contents());\n              return O.empty(), function(N, q, X, H, F) {\n                if (!F)\n                  throw Ga(\n                    \"orphan\",\n                    \"Illegal use of ngTransclude directive in the template! No parent directive that requires a transclusion found. Element: {0}\",\n                    nn(q)\n                  );\n                X.ngTransclude === X.$attr.ngTransclude && (X.ngTransclude = \"\");\n                var Q = X.ngTransclude || X.ngTranscludeSlot;\n                function K() {\n                  D(N, function(it) {\n                    q.append(it);\n                  });\n                }\n                F(\n                  function(it, st) {\n                    it.length && function(Ct) {\n                      for (var jt = 0, Tt = Ct.length; jt < Tt; jt++) {\n                        var Vt = Ct[jt];\n                        if (Vt.nodeType !== Gi || Vt.nodeValue.trim())\n                          return !0;\n                      }\n                    }(it) ? q.append(it) : (K(), st.$destroy());\n                  },\n                  null,\n                  Q\n                ), Q && !F.isSlotFilled(Q) && K();\n              };\n            }\n          };\n        }\n      ], Lu = [\n        \"$templateCache\",\n        function(m) {\n          return {\n            restrict: \"E\",\n            terminal: !0,\n            compile: function(O, D) {\n              if (D.type === \"text/ng-template\") {\n                var N = D.id, q = O[0].text;\n                m.put(N, q);\n              }\n            }\n          };\n        }\n      ], zu = { $setViewValue: Z, $render: Z };\n      function Wa(m, O) {\n        m.prop(\"selected\", O), m.attr(\"selected\", O);\n      }\n      var uu = [\n        \"$element\",\n        \"$scope\",\n        function(m, O) {\n          var D = this, N = new Ni();\n          D.selectValueMap = {}, D.ngModelCtrl = zu, D.multiple = !1, D.unknownOption = x(e.document.createElement(\"option\")), D.hasEmptyOption = !1, D.emptyOption = void 0, D.renderUnknownOption = function(Q) {\n            var K = D.generateUnknownOptionValue(Q);\n            D.unknownOption.val(K), m.prepend(D.unknownOption), Wa(D.unknownOption, !0), m.val(K);\n          }, D.updateUnknownOption = function(Q) {\n            var K = D.generateUnknownOptionValue(Q);\n            D.unknownOption.val(K), Wa(D.unknownOption, !0), m.val(K);\n          }, D.generateUnknownOptionValue = function(Q) {\n            return \"? \" + io(Q) + \" ?\";\n          }, D.removeUnknownOption = function() {\n            D.unknownOption.parent() && D.unknownOption.remove();\n          }, D.selectEmptyOption = function() {\n            D.emptyOption && (m.val(\"\"), Wa(D.emptyOption, !0));\n          }, D.unselectEmptyOption = function() {\n            D.hasEmptyOption && Wa(D.emptyOption, !1);\n          }, O.$on(\"$destroy\", function() {\n            D.renderUnknownOption = Z;\n          }), D.readValue = function() {\n            var Q = m.val(), K = Q in D.selectValueMap ? D.selectValueMap[Q] : Q;\n            return D.hasOption(K) ? K : null;\n          }, D.writeValue = function(Q) {\n            var K = m[0].options[m[0].selectedIndex];\n            if (K && Wa(x(K), !1), D.hasOption(Q)) {\n              D.removeUnknownOption();\n              var it = io(Q);\n              m.val(it in D.selectValueMap ? it : Q);\n              var st = m[0].options[m[0].selectedIndex];\n              Wa(x(st), !0);\n            } else D.selectUnknownOrEmptyOption(Q);\n          }, D.addOption = function(Q, K) {\n            if (K[0].nodeType !== 8) {\n              ni(Q, '\"option value\"'), Q === \"\" && (D.hasEmptyOption = !0, D.emptyOption = K);\n              var it = N.get(Q) || 0;\n              N.set(Q, it + 1), X();\n            }\n          }, D.removeOption = function(Q) {\n            var K = N.get(Q);\n            K && (K === 1 ? (N.delete(Q), Q === \"\" && (D.hasEmptyOption = !1, D.emptyOption = void 0)) : N.set(Q, K - 1));\n          }, D.hasOption = function(Q) {\n            return !!N.get(Q);\n          }, D.$hasEmptyOption = function() {\n            return D.hasEmptyOption;\n          }, D.$isUnknownOptionSelected = function() {\n            return m[0].options[0] === D.unknownOption[0];\n          }, D.$isEmptyOptionSelected = function() {\n            return D.hasEmptyOption && m[0].options[m[0].selectedIndex] === D.emptyOption[0];\n          }, D.selectUnknownOrEmptyOption = function(Q) {\n            Q == null && D.emptyOption ? (D.removeUnknownOption(), D.selectEmptyOption()) : D.unknownOption.parent().length ? D.updateUnknownOption(Q) : D.renderUnknownOption(Q);\n          };\n          var q = !1;\n          function X() {\n            q || (q = !0, O.$$postDigest(function() {\n              q = !1, D.ngModelCtrl.$render();\n            }));\n          }\n          var H = !1;\n          function F(Q) {\n            H || (H = !0, O.$$postDigest(function() {\n              O.$$destroyed || (H = !1, D.ngModelCtrl.$setViewValue(D.readValue()), Q && D.ngModelCtrl.$render());\n            }));\n          }\n          D.registerOption = function(Q, K, it, st, Ct) {\n            var jt, Tt;\n            it.$attr.ngValue ? it.$observe(\"value\", function(Vt) {\n              var oe, _t = K.prop(\"selected\");\n              ot(Tt) && (D.removeOption(jt), delete D.selectValueMap[Tt], oe = !0), Tt = io(Vt), jt = Vt, D.selectValueMap[Tt] = Vt, D.addOption(Vt, K), K.attr(\"value\", Tt), oe && _t && F();\n            }) : st ? it.$observe(\"value\", function(Vt) {\n              var oe;\n              D.readValue();\n              var _t = K.prop(\"selected\");\n              ot(jt) && (D.removeOption(jt), oe = !0), jt = Vt, D.addOption(Vt, K), oe && _t && F();\n            }) : Ct ? Q.$watch(Ct, function(Vt, oe) {\n              it.$set(\"value\", Vt);\n              var _t = K.prop(\"selected\");\n              oe !== Vt && D.removeOption(oe), D.addOption(Vt, K), oe && _t && F();\n            }) : D.addOption(it.value, K), it.$observe(\"disabled\", function(Vt) {\n              (Vt === \"true\" || Vt && K.prop(\"selected\")) && (D.multiple ? F(!0) : (D.ngModelCtrl.$setViewValue(null), D.ngModelCtrl.$render()));\n            }), K.on(\"$destroy\", function() {\n              var Vt = D.readValue(), oe = it.value;\n              D.removeOption(oe), X(), (D.multiple && Vt && Vt.indexOf(oe) !== -1 || Vt === oe) && F(!0);\n            });\n          };\n        }\n      ], cu = function() {\n        return {\n          restrict: \"E\",\n          require: [\"select\", \"?ngModel\"],\n          controller: uu,\n          priority: 1,\n          link: {\n            pre: function(m, O, D, N) {\n              var q = N[0], X = N[1];\n              if (!X) return void (q.registerOption = Z);\n              if (q.ngModelCtrl = X, O.on(\"change\", function() {\n                q.removeUnknownOption(), m.$apply(function() {\n                  X.$setViewValue(q.readValue());\n                });\n              }), D.multiple) {\n                q.multiple = !0, q.readValue = function() {\n                  var Q = [];\n                  return s(O.find(\"option\"), function(K) {\n                    if (K.selected && !K.disabled) {\n                      var it = K.value;\n                      Q.push(\n                        it in q.selectValueMap ? q.selectValueMap[it] : it\n                      );\n                    }\n                  }), Q;\n                }, q.writeValue = function(Q) {\n                  s(O.find(\"option\"), function(K) {\n                    var it = !!Q && (Rt(Q, K.value) || Rt(Q, q.selectValueMap[K.value]));\n                    it !== K.selected && Wa(x(K), it);\n                  });\n                };\n                var H, F = NaN;\n                m.$watch(function() {\n                  F !== X.$viewValue || pe(H, X.$viewValue) || (H = Si(X.$viewValue), X.$render()), F = X.$viewValue;\n                }), X.$isEmpty = function(Q) {\n                  return !Q || Q.length === 0;\n                };\n              }\n            },\n            post: function(m, O, D, N) {\n              var q = N[1];\n              if (q) {\n                var X = N[0];\n                q.$render = function() {\n                  X.writeValue(q.$viewValue);\n                };\n              }\n            }\n          }\n        };\n      }, du = [\n        \"$interpolate\",\n        function(m) {\n          return {\n            restrict: \"E\",\n            priority: 100,\n            compile: function(O, D) {\n              var N, q;\n              return ot(D.ngValue) || (ot(D.value) ? N = m(D.value, !0) : (q = m(O.text(), !0)) || D.$set(\"value\", O.text())), function(X, H, F) {\n                var Q = H.parent(), K = Q.data(\"$selectController\") || Q.parent().data(\"$selectController\");\n                K && K.registerOption(X, H, F, N, q);\n              };\n            }\n          };\n        }\n      ], El = [\n        \"$parse\",\n        function(m) {\n          return {\n            restrict: \"A\",\n            require: \"?ngModel\",\n            link: function(O, D, N, q) {\n              if (q) {\n                var X = N.hasOwnProperty(\"required\") || m(N.ngRequired)(O);\n                N.ngRequired || (N.required = !0), q.$validators.required = function(H, F) {\n                  return !X || !q.$isEmpty(F);\n                }, N.$observe(\"required\", function(H) {\n                  X !== H && (X = H, q.$validate());\n                });\n              }\n            }\n          };\n        }\n      ], fu = [\n        \"$parse\",\n        function(m) {\n          return {\n            restrict: \"A\",\n            require: \"?ngModel\",\n            compile: function(O, D) {\n              var N, q;\n              return D.ngPattern && (N = D.ngPattern, q = D.ngPattern.charAt(0) === \"/\" && c.test(D.ngPattern) ? function() {\n                return D.ngPattern;\n              } : m(D.ngPattern)), function(X, H, F, Q) {\n                if (Q) {\n                  var K = F.pattern;\n                  F.ngPattern ? K = q(X) : N = F.pattern;\n                  var it = Lo(K, N, H);\n                  F.$observe(\"pattern\", function(st) {\n                    var Ct = it;\n                    it = Lo(st, N, H), (Ct && Ct.toString()) !== (it && it.toString()) && Q.$validate();\n                  }), Q.$validators.pattern = function(st, Ct) {\n                    return Q.$isEmpty(Ct) || ct(it) || it.test(Ct);\n                  };\n                }\n              };\n            }\n          };\n        }\n      ], pu = [\n        \"$parse\",\n        function(m) {\n          return {\n            restrict: \"A\",\n            require: \"?ngModel\",\n            link: function(O, D, N, q) {\n              if (q) {\n                var X = N.maxlength || m(N.ngMaxlength)(O), H = Xs(X);\n                N.$observe(\"maxlength\", function(F) {\n                  X !== F && (H = Xs(F), X = F, q.$validate());\n                }), q.$validators.maxlength = function(F, Q) {\n                  return H < 0 || q.$isEmpty(Q) || Q.length <= H;\n                };\n              }\n            }\n          };\n        }\n      ], hu = [\n        \"$parse\",\n        function(m) {\n          return {\n            restrict: \"A\",\n            require: \"?ngModel\",\n            link: function(O, D, N, q) {\n              if (q) {\n                var X = N.minlength || m(N.ngMinlength)(O), H = Xs(X) || -1;\n                N.$observe(\"minlength\", function(F) {\n                  X !== F && (H = Xs(F) || -1, X = F, q.$validate());\n                }), q.$validators.minlength = function(F, Q) {\n                  return q.$isEmpty(Q) || Q.length >= H;\n                };\n              }\n            }\n          };\n        }\n      ];\n      function Lo(m, O, D) {\n        if (m) {\n          if (St(m) && (m = new RegExp(\"^\" + m + \"$\")), !m.test)\n            throw E(\"ngPattern\")(\n              \"noregexp\",\n              \"Expected {0} to be a RegExp but was {1}. Element: {2}\",\n              O,\n              m,\n              nn(D)\n            );\n          return m;\n        }\n      }\n      function Xs(m) {\n        var O = G(m);\n        return Y(O) ? -1 : O;\n      }\n      e.angular.bootstrap ? e.console && console.log(\"WARNING: Tried to load AngularJS more than once.\") : (function() {\n        var m;\n        if (!Ur) {\n          var O = Me();\n          (g = ct(O) ? e.jQuery : O ? e[O] : void 0) && g.fn.on ? (x = g, z(g.fn, {\n            scope: qn.scope,\n            isolateScope: qn.isolateScope,\n            controller: qn.controller,\n            injector: qn.injector,\n            inheritedData: qn.inheritedData\n          })) : x = sr, m = x.cleanData, x.cleanData = function(D) {\n            for (var N, q, X = 0; (q = D[X]) != null; X++)\n              (N = (x._data(q) || {}).events) && N.$destroy && x(q).triggerHandler(\"$destroy\");\n            m(D);\n          }, f.element = x, Ur = !0;\n        }\n      }(), function(m) {\n        z(m, {\n          errorHandlingConfig: A,\n          bootstrap: ar,\n          copy: le,\n          extend: z,\n          merge: V,\n          equals: pe,\n          element: x,\n          forEach: s,\n          injector: ke,\n          noop: Z,\n          bind: Ar,\n          toJson: zr,\n          fromJson: ln,\n          identity: at,\n          isUndefined: ct,\n          isDefined: ot,\n          isString: St,\n          isFunction: ne,\n          isObject: gt,\n          isNumber: zt,\n          isElement: yt,\n          isArray: re,\n          version: To,\n          isDate: Nt,\n          callbacks: { $$counter: 0 },\n          getTestability: gn,\n          reloadWithDebugInfo: Yr,\n          UNSAFE_restoreLegacyJqLiteXHTMLReplacement: Pn,\n          $$minErr: E,\n          $$csp: je,\n          $$encodeUriSegment: Yn,\n          $$encodeUriQuery: tn,\n          $$lowercase: n,\n          $$stringify: _r,\n          $$uppercase: t\n        }), (o = function(O) {\n          var D = E(\"$injector\"), N = E(\"ng\");\n          function q(H, F, Q) {\n            return H[F] || (H[F] = Q());\n          }\n          var X = q(O, \"angular\", Object);\n          return X.$$minErr = X.$$minErr || E, q(X, \"module\", function() {\n            var H = {};\n            return function(F, Q, K) {\n              var it = {};\n              return function(st, Ct) {\n                if (st === \"hasOwnProperty\")\n                  throw N(\n                    \"badname\",\n                    \"hasOwnProperty is not a valid {0} name\",\n                    Ct\n                  );\n              }(F, \"module\"), Q && H.hasOwnProperty(F) && (H[F] = null), q(H, F, function() {\n                if (!Q)\n                  throw D(\n                    \"nomod\",\n                    \"Module '{0}' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.\",\n                    F\n                  );\n                var st = [], Ct = [], jt = [], Tt = oe(\"$injector\", \"invoke\", \"push\", Ct), Vt = {\n                  _invokeQueue: st,\n                  _configBlocks: Ct,\n                  _runBlocks: jt,\n                  info: function(Bt) {\n                    if (ot(Bt)) {\n                      if (!gt(Bt))\n                        throw N(\n                          \"aobj\",\n                          \"Argument '{0}' must be an object\",\n                          \"value\"\n                        );\n                      return it = Bt, this;\n                    }\n                    return it;\n                  },\n                  requires: Q,\n                  name: F,\n                  provider: _t(\"$provide\", \"provider\"),\n                  factory: _t(\"$provide\", \"factory\"),\n                  service: _t(\"$provide\", \"service\"),\n                  value: oe(\"$provide\", \"value\"),\n                  constant: oe(\"$provide\", \"constant\", \"unshift\"),\n                  decorator: _t(\"$provide\", \"decorator\", Ct),\n                  animation: _t(\"$animateProvider\", \"register\"),\n                  filter: _t(\"$filterProvider\", \"register\"),\n                  controller: _t(\"$controllerProvider\", \"register\"),\n                  directive: _t(\"$compileProvider\", \"directive\"),\n                  component: _t(\"$compileProvider\", \"component\"),\n                  config: Tt,\n                  run: function(Bt) {\n                    return jt.push(Bt), this;\n                  }\n                };\n                return K && Tt(K), Vt;\n                function oe(Bt, Qt, At, wt) {\n                  return wt || (wt = st), function() {\n                    return wt[At || \"push\"]([Bt, Qt, arguments]), Vt;\n                  };\n                }\n                function _t(Bt, Qt, At) {\n                  return At || (At = st), function(wt, Ot) {\n                    return Ot && ne(Ot) && (Ot.$$moduleName = F), At.push([Bt, Qt, arguments]), Vt;\n                  };\n                }\n              });\n            };\n          });\n        }(e))(\n          \"ng\",\n          [\"ngLocale\"],\n          [\n            \"$provide\",\n            function(O) {\n              O.provider({ $$sanitizeUri: Lr }), O.provider(\"$compile\", tr).directive({\n                a: Vl,\n                input: As,\n                textarea: As,\n                form: dl,\n                script: Lu,\n                select: cu,\n                option: du,\n                ngBind: vl,\n                ngBindHtml: Ql,\n                ngBindTemplate: Ru,\n                ngClass: Jl,\n                ngClassEven: Kl,\n                ngClassOdd: Iu,\n                ngCloak: Aa,\n                ngController: bl,\n                ngForm: fl,\n                ngHide: ou,\n                ngIf: is,\n                ngInclude: Sr,\n                ngInit: xl,\n                ngNonBindable: tu,\n                ngPluralize: Mu,\n                ngRef: iu,\n                ngRepeat: $s,\n                ngShow: Al,\n                ngStyle: au,\n                ngSwitch: Ys,\n                ngSwitchWhen: su,\n                ngSwitchDefault: sa,\n                ngOptions: nu,\n                ngTransclude: lu,\n                ngModel: xo,\n                ngList: Va,\n                ngChange: ka,\n                pattern: fu,\n                ngPattern: fu,\n                required: El,\n                ngRequired: El,\n                minlength: hu,\n                ngMinlength: hu,\n                maxlength: pu,\n                ngMaxlength: pu,\n                ngValue: Zl,\n                ngModelOptions: Nu\n              }).directive({ ngInclude: Hs, input: Xl }).directive(Ba).directive(Vs), O.provider({\n                $anchorScroll: $,\n                $animate: mt,\n                $animateCss: Zt,\n                $$animateJs: et,\n                $$animateQueue: dt,\n                $$AnimateRunner: Ut,\n                $$animateAsyncRun: Mt,\n                $browser: Ae,\n                $cacheFactory: de,\n                $controller: ee,\n                $document: Ht,\n                $$isDocumentHidden: he,\n                $exceptionHandler: Ee,\n                $filter: bs,\n                $$forceReflow: nr,\n                $interpolate: Ia,\n                $interval: cs,\n                $$intervalFactory: Na,\n                $http: ei,\n                $httpParamSerializer: yr,\n                $httpParamSerializerJQLike: Xr,\n                $httpBackend: el,\n                $xhrFactory: Bi,\n                $jsonpCallbacks: va,\n                $location: ho,\n                $log: qr,\n                $parse: hr,\n                $rootScope: qi,\n                $q: jr,\n                $$q: Er,\n                $sce: hs,\n                $sceDelegate: oa,\n                $sniffer: Ki,\n                $$taskTrackerFactory: nl,\n                $templateCache: me,\n                $templateRequest: il,\n                $$testability: gs,\n                $timeout: ms,\n                $window: Ml,\n                $$rAF: oi,\n                $$jqLite: Vo,\n                $$Map: Mn,\n                $$cookieReader: Ll\n              });\n            }\n          ]\n        ).info({ angularVersion: \"1.8.2\" });\n      }(f), f.module(\n        \"ngLocale\",\n        [],\n        [\n          \"$provide\",\n          function(m) {\n            var O = \"one\", D = \"other\";\n            m.value(\"$locale\", {\n              DATETIME_FORMATS: {\n                AMPMS: [\"AM\", \"PM\"],\n                DAY: [\n                  \"Sunday\",\n                  \"Monday\",\n                  \"Tuesday\",\n                  \"Wednesday\",\n                  \"Thursday\",\n                  \"Friday\",\n                  \"Saturday\"\n                ],\n                ERANAMES: [\"Before Christ\", \"Anno Domini\"],\n                ERAS: [\"BC\", \"AD\"],\n                FIRSTDAYOFWEEK: 6,\n                MONTH: [\n                  \"January\",\n                  \"February\",\n                  \"March\",\n                  \"April\",\n                  \"May\",\n                  \"June\",\n                  \"July\",\n                  \"August\",\n                  \"September\",\n                  \"October\",\n                  \"November\",\n                  \"December\"\n                ],\n                SHORTDAY: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n                SHORTMONTH: [\n                  \"Jan\",\n                  \"Feb\",\n                  \"Mar\",\n                  \"Apr\",\n                  \"May\",\n                  \"Jun\",\n                  \"Jul\",\n                  \"Aug\",\n                  \"Sep\",\n                  \"Oct\",\n                  \"Nov\",\n                  \"Dec\"\n                ],\n                STANDALONEMONTH: [\n                  \"January\",\n                  \"February\",\n                  \"March\",\n                  \"April\",\n                  \"May\",\n                  \"June\",\n                  \"July\",\n                  \"August\",\n                  \"September\",\n                  \"October\",\n                  \"November\",\n                  \"December\"\n                ],\n                WEEKENDRANGE: [5, 6],\n                fullDate: \"EEEE, MMMM d, y\",\n                longDate: \"MMMM d, y\",\n                medium: \"MMM d, y h:mm:ss a\",\n                mediumDate: \"MMM d, y\",\n                mediumTime: \"h:mm:ss a\",\n                short: \"M/d/yy h:mm a\",\n                shortDate: \"M/d/yy\",\n                shortTime: \"h:mm a\"\n              },\n              NUMBER_FORMATS: {\n                CURRENCY_SYM: \"$\",\n                DECIMAL_SEP: \".\",\n                GROUP_SEP: \",\",\n                PATTERNS: [\n                  {\n                    gSize: 3,\n                    lgSize: 3,\n                    maxFrac: 3,\n                    minFrac: 0,\n                    minInt: 1,\n                    negPre: \"-\",\n                    negSuf: \"\",\n                    posPre: \"\",\n                    posSuf: \"\"\n                  },\n                  {\n                    gSize: 3,\n                    lgSize: 3,\n                    maxFrac: 2,\n                    minFrac: 2,\n                    minInt: 1,\n                    negPre: \"-¤\",\n                    negSuf: \"\",\n                    posPre: \"¤\",\n                    posSuf: \"\"\n                  }\n                ]\n              },\n              id: \"en-us\",\n              localeID: \"en_US\",\n              pluralCat: function(N, q) {\n                var X = 0 | N, H = function(F, Q) {\n                  var K = Q;\n                  K === void 0 && (K = Math.min(\n                    function(st) {\n                      var Ct = (st += \"\").indexOf(\".\");\n                      return Ct == -1 ? 0 : st.length - Ct - 1;\n                    }(F),\n                    3\n                  ));\n                  var it = Math.pow(10, K);\n                  return { v: K, f: (F * it | 0) % it };\n                }(N, q);\n                return X == 1 && H.v == 0 ? O : D;\n              }\n            });\n          }\n        ]\n      ), x(function() {\n        Kn(e.document, ar);\n      }));\n    })(window), !window.angular.$$csp().noInlineStyle && window.angular.element(document.head).prepend(\n      window.angular.element(\"<style>\").text(\n        '@charset \"UTF-8\";[ng\\\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\\\:form{display:block;}.ng-animate-shim{visibility:hidden;}.ng-anchor{position:absolute;}'\n      )\n    );\n  },\n  function(L, T, e) {\n    e(210);\n    const u = e(33), A = e(9);\n    window.jQuery = u, e(217), e(218), e(219), e(225), e(227), A.module(\"dbt\", [\"ngRoute\", \"ui.router\", \"hc.marked\"]).config([\n      \"markedProvider\",\n      \"$locationProvider\",\n      function(w, E) {\n        w.setOptions({ gfm: !0, sanitize: !0 }), w.setRenderer({\n          table: function(y, x) {\n            return \"<table class='table'><thead>\" + y + \"</thead><tbody>\" + x + \"</tbody></table>\";\n          }\n        }), E.html5Mode({ enabled: !1 }), u(document).tooltip({\n          selector: '[data-toggle=\"tooltip\"]',\n          placement: function(y, x) {\n            return u(x).attr(\"data-placement\") ? u(x).attr(\"data-placement\") : \"auto\";\n          },\n          container: \"body\"\n        }), u(document).ready(function() {\n          u(\"[data-toggle=popover]\").popover({\n            container: \"body\",\n            html: !0\n          });\n        });\n      }\n    ]);\n  },\n  function(L, T, e) {\n    var u = e(211);\n    typeof u == \"string\" && (u = [[L.i, u, \"\"]]);\n    var A = { hmr: !0, transform: void 0, insertInto: void 0 };\n    e(40)(u, A), u.locals && (L.exports = u.locals);\n  },\n  function(L, T, e) {\n    var u = e(212);\n    (L.exports = e(39)(!1)).push([\n      L.i,\n      `@media (max-width: 960px){[data-large]{display:none !important}}@media (min-width: 961px){[data-small]{display:none !important}}@media screen{[data-print]{display:none !important}}@media print{[data-screen]{display:none !important}}html.touchevents [data-click]{display:none !important}html.no-touchevents [data-touch]{display:none !important}/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=\"button\"],input[type=\"reset\"],input[type=\"submit\"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=\"checkbox\"],input[type=\"radio\"]{box-sizing:border-box;padding:0}input[type=\"number\"]::-webkit-inner-spin-button,input[type=\"number\"]::-webkit-outer-spin-button{height:auto}input[type=\"search\"]{-webkit-appearance:textfield;box-sizing:content-box}input[type=\"search\"]::-webkit-search-cancel-button,input[type=\"search\"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:transparent}body{font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Oxygen,Ubuntu,Cantarell,\"Fira Sans\",\"Droid Sans\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:1rem;line-height:1.6;color:#5e666c;background-color:#f9fafb}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#0bb;text-decoration:none}a:hover,a:focus{color:#009595;text-decoration:none}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:4px}.img-thumbnail{padding:0;line-height:1.6;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:1.6rem;margin-bottom:1.6rem;border:0;border-top:1px solid rgba(0,30,60,0.075)}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=\"button\"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Oxygen,Ubuntu,Cantarell,\"Fira Sans\",\"Droid Sans\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:normal;line-height:false;color:#313539}h1 small,h1 .small,h2 small,h2 .small,h3 small,h3 .small,h4 small,h4 .small,h5 small,h5 .small,h6 small,h6 .small,.h1 small,.h1 .small,.h2 small,.h2 .small,.h3 small,.h3 .small,.h4 small,.h4 .small,.h5 small,.h5 .small,.h6 small,.h6 .small{font-weight:normal;line-height:1;color:#8b969e}h1,.h1,h2,.h2,h3,.h3{margin-top:1.6rem;margin-bottom:.8rem}h1 small,h1 .small,.h1 small,.h1 .small,h2 small,h2 .small,.h2 small,.h2 .small,h3 small,h3 .small,.h3 small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:.8rem;margin-bottom:.8rem}h4 small,h4 .small,.h4 small,.h4 .small,h5 small,h5 .small,.h5 small,.h5 .small,h6 small,h6 .small,.h6 small,.h6 .small{font-size:75%}h1,.h1{font-size:1.7142857143rem}h2,.h2{font-size:1.7142857143rem}h3,.h3{font-size:1.2857142857rem}h4,.h4{font-size:1.1428571429rem}h5,.h5{font-size:1rem}h6,.h6{font-size:1rem}p{margin:0 0 .8rem}.lead{margin-bottom:1.6rem;font-size:1rem;font-weight:300;line-height:1.4}@media (min-width: 540px){.lead{font-size:1.5rem}}small,.small{font-size:92%}mark,.mark{background-color:#fff6ec;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase,.initialism{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#8b969e}.text-primary{color:#0bb}a.text-primary:hover,a.text-primary:focus{color:#088}.text-success{color:#48a71c}a.text-success:hover,a.text-success:focus{color:#357b15}.text-info{color:#0aa}a.text-info:hover,a.text-info:focus{color:#077}.text-warning{color:#ff6316}a.text-warning:hover,a.text-warning:focus{color:#e24b00}.text-danger{color:#ff694b}a.text-danger:hover,a.text-danger:focus{color:#ff3f18}.bg-primary{color:#fff}.bg-primary{background-color:#0bb}a.bg-primary:hover,a.bg-primary:focus{background-color:#088}.bg-success{background-color:#f3faec}a.bg-success:hover,a.bg-success:focus{background-color:#daefc4}.bg-info{background-color:#edfafa}a.bg-info:hover,a.bg-info:focus{background-color:#c5efef}.bg-warning{background-color:#fff6ec}a.bg-warning:hover,a.bg-warning:focus{background-color:#ffdeb9}.bg-danger{background-color:#fff5f4}a.bg-danger:hover,a.bg-danger:focus{background-color:#ffc7c1}.page-header{padding-bottom:-.2rem;margin:3.2rem 0 1.6rem;border-bottom:1px solid #f7f7f8}ul,ol{margin-top:0;margin-bottom:.8rem}ul ul,ul ol,ol ul,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:1.6rem}dt,dd{line-height:1.6}dt{font-weight:bold}dd{margin-left:0}.dl-horizontal dd:before,.dl-horizontal dd:after{content:\" \";display:table}.dl-horizontal dd:after{clear:both}@media (min-width: 260px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted rgba(0,30,60,0.075)}.initialism{font-size:90%}blockquote{padding:.8rem 1.6rem;margin:0 0 1.6rem;font-size:1rem;border-left:5px solid transparent}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.6;color:#8b969e}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\\\\2014   \\\\A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid transparent;border-left:0;text-align:right}.blockquote-reverse footer:before,.blockquote-reverse small:before,.blockquote-reverse .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,.blockquote-reverse small:after,.blockquote-reverse .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after,blockquote.pull-right .small:after{content:'\\\\A0   \\\\2014'}address{margin-bottom:1.6rem;font-style:normal;line-height:1.6}code,kbd,pre,samp{font-family:\"Monaco\",monospace}code{padding:2px 4px;font-size:90%;color:#313539;background-color:transparent;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#313539;background-color:transparent;border-radius:4px;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;box-shadow:none}pre{display:block;padding:.3rem;margin:0 0 .8rem;font-size:0rem;line-height:1.6;word-break:break-all;word-wrap:break-word;color:#fff;background-color:#005e7a;border:1px solid transparent;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:30px;padding-right:30px}.container:before,.container:after{content:\" \";display:table}.container:after{clear:both}@media (min-width: 540px){.container{width:780px}}@media (min-width: 768px){.container{width:1000px}}@media (min-width: 960px){.container{width:1200px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:30px;padding-right:30px}.container-fluid:before,.container-fluid:after{content:\" \";display:table}.container-fluid:after{clear:both}.row{margin-left:-30px;margin-right:-30px}.row:before,.row:after{content:\" \";display:table}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:30px;padding-right:30px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-1{width:8.3333333333%}.col-xs-2{width:16.6666666667%}.col-xs-3{width:25%}.col-xs-4{width:33.3333333333%}.col-xs-5{width:41.6666666667%}.col-xs-6{width:50%}.col-xs-7{width:58.3333333333%}.col-xs-8{width:66.6666666667%}.col-xs-9{width:75%}.col-xs-10{width:83.3333333333%}.col-xs-11{width:91.6666666667%}.col-xs-12{width:100%}.col-xs-pull-0{right:auto}.col-xs-pull-1{right:8.3333333333%}.col-xs-pull-2{right:16.6666666667%}.col-xs-pull-3{right:25%}.col-xs-pull-4{right:33.3333333333%}.col-xs-pull-5{right:41.6666666667%}.col-xs-pull-6{right:50%}.col-xs-pull-7{right:58.3333333333%}.col-xs-pull-8{right:66.6666666667%}.col-xs-pull-9{right:75%}.col-xs-pull-10{right:83.3333333333%}.col-xs-pull-11{right:91.6666666667%}.col-xs-pull-12{right:100%}.col-xs-push-0{left:auto}.col-xs-push-1{left:8.3333333333%}.col-xs-push-2{left:16.6666666667%}.col-xs-push-3{left:25%}.col-xs-push-4{left:33.3333333333%}.col-xs-push-5{left:41.6666666667%}.col-xs-push-6{left:50%}.col-xs-push-7{left:58.3333333333%}.col-xs-push-8{left:66.6666666667%}.col-xs-push-9{left:75%}.col-xs-push-10{left:83.3333333333%}.col-xs-push-11{left:91.6666666667%}.col-xs-push-12{left:100%}.col-xs-offset-0{margin-left:0%}.col-xs-offset-1{margin-left:8.3333333333%}.col-xs-offset-2{margin-left:16.6666666667%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-4{margin-left:33.3333333333%}.col-xs-offset-5{margin-left:41.6666666667%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-7{margin-left:58.3333333333%}.col-xs-offset-8{margin-left:66.6666666667%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-10{margin-left:83.3333333333%}.col-xs-offset-11{margin-left:91.6666666667%}.col-xs-offset-12{margin-left:100%}@media (min-width: 540px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-1{width:8.3333333333%}.col-sm-2{width:16.6666666667%}.col-sm-3{width:25%}.col-sm-4{width:33.3333333333%}.col-sm-5{width:41.6666666667%}.col-sm-6{width:50%}.col-sm-7{width:58.3333333333%}.col-sm-8{width:66.6666666667%}.col-sm-9{width:75%}.col-sm-10{width:83.3333333333%}.col-sm-11{width:91.6666666667%}.col-sm-12{width:100%}.col-sm-pull-0{right:auto}.col-sm-pull-1{right:8.3333333333%}.col-sm-pull-2{right:16.6666666667%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.3333333333%}.col-sm-pull-5{right:41.6666666667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.3333333333%}.col-sm-pull-8{right:66.6666666667%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.3333333333%}.col-sm-pull-11{right:91.6666666667%}.col-sm-pull-12{right:100%}.col-sm-push-0{left:auto}.col-sm-push-1{left:8.3333333333%}.col-sm-push-2{left:16.6666666667%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.3333333333%}.col-sm-push-5{left:41.6666666667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.3333333333%}.col-sm-push-8{left:66.6666666667%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.3333333333%}.col-sm-push-11{left:91.6666666667%}.col-sm-push-12{left:100%}.col-sm-offset-0{margin-left:0%}.col-sm-offset-1{margin-left:8.3333333333%}.col-sm-offset-2{margin-left:16.6666666667%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.3333333333%}.col-sm-offset-5{margin-left:41.6666666667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.3333333333%}.col-sm-offset-8{margin-left:66.6666666667%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.3333333333%}.col-sm-offset-11{margin-left:91.6666666667%}.col-sm-offset-12{margin-left:100%}}@media (min-width: 768px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-1{width:8.3333333333%}.col-md-2{width:16.6666666667%}.col-md-3{width:25%}.col-md-4{width:33.3333333333%}.col-md-5{width:41.6666666667%}.col-md-6{width:50%}.col-md-7{width:58.3333333333%}.col-md-8{width:66.6666666667%}.col-md-9{width:75%}.col-md-10{width:83.3333333333%}.col-md-11{width:91.6666666667%}.col-md-12{width:100%}.col-md-pull-0{right:auto}.col-md-pull-1{right:8.3333333333%}.col-md-pull-2{right:16.6666666667%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.3333333333%}.col-md-pull-5{right:41.6666666667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.3333333333%}.col-md-pull-8{right:66.6666666667%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.3333333333%}.col-md-pull-11{right:91.6666666667%}.col-md-pull-12{right:100%}.col-md-push-0{left:auto}.col-md-push-1{left:8.3333333333%}.col-md-push-2{left:16.6666666667%}.col-md-push-3{left:25%}.col-md-push-4{left:33.3333333333%}.col-md-push-5{left:41.6666666667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.3333333333%}.col-md-push-8{left:66.6666666667%}.col-md-push-9{left:75%}.col-md-push-10{left:83.3333333333%}.col-md-push-11{left:91.6666666667%}.col-md-push-12{left:100%}.col-md-offset-0{margin-left:0%}.col-md-offset-1{margin-left:8.3333333333%}.col-md-offset-2{margin-left:16.6666666667%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.3333333333%}.col-md-offset-5{margin-left:41.6666666667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.3333333333%}.col-md-offset-8{margin-left:66.6666666667%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.3333333333%}.col-md-offset-11{margin-left:91.6666666667%}.col-md-offset-12{margin-left:100%}}@media (min-width: 960px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-1{width:8.3333333333%}.col-lg-2{width:16.6666666667%}.col-lg-3{width:25%}.col-lg-4{width:33.3333333333%}.col-lg-5{width:41.6666666667%}.col-lg-6{width:50%}.col-lg-7{width:58.3333333333%}.col-lg-8{width:66.6666666667%}.col-lg-9{width:75%}.col-lg-10{width:83.3333333333%}.col-lg-11{width:91.6666666667%}.col-lg-12{width:100%}.col-lg-pull-0{right:auto}.col-lg-pull-1{right:8.3333333333%}.col-lg-pull-2{right:16.6666666667%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.3333333333%}.col-lg-pull-5{right:41.6666666667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.3333333333%}.col-lg-pull-8{right:66.6666666667%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.3333333333%}.col-lg-pull-11{right:91.6666666667%}.col-lg-pull-12{right:100%}.col-lg-push-0{left:auto}.col-lg-push-1{left:8.3333333333%}.col-lg-push-2{left:16.6666666667%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.3333333333%}.col-lg-push-5{left:41.6666666667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.3333333333%}.col-lg-push-8{left:66.6666666667%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.3333333333%}.col-lg-push-11{left:91.6666666667%}.col-lg-push-12{left:100%}.col-lg-offset-0{margin-left:0%}.col-lg-offset-1{margin-left:8.3333333333%}.col-lg-offset-2{margin-left:16.6666666667%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.3333333333%}.col-lg-offset-5{margin-left:41.6666666667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.3333333333%}.col-lg-offset-8{margin-left:66.6666666667%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.3333333333%}.col-lg-offset-11{margin-left:91.6666666667%}.col-lg-offset-12{margin-left:100%}}table{background-color:transparent}caption{padding-top:.6785714286rem 1.25rem;padding-bottom:.6785714286rem 1.25rem;color:#8b969e;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:1.6rem}.table>thead>tr>th,.table>thead>tr>td,.table>tbody>tr>th,.table>tbody>tr>td,.table>tfoot>tr>th,.table>tfoot>tr>td{padding:.6785714286rem 1.25rem;line-height:1.6;vertical-align:top;border-top:1px solid rgba(0,30,60,0.075)}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid rgba(0,30,60,0.075)}.table>caption+thead>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>th,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid rgba(0,30,60,0.075)}.table .table{background-color:#f9fafb}.table-condensed>thead>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>tfoot>tr>td{padding:.4464285714rem .875rem}.table-bordered{border:1px solid rgba(0,30,60,0.075)}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>tfoot>tr>td{border:1px solid rgba(0,30,60,0.075)}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9fafb}.table-hover>tbody>tr:hover{background-color:#f9fafb}table col[class*=\"col-\"]{position:static;float:none;display:table-column}table td[class*=\"col-\"],table th[class*=\"col-\"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>thead>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th{background-color:#f9fafb}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#eaedf1}.table>thead>tr>td.success,.table>thead>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th{background-color:#f3faec}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#e6f5d8}.table>thead>tr>td.info,.table>thead>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th{background-color:#edfafa}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#d9f4f4}.table>thead>tr>td.warning,.table>thead>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th{background-color:#fff6ec}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#ffead3}.table>thead>tr>td.danger,.table>thead>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th{background-color:#fff5f4}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ffdedb}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width: 539px){.table-responsive{width:100%;margin-bottom:1.2rem;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid rgba(0,30,60,0.075)}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:1.6rem;font-size:1.5rem;line-height:inherit;color:#8b969e;border:0;border-bottom:1px solid rgba(0,30,60,0.075)}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type=\"search\"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=\"radio\"],input[type=\"checkbox\"]{margin:4px 0 0;margin-top:1px \\\\9;line-height:normal}input[type=\"file\"]{display:block}input[type=\"range\"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=\"file\"]:focus,input[type=\"radio\"]:focus,input[type=\"checkbox\"]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:1.6785714286rem;font-size:1rem;line-height:1.6;color:#484e53}.form-control{display:block;width:100%;height:2.8571428571rem;padding:.6785714286rem 1.25rem;font-size:1rem;line-height:1.6;color:#484e53;background-color:#f0f2f4;background-image:none;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;-o-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s}.form-control:focus{border-color:transparent;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(0,0,0,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(0,0,0,0.6)}.form-control::-moz-placeholder{color:#a8b1b7;opacity:1}.form-control:-ms-input-placeholder{color:#a8b1b7}.form-control::-webkit-input-placeholder{color:#a8b1b7}.form-control::-ms-expand{border:0;background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#e4e6eb;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=\"search\"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio: 0){input[type=\"date\"].form-control,input[type=\"time\"].form-control,input[type=\"datetime-local\"].form-control,input[type=\"month\"].form-control{line-height:2.8571428571rem}input[type=\"date\"].input-sm,.input-group-sm>input[type=\"date\"].form-control,.input-group-sm>input[type=\"date\"].input-group-addon,.input-group-sm>.input-group-btn>input[type=\"date\"].btn,.input-group-sm input[type=\"date\"],input[type=\"time\"].input-sm,.input-group-sm>input[type=\"time\"].form-control,.input-group-sm>input[type=\"time\"].input-group-addon,.input-group-sm>.input-group-btn>input[type=\"time\"].btn,.input-group-sm input[type=\"time\"],input[type=\"datetime-local\"].input-sm,.input-group-sm>input[type=\"datetime-local\"].form-control,.input-group-sm>input[type=\"datetime-local\"].input-group-addon,.input-group-sm>.input-group-btn>input[type=\"datetime-local\"].btn,.input-group-sm input[type=\"datetime-local\"],input[type=\"month\"].input-sm,.input-group-sm>input[type=\"month\"].form-control,.input-group-sm>input[type=\"month\"].input-group-addon,.input-group-sm>.input-group-btn>input[type=\"month\"].btn,.input-group-sm input[type=\"month\"]{line-height:2.2857142857rem}input[type=\"date\"].input-lg,.input-group-lg>input[type=\"date\"].form-control,.input-group-lg>input[type=\"date\"].input-group-addon,.input-group-lg>.input-group-btn>input[type=\"date\"].btn,.input-group-lg input[type=\"date\"],input[type=\"time\"].input-lg,.input-group-lg>input[type=\"time\"].form-control,.input-group-lg>input[type=\"time\"].input-group-addon,.input-group-lg>.input-group-btn>input[type=\"time\"].btn,.input-group-lg input[type=\"time\"],input[type=\"datetime-local\"].input-lg,.input-group-lg>input[type=\"datetime-local\"].form-control,.input-group-lg>input[type=\"datetime-local\"].input-group-addon,.input-group-lg>.input-group-btn>input[type=\"datetime-local\"].btn,.input-group-lg input[type=\"datetime-local\"],input[type=\"month\"].input-lg,.input-group-lg>input[type=\"month\"].form-control,.input-group-lg>input[type=\"month\"].input-group-addon,.input-group-lg>.input-group-btn>input[type=\"month\"].btn,.input-group-lg input[type=\"month\"]{line-height:4.2857142857rem}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:1.6rem;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type=\"radio\"],.radio-inline input[type=\"radio\"],.checkbox input[type=\"checkbox\"],.checkbox-inline input[type=\"checkbox\"]{position:absolute;margin-left:-20px;margin-top:4px \\\\9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=\"radio\"][disabled],input[type=\"radio\"].disabled,fieldset[disabled] input[type=\"radio\"],input[type=\"checkbox\"][disabled],input[type=\"checkbox\"].disabled,fieldset[disabled] input[type=\"checkbox\"]{cursor:not-allowed}.radio-inline.disabled,fieldset[disabled] .radio-inline,.checkbox-inline.disabled,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,fieldset[disabled] .radio label,.checkbox.disabled label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static,.form-grid .form-row .form-label label{padding-top:1.6785714286rem;padding-bottom:1.6785714286rem;margin-bottom:0;min-height:2.6rem}.form-control-static.input-lg,.input-group-lg>.form-control-static.form-control,.form-grid .form-row .form-label .input-group-lg>label.form-control,.input-group-lg>.form-control-static.input-group-addon,.form-grid .form-row .form-label .input-group-lg>label.input-group-addon,.input-group-lg>.input-group-btn>.form-control-static.btn,.form-grid .form-row .form-label .input-group-lg>.input-group-btn>label.btn,.form-grid .form-row .form-label label.input-lg,.form-control-static.input-sm,.input-group-sm>.form-control-static.form-control,.form-grid .form-row .form-label .input-group-sm>label.form-control,.input-group-sm>.form-control-static.input-group-addon,.form-grid .form-row .form-label .input-group-sm>label.input-group-addon,.input-group-sm>.input-group-btn>.form-control-static.btn,.form-grid .form-row .form-label .input-group-sm>.input-group-btn>label.btn,.form-grid .form-row .form-label label.input-sm{padding-left:0;padding-right:0}.input-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:2.2857142857rem;padding:.4464285714rem .875rem;font-size:.9285714286rem;line-height:1.6;border-radius:4px}select.input-sm,.input-group-sm>select.form-control,.input-group-sm>select.input-group-addon,.input-group-sm>.input-group-btn>select.btn{height:2.2857142857rem;line-height:2.2857142857rem}textarea.input-sm,.input-group-sm>textarea.form-control,.input-group-sm>textarea.input-group-addon,.input-group-sm>.input-group-btn>textarea.btn,select[multiple].input-sm,.input-group-sm>select[multiple].form-control,.input-group-sm>select[multiple].input-group-addon,.input-group-sm>.input-group-btn>select[multiple].btn{height:auto}.form-group-sm .form-control{height:2.2857142857rem;padding:.4464285714rem .875rem;font-size:.9285714286rem;line-height:1.6;border-radius:4px}.form-group-sm select.form-control{height:2.2857142857rem;line-height:2.2857142857rem}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static,.form-group-sm .form-grid .form-row .form-label label,.form-grid .form-row .form-label .form-group-sm label{height:2.2857142857rem;min-height:2.5285714286rem;padding:1.4464285714rem .875rem;font-size:.9285714286rem;line-height:1.6}.input-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:4.2857142857rem;padding:1.2857142857rem 1.875rem;font-size:1.1428571429rem;line-height:1.6;border-radius:4px}select.input-lg,.input-group-lg>select.form-control,.input-group-lg>select.input-group-addon,.input-group-lg>.input-group-btn>select.btn{height:4.2857142857rem;line-height:4.2857142857rem}textarea.input-lg,.input-group-lg>textarea.form-control,.input-group-lg>textarea.input-group-addon,.input-group-lg>.input-group-btn>textarea.btn,select[multiple].input-lg,.input-group-lg>select[multiple].form-control,.input-group-lg>select[multiple].input-group-addon,.input-group-lg>.input-group-btn>select[multiple].btn{height:auto}.form-group-lg .form-control{height:4.2857142857rem;padding:1.2857142857rem 1.875rem;font-size:1.1428571429rem;line-height:1.6;border-radius:4px}.form-group-lg select.form-control{height:4.2857142857rem;line-height:4.2857142857rem}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static,.form-group-lg .form-grid .form-row .form-label label,.form-grid .form-row .form-label .form-group-lg label{height:4.2857142857rem;min-height:2.7428571429rem;padding:2.2857142857rem 1.875rem;font-size:1.1428571429rem;line-height:1.6}.has-feedback{position:relative}.has-feedback .form-control{padding-right:3.5714285714rem}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:2.8571428571rem;height:2.8571428571rem;line-height:2.8571428571rem;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg>.form-control+.form-control-feedback,.input-group-lg>.input-group-addon+.form-control-feedback,.input-group-lg>.input-group-btn>.btn+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:4.2857142857rem;height:4.2857142857rem;line-height:4.2857142857rem}.input-sm+.form-control-feedback,.input-group-sm>.form-control+.form-control-feedback,.input-group-sm>.input-group-addon+.form-control-feedback,.input-group-sm>.input-group-btn>.btn+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:2.2857142857rem;height:2.2857142857rem;line-height:2.2857142857rem}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#48a71c}.has-success .form-control{border-color:#48a71c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#357b15;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #79e049;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #79e049}.has-success .input-group-addon{color:#48a71c;border-color:#48a71c;background-color:#f3faec}.has-success .form-control-feedback{color:#48a71c}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#ff6316}.has-warning .form-control{border-color:#ff6316;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#e24b00;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffa77c;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffa77c}.has-warning .input-group-addon{color:#ff6316;border-color:#ff6316;background-color:#fff6ec}.has-warning .form-control-feedback{color:#ff6316}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#ff694b}.has-error .form-control{border-color:#ff694b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#ff3f18;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffbeb1;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffbeb1}.has-error .input-group-addon{color:#ff694b;border-color:#ff694b;background-color:#fff5f4}.has-error .form-control-feedback{color:#ff694b}.has-feedback label ~ .form-control-feedback{top:6.6rem}.has-feedback label.sr-only ~ .form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#9ea6ab}@media (min-width: 540px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static,.form-inline .form-grid .form-row .form-label label,.form-grid .form-row .form-label .form-inline label{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=\"radio\"],.form-inline .checkbox input[type=\"checkbox\"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:1.6785714286rem}.form-horizontal .radio,.form-horizontal .checkbox{min-height:3.2785714286rem}.form-horizontal .form-group{margin-left:-30px;margin-right:-30px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{content:\" \";display:table}.form-horizontal .form-group:after{clear:both}@media (min-width: 540px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:1.6785714286rem}}.form-horizontal .has-feedback .form-control-feedback{right:30px}@media (min-width: 540px){.form-horizontal .form-group-lg .control-label{padding-top:2.2857142857rem;font-size:1.1428571429rem}}@media (min-width: 540px){.form-horizontal .form-group-sm .control-label{padding-top:1.4464285714rem;font-size:.9285714286rem}}.btn{display:inline-block;margin-bottom:0;font-weight:bold;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:.6785714286rem 1.25rem;font-size:1rem;line-height:1.6;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn.focus,.btn:active:focus,.btn:active.focus,.btn.active:focus,.btn.active.focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#484e53;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#484e53;background-color:#f0f2f4;border-color:transparent}.btn-default:focus,.btn-default.focus{color:#484e53;background-color:#e9ebef}.btn-default:hover{color:#484e53;background-color:#e9ebef}.btn-default:active,.btn-default.active,.open>.btn-default.dropdown-toggle{color:#484e53;background-color:#e9ebef}.btn-default:active:hover,.btn-default:active:focus,.btn-default:active.focus,.btn-default.active:hover,.btn-default.active:focus,.btn-default.active.focus,.open>.btn-default.dropdown-toggle:hover,.open>.btn-default.dropdown-toggle:focus,.open>.btn-default.dropdown-toggle.focus{color:#484e53;background-color:#e9ebef}.btn-default:active,.btn-default.active,.open>.btn-default.dropdown-toggle{background-image:none}.btn-default.disabled:hover,.btn-default.disabled:focus,.btn-default.disabled.focus,.btn-default[disabled]:hover,.btn-default[disabled]:focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default:hover,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default.focus{background-color:#f0f2f4;border-color:transparent}.btn-default .badge{color:#f0f2f4;background-color:#484e53}.btn-primary{color:#fff;background-color:#0bb;border-color:transparent}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#009595}.btn-primary:hover{color:#fff;background-color:#009595}.btn-primary:active,.btn-primary.active,.open>.btn-primary.dropdown-toggle{color:#fff;background-color:#009595}.btn-primary:active:hover,.btn-primary:active:focus,.btn-primary:active.focus,.btn-primary.active:hover,.btn-primary.active:focus,.btn-primary.active.focus,.open>.btn-primary.dropdown-toggle:hover,.open>.btn-primary.dropdown-toggle:focus,.open>.btn-primary.dropdown-toggle.focus{color:#fff;background-color:#009595}.btn-primary:active,.btn-primary.active,.open>.btn-primary.dropdown-toggle{background-image:none}.btn-primary.disabled:hover,.btn-primary.disabled:focus,.btn-primary.disabled.focus,.btn-primary[disabled]:hover,.btn-primary[disabled]:focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary:hover,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary.focus{background-color:#0bb;border-color:transparent}.btn-primary .badge{color:#0bb;background-color:#fff}.btn-success{color:#fff;background-color:#7ec631;border-color:transparent}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#48a71c}.btn-success:hover{color:#fff;background-color:#48a71c}.btn-success:active,.btn-success.active,.open>.btn-success.dropdown-toggle{color:#fff;background-color:#48a71c}.btn-success:active:hover,.btn-success:active:focus,.btn-success:active.focus,.btn-success.active:hover,.btn-success.active:focus,.btn-success.active.focus,.open>.btn-success.dropdown-toggle:hover,.open>.btn-success.dropdown-toggle:focus,.open>.btn-success.dropdown-toggle.focus{color:#fff;background-color:#48a71c}.btn-success:active,.btn-success.active,.open>.btn-success.dropdown-toggle{background-image:none}.btn-success.disabled:hover,.btn-success.disabled:focus,.btn-success.disabled.focus,.btn-success[disabled]:hover,.btn-success[disabled]:focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success:hover,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success.focus{background-color:#7ec631;border-color:transparent}.btn-success .badge{color:#7ec631;background-color:#fff}.btn-info{color:#fff;background-color:#0bb;border-color:transparent}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#009595}.btn-info:hover{color:#fff;background-color:#009595}.btn-info:active,.btn-info.active,.open>.btn-info.dropdown-toggle{color:#fff;background-color:#009595}.btn-info:active:hover,.btn-info:active:focus,.btn-info:active.focus,.btn-info.active:hover,.btn-info.active:focus,.btn-info.active.focus,.open>.btn-info.dropdown-toggle:hover,.open>.btn-info.dropdown-toggle:focus,.open>.btn-info.dropdown-toggle.focus{color:#fff;background-color:#009595}.btn-info:active,.btn-info.active,.open>.btn-info.dropdown-toggle{background-image:none}.btn-info.disabled:hover,.btn-info.disabled:focus,.btn-info.disabled.focus,.btn-info[disabled]:hover,.btn-info[disabled]:focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info:hover,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info.focus{background-color:#0bb;border-color:transparent}.btn-info .badge{color:#0bb;background-color:#fff}.btn-warning{color:#fff;background-color:#ff9b26;border-color:transparent}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#ff6316}.btn-warning:hover{color:#fff;background-color:#ff6316}.btn-warning:active,.btn-warning.active,.open>.btn-warning.dropdown-toggle{color:#fff;background-color:#ff6316}.btn-warning:active:hover,.btn-warning:active:focus,.btn-warning:active.focus,.btn-warning.active:hover,.btn-warning.active:focus,.btn-warning.active.focus,.open>.btn-warning.dropdown-toggle:hover,.open>.btn-warning.dropdown-toggle:focus,.open>.btn-warning.dropdown-toggle.focus{color:#fff;background-color:#ff6316}.btn-warning:active,.btn-warning.active,.open>.btn-warning.dropdown-toggle{background-image:none}.btn-warning.disabled:hover,.btn-warning.disabled:focus,.btn-warning.disabled.focus,.btn-warning[disabled]:hover,.btn-warning[disabled]:focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning:hover,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning.focus{background-color:#ff9b26;border-color:transparent}.btn-warning .badge{color:#ff9b26;background-color:#fff}.btn-danger{color:#fff;background-color:#ff694b;border-color:transparent}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#ff3c2b}.btn-danger:hover{color:#fff;background-color:#ff3c2b}.btn-danger:active,.btn-danger.active,.open>.btn-danger.dropdown-toggle{color:#fff;background-color:#ff3c2b}.btn-danger:active:hover,.btn-danger:active:focus,.btn-danger:active.focus,.btn-danger.active:hover,.btn-danger.active:focus,.btn-danger.active.focus,.open>.btn-danger.dropdown-toggle:hover,.open>.btn-danger.dropdown-toggle:focus,.open>.btn-danger.dropdown-toggle.focus{color:#fff;background-color:#ff3c2b}.btn-danger:active,.btn-danger.active,.open>.btn-danger.dropdown-toggle{background-image:none}.btn-danger.disabled:hover,.btn-danger.disabled:focus,.btn-danger.disabled.focus,.btn-danger[disabled]:hover,.btn-danger[disabled]:focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger:hover,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger.focus{background-color:#ff694b;border-color:transparent}.btn-danger .badge{color:#ff694b;background-color:#fff}.btn-link{color:#0bb;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#009595;text-decoration:none;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:hover,fieldset[disabled] .btn-link:focus{color:#8b969e;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:1.2857142857rem 1.875rem;font-size:1.1428571429rem;line-height:1.6;border-radius:4px}.btn-sm,.btn-group-sm>.btn{padding:.4464285714rem .875rem;font-size:.9285714286rem;line-height:1.6;border-radius:4px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:.9285714286rem;line-height:1.6;border-radius:4px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=\"submit\"].btn-block,input[type=\"reset\"].btn-block,input[type=\"button\"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \\\\9 ;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:1rem;text-align:left;background-color:#fff;border:1px solid transparent;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:-.2rem 0;overflow:hidden;background-color:rgba(0,30,60,0.075)}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.6;color:#5e666c;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#313539;background-color:#f9fafb}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#0bb}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#8b969e}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:.9285714286rem;line-height:1.6;color:#8b969e;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \\\\9 ;content:\"\"}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width: 960px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar:before,.btn-toolbar:after{content:\" \";display:table}.btn-toolbar:after{clear:both}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle,.btn-group-lg.btn-group>.btn+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret,.btn-group-lg>.btn .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret,.dropup .btn-group-lg>.btn .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{content:\" \";display:table}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=\"buttons\"]>.btn input[type=\"radio\"],[data-toggle=\"buttons\"]>.btn input[type=\"checkbox\"],[data-toggle=\"buttons\"]>.btn-group>.btn input[type=\"radio\"],[data-toggle=\"buttons\"]>.btn-group>.btn input[type=\"checkbox\"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=\"col-\"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:.6785714286rem 1.25rem;font-size:1rem;font-weight:normal;line-height:1;color:#484e53;text-align:center;background-color:#f0f2f4;border:1px solid transparent;border-radius:4px}.input-group-addon.input-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{padding:.4464285714rem .875rem;font-size:.9285714286rem;border-radius:4px}.input-group-addon.input-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{padding:1.2857142857rem 1.875rem;font-size:1.1428571429rem;border-radius:4px}.input-group-addon input[type=\"radio\"],.input-group-addon input[type=\"checkbox\"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav:before,.nav:after{content:\" \";display:table}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:.6785714286rem .875rem}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#f9fafb}.nav>li.disabled>a{color:#8b969e}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#8b969e;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#f9fafb;border-color:#0bb}.nav .nav-divider{height:1px;margin:-.2rem 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid rgba(0,30,60,0.075)}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.6;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#ff694b #ff694b rgba(0,30,60,0.075)}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:inherit;background-color:transparent;border:1px solid #ff694b;border-bottom-color:transparent;cursor:default}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:1000px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#0bb}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified,.nav-tabs.nav-justified{width:100%}.nav-justified>li,.nav-tabs.nav-justified>li{float:none}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width: 540px){.nav-justified>li,.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified,.nav-tabs.nav-justified{border-bottom:0}.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs.nav-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width: 540px){.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs.nav-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#f9fafb}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.breadcrumb{padding:1.2857142857rem 1.875rem;margin-bottom:1.6rem;list-style:none;background-color:#f9fafb;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:\"/\\\\A0\";padding:0 5px;color:#8b969e}.breadcrumb>.active{color:#313539}.pagination{display:inline-block;padding-left:0;margin:1.6rem 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:.6785714286rem 1.25rem;line-height:1.6;text-decoration:none;color:#0bb;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>a:focus,.pagination>li>span:hover,.pagination>li>span:focus{z-index:2;color:#009595;background-color:#f7f7f8;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:hover,.pagination>.active>a:focus,.pagination>.active>span,.pagination>.active>span:hover,.pagination>.active>span:focus{z-index:3;color:#fff;background-color:#0bb;border-color:#0bb;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#bec5c9;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:1.2857142857rem 1.875rem;font-size:1.1428571429rem;line-height:1.6}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination-sm>li>a,.pagination-sm>li>span{padding:.4464285714rem .875rem;font-size:.9285714286rem;line-height:1.6}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pager{padding-left:0;margin:1.6rem 0;list-style:none;text-align:center}.pager:before,.pager:after{content:\" \";display:table}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f7f7f8}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#bec5c9;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#8b969e;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label:empty{display:none}.btn .label{position:relative;top:-1px}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label-default{background-color:transparent}.label-default[href]:hover,.label-default[href]:focus{background-color:transparent}.label-primary{background-color:transparent}.label-primary[href]:hover,.label-primary[href]:focus{background-color:transparent}.label-success{background-color:transparent}.label-success[href]:hover,.label-success[href]:focus{background-color:transparent}.label-info{background-color:transparent}.label-info[href]:hover,.label-info[href]:focus{background-color:transparent}.label-warning{background-color:transparent}.label-warning[href]:hover,.label-warning[href]:focus{background-color:transparent}.label-danger{background-color:transparent}.label-danger[href]:hover,.label-danger[href]:focus{background-color:transparent}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:.9285714286rem;font-weight:bold;color:#8b969e;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#f0f2f4;border-radius:100px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#0bb;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.thumbnail{display:block;padding:0;margin-bottom:1.6rem;line-height:1.6;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-transition:border 0.2s ease-in-out;-o-transition:border 0.2s ease-in-out;transition:border 0.2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:block;max-width:100%;height:auto;margin-left:auto;margin-right:auto}.thumbnail .caption{padding:20px 30px;color:#8b969e}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#0bb}.alert{padding:1.2857142857rem 1.875rem;margin-bottom:1.6rem;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:inherit}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:1.2857142857rem 1.875rem20}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#f3faec;border-color:transparent;color:#48a71c}.alert-success hr{border-top-color:transparent}.alert-success .alert-link{color:#357b15}.alert-info{background-color:#edfafa;border-color:transparent;color:#0aa}.alert-info hr{border-top-color:transparent}.alert-info .alert-link{color:#077}.alert-warning{background-color:#fff6ec;border-color:transparent;color:#ff6316}.alert-warning hr{border-top-color:transparent}.alert-warning .alert-link{color:#e24b00}.alert-danger{background-color:#fff5f4;border-color:transparent;color:#ff694b}.alert-danger hr{border-top-color:transparent}.alert-danger .alert-link{color:#ff3f18}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:1.6rem;margin-bottom:1.6rem;background-color:#f0f2f4;border-radius:100px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:.9285714286rem;line-height:1.6rem;color:#8b969e;text-align:center;background-color:#0bb;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#7ec631}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#0bb}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#ff9b26}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#ff694b}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,30,60,0.075)}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#5e666c}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#313539}a.list-group-item:hover,a.list-group-item:focus,button.list-group-item:hover,button.list-group-item:focus{text-decoration:none;color:#313539;background-color:#f9fafb}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#f9fafb;color:#8b969e;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#8b969e}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#0bb;border-color:rgba(0,30,60,0.03)}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#fff}.list-group-item-success{color:#48a71c;background-color:#f3faec}a.list-group-item-success,button.list-group-item-success{color:#48a71c}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:hover,button.list-group-item-success:focus{color:#48a71c;background-color:#e6f5d8}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active,button.list-group-item-success.active:hover,button.list-group-item-success.active:focus{color:#fff;background-color:#48a71c;border-color:#48a71c}.list-group-item-info{color:#0aa;background-color:#edfafa}a.list-group-item-info,button.list-group-item-info{color:#0aa}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:hover,button.list-group-item-info:focus{color:#0aa;background-color:#d9f4f4}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active,button.list-group-item-info.active:hover,button.list-group-item-info.active:focus{color:#fff;background-color:#0aa;border-color:#0aa}.list-group-item-warning{color:#ff6316;background-color:#fff6ec}a.list-group-item-warning,button.list-group-item-warning{color:#ff6316}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:hover,button.list-group-item-warning:focus{color:#ff6316;background-color:#ffead3}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active,button.list-group-item-warning.active:hover,button.list-group-item-warning.active:focus{color:#fff;background-color:#ff6316;border-color:#ff6316}.list-group-item-danger{color:#ff694b;background-color:#fff5f4}a.list-group-item-danger,button.list-group-item-danger{color:#ff694b}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:hover,button.list-group-item-danger:focus{color:#ff694b;background-color:#ffdedb}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active,button.list-group-item-danger.active:hover,button.list-group-item-danger.active:focus{color:#fff;background-color:#ff694b;border-color:#ff694b}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:1.6rem;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{content:\" \";display:table}.panel-body:after{clear:both}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:2rem;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:transparent;border-top:1px solid transparent;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid rgba(0,30,60,0.075)}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:1.6rem}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid transparent}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid transparent}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#5e666c;background-color:transparent;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:transparent;background-color:#5e666c}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#0bb}.panel-primary>.panel-heading{color:#fff;background-color:#0bb;border-color:#0bb}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#0bb}.panel-primary>.panel-heading .badge{color:#0bb;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#0bb}.panel-success{border-color:transparent}.panel-success>.panel-heading{color:#48a71c;background-color:#f3faec;border-color:transparent}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:transparent}.panel-success>.panel-heading .badge{color:#f3faec;background-color:#48a71c}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:transparent}.panel-info{border-color:transparent}.panel-info>.panel-heading{color:#0aa;background-color:#edfafa;border-color:transparent}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:transparent}.panel-info>.panel-heading .badge{color:#edfafa;background-color:#0aa}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:transparent}.panel-warning{border-color:transparent}.panel-warning>.panel-heading{color:#ff6316;background-color:#fff6ec;border-color:transparent}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:transparent}.panel-warning>.panel-heading .badge{color:#fff6ec;background-color:#ff6316}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:transparent}.panel-danger{border-color:transparent}.panel-danger>.panel-heading{color:#ff694b;background-color:#fff5f4;border-color:transparent}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:transparent}.panel-danger>.panel-heading .badge{color:#fff5f4;background-color:#ff694b}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:transparent}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f0f2f4;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:4px}.well-sm{padding:9px;border-radius:4px}.close{float:right;font-size:1.5rem;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform 0.3s ease-out;-moz-transition:-moz-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:transparent;border:1px solid transparent;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#f0f2f4}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.75;filter:alpha(opacity=75)}.modal-header{padding:0;border-bottom:1px solid transparent}.modal-header:before,.modal-header:after{content:\" \";display:table}.modal-header:after{clear:both}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.6}.modal-body{position:relative;padding:0}.modal-footer{padding:0;text-align:right;border-top:1px solid transparent}.modal-footer:before,.modal-footer:after{content:\" \";display:table}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width: 540px){.modal-dialog{width:768px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:400px}}@media (min-width: 768px){.modal-lg{width:960px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Oxygen,Ubuntu,Cantarell,\"Fira Sans\",\"Droid Sans\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.6;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:.9285714286rem;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:1;filter:alpha(opacity=100)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:300px;padding:3px 8px;color:#fff;text-align:center;background-color:#007699;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#007699}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#007699}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#007699}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#007699}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#007699}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#007699}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#007699}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#007699}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:400px;padding:1px;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Oxygen,Ubuntu,Cantarell,\"Fira Sans\",\"Droid Sans\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.6;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:1rem;background-color:#ff694b;background-clip:padding-box;border:1px solid transparent;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:1rem;background-color:transparent;border-bottom:1px solid transparent;border-radius:3px 3px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:0}.popover>.arrow:after{border-width:10px;content:\"\"}.popover.top>.arrow{left:50%;margin-left:0;border-bottom-width:0;border-top-color:transparent;border-top-color:transparent;bottom:0}.popover.top>.arrow:after{content:\" \";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#ff694b}.popover.right>.arrow{top:50%;left:0;margin-top:0;border-left-width:0;border-right-color:transparent;border-right-color:transparent}.popover.right>.arrow:after{content:\" \";left:1px;bottom:-10px;border-left-width:0;border-right-color:#ff694b}.popover.bottom>.arrow{left:50%;margin-left:0;border-top-width:0;border-bottom-color:transparent;border-bottom-color:transparent;top:0}.popover.bottom>.arrow:after{content:\" \";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#ff694b}.popover.left>.arrow{top:50%;right:0;margin-top:0;border-right-width:0;border-left-color:transparent;border-left-color:transparent}.popover.left>.arrow:after{content:\" \";right:1px;border-right-width:0;border-left-color:#ff694b;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto;line-height:1}@media all and (transform-3d), (-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform 0.6s ease-in-out;-moz-transition:-moz-transform 0.6s ease-in-out;-o-transition:-o-transform 0.6s ease-in-out;transition:transform 0.6s ease-in-out;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;-moz-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:120px;opacity:1;filter:alpha(opacity=100);font-size:20px;color:#fff;text-align:center;text-shadow:none;background-color:transparent}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0.0001) 100%);background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0%, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0%, rgba(0,0,0,0.5) 100%);background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0%, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\\\\2039'}.carousel-control .icon-next:before{content:'\\\\203A'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid transparent;border-radius:10px;cursor:pointer;background-color:#000 \\\\9;background-color:transparent}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:none}.carousel-caption .btn{text-shadow:none}@media screen and (min-width: 540px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after{content:\" \";display:table}.clearfix:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@font-face{font-family:\"arrows\";font-weight:normal;font-style:normal;src:url(` + u(e(213)) + ') format(\"woff\")}[class*=\"arrow-\"]:not(.arrow-before):after,[class*=\"arrow-\"].arrow-before:before{font-family:\"arrows\";text-transform:none;font-style:normal;font-weight:normal;line-height:.5}.arrow-large:not(.arrow-before):after,.arrow-large.arrow-before:before{text-transform:uppercase}.arrow-up:not(.arrow-before):after,.arrow-up.arrow-before:before{content:\" a \"}.arrow-right:not(.arrow-before):after,.arrow-right.arrow-before:before{content:\" b \"}.arrow-down:not(.arrow-before):after,.arrow-down.arrow-before:before{content:\" c \"}.arrow-left:not(.arrow-before):after,.arrow-left.arrow-before:before{content:\" d \"}.arrow-close:not(.arrow-before):after,.arrow-close.arrow-before:before{content:\" e \"}.arrow-check:not(.arrow-before):after,.arrow-check.arrow-before:before{content:\" f \"}@font-face{font-family:\"entypo\";font-weight:normal;font-style:normal;src:url(' + u(e(214)) + `) format(\"woff\")}[data-icon]{width:24px;height:10px;display:inline-block;vertical-align:middle}[data-icon]:before{display:block;position:relative;margin-top:-1px;top:-5px;speak:none;font-family:\"entypo\";font-style:normal;font-weight:normal;font-variant:normal;font-size:18px;line-height:1;text-align:center;text-transform:none;text-decoration:inherit}[data-icon].md:before{font-size:20px}[data-icon].lg{width:32px}[data-icon].lg:before{font-size:32px;top:-11px}[data-icon=\"note\"]:before{content:\"\\\\E800\"}[data-icon=\"logo-db\"]:before{content:\"\\\\E8DE\"}[data-icon=\"music\"]:before{content:\"\\\\E802\"}[data-icon=\"search\"]:before{content:\"\\\\E803\"}[data-icon=\"flashlight\"]:before{content:\"\\\\E804\"}[data-icon=\"mail\"]:before{content:\"\\\\E805\"}[data-icon=\"heart\"]:before{content:\"\\\\E80D\"}[data-icon=\"heart-empty\"]:before{content:\"\\\\E80F\"}[data-icon=\"star\"]:before{content:\"\\\\E810\"}[data-icon=\"star-empty\"]:before{content:\"\\\\E813\"}[data-icon=\"user\"]:before{content:\"\\\\E814\"}[data-icon=\"users\"]:before{content:\"\\\\E817\"}[data-icon=\"user-add\"]:before{content:\"\\\\E819\"}[data-icon=\"video\"]:before{content:\"\\\\E81A\"}[data-icon=\"picture\"]:before{content:\"\\\\E81D\"}[data-icon=\"camera\"]:before{content:\"\\\\1F4F7\"}[data-icon=\"layout\"]:before{content:\"\\\\E821\"}[data-icon=\"menu\"]:before{content:\"\\\\E823\"}[data-icon=\"check\"]:before{content:\"\\\\E824\"}[data-icon=\"close\"]:before{content:\"\\\\E826\"}[data-icon=\"cancel\"]:before{content:\"\\\\E826\"}[data-icon=\"cancel-circled\"]:before{content:\"\\\\E806\"}[data-icon=\"cancel-squared\"]:before{content:\"\\\\E808\"}[data-icon=\"plus\"]:before{content:\"+\"}[data-icon=\"plus-circled\"]:before{content:\"\\\\E809\"}[data-icon=\"plus-squared\"]:before{content:\"\\\\E80A\"}[data-icon=\"minus\"]:before{content:\"\\\\2212\"}[data-icon=\"minus-circled\"]:before{content:\"\\\\E80E\"}[data-icon=\"minus-squared\"]:before{content:\"\\\\E80C\"}[data-icon=\"help\"]:before{content:\"\\\\E811\"}[data-icon=\"help-circled\"]:before{content:\"\\\\E812\"}[data-icon=\"info\"]:before{content:\"\\\\E815\"}[data-icon=\"info-circled\"]:before{content:\"\\\\E816\"}[data-icon=\"back\"]:before{content:\"\\\\E818\"}[data-icon=\"home\"]:before{content:\"\\\\E81B\"}[data-icon=\"link\"]:before{content:\"\\\\E81C\"}[data-icon=\"attach\"]:before{content:\"\\\\E81F\"}[data-icon=\"lock\"]:before{content:\"\\\\1F512\"}[data-icon=\"lock-open\"]:before{content:\"\\\\E822\"}[data-icon=\"eye\"]:before{content:\"\\\\E825\"}[data-icon=\"tag\"]:before{content:\"\\\\E827\"}[data-icon=\"bookmark\"]:before{content:\"\\\\1F516\"}[data-icon=\"bookmarks\"]:before{content:\"\\\\E837\"}[data-icon=\"flag\"]:before{content:\"\\\\E838\"}[data-icon=\"thumbs-up\"]:before{content:\"\\\\E840\"}[data-icon=\"thumbs-down\"]:before{content:\"\\\\E849\"}[data-icon=\"download\"]:before{content:\"\\\\E85D\"}[data-icon=\"upload\"]:before{content:\"\\\\E851\"}[data-icon=\"upload-cloud\"]:before{content:\"\\\\E86B\"}[data-icon=\"reply\"]:before{content:\"\\\\E86C\"}[data-icon=\"reply-all\"]:before{content:\"\\\\E87B\"}[data-icon=\"forward\"]:before{content:\"\\\\E87C\"}[data-icon=\"quote\"]:before{content:\"\\\\E889\"}[data-icon=\"code\"]:before{content:\"\\\\E88A\"}[data-icon=\"export\"]:before{content:\"\\\\E899\"}[data-icon=\"pencil\"]:before{content:\"\\\\270F\"}[data-icon=\"feather\"]:before{content:\"\\\\E8A5\"}[data-icon=\"print\"]:before{content:\"\\\\E8A8\"}[data-icon=\"retweet\"]:before{content:\"\\\\E8A9\"}[data-icon=\"keyboard\"]:before{content:\"\\\\2328\"}[data-icon=\"comment\"]:before{content:\"\\\\E8AB\"}[data-icon=\"chat\"]:before{content:\"\\\\E829\"}[data-icon=\"bell\"]:before{content:\"\\\\1F514\"}[data-icon=\"attention\"]:before{content:\"\\\\E839\"}[data-icon=\"alert\"]:before{content:\"\\\\E841\"}[data-icon=\"vcard\"]:before{content:\"\\\\E853\"}[data-icon=\"address\"]:before{content:\"\\\\E85C\"}[data-icon=\"location\"]:before{content:\"\\\\E852\"}[data-icon=\"map\"]:before{content:\"\\\\E84A\"}[data-icon=\"direction\"]:before{content:\"\\\\E86D\"}[data-icon=\"compass\"]:before{content:\"\\\\E87A\"}[data-icon=\"cup\"]:before{content:\"\\\\E850\"}[data-icon=\"trash\"]:before{content:\"\\\\E888\"}[data-icon=\"doc\"]:before{content:\"\\\\E88B\"}[data-icon=\"docs\"]:before{content:\"\\\\E898\"}[data-icon=\"doc-landscape\"]:before{content:\"\\\\E89B\"}[data-icon=\"doc-text\"]:before{content:\"\\\\E8A6\"}[data-icon=\"doc-text-inv\"]:before{content:\"\\\\E8A7\"}[data-icon=\"newspaper\"]:before{content:\"\\\\1F4F0\"}[data-icon=\"book-open\"]:before{content:\"\\\\E8AD\"}[data-icon=\"book\"]:before{content:\"\\\\E8AC\"}[data-icon=\"folder\"]:before{content:\"\\\\E82A\"}[data-icon=\"archive\"]:before{content:\"\\\\E835\"}[data-icon=\"box\"]:before{content:\"\\\\E83A\"}[data-icon=\"rss\"]:before{content:\"\\\\E842\"}[data-icon=\"phone\"]:before{content:\"\\\\E854\"}[data-icon=\"cog\"]:before{content:\"\\\\E85E\"}[data-icon=\"tools\"]:before{content:\"\\\\E860\"}[data-icon=\"share\"]:before{content:\"\\\\E84B\"}[data-icon=\"shareable\"]:before{content:\"\\\\E86E\"}[data-icon=\"basket\"]:before{content:\"\\\\E879\"}[data-icon=\"bag\"]:before{content:\"\\\\E87E\"}[data-icon=\"calendar\"]:before{content:\"\\\\1F4C5\"}[data-icon=\"login\"]:before{content:\"\\\\E88C\"}[data-icon=\"logout\"]:before{content:\"\\\\E897\"}[data-icon=\"mic\"]:before{content:\"\\\\E84D\"}[data-icon=\"mute\"]:before{content:\"\\\\E84E\"}[data-icon=\"sound\"]:before{content:\"\\\\E8AE\"}[data-icon=\"volume\"]:before{content:\"\\\\E8B4\"}[data-icon=\"clock\"]:before{content:\"\\\\E8AF\"}[data-icon=\"hourglass\"]:before{content:\"\\\\231B\"}[data-icon=\"lamp\"]:before{content:\"\\\\E82B\"}[data-icon=\"light-down\"]:before{content:\"\\\\E834\"}[data-icon=\"light-up\"]:before{content:\"\\\\E83B\"}[data-icon=\"adjust\"]:before{content:\"\\\\E843\"}[data-icon=\"block\"]:before{content:\"\\\\2588\"}[data-icon=\"resize-full\"]:before{content:\"\\\\E85F\"}[data-icon=\"resize-small\"]:before{content:\"\\\\E861\"}[data-icon=\"popup\"]:before{content:\"\\\\E86A\"}[data-icon=\"publish\"]:before{content:\"\\\\E86F\"}[data-icon=\"window\"]:before{content:\"\\\\E878\"}[data-icon=\"arrow-combo\"]:before{content:\"\\\\E87D\"}[data-icon=\"down-circled\"]:before{content:\"\\\\E887\"}[data-icon=\"left-circled\"]:before{content:\"\\\\E88D\"}[data-icon=\"right-circled\"]:before{content:\"\\\\E896\"}[data-icon=\"up-circled\"]:before{content:\"\\\\E89C\"}[data-icon=\"down-open\"]:before{content:\"\\\\E84C\"}[data-icon=\"left-open\"]:before{content:\"\\\\E8B2\"}[data-icon=\"right-open\"]:before{content:\"\\\\E8B3\"}[data-icon=\"up-open\"]:before{content:\"\\\\E8B5\"}[data-icon=\"down-open-mini\"]:before{content:\"\\\\E8B6\"}[data-icon=\"left-open-mini\"]:before{content:\"\\\\E833\"}[data-icon=\"right-open-mini\"]:before{content:\"\\\\E832\"}[data-icon=\"up-open-mini\"]:before{content:\"\\\\E83C\"}[data-icon=\"down-open-big\"]:before{content:\"\\\\E844\"}[data-icon=\"left-open-big\"]:before{content:\"\\\\E855\"}[data-icon=\"right-open-big\"]:before{content:\"\\\\E85B\"}[data-icon=\"up-open-big\"]:before{content:\"\\\\E862\"}[data-icon=\"down\"]:before{content:\"\\\\E869\"}[data-icon=\"left\"]:before{content:\"\\\\E870\"}[data-icon=\"right\"]:before{content:\"\\\\E877\"}[data-icon=\"up\"]:before{content:\"\\\\E87F\"}[data-icon=\"down-dir\"]:before{content:\"\\\\E886\"}[data-icon=\"left-dir\"]:before{content:\"\\\\E88E\"}[data-icon=\"right-dir\"]:before{content:\"\\\\E895\"}[data-icon=\"up-dir\"]:before{content:\"\\\\E89D\"}[data-icon=\"down-bold\"]:before{content:\"\\\\E8A4\"}[data-icon=\"left-bold\"]:before{content:\"\\\\E8BA\"}[data-icon=\"right-bold\"]:before{content:\"\\\\E8B9\"}[data-icon=\"up-bold\"]:before{content:\"\\\\E8B8\"}[data-icon=\"down-thin\"]:before{content:\"\\\\E8B7\"}[data-icon=\"left-thin\"]:before{content:\"\\\\E82C\"}[data-icon=\"note-beamed\"]:before{content:\"\\\\E801\"}[data-icon=\"up-thin\"]:before{content:\"\\\\E83D\"}[data-icon=\"cw\"]:before{content:\"\\\\E856\"}[data-icon=\"arrows-ccw\"]:before{content:\"\\\\E85A\"}[data-icon=\"level-down\"]:before{content:\"\\\\E863\"}[data-icon=\"level-up\"]:before{content:\"\\\\E868\"}[data-icon=\"shuffle\"]:before{content:\"\\\\E871\"}[data-icon=\"loop\"]:before{content:\"\\\\E876\"}[data-icon=\"switch\"]:before{content:\"\\\\E880\"}[data-icon=\"play\"]:before{content:\"\\\\E885\"}[data-icon=\"stop\"]:before{content:\"\\\\E88F\"}[data-icon=\"pause\"]:before{content:\"\\\\E894\"}[data-icon=\"record\"]:before{content:\"\\\\E89E\"}[data-icon=\"to-end\"]:before{content:\"\\\\E8A3\"}[data-icon=\"to-start\"]:before{content:\"\\\\E8BB\"}[data-icon=\"fast-forward\"]:before{content:\"\\\\E8BC\"}[data-icon=\"fast-backward\"]:before{content:\"\\\\E8BD\"}[data-icon=\"progress-0\"]:before{content:\"\\\\E8BE\"}[data-icon=\"progress-1\"]:before{content:\"\\\\E82D\"}[data-icon=\"progress-2\"]:before{content:\"\\\\E830\"}[data-icon=\"progress-3\"]:before{content:\"\\\\E83E\"}[data-icon=\"target\"]:before{content:\"\\\\E857\"}[data-icon=\"palette\"]:before{content:\"\\\\E847\"}[data-icon=\"list\"]:before{content:\"\\\\E859\"}[data-icon=\"list-add\"]:before{content:\"\\\\E864\"}[data-icon=\"signal\"]:before{content:\"\\\\E867\"}[data-icon=\"trophy\"]:before{content:\"\\\\1F3C6\"}[data-icon=\"battery\"]:before{content:\"\\\\1F50B\"}[data-icon=\"back-in-time\"]:before{content:\"\\\\E881\"}[data-icon=\"monitor\"]:before{content:\"\\\\E884\"}[data-icon=\"mobile\"]:before{content:\"\\\\E890\"}[data-icon=\"network\"]:before{content:\"\\\\E893\"}[data-icon=\"cd\"]:before{content:\"\\\\E89F\"}[data-icon=\"inbox\"]:before{content:\"\\\\E8A2\"}[data-icon=\"install\"]:before{content:\"\\\\E8C2\"}[data-icon=\"globe\"]:before{content:\"\\\\E8C1\"}[data-icon=\"cloud\"]:before{content:\"\\\\2601\"}[data-icon=\"cloud-thunder\"]:before{content:\"\\\\E8BF\"}[data-icon=\"flash\"]:before{content:\"\\\\E82E\"}[data-icon=\"moon\"]:before{content:\"\\\\E82F\"}[data-icon=\"flight\"]:before{content:\"\\\\E83F\"}[data-icon=\"paper-plane\"]:before{content:\"\\\\E845\"}[data-icon=\"leaf\"]:before{content:\"\\\\E846\"}[data-icon=\"lifebuoy\"]:before{content:\"\\\\E858\"}[data-icon=\"mouse\"]:before{content:\"\\\\1F401\"}[data-icon=\"briefcase\"]:before{content:\"\\\\1F4BC\"}[data-icon=\"suitcase\"]:before{content:\"\\\\E873\"}[data-icon=\"dot\"]:before{content:\"\\\\E874\"}[data-icon=\"dot-2\"]:before{content:\"\\\\E882\"}[data-icon=\"dot-3\"]:before{content:\"\\\\E883\"}[data-icon=\"brush\"]:before{content:\"\\\\E891\"}[data-icon=\"magnet\"]:before{content:\"\\\\E892\"}[data-icon=\"infinity\"]:before{content:\"\\\\221E\"}[data-icon=\"erase\"]:before{content:\"\\\\E8A1\"}[data-icon=\"chart-pie\"]:before{content:\"\\\\E8C3\"}[data-icon=\"chart-line\"]:before{content:\"\\\\E8C4\"}[data-icon=\"chart-bar\"]:before{content:\"\\\\E8C5\"}[data-icon=\"chart-area\"]:before{content:\"\\\\E8C6\"}[data-icon=\"tape\"]:before{content:\"\\\\E8C7\"}[data-icon=\"graduation-cap\"]:before{content:\"\\\\E8D2\"}[data-icon=\"language\"]:before{content:\"\\\\E8D4\"}[data-icon=\"ticket\"]:before{content:\"\\\\1F3AB\"}[data-icon=\"water\"]:before{content:\"\\\\E8DA\"}[data-icon=\"droplet\"]:before{content:\"\\\\1F4A7\"}[data-icon=\"air\"]:before{content:\"\\\\E8E3\"}[data-icon=\"credit-card\"]:before{content:\"\\\\E8EA\"}[data-icon=\"floppy\"]:before{content:\"\\\\E8EB\"}[data-icon=\"clipboard\"]:before{content:\"\\\\1F4CB\"}[data-icon=\"megaphone\"]:before{content:\"\\\\E8F3\"}[data-icon=\"database\"]:before{content:\"\\\\E8FA\"}[data-icon=\"drive\"]:before{content:\"\\\\E8FC\"}[data-icon=\"bucket\"]:before{content:\"\\\\E902\"}[data-icon=\"thermometer\"]:before{content:\"\\\\E903\"}[data-icon=\"key\"]:before{content:\"\\\\1F511\"}[data-icon=\"flow-cascade\"]:before{content:\"\\\\E90B\"}[data-icon=\"flow-branch\"]:before{content:\"\\\\E912\"}[data-icon=\"flow-tree\"]:before{content:\"\\\\E913\"}[data-icon=\"flow-line\"]:before{content:\"\\\\E91A\"}[data-icon=\"flow-parallel\"]:before{content:\"\\\\E8C8\"}[data-icon=\"rocket\"]:before{content:\"\\\\1F680\"}[data-icon=\"gauge\"]:before{content:\"\\\\E8D3\"}[data-icon=\"traffic-cone\"]:before{content:\"\\\\E8D8\"}[data-icon=\"cc\"]:before{content:\"\\\\E8DB\"}[data-icon=\"cc-by\"]:before{content:\"\\\\E8E1\"}[data-icon=\"cc-nc\"]:before{content:\"\\\\E8E4\"}[data-icon=\"cc-nc-eu\"]:before{content:\"\\\\E8E9\"}[data-icon=\"cc-nc-jp\"]:before{content:\"\\\\E8EC\"}[data-icon=\"cc-sa\"]:before{content:\"\\\\E8F1\"}[data-icon=\"cc-nd\"]:before{content:\"\\\\E8F4\"}[data-icon=\"cc-pd\"]:before{content:\"\\\\E8F9\"}[data-icon=\"cc-zero\"]:before{content:\"\\\\E8FB\"}[data-icon=\"cc-share\"]:before{content:\"\\\\E901\"}[data-icon=\"cc-remix\"]:before{content:\"\\\\E904\"}[data-icon=\"github\"]:before{content:\"\\\\E909\"}[data-icon=\"github-circled\"]:before{content:\"\\\\E90C\"}[data-icon=\"flickr\"]:before{content:\"\\\\E911\"}[data-icon=\"flickr-circled\"]:before{content:\"\\\\E914\"}[data-icon=\"vimeo\"]:before{content:\"\\\\E919\"}[data-icon=\"vimeo-circled\"]:before{content:\"\\\\E8C9\"}[data-icon=\"twitter\"]:before{content:\"\\\\E8D0\"}[data-icon=\"twitter-circled\"]:before{content:\"\\\\E8D6\"}[data-icon=\"facebook\"]:before{content:\"\\\\E8D7\"}[data-icon=\"facebook-circled\"]:before{content:\"\\\\E8DC\"}[data-icon=\"facebook-squared\"]:before{content:\"\\\\E8E0\"}[data-icon=\"gplus\"]:before{content:\"\\\\E8E5\"}[data-icon=\"gplus-circled\"]:before{content:\"\\\\E8E8\"}[data-icon=\"pinterest\"]:before{content:\"\\\\E8ED\"}[data-icon=\"pinterest-circled\"]:before{content:\"\\\\E8F0\"}[data-icon=\"tumblr\"]:before{content:\"\\\\E8F5\"}[data-icon=\"tumblr-circled\"]:before{content:\"\\\\E8F8\"}[data-icon=\"linkedin\"]:before{content:\"\\\\E8FD\"}[data-icon=\"linkedin-circled\"]:before{content:\"\\\\E900\"}[data-icon=\"dribbble\"]:before{content:\"\\\\E905\"}[data-icon=\"dribbble-circled\"]:before{content:\"\\\\E908\"}[data-icon=\"stumbleupon\"]:before{content:\"\\\\E90D\"}[data-icon=\"stumbleupon-circled\"]:before{content:\"\\\\E910\"}[data-icon=\"lastfm\"]:before{content:\"\\\\E915\"}[data-icon=\"lastfm-circled\"]:before{content:\"\\\\E918\"}[data-icon=\"rdio\"]:before{content:\"\\\\E8CA\"}[data-icon=\"rdio-circled\"]:before{content:\"\\\\E8D5\"}[data-icon=\"spotify\"]:before{content:\"\\\\E8CF\"}[data-icon=\"spotify-circled\"]:before{content:\"\\\\E8CE\"}[data-icon=\"qq\"]:before{content:\"\\\\E8DD\"}[data-icon=\"instagram\"]:before{content:\"\\\\E8DF\"}[data-icon=\"dropbox\"]:before{content:\"\\\\E8E6\"}[data-icon=\"evernote\"]:before{content:\"\\\\E8E7\"}[data-icon=\"flattr\"]:before{content:\"\\\\E8EE\"}[data-icon=\"skype\"]:before{content:\"\\\\E8EF\"}[data-icon=\"skype-circled\"]:before{content:\"\\\\E8F6\"}[data-icon=\"renren\"]:before{content:\"\\\\E8F7\"}[data-icon=\"sina-weibo\"]:before{content:\"\\\\E8FE\"}[data-icon=\"paypal\"]:before{content:\"\\\\E8FF\"}[data-icon=\"picasa\"]:before{content:\"\\\\E906\"}[data-icon=\"soundcloud\"]:before{content:\"\\\\E907\"}[data-icon=\"mixi\"]:before{content:\"\\\\E90E\"}[data-icon=\"behance\"]:before{content:\"\\\\E90F\"}[data-icon=\"google-circles\"]:before{content:\"\\\\E916\"}[data-icon=\"vkontakte\"]:before{content:\"\\\\E917\"}[data-icon=\"smashing\"]:before{content:\"\\\\E8CB\"}[data-icon=\"sweden\"]:before{content:\"\\\\E8CC\"}[data-icon=\"db-shape\"]:before{content:\"\\\\E8CD\"}[data-icon=\"bitbucket\"]:before{content:\"\\\\20AC\"}*,*:before,*:after{position:relative;outline:none !important;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-smoothing:grayscale}html{-webkit-text-size-adjust:100%;font-size:14px}body{min-width:960px}.block{display:block !important}.inline{display:inline !important}.inline-block{display:inline-block !important}.invisible{visibility:hidden}.hidden{display:none}.blocklink{display:block;color:inherit;text-decoration:none !important}.blocklink:hover,.blocklink:focus{color:inherit}.fill{display:block;position:absolute;width:100%;height:100%;top:0;left:0}.full{display:block;position:absolute;width:100%;height:100%;top:0;left:0;position:fixed}.cover{display:block;position:absolute;left:0;top:0;bottom:0;right:0}.clear:after{display:table;content:'';clear:both}.clean{margin:0;padding:0;border:0;list-style-type:none}.clean li{margin:0;padding:0;list-style-type:none}.trim>*:first-child{margin-top:0}.trim>*:last-child{margin-bottom:0}.snug>*{margin-top:.5rem;margin-bottom:.5rem}.snug>*:first-child{margin-top:0}.snug>*:last-child{margin-bottom:0}.compact *{margin-top:0;margin-bottom:0}.component{display:block;border-width:0;background:white;box-shadow:0 0 0 1px rgba(0,30,60,0.03),0 3px 3px -1.5px rgba(0,0,0,0.03);border-radius:4px}.transitions{-webkit-transition:all .5s cubic-bezier(0.25, 0, 0, 1);-o-transition:all .5s cubic-bezier(0.25, 0, 0, 1);transition:all .5s cubic-bezier(0.25, 0, 0, 1)}.margin,.margin-top{margin-top:2em}.margin,.margin-bottom{margin-bottom:2em}.margin-small,.margin-small-top{margin-top:1em}.margin-small,.margin-small-bottom{margin-bottom:1em}.padding,.padding-top{padding-top:2em}.padding,.padding-bottom{margin-bottom:2em}.flush,.flush-top{margin-top:0 !important}.flush,.flush-bottom{margin-bottom:0 !important}@media print{html{font-size:9pt}html body{-webkit-print-color-adjust:exact}html a{white-space:nowrap}html,body{background:white !important}font-size:9pt;body{-webkit-print-color-adjust:exact}a{white-space:nowrap}@page{margin:0.75in 1in}}@media screen{html.print{font-size:9pt;font-size:9pt;background:#f9fafb}html.print body{-webkit-print-color-adjust:exact}html.print a{white-space:nowrap}html.print body{-webkit-print-color-adjust:exact}html.print a{white-space:nowrap}html.print body{padding:0.75in 1in;margin:.5in auto;max-width:8.5in;box-shadow:0 0 0 1px rgba(0,30,60,0.03),0 3px 3px -1.5px rgba(0,0,0,0.03);height:auto}}.text-red{color:#ff694b !important}.text-red-dark{color:#ff4f39 !important}.text-red-darker{color:#ff3c2b !important}.text-red-darkest{color:#ff2d21 !important}.text-red-light{color:#ff845e !important}.text-red-lighter{color:#ffa376 !important}.text-red-lightest{color:#ffba94 !important}.text-red-highlight{color:#fff5f4 !important}.bg-red{background-color:#ff694b !important}.bg-red-dark{background-color:#ff4f39 !important}.bg-red-darker{background-color:#ff3c2b !important}.bg-red-darkest{background-color:#ff2d21 !important}.bg-red-light{background-color:#ff845e !important}.bg-red-lighter{background-color:#ffa376 !important}.bg-red-lightest{background-color:#ffba94 !important}.bg-red-highlight{background-color:#fff5f4 !important}.text-orange{color:#ff694b !important}.text-orange-dark{color:#ff4f39 !important}.text-orange-darker{color:#ff3c2b !important}.text-orange-darkest{color:#ff2d21 !important}.text-orange-light{color:#ff845e !important}.text-orange-lighter{color:#ffa376 !important}.text-orange-lightest{color:#ffba94 !important}.text-orange-highlight{color:#fff5f4 !important}.bg-orange{background-color:#ff694b !important}.bg-orange-dark{background-color:#ff4f39 !important}.bg-orange-darker{background-color:#ff3c2b !important}.bg-orange-darkest{background-color:#ff2d21 !important}.bg-orange-light{background-color:#ff845e !important}.bg-orange-lighter{background-color:#ffa376 !important}.bg-orange-lightest{background-color:#ffba94 !important}.bg-orange-highlight{background-color:#fff5f4 !important}.text-yellow{color:#fc0 !important}.text-yellow-dark{color:#ffc000 !important}.text-yellow-darker{color:#ffb100 !important}.text-yellow-darkest{color:#ff9e00 !important}.text-yellow-light{color:#ffd900 !important}.text-yellow-lighter{color:#ffe300 !important}.text-yellow-lightest{color:#ffea00 !important}.text-yellow-highlight{color:#fff8db !important}.bg-yellow{background-color:#fc0 !important}.bg-yellow-dark{background-color:#ffc000 !important}.bg-yellow-darker{background-color:#ffb100 !important}.bg-yellow-darkest{background-color:#ff9e00 !important}.bg-yellow-light{background-color:#ffd900 !important}.bg-yellow-lighter{background-color:#ffe300 !important}.bg-yellow-lightest{background-color:#ffea00 !important}.bg-yellow-highlight{background-color:#fff8db !important}.text-green{color:#7ec631 !important}.text-green-dark{color:#5fb825 !important}.text-green-darker{color:#48a71c !important}.text-green-darkest{color:#369115 !important}.text-green-light{color:#9ed53e !important}.text-green-lighter{color:#b7e04e !important}.text-green-lightest{color:#c9e862 !important}.text-green-highlight{color:#f3faec !important}.bg-green{background-color:#7ec631 !important}.bg-green-dark{background-color:#5fb825 !important}.bg-green-darker{background-color:#48a71c !important}.bg-green-darkest{background-color:#369115 !important}.bg-green-light{background-color:#9ed53e !important}.bg-green-lighter{background-color:#b7e04e !important}.bg-green-lightest{background-color:#c9e862 !important}.bg-green-highlight{background-color:#f3faec !important}.text-blue{color:#0bb !important}.text-blue-dark{color:#0aa !important}.text-blue-darker{color:#009595 !important}.text-blue-darkest{color:#007b7b !important}.text-blue-light{color:#0cc !important}.text-blue-lighter{color:#00d9d9 !important}.text-blue-lightest{color:#00e3e3 !important}.text-blue-highlight{color:#edfafa !important}.bg-blue{background-color:#0bb !important}.bg-blue-dark{background-color:#0aa !important}.bg-blue-darker{background-color:#009595 !important}.bg-blue-darkest{background-color:#007b7b !important}.bg-blue-light{background-color:#0cc !important}.bg-blue-lighter{background-color:#00d9d9 !important}.bg-blue-lightest{background-color:#00e3e3 !important}.bg-blue-highlight{background-color:#edfafa !important}.text-purple{color:#7f6cc5 !important}.text-purple-dark{color:#6051b7 !important}.text-purple-darker{color:#483da5 !important}.text-purple-darkest{color:#362e8f !important}.text-purple-light{color:#9f87d4 !important}.text-purple-lighter{color:#b7a5df !important}.text-purple-lightest{color:#c9bce7 !important}.text-purple-highlight{color:#f8f7fc !important}.bg-purple{background-color:#7f6cc5 !important}.bg-purple-dark{background-color:#6051b7 !important}.bg-purple-darker{background-color:#483da5 !important}.bg-purple-darkest{background-color:#362e8f !important}.bg-purple-light{background-color:#9f87d4 !important}.bg-purple-lighter{background-color:#b7a5df !important}.bg-purple-lightest{background-color:#c9bce7 !important}.bg-purple-highlight{background-color:#f8f7fc !important}.text-navy{color:#005e7a !important}.text-navy-dark{color:#00475c !important}.text-navy-darker{color:#003645 !important}.text-navy-darkest{color:#002934 !important}.text-navy-light{color:#007699 !important}.text-navy-lighter{color:#0094b3 !important}.text-navy-lightest{color:#00afc6 !important}.text-navy-highlight{color:#f4f8f9 !important}.bg-navy{background-color:#005e7a !important}.bg-navy-dark{background-color:#00475c !important}.bg-navy-darker{background-color:#003645 !important}.bg-navy-darkest{background-color:#002934 !important}.bg-navy-light{background-color:#007699 !important}.bg-navy-lighter{background-color:#0094b3 !important}.bg-navy-lightest{background-color:#00afc6 !important}.bg-navy-highlight{background-color:#f4f8f9 !important}.text-gray{color:#8b969e !important}.text-gray-dark{color:#6e7c86 !important}.text-gray-darker{color:#535d68 !important}.text-gray-darkest{color:#3f464e !important}.text-gray-light{color:#a8b1b7 !important}.text-gray-lighter{color:#bec5c9 !important}.text-gray-lightest{color:#cfd4d7 !important}.text-gray-highlight{color:#f7f7f8 !important}.bg-gray{background-color:#8b969e !important}.bg-gray-dark{background-color:#6e7c86 !important}.bg-gray-darker{background-color:#535d68 !important}.bg-gray-darkest{background-color:#3f464e !important}.bg-gray-light{background-color:#a8b1b7 !important}.bg-gray-lighter{background-color:#bec5c9 !important}.bg-gray-lightest{background-color:#cfd4d7 !important}.bg-gray-highlight{background-color:#f7f7f8 !important}.text-success{color:#5fb825 !important}.text-danger{color:#ff4f39 !important}.text-warning{color:#ff821d !important}.text-info{color:#0aa !important}.text-white{color:white !important}.text-light{color:#8b969e !important}.text-lighter{color:#bec5c9 !important}.text-dark{color:#313539 !important}.text-inherit{color:inherit}.text-inherit:hover,.text-inherit:focus{color:inherit}.text-silver{color:#f0f2f4 !important}.text-silver-light{color:#f9fafb !important}.text-silver-dark{color:#e9ebef !important}.text-silver-darker{color:#e4e6eb !important}.text-silver-darkest{color:#dee0e6 !important}.bg-silver{background-color:#f0f2f4}.bg-silver-light{background-color:#f9fafb !important}.bg-silver-dark{background-color:#e9ebef !important}.bg-silver-darker{background-color:#e4e6eb !important}.bg-silver-darkest{background-color:#dee0e6 !important}.bg-transparent{background-color:transparent !important}.faint{opacity:.5}.fainter{opacity:.3}.inherit{color:inherit}::selection{background:#0bb;color:#fff}::-moz-selection{background:#0bb;color:#fff}img{display:block;max-width:100%}[data-bg]{background:transparent no-repeat 50% 50%/cover}body{font-size:1rem;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Oxygen,Ubuntu,Cantarell,\"Fira Sans\",\"Droid Sans\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;background:#f9fafb;color:#5e666c}*,dt,dd{line-height:calc(1em + .15 * (5rem - 1em));text-align:inherit}a,.a{cursor:pointer;color:#0bb;text-decoration:none}a:hover,a:focus,.a:hover,.a:focus{text-decoration:none;color:#009595}i,.i,em,.em{font-style:oblique}b,.b,strong,.strong{font-weight:bold}mark{background:#edfafa;color:#313539;padding:.1em 0;border-radius:4px}.normal{font-weight:normal !important}iframe{margin:0;display:block}label{margin:.5em 0;font-weight:normal}hr{margin:3em 0;border-top:1px solid rgba(0,30,60,0.075)}blockquote,ul,ol,p,.field,.table{margin:1.5em 0}h1,.h1,h2,.h2,h3,.h3,h4,.h4,h5,.h5,h6,.h6{margin:1.5em 0 .5em}ul,ol{padding-left:1.25em}dl dt+dd{margin-bottom:1em}blockquote{padding:0;font-size:inherit}small,.small,.text-small{font-size:.9285714286rem}h1,.h1,h2,.h2,h3,.h3,h4,.h4,h5,.h5,h6,.h6{font-weight:bold;letter-spacing:.01em}h5,.h5,h6,.h6,.text-base{font-size:1rem}h4,.h4,.text-large{font-size:1.1428571429rem}h3,.h3,.text-larger{font-size:1.2857142857rem}h1,.h1,h2,.h2,.text-largest{font-size:1.7142857143rem}.text-body{font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Oxygen,Ubuntu,Cantarell,\"Fira Sans\",\"Droid Sans\",\"Helvetica Neue\",Helvetica,Arial,sans-serif}.text-mono{font-family:\"Monaco\",monospace;font-size:.8571428571rem !important}.text-smallcaps{font-size:10px;text-transform:uppercase;letter-spacing:.1em;color:#8b969e;font-weight:bold;font-style:normal}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}@media (min-width: 961px){.text-center-large{text-align:center !important}.text-right-large{text-align:right !important}.text-left-large{text-align:left !important}}@media (max-width: 960px){.text-center-small{text-align:center !important}.text-right-small{text-align:right !important}.text-left-small{text-align:left !important}}@media (min-width: 401px){.nowrap{white-space:nowrap}}.condensed{white-space:nowrap;width:1px}.ellipsis{width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wrap{white-space:normal}.break{word-break:break-word}.buffer,.card,.title,.tokens,.settings{margin-top:20px;margin-bottom:20px}*:first-child{margin-top:0}*:last-child{margin-bottom:0}.margin-right{margin-right:.75em !important}.margin-left{margin-left:.75em !important}.margin-right-small{margin-right:.375em !important}.margin-left-small{margin-left:.375em !important}.icn{font-size:16px;top:-1px;width:1em;height:1em;margin:auto;display:inline-block;vertical-align:middle;-webkit-backface-visibility:hidden;-webkit-transform:translateZ(0);transform:translateZ(0)}.icn use{fill:currentColor}.icn-md{width:1.5em;height:1.5em;-webkit-transform:scale(1.5);transform:scale(1.5);-webkit-transform-origin:0 0;transform-origin:0 0}.icn-lg{width:2em;height:2em;-webkit-transform:scale(2);transform:scale(2);-webkit-transform-origin:0 0;transform-origin:0 0}.glyph{top:-1px;margin:auto;font-size:24px;display:inline-block;vertical-align:middle;transform:translate(0, 0);width:1em;height:1em}.glyph use{fill:none;stroke-width:2;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;transform-origin:0 0;shape-rendering:geometricPrecision}.glyph-solid use{fill:currentColor;stroke-width:0 !important}.glyph-middle,.btn .glyph{margin-top:-10px;margin-bottom:-8px}.glyph-before{margin-right:.25em;margin-left:-.125em}.glyph-after{margin-left:.25em;margin-right:-.125em}.glyph-sm{font-size:16px}.glyph-sm use{stroke-width:3}@media (-webkit-min-device-pixel-ratio: 1.25), (min-device-pixel-ratio: 1.25){.glyph-sm use{stroke-width:2.25}}.glyph-md{font-size:36px}.glyph-md use{stroke-width:1.3333333333}@media (-webkit-min-device-pixel-ratio: 1.25), (min-device-pixel-ratio: 1.25){.glyph-md use{stroke-width:1}}.glyph-lg{font-size:48px}.glyph-lg use{stroke-width:1}@media (-webkit-min-device-pixel-ratio: 1.25), (min-device-pixel-ratio: 1.25){.glyph-lg use{stroke-width:.75}}.glyph-xl{font-size:72px}.glyph-xl use{stroke-width:.6666666667}@media (-webkit-min-device-pixel-ratio: 1.25), (min-device-pixel-ratio: 1.25){.glyph-xl use{stroke-width:.5}}.glyph-check,.glyph-radio{font-size:18px;border:2px solid currentColor;opacity:.25}.glyph-check use,.glyph-radio use{opacity:0}:hover>.glyph-check,:focus ~ .glyph-check,:hover>.glyph-radio,:focus ~ .glyph-radio{opacity:.5}:checked ~ .glyph-check,:disabled ~ .glyph-check,[type=\"checkbox\"]:indeterminate ~ .glyph-check,:checked ~ .glyph-radio,:disabled ~ .glyph-radio,[type=\"checkbox\"]:indeterminate ~ .glyph-radio{border-color:transparent !important}:checked ~ .glyph-check,[type=\"checkbox\"]:indeterminate ~ .glyph-check,:checked ~ .glyph-radio,[type=\"checkbox\"]:indeterminate ~ .glyph-radio{opacity:1;background:#0bb}:checked ~ .glyph-check use,[type=\"checkbox\"]:indeterminate ~ .glyph-check use,:checked ~ .glyph-radio use,[type=\"checkbox\"]:indeterminate ~ .glyph-radio use{opacity:1;color:white}:checked:hover ~ .glyph-check,:checked:focus ~ .glyph-check,[type=\"checkbox\"]:indeterminate:hover ~ .glyph-check,[type=\"checkbox\"]:indeterminate:focus ~ .glyph-check,:hover>:checked ~ .glyph-check,:focus>:checked ~ .glyph-check,:checked:hover ~ .glyph-radio,:checked:focus ~ .glyph-radio,[type=\"checkbox\"]:indeterminate:hover ~ .glyph-radio,[type=\"checkbox\"]:indeterminate:focus ~ .glyph-radio,:hover>:checked ~ .glyph-radio,:focus>:checked ~ .glyph-radio{background:#009595}[type=\"checkbox\"]:indeterminate ~ .glyph-check use,[type=\"checkbox\"]:indeterminate ~ .glyph-radio use{fill:currentColor;stroke:transparent}:disabled ~ .glyph-check,:checked:disabled ~ .glyph-check,[type=\"checkbox\"]:indeterminate:disabled ~ .glyph-check,:disabled ~ .glyph-radio,:checked:disabled ~ .glyph-radio,[type=\"checkbox\"]:indeterminate:disabled ~ .glyph-radio{opacity:.5;background:#dee0e6;color:inherit}:disabled ~ .glyph-check use,:checked:disabled ~ .glyph-check use,[type=\"checkbox\"]:indeterminate:disabled ~ .glyph-check use,:disabled ~ .glyph-radio use,:checked:disabled ~ .glyph-radio use,[type=\"checkbox\"]:indeterminate:disabled ~ .glyph-radio use{color:inherit}.glyph-radio{border-radius:50%}.glyph-radio use{fill:currentColor}.glyph-check{border-radius:4px}select:not([multiple]).form-control{background-size:.75em .75em;background-repeat:no-repeat;background-image:url(` + u(e(215)) + `);background-position:calc( 100% - .875em ) 50%;padding-top:0;padding-bottom:0;padding-right:2.25em}select:not([multiple]).form-control::-ms-value{background:transparent !important}.bootstrap-select button{background-repeat:no-repeat;background-size:auto 1em;background-position:calc(100% - 1.25rem + 5px) 50%;background-image:url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE2IDE2Ij48cG9seWxpbmUgcG9pbnRzPSI0LjUgNiA4IDkuNSAxMS41IDYiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwOTRiMyIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiAvPjxyZWN0IHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSIvPjwvc3ZnPg==\");padding-right:2em !important;-moz-appearance:none}.bootstrap-select button.input-sm,.bootstrap-select .input-group-sm>button.form-control,.bootstrap-select .input-group-sm>button.input-group-addon,.bootstrap-select .input-group-sm>.input-group-btn>button.btn,.bootstrap-select button.sm{background-position:calc(100% - .875rem + 5px) 50%}.bootstrap-select button.input-lg,.bootstrap-select .input-group-lg>button.form-control,.bootstrap-select .input-group-lg>button.input-group-addon,.bootstrap-select .input-group-lg>.input-group-btn>button.btn,.bootstrap-select button.lg{background-position:calc(100% - 1.875rem + 5px) 50%}.bootstrap-select button::-ms-expand{display:none}.btn input,.form-control input,.option input{position:absolute;opacity:0}.option{margin:0}.option:not(.input-group-addon){padding-left:0 !important}.option-flush{padding-left:0 !important;padding-right:0 !important}.option.input-group-addon{padding-left:.875rem;padding-right:.875rem}.option .glyph{margin-right:.375em}/*! jQuery UI - v1.12.1 - 2017-01-20\n* http://jqueryui.com\n* Copyright jQuery Foundation and other contributors; Licensed MIT */.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:\"\";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default !important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url(\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup>.ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup>.ui-controlgroup-item:focus,.ui-controlgroup>.ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical>.ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label+.ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label+.ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url(\"data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==\");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-widget{font-size:1rem;box-shadow:0 0 0 1px rgba(0,30,60,0.03),0 20px 20px -10px rgba(0,0,0,0.2);background:#fff;border-radius:4px;z-index:1050 !important;border-width:0}.ui-widget .ui-state-active,.ui-widget .ui-state-focus{margin:0;background:#0bb}.ui-widget .ui-state-active,.ui-widget .ui-state-active *,.ui-widget .ui-state-focus,.ui-widget .ui-state-focus *{color:#fff}.ui-widget.ui-datepicker{padding-left:10px;padding-right:10px;-webkit-transition:all 0.1875s cubic-bezier(0.25, 0, 0, 1.375);-o-transition:all 0.1875s cubic-bezier(0.25, 0, 0, 1.375);transition:all 0.1875s cubic-bezier(0.25, 0, 0, 1.375);-webkit-transform:scale(0.75);transform:scale(0.75);-webkit-transition-property:opacity, -webkit-transform;transition-property:opacity, transform}.ui-widget.ui-datepicker.ui-widget-active{-webkit-transform:scale(1);transform:scale(1);-webkit-transform-origin:50% 0;transform-origin:50% 0}.ui-widget.ui-datepicker .ui-datepicker-prev{top:2px !important;left:2px !important}.ui-widget.ui-datepicker .ui-datepicker-next{top:2px !important;right:2px !important}.ui-widget.ui-datepicker .ui-datepicker-month{font-weight:bold}.ui-widget.ui-datepicker tr>* a{text-align:center}.ui-widget.ui-datepicker td a{padding:.3em}.ui-widget.ui-autocomplete{padding:5px 0;max-height:240px;overflow:auto}.ui-widget.ui-autocomplete li{border:0;padding:0}.ui-widget.ui-autocomplete li .ui-menu-item-wrapper{padding:.4464285714rem 1.25rem}.ui-widget.ui-autocomplete li *{margin-top:0;margin-bottom:0}.ui-widget.ui-autocomplete li+li.ui-separator{margin-top:5px;padding-top:6px;border-top:1px solid rgba(0,30,60,0.075)}.ui-widget .ui-icon{overflow:visible}.ui-widget .ui-icon-circle-triangle-w:after,.ui-widget .ui-icon-circle-triangle-e:after{content:'';display:block;border:5px solid;border-top-color:transparent;border-bottom-color:transparent;position:absolute;width:0;height:0;top:5px;left:0}.ui-widget .ui-icon-circle-triangle-w:after{border-left-color:transparent}.ui-widget .ui-icon-circle-triangle-e:after{border-right-color:transparent;left:5px}.ui-sortable-handle,.ui-draggable-handle{cursor:move}tr.ui-sortable-helper{box-shadow:0 7px 10px rgba(0,0,0,0.2);border-radius:4px;display:table;z-index:2}tr.ui-sortable-helper>td,tr.ui-sortable-helper th{border:0 !important}tr.ui-sortable-helper>td:first-child,tr.ui-sortable-helper th:first-child{border-top-left-radius:4px;border-bottom-left-radius:4px}tr.ui-sortable-helper>td:last-child,tr.ui-sortable-helper th:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px}.ui-draggable-dragging,.ui-sortable-sorting{z-index:5001 !important}.ui-resizable-n,.ui-resizable-s{cursor:ns-resize}.ui-resizable-e,.ui-resizable-w{cursor:ew-resize}.caret,.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border:0 !important;margin-left:0;width:auto;height:auto;display:inline}.caret:after,.dropup .caret:after,.navbar-fixed-bottom .dropdown .caret:after{font-family:\"arrows\";text-transform:none;font-style:normal;font-weight:normal;line-height:.5;content:\" c \"}.dropdown-menu{-webkit-transform:scale(0.75);transform:scale(0.75);-webkit-transform-origin:50% 0;transform-origin:50% 0;-webkit-transition:all 0.1875s cubic-bezier(0.25, 0, 0, 1.375);-o-transition:all 0.1875s cubic-bezier(0.25, 0, 0, 1.375);transition:all 0.1875s cubic-bezier(0.25, 0, 0, 1.375);font-size:1rem;box-shadow:0 0 0 1px rgba(0,30,60,0.03),0 20px 20px -10px rgba(0,0,0,0.2);border-radius:4px !important;-webkit-transition-property:opacity, -webkit-transform;transition-property:opacity, transform;padding:5px 0 !important;pointer-events:none;font-style:normal;border-width:0;display:block;left:-9999px;max-height:50vh;min-width:100%;max-width:240px;overflow:auto;opacity:0;margin:0}.dropdown-menu>li>a{margin:0;display:block;padding:.25em 15px}.dropdown-menu>li>a>*{margin:0}.dropdown-menu>li>a em{font-style:oblique;color:#8b969e}.dropdown-menu>li>a [data-icon]{margin-right:.25em}.dropdown-menu .divider{margin:5px 0}.dropdown-menu .dropdown-header{text-transform:uppercase;letter-spacing:.15em;font-size:.75rem;font-weight:500;padding:.5em 15px !important}.dropdown-menu-lg>li>*{padding-top:.5em;padding-bottom:.5em}.dropdown-menu-right{left:auto;right:9999px}.dropdown.open>.dropdown-menu{pointer-events:auto;-webkit-transform:scale(1);transform:scale(1);opacity:1;left:0}.dropdown.open>.dropdown-menu-right{right:0;left:auto}.dropdown{cursor:pointer}.dropdown-inline{display:inline-block}.form-group>*:not(:last-child),.form-inline>*:not(:last-child){margin-right:1em}.form-horizontal .form-group>*:not(:last-child),.form-horizontal .form-inline>*:not(:last-child){margin-right:0}.form-group>* label,.form-inline>* label{vertical-align:middle;margin:.6785714286rem 0}.help-block{display:block;color:#8b969e;font-style:oblique;font-weight:normal;font-size:.9285714286rem;margin:.25em 0}.help-block:empty{display:none}.help-block p{margin:0;display:inline}.help-block-inline{display:inline}.form-group-lg{font-size:1.1428571429rem}.form-footer{margin:2em 0}.form-footer:first-child{margin-top:0}.form-footer:last-child{margin-bottom:0}.btn{border-width:0;margin:0;cursor:pointer;overflow:hidden;text-overflow:ellipsis;font-size:1rem;-webkit-transition:all .25s cubic-bezier(0.25, 0, 0, 1);-o-transition:all .25s cubic-bezier(0.25, 0, 0, 1);transition:all .25s cubic-bezier(0.25, 0, 0, 1);height:2.8571428571rem;line-height:1.5 !important;font-weight:bold;box-shadow:0 0 0 1px rgba(0,30,60,0.03),0 3px 3px -1.5px rgba(0,0,0,0.03)}.btn-red{color:#fff;background-color:#ff694b;border-color:#ff694b}.btn-red:focus,.btn-red.focus{color:#fff;background-color:#ff3c2b}.btn-red:hover{color:#fff;background-color:#ff3c2b}.btn-red:active,.btn-red.active,.open>.btn-red.dropdown-toggle{color:#fff;background-color:#ff3c2b}.btn-red:active:hover,.btn-red:active:focus,.btn-red:active.focus,.btn-red.active:hover,.btn-red.active:focus,.btn-red.active.focus,.open>.btn-red.dropdown-toggle:hover,.open>.btn-red.dropdown-toggle:focus,.open>.btn-red.dropdown-toggle.focus{color:#fff;background-color:#ff3c2b}.btn-red:active,.btn-red.active,.open>.btn-red.dropdown-toggle{background-image:none}.btn-red.disabled:hover,.btn-red.disabled:focus,.btn-red.disabled.focus,.btn-red[disabled]:hover,.btn-red[disabled]:focus,.btn-red[disabled].focus,fieldset[disabled] .btn-red:hover,fieldset[disabled] .btn-red:focus,fieldset[disabled] .btn-red.focus{background-color:#ff694b;border-color:#ff694b}.btn-red .badge{color:#ff694b;background-color:#fff}.btn-blue{color:#fff;background-color:#0bb;border-color:#0bb}.btn-blue:focus,.btn-blue.focus{color:#fff;background-color:#009595}.btn-blue:hover{color:#fff;background-color:#009595}.btn-blue:active,.btn-blue.active,.open>.btn-blue.dropdown-toggle{color:#fff;background-color:#009595}.btn-blue:active:hover,.btn-blue:active:focus,.btn-blue:active.focus,.btn-blue.active:hover,.btn-blue.active:focus,.btn-blue.active.focus,.open>.btn-blue.dropdown-toggle:hover,.open>.btn-blue.dropdown-toggle:focus,.open>.btn-blue.dropdown-toggle.focus{color:#fff;background-color:#009595}.btn-blue:active,.btn-blue.active,.open>.btn-blue.dropdown-toggle{background-image:none}.btn-blue.disabled:hover,.btn-blue.disabled:focus,.btn-blue.disabled.focus,.btn-blue[disabled]:hover,.btn-blue[disabled]:focus,.btn-blue[disabled].focus,fieldset[disabled] .btn-blue:hover,fieldset[disabled] .btn-blue:focus,fieldset[disabled] .btn-blue.focus{background-color:#0bb;border-color:#0bb}.btn-blue .badge{color:#0bb;background-color:#fff}.btn-navy{color:#fff;background-color:#005e7a;border-color:#005e7a}.btn-navy:focus,.btn-navy.focus{color:#fff;background-color:#003645}.btn-navy:hover{color:#fff;background-color:#003645}.btn-navy:active,.btn-navy.active,.open>.btn-navy.dropdown-toggle{color:#fff;background-color:#003645}.btn-navy:active:hover,.btn-navy:active:focus,.btn-navy:active.focus,.btn-navy.active:hover,.btn-navy.active:focus,.btn-navy.active.focus,.open>.btn-navy.dropdown-toggle:hover,.open>.btn-navy.dropdown-toggle:focus,.open>.btn-navy.dropdown-toggle.focus{color:#fff;background-color:#003645}.btn-navy:active,.btn-navy.active,.open>.btn-navy.dropdown-toggle{background-image:none}.btn-navy.disabled:hover,.btn-navy.disabled:focus,.btn-navy.disabled.focus,.btn-navy[disabled]:hover,.btn-navy[disabled]:focus,.btn-navy[disabled].focus,fieldset[disabled] .btn-navy:hover,fieldset[disabled] .btn-navy:focus,fieldset[disabled] .btn-navy.focus{background-color:#005e7a;border-color:#005e7a}.btn-navy .badge{color:#005e7a;background-color:#fff}.btn-green{color:#fff;background-color:#7ec631;border-color:#7ec631}.btn-green:focus,.btn-green.focus{color:#fff;background-color:#48a71c}.btn-green:hover{color:#fff;background-color:#48a71c}.btn-green:active,.btn-green.active,.open>.btn-green.dropdown-toggle{color:#fff;background-color:#48a71c}.btn-green:active:hover,.btn-green:active:focus,.btn-green:active.focus,.btn-green.active:hover,.btn-green.active:focus,.btn-green.active.focus,.open>.btn-green.dropdown-toggle:hover,.open>.btn-green.dropdown-toggle:focus,.open>.btn-green.dropdown-toggle.focus{color:#fff;background-color:#48a71c}.btn-green:active,.btn-green.active,.open>.btn-green.dropdown-toggle{background-image:none}.btn-green.disabled:hover,.btn-green.disabled:focus,.btn-green.disabled.focus,.btn-green[disabled]:hover,.btn-green[disabled]:focus,.btn-green[disabled].focus,fieldset[disabled] .btn-green:hover,fieldset[disabled] .btn-green:focus,fieldset[disabled] .btn-green.focus{background-color:#7ec631;border-color:#7ec631}.btn-green .badge{color:#7ec631;background-color:#fff}.btn-orange{color:#fff;background-color:#ff694b;border-color:#ff694b}.btn-orange:focus,.btn-orange.focus{color:#fff;background-color:#ff3c2b}.btn-orange:hover{color:#fff;background-color:#ff3c2b}.btn-orange:active,.btn-orange.active,.open>.btn-orange.dropdown-toggle{color:#fff;background-color:#ff3c2b}.btn-orange:active:hover,.btn-orange:active:focus,.btn-orange:active.focus,.btn-orange.active:hover,.btn-orange.active:focus,.btn-orange.active.focus,.open>.btn-orange.dropdown-toggle:hover,.open>.btn-orange.dropdown-toggle:focus,.open>.btn-orange.dropdown-toggle.focus{color:#fff;background-color:#ff3c2b}.btn-orange:active,.btn-orange.active,.open>.btn-orange.dropdown-toggle{background-image:none}.btn-orange.disabled:hover,.btn-orange.disabled:focus,.btn-orange.disabled.focus,.btn-orange[disabled]:hover,.btn-orange[disabled]:focus,.btn-orange[disabled].focus,fieldset[disabled] .btn-orange:hover,fieldset[disabled] .btn-orange:focus,fieldset[disabled] .btn-orange.focus{background-color:#ff694b;border-color:#ff694b}.btn-orange .badge{color:#ff694b;background-color:#fff}.btn-yellow{color:#fff;background-color:#fc0;border-color:#fc0}.btn-yellow:focus,.btn-yellow.focus{color:#fff;background-color:#ffb100}.btn-yellow:hover{color:#fff;background-color:#ffb100}.btn-yellow:active,.btn-yellow.active,.open>.btn-yellow.dropdown-toggle{color:#fff;background-color:#ffb100}.btn-yellow:active:hover,.btn-yellow:active:focus,.btn-yellow:active.focus,.btn-yellow.active:hover,.btn-yellow.active:focus,.btn-yellow.active.focus,.open>.btn-yellow.dropdown-toggle:hover,.open>.btn-yellow.dropdown-toggle:focus,.open>.btn-yellow.dropdown-toggle.focus{color:#fff;background-color:#ffb100}.btn-yellow:active,.btn-yellow.active,.open>.btn-yellow.dropdown-toggle{background-image:none}.btn-yellow.disabled:hover,.btn-yellow.disabled:focus,.btn-yellow.disabled.focus,.btn-yellow[disabled]:hover,.btn-yellow[disabled]:focus,.btn-yellow[disabled].focus,fieldset[disabled] .btn-yellow:hover,fieldset[disabled] .btn-yellow:focus,fieldset[disabled] .btn-yellow.focus{background-color:#fc0;border-color:#fc0}.btn-yellow .badge{color:#fc0;background-color:#fff}.btn-purple{color:#fff;background-color:#7f6cc5;border-color:#7f6cc5}.btn-purple:focus,.btn-purple.focus{color:#fff;background-color:#483da5}.btn-purple:hover{color:#fff;background-color:#483da5}.btn-purple:active,.btn-purple.active,.open>.btn-purple.dropdown-toggle{color:#fff;background-color:#483da5}.btn-purple:active:hover,.btn-purple:active:focus,.btn-purple:active.focus,.btn-purple.active:hover,.btn-purple.active:focus,.btn-purple.active.focus,.open>.btn-purple.dropdown-toggle:hover,.open>.btn-purple.dropdown-toggle:focus,.open>.btn-purple.dropdown-toggle.focus{color:#fff;background-color:#483da5}.btn-purple:active,.btn-purple.active,.open>.btn-purple.dropdown-toggle{background-image:none}.btn-purple.disabled:hover,.btn-purple.disabled:focus,.btn-purple.disabled.focus,.btn-purple[disabled]:hover,.btn-purple[disabled]:focus,.btn-purple[disabled].focus,fieldset[disabled] .btn-purple:hover,fieldset[disabled] .btn-purple:focus,fieldset[disabled] .btn-purple.focus{background-color:#7f6cc5;border-color:#7f6cc5}.btn-purple .badge{color:#7f6cc5;background-color:#fff}.btn-white{color:#484e53;background-color:#fff;border-color:#fff}.btn-white:focus,.btn-white.focus{color:#484e53;background-color:#f9fafb}.btn-white:hover{color:#484e53;background-color:#f9fafb}.btn-white:active,.btn-white.active,.open>.btn-white.dropdown-toggle{color:#484e53;background-color:#f9fafb}.btn-white:active:hover,.btn-white:active:focus,.btn-white:active.focus,.btn-white.active:hover,.btn-white.active:focus,.btn-white.active.focus,.open>.btn-white.dropdown-toggle:hover,.open>.btn-white.dropdown-toggle:focus,.open>.btn-white.dropdown-toggle.focus{color:#484e53;background-color:#f9fafb}.btn-white:active,.btn-white.active,.open>.btn-white.dropdown-toggle{background-image:none}.btn-white.disabled:hover,.btn-white.disabled:focus,.btn-white.disabled.focus,.btn-white[disabled]:hover,.btn-white[disabled]:focus,.btn-white[disabled].focus,fieldset[disabled] .btn-white:hover,fieldset[disabled] .btn-white:focus,fieldset[disabled] .btn-white.focus{background-color:#fff;border-color:#fff}.btn-white .badge{color:#fff;background-color:#484e53}.btn-default{color:#484e53;background-color:#f0f2f4;border-color:#f0f2f4}.btn-default:focus,.btn-default.focus{color:#484e53;background-color:#e9ebef}.btn-default:hover{color:#484e53;background-color:#e9ebef}.btn-default:active,.btn-default.active,.open>.btn-default.dropdown-toggle{color:#484e53;background-color:#e9ebef}.btn-default:active:hover,.btn-default:active:focus,.btn-default:active.focus,.btn-default.active:hover,.btn-default.active:focus,.btn-default.active.focus,.open>.btn-default.dropdown-toggle:hover,.open>.btn-default.dropdown-toggle:focus,.open>.btn-default.dropdown-toggle.focus{color:#484e53;background-color:#e9ebef}.btn-default:active,.btn-default.active,.open>.btn-default.dropdown-toggle{background-image:none}.btn-default.disabled:hover,.btn-default.disabled:focus,.btn-default.disabled.focus,.btn-default[disabled]:hover,.btn-default[disabled]:focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default:hover,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default.focus{background-color:#f0f2f4;border-color:#f0f2f4}.btn-default .badge{color:#f0f2f4;background-color:#484e53}.btn-clear,.btn-text,.btn-link{background:transparent !important}.btn-text,.btn.text-inherit{color:inherit}.btn-text:hover,.btn-text:focus,.btn.text-inherit:hover,.btn.text-inherit:focus{color:inherit}.btn[class*=\"btn-highlight\"],.btn-default,.btn-clear,.btn-text,.btn-link{box-shadow:none}.btn-highlight-info{color:#0aa;background-color:#edfafa;border-color:transparent}.btn-highlight-info:focus,.btn-highlight-info.focus{color:#0aa;background-color:#e4f8f8}.btn-highlight-info:hover{color:#0aa;background-color:#e4f8f8}.btn-highlight-info:active,.btn-highlight-info.active,.open>.btn-highlight-info.dropdown-toggle{color:#0aa;background-color:#e4f8f8}.btn-highlight-info:active:hover,.btn-highlight-info:active:focus,.btn-highlight-info:active.focus,.btn-highlight-info.active:hover,.btn-highlight-info.active:focus,.btn-highlight-info.active.focus,.open>.btn-highlight-info.dropdown-toggle:hover,.open>.btn-highlight-info.dropdown-toggle:focus,.open>.btn-highlight-info.dropdown-toggle.focus{color:#0aa;background-color:#e4f8f8}.btn-highlight-info:active,.btn-highlight-info.active,.open>.btn-highlight-info.dropdown-toggle{background-image:none}.btn-highlight-info.disabled:hover,.btn-highlight-info.disabled:focus,.btn-highlight-info.disabled.focus,.btn-highlight-info[disabled]:hover,.btn-highlight-info[disabled]:focus,.btn-highlight-info[disabled].focus,fieldset[disabled] .btn-highlight-info:hover,fieldset[disabled] .btn-highlight-info:focus,fieldset[disabled] .btn-highlight-info.focus{background-color:#edfafa;border-color:transparent}.btn-highlight-info .badge{color:#edfafa;background-color:#0aa}.btn-highlight-success{color:#48a71c;background-color:#f3faec;border-color:transparent}.btn-highlight-success:focus,.btn-highlight-success.focus{color:#48a71c;background-color:#edf8e3}.btn-highlight-success:hover{color:#48a71c;background-color:#edf8e3}.btn-highlight-success:active,.btn-highlight-success.active,.open>.btn-highlight-success.dropdown-toggle{color:#48a71c;background-color:#edf8e3}.btn-highlight-success:active:hover,.btn-highlight-success:active:focus,.btn-highlight-success:active.focus,.btn-highlight-success.active:hover,.btn-highlight-success.active:focus,.btn-highlight-success.active.focus,.open>.btn-highlight-success.dropdown-toggle:hover,.open>.btn-highlight-success.dropdown-toggle:focus,.open>.btn-highlight-success.dropdown-toggle.focus{color:#48a71c;background-color:#edf8e3}.btn-highlight-success:active,.btn-highlight-success.active,.open>.btn-highlight-success.dropdown-toggle{background-image:none}.btn-highlight-success.disabled:hover,.btn-highlight-success.disabled:focus,.btn-highlight-success.disabled.focus,.btn-highlight-success[disabled]:hover,.btn-highlight-success[disabled]:focus,.btn-highlight-success[disabled].focus,fieldset[disabled] .btn-highlight-success:hover,fieldset[disabled] .btn-highlight-success:focus,fieldset[disabled] .btn-highlight-success.focus{background-color:#f3faec;border-color:transparent}.btn-highlight-success .badge{color:#f3faec;background-color:#48a71c}.btn-highlight-danger{color:#ff694b;background-color:#fff5f4;border-color:transparent}.btn-highlight-danger:focus,.btn-highlight-danger.focus{color:#ff694b;background-color:#fff0ef}.btn-highlight-danger:hover{color:#ff694b;background-color:#fff0ef}.btn-highlight-danger:active,.btn-highlight-danger.active,.open>.btn-highlight-danger.dropdown-toggle{color:#ff694b;background-color:#fff0ef}.btn-highlight-danger:active:hover,.btn-highlight-danger:active:focus,.btn-highlight-danger:active.focus,.btn-highlight-danger.active:hover,.btn-highlight-danger.active:focus,.btn-highlight-danger.active.focus,.open>.btn-highlight-danger.dropdown-toggle:hover,.open>.btn-highlight-danger.dropdown-toggle:focus,.open>.btn-highlight-danger.dropdown-toggle.focus{color:#ff694b;background-color:#fff0ef}.btn-highlight-danger:active,.btn-highlight-danger.active,.open>.btn-highlight-danger.dropdown-toggle{background-image:none}.btn-highlight-danger.disabled:hover,.btn-highlight-danger.disabled:focus,.btn-highlight-danger.disabled.focus,.btn-highlight-danger[disabled]:hover,.btn-highlight-danger[disabled]:focus,.btn-highlight-danger[disabled].focus,fieldset[disabled] .btn-highlight-danger:hover,fieldset[disabled] .btn-highlight-danger:focus,fieldset[disabled] .btn-highlight-danger.focus{background-color:#fff5f4;border-color:transparent}.btn-highlight-danger .badge{color:#fff5f4;background-color:#ff694b}.btn-highlight-warning{color:#ff6316;background-color:#fff6ec;border-color:transparent}.btn-highlight-warning:focus,.btn-highlight-warning.focus{color:#ff6316;background-color:#fff2e3}.btn-highlight-warning:hover{color:#ff6316;background-color:#fff2e3}.btn-highlight-warning:active,.btn-highlight-warning.active,.open>.btn-highlight-warning.dropdown-toggle{color:#ff6316;background-color:#fff2e3}.btn-highlight-warning:active:hover,.btn-highlight-warning:active:focus,.btn-highlight-warning:active.focus,.btn-highlight-warning.active:hover,.btn-highlight-warning.active:focus,.btn-highlight-warning.active.focus,.open>.btn-highlight-warning.dropdown-toggle:hover,.open>.btn-highlight-warning.dropdown-toggle:focus,.open>.btn-highlight-warning.dropdown-toggle.focus{color:#ff6316;background-color:#fff2e3}.btn-highlight-warning:active,.btn-highlight-warning.active,.open>.btn-highlight-warning.dropdown-toggle{background-image:none}.btn-highlight-warning.disabled:hover,.btn-highlight-warning.disabled:focus,.btn-highlight-warning.disabled.focus,.btn-highlight-warning[disabled]:hover,.btn-highlight-warning[disabled]:focus,.btn-highlight-warning[disabled].focus,fieldset[disabled] .btn-highlight-warning:hover,fieldset[disabled] .btn-highlight-warning:focus,fieldset[disabled] .btn-highlight-warning.focus{background-color:#fff6ec;border-color:transparent}.btn-highlight-warning .badge{color:#fff6ec;background-color:#ff6316}.btn-lg,.btn-group-lg>.btn{height:4.2857142857rem;font-size:1.1428571429rem}.btn-sm,.btn-group-sm>.btn{height:2.2857142857rem;font-size:.9285714286rem}.btn-xs,.btn-group-xs>.btn{padding:.1607142857rem .625rem;height:1.7142857143rem;font-size:.9285714286rem}.btn-md{padding:.3928571429rem 1.5rem;height:3.7142857143rem;font-size:1rem}.btn-pill{border-radius:200px }.btn-icon{padding-left:0;padding-right:0;width:2.8571428571rem;min-width:2.8571428571rem}.btn-icon.btn-xs,.btn-group-xs>.btn-icon.btn{width:1.7142857143rem;min-width:1.7142857143rem}.btn-icon.btn-sm,.btn-group-sm>.btn-icon.btn{width:2.2857142857rem;min-width:2.2857142857rem}.btn-icon.btn-md{width:3.7142857143rem;min-width:3.7142857143rem}.btn-icon.btn-lg,.btn-group-lg>.btn-icon.btn{width:4.2857142857rem;min-width:4.2857142857rem}.btn-icon .icon,.btn-icon .glyph{margin:0;position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%)}.btn-icon-slim{min-width:0}.btn-block,.btn-slim,.btn-link,.btn-text{padding-left:0;padding-right:0}.btn.active,.btn:active{-webkit-box-shadow:none;box-shadow:none}.btn.disabled,.btn[disabled]{opacity:.375}.btn-file:before{content:attr(data-placeholder)}.btn-file[data-value]:before{content:attr(data-placeholder) \" \"}.btn-file[data-value]:after{content:\"(\" attr(data-value) \")\"}.btn-file input{position:absolute;opacity:0}.btn-inliner .btn{margin-bottom:.3rem}.btn-toolbar{margin-left:-2px;margin-right:-2px;font-size:0}.btn-toolbar .btn-group{margin-left:2px;margin-right:2px;float:none}.form-control,.input-group-addon,.form-control-static,.form-grid .form-row .form-label label,.option{line-height:1.5 !important;border-width:0 !important;font-size:1rem}.form-group-lg .form-control,.input-group-lg .form-control,.form-group-lg .input-group-addon,.input-group-lg .input-group-addon,.form-group-lg .form-control-static,.form-group-lg .form-grid .form-row .form-label label,.form-grid .form-row .form-label .form-group-lg label,.input-group-lg .form-control-static,.input-group-lg .form-grid .form-row .form-label label,.form-grid .form-row .form-label .input-group-lg label,.form-group-lg .option,.input-group-lg .option{font-size:1.1428571429rem}.form-group-sm .form-control,.input-group-sm .form-control,.form-group-sm .input-group-addon,.input-group-sm .input-group-addon,.form-group-sm .form-control-static,.form-group-sm .form-grid .form-row .form-label label,.form-grid .form-row .form-label .form-group-sm label,.input-group-sm .form-control-static,.input-group-sm .form-grid .form-row .form-label label,.form-grid .form-row .form-label .input-group-sm label,.form-group-sm .option,.input-group-sm .option{font-size:.9285714286rem}.form-control.input-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-btn>.form-control.btn,.input-group-addon.input-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn,.form-control-static.input-lg,.input-group-lg>.form-control-static.form-control,.form-grid .form-row .form-label .input-group-lg>label.form-control,.input-group-lg>.form-control-static.input-group-addon,.form-grid .form-row .form-label .input-group-lg>label.input-group-addon,.input-group-lg>.input-group-btn>.form-control-static.btn,.form-grid .form-row .form-label .input-group-lg>.input-group-btn>label.btn,.form-grid .form-row .form-label label.input-lg,.option.input-lg,.input-group-lg>.option.form-control,.input-group-lg>.option.input-group-addon,.input-group-lg>.input-group-btn>.option.btn{font-size:1.1428571429rem}.form-control.input-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-btn>.form-control.btn,.input-group-addon.input-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn,.form-control-static.input-sm,.input-group-sm>.form-control-static.form-control,.form-grid .form-row .form-label .input-group-sm>label.form-control,.input-group-sm>.form-control-static.input-group-addon,.form-grid .form-row .form-label .input-group-sm>label.input-group-addon,.input-group-sm>.input-group-btn>.form-control-static.btn,.form-grid .form-row .form-label .input-group-sm>.input-group-btn>label.btn,.form-grid .form-row .form-label label.input-sm,.option.input-sm,.input-group-sm>.option.form-control,.input-group-sm>.option.input-group-addon,.input-group-sm>.input-group-btn>.option.btn{font-size:.9285714286rem}.form-control::-ms-expand,.input-group-addon::-ms-expand,.form-control-static::-ms-expand,.form-grid .form-row .form-label label::-ms-expand,.option::-ms-expand{display:none}.form-control::-ms-clear,.input-group-addon::-ms-clear,.form-control-static::-ms-clear,.form-grid .form-row .form-label label::-ms-clear,.option::-ms-clear{display:none}.form-control::-ms-value,.input-group-addon::-ms-value,.form-control-static::-ms-value,.form-grid .form-row .form-label label::-ms-value,.option::-ms-value{background:transparent !important}.form-control,.form-control-static,.form-grid .form-row .form-label label,textarea.form-control,.option{height:2.8571428571rem;line-height:1.5 !important;padding:.6785714286rem 1.25rem;border:0}.form-control.input-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-btn>.form-control.btn,.form-control-static.input-sm,.input-group-sm>.form-control-static.form-control,.form-grid .form-row .form-label .input-group-sm>label.form-control,.input-group-sm>.form-control-static.input-group-addon,.form-grid .form-row .form-label .input-group-sm>label.input-group-addon,.input-group-sm>.input-group-btn>.form-control-static.btn,.form-grid .form-row .form-label .input-group-sm>.input-group-btn>label.btn,.form-grid .form-row .form-label label.input-sm,textarea.form-control.input-sm,.input-group-sm>textarea.form-control,.input-group-sm>.input-group-btn>textarea.form-control.btn,.option.input-sm,.input-group-sm>.option.form-control,.input-group-sm>.option.input-group-addon,.input-group-sm>.input-group-btn>.option.btn{height:2.2857142857rem;min-height:2.2857142857rem;padding:.4464285714rem .875rem}.form-control.input-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-btn>.form-control.btn,.form-control-static.input-lg,.input-group-lg>.form-control-static.form-control,.form-grid .form-row .form-label .input-group-lg>label.form-control,.input-group-lg>.form-control-static.input-group-addon,.form-grid .form-row .form-label .input-group-lg>label.input-group-addon,.input-group-lg>.input-group-btn>.form-control-static.btn,.form-grid .form-row .form-label .input-group-lg>.input-group-btn>label.btn,.form-grid .form-row .form-label label.input-lg,textarea.form-control.input-lg,.input-group-lg>textarea.form-control,.input-group-lg>.input-group-btn>textarea.form-control.btn,.option.input-lg,.input-group-lg>.option.form-control,.input-group-lg>.option.input-group-addon,.input-group-lg>.input-group-btn>.option.btn{height:4.2857142857rem;min-height:4.2857142857rem;padding:1.2857142857rem 1.875rem}.form-control.input-md,.form-control-static.input-md,.form-grid .form-row .form-label label.input-md,textarea.form-control.input-md,.option.input-md{height:2.2857142857rem;min-height:2.2857142857rem;padding:.3928571429rem .875rem}textarea.form-control:not(.form-control-height){height:6em}.form-control{-webkit-transition:all .25s cubic-bezier(0.25, 0, 0, 1);-o-transition:all .25s cubic-bezier(0.25, 0, 0, 1);transition:all .25s cubic-bezier(0.25, 0, 0, 1);-webkit-transition-property:color,background-color,box-shadow;transition-property:color,background-color,box-shadow;-webkit-box-shadow:none;box-shadow:none;-webkit-appearance:none;text-overflow:ellipsis;box-shadow:none;color:#484e53}.form-control::-moz-placeholder{color:#a8b1b7;opacity:1}.form-control:-ms-input-placeholder{color:#a8b1b7}.form-control::-webkit-input-placeholder{color:#a8b1b7}.form-control.input-short{width:64px}.form-control.input-medium{width:240px}.form-control.input-long{width:100%}.form-control.input-pill{border-radius:200px !important}.form-control.input-dark{background-color:#00475c;color:white}.form-control.input-dark:hover,.form-control.input-dark:focus{background-color:white;color:#313539}.form-control.input-dark::-moz-placeholder{color:#00afc6;opacity:1}.form-control.input-dark:-ms-input-placeholder{color:#00afc6}.form-control.input-dark::-webkit-input-placeholder{color:#00afc6}.form-control.input-transparent{background-color:transparent}.form-control.input-white{background-color:white;box-shadow:0 0 0 1px rgba(0,30,60,0.03),0 3px 3px -1.5px rgba(0,0,0,0.03)}.form-control:not(:disabled):not(.disabled):hover{background-color:#e9ebef}.form-control:not(:disabled):not(.disabled):hover::-moz-placeholder{color:#5e666c;opacity:1}.form-control:not(:disabled):not(.disabled):hover:-ms-input-placeholder{color:#5e666c}.form-control:not(:disabled):not(.disabled):hover::-webkit-input-placeholder{color:#5e666c}.form-control:not(:disabled):not(.disabled):hover.input-white{background-color:#f9fafb}.form-control:focus{color:#484e53 !important;background-color:white !important;box-shadow:0 0 0 1px #0bb,0 15px 15px -7.5px rgba(0,0,0,0.15);border-radius:4px !important;z-index:3}.form-control:focus::-moz-placeholder{color:#8b969e !important;opacity:1}.form-control:focus:-ms-input-placeholder{color:#8b969e !important}.form-control:focus::-webkit-input-placeholder{color:#8b969e !important}.form-control[type=\"number\"]:not(.spinner){-moz-appearance:textfield}.form-control[type=\"number\"]:not(.spinner)::-webkit-inner-spin-button,.form-control[type=\"number\"]:not(.spinner)::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.form-control-static,.form-grid .form-row .form-label label{display:block;height:auto !important;padding-left:0 !important;padding-right:0 !important;color:#484e53}.has-info .input-group-addon,.has-info .form-control{border-color:transparent !important;background-color:#edfafa;box-shadow:none}.has-info .input-group-addon::-moz-placeholder,.has-info .form-control::-moz-placeholder{color:#80d5d5;opacity:1}.has-info .input-group-addon:-ms-input-placeholder,.has-info .form-control:-ms-input-placeholder{color:#80d5d5}.has-info .input-group-addon::-webkit-input-placeholder,.has-info .form-control::-webkit-input-placeholder{color:#80d5d5}.has-info .input-group-addon,.has-info .form-control{color:#0aa}.has-info .form-control:not(:disabled):not(.disabled):hover{background-color:#def7f7;color:#007b7b}.has-info .form-control:not(:disabled):not(.disabled):hover::-moz-placeholder{color:#40bfbf;opacity:1}.has-info .form-control:not(:disabled):not(.disabled):hover:-ms-input-placeholder{color:#40bfbf}.has-info .form-control:not(:disabled):not(.disabled):hover::-webkit-input-placeholder{color:#40bfbf}.has-info .form-control:not(:disabled):not(.disabled):focus{box-shadow:0 0 0 1px #0bb,0 15px 15px -7.5px rgba(0,0,0,0.15)}.has-success .input-group-addon,.has-success .form-control{border-color:transparent !important;background-color:#f3faec;box-shadow:none}.has-success .input-group-addon::-moz-placeholder,.has-success .form-control::-moz-placeholder{color:#a4d38e;opacity:1}.has-success .input-group-addon:-ms-input-placeholder,.has-success .form-control:-ms-input-placeholder{color:#a4d38e}.has-success .input-group-addon::-webkit-input-placeholder,.has-success .form-control::-webkit-input-placeholder{color:#a4d38e}.has-success .input-group-addon,.has-success .form-control{color:#48a71c}.has-success .form-control:not(:disabled):not(.disabled):hover{background-color:#e9f7dc;color:#297610}.has-success .form-control:not(:disabled):not(.disabled):hover::-moz-placeholder{color:#76bd55;opacity:1}.has-success .form-control:not(:disabled):not(.disabled):hover:-ms-input-placeholder{color:#76bd55}.has-success .form-control:not(:disabled):not(.disabled):hover::-webkit-input-placeholder{color:#76bd55}.has-success .form-control:not(:disabled):not(.disabled):focus{box-shadow:0 0 0 1px #7ec631,0 15px 15px -7.5px rgba(0,0,0,0.15)}.has-warning .input-group-addon,.has-warning .form-control{border-color:transparent !important;background-color:#fff6ec;box-shadow:none}.has-warning .input-group-addon::-moz-placeholder,.has-warning .form-control::-moz-placeholder{color:#ffb18b;opacity:1}.has-warning .input-group-addon:-ms-input-placeholder,.has-warning .form-control:-ms-input-placeholder{color:#ffb18b}.has-warning .input-group-addon::-webkit-input-placeholder,.has-warning .form-control::-webkit-input-placeholder{color:#ffb18b}.has-warning .input-group-addon,.has-warning .form-control{color:#ff6316}.has-warning .form-control:not(:disabled):not(.disabled):hover{background-color:#ffefdc;color:#ff390d}.has-warning .form-control:not(:disabled):not(.disabled):hover::-moz-placeholder{color:#ff8a50;opacity:1}.has-warning .form-control:not(:disabled):not(.disabled):hover:-ms-input-placeholder{color:#ff8a50}.has-warning .form-control:not(:disabled):not(.disabled):hover::-webkit-input-placeholder{color:#ff8a50}.has-warning .form-control:not(:disabled):not(.disabled):focus{box-shadow:0 0 0 1px #ff9b26,0 15px 15px -7.5px rgba(0,0,0,0.15)}.has-danger .input-group-addon,.has-danger .form-control,.has-error .input-group-addon,.has-error .form-control{border-color:transparent !important;background-color:#fff5f4;box-shadow:none}.has-danger .input-group-addon::-moz-placeholder,.has-danger .form-control::-moz-placeholder,.has-error .input-group-addon::-moz-placeholder,.has-error .form-control::-moz-placeholder{color:#ffb4a5;opacity:1}.has-danger .input-group-addon:-ms-input-placeholder,.has-danger .form-control:-ms-input-placeholder,.has-error .input-group-addon:-ms-input-placeholder,.has-error .form-control:-ms-input-placeholder{color:#ffb4a5}.has-danger .input-group-addon::-webkit-input-placeholder,.has-danger .form-control::-webkit-input-placeholder,.has-error .input-group-addon::-webkit-input-placeholder,.has-error .form-control::-webkit-input-placeholder{color:#ffb4a5}.has-danger .input-group-addon,.has-danger .form-control,.has-error .input-group-addon,.has-error .form-control{color:#ff694b}.has-danger .form-control:not(:disabled):not(.disabled):hover,.has-error .form-control:not(:disabled):not(.disabled):hover{background-color:#ffedeb;color:#ff3c2b}.has-danger .form-control:not(:disabled):not(.disabled):hover::-moz-placeholder,.has-error .form-control:not(:disabled):not(.disabled):hover::-moz-placeholder{color:#ff8f78;opacity:1}.has-danger .form-control:not(:disabled):not(.disabled):hover:-ms-input-placeholder,.has-error .form-control:not(:disabled):not(.disabled):hover:-ms-input-placeholder{color:#ff8f78}.has-danger .form-control:not(:disabled):not(.disabled):hover::-webkit-input-placeholder,.has-error .form-control:not(:disabled):not(.disabled):hover::-webkit-input-placeholder{color:#ff8f78}.has-danger .form-control:not(:disabled):not(.disabled):focus,.has-error .form-control:not(:disabled):not(.disabled):focus{box-shadow:0 0 0 1px #ff694b,0 15px 15px -7.5px rgba(0,0,0,0.15)}.input-group-rounded>*:first-child,.input-group-rounded>*:first-child.input-group-btn .btn{border-top-left-radius:100px;border-bottom-left-radius:100px}.input-group-rounded>*:last-child,.input-group-rounded>*:last-child.input-group-btn .btn{border-top-right-radius:100px;border-bottom-right-radius:100px}.input-group-addon{color:#8b969e}.table tr.success{box-shadow:inset rgba(0,30,60,0.03) 0 0 #7ec631}.table tr.info{box-shadow:inset rgba(0,30,60,0.03) 0 0 #0bb}.table tr.warning{box-shadow:inset rgba(0,30,60,0.03) 0 0 #fc0}.table tr.danger{box-shadow:inset rgba(0,30,60,0.03) 0 0 #ff694b}.table-flush th:first-child,.table-flush td:first-child{padding-left:0}.table-flush th:last-child,.table-flush td:last-child{padding-right:0}.table-justified th:last-child,.table-justified td:last-child{text-align:right}th.sm,td.sm{width:1px;white-space:nowrap}th.flush-left,td.flush-left{padding-left:0 !important}th.flush-right,td.flush-right{padding-right:0 !important}.table:not(.table-borderless)>thead>tr>*{border-width:1px}thead>tr>*,.table-label{text-transform:uppercase;letter-spacing:.15em;font-size:.75rem;font-weight:500;color:#8b969e}.table-borderless tr *{border-width:0 !important}.table tbody+tbody{border-top-width:1px}.table-compact th *,.table-compact td *{margin-top:0;margin-bottom:0}.table-middle th,.table-middle td{vertical-align:middle !important}.table-large{font-size:1rem}.table-large tbody th,.table-large tbody td,.table-large>td,.table-large>th{padding-top:1rem !important;padding-bottom:1rem !important}.card .table th,.card .table td{padding-left:1.875rem;padding-right:1.875rem}.table-condensed{font-size:.9285714286rem}.table-responsive{border-radius:4px}@media (min-width: 961px){.table-responsive{overflow:visible}}@media (max-width: 960px){.table-responsive{overflow:auto}html.touch .table-responsive{overflow:scroll;-webkit-overflow-scrolling:touch}}@media (min-width: 961px){.table-alignment{margin-left:-1.25rem;margin-right:-1.25rem}}.table-linked{overflow:hidden}.table-linked a{z-index:3}.table-linked .table-link{width:0 !important;padding:0 !important;vertical-align:top !important}.table-linked .table-link .table-anchor{position:absolute;display:block;height:100%;width:1000vw;z-index:2}.table{display:table}.table-caption{display:table-caption}.table-colgroup{display:table-column-group}.table-thead{display:table-header-group}.table-tfoot{display:table-footer-group}.table-tbody{display:table-row-group}.table-td{display:table-cell}.table-col{display:table-column}.table-tr{display:table-row}.table-sticky{box-shadow:0 1px 0 #ecedee;z-index:2;position:sticky;top:0;background:#f9fafb}tbody .table-sticky{top:28px;background:white}.table .secondary td,.table .secondary th{background:#f9fafb;color:#8b969e}.nav-stacked .nav-stacked{font-size:.9285714286rem}.nav-stacked .nav-stacked>li{margin-left:1em}.nav-stacked .nav-stacked>li>a{color:#8b969e}.nav-tabs{border:0;box-shadow:0 1px 0 rgba(0,30,60,0.075);color:#313539;display:flex;flex-direction:row;flex-wrap:wrap}.nav-tabs:before,.nav-tabs:after{display:none}.nav-tabs>li{float:none;flex:0 0 auto;background:transparent !important;margin:0}.nav-tabs>li:not(:first-child){margin-left:.75em}.nav-tabs>li:not(:last-child){margin-right:.75em}.nav-tabs>li>a,.nav-tabs>li>span{display:block;line-height:1.5;background:transparent !important;padding:1.2857142857rem 0;margin:0 !important;border:0 !important;border-radius:0}.nav-tabs>li.active{box-shadow:0 1px 0 #0bb}.nav-tabs>li.active a{color:#313539}.nav-tabs-sm>li>a,.nav-tabs-sm>li>span{font-size:.9285714286rem;padding:.6785714286rem 0}.nav-tabs-fill>li{flex:1 0 auto;margin:0 !important}.nav-tabs-fill>li>a,.nav-tabs-fill>li>span{text-align:center;padding-left:20px;padding-right:20px}html.touch .nav-tabs{flex-wrap:nowrap;overflow:hidden;overflow-y:scroll;-webkit-overflow-scrolling:touch}.card-tabs .nav-tabs{background:#f0f2f4;border-radius:4px 4px 0 0}.card-tabs .nav-tabs>li:first-child{border-top-left-radius:4px}.card-tabs .nav-tabs>li:last-child{border-top-right-radius:4px}.card-tabs .nav-tabs>li.active{box-shadow:0 1px 0 white !important;background:white !important}.tab-content>.tab-pane{height:0;display:block;overflow:hidden}.tab-content>.tab-pane:not(.active){padding:0}.tab-content>.tab-pane.active{height:auto;overflow:visible}.nav-pills>li>a{font-size:.9285714286rem;padding:.4464285714rem 1em}.alert{border:0;margin:1.5em 0}.alert:first-child{margin-top:0}.alert:last-child{margin-bottom:0}.alert strong{color:inherit;font-style:normal}.alert-default{background:#f9fafb;color:#8b969e}.alert-flush{margin:0}.alert-trim{padding-left:0;padding-right:0}.alert-link{font-weight:bold !important}.avatar{display:inline-block;vertical-align:middle}.avatar img{display:block;border-radius:50%;height:28px;width:28px}.avatar-square img{border-radius:4px}.avatar-sm img{height:20px;width:20px}kbd,code,pre{font-size:.8571428571rem}pre{padding:0;overflow:auto;border-width:0;resize:vertical;white-space:pre;padding:1.2857142857rem 1.875rem;border-radius:4px;font-size:.8571428571rem;-moz-tab-size:2;-o-tab-size:2;tab-size:2;margin:1em 0}pre:first-child{margin-top:0}pre:last-child{margin-bottom:0}.panel-code pre{border-radius:0;padding:40px 50px}@media (max-width: 960px){.panel-code pre{padding-left:7.5vw;padding-right:7.5vw}}.panel-footer .panel-code pre,.panel-body:last-child .panel-code pre{border-bottom-right-radius:4px;border-bottom-left-radius:4px}kbd{box-shadow:none}figure.highlight{tab-size:2}.code,code{font-family:\"Monaco\",monospace;font-size:.8571428571rem;font-weight:normal;padding:0}.highlight pre{background:#005e7a;color:white;overflow:auto}html.touch .highlight pre{overflow:scroll;-webkit-overflow-scrolling:touch}.highlight code{white-space:pre;display:block}.highlight code *{font-style:normal}.highlight .c{color:#00afc6;font-style:italic}.highlight .err{color:#a61717;background-color:#e3d2d2}.highlight .cm{color:#999988;font-style:italic}.highlight .cp{color:#999999}.highlight .c1{color:#999988;font-style:italic}.highlight .cs{color:#999999;font-style:italic}.highlight .gd{color:#000000;background-color:#fdd}.highlight .gd .x{color:#000000;background-color:#faa}.highlight .ge{font-style:italic}.highlight .gr{color:#a00}.highlight .gh{color:#999}.highlight .gi{color:#000000;background-color:#dfd}.highlight .gi .x{color:#000000;background-color:#afa}.highlight .go{color:#888}.highlight .gp{color:#555}.highlight .gu{color:#aaa}.highlight .gt{color:#a00}.highlight .kt{color:#445588}.highlight .m{color:#b7a5df}.highlight .n{color:#00d9d9}.highlight .s{color:#9ed53e}.highlight .na{color:#00afc6}.highlight .nb{color:#00d9d9}.highlight .nl{color:#00afc6}.highlight .nc{color:#fc0}.highlight .nd{color:#fc0}.highlight .no{color:#00afc6}.highlight .ni{color:#fc0}.highlight .ne{color:#990000}.highlight .nf{color:#990000}.highlight .nn{color:#555}.highlight .nt{color:#00d9d9}.highlight .nv{color:teal}.highlight .w{color:#bbb}.highlight .mf{color:#099}.highlight .mh{color:#099}.highlight .mi{color:#099}.highlight .mo{color:#099}.highlight .sb{color:#d14}.highlight .sc{color:#d14}.highlight .sd{color:#d14}.highlight .s2{color:#ff694b}.highlight .se{color:#d14}.highlight .sh{color:#d14}.highlight .si{color:#d14}.highlight .sx{color:#d14}.highlight .sr{color:#009926}.highlight .s1{color:#d14}.highlight .ss{color:#990073}.highlight .bp{color:#999}.highlight .vc{color:teal}.highlight .vg{color:teal}.highlight .vi{color:teal}.highlight .il{color:#099}.highlight .lineno{-webkit-user-select:none;-moz-user-select:none;-o-user-select:none}.highlight .lineno::-moz-selection{background-color:transparent}.highlight .lineno::selection{background-color:transparent}.label{text-transform:uppercase;letter-spacing:.15em;font-size:.75rem;font-weight:500;-webkit-transition:all .25s cubic-bezier(0.25, 0, 0, 1);-o-transition:all .25s cubic-bezier(0.25, 0, 0, 1);transition:all .25s cubic-bezier(0.25, 0, 0, 1);display:inline-block;text-align:inherit;padding:0;border:0}.label-default{color:#8b969e}.label-success{color:#5fb825}.label-info{color:#0aa}.label-warning{color:#ff821d}.label-danger{color:#ff4f39}.label-inherit{color:inherit}.label+.label:not(.block){margin-left:1.5em}a.label:hover.label-default,a.label:focus.label-default{color:#3f464e}a.label:hover.label-success,a.label:focus.label-success{color:#369115}a.label:hover.label-info,a.label:focus.label-info{color:#007b7b}a.label:hover.label-warning,a.label:focus.label-warning{color:#ff4b11}a.label:hover.label-danger,a.label:focus.label-danger{color:#ff2d21}.badge{border-radius:200px ;text-transform:uppercase;letter-spacing:.15em;font-size:.75rem;font-weight:500;line-height:1.8em;height:1.8em;min-width:1.8em;text-align:center;padding:0 7px;text-indent:1px;border:0}.badge-success{background:#7ec631;color:white}.badge-warning{background:#ff9b26;color:white}.badge-danger{background:#ff694b;color:white}.list-group-item .badge{float:right}.active .badge{color:#fff;background:#009797}.badge-digit{padding:0 2px}.badge-corner{position:absolute;top:0;right:0;-webkit-transform:translate(50%, -50%);transform:translate(50%, -50%)}.badges{font-size:0;display:block}.badges .badge{margin:2px 4px 2px 0}.progress{height:6px;overflow:visible;margin:1em 0}.progress:first-child{margin-top:0}.progress:last-child{margin-bottom:0}.progress,.progress .progress-bar{border-radius:100px;box-shadow:none}.tooltip{box-shadow:0 0 0 1px rgba(0,30,60,0.03),0 20px 20px -10px rgba(0,0,0,0.2);padding:0 !important}.tooltip,.tooltip .tooltip-inner,.tooltip .tooltip-arrow{border-radius:4px}.tooltip .tooltip-arrow{-webkit-transform:rotate(45deg);transform:rotate(45deg);background:#007699;box-shadow:0 0 0 1px rgba(0,30,60,0.03),0 20px 20px -10px rgba(0,0,0,0.2);border-width:0;height:12px;width:12px}.tooltip.top .tooltip-arrow{margin-bottom:-3px}.tooltip.bottom .tooltip-arrow{margin-top:-3px}.tooltip.left .tooltip-arrow{margin-right:-3px}.tooltip.right .tooltip-arrow{margin-left:-3px}.tooltip .tooltip-inner{font-size:.9285714286rem;padding:.6785714286rem 1.25rem;margin:0 !important;font-style:normal}.popover{box-shadow:0 0 0 1px rgba(0,30,60,0.03),0 20px 20px -10px rgba(0,0,0,0.2);font-size:1rem;border-width:0 !important;color:#fff;padding:0}.popover,.popover .popover-content,.popover .arrow{border-radius:4px}.popover .popover-content{border-radius:4px;margin:0 !important}.popover .popover-title,.popover .popover-content{padding:1.2857142857rem 1.875rem;background:#ff694b}.popover .arrow{width:20px;height:20px;background:#ff694b;box-shadow:0 0 0 1px rgba(0,30,60,0.03),0 20px 20px -10px rgba(0,0,0,0.2);-webkit-transform:rotate(45deg);transform:rotate(45deg)}.popover .arrow:after{display:none}.popover.top .arrow{margin:-10px;margin-bottom:-4px}.popover.bottom .arrow{margin:-10px;margin-top:-4px}.popover.left .arrow{margin:-10px;margin-right:-4px}.popover.right .arrow{margin:-10px;margin-left:-4px}.modal .modal-dialog{margin:auto;display:table;width:768px;max-width:100vw;height:100vh}.modal .modal-dialog.modal-sm{width:400px}.modal .modal-dialog.modal-lg{width:960px}.modal .modal-content{display:table-cell;vertical-align:middle;box-shadow:none}.modal.fade .modal-dialog{-webkit-transition:all .25s cubic-bezier(0.25, 0, 0, 1);-o-transition:all .25s cubic-bezier(0.25, 0, 0, 1);transition:all .25s cubic-bezier(0.25, 0, 0, 1);-webkit-transform:translate(0, -20px);transform:translate(0, -20px)}.modal.fade.in .modal-dialog{-webkit-transform:translate(0, 0);transform:translate(0, 0)}.modal-backdrop{display:block;position:absolute;width:100%;height:100%;top:0;left:0;position:fixed;z-index:1040}@media (max-width: 960px){.modal-content:not(.modal-content-flush){padding:7.5vw}}.panel{border-width:0;display:flex;flex-direction:column;display:block;border-width:0;background:white;box-shadow:0 0 0 1px rgba(0,30,60,0.03),0 3px 3px -1.5px rgba(0,0,0,0.03);border-radius:4px;margin:1em 0}.panel:first-child{margin-top:0}.panel:last-child{margin-bottom:0}.panel>*{border-color:transparent !important;flex:0 0 auto}.panel>*:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.panel>*:last-child{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.panel>*,.panel>*>.panel-fill{padding:20px 30px}.panel>*.panel-flush,.panel>*>.panel-fill.panel-flush{padding:0 !important}.panel>*.panel-flush-top,.panel>*>.panel-fill.panel-flush-top{padding-top:0 !important}.panel>*.panel-flush-bottom,.panel>*>.panel-fill.panel-flush-bottom{padding-bottom:0 !important}.panel-large>*,.panel-large>*>.panel-fill{padding:40px 50px}@media (max-width: 960px){.panel-large>*,.panel-large>*>.panel-fill{padding:5vw 7.5vw}}.panel>.panel-body{flex:1 0 auto}.panel>.panel-body>*:first-child{margin-top:0}.panel>.panel-body>*:last-child{margin-bottom:0}.panel>.panel-body>.panel-fill{display:block;position:absolute;width:100%;height:100%;top:0;left:0;overflow:auto}html.touch .panel>.panel-body>.panel-fill{overflow:scroll;-webkit-overflow-scrolling:touch}h1.panel-title,.h1.panel-title{font-size:1.7142857143rem}h2.panel-title,.h2.panel-title{font-size:1.7142857143rem}h3.panel-title,.h3.panel-title{font-size:1.2857142857rem}h4.panel-title,.h4.panel-title{font-size:1.1428571429rem}h5.panel-title,.h5.panel-title{font-size:1rem}h6.panel-title,.h6.panel-title{font-size:1rem}.list-group{display:block;border-width:0;background:white;box-shadow:0 0 0 1px rgba(0,30,60,0.03),0 3px 3px -1.5px rgba(0,0,0,0.03);border-radius:4px}.list-group .list-group-item{margin:0;border-width:0 0 1px 0}.list-group .list-group-item *{margin-top:0;margin-bottom:0}.list-group .list-group-item:last-child{border-width:0}.well{padding:1.2857142857rem 1.875rem;box-shadow:none;border:0}.well>*:first-child{margin-top:0}.well>*:last-child{margin-bottom:0}.row{margin:0}.container{padding-left:0;padding-right:0}@media (min-width: 961px){.container{width:90%;max-width:1320px}}@media (max-width: 960px){.container{width:auto}}@media (min-width: 961px){.row-reverse>[class*=\"col-lg-\"]{float:right}}@media (max-width: 960px){[class*=\"col-lg-\"]+[class*=\"col-lg-\"]{margin-top:30px;margin-bottom:30px}[class*=\"col-lg-\"]+[class*=\"col-lg-\"]:first-child{margin-top:0}[class*=\"col-lg-\"]+[class*=\"col-lg-\"]:last-child{margin-bottom:0}}@media (max-width: 768px){[class*=\"col-md-\"]+[class*=\"col-md-\"]{margin-top:30px;margin-bottom:30px}[class*=\"col-md-\"]+[class*=\"col-md-\"]:first-child{margin-top:0}[class*=\"col-md-\"]+[class*=\"col-md-\"]:last-child{margin-bottom:0}}@media (max-width: 540px){[class*=\"col-sm-\"]+[class*=\"col-sm-\"]{margin-top:30px;margin-bottom:30px}[class*=\"col-sm-\"]+[class*=\"col-sm-\"]:first-child{margin-top:0}[class*=\"col-sm-\"]+[class*=\"col-sm-\"]:last-child{margin-bottom:0}}.carousel .carousel-control{background:transparent}.carousel .carousel-control:after{width:1em;display:block;position:absolute;left:0;top:0;bottom:0;right:0;margin:auto;height:1.6em;font-size:2rem}.carousel .carousel-indicators{bottom:10px}.carousel .carousel-indicators li{background:#fff;-webkit-transition:all .25s cubic-bezier(0.25, 0, 0, 1);-o-transition:all .25s cubic-bezier(0.25, 0, 0, 1);transition:all .25s cubic-bezier(0.25, 0, 0, 1);margin:0 2px;opacity:.25;height:8px;width:8px;border:0}.carousel .carousel-indicators li.active{opacity:1}.carousel .carousel-inner .item img{width:100%}.thumbnail{display:block;border-width:0;background:white;box-shadow:0 0 0 1px rgba(0,30,60,0.03),0 3px 3px -1.5px rgba(0,0,0,0.03);border-radius:4px}.thumbnail img{width:100%}.thumbnail .caption *{margin-top:0;margin-bottom:0}.range{-webkit-appearance:none;margin:0;width:100%;outline:none !important}.range::-moz-focus-outer{border:0}.range::-webkit-slider-runnable-track{width:100%;height:6px;cursor:pointer;box-shadow:none;background:#f0f2f4;border-radius:200px;border:0 solid transparent;color:transparent;-webkit-transition:all .25s cubic-bezier(0.25, 0, 0, 1);-o-transition:all .25s cubic-bezier(0.25, 0, 0, 1);transition:all .25s cubic-bezier(0.25, 0, 0, 1)}.range::-moz-range-track{width:100%;height:6px;cursor:pointer;box-shadow:none;background:#f0f2f4;border-radius:200px;border:0 solid transparent;color:transparent;-webkit-transition:all .25s cubic-bezier(0.25, 0, 0, 1);-o-transition:all .25s cubic-bezier(0.25, 0, 0, 1);transition:all .25s cubic-bezier(0.25, 0, 0, 1)}.range::-ms-track{width:100%;height:6px;cursor:pointer;box-shadow:none;background:#f0f2f4;border-radius:200px;border:0 solid transparent;color:transparent;-webkit-transition:all .25s cubic-bezier(0.25, 0, 0, 1);-o-transition:all .25s cubic-bezier(0.25, 0, 0, 1);transition:all .25s cubic-bezier(0.25, 0, 0, 1);background:transparent;border-width:5px 0}.range::-ms-fill-lower{box-shadow:none;background:#f0f2f4;border-radius:200px;border:0 solid transparent;color:transparent;-webkit-transition:all .25s cubic-bezier(0.25, 0, 0, 1);-o-transition:all .25s cubic-bezier(0.25, 0, 0, 1);transition:all .25s cubic-bezier(0.25, 0, 0, 1)}.range::-ms-fill-upper{box-shadow:none;background:#f0f2f4;border-radius:200px;border:0 solid transparent;color:transparent;-webkit-transition:all .25s cubic-bezier(0.25, 0, 0, 1);-o-transition:all .25s cubic-bezier(0.25, 0, 0, 1);transition:all .25s cubic-bezier(0.25, 0, 0, 1)}.range::-webkit-slider-thumb{box-shadow:none;border:0;height:16px;width:16px;border-radius:200px;background:#0bb;cursor:pointer;-webkit-transition:all .25s cubic-bezier(0.25, 0, 0, 1);-o-transition:all .25s cubic-bezier(0.25, 0, 0, 1);transition:all .25s cubic-bezier(0.25, 0, 0, 1);-webkit-appearance:none;margin-top:-5px}.range::-moz-range-thumb{box-shadow:none;border:0;height:16px;width:16px;border-radius:200px;background:#0bb;cursor:pointer;-webkit-transition:all .25s cubic-bezier(0.25, 0, 0, 1);-o-transition:all .25s cubic-bezier(0.25, 0, 0, 1);transition:all .25s cubic-bezier(0.25, 0, 0, 1)}.range::-ms-thumb{box-shadow:none;border:0;height:16px;width:16px;border-radius:200px;background:#0bb;cursor:pointer;-webkit-transition:all .25s cubic-bezier(0.25, 0, 0, 1);-o-transition:all .25s cubic-bezier(0.25, 0, 0, 1);transition:all .25s cubic-bezier(0.25, 0, 0, 1)}@supports (-ms-ime-align: auto){.range::-ms-thumb{margin-top:1px}}.range:hover::-webkit-slider-thumb{background:#0aa}.range:focus::-webkit-slider-thumb{background:#0aa}.range:hover::-moz-range-thumb{background:#0aa}.range:focus::-moz-range-thumb{background:#0aa}.range:hover::-ms-thumb{background:#0aa}.range:focus::-ms-thumb{background:#0aa}.range:hover::-webkit-slider-runnable-track{background:#e9ebef}.range:focus::-webkit-slider-runnable-track{background:#e9ebef}.range:hover::-moz-range-track{background:#e9ebef}.range:focus::-moz-range-track{background:#e9ebef}.range:hover::-ms-fill-lower{background:#e9ebef}.range:focus::-ms-fill-lower{background:#e9ebef}.range:hover::-ms-fill-upper{background:#e9ebef}.range:focus::-ms-fill-upper{background:#e9ebef}.breadcrumb-flush{padding:0}.breadcrumb>li:first-child .glyph{position:absolute;right:100%;top:50%;-webkit-transform:translate(-33%, -50%);transform:translate(-33%, -50%)}.breadcrumb>li:before{font-weight:normal;padding:0 .5em;opacity:.5}.card{display:block;border-width:0;background:white;box-shadow:0 0 0 1px rgba(0,30,60,0.03),0 3px 3px -1.5px rgba(0,0,0,0.03);border-radius:4px;display:flex;flex-direction:column}.card>.card-header,.card>.card-footer{flex:0 0 auto}.card>.card-body{flex:1 0 auto}.card.active{box-shadow:0 0 0 1px #0bb,0 15px 15px -7.5px rgba(0,0,0,0.15)}.card-footer,.card-header,.card-body,.card-padding{padding:20px 30px}.card-expand{margin:-20px -30px}.card-header h1,.card-header .h1,.card-header h2,.card-header .h2,.card-header h3,.card-header .h3,.card-header h4,.card-header .h4,.card-header h5,.card-header .h5,.card-header h6,.card-header .h6{margin:0}.card-flush-top{padding-top:0}.card-flush-bottom{padding-bottom:0}.card-flush-vertical{padding-top:0;padding-bottom:0}.card-flush{padding:0}.card-sm{padding:8px 12px}.card-control{display:block}.card-control .btn,.card-control .form-control,.card-control .input-group-addon,.card-control .form-control-static,.card-control .form-grid .form-row .form-label label,.form-grid .form-row .form-label .card-control label{display:block;margin:0 !important;height:4.2857142857rem;padding:1.3928571429rem 30px;border-radius:0;width:100%}.card-control .form-control{background:white}.card-control .form-control:not(:disabled):not(.disabled):hover{background-color:#f0f2f4}.card-control .btn,.card-control .input-group-addon{text-align:center}.card-footer .card-control:first-child .btn,.card-footer .card-control:first-child .form-control,.card-footer .card-control:first-child .input-group-addon,.card-footer .card-control:first-child .form-control-static,.card-footer .card-control:first-child .form-grid .form-row .form-label label,.form-grid .form-row .form-label .card-footer .card-control:first-child label{border-bottom-left-radius:4px}.card-footer .card-control:last-child .btn,.card-footer .card-control:last-child .form-control,.card-footer .card-control:last-child .input-group-addon,.card-footer .card-control:last-child .form-control-static,.card-footer .card-control:last-child .form-grid .form-row .form-label label,.form-grid .form-row .form-label .card-footer .card-control:last-child label{border-bottom-right-radius:4px}.card-body .card-control:first-child .btn,.card-body .card-control:first-child .form-control,.card-body .card-control:first-child .input-group-addon,.card-body .card-control:first-child .form-control-static,.card-body .card-control:first-child .form-grid .form-row .form-label label,.form-grid .form-row .form-label .card-body .card-control:first-child label{border-top-left-radius:4px}.card-body .card-control:last-child .btn,.card-body .card-control:last-child .form-control,.card-body .card-control:last-child .input-group-addon,.card-body .card-control:last-child .form-control-static,.card-body .card-control:last-child .form-grid .form-row .form-label label,.form-grid .form-row .form-label .card-body .card-control:last-child label{border-top-right-radius:4px}.card-toolbar{display:flex;flex-direction:row;flex-wrap:wrap;padding:0}.card-toolbar .card-control{display:block;flex:1 0 auto}.card-form{padding:0;display:table;width:100%}.card-form .card-formrow{display:table-row}.card-form .card-formrow .card-control{display:table-cell;vertical-align:middle}.card-form .card-formrow:not(:last-child) .card-control{border-bottom:1px solid rgba(0,30,60,0.075)}.card-list:not(:first-child){border-top:1px solid rgba(0,30,60,0.075)}.preview{margin:60px 0;background:white;border-radius:4px;display:flex;flex-direction:column;flex:1 0 auto;box-shadow:0 0 0 1px rgba(0,30,60,0.03),0 3px 3px -1.5px rgba(0,0,0,0.03);-webkit-transition:all .25s cubic-bezier(0.25, 0, 0, 1);-o-transition:all .25s cubic-bezier(0.25, 0, 0, 1);transition:all .25s cubic-bezier(0.25, 0, 0, 1)}.preview:first-child{margin-top:0}.preview:last-child{margin-bottom:0}.preview .preview-header{background-position:50% 50%;background-size:cover}.preview .preview-header:before{content:'';display:block;padding-bottom:50%}.preview .preview-body{display:flex;flex-direction:column;flex:1 0 auto}.preview .preview-body .preview-footer{flex:0 0 auto;padding:20px 30px}.preview .preview-body .preview-text{flex:1 0 auto;padding:20px 30px}.preview .preview-body .preview-text *{margin-top:0;margin-bottom:0}.preview .preview-body .preview-text h1,.preview .preview-body .preview-text .h1,.preview .preview-body .preview-text h2,.preview .preview-body .preview-text .h2,.preview .preview-body .preview-text h3,.preview .preview-body .preview-text .h3,.preview .preview-body .preview-text h4,.preview .preview-body .preview-text .h4,.preview .preview-body .preview-text h5,.preview .preview-body .preview-text .h5,.preview .preview-body .preview-text h6,.preview .preview-body .preview-text .h6{margin-bottom:20px}.preview .preview-body .preview-text ~ .preview-footer{padding-top:0}.preview.preview-link:hover,.preview.preview-link:focus{box-shadow:0 0 0 1px rgba(0,30,60,0.03),0 15px 15px -7.5px rgba(0,0,0,0.15)}.preview.preview-vertical .preview-header{flex:0 0 auto}.preview.preview-vertical .preview-body{flex:1 0 auto}.preview.preview-vertical .preview-header-grow{flex:1 0 auto}.preview.preview-vertical .preview-header-grow ~ .preview-body{flex:0 0 auto}.preview.preview-horizontal{display:flex;flex-direction:row}.preview.preview-horizontal .preview-header{flex:1 1 120px}.preview.preview-horizontal .preview-body{flex:3 1 260px}.preview:not(.preview-vertical):not(.preview-horizontal){display:flex;flex-direction:row;flex-wrap:wrap}.preview:not(.preview-vertical):not(.preview-horizontal) .preview-header{flex:1 0 120px}.preview:not(.preview-vertical):not(.preview-horizontal) .preview-body{flex:3 1 260px}.loading{text-align:center;margin:20px 0}.loading:after{margin:0 auto;content:'';display:block;font-size:30px;width:1em;height:1em;border-radius:50%;border:1px solid;border-top-color:rgba(0,30,60,0.03);border-right-color:rgba(0,30,60,0.03);-webkit-animation:spin .5s 0s linear infinite;-o-animation:spin .5s 0s linear infinite;animation:spin .5s 0s linear infinite}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.loading.loading-inline{height:10px;display:inline-block;margin:0 .375em 0 0;vertical-align:middle}.loading.loading-inline-after{margin:0 0 0 .375em}.loading.loading-inline:after{margin:-10px 0}.loading.loading-small.loading-inline{top:-1px}.loading.loading-small:after{font-size:12px;margin:-1px auto}.btn .loading:after{color:inherit}.loading-overlay{background:#f9fafb;border-radius:4px}.loading-overlay>*{pointer-events:none;opacity:.15}.loading-overlay .loading{display:block;position:absolute;width:100%;height:100%;top:0;left:0;margin:0;opacity:1}.loading-overlay .loading:after{display:block;position:absolute;left:0;top:0;bottom:0;right:0;margin:auto}.message{margin:20px 0}.message .message-content{display:flex;flex-direction:row}.message .message-content>*{padding:0 .5rem}.message:not(.message-secondary) .message-content .message-header{padding-left:0}.message:not(.message-secondary) .message-content .message-body{padding-right:4rem}.message:not(.message-secondary) .message-content .message-body .message-text{border-top-left-radius:4px}.message.message-secondary .message-content{-ms-flex-pack:end;justify-content:flex-end}.message.message-secondary .message-content .message-header{padding-right:0}.message.message-secondary .message-content .message-body{padding-left:4rem}.message.message-secondary .message-content .message-body .message-text{border-top-right-radius:4px}.message-header{flex:0 0 auto}.message-secondary .message-header{order:2}.message-header .message-avatar .avatar{font-size:2.5rem}.message-body{flex:0 1 auto}.message-body .message-text{background:#f0f2f4;padding:1.2857142857rem 1.875rem;border-radius:1.333em}.message-blue .message-body .message-text{background:#0bb;color:white}.message-green .message-body .message-text{background:#7ec631;color:white}.message-purple .message-body .message-text{background:#7f6cc5;color:white}.toolbar a{display:block}.toolbar .toolbar-content{display:flex;flex-direction:row;flex-wrap:wrap;-ms-flex-align:center;align-items:center}.toolbar .toolbar-content .toolbar-item{flex:0 0 auto}.toolbar .toolbar-content .toolbar-item>.btn{width:100%}.toolbar .toolbar-content .toolbar-item>.toolbar-link{padding:1rem 1.5rem}.toolbar .toolbar-content .toolbar-gap{flex:1000 1 auto}.toolbar-fill .btn{border-radius:0}.toolbar-fill .toolbar-content>.btn,.toolbar-fill .toolbar-content .toolbar-item{flex:1 0 auto}.toolbar-separate .toolbar-content{margin:-.375rem}.toolbar-separate .toolbar-content .toolbar-item{margin:.375rem}.toolbar-fixed .toolbar-content>.btn,.toolbar-fixed .toolbar-content .toolbar-item{flex:1 0 0px}.title{margin-left:-10px;margin-right:-10px;display:flex;flex-direction:row;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:center;align-items:center}.title-buffer{margin-top:60px;margin-bottom:60px}.title>*{padding:5px 0;margin:0 10px}.title-header{flex:0 1 auto}.title-body{flex:1 1 auto}.title-actions{flex:0 1 auto}.title-fix{min-height:50px}.title:first-child{margin-top:-5px}.title:last-child{margin-bottom:-5px}.list{color:#8b969e}.list-item:not(:first-child){border-top:1px solid rgba(0,30,60,0.075)}.list-item:first-child .list-row{border-top-right-radius:4px;border-top-left-radius:4px}.list-item:last-child .list-row{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-link{display:block;position:absolute;width:100%;height:100%;top:0;left:0;z-index:2}.list-link:hover+.list-row,.list-link:focus+.list-row{background:#f9fafb}.list-item.active .list-row{background:#0bb}.list-item.active .list-row h1,.list-item.active .list-row .h1,.list-item.active .list-row h2,.list-item.active .list-row .h2,.list-item.active .list-row h3,.list-item.active .list-row .h3,.list-item.active .list-row h4,.list-item.active .list-row .h4,.list-item.active .list-row h5,.list-item.active .list-row .h5,.list-item.active .list-row h6,.list-item.active .list-row .h6,.list-item.active .list-row{color:#fff}.list-row{display:flex;flex-direction:row;-ms-flex-align:center;align-items:center;-webkit-transition:all .25s cubic-bezier(0.25, 0, 0, 1);-o-transition:all .25s cubic-bezier(0.25, 0, 0, 1);transition:all .25s cubic-bezier(0.25, 0, 0, 1)}.list-row>*{flex:1 1 0px;padding:1.5rem 2rem}.list-row>* *{margin-top:0;margin-bottom:0}.list-row>* a{z-index:3}.list-row-group{padding-left:0;padding-right:1rem}.list-row-graphic,.list-row-arrow{flex:0 0 auto}.list-row-graphic>.glyph,.list-row-arrow>.glyph{opacity:.3333333333}.list-row-sm>*{padding-top:12px;padding-bottom:12px}.list-row-xs>*{padding-top:7px;padding-bottom:7px}.card-list .list .list-row>*{padding-left:30px;paddign-right:30px}.list-clean{margin:0;padding:0;border:0;list-style-type:none}.list-clean li{margin:0;padding:0;list-style-type:none}.list-columns-2{columns:2}.status{display:flex;flex-direction:row}.status-text{flex:1 1 auto;white-space:nowrap;min-width:0}.status-icon{flex:0 0 auto}.dot{display:inline-block;background:currentColor;width:8px;height:8px;border-radius:50%}.dot-default{color:#8b969e}.dot-success{color:#5fb825}.dot-info{color:#0aa}.dot-warning{color:#ff821d}.dot-danger{color:#ff4f39}.table-master-detail-toggle{-webkit-transition:all .25s cubic-bezier(0.25, 0, 0, 1);-o-transition:all .25s cubic-bezier(0.25, 0, 0, 1);transition:all .25s cubic-bezier(0.25, 0, 0, 1)}.table-master-detail:not(.open) .table-detail{display:none}.table-master-detail.open .table-master td,.table-master-detail.open .table-master th{background:white !important}.table-master-detail.open .table-master-detail-toggle{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.form-grid{display:table;width:100%}.form-grid .form-row-group{display:table-row-group}.form-grid .form-row{display:table-row}.form-grid .form-row .form-row{display:table;width:100%}.form-grid .form-row .form-label,.form-grid .form-row .form-response{display:table-cell;padding:7px;vertical-align:top}.form-grid .form-row .form-label:first-child,.form-grid .form-row .form-response:first-child{padding-left:0}.form-grid .form-row .form-label:last-child,.form-grid .form-row .form-response:last-child{padding-right:0}.form-grid .form-row .form-label .form-row>*,.form-grid .form-row .form-response .form-row>*{padding-top:0;padding-bottom:0}.form-grid .form-row .form-label{white-space:nowrap;width:1px}.form-grid .form-row .form-response .help-block{margin:0;top:3px}.form-grid .form-row .form-response.form-response-short{width:1px;white-space:nowrap}.form-grid .form-row .form-response .form-response,.form-grid .form-row .form-response .form-label{padding-top:0;padding-bottom:0}.form-grid .form-row>.form-label:first-child{padding-right:7px}.form-grid:not(.form-grid-left) .form-label{text-align:right}.matrix{margin:0 -15px;display:flex;flex-direction:row;-ms-flex-align:stretch;align-items:stretch;flex-wrap:wrap}.matrix.matrix-nowrap{flex-wrap:nowrap}.matrix .matrix-item{padding:15px;display:flex;flex-direction:column;flex:1 1 260px}.matrix .matrix-item>*{flex:1 1 auto;margin:0}.waterfall{margin:0 -15px;-webkit-column-count:4;column-count:4;-webkit-column-gap:0;column-gap:0;-webkit-column-width:320px;column-width:320px}.waterfall .waterfall-item{-webkit-column-break-inside:avoid;page-break-inside:avoid;break-inside:avoid-column;padding:15px}.waterfall .waterfall-item>*{margin:0}.mosaic{display:flex;flex-direction:column;-ms-flex-align:stretch;align-items:stretch}.mosaic-buffer{margin:0 -15px}.mosaic-row{display:flex;flex-direction:row;flex-wrap:wrap;flex:1 1 auto}.mosaic-column{display:flex;flex-direction:column;flex:1 1 320px}.mosaic-column-1{flex:1 1 320px}.mosaic-column-2{flex:1 1 640px}.mosaic-column-3{flex:1 1 960px}.mosaic-column-4{flex:1 1 1280px}.mosaic-column-5{flex:1 1 1600px}.mosaic-column-6{flex:1 1 1920px}.mosaic-column-7{flex:1 1 2240px}.mosaic-column-8{flex:1 1 2560px}.mosaic-column-9{flex:1 1 2880px}.mosaic-column-10{flex:1 1 3200px}.mosaic-column-11{flex:1 1 3520px}.mosaic-column-12{flex:1 1 3840px}.mosaic-item{display:flex;flex-direction:column}.mosaic-item>*{flex:1 0 auto;margin:0}.mosaic-column>.mosaic-item{flex:1 1 auto}.mosaic-row>.mosaic-item{flex:1 0 260px}.mosaic-buffer .mosaic-item{margin:15px}.flex-row{display:flex;flex-direction:row;flex-wrap:wrap}.flex-column{display:flex;flex-direction:column;flex:1 1 320px}.flex-column-1{flex:1 1 320px}.flex-column-2{flex:1 1 640px}.flex-column-3{flex:1 1 960px}.flex-column-4{flex:1 1 1280px}.flex-column-5{flex:1 1 1600px}.flex-column-6{flex:1 1 1920px}.flex-column-7{flex:1 1 2240px}.flex-column-8{flex:1 1 2560px}.flex-column-9{flex:1 1 2880px}.flex-column-10{flex:1 1 3200px}.flex-column-11{flex:1 1 3520px}.flex-column-12{flex:1 1 3840px}.flex-nowrap{flex-wrap:nowrap}.flex-buffer{margin:0 -15px}.flex-flush{margin-top:-15px;margin-bottom:-15px}.flex-column>.flex-item{flex:1 1 auto}.flex-row>.flex-item{flex:1 0 260px}.flex-buffer .flex-item{margin:15px}.flex-column>.flex-item-sm{flex:1 1 auto}.flex-row>.flex-item-sm{flex:1 0 130px}.flex-buffer .flex-item-sm{margin:7.5px}.flex-grow{flex:1 0 auto}.flex-auto{flex:0 0 auto}.flex-shrink{flex:0 1 auto}.album{margin:0 -30px;visibility:hidden}.album.album-ready{visibility:visible}.album .album-content{display:flex;flex-direction:row;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch}.album .album-content .album-image{flex:1 1 auto;margin:30px}.album .album-content .album-image img{margin:0;display:block;width:100%;height:auto;display:block;border-width:0;background:white;box-shadow:0 0 0 1px rgba(0,30,60,0.03),0 3px 3px -1.5px rgba(0,0,0,0.03);border-radius:4px}.limit-1>*:nth-child(n+2){display:none !important}.limit-2>*:nth-child(n+3){display:none !important}.limit-3>*:nth-child(n+4){display:none !important}.limit-4>*:nth-child(n+5){display:none !important}.limit-5>*:nth-child(n+6){display:none !important}.limit-6>*:nth-child(n+7){display:none !important}.limit-7>*:nth-child(n+8){display:none !important}.limit-8>*:nth-child(n+9){display:none !important}.limit-9>*:nth-child(n+10){display:none !important}.limit-10>*:nth-child(n+11){display:none !important}.limit-11>*:nth-child(n+12){display:none !important}.limit-12>*:nth-child(n+13){display:none !important}.grid{display:grid;grid-gap:2em;grid-template-columns:repeat(auto-fill, minmax(200px, 1fr))}html.cssgridlegacy .grid{display:flex;flex-direction:row;flex-wrap:wrap;padding:1em}html.cssgridlegacy .grid>*{flex:1 0 200px;max-width:320px;padding:1em}.section-target{position:absolute;visibility:hidden;top:-4em}.section{padding:.75em 0}.section-target:target+.section-content .panel{box-shadow:0 0 0 1px rgba(0,30,60,0.03),0 30px 30px -15px rgba(0,0,0,0.3)}.framework{-ms-display:grid;display:grid;height:100%}.framework>*{padding:1em 1.5em}.framework .framework-header{background:#0bb;color:white}.framework .framework-nav{background:#f0f2f4}.framework .framework-menu{background:#f9fafb}.framework .framework-content{background:white}.framework .framework-content{padding:0;overflow:auto;display:flex;flex-direction:column;-ms-flex-align:stretch;align-items:stretch}.framework .framework-content>*{padding:1em 1.5em}.framework .framework-content .framework-actions{position:sticky;top:0;z-index:2;background:white}@media (min-width: 961px){.framework{-ms-grid-rows:60px auto;grid-template-rows:60px auto;-ms-grid-columns:60px 240px auto;grid-template-columns:60px 240px auto}.framework .framework-header{-ms-grid-row:1;grid-row:1;-ms-grid-column:1;-ms-grid-column-span:3;grid-column:1 / 4}.framework .framework-nav{-ms-grid-row:2;grid-row:2;-ms-grid-column:1;grid-column:1}.framework .framework-menu{-ms-grid-row:2;grid-row:2;-ms-grid-column:2;grid-column:2}.framework .framework-content{-ms-grid-row:2;grid-row:2;-ms-grid-column:3;grid-column:3}}@media (max-width: 960px){.framework{-ms-grid-rows:60px auto;grid-template-rows:60px auto;-ms-grid-columns:auto;grid-template-columns:auto}.framework .framework-header{-ms-grid-row:1;grid-row:1;-ms-grid-column:1;grid-column:1}.framework .framework-nav{display:none}.framework .framework-menu{display:none}.framework .framework-content{-ms-grid-row:2;grid-row:2;-ms-grid-column:1;grid-column:1}.framework .framework-content .framework-actions{order:-1}}.app{display:block;position:absolute;width:100%;height:100%;top:0;left:0;position:fixed;min-width:960px}.app-row{display:flex;flex-direction:row;-ms-flex-align:stretch;align-items:stretch}.app-column{display:flex;flex-direction:column;-ms-flex-align:stretch;align-items:stretch}.app-middle{-ms-flex-align:center;align-items:center}.app-header,.app-footer{flex:0 0 auto}.app-body{flex:1 0 0px}.app-navbar{height:calc( 2.8571428571rem + 40px );z-index:3;background:white}.app-menu,.app-sidebar,.app-content{-webkit-transition:all .25s cubic-bezier(0.25, 0, 0, 1);-o-transition:all .25s cubic-bezier(0.25, 0, 0, 1);transition:all .25s cubic-bezier(0.25, 0, 0, 1);background:#f9fafb}.app-menu,.app-sidebar{width:20%;min-width:300px;flex:0 0 auto}.app-content{flex:1 0 0px}.app-content a,.app-content .a{color:#0bb}.app-content a:hover,.app-content a:focus,.app-content .a:hover,.app-content .a:focus{color:#0aa}.app-overlay{background:#f0f2f4;position:absolute;display:none;z-index:2;right:-100vw;left:-100vw;bottom:0;top:0;opacity:.9}.app-menu .app-overlay{left:100%;box-shadow:inset 5px 0 10px -5px rgba(0,0,0,0.2)}.app-sidebar .app-overlay{right:100%;box-shadow:inset -5px 0 10px -5px rgba(0,0,0,0.2)}.app-icn:not(:first-child){padding-left:20px}.app-icn:not(:last-child){padding-right:20px}.app-scroll{display:block;position:absolute;width:100%;height:100%;top:0;left:0;overflow:auto}html.touch .app-scroll{overflow:scroll;-webkit-overflow-scrolling:touch}.app-pad{padding:20px 30px}.app-pad,.app-pad-v{padding-top:20px;padding-bottom:20px}.app-pad,.app-pad-h{padding-left:30px;padding-right:30px}.app-sticky{top:0;z-index:2;position:sticky;background:#f9fafb}.app-frame{margin:auto}@media (min-width: 961px){.app-frame{width:90%}}.app-shadow{box-shadow:0 1px 0 rgba(0,16,32,0.05)}.app-flush,.app-flush-top{padding-top:0}.app-flush,.app-flush-bottom{padding-bottom:0}.app-flush,.app-flush-left{padding-left:0}.app-flush,.app-flush-right{padding-right:0}.app-logo{width:100px}.layout{width:100vw;height:100vh;min-width:960px;overflow:auto}html.touch .layout{overflow:scroll;-webkit-overflow-scrolling:touch}.layout-pad{padding-top:20px;padding-bottom:20px}.layout-ide{height:calc(100vh - 53px)}.layout-pad-l,.layout-pad-x{padding-left:20px}.layout-pad-r,.layout-pad-x{padding-right:20px}.layout-sticky{position:sticky;z-index:20;top:0}.layout-frame{margin:auto;width:90%;padding-left:20px;padding-right:20px}.layout-menu .layout-frame{padding-right:0}.layout-navigation{box-shadow:0 0 0 1px rgba(0,30,60,0.03),0 3px 3px -1.5px rgba(0,0,0,0.03);background:white;height:52px;position:absolute;top:0;left:0;right:0}.layout-content{position:absolute;top:53px;bottom:0;left:0;right:0;overflow:auto}html.touch .layout-content{overflow:scroll;-webkit-overflow-scrolling:touch}.layout-row{display:flex;flex-direction:row}.layout-alert{flex:0 0 100%}.layout-menu{flex:0 0 25%;max-width:300px;min-width:0}.layout-body{flex:1 1 auto;box-shadow:0 -1px 0 rgba(0,30,60,0.03)}.ide{overflow:hidden;font-size:.9285714286rem;display:block;position:absolute;width:100%;height:100%;top:0;left:0;background:white}.ide-pad{padding:14px 16px !important}.ide-pad-l,.ide-pad-x{padding-left:16px !important}.ide-pad-r,.ide-pad-x{padding-right:16px !important}.ide-panels{display:block;position:absolute;width:100%;height:100%;top:0;left:0}.ide-panels,.ide-panel-group{display:flex;flex-direction:row;background:inherit}.ide-panels.ide-vertical,.ide-panel-group.ide-vertical{display:flex;flex-direction:column}@media (max-width: 960px){.ide-panels,.ide-panel-group{display:flex;flex-direction:column}}.ide-panel,.ide-panel-group{flex:1 0 0px}.ide-panel{-webkit-transition:all .25s cubic-bezier(0.25, 0, 0, 1);-o-transition:all .25s cubic-bezier(0.25, 0, 0, 1);transition:all .25s cubic-bezier(0.25, 0, 0, 1);-webkit-transition-property:box-shadow,transform;transition-property:box-shadow,transform;box-shadow:0 0 0 2px transparent;min-height:200px;min-width:200px;background:inherit;display:flex;flex-direction:column}.ide-horizontal .ide-panel{height:auto !important}.ide-horizontal .ide-panel[style*=\"width\"]{flex:0 0 auto}.ide-vertical .ide-panel{width:auto !important}.ide-vertical .ide-panel[style*=\"height\"]{flex:0 0 auto}@media (max-width: 960px){.ide-panel{width:auto !important}}.ide-panel-sm{flex:0 0 280px}.ide-panel:before{content:'';display:block;position:absolute;left:0;top:0;bottom:0;right:0;box-shadow:0 0 0 1px currentColor;opacity:.125}.ide-panel:focus{z-index:3;box-shadow:0 0 0 2px #0bb,0 10px 20px rgba(0,30,60,0.3);-webkit-transform:translate(10px, -10px);transform:translate(10px, -10px);border-radius:4px}.ide-panel>*:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.ide-panel>*:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.ide-panel-header,.ide-panel-footer{flex:0 0 auto;background:rgba(0,30,60,0.03)}.ide-panel-header:before,.ide-panel-header:after,.ide-panel-footer:before,.ide-panel-footer:after{content:'';display:block;position:absolute;left:0;top:0;bottom:0;right:0;background:currentColor;opacity:.0075}.ide-panel-header:after,.ide-panel-footer:after{height:1px;opacity:.06}.ide-panel-header .btn:focus,.ide-panel-header .btn:active,.ide-panel-footer .btn:focus,.ide-panel-footer .btn:active{z-index:auto}.ide-panel-header:after{top:auto}.ide-panel-footer:before{display:none}.ide-panel-footer:after{bottom:auto}.ide-panel-body{color:#313539;background:inherit;flex:1 1 auto}.ide-panel-scroll{display:block;position:absolute;width:100%;height:100%;top:0;left:0;overflow:auto}html.touch .ide-panel-scroll{overflow:scroll;-webkit-overflow-scrolling:touch}.ide-panel-scroll::-webkit-scrollbar{background:#e9ebef;width:7px;height:7px}.ide-panel-scroll::-webkit-scrollbar-button{display:none}.ide-panel-scroll::-webkit-scrollbar-track{background:transparent}.ide-panel-scroll::-webkit-scrollbar-track-piece{background:transparent}.ide-panel-scroll::-webkit-scrollbar-thumb{background:#d7dbdf;border-radius:200px ;-webkit-transition:all .25s cubic-bezier(0.25, 0, 0, 1);-o-transition:all .25s cubic-bezier(0.25, 0, 0, 1);transition:all .25s cubic-bezier(0.25, 0, 0, 1)}.ide-panel-scroll::-webkit-scrollbar-corner{background:#e9ebef}.ide-panel-scroll::-webkit-resizer{background:transparent}.ide-panel-scroll:hover::-webkit-scrollbar-thumb{background:#c1c7cd}.ide-panel-handle{display:block;position:absolute;top:0;bottom:0;right:0;background:white;width:10px}.ide-controls{display:table;width:100%;height:44px}.ide-controls>*{display:table-cell;vertical-align:middle}.ide-control{white-space:nowrap}.ide-control-sm{width:1px}.ide-control-link,.ide-control-text{display:block;padding:.6785714286rem 0}.ide-control-link{padding-left:1.25rem;padding-right:1.25rem;text-align:center}.ide-control-inline-link{display:inline-block;padding:.6785714286rem 0;text-align:center}.ide-control.active{box-shadow:inset 0 -1px 0 #0bb}.ide-control.active .ide-control-link,.ide-control.active .ide-control-inline-link{color:inherit;font-weight:bold}.ide-list{padding:7px 0}.ide-list-item{display:block;padding:7px 16px;color:inherit;box-shadow:0 1px 0 rgba(0,30,60,0.03);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ide-list-item:hover,.ide-list-item:focus{color:inherit}.ide-list-item-footer{padding:.375em 0;display:flex;flex-direction:row;-ms-flex-pack:justify;justify-content:space-between}.ide-interactive:hover,.ide-interactive:focus{background:#f9fafb}.ide-active{background:#e4e6eb !important}.ide-code{color:inherit;resize:none;padding:0;background:transparent}.ide table{white-space:nowrap}.ide table td:first-child,.ide table th:first-child{padding-left:16px}.ide table td:last-child,.ide table th:last-child{padding-right:16px}.ide table td{max-width:300px;overflow:hidden;text-overflow:ellipsis}.ide-table-heading{color:inherit;position:sticky;top:0;z-index:3;background:white;box-shadow:0 1px 0 rgba(0,30,60,0.03)}.ide-dark{color:white}.ide-dark,.ide-dark .ide-table-heading{background:#002934}.ide-dark .ide-panel-body{color:inherit}.ide-dark .ide-panel:focus,.ide-dark .ide-panel-header,.ide-dark .ide-panel-footer,.ide-dark .table-striped>tbody>tr:nth-of-type(odd){background:#00303d}.ide-dark .ide-active{background:#005e7a !important;color:white !important}.ide-dark .ide-table-heading,.ide-dark .ide-list-item{box-shadow:0 1px 0 rgba(255,255,255,0.1)}.ide-dark .ide-panel-header .btn-default,.ide-dark .ide-panel-footer .btn-default{color:#fff;background-color:#005e7a;border-color:#005e7a}.ide-dark .ide-panel-header .btn-default:focus,.ide-dark .ide-panel-header .btn-default.focus,.ide-dark .ide-panel-footer .btn-default:focus,.ide-dark .ide-panel-footer .btn-default.focus{color:#fff;background-color:#007699}.ide-dark .ide-panel-header .btn-default:hover,.ide-dark .ide-panel-footer .btn-default:hover{color:#fff;background-color:#007699}.ide-dark .ide-panel-header .btn-default:active,.ide-dark .ide-panel-header .btn-default.active,.open>.ide-dark .ide-panel-header .btn-default.dropdown-toggle,.ide-dark .ide-panel-footer .btn-default:active,.ide-dark .ide-panel-footer .btn-default.active,.open>.ide-dark .ide-panel-footer .btn-default.dropdown-toggle{color:#fff;background-color:#007699}.ide-dark .ide-panel-header .btn-default:active:hover,.ide-dark .ide-panel-header .btn-default:active:focus,.ide-dark .ide-panel-header .btn-default:active.focus,.ide-dark .ide-panel-header .btn-default.active:hover,.ide-dark .ide-panel-header .btn-default.active:focus,.ide-dark .ide-panel-header .btn-default.active.focus,.open>.ide-dark .ide-panel-header .btn-default.dropdown-toggle:hover,.open>.ide-dark .ide-panel-header .btn-default.dropdown-toggle:focus,.open>.ide-dark .ide-panel-header .btn-default.dropdown-toggle.focus,.ide-dark .ide-panel-footer .btn-default:active:hover,.ide-dark .ide-panel-footer .btn-default:active:focus,.ide-dark .ide-panel-footer .btn-default:active.focus,.ide-dark .ide-panel-footer .btn-default.active:hover,.ide-dark .ide-panel-footer .btn-default.active:focus,.ide-dark .ide-panel-footer .btn-default.active.focus,.open>.ide-dark .ide-panel-footer .btn-default.dropdown-toggle:hover,.open>.ide-dark .ide-panel-footer .btn-default.dropdown-toggle:focus,.open>.ide-dark .ide-panel-footer .btn-default.dropdown-toggle.focus{color:#fff;background-color:#007699}.ide-dark .ide-panel-header .btn-default:active,.ide-dark .ide-panel-header .btn-default.active,.open>.ide-dark .ide-panel-header .btn-default.dropdown-toggle,.ide-dark .ide-panel-footer .btn-default:active,.ide-dark .ide-panel-footer .btn-default.active,.open>.ide-dark .ide-panel-footer .btn-default.dropdown-toggle{background-image:none}.ide-dark .ide-panel-header .btn-default.disabled:hover,.ide-dark .ide-panel-header .btn-default.disabled:focus,.ide-dark .ide-panel-header .btn-default.disabled.focus,.ide-dark .ide-panel-header .btn-default[disabled]:hover,.ide-dark .ide-panel-header .btn-default[disabled]:focus,.ide-dark .ide-panel-header .btn-default[disabled].focus,fieldset[disabled] .ide-dark .ide-panel-header .btn-default:hover,fieldset[disabled] .ide-dark .ide-panel-header .btn-default:focus,fieldset[disabled] .ide-dark .ide-panel-header .btn-default.focus,.ide-dark .ide-panel-footer .btn-default.disabled:hover,.ide-dark .ide-panel-footer .btn-default.disabled:focus,.ide-dark .ide-panel-footer .btn-default.disabled.focus,.ide-dark .ide-panel-footer .btn-default[disabled]:hover,.ide-dark .ide-panel-footer .btn-default[disabled]:focus,.ide-dark .ide-panel-footer .btn-default[disabled].focus,fieldset[disabled] .ide-dark .ide-panel-footer .btn-default:hover,fieldset[disabled] .ide-dark .ide-panel-footer .btn-default:focus,fieldset[disabled] .ide-dark .ide-panel-footer .btn-default.focus{background-color:#005e7a;border-color:#005e7a}.ide-dark .ide-panel-header .btn-default .badge,.ide-dark .ide-panel-footer .btn-default .badge{color:#005e7a;background-color:#fff}.ide-dark .ide-panel-scroll::-webkit-scrollbar{background:#00475c;width:7px;height:7px}.ide-dark .ide-panel-scroll::-webkit-scrollbar-button{display:none}.ide-dark .ide-panel-scroll::-webkit-scrollbar-track{background:transparent}.ide-dark .ide-panel-scroll::-webkit-scrollbar-track-piece{background:transparent}.ide-dark .ide-panel-scroll::-webkit-scrollbar-thumb{background:#065b74;border-radius:200px ;-webkit-transition:all .25s cubic-bezier(0.25, 0, 0, 1);-o-transition:all .25s cubic-bezier(0.25, 0, 0, 1);transition:all .25s cubic-bezier(0.25, 0, 0, 1)}.ide-dark .ide-panel-scroll::-webkit-scrollbar-corner{background:#00475c}.ide-dark .ide-panel-scroll::-webkit-resizer{background:transparent}.ide-dark .ide-panel-scroll:hover::-webkit-scrollbar-thumb{background:#087291}.ide-dark .ace_scrollbar::-webkit-scrollbar{background:#00475c;width:7px;height:7px}.ide-dark .ace_scrollbar::-webkit-scrollbar-button{display:none}.ide-dark .ace_scrollbar::-webkit-scrollbar-track{background:transparent}.ide-dark .ace_scrollbar::-webkit-scrollbar-track-piece{background:transparent}.ide-dark .ace_scrollbar::-webkit-scrollbar-thumb{background:#065b74;border-radius:200px ;-webkit-transition:all .25s cubic-bezier(0.25, 0, 0, 1);-o-transition:all .25s cubic-bezier(0.25, 0, 0, 1);transition:all .25s cubic-bezier(0.25, 0, 0, 1)}.ide-dark .ace_scrollbar::-webkit-scrollbar-corner{background:#00475c}.ide-dark .ace_scrollbar::-webkit-resizer{background:transparent}.ide-dark .ace_scrollbar:hover::-webkit-scrollbar-thumb{background:#087291}.ide-dark .ide-code::-webkit-scrollbar{background:#00475c;width:7px;height:7px}.ide-dark .ide-code::-webkit-scrollbar-button{display:none}.ide-dark .ide-code::-webkit-scrollbar-track{background:transparent}.ide-dark .ide-code::-webkit-scrollbar-track-piece{background:transparent}.ide-dark .ide-code::-webkit-scrollbar-thumb{background:#065b74;border-radius:200px ;-webkit-transition:all .25s cubic-bezier(0.25, 0, 0, 1);-o-transition:all .25s cubic-bezier(0.25, 0, 0, 1);transition:all .25s cubic-bezier(0.25, 0, 0, 1)}.ide-dark .ide-code::-webkit-scrollbar-corner{background:#00475c}.ide-dark .ide-code::-webkit-resizer{background:transparent}.ide-dark .ide-code:hover::-webkit-scrollbar-thumb{background:#087291}.menu{margin:0 -5px;font-size:.9285714286rem}.menu ul{margin:0;padding:0;border:0;list-style-type:none;display:none}.menu ul li{margin:0;padding:0;list-style-type:none}.menu ul ul{margin-left:23px}.menu a{color:#3f464e;display:block;padding:3px 5px;border-radius:4px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.menu a.menu-tree{color:#8b969e}.menu a.menu-main{font-size:1rem;margin-bottom:.25em;font-weight:bold;color:#313539}.menu a.active:not(.not-active){color:#313539}.menu a:hover,.menu a:focus{background:#f0f2f4;color:#313539}.menu a.menu-node.active:not(.not-active),.menu a.menu-link.active:not(.not-active){background:#e9ebef;color:#313539}.menu .icn{margin-right:8px}.menu>ul,.menu .active+ul{display:block}a:not(.active) .menu-icon-on{display:none}a.active .menu-icon-off{display:none}.results{font-size:.9285714286rem}.results .result{display:block;color:inherit;text-decoration:none !important;padding:15px 20px;margin:0 -20px;border-radius:4px}.results .result:hover,.results .result:focus{color:inherit}.results .result:hover,.results .result:focus{background:#f0f2f4}.results .result-content{display:flex;flex-direction:row}.results .result-content .result-icn{flex:0 0 auto;color:#8b969e;opacity:.5;padding:2px 20px 0 0}.results .result-content .result-body{flex:1 1 auto}.results .result-content .result-body>*{margin-top:.25em;margin-bottom:.25em}.results .result-content .result-body>*:first-child{margin-top:0}.results .result-content .result-body>*:last-child{margin-bottom:0}.filename{display:flex;flex-direction:row}.filename .filename-ellip{flex:0 1 auto;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.filename .filename-normal{flex:0 0 auto}.launcher{z-index:30;position:fixed;bottom:30px;right:30px}.launcher:not(.on) .launcher-content{display:none}.launcher.on .launcher-btn{display:none}.launcher-btn{font-size:0}.launcher-btn .btn{box-shadow:0 0 0 1px rgba(0,30,60,0.03),0 20px 20px -10px rgba(0,0,0,0.2)}.launcher-btn .btn:not(:last-child){margin-right:10px}.launcher-btn .btn:hover,.launcher-btn .btn:focus{box-shadow:0 0 0 1px rgba(0,30,60,0.03),0 40px 40px -20px rgba(0,0,0,0.4)}.launcher-content{position:fixed;height:100%;border:20px solid transparent;top:0;right:0}@media (min-width: 961px){.launcher[data-launcher=\"sidebar\"] .launcher-content{width:340px;border-left:0}}@media (max-width: 960px){.launcher[data-launcher=\"sidebar\"] .launcher-content{width:100vw}}.launcher[data-launcher=\"sidebar\"] .launcher-content .launcher-hide-sidebar:not(.visible){display:none}.launcher[data-launcher=\"fullscreen\"] .launcher-content{width:100vw}.launcher[data-launcher=\"fullscreen\"] .launcher-content .launcher-hide-fullscreen:not(.visible){display:none}.launcher-window{display:flex;flex-direction:column;overflow:auto;width:100%;height:100%;color:white;background:#005e7a;border-radius:4px;box-shadow:-10px 5px 20px 5px rgba(0,0,0,0.1),0 20px 20px -10px rgba(0,0,0,0.3)}.launcher-window h1,.launcher-window .h1,.launcher-window h2,.launcher-window .h2,.launcher-window h3,.launcher-window .h3,.launcher-window h4,.launcher-window .h4,.launcher-window h5,.launcher-window .h5,.launcher-window h6,.launcher-window .h6{color:inherit}html.touch .launcher-window{overflow:scroll;-webkit-overflow-scrolling:touch}.launcher-window .launcher-header,.launcher-window .launcher-footer{flex:0 0 auto;display:flex;flex-direction:row;-ms-flex-align:center;align-items:center}.launcher-window .launcher-header .launcher-spacer,.launcher-window .launcher-footer .launcher-spacer{flex:1 0 0px}.launcher-window .launcher-header .launcher-cell,.launcher-window .launcher-footer .launcher-cell{flex:1 1 auto;min-width:0;padding:20px}.launcher-window .launcher-header .launcher-cell.launcher-flush,.launcher-window .launcher-footer .launcher-cell.launcher-flush{padding:0}.launcher-window .launcher-header .launcher-cell .field-label,.launcher-window .launcher-header .launcher-cell .field-input,.launcher-window .launcher-footer .launcher-cell .field-label,.launcher-window .launcher-footer .launcher-cell .field-input{padding-left:20px;padding-right:20px;border-radius:0 !important;box-shadow:none !important}.launcher-window .launcher-header .launcher-cell .field-input,.launcher-window .launcher-footer .launcher-cell .field-input{background-position:calc(100% - 1.25rem - 5px) 50%}.launcher-window .launcher-header .launcher-actions,.launcher-window .launcher-footer .launcher-actions{flex:0 0 auto}.launcher-window .launcher-footer{flex-wrap:wrap}.launcher-window .launcher-body{flex:1 1 0px}.launcher-window .launcher-body .launcher-scroll{display:block;position:absolute;width:100%;height:100%;top:0;left:0}.launcher-window .launcher-body .launcher-scroll .launcher[data-launcher=\"sidebar\"]{overflow:auto}html.touch .launcher-window .launcher-body .launcher-scroll .launcher[data-launcher=\"sidebar\"]{overflow:scroll;-webkit-overflow-scrolling:touch}.launcher-window .launcher-body .launcher-embed,.launcher-window .launcher-body .launcher-embed iframe,.launcher-window .launcher-body .launcher-embed canvas{display:block;position:absolute;width:100%;height:100%;top:0;left:0}.field{display:block;margin:0}.field .field-input{height:4.6071428571rem;border-top:1.75rem solid transparent !important}.field .field-input:hover+.field-label,.field .field-input:focus+.field-label{color:#5e666c}.field .field-label{pointer-events:none;z-index:4;font-family:\"Monaco\",monospace;font-size:.8571428571rem;position:absolute;top:0;left:0;margin:0;padding:.6785714286rem 1.25rem 0}.field .field-text{height:4.6071428571rem;border-top:1.75rem solid transparent !important;border-radius:0 !important;box-shadow:none !important;padding:.6785714286rem 1.25rem 0}.field .field-text-label{pointer-events:none;z-index:0;position:absolute;top:0;left:0;margin:0;padding:.6785714286rem 1.25rem 0;font-variant:small-caps}.fields{display:flex;flex-direction:row;flex-wrap:wrap}.fields .field{flex:1 0 160px}.fields:not(.fields-flush){margin:-5px}.fields:not(.fields-flush) .field{border:5px solid transparent}.switches{margin:1.5em 0;display:flex;flex-direction:row;flex-wrap:wrap;background:#edeff2;box-shadow:inset 0 0 5px rgba(0,0,0,0.05);border-radius:4px;font-size:.9285714286rem}.switches .switch{flex:1 1 auto}.switches .switch .switch-label{padding:.4464285714rem 1.25rem;color:#8b969e;display:block;text-align:center;-webkit-transition:all .25s cubic-bezier(0.25, 0, 0, 1);-o-transition:all .25s cubic-bezier(0.25, 0, 0, 1);transition:all .25s cubic-bezier(0.25, 0, 0, 1)}.switches .switch .switch-label:hover,.switches .switch .switch-label:focus{color:#313539}.switches .switch .switch-label.active{display:block;border-width:0;background:white;box-shadow:0 0 0 1px rgba(0,30,60,0.03),0 3px 3px -1.5px rgba(0,0,0,0.03);border-radius:4px;font-weight:bold;color:#313539}.details .details-content{margin:-1em 0}@media (min-width: 961px){.details .details-content{display:table;width:100%}.details .details-content .detail-group{display:table-row}.details .details-content .detail-group>*{display:table-cell;vertical-align:top}.details .details-content .detail-group:not(:last-child)>*{border-bottom:1px solid rgba(0,30,60,0.075)}}.detail-group{padding-bottom:1em}.detail-group:not(:last-child){border-bottom:1px solid rgba(0,30,60,0.075)}.detail-group .detail-header{white-space:nowrap;width:1px;padding:1em;padding-left:0}@media (max-width: 960px){.detail-group .detail-header .detail-label{color:#313539}}.detail-group .detail-body{padding:.5em}@media (max-width: 960px){.detail-group .detail-body{padding:0;margin:0 -1em}}.detail-group .detail-body .detail{margin:0;display:inline-block;vertical-align:top;padding:.5em 1em}.detail-label{margin:0;text-transform:uppercase;letter-spacing:.15em;font-size:.75rem;font-weight:500;color:#8b969e}.detail-value{color:#313539}.controls{display:flex;flex-direction:row;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between;margin:-7px}.controls:not(.controls-block){display:inline-flex}.controls-nowrap{flex-wrap:nowrap}.controls .control{padding:7px;flex:0 0 auto}.controls .control .btn{text-align:center}.controls .control .btn,.controls .control .form-control{width:100%}.controls .control-grow{flex:1 0 auto}.controls .control-full{flex:0 0 100%}.token{display:flex;flex-direction:row;display:inline-flex}.token-element{flex:0 0 auto}.token-element:not(:first-child) .btn,.token-element:not(:first-child) .form-control{border-top-left-radius:0;border-bottom-left-radius:0}.token-element:not(:last-child) .btn,.token-element:not(:last-child) .form-control{border-top-right-radius:0;border-bottom-right-radius:0}.tokens{margin-left:-5px;margin-right:-5px}.tokens:after{display:table;content:'';clear:both}.tokens-actions{float:right}.tokens .token{float:left;margin:5px}.setting{display:flex;flex-direction:row;margin:0 -30px}.setting>*{padding:15px 30px}.setting-header{flex:1 0 28.5714285714%;min-width:200px}.setting-header-text>*{margin-top:.5rem;margin-bottom:.5rem}.setting-header-text>*:first-child{margin-top:0}.setting-header-text>*:last-child{margin-bottom:0}.setting-header-text h1,.setting-header-text .h1,.setting-header-text h2,.setting-header-text .h2,.setting-header-text h3,.setting-header-text .h3,.setting-header-text h4,.setting-header-text .h4,.setting-header-text h5,.setting-header-text .h5,.setting-header-text h6,.setting-header-text .h6{display:inline}.setting-header-text h1 a,.setting-header-text .h1 a,.setting-header-text h2 a,.setting-header-text .h2 a,.setting-header-text h3 a,.setting-header-text .h3 a,.setting-header-text h4 a,.setting-header-text .h4 a,.setting-header-text h5 a,.setting-header-text .h5 a,.setting-header-text h6 a,.setting-header-text .h6 a{font-size:.9285714286rem;font-weight:bold;margin-left:.75em}.setting-body{flex:1 0 71.4285714286%;min-width:600px}.setting-row{display:flex;flex-direction:row;margin:0 -4px}.setting-row:not(:last-child){border-bottom:1px solid rgba(0,30,60,0.075)}.setting-row>*{padding:4px}.setting-row-label{flex:0 0 25%;min-width:120px;padding-top:8px}.setting-row-response{flex:1 1 auto}.setting-row-edit{flex:0 0 auto}.setting-row-actions{flex:1 1 auto}body:not(.editing) .setting-form:not(.editing) [setting-active]{display:none}.editing [setting-static]{display:none}body.editing [setting-old]{display:none}body:not(.editing) [setting-new]{display:none}.editing .setting-row:not(.setting-row-border){border-color:transparent}.logo{display:block;overflow:hidden;color:#313539}.logo,.logo svg{height:25px;width:88px}.logo svg{fill:currentColor;top:-1px}@media (max-width: 540px){.logo{width:25px}}.kpi{color:#313539;padding:20px 32px}.kpi-lg .kpi-value{font-weight:bold;font-size:1.7142857143rem}.kpi-content{display:table;width:100%}.kpi-content>*{display:table-cell;vertical-align:baseline}.kpi-graphic{white-space:nowrap;width:1px;padding-right:.5em}.kpis{display:table;width:100%;width:auto}.kpis>*{display:table-cell;vertical-align:middle}.kpis .kpi:first-child{border-top-left-radius:4px;border-bottom-left-radius:4px}.kpis .kpi:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px}.navigation{color:#313539}.navigation-row{height:52px;margin:0 -15px;display:flex;flex-direction:row;-ms-flex-align:center;align-items:center}.navigation-item{flex:0 0 auto;padding:10px 15px}.navigation-grow{flex:1 0 auto}.navigation-link{color:#bec5c9}.navigation-link:hover,.navigation-link:focus{color:#313539}.navigation-pad{padding:0 20px}.sidenav{z-index:20}.sidenav-overlay,.sidenav-content{-webkit-transition:all .25s cubic-bezier(0.25, 0, 0, 1);-o-transition:all .25s cubic-bezier(0.25, 0, 0, 1);transition:all .25s cubic-bezier(0.25, 0, 0, 1)}.sidenav-content{overflow:auto;-webkit-transform:translateX(-120%);transform:translateX(-120%);top:0;bottom:0;left:0;background:white;box-shadow:0 0 0 1px rgba(0,30,60,0.03),0 3px 3px -1.5px rgba(0,0,0,0.03);position:fixed;width:320px}html.touch .sidenav-content{overflow:scroll;-webkit-overflow-scrolling:touch}.navigating .sidenav-content{-webkit-transform:translateX(0);transform:translateX(0)}.sidenav-overlay{display:block;position:absolute;width:100%;height:100%;top:0;left:0;position:fixed;background:#f0f2f4;pointer-events:none;opacity:0}.navigating .sidenav-overlay{pointer-events:auto;opacity:.5}.sidenav-body{padding:0 24px}.sidenav-region{padding-bottom:.25em}.sidenav-divider{display:flex;flex-direction:row;-ms-flex-align:center;align-items:center}.sidenav-divider:after{content:'';display:block;border-top:1px solid rgba(0,30,60,0.075);flex:1 1 auto}.sidenav-divider-heading{flex:0 0 auto;padding-right:1em}.sidenav-section{padding:24px 0}.sidenav-section+.sidenav-section{border-top:1px solid rgba(0,30,60,0.075)}.sidenav-link{color:#8b969e;display:block;padding:.25em 0;padding-left:40px}.sidenav-link .glyph{position:absolute;left:0;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.sidenav-link:hover,.sidenav-link:focus{color:#313539}.sidenav-link:not(.active) .glyph{opacity:.3333333333}.sidenav-link.active{color:#ff694b}.sidenav-link-main{color:inherit;padding-top:.5em;padding-bottom:.5em;font-weight:bold}body.navigating{overflow:hidden}body.navigating .navigating-hide{display:none}body:not(.navigating) .navigating-show{display:none}.navigating-overlay{display:block;position:absolute;width:100%;height:100%;top:0;left:0;background:#f0f2f4;opacity:.5;display:none;z-index:9}.navigating .navigating-overlay{display:block}.navigating .navigating-blur{pointer-events:none;-webkit-filter:blur(5px);filter:blur(5px)}a.help{line-height:inherit}\n`,\n      \"\"\n    ]);\n  },\n  function(L, T) {\n    L.exports = function(e) {\n      return typeof e != \"string\" ? e : (/^['\"].*['\"]$/.test(e) && (e = e.slice(1, -1)), /[\"'() \\t\\n]/.test(e) ? '\"' + e.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\") + '\"' : e);\n    };\n  },\n  function(L, T) {\n    L.exports = \"data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAx8AAoAAAAADDQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAAA9AAAAGAAAABgcMR/82NtYXAAAAFUAAABUgAAAVIcdx1qZ2x5ZgAAAqgAAAaMAAAGjFUyrzBoZWFkAAAJNAAAADYAAAA2FVU8pmhoZWEAAAlsAAAAJAAAACQM5gWHaG10eAAACZAAAAA4AAAAODwoBKlsb2NhAAAJyAAAAB4AAAAeDW4Ltm1heHAAAAnoAAAAIAAAACAEVARLbmFtZQAACggAAAJSAAACUpr8+SVwb3N0AAAMXAAAACAAAAAg/7gAQAAEBGMBkAAFAAgEEAPAAAAAeAQQA8AAAAIwADICHAAAAAAFAAAAAAAAAAAAAAAQAAAAAAAAAAAAAABVS1dOAEAAIABmBRT+1AAABfABkAAAAAEAAAAAA4QEsAAAACAAAAAAAAMAAAADAAAAHAABAAAAAABMAAMAAQAAABwABAAwAAAACAAIAAIAAAAgAEYAZv//AAAAIABBAGH////t/8D/pgABAAAAAAAAAAAAAAEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAwQFBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwgJCgsMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAB9AK8AAMABgAJAAwADwAANyERIRMnIQM3EQU3FwEXBwAB9P4M+qoBVIyq/o6qqv6OqqoAArz+z//+1P/+Ai3//wIr//8AAAEAFADcBWUD1AAkAAABIgcGBwEGFRQXFhcWMzI3NjcJARYXFjMyNzY3NjU0JwEmJyYjArwQDg8M/agXFwwPDhAPDw8LAiACIAwPDhAPDw8LGBj9pwsPDw8D1AYGDP2oGCAgGQwFBgYFDAIf/eEMBQYGBQwZICAYAlgMBgYAAAAAAQFA/68EOAUAACAAAAEiBwYHBhUUFwkBBhUUFxYXFjMyNzY3ATY1NCcBJicmIwGQEA4PDBcXAiD94BcXDA8OEA8PDwsCWBgY/agLDw8PBQAGBgsZICAZ/eH94BkgIBkLBgYGBgsCWRkgIBkCWAsGBgAAAAABABQA3AVlA9QAJAAAASIHBgcJASYnJiMiBwYHBhUUFwEWFxYzMjc2NwE2NTQnJicmIwUVEA4PDP3h/d8LDw8PEA4PDBcXAlkMDw4QDw8PCwJYGBgLDw8PA9QGBgz94QIfDAYGBgYMGCAgGf2oDAUGBgUMAlgZICAYDAYGAAAAAAEBQP+vBDgFAAAgAAABIgcGBwEGFRQXARYXFjMyNzY3NjU0JwkBNjU0JyYnJiMD6BAODwz9qBcXAlgMDw4QDw8PCxgY/eECHxgYCw8PDwUABgYL/acZICAZ/agLBgYGBgsZICAZAh8CIBkgIBkLBgYAAAAAAQAU/7AFZAUAADgAAAEiBwYHCQEmJyYjIgcGBwYVFBcJAQYVFBcWFxYzMjc2NwkBFhcWMzI3Njc2NTQnCQE2NTQnJicmIwUUEA4PDP3h/eALDw8PEA4PDBcXAiD94BcXDA8OEA8PDwsCIAIfDA8OEA8PDwsYGP3hAh8YGAsPDw8FAAYGC/3gAiALBgYGBgsZICAZ/eH94RkgIBkLBgYGBgsCIP3gCwYGBgYLGSAgGQIfAh8ZICAZCwYGAAABABQAFAb0BQAAJAAAASIHBgcJASYnJiMiBwYHBhUUFwEWFxYzMjc2NwE2NTQnJicmIwakEA4PDPvt/kQLDw8PEA4PDBcXAfQMDw4QDw8PCwRMGBgLDw8PBQAGBgv77AG8CwYGBgYLGSAgGf4MCwYGBgYLBEwZICAZCwYGAAAAAAEAFQGkAwwDcAAkAAABIgcGBwEGFRQXFhcWMzI3Nj8BFxYXFjMyNzY3NjU0JwEmJyYjAZAQDg8M/tUXFwwPDhAPDw8L8/MMDw4QDw8PCxgY/tQLDw8PA3AGBgz+1RggIBkMBgYGBgzy8gwGBgYGDBkgIBgBKwwGBgAAAAABANwA3AKoA9QAIAAAASIHBgcGFRQfAQcGFRQXFhcWMzI3NjcBNjU0JwEmJyYjASwQDg8MFxf08xcXDA8OEA8PDwsBKxgY/tQLDw8PA9QGBgsZICAZ8/QYICAZCwYGBgYMASwYICAZASwLBgYAAAAAAQAVAUEDDAMLACQAAAEiBwYPAScmJyYjIgcGBwYVFBcBFhcWMzI3NjcBNjU0JyYnJiMCvBAODwzy9AsPDw8QDg8MFxcBLAwPDhAPDw8LASsYGAsPDw8DCwUGDPLyDAYFBQYMGCAgGf7VDAUGBgUMASsZICAYDAYFAAAAAAEAeQDdAkUD1AAmAAABIgcGBwEGBwYVFBcWFwEWFxYzMDEyNzY3NjU0LwE3NjU0JyYnJiMB9Q8PDwz+1AsGBgYGDAEsCw8PDxAODwwXGPP0FxcMDw8PA9QGBgv+1AsPDxAQDw8L/tULBgYGBgwYICAZ8vMZICAZCwYGAAABAEYAqgOiBAYAOAAAASIHBgcJASYnJiMiBwYHBhUUFwkBBhUUFxYXFjMyNzY3CQEWFxYzMjc2NzY1NCcJATY1NCcmJyYjA1IQDg8M/tv+2gsPDw8QDg8MFxcBJv7aFxcMDw4QDw8PCwEmASUMDw4QDw8PCxgY/tsBJRgYCw8PDwQGBgYL/toBJgsGBgYGCxkgIBn+2/7bGSAgGQsGBgYGCwEm/toLBgYGBgsZICAZASUBJRkgIBkLBgYAAAEAFADcBDgD1AAkAAABIgcGBwEnJicmIyIHBgcGFRQXARYXFjMyNzY3ATY1NCcmJyYjA+gQDg8M/eH0Cw8PDxAODwwXFwEsDA8OEA8PDwsCWBgYCw8PDwPUBgYL/eD0CwYGBgYLGSAgGf7UCwYGBgYLAlgZICAZCwYGAAABAAAAAQAAywcftV8PPPUAAwZAAAAAANfNTDoAAAAA13yohQAA/68G9AUAAAAAAwACAAAAAAAAAAEAAAXw/nAAAAcIAAAAAAb0AAEAAAAAAAAAAAAAAAAAAAAOAfQAAAV4ABQFeAFABXgAFAV4AUAFeAAUBwgAFAMgABUDIADcAyAAFQMgAHkD6ABGBEwAFAMgAAAAAAAmAGYAoADgARoBeAG4AfYCLgJsAqoDCANGA0YAAAABAAAADgA5AAUAAAAAAAIACAQQA8AAAAB4AAAAAAAAAAAADACWAAEAAAAAAAEADgAAAAEAAAAAAAIABwAOAAEAAAAAAAMAIAAVAAEAAAAAAAQADgA1AAEAAAAAAAUAPABDAAEAAAAAAAYAFQB/AAMAAQQJAAEAHACUAAMAAQQJAAIADgCwAAMAAQQJAAMAQAC+AAMAAQQJAAQAHAD+AAMAAQQJAAUAeAEaAAMAAQQJAAYAKgGSVmVsbGx1bSBBcnJvd3NSZWd1bGFyMS4wMDA7VUtXTjtWZWxsbHVtQXJyb3dzLVJlZ3VsYXJWZWxsbHVtIEFycm93c1ZlcnNpb24gMS4wMDA7UFMgMDAxLjAwMDtob3Rjb252IDEuMC43MDttYWtlb3RmLmxpYjIuNS41ODMyOVZlbGxsdW1BcnJvd3MtUmVndWxhcgBWAGUAbABsAGwAdQBtACAAQQByAHIAbwB3AHMAUgBlAGcAdQBsAGEAcgAxAC4AMAAwADAAOwBVAEsAVwBOADsAVgBlAGwAbABsAHUAbQBBAHIAcgBvAHcAcwAtAFIAZQBnAHUAbABhAHIAVgBlAGwAbABsAHUAbQAgAEEAcgByAG8AdwBzAFYAZQByAHMAaQBvAG4AIAAxAC4AMAAwADAAOwBQAFMAIAAwADAAMQAuADAAMAAwADsAaABvAHQAYwBvAG4AdgAgADEALgAwAC4ANwAwADsAbQBhAGsAZQBvAHQAZgAuAGwAaQBiADIALgA1AC4ANQA4ADMAMgA5AFYAZQBsAGwAbAB1AG0AQQByAHIAbwB3AHMALQBSAGUAZwB1AGwAYQByAAAAAwAAAAAAAP+1ADIAAAAAAAAAAAAAAAAAAAAAAAAADg==\";\n  },\n  function(L, T) {\n    L.exports = \"data:font/woff;charset=utf-8;base64,d09GRgABAAAAAK4wABEAAAAA/GwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABgAAAABwAAAAcfg3B8kdERUYAAAGcAAAAHgAAAB4AJwE1T1MvMgAAAbwAAABLAAAAYHN/dWZjbWFwAAACCAAAAjgAAAS+1h8aA2N2dCAAAARAAAAAFAAAABQDqgVBZnBnbQAABFQAAAGxAAACZVO0L6dnYXNwAAAGCAAAAAgAAAAIAAAAEGdseWYAAAYQAACaMQAA3UhCB8sWaGVhZAAAoEQAAAA0AAAANhEbVxxoaGVhAACgeAAAACEAAAAkDwIHkGhtdHgAAKCcAAACIwAABLqV4QERbG9jYQAAosAAAAJWAAACYL9F9WRtYXhwAAClGAAAACAAAAAgAlUBsW5hbWUAAKU4AAABMAAAAkQJm1bMcG9zdAAApmgAAAeOAAAMErscz7VwcmVwAACt+AAAAC4AAAAusPIrFHdlYmYAAK4oAAAABgAAAAb3vVi5AAAAAQAAAADUUbVqAAAAANTcZEsAAAAA1N+oPAABAAAADAAAABYAAAACAAEAAQEuAAEABAAAAAIAAAAAeNpjYGYrY5zAwMrAwmrMcpaBgWEWhGY6y5DGlAbkA6UQgAmJHeod7sfgwKD9/z/b2X9AHWyXGWOAwowgOcYvTHuAlAIDIwCMvw7BAHjazZPNS1RRGMafV0ebrxydUeeoOF5nnA+bwFqYu2hnEoh/gCCE4VoU20a0cNVeXIirkjEkFxEUiIuCaCOuxsEaxc07iyAxk0CYnnuOLQoCFy068Lu/55x77+G+55wLoAlAI7lOwoBMQuAPveao2PHGi/GA3GD/Lu7wnSCKXtgb8qa89XQ8ncr0ZArZxex5TvIxbdaw9mqf5nVYR3Vcp3VW53VJV3RNN3RLd7Ssh3pcC9W663XOWPTwl5mgQY1ypn4d1BEd0wmd0Tld0GVd1ZJu6rbuakWP9KQWqdfr5YNA9aD6svrgMz6d7v/Y/1J5WumpJPfCptt0GWOSptN0mHaTMHHTamKmxVw1URMxIRM0V0yzaTIB42r+Ny3qXxomL3o3/Uov4Hp7lMd1RYAeciBGTznQSq870Aak4w74TjmQADI9DrTTBQc6gOyiA530uQNJICcOGCAfc6ALUEqbeemmg8T/tn6aVWgv8wDd58At2r+XZx6hB8kw823a748y36PHyDgz10AnyDTzfXqGzDI/pOfIPPNjeoEsMT+hl8kK83N6lawxv6BLZIP5Fb1Jtpjf0Ntkh/kDvUvKzHt0hRwyH9BH5Bi2WD0BaiHmMzpCWLe0QE5KFkiKfm+B9EG+iQXi0c8skH76rQWSpt9ZIBn6owUyQH+1QLL0mQWSg5xGLJA83Ua4t1Kg2y2Qa3SnBVKEfH9kgfBfFe7Vr6MqDf5B++P0/X6OG/EftMTlH227zEM/AZQ63VMAAAIRAJcAmgC4AQQBeQC2AOIA3HjaXVG7TltBEN0NDwOBxNggOdoUs5mQxnuhBQnE1Y1iZDuF5QhpN3KRi3EBH0CBRA3arxmgoaRImwYhF0h8Qj4hEjNriKI0Ozuzc86ZM0vKkap36WvPU+ckkMLdBs02/U5ItbMA96Tr642MtIMHWmxm9Mp1+/4LBpvRlDtqAOU9bykPGU07gVq0p/7R/AqG+/wf8zsYtDTT9NQ6CekhBOabcUuD7xnNussP+oLV4WIwMKSYpuIuP6ZS/rc052rLsLWR0byDMxH5yTRAU2ttBJr+1CHV83EUS5DLprE2mJiy/iQTwYXJdFVTtcz42sFdsrPoYIMqzYEH2MNWeQweDg8mFNK3JMosDRH2YqvECBGTHAo55dzJ/qRA+UgSxrxJSjvjhrUGxpHXwKA2T7P/PJtNbW8dwvhZHMF3vxlLOvjIhtoYEWI7YimACURCRlX5hhrPvSwG5FL7z0CUgOXxj3+dCLTu2EQ8l7V1DjFWCHp+29zyy4q7VrnOi0J3b6pqqNIpzftezr7HA54eC8NBY8Gbz/v+SoH6PCyuNGgOBEN6N3r/orXqiKu8Fz6yJ9O/sVoAAAAAAQAB//8AD3jaxL0JeBRV1j9ct6q6ujvpdHpfknTSe6ezddJrFtIECCEEAtghEVmCAiaIQmSRAFFRkcUVFEVBxgUzGh3E6oCKCoq7KDWO44Cvvjq+OOPMuIyjjDISui/fuVUdCA7O+/2f//N8H0m6qrq6quvee875/c5yLxSiKKqP7ZcVUUbKTfF0gFeEeIPA5wQRbwrw7DFeF+TlAq8OJs2olKqs0hpCDq0hGNE6gpGwy6ENO41ah7MePX0E7YnHceIIvqieFrpxor4e7enukt6kKNmZn87cIXuPa4bvCVP11ESqjbqC4isDvB1uHuDHCHxrgE8I/IQAXy3w9fDVAuKnB/hJx/hpQrIdlSanTdLqnlMX2Surx0xg3eYaKqm2a3WDJnNJTU0NP0Y7aHX7YC+ZaNXqko1x2Kuv1up4qqayiglH3aEgazIbaDnHupwVtM9L6yPhkLmQDcbp0SgaCprkRs5ITrp9YZ2BDQXdYbedMZhCwWgk7HU5OZO4T3YVh9GMd95FHW8zs+wGvOvMum8emCtzznrJZpLb5i3h9++5ZqbRyGmylLKQFv/362/i/84tQoa33kYm/BW+2rFx3vxbNi2Yt/Gaxsrg+PHBStm0xuVjxi5rzEu/l5y2tWz8FPdB2psKyQsVnD7oKyosKc3NVehU8rS1bcWKNrksPqOubkZtumrexlvnLti0qXTeuHHzGmEcYSzpLrafCVFKSieNJfRhViCZfXbkxDFz1rP+ePz0h2ScursoioFLsxQUu5kqoLxUJXURxcsCfHaI9wh8RZAvCvAlId4q8HqQiaoAj47xNoG3aZJlqJRXC8kgjE2ZTat7Rpattzp94sgUebS6fRRSmxRwWFmlMRTS0KExEyv2ZgXtcrJyr9vlVCO9BgbGTPodkTHSamAAxqy4b+aDqHHVdWjcg89+M3b5vTMexs/39uIDD828b0XfV9cj9dxO/G3fV8xzs5B27VdfrcX/YBo+f3px9aObbtn1t0+X7rky+vDGTQ9Fr8SfIfW2Vb33o9ze+/AJ/P39pK1YYPs4gQpRq6j11K8oPhrgbxL4awPQKsRvCPDUMd4R5OcI/Cp41SQvgVa2C3xTcO/i9ksUpXy5wJcH+MUC365JNmWX8jqB12mS0+BT1UHocN4STG6EHimfAz3gq5y1YCX0AL9YO3hFz3Iip+26Z21R9uIl195E3tdpk/FJ8O403V6NsbVN7LtrbwL5rQ7XQL8ZDWaQuVi0HoWJyPq8kXAsCj+RsA/EUM7ZEHSsGX5NRoOck3NGPfm43JCL1DK5GhkNRchURJtsyOurQDD0TqNBxsnhJoao2TSaJreKRoI+r9kUYLwRXwzUwGyScw67z8snP/k0yZdePropR75gwR3lS9Dgvv/6cN9g2eyJcY7LYhcsuLNqUe+RodNH2AOjtBa1Rm7g8nUmq8rqmXFAftON66IRjG+S7W+imcJCq4Gh1WpLYaFK5XL5Zu9nPU/9+F9vjMp/Dv9whnpBO2X8NPg3/kTJnGWjx+Zwc0Y3zLklfEPbibFTp02bOvZE8eyrJo2SyZXsnIbRczZUr2lnDyxZ0hU/UKM15+oVVoVzlD9a7DdYfdMPxDfKSooXjKuvv7atjNk4dj8DX+90FNo4WYE1VBVkmLJS34z9Yw8X9PQUG7uvVFNq0JsuBSULUbmUnjJT+VQR5aJ8VCkVAAmJUXXUaGocRUVA9x0gulpQf4cT+jkSMjKZP23EYURn93++PXeuvZb7vLa9o+ZUYU2HAP+6BZZKUbARuo4IXQLajsl7J+vb2uqZPTUdHTWpzYJAdx85go8IApw7u4/CF96Sz0BzRBk/Kd/D9VMmyk75qfHUYDFFlfKcwBcEeA1IeYko5WaBN2uSbpDcbCFZCjLrNoPMyjhNoUMUxIJirW5vNlXkFHVYa9AVItbujiNdJExTRHlZc1gHSms3I68SmbQGmnXZFzx7ApWjBlT2/TPzH8BDeOvh9Wc+fHbthG+veRMZt6PcI6f/PIB0rG3gbfzYEfwP+r2H8Qcnnl0gXvbw2+hKJH+gae0zH+JN25Hp7ZUDp//8Jn6Ptb2Hf3gHP3FYtHHn/lVJxxEYv4WUFdrKM1L78gK84RjAVjIfWiU3AAqYakQLSEaRAgOEQHsk+wMq5nNyn2xnHxJQ0c2fb7CFg/h/nrvn9F2s/4GP0cP3HkPmt2/+dK1i4A93/nhXhZ39AxhZijqzh6vnWCobJIYyepSgW6CcciUyj0bmoMlsMuciL/ornaDZcaO29qRT6T1WT7ktr7N0IVPVH0pcSbfSrMN786itlvTp9N43+qvYWOnCS6o8XZRkx8/I2cPcZsoBaIl4J5gm0ho+P5h0iaYcVD4WRz5tISLqajbBQQXyVTARl9YLeu/Pv+/QFRt2yS69Q1/pZBiVP1Zc0FBZ29pZ1X/v0zsfbZk8S+GuOjSfbdGun/7BaKPKO2Hqr+9aXVU3feXl/qHDkfro9xQ6cwZ/zclAhvIoylyI4BsiWo94d/HAp5WJBy7X8zctXk8fvXLJ6kXNL65bsl52+oWrlq7q6p03qsz/4MXMNwMpbPBXvfX26Er/wx2yXd+ebjT4K98S+zAk28F1gd5VUDXiyJXDyAUCvA8kM8i7Bd6tSdpAOBVCspIIpw/A3mp3ECNq0ybz82rIkFb9TDEpLzycWRsCy1eIwCK6nMTGeX1ag5r2+voSLNW+qrcjRbWtQbeUl5e/0L4mvMDtU5XkqrKVDEMnmsLTLpvpSvStaZPt6FjZ2346euP4CaPt9Al/08bKnk01RqM7WNudnf5rpKOikFWI7biJWyT7CSTBQ00RkdMJIxXgjdAar4iWFgAFTbIImqIRkj5oSpEFFEtuMMoIBGi0vBqUzSkDKZXX8PnavYCbGlHlLIjAZgyZgKD4kAicdkDMMBUKFoLgUkBk0CL+uxufuA+tH9PSWVWP+zqvHPwe468G5iB638o/3IjxMyv/cAODMf6OX9SB+8aM6axpQjfe+9yNcHz5k/iefYi+/g+9z2J8w1GwG+iMVz6BW0xZwAaGgUMgPhLgy47xKiEZFQUvaiKygEzRGAKRYzk5UiMzouKAQGrGR0XNhYzZxPmIMCIfCrdMfMTNNM5/yYn0BWzprGs3X9tlwV85i1Wpg/RvchLzbFYuMHZCPq3RBMJbl7WrVaqq2PbaaHv2bTsntYS9zDhVsRPpLF1w4ZwypgB/6XxpfuoA+v3chNZW0NoQRGZmh0aV07FsW6QyN0s1vTa6Iwr6eQZTffJJwGl1YMnLKZ4N8DkCMQpeGJPiQNIPbUnm5QDMZueCNHm1e7M0Sq3Y5bGz8iRHIDw+5DXSoM85iACrx02EyUckjR3v4Lod4/2pb73VtZ7Ut34ur8SElqMV3rpaJ7oGLTc5DAVVWepTdY5P7WPHEgEy4m6jEW03+lFF1Jz11ttG49tvZelcASXIkChHS7n9nB9QqIiiLOissdXQFchtZ9VIScfAwCgRmJmLH/oAyZEFyT946GLYx6fw3/CpDx5CeagOv7EPBmgUj18XX/Bh5hLp5MU/uygdhc/V8fgwivH4DXw4iarx2+JzgFZyFOhl/r/j3ohnAF0S2ntXdpwOgS41X+CLuxJrVrexQkfvqvbU/F/6rnNtHkvxXIAvBEySbLhd1B1wRQwaYsYJRjlAd/LBmu/lcjUyEaLMhXCEsrKpjL78e6+hiEMb0jqMDq1L+0vdhtCD7wP8dr//S32FuffRg3je+3g++hX1v/XRyG88r5NCaAdB+W5hRM+kQwLagbsE3I22U9T599Zf8N7G8+/JUuffTchgJHdc9iClhXsgXhdIUtkE/pP6jCMAIxjVEAqZi8gru5n+nD6+efO6fc9dt3L5umdfwD8yfz24IT2b7t+A1qzr7b3yyt70+TJqBg+OjBeMj1EaL8uI8TJL42WF8TKfN14GDpQOZYFvpjES9aNqfnnYjL84XKziPwzU++Q5xfbvgOf0gB0jEmULwUPyWUHRJlPDzwkCRbqF2GQHPOdgloapqak520USzZb6COxcGOhxEZJIsgY0wHu2255Zt6z3umd731/b/9DNPfM+OnrlonVTWjvSd6bvmMn86cA60pHrDhyUOnLpu9fdvH3ewYPzpkzAP7Wln6MnTslgfrM8i0uA70ZpEaNEDHJkI9r6Cl1Olx+iLemlJ08yu/CSdDV6EnfQb6O7aT49TcJRth9w1A989WKK+CZBgaAQsXXhAF96jK8U9uoqS8F1AcJXqUkqodFOIRkhg6ODRqtkXuI2KysBgGw1vFPLF8JIyYJwijI4a8gIaR1hqdlGAwe+BQJfQ3Qm4ywgU0zsJwe4IxQHpjKOvC4vml4Tuf3GusjUQLB6bWGl0oE4B0PnGEvtcx+wdvC/wT+8dtenaIbimtmz1ihWzprFRha1zWxpbQuvdRa4r/KH3rUUOA3hoqr8eJ//2ptOX7+mY8vQly+soume/X0yieOyZwrlC7jrgOOOolqI9YA2Nwt8Q4C4rXmSTE4K8KOO8SGBD0lUAmRyMjQ7NAp4rjvPO66RALBNyzvJmOtNOhWMLhFDn5f2uuVqmSeicwRF3yoXgbPlikBjRwPykb9zPhgTR3UoaAIHqBRoGMc8AAZl7svbke2L38yimR1n8KMv3/DP3+5eNYYeq0Kz93wQ0V1WM/ZTZUGOqVSeLy8vqHBYLpridKhkrTVsvJWdUs/WttKvvIwfO3UXQy8Y/BrZt7+MLvlpC40mXJf83Y/zFOjSR3ZcMqGw2VPZptCsLNHonTKjrMgw3hny+auqY4r0dTUtU+prp8imivIxLFf6kZIll+Ujj0wPv+fL2HF0xZLlaCH+aC0Gh2Ltv4vcFgUxhYov8VaM0eJhvhqSrwcZjBEOTgf4POj76gAfOkbIWw30uCIEwpVHejlidETCHuKNip4s+QmD40lCAnI1C64s8WMJgxZ/QN7krHw97jx4Z6AyV16co8llPFbOP/uJxX+babbrlQzHqRilUpnN5WhyiuWmsvI7Xsadqo8+6t46fktfeSQ6rziHsRfWTsjdV7vyinErbbWBOu9o+/hcBWMyzCyyMznFl0WiFdduHr+V9BUWmD2cANbNRThpFpEiwuUc0B53gLccA3xKeqA9hcDg9qm1RkO+aNbyNWDkFDlqo+QpmeMoZOLkjBjz8BEOqteBlUXcuWBSpO6pghyk7usUFqNrHqnfNrvCubnj4R68EGnoRfOWPbL40tX30jtnFregWG36X/iet36d6FtHO9Dkd+jtnVfuWDhj8Y7zdKAM+r5M1AFJ+iMCia1ppHEIHiOST8YhG7T6F6VdBo8dlDMcMB0zMHt46igMip6YPRgHl9P7n0S7a+mJ0fMiHcbCwALP/D829kVaLJbyK4/Ov6hvbuvYpv8gzn2zV7+B909pqZq/7CiKNTXRtro5veMuGSvhTbOCAtmtouZRXRRPBfgxIaDTiJ8v0lJwieSaZC0odovAt2iSY2BvrJBcQJy+MmiopYav1T7H5mr1wVGd84iut+gGaTSDmLuxY2AEmydflJgujqCFgs/PICEXh/Y88RSFkyHCSYvCaRwhmeBunD2Sk1etI0LCNORyci24ScOSzcDFsjvw7TuX+3wqxmlXFhgYfXDSignPtVoKcxCbQyuMSruTUfl8y3buZrey1jxGlZ+XSI+uR++qc71/XtEeVTF5VtaqYa3V3WNvi+WalDIZrUL7Ud7ch8auW15SGZhttJjm1GsGSi5uH1u82NUcafXO0LDG8ByTxTg7UFmyfN3YpksY00qtRjve5XD11F9XE+vBwjwUM06YE7ysw9E0Hk6tVPX5ExMrEuaSQGFEH5eLfKKLE2QhSkMsCNAb+BkmJRG0h6WGBNl64jOd3sO8hjcfxwl8vC9BJ9pXHR/mNCEYxy4qCnZ6vDiOxEKMC/BV4iD67ce0vD3Ea4VkI4xdlR/Gwl3Dy7VgMniAIZneSGA5mQeDlKwZLUbGLmxFmOG+FqNhI4dKjkRWFiGszMF14S2vbA1UGOV+lUbDeAoYS7zz7plfz8lza5RyWS6jyFJmKUvKmNyqwJZDrbNYAQFPC2ExxvLRypvH37WmrDo216emHfZqMC0VnbOby1Y64mMCTZ6pWjAt5sL5efmWS6sj5X1bxhsc6F48fAepPyhK/iHwEx9VAj+DDInO+AReESQBGp0k4qUBEmClkgXg9yaL/aTRGTZYD0AUigz/SczQhkJGlzHz59GioF0esgcF8V+V4yfBUSXtM1k0lbAHg/Y+4Qgc9rkrKtx9sAMHdBc8HQIfcJt8HKcgzFZnqkNizEQccDEEAAYMfCKnHCFD+W57FN2BdqFHHLk5st3lBntKcMx0pAR6S0V6fbmbXpPeoMq2Oui+CjsTczhSh0fwWwUgxXjQauL3qwXeE+DHCYSuVEDLm0SGphV4rSY5ClS6REhOALEYpdXqnqU5a57DUyXqrEdNKIpSSyIC47R8Qw0f1u0zFpSYRxFVr9Dy1WLYymQn7rNI5IgRA5FBUbMpFgX8ZsHJ80gxVontueEz5BCukLQaceRK7gs0alnHmDFuT0lBR3TS5EURFBjomjDR4ViC37sTv7+c7rN1X7/zPtS4bNkKfHRJV1OTze/2dNddH66txQfv6bKVltQi24NfLEu0NBUUJKILW6cA/xqY39DgSDgWeW6DW6wttnXfg8Yte+jBZb2qJd0Tm2y2rrCmumrypFp86J75tnqKOYPP0AoNt4dSU4WUl6LykRaMswPpQ4wXnhT9W5BSr0Qevdbwx19dga5Gz+Ejv8ufPLSlEe2usMvetZeX24ci9opPD4LbmIWm38NWpXeh5kUPEymlxzSbMFsw9AdHVZWDeYu8pvbx6FncD5iFn8f7RNw/8z0+Lt/IfUnVUZTXJHUjiUSJYYEKOko6upCGI9A/nxeOKhA5A58kp0iIgDx27oQFt71/dID5ycBZPZX6lGL+a/23B2svZv65pGdUW74zmIqWhayW4Cx6wJnf4krPqK20+Me+nmDefTRivXPWq7tSiuWv/+PSe8gdKp0muT6V0x6r2tT/5uXMPy/P10xftDqYipQpmdwI3KHoIkNhenrsluWOsUZyhzdm3WmNPJpSXAftYYmdY4mdyxYZQIBqkNhMiFcKvD1I8lTeEG8U+DLwIypFKVUFeRkIKrxqkhaQVXeQJEf8wWRVxtUCZliPwqXIaRy5j37h/f79/Wd/aWHkEcrq73/+0Udpg3ic6ht5NMzBxHiaCywKb5PiT8BZrMfA1vJ5UvxJJ7GXojwwsMZM+KwIEakRGS0ITimKaCRzEgnbSWaPM9b4+7rn0Yk53X3+2oT/edz99u/BZ00dKY6XtKr8Dodf1VrCFPkTP6IPf/iTP/H55/jz1opMHJoSZDtYgcoBa+IHmSXang3dFSDppKIA2DwSiyax57PR2WjGoP2no3o/K/jjdWWnQ6V15/bLake+j0L++np/SX09utofj/tLRo1CPZl3JM4KPSa7XLaLsGIdZ4ZOiBEj4PV5QV6ZCqTV2NHV5U1si58WbNaqaI89veuEezV9aGkQF9SwY9m+6BI7nEhF0KgqjdjWzQpKlkXZwOesphopXiFyMUcA3C7E14jSUgSt1pAYLp8rEN6SdBVpdc8oTGa5t1Q0aQ4PEMlcqjiWCbmbSYQXXGOwvaKbRVQG/GM5ccFYDdhQ+KMNJugZL1ExUDKAQpfTXz64eDWaja5Cs1cvHiz3+0sHe1bjfnwP7l/dM1jqp2tA49egLHwSb3CvO7BRWbLaqZEbNLlKpa2TFgriYwcmTF2wYOqEgbHxgvwxY3/dPHX+/KnNvx475ndoCUL4DL4bTJFh/9q1M/OVhSzN5YWrAoGML0AdYF5jj8OzURowrcGYEol5Ux841IT6EscZ3CYj8bAd7oVuMAi57nCoxYO/QPmeFgA1/D0+4VrkcjhQHv4LumKhG/Zi+LCjqcuDGtA4T1eTHb+Nqu12dyTsxgfxIQlX8G75a9wn0P+BzIjCcAKFDSCR4so5sw6JoTs5oqCTzPKMoTfJOa8vJ8eK9lS0M8+GzPNMTk/v9uqgakytsQc/XuMdhQ/UhVMt7E5rzSXzq2osRk92zlhVIrrBgz6Z4U7f3VRPP+yuRY3RmqqZ/4O0d1bnWmrxq/iHRMSTvgy1bfJMmGAzxD0Kx4IGjyV6Hh/Sg7ZSINsAs0gCdrlD1DnkQARqz5ryvkQXCtFU+yqFKh3CfW1raIEGOtElBrO7SRwo0Ucoxpq2gyy9prcdH5GO6G4SxCbfeebMmR0KJUeJ2GGk+NwAny+IRqIokLSLCpgvWgLSZ+KXxhwgbrATQOKhnO1QLuKWxctkHTJP/KcDcU+Se8OoaPGnm3vGxJsWYd4/RsE8mJrXVRllHoyUlx8AntFS31Tjl2wBwu/IePCtjFQEPPZx1GCUsJ4a0VvRwWPUixoSFpJx0IswML19RuBRFlEtojXAgWJ1gPN52r1MFucV1UPP6cwmndEhckBfBS0GjszemM6uN6lpQHL4lbu8AdobIYpB/vRGU8wUi6iyV106bxPt/3Vn8XZ11rzd+EfM4x+euux3CoWLedDFZMl0WpfaE94bHAgNNhTkm/UMk6tm2MObt9yzme29Ff+jeyH++pb//mBl9bvHrz/6687OXx97zqFAd+Ml/lHmsoJR5mDzd6++9MNMnxf5ijh5YUFW9umjR9sZpv2opCOC/EOwixzh04RcadE3sq+HjLSAKTQZ1Lb5rP1UUPA5DWWgLKKkSAAfGUZ4uNIDl69p47pI/O/UjkSfwHUNUSSmiHYQ6aCprrY1fYn0DrorvaMLbRNxO32mlGngFlHFFKUnFLlQpmbA8TObFEh0X/S6WJQwaOlHr2kfY7E3ubyqLFmOvki9a5oiG61A3TLlwUPco7fmKJTqORej37y51uCm/2pw5mXlFGQbOava7xhvx7c/r1CgR9ALFt/UaTq0HNWWFiDUfSl68fud9piEW7dwmzmDGJ0wmSlH0B3VRTTI6zPpaIp1N7QBsbnmOdT63R146JIr59k34T/jW/C1aNqSNjx053do0rNwV25u+HF8Lb4d/3mjXcTxkf1W8B96Dv1S79H/oQ/xIqkfzxtHh1YJQyn7Dv0VW4c0tBXvo0HT8X7pcx/TCfZ1wEHob0J9ELFHSsRFIhXolqoq3FsRCYdRIz4QQWrYuTMYRnfAuTB+GPdHhu3quXuAbYsSeyrypyp0S0UkEsGHUEM4HKnAvVX0TrwsHK6IAAJcCpsIXh4m98giL7Id4HcooLdt4H0EqVrwyFqo6dQc6q2MRtYKe021UUUpMQ8AXlUCoUAXh4ifNisIXgnvFQjriQfA1UZ8p6i1rMCzEsPwA/nRJMOwVxckhTyj4VWTrCDMSEzotcPeJUJyLmEhLND3XIuVeOPVYcA9R2kVUexkuxtONE6aLPp8jnxQ/bbp8Bm6Ct4uchUTug+uYUUNX6obLHT7yfVxL3xKOV6MVRpCQRhlJ6czFCIx9+eV603EGQdk53QaAkYawCGaxDVMYmBDRxAULqEzW4ozkQvlJPNDbgAKMXzTru54ov5FZ6jOalTYWmoUhik2F1M6yTXxy1du2XTwwG0bW/pmXLyqd2YHG2wIDv+iVcqKVlvLspZC5GiqtyptrpabFlweT9TQQoI4Y+j5ukoPbYR7tdSmcuDGrkmljGsiPQ1/99JBpDuE5/J9fTMuWYPvS9TXJ+LsZnGD061BhW3SsqbUfZNcTbXik6CLyQ2rCJflzuyQfwmCaaHcVAVYXCfFW0kki/haZaK9JZYWOtgKXWfQkq4D1DTpwaaGHEA3AAUCCNxsYgE8DjHB7XKokTHmGN4lRRAO+JNDHzqcaoVaPbZRlXuVbI8tLt+pto6rPzUt4ac5pJPdHTZl6U+7CoICkyK7qecLgl2304bNbHVJesd85qcxtgl4JV4c7ZLVFDM7mhsb4v39CQ8rb+wurqVpWbVfkLapNUJ/v1CQH8jEFbDAdgGmKCkTqXjKklivOUCoOGGUoJGivhsRGWpt5giFUKjejxMJmhL89Zl9wMur8Rauyx/vJu+czoKDI/74cHxzoXwUFwONyaNIBpFkOmiB5BGTNAIuzYg5AxRiiJiJFTliTAK6EGgayA8D6CTGIFYLzz+6JtBWM8Zd5IyObynpuO3WN7X2wvvwv14eXTa1rbjUXjt1QXzt87LSoXr6/Y1+Dad05uUVuPLo3MIdO1C+tUBVH1a7LPEZFWFvFQisf6OIE/B8h7kIpRItHmXmRGsHVgbollimog1pzeYKr9zl9xtTPbmBityq48ePVxU1T7BzYzyeIY8goMuJdcvgDshOCGRHKWZ6wLadNZvDdtRBEjTykNt6aoLV3dVRK5tQ23FqO1i8blY4aXW7rUNdo9raRrH1uFssSskiYwWcRwDfygIMuQp8xglUGzWfupq6lvqKGpxAbM8YYW/+hDEK0ViUBMAUEduzXHS/VgdJLrpSIDH9i4S9losmKUj1GeKvEy0QOGHggfnAugQFPqghos03B0lQoRVeNckYkiq3NMmlsLdSSF4PY+eTgUXRaEmOgw9qk0UG2MZ1eyv94Vpih2LjwCgFSiI1JJxQrk22X00MkhsMEj+zhi8haQO+Vpe0XwaX0dqkrwy2Sl0yGINtRJv0lsO2Ujeo1V1OvkCt5TU1GY8wQhwtsFAi9gKzD4DTzJjE1IJXhFxKowPWr9MQTqMPR+3ETtm9lA0RCwW+otfJnN3jjGLeBW5ENLYC+LReLBiAPRrAe8T3dXV31fu7/fVfKmyaWtsUQ/3EFluraHZsCjBQUcNElLUN0SiI2Pvvxyn8W4zRCTTtxAnMn0DNIwxakF7I6g2qWtFONRnK3XY6Pr6ppdZYXVlhlU083jUfvmi+vz5j3+g3Wm2qWpvCWDtxok156q9WMJ221mCWPZo7kbkUuGp62zbEoDBitm3D85/8/vsnn/jHP9KPkEcVn5ejyE4X8eOG7J4yg6bWgcDmjjfoWQ07OQLfXGNEBSWFionpR8QvJDqbh15mfsf8i8oFb6CQpK1NcZrgLspjimMFAI2z80Y5FXm4B1B2Ce2qdSgtBICNrDdSgDaEw3hNRvfxcTCm+zMYTygDMLSFaDKm2PeHNATvRVj9N85h/19Yx//CPP43/nGOg5zJUhi5zSRepw3FHEwIOWJxOhIl3mAA/AiX3uFz6YUv0FIwce/Q2imRBZON0Yp8/eSJ6d/iqIDx5i+EfrT0SEpgQjKmqMHvL7Do1UoFE0oJAu7P+CtcF3cNWIMQ+PFiXhF0DrRSqUkaQJ8KpHSiQQkKI+Ny1IS0k3AlyGQo6POCG0O8UlKRiAwqeCtPKpjyhWNxBrYZqs4ZG+t7xlmNi7pstvIxE69FO5ABPXyodmDloY0rmIQ34GeLvIaGPUu6O2+fe93D17c2+o2LF9K39XTZ9KZHV6T3jLp+GvoN+mtX9URNrortjbYtmdc7yjz56IYJo+e2Xl5/rjZuPPc4NRWsz8VUK7RmRoCXHeOnC/y0ID9dk0xAgzqCYC1I6WdyOtiI51Rqjd40rmUyMQQJ7V7z6LF5ok3QPZfvcIcisdq41GIdV4RMpPoSmUj9EVBqoonwnqjaZAvOlLgP2/DojMISqJXLOHGfXAvnOKPZBH2CMrZbo/Hzfj+fr7Q7PgpWaXu0pWVDS5q67E3WTsPCMr58LKtgG4IPBzX+pNudLNFGv4pUGddonWX4y/I51m7rRGun9fJgf1lcxTaGHqJPCYLAeibYH3DNc+00lhTKrLKLqjAftNs2185/yC8r21fmtM40llQNRGaqKlRN9p2OLscD9jrWwk4pR7ODDtvugoJyvpwp6y9zGKYYSyIDkVmq8tSJo0fRBNqY/lrCkNc4g+xDSg5S4yD5WSaQzLGGRCKpCPB6gTdIiTUngdOkwhAMZqx4jlhXzKs1pICAzxMyRW+aDDtjgix4fSGxBjFiZymdNhTOQlQZct360m23vXTrEyj8x5tPPIGP42X/jVTor+jS331/9WE4fBIv/gBlHdq48dBGtPjmP+LfPv4xug0VPfH9e3gXzsc/fIC2og5UdPjqC+IVielMoy6lFlOrqc+owUaCV3HAq8b4WbyKinh1tYhXK4fxqjnATwG8mtKcwas1F8SrqIRPdSQTMj7ENwh8S5Cg1RJ4f7mQ7PsFtKrTJSuBACfLoyClJYH4uObWxGLRZRZh6uJhmIoCTHWeB1N88GcgNe//FqRCWuf/Lwh1kk/++P8dOv3mu5TwbXrX/x02IeoTufOcLyc6ckriE0aY0nAA/sLhQJpLZ0eCYbY89WlFBeMiflzaR38UDFYM59Teli+QvQOMVIq0ycwoCiaHQ3JSnhclLjzckJIjQyxajqxo/Rdsl0zNsVzqs3K6xlrFcnffwSnsNu0po47u8jgQjfczdXblAzOZmEyulnGpByNYyDEWaOleer7Fmi9n03coUruL8x1fDEALVGeOyXdwMpKHiHES4WU9UfhWHQm1eNwyVh91x8hvCEgwPIlBoS8uL1XO34BOIutlT9REP787RxnDj6UXgt9+VWADWvrQOlQ7wRPoWYkfffYVPBDReq252XrhgQOvN6Kce+9A+lalKhZo+/hbrH3wp1gFeAT+8pdX3YBvJP2RdeY1+SmuhSoChJIy4b6zlc52gbdrSOibxF1JpbOdZBKLZGKtjx5EnEz3IOnaCpoEWs0Zx5GScSyNwtGgSUx/G7K630HRF75C66aOV4asVgtttKx/rXpspcpww21Ylk4+jD88wAxccsPMmfGxl9Abt+L0yz13dExqm+gurq8c49k60cgGqjtTs9G03eUY78XPjLn44ptmzRweTwdgbBdVDL4awdj6ERFjMtMiIkXGyooAY0cFKuskxNGSCQAms0GuJs4qKJX4G2djJHYIJtGZRSPwfAxyktUXQ/wkqOesu3xx/VLmosqo2xYARL3qisZm1XSjy5nrlzXir/Glh0r7FrbIAlfOL7BMnV87YVx9T6OFXmQLuixyQNaV46/YdEeLafLRm5vLq5R1uVab2iOLV9EH6tcm8Cn8GH6auXxJd3pFT1dBzH7LXPTd2snj/CJHOnMX2FSVyI7c0NIyijIaTISbSVFi8akJSSPKgAhf8gD6yeBP2jbZ0YvoJacbvYBeNObqch0O7IC/sbjJ6Ya9jWgG/N6MZq9DM2zg6ZD5NgYDeVWpDH52dwlwFYMBf4nM8HrUUHL6PVZ19PQPP3uRciniWJSQiipVgOQimSBJXvgFPi9IIpZ2MUPLu47xnJjxUQfJICVtLpArvYX4CVoV7HJ6MKp+7V6ZwUwmxvB2XdLirRFnxIjZMgNnNAwHJOQoCm0/VyICZ4zEg9u3truDNrD71t6wd+8NS1rSf2VZ2jplETlau49NfzN56VpmMt43Br+Sa9DfsHcfokFQGgxxA2oYu+/GG5L71qoNufiVetIutJTtZ9tJHh8sBjKRjEc4Y3sc6DPPTA/6zOFobcM9uKetlflrlwNHPR70DsB/aytei25sbc1wKEFWBNhYDqg4jpotet6AaBqxj3QhUgEdJPO4kpYSQPWaAD8auqtRFGifwPs0yQIQaKOQHA9dRvLbDUp5jlbHVERrakXwqg5C3xX4pHAOJdM6nIArQKUBTVwOrZsCKZEyZ2rGWcFkjlBmskxEzPJnqrOMyINYfNLvp4/7/fgkYpHHH/d7pl3z1O+fumaax1/vR7ObGx8faGxOb6e7mxsHHm9spvvfwMct+IS/zw+/SG1BRW+gPLj8L7Er5jaXlDTPvSImHddFQ6FoHRq3BQ1KuyLvaZbruDWUGlhPWJTvs9llEGkdbSal+l4wMiZzjJTdID1L6oppn1yq5ic5nrFeh48ba7e3NJ162fFfbg/tDzfJGLnhslnXLnoO/6l5/J3voSbUjqquabxye/eYWQpljr6qct8liZJRBXBdid8+Zsypl/OYKfi/bqP9k3aWVqgMRbapXevbGsZ/fvqFa3bddc0kNP6lrkv2hQImBcfNHENlcgTrZWs5A2UExmMR6ztdYv2TVqxlJ3RFShOYJYMppgpI6R+YdxNQfOABZhOYGmAFPsU9TONkpLzlVpTdMpa5h+ucfxgfeQcnO9p+Na4F5SATUrWMGzcR/4D/hv85UaY+3ZAfCLZOqarMYw9VzvS3JUbXdQedvtpanzPoKa6tLZaeb6HCwkXAfrhI9hu8i0y+wudxIYczFzlIZAq5ZBySXDVDrXxSObexfJK8RuVx4/2H0Ry8VaFJpLcnstR4K5r9Nj5wMUqj6Wg9mpb+GjDwDX806kd1nlmGT/GPmuPHNSj70yD9x/Q/6Rz0z0z9AkucQR08RQVFJkmSKivbiKpSkgdWCclCEG4LqSrN1SiGq0pJwoIMfFRHJqHY1UhH0EUMQi5sGbU7UJy79u5/bPoG/+2bTd8++LdHH12xnKXW4qfvXIFPjI5qd79Jl7x9x983wQdSf3vwoeUrHiUPcmaHgsrUC0vzlyKk5tUe4A0hPgyPFg3wFcf4EmFvsKQCOKhXIMGQpJdUgpWBroXtYknY2eqSc+UDorMaOfuDHIS7kYobaSaZWB/h7EtwYhbq1I62NcSF7aYpTJ39O0JTivKqRE3t8/tj1btzRpQqnw6xwunQR8/37e/bnzq+RZPT6HVNS8w7fnxeos1+ScVw3G0BtxPaFiAco4gxeaIKFNOBfxQQQ1tiIaoaFTLgWSFKTI6SYzlN2zyhwHxU/BrqR1Obe+aXBpkqp9VjdY6pvFgto7OyCi1W7Uy8D/MzG1zh0OLOWATdbyirCpXPX9oC7v2vX0Ml88uDtDufRrGaxROsHrfFY7VqMpfkmU2VkyrGOTPPOIb5iptzgbg846oAIpd20Z/CpiL1aRW9M/UR7IXpk/QQbMJwNNzO9fL1oHeOzNzLLDFHXjTsHGW8IdNZbyhpUpOZWnJzYRFBlTwtb4GRzMpMIdFqn0GUwmLNGy6KB221i3WIblqjc4eCQBkcSuQiZX92llt/HEWeQJ7Ptjx09An82RNPIPvA9X95opvFH6HVaPUQu/Ez4MB78LvHmVXgQr39P+v37ex7AjlBZ5xPzN11/Do8Ez32OKr4+Iabj0v6MZs7ztWDPPqpBCVVIvOuICnCzgvxORIngzZpyIRSXqMhyUfeFgSfSWJmGjKTVJXDagulCn8vHCOFkrK4zzXH7o6C2yE+vR4kM6pzx4AfmCizw+gAyqt1ab1u+vZvwEZ2oaavb7/9a/wC3oFf+KYA3YGXawZR3uObMVpoxb3oFiu+H29+HP9lkLlB/MjtIy9Lv7LlMWRN6vEydKcN35feksb32cg99ElkBaU7V39JWGeQqgMfcZfYZvDqKkS64BLDmBHJSowfMe+OQKBD4B2apBcRT5KPa5JjpRrlJgKLZoBAayHQB4c2mWcj01R0e0srQ6QygI9rk6NGw1tjdcmGRkI2KghgllaKZCNZFoCtS7fXWtggFjjXapPVJHca0SVDMYKpF6j9NIdjZk5jlnvdGioUBNSi7LQvBgTBzAEvCUXhjF1OJg3ETEYAqV8uBF3b+X5Nzfuz0BLEHTiIOKCDm9RPr702de3aXe/gNU+/9Pu9a3vwVz00rq09OpOZ858KQ3/3zNpV+KdVawfVaCWS4aEXXsQn8ZbOo/H40XYlp4Krj9bUpOk1iF2z9ulXX39FLPs/W3Oioqzgm4SoBqqV1PEw4ixmUKwqELoAHwuRYYgHieFuDBH/fVIQ8VPI+CRz8oJkzntSD95acupwbQo4qVHJSf3lA2pkmQr9iwf1Ge+RVK9Ie6R2Zfg9mqr302IdS1qsYbngvljekohL1S2Jeqm4BY5TRxJikQuanRCrXmArHks+Bn1mPbcN7IwO8L2bIgEYvTj7PvfsXDUppkfmRVileRFKkt9giRQ2ZMnkjDpXb8i3iVbHquMLQPT0AHFJViYGD55h5Fy+ZJNygcDZxKQSrTPLZVq5Vx9nYj5gCsgMzCEPgXh59DETo2Y4tveaZ+jot08z9OxtL3Ur8Wfv9DKlwNTe6r0OTu1Lv8t+Rc7de4Dpxa/jt/p4B93x9xcRuvaTB7o0v3O9s/r07qPF76wm049QTR9vTz/57Yv4DDkr1jM2MN9wncQ+m8lUyeHsKyBZOFLBOIPB1B9J9pX+1E98bMYXDDM+kntNc+fVauRTpeJszLIArwSkD5Kp7+WZwFQRoURkXQQSychwUzIhIhchvSMYI+WEkTBBT5fhZH5enh0t9Hf64RffX56Tl3+SeTFBLyrKl1WeMBhOeIqdzBdl2QNGJicFBJQjvLVPwRgH0L3Yr7IOZJuM2QOGHOr/jA8paUKI/l/SIdpAGzGP+36RDr2BVegHWpX+YcScoEqqlloieks1YiWnC2SqLsAHjpEUcpUU4TILpKAzWRUg8x+9PrI4AB/V7s1xuLPIrlm3V5Mrig+VrAH3aS9D6/TkRFi7lzJay8ku2LWC/JJSqT7KZI4WMnJ4tZujMcKp4RUIitdHyg3h1e7j5CY1TV6NBs/ZPIrLNebaWeNy1XVLO9GlnStj/iWbNpfm9ffnlW7etMR/0ey5eNfcS9oMFV13tzg8A2j0xyj68cf4nY/RSwvGaQwNl/aOtZUNDFTkP9y71jNtRtc993fNmOZZ2/tQGdzDWj51x8Iq3ZjuK7f29+/89NOdD3z8cUaOHuM6ZD+BhYKxMzp8iPyYkVnrMNMbh1C1gI8KzF0CKhXSq4dmwvYIPjyEPhRQNaY3ktJZiqWUZyoUbm4mNUqMRa4gmQ0SVY6RJSyChJkRF0KsdgUyFJcBU/O6vC5ORibCEmbkJHyJRSRKHUM+JjOxlMTfPeaYWBQL14lFH6R+U6om88pZUirFyZU0x202uZgsncLF2sIdbfUK206Dhms2GbKt9aMXzmnKQ4qmr67C311ZpGZVSnm8Iye7kNMrclhkCQQ63SXop50dzDRH+bxid2p/bt5WDfrstoGZy49dPs7JAmMqK86xTWmKe2mmYKJRmW/Gpyw5DG2vYHXKbG6nK59RauRFpnE2Bz1qvEKzRaWhL7NFg2WVxeGSwiyWZlX7pxSpVcGqmpxsI6uWZ3On/6fY2+ksQd/xqC5V68rrcJYx7xk0a622hx6aaYnsW/d+kdzEjq7Jr3SaymuMQdNmo9qRvXxZcPxFyyoyui8Pge6LY1YlDRaShk4cqEc+YsL0zKOoTsAfHRFQw0d0p0D3Cch3BL9xlOSgqE/k+exrZJWBTA4qFj2Xg6J/pIcqwmB/jlaEU0fRxbWOLAv9adpVURGMMIVADz+X6j66ZD+INalSPkksM9E6VrUzdegbbEib8XG6q201PoJeQ6/hI3TfiPoXqe5yNGgmwb9ASCq+TJYFQ2RBj2SsPhiUyjD5WkC/BtFRGBUkClsdJLMp/o+qMtGFV4bx0wBsdaXp7QTtyH5tWXo7wbtz77OqOJp2BM2pr8ePHsF8/D/UbuL6btwPJ2Z3d6HZ8ThJT5H2ntkh/xDMtUL0yjzUpaL/A6BuEqvcMhEcaT0UwLnCY2QCHEE3ZyHwaEZryleJRsfkJrUQlhpxGrZan2UlFkelSyrJNGEtGCFwLDNTfCiHHcUoO2OOOuzmGBzBXigILv3ZchKXczO6HP2E/oUu34znnV508+YTaAqa+s1m/DGejWdmb+kdeLx3y76h08GVT16zsiPBztyMFuL7N6PH0rHNJ05sRoH03nt6e+/Zl/7myWuueXKNKAvHOYHdL8qCNA9DmoKxgzWgojVtp3cws/H+57GBjrevOiL6FX+SNcteEHOXStElpvvpfrwy/S79bepHJps+kg5n8v3inFOFVC0leoJkpoTsAi5hX4JkIQW0Y02CCZN5qKkjHSuPMGHw7Y7Q3QKZBsKEOnpXtqUOkwwiNXKNBsewDLvA/dBeYCkGEvf6ZDsCbViAFn6E1v98TQaNNbMow3r0IQZc/LfFGch3GeQh2XqQBGkuGold6MGlItyGJCuppJbOLAukRdpgIWsmmVIfPIKW/mLb5x899sCNdSrrsms+XYpf3kufSE9HL2n8TT07FtYu/ezPe2ddhW4ZjtfO5v7MNQEnIJV5Mn2M0pPYsVRwJHqmrF6JmKyejejPtyncMpdFqdA7qgrK6mr9mJPTS2AQPlqeOnmCuQHZdROV48YWFegdOXKDvdD4TzyJrj/95+FaDNG/NwD/CFO3ilU8INmBAJnXyEl+RUT0KxiQcSlWLCEuYXGF4sz9JEPi3WQWDV+mHWS9Yg1VFaCt1c0REXdoB7MUYmKpUDeYU6ASK68CRBmM8FE+pH2G1RcUOsksa54DdciRJoUGY2TJHlLjS6KIDjsld5EgHOzoQxFxQqjLKYXhkMFkj2q8dg41X5Vfhmrf/elB1yKX3f4vnMT/xBclTqAd7u/RRUiLnmw7gff3WMrxm+98O+AJBZ1uVPgKUr9yCH93iBb63kgP2O1w6bf41TNpexguqkfUyb5X8ZkBj8eBntv4yqtIc/CgGGuWeBtoKvRckIoSb1ROIrfJkhDYvfxA0hMOkcWuEB8L8OZjYBEHreas0r0NVk4J/FdDIjgkAObSJIthD7qbDSaroTeLXVLsJBMzkSZEGUcqiilTXOZyRs/u6cWPKUnhzJo2Mg+cW4S70b3D+f8DFXZH+RT7Q9KmHYXA+w5jDV7Evi+0rzrMDKamHO7tYIW21WsSc+PlJfYp5eJr6nYSuURfo21r10q65pd9KFs6oraU4ej30wFaSM9Gt9C1aP1wjc9C6J8I9E4AEOIicVaW6I/y1SQJCQ6sEyADBE3Da8kb2QJBCBEVkg4iTpWRGjJbuEEJnD/HUxIVk+B8QJdUl4qTlUJ2sWo9RmbHGpXIKE7wzJCLUlLebJbmyMW8DhcyOULSZ3wGOWfkjiLV4cuu6JmRGP+7rha0Bydann6obu6YjmCNMXtGovFo19GjL20r0smC2pDia/yno8wP/0I26YPP/0ar0i0f7Fi1Zdn8qWsEtBRdfXKmc3xsfsOk/FzyFt33kKdANtpYn/VpyvHtSfjAUmEfMuay1gyWSHJDap/yKDeZB5pZkcAzotaRrEhQJBDXPZnPAlPNyjZYRQjREL9dLZbTVYmF3S6xnFvrioADbQRjTVCC1KNFpekWa9q6uhJ96DV2zfE38R/ePI5mL1+yYjH6RqwL6WpfxVF9iSGBo452dh7dGAxuHKJACLra1kh2FX2DXmP2wLNaqWF8y5Jm+8uEs8t+mUSIdnI3v7D+5gPr6PfmbNgwZ/a6dRK3AFsZImu8aEeaeqnQhQyIVHwu205CfGBuQ6ez0R4iu5iSis7XtNGJjl58HCfQnuOkr4+vah+uVz0nhxJpoQUmK3UyHUKDuFfEoT4pJzQcv8yjCsWc0DSKTIOzCLwvOGgpIApp8YNC6gNJZwkorAoaWQ4+KwkhDWpyyXlNPpzXSBGyc7k+v0AKT6l/j2yaz+qklyAadfYwJurmuZqcjE5WaLlFQwlp/2n2/S6CeqCIa/oS9bYyv31KxektzJ5Ugu2JkyNNX5+kXxJ3tFJOsD/14pwcT4iomD8oxfhEXzJv5KyQYtGlFOfnPMPQar1BlcnyhfRGKf/hcHrJ3CmS4wiLhY2ZoghONrxz+FO/rM5/+sZYhaOSXeIZAi/zFT8KrXlyZe9AH0tJW9mOFLXT799pdeWgRmUZXcX7/adeA9R+EholbYgusPgH+X7uMdAEJ2DP6Mws+0KBLPaQK9qDc1FvohFZArEP0hodrlKxcI5KWgrFo5p6qWjfpKNYwA2KhJ4ot5xjKdrs1ZUhNg/RYB7cXpqEpkgWOSbmjWkwFwhcGw9NVvPxKuhHUDbqeesdtAjR22j2EXwSb33rHXwvTm07yryLLkOPoYXHuCP4wd8/hP/4++tRVd8tqPnhWy25yr5b8UvTp91qYXVoTPnlyNKyyBev66BfeQtvw6n7afZhuPGSd95CVyBmG00/BDe+640/oIUfcO/gX+EZ+P4PGHqlgArxJ1bzhodR27K2sNG8Yfo0/NQyy2x0qM53ZQv++6LyS8T5nQbgO+tBuk3iKjpmUVzVwnBdKiL6wBD2wQD7oDPkA09Bg1/QX6za3b9hwwSFYu6kKfjF34oMJA/djW5EuvRiwkbM9Ut3r+3uRr6tD7whkpFznEcLRCvOuEPk9k6x77gJu577EcmfpY+ni/6O51y74GmL1nDdU1ePNuOx9G56K+49smUFfmrG6OF6WnH+O030UqukHQh9iD5MJZg92I9eSOvpv9N++isJPzjw+78Dv5/kHIrJ2pGc6EgUBcTZq/5AsoQghaVIqxsscEjLSJC5BnqiijG9WJ7mIiEKAARzzGGWhXShoD5EwMFllyOaedVSy/Kjc99W1vr3u6em/FPcy7u1xQ8fZz77/PQdB1q33996UN1S9tRSfJA9lZMbOc3V18sCE8Ke2xyOGVM1vjl///vzJGO55rXlmT4awYUzdXy30BF0a3o2zadDxDZleB1lhbG7RfL5JJYd0Uu2EHg2laKOsGJpXopiy4Fso0LhdPN+NAHNPjLMC6VYvhN6ZboYY8sVCO+wib3CO4d5WpYUYysh7MwJfALV8FnaZ2idwebyiHqTS9Yt05Fa9+copLVYnW6f5HsAk4/q3HZWZzSoaUBMuUmcNEEC4i4nC4MuQzHAHRK9x5/KnkSFaBqyDywY+Ovad5/c8jdk+w2KfrZu3Wf4nd88jn/72SaWHkKhLnxyM0jgTPTYY8jyyBP4j0+u/fKJBX07960/DjfrQLHjN9/wMf794xEsdIGaPJJpK/qG3SzijxZaSxBIJRY/aYJk1RkST+SAo2oIEpHKC/1wHZeU43ayGZu1rnMOIBPdsm7/xnUHmNID60R8OrBu4/51Ga6CvpHPznxPPjA5UkumMgAWKISkxhqEbysYUVUlfRufq0nqpJiT7WdAaM98r+zn0ChseHbDOniQm1+4ed0IpNy/EZ7ks2HYHLEuAcm2GSleKWa/1eKiRYR1S19mlolTzEDawwHkkaZXnvWiVrahVyduR6idpdrgIdFLbSvPloGiovYt2pm2uFWvz7FOmand0s6K9Z+nd7HLT98h6fsslpKNI34gYJuYxCc1g01VzFU2W+qeqqZX6v122mGuNtMOu78+wxVCzB62izw9SBDRa7aLlHxKWFUkn831iesZOalmajCPVLfJxBI9krFxiWMpzcgma/uAJ+Umy8doM7maAilXY8jL5Gps9gvmanQaUWw1NLypFz1A7bYUmoOuR3NS27al8KP4JvxoKvYWakN3ora33sK78Qq8+1r0IHrwL3gLc7t4etvIS9KFaAtqe/11/BS+Gv/mzTdpGkjKevQYnpmpUxjiDNwA2CgvFaFiFF8oZqNY0VJVBUkmSiNmSElKlEqyZBaJxV1Tkywhi83pVSFp9RvwaeziIpykopYE+qVq1fMS4Zw9H0XrUJCsxunyueRffE2v+PqLdTe81uFddODSQMfrN6zr6mEmTEWa2+9AhtZGpudfqcfKPjJUvO/JU1T2VO5eO7COHVqdmD49sdrQNLnFOz8Sme9tmdyEd6Zs+YHQtIuCgXzmT5tpDaIdjqza9TUbN2bslZ/zAM+yUFXECgOLt5IFBEjz1NBOUR+doCHBQDIksaFgzK2P6mjiaxNVNBciNeuSXfDdseORr39qcfMbd/XxfN8cpwYVRi6au3o0M/uXzvg1E9El/WgSYh99Bu+b6Jo1b8GM8cWbL/hu5vlngL2dDrJXROytSVxZJ7P4kpziSCmWUqwZNJmViN5c0lTmwAr0k8MRr6enKGzl9Vb6tvQ11vpym8KKUpgFP2fQpxuV7zWj99C7Zm9xXn396d/VlRVyZnoK3WLmCsvqzDiCq85bg1APlmVQA1KPQOaTRrGjqi4Y/Ti3gqDAUucWChzqku0Y6jovZlhI7lkg3vPsHMsMq/75VH2yNAXgjIvZQch1qotmV13EbM/M7lx5mNme6j5MUyeBBtxxMiUMf+vKDnwEhYe6hJE6rAGPrpiaQA3aMjpsCoimyT9Ch/MkHSbYkyfqcI6adUqoY7KJK/cqXcXnq3AknMm3ikt+BkUtdjmBrXkkiNyWRrMzWpnG/aCp/enYyjeR5t63JE1+8x78jzdXonFoA3oEz2U24xvwrvS9RJdffgWuuuee0+nj9yHtGyuGdRku1t6D532Bln6V4TgnmRDbL9ovIE+A2NgPkJA5J83bVxF7SBam0obFbt3JbL//fujBid9u2sS8uq6uWbQJx9l+br845gXgcwyaST/pxfhgvljJQfx+iiy+++/Dzw4XA/YlmCxxeE62relnZqdfa191UaK+JkGGhouLArFG1jy0/0d4syMu5mrwSfkR7gn4XhfJRMXc0swyaYol4sSZ3iR8pCBJWQW8r1A+hTx7mo0d7S9NbbFYrlLRqlx741qvRjs4eRVqRa7n8tzYnf7v/tajEYv3N5NeakvoGyc8tadPRf/FlG1fO8GWc8vklegm1It8eU78Bh7/iNj+M6O5zYBdVniOUsSK6GWSfJGzCKoC+dCKvggfzXvh0MRTP1LG0iw10BY+/1CSRad456EXRj83/LZbw+ccSvrh7dxDe9X+XH3pC4daT/0WTmbDJXvzmHx9KTjNe12sE06NfnHIK57ya/aWkA/D9XtL3Tn60kH4gP1W+60uTq3V1QzCdWQDp0a8CVfAhiyZ2ZDDsDnq3Lx8p8vtLymtGPkP/aeTfEMeSqpkJLplGl7tTe9hImRsbYiR6aPDwk7ng6LGPMGoj0GGkMwU03tYB61xgA0jG/bm4/iwVBNR4yixoHttDpkd/XcN2lGtdKS/Yeo8dtxfjmZbegcGei3irt3zCHIfve76P+BPUt/j3UY7a/dY0TTMx+3KWjRdnCutOKvL2YDHPipEjaOmUp3UFdQiigxTEEZrkThaZEXfICFYc2CkZgjJK0GhOQqgi84iMTx+jrZBzyrUljxfobO4IhiOVscbm6bNJnGaGbqGLHvtqOaWKYnKuZeJqh8sgyuL8yol0NOcS6YBb4+K4ZrMMWMy6zxuD1kfk0Znz7mcDKkIYmXRGE2KTch1Yj0eGHIfqzeRu8CRBrDTaEBRPRF8A1yxsfhav6ZzStf+tkW+QF7RVTcpc9Y9s7X8jue+QTcBA/iostaquQO19i4PhhORZ+770w8Pbi9QIAVqMRdOf6naFI+sYXtWfpK0sd4CfN9BYf5NwXUbFVj47D106Y9zr1rqmgyQgE9+/N03kfHWyOU3voEm373CoOjpcmbbPJ0tFw89s30iuurV8OECFn/H/r4+YYtMzlubDtRXWN17gyVmZPgvrb/zdMjScef26mCu6Sm24gQ+qlym8k6tRo8gs6XDWDF05mlUZlNcmm8P2ruk9X3YetkOka8WiCswnoscEd6fM8yFI2ReqZaUUyGDHXbsxv3PP7+fFucibty4kd2ybt3pq6Xtz2xgRIlIeP0kIXLU+RzODjLTfM7+GyUOVzzC/lsl+0/mL1qHOZzDLQqB0ZbhcKIXckEOR+r8TOB8SAAQkxDtQkTumjeRDpUh7evEqL+9DX/75p/QLrQe9+HOC5K5adKHV7yB/3HfW/ipt6558+9fAPnb9dXIXJxZwtXs83G16uzSSEbi3IXOLpgpPR2Y61D7qsOpw0zsMBhtoW0NzQLW3ouvTHURky0Ish0ES4nhTnVJOEsxYLMPK4q4o+DF5wEvFuu7PGR1Opm0gI2HAfst48welINiHjASMmRAzcYEurpK4bAzDY5aOQrlTk5zG+W1jlTn1OcZF/KlPkUvR9BdU4076Xn4hGzp6cAk4/yDhTXy44rCInb5RKOAfigqVAxZO4+e3vPRp+8vsjbRYwZS2sy608CVvqEMVAnhegVn65CNx0i0S1wvyl4AWpyjKqypGVnTJyfdAvAi9klcNhwhUCMxVVHv5yh/XBgSUJZx/Lr0YFkt7aibv6xn+0AvPZCe8TD+qmPydY48F00bSB4O3TSwnNluTcyrLUvT8zctqi/OwVtpI03hQ7MmjH5++rgnfbrhda7geXdceC1TiU6dVz0oMhuWEpeMpYiv/Z/k2jBSrjUCif+NlOvhOjKHV/JNiFxTCvA6fBeuIwvrxP8iAo5J/SrwGkLJQijDa2anR/AaQmlErgJy/Q/8B5Dra9C4v6Cr/4LnDRObe9OoE92A5pwmxOZPb4OPcu6zRC1247lgPG79mV/mQGKkJUS8ssw6ruJ8feKXDcpIu0mLNYEkyhYbqhVl/+dNWfoyykJelPXy0qUv45P4Y3zyZeYy/An+16vLlr2KlMiNFIeWLj0kytNw31oysT2zQJJl5FusI/rVKPUr0MakkSx1SPpV7FW9may/C9bign2KSMWFhrN7L2Ac0Bf7EM3vPUPtvaAp+PMNe3mM9+3L1CWDHDmgHzQkO6lHI+VIjrgRixLX0M+PnsZ8IDKz8mmj0xNqmfsQh4e2IqBY9+Ah8QUP0fenH6mRJC2a3lWLzyAacWQ9S3ornMb3k0uI/CJEK2zsTnE1KJ2YedOKqyqR8LJYCX224kb0DIfjWZ6YwzxcfaM5V3JjTOSMOVlef/qzePmPDVkXIfQ+u/x9vDU3K5HekchS0zvx68XRaDEaFW/Xxb8rLz/RoL5I8+WXWkHQirrUBxzXBZzASObyq0ntlvh/tKjIKIn/O0tSrybLINCS03ouLoDOokxtGf2XgoJ0Xlkts2P7jvsfQFlRtw19YAqa0Ac2dyw1t7eXeaG3NxMv4wzn5Y6ZLCYL96bwyNwxWSf+oOyP3HFqvDg3vkn8P2MU0optCnZ4brye1tPiQvX6TM6HlLnDDhPjxCoT2ImS8l2yTo+cc8E2GhNt09ma+Hnzf9upZNx+1ZbK61e5QzdXz1vc7A831264/97YqZ5ah/X9rtvbSnP0OdM6r3JPaRzXudXqVGYXB+Z9U5qfx2Rl52q1FeWzmKX4GfwaPiNUqy3F6F15ljJH03eFM+6PFcpYb9OaKbXzqwwqry46pb2+uWtyeVipr6n+1Ulm9Jg3Zpb+9uLGXS/f0r1LoWxqOijN+R3hP0q112e9yLORoKpfKKsmsxRI8erPPMrUcTqefpX8seTl5w7mF8/QS/alX9xPDeeqzvt+quoC60UP/523+H0RMzsFfktqgJkxYrH7Sc88w7j27cM9+/cP5wjlH3L/D2VvAthUlbaP33Nzs7Vpm5u1W9rsadq0afambdJ9X6AtLVCgQMGCZV+kQNGyiIgsRXFh6QhqdXCG0ZsWER2cKSouo1HRD9BRZgaXGfUDPsUd2uv/nHPTUlDm7w/a5N6bm7Y55z3vedfn8cCfjvIySbja3RBmUpwofpLoRHmYSIoFl0HydLzxoEVyAUYh0FuMGSgRadDzBQYBkOvk1dbXWgXK1jet5eXWn6Kt1a1iryCspw3ULPan9Lbh71qz2J9mUTSo7eXN6AWf2CagavL6THBLZv0EG0jM9NOGWQilbpYh6uoQXMvzub2G4/HAnAzQAEAjgTAfAXrE9Qbwzzq1upn3AHtl5L0wux/cAgSk4xS4FcwNr23iPTzyABoXMgFaBedHLqDeaxLuTaN6WACHH+oALk8GaN114ExgL9gH9o2CcpPEKBgTiUvdR/vIL8O5GoR7mIzDkIhHPDoYix4On1yhVhHqay1QCKEKN25xAwqXMWqVlHh1vARldIoq2mQafiG+taaIlxc/U+s0DXekb9q4IlnD33D17VSLjJXGikSSTGpeehx4z2G1KtlyScLV96ozNVRPRhz4UC11N2dhXBlhxK7qwtk3PWGGlkUW4US7tRpRWcBfz7Wv0KN9QkiCAQ34HhMNv+ERnQk8fNrk4Rfz7AqBCDquAqDg2Ysybc7hy8NfO22Z/WTvyAUU2EDf5PnxZ+fLEthjFPwHKuPL+akFap2SPQnylDp1wdVYqpu9cnUz+LF/Wz9IhQ9X36O6geDq5vrRC2gNRv0cI5wl+BNcey6iiKgnZiCMHTiUQRLpFQHSKgRWK7E8BEcI1NfabFDmhVBF8B5xHzqKyzhxAR1U5HIBPkFtgQCeKhQg+9Sct4Z2TIhL0Wo9Kp1IFKOWz2YLPvqoOb8uu7JOB04pJ0wZWbjkYKIyTjlh8s9LFh1IUIKTKmO8Ji9piVJlbPEuBvZCs1V3sqiounpI932M3ysxnTTFKxSN8AlknGJPKaJ0tZXZYplcbkpIN/vya20fgROzZzbnr5+wY+gt8rE4ZeLBJQuHp0yEvyPhwKIlxM+TJ4DaRoXEc9LUqHBOO8n+K71AN1RdXVR0MpF9yjZZugT+cKNKuUT5Cz/B/Ct+guWX9lTadfaU4Xo/QW+6mT3F+QnInkKdByaclPjvbgK2/F9hD79K7gczOtjwr8d8//0gvnfMnnoFND/J9ncAN/gGr9Vu8l9wn5RHetzQkuJ6MnAhig68rXNko3a2O8G6ujqdy5NIsi6SbdOxGp2ueirYCe5trdbpSDZ11AbrJs/BnwcNcF+kYQ43n2D8pmpduw68pdOxzkSvS1ddDW5nN1X36XTgE10betBVt7JL2OVTI1hRLuo8qgX0cXkBrEGg/SKRyBQ2QaBkdqP/pwfM36vEUbNKSbYs0zQ8Rxn5G0AV1U9ZOf2j5homkV+NkVgFuromcC+4t6kOt0O2owfwhRN+RLCB7YEf0QkV1hvwNY+O+1lP8i7xfviV3mNwnzsL3It6VTDslNPDm8V2ZWWBrW67243gpZxO+y8wMTyRujLU73OE3RNmFRyUGXGjDTGac+ORYOvw9+Nzbui+l/hn+Wd/rVaglu3Cdkf3jfddX9sy/D38yQKutuWarYRwgfS4CkyIcYE4LxxnYUNCEhVqyDkv6ZoXDiVmdF727d27D8zVkF9Yc3OtI2rNZc44YnUqNZupMXp5W70mDZupHv2ddwmj+PG47yCSlfGMml/jToqs5MfQAkuxFvG2FtjIK/BYYCs4n2NIAcNSTZIKDKcYc4ZN488N/l/8fHr838kff6IhWWtRkXWE1PAeTSY/xscpyWRYI2WpFEMO78McYwpLqROvP1eNfoZrGCa/jl5yA2LJr+CTcD9nlJMpD2oYwORjPiaMQ8q4UDEREUaJChcGJs2ASkYYDgVQMJqjagpluKBbITWYcbOLkGZi/jt7k8mNYPm9qCHNIFSpXRE2NESXVkAiw/wm9E48MkFV/rxRL5XMk+WLgprKv+mNUopaUCwRB36N+mlGvFFb+7pREZVovUSmxlsTTLf8LU0hVYoU9BeJQiqOs8ki3FtyYjLRQdyF6ocEduYWKH9bsPzVhJkaaWgh1+lzN/zQNQh6XOFnFtLPxgm86vopc+aP9nYjXgyX00hAJYoItygC7mlQe3BFVPgJipZXpXZicAVUpI1wNVVCDufYEvn2RbBgskhkVuBuBGhdCHRwt/dRBC0VmjF8IjTUsgDeNb0WuN1ZxlNycUxer7L3sz/2vd4Ibvk02pYu1iRSCmGcSCLmC10dZUr54lSxsbHenhEb55v2oFDI4ylSHpTS9XVGs5hSWIN+sTKapPTRmnh626yptuPe19krt4MFAj3xMyhgau1OJS85x9hTLqVorVEu5Nnt1iJjIvnGQfZ/EJcYEMK/ZBdYBER9feyP7O5bzoJkjSIpUZwg48XyJSJJrCja2ZEbEIkoiSjOEh/MC8z3TnlbWFORlvmHJHJKW6bV68kLFpXGy8RK6JuS4OrRpKhEntag5SmnbeP/T6t7MlvNfsN+/nnx1HWP2VvLeJt0RW63VSHkZTmpBEniaH7/beFE/tvQXkonFhBcLnEUrRtFy0/Iv23gwuKElAFDoSTyJyZ96PkCz3ffcpcNUkY/FBLxfmLEQ8SzBNxDk/SG9LHI9S+uoHD1Dc4mSkLKdVDzylHbuEBthpuPU4WwY+BCNVuk5fxyG3/AVs4vUzrYIUfHKRNQjXw78iOQWU/fksUezzzGd2fwLRlufjxVYbtaml5GgafYLTi2s6Z1AdwN4f9G8BR4tG2EnHYks7g48yFbQYHteg6YBNQjDD8/wTGuSTHLQBJnz6pkUHCDlMdNGi20QmAw6WgBRWq+BivOrjr/lwOLgy+zT74bSB/uIy+/yD53imw/zf7+peDSg3/5521nwW1fJw0ftOWdJi8r32afhTZL9M/TRbmCcgKhhjsRuqsqFfgsZgEP4Qvh3RBtYwJuH0NI2Ny+jyFG0EU7NDCMum0LXtfnKIU5yV41GQbf1jlJylOvrVGwTlZkNmbEjpAq8uhisjopxZRAUuXFCXUa1j/yiSi+mnwmxy7S9TtEScMnDFZoV7NDzhryszpnQox2ZC4oiI+OSr1amwz+oWGDygTwdmGJhkpg2wF0FaWRWjCMJyCCVkQi6v7ApX96VBd448G+PNv5RhIq1lzbx40ktJFz4XmYJNID81gCGvT5HVf3CsLwCfvePz8l/FAgRNoaQb5h0io76i/AIEJCAGIShEd1rNWU9m+bnn1BkqXYk57GWj0aqDJtw1ey007b3Gy8gk9vSc8aGRjFHP0e7gH9XH6IWIZnWBcO0aiTX4MBsNUIABInjMB4cGmuDCwOHpnCjEmKPBtkPI4WtDFQlStoRuYPmeLgGY1aFRkJtCQ1Oi7jGKcYJT1Dco7SwIRBT0B9pvPiQ2hSjiJxaLkj/foP7qAaN3xwO3vx5RPsl43ssUb20kvr/17f91Ff3+JFv6Ma0cFHvAk/E3/v6fn7+peAjL3w0pZNXbtfBvLb2ScW9+3/+4EDf98PHyO9gz8v46di2Ub46rlEKfQn9nE5XKbEhQp3rE5UFluBGlkZFxyECVinxznRp091ogFANrMBQxlFYVRw1PdkcTJlYYSIWcaRVFQ5GRvK0CPa0FAC3PSeJXkiSQwtEyLcuaIyeMGabne5c/xZ2NjWJ9OyQgn0deJUJovN4Q3W4qHycPUrFporYoFDRQvUYw3lZmlklMCv3MYVKKPbeGOj2vtW7/33w4fduzsbVza3+HMb4VPzSrJr9IX771/Q6M9tbs71NzasxE8d83bunHeggieo2Devt3fe/vLhK+UP5zc2oUwoFV7V1LSq8epfrr9nX8XwlYoPVjfCl/hTAuiOxkjt2ShnZSlc42jPLOQ6ZnUINAL3xFp0CFJDiorTCwW07CgRnWrwBUpvSk9pwgXIHAkEhj+B2iDIg/tjLE8o4MJNFjMu1b8ZayUYtjrucZYaEuMkVFZyxhQF0OemCbKrF+XekRTXvn5TbmadVykLFon51tRoieimbJbJDl9HdOykwJJyydBhc0WaKNHaXKmLjX9y2ksH7rCoZU5r2jvvx0lEMUKxCNu5Twl7+BegDKLskQXH9yN+mBjzZtE4bzkuOW/B27bRhJgOhbHIY/V5jWoakXsJbn8PGOFnM753hyj+mZa8UvYSu4fWVdQOb9m+sLAIOPbULXyEPfcubxl7nD17Zv36s8DyiMMvCvxuHk/yj9jYkaNbl65caTIP3719uwe8qrzjTGQfJIX7BPuhPvMiTyIFFACzRY4R3zAAEPK6ffxYwFfxKTXiYjRBRxrNAF+l5nHY/wIJyKfb/f3bt+3x+P6x0GffGKdkw++yP0gkW9hNOQU8lwTkAEFXbXZmHlDnFtHsSXg7e/GVx7p0xueWFGX2UP1XTvuDEqu9FEw3ZdUpHd1/XF0LeH0f726VdKx7YFHL/rn/eaOhXDI/h5/hD0iKzM3sMY02l+LJrRG8f1z/zCeioW+VwFUPYPgQVFrLAV16uCabRlKB7dsLjTwXb58tF+UnAtbhjvA8koDqGWrlPBvYGwb7rIFrnEgoX5WMarMjOXYNV5stDUdKDGhFigDad0ESEZ+RyMKLJUnaVrzgrr98dN9LIPZMT1NKStP6M+zXL73IfnN2fXMq+cZ9H72weUFRBp0yqecM1PN3gdiz6yelpk5Cd+GYZGQdKaH0uIlCaH+7CES1UjGG5FFlD1UjD6iiBIpSkRh3OxWKCYFEm27PySe55SSVBxHhjXd0NUHb02iGMmakcPTEbETJI69v7JQ746MTI18gV+mcPigDlxs+uDjy73cqX/kU2WwPvPY3aEFe2Q8WxpuNj4AwOP9EtdVVu5OdxM7ZZlTH2YCInHI+YDQVvTxy/tMsRZyFtIMehybJxz7KRhkl/wBg3apl7LdhMszex/6nYYlL0fx0993gj9++Du1CAbZS799bWS70x85tR2Aik1qiHJLhppgJFdv0ZUXWVYGy6K9Ko9d9mZjjSD6zOnrklR7d52JeBL8xwpOlICyEB6MiuwmkfqrGsYkh9jAiVAX1c6hEhNHIC6MIfrTO5sgNVl8bOGCkVOpIyQyuyDRFRi4FxJJ46AQyFPYeGzuB+bqxgysIKqZzrd8DKRB/NeHo271fswPPPscOfL0DlIq0mgfBIXBsb6JManAnbWJXsZvXNwQS4gr/l7S/HjQZc4+w9JkssTIRsKDdoUvIZl9mMxMF4S8mbV30zXNw6J76mWhdosx/essGcNc/nwX1X/fugD//aV2B0B09vZV2Z5kEcRMmRmcp2fPFZcqKgjvMgfy0Jf7iHyxpoq4P9DZb8okl1Mj/LU8+IxGPyvp7wun8N4hMQkOgojpTeMCUjgrzTWpxBmCy7CE7l+6mdFqTV0Z7vNCJQd8czpHaCNCj2aJUqNSocgD6MtA9AVGgEkwAvCvsirrFS3qs61ctfuLxjyVsKvui5/CcqsNbHC6P3PRyzyn2cm7P4T88Dj4HckfzSntc3d0l6q5/PZJtjgMbZ85+c7U4jdp2WiMRde2m+iMxsJegf8oSSYSDKCGyCQxO5DnDFISZgJMpkDK+MOOzY3gijw8aK24/U0AP0N6SMXZAZHKiAggz2kfV/Eg0BpmeyA+LaEEfl+woAGJ0DTH1YmAxvO84eJO6u0nTyB/kvsYlSxq32smugw7H8OHu7uHDDjBJ23N/a3XTLH2qI/7WyXUFGo2ZnzzyBnkwOUUcZeTBSbXwjSpFrCSG12dNYnVFRcC3TVTcXlx9qjXJmpYE/llYyOqSWMP9DxabbU63KjrPYYhXyj2qQ+wXpC4zZ/3uj1V0DE+n/5R5JMvK8VeY4Jish/rcSuQTRQRCSVCO4fJHh5lorrcsh8MhiyY4XAAb/axIrkw2pts56CaUH2TknHGi5KiCoQuKa8ZwcyQliAKUIAXjrBG40AkxR6OkOtqhSY8UMVvwi6zpORS1/u8g+8ncqt51Dz7JvnL1eAfPSFmLWpqbkkvBgFrGbma7sngT+ynKaxNnJMqlJPtZpuJ7nTMZvpdfkJGV/Ryo+7/tIsa0+G/s1+zTS9trgwk8j2MtNTE6ms1jiXrw1Lfs27lGa7EokfZmloCXQfA2P6cLXhKZ+GfhWGiIdmIh0QWSCWYZAngEzOpxdVKoQWxOmJkjRQp1oLZtvhMayaXhgZySRfAotIbzCF8curicc/2SpdDnCykoVCj1vOi7oUfQZYppy4pliqVMmzRUR/5EwcNQDvnT8y9OvPQtrpNKlg6KksVyaGFLB6WKOHnGoAw9ousadJ1i6qSDJXXF8IVa9DgAX75WMcVI/QPwNnQk8hOFEuiSyBTJmpyS2rq260qmno28UnddnVQKQp2MTUhC5URzaKbBHyqthjN8K2JlWAYPZuKpRrgHXrkuAuVoMfNIC0JBEBIgCfAVmPDH60vBzJGIb8YrgwZABvCYvBa32QNtAj3f4zbA5aRUKfkI10etQIF6UqnyOU1q1CHgDpI+OdSVJrmTI6mPBSImhpwL5s+TMKKGuP1tcYqTMh77B5C7+35w78aFS8J1d5WkR+Xe0SLkFVPKof6gczgUD+bTYimIEarZ15TSVppiTwhFPEDyBCQPwQIBkE5tntvdm1ZUbhaX+2eCqZRAIlhXFZei7RaJRCRoZA+LBFFX7FDVWDKk0qtHwEkyeeTTrJX3SehprQ8/4n/00O/zhbF11Baw4dCm3aeCPKWkXhQl4meellJSyT/8FJR3XmxqnFQTA2JId9gw986nChZVZcewVfESSSZ4lDJJKmsGrrOHfcQUbA/7cHdFhC4jB4shRy3t5oJJiODPjailBXyZDUXOoulQZhayllOhEjsSrSYcBg4uaCDekhkpbR5nNWdReJsnpLhFLUL1DU0gjkbNGSnXEmjnPPM1sEGDMhNauhU9R8/+vPl1djfc1smEL/qzsyZXVRfl9pb1wFkT/PF+rdq6gLrIHrveMr6LPftMT/l+9if2AfY+UHtR8llSmnb7HWaTZw/I4PNIwWJx5lR9nELWf+kG36AE9VQIEPcAQpiTjsHKGcJMmhN1aga4sUCq20BwXmeAflbAlyaa3TnFeFRkIW8uGhVn8RgF7a95D0iF6y1oM84CASi0KJKmUrvtwM0VvHE7GNeDcTP/gUzI3DF3m1VBxxrKJpu80zQP/kCSS5sm+Yv96oKMUn1g4o531+67qdvAFjXczRdLOsup+Pw5WZ4Tktgo5YRl/hhtqZmX4M5KWPDqvhkRW5Pi+GQicXbUHuZFpqye1AAd8IHpYBG725YCDOy5wW/Y18njw128rSD7HVsBKGB/OMGM9oTahUfhz1ERJsJO5OGKEI4BUx9GKUvE0J5tx9xWmPMyFKPAPaCDSrUEtQAwabJQqilCJRAJwZgtcAXjSjGPjw9SSOjZ+3iIXhJ6CyotMnQMeqFIVE+erl66rJp8p55qZHsy+exznz3I/vxgJtsDBvg9715+t4e/QnFyw8bXFG154K68BqV6wx1KsGyBFd6cCTbY5mv7utu3FSwu7O4DBtdkp3OyC5T6q6v9QNDa+s/SsrIIbqFws+B1qNc9RC2xBO77dXA1jeJrJeHuwUG+NkmUEYlQ88ODVnyKsOMRntOgF5/m4SbDCviG0nCoHrW84coLnt8f8lrhUYoeHlUg+cvxM3k0EzEbVFpM4sS3uFEzLD/SF33zS3quQOskiD1ZKqpPKdTqBVESnkCfWpTcICglu+ALL5eIa7UFoy/Ao1pxCdn1MnxHSeQdKp60Iz8wkffolhMntty2NGade82kLr9I5O9qWpe9IWrp1ZEtQ0NbVi+OXetZ3bwKvbCqebVnbexingq9o2vx2Dvu/Laq5tkb+wL9RAOxcbQv0Gxngi40WKVOtD6rXEhp1TtH+wUbx/ULon7HbExIjAg8oXdSMdZD2AQHNDcbKjJzugelAEJJFfAkWFRbz9WpZtKywqh0Q4bbk1tUXFP7W/sKfRiK0YuR0OBijhgkKH2C0tw3XBYK/l87DS/s3TChqMCywtTgL+4uN/bUDqzZS2rrazbW3WnqSpqSX9JTYeyuPtxdX///3HL4+3v2Wg0VwcaW+kPVxVse3npPTf3EkmDj1Bp0Wj/5Oh0ZB+fEhOdDh2v/uf4d1K9DhFS6G8q1CKjzuOyCliIAYpP05qEubEwnSRvo/dCgXQTuG/OudrOLkaondX3drfffb3ruOYb3ELsUXvqxrw+I4G27IumCn0Zeeqh1zpaD/gUPsX7wKpSZqp9lULf0EDT86yYRtyJ0hil2Zh5XyzzrDNOOy5eJ0LwpcNXEwD8vEaXqsf3IM8tQ0oNE/YOUDfg4ljb83yhXQaWMO1Z8Lo5nzOtTYRsbriEPh3YrQCzN6AsV2qsiuRIZqkaOAkb4o6qiGjSbSspcycWq2Md/b3X8aeQ1Vc7vwEowC5QsSUspCGxN099595dL2Xd7lSaJw1Pp60iQxi30VXocElNCmsekpSl+95z2NSK+VG/0gCRRY1lGdf1Xs5b+2cKPlnZ9yg78tXI6byG7+U9FZp1uVfGDQDEA1j8kUTawn12doLIsqQ+8sj8IFVlsvnfd+joLn3RL/N40Zb7Z6zXnK03+3Jj4pQ0xEvh7YiTzN6y/NS6KSlRLYhpW8p6pWULxpNLOykns3wflE/4K5gPZMzJqaiQXFeZfEIRxD7INxWloBICllqsRZBAcKC/0r+UWFB/nocFGgaMk4IscyX3yyNH3W7eyrSvObXrk/o6Hs4Jn2lum7d90rottdW29EgaCTR2+3NyTnS+wop55Of7clzuHKDZyjTzSW68c0ReBNdWtpoQnP7tDPLgNuKZVgdvLRwxrmnaN7ACv1vvfap/jymd14HlxdeD19jnufLJLAv5czx1H6pw4TEElYYQ+Zi5xJ+41jIvsSUxmBLMgCQq8M8Jyo5MyDg6BSnkGXZWFB2RK5JLKssQZjIxD3UsPM+lcv6AIV9KLpIg42WPHKFVmGTYfQtFK+JwE9U5mGrKiZAqlaDT6GuFCgVZRLNBibEyERqjTqnWjtUGEFGtzs9bkcUPbWAMU0Cw2H1hBvbDiALtHsut79l/f7RSxfeAvDwINkB8Afzmw4mrJyodJ6wkQO/RX9ityheN+h+N+hWbFysceW0kOOTw7v7/33u93ZvrD58+DjBUHDqxgbexXL57Ycs8Lp9GdjtG6hZ8r4ZhZ4czLMCpXyjU9EPnb4frmFjyNFzwixh1X1bRxGtl3+vSbe04yuV9+CWqnbdw47coH0zaapm0ku4Fsy8Fz7OvBXvbSyOaN0/gZrT09reNynyjrng3t1k5sq8HZcGHrNWmMkXrMdHVgZGvGw/lSESPWAY3Yo/xEncFoykZWhQeh0jMpsmcESVpzmhVvAvDPlz0THa8hTLabxn/H9xsC1/iycB/mc9LezGw78j5YBo6AZe+/z+5k69mdoGg5yF5u1LCLNcZNW7axl25usR1E7ztzhu1la9kd778PnoaC/U9wH6LEYbdv38bZWaafzwrvFABoY80mNkA7ayAWZRgK7MxUO7PUzqyFg7TRHtqE1GEBNCwYs5+ZSg/UNU1GXFdrl0KPbP7iDmzAewUqTkuiNDCFXGgBVpm4rBuzRWITgiKv3QeV39iNiKv1F3eOu5GrnsHVU8BswXdkUNHSlKaUmW0Nk97aBYhXF05LsmWp3TElIp1YU1w/p7XBc899s+9kr8yqPe7nZSptynjuHfAV79bdswB5Er4l05Zol+dLUmI02SUps6c1olci76FsqgylSqRJmaiLvPDDO//+qa6wuH5BjWPX+8vYBz9dekfnXn26QifSNOQnJPom9lqi5ckx1ii/MGVKSn3xxJxkJe331lZAhy2d1ErNieAzg1UB/z70itTv3WWJViRKTXHuqIQSn4VMmMBd5t7AS5WaEsFPU1JTRZrIC73nixprC2ZkJse4i96aYKmbGuER4WTdTTQRa7CkO8IoWA9t5Qo7MyHM1DqRrCORnzQO+DPioTRDQQ+ooUaBvkmWB8u0xYGontOxST1gyshCPncFNHWg55ZgzAwUVDWh1TCBDnmq4Ss5MqbuJoKvdvv4qSSXBrIIVS6lywMnlM8VYsm9XKG7UiE0IW5EzuKxeAxKwX/JhBzJBN/2LZ+ZXO65bf6WrY+umLuXBovms3f98wN25/ubloL2tx4D1rPrNSx9sKVbtLylpadz24pZhWUJN10qd+9ae77YY00w2t2tW7oeeki0dnr/Xz95Hywne//w0h2n2dOPL555rtzkF9F1/k0N4j17eFnumtG610phhqARV/w1EDOgnhkoiFSxifCYZ2M+jgk4dKsJMxopNDAxWZ3yDOKeI0I5BXDkAREzqRnZl+nQ2HyGjmtsapnMjTAjRyP/jFk5pXX6DHSHhsPWxd3reFWgcJWXjtRXIDYbr8uL4Dk4ix1VYeQB6C+rkSUpN8PRdzlVuEDDLEfBYBTDQAsPmpzjiclXztyzlKLEosNbLp7uqN+WP0HpP8BaeU7bfn/Z7D0zN2ooQwp1z58X1PIn72nWbXhUJHpy+65XF2gqGhTK40G1cqJfqqzfQh4CrhOoQPYEGwb5lw/rPBRVtgSkDjw/U2+oX/HO+l1pkiS7iOL7LfZjSy62BpN1HdZcHfuPsk1NvI0LOh8Qim6jEle+kUCda35omZS6m30Z1bMOATf7ZiRWngFlfwVcBcJI3TNBiwU8MfCgT2QRI6JtOxALwb1kObti5BOyGMwfed5IdpILLsVFycXsMfa4mJbEfU12gkVkEds3cpSsBjtGnucLWAasAaXDJnYLyAALh6+gfu62A3wxiGUvi/kHQD57Gt6QAtbAGyaCRaN+q0uQBv1WPtFMLIQWwoAWSYMT+yPpcOIXYWQ7fRjRqYT0WdAIltGG8kiVDYKr8wEEzU25uOAS6uHGBD5qWRzApLqoDtSiRxOmRpkNhE7CyyI98AvhzJtwOgthYqei/d0MzFB/OnHENwJUzcsCwOIXsQe7g2awaqEjnk/JFAZVfrozWjA3rYBSTmDKo0WJMXSWVlTmaKvgxbmbQO6iuvKgJCYJAMDjk46yINsu4mcZCo82QlfhUhclEotFNZ0tCqlErMzVJ6UYRckiqSiK+j4z5+oIM431BM1Flwxmc3xKlIgEtDAjhf1GLBK4LcmxVC+lq3F9kua5dTYwfvgdWCgSxwgstTrSrc+M1xgqpcmHSnwLdovZVRK7Z8rsoFciFislIpJPkjwqki8Z038IYbeV6CBOYR2YH0YhmZowssPg0ptoZ1rwPCA1OC+iBgfUBDLF1DpoikGNCB1oRL9UhGw46AhOkoZc0RnMtDAzjSNusziZW8LMDOeA7xb0Np9dnBGaD2eyogg6gtH8pMSMTEeyp6YVqcfQpHqoRBtaoIKcRoek6SjQU1MKZ9ynnnsLXskJ0LiIJjzT2ud0oMU+kQ45XPDuFtkzOvv0tlmoF5Ix00zmzcJCbp3L7EPAZtB28iF3SYGaPnDNWQQUXQBtPJSB5dwXFOlEjDd5qJKYgy1HnhZUykqD0uC5aehIBJKodLGkMqO+y5eRcKlRKaWqyqyeBd0lzVKrxXPrraCzoryZ4jcU0bWT/eZmhc1CG6bQlNUIlva19/W139xIWT7kdWidy6d0R4nFajGc0rSumWVJ8Up7e+v2gE4k7qj2BAWCao+vVDgJ/L5bsji4gpK0sxfRT+3ru8ajxc2/n2iB/hyae++oRV5nZxrDKHWAZn3yuM0vgnA9Bc5ecWTzc3GJA2Rdh9LRTNTRhTHRhNpgzEhwOItLJ7Rg2i1ZKHei/7/sdwalSwF9PPikwmsUt6CaLbpf2fVcHp2F08Gcp//fNj1S0Ua1dsZX3AOEO5aZZk3fWqtVIVjHBew9/0JbX89ScMvbeOtLGPlcyn65QqKs2TB7kmNB7+f3ZsTefPPbvnbF8jhFXHLXuqnHA8esjab6cy/+C29+T76MN7+OeZeWO0zKVutxx+/duPZMfF0/HepJshAZhIMIwF3wV7vrcOeHC8ka3NyRrMFnNfzOA5GjsVfQ1RtKO3/ah9D81wYD3QH471h3d3cg2B3oRufB5wKBMCr8pAhU9zlMoLpP3t5580byA8FAIBgMHAtw3+hrHL5kDNelMva3AtyjgoCJEYOo2QR9kO5GKtzcxf7j6tamtWAfzxW0juyzBkjizTc58oBpoGB1M4tZBhA2KNhLXOd3ZBElRAX8j6QxYyxGXDlOAn2cBFZBCfRBCTwKJTDNXlrBRZYykFNBJPhLy2/qVERkTQ2HDdlVOs+vCJjHINfxLDydGnig2rmZcJnAt0v+Hc+ylwEJfAvY+84ieepaADrPYnnSsV19V9grh9r62CtLwD8lH9xcmHoWn3vIWbXn3Llt246+h4Soe/AtLEQrVoTKwBvsJiuY9PrIhaqEds43FLFhQbngArSd9hFMsR0H5uwIiAyF3lDKKrj38lNcysotZbKHQvl81PJPDabmow7+wNOXvkaZqUEtOh3UoUd446DTnS3PGICP4/r14Yso9aT1E89mO935qVqdfizjdBRduXYB55tS7dDQCmIyPbgLB0muTAcVsyB3BIGBZYEIuDEmVUW4IAIhiZ+DpI/LVaiCfAtpwiUKIip38yw6TiiNVhjFyTNmAPuxIx8qlVM73T2dEyUCHpAIVVFJlEFM5U+al57jitVLdeUaqUgQ1byq2kLleaMCLdP/uG11g1cYY2Z/ZodHnjhVOpeyvfrEOlW632hT6fLsQ30HDkokf386xP5lntMq86XJ7Wn5xsqUiZJFzRllqSqr77HHK1tWsj88NGn/vA2Fr349RFrNfKNYaJt252PPvzYfpO3dU/JK4TORuhpurSgxauUoLgMIM4DjDEjgSuoAgUulmWQ6FJfhx2jsMoxICWh3kKd2qpwuGgfgdVpartMmAIDYcix6s95AY7KhZcm+hvmFcpU+ThwnlpA9w6tGXj3E20z62V3XXomN45WDpeCp6asLNNAMYa8oJGT3yIPDFLmYNxH6uI2RF4BAKYnEIKfDdagnVhJ34aqXpRipNC+MGgMT4Uq8DfcHFsHNXhoJsVNSlLwpkoY6MScQwp1YBT9fEfp8pJ/ppI/GJKaYxc6laBdQotwyEVoqhi9G+xk7jeoI82SDcoO5E71eTg8SlHIOznIheHqcq4fbMmb48sHxwOgy3khlBio/iCW5fI4qkrXHcAV2ZPUZcHkYtA2DIPJ6xKEyR6iFFFgkR/9zNecGtPFXK3u/BnXHHCvW3L79q+0exY6v2CPHWspu39d5YlsjeKImJy3dEAvc6gU1i3aYzDkZVG4O7565U0pyg4FPH5jXOdft1ifXeW36mLT8J+d5/Aq5w5cxybdzQm2pQRfMXbv2kRc3TF9G9T64bubUF9hDP9wnLdr1w71r1sye+wKYDM8aJ/WeHH7RWZVssIMZOseM8rwksyIKxMUl2Q0Tahfd2tQwWWNMdzhKLN66+JjANqvJoVMkJculMdHpidnZwfK2xTObcx1lnj9cH1cuIvKgPBaP6w9ScSWeJXC+pIgnoMjPqOhCMYaEcuYWFKJ5EKMgGvEr0WYUYqCQFwQHlBQip8hnDpIotYuozIIAoaPE8vC0CM03CUSDP1Jvbv8DoBTSqicWWmZ7OoUiXaokSWissdbpFQlinaV0sV1mty1fuqDeLOYpFEC+52YRa3bBPa/JlAfu7T63MZpXwP5vTe/K1St8aXOa02lrg33SlHxR7KJHGLvNEOtvXlWg1Gv1LsN1dpCeKCA2j0a8PBg8NQ3bw5G4V+G4uJcTjlwBRto2OxFWL2qC8IcZ/1gcDOEoOuPhmBr8jIMe0CUaUTQgQ/YsX5CklZo8+XjDSrOjwtBodbwmhTAYHU5/wW8KhsnVPgOHeYkl1sCVq3BVtsLfGhSrOfFydfwrC1YFizreknwX//WT7+/Zzl769x+/1Pzm6Bh5ZmiI6d+7f2oLcyS8Z8/5CyDttWegzMX+HBQSgnsIH1GNqr0x/WREtafwgjwcuOKqN71YhlCMikdyzcMYNBIKFxfkx30guNVPRilTHi8Rl6V5/TG5+ZLUFJvWpy+iDUkxqao0cZqPzs19GKgrnpjeLpOtvqP/0JzW2JgDdeyDV61UMl/nL3jY4/XzeXRsftFBj9dLqpZl18yO58fniMQJd9ybqJcBSh6XIpSYzIaYeOWUuzIKRNKAb31a2g/fg0SgHXw2zfS7nW/N/fc8OfnshDhf4MLtd7A/VJdEibO9H93eA+QEcUP8FHViVoxKU0SCMsZJUEROEOtcSjxnxxiMljQsFkk4OEpAx9T62+QhQvH0W6f+P+RrIzn4+zfHQRsO7T4UiUunUt2CbgIKLN4hEDZVKsZBTQgzCifG8wjFcgoeIZ/SnJqFAkpHlK+Hy3CjuQ4nK+9aOPf2L070bp+YZ1NJwfNsOfu9xDn777w1IwvvLCxdlabtBJY2q9qV9iT4BFjAh+sXn6gibojf9RCv4pGGnos1zOTameWYZ7wtjADjsKrDm9d6PPxwzaoxvvYcFLt2MpVhZnWYqZSGlsDzwjBTKA3p8dww0VKENme2hzbASZrjgB/J5WdW0yF+ot8fWlKJnNdkaUZmbmnKxLZblyNlWUgPCqwN2OHRyxgjnMrcTPi2DD+znEZR4Bq02vVGh8tTSDS1zFmHbmyjUZFDyuh29ytl0FzBgsuZAn1VYWQTg984YWGWK8aq1TBSD97z8M1c2fTYVY7AWYGuIr4T9MMiEzK6I960ivrVw91NpUbn1s+3SLR/7JoQiC+/6993i60XddaujvrGWpWp3r0r12cpdaW7FbSEVscnpUmizek2Z1FzYWGZNt1Wl5sdl2w01RRaDIlxMXHRMjoxOUl5U+lb1c1kUvdc2u7Jza/pZkwieFhiqGaP25w5eRpLhqN4vt2oj1XT5oQMVSJcPTFWTZJBbk6NksYntOYFM9LVyTHRPGjw6UwuSZwsJk0fTSuVo7EmC7RxuiJYlMhCG489eQ1xMsRHFkyUn5HRIYnUj9hNEGoVrhD1EnJaQJC4QsLII+VSgi+j4XRZzl8FTuof7N4wuPD2N9+9y+5sbv4aeABxLszu/Qd5mv0T+103GAFOssUMN6ylV/+1YsX/gna2j/co+wbLWwc3ydZPQC8QmYkb6ma80C9CEp4VxiCkUISdGPbccAZ180M9gnDNow2oeEibwTUdWLMwyjmKRUcTGf6b+d58DwZ04MIZikipvZKTDChh9E3jG32ZjgyTbNPHH8fwEtL05VXtXZllviRjyk1n1bkl1mKcOPXyQ5cnJiqlSsdDHqkqSVudC2pvXM81xNbReLweRQCR0VIVHg3G197AwoUziKNh+box7i0Eb55JhxJr4HMAxZkEUr05y5FTWFGFxycdOjYhcxai4aJxjD45wZIZKECeI1MlG/BU1Pj/W7wC2o8pPK4eAYeBLeAXfiTgDFOf2aD9byGK/BjvtO4tVQ/1RCX1xuRVzl7C593yK+GJ4e68W4M2aczBO55hL9/53yIT20ry5/1hxURjCy09HOPp72J7bgxNgB3zdJKY/iWnRtdEJX8frp1OI3IQkgyFs7MJWNIy7YwHjrrfjgo9iFBCHM7vo6ohCR0t43jUoX/IeOjBVKM5ZTS3ihofgyAA3ByfpFmgpBW42yGAmrzQpSyArl3D5tRCm/wkmPDnHUB8YqWmhN3I6tmNJRL6RVAN7gKVQ2JpMdvDprA9QXGM8L2zZPnZ9947PXL09HsfzH1+RdmS+2rC2bYF27YtkPNlIHXaQy0tD027aDS2dXW1xURFxYA4Dpxz05IJEydOWHJDDFSP2d8qiQ2jOza0/IrCEQrwyO5dNW73NnKEAi5pqAAe2cKMbWxHr4YS6ELcCzq4TTAF0J4W8C1p9mxpTiUaLJsspE1CUU1P0ZjtZzBm2IjcwG/a62UKVINFurNIfSyQS3ExJc+slquUUhS0d8N1+1vNgKOZMw6eOdiWmdkGn2YcY6RKS9IHovbLEkYioiVU+W+3A1/99tWHp0x5+LXLr6En9gUwV2R0siumvAoenTKJPUiSFKXHvvEbwib+G4Qc2g5c76V2DI/n13ovFeRPjGF872UyBjAc33sJHR/D9b2X46/8au8lhzr0y6ZLqiqda7qMd6Omy+Hjv9JqWWmroMAfRlstF00h2ba2EbL5+XEtlng9lQpdglYiiogljAg7Ph590lGEf5OdiT7DEE5GArccJ+YgkEQj0D8e5hkNaVENaGxcjD4iD6j7C5fByHW0FYGK6Gg3in4mAB0tJaFuMVhWHl3NXzp9xkoJuIddRS4QgR0xeTteB1u/OwU3HJGCv6dl2fKmKQsX/TSZ+jr82nA/+UFl4m720kgpeRE6UdBwG+2hmC78URAgNISV8BDlxFToEaFZysS93tV2Zgr881vtTN0ZpikcmobUQSaFcp42zDLCiP1MtexodILeGSibOCrNnCJAVojPC82MOKDHNFWxQEjIzF4boFKAQAKM8tFoO7RSCAFX48NdgLrDggqEOC5epCtQq80lsOGDY2DShR2XMyWuGXf07NYliD3Vafc9/foM9vTZ+B24+0DDxO9gv2ePsZ9MpPvbO7rk8sfaO1byNgBNYv1yWlqu0YoSDq9KzKCt2hNAZdWk2B5nP32iCuzoY6/uWvTHM/PfqJWYNu4qo5L7q9NA2dYZ7Jts0fsnN2vrn8CPQNw4VUE/2AQfFbt5szNMQnp5fYmY8mi6mASh4mNtOnvhJY3VqqGeAAmPRWRjuuAzOMYJhB/6B6eJAT/KdWnCcBmgjJfEjloNA1y/USVUQqO+ehbHiFAVCfBlfBUeWykJQyGh4Ccmb+j5wOOX3kSXGY+UcQ+FtMKfGN0QI5QOioR58ozBXPQ4AI/HlZfn+onCKEIoStDq3J7cvPEYnL96GUf5sqQR9lmjH0NEhQJlUGat0iyumMMnwKSKPjniDtFyeVYMFy/k4VfGvWCHAi0ldND85CFaESBHIMzIxkV1NiKR2XhOW0zVU8W6IvDA388frF7VuYf1tCiNIqvxg6b4KmGJLgD2fXD+MTqT9bG3BVqUVcJS7TaQWqRsKdtw+8shv85yQuf1aUGB1tnfD6LOLsxMkDb89IrO0wIKtc7HHgOS/0wXTVzJfsc+18gOab28D0FSY2Prxl0O4gafLhVqLT9xG94htOFQptfpZHR2xuhClZO4x2ggUYoSXIlW1DWTO0pdr3aiYlPURwqttywphmWF+0QeXPdeLS17li9NTEnm0OGZLDoksCIloNOiYiXCbHHcdFfAgS/MTAO9LLlL7cIhAdqAkDDgVooObl7XHLQtWNApennFYQkV3HLrutfm1MeLXr+pwgdKa+6c9hE72TOygexpmXffZnYLuGVbfbSZ7QUDPTfupYjfrpKovcH7rfql91sd8X7RHik12AMFZRVjDvCz0GrNCQTLyn+bC4wArMZB/mYADHsBPR45rVMa4HCgjMpv3Rnv1ClP6+JJRbxeH39aqxz5VKNcAJ465+gET/12l7kzXn9aqdUqSfh4Ol4vTEwYuYXsOBhnZpewX5MLRh7A+gBAnbsA6oN0Ihva+HqCiUZ064j12YCr41EpPBEqgBtEyJqJWRiQZjT6OC8Pdf4KKIt6PKU3onJCiW41pTb75FmYfQNTe6NwEbJRLWap6PM37gTy2cqWvPzGhtwudvD3Il7VRGDu+x1In1jFOx736cfsHvZ3H38aF61nQwfE4eKV9wBDfQvIhqPnbK6vb2b/9vDv2Lea68kldx5XiNbfpk/LbW5e3dB3SBIwevOnT8/3Gqkjy2+ZO/eW5QuYOy5tmMK2xS8iB5Jt9vJyuy05yZZVAZ9H/Zww1SgIQ9kxwlFAta+GMb4ezs7XcpFKtFdqUd6RT42Rq3g4gwhKhYVLninpWKB2exGlMHZyteYp94f/Fb5/yr7NASvb37h5X7h3SbhzU5j9OPz9Ungdvrx0L/FzDW+HNThveEXNz3tXPKclvx6J0h5ZsfOttyK95dfZirlEENrJDTdIeMkvJbx0VMKjkYRbXb68QEHRmIxDv4NIy3Ln5Afxxf9/MeepfWq+2kTbgcfEp9VCvocPHTeLkudTC9Uen/K3Cngpy8KfJwHRypdHHme/py6SHvAin7+4b/dBHfPbRXzn4k7RaWoFUIkaL19ZwX5JzTnNHKMYigKGokDx+cPVh6/DQ0aYVVYik/ARhcREopVYgefai9mydThwg6qdp42LUFdy8z4djmIl3HMKpSg2rdSlpWeiUStqmIyHkvaioRQBZWp6prOycWqEE01eU4uCrrmyZ8SEsaCo/FeBrngerUml1o9CqQrNcq8MxyopHnSFHT6ZySeTCwxaudelVQsFfBJBIBYAFY3q6dC2psaFdmqST/4KOFY0OAG60tXSmFUfV+Wv1UjiwrT1i0OCjN/NYHd3iCiK/wJ4jlrjOrif/WrS9FnAeoF/J/vJttce3trspY/EVrLD70XxBbGTaphVrgpxHvuJ69fRNpNXVBeJLFvLc++1yhL+DT48BiyNguBnT7QPX4S/BEx7gGJfZD8qFjgSXqcGFgGS3VTYWVyg/JD9hB+dlqSKEej/FkvFRksF7KN/BqqILcjNmZCIIZSYVyJjrKfQYGeSMe+RhiOS0CRjCJxI92AUl7YBhEVAyGVqWigAKrg5ET6dHKDcFUCAEKQlgZfBnkm8xF4qX3jh1BLw9rqnD38B7lx5tbKDPPj8G/tJBsz1fDBEhtvmkf8GopRuNjiyj/3uMfKz43NGPg8oEwAI8ytHHiX9jVeT7n/sS/DwRm6dgigRQfVinE0dlDU/UUM8RTD59sHYBBPcTF2oRKWYCyNAMYvGUA9CDPUQgzJYTiR5MsxsjqgydE5UlqyBj1zLQybGTkQwEqjaJS3MWKSoORbZxx4n48YuYS4OJOJQRAyCKRdI/P6QGvXb0Cp4pE+iOerl4nxo9fPEpbhOkB7M8PlTI+yU0M71+HBLSSpQwEOeW6+Uq1HRKzw03HisGj0WyhUuPsddiQGWoBWgEUejPShazMQ7k5Odzyg0yQkJyZpjtE6rVGp1xyU8o4GmTUlRJzTkuc6+vs4cO81+PzirNgEM94rFvbvF4t3naPocmCSVsofP0coPwKsKBev/QAmP3oBHntMJCadJiUYzYtBQe97Zozh8MVmsiOCgj9OZWYQb2wVNxDRi/aje9OHcYrqdyXIhJzqiRqf/Uo3OGFWjcUiNZtgdHn+gqGzipCl4/ef5oPWpTjHhwGs6De2mSVNaI8525UTcIP9svMbuKiipaLypmiWkQaBNAdJYoDXzFGqu89ciMPicHIa6yzmKpY6qTuSqVACNLwye7kYExdzlm4ZQf+z5CIj+sWHDP9gfP3K0SywZfY0izQsfSZ56fkLp04vmbWssl5R/VjU7a3vRsgeCfbwoCUUZvfWdLZWTA5K79B2BrJsr5R8BdW7jxnPsMHwEM3q7VA73bYmU39/ouGdy88ifWnTLn2skdfdM9rS0saeilIkCIUVJNyya8dYjq9oOKbl6zKeE0/kXCDvRSEwnbkHRtyjo5YWZFjsz04UqueY6mSDiXgFMB54crvNnEoatZ6ZIQ23wqD3MtEsR0AeTGA7NgxM2ZRKUb38uZqtsowclMXkIy5lplw0UFRuxqzutBS6KcsR7H6RDiQR8NsuOJhvTsry41w/rkQjko0utchYAhALCfaE8MFS/SGkjcTdaUJupQO7GaLSoABD5GV6c2I3lQWcii+eN0AUZRomLDHqDfn5D3caWrrnV1rXW6gKN84lA+R53TslDdFycx5P7v2taDve3sRf+6o6Lo/ewnY5iuSE90RdfK51RJ/L37dufszi386m3e0W9b/3pVv9ndUvr671+Mli3tK4OPvc9tHbVnrwcX6ycxP+08cm3VdZ/u/vzx6P27b0rRrS4MT5+SLmpb1/UE2zG3hkZsXwBD/CAAIgkMQme9vtvubctR6XKabv3wb7Ozvq6hQvgU98Cbr6i+KmCXtwTEoR++jvYagyGGRFmhM8d7forx0xvBhw/hY5INqqpAai4Gc4gFzXlcUl7k5NRcklNqNHSpKh/gilBFOlQ86E9OMSLpDGU9IA9240m1Clj0v2h/DRsxEhlCUlavdhXgJejKMiFCOX0oC8nD2U64R7MxPpD8eXwBY2fMdBHVAWFJQj5hSmWMSn+UDZydwjSnOYenXYamnUuHW4JQvOr03to1XXnAcDh4ajHAHCICGAOGXnendmybTKYGHwM4dY8FmSZg6XTrztFoDgdLRgKZzLP3YzQcrgv/r6+8uHqknVzA3sQbs5BsEPLHXxRsR/B4eQ3Na5qarrSsaqxcVUjLxU/XecDIVyCWmIy8TTWdNk4ktgcZqqdqJBiggvlmfKcaB9F+m7KOEPXiXsSmVLO9IFLsE4aaoRHCNFgzHWcipLLajyWoUpUHMl363Cyvo4eNASCUq7gblDgMeWhkslMhIFggRNT3gyXm8/pR4kqqCQz1YEIJXuCzpRxU8XIdyNudtRWFKGKQJWx0GvXQaMo0uyI+vD0HKqmG/mk8MTkdo0CGd0cnadeJBAka3S3+RyN09J6pyULBKJ6tucI29PzOFj8uCdzYux27fbYiZmerqJic44JVBSjYEqy+abK8JHlk0W1FdVUlM8kkbRJqitqRZOXQ1+VXDd16rpyj0kkMkE12GbOyTG3ec0Wf06kZgfhSZwlUqAGdOLeJJ0LIWPBbV7M4XSPds2KE5G882NiVZoUU2aWPTJo0K6FTifmH1H7EMIhwjak0TB4aB3gXtZFzoUWEAvWgtiilsCuU+ve+/G9dUWNxexBqpO7zPYXtxSd2gV2vMB+A2JeIDehqOLa8vK1695ds+bddSO3I0hIEMd+zb2OjmxBeEVeXIw/i/rnKFGeoA9aPxUYSZeCbjH0C2WWLNKGsBmiAKBdSi4zgRxIlAhEoQKLe6wwBp9mkbi0En2OzCQQB578sR3kX/zPqRR6yxn2MvvXJ95h936zBnxwpHVLXbGfbtuVtyI1y3BMJI1RxKc3ZmYeS6Cllvi0tBS1UkGeeJsdeOGc6Y2TJLiy9bvnbs9SJg2yLPsMG+TJAvUac1KbJj6jpmTkDTCsNCqlKp4k01jDasBwWq5ELFFGpST7JKyGs++ITBGfvwyz/5jhGptIzCB6CCbLzuSEGQIZZYow02xnNC64jnDPQCImWjGgl+IwnZ0FrqL8MJPPdd7PcCLjLehEjQUhQSJOXIfyEYFY3cQGpOncdKi0Ge1WzQpUeqx0ufMDDWjhlNKhOAMGINUhayEA4JjhnQl6oYDW4RSrYfRAYAAKXKIEtyePAdEkWqA06DgWIVS3gbwPJcrky3HFEhcBVZLHly8snMBzL65y+qac7B9ZBAxgqckU3AN9saXKpAxPLvjQnpH17s7FviWzA+f4/EUt3oL5ZC/FN5rSXt96R9idkUuSH5CSkW89MTFdDa4GeZyKJMslReYnljbmLpogirlz1qHnrr4IZlH8mbWHyUxgofiVuVNL2F3uByonzKFIe+PmiSZTEbV2XjDvUOPU5fOq8v9kU2vJtoMjS515s9I16jJ5VMz1OTwHUUQ8NKr7CjDomiw8oJeh8Jg+XpwBtR8uRRrTe4mY7JpJ4XScE5HHMk4uamZ0MrlwUxtL8aFypUSk/bKhakuB88TX2fGOhNDpGK9sQKAvRI1WgVx4TwGCX8vGsbRkV84vdVwENAF4XEoORRYvYqHFg0xrvGJNHrUPvRYALqzYbgafAN4+4vFuO76ls9zjv/v4NjJQ3pnjY7YM3X1z7ISHt2/3eEDljLu3tAWNxqDHwx5r23L3jO06Hby+fXsbpojDPI0uoYvqgL5YXISnMcrFCMNMrBOxSSA3hsteizlumlFaCY6zm5JyzxdA9cX/ZQd45oug+sKX8GANe/jyZTDp4sXI82hvDoehlw09pxKinriXGMhBEWoe7orKx/CB1jHkPBuugcrFNVBoroLYnbJgdyphbCurxvCCGC3P60DRPpJnNFnTs+wYLy8B+kiDMbFaHTqpRtuZSi1LwpZERQ5Wt4QiwWJzGYuuh80btQS50gcOGY9bRvD/LzD10NTRY6aCaQw/D8Hm7RI5Pa4JMxcurXo4Hu3zu8SuzMmrpaLXG6/h6TWvxHB6uf4mnnsURQ/D5/UHa2enpui0ertzwdeccfG7wln5XpuJzwsGwKM3QOtBW4Ev4HDz8rjT0dxLlHAztOkqsQ3eQSwFZsyTqTS5XExDODRtidPJxGC9VgRNOSczy874oYJbhuehGtoWHKABFAsh15LByUQePJI7mRlhpgk+SpFwIJCkRIR/iKAfp8Dz2U7kbXmdyOFCTu78MDOf45/nOmwXcdzGy1HPRjVX1ymkB2pqsXqsxwmAPG4SC1EYK0TPQORcfoyw9Uxzy7SZs+ZynFUhVQ5cmAaU4NKkZKPQdkg3H/5AE3LbQp1L4DsWoXZJIhTTAGc+hk/Q8vhEQ1p6RU0zLhAtokPSJHjXLNmAN2+uP0LTjcUBV3oio5+Gsx5BTFThnt2xc7jcSegKeMYJB+rnjSXhPaox4EXj2BFvvGkZkRdkBgqEzcHwjODu3rd27q6Y+mbf7p1QSjKb72l+8yA+3B+evK0lcxSGkeweB8cI5YcMQ/lpacn1I7l4uOLLxCRjRTzbVvEwdw4ejT/45ejJl8gGXQBSyvuQqPWVsx8vCMxdV/JlxdlVjU35fmR3oieBKdCILdJbVjcgU/Q6XZxCWIgWrIvNOJKRiM0bKce9M+ZoJ49xbxs5NYtYeJJRBSPfz2hxB69Rxgjg1CSa/yvuSoRjjxtGNGI3TUJQ3f3d3f3gga5DXV0tjTe16f5+qLv7UPfaP6yFX6OY7r3QXosiSoAURxC1LiYqzOQ4kTK0ulD4PMs5iiwTE2ZiuD5lCw7WIC2V4USFDTYniq1jhKdPoPLD2bREnGDOE/3E+Iee/9p54jh32YnTaSYxSkcPGk0GOdyipIMup1ue8fxL8RemYJynPOlgbp5fnjEAH8dV0MPbx53B98An4lk46SaX+1piDfziCk60OWLQ/iYsQPuZF9kk2qwc7DlHcQ2NjJR+lhDpLRk2hzeyuUG3yTkKhoHMvBRBKkjhubS01GSJdIuSqG9DwceA21oeNvViyeZ7hxa+v6l8W/fmPw9tv7c4ShorjhMq+NX62bvf2Qr+w4b3bDn0ZNyXSezmv34MZAcPfMeenFPtXP/yvsWvPTiVPH7HezvrF4RXvPPI869OiYnX0BZ5TuyljvsXe0EliK7S6W/p6YUi1n/4qwqTaXE3yLh4YKCh5aF/RXBbuVijGseHXXDnqSKGiAEH2neoMOO2IwMgCeG3cD1Jg1ppQAQNAyjC1ZwIO5Gm0mNlZR6zJFCrSFkYgbZG2pZqoEijsp8BrcGKtJMZlawkoZpLJkU2oFDa0EUffYSyO9yoq4kpkw0IpQE84G4HJqAS2nxl2KGlB5TRxdjMsCJtloB5qkJGlA6PT/FfS337vMYxJEG0N5EcfzLUP2REz+jlbp+KUONeUmjzZQEeKiFKIaHdLMzi/R6kPvlXUFR2HPgHb3uF/d+9vexPJ3skAx/eMbm1u5vRFLeXl7dnhm3AdWbZN4cvgyf6L1J7P9JqgeG5W4e2N33xDNnefx7s+D378ZP/HIh5G9T89SEge/W2ziMjO8rZl3gHnlrXzaxl2VmlZfbssuHOb5afYd+0vfk1Wc2/0K/9ECw4cqlx24nO4+x50+3n+9uvz4nGERqoWxzQz0WFlhZcNYNQG5zw5AwCdELlQ3BeOPMO70wo2qDEVLYhJSrAUsejwbVAM45J9DNpNL7AOGSMcjxEwygdDq3DRc9KrJ4tkeLGDGi84fJnePS3nRS7829/23mV3Pk3shsc7dy+7eWnH2cWzK31WCq7yqckWss7PI294XAvdQXft4P36pq5j9qptFc2Pn7EVVlgoA8pDL5c6w31d9XEUaxBK6Eb7kR5HqhyAkjNQCFkAlJksCZi3SPDQJPX7NpC+ME56zV7rFDIw6kgKJC1CCmnEDnwiWW4OiibPiqQaVIs/nIufPmM1mS0unwRFAU9HKqSSjhU5VAZ0wMef5mfK26TRKuJFA3UAtmuXBQICCU64V15NzF2+XgzQ0BuTo/bDjilIIw0wCKdoLcD7JPgggsflsybW739y29bZrI69/U0Ntx96oSkizetsbiu7/srRaakYGHV7OkldbmmoiXLfndTM/jdTYdmrO7aU+xRSg1rDu+RlAV8cVLzXf2nuiaVzJndMD93nmf/KCbGPmGrQMAhoSBkYLkM9xdA74tMBD6EShdLCoMghRQISdzKYQe4GQTxtFLCausyX9K6Hp3RnTZthW/a62ef2ZZg7y/o79/dSTunFdtiFclPNymltDU2Q0wnaBzJs3Jnsh9VUuXzNDXpZnYG21xU7k6z8Y3BwW+BEHjvA/yZJkHB4j/OTaHjc2rnONnDKtVSf795zt7nGrMd0bIPm0br65aBCxiXGvmsLcRAUsSi1o5xtoyhUGvGUKh1ERRqjr/lBpRpIqRNQowuCFPa+N/RpK+3fK9Hib5m1d4MCnqcvRr5LAJop24jdIQJ6mqChiITaUVQc4BhUKK4zcdnwfQmJrFA91BBWktXQp8uzaqjOjSa/Xb35DXxDyVPT766TwdkvFJSOnyC3Q0WkX3w8S9puj7N2sk56X06dHerZn98V4vL3pecfHWvrpxXOPJ/wydIKXs/uZ/rH6fw/uGC+wfquColahC3Yg4Xra61M+IzjIpLxqjEUPWbcwojKKBSLrSsAVxZtJbDAfC4I04FVjoolQ41j1onU2eRJnekL1yJMJr1ZosZeOW6WPLw1NtXMd0PPr/lLrB60+bn7yu4bcWq26cetqWw/XPZFezyuezBFNtuwJO0r9o1C6wypZ34aijNZEob+upEmomXNEcCyOhZu/hr2BPPzuyoWbW1fYtsdlFVjs+XU1U0W7aldPGc2pqOmc+CAk3aCy+kzWOfO9W0869/TNZb/H6LPjmJex555z1QtvqvOzm99SJ1RPAloYD6mUgCAlItTyFRDAiYjUKeWSggzHCRIDwlzcurb7V+oGE+v3PoOT/7vZ899fhr5kAOKDE7l3eYnX6/oJ3d1MRevmf44sL7LIYykN/PExzos4GtxabE4aPLO83e5QsVNKcrqW6oK9XQc6zBVWNZcPwd4yxMG87lDsrENrh3x4VRqDMUH2mDs9FwO4C6TCYbkBtwwiCOZqgIiwaiIsD5fTOJMNUEJPxSw7kQFHAVtnGARErL3AdEe1f8z74ZW2+9dTDJzEsavPXWrf2mKLkqVhuXGd0YFSuNEfKULasc5cC+l72yb9re95b3geCdm8HB8zR9np21+U72xcPz5qdkZSVmqwqkq2Ji6Ohy9rWhbeWj63i+iBB4iHgo+5lEIoFqsREuWgQgNxQHTQFGhrSuzuNS6nhIgFB0B0oQ6jHX6YVJAPFbIyJPpcHD86ESxFTAe+IY71GF+GX22DRtgtXD5vpNGrtfzh57WaxTHhMQhyViyXDvsVP+pDyQk5fkB2+Hw2TLuT/lOJPjvdMXas6NlLCHDx/uO/bmm7x9SzyeJRFuuQjfahKuXKKJgXjMbDdGf+gYXy2j1Hl08Nsw2nrsog0At/PyMY15K/vcyFPssbamtWH+3qupvb28fb29mO0z3NIVhv9WN191IUJbfhSYzvaD6aN1Hfx9gjD83QkEMZ6Pm6fjwV9kUut8BotO2JxLdee2TPZ3D3d3+1sA2Uqen/lxFXusuj+/qSlfoPS3IPiKFn8v+kUEETXGx3CNt4/rpbZD23GMwc9tRxvtf2Hww/9dHgOCCwfw2Be5JofXuDZmjg8uTIWHCfTZUNPym28iYA7gQscdYB+Lv+GfdSPRX7hjXgf8AvtG9s6Dz+HhcMeortonQiYvYobOJvKIB3E8xxweMPNQcMzsF2egPiE73hxkYY5vJ5or+M/HqwkDomB6Bi6Hgzx2R3g0AiPiqHisGuSCK3AN/KDWZE7lIv2h2DhkXiHmBsaLIp1EyJ4B7Y9kvUGD7nDRIYfXf73pBT3kMXJMeIxAsa5lSmVcdMmgHxfvH2WF/d4fH1QERyrhQ7z/e0Ssd/cFEH/h7rsvsJ9fKBsExGBoYw/PUK1JS9Ok2HB/OG9fS1fgBb//hcD/t4rQv7fgijs6GH/8Z9gM1LJFwU1TVk5bC3rXBeTOQDnw2m07hg3soPoUlCshdxUJQ1ad2Vzb4AxZa+ZsAwwVER5Qk1OTF3QDgYCBkZm9K6znxAy6uILJHNJ1smbUYwZ6mg90bro4K+jSHTtGYNnPCDrmW5WdD7yzGXQ4LmilIziQ2HRjGzenszCEFYVYKHZE9/VHdShahBSF/WFouNrmxVjAqK7CqK8nwCzILSMj4ccopy4uYPrvqiEXl4CEkmzMv9esPo66fnqurnp+eg5Mp2M2zC13FdS1Nv51cO9fY2tdwewNt2Q1ufnai1XYhbgZefkt/r2QkZKR6CmXFhFl5uJzYOQpjiwp3VBYCBkzZPx3iy2S7TiwBjBhYJAHn+9vZi5sLgxaVAtqKKmwgzdnMrKBTzuRY4TufgWWV0ygFpOAIquG5GxXqav9nxo72/e4ykjs+Pelr+RIq42QtNHfDxrMTdxqdmfWqNjyiEgY8EhL8LPwinJ2WrIrnpBVYJflMmcMkWTsFZGQOMuoMn/a03RpkbxZJ7L6Mv68MmFlVjKLVq+7ES0sIizIz8nMyc+WoiMGnYfJAJYXpsC8ocygwwDKACLg9eEbxK9tkDm7QQaS1gXOggqwjcoyoLgUtoSsAZMH3yprz4hY/KcAOk0CVMpAL4ZPqg4qZwoqCqpODtTaefFfwaWzGnZMDPl78k2TVFUVFVVVk5jldfz7H3/58rjfV696R2ZFReYOSLnP9V+frZUtCdjesQXNqgiBryDkAzYzxVlUzVRAi5SBnWh20Fnw4JudGIVAG96BCHRfIXg/I4uaujko4IFNI3YWLg5DA2kHGTEx94mZjCKMPrMZBTeGionHxCXKGfuHuIcGpucBE4FOBhubaVhGv6QhsK90vJ2ReaNDmJi1y7+bywv//d7rYVt8tLxelkXK5N8dFsmbH5fmlxjGx/tYcEmXW67bstHeNVjAzzF3zqSEEAMlHkZmDU0VG0t916m/re08/I55GVmw8Ek4+0VcsdXSZubZmu6luSGIhZ8vH3oWLdNDYNnKCSyxORmhK+oYCxkLrHT+Xg86y1j4rx96fw0wjf2PZPvL1ggsdW0ZGITZxOwZgd4VM1cFj8mCdgADvQ1iC4F2Y8Nuq1YHb0RjB9eIDLBmqbqkhI3VTUauIFFzB0Y79QpWDiEeVlZOJkYvv7Nx6bkinPKz/i1rz/9owK/GNinLQIVPg1VaUldSjsUjsiUqyslBj/Gyo5Vk0L+PD63tJbqF/MUUjJSC3T0FOK1sbjd0MyYt1BAvTgn66CBsxs4jxSXNImweY+XN+LclLq4lTo+BAQBViFnvAAAAeNpjYGRgYADiovRLZvH8Nl8Z5DkYQODKnRRvMH1/hc3/j//WcFizvQFyORiYQKIAX2sNeXjaY2BkYGC7/G8JAwMH2/+P/7dzWDMARZABox4ApBAGpAAAAHjaTVQxaBVBEJ29v7d7nmIhgiGFCCFVyiOIxW8NFiI2qU7R5oOtZbCT1L9KkdoiYPGRIBJS/jpY2BzaSEoJKUIKBUk2M2/mbu/DMLszO2/evtn7Femv+EzkPxFN3hGFH9kXT4ncV7Y1NfrF/hX7t+olVy7TP6mtOOx31McFr0nXYcrrAz53llK5z/sXnH9MLjbpOhzxfsbWe7FT27OPtfKKLXlZx13mttA9sE+sX8fWkJP6itJ1/JguPOekH2ybnJybLJWbrKsCfJzUItekqzDPeMVDNamPPyn4GXpQPFSPmm+02t8TfOTMJvv7tj9n/NfgfYcxa+Wn5+ReJePHe+zfp8S8kx/hTI70vtCB7wvt5lRw3Gm/lKDTNmpuCafwh1bLy3wH0afcUjzEGsXr+ZZdXrul5vsY7rpQnWUtuoffFAQPMebm5+Cms6dhNrh/WLEe+4bVisZ87sRmesj8rd5PNSdraFuIHtanVVzgSC+fUrwiJzjSp9zTd4V8l/Ub+m5RLXXFMZtoumFv/Vg5A6NTE0y8szrrIu8FM+XaKtBtzLhTfpif5HXG2q+xWJ210fdmcfs24herYY0Rf0PPyu/2/k/t7JTW4Td0Hx5ljOG9SfwJU5uZfpZnjLvotWOxUQ7aLPAdKt+/mO2Qj89Z35ejunakRZvvjdh/ejDkGsvtjvKjvqKjO8ta+Q+j/4xGefVv1f47nMXqQnXB3IluAP7dou4AeNpjYIACEzzwGSMTYwVTA9Mr5gjmBOZZzKdYeFhsWBawsrFmsR5h42CzY5vFdoLtFbsYexb7EfYHHDEcHziVONs473H5cQtxG3Hv4uHgseC5xivH28b7hE+Pr4ZvCb8Gfwr/Lv4vAiYCuwTOCfwSdBDMEpwnuEnwiuA3oTfCccKThB+JcImYiOaIThBdIvpATEisQlxHvEdil8QdSRnJFMkjUmZSXVLfpKWkV8iwyYTJzJB5IOsnu0D2kJyG3Dz5DPlvCgUKExTuKSooblG8ptSntE7pgtIr5STla8rvVJhUjFQyVOaoXFDNUX2h+ketQ+2e2j91HXUH9TUafBqrNB5psmnKaJZodmiu0JLTCtKapXVL64s2k3ae9gMdB506nRU6T3RDdJN0K3S36P7QO6W/Sv+a/hODEIM+g2uGeoYBhgcMzxn+Mwoy6jO6YsxjrGA8z/ieCZ9Jiskkky2mDKYJpj/MMswmmG0xu2T2w1zKXM/cyTzMPMt8ifkVCzYLLYsVljOsJKyCrDZZ3bPmsG6zcbE5ZStjW2e7xvaFXYu9kn2VA4tDl+MZpyCnR85szmUuUi5PXE1c37kFub1xV3Pf5THHM8pLyivJW8ZHxuear5Fvku8vvxP+agECAQsCvQKPBVkE1QTPCH4XkhKqFDovLCzsVLha+I2IDZEukQ+ikqK2RAfF6MR0xPrFKcX9ij+WsCiRI7EiyS3pU7JG8pNUntSqtKR0q/R1GWUZlzItMpuyuLJcsrZl82T7ZVdl38ipy+XJTcvdlKeRZ5e3BAQBAjvJsQAAAAEAAAEvAIcADgAAAAAAAgABAAIAFgAAAQABJgAAAAB42n2Qy04CQRBFTztoojEsXRAWE/ZOUFRAXQobEY2orEXlEQcGcTQx8QtcuTB+k48v8G+807ZkZGE6PTlVdevWVAPLvOJhMotAQfeHjfIFx3NkCRx7rLPrOEOekeN5nnlyvEDe5By/sWK2HL9TNA3HH2TNo+NPlozr/fLImRcuiBjzwIQBPfrE+AzFtzoDzexxpW8sxVjKY0U97gg5V8ea/rVozw6n7NOmKUrrV2c60jV/pnamaGKnRlL5f9yPaCmTcDrblzK2G4y4n3YElG11KNdreSaarrKhnDt604BNeyuUFFXVt0dN02s0ONSkA1GTk3/3aCvqyDWymt/JdfuKvhwSja9TsrUK26pW9d0Q+5qa7FHmUi5daRPXWF4Tt3t96tviRtWBKsnbhd+FY1J3eNptVgWY5LYV3l9jGM/M3l4uzIxtk7u9XKCcpr2UmVmWNbZubMsnyzs7V2amlJkZUmZmZmbmNmVu2iePvUm/r/PtWrIe6MH/3vMKW2l/V1y2Ml35Pz+c4x4rbGUbGAbw4CNAiCEijDDGBKvYhrWVy1cuxXYchB04GIfgUByGw3EEjsRROBrH4Fgch+NxAk7ESTgZp+BUnIbTcQbOxFm4Gq6Oa+BsnIOd2IV17Ma52IPzcD4uwIW4Jq6Fa+M6uC6uh+vjItwAF+OGuBH24hLcGDfBTXEz3By3wC1xK9wat8FtcTvcHnfAHXEn3Bl3wV1xN9wd98A9cS/cGxwxBBJITJEig8I+zJCjQAmNCvthUMOiwQbm2MQCB3Af3Bf3w/3xADwQD8KD8RA8FA/Dw/EIPBKPwqPxGDwWj8Pj8QQ8EU/CpXgynoKn4ml4Op6BZ+JZeDaeg+fieXg+XoAX4kV4MV6Cl+JleDlegVfiVXg1XoPX4nW4DK/HG/BGvAlvxlvwVrwNb8c78E68C+/Ge/BevA/vxwfwQXwIH8ZH8FF8DB/HJ/BJfAqfxmfwWXwOn8cX8EV8CV/GV/BVfA1fxzfwTXwL38Z38F18D9/HD/BD/Ag/xk/wU/wMP8cv8Ev8Cr/Gb/BbXI7f4ff4A/6IP+HP+Av+ir/h7/gH/ol/4d+4Av9hKwyMsQHzmM8CFrIhi9iIjdmErbJtbI1tZwexHexgdgg7lB3GDmdHsCPZUexodgw7lh3HjmcnsBPZSexkdgo7lZ3GTmdnsDPZWWFTqvWdO3d2665uXe/W3d16brfu6dbzuvX8br2gWy/s1ouW6/re5bpnrycbo6NMNybNeV0PZ3IRa24SP861mLVce/Ze7ItcN0lQyVKo3Cu1lSP3iCUvZOIXTa1EUEtuRDaakposV2lmvYKrfFXwUshcKCNymXRv9f6GG5mMq7ypO0q7784nhSq3XvyM9NrlUcc7ao9kUdmFV1tuvEzm1dg9OobInS7pTS2Np8qpHrtHR/fdae3F3HlIW54k/oZKpPYyXUgvV+UsrJSwjZEBt5aLLMj5Qjd26IKiKQxeIcvGF5kUs4FcyGDp18Dy1BMZt8FU5wldnPOiGuZyam2myqgyOjWyrnf5bZC8QusrD9cj44LmGFfbnbuGvFYTJ9+/RG1kEz0vQxdttSGjWOtZwc2s9khrGpG9srRKl4NYb4Yte1ONmqrXEDTV/xizO5i2TEObNUVcN5XPc2nswNR1wJN9TW3H7jonHqt0VPFKmirnJYVJ8mlYETfdOFpKO85BwSu/zigBw15wUCjhFY2VA9FUZECueeJCyZ2d/oZweKsyXcpx7ytdxcQ8oDSmkqKupjJu9IIyU9uIG6PntRDzyVaciD2kJDp/2kvdBQOh0xGdqANy2uS5b7XO6/HyoC54nkfLoJBslMsNmbdRdTeQpqBWacnzsCU0ledoPrE31XhpflsQvpFVvogSZaRwrkSt2zzOZVg1ManKPOdQWGfNdJrLYd0oK3gtB4m2Xq515bceBHNV0gVBzOuZtKHQReVKsVVOdoZTbeYUolHrOFFjPYh5yiiU9ZwUZiMHZEVJJ+yS5nX32B0WulRWG4+StQid/WRmm8q+CKwhEPr7GypkT+jEWSX8XKeqbNPQsYVuT6JUaboKCh2rXPqxaeosKHhakr30P9dm5lecamnYekT8y+R0SgJSS+VDhok6kJuVpoqmPcEoqQUhilKxVZoVCQcUUG0SJhKfqrOWvioJzZRCWSZtgmOqr3Aquc2kIeeElZt21K2q3PArQ/EIDVkmlxGlerWeK5Whe7i8+7VuysR1NjEb9riLtiAVbOi8KWSwBMmkh7IrodYCV0REdIYshdyu1dPaZrXrQXY85bXt8jdxe5cq97JVfzsnLZSofkrqGH6a61iGqiTpPB9SLzG2UjJqN9SX5PIo5mZ55ODmWYrgZJrrecUNScl8skFQ6JudZxKlh4T4mixOCTIykWWYxITVSm6rK23VdNEnu3sNLQHLSrOaUm9s2jKlNPkpb1I5pKylDU/l2CnuBLd1At3rcMqFdIEeE8imUyUEFbc/58TBhFjrqR0327+/BUgSR63jdGmxxdONAU+IeDHghEMhSuGnblyEidGUgM0hFalx82iSXmWiBI5RNiNB0q7sTEKdTlfVoiXsq6KKICIpBdStc+qaxq9ni0pu3zru4ydEzaNCprxtUe7+JLDU7XIzaSX6+4ws6W91SbpSuCLEcsupuGlMiAPSaD8x1LiHbsyQadQ1VMnnUsU6qPiCGupaT+mzQha4xhLEjaAGMXagL2hQkZlEokGnNoekMo6p8QQ0t3jNRy24W2St9aTezlQR2OKxAwyxCp7I1eVRP4rr1gVJyKc5pzZVGMvMzbcdVyH0ymh4iJkZOWWxIaZs6LbWSLm6JG11AFcIxWqqddqbUkcbM11aPrNydUnum0CL31aTw3xglfM7sJTubOEXmvpMm3saPVFslJy6pjoUNIrKxFVGrqr2IyYq5bxuJxYN6II6SRi78WgWA/rM8Vzhe7GkMutHaGC0u2hIYpfkiyqb9Juz6Qvsv6ZkCG0AALgB/4WwAY0AS7AIUFixAQGOWbFGBitYIbAQWUuwFFJYIbCAWR2wBitcWFmwFCsAAAABWLn3vAAA\";\n  },\n  function(L, T) {\n    L.exports = \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10' width='10' height='10'%3E%3Cpolyline points='1.5 3.5 5 7 8.5 3.5' stroke='currentColor' stroke-width='2' fill='transparent' stroke-linecap='round' stroke-linejoin='round' opacity='.5' vector-effect='non-scaling-stroke'/%3E%3C/svg%3E\";\n  },\n  function(L, T) {\n    L.exports = function(e) {\n      var u = typeof window < \"u\" && window.location;\n      if (!u) throw new Error(\"fixUrls requires window.location\");\n      if (!e || typeof e != \"string\") return e;\n      var A = u.protocol + \"//\" + u.host, w = A + u.pathname.replace(/\\/[^\\/]*$/, \"/\");\n      return e.replace(\n        /url\\s*\\(((?:[^)(]|\\((?:[^)(]+|\\([^)(]*\\))*\\))*)\\)/gi,\n        function(E, y) {\n          var x, g = y.trim().replace(/^\"(.*)\"$/, function(o, c) {\n            return c;\n          }).replace(/^'(.*)'$/, function(o, c) {\n            return c;\n          });\n          return /^(#|data:|http:\\/\\/|https:\\/\\/|file:\\/\\/\\/|\\s*$)/i.test(g) ? E : (x = g.indexOf(\"//\") === 0 ? g : g.indexOf(\"/\") === 0 ? A + g : w + g.replace(/^\\.\\//, \"\"), \"url(\" + JSON.stringify(x) + \")\");\n        }\n      );\n    };\n  },\n  function(L, T) {\n    (function(e) {\n      var u = [\"sanitize\", \"whiteList\", \"sanitizeFn\"], A = [\n        \"background\",\n        \"cite\",\n        \"href\",\n        \"itemtype\",\n        \"longdesc\",\n        \"poster\",\n        \"src\",\n        \"xlink:href\"\n      ], w = {\n        \"*\": [\"class\", \"dir\", \"id\", \"lang\", \"role\", /^aria-[\\w-]*$/i],\n        a: [\"target\", \"href\", \"title\", \"rel\"],\n        area: [],\n        b: [],\n        br: [],\n        col: [],\n        code: [],\n        div: [],\n        em: [],\n        hr: [],\n        h1: [],\n        h2: [],\n        h3: [],\n        h4: [],\n        h5: [],\n        h6: [],\n        i: [],\n        img: [\"src\", \"alt\", \"title\", \"width\", \"height\"],\n        li: [],\n        ol: [],\n        p: [],\n        pre: [],\n        s: [],\n        small: [],\n        span: [],\n        sub: [],\n        sup: [],\n        strong: [],\n        u: [],\n        ul: []\n      }, E = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi, y = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;\n      function x(a, n) {\n        var t = a.nodeName.toLowerCase();\n        if (e.inArray(t, n) !== -1)\n          return e.inArray(t, A) === -1 || !!(a.nodeValue.match(E) || a.nodeValue.match(y));\n        for (var r = e(n).filter(function(i, d) {\n          return d instanceof RegExp;\n        }), l = 0, h = r.length; l < h; l++)\n          if (t.match(r[l])) return !0;\n        return !1;\n      }\n      function g(a, n, t) {\n        if (a.length === 0) return a;\n        if (t && typeof t == \"function\") return t(a);\n        if (!document.implementation || !document.implementation.createHTMLDocument)\n          return a;\n        var r = document.implementation.createHTMLDocument(\"sanitization\");\n        r.body.innerHTML = a;\n        for (var l = e.map(n, function(j, I) {\n          return I;\n        }), h = e(r.body).find(\"*\"), i = 0, d = h.length; i < d; i++) {\n          var p = h[i], f = p.nodeName.toLowerCase();\n          if (e.inArray(f, l) !== -1)\n            for (var v = e.map(p.attributes, function(j) {\n              return j;\n            }), k = [].concat(n[\"*\"] || [], n[f] || []), s = 0, S = v.length; s < S; s++)\n              x(v[s], k) || p.removeAttribute(v[s].nodeName);\n          else p.parentNode.removeChild(p);\n        }\n        return r.body.innerHTML;\n      }\n      var o = function(a, n) {\n        this.type = null, this.options = null, this.enabled = null, this.timeout = null, this.hoverState = null, this.$element = null, this.inState = null, this.init(\"tooltip\", a, n);\n      };\n      o.VERSION = \"3.4.1\", o.TRANSITION_DURATION = 150, o.DEFAULTS = {\n        animation: !0,\n        placement: \"top\",\n        selector: !1,\n        template: '<div class=\"tooltip\" role=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>',\n        trigger: \"hover focus\",\n        title: \"\",\n        delay: 0,\n        html: !1,\n        container: !1,\n        viewport: { selector: \"body\", padding: 0 },\n        sanitize: !0,\n        sanitizeFn: null,\n        whiteList: w\n      }, o.prototype.init = function(a, n, t) {\n        if (this.enabled = !0, this.type = a, this.$element = e(n), this.options = this.getOptions(t), this.$viewport = this.options.viewport && e(document).find(\n          e.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : this.options.viewport.selector || this.options.viewport\n        ), this.inState = { click: !1, hover: !1, focus: !1 }, this.$element[0] instanceof document.constructor && !this.options.selector)\n          throw new Error(\n            \"`selector` option must be specified when initializing \" + this.type + \" on the window.document object!\"\n          );\n        for (var r = this.options.trigger.split(\" \"), l = r.length; l--; ) {\n          var h = r[l];\n          if (h == \"click\")\n            this.$element.on(\n              \"click.\" + this.type,\n              this.options.selector,\n              e.proxy(this.toggle, this)\n            );\n          else if (h != \"manual\") {\n            var i = h == \"hover\" ? \"mouseenter\" : \"focusin\", d = h == \"hover\" ? \"mouseleave\" : \"focusout\";\n            this.$element.on(\n              i + \".\" + this.type,\n              this.options.selector,\n              e.proxy(this.enter, this)\n            ), this.$element.on(\n              d + \".\" + this.type,\n              this.options.selector,\n              e.proxy(this.leave, this)\n            );\n          }\n        }\n        this.options.selector ? this._options = e.extend({}, this.options, {\n          trigger: \"manual\",\n          selector: \"\"\n        }) : this.fixTitle();\n      }, o.prototype.getDefaults = function() {\n        return o.DEFAULTS;\n      }, o.prototype.getOptions = function(a) {\n        var n = this.$element.data();\n        for (var t in n)\n          n.hasOwnProperty(t) && e.inArray(t, u) !== -1 && delete n[t];\n        return (a = e.extend({}, this.getDefaults(), n, a)).delay && typeof a.delay == \"number\" && (a.delay = { show: a.delay, hide: a.delay }), a.sanitize && (a.template = g(a.template, a.whiteList, a.sanitizeFn)), a;\n      }, o.prototype.getDelegateOptions = function() {\n        var a = {}, n = this.getDefaults();\n        return this._options && e.each(this._options, function(t, r) {\n          n[t] != r && (a[t] = r);\n        }), a;\n      }, o.prototype.enter = function(a) {\n        var n = a instanceof this.constructor ? a : e(a.currentTarget).data(\"bs.\" + this.type);\n        if (n || (n = new this.constructor(\n          a.currentTarget,\n          this.getDelegateOptions()\n        ), e(a.currentTarget).data(\"bs.\" + this.type, n)), a instanceof e.Event && (n.inState[a.type == \"focusin\" ? \"focus\" : \"hover\"] = !0), n.tip().hasClass(\"in\") || n.hoverState == \"in\")\n          n.hoverState = \"in\";\n        else {\n          if (clearTimeout(n.timeout), n.hoverState = \"in\", !n.options.delay || !n.options.delay.show)\n            return n.show();\n          n.timeout = setTimeout(function() {\n            n.hoverState == \"in\" && n.show();\n          }, n.options.delay.show);\n        }\n      }, o.prototype.isInStateTrue = function() {\n        for (var a in this.inState) if (this.inState[a]) return !0;\n        return !1;\n      }, o.prototype.leave = function(a) {\n        var n = a instanceof this.constructor ? a : e(a.currentTarget).data(\"bs.\" + this.type);\n        if (n || (n = new this.constructor(\n          a.currentTarget,\n          this.getDelegateOptions()\n        ), e(a.currentTarget).data(\"bs.\" + this.type, n)), a instanceof e.Event && (n.inState[a.type == \"focusout\" ? \"focus\" : \"hover\"] = !1), !n.isInStateTrue()) {\n          if (clearTimeout(n.timeout), n.hoverState = \"out\", !n.options.delay || !n.options.delay.hide)\n            return n.hide();\n          n.timeout = setTimeout(function() {\n            n.hoverState == \"out\" && n.hide();\n          }, n.options.delay.hide);\n        }\n      }, o.prototype.show = function() {\n        var a = e.Event(\"show.bs.\" + this.type);\n        if (this.hasContent() && this.enabled) {\n          this.$element.trigger(a);\n          var n = e.contains(\n            this.$element[0].ownerDocument.documentElement,\n            this.$element[0]\n          );\n          if (a.isDefaultPrevented() || !n) return;\n          var t = this, r = this.tip(), l = this.getUID(this.type);\n          this.setContent(), r.attr(\"id\", l), this.$element.attr(\"aria-describedby\", l), this.options.animation && r.addClass(\"fade\");\n          var h = typeof this.options.placement == \"function\" ? this.options.placement.call(this, r[0], this.$element[0]) : this.options.placement, i = /\\s?auto?\\s?/i, d = i.test(h);\n          d && (h = h.replace(i, \"\") || \"top\"), r.detach().css({ top: 0, left: 0, display: \"block\" }).addClass(h).data(\"bs.\" + this.type, this), this.options.container ? r.appendTo(e(document).find(this.options.container)) : r.insertAfter(this.$element), this.$element.trigger(\"inserted.bs.\" + this.type);\n          var p = this.getPosition(), f = r[0].offsetWidth, v = r[0].offsetHeight;\n          if (d) {\n            var k = h, s = this.getPosition(this.$viewport);\n            h = h == \"bottom\" && p.bottom + v > s.bottom ? \"top\" : h == \"top\" && p.top - v < s.top ? \"bottom\" : h == \"right\" && p.right + f > s.width ? \"left\" : h == \"left\" && p.left - f < s.left ? \"right\" : h, r.removeClass(k).addClass(h);\n          }\n          var S = this.getCalculatedOffset(h, p, f, v);\n          this.applyPlacement(S, h);\n          var j = function() {\n            var I = t.hoverState;\n            t.$element.trigger(\"shown.bs.\" + t.type), t.hoverState = null, I == \"out\" && t.leave(t);\n          };\n          e.support.transition && this.$tip.hasClass(\"fade\") ? r.one(\"bsTransitionEnd\", j).emulateTransitionEnd(o.TRANSITION_DURATION) : j();\n        }\n      }, o.prototype.applyPlacement = function(a, n) {\n        var t = this.tip(), r = t[0].offsetWidth, l = t[0].offsetHeight, h = parseInt(t.css(\"margin-top\"), 10), i = parseInt(t.css(\"margin-left\"), 10);\n        isNaN(h) && (h = 0), isNaN(i) && (i = 0), a.top += h, a.left += i, e.offset.setOffset(\n          t[0],\n          e.extend(\n            {\n              using: function(S) {\n                t.css({ top: Math.round(S.top), left: Math.round(S.left) });\n              }\n            },\n            a\n          ),\n          0\n        ), t.addClass(\"in\");\n        var d = t[0].offsetWidth, p = t[0].offsetHeight;\n        n == \"top\" && p != l && (a.top = a.top + l - p);\n        var f = this.getViewportAdjustedDelta(n, a, d, p);\n        f.left ? a.left += f.left : a.top += f.top;\n        var v = /top|bottom/.test(n), k = v ? 2 * f.left - r + d : 2 * f.top - l + p, s = v ? \"offsetWidth\" : \"offsetHeight\";\n        t.offset(a), this.replaceArrow(k, t[0][s], v);\n      }, o.prototype.replaceArrow = function(a, n, t) {\n        this.arrow().css(t ? \"left\" : \"top\", 50 * (1 - a / n) + \"%\").css(t ? \"top\" : \"left\", \"\");\n      }, o.prototype.setContent = function() {\n        var a = this.tip(), n = this.getTitle();\n        this.options.html ? (this.options.sanitize && (n = g(n, this.options.whiteList, this.options.sanitizeFn)), a.find(\".tooltip-inner\").html(n)) : a.find(\".tooltip-inner\").text(n), a.removeClass(\"fade in top bottom left right\");\n      }, o.prototype.hide = function(a) {\n        var n = this, t = e(this.$tip), r = e.Event(\"hide.bs.\" + this.type);\n        function l() {\n          n.hoverState != \"in\" && t.detach(), n.$element && n.$element.removeAttr(\"aria-describedby\").trigger(\"hidden.bs.\" + n.type), a && a();\n        }\n        if (this.$element.trigger(r), !r.isDefaultPrevented())\n          return t.removeClass(\"in\"), e.support.transition && t.hasClass(\"fade\") ? t.one(\"bsTransitionEnd\", l).emulateTransitionEnd(o.TRANSITION_DURATION) : l(), this.hoverState = null, this;\n      }, o.prototype.fixTitle = function() {\n        var a = this.$element;\n        (a.attr(\"title\") || typeof a.attr(\"data-original-title\") != \"string\") && a.attr(\"data-original-title\", a.attr(\"title\") || \"\").attr(\"title\", \"\");\n      }, o.prototype.hasContent = function() {\n        return this.getTitle();\n      }, o.prototype.getPosition = function(a) {\n        var n = (a = a || this.$element)[0], t = n.tagName == \"BODY\", r = n.getBoundingClientRect();\n        r.width == null && (r = e.extend({}, r, {\n          width: r.right - r.left,\n          height: r.bottom - r.top\n        }));\n        var l = window.SVGElement && n instanceof window.SVGElement, h = t ? { top: 0, left: 0 } : l ? null : a.offset(), i = {\n          scroll: t ? document.documentElement.scrollTop || document.body.scrollTop : a.scrollTop()\n        }, d = t ? { width: e(window).width(), height: e(window).height() } : null;\n        return e.extend({}, r, i, d, h);\n      }, o.prototype.getCalculatedOffset = function(a, n, t, r) {\n        return a == \"bottom\" ? { top: n.top + n.height, left: n.left + n.width / 2 - t / 2 } : a == \"top\" ? { top: n.top - r, left: n.left + n.width / 2 - t / 2 } : a == \"left\" ? { top: n.top + n.height / 2 - r / 2, left: n.left - t } : { top: n.top + n.height / 2 - r / 2, left: n.left + n.width };\n      }, o.prototype.getViewportAdjustedDelta = function(a, n, t, r) {\n        var l = { top: 0, left: 0 };\n        if (!this.$viewport) return l;\n        var h = this.options.viewport && this.options.viewport.padding || 0, i = this.getPosition(this.$viewport);\n        if (/right|left/.test(a)) {\n          var d = n.top - h - i.scroll, p = n.top + h - i.scroll + r;\n          d < i.top ? l.top = i.top - d : p > i.top + i.height && (l.top = i.top + i.height - p);\n        } else {\n          var f = n.left - h, v = n.left + h + t;\n          f < i.left ? l.left = i.left - f : v > i.right && (l.left = i.left + i.width - v);\n        }\n        return l;\n      }, o.prototype.getTitle = function() {\n        var a = this.$element, n = this.options;\n        return a.attr(\"data-original-title\") || (typeof n.title == \"function\" ? n.title.call(a[0]) : n.title);\n      }, o.prototype.getUID = function(a) {\n        do\n          a += ~~(1e6 * Math.random());\n        while (document.getElementById(a));\n        return a;\n      }, o.prototype.tip = function() {\n        if (!this.$tip && (this.$tip = e(this.options.template), this.$tip.length != 1))\n          throw new Error(\n            this.type + \" `template` option must consist of exactly 1 top-level element!\"\n          );\n        return this.$tip;\n      }, o.prototype.arrow = function() {\n        return this.$arrow = this.$arrow || this.tip().find(\".tooltip-arrow\");\n      }, o.prototype.enable = function() {\n        this.enabled = !0;\n      }, o.prototype.disable = function() {\n        this.enabled = !1;\n      }, o.prototype.toggleEnabled = function() {\n        this.enabled = !this.enabled;\n      }, o.prototype.toggle = function(a) {\n        var n = this;\n        a && ((n = e(a.currentTarget).data(\"bs.\" + this.type)) || (n = new this.constructor(\n          a.currentTarget,\n          this.getDelegateOptions()\n        ), e(a.currentTarget).data(\"bs.\" + this.type, n))), a ? (n.inState.click = !n.inState.click, n.isInStateTrue() ? n.enter(n) : n.leave(n)) : n.tip().hasClass(\"in\") ? n.leave(n) : n.enter(n);\n      }, o.prototype.destroy = function() {\n        var a = this;\n        clearTimeout(this.timeout), this.hide(function() {\n          a.$element.off(\".\" + a.type).removeData(\"bs.\" + a.type), a.$tip && a.$tip.detach(), a.$tip = null, a.$arrow = null, a.$viewport = null, a.$element = null;\n        });\n      }, o.prototype.sanitizeHtml = function(a) {\n        return g(a, this.options.whiteList, this.options.sanitizeFn);\n      };\n      var c = e.fn.tooltip;\n      e.fn.tooltip = function(a) {\n        return this.each(function() {\n          var n = e(this), t = n.data(\"bs.tooltip\"), r = typeof a == \"object\" && a;\n          !t && /destroy|hide/.test(a) || (t || n.data(\"bs.tooltip\", t = new o(this, r)), typeof a == \"string\" && t[a]());\n        });\n      }, e.fn.tooltip.Constructor = o, e.fn.tooltip.noConflict = function() {\n        return e.fn.tooltip = c, this;\n      };\n    })(jQuery);\n  },\n  function(L, T) {\n    (function(e) {\n      var u = function(w, E) {\n        this.init(\"popover\", w, E);\n      };\n      if (!e.fn.tooltip) throw new Error(\"Popover requires tooltip.js\");\n      u.VERSION = \"3.4.1\", u.DEFAULTS = e.extend({}, e.fn.tooltip.Constructor.DEFAULTS, {\n        placement: \"right\",\n        trigger: \"click\",\n        content: \"\",\n        template: '<div class=\"popover\" role=\"tooltip\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'\n      }), (u.prototype = e.extend(\n        {},\n        e.fn.tooltip.Constructor.prototype\n      )).constructor = u, u.prototype.getDefaults = function() {\n        return u.DEFAULTS;\n      }, u.prototype.setContent = function() {\n        var w = this.tip(), E = this.getTitle(), y = this.getContent();\n        if (this.options.html) {\n          var x = typeof y;\n          this.options.sanitize && (E = this.sanitizeHtml(E), x === \"string\" && (y = this.sanitizeHtml(y))), w.find(\".popover-title\").html(E), w.find(\".popover-content\").children().detach().end()[x === \"string\" ? \"html\" : \"append\"](y);\n        } else\n          w.find(\".popover-title\").text(E), w.find(\".popover-content\").children().detach().end().text(y);\n        w.removeClass(\"fade top bottom left right in\"), w.find(\".popover-title\").html() || w.find(\".popover-title\").hide();\n      }, u.prototype.hasContent = function() {\n        return this.getTitle() || this.getContent();\n      }, u.prototype.getContent = function() {\n        var w = this.$element, E = this.options;\n        return w.attr(\"data-content\") || (typeof E.content == \"function\" ? E.content.call(w[0]) : E.content);\n      }, u.prototype.arrow = function() {\n        return this.$arrow = this.$arrow || this.tip().find(\".arrow\");\n      };\n      var A = e.fn.popover;\n      e.fn.popover = function(w) {\n        return this.each(function() {\n          var E = e(this), y = E.data(\"bs.popover\"), x = typeof w == \"object\" && w;\n          !y && /destroy|hide/.test(w) || (y || E.data(\"bs.popover\", y = new u(this, x)), typeof w == \"string\" && y[w]());\n        });\n      }, e.fn.popover.Constructor = u, e.fn.popover.noConflict = function() {\n        return e.fn.popover = A, this;\n      };\n    })(jQuery);\n  },\n  function(L, T, e) {\n    e.r(T);\n    var u = e(133);\n    for (var A in u)\n      [\"default\", \"core\"].indexOf(A) < 0 && function(o) {\n        e.d(T, o, function() {\n          return u[o];\n        });\n      }(A);\n    var w = e(114);\n    e.d(T, \"watchDigests\", function() {\n      return w.b;\n    }), e.d(T, \"getLocals\", function() {\n      return w.a;\n    });\n    var E = e(55);\n    e.d(T, \"getNg1ViewConfigFactory\", function() {\n      return E.b;\n    }), e.d(T, \"ng1ViewsBuilder\", function() {\n      return E.c;\n    }), e.d(T, \"Ng1ViewConfig\", function() {\n      return E.a;\n    });\n    var y = e(112);\n    e.d(T, \"StateProvider\", function() {\n      return y.a;\n    });\n    var x = e(113);\n    e.d(T, \"UrlRouterProvider\", function() {\n      return x.a;\n    }), e(220), e(221), e(222), e(223), e(224);\n    var g = e(2);\n    for (var A in e.d(T, \"core\", function() {\n      return g;\n    }), g)\n      [\n        \"default\",\n        \"core\",\n        \"watchDigests\",\n        \"getLocals\",\n        \"getNg1ViewConfigFactory\",\n        \"ng1ViewsBuilder\",\n        \"Ng1ViewConfig\",\n        \"StateProvider\",\n        \"UrlRouterProvider\"\n      ].indexOf(A) < 0 && function(c) {\n        e.d(T, c, function() {\n          return g[c];\n        });\n      }(A);\n    T.default = \"ui.router\";\n  },\n  function(L, T) {\n  },\n  function(L, T, e) {\n    var u, A, w, E = e(12), y = e(2);\n    function x(t) {\n      var r = t.match(/^\\s*({[^}]*})\\s*$/);\n      r && (t = \"(\" + r[1] + \")\");\n      var l = t.replace(/\\n/g, \" \").match(/^\\s*([^(]*?)\\s*(\\((.*)\\))?\\s*$/);\n      if (!l || l.length !== 4)\n        throw new Error(\"Invalid state ref '\" + t + \"'\");\n      return { state: l[1] || null, paramExpr: l[3] || null };\n    }\n    function g(t) {\n      var r = t.parent().inheritedData(\"$uiView\"), l = Object(y.parse)(\"$cfg.path\")(r);\n      return l ? Object(y.tail)(l).state.name : void 0;\n    }\n    function o(t, r, l) {\n      var h = l.uiState || t.current.name, i = Object(y.extend)(\n        function(p, f) {\n          return {\n            relative: g(p) || f.$current,\n            inherit: !0,\n            source: \"sref\"\n          };\n        }(r, t),\n        l.uiStateOpts || {}\n      ), d = t.href(h, l.uiStateParams, i);\n      return {\n        uiState: h,\n        uiStateParams: l.uiStateParams,\n        uiStateOpts: i,\n        href: d\n      };\n    }\n    function c(t) {\n      var r = Object.prototype.toString.call(t.prop(\"href\")) === \"[object SVGAnimatedString]\", l = t[0].nodeName === \"FORM\";\n      return {\n        attr: l ? \"action\" : r ? \"xlink:href\" : \"href\",\n        isAnchor: t.prop(\"tagName\").toUpperCase() === \"A\",\n        clickable: !l\n      };\n    }\n    function a(t, r, l, h, i) {\n      return function(d) {\n        var p = d.which || d.button, f = i();\n        if (!(p > 1 || d.ctrlKey || d.metaKey || d.shiftKey || d.altKey || t.attr(\"target\"))) {\n          var v = l(function() {\n            t.attr(\"disabled\") || r.go(f.uiState, f.uiStateParams, f.uiStateOpts);\n          });\n          d.preventDefault();\n          var k = h.isAnchor && !f.href ? 1 : 0;\n          d.preventDefault = function() {\n            k-- <= 0 && l.cancel(v);\n          };\n        }\n      };\n    }\n    function n(t, r, l, h) {\n      var i;\n      h && (i = h.events), Object(y.isArray)(i) || (i = [\"click\"]);\n      for (var d = t.on ? \"on\" : \"bind\", p = 0, f = i; p < f.length; p++) {\n        var v = f[p];\n        t[d](v, l);\n      }\n      r.$on(\"$destroy\", function() {\n        for (var k = t.off ? \"off\" : \"unbind\", s = 0, S = i; s < S.length; s++) {\n          var j = S[s];\n          t[k](j, l);\n        }\n      });\n    }\n    u = [\n      \"$uiRouter\",\n      \"$timeout\",\n      function(t, r) {\n        var l = t.stateService;\n        return {\n          restrict: \"A\",\n          require: [\"?^uiSrefActive\", \"?^uiSrefActiveEq\"],\n          link: function(h, i, d, p) {\n            var f = c(i), v = p[1] || p[0], k = null, s = {}, S = function() {\n              return o(l, i, s);\n            }, j = x(d.uiSref);\n            function I() {\n              var M = S();\n              k && k(), v && (k = v.$$addStateInfo(M.uiState, M.uiStateParams)), M.href != null && d.$set(f.attr, M.href);\n            }\n            if (s.uiState = j.state, s.uiStateOpts = d.uiSrefOpts ? h.$eval(d.uiSrefOpts) : {}, j.paramExpr && (h.$watch(\n              j.paramExpr,\n              function(M) {\n                s.uiStateParams = Object(y.extend)({}, M), I();\n              },\n              !0\n            ), s.uiStateParams = Object(y.extend)({}, h.$eval(j.paramExpr))), I(), h.$on(\"$destroy\", t.stateRegistry.onStatesChanged(I)), h.$on(\"$destroy\", t.transitionService.onSuccess({}, I)), f.clickable) {\n              var R = a(i, l, r, f, S);\n              n(i, h, R, s.uiStateOpts);\n            }\n          }\n        };\n      }\n    ], A = [\n      \"$uiRouter\",\n      \"$timeout\",\n      function(t, r) {\n        var l = t.stateService;\n        return {\n          restrict: \"A\",\n          require: [\"?^uiSrefActive\", \"?^uiSrefActiveEq\"],\n          link: function(h, i, d, p) {\n            var f, v = c(i), k = p[1] || p[0], s = null, S = {}, j = function() {\n              return o(l, i, S);\n            }, I = [\"uiState\", \"uiStateParams\", \"uiStateOpts\"], R = I.reduce(function(z, V) {\n              return z[V] = y.noop, z;\n            }, {});\n            function M() {\n              var z = j();\n              s && s(), k && (s = k.$$addStateInfo(z.uiState, z.uiStateParams)), z.href != null && d.$set(v.attr, z.href);\n            }\n            I.forEach(function(z) {\n              S[z] = d[z] ? h.$eval(d[z]) : null, d.$observe(z, function(V) {\n                R[z](), R[z] = h.$watch(\n                  V,\n                  function(G) {\n                    S[z] = G, M();\n                  },\n                  !0\n                );\n              });\n            }), M(), h.$on(\"$destroy\", t.stateRegistry.onStatesChanged(M)), h.$on(\"$destroy\", t.transitionService.onSuccess({}, M)), v.clickable && (f = a(i, l, r, v, j), n(i, h, f, S.uiStateOpts));\n          }\n        };\n      }\n    ], w = [\n      \"$state\",\n      \"$stateParams\",\n      \"$interpolate\",\n      \"$uiRouter\",\n      function(t, r, l, h) {\n        return {\n          restrict: \"A\",\n          controller: [\n            \"$scope\",\n            \"$element\",\n            \"$attrs\",\n            function(i, d, p) {\n              var f, v, k, s, S, j = [];\n              f = l(p.uiSrefActiveEq || \"\", !1)(i);\n              try {\n                v = i.$eval(p.uiSrefActive);\n              } catch {\n              }\n              function I(G) {\n                G.promise.then(V, y.noop);\n              }\n              function R() {\n                M(v);\n              }\n              function M(G) {\n                Object(y.isObject)(G) && (j = [], Object(y.forEach)(G, function(Y, tt) {\n                  var Z = function(at, nt) {\n                    var ht = x(at);\n                    z(ht.state, i.$eval(ht.paramExpr), nt);\n                  };\n                  Object(y.isString)(Y) ? Z(Y, tt) : Object(y.isArray)(Y) && Object(y.forEach)(Y, function(at) {\n                    Z(at, tt);\n                  });\n                }));\n              }\n              function z(G, Y, tt) {\n                var Z = {\n                  state: t.get(G, g(d)) || { name: G },\n                  params: Y,\n                  activeClass: tt\n                };\n                return j.push(Z), function() {\n                  Object(y.removeFrom)(j)(Z);\n                };\n              }\n              function V() {\n                var G = function(ct) {\n                  return ct.split(/\\s/).filter(y.identity);\n                }, Y = function(ct) {\n                  return ct.map(function(ot) {\n                    return ot.activeClass;\n                  }).map(G).reduce(y.unnestR, []);\n                }, tt = Y(j).concat(G(f)).reduce(y.uniqR, []), Z = Y(\n                  j.filter(function(ct) {\n                    return t.includes(ct.state.name, ct.params);\n                  })\n                ), at = j.filter(function(ct) {\n                  return t.is(ct.state.name, ct.params);\n                }).length ? G(f) : [], nt = Z.concat(at).reduce(y.uniqR, []), ht = tt.filter(function(ct) {\n                  return !Object(y.inArray)(nt, ct);\n                });\n                i.$evalAsync(function() {\n                  nt.forEach(function(ct) {\n                    return d.addClass(ct);\n                  }), ht.forEach(function(ct) {\n                    return d.removeClass(ct);\n                  });\n                });\n              }\n              M(v = v || l(p.uiSrefActive || \"\", !1)(i)), this.$$addStateInfo = function(G, Y) {\n                if (!(Object(y.isObject)(v) && j.length > 0)) {\n                  var tt = z(G, Y, v);\n                  return V(), tt;\n                }\n              }, i.$on(\n                \"$destroy\",\n                (k = h.stateRegistry.onStatesChanged(R), s = h.transitionService.onStart({}, I), S = i.$on(\"$stateChangeSuccess\", V), function() {\n                  k(), s(), S();\n                })\n              ), h.globals.transition && I(h.globals.transition), V();\n            }\n          ]\n        };\n      }\n    ], E.a.module(\"ui.router.state\").directive(\"uiSref\", u).directive(\"uiSrefActive\", w).directive(\"uiSrefActiveEq\", w).directive(\"uiState\", A);\n  },\n  function(L, T, e) {\n    var u = e(12);\n    function A(E) {\n      var y = function(x, g, o) {\n        return E.is(x, g, o);\n      };\n      return y.$stateful = !0, y;\n    }\n    function w(E) {\n      var y = function(x, g, o) {\n        return E.includes(x, g, o);\n      };\n      return y.$stateful = !0, y;\n    }\n    A.$inject = [\"$state\"], w.$inject = [\"$state\"], u.a.module(\"ui.router.state\").filter(\"isState\", A).filter(\"includedByState\", w);\n  },\n  function(L, T, e) {\n    var u, A = e(2), w = e(12), E = e(114), y = e(55);\n    function x(a, n, t, r, l) {\n      var h = Object(A.parse)(\"viewDecl.controllerAs\"), i = Object(A.parse)(\"viewDecl.resolveAs\");\n      return {\n        restrict: \"ECA\",\n        priority: -400,\n        compile: function(d) {\n          var p = d.html();\n          return d.empty(), function(f, v) {\n            var k = v.data(\"$uiView\");\n            if (!k) return v.html(p), void a(v.contents())(f);\n            var s = k.$cfg || { viewDecl: {}, getTemplate: A.noop }, S = s.path && new A.ResolveContext(s.path);\n            v.html(s.getTemplate(v, S) || p), A.trace.traceUIViewFill(k.$uiView, v.html());\n            var j = a(v.contents()), I = s.controller, R = h(s), M = i(s), z = S && Object(E.a)(S);\n            if (f[M] = z, I) {\n              var V = n(\n                I,\n                Object(A.extend)({}, z, { $scope: f, $element: v })\n              );\n              R && (f[R] = V, f[R][M] = z), v.data(\"$ngControllerController\", V), v.children().data(\"$ngControllerController\", V), c(l, t, V, f, s);\n            }\n            if (Object(A.isString)(s.component))\n              var G = Object(A.kebobString)(s.component), Y = new RegExp(\"^(x-|data-)?\" + G + \"$\", \"i\"), tt = f.$watch(\n                function() {\n                  var Z = [].slice.call(v[0].children).filter(function(at) {\n                    return at && at.tagName && Y.exec(at.tagName);\n                  });\n                  return Z && w.a.element(Z).data(\"$\" + s.component + \"Controller\");\n                },\n                function(Z) {\n                  Z && (c(l, t, Z, f, s), tt());\n                }\n              );\n            j(f);\n          };\n        }\n      };\n    }\n    u = [\n      \"$view\",\n      \"$animate\",\n      \"$uiViewScroll\",\n      \"$interpolate\",\n      \"$q\",\n      function(a, n, t, r, l) {\n        var h = {\n          $cfg: { viewDecl: { $context: a._pluginapi._rootViewContext() } },\n          $uiView: {}\n        }, i = {\n          count: 0,\n          restrict: \"ECA\",\n          terminal: !0,\n          priority: 400,\n          transclude: \"element\",\n          compile: function(d, p, f) {\n            return function(v, k, s) {\n              var S, j, I, R, M = s.onload || \"\", z = s.autoscroll, V = {\n                enter: function(nt, ht, ct) {\n                  w.a.version.minor > 2 ? n.enter(nt, null, ht).then(ct) : n.enter(nt, null, ht, ct);\n                },\n                leave: function(nt, ht) {\n                  w.a.version.minor > 2 ? n.leave(nt).then(ht) : n.leave(nt, ht);\n                }\n              }, G = k.inheritedData(\"$uiView\") || h, Y = r(s.uiView || s.name || \"\")(v) || \"$default\", tt = {\n                $type: \"ng1\",\n                id: i.count++,\n                name: Y,\n                fqn: G.$uiView.fqn ? G.$uiView.fqn + \".\" + Y : Y,\n                config: null,\n                configUpdated: function(nt) {\n                  if (!(nt && !(nt instanceof y.a)) && (ht = R, ct = nt, ht !== ct)) {\n                    var ht, ct;\n                    A.trace.traceUIViewConfigUpdated(\n                      tt,\n                      nt && nt.viewDecl && nt.viewDecl.$context\n                    ), R = nt, at(nt);\n                  }\n                },\n                get creationContext() {\n                  var nt = Object(A.parse)(\"$cfg.viewDecl.$context\")(G), ht = Object(A.parse)(\"$uiView.creationContext\")(G);\n                  return nt || ht;\n                }\n              };\n              A.trace.traceUIViewEvent(\"Linking\", tt), k.data(\"$uiView\", { $uiView: tt }), at();\n              var Z = a.registerUIView(tt);\n              function at(nt) {\n                var ht = v.$new(), ct = l.defer(), ot = l.defer(), gt = { $cfg: nt, $uiView: tt }, xt = {\n                  $animEnter: ct.promise,\n                  $animLeave: ot.promise,\n                  $$animLeave: ot\n                };\n                ht.$emit(\"$viewContentLoading\", Y);\n                var St = f(ht, function(zt) {\n                  zt.data(\"$uiViewAnim\", xt), zt.data(\"$uiView\", gt), V.enter(zt, k, function() {\n                    ct.resolve(), I && I.$emit(\"$viewContentAnimationEnded\"), (Object(A.isDefined)(z) && !z || v.$eval(z)) && t(zt);\n                  }), function() {\n                    if (S && (A.trace.traceUIViewEvent(\n                      \"Removing (previous) el\",\n                      S.data(\"$uiView\")\n                    ), S.remove(), S = null), I && (A.trace.traceUIViewEvent(\"Destroying scope\", tt), I.$destroy(), I = null), j) {\n                      var Nt = j.data(\"$uiViewAnim\");\n                      A.trace.traceUIViewEvent(\"Animate out\", Nt), V.leave(j, function() {\n                        Nt.$$animLeave.resolve(), S = null;\n                      }), S = j, j = null;\n                    }\n                  }();\n                });\n                j = St, (I = ht).$emit(\"$viewContentLoaded\", nt || R), I.$eval(M);\n              }\n              v.$on(\"$destroy\", function() {\n                A.trace.traceUIViewEvent(\"Destroying/Unregistering\", tt), Z();\n              });\n            };\n          }\n        };\n        return i;\n      }\n    ], x.$inject = [\"$compile\", \"$controller\", \"$transitions\", \"$view\", \"$q\"];\n    var g = typeof w.a.module(\"ui.router\").component == \"function\", o = 0;\n    function c(a, n, t, r, l) {\n      !Object(A.isFunction)(t.$onInit) || (l.viewDecl.component || l.viewDecl.componentProvider) && g || t.$onInit();\n      var h = Object(A.tail)(l.path).state.self, i = { bind: t };\n      if (Object(A.isFunction)(t.uiOnParamsChanged)) {\n        var d = new A.ResolveContext(l.path).getResolvable(\"$transition$\").data;\n        r.$on(\n          \"$destroy\",\n          n.onSuccess(\n            {},\n            function(k) {\n              if (k !== d && k.exiting().indexOf(h) === -1) {\n                var s = k.params(\"to\"), S = k.params(\"from\"), j = function(G) {\n                  return G.paramSchema;\n                }, I = k.treeChanges(\"to\").map(j).reduce(A.unnestR, []), R = k.treeChanges(\"from\").map(j).reduce(A.unnestR, []), M = I.filter(function(G) {\n                  var Y = R.indexOf(G);\n                  return Y === -1 || !R[Y].type.equals(s[G.id], S[G.id]);\n                });\n                if (M.length) {\n                  var z = M.map(function(G) {\n                    return G.id;\n                  }), V = Object(A.filter)(s, function(G, Y) {\n                    return z.indexOf(Y) !== -1;\n                  });\n                  t.uiOnParamsChanged(V, k);\n                }\n              }\n            },\n            i\n          )\n        );\n      }\n      if (Object(A.isFunction)(t.uiCanExit)) {\n        var p = o++, f = function(k) {\n          return !!k && (k._uiCanExitIds && k._uiCanExitIds[p] === !0 || f(k.redirectedFrom()));\n        }, v = { exiting: h.name };\n        r.$on(\n          \"$destroy\",\n          n.onBefore(\n            v,\n            function(k) {\n              var s, S = k._uiCanExitIds = k._uiCanExitIds || {};\n              return f(k) || (s = a.when(t.uiCanExit(k))).then(function(j) {\n                return S[p] = j !== !1;\n              }), s;\n            },\n            i\n          )\n        );\n      }\n    }\n    w.a.module(\"ui.router.state\").directive(\"uiView\", u), w.a.module(\"ui.router.state\").directive(\"uiView\", x);\n  },\n  function(L, T, e) {\n    e(12).a.module(\"ui.router.state\").provider(\"$uiViewScroll\", function() {\n      var u = !1;\n      this.useAnchorScroll = function() {\n        u = !0;\n      }, this.$get = [\n        \"$anchorScroll\",\n        \"$timeout\",\n        function(A, w) {\n          return u ? A : function(E) {\n            return w(\n              function() {\n                E[0].scrollIntoView();\n              },\n              0,\n              !1\n            );\n          };\n        }\n      ];\n    });\n  },\n  function(L, T, e) {\n    e(226), L.exports = \"ngRoute\";\n  },\n  function(L, T) {\n    /**\n     * @license AngularJS v1.8.2\n     * (c) 2010-2020 Google LLC. http://angularjs.org\n     * License: MIT\n     */\n    (function(e, u) {\n      function A(r, l) {\n        var h = [], i = r.replace(/([().])/g, \"\\\\$1\").replace(/(\\/)?:(\\w+)(\\*\\?|[?*])?/g, function(d, p, f, v) {\n          var k = v === \"?\" || v === \"*?\", s = v === \"*\" || v === \"*?\";\n          return h.push({ name: f, optional: k }), p = p || \"\", (k ? \"(?:\" + p : p + \"(?:\") + (s ? \"(.+?)\" : \"([^/]+)\") + (k ? \"?)?\" : \")\");\n        }).replace(/([/$*])/g, \"\\\\$1\");\n        return l.ignoreTrailingSlashes && (i = i.replace(/\\/+$/, \"\") + \"/*\"), {\n          keys: h,\n          regexp: new RegExp(\n            \"^\" + i + \"(?:[?#]|$)\",\n            l.caseInsensitiveMatch ? \"i\" : \"\"\n          )\n        };\n      }\n      var w, E, y, x, g, o = u.module(\"ngRoute\", []).info({ angularVersion: \"1.8.2\" }).provider(\"$route\", function() {\n        function r(h, i) {\n          return u.extend(Object.create(h), i);\n        }\n        w = u.isArray, E = u.isObject, y = u.isDefined, x = u.noop;\n        var l = {};\n        this.when = function(h, i) {\n          var d = function(f, v) {\n            if (w(f)) {\n              v = v || [];\n              for (var k = 0, s = f.length; k < s; k++) v[k] = f[k];\n            } else if (E(f))\n              for (var S in v = v || {}, f)\n                S.charAt(0) === \"$\" && S.charAt(1) === \"$\" || (v[S] = f[S]);\n            return v || f;\n          }(i);\n          if (u.isUndefined(d.reloadOnUrl) && (d.reloadOnUrl = !0), u.isUndefined(d.reloadOnSearch) && (d.reloadOnSearch = !0), u.isUndefined(d.caseInsensitiveMatch) && (d.caseInsensitiveMatch = this.caseInsensitiveMatch), l[h] = u.extend(d, { originalPath: h }, h && A(h, d)), h) {\n            var p = h[h.length - 1] === \"/\" ? h.substr(0, h.length - 1) : h + \"/\";\n            l[p] = u.extend({ originalPath: h, redirectTo: h }, A(p, d));\n          }\n          return this;\n        }, this.caseInsensitiveMatch = !1, this.otherwise = function(h) {\n          return typeof h == \"string\" && (h = { redirectTo: h }), this.when(null, h), this;\n        }, g = !0, this.eagerInstantiationEnabled = function(h) {\n          return y(h) ? (g = h, this) : g;\n        }, this.$get = [\n          \"$rootScope\",\n          \"$location\",\n          \"$routeParams\",\n          \"$q\",\n          \"$injector\",\n          \"$templateRequest\",\n          \"$sce\",\n          \"$browser\",\n          function(h, i, d, p, f, v, k, s) {\n            var S, j, I = !1, R = {\n              routes: l,\n              reload: function() {\n                I = !0;\n                var Z = {\n                  defaultPrevented: !1,\n                  preventDefault: function() {\n                    this.defaultPrevented = !0, I = !1;\n                  }\n                };\n                h.$evalAsync(function() {\n                  M(Z), Z.defaultPrevented || z();\n                });\n              },\n              updateParams: function(Z) {\n                if (!this.current || !this.current.$$route)\n                  throw c(\n                    \"norout\",\n                    \"Tried updating route with no current route\"\n                  );\n                Z = u.extend({}, this.current.params, Z), i.path(tt(this.current.$$route.originalPath, Z)), i.search(Z);\n              }\n            };\n            return h.$on(\"$locationChangeStart\", M), h.$on(\"$locationChangeSuccess\", z), R;\n            function M(Z) {\n              var at, nt, ht, ct, ot = R.current;\n              u.forEach(l, function(gt, xt) {\n                !nt && (at = function(St, zt) {\n                  var Nt = zt.keys, re = {};\n                  if (!zt.regexp) return null;\n                  var be = zt.regexp.exec(St);\n                  if (!be) return null;\n                  for (var ne = 1, ce = be.length; ne < ce; ++ne) {\n                    var xe = Nt[ne - 1], we = be[ne];\n                    xe && we && (re[xe.name] = we);\n                  }\n                  return re;\n                }(i.path(), gt)) && ((nt = r(gt, {\n                  params: u.extend({}, i.search(), at),\n                  pathParams: at\n                })).$$route = gt);\n              }), S = nt || l.null && r(l.null, { params: {}, pathParams: {} }), ht = S, ct = ot, (j = !I && ht && ct && ht.$$route === ct.$$route && (!ht.reloadOnUrl || !ht.reloadOnSearch && u.equals(ht.pathParams, ct.pathParams))) || !ot && !S || h.$broadcast(\"$routeChangeStart\", S, ot).defaultPrevented && Z && Z.preventDefault();\n            }\n            function z() {\n              var Z = R.current, at = S;\n              if (j)\n                Z.params = at.params, u.copy(Z.params, d), h.$broadcast(\"$routeUpdate\", Z);\n              else if (at || Z) {\n                I = !1, R.current = at;\n                var nt = p.resolve(at);\n                s.$$incOutstandingRequestCount(\"$route\"), nt.then(V).then(G).then(function(ht) {\n                  return ht && nt.then(Y).then(function(ct) {\n                    at === R.current && (at && (at.locals = ct, u.copy(at.params, d)), h.$broadcast(\"$routeChangeSuccess\", at, Z));\n                  });\n                }).catch(function(ht) {\n                  at === R.current && h.$broadcast(\"$routeChangeError\", at, Z, ht);\n                }).finally(function() {\n                  s.$$completeOutstandingRequest(x, \"$route\");\n                });\n              }\n            }\n            function V(Z) {\n              var at = { route: Z, hasRedirection: !1 };\n              if (Z) {\n                if (Z.redirectTo)\n                  if (u.isString(Z.redirectTo))\n                    at.path = tt(Z.redirectTo, Z.params), at.search = Z.params, at.hasRedirection = !0;\n                  else {\n                    var nt = i.path(), ht = i.search(), ct = Z.redirectTo(Z.pathParams, nt, ht);\n                    u.isDefined(ct) && (at.url = ct, at.hasRedirection = !0);\n                  }\n                else if (Z.resolveRedirectTo)\n                  return p.resolve(f.invoke(Z.resolveRedirectTo)).then(function(ot) {\n                    return u.isDefined(ot) && (at.url = ot, at.hasRedirection = !0), at;\n                  });\n              }\n              return at;\n            }\n            function G(Z) {\n              var at = !0;\n              if (Z.route !== R.current) at = !1;\n              else if (Z.hasRedirection) {\n                var nt = i.url(), ht = Z.url;\n                ht ? i.url(ht).replace() : ht = i.path(Z.path).search(Z.search).replace().url(), ht !== nt && (at = !1);\n              }\n              return at;\n            }\n            function Y(Z) {\n              if (Z) {\n                var at = u.extend({}, Z.resolve);\n                u.forEach(at, function(ht, ct) {\n                  at[ct] = u.isString(ht) ? f.get(ht) : f.invoke(ht, null, null, ct);\n                });\n                var nt = function(ht) {\n                  var ct, ot;\n                  return u.isDefined(ct = ht.template) ? u.isFunction(ct) && (ct = ct(ht.params)) : u.isDefined(ot = ht.templateUrl) && (u.isFunction(ot) && (ot = ot(ht.params)), u.isDefined(ot) && (ht.loadedTemplateUrl = k.valueOf(ot), ct = v(ot))), ct;\n                }(Z);\n                return u.isDefined(nt) && (at.$template = nt), p.all(at);\n              }\n            }\n            function tt(Z, at) {\n              var nt = [];\n              return u.forEach((Z || \"\").split(\":\"), function(ht, ct) {\n                if (ct === 0) nt.push(ht);\n                else {\n                  var ot = ht.match(/(\\w+)(?:[?*])?(.*)/), gt = ot[1];\n                  nt.push(at[gt]), nt.push(ot[2] || \"\"), delete at[gt];\n                }\n              }), nt.join(\"\");\n            }\n          }\n        ];\n      }).run(a), c = u.$$minErr(\"ngRoute\");\n      function a(r) {\n        g && r.get(\"$route\");\n      }\n      function n(r, l, h) {\n        return {\n          restrict: \"ECA\",\n          terminal: !0,\n          priority: 400,\n          transclude: \"element\",\n          link: function(i, d, p, f, v) {\n            var k, s, S, j = p.autoscroll, I = p.onload || \"\";\n            function R() {\n              S && (h.cancel(S), S = null), k && (k.$destroy(), k = null), s && ((S = h.leave(s)).done(function(z) {\n                z !== !1 && (S = null);\n              }), s = null);\n            }\n            function M() {\n              var z = r.current && r.current.locals, V = z && z.$template;\n              if (u.isDefined(V)) {\n                var G = i.$new(), Y = r.current, tt = v(G, function(Z) {\n                  h.enter(Z, null, s || d).done(function(at) {\n                    at === !1 || !u.isDefined(j) || j && !i.$eval(j) || l();\n                  }), R();\n                });\n                s = tt, (k = Y.scope = G).$emit(\"$viewContentLoaded\"), k.$eval(I);\n              } else R();\n            }\n            i.$on(\"$routeChangeSuccess\", M), M();\n          }\n        };\n      }\n      function t(r, l, h) {\n        return {\n          restrict: \"ECA\",\n          priority: -400,\n          link: function(i, d) {\n            var p = h.current, f = p.locals;\n            d.html(f.$template);\n            var v = r(d.contents());\n            if (p.controller) {\n              f.$scope = i;\n              var k = l(p.controller, f);\n              p.controllerAs && (i[p.controllerAs] = k), d.data(\"$ngControllerController\", k), d.children().data(\"$ngControllerController\", k);\n            }\n            i[p.resolveAs || \"$resolve\"] = f, v(i);\n          }\n        };\n      }\n      a.$inject = [\"$injector\"], o.provider(\"$routeParams\", function() {\n        this.$get = function() {\n          return {};\n        };\n      }), o.directive(\"ngView\", n), o.directive(\"ngView\", t), n.$inject = [\"$route\", \"$anchorScroll\", \"$animate\"], t.$inject = [\"$compile\", \"$controller\", \"$route\"];\n    })(window, window.angular);\n  },\n  function(L, T, e) {\n    var u = e(228);\n    function A(w, E, y) {\n      return {\n        restrict: \"AE\",\n        replace: !0,\n        scope: { opts: \"=\", marked: \"=\", compile: \"@\", src: \"=\" },\n        link: function(x, g, o) {\n          function c(a) {\n            a = u(String(a || \"\")), g.html(w(a, x.opts || null)), x.$eval(o.compile) && y(g.contents())(x.$parent);\n          }\n          o.marked ? (c(x.marked), x.$watch(\"marked\", c)) : o.src ? x.$watch(\"src\", function(a) {\n            E(a, !0).then(\n              function(n) {\n                c(n);\n              },\n              function() {\n                c(\"\"), x.$emit(\"$markedIncludeError\", o.src);\n              }\n            );\n          }) : c(g.text());\n        }\n      };\n    }\n    A.$inject = [\"marked\", \"$templateRequest\", \"$compile\"], L.exports = angular.module(\"hc.marked\", []).directive(\"marked\", A).provider(\"marked\", function() {\n      var w = this;\n      w.setRenderer = function(E) {\n        this.renderer = E;\n      }, w.setOptions = function(E) {\n        this.defaults = E;\n      }, w.$get = [\n        \"$log\",\n        \"$window\",\n        function(E, y) {\n          var x;\n          try {\n            x = e(229);\n          } catch {\n            x = y.marked || marked;\n          }\n          if (!angular.isUndefined(x)) {\n            var g = new x.Renderer();\n            if (w.renderer)\n              for (var o = Object.keys(w.renderer), c = o.length; c--; )\n                g[o[c]] = w.renderer[o[c]];\n            var a = g.code.bind(g);\n            g.code = function(r, l, h) {\n              return t(a(r, l, h));\n            };\n            var n = g.codespan.bind(g);\n            return g.codespan = function(r) {\n              return t(n(r));\n            }, w.defaults = w.defaults || {}, w.defaults.renderer = g, x.setOptions(w.defaults), x;\n          }\n          function t(r) {\n            return \"<span ng-non-bindable>\" + r + \"</span>\";\n          }\n          E.error(\n            \"angular-marked Error: marked not loaded.  See installation instructions.\"\n          );\n        }\n      ];\n    }).name;\n  },\n  function(L, T) {\n    L.exports = function(e) {\n      if (!e) return e;\n      var u, A = e.replace(/\\t/g, \"  \").split(/\\r?\\n/), w = null, E = A.length;\n      for (u = 0; u < E; u++) {\n        var y = A[u], x = y.match(/^(\\s*)/)[0].length;\n        x !== y.length && (w = x < w || w === null ? x : w);\n      }\n      if (w !== null && w > 0) for (u = 0; u < E; u++) A[u] = A[u].substr(w);\n      return A.join(`\n`);\n    };\n  },\n  function(L, T, e) {\n    (function(u) {\n      (function(A) {\n        var w = {\n          newline: /^\\n+/,\n          code: /^( {4}[^\\n]+\\n*)+/,\n          fences: i,\n          hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)/,\n          heading: /^ *(#{1,6}) *([^\\n]+?) *#* *(?:\\n+|$)/,\n          nptable: i,\n          blockquote: /^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/,\n          list: /^( *)(bull) [\\s\\S]+?(?:hr|def|\\n{2,}(?! )(?!\\1bull )\\n*|\\s*$)/,\n          html: /^ *(?:comment *(?:\\n|\\s*$)|closed *(?:\\n{2,}|\\s*$)|closing *(?:\\n{2,}|\\s*$))/,\n          def: /^ {0,3}\\[(label)\\]: *\\n? *<?([^\\s>]+)>?(?:(?: +\\n? *| *\\n *)(title))? *(?:\\n+|$)/,\n          table: i,\n          lheading: /^([^\\n]+)\\n *(=|-){2,} *(?:\\n+|$)/,\n          paragraph: /^([^\\n]+(?:\\n?(?!hr|heading|lheading| {0,3}>|tag)[^\\n]+)+)/,\n          text: /^[^\\n]+/\n        };\n        function E(f) {\n          this.tokens = [], this.tokens.links = {}, this.options = f || p.defaults, this.rules = w.normal, this.options.gfm && (this.options.tables ? this.rules = w.tables : this.rules = w.gfm);\n        }\n        w._label = /(?:\\\\[\\[\\]]|[^\\[\\]])+/, w._title = /(?:\"(?:\\\\\"|[^\"]|\"[^\"\\n]*\")*\"|'\\n?(?:[^'\\n]+\\n?)*'|\\([^()]*\\))/, w.def = t(w.def).replace(\"label\", w._label).replace(\"title\", w._title).getRegex(), w.bullet = /(?:[*+-]|\\d+\\.)/, w.item = /^( *)(bull) [^\\n]*(?:\\n(?!\\1bull )[^\\n]*)*/, w.item = t(w.item, \"gm\").replace(/bull/g, w.bullet).getRegex(), w.list = t(w.list).replace(/bull/g, w.bullet).replace(\n          \"hr\",\n          \"\\\\n+(?=\\\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$))\"\n        ).replace(\"def\", \"\\\\n+(?=\" + w.def.source + \")\").getRegex(), w._tag = \"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b\", w.html = t(w.html).replace(\"comment\", /<!--[\\s\\S]*?-->/).replace(\"closed\", /<(tag)[\\s\\S]+?<\\/\\1>/).replace(\"closing\", /<tag(?:\"[^\"]*\"|'[^']*'|\\s[^'\"\\/>\\s]*)*?\\/?>/).replace(/tag/g, w._tag).getRegex(), w.paragraph = t(w.paragraph).replace(\"hr\", w.hr).replace(\"heading\", w.heading).replace(\"lheading\", w.lheading).replace(\"tag\", \"<\" + w._tag).getRegex(), w.blockquote = t(w.blockquote).replace(\"paragraph\", w.paragraph).getRegex(), w.normal = d({}, w), w.gfm = d({}, w.normal, {\n          fences: /^ *(`{3,}|~{3,})[ \\.]*(\\S+)? *\\n([\\s\\S]*?)\\n? *\\1 *(?:\\n+|$)/,\n          paragraph: /^/,\n          heading: /^ *(#{1,6}) +([^\\n]+?) *#* *(?:\\n+|$)/\n        }), w.gfm.paragraph = t(w.paragraph).replace(\n          \"(?!\",\n          \"(?!\" + w.gfm.fences.source.replace(\"\\\\1\", \"\\\\2\") + \"|\" + w.list.source.replace(\"\\\\1\", \"\\\\3\") + \"|\"\n        ).getRegex(), w.tables = d({}, w.gfm, {\n          nptable: /^ *(\\S.*\\|.*)\\n *([-:]+ *\\|[-| :]*)\\n((?:.*\\|.*(?:\\n|$))*)\\n*/,\n          table: /^ *\\|(.+)\\n *\\|( *[-:]+[-| :]*)\\n((?: *\\|.*(?:\\n|$))*)\\n*/\n        }), E.rules = w, E.lex = function(f, v) {\n          return new E(v).lex(f);\n        }, E.prototype.lex = function(f) {\n          return f = f.replace(/\\r\\n|\\r/g, `\n`).replace(/\\t/g, \"    \").replace(/\\u00a0/g, \" \").replace(/\\u2424/g, `\n`), this.token(f, !0);\n        }, E.prototype.token = function(f, v) {\n          var k, s, S, j, I, R, M, z, V, G, Y;\n          for (f = f.replace(/^ +$/gm, \"\"); f; )\n            if ((S = this.rules.newline.exec(f)) && (f = f.substring(S[0].length), S[0].length > 1 && this.tokens.push({ type: \"space\" })), S = this.rules.code.exec(f))\n              f = f.substring(S[0].length), S = S[0].replace(/^ {4}/gm, \"\"), this.tokens.push({\n                type: \"code\",\n                text: this.options.pedantic ? S : S.replace(/\\n+$/, \"\")\n              });\n            else if (S = this.rules.fences.exec(f))\n              f = f.substring(S[0].length), this.tokens.push({\n                type: \"code\",\n                lang: S[2],\n                text: S[3] || \"\"\n              });\n            else if (S = this.rules.heading.exec(f))\n              f = f.substring(S[0].length), this.tokens.push({\n                type: \"heading\",\n                depth: S[1].length,\n                text: S[2]\n              });\n            else if (v && (S = this.rules.nptable.exec(f))) {\n              for (f = f.substring(S[0].length), R = {\n                type: \"table\",\n                header: S[1].replace(/^ *| *\\| *$/g, \"\").split(/ *\\| */),\n                align: S[2].replace(/^ *|\\| *$/g, \"\").split(/ *\\| */),\n                cells: S[3].replace(/\\n$/, \"\").split(`\n`)\n              }, z = 0; z < R.align.length; z++)\n                /^ *-+: *$/.test(R.align[z]) ? R.align[z] = \"right\" : /^ *:-+: *$/.test(R.align[z]) ? R.align[z] = \"center\" : /^ *:-+ *$/.test(R.align[z]) ? R.align[z] = \"left\" : R.align[z] = null;\n              for (z = 0; z < R.cells.length; z++)\n                R.cells[z] = R.cells[z].split(/ *\\| */);\n              this.tokens.push(R);\n            } else if (S = this.rules.hr.exec(f))\n              f = f.substring(S[0].length), this.tokens.push({ type: \"hr\" });\n            else if (S = this.rules.blockquote.exec(f))\n              f = f.substring(S[0].length), this.tokens.push({ type: \"blockquote_start\" }), S = S[0].replace(/^ *> ?/gm, \"\"), this.token(S, v), this.tokens.push({ type: \"blockquote_end\" });\n            else if (S = this.rules.list.exec(f)) {\n              for (f = f.substring(S[0].length), Y = (j = S[2]).length > 1, this.tokens.push({\n                type: \"list_start\",\n                ordered: Y,\n                start: Y ? +j : \"\"\n              }), k = !1, G = (S = S[0].match(this.rules.item)).length, z = 0; z < G; z++)\n                M = (R = S[z]).length, ~(R = R.replace(/^ *([*+-]|\\d+\\.) +/, \"\")).indexOf(`\n `) && (M -= R.length, R = this.options.pedantic ? R.replace(/^ {1,4}/gm, \"\") : R.replace(new RegExp(\"^ {1,\" + M + \"}\", \"gm\"), \"\")), this.options.smartLists && z !== G - 1 && (j === (I = w.bullet.exec(S[z + 1])[0]) || j.length > 1 && I.length > 1 || (f = S.slice(z + 1).join(`\n`) + f, z = G - 1)), s = k || /\\n\\n(?!\\s*$)/.test(R), z !== G - 1 && (k = R.charAt(R.length - 1) === `\n`, s || (s = k)), this.tokens.push({\n                  type: s ? \"loose_item_start\" : \"list_item_start\"\n                }), this.token(R, !1), this.tokens.push({ type: \"list_item_end\" });\n              this.tokens.push({ type: \"list_end\" });\n            } else if (S = this.rules.html.exec(f))\n              f = f.substring(S[0].length), this.tokens.push({\n                type: this.options.sanitize ? \"paragraph\" : \"html\",\n                pre: !this.options.sanitizer && (S[1] === \"pre\" || S[1] === \"script\" || S[1] === \"style\"),\n                text: S[0]\n              });\n            else if (v && (S = this.rules.def.exec(f)))\n              f = f.substring(S[0].length), S[3] && (S[3] = S[3].substring(1, S[3].length - 1)), V = S[1].toLowerCase(), this.tokens.links[V] || (this.tokens.links[V] = { href: S[2], title: S[3] });\n            else if (v && (S = this.rules.table.exec(f))) {\n              for (f = f.substring(S[0].length), R = {\n                type: \"table\",\n                header: S[1].replace(/^ *| *\\| *$/g, \"\").split(/ *\\| */),\n                align: S[2].replace(/^ *|\\| *$/g, \"\").split(/ *\\| */),\n                cells: S[3].replace(/(?: *\\| *)?\\n$/, \"\").split(`\n`)\n              }, z = 0; z < R.align.length; z++)\n                /^ *-+: *$/.test(R.align[z]) ? R.align[z] = \"right\" : /^ *:-+: *$/.test(R.align[z]) ? R.align[z] = \"center\" : /^ *:-+ *$/.test(R.align[z]) ? R.align[z] = \"left\" : R.align[z] = null;\n              for (z = 0; z < R.cells.length; z++)\n                R.cells[z] = R.cells[z].replace(/^ *\\| *| *\\| *$/g, \"\").split(/ *\\| */);\n              this.tokens.push(R);\n            } else if (S = this.rules.lheading.exec(f))\n              f = f.substring(S[0].length), this.tokens.push({\n                type: \"heading\",\n                depth: S[2] === \"=\" ? 1 : 2,\n                text: S[1]\n              });\n            else if (v && (S = this.rules.paragraph.exec(f)))\n              f = f.substring(S[0].length), this.tokens.push({\n                type: \"paragraph\",\n                text: S[1].charAt(S[1].length - 1) === `\n` ? S[1].slice(0, -1) : S[1]\n              });\n            else if (S = this.rules.text.exec(f))\n              f = f.substring(S[0].length), this.tokens.push({ type: \"text\", text: S[0] });\n            else if (f)\n              throw new Error(\"Infinite loop on byte: \" + f.charCodeAt(0));\n          return this.tokens;\n        };\n        var y = {\n          escape: /^\\\\([\\\\`*{}\\[\\]()#+\\-.!_>])/,\n          autolink: /^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/,\n          url: i,\n          tag: /^<!--[\\s\\S]*?-->|^<\\/?[a-zA-Z0-9\\-]+(?:\"[^\"]*\"|'[^']*'|\\s[^<'\">\\/\\s]*)*?\\/?>/,\n          link: /^!?\\[(inside)\\]\\(href\\)/,\n          reflink: /^!?\\[(inside)\\]\\s*\\[([^\\]]*)\\]/,\n          nolink: /^!?\\[((?:\\[[^\\[\\]]*\\]|\\\\[\\[\\]]|[^\\[\\]])*)\\]/,\n          strong: /^__([\\s\\S]+?)__(?!_)|^\\*\\*([\\s\\S]+?)\\*\\*(?!\\*)/,\n          em: /^_([^\\s_](?:[^_]|__)+?[^\\s_])_\\b|^\\*((?:\\*\\*|[^*])+?)\\*(?!\\*)/,\n          code: /^(`+)\\s*([\\s\\S]*?[^`]?)\\s*\\1(?!`)/,\n          br: /^ {2,}\\n(?!\\s*$)/,\n          del: i,\n          text: /^[\\s\\S]+?(?=[\\\\<!\\[`*]|\\b_| {2,}\\n|$)/\n        };\n        function x(f, v) {\n          if (this.options = v || p.defaults, this.links = f, this.rules = y.normal, this.renderer = this.options.renderer || new g(), this.renderer.options = this.options, !this.links)\n            throw new Error(\"Tokens array requires a `links` property.\");\n          this.options.gfm ? this.options.breaks ? this.rules = y.breaks : this.rules = y.gfm : this.options.pedantic && (this.rules = y.pedantic);\n        }\n        function g(f) {\n          this.options = f || {};\n        }\n        function o() {\n        }\n        function c(f) {\n          this.tokens = [], this.token = null, this.options = f || p.defaults, this.options.renderer = this.options.renderer || new g(), this.renderer = this.options.renderer, this.renderer.options = this.options;\n        }\n        function a(f, v) {\n          return f.replace(v ? /&/g : /&(?!#?\\w+;)/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(/\"/g, \"&quot;\").replace(/'/g, \"&#39;\");\n        }\n        function n(f) {\n          return f.replace(\n            /&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/gi,\n            function(v, k) {\n              return (k = k.toLowerCase()) === \"colon\" ? \":\" : k.charAt(0) === \"#\" ? k.charAt(1) === \"x\" ? String.fromCharCode(parseInt(k.substring(2), 16)) : String.fromCharCode(+k.substring(1)) : \"\";\n            }\n          );\n        }\n        function t(f, v) {\n          return f = f.source, v = v || \"\", {\n            replace: function(k, s) {\n              return s = (s = s.source || s).replace(/(^|[^\\[])\\^/g, \"$1\"), f = f.replace(k, s), this;\n            },\n            getRegex: function() {\n              return new RegExp(f, v);\n            }\n          };\n        }\n        function r(f, v) {\n          return l[\" \" + f] || (/^[^:]+:\\/*[^/]*$/.test(f) ? l[\" \" + f] = f + \"/\" : l[\" \" + f] = f.replace(/[^/]*$/, \"\")), f = l[\" \" + f], v.slice(0, 2) === \"//\" ? f.replace(/:[\\s\\S]*/, \":\") + v : v.charAt(0) === \"/\" ? f.replace(/(:\\/*[^/]*)[\\s\\S]*/, \"$1\") + v : f + v;\n        }\n        y._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/, y._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/, y.autolink = t(y.autolink).replace(\"scheme\", y._scheme).replace(\"email\", y._email).getRegex(), y._inside = /(?:\\[[^\\[\\]]*\\]|\\\\[\\[\\]]|[^\\[\\]]|\\](?=[^\\[]*\\]))*/, y._href = /\\s*<?([\\s\\S]*?)>?(?:\\s+['\"]([\\s\\S]*?)['\"])?\\s*/, y.link = t(y.link).replace(\"inside\", y._inside).replace(\"href\", y._href).getRegex(), y.reflink = t(y.reflink).replace(\"inside\", y._inside).getRegex(), y.normal = d({}, y), y.pedantic = d({}, y.normal, {\n          strong: /^__(?=\\S)([\\s\\S]*?\\S)__(?!_)|^\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*(?!\\*)/,\n          em: /^_(?=\\S)([\\s\\S]*?\\S)_(?!_)|^\\*(?=\\S)([\\s\\S]*?\\S)\\*(?!\\*)/\n        }), y.gfm = d({}, y.normal, {\n          escape: t(y.escape).replace(\"])\", \"~|])\").getRegex(),\n          url: t(\n            /^((?:ftp|https?):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/\n          ).replace(\"email\", y._email).getRegex(),\n          _backpedal: /(?:[^?!.,:;*_~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,\n          del: /^~~(?=\\S)([\\s\\S]*?\\S)~~/,\n          text: t(y.text).replace(\"]|\", \"~]|\").replace(\n            \"|\",\n            \"|https?://|ftp://|www\\\\.|[a-zA-Z0-9.!#$%&'*+/=?^_`{\\\\|}~-]+@|\"\n          ).getRegex()\n        }), y.breaks = d({}, y.gfm, {\n          br: t(y.br).replace(\"{2,}\", \"*\").getRegex(),\n          text: t(y.gfm.text).replace(\"{2,}\", \"*\").getRegex()\n        }), x.rules = y, x.output = function(f, v, k) {\n          return new x(v, k).output(f);\n        }, x.prototype.output = function(f) {\n          for (var v, k, s, S, j = \"\"; f; )\n            if (S = this.rules.escape.exec(f))\n              f = f.substring(S[0].length), j += S[1];\n            else if (S = this.rules.autolink.exec(f))\n              f = f.substring(S[0].length), s = S[2] === \"@\" ? \"mailto:\" + (k = a(this.mangle(S[1]))) : k = a(S[1]), j += this.renderer.link(s, null, k);\n            else if (this.inLink || !(S = this.rules.url.exec(f))) {\n              if (S = this.rules.tag.exec(f))\n                !this.inLink && /^<a /i.test(S[0]) ? this.inLink = !0 : this.inLink && /^<\\/a>/i.test(S[0]) && (this.inLink = !1), f = f.substring(S[0].length), j += this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(S[0]) : a(S[0]) : S[0];\n              else if (S = this.rules.link.exec(f))\n                f = f.substring(S[0].length), this.inLink = !0, j += this.outputLink(S, { href: S[2], title: S[3] }), this.inLink = !1;\n              else if ((S = this.rules.reflink.exec(f)) || (S = this.rules.nolink.exec(f))) {\n                if (f = f.substring(S[0].length), v = (S[2] || S[1]).replace(/\\s+/g, \" \"), !(v = this.links[v.toLowerCase()]) || !v.href) {\n                  j += S[0].charAt(0), f = S[0].substring(1) + f;\n                  continue;\n                }\n                this.inLink = !0, j += this.outputLink(S, v), this.inLink = !1;\n              } else if (S = this.rules.strong.exec(f))\n                f = f.substring(S[0].length), j += this.renderer.strong(this.output(S[2] || S[1]));\n              else if (S = this.rules.em.exec(f))\n                f = f.substring(S[0].length), j += this.renderer.em(this.output(S[2] || S[1]));\n              else if (S = this.rules.code.exec(f))\n                f = f.substring(S[0].length), j += this.renderer.codespan(a(S[2].trim(), !0));\n              else if (S = this.rules.br.exec(f))\n                f = f.substring(S[0].length), j += this.renderer.br();\n              else if (S = this.rules.del.exec(f))\n                f = f.substring(S[0].length), j += this.renderer.del(this.output(S[1]));\n              else if (S = this.rules.text.exec(f))\n                f = f.substring(S[0].length), j += this.renderer.text(a(this.smartypants(S[0])));\n              else if (f)\n                throw new Error(\"Infinite loop on byte: \" + f.charCodeAt(0));\n            } else\n              S[0] = this.rules._backpedal.exec(S[0])[0], f = f.substring(S[0].length), S[2] === \"@\" ? s = \"mailto:\" + (k = a(S[0])) : (k = a(S[0]), s = S[1] === \"www.\" ? \"http://\" + k : k), j += this.renderer.link(s, null, k);\n          return j;\n        }, x.prototype.outputLink = function(f, v) {\n          var k = a(v.href), s = v.title ? a(v.title) : null;\n          return f[0].charAt(0) !== \"!\" ? this.renderer.link(k, s, this.output(f[1])) : this.renderer.image(k, s, a(f[1]));\n        }, x.prototype.smartypants = function(f) {\n          return this.options.smartypants ? f.replace(/---/g, \"—\").replace(/--/g, \"–\").replace(/(^|[-\\u2014/(\\[{\"\\s])'/g, \"$1‘\").replace(/'/g, \"’\").replace(/(^|[-\\u2014/(\\[{\\u2018\\s])\"/g, \"$1“\").replace(/\"/g, \"”\").replace(/\\.{3}/g, \"…\") : f;\n        }, x.prototype.mangle = function(f) {\n          if (!this.options.mangle) return f;\n          for (var v, k = \"\", s = f.length, S = 0; S < s; S++)\n            v = f.charCodeAt(S), Math.random() > 0.5 && (v = \"x\" + v.toString(16)), k += \"&#\" + v + \";\";\n          return k;\n        }, g.prototype.code = function(f, v, k) {\n          if (this.options.highlight) {\n            var s = this.options.highlight(f, v);\n            s != null && s !== f && (k = !0, f = s);\n          }\n          return v ? '<pre><code class=\"' + this.options.langPrefix + a(v, !0) + '\">' + (k ? f : a(f, !0)) + `\n</code></pre>\n` : \"<pre><code>\" + (k ? f : a(f, !0)) + `\n</code></pre>`;\n        }, g.prototype.blockquote = function(f) {\n          return `<blockquote>\n` + f + `</blockquote>\n`;\n        }, g.prototype.html = function(f) {\n          return f;\n        }, g.prototype.heading = function(f, v, k) {\n          return \"<h\" + v + ' id=\"' + this.options.headerPrefix + k.toLowerCase().replace(/[^\\w]+/g, \"-\") + '\">' + f + \"</h\" + v + `>\n`;\n        }, g.prototype.hr = function() {\n          return this.options.xhtml ? `<hr/>\n` : `<hr>\n`;\n        }, g.prototype.list = function(f, v, k) {\n          var s = v ? \"ol\" : \"ul\";\n          return \"<\" + s + (v && k !== 1 ? ' start=\"' + k + '\"' : \"\") + `>\n` + f + \"</\" + s + `>\n`;\n        }, g.prototype.listitem = function(f) {\n          return \"<li>\" + f + `</li>\n`;\n        }, g.prototype.paragraph = function(f) {\n          return \"<p>\" + f + `</p>\n`;\n        }, g.prototype.table = function(f, v) {\n          return `<table>\n<thead>\n` + f + `</thead>\n<tbody>\n` + v + `</tbody>\n</table>\n`;\n        }, g.prototype.tablerow = function(f) {\n          return `<tr>\n` + f + `</tr>\n`;\n        }, g.prototype.tablecell = function(f, v) {\n          var k = v.header ? \"th\" : \"td\";\n          return (v.align ? \"<\" + k + ' style=\"text-align:' + v.align + '\">' : \"<\" + k + \">\") + f + \"</\" + k + `>\n`;\n        }, g.prototype.strong = function(f) {\n          return \"<strong>\" + f + \"</strong>\";\n        }, g.prototype.em = function(f) {\n          return \"<em>\" + f + \"</em>\";\n        }, g.prototype.codespan = function(f) {\n          return \"<code>\" + f + \"</code>\";\n        }, g.prototype.br = function() {\n          return this.options.xhtml ? \"<br/>\" : \"<br>\";\n        }, g.prototype.del = function(f) {\n          return \"<del>\" + f + \"</del>\";\n        }, g.prototype.link = function(f, v, k) {\n          if (this.options.sanitize) {\n            try {\n              var s = decodeURIComponent(n(f)).replace(/[^\\w:]/g, \"\").toLowerCase();\n            } catch {\n              return k;\n            }\n            if (s.indexOf(\"javascript:\") === 0 || s.indexOf(\"vbscript:\") === 0 || s.indexOf(\"data:\") === 0)\n              return k;\n          }\n          this.options.baseUrl && !h.test(f) && (f = r(this.options.baseUrl, f));\n          var S = '<a href=\"' + f + '\"';\n          return v && (S += ' title=\"' + v + '\"'), S += \">\" + k + \"</a>\";\n        }, g.prototype.image = function(f, v, k) {\n          this.options.baseUrl && !h.test(f) && (f = r(this.options.baseUrl, f));\n          var s = '<img src=\"' + f + '\" alt=\"' + k + '\"';\n          return v && (s += ' title=\"' + v + '\"'), s += this.options.xhtml ? \"/>\" : \">\";\n        }, g.prototype.text = function(f) {\n          return f;\n        }, o.prototype.strong = o.prototype.em = o.prototype.codespan = o.prototype.del = o.prototype.text = function(f) {\n          return f;\n        }, o.prototype.link = o.prototype.image = function(f, v, k) {\n          return \"\" + k;\n        }, o.prototype.br = function() {\n          return \"\";\n        }, c.parse = function(f, v) {\n          return new c(v).parse(f);\n        }, c.prototype.parse = function(f) {\n          this.inline = new x(f.links, this.options), this.inlineText = new x(\n            f.links,\n            d({}, this.options, { renderer: new o() })\n          ), this.tokens = f.reverse();\n          for (var v = \"\"; this.next(); ) v += this.tok();\n          return v;\n        }, c.prototype.next = function() {\n          return this.token = this.tokens.pop();\n        }, c.prototype.peek = function() {\n          return this.tokens[this.tokens.length - 1] || 0;\n        }, c.prototype.parseText = function() {\n          for (var f = this.token.text; this.peek().type === \"text\"; )\n            f += `\n` + this.next().text;\n          return this.inline.output(f);\n        }, c.prototype.tok = function() {\n          switch (this.token.type) {\n            case \"space\":\n              return \"\";\n            case \"hr\":\n              return this.renderer.hr();\n            case \"heading\":\n              return this.renderer.heading(\n                this.inline.output(this.token.text),\n                this.token.depth,\n                n(this.inlineText.output(this.token.text))\n              );\n            case \"code\":\n              return this.renderer.code(\n                this.token.text,\n                this.token.lang,\n                this.token.escaped\n              );\n            case \"table\":\n              var f, v, k, s, S = \"\", j = \"\";\n              for (k = \"\", f = 0; f < this.token.header.length; f++)\n                k += this.renderer.tablecell(\n                  this.inline.output(this.token.header[f]),\n                  { header: !0, align: this.token.align[f] }\n                );\n              for (S += this.renderer.tablerow(k), f = 0; f < this.token.cells.length; f++) {\n                for (v = this.token.cells[f], k = \"\", s = 0; s < v.length; s++)\n                  k += this.renderer.tablecell(this.inline.output(v[s]), {\n                    header: !1,\n                    align: this.token.align[s]\n                  });\n                j += this.renderer.tablerow(k);\n              }\n              return this.renderer.table(S, j);\n            case \"blockquote_start\":\n              for (j = \"\"; this.next().type !== \"blockquote_end\"; )\n                j += this.tok();\n              return this.renderer.blockquote(j);\n            case \"list_start\":\n              j = \"\";\n              for (var I = this.token.ordered, R = this.token.start; this.next().type !== \"list_end\"; )\n                j += this.tok();\n              return this.renderer.list(j, I, R);\n            case \"list_item_start\":\n              for (j = \"\"; this.next().type !== \"list_item_end\"; )\n                j += this.token.type === \"text\" ? this.parseText() : this.tok();\n              return this.renderer.listitem(j);\n            case \"loose_item_start\":\n              for (j = \"\"; this.next().type !== \"list_item_end\"; )\n                j += this.tok();\n              return this.renderer.listitem(j);\n            case \"html\":\n              var M = this.token.pre || this.options.pedantic ? this.token.text : this.inline.output(this.token.text);\n              return this.renderer.html(M);\n            case \"paragraph\":\n              return this.renderer.paragraph(\n                this.inline.output(this.token.text)\n              );\n            case \"text\":\n              return this.renderer.paragraph(this.parseText());\n          }\n        };\n        var l = {}, h = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;\n        function i() {\n        }\n        function d(f) {\n          for (var v, k, s = 1; s < arguments.length; s++)\n            for (k in v = arguments[s])\n              Object.prototype.hasOwnProperty.call(v, k) && (f[k] = v[k]);\n          return f;\n        }\n        function p(f, v, k) {\n          if (f == null)\n            throw new Error(\"marked(): input parameter is undefined or null\");\n          if (typeof f != \"string\")\n            throw new Error(\n              \"marked(): input parameter is of type \" + Object.prototype.toString.call(f) + \", string expected\"\n            );\n          if (k || typeof v == \"function\") {\n            k || (k = v, v = null);\n            var s, S, j = (v = d({}, p.defaults, v || {})).highlight, I = 0;\n            try {\n              s = E.lex(f, v);\n            } catch (M) {\n              return k(M);\n            }\n            S = s.length;\n            var R = function(M) {\n              if (M) return v.highlight = j, k(M);\n              var z;\n              try {\n                z = c.parse(s, v);\n              } catch (V) {\n                M = V;\n              }\n              return v.highlight = j, M ? k(M) : k(null, z);\n            };\n            if (!j || j.length < 3 || (delete v.highlight, !S)) return R();\n            for (; I < s.length; I++)\n              (function(M) {\n                M.type !== \"code\" ? --S || R() : j(M.text, M.lang, function(z, V) {\n                  return z ? R(z) : V == null || V === M.text ? --S || R() : (M.text = V, M.escaped = !0, void (--S || R()));\n                });\n              })(s[I]);\n          } else\n            try {\n              return v && (v = d({}, p.defaults, v)), c.parse(E.lex(f, v), v);\n            } catch (M) {\n              if (M.message += `\nPlease report this to https://github.com/markedjs/marked.`, (v || p.defaults).silent)\n                return \"<p>An error occurred:</p><pre>\" + a(M.message + \"\", !0) + \"</pre>\";\n              throw M;\n            }\n        }\n        i.exec = i, p.options = p.setOptions = function(f) {\n          return d(p.defaults, f), p;\n        }, p.defaults = {\n          gfm: !0,\n          tables: !0,\n          breaks: !1,\n          pedantic: !1,\n          sanitize: !1,\n          sanitizer: null,\n          mangle: !0,\n          smartLists: !1,\n          silent: !1,\n          highlight: null,\n          langPrefix: \"lang-\",\n          smartypants: !1,\n          headerPrefix: \"\",\n          renderer: new g(),\n          xhtml: !1,\n          baseUrl: null\n        }, p.Parser = c, p.parser = c.parse, p.Renderer = g, p.TextRenderer = o, p.Lexer = E, p.lexer = E.lex, p.InlineLexer = x, p.inlineLexer = x.output, p.parse = p, L.exports = p;\n      })();\n    }).call(this, e(35));\n  },\n  function(L, T, e) {\n    e(231), e(233), e(422), e(424), e(428), e(431), e(435), e(437), e(441), e(443);\n  },\n  function(L, T, e) {\n    const u = e(232), A = e(21), w = e(33);\n    angular.module(\"dbt\").directive(\"graphLauncher\", [\n      \"$state\",\n      \"$q\",\n      \"graph\",\n      \"selectorService\",\n      \"project\",\n      \"trackingService\",\n      \"locationService\",\n      function(E, y, x, g, o, c, a) {\n        return {\n          restrict: \"EA\",\n          replace: !0,\n          scope: {},\n          templateUrl: u,\n          link: function(n, t) {\n            n.filters_visible = !1, n.graphService = x, n.selectorService = g, n.allSelected = !0;\n            var r = {\n              tags: { visible: !1 },\n              packages: { visible: !1 },\n              resource_types: { visible: !1 }\n            };\n            n.onWindowClick = function(l) {\n              w(l.target);\n              var h = w(l.target).closest(\".dropup\");\n              h.length || (r.tags.visible = !1, r.packages.visible = !1);\n              var i = h.data(\"form-type\");\n              A.each(r, function(d, p) {\n                p != i && (d.visible = !1);\n              }), w(l.target).closest(\"#graph-viz-wrapper\").length && setTimeout(function() {\n                w(\":focus\").blur();\n              });\n            }, n.onSelectClick = function(l) {\n              A.each(r, function(h, i) {\n                i == l && (h.visible = !h.visible, h.visible || w(\":focus\").blur());\n              });\n            }, n.isVisible = function(l) {\n              return r[l].visible;\n            }, n.isSelected = function(l, h) {\n              return g.selection.dirty[l].indexOf(h) != -1;\n            }, n.onSelectAll = function(l, h, i) {\n              var d = g.selection.dirty;\n              d[l] = h ? [...g.options[l]] : [], n.allSelected = !n.allSelected, i.preventDefault();\n            }, n.onItemSelect = function(l, h, i) {\n              var d = g.selection.dirty;\n              n.isSelected(l, h) ? d[l] = A.without(d[l], h) : d[l] = A.union(d[l], [h]), i.preventDefault();\n            }, n.onSelectBlur = function(l, h) {\n              h && (h.relatedTarget && h.relatedTarget.tagName != \"SELECT\" || n.isVisible(l) && w(h.target).focus());\n            }, n.resourceTypeTitle = function(l) {\n              return l == \"analysis\" ? \"Analyses\" : l[0].toUpperCase() + l.slice(1) + \"s\";\n            }, n.selectionLabel = function(l, h) {\n              var i = g.selection.dirty[l], d = g.options[l];\n              return i.length == 0 ? \"None selected\" : i.length == 1 ? i[0] || h : i.length == d.length ? \"All selected\" : i.length + \" selected\";\n            }, n.onUpdateSelector = function() {\n              var l = g.updateSelection(), h = x.updateGraph(l);\n              c.track_graph_interaction(\"update-graph\", h.length);\n            }, n.showExpanded = function() {\n              var l = g.getViewNode(), h = l ? l.name : null;\n              if (l && l.resource_type == \"source\")\n                var i = x.showFullGraph(\n                  \"source:\" + l.source_name + \".\" + l.name\n                );\n              else l && l.resource_type == \"exposure\" ? i = x.showFullGraph(\"exposure:\" + l.name) : l && l.resource_type == \"metric\" ? i = x.showFullGraph(\"metric:\" + l.name) : l && l.resource_type == \"semantic_model\" ? i = x.showFullGraph(\"semantic_model:\" + l.name) : i = x.showFullGraph(h);\n              c.track_graph_interaction(\"show-expanded\", i.length);\n            }, n.showContracted = function() {\n              var l = g.getViewNode();\n              if (l && l.resource_type == \"source\")\n                var h = x.showVerticalGraph(\n                  \"source:\" + l.source_name + \".\" + l.name,\n                  !0\n                );\n              else l && l.resource_type == \"exposure\" ? h = x.showVerticalGraph(\"exposure:\" + l.name, !0) : l && l.resource_type == \"metric\" ? h = x.showVerticalGraph(\"metric:\" + l.name, !0) : l && l.resource_type == \"semantic_model\" ? h = x.showVerticalGraph(\"semantic_model:\" + l.name, !0) : h = x.showVerticalGraph(l.name, !0);\n              a.clearState(), c.track_graph_interaction(\"show-contracted\", h.length);\n            }, n.closeGraph = function() {\n              x.hideGraph(), a.clearState();\n            }, n.onLauncherClick = function() {\n              var l = g.getViewNode();\n              if (l) g.resetSelection(l), n.showContracted();\n              else if (E.params.source) {\n                g.resetSelection(), n.showExpanded();\n                var h = g.selectSource(E.params.source, { children: !0 });\n                setTimeout(function() {\n                  x.updateGraph(h);\n                });\n              } else g.resetSelection(), n.showExpanded();\n            }, n.$watch(\n              function() {\n                return g.selection.dirty;\n              },\n              function(l, h) {\n                if (g.isDirty()) {\n                  var i = x.graph.pristine.dag, d = x.graph.pristine.nodes, p = g.selection.clean, f = g.selection.dirty, v = g.selectNodes(i, d, p), k = g.selectNodes(i, d, f), s = A.difference(v.selected, k.selected);\n                  x.markDirty(s);\n                } else x.markAllClean();\n              },\n              !0\n            );\n          }\n        };\n      }\n    ]);\n  },\n  function(L, T) {\n    var e = \"/components/graph/graph-launcher.html\";\n    window.angular.module(\"ng\").run([\n      \"$templateCache\",\n      function(u) {\n        u.put(\n          e,\n          `\n<div class=\"launcher\" data-launcher=\"{{ graphService.orientation }}\" ng-class=\"{on: graphService.expanded}\">\n    <style>\n    .dirty-submit {\n        background-color: #0094b3 !important;\n        color: white !important;\n        transition: .5s linear;\n    }\n\n    #submit-graph-selection:hover {\n        background-color: #0094b3 !important;\n        color: white !important;\n    }\n\n    .dropup select:hover~.field-label,\n    .dropup select:focus~.field-label {\n        color: #919599;\n    }\n\n    .dropup ul:hover~.field-label,\n    .dropup ul:focus~.field-label {\n        color: #919599;\n    }\n\n    .dropdown-menu {\n        width: 100%;\n    }\n\n    .dropdown-menu li {\n        padding: 2px 10px;\n    }\n\n    .dropdown-menu li:hover {\n        background-color: #ededee !important;\n    }\n\n    li .checked {\n        width: 10px;\n        float: right;\n    }\n\n    </style>\n\n    <div class=\"launcher-section\">\n        <div class=\"launcher-btn\">\n            <a\n                class=\"btn btn-info btn-pill btn-lg btn-icon btn-shadow\"\n                data-toggle=\"tooltip\"\n                title=\"View Lineage Graph\"\n                ng-click=\"onLauncherClick()\">\n                <svg class=\"icn icn-md\"><use xlink:href=\"#icn-flow\"></use></svg>\n            </a>\n        </div>\n        <div class=\"launcher-content\" ng-click=\"onWindowClick($event)\">\n            <div class=\"launcher-window\">\n                <div class=\"launcher-header\">\n                    <div class=\"launcher-cell\">\n                        <h6>\n                            Lineage Graph\n                        </h6>\n                    </div>\n                    <div class=\"launcher-actions\">\n                        <a\n                            ng-click=\"showExpanded()\"\n                            ng-show=\"graphService.orientation == 'sidebar'\"\n                            data-large\n                            class=\"btn btn-text btn-lg btn-icon btn-shadow\"\n                            data-toggle=\"tooltip\"\n                            title=\"View Fullscreen\">\n                                <svg class=\"icn icn-md\"><use xlink:href=\"#icn-expand\"></use></svg>\n                        </a>\n                        <a\n                            ng-click=\"showContracted()\"\n                            ng-show=\"graphService.orientation == 'fullscreen' && selectorService.getViewNode()\"\n                            class=\"btn btn-text btn-lg btn-icon btn-shadow\"\n                            data-toggle=\"tooltip\"\n                            title=\"View Fullscreen\">\n                                <svg class=\"icn icn-md\"><use xlink:href=\"#icn-contract\"></use></svg>\n                        </a>\n                    </div>\n                </div>\n                <div class=\"launcher-body\">\n                    <div class=\"launcher-embed\">\n                        <div ng-controller=\"GraphCtrl\" style=\"height: 100%\" id=\"graph-viz-wrapper\">\n                            <div graph-viz\n                                viz-options=\"graph.options\"\n                                viz-elements=\"graph.elements\"\n                                viz-style=\"graph.style\"\n                                viz-layout=\"graph.layout\"\n                                viz-ready=\"graph.ready\"\n                                viz-rendered=\"graphRendered\"\n                                viz-size=\"{size: graphService.orientation, expanded: graphService.expanded}\"></div>\n                        </div>\n                    </div>\n                </div>\n                <div class=\"launcher-footer\">\n                    <div class=\"launcher-cell launcher-flush\">\n                        <div class=\"component bg-navy text-navy-lightest margin\">\n                            <form class=\"fields fields-flush launcher-hide-sidebar\"\n                                  ng-class=\"{visible: filters_visible}\"\n                                  ng-submit=\"onUpdateSelector()\">\n                                <label class=\"field\">\n                                    <div class=\"dropdown dropup\"\n                                         ng-class=\"{'open': isVisible('resource_types')}\"\n                                         data-form-type=\"resource_types\">\n                                        <select\n                                            data-toggle=\"dropdown\"\n                                            class='field-input form-control input-dark'\n                                            ng-click=\"onSelectClick('resource_types')\"\n                                            ng-blur=\"onSelectBlur('resource_types')\">\n                                            <option selected disabled hidden>\n                                                <span>{{ selectionLabel('resource_types') }}</span>\n                                            </option>\n                                        </select>\n                                        <ul\n                                            class=\"dropdown-menu\"\n                                            ng-show=\"isVisible('resource_types')\">\n                                            <li ng-click=\"onSelectAll('resource_types', !allSelected, $event)\">\n                                                <strong class=\"text-dark\">Select All</strong>\n                                                <span ng-show=\"allSelected\">\n                                                    <svg class=\"checked\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M20.285 2l-11.285 11.567-5.286-5.011-3.714 3.716 9 8.728 15-15.285z\"/></svg>\n                                                </span>\n                                            </li>\n                                            <li\n                                                class='text-dark'\n                                                ng-repeat=\"item in selectorService.options.resource_types\"\n                                                ng-click=\"onItemSelect('resource_types', item, $event)\">\n                                                {{ resourceTypeTitle(item) }}\n                                                <span ng-show=\"isSelected('resource_types', item)\">\n                                                    <svg class=\"checked\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M20.285 2l-11.285 11.567-5.286-5.011-3.714 3.716 9 8.728 15-15.285z\"/></svg>\n                                                </span>\n                                            </li>\n                                        </ul>\n                                        <div class=\"field-label\">resources</div>\n                                    </div>\n                                </label>\n                                <label class=\"field\">\n                                    <div class=\"dropdown dropup\"\n                                         ng-class=\"{'open': isVisible('packages')}\"\n                                         data-form-type=\"packages\">\n                                        <select\n                                            data-toggle=\"dropdown\"\n                                            class='field-input form-control input-dark'\n                                            ng-click=\"onSelectClick('packages')\"\n                                            ng-blur=\"onSelectBlur('packages')\">\n                                            <option selected disabled hidden>\n                                                <span>{{ selectionLabel('packages') }}</span>\n                                            </option>\n                                        </select>\n                                        <ul\n                                            class=\"dropdown-menu\"\n                                            ng-show=\"isVisible('packages')\">\n                                            <li ng-click=\"onSelectAll('packages', !allSelected, $event)\">\n                                                <strong class=\"text-dark\">Select All</strong>\n                                                <span ng-show=\"allSelected\">\n                                                    <svg class=\"checked\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M20.285 2l-11.285 11.567-5.286-5.011-3.714 3.716 9 8.728 15-15.285z\"/></svg>\n                                                </span>\n                                            </li>\n                                            <li\n                                                class='text-dark'\n                                                ng-repeat=\"item in selectorService.options.packages\"\n                                                ng-click=\"onItemSelect('packages', item, $event)\">\n                                                {{ item }}\n                                                <span ng-show=\"isSelected('packages', item)\">\n                                                    <svg class=\"checked\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M20.285 2l-11.285 11.567-5.286-5.011-3.714 3.716 9 8.728 15-15.285z\"/></svg>\n                                                </span>\n                                            </li>\n                                        </ul>\n                                        <div class=\"field-label\">packages</div>\n                                    </div>\n                                </label>\n                                <label class=\"field\">\n                                    <div class=\"dropdown dropup\"\n                                         ng-class=\"{'open': isVisible('tags')}\"\n                                         data-form-type=\"tags\">\n                                        <select\n                                            data-toggle=\"dropdown\"\n                                            class='field-input form-control input-dark'\n                                            ng-click=\"onSelectClick('tags')\"\n                                            ng-blur=\"onSelectBlur('tags', $event)\">\n                                            <option selected disabled hidden>\n                                                <span>{{ selectionLabel('tags', 'untagged') }}</span>\n                                            </option>\n                                        </select>\n                                        <ul\n                                            class=\"dropdown-menu\"\n                                            ng-show=\"isVisible('tags')\">\n                                            <li ng-click=\"onSelectAll('tags', !allSelected, $event)\">\n                                                <strong class=\"text-dark\">Select All</strong>\n                                                <span ng-show=\"allSelected\">\n                                                    <svg class=\"checked\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M20.285 2l-11.285 11.567-5.286-5.011-3.714 3.716 9 8.728 15-15.285z\"/></svg>\n                                                </span>\n                                            </li>\n                                            <li\n                                                class='text-dark'\n                                                ng-repeat=\"item in selectorService.options.tags\"\n                                                ng-click=\"onItemSelect('tags', item, $event)\">\n                                                <span ng-if='item == null'>untagged</span>\n                                                <span ng-if='item != null'>{{ item }}</span>\n                                                <span ng-show=\"isSelected('tags', item)\">\n                                                    <svg class=\"checked\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M20.285 2l-11.285 11.567-5.286-5.011-3.714 3.716 9 8.728 15-15.285z\"/></svg>\n                                                </span>\n                                            </li>\n                                        </ul>\n                                        <div class=\"field-label\">tags</div>\n                                    </div>\n                                </label>\n                                <label class=\"field\" style=\"flex: 4 0 160px\">\n                                    <input type=\"text\"\n                                           class=\"field-input form-control input-dark\"\n                                           ng-model=\"selectorService.selection.dirty.include\"\n                                           placeholder=\"...\" />\n                                    <div class=\"field-label\">--select</div>\n                                </label>\n                                <label class=\"field\" style=\"flex: 4 0 160px\">\n                                    <input type=\"text\"\n                                           class=\"field-input form-control input-dark\"\n                                           ng-model=\"selectorService.selection.dirty.exclude\"\n                                           placeholder=\"...\" />\n                                    <div class=\"field-label\">--exclude</div>\n                                </label>\n                                <label class=\"field\" style=\"flex: 0 0 80px\">\n                                    <input type=\"submit\"\n                                           id=\"submit-graph-selection\"\n                                           class=\"field-input form-control input-dark\"\n                                           ng-class=\"{'dirty-submit': selectorService.isDirty()}\"\n                                           value=\"Update Graph\" />\n                                    <div class=\"field-label text-center\" style=\"width: 100%\"></div>\n                                </label>\n                                <label class=\"field\" style=\"flex: 0 0 80px\">\n                                    <button type=\"button\"\n                                        ng-click=\"closeGraph()\"\n                                        class=\"field-input form-control input-dark text-center\"\n                                        ><svg class=\"icn icn-md\"><use xlink:href=\"#icn-close\"></use></svg>\n                                    </button>\n                                </label>\n                            </form>\n                        </div>\n                    </div>\n                    <!--<div class=\"launcher-spacer\"></div>-->\n                    <div class=\"launcher-actions\" ng-show=\"graphService.orientation == 'sidebar'\">\n                        <button type=\"button\"\n                            ng-click=\"closeGraph()\"\n                            class=\"btn btn-text btn-lg btn-icon btn-shadow\"\n                            data-toggle=\"tooltip\"\n                            title=\"Close Graph\"><svg class=\"icn icn-md\"><use xlink:href=\"#icn-close\"></use></svg>\n                        </button>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n`\n        );\n      }\n    ]), L.exports = e;\n  },\n  function(L, T, e) {\n    e(234);\n    const u = e(236), A = e(21), w = e(33), E = e(237);\n    e(244)(E, w);\n    const y = e(245);\n    E.use(y), angular.module(\"dbt\").directive(\"graphViz\", [\n      \"$q\",\n      \"$state\",\n      \"graph\",\n      \"selectorService\",\n      \"project\",\n      \"$timeout\",\n      function(x, g, o, c, a, n) {\n        return {\n          restrict: \"EA\",\n          replace: !0,\n          scope: {\n            vizElements: \"=\",\n            vizLayout: \"=\",\n            vizOptions: \"=\",\n            vizStyle: \"=\",\n            vizReady: \"=\",\n            vizExtensions: \"=\",\n            vizHideOptions: \"=\",\n            vizSize: \"=\",\n            vizRendered: \"=\"\n          },\n          link: function(r, l, h, i) {\n            var d = t;\n            r.$watch(\"vizSize\", function(f, v) {\n              n(function() {\n                p.resize(), f == \"fullscreen\" ? p.fit(100) : p.fit(25);\n              });\n            }), w(\".viz-option\").on(\"changed.bs.select\", function(f) {\n              w(f.target).data(\"option\"), w(f.target).val();\n            });\n            var p = E(\n              A.assign({}, r.vizOptions, {\n                container: document.getElementById(\"cy\"),\n                style: r.vizStyle || [],\n                elements: r.vizElements || [],\n                layout: r.vizLayout || { name: \"circle\" }\n              })\n            );\n            window.graph || (window.graph = p), r.graphReady && w(window).on(\"load\", function() {\n              p.ready(r.graphReady);\n            }), p.on(\"select\", function(f) {\n              var v = f.target;\n              r.$apply(function() {\n                o.selectNode(v.id()), p.forceRender();\n              });\n            }), p.on(\"unselect\", function(f) {\n              f.target, r.$apply(function() {\n                o.deselectNodes(), p.forceRender();\n              });\n            }), r.$watch(\"vizElements\", function(f, v) {\n              p.remove(p.elements()), p.add(f), d(r, p);\n            }), r.$watch(\n              \"vizLayout\",\n              function(f, v) {\n                f !== v && d(r, p);\n              },\n              !0\n            ), r.$watch(\n              \"vizOptions\",\n              function(f, v) {\n                f !== v && A.each(f, function(k, s) {\n                  p[s], p[s](k);\n                });\n              },\n              !0\n            ), r.$watch(\n              \"vizStyle\",\n              function(f, v) {\n                f !== v && p.setStyle(f);\n              },\n              !0\n            ), r.$on(\"$destroy\", function() {\n              p.destroy();\n            }), p.contextMenus({\n              menuItems: [\n                {\n                  id: \"jump\",\n                  content: \"Refocus on Node\",\n                  selector: \"node\",\n                  tooltipText: \"Focus on the lineage for this node\",\n                  onClickFunction: function(f) {\n                    var v = f.target || f.cyTarget, k = v.id();\n                    g.go(\"dbt.\" + v.data(\"resource_type\"), { unique_id: k });\n                  },\n                  show: !0\n                },\n                {\n                  id: \"docs\",\n                  content: \"View documentation\",\n                  selector: \"node\",\n                  tooltipText: \"Jump to the documentation for this node\",\n                  onClickFunction: function(f) {\n                    var v = f.target || f.cyTarget, k = v.id();\n                    g.go(\"dbt.\" + v.data(\"resource_type\"), { unique_id: k }), o.hideGraph();\n                  },\n                  show: !0\n                },\n                {\n                  id: \"hide-before-here\",\n                  content: \"Hide this and parents\",\n                  selector: \"node\",\n                  onClickFunction: function(f) {\n                    var v = (f.target || f.cyTarget).id(), k = a.node(v);\n                    if (k) {\n                      var s = c.excludeNode(k, { parents: !0 });\n                      o.updateGraph(s);\n                    }\n                  },\n                  show: !0\n                },\n                {\n                  id: \"hide-after-here\",\n                  content: \"Hide this and children\",\n                  selector: \"node\",\n                  onClickFunction: function(f) {\n                    var v = (f.target || f.cyTarget).id(), k = a.node(v);\n                    if (k) {\n                      var s = c.excludeNode(k, { children: !0 });\n                      o.updateGraph(s);\n                    }\n                  },\n                  show: !0\n                },\n                {\n                  id: \"export-png\",\n                  content: \"Export PNG\",\n                  selector: \"node\",\n                  coreAsWell: !0,\n                  onClickFunction: function(f) {\n                    var v = p.png({ bg: \"#005e7a\" }), k = document.createElement(\"a\");\n                    k.download = \"dbt-dag.png\", k.href = v, k.click();\n                  },\n                  show: !0\n                }\n              ],\n              menuItemClasses: [\"graph-node-context-menu-item\"],\n              contextMenuClasses: [\"graph-node-context-menu\"]\n            });\n          },\n          templateUrl: u\n        };\n        function t(r, l) {\n          r.vizLayout && r.vizLayout.name && (l.layout(r.vizLayout).run(), r.vizRendered(l));\n        }\n      }\n    ]);\n  },\n  function(L, T, e) {\n    var u = e(235);\n    typeof u == \"string\" && (u = [[L.i, u, \"\"]]);\n    var A = { hmr: !0, transform: void 0, insertInto: void 0 };\n    e(40)(u, A), u.locals && (L.exports = u.locals);\n  },\n  function(L, T, e) {\n    (L.exports = e(39)(!1)).push([\n      L.i,\n      `\n.cy-context-menus-cxt-menu {\n    display:none;\n    z-index:1000;\n    position:absolute;\n    border:1px solid #A0A0A0;\n    padding: 0;\n    margin: 0;\n    width:auto;\n}\n\n.cy-context-menus-cxt-menuitem {\n    display:block;\n    z-index:1000;\n    width: 100%;\n    padding: 3px 20px;\n    position:relative;\n    margin:0;\n    background-color:#f8f8f8;\n    font-weight:normal;\n    font-size: 12px;\n    white-space:nowrap;\n    border: 0;\n    text-align: left;\n}\n\n.cy-context-menus-cxt-menuitem:enabled {\n    color: #000000;\n}\n\n.cy-context-menus-ctx-operation:focus {\n  outline: none;\n}\n\n.cy-context-menus-cxt-menuitem:hover {\n    color: #ffffff;\n    text-decoration: none;\n    background-color: #0B9BCD;\n    background-image: none;\n    cursor: pointer;\n}\n\n.cy-context-menus-cxt-menuitem[content]:before {\n    content:attr(content);\n}\n\n.cy-context-menus-divider {\n  border-bottom:1px solid #A0A0A0;\n}\n\n\nselect:not([multiple]).form-control {\n    background-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE2IDE2Ij48cG9seWxpbmUgcG9pbnRzPSI0LjUgNiA4IDkuNSAxMS41IDYiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwOTRiMyIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiAvPjxyZWN0IHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSIvPjwvc3ZnPg==\");\n    background-size: 1.25em 1.25em;\n}\n`,\n      \"\"\n    ]);\n  },\n  function(L, T) {\n    var e = \"/components/graph/graph-viz.html\";\n    window.angular.module(\"ng\").run([\n      \"$templateCache\",\n      function(u) {\n        u.put(e, `<div id='cy' style=\"width: 100%; height: 100%; \"></div>\n`);\n      }\n    ]), L.exports = e;\n  },\n  function(L, T, e) {\n    (function(u) {\n      var A;\n      A = function(w, E) {\n        return function(y) {\n          var x = {};\n          function g(o) {\n            if (x[o]) return x[o].exports;\n            var c = x[o] = { i: o, l: !1, exports: {} };\n            return y[o].call(c.exports, c, c.exports, g), c.l = !0, c.exports;\n          }\n          return g.m = y, g.c = x, g.d = function(o, c, a) {\n            g.o(o, c) || Object.defineProperty(o, c, {\n              configurable: !1,\n              enumerable: !0,\n              get: a\n            });\n          }, g.n = function(o) {\n            var c = o && o.__esModule ? function() {\n              return o.default;\n            } : function() {\n              return o;\n            };\n            return g.d(c, \"a\", c), c;\n          }, g.o = function(o, c) {\n            return Object.prototype.hasOwnProperty.call(o, c);\n          }, g.p = \"\", g(g.s = 20);\n        }([\n          function(y, x, g) {\n            var o = typeof Symbol == \"function\" && typeof Symbol.iterator == \"symbol\" ? function(p) {\n              return typeof p;\n            } : function(p) {\n              return p && typeof Symbol == \"function\" && p.constructor === Symbol && p !== Symbol.prototype ? \"symbol\" : typeof p;\n            }, c = g(3), a = c ? c.navigator : null, n = c ? c.document : null, t = o(\"\"), r = o({}), l = o(function() {\n            }), h = typeof HTMLElement > \"u\" ? \"undefined\" : o(HTMLElement), i = function(p) {\n              return p && p.instanceString && d.fn(p.instanceString) ? p.instanceString() : null;\n            }, d = {\n              defined: function(p) {\n                return p != null;\n              },\n              string: function(p) {\n                return p != null && (p === void 0 ? \"undefined\" : o(p)) == t;\n              },\n              fn: function(p) {\n                return p != null && (p === void 0 ? \"undefined\" : o(p)) === l;\n              },\n              array: function(p) {\n                return Array.isArray ? Array.isArray(p) : p != null && p instanceof Array;\n              },\n              plainObject: function(p) {\n                return p != null && (p === void 0 ? \"undefined\" : o(p)) === r && !d.array(p) && p.constructor === Object;\n              },\n              object: function(p) {\n                return p != null && (p === void 0 ? \"undefined\" : o(p)) === r;\n              },\n              number: function(p) {\n                return p != null && (p === void 0 ? \"undefined\" : o(p)) === o(1) && !isNaN(p);\n              },\n              integer: function(p) {\n                return d.number(p) && Math.floor(p) === p;\n              },\n              bool: function(p) {\n                return p != null && (p === void 0 ? \"undefined\" : o(p)) === o(!0);\n              },\n              htmlElement: function(p) {\n                return h === \"undefined\" ? void 0 : p != null && p instanceof HTMLElement;\n              },\n              elementOrCollection: function(p) {\n                return d.element(p) || d.collection(p);\n              },\n              element: function(p) {\n                return i(p) === \"collection\" && p._private.single;\n              },\n              collection: function(p) {\n                return i(p) === \"collection\" && !p._private.single;\n              },\n              core: function(p) {\n                return i(p) === \"core\";\n              },\n              style: function(p) {\n                return i(p) === \"style\";\n              },\n              stylesheet: function(p) {\n                return i(p) === \"stylesheet\";\n              },\n              event: function(p) {\n                return i(p) === \"event\";\n              },\n              thread: function(p) {\n                return i(p) === \"thread\";\n              },\n              fabric: function(p) {\n                return i(p) === \"fabric\";\n              },\n              emptyString: function(p) {\n                return p == null || !(p !== \"\" && !p.match(/^\\s+$/));\n              },\n              nonemptyString: function(p) {\n                return !(!p || !d.string(p) || p === \"\" || p.match(/^\\s+$/));\n              },\n              domElement: function(p) {\n                return typeof HTMLElement < \"u\" && p instanceof HTMLElement;\n              },\n              boundingBox: function(p) {\n                return d.plainObject(p) && d.number(p.x1) && d.number(p.x2) && d.number(p.y1) && d.number(p.y2);\n              },\n              promise: function(p) {\n                return d.object(p) && d.fn(p.then);\n              },\n              touch: function() {\n                return c && (\"ontouchstart\" in c || c.DocumentTouch && n instanceof DocumentTouch);\n              },\n              gecko: function() {\n                return c && (typeof InstallTrigger < \"u\" || \"MozAppearance\" in n.documentElement.style);\n              },\n              webkit: function() {\n                return c && (typeof webkitURL < \"u\" || \"WebkitAppearance\" in n.documentElement.style);\n              },\n              chromium: function() {\n                return c && typeof chrome < \"u\";\n              },\n              khtml: function() {\n                return a && a.vendor.match(/kde/i);\n              },\n              khtmlEtc: function() {\n                return d.khtml() || d.webkit() || d.chromium();\n              },\n              ms: function() {\n                return a && a.userAgent.match(/msie|trident|edge/i);\n              },\n              windows: function() {\n                return a && a.appVersion.match(/Win/i);\n              },\n              mac: function() {\n                return a && a.appVersion.match(/Mac/i);\n              },\n              linux: function() {\n                return a && a.appVersion.match(/Linux/i);\n              },\n              unix: function() {\n                return a && a.appVersion.match(/X11/i);\n              }\n            };\n            y.exports = d;\n          },\n          function(y, x, g) {\n            var o = g(0), c = g(2), a = {\n              MAX_INT: Number.MAX_SAFE_INTEGER || 9007199254740991,\n              trueify: function() {\n                return !0;\n              },\n              falsify: function() {\n                return !1;\n              },\n              zeroify: function() {\n                return 0;\n              },\n              noop: function() {\n              },\n              error: function(n) {\n                console.error ? (console.error.apply(console, arguments), console.trace && console.trace()) : (console.log.apply(console, arguments), console.trace && console.trace());\n              },\n              clone: function(n) {\n                return this.extend({}, n);\n              },\n              copy: function(n) {\n                return n == null ? n : o.array(n) ? n.slice() : o.plainObject(n) ? this.clone(n) : n;\n              },\n              copyArray: function(n) {\n                return n.slice();\n              },\n              clonePosition: function(n) {\n                return { x: n.x, y: n.y };\n              },\n              uuid: function(n, t) {\n                for (t = n = \"\"; n++ < 36; t += 51 * n & 52 ? (15 ^ n ? 8 ^ Math.random() * (20 ^ n ? 16 : 4) : 4).toString(16) : \"-\") ;\n                return t;\n              }\n            };\n            a.makeBoundingBox = c.makeBoundingBox.bind(c), a._staticEmptyObject = {}, a.staticEmptyObject = function() {\n              return a._staticEmptyObject;\n            }, a.extend = Object.assign != null ? Object.assign.bind(Object) : function(n) {\n              for (var t = arguments, r = 1; r < t.length; r++) {\n                var l = t[r];\n                if (l != null)\n                  for (var h = Object.keys(l), i = 0; i < h.length; i++) {\n                    var d = h[i];\n                    n[d] = l[d];\n                  }\n              }\n              return n;\n            }, a.assign = a.extend, a.default = function(n, t) {\n              return n === void 0 ? t : n;\n            }, a.removeFromArray = function(n, t, r) {\n              for (var l = n.length; l >= 0 && (n[l] !== t || (n.splice(l, 1), r)); l--) ;\n            }, a.clearArray = function(n) {\n              n.splice(0, n.length);\n            }, a.push = function(n, t) {\n              for (var r = 0; r < t.length; r++) {\n                var l = t[r];\n                n.push(l);\n              }\n            }, a.getPrefixedProperty = function(n, t, r) {\n              return r && (t = this.prependCamel(r, t)), n[t];\n            }, a.setPrefixedProperty = function(n, t, r, l) {\n              r && (t = this.prependCamel(r, t)), n[t] = l;\n            }, [\n              g(21),\n              g(22),\n              { memoize: g(13) },\n              g(23),\n              g(24),\n              g(25),\n              g(27)\n            ].forEach(function(n) {\n              a.extend(a, n);\n            }), y.exports = a;\n          },\n          function(y, x, g) {\n            var o = {\n              arePositionsSame: function(c, a) {\n                return c.x === a.x && c.y === a.y;\n              },\n              copyPosition: function(c) {\n                return { x: c.x, y: c.y };\n              },\n              modelToRenderedPosition: function(c, a, n) {\n                return { x: c.x * a + n.x, y: c.y * a + n.y };\n              },\n              renderedToModelPosition: function(c, a, n) {\n                return { x: (c.x - n.x) / a, y: (c.y - n.y) / a };\n              },\n              array2point: function(c) {\n                return { x: c[0], y: c[1] };\n              },\n              deg2rad: function(c) {\n                return Math.PI * c / 180;\n              },\n              getAngleFromDisp: function(c, a) {\n                return Math.atan2(a, c) - Math.PI / 2;\n              }\n            };\n            o.log2 = Math.log2 || function(c) {\n              return Math.log(c) / Math.log(2);\n            }, o.signum = function(c) {\n              return c > 0 ? 1 : c < 0 ? -1 : 0;\n            }, o.dist = function(c, a) {\n              return Math.sqrt(o.sqdist(c, a));\n            }, o.sqdist = function(c, a) {\n              var n = a.x - c.x, t = a.y - c.y;\n              return n * n + t * t;\n            }, o.qbezierAt = function(c, a, n, t) {\n              return (1 - t) * (1 - t) * c + 2 * (1 - t) * t * a + t * t * n;\n            }, o.qbezierPtAt = function(c, a, n, t) {\n              return {\n                x: o.qbezierAt(c.x, a.x, n.x, t),\n                y: o.qbezierAt(c.y, a.y, n.y, t)\n              };\n            }, o.lineAt = function(c, a, n, t) {\n              var r = a.x - c.x, l = a.y - c.y, h = o.dist(c, a), i = r / h, d = l / h;\n              return n = n ?? 0, t = t ?? n * h, { x: c.x + i * t, y: c.y + d * t };\n            }, o.lineAtDist = function(c, a, n) {\n              return o.lineAt(c, a, void 0, n);\n            }, o.triangleAngle = function(c, a, n) {\n              var t = o.dist(a, n), r = o.dist(c, n), l = o.dist(c, a);\n              return Math.acos((t * t + r * r - l * l) / (2 * t * r));\n            }, o.bound = function(c, a, n) {\n              return Math.max(c, Math.min(n, a));\n            }, o.makeBoundingBox = function(c) {\n              if (c == null)\n                return {\n                  x1: 1 / 0,\n                  y1: 1 / 0,\n                  x2: -1 / 0,\n                  y2: -1 / 0,\n                  w: 0,\n                  h: 0\n                };\n              if (c.x1 != null && c.y1 != null) {\n                if (c.x2 != null && c.y2 != null && c.x2 >= c.x1 && c.y2 >= c.y1)\n                  return {\n                    x1: c.x1,\n                    y1: c.y1,\n                    x2: c.x2,\n                    y2: c.y2,\n                    w: c.x2 - c.x1,\n                    h: c.y2 - c.y1\n                  };\n                if (c.w != null && c.h != null && c.w >= 0 && c.h >= 0)\n                  return {\n                    x1: c.x1,\n                    y1: c.y1,\n                    x2: c.x1 + c.w,\n                    y2: c.y1 + c.h,\n                    w: c.w,\n                    h: c.h\n                  };\n              }\n            }, o.updateBoundingBox = function(c, a) {\n              c.x1 = Math.min(c.x1, a.x1), c.x2 = Math.max(c.x2, a.x2), c.w = c.x2 - c.x1, c.y1 = Math.min(c.y1, a.y1), c.y2 = Math.max(c.y2, a.y2), c.h = c.y2 - c.y1;\n            }, o.expandBoundingBoxByPoint = function(c, a, n) {\n              c.x1 = Math.min(c.x1, a), c.x2 = Math.max(c.x2, a), c.w = c.x2 - c.x1, c.y1 = Math.min(c.y1, n), c.y2 = Math.max(c.y2, n), c.h = c.y2 - c.y1;\n            }, o.expandBoundingBox = function(c, a) {\n              return c.x1 -= a, c.x2 += a, c.y1 -= a, c.y2 += a, c.w = c.x2 - c.x1, c.h = c.y2 - c.y1, c;\n            }, o.boundingBoxesIntersect = function(c, a) {\n              return !(c.x1 > a.x2 || a.x1 > c.x2 || c.x2 < a.x1 || a.x2 < c.x1 || c.y2 < a.y1 || a.y2 < c.y1 || c.y1 > a.y2 || a.y1 > c.y2);\n            }, o.inBoundingBox = function(c, a, n) {\n              return c.x1 <= a && a <= c.x2 && c.y1 <= n && n <= c.y2;\n            }, o.pointInBoundingBox = function(c, a) {\n              return this.inBoundingBox(c, a.x, a.y);\n            }, o.boundingBoxInBoundingBox = function(c, a) {\n              return o.inBoundingBox(c, a.x1, a.y1) && o.inBoundingBox(c, a.x2, a.y2);\n            }, o.roundRectangleIntersectLine = function(c, a, n, t, r, l, h) {\n              var i = this.getRoundRectangleRadius(r, l), d = r / 2, p = l / 2, f = void 0, v = n - d + i - h, k = t - p - h, s = n + d - i + h, S = k;\n              if ((f = this.finiteLinesIntersect(c, a, n, t, v, k, s, S, !1)).length > 0)\n                return f;\n              var j = n + d + h, I = t - p + i - h, R = j, M = t + p - i + h;\n              if ((f = this.finiteLinesIntersect(c, a, n, t, j, I, R, M, !1)).length > 0)\n                return f;\n              var z = n - d + i - h, V = t + p + h, G = n + d - i + h, Y = V;\n              if ((f = this.finiteLinesIntersect(c, a, n, t, z, V, G, Y, !1)).length > 0)\n                return f;\n              var tt = n - d - h, Z = t - p + i - h, at = tt, nt = t + p - i + h;\n              if ((f = this.finiteLinesIntersect(c, a, n, t, tt, Z, at, nt, !1)).length > 0)\n                return f;\n              var ht = void 0, ct = n - d + i, ot = t - p + i;\n              if ((ht = this.intersectLineCircle(c, a, n, t, ct, ot, i + h)).length > 0 && ht[0] <= ct && ht[1] <= ot)\n                return [ht[0], ht[1]];\n              var gt = n + d - i, xt = t - p + i;\n              if ((ht = this.intersectLineCircle(c, a, n, t, gt, xt, i + h)).length > 0 && ht[0] >= gt && ht[1] <= xt)\n                return [ht[0], ht[1]];\n              var St = n + d - i, zt = t + p - i;\n              if ((ht = this.intersectLineCircle(c, a, n, t, St, zt, i + h)).length > 0 && ht[0] >= St && ht[1] >= zt)\n                return [ht[0], ht[1]];\n              var Nt = n - d + i, re = t + p - i;\n              return (ht = this.intersectLineCircle(c, a, n, t, Nt, re, i + h)).length > 0 && ht[0] <= Nt && ht[1] >= re ? [ht[0], ht[1]] : [];\n            }, o.inLineVicinity = function(c, a, n, t, r, l, h) {\n              var i = h, d = Math.min(n, r), p = Math.max(n, r), f = Math.min(t, l), v = Math.max(t, l);\n              return d - i <= c && c <= p + i && f - i <= a && a <= v + i;\n            }, o.inBezierVicinity = function(c, a, n, t, r, l, h, i, d) {\n              var p = Math.min(n, h, r) - d, f = Math.max(n, h, r) + d, v = Math.min(t, i, l) - d, k = Math.max(t, i, l) + d;\n              return !(c < p || c > f || a < v || a > k);\n            }, o.solveQuadratic = function(c, a, n, t) {\n              var r = a * a - 4 * c * (n -= t);\n              if (r < 0) return [];\n              var l = Math.sqrt(r), h = 2 * c;\n              return [(-a + l) / h, (-a - l) / h];\n            }, o.solveCubic = function(c, a, n, t, r) {\n              var l, h = void 0, i = void 0, d = void 0, p = void 0, f = void 0, v = void 0, k = void 0;\n              return i = -27 * (t /= c) + (a /= c) * (9 * (n /= c) - a * a * 2), l = (h = (3 * n - a * a) / 9) * h * h + (i /= 54) * i, r[1] = 0, v = a / 3, l > 0 ? (p = (p = i + Math.sqrt(l)) < 0 ? -Math.pow(-p, 1 / 3) : Math.pow(p, 1 / 3), f = (f = i - Math.sqrt(l)) < 0 ? -Math.pow(-f, 1 / 3) : Math.pow(f, 1 / 3), r[0] = -v + p + f, v += (p + f) / 2, r[4] = r[2] = -v, v = Math.sqrt(3) * (-f + p) / 2, r[3] = v, void (r[5] = -v)) : (r[5] = r[3] = 0, l === 0 ? (k = i < 0 ? -Math.pow(-i, 1 / 3) : Math.pow(i, 1 / 3), r[0] = 2 * k - v, void (r[4] = r[2] = -(k + v))) : (d = (h = -h) * h * h, d = Math.acos(i / Math.sqrt(d)), k = 2 * Math.sqrt(h), r[0] = -v + k * Math.cos(d / 3), r[2] = -v + k * Math.cos((d + 2 * Math.PI) / 3), void (r[4] = -v + k * Math.cos((d + 4 * Math.PI) / 3))));\n            }, o.sqdistToQuadraticBezier = function(c, a, n, t, r, l, h, i) {\n              var d = 1 * n * n - 4 * n * r + 2 * n * h + 4 * r * r - 4 * r * h + h * h + t * t - 4 * t * l + 2 * t * i + 4 * l * l - 4 * l * i + i * i, p = 9 * n * r - 3 * n * n - 3 * n * h - 6 * r * r + 3 * r * h + 9 * t * l - 3 * t * t - 3 * t * i - 6 * l * l + 3 * l * i, f = 3 * n * n - 6 * n * r + n * h - n * c + 2 * r * r + 2 * r * c - h * c + 3 * t * t - 6 * t * l + t * i - t * a + 2 * l * l + 2 * l * a - i * a, v = 1 * n * r - n * n + n * c - r * c + t * l - t * t + t * a - l * a, k = [];\n              this.solveCubic(d, p, f, v, k);\n              for (var s = [], S = 0; S < 6; S += 2)\n                Math.abs(k[S + 1]) < 1e-7 && k[S] >= 0 && k[S] <= 1 && s.push(k[S]);\n              s.push(1), s.push(0);\n              for (var j = -1, I = void 0, R = void 0, M = void 0, z = 0; z < s.length; z++)\n                I = Math.pow(1 - s[z], 2) * n + 2 * (1 - s[z]) * s[z] * r + s[z] * s[z] * h, R = Math.pow(1 - s[z], 2) * t + 2 * (1 - s[z]) * s[z] * l + s[z] * s[z] * i, M = Math.pow(I - c, 2) + Math.pow(R - a, 2), j >= 0 ? M < j && (j = M) : j = M;\n              return j;\n            }, o.sqdistToFiniteLine = function(c, a, n, t, r, l) {\n              var h = [c - n, a - t], i = [r - n, l - t], d = i[0] * i[0] + i[1] * i[1], p = h[0] * h[0] + h[1] * h[1], f = h[0] * i[0] + h[1] * i[1], v = f * f / d;\n              return f < 0 ? p : v > d ? (c - r) * (c - r) + (a - l) * (a - l) : p - v;\n            }, o.pointInsidePolygonPoints = function(c, a, n) {\n              for (var t = void 0, r = void 0, l = void 0, h = void 0, i = 0, d = 0; d < n.length / 2; d++)\n                if (t = n[2 * d], r = n[2 * d + 1], d + 1 < n.length / 2 ? (l = n[2 * (d + 1)], h = n[2 * (d + 1) + 1]) : (l = n[2 * (d + 1 - n.length / 2)], h = n[2 * (d + 1 - n.length / 2) + 1]), !(t == c && l == c)) {\n                  if (!(t >= c && c >= l || t <= c && c <= l)) continue;\n                  (c - t) / (l - t) * (h - r) + r > a && i++;\n                }\n              return i % 2 != 0;\n            }, o.pointInsidePolygon = function(c, a, n, t, r, l, h, i, d) {\n              var p = new Array(n.length), f = void 0;\n              i[0] != null ? (f = Math.atan(i[1] / i[0]), i[0] < 0 ? f += Math.PI / 2 : f = -f - Math.PI / 2) : f = i;\n              for (var v = Math.cos(-f), k = Math.sin(-f), s = 0; s < p.length / 2; s++)\n                p[2 * s] = l / 2 * (n[2 * s] * v - n[2 * s + 1] * k), p[2 * s + 1] = h / 2 * (n[2 * s + 1] * v + n[2 * s] * k), p[2 * s] += t, p[2 * s + 1] += r;\n              var S = void 0;\n              if (d > 0) {\n                var j = this.expandPolygon(p, -d);\n                S = this.joinLines(j);\n              } else S = p;\n              return o.pointInsidePolygonPoints(c, a, S);\n            }, o.joinLines = function(c) {\n              for (var a = new Array(c.length / 2), n = void 0, t = void 0, r = void 0, l = void 0, h = void 0, i = void 0, d = void 0, p = void 0, f = 0; f < c.length / 4; f++) {\n                n = c[4 * f], t = c[4 * f + 1], r = c[4 * f + 2], l = c[4 * f + 3], f < c.length / 4 - 1 ? (h = c[4 * (f + 1)], i = c[4 * (f + 1) + 1], d = c[4 * (f + 1) + 2], p = c[4 * (f + 1) + 3]) : (h = c[0], i = c[1], d = c[2], p = c[3]);\n                var v = this.finiteLinesIntersect(\n                  n,\n                  t,\n                  r,\n                  l,\n                  h,\n                  i,\n                  d,\n                  p,\n                  !0\n                );\n                a[2 * f] = v[0], a[2 * f + 1] = v[1];\n              }\n              return a;\n            }, o.expandPolygon = function(c, a) {\n              for (var n = new Array(2 * c.length), t = void 0, r = void 0, l = void 0, h = void 0, i = 0; i < c.length / 2; i++) {\n                t = c[2 * i], r = c[2 * i + 1], i < c.length / 2 - 1 ? (l = c[2 * (i + 1)], h = c[2 * (i + 1) + 1]) : (l = c[0], h = c[1]);\n                var d = h - r, p = -(l - t), f = Math.sqrt(d * d + p * p), v = d / f, k = p / f;\n                n[4 * i] = t + v * a, n[4 * i + 1] = r + k * a, n[4 * i + 2] = l + v * a, n[4 * i + 3] = h + k * a;\n              }\n              return n;\n            }, o.intersectLineEllipse = function(c, a, n, t, r, l) {\n              var h = n - c, i = t - a;\n              h /= r, i /= l;\n              var d = Math.sqrt(h * h + i * i), p = d - 1;\n              if (p < 0) return [];\n              var f = p / d;\n              return [(n - c) * f + c, (t - a) * f + a];\n            }, o.checkInEllipse = function(c, a, n, t, r, l, h) {\n              return c -= r, a -= l, (c /= n / 2 + h) * c + (a /= t / 2 + h) * a <= 1;\n            }, o.intersectLineCircle = function(c, a, n, t, r, l, h) {\n              var i = [n - c, t - a], d = [c - r, a - l], p = i[0] * i[0] + i[1] * i[1], f = 2 * (d[0] * i[0] + d[1] * i[1]), v = f * f - 4 * p * (d[0] * d[0] + d[1] * d[1] - h * h);\n              if (v < 0) return [];\n              var k = (-f + Math.sqrt(v)) / (2 * p), s = (-f - Math.sqrt(v)) / (2 * p), S = Math.min(k, s), j = Math.max(k, s), I = [];\n              if (S >= 0 && S <= 1 && I.push(S), j >= 0 && j <= 1 && I.push(j), I.length === 0)\n                return [];\n              var R = I[0] * i[0] + c, M = I[0] * i[1] + a;\n              return I.length > 1 ? I[0] == I[1] ? [R, M] : [R, M, I[1] * i[0] + c, I[1] * i[1] + a] : [R, M];\n            }, o.findCircleNearPoint = function(c, a, n, t, r) {\n              var l = t - c, h = r - a, i = Math.sqrt(l * l + h * h);\n              return [c + l / i * n, a + h / i * n];\n            }, o.findMaxSqDistanceToOrigin = function(c) {\n              for (var a = 1e-6, n = void 0, t = 0; t < c.length / 2; t++)\n                (n = c[2 * t] * c[2 * t] + c[2 * t + 1] * c[2 * t + 1]) > a && (a = n);\n              return a;\n            }, o.midOfThree = function(c, a, n) {\n              return a <= c && c <= n || n <= c && c <= a ? c : c <= a && a <= n || n <= a && a <= c ? a : n;\n            }, o.finiteLinesIntersect = function(c, a, n, t, r, l, h, i, d) {\n              var p = c - r, f = n - c, v = h - r, k = a - l, s = t - a, S = i - l, j = v * k - S * p, I = f * k - s * p, R = S * f - v * s;\n              if (R !== 0) {\n                var M = j / R, z = I / R;\n                return -1e-3 <= M && M <= 1.001 && -1e-3 <= z && z <= 1.001 || d ? [c + M * f, a + M * s] : [];\n              }\n              return j === 0 || I === 0 ? this.midOfThree(c, n, h) === h ? [h, i] : this.midOfThree(c, n, r) === r ? [r, l] : this.midOfThree(r, h, n) === n ? [n, t] : [] : [];\n            }, o.polygonIntersectLine = function(c, a, n, t, r, l, h, i) {\n              var d = [], p = void 0, f = new Array(n.length), v = !0;\n              arguments.length === 5 && (v = !1);\n              var k = void 0;\n              if (v) {\n                for (var s = 0; s < f.length / 2; s++)\n                  f[2 * s] = n[2 * s] * l + t, f[2 * s + 1] = n[2 * s + 1] * h + r;\n                if (i > 0) {\n                  var S = o.expandPolygon(f, -i);\n                  k = o.joinLines(S);\n                } else k = f;\n              } else k = n;\n              for (var j = void 0, I = void 0, R = void 0, M = void 0, z = 0; z < k.length / 2; z++)\n                j = k[2 * z], I = k[2 * z + 1], z < k.length / 2 - 1 ? (R = k[2 * (z + 1)], M = k[2 * (z + 1) + 1]) : (R = k[0], M = k[1]), (p = this.finiteLinesIntersect(c, a, t, r, j, I, R, M)).length !== 0 && d.push(p[0], p[1]);\n              return d;\n            }, o.shortenIntersection = function(c, a, n) {\n              var t = [c[0] - a[0], c[1] - a[1]], r = Math.sqrt(t[0] * t[0] + t[1] * t[1]), l = (r - n) / r;\n              return l < 0 && (l = 1e-5), [a[0] + l * t[0], a[1] + l * t[1]];\n            }, o.generateUnitNgonPointsFitToSquare = function(c, a) {\n              var n = o.generateUnitNgonPoints(c, a);\n              return n = o.fitPolygonToSquare(n);\n            }, o.fitPolygonToSquare = function(c) {\n              for (var a = void 0, n = void 0, t = c.length / 2, r = 1 / 0, l = 1 / 0, h = -1 / 0, i = -1 / 0, d = 0; d < t; d++)\n                a = c[2 * d], n = c[2 * d + 1], r = Math.min(r, a), h = Math.max(h, a), l = Math.min(l, n), i = Math.max(i, n);\n              for (var p = 2 / (h - r), f = 2 / (i - l), v = 0; v < t; v++)\n                a = c[2 * v] = c[2 * v] * p, n = c[2 * v + 1] = c[2 * v + 1] * f, r = Math.min(r, a), h = Math.max(h, a), l = Math.min(l, n), i = Math.max(i, n);\n              if (l < -1)\n                for (var k = 0; k < t; k++)\n                  n = c[2 * k + 1] = c[2 * k + 1] + (-1 - l);\n              return c;\n            }, o.generateUnitNgonPoints = function(c, a) {\n              var n = 1 / c * 2 * Math.PI, t = c % 2 == 0 ? Math.PI / 2 + n / 2 : Math.PI / 2;\n              t += a;\n              for (var r = new Array(2 * c), l = void 0, h = 0; h < c; h++)\n                l = h * n + t, r[2 * h] = Math.cos(l), r[2 * h + 1] = Math.sin(-l);\n              return r;\n            }, o.getRoundRectangleRadius = function(c, a) {\n              return Math.min(c / 4, a / 4, 8);\n            }, o.getCutRectangleCornerLength = function() {\n              return 8;\n            }, o.bezierPtsToQuadCoeff = function(c, a, n) {\n              return [c - 2 * a + n, 2 * (a - c), c];\n            }, o.getBarrelCurveConstants = function(c, a) {\n              return {\n                heightOffset: Math.min(15, 0.05 * a),\n                widthOffset: Math.min(100, 0.25 * c),\n                ctrlPtOffsetPct: 0.05\n              };\n            }, y.exports = o;\n          },\n          function(y, x, g) {\n            y.exports = typeof window > \"u\" ? null : window;\n          },\n          function(y, x, g) {\n            var o = g(1), c = {};\n            [g(43), g(45), g(46)].forEach(function(a) {\n              o.assign(c, a);\n            }), y.exports = c;\n          },\n          function(y, x, g) {\n            var o = typeof Symbol == \"function\" && typeof Symbol.iterator == \"symbol\" ? function(h) {\n              return typeof h;\n            } : function(h) {\n              return h && typeof Symbol == \"function\" && h.constructor === Symbol && h !== Symbol.prototype ? \"symbol\" : typeof h;\n            }, c = function h(i) {\n              if (!(this instanceof h)) return new h(i);\n              this.id = \"Thenable/1.0.7\", this.state = 0, this.fulfillValue = void 0, this.rejectReason = void 0, this.onFulfilled = [], this.onRejected = [], this.proxy = { then: this.then.bind(this) }, typeof i == \"function\" && i.call(\n                this,\n                this.fulfill.bind(this),\n                this.reject.bind(this)\n              );\n            };\n            /*!\n            Embeddable Minimum Strictly-Compliant Promises/A+ 1.1.1 Thenable\n            Copyright (c) 2013-2014 Ralf S. Engelschall (http://engelschall.com)\n            Licensed under The MIT License (http://opensource.org/licenses/MIT)\n            */\n            c.prototype = {\n              fulfill: function(h) {\n                return a(this, 1, \"fulfillValue\", h);\n              },\n              reject: function(h) {\n                return a(this, 2, \"rejectReason\", h);\n              },\n              then: function(h, i) {\n                var d = new c();\n                return this.onFulfilled.push(r(h, d, \"fulfill\")), this.onRejected.push(r(i, d, \"reject\")), n(this), d.proxy;\n              }\n            };\n            var a = function(h, i, d, p) {\n              return h.state === 0 && (h.state = i, h[d] = p, n(h)), h;\n            }, n = function(h) {\n              h.state === 1 ? t(h, \"onFulfilled\", h.fulfillValue) : h.state === 2 && t(h, \"onRejected\", h.rejectReason);\n            }, t = function(h, i, d) {\n              if (h[i].length !== 0) {\n                var p = h[i];\n                h[i] = [];\n                var f = function() {\n                  for (var v = 0; v < p.length; v++) p[v](d);\n                };\n                typeof u == \"function\" ? u(f) : setTimeout(f, 0);\n              }\n            }, r = function(h, i, d) {\n              return function(p) {\n                if (typeof h != \"function\") i[d].call(i, p);\n                else {\n                  var f;\n                  try {\n                    f = h(p);\n                  } catch (v) {\n                    return void i.reject(v);\n                  }\n                  l(i, f);\n                }\n              };\n            }, l = function h(i, d) {\n              if (i !== d && i.proxy !== d) {\n                var p;\n                if ((d === void 0 ? \"undefined\" : o(d)) === \"object\" && d !== null || typeof d == \"function\")\n                  try {\n                    p = d.then;\n                  } catch (v) {\n                    return void i.reject(v);\n                  }\n                if (typeof p != \"function\") i.fulfill(d);\n                else {\n                  var f = !1;\n                  try {\n                    p.call(\n                      d,\n                      function(v) {\n                        f || (f = !0, v === d ? i.reject(\n                          new TypeError(\"circular thenable chain\")\n                        ) : h(i, v));\n                      },\n                      function(v) {\n                        f || (f = !0, i.reject(v));\n                      }\n                    );\n                  } catch (v) {\n                    f || i.reject(v);\n                  }\n                }\n              } else\n                i.reject(\n                  new TypeError(\"cannot resolve promise with itself\")\n                );\n            };\n            c.all = function(h) {\n              return new c(function(i, d) {\n                for (var p = new Array(h.length), f = 0, v = function(s, S) {\n                  p[s] = S, ++f === h.length && i(p);\n                }, k = 0; k < h.length; k++)\n                  (function(s) {\n                    var S = h[s];\n                    S != null && S.then != null ? S.then(\n                      function(j) {\n                        v(s, j);\n                      },\n                      function(j) {\n                        d(j);\n                      }\n                    ) : v(s, S);\n                  })(k);\n              });\n            }, c.resolve = function(h) {\n              return new c(function(i, d) {\n                i(h);\n              });\n            }, c.reject = function(h) {\n              return new c(function(i, d) {\n                d(h);\n              });\n            }, y.exports = typeof Promise < \"u\" ? Promise : c;\n          },\n          function(y, x, g) {\n            var o = g(0), c = g(1), a = g(10), n = function(r) {\n              if (this._private = { selectorText: r, invalid: !0 }, r == null || o.string(r) && r.match(/^\\s*$/))\n                this.length = 0;\n              else if (r === \"*\" || r === \"edge\" || r === \"node\")\n                this[0] = a(), this[0].group = r === \"*\" ? r : r + \"s\", this[0].groupOnly = !0, this[0].length = 1, this._private.invalid = !1, this.length = 1;\n              else if (o.elementOrCollection(r)) {\n                var l = r.collection();\n                this[0] = a(), this[0].collection = l, this[0].length = 1, this.length = 1;\n              } else if (o.fn(r))\n                this[0] = a(), this[0].filter = r, this[0].length = 1, this.length = 1;\n              else {\n                if (!o.string(r))\n                  return void c.error(\n                    \"A selector must be created from a string; found \",\n                    r\n                  );\n                if (!this.parse(r)) return;\n              }\n              this._private.invalid = !1;\n            }, t = n.prototype;\n            t.valid = function() {\n              return !this._private.invalid;\n            }, t.invalid = function() {\n              return this._private.invalid;\n            }, t.text = function() {\n              return this._private.selectorText;\n            }, t.size = function() {\n              return this.length;\n            }, t.eq = function(r) {\n              return this[r];\n            }, t.sameText = function(r) {\n              return this.text() === r.text();\n            }, t.toString = t.selector = function() {\n              if (this._private.toStringCache != null)\n                return this._private.toStringCache;\n              var r = void 0, l = \"\", h = function(f) {\n                return f ?? \"\";\n              }, i = function(f) {\n                return o.string(f) ? '\"' + f + '\"' : h(f);\n              }, d = function(f) {\n                return \" \" + f + \" \";\n              }, p = function f(v) {\n                var k = \"\", s = void 0;\n                v.subject === v && (k += \"$\");\n                var S = h(v.group);\n                for (k += S.substring(0, S.length - 1), s = 0; s < v.data.length; s++) {\n                  var j = v.data[s];\n                  j.value ? k += \"[\" + j.field + d(h(j.operator)) + i(j.value) + \"]\" : k += \"[\" + h(j.operator) + j.field + \"]\";\n                }\n                for (s = 0; s < v.meta.length; s++) {\n                  var I = v.meta[s];\n                  k += \"[[\" + I.field + d(h(I.operator)) + i(I.value) + \"]]\";\n                }\n                for (s = 0; s < v.colonSelectors.length; s++)\n                  k += v.colonSelectors[r];\n                for (s = 0; s < v.ids.length; s++) k += \"#\" + v.ids[r];\n                for (s = 0; s < v.classes.length; s++)\n                  k += \".\" + v.classes[s];\n                if (v.source != null && v.target != null && (k = f(v.source) + \" -> \" + f(v.target)), v.connectedNodes != null) {\n                  var R = v.connectedNodes;\n                  k = f(R[0]) + \" <-> \" + f(R[1]);\n                }\n                return v.parent != null && (k = f(v.parent) + \" > \" + k), v.ancestor != null && (k = f(v.ancestor) + \" \" + k), v.child != null && (k += \" > \" + f(v.child)), v.descendant != null && (k += \" \" + f(v.descendant)), k;\n              };\n              for (r = 0; r < this.length; r++)\n                l += p(this[r]), this.length > 1 && r < this.length - 1 && (l += \", \");\n              return this._private.toStringCache = l, l;\n            }, [g(49), g(52)].forEach(function(r) {\n              return c.assign(t, r);\n            }), y.exports = n;\n          },\n          function(y, x, g) {\n            var o = g(1), c = g(0), a = g(28), n = g(8), t = g(14), r = function(i, d, p) {\n              for (var f = o.uuid(); i.hasElementWithId(f); )\n                f = o.uuid();\n              return f;\n            }, l = function(i, d, p) {\n              if (i !== void 0 && c.core(i)) {\n                var f = new a(), v = !1;\n                if (d) {\n                  if (d.length > 0 && c.plainObject(d[0]) && !c.element(d[0])) {\n                    v = !0;\n                    for (var k = [], s = new n(), S = 0, j = d.length; S < j; S++) {\n                      var I = d[S];\n                      I.data == null && (I.data = {});\n                      var R = I.data;\n                      if (R.id == null) R.id = r(i);\n                      else if (i.hasElementWithId(R.id) || s.has(R.id))\n                        continue;\n                      var M = new t(i, I, !1);\n                      k.push(M), s.add(R.id);\n                    }\n                    d = k;\n                  }\n                } else d = [];\n                this.length = 0;\n                for (var z = 0, V = d.length; z < V; z++) {\n                  var G = d[z];\n                  if (G != null) {\n                    var Y = G._private.data.id;\n                    (p == null || p.unique && !f.has(Y)) && (f.set(Y, { index: this.length, ele: G }), this[this.length] = G, this.length++);\n                  }\n                }\n                this._private = { cy: i, map: f }, v && this.restore();\n              } else\n                o.error(\"A collection must have a reference to the core\");\n            }, h = t.prototype = l.prototype;\n            h.instanceString = function() {\n              return \"collection\";\n            }, h.spawn = function(i, d, p) {\n              return c.core(i) || (p = d, d = i, i = this.cy()), new l(i, d, p);\n            }, h.spawnSelf = function() {\n              return this.spawn(this);\n            }, h.cy = function() {\n              return this._private.cy;\n            }, h.renderer = function() {\n              return this._private.cy.renderer();\n            }, h.element = function() {\n              return this[0];\n            }, h.collection = function() {\n              return c.collection(this) ? this : new l(this._private.cy, [this]);\n            }, h.unique = function() {\n              return new l(this._private.cy, this, { unique: !0 });\n            }, h.hasElementWithId = function(i) {\n              return this._private.map.has(i);\n            }, h.getElementById = function(i) {\n              var d = this._private.cy, p = this._private.map.get(i);\n              return p ? p.ele : new l(d);\n            }, h.$id = h.getElementById, h.poolIndex = function() {\n              var i = this._private.cy._private.elements, d = this._private.data.id;\n              return i._private.map.get(d).index;\n            }, h.json = function(i) {\n              var d = this.element(), p = this.cy();\n              if (d == null && i) return this;\n              if (d != null) {\n                var f = d._private;\n                if (c.plainObject(i)) {\n                  p.startBatch(), i.data && d.data(i.data), i.position && d.position(i.position);\n                  var v = function(S, j, I) {\n                    var R = i[S];\n                    R != null && R !== f[S] && (R ? d[j]() : d[I]());\n                  };\n                  return v(\"removed\", \"remove\", \"restore\"), v(\"selected\", \"select\", \"unselect\"), v(\"selectable\", \"selectify\", \"unselectify\"), v(\"locked\", \"lock\", \"unlock\"), v(\"grabbable\", \"grabify\", \"ungrabify\"), i.classes != null && d.classes(i.classes), p.endBatch(), this;\n                }\n                if (i === void 0) {\n                  var k = {\n                    data: o.copy(f.data),\n                    position: o.copy(f.position),\n                    group: f.group,\n                    removed: f.removed,\n                    selected: f.selected,\n                    selectable: f.selectable,\n                    locked: f.locked,\n                    grabbable: f.grabbable,\n                    classes: null\n                  };\n                  k.classes = \"\";\n                  var s = 0;\n                  return f.classes.forEach(function(S) {\n                    return k.classes += s++ == 0 ? S : \" \" + S;\n                  }), k;\n                }\n              }\n            }, h.jsons = function() {\n              for (var i = [], d = 0; d < this.length; d++) {\n                var p = this[d].json();\n                i.push(p);\n              }\n              return i;\n            }, h.clone = function() {\n              for (var i = this.cy(), d = [], p = 0; p < this.length; p++) {\n                var f = this[p].json(), v = new t(i, f, !1);\n                d.push(v);\n              }\n              return new l(i, d);\n            }, h.copy = h.clone, h.restore = function(i) {\n              var d = this.cy(), p = d._private;\n              i === void 0 && (i = !0);\n              for (var f = [], v = [], k = void 0, s = 0, S = this.length; s < S; s++) {\n                var j = this[s];\n                j.removed() && (j.isNode() ? f.push(j) : v.push(j));\n              }\n              k = f.concat(v);\n              var I = void 0, R = function() {\n                k.splice(I, 1), I--;\n              };\n              for (I = 0; I < k.length; I++) {\n                var M = k[I], z = M._private, V = z.data;\n                if (M.clearTraversalCache(), V.id === void 0)\n                  V.id = r(d);\n                else if (c.number(V.id)) V.id = \"\" + V.id;\n                else {\n                  if (c.emptyString(V.id) || !c.string(V.id)) {\n                    o.error(\n                      \"Can not create element with invalid string ID `\" + V.id + \"`\"\n                    ), R();\n                    continue;\n                  }\n                  if (d.hasElementWithId(V.id)) {\n                    o.error(\n                      \"Can not create second element with ID `\" + V.id + \"`\"\n                    ), R();\n                    continue;\n                  }\n                }\n                var G = V.id;\n                if (M.isNode()) {\n                  var Y = z.position;\n                  Y.x == null && (Y.x = 0), Y.y == null && (Y.y = 0);\n                }\n                if (M.isEdge()) {\n                  for (var tt = M, Z = [\"source\", \"target\"], at = Z.length, nt = !1, ht = 0; ht < at; ht++) {\n                    var ct = Z[ht], ot = V[ct];\n                    c.number(ot) && (ot = V[ct] = \"\" + V[ct]), ot == null || ot === \"\" ? (o.error(\n                      \"Can not create edge `\" + G + \"` with unspecified \" + ct\n                    ), nt = !0) : d.hasElementWithId(ot) || (o.error(\n                      \"Can not create edge `\" + G + \"` with nonexistant \" + ct + \" `\" + ot + \"`\"\n                    ), nt = !0);\n                  }\n                  if (nt) {\n                    R();\n                    continue;\n                  }\n                  var gt = d.getElementById(V.source), xt = d.getElementById(V.target);\n                  gt._private.edges.push(tt), xt._private.edges.push(tt), tt._private.source = gt, tt._private.target = xt;\n                }\n                z.map = new a(), z.map.set(G, { ele: M, index: 0 }), z.removed = !1, d.addToPool(M);\n              }\n              for (var St = 0; St < f.length; St++) {\n                var zt = f[St], Nt = zt._private.data;\n                c.number(Nt.parent) && (Nt.parent = \"\" + Nt.parent);\n                var re = Nt.parent;\n                if (re != null) {\n                  var be = d.getElementById(re);\n                  if (be.empty()) Nt.parent = void 0;\n                  else {\n                    for (var ne = !1, ce = be; !ce.empty(); ) {\n                      if (zt.same(ce)) {\n                        ne = !0, Nt.parent = void 0;\n                        break;\n                      }\n                      ce = ce.parent();\n                    }\n                    ne || (be[0]._private.children.push(zt), zt._private.parent = be[0], p.hasCompoundNodes = !0);\n                  }\n                }\n              }\n              if (k.length > 0) {\n                for (var xe = new l(d, k), we = 0; we < xe.length; we++) {\n                  var ae = xe[we];\n                  ae.isNode() || (ae.parallelEdges().clearTraversalCache(), ae.source().clearTraversalCache(), ae.target().clearTraversalCache());\n                }\n                (p.hasCompoundNodes ? d.collection().merge(xe).merge(xe.connectedNodes()).merge(xe.parent()) : xe).dirtyCompoundBoundsCache().updateStyle(i), i ? xe.emitAndNotify(\"add\") : xe.emit(\"add\");\n              }\n              return this;\n            }, h.removed = function() {\n              var i = this[0];\n              return i && i._private.removed;\n            }, h.inside = function() {\n              var i = this[0];\n              return i && !i._private.removed;\n            }, h.remove = function(i) {\n              var d = [], p = [], f = {}, v = this._private.cy;\n              function k(ct) {\n                var ot = f[ct.id()];\n                ct.removed() || ot || (f[ct.id()] = !0, ct.isNode() ? (p.push(ct), function(gt) {\n                  for (var xt = gt._private.edges, St = 0; St < xt.length; St++)\n                    k(xt[St]);\n                }(ct), function(gt) {\n                  for (var xt = gt._private.children, St = 0; St < xt.length; St++)\n                    k(xt[St]);\n                }(ct)) : p.unshift(ct));\n              }\n              i === void 0 && (i = !0);\n              for (var s = 0, S = this.length; s < S; s++) k(this[s]);\n              function j(ct, ot) {\n                var gt = ct._private.edges;\n                o.removeFromArray(gt, ot), ct.clearTraversalCache();\n              }\n              var I = [];\n              function R(ct, ot) {\n                ot = ot[0];\n                var gt = (ct = ct[0])._private.children, xt = ct.id();\n                o.removeFromArray(gt, ot), I.ids[xt] || (I.ids[xt] = !0, I.push(ct));\n              }\n              I.ids = {}, this.dirtyCompoundBoundsCache(), v.removeFromPool(p);\n              for (var M = 0; M < p.length; M++) {\n                var z = p[M];\n                if (z._private.removed = !0, d.push(z), z.isEdge()) {\n                  var V = z.source()[0], G = z.target()[0];\n                  j(V, z), j(G, z), z.parallelEdges().clearTraversalCache();\n                } else {\n                  var Y = z.parent();\n                  Y.length !== 0 && R(Y, z);\n                }\n              }\n              var tt = v._private.elements;\n              v._private.hasCompoundNodes = !1;\n              for (var Z = 0; Z < tt.length; Z++)\n                if (tt[Z].isParent()) {\n                  v._private.hasCompoundNodes = !0;\n                  break;\n                }\n              var at = new l(this.cy(), d);\n              at.size() > 0 && (i && this.cy().notify({ type: \"remove\", eles: at }), at.emit(\"remove\"));\n              for (var nt = 0; nt < I.length; nt++) {\n                var ht = I[nt];\n                ht.removed() || ht.updateStyle();\n              }\n              return new l(v, d);\n            }, h.move = function(i) {\n              var d = this._private.cy;\n              if (i.source !== void 0 || i.target !== void 0) {\n                var p = i.source, f = i.target, v = d.hasElementWithId(p), k = d.hasElementWithId(f);\n                if (v || k) {\n                  var s = this.jsons();\n                  this.remove();\n                  for (var S = 0; S < s.length; S++) {\n                    var j = s[S], I = this[S];\n                    j.group === \"edges\" && (v && (j.data.source = p), k && (j.data.target = f), j.scratch = I._private.scratch);\n                  }\n                  return d.add(s);\n                }\n              } else if (i.parent !== void 0) {\n                var R = i.parent;\n                if (R === null || d.hasElementWithId(R)) {\n                  var M = this.jsons(), z = this.descendants(), V = z.union(z.union(this).connectedEdges()).jsons();\n                  this.remove();\n                  for (var G = 0; G < M.length; G++) {\n                    var Y = M[G], tt = this[G];\n                    Y.group === \"nodes\" && (Y.data.parent = R === null ? void 0 : R, Y.scratch = tt._private.scratch);\n                  }\n                  return d.add(M.concat(V));\n                }\n              }\n              return this;\n            }, [\n              g(29),\n              g(42),\n              g(47),\n              g(48),\n              g(53),\n              g(54),\n              g(55),\n              g(56),\n              g(61),\n              g(62),\n              g(63),\n              g(7),\n              g(64),\n              g(65),\n              g(66),\n              g(67),\n              g(68)\n            ].forEach(function(i) {\n              o.extend(h, i);\n            }), y.exports = l;\n          },\n          function(y, x, g) {\n            var o = /* @__PURE__ */ function() {\n              function a(n, t) {\n                for (var r = 0; r < t.length; r++) {\n                  var l = t[r];\n                  l.enumerable = l.enumerable || !1, l.configurable = !0, \"value\" in l && (l.writable = !0), Object.defineProperty(n, l.key, l);\n                }\n              }\n              return function(n, t, r) {\n                return t && a(n.prototype, t), r && a(n, r), n;\n              };\n            }(), c = function() {\n              function a(n) {\n                if (function(l, h) {\n                  if (!(l instanceof h))\n                    throw new TypeError(\n                      \"Cannot call a class as a function\"\n                    );\n                }(this, a), this._obj = /* @__PURE__ */ Object.create(null), n != null) {\n                  var t = void 0;\n                  t = n.instanceString != null && n.instanceString() === this.instanceString() ? n.toArray() : n;\n                  for (var r = 0; r < t.length; r++) this.add(t[r]);\n                }\n              }\n              return o(a, [\n                {\n                  key: \"instanceString\",\n                  value: function() {\n                    return \"set\";\n                  }\n                },\n                {\n                  key: \"add\",\n                  value: function(n) {\n                    this._obj[n] = 1;\n                  }\n                },\n                {\n                  key: \"delete\",\n                  value: function(n) {\n                    this._obj[n] = 0;\n                  }\n                },\n                {\n                  key: \"clear\",\n                  value: function() {\n                    this._obj = /* @__PURE__ */ Object.create(null);\n                  }\n                },\n                {\n                  key: \"has\",\n                  value: function(n) {\n                    return this._obj[n] === 1;\n                  }\n                },\n                {\n                  key: \"toArray\",\n                  value: function() {\n                    var n = this;\n                    return Object.keys(this._obj).filter(function(t) {\n                      return n.has(t);\n                    });\n                  }\n                },\n                {\n                  key: \"forEach\",\n                  value: function(n, t) {\n                    return this.toArray().forEach(n, t);\n                  }\n                },\n                {\n                  key: \"size\",\n                  get: function() {\n                    return this.toArray().length;\n                  }\n                }\n              ]), a;\n            }();\n            y.exports = c;\n          },\n          function(y, x, g) {\n            y.exports = g(32);\n          },\n          function(y, x, g) {\n            y.exports = function() {\n              return {\n                classes: [],\n                colonSelectors: [],\n                data: [],\n                group: null,\n                ids: [],\n                meta: [],\n                collection: null,\n                filter: null,\n                parent: null,\n                ancestor: null,\n                subject: null,\n                child: null,\n                descendant: null\n              };\n            };\n          },\n          function(y, x, g) {\n            var o = g(1), c = g(0), a = g(16), n = /^([^.]+)(\\.(?:[^.]+))?$/, t = {\n              qualifierCompare: function(d, p) {\n                return d === p;\n              },\n              eventMatches: function() {\n                return !0;\n              },\n              eventFields: function() {\n                return {};\n              },\n              callbackContext: function(d) {\n                return d;\n              },\n              beforeEmit: function() {\n              },\n              afterEmit: function() {\n              },\n              bubble: function() {\n                return !1;\n              },\n              parent: function() {\n                return null;\n              },\n              context: void 0\n            };\n            function r(d) {\n              o.assign(this, t, d), this.listeners = [], this.emitting = 0;\n            }\n            var l = r.prototype, h = function(d, p, f, v, k, s, S) {\n              c.fn(v) && (k = v, v = null), S && (s = s == null ? S : o.assign({}, s, S));\n              for (var j = f.split(/\\s+/), I = 0; I < j.length; I++) {\n                var R = j[I];\n                if (!c.emptyString(R)) {\n                  var M = R.match(n);\n                  if (M && p(d, R, M[1], M[2] ? M[2] : null, v, k, s) === !1)\n                    break;\n                }\n              }\n            }, i = function(d, p) {\n              return new a(p.type, o.assign(p, d.eventFields(d.context)));\n            };\n            l.on = l.addListener = function(d, p, f, v, k) {\n              return h(\n                this,\n                function(s, S, j, I, R, M, z) {\n                  c.fn(M) && s.listeners.push({\n                    event: S,\n                    callback: M,\n                    type: j,\n                    namespace: I,\n                    qualifier: R,\n                    conf: z\n                  });\n                },\n                d,\n                p,\n                f,\n                v,\n                k\n              ), this;\n            }, l.one = function(d, p, f, v) {\n              return this.on(d, p, f, v, { one: !0 });\n            }, l.removeListener = l.off = function(d, p, f, v) {\n              var k = this;\n              this.emitting !== 0 && (this.listeners = o.copyArray(this.listeners));\n              for (var s = this.listeners, S = function(I) {\n                var R = s[I];\n                h(\n                  k,\n                  function(M, z, V, G, Y, tt) {\n                    if (R.type === V && (!G || R.namespace === G) && (!Y || M.qualifierCompare(R.qualifier, Y)) && (!tt || R.callback === tt))\n                      return s.splice(I, 1), !1;\n                  },\n                  d,\n                  p,\n                  f,\n                  v\n                );\n              }, j = s.length - 1; j >= 0; j--)\n                S(j);\n              return this;\n            }, l.emit = l.trigger = function(d, p, f) {\n              var v = this.listeners, k = v.length;\n              return this.emitting++, c.array(p) || (p = [p]), function(s, S, j) {\n                if (c.event(j)) S(s, j);\n                else if (c.plainObject(j)) S(s, i(s, j));\n                else\n                  for (var I = j.split(/\\s+/), R = 0; R < I.length; R++) {\n                    var M = I[R];\n                    if (!c.emptyString(M)) {\n                      var z = M.match(n);\n                      if (z) {\n                        var V = z[1], G = z[2] ? z[2] : null;\n                        S(\n                          s,\n                          i(s, {\n                            type: V,\n                            namespace: G,\n                            target: s.context\n                          })\n                        );\n                      }\n                    }\n                  }\n              }(\n                this,\n                function(s, S) {\n                  f != null && (v = [\n                    {\n                      event: S.event,\n                      type: S.type,\n                      namespace: S.namespace,\n                      callback: f\n                    }\n                  ], k = v.length);\n                  for (var j = function(R) {\n                    var M = v[R];\n                    if (M.type === S.type && (!M.namespace || M.namespace === S.namespace || M.namespace === \".*\") && s.eventMatches(s.context, M, S)) {\n                      var z = [S];\n                      p != null && o.push(z, p), s.beforeEmit(s.context, M, S), M.conf && M.conf.one && (s.listeners = s.listeners.filter(\n                        function(Y) {\n                          return Y !== M;\n                        }\n                      ));\n                      var V = s.callbackContext(s.context, M, S), G = M.callback.apply(V, z);\n                      s.afterEmit(s.context, M, S), G === !1 && (S.stopPropagation(), S.preventDefault());\n                    }\n                  }, I = 0; I < k; I++)\n                    j(I);\n                  s.bubble(s.context) && !S.isPropagationStopped() && s.parent(s.context).emit(S, p);\n                },\n                d\n              ), this.emitting--, this;\n            }, y.exports = r;\n          },\n          function(y, x, g) {\n            var o = g(3), c = g(1), a = g(7), n = g(0), t = g(5), r = g(4), l = function(i) {\n              var d = this, p = (i = c.extend({}, i)).container;\n              p && !n.htmlElement(p) && n.htmlElement(p[0]) && (p = p[0]);\n              var f = p ? p._cyreg : null;\n              (f = f || {}) && f.cy && (f.cy.destroy(), f = {});\n              var v = f.readies = f.readies || [];\n              p && (p._cyreg = f), f.cy = d;\n              var k = o !== void 0 && p !== void 0 && !i.headless, s = i;\n              s.layout = c.extend(\n                { name: k ? \"grid\" : \"null\" },\n                s.layout\n              ), s.renderer = c.extend(\n                { name: k ? \"canvas\" : \"null\" },\n                s.renderer\n              );\n              var S = function(R, M, z) {\n                return M !== void 0 ? M : z !== void 0 ? z : R;\n              }, j = this._private = {\n                container: p,\n                ready: !1,\n                options: s,\n                elements: new a(this),\n                listeners: [],\n                aniEles: new a(this),\n                scratch: {},\n                layout: null,\n                renderer: null,\n                destroyed: !1,\n                notificationsEnabled: !0,\n                minZoom: 1e-50,\n                maxZoom: 1e50,\n                zoomingEnabled: S(!0, s.zoomingEnabled),\n                userZoomingEnabled: S(!0, s.userZoomingEnabled),\n                panningEnabled: S(!0, s.panningEnabled),\n                userPanningEnabled: S(!0, s.userPanningEnabled),\n                boxSelectionEnabled: S(!0, s.boxSelectionEnabled),\n                autolock: S(!1, s.autolock, s.autolockNodes),\n                autoungrabify: S(\n                  !1,\n                  s.autoungrabify,\n                  s.autoungrabifyNodes\n                ),\n                autounselectify: S(!1, s.autounselectify),\n                styleEnabled: s.styleEnabled === void 0 ? k : s.styleEnabled,\n                zoom: n.number(s.zoom) ? s.zoom : 1,\n                pan: {\n                  x: n.plainObject(s.pan) && n.number(s.pan.x) ? s.pan.x : 0,\n                  y: n.plainObject(s.pan) && n.number(s.pan.y) ? s.pan.y : 0\n                },\n                animation: { current: [], queue: [] },\n                hasCompoundNodes: !1\n              };\n              this.createEmitter();\n              var I = s.selectionType;\n              j.selectionType = I === void 0 || I !== \"additive\" && I !== \"single\" ? \"single\" : I, n.number(s.minZoom) && n.number(s.maxZoom) && s.minZoom < s.maxZoom ? (j.minZoom = s.minZoom, j.maxZoom = s.maxZoom) : n.number(s.minZoom) && s.maxZoom === void 0 ? j.minZoom = s.minZoom : n.number(s.maxZoom) && s.minZoom === void 0 && (j.maxZoom = s.maxZoom), j.styleEnabled && d.setStyle([]), d.initRenderer(\n                c.extend(\n                  {\n                    hideEdgesOnViewport: s.hideEdgesOnViewport,\n                    textureOnViewport: s.textureOnViewport,\n                    wheelSensitivity: n.number(s.wheelSensitivity) && s.wheelSensitivity > 0 ? s.wheelSensitivity : 1,\n                    motionBlur: s.motionBlur !== void 0 && s.motionBlur,\n                    motionBlurOpacity: s.motionBlurOpacity === void 0 ? 0.05 : s.motionBlurOpacity,\n                    pixelRatio: n.number(s.pixelRatio) && s.pixelRatio > 0 ? s.pixelRatio : void 0,\n                    desktopTapThreshold: s.desktopTapThreshold === void 0 ? 4 : s.desktopTapThreshold,\n                    touchTapThreshold: s.touchTapThreshold === void 0 ? 8 : s.touchTapThreshold\n                  },\n                  s.renderer\n                )\n              ), function(R, M) {\n                if (R.some(n.promise)) return t.all(R).then(M);\n                M(R);\n              }([s.style, s.elements], function(R) {\n                var M = R[0], z = R[1];\n                j.styleEnabled && d.style().append(M), function(V, G, Y) {\n                  d.notifications(!1);\n                  var tt = d.mutableElements();\n                  tt.length > 0 && tt.remove(), V != null && (n.plainObject(V) || n.array(V)) && d.add(V), d.one(\"layoutready\", function(at) {\n                    d.notifications(!0), d.emit(at), d.notify({\n                      type: \"load\",\n                      eles: d.mutableElements()\n                    }), d.one(\"load\", G), d.emit(\"load\");\n                  }).one(\"layoutstop\", function() {\n                    d.one(\"done\", Y), d.emit(\"done\");\n                  });\n                  var Z = c.extend({}, d._private.options.layout);\n                  Z.eles = d.elements(), d.layout(Z).run();\n                }(\n                  z,\n                  function() {\n                    d.startAnimationLoop(), j.ready = !0, n.fn(s.ready) && d.on(\"ready\", s.ready);\n                    for (var V = 0; V < v.length; V++) {\n                      var G = v[V];\n                      d.on(\"ready\", G);\n                    }\n                    f && (f.readies = []), d.emit(\"ready\");\n                  },\n                  s.done\n                );\n              });\n            }, h = l.prototype;\n            c.extend(h, {\n              instanceString: function() {\n                return \"core\";\n              },\n              isReady: function() {\n                return this._private.ready;\n              },\n              isDestroyed: function() {\n                return this._private.destroyed;\n              },\n              ready: function(i) {\n                return this.isReady() ? this.emitter().emit(\"ready\", [], i) : this.on(\"ready\", i), this;\n              },\n              destroy: function() {\n                var i = this;\n                if (!i.isDestroyed())\n                  return i.stopAnimationLoop(), i.destroyRenderer(), this.emit(\"destroy\"), i._private.destroyed = !0, i;\n              },\n              hasElementWithId: function(i) {\n                return this._private.elements.hasElementWithId(i);\n              },\n              getElementById: function(i) {\n                return this._private.elements.getElementById(i);\n              },\n              selectionType: function() {\n                return this._private.selectionType;\n              },\n              hasCompoundNodes: function() {\n                return this._private.hasCompoundNodes;\n              },\n              headless: function() {\n                return this._private.options.renderer.name === \"null\";\n              },\n              styleEnabled: function() {\n                return this._private.styleEnabled;\n              },\n              addToPool: function(i) {\n                return this._private.elements.merge(i), this;\n              },\n              removeFromPool: function(i) {\n                return this._private.elements.unmerge(i), this;\n              },\n              container: function() {\n                return this._private.container;\n              },\n              options: function() {\n                return c.copy(this._private.options);\n              },\n              json: function(i) {\n                var d = this, p = d._private, f = d.mutableElements();\n                if (n.plainObject(i)) {\n                  if (d.startBatch(), i.elements) {\n                    var v = {}, k = function(G, Y) {\n                      for (var tt = 0; tt < G.length; tt++) {\n                        var Z = G[tt], at = Z.data.id, nt = d.getElementById(at);\n                        v[at] = !0, nt.length !== 0 ? nt.json(Z) : Y ? d.add(c.extend({ group: Y }, Z)) : d.add(Z);\n                      }\n                    };\n                    if (n.array(i.elements)) k(i.elements);\n                    else\n                      for (var s = [\"nodes\", \"edges\"], S = 0; S < s.length; S++) {\n                        var j = s[S], I = i.elements[j];\n                        n.array(I) && k(I, j);\n                      }\n                    f.stdFilter(function(G) {\n                      return !v[G.id()];\n                    }).remove();\n                  }\n                  i.style && d.style(i.style), i.zoom != null && i.zoom !== p.zoom && d.zoom(i.zoom), i.pan && (i.pan.x === p.pan.x && i.pan.y === p.pan.y || d.pan(i.pan));\n                  for (var R = [\n                    \"minZoom\",\n                    \"maxZoom\",\n                    \"zoomingEnabled\",\n                    \"userZoomingEnabled\",\n                    \"panningEnabled\",\n                    \"userPanningEnabled\",\n                    \"boxSelectionEnabled\",\n                    \"autolock\",\n                    \"autoungrabify\",\n                    \"autounselectify\"\n                  ], M = 0; M < R.length; M++) {\n                    var z = R[M];\n                    i[z] != null && d[z](i[z]);\n                  }\n                  return d.endBatch(), this;\n                }\n                if (i === void 0) {\n                  var V = { elements: {} };\n                  return f.forEach(function(G) {\n                    var Y = G.group();\n                    V.elements[Y] || (V.elements[Y] = []), V.elements[Y].push(G.json());\n                  }), this._private.styleEnabled && (V.style = d.style().json()), V.zoomingEnabled = d._private.zoomingEnabled, V.userZoomingEnabled = d._private.userZoomingEnabled, V.zoom = d._private.zoom, V.minZoom = d._private.minZoom, V.maxZoom = d._private.maxZoom, V.panningEnabled = d._private.panningEnabled, V.userPanningEnabled = d._private.userPanningEnabled, V.pan = c.copy(d._private.pan), V.boxSelectionEnabled = d._private.boxSelectionEnabled, V.renderer = c.copy(d._private.options.renderer), V.hideEdgesOnViewport = d._private.options.hideEdgesOnViewport, V.textureOnViewport = d._private.options.textureOnViewport, V.wheelSensitivity = d._private.options.wheelSensitivity, V.motionBlur = d._private.options.motionBlur, V;\n                }\n              },\n              scratch: r.data({\n                field: \"scratch\",\n                bindingEvent: \"scratch\",\n                allowBinding: !0,\n                allowSetting: !0,\n                settingEvent: \"scratch\",\n                settingTriggersEvent: !0,\n                triggerFnName: \"trigger\",\n                allowGetting: !0\n              }),\n              removeScratch: r.removeData({\n                field: \"scratch\",\n                event: \"scratch\",\n                triggerFnName: \"trigger\",\n                triggerEvent: !0\n              })\n            }), h.$id = h.getElementById, [\n              g(69),\n              g(70),\n              g(78),\n              g(79),\n              g(80),\n              g(81),\n              g(82),\n              g(83),\n              g(84),\n              g(93)\n            ].forEach(function(i) {\n              c.extend(h, i);\n            }), y.exports = l;\n          },\n          function(y, x, g) {\n            y.exports = function(o, c) {\n              c || (c = function() {\n                if (arguments.length === 1) return arguments[0];\n                if (arguments.length === 0) return \"undefined\";\n                for (var n = [], t = 0; t < arguments.length; t++)\n                  n.push(arguments[t]);\n                return n.join(\"$\");\n              });\n              var a = function n() {\n                var t = this, r = arguments, l = void 0, h = c.apply(t, r), i = n.cache;\n                return (l = i[h]) || (l = i[h] = o.apply(t, r)), l;\n              };\n              return a.cache = {}, a;\n            };\n          },\n          function(y, x, g) {\n            var o = g(1), c = g(0), a = g(8);\n            y.exports = function(n, t, r) {\n              if (r = !(r !== void 0 && !r), n !== void 0 && t !== void 0 && c.core(n)) {\n                var l = t.group;\n                if (l == null && (l = t.data && t.data.source != null && t.data.target != null ? \"edges\" : \"nodes\"), l === \"nodes\" || l === \"edges\") {\n                  this.length = 1, this[0] = this;\n                  var h = this._private = {\n                    cy: n,\n                    single: !0,\n                    data: t.data || {},\n                    position: t.position || {},\n                    autoWidth: void 0,\n                    autoHeight: void 0,\n                    autoPadding: void 0,\n                    compoundBoundsClean: !1,\n                    listeners: [],\n                    group: l,\n                    style: {},\n                    rstyle: {},\n                    styleCxts: [],\n                    removed: !0,\n                    selected: !!t.selected,\n                    selectable: t.selectable === void 0 || !!t.selectable,\n                    locked: !!t.locked,\n                    grabbed: !1,\n                    grabbable: t.grabbable === void 0 || !!t.grabbable,\n                    active: !1,\n                    classes: new a(),\n                    animation: { current: [], queue: [] },\n                    rscratch: {},\n                    scratch: t.scratch || {},\n                    edges: [],\n                    children: [],\n                    parent: null,\n                    traversalCache: {},\n                    backgrounding: !1\n                  };\n                  if (t.renderedPosition) {\n                    var i = t.renderedPosition, d = n.pan(), p = n.zoom();\n                    h.position = { x: (i.x - d.x) / p, y: (i.y - d.y) / p };\n                  }\n                  if (c.string(t.classes))\n                    for (var f = t.classes.split(/\\s+/), v = 0, k = f.length; v < k; v++) {\n                      var s = f[v];\n                      s && s !== \"\" && h.classes.add(s);\n                    }\n                  (t.style || t.css) && n.style().applyBypass(this, t.style || t.css), this.createEmitter(), (r === void 0 || r) && this.restore();\n                } else\n                  o.error(\n                    \"An element must be of type `nodes` or `edges`; you specified `\" + l + \"`\"\n                  );\n              } else\n                o.error(\n                  \"An element must have a core reference and parameters set\"\n                );\n            };\n          },\n          function(y, x, g) {\n            var o = g(1), c = [\n              {\n                selector: \":selected\",\n                matches: function(n) {\n                  return n.selected();\n                }\n              },\n              {\n                selector: \":unselected\",\n                matches: function(n) {\n                  return !n.selected();\n                }\n              },\n              {\n                selector: \":selectable\",\n                matches: function(n) {\n                  return n.selectable();\n                }\n              },\n              {\n                selector: \":unselectable\",\n                matches: function(n) {\n                  return !n.selectable();\n                }\n              },\n              {\n                selector: \":locked\",\n                matches: function(n) {\n                  return n.locked();\n                }\n              },\n              {\n                selector: \":unlocked\",\n                matches: function(n) {\n                  return !n.locked();\n                }\n              },\n              {\n                selector: \":visible\",\n                matches: function(n) {\n                  return n.visible();\n                }\n              },\n              {\n                selector: \":hidden\",\n                matches: function(n) {\n                  return !n.visible();\n                }\n              },\n              {\n                selector: \":transparent\",\n                matches: function(n) {\n                  return n.transparent();\n                }\n              },\n              {\n                selector: \":grabbed\",\n                matches: function(n) {\n                  return n.grabbed();\n                }\n              },\n              {\n                selector: \":free\",\n                matches: function(n) {\n                  return !n.grabbed();\n                }\n              },\n              {\n                selector: \":removed\",\n                matches: function(n) {\n                  return n.removed();\n                }\n              },\n              {\n                selector: \":inside\",\n                matches: function(n) {\n                  return !n.removed();\n                }\n              },\n              {\n                selector: \":grabbable\",\n                matches: function(n) {\n                  return n.grabbable();\n                }\n              },\n              {\n                selector: \":ungrabbable\",\n                matches: function(n) {\n                  return !n.grabbable();\n                }\n              },\n              {\n                selector: \":animated\",\n                matches: function(n) {\n                  return n.animated();\n                }\n              },\n              {\n                selector: \":unanimated\",\n                matches: function(n) {\n                  return !n.animated();\n                }\n              },\n              {\n                selector: \":parent\",\n                matches: function(n) {\n                  return n.isParent();\n                }\n              },\n              {\n                selector: \":childless\",\n                matches: function(n) {\n                  return n.isChildless();\n                }\n              },\n              {\n                selector: \":child\",\n                matches: function(n) {\n                  return n.isChild();\n                }\n              },\n              {\n                selector: \":orphan\",\n                matches: function(n) {\n                  return n.isOrphan();\n                }\n              },\n              {\n                selector: \":nonorphan\",\n                matches: function(n) {\n                  return n.isChild();\n                }\n              },\n              {\n                selector: \":loop\",\n                matches: function(n) {\n                  return n.isLoop();\n                }\n              },\n              {\n                selector: \":simple\",\n                matches: function(n) {\n                  return n.isSimple();\n                }\n              },\n              {\n                selector: \":active\",\n                matches: function(n) {\n                  return n.active();\n                }\n              },\n              {\n                selector: \":inactive\",\n                matches: function(n) {\n                  return !n.active();\n                }\n              },\n              {\n                selector: \":backgrounding\",\n                matches: function(n) {\n                  return n.backgrounding();\n                }\n              },\n              {\n                selector: \":nonbackgrounding\",\n                matches: function(n) {\n                  return !n.backgrounding();\n                }\n              }\n            ].sort(function(n, t) {\n              return o.sort.descending(n.selector, t.selector);\n            }), a = \"(\" + c.map(function(n) {\n              return n.selector;\n            }).join(\"|\") + \")\";\n            y.exports = {\n              stateSelectors: c,\n              stateSelectorMatches: function n(t, r) {\n                return (n.lookup = n.lookup || function() {\n                  for (var l = {}, h = void 0, i = 0; i < c.length; i++)\n                    l[(h = c[i]).selector] = h.matches;\n                  return l;\n                }())[t](r);\n              },\n              stateSelectorRegex: a\n            };\n          },\n          function(y, x, g) {\n            /*!\n            Event object based on jQuery events, MIT license\n            \n            https://jquery.org/license/\n            https://tldrlegal.com/license/mit-license\n            https://github.com/jquery/jquery/blob/master/src/event.js\n            */\n            var o = function(n, t) {\n              this.recycle(n, t);\n            };\n            function c() {\n              return !1;\n            }\n            function a() {\n              return !0;\n            }\n            o.prototype = {\n              instanceString: function() {\n                return \"event\";\n              },\n              recycle: function(n, t) {\n                if (this.isImmediatePropagationStopped = this.isPropagationStopped = this.isDefaultPrevented = c, n != null && n.preventDefault ? (this.type = n.type, this.isDefaultPrevented = n.defaultPrevented ? a : c) : n != null && n.type ? t = n : this.type = n, t != null && (this.originalEvent = t.originalEvent, this.type = t.type != null ? t.type : this.type, this.cy = t.cy, this.target = t.target, this.position = t.position, this.renderedPosition = t.renderedPosition, this.namespace = t.namespace, this.layout = t.layout), this.cy != null && this.position != null && this.renderedPosition == null) {\n                  var r = this.position, l = this.cy.zoom(), h = this.cy.pan();\n                  this.renderedPosition = {\n                    x: r.x * l + h.x,\n                    y: r.y * l + h.y\n                  };\n                }\n                this.timeStamp = n && n.timeStamp || Date.now();\n              },\n              preventDefault: function() {\n                this.isDefaultPrevented = a;\n                var n = this.originalEvent;\n                n && n.preventDefault && n.preventDefault();\n              },\n              stopPropagation: function() {\n                this.isPropagationStopped = a;\n                var n = this.originalEvent;\n                n && n.stopPropagation && n.stopPropagation();\n              },\n              stopImmediatePropagation: function() {\n                this.isImmediatePropagationStopped = a, this.stopPropagation();\n              },\n              isDefaultPrevented: c,\n              isPropagationStopped: c,\n              isImmediatePropagationStopped: c\n            }, y.exports = o;\n          },\n          function(y, x, g) {\n            var o = g(1);\n            y.exports = function(c, a) {\n              var n = c.cy().hasCompoundNodes();\n              function t(d) {\n                var p = d.pstyle(\"z-compound-depth\");\n                return p.value === \"auto\" ? n ? d.zDepth() : 0 : p.value === \"bottom\" ? -1 : p.value === \"top\" ? o.MAX_INT : 0;\n              }\n              var r = t(c) - t(a);\n              if (r !== 0) return r;\n              function l(d) {\n                return d.pstyle(\"z-index-compare\").value === \"auto\" && d.isNode() ? 1 : 0;\n              }\n              var h = l(c) - l(a);\n              if (h !== 0) return h;\n              var i = c.pstyle(\"z-index\").value - a.pstyle(\"z-index\").value;\n              return i !== 0 ? i : c.poolIndex() - a.poolIndex();\n            };\n          },\n          function(y, x, g) {\n            var o = g(0), c = g(1), a = g(6), n = function r(l) {\n              if (!(this instanceof r)) return new r(l);\n              o.core(l) ? (this._private = { cy: l, coreStyle: {} }, this.length = 0, this.resetToDefault()) : c.error(\"A style must have a core reference\");\n            }, t = n.prototype;\n            t.instanceString = function() {\n              return \"style\";\n            }, t.clear = function() {\n              for (var r = 0; r < this.length; r++) this[r] = void 0;\n              return this.length = 0, this._private.newStyle = !0, this;\n            }, t.resetToDefault = function() {\n              return this.clear(), this.addDefaultStylesheet(), this;\n            }, t.core = function() {\n              return this._private.coreStyle;\n            }, t.selector = function(r) {\n              var l = r === \"core\" ? null : new a(r), h = this.length++;\n              return this[h] = {\n                selector: l,\n                properties: [],\n                mappedProperties: [],\n                index: h\n              }, this;\n            }, t.css = function() {\n              var r = this, l = arguments;\n              switch (l.length) {\n                case 1:\n                  for (var h = l[0], i = 0; i < r.properties.length; i++) {\n                    var d = r.properties[i], p = h[d.name];\n                    p === void 0 && (p = h[c.dash2camel(d.name)]), p !== void 0 && this.cssRule(d.name, p);\n                  }\n                  break;\n                case 2:\n                  this.cssRule(l[0], l[1]);\n              }\n              return this;\n            }, t.style = t.css, t.cssRule = function(r, l) {\n              var h = this.parse(r, l);\n              if (h) {\n                var i = this.length - 1;\n                this[i].properties.push(h), this[i].properties[h.name] = h, h.name.match(/pie-(\\d+)-background-size/) && h.value && (this._private.hasPie = !0), h.mapped && this[i].mappedProperties.push(h), !this[i].selector && (this._private.coreStyle[h.name] = h);\n              }\n              return this;\n            }, t.append = function(r) {\n              return o.stylesheet(r) ? r.appendToStyle(this) : o.array(r) ? this.appendFromJson(r) : o.string(r) && this.appendFromString(r), this;\n            }, n.fromJson = function(r, l) {\n              var h = new n(r);\n              return h.fromJson(l), h;\n            }, n.fromString = function(r, l) {\n              return new n(r).fromString(l);\n            }, [\n              g(85),\n              g(86),\n              g(87),\n              g(88),\n              g(89),\n              g(90),\n              g(91),\n              g(92)\n            ].forEach(function(r) {\n              c.extend(t, r);\n            }), n.types = t.types, n.properties = t.properties, y.exports = n;\n          },\n          function(y, x, g) {\n            var o = g(1);\n            y.exports = {\n              setupDequeueing: function(c) {\n                return function() {\n                  var a = this, n = this.renderer;\n                  if (!a.dequeueingSetup) {\n                    a.dequeueingSetup = !0;\n                    var t = o.debounce(function() {\n                      n.redrawHint(\"eles\", !0), n.redrawHint(\"drag\", !0), n.redraw();\n                    }, c.deqRedrawThreshold), r = c.priority || o.noop;\n                    n.beforeRender(function(l, h) {\n                      for (var i = o.performanceNow(), d = n.averageRedrawTime, p = n.lastRedrawTime, f = [], v = n.cy.extent(), k = n.getPixelRatio(); ; ) {\n                        var s = o.performanceNow(), S = s - i, j = s - h;\n                        if (p < 1e3 / 60) {\n                          var I = 16.666666666666668 - (l ? d : 0);\n                          if (j >= c.deqFastCost * I) break;\n                        } else if (l) {\n                          if (S >= c.deqCost * p || S >= c.deqAvgCost * d)\n                            break;\n                        } else if (j >= c.deqNoDrawCost * (1e3 / 60)) break;\n                        var R = c.deq(a, k, v);\n                        if (!(R.length > 0)) break;\n                        for (var M = 0; M < R.length; M++) f.push(R[M]);\n                      }\n                      f.length > 0 && (c.onDeqd(a, f), !l && c.shouldRedraw(a, f, k, v) && t());\n                    }, r(a));\n                  }\n                };\n              }\n            };\n          },\n          function(y, x, g) {\n            var o = g(0), c = g(12), a = g(94), n = g(136), t = function(r) {\n              return r === void 0 && (r = {}), o.plainObject(r) ? new c(r) : o.string(r) ? a.apply(a, arguments) : void 0;\n            };\n            t.use = function(r) {\n              var l = Array.prototype.slice.call(arguments, 1);\n              return l.unshift(t), r.apply(null, l), this;\n            }, t.version = g(137), t.stylesheet = t.Stylesheet = n, y.exports = t;\n          },\n          function(y, x, g) {\n            var o = g(0);\n            y.exports = {\n              hex2tuple: function(c) {\n                if ((c.length === 4 || c.length === 7) && c[0] === \"#\") {\n                  var a = void 0, n = void 0, t = void 0;\n                  return c.length === 4 ? (a = parseInt(c[1] + c[1], 16), n = parseInt(c[2] + c[2], 16), t = parseInt(c[3] + c[3], 16)) : (a = parseInt(c[1] + c[2], 16), n = parseInt(c[3] + c[4], 16), t = parseInt(c[5] + c[6], 16)), [a, n, t];\n                }\n              },\n              hsl2tuple: function(c) {\n                var a = void 0, n = void 0, t = void 0, r = void 0, l = void 0, h = void 0, i = void 0, d = void 0;\n                function p(s, S, j) {\n                  return j < 0 && (j += 1), j > 1 && (j -= 1), j < 1 / 6 ? s + 6 * (S - s) * j : j < 0.5 ? S : j < 2 / 3 ? s + (S - s) * (2 / 3 - j) * 6 : s;\n                }\n                var f = new RegExp(\"^\" + this.regex.hsla + \"$\").exec(c);\n                if (f) {\n                  if ((n = parseInt(f[1])) < 0 ? n = (360 - -1 * n % 360) % 360 : n > 360 && (n %= 360), n /= 360, (t = parseFloat(f[2])) < 0 || t > 100 || (t /= 100, (r = parseFloat(f[3])) < 0 || r > 100) || (r /= 100, (l = f[4]) !== void 0 && ((l = parseFloat(l)) < 0 || l > 1)))\n                    return;\n                  if (t === 0) h = i = d = Math.round(255 * r);\n                  else {\n                    var v = r < 0.5 ? r * (1 + t) : r + t - r * t, k = 2 * r - v;\n                    h = Math.round(255 * p(k, v, n + 1 / 3)), i = Math.round(255 * p(k, v, n)), d = Math.round(255 * p(k, v, n - 1 / 3));\n                  }\n                  a = [h, i, d, l];\n                }\n                return a;\n              },\n              rgb2tuple: function(c) {\n                var a = void 0, n = new RegExp(\"^\" + this.regex.rgba + \"$\").exec(c);\n                if (n) {\n                  a = [];\n                  for (var t = [], r = 1; r <= 3; r++) {\n                    var l = n[r];\n                    if (l[l.length - 1] === \"%\" && (t[r] = !0), l = parseFloat(l), t[r] && (l = l / 100 * 255), l < 0 || l > 255)\n                      return;\n                    a.push(Math.floor(l));\n                  }\n                  var h = t[1] || t[2] || t[3], i = t[1] && t[2] && t[3];\n                  if (h && !i) return;\n                  var d = n[4];\n                  if (d !== void 0) {\n                    if ((d = parseFloat(d)) < 0 || d > 1) return;\n                    a.push(d);\n                  }\n                }\n                return a;\n              },\n              colorname2tuple: function(c) {\n                return this.colors[c.toLowerCase()];\n              },\n              color2tuple: function(c) {\n                return (o.array(c) ? c : null) || this.colorname2tuple(c) || this.hex2tuple(c) || this.rgb2tuple(c) || this.hsl2tuple(c);\n              },\n              colors: {\n                transparent: [0, 0, 0, 0],\n                aliceblue: [240, 248, 255],\n                antiquewhite: [250, 235, 215],\n                aqua: [0, 255, 255],\n                aquamarine: [127, 255, 212],\n                azure: [240, 255, 255],\n                beige: [245, 245, 220],\n                bisque: [255, 228, 196],\n                black: [0, 0, 0],\n                blanchedalmond: [255, 235, 205],\n                blue: [0, 0, 255],\n                blueviolet: [138, 43, 226],\n                brown: [165, 42, 42],\n                burlywood: [222, 184, 135],\n                cadetblue: [95, 158, 160],\n                chartreuse: [127, 255, 0],\n                chocolate: [210, 105, 30],\n                coral: [255, 127, 80],\n                cornflowerblue: [100, 149, 237],\n                cornsilk: [255, 248, 220],\n                crimson: [220, 20, 60],\n                cyan: [0, 255, 255],\n                darkblue: [0, 0, 139],\n                darkcyan: [0, 139, 139],\n                darkgoldenrod: [184, 134, 11],\n                darkgray: [169, 169, 169],\n                darkgreen: [0, 100, 0],\n                darkgrey: [169, 169, 169],\n                darkkhaki: [189, 183, 107],\n                darkmagenta: [139, 0, 139],\n                darkolivegreen: [85, 107, 47],\n                darkorange: [255, 140, 0],\n                darkorchid: [153, 50, 204],\n                darkred: [139, 0, 0],\n                darksalmon: [233, 150, 122],\n                darkseagreen: [143, 188, 143],\n                darkslateblue: [72, 61, 139],\n                darkslategray: [47, 79, 79],\n                darkslategrey: [47, 79, 79],\n                darkturquoise: [0, 206, 209],\n                darkviolet: [148, 0, 211],\n                deeppink: [255, 20, 147],\n                deepskyblue: [0, 191, 255],\n                dimgray: [105, 105, 105],\n                dimgrey: [105, 105, 105],\n                dodgerblue: [30, 144, 255],\n                firebrick: [178, 34, 34],\n                floralwhite: [255, 250, 240],\n                forestgreen: [34, 139, 34],\n                fuchsia: [255, 0, 255],\n                gainsboro: [220, 220, 220],\n                ghostwhite: [248, 248, 255],\n                gold: [255, 215, 0],\n                goldenrod: [218, 165, 32],\n                gray: [128, 128, 128],\n                grey: [128, 128, 128],\n                green: [0, 128, 0],\n                greenyellow: [173, 255, 47],\n                honeydew: [240, 255, 240],\n                hotpink: [255, 105, 180],\n                indianred: [205, 92, 92],\n                indigo: [75, 0, 130],\n                ivory: [255, 255, 240],\n                khaki: [240, 230, 140],\n                lavender: [230, 230, 250],\n                lavenderblush: [255, 240, 245],\n                lawngreen: [124, 252, 0],\n                lemonchiffon: [255, 250, 205],\n                lightblue: [173, 216, 230],\n                lightcoral: [240, 128, 128],\n                lightcyan: [224, 255, 255],\n                lightgoldenrodyellow: [250, 250, 210],\n                lightgray: [211, 211, 211],\n                lightgreen: [144, 238, 144],\n                lightgrey: [211, 211, 211],\n                lightpink: [255, 182, 193],\n                lightsalmon: [255, 160, 122],\n                lightseagreen: [32, 178, 170],\n                lightskyblue: [135, 206, 250],\n                lightslategray: [119, 136, 153],\n                lightslategrey: [119, 136, 153],\n                lightsteelblue: [176, 196, 222],\n                lightyellow: [255, 255, 224],\n                lime: [0, 255, 0],\n                limegreen: [50, 205, 50],\n                linen: [250, 240, 230],\n                magenta: [255, 0, 255],\n                maroon: [128, 0, 0],\n                mediumaquamarine: [102, 205, 170],\n                mediumblue: [0, 0, 205],\n                mediumorchid: [186, 85, 211],\n                mediumpurple: [147, 112, 219],\n                mediumseagreen: [60, 179, 113],\n                mediumslateblue: [123, 104, 238],\n                mediumspringgreen: [0, 250, 154],\n                mediumturquoise: [72, 209, 204],\n                mediumvioletred: [199, 21, 133],\n                midnightblue: [25, 25, 112],\n                mintcream: [245, 255, 250],\n                mistyrose: [255, 228, 225],\n                moccasin: [255, 228, 181],\n                navajowhite: [255, 222, 173],\n                navy: [0, 0, 128],\n                oldlace: [253, 245, 230],\n                olive: [128, 128, 0],\n                olivedrab: [107, 142, 35],\n                orange: [255, 165, 0],\n                orangered: [255, 69, 0],\n                orchid: [218, 112, 214],\n                palegoldenrod: [238, 232, 170],\n                palegreen: [152, 251, 152],\n                paleturquoise: [175, 238, 238],\n                palevioletred: [219, 112, 147],\n                papayawhip: [255, 239, 213],\n                peachpuff: [255, 218, 185],\n                peru: [205, 133, 63],\n                pink: [255, 192, 203],\n                plum: [221, 160, 221],\n                powderblue: [176, 224, 230],\n                purple: [128, 0, 128],\n                red: [255, 0, 0],\n                rosybrown: [188, 143, 143],\n                royalblue: [65, 105, 225],\n                saddlebrown: [139, 69, 19],\n                salmon: [250, 128, 114],\n                sandybrown: [244, 164, 96],\n                seagreen: [46, 139, 87],\n                seashell: [255, 245, 238],\n                sienna: [160, 82, 45],\n                silver: [192, 192, 192],\n                skyblue: [135, 206, 235],\n                slateblue: [106, 90, 205],\n                slategray: [112, 128, 144],\n                slategrey: [112, 128, 144],\n                snow: [255, 250, 250],\n                springgreen: [0, 255, 127],\n                steelblue: [70, 130, 180],\n                tan: [210, 180, 140],\n                teal: [0, 128, 128],\n                thistle: [216, 191, 216],\n                tomato: [255, 99, 71],\n                turquoise: [64, 224, 208],\n                violet: [238, 130, 238],\n                wheat: [245, 222, 179],\n                white: [255, 255, 255],\n                whitesmoke: [245, 245, 245],\n                yellow: [255, 255, 0],\n                yellowgreen: [154, 205, 50]\n              }\n            };\n          },\n          function(y, x, g) {\n            var o = g(0);\n            y.exports = {\n              mapEmpty: function(c) {\n                return c == null || Object.keys(c).length === 0;\n              },\n              pushMap: function(c) {\n                var a = this.getMap(c);\n                a == null ? this.setMap(this.extend({}, c, { value: [c.value] })) : a.push(c.value);\n              },\n              setMap: function(c) {\n                for (var a = c.map, n = c.keys, t = n.length, r = 0; r < t; r++) {\n                  var l = n[r];\n                  o.plainObject(l) && this.error(\"Tried to set map with object key\"), r < n.length - 1 ? (a[l] == null && (a[l] = {}), a = a[l]) : a[l] = c.value;\n                }\n              },\n              getMap: function(c) {\n                for (var a = c.map, n = c.keys, t = n.length, r = 0; r < t; r++) {\n                  var l = n[r];\n                  if (o.plainObject(l) && this.error(\"Tried to get map with object key\"), (a = a[l]) == null)\n                    return a;\n                }\n                return a;\n              },\n              deleteMap: function(c) {\n                for (var a = c.map, n = c.keys, t = n.length, r = c.keepChildren, l = 0; l < t; l++) {\n                  var h = n[l];\n                  if (o.plainObject(h) && this.error(\"Tried to delete map with object key\"), l === c.keys.length - 1)\n                    if (r)\n                      for (var i = Object.keys(a), d = 0; d < i.length; d++) {\n                        var p = i[d];\n                        r[p] || (a[p] = void 0);\n                      }\n                    else a[h] = void 0;\n                  else a = a[h];\n                }\n              }\n            };\n          },\n          function(y, x, g) {\n            var o = \"(?:[-+]?(?:(?:\\\\d+|\\\\d*\\\\.\\\\d+)(?:[Ee][+-]?\\\\d+)?))\";\n            y.exports = {\n              regex: {\n                number: o,\n                rgba: \"rgb[a]?\\\\(((?:[-+]?(?:(?:\\\\d+|\\\\d*\\\\.\\\\d+)(?:[Ee][+-]?\\\\d+)?))[%]?)\\\\s*,\\\\s*((?:[-+]?(?:(?:\\\\d+|\\\\d*\\\\.\\\\d+)(?:[Ee][+-]?\\\\d+)?))[%]?)\\\\s*,\\\\s*((?:[-+]?(?:(?:\\\\d+|\\\\d*\\\\.\\\\d+)(?:[Ee][+-]?\\\\d+)?))[%]?)(?:\\\\s*,\\\\s*((?:[-+]?(?:(?:\\\\d+|\\\\d*\\\\.\\\\d+)(?:[Ee][+-]?\\\\d+)?))))?\\\\)\",\n                rgbaNoBackRefs: \"rgb[a]?\\\\((?:(?:[-+]?(?:(?:\\\\d+|\\\\d*\\\\.\\\\d+)(?:[Ee][+-]?\\\\d+)?))[%]?)\\\\s*,\\\\s*(?:(?:[-+]?(?:(?:\\\\d+|\\\\d*\\\\.\\\\d+)(?:[Ee][+-]?\\\\d+)?))[%]?)\\\\s*,\\\\s*(?:(?:[-+]?(?:(?:\\\\d+|\\\\d*\\\\.\\\\d+)(?:[Ee][+-]?\\\\d+)?))[%]?)(?:\\\\s*,\\\\s*(?:(?:[-+]?(?:(?:\\\\d+|\\\\d*\\\\.\\\\d+)(?:[Ee][+-]?\\\\d+)?))))?\\\\)\",\n                hsla: \"hsl[a]?\\\\(((?:[-+]?(?:(?:\\\\d+|\\\\d*\\\\.\\\\d+)(?:[Ee][+-]?\\\\d+)?)))\\\\s*,\\\\s*((?:[-+]?(?:(?:\\\\d+|\\\\d*\\\\.\\\\d+)(?:[Ee][+-]?\\\\d+)?))[%])\\\\s*,\\\\s*((?:[-+]?(?:(?:\\\\d+|\\\\d*\\\\.\\\\d+)(?:[Ee][+-]?\\\\d+)?))[%])(?:\\\\s*,\\\\s*((?:[-+]?(?:(?:\\\\d+|\\\\d*\\\\.\\\\d+)(?:[Ee][+-]?\\\\d+)?))))?\\\\)\",\n                hslaNoBackRefs: \"hsl[a]?\\\\((?:(?:[-+]?(?:(?:\\\\d+|\\\\d*\\\\.\\\\d+)(?:[Ee][+-]?\\\\d+)?)))\\\\s*,\\\\s*(?:(?:[-+]?(?:(?:\\\\d+|\\\\d*\\\\.\\\\d+)(?:[Ee][+-]?\\\\d+)?))[%])\\\\s*,\\\\s*(?:(?:[-+]?(?:(?:\\\\d+|\\\\d*\\\\.\\\\d+)(?:[Ee][+-]?\\\\d+)?))[%])(?:\\\\s*,\\\\s*(?:(?:[-+]?(?:(?:\\\\d+|\\\\d*\\\\.\\\\d+)(?:[Ee][+-]?\\\\d+)?))))?\\\\)\",\n                hex3: \"\\\\#[0-9a-fA-F]{3}\",\n                hex6: \"\\\\#[0-9a-fA-F]{6}\"\n              }\n            };\n          },\n          function(y, x, g) {\n            var o = g(13), c = g(0);\n            y.exports = {\n              camel2dash: o(function(a) {\n                return a.replace(/([A-Z])/g, function(n) {\n                  return \"-\" + n.toLowerCase();\n                });\n              }),\n              dash2camel: o(function(a) {\n                return a.replace(/(-\\w)/g, function(n) {\n                  return n[1].toUpperCase();\n                });\n              }),\n              prependCamel: o(\n                function(a, n) {\n                  return a + n[0].toUpperCase() + n.substring(1);\n                },\n                function(a, n) {\n                  return a + \"$\" + n;\n                }\n              ),\n              capitalize: function(a) {\n                return c.emptyString(a) ? a : a.charAt(0).toUpperCase() + a.substring(1);\n              }\n            };\n          },\n          function(y, x, g) {\n            var o = g(3), c = o ? o.performance : null, a = {}, n = c && c.now ? function() {\n              return c.now();\n            } : function() {\n              return Date.now();\n            }, t = function() {\n              if (o) {\n                if (o.requestAnimationFrame)\n                  return function(r) {\n                    o.requestAnimationFrame(r);\n                  };\n                if (o.mozRequestAnimationFrame)\n                  return function(r) {\n                    o.mozRequestAnimationFrame(r);\n                  };\n                if (o.webkitRequestAnimationFrame)\n                  return function(r) {\n                    o.webkitRequestAnimationFrame(r);\n                  };\n                if (o.msRequestAnimationFrame)\n                  return function(r) {\n                    o.msRequestAnimationFrame(r);\n                  };\n              }\n              return function(r) {\n                r && setTimeout(function() {\n                  r(n());\n                }, 1e3 / 60);\n              };\n            }();\n            a.requestAnimationFrame = function(r) {\n              t(r);\n            }, a.performanceNow = n, a.debounce = g(26), a.now = function() {\n              return Date.now();\n            }, y.exports = a;\n          },\n          function(y, x) {\n            y.exports = w;\n          },\n          function(y, x, g) {\n            function o(c, a) {\n              return c < a ? -1 : c > a ? 1 : 0;\n            }\n            y.exports = {\n              sort: {\n                ascending: o,\n                descending: function(c, a) {\n                  return -1 * o(c, a);\n                }\n              }\n            };\n          },\n          function(y, x, g) {\n            function o() {\n              this._obj = {};\n            }\n            var c = o.prototype;\n            c.set = function(a, n) {\n              this._obj[a] = n;\n            }, c.delete = function(a) {\n              this._obj[a] = null;\n            }, c.has = function(a) {\n              return this._obj[a] != null;\n            }, c.get = function(a) {\n              return this._obj[a];\n            }, y.exports = o;\n          },\n          function(y, x, g) {\n            var o = g(1), c = {};\n            [\n              g(30),\n              g(31),\n              g(33),\n              g(34),\n              g(35),\n              g(36),\n              g(37),\n              g(38),\n              g(39),\n              g(40),\n              g(41)\n            ].forEach(function(a) {\n              o.extend(c, a);\n            }), y.exports = c;\n          },\n          function(y, x, g) {\n            var o = g(0), c = function(n) {\n              return n = { bfs: n.bfs || !n.dfs, dfs: n.dfs || !n.bfs }, function(t, r, l) {\n                var h;\n                o.plainObject(t) && !o.elementOrCollection(t) && (t = (h = t).roots || h.root, r = h.visit, l = h.directed), l = arguments.length !== 2 || o.fn(r) ? l : r, r = o.fn(r) ? r : function() {\n                };\n                for (var i, d = this._private.cy, p = t = o.string(t) ? this.filter(t) : t, f = [], v = [], k = {}, s = {}, S = {}, j = 0, I = this.nodes(), R = this.edges(), M = 0; M < p.length; M++)\n                  p[M].isNode() && (f.unshift(p[M]), n.bfs && (S[p[M].id()] = !0, v.push(p[M])), s[p[M].id()] = 0);\n                for (; f.length !== 0; ) {\n                  if (p = n.bfs ? f.shift() : f.pop(), n.dfs) {\n                    if (S[p.id()]) continue;\n                    S[p.id()] = !0, v.push(p);\n                  }\n                  var z, V = s[p.id()], G = k[p.id()], Y = G == null ? void 0 : G.connectedNodes().not(p)[0];\n                  if ((z = r(p, G, Y, j++, V)) === !0) {\n                    i = p;\n                    break;\n                  }\n                  if (z === !1) break;\n                  var tt = p.connectedEdges(\n                    l ? function(ot) {\n                      return ot.data(\"source\") === p.id();\n                    } : void 0\n                  ).intersect(R);\n                  for (M = 0; M < tt.length; M++) {\n                    var Z = tt[M], at = Z.connectedNodes(function(ot) {\n                      return ot.id() !== p.id();\n                    }).intersect(I);\n                    at.length === 0 || S[at.id()] || (at = at[0], f.push(at), n.bfs && (S[at.id()] = !0, v.push(at)), k[at.id()] = Z, s[at.id()] = s[p.id()] + 1);\n                  }\n                }\n                var nt = [];\n                for (M = 0; M < v.length; M++) {\n                  var ht = v[M], ct = k[ht.id()];\n                  ct && nt.push(ct), nt.push(ht);\n                }\n                return {\n                  path: d.collection(nt, { unique: !0 }),\n                  found: d.collection(i)\n                };\n              };\n            }, a = {\n              breadthFirstSearch: c({ bfs: !0 }),\n              depthFirstSearch: c({ dfs: !0 })\n            };\n            a.bfs = a.breadthFirstSearch, a.dfs = a.depthFirstSearch, y.exports = a;\n          },\n          function(y, x, g) {\n            var o = g(0), c = g(9), a = {\n              dijkstra: function(n, t, r) {\n                var l;\n                o.plainObject(n) && !o.elementOrCollection(n) && (n = (l = n).root, t = l.weight, r = l.directed);\n                var h = this._private.cy;\n                t = o.fn(t) ? t : function() {\n                  return 1;\n                };\n                for (var i = o.string(n) ? this.filter(n)[0] : n[0], d = {}, p = {}, f = {}, v = this.edges().filter(function(ht) {\n                  return !ht.isLoop();\n                }), k = this.nodes(), s = function(ht) {\n                  return d[ht.id()];\n                }, S = function(ht, ct) {\n                  d[ht.id()] = ct, j.updateItem(ht);\n                }, j = new c(function(ht, ct) {\n                  return s(ht) - s(ct);\n                }), I = 0; I < k.length; I++) {\n                  var R = k[I];\n                  d[R.id()] = R.same(i) ? 0 : 1 / 0, j.push(R);\n                }\n                for (var M = function(ht, ct) {\n                  for (var ot, gt = (r ? ht.edgesTo(ct) : ht.edgesWith(ct)).intersect(\n                    v\n                  ), xt = 1 / 0, St = 0; St < gt.length; St++) {\n                    var zt = gt[St], Nt = t(zt);\n                    (Nt < xt || !ot) && (xt = Nt, ot = zt);\n                  }\n                  return { edge: ot, dist: xt };\n                }; j.size() > 0; ) {\n                  var z = j.pop(), V = s(z), G = z.id();\n                  if (f[G] = V, V !== 1 / 0) {\n                    var Y = z.neighborhood().intersect(k);\n                    for (I = 0; I < Y.length; I++) {\n                      var tt = Y[I], Z = tt.id(), at = M(z, tt), nt = V + at.dist;\n                      nt < s(tt) && (S(tt, nt), p[Z] = { node: z, edge: at.edge });\n                    }\n                  }\n                }\n                return {\n                  distanceTo: function(ht) {\n                    var ct = o.string(ht) ? k.filter(ht)[0] : ht[0];\n                    return f[ct.id()];\n                  },\n                  pathTo: function(ht) {\n                    var ct = o.string(ht) ? k.filter(ht)[0] : ht[0], ot = [], gt = ct;\n                    if (ct.length > 0)\n                      for (ot.unshift(ct); p[gt.id()]; ) {\n                        var xt = p[gt.id()];\n                        ot.unshift(xt.edge), ot.unshift(xt.node), gt = xt.node;\n                      }\n                    return h.collection(ot);\n                  }\n                };\n              }\n            };\n            y.exports = a;\n          },\n          function(y, x) {\n            y.exports = E;\n          },\n          function(y, x, g) {\n            var o = g(0), c = {\n              kruskal: function(a) {\n                var n = this.cy();\n                function t(S) {\n                  for (var j = 0; j < l.length; j++) {\n                    var I = l[j];\n                    if (I.anySame(S)) return { eles: I, index: j };\n                  }\n                }\n                a = o.fn(a) ? a : function() {\n                  return 1;\n                };\n                for (var r = n.collection(n, []), l = [], h = this.nodes(), i = 0; i < h.length; i++)\n                  l.push(h[i].collection());\n                var d = this.edges().toArray().sort(function(S, j) {\n                  return a(S) - a(j);\n                });\n                for (i = 0; i < d.length; i++) {\n                  var p = d[i], f = p.source()[0], v = p.target()[0], k = t(f), s = t(v);\n                  k.index !== s.index && (r = r.add(p), l[k.index] = k.eles.add(s.eles), l.splice(s.index, 1));\n                }\n                return h.add(r);\n              }\n            };\n            y.exports = c;\n          },\n          function(y, x, g) {\n            var o = g(0), c = {\n              aStar: function(a) {\n                a = a || {};\n                var n = function xt(St, zt, Nt, re) {\n                  if (St == zt) return re.unshift(r.getElementById(zt)), re;\n                  if (zt in Nt) {\n                    var be = Nt[zt], ne = j[zt];\n                    return re.unshift(r.getElementById(ne)), re.unshift(r.getElementById(zt)), xt(St, be, Nt, re);\n                  }\n                }, t = function(xt, St) {\n                  if (xt.length !== 0) {\n                    for (var zt = 0, Nt = St[xt[0]], re = 1; re < xt.length; re++) {\n                      var be = St[xt[re]];\n                      be < Nt && (Nt = be, zt = re);\n                    }\n                    return zt;\n                  }\n                }, r = this._private.cy;\n                if (a != null && a.root != null) {\n                  var l = o.string(a.root) ? this.filter(a.root)[0] : a.root[0];\n                  if (a.goal != null) {\n                    var h = o.string(a.goal) ? this.filter(a.goal)[0] : a.goal[0];\n                    if (a.heuristic != null && o.fn(a.heuristic))\n                      var i = a.heuristic;\n                    else\n                      i = function() {\n                        return 0;\n                      };\n                    if (a.weight != null && o.fn(a.weight))\n                      var d = a.weight;\n                    else\n                      d = function(xt) {\n                        return 1;\n                      };\n                    if (a.directed != null) var p = a.directed;\n                    else p = !1;\n                    var f = l.id(), v = h.id(), k = [], s = [f], S = {}, j = {}, I = {}, R = {};\n                    I[f] = 0, R[f] = i(l);\n                    for (var M = 0; s.length > 0; ) {\n                      var z = t(s, R), V = r.getElementById(s[z]), G = V.id();\n                      if (M++, G == v) {\n                        var Y = n(f, v, S, []);\n                        return {\n                          found: !0,\n                          distance: I[G],\n                          path: this.spawn(Y),\n                          steps: M\n                        };\n                      }\n                      k.push(G), s.splice(z, 1);\n                      for (var tt = V._private.edges, Z = 0; Z < tt.length; Z++) {\n                        var at = tt[Z];\n                        if (this.hasElementWithId(at.id()) && (!p || at.data(\"source\") === G)) {\n                          var nt = at.source(), ht = at.target(), ct = nt.id() !== G ? nt : ht, ot = ct.id();\n                          if (this.hasElementWithId(ot) && k.indexOf(ot) == -1) {\n                            var gt = I[G] + d(at);\n                            s.indexOf(ot) != -1 ? gt < I[ot] && (I[ot] = gt, R[ot] = gt + i(ct), S[ot] = G) : (I[ot] = gt, R[ot] = gt + i(ct), s.push(ot), S[ot] = G, j[ot] = at.id());\n                          }\n                        }\n                      }\n                    }\n                    return {\n                      found: !1,\n                      distance: void 0,\n                      path: void 0,\n                      steps: M\n                    };\n                  }\n                }\n              }\n            };\n            y.exports = c;\n          },\n          function(y, x, g) {\n            var o = g(0), c = {\n              floydWarshall: function(a) {\n                a = a || {};\n                var n = this.cy();\n                if (a.weight != null && o.fn(a.weight)) var t = a.weight;\n                else\n                  t = function(G) {\n                    return 1;\n                  };\n                if (a.directed != null) var r = a.directed;\n                else r = !1;\n                for (var l = this.edges().stdFilter(function(G) {\n                  return !G.isLoop();\n                }), h = this.nodes(), i = h.length, d = {}, p = 0; p < i; p++)\n                  d[h[p].id()] = p;\n                var f = [];\n                for (p = 0; p < i; p++) {\n                  for (var v = new Array(i), k = 0; k < i; k++)\n                    v[k] = p == k ? 0 : 1 / 0;\n                  f.push(v);\n                }\n                var s = [], S = [], j = function(G) {\n                  for (var Y = 0; Y < i; Y++) {\n                    for (var tt = new Array(i), Z = 0; Z < i; Z++)\n                      tt[Z] = void 0;\n                    G.push(tt);\n                  }\n                };\n                for (j(s), j(S), p = 0; p < l.length; p++) {\n                  var I = d[l[p].source().id()], R = d[l[p].target().id()], M = t(l[p]);\n                  f[I][R] > M && (f[I][R] = M, s[I][R] = R, S[I][R] = l[p]);\n                }\n                if (!r)\n                  for (p = 0; p < l.length; p++)\n                    I = d[l[p].target().id()], R = d[l[p].source().id()], M = t(l[p]), f[I][R] > M && (f[I][R] = M, s[I][R] = R, S[I][R] = l[p]);\n                for (var z = 0; z < i; z++)\n                  for (p = 0; p < i; p++)\n                    for (k = 0; k < i; k++)\n                      f[p][z] + f[z][k] < f[p][k] && (f[p][k] = f[p][z] + f[z][k], s[p][k] = s[p][z]);\n                var V = [];\n                for (p = 0; p < i; p++) V.push(h[p].id());\n                return {\n                  distance: function(G, Y) {\n                    if (o.string(G)) var tt = n.filter(G)[0].id();\n                    else tt = G.id();\n                    if (o.string(Y)) var Z = n.filter(Y)[0].id();\n                    else Z = Y.id();\n                    return f[d[tt]][d[Z]];\n                  },\n                  path: function(G, Y) {\n                    if (o.string(G)) var tt = n.filter(G)[0].id();\n                    else tt = G.id();\n                    if (o.string(Y)) var Z = n.filter(Y)[0].id();\n                    else Z = Y.id();\n                    var at = function(nt, ht, ct, ot, gt) {\n                      if (nt === ht) return n.getElementById(ot[nt]);\n                      if (ct[nt][ht] !== void 0) {\n                        for (var xt = [n.getElementById(ot[nt])], St = nt; nt !== ht; ) {\n                          St = nt, nt = ct[nt][ht];\n                          var zt = gt[St][nt];\n                          xt.push(zt), xt.push(n.getElementById(ot[nt]));\n                        }\n                        return xt;\n                      }\n                    }(d[tt], d[Z], s, V, S);\n                    return n.collection(at);\n                  }\n                };\n              }\n            };\n            y.exports = c;\n          },\n          function(y, x, g) {\n            var o = g(0), c = g(1), a = {\n              bellmanFord: function(n) {\n                var t = this;\n                if ((n = n || {}).weight != null && o.fn(n.weight))\n                  var r = n.weight;\n                else\n                  r = function(tt) {\n                    return 1;\n                  };\n                if (n.directed != null) var l = n.directed;\n                else l = !1;\n                if (n.root != null) {\n                  if (o.string(n.root)) var h = this.filter(n.root)[0];\n                  else h = n.root[0];\n                  for (var i = this._private.cy, d = this.edges().stdFilter(function(tt) {\n                    return !tt.isLoop();\n                  }), p = this.nodes(), f = p.length, v = {}, k = 0; k < f; k++)\n                    v[p[k].id()] = k;\n                  var s = [], S = [], j = [];\n                  for (k = 0; k < f; k++)\n                    p[k].id() === h.id() ? s[k] = 0 : s[k] = 1 / 0, S[k] = void 0;\n                  var I = !1;\n                  for (k = 1; k < f; k++) {\n                    I = !1;\n                    for (var R = 0; R < d.length; R++) {\n                      var M, z = v[d[R].source().id()], V = v[d[R].target().id()], G = r(d[R]);\n                      (M = s[z] + G) < s[V] && (s[V] = M, S[V] = z, j[V] = d[R], I = !0), l || (M = s[V] + G) < s[z] && (s[z] = M, S[z] = V, j[z] = d[R], I = !0);\n                    }\n                    if (!I) break;\n                  }\n                  if (I) {\n                    for (R = 0; R < d.length; R++)\n                      if (z = v[d[R].source().id()], V = v[d[R].target().id()], G = r(d[R]), s[z] + G < s[V])\n                        return c.error(\n                          \"Graph contains a negative weight cycle for Bellman-Ford\"\n                        ), {\n                          pathTo: void 0,\n                          distanceTo: void 0,\n                          hasNegativeWeightCycle: !0\n                        };\n                  }\n                  var Y = [];\n                  for (k = 0; k < f; k++) Y.push(p[k].id());\n                  return {\n                    distanceTo: function(tt) {\n                      if (o.string(tt)) var Z = i.filter(tt)[0].id();\n                      else Z = tt.id();\n                      return s[v[Z]];\n                    },\n                    pathTo: function(tt) {\n                      if (o.string(tt)) var Z = i.filter(tt)[0].id();\n                      else Z = tt.id();\n                      var at = function(nt, ht, ct, ot, gt, xt) {\n                        for (; ; ) {\n                          if (gt.push(i.getElementById(ot[ct])), gt.push(xt[ct]), ht === ct)\n                            return gt;\n                          var St = nt[ct];\n                          if (St === void 0) return;\n                          ct = St;\n                        }\n                      }(S, v[h.id()], v[Z], Y, [], j);\n                      return at != null && at.reverse(), t.spawn(at);\n                    },\n                    hasNegativeWeightCycle: !1\n                  };\n                }\n              }\n            };\n            y.exports = a;\n          },\n          function(y, x, g) {\n            var o = g(1), c = {\n              kargerStein: function(a) {\n                var n = function ht(ct, ot, gt, xt) {\n                  return gt <= xt ? ot : ht(\n                    ct,\n                    function(St, zt, Nt) {\n                      for (var re = Nt[St], be = re[1], ne = re[2], ce = zt[be], xe = zt[ne], we = Nt.filter(function(lt) {\n                        return !(zt[lt[1]] === ce && zt[lt[2]] === xe || zt[lt[1]] === xe && zt[lt[2]] === ce);\n                      }), ae = 0; ae < we.length; ae++) {\n                        var Le = we[ae];\n                        Le[1] === xe ? (we[ae] = Le.slice(0), we[ae][1] = ce) : Le[2] === xe && (we[ae] = Le.slice(0), we[ae][2] = ce);\n                      }\n                      for (ae = 0; ae < zt.length; ae++)\n                        zt[ae] === xe && (zt[ae] = ce);\n                      return we;\n                    }(Math.floor(Math.random() * ot.length), ct, ot),\n                    gt - 1,\n                    xt\n                  );\n                }, t = this._private.cy, r = this.edges().stdFilter(function(ht) {\n                  return !ht.isLoop();\n                }), l = this.nodes(), h = l.length, i = r.length, d = Math.ceil(Math.pow(Math.log(h) / Math.LN2, 2)), p = Math.floor(h / Math.sqrt(2));\n                if (!(h < 2)) {\n                  for (var f = {}, v = 0; v < h; v++) f[l[v].id()] = v;\n                  var k = [];\n                  for (v = 0; v < i; v++) {\n                    var s = r[v];\n                    k.push([v, f[s.source().id()], f[s.target().id()]]);\n                  }\n                  var S, j = 1 / 0, I = [];\n                  for (v = 0; v < h; v++) I.push(v);\n                  for (var R = 0; R <= d; R++) {\n                    var M = I.slice(0), z = n(M, k, h, p), V = M.slice(0), G = n(M, z, p, 2), Y = n(V, z, p, 2);\n                    G.length <= Y.length && G.length < j ? (j = G.length, S = [G, M]) : Y.length <= G.length && Y.length < j && (j = Y.length, S = [Y, V]);\n                  }\n                  var tt = S[0].map(function(ht) {\n                    return r[ht[0]];\n                  }), Z = [], at = [], nt = S[1][0];\n                  for (v = 0; v < S[1].length; v++)\n                    S[1][v] === nt ? Z.push(l[v]) : at.push(l[v]);\n                  return {\n                    cut: this.spawn(t, tt),\n                    partition1: this.spawn(Z),\n                    partition2: this.spawn(at)\n                  };\n                }\n                o.error(\n                  \"At least 2 nodes are required for Karger-Stein algorithm\"\n                );\n              }\n            };\n            y.exports = c;\n          },\n          function(y, x, g) {\n            var o = g(0), c = {\n              pageRank: function(a) {\n                var n = function(gt) {\n                  for (var xt = gt.length, St = 0, zt = 0; zt < xt; zt++)\n                    St += gt[zt];\n                  for (zt = 0; zt < xt; zt++) gt[zt] = gt[zt] / St;\n                };\n                if ((a = a || {}) != null && a.dampingFactor != null)\n                  var t = a.dampingFactor;\n                else t = 0.8;\n                if (a != null && a.precision != null) var r = a.precision;\n                else r = 1e-6;\n                if (a != null && a.iterations != null) var l = a.iterations;\n                else l = 200;\n                if (a != null && a.weight != null && o.fn(a.weight))\n                  var h = a.weight;\n                else\n                  h = function(gt) {\n                    return 1;\n                  };\n                for (var i = this._private.cy, d = this.edges().stdFilter(function(gt) {\n                  return !gt.isLoop();\n                }), p = this.nodes(), f = p.length, v = d.length, k = {}, s = 0; s < f; s++)\n                  k[p[s].id()] = s;\n                var S = [], j = [], I = (1 - t) / f;\n                for (s = 0; s < f; s++) {\n                  for (var R = [], M = 0; M < f; M++) R.push(0);\n                  S.push(R), j.push(0);\n                }\n                for (s = 0; s < v; s++) {\n                  var z = d[s], V = k[z.source().id()], G = k[z.target().id()], Y = h(z);\n                  S[G][V] += Y, j[V] += Y;\n                }\n                var tt = 1 / f + I;\n                for (M = 0; M < f; M++)\n                  if (j[M] === 0) for (s = 0; s < f; s++) S[s][M] = tt;\n                  else for (s = 0; s < f; s++) S[s][M] = S[s][M] / j[M] + I;\n                var Z, at = [], nt = [];\n                for (s = 0; s < f; s++) at.push(1), nt.push(0);\n                for (var ht = 0; ht < l; ht++) {\n                  var ct = nt.slice(0);\n                  for (s = 0; s < f; s++)\n                    for (M = 0; M < f; M++) ct[s] += S[s][M] * at[M];\n                  n(ct), Z = at, at = ct;\n                  var ot = 0;\n                  for (s = 0; s < f; s++) ot += Math.pow(Z[s] - at[s], 2);\n                  if (ot < r) break;\n                }\n                return {\n                  rank: function(gt) {\n                    if (o.string(gt)) var xt = i.filter(gt)[0].id();\n                    else xt = gt.id();\n                    return at[k[xt]];\n                  }\n                };\n              }\n            };\n            y.exports = c;\n          },\n          function(y, x, g) {\n            var o = g(0), c = g(1), a = {\n              degreeCentralityNormalized: function(n) {\n                n = n || {};\n                var t = this.cy();\n                if (n.directed != null) var r = n.directed;\n                else r = !1;\n                var l = this.nodes(), h = l.length;\n                if (r) {\n                  var i = {}, d = {}, p = 0, f = 0;\n                  for (s = 0; s < h; s++)\n                    S = l[s], j = this.degreeCentrality(\n                      c.extend({}, n, { root: S })\n                    ), p < j.indegree && (p = j.indegree), f < j.outdegree && (f = j.outdegree), i[S.id()] = j.indegree, d[S.id()] = j.outdegree;\n                  return {\n                    indegree: function(I) {\n                      return p == 0 ? 0 : (I = o.string(I) ? t.filter(I)[0].id() : I.id(), i[I] / p);\n                    },\n                    outdegree: function(I) {\n                      return f == 0 ? 0 : (I = o.string(I) ? t.filter(I)[0].id() : I.id(), d[I] / f);\n                    }\n                  };\n                }\n                for (var v = {}, k = 0, s = 0; s < h; s++) {\n                  var S = l[s], j = this.degreeCentrality(c.extend({}, n, { root: S }));\n                  k < j.degree && (k = j.degree), v[S.id()] = j.degree;\n                }\n                return {\n                  degree: function(I) {\n                    return k == 0 ? 0 : (I = o.string(I) ? t.filter(I)[0].id() : I.id(), v[I] / k);\n                  }\n                };\n              },\n              degreeCentrality: function(n) {\n                if ((n = n || {}) != null && n.root != null) {\n                  var t = o.string(n.root) ? this.filter(n.root)[0] : n.root[0];\n                  if (n.weight != null && o.fn(n.weight)) var r = n.weight;\n                  else\n                    r = function(R) {\n                      return 1;\n                    };\n                  if (n.directed != null) var l = n.directed;\n                  else l = !1;\n                  if (n.alpha != null && o.number(n.alpha)) var h = n.alpha;\n                  else h = 0;\n                  if (l) {\n                    var i = t.connectedEdges('edge[target = \"' + t.id() + '\"]').intersection(this), d = t.connectedEdges('edge[source = \"' + t.id() + '\"]').intersection(this), p = i.length, f = d.length, v = 0, k = 0;\n                    for (I = 0; I < i.length; I++) v += r(i[I]);\n                    for (I = 0; I < d.length; I++) k += r(d[I]);\n                    return {\n                      indegree: Math.pow(p, 1 - h) * Math.pow(v, h),\n                      outdegree: Math.pow(f, 1 - h) * Math.pow(k, h)\n                    };\n                  }\n                  for (var s = t.connectedEdges().intersection(this), S = s.length, j = 0, I = 0; I < s.length; I++)\n                    j += r(s[I]);\n                  return { degree: Math.pow(S, 1 - h) * Math.pow(j, h) };\n                }\n              }\n            };\n            a.dc = a.degreeCentrality, a.dcn = a.degreeCentralityNormalised = a.degreeCentralityNormalized, y.exports = a;\n          },\n          function(y, x, g) {\n            var o = g(0), c = {\n              closenessCentralityNormalized: function(a) {\n                a = a || {};\n                var n = this.cy(), t = a.harmonic;\n                t === void 0 && (t = !0);\n                for (var r = {}, l = 0, h = this.nodes(), i = this.floydWarshall({\n                  weight: a.weight,\n                  directed: a.directed\n                }), d = 0; d < h.length; d++) {\n                  for (var p = 0, f = 0; f < h.length; f++)\n                    if (d != f) {\n                      var v = i.distance(h[d], h[f]);\n                      p += t ? 1 / v : v;\n                    }\n                  t || (p = 1 / p), l < p && (l = p), r[h[d].id()] = p;\n                }\n                return {\n                  closeness: function(k) {\n                    return l == 0 ? 0 : (k = o.string(k) ? n.filter(k)[0].id() : k.id(), r[k] / l);\n                  }\n                };\n              },\n              closenessCentrality: function(a) {\n                if ((a = a || {}).root != null) {\n                  if (o.string(a.root)) var n = this.filter(a.root)[0];\n                  else n = a.root[0];\n                  if (a.weight != null && o.fn(a.weight)) var t = a.weight;\n                  else\n                    t = function() {\n                      return 1;\n                    };\n                  if (a.directed != null && o.bool(a.directed))\n                    var r = a.directed;\n                  else r = !1;\n                  var l = a.harmonic;\n                  l === void 0 && (l = !0);\n                  for (var h = this.dijkstra({\n                    root: n,\n                    weight: t,\n                    directed: r\n                  }), i = 0, d = this.nodes(), p = 0; p < d.length; p++)\n                    if (d[p].id() != n.id()) {\n                      var f = h.distanceTo(d[p]);\n                      i += l ? 1 / f : f;\n                    }\n                  return l ? i : 1 / i;\n                }\n              }\n            };\n            c.cc = c.closenessCentrality, c.ccn = c.closenessCentralityNormalised = c.closenessCentralityNormalized, y.exports = c;\n          },\n          function(y, x, g) {\n            var o = g(0), c = g(9), a = {\n              betweennessCentrality: function(n) {\n                var t, r;\n                n = n || {}, o.fn(n.weight) ? (r = n.weight, t = !0) : t = !1;\n                for (var l = n.directed != null && n.directed, h = this._private.cy, i = this.nodes(), d = {}, p = {}, f = 0, v = function(ot, gt) {\n                  p[ot] = gt, gt > f && (f = gt);\n                }, k = function(ot) {\n                  return p[ot];\n                }, s = 0; s < i.length; s++)\n                  d[G = (Y = i[s]).id()] = l ? Y.outgoers().nodes() : Y.openNeighborhood().nodes(), v(G, 0);\n                for (var S = 0; S < i.length; S++) {\n                  var j = i[S].id(), I = [], R = {}, M = {}, z = {}, V = new c(function(ot, gt) {\n                    return z[ot] - z[gt];\n                  });\n                  for (s = 0; s < i.length; s++) {\n                    var G;\n                    R[G = i[s].id()] = [], M[G] = 0, z[G] = 1 / 0;\n                  }\n                  for (M[j] = 1, z[j] = 0, V.push(j); !V.empty(); ) {\n                    var Y = V.pop();\n                    if (I.push(Y), t)\n                      for (var tt = 0; tt < d[Y].length; tt++) {\n                        var Z = d[Y][tt], at = h.getElementById(Y), nt = r(\n                          at.edgesTo(Z).length > 0 ? at.edgesTo(Z)[0] : Z.edgesTo(at)[0]\n                        );\n                        Z = Z.id(), z[Z] > z[Y] + nt && (z[Z] = z[Y] + nt, V.nodes.indexOf(Z) < 0 ? V.push(Z) : V.updateItem(Z), M[Z] = 0, R[Z] = []), z[Z] == z[Y] + nt && (M[Z] = M[Z] + M[Y], R[Z].push(Y));\n                      }\n                    else\n                      for (tt = 0; tt < d[Y].length; tt++)\n                        Z = d[Y][tt].id(), z[Z] == 1 / 0 && (V.push(Z), z[Z] = z[Y] + 1), z[Z] == z[Y] + 1 && (M[Z] = M[Z] + M[Y], R[Z].push(Y));\n                  }\n                  var ht = {};\n                  for (s = 0; s < i.length; s++) ht[i[s].id()] = 0;\n                  for (; I.length > 0; )\n                    for (Z = I.pop(), tt = 0; tt < R[Z].length; tt++)\n                      ht[Y = R[Z][tt]] = ht[Y] + M[Y] / M[Z] * (1 + ht[Z]), Z != i[S].id() && v(Z, k(Z) + ht[Z]);\n                }\n                var ct = {\n                  betweenness: function(ot) {\n                    return ot = o.string(ot) ? h.filter(ot).id() : ot.id(), k(ot);\n                  },\n                  betweennessNormalized: function(ot) {\n                    return f == 0 ? 0 : (ot = o.string(ot) ? h.filter(ot).id() : ot.id(), k(ot) / f);\n                  }\n                };\n                return ct.betweennessNormalised = ct.betweennessNormalized, ct;\n              }\n            };\n            a.bc = a.betweennessCentrality, y.exports = a;\n          },\n          function(y, x, g) {\n            var o = g(4), c = {\n              animate: o.animate(),\n              animation: o.animation(),\n              animated: o.animated(),\n              clearQueue: o.clearQueue(),\n              delay: o.delay(),\n              delayAnimation: o.delayAnimation(),\n              stop: o.stop()\n            };\n            y.exports = c;\n          },\n          function(y, x, g) {\n            var o = g(1), c = g(44), a = g(2), n = g(0), t = {\n              animated: function() {\n                return function() {\n                  var r = this.length !== void 0 ? this : [this];\n                  if (!(this._private.cy || this).styleEnabled()) return !1;\n                  var l = r[0];\n                  return l ? l._private.animation.current.length > 0 : void 0;\n                };\n              },\n              clearQueue: function() {\n                return function() {\n                  var r = this.length !== void 0 ? this : [this];\n                  if (!(this._private.cy || this).styleEnabled())\n                    return this;\n                  for (var l = 0; l < r.length; l++)\n                    r[l]._private.animation.queue = [];\n                  return this;\n                };\n              },\n              delay: function() {\n                return function(r, l) {\n                  return (this._private.cy || this).styleEnabled() ? this.animate({ delay: r, duration: r, complete: l }) : this;\n                };\n              },\n              delayAnimation: function() {\n                return function(r, l) {\n                  return (this._private.cy || this).styleEnabled() ? this.animation({ delay: r, duration: r, complete: l }) : this;\n                };\n              },\n              animation: function() {\n                return function(r, l) {\n                  var h = this.length !== void 0, i = h ? this : [this], d = this._private.cy || this, p = !h, f = !p;\n                  if (!d.styleEnabled()) return this;\n                  var v = d.style();\n                  if (r = o.assign({}, r, l), Object.keys(r).length === 0)\n                    return new c(i[0], r);\n                  switch (r.duration === void 0 && (r.duration = 400), r.duration) {\n                    case \"slow\":\n                      r.duration = 600;\n                      break;\n                    case \"fast\":\n                      r.duration = 200;\n                  }\n                  if (f && (r.style = v.getPropsList(r.style || r.css), r.css = void 0), f && r.renderedPosition != null) {\n                    var k = r.renderedPosition, s = d.pan(), S = d.zoom();\n                    r.position = a.renderedToModelPosition(k, S, s);\n                  }\n                  if (p && r.panBy != null) {\n                    var j = r.panBy, I = d.pan();\n                    r.pan = { x: I.x + j.x, y: I.y + j.y };\n                  }\n                  var R = r.center || r.centre;\n                  if (p && R != null) {\n                    var M = d.getCenterPan(R.eles, r.zoom);\n                    M != null && (r.pan = M);\n                  }\n                  if (p && r.fit != null) {\n                    var z = r.fit, V = d.getFitViewport(\n                      z.eles || z.boundingBox,\n                      z.padding\n                    );\n                    V != null && (r.pan = V.pan, r.zoom = V.zoom);\n                  }\n                  if (p && n.plainObject(r.zoom)) {\n                    var G = d.getZoomedViewport(r.zoom);\n                    G != null && (G.zoomed && (r.zoom = G.zoom), G.panned && (r.pan = G.pan));\n                  }\n                  return new c(i[0], r);\n                };\n              },\n              animate: function() {\n                return function(r, l) {\n                  var h = this.length !== void 0 ? this : [this];\n                  if (!(this._private.cy || this).styleEnabled())\n                    return this;\n                  l && (r = o.extend({}, r, l));\n                  for (var i = 0; i < h.length; i++) {\n                    var d = h[i], p = d.animated() && (r.queue === void 0 || r.queue);\n                    d.animation(r, p ? { queue: !0 } : void 0).play();\n                  }\n                  return this;\n                };\n              },\n              stop: function() {\n                return function(r, l) {\n                  var h = this.length !== void 0 ? this : [this], i = this._private.cy || this;\n                  if (!i.styleEnabled()) return this;\n                  for (var d = 0; d < h.length; d++) {\n                    for (var p = h[d]._private, f = p.animation.current, v = 0; v < f.length; v++) {\n                      var k = f[v]._private;\n                      l && (k.duration = 0);\n                    }\n                    r && (p.animation.queue = []), l || (p.animation.current = []);\n                  }\n                  return i.notify({ eles: this, type: \"draw\" }), this;\n                };\n              }\n            };\n            y.exports = t;\n          },\n          function(y, x, g) {\n            var o = g(1), c = g(0), a = g(5), n = function(r, l, h) {\n              var i = this._private = o.extend({ duration: 1e3 }, l, h);\n              i.target = r, i.style = i.style || i.css, i.started = !1, i.playing = !1, i.hooked = !1, i.applying = !1, i.progress = 0, i.completes = [], i.frames = [], i.complete && c.fn(i.complete) && i.completes.push(i.complete), this.length = 1, this[0] = this;\n            }, t = n.prototype;\n            o.extend(t, {\n              instanceString: function() {\n                return \"animation\";\n              },\n              hook: function() {\n                var r = this._private;\n                if (!r.hooked) {\n                  var l = r.target._private.animation;\n                  (r.queue ? l.queue : l.current).push(this), c.elementOrCollection(r.target) && r.target.cy().addToAnimationPool(r.target), r.hooked = !0;\n                }\n                return this;\n              },\n              play: function() {\n                var r = this._private;\n                return r.progress === 1 && (r.progress = 0), r.playing = !0, r.started = !1, r.stopped = !1, this.hook(), this;\n              },\n              playing: function() {\n                return this._private.playing;\n              },\n              apply: function() {\n                var r = this._private;\n                return r.applying = !0, r.started = !1, r.stopped = !1, this.hook(), this;\n              },\n              applying: function() {\n                return this._private.applying;\n              },\n              pause: function() {\n                var r = this._private;\n                return r.playing = !1, r.started = !1, this;\n              },\n              stop: function() {\n                var r = this._private;\n                return r.playing = !1, r.started = !1, r.stopped = !0, this;\n              },\n              rewind: function() {\n                return this.progress(0);\n              },\n              fastforward: function() {\n                return this.progress(1);\n              },\n              time: function(r) {\n                var l = this._private;\n                return r === void 0 ? l.progress * l.duration : this.progress(r / l.duration);\n              },\n              progress: function(r) {\n                var l = this._private, h = l.playing;\n                return r === void 0 ? l.progress : (h && this.pause(), l.progress = r, l.started = !1, h && this.play(), this);\n              },\n              completed: function() {\n                return this._private.progress === 1;\n              },\n              reverse: function() {\n                var r = this._private, l = r.playing;\n                l && this.pause(), r.progress = 1 - r.progress, r.started = !1;\n                var h = function(v, k) {\n                  var s = r[v];\n                  s != null && (r[v] = r[k], r[k] = s);\n                };\n                if (h(\"zoom\", \"startZoom\"), h(\"pan\", \"startPan\"), h(\"position\", \"startPosition\"), r.style)\n                  for (var i = 0; i < r.style.length; i++) {\n                    var d = r.style[i], p = d.name, f = r.startStyle[p];\n                    r.startStyle[p] = d, r.style[i] = f;\n                  }\n                return l && this.play(), this;\n              },\n              promise: function(r) {\n                var l = this._private, h = void 0;\n                switch (r) {\n                  case \"frame\":\n                    h = l.frames;\n                    break;\n                  default:\n                  case \"complete\":\n                  case \"completed\":\n                    h = l.completes;\n                }\n                return new a(function(i, d) {\n                  h.push(function() {\n                    i();\n                  });\n                });\n              }\n            }), t.complete = t.completed, y.exports = n;\n          },\n          function(y, x, g) {\n            var o = g(1), c = g(0), a = {\n              data: function(n) {\n                return n = o.extend(\n                  {},\n                  {\n                    field: \"data\",\n                    bindingEvent: \"data\",\n                    allowBinding: !1,\n                    allowSetting: !1,\n                    allowGetting: !1,\n                    settingEvent: \"data\",\n                    settingTriggersEvent: !1,\n                    triggerFnName: \"trigger\",\n                    immutableKeys: {},\n                    updateStyle: !1,\n                    beforeGet: function(t) {\n                    },\n                    beforeSet: function(t, r) {\n                    },\n                    onSet: function(t) {\n                    },\n                    canSet: function(t) {\n                      return !0;\n                    }\n                  },\n                  n\n                ), function(t, r) {\n                  var l = n, h = this.length !== void 0, i = h ? this : [this], d = h ? this[0] : this;\n                  if (c.string(t)) {\n                    if (l.allowGetting && r === void 0) {\n                      var p = void 0;\n                      return d && (l.beforeGet(d), p = d._private[l.field][t]), p;\n                    }\n                    if (l.allowSetting && r !== void 0 && !l.immutableKeys[t]) {\n                      var f = function(tt, Z, at) {\n                        return Z in tt ? Object.defineProperty(tt, Z, {\n                          value: at,\n                          enumerable: !0,\n                          configurable: !0,\n                          writable: !0\n                        }) : tt[Z] = at, tt;\n                      }({}, t, r);\n                      l.beforeSet(this, f);\n                      for (var v = 0, k = i.length; v < k; v++) {\n                        var s = i[v];\n                        l.canSet(s) && (s._private[l.field][t] = r);\n                      }\n                      l.updateStyle && this.updateStyle(), l.onSet(this), l.settingTriggersEvent && this[l.triggerFnName](l.settingEvent);\n                    }\n                  } else if (l.allowSetting && c.plainObject(t)) {\n                    var S = t, j = void 0, I = void 0, R = Object.keys(S);\n                    l.beforeSet(this, S);\n                    for (var M = 0; M < R.length; M++)\n                      if (I = S[j = R[M]], !l.immutableKeys[j])\n                        for (var z = 0; z < i.length; z++) {\n                          var V = i[z];\n                          l.canSet(V) && (V._private[l.field][j] = I);\n                        }\n                    l.updateStyle && this.updateStyle(), l.onSet(this), l.settingTriggersEvent && this[l.triggerFnName](l.settingEvent);\n                  } else if (l.allowBinding && c.fn(t)) {\n                    var G = t;\n                    this.on(l.bindingEvent, G);\n                  } else if (l.allowGetting && t === void 0) {\n                    var Y = void 0;\n                    return d && (l.beforeGet(d), Y = d._private[l.field]), Y;\n                  }\n                  return this;\n                };\n              },\n              removeData: function(n) {\n                return n = o.extend(\n                  {},\n                  {\n                    field: \"data\",\n                    event: \"data\",\n                    triggerFnName: \"trigger\",\n                    triggerEvent: !1,\n                    immutableKeys: {}\n                  },\n                  n\n                ), function(t) {\n                  var r = n, l = this.length !== void 0 ? this : [this];\n                  if (c.string(t)) {\n                    for (var h = t.split(/\\s+/), i = h.length, d = 0; d < i; d++) {\n                      var p = h[d];\n                      if (!c.emptyString(p) && !r.immutableKeys[p])\n                        for (var f = 0, v = l.length; f < v; f++)\n                          l[f]._private[r.field][p] = void 0;\n                    }\n                    r.triggerEvent && this[r.triggerFnName](r.event);\n                  } else if (t === void 0) {\n                    for (var k = 0, s = l.length; k < s; k++)\n                      for (var S = l[k]._private[r.field], j = Object.keys(S), I = 0; I < j.length; I++) {\n                        var R = j[I];\n                        !r.immutableKeys[R] && (S[R] = void 0);\n                      }\n                    r.triggerEvent && this[r.triggerFnName](r.event);\n                  }\n                  return this;\n                };\n              }\n            };\n            y.exports = a;\n          },\n          function(y, x, g) {\n            var o = g(5), c = {\n              eventAliasesOn: function(a) {\n                var n = a;\n                n.addListener = n.listen = n.bind = n.on, n.unlisten = n.unbind = n.off = n.removeListener, n.trigger = n.emit, n.pon = n.promiseOn = function(t, r) {\n                  var l = this, h = Array.prototype.slice.call(arguments, 0);\n                  return new o(function(i, d) {\n                    var p = h.concat([\n                      function(v) {\n                        l.off.apply(l, f), i(v);\n                      }\n                    ]), f = p.concat([]);\n                    l.on.apply(l, p);\n                  });\n                };\n              }\n            };\n            y.exports = c;\n          },\n          function(y, x, g) {\n            var o = g(8), c = {\n              classes: function(a) {\n                a = (a || \"\").match(/\\S+/g) || [];\n                for (var n = this, t = [], r = new o(a), l = function(i) {\n                  var d = n[i], p = d._private, f = p.classes, v = !1;\n                  r.forEach(function(k) {\n                    f.has(k) || (v = !0);\n                  }), v || f.forEach(function(k) {\n                    r.has(k) || (v = !0);\n                  }), v && (p.classes = new o(r), t.push(d));\n                }, h = 0; h < n.length; h++)\n                  l(h);\n                return t.length > 0 && this.spawn(t).updateStyle().emit(\"class\"), n;\n              },\n              addClass: function(a) {\n                return this.toggleClass(a, !0);\n              },\n              hasClass: function(a) {\n                var n = this[0];\n                return n != null && n._private.classes.has(a);\n              },\n              toggleClass: function(a, n) {\n                for (var t = a.match(/\\S+/g) || [], r = [], l = 0, h = this.length; l < h; l++)\n                  for (var i = this[l], d = !1, p = 0; p < t.length; p++) {\n                    var f = t[p], v = i._private.classes, k = v.has(f);\n                    n || n === void 0 && !k ? (v.add(f), k || d || (r.push(i), d = !0)) : (v.delete(f), k && !d && (r.push(i), d = !0));\n                  }\n                return r.length > 0 && this.spawn(r).updateStyle().emit(\"class\"), this;\n              },\n              removeClass: function(a) {\n                return this.toggleClass(a, !1);\n              },\n              flashClass: function(a, n) {\n                var t = this;\n                if (n == null) n = 250;\n                else if (n === 0) return t;\n                return t.addClass(a), setTimeout(function() {\n                  t.removeClass(a);\n                }, n), t;\n              }\n            };\n            y.exports = c;\n          },\n          function(y, x, g) {\n            g(0);\n            var o = g(6), c = {\n              allAre: function(a) {\n                var n = new o(a);\n                return this.every(function(t) {\n                  return n.matches(t);\n                });\n              },\n              is: function(a) {\n                var n = new o(a);\n                return this.some(function(t) {\n                  return n.matches(t);\n                });\n              },\n              some: function(a, n) {\n                for (var t = 0; t < this.length; t++)\n                  if (n ? a.apply(n, [this[t], t, this]) : a(this[t], t, this))\n                    return !0;\n                return !1;\n              },\n              every: function(a, n) {\n                for (var t = 0; t < this.length; t++)\n                  if (!(n ? a.apply(n, [this[t], t, this]) : a(this[t], t, this)))\n                    return !1;\n                return !0;\n              },\n              same: function(a) {\n                return a = this.cy().collection(a), this.length === a.length && this.every(function(n) {\n                  return a.hasElementWithId(n.id());\n                });\n              },\n              anySame: function(a) {\n                return a = this.cy().collection(a), this.some(function(n) {\n                  return a.hasElementWithId(n.id());\n                });\n              },\n              allAreNeighbors: function(a) {\n                a = this.cy().collection(a);\n                var n = this.neighborhood();\n                return a.every(function(t) {\n                  return n.hasElementWithId(t.id());\n                });\n              },\n              contains: function(a) {\n                a = this.cy().collection(a);\n                var n = this;\n                return a.every(function(t) {\n                  return n.hasElementWithId(t.id());\n                });\n              }\n            };\n            c.allAreNeighbours = c.allAreNeighbors, c.has = c.contains, y.exports = c;\n          },\n          function(y, x, g) {\n            var o = g(1), c = g(50), a = g(10), n = function(t) {\n              for (var r = void 0, l = void 0, h = void 0, i = 0; i < c.length; i++) {\n                var d = c[i], p = d.name, f = t.match(d.regexObj);\n                if (f != null) {\n                  l = f, r = d, h = p;\n                  var v = f[0];\n                  t = t.substring(v.length);\n                  break;\n                }\n              }\n              return { expr: r, match: l, name: h, remaining: t };\n            };\n            y.exports = {\n              parse: function(t) {\n                var r = this._private.selectorText = t, l = this[0] = a();\n                for (this.length = 1, r = function(j) {\n                  var I = j.match(/^\\s+/);\n                  if (I) {\n                    var R = I[0];\n                    j = j.substring(R.length);\n                  }\n                  return j;\n                }(r); ; ) {\n                  var h = n(r);\n                  if (h.expr == null)\n                    return o.error(\"The selector `\" + t + \"`is invalid\"), !1;\n                  var i = h.match.slice(1), d = h.expr.populate(this, l, i);\n                  if (d === !1) return !1;\n                  if (d != null && (l = d), (r = h.remaining).match(/^\\s*$/))\n                    break;\n                }\n                for (var p = 0; p < this.length; p++) {\n                  var f = this[p];\n                  if (f.subject != null) {\n                    for (; f.subject !== f; )\n                      if (f.parent != null) {\n                        var v = f.parent, k = f;\n                        k.parent = null, v.child = k, f = v;\n                      } else {\n                        if (f.ancestor == null)\n                          return f.source || f.target || f.connectedNodes ? (o.error(\n                            \"The selector `\" + this.text() + \"` can not contain a subject selector that applies to the source or target of an edge selector\"\n                          ), !1) : (o.error(\n                            \"When adjusting references for the selector `\" + this.text() + \"`, neither parent nor ancestor was found\"\n                          ), !1);\n                        var s = f.ancestor, S = f;\n                        S.ancestor = null, s.descendant = S, f = s;\n                      }\n                    this[p] = f.subject;\n                  }\n                }\n                return !0;\n              }\n            };\n          },\n          function(y, x, g) {\n            var o = function(i, d) {\n              if (Array.isArray(i)) return i;\n              if (Symbol.iterator in Object(i))\n                return function(p, f) {\n                  var v = [], k = !0, s = !1, S = void 0;\n                  try {\n                    for (var j, I = p[Symbol.iterator](); !(k = (j = I.next()).done) && (v.push(j.value), !f || v.length !== f); k = !0) ;\n                  } catch (R) {\n                    s = !0, S = R;\n                  } finally {\n                    try {\n                      !k && I.return && I.return();\n                    } finally {\n                      if (s) throw S;\n                    }\n                  }\n                  return v;\n                }(i, d);\n              throw new TypeError(\n                \"Invalid attempt to destructure non-iterable instance\"\n              );\n            }, c = g(15).stateSelectorRegex, a = g(51), n = g(1), t = g(10), r = function(i) {\n              return i.replace(\n                new RegExp(\"\\\\\\\\(\" + a.metaChar + \")\", \"g\"),\n                function(d, p) {\n                  return p;\n                }\n              );\n            }, l = function(i, d, p) {\n              d === i[i.length - 1] && (i[i.length - 1] = p);\n            }, h = [\n              {\n                name: \"group\",\n                query: !0,\n                regex: \"(\" + a.group + \")\",\n                populate: function(i, d, p) {\n                  var f = o(p, 1)[0];\n                  d.group = f === \"*\" ? f : f + \"s\";\n                }\n              },\n              {\n                name: \"state\",\n                query: !0,\n                regex: c,\n                populate: function(i, d, p) {\n                  var f = o(p, 1)[0];\n                  d.colonSelectors.push(f);\n                }\n              },\n              {\n                name: \"id\",\n                query: !0,\n                regex: \"\\\\#(\" + a.id + \")\",\n                populate: function(i, d, p) {\n                  var f = o(p, 1)[0];\n                  d.ids.push(r(f));\n                }\n              },\n              {\n                name: \"className\",\n                query: !0,\n                regex: \"\\\\.(\" + a.className + \")\",\n                populate: function(i, d, p) {\n                  var f = o(p, 1)[0];\n                  d.classes.push(r(f));\n                }\n              },\n              {\n                name: \"dataExists\",\n                query: !0,\n                regex: \"\\\\[\\\\s*(\" + a.variable + \")\\\\s*\\\\]\",\n                populate: function(i, d, p) {\n                  var f = o(p, 1)[0];\n                  d.data.push({ field: r(f) });\n                }\n              },\n              {\n                name: \"dataCompare\",\n                query: !0,\n                regex: \"\\\\[\\\\s*(\" + a.variable + \")\\\\s*(\" + a.comparatorOp + \")\\\\s*(\" + a.value + \")\\\\s*\\\\]\",\n                populate: function(i, d, p) {\n                  var f = o(p, 3), v = f[0], k = f[1], s = f[2];\n                  s = new RegExp(\"^\" + a.string + \"$\").exec(s) != null ? s.substring(1, s.length - 1) : parseFloat(s), d.data.push({ field: r(v), operator: k, value: s });\n                }\n              },\n              {\n                name: \"dataBool\",\n                query: !0,\n                regex: \"\\\\[\\\\s*(\" + a.boolOp + \")\\\\s*(\" + a.variable + \")\\\\s*\\\\]\",\n                populate: function(i, d, p) {\n                  var f = o(p, 2), v = f[0], k = f[1];\n                  d.data.push({ field: r(k), operator: v });\n                }\n              },\n              {\n                name: \"metaCompare\",\n                query: !0,\n                regex: \"\\\\[\\\\[\\\\s*(\" + a.meta + \")\\\\s*(\" + a.comparatorOp + \")\\\\s*(\" + a.number + \")\\\\s*\\\\]\\\\]\",\n                populate: function(i, d, p) {\n                  var f = o(p, 3), v = f[0], k = f[1], s = f[2];\n                  d.meta.push({\n                    field: r(v),\n                    operator: k,\n                    value: parseFloat(s)\n                  });\n                }\n              },\n              {\n                name: \"nextQuery\",\n                separator: !0,\n                regex: a.separator,\n                populate: function(i) {\n                  var d = i[i.length++] = t();\n                  return i.currentSubject = null, d;\n                }\n              },\n              {\n                name: \"directedEdge\",\n                separator: !0,\n                regex: a.directedEdge,\n                populate: function(i, d) {\n                  var p = t(), f = d, v = t();\n                  return p.group = \"edges\", p.target = v, p.source = f, p.subject = i.currentSubject, l(i, d, p), v;\n                }\n              },\n              {\n                name: \"undirectedEdge\",\n                separator: !0,\n                regex: a.undirectedEdge,\n                populate: function(i, d) {\n                  var p = t(), f = d, v = t();\n                  return p.group = \"edges\", p.connectedNodes = [f, v], p.subject = i.currentSubject, l(i, d, p), v;\n                }\n              },\n              {\n                name: \"child\",\n                separator: !0,\n                regex: a.child,\n                populate: function(i, d) {\n                  var p = t();\n                  return p.parent = d, p.subject = i.currentSubject, l(i, d, p), p;\n                }\n              },\n              {\n                name: \"descendant\",\n                separator: !0,\n                regex: a.descendant,\n                populate: function(i, d) {\n                  var p = t();\n                  return p.ancestor = d, p.subject = i.currentSubject, l(i, d, p), p;\n                }\n              },\n              {\n                name: \"subject\",\n                modifier: !0,\n                regex: a.subject,\n                populate: function(i, d) {\n                  if (i.currentSubject != null && d.subject != d)\n                    return n.error(\n                      \"Redefinition of subject in selector `\" + i.toString() + \"`\"\n                    ), !1;\n                  i.currentSubject = d, d.subject = d, i[i.length - 1].subject = d;\n                }\n              }\n            ];\n            h.forEach(function(i) {\n              return i.regexObj = new RegExp(\"^\" + i.regex);\n            }), y.exports = h;\n          },\n          function(y, x, g) {\n            var o = {\n              metaChar: \"[\\\\!\\\\\\\"\\\\#\\\\$\\\\%\\\\&\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\.\\\\/\\\\:\\\\;\\\\<\\\\=\\\\>\\\\?\\\\@\\\\[\\\\]\\\\^\\\\`\\\\{\\\\|\\\\}\\\\~]\",\n              comparatorOp: \"=|\\\\!=|>|>=|<|<=|\\\\$=|\\\\^=|\\\\*=\",\n              boolOp: \"\\\\?|\\\\!|\\\\^\",\n              string: `\"(?:\\\\\\\\\"|[^\"])*\"|'(?:\\\\\\\\'|[^'])*'`,\n              number: g(1).regex.number,\n              meta: \"degree|indegree|outdegree\",\n              separator: \"\\\\s*,\\\\s*\",\n              descendant: \"\\\\s+\",\n              child: \"\\\\s+>\\\\s+\",\n              subject: \"\\\\$\",\n              group: \"node|edge|\\\\*\",\n              directedEdge: \"\\\\s+->\\\\s+\",\n              undirectedEdge: \"\\\\s+<->\\\\s+\"\n            };\n            o.variable = \"(?:[\\\\w-]|(?:\\\\\\\\\" + o.metaChar + \"))+\", o.value = o.string + \"|\" + o.number, o.className = o.variable, o.id = o.variable, function() {\n              var c = void 0, a = void 0, n = void 0;\n              for (c = o.comparatorOp.split(\"|\"), n = 0; n < c.length; n++)\n                a = c[n], o.comparatorOp += \"|@\" + a;\n              for (c = o.comparatorOp.split(\"|\"), n = 0; n < c.length; n++)\n                (a = c[n]).indexOf(\"!\") >= 0 || a !== \"=\" && (o.comparatorOp += \"|\\\\!\" + a);\n            }(), y.exports = o;\n          },\n          function(y, x, g) {\n            var o = g(15).stateSelectorMatches, c = g(0), a = function(r, l) {\n              for (var h = !0, i = 0; i < r[l.name].length; i++) {\n                var d = r[l.name][i], p = d.operator, f = d.value, v = d.field, k = void 0, s = l.fieldValue(v);\n                if (p != null && f != null) {\n                  var S = c.string(s) || c.number(s) ? \"\" + s : \"\", j = \"\" + f, I = !1;\n                  p.indexOf(\"@\") >= 0 && (S = S.toLowerCase(), j = j.toLowerCase(), p = p.replace(\"@\", \"\"), I = !0);\n                  var R = !1;\n                  p.indexOf(\"!\") >= 0 && (p = p.replace(\"!\", \"\"), R = !0), I && (f = j.toLowerCase(), s = S.toLowerCase());\n                  var M = !1;\n                  switch (p) {\n                    case \"*=\":\n                      k = S.indexOf(j) >= 0;\n                      break;\n                    case \"$=\":\n                      k = S.indexOf(j, S.length - j.length) >= 0;\n                      break;\n                    case \"^=\":\n                      k = S.indexOf(j) === 0;\n                      break;\n                    case \"=\":\n                      k = s === f;\n                      break;\n                    case \">\":\n                      M = !0, k = s > f;\n                      break;\n                    case \">=\":\n                      M = !0, k = s >= f;\n                      break;\n                    case \"<\":\n                      M = !0, k = s < f;\n                      break;\n                    case \"<=\":\n                      M = !0, k = s <= f;\n                      break;\n                    default:\n                      k = !1;\n                  }\n                  !R || s == null && M || (k = !k);\n                } else if (p != null)\n                  switch (p) {\n                    case \"?\":\n                      k = !!s;\n                      break;\n                    case \"!\":\n                      k = !s;\n                      break;\n                    case \"^\":\n                      k = s === void 0;\n                  }\n                else k = s !== void 0;\n                if (!k) {\n                  h = !1;\n                  break;\n                }\n              }\n              return h;\n            }, n = function(r, l, h) {\n              if (r != null) {\n                var i = !1;\n                if (!l) return !1;\n                h = h();\n                for (var d = 0; d < h.length; d++)\n                  if (t(r, h[d])) {\n                    i = !0;\n                    break;\n                  }\n                return i;\n              }\n              return !0;\n            }, t = function(r, l) {\n              if (r.groupOnly)\n                return r.group === \"*\" || r.group === l.group();\n              if (r.group != null && r.group != \"*\" && r.group != l.group())\n                return !1;\n              var h = l.cy(), i = void 0, d = !0;\n              for (i = 0; i < r.colonSelectors.length; i++) {\n                var p = r.colonSelectors[i];\n                if (!(d = o(p, l))) break;\n              }\n              if (!d) return !1;\n              var f = !0;\n              for (i = 0; i < r.ids.length; i++) {\n                var v = r.ids[i], k = l.id();\n                if (!(f = f && v == k)) break;\n              }\n              if (!f) return !1;\n              var s = !0;\n              for (i = 0; i < r.classes.length; i++) {\n                var S = r.classes[i];\n                if (!(s = s && l.hasClass(S))) break;\n              }\n              if (!s || !a(r, {\n                name: \"data\",\n                fieldValue: function(V) {\n                  return l.data(V);\n                }\n              }) || !a(r, {\n                name: \"meta\",\n                fieldValue: function(V) {\n                  return l[V]();\n                }\n              }) || r.collection != null && !r.collection.hasElementWithId(l.id()) || r.filter != null && l.collection().some(r.filter))\n                return !1;\n              var j = h.hasCompoundNodes(), I = function() {\n                return l.source();\n              }, R = function() {\n                return l.target();\n              };\n              if (!n(r.parent, j, function() {\n                return l.parent();\n              }) || !n(r.ancestor, j, function() {\n                return l.parents();\n              }) || !n(r.child, j, function() {\n                return l.children();\n              }) || !n(r.descendant, j, function() {\n                return l.descendants();\n              }) || !n(r.source, !0, I) || !n(r.target, !0, R)) return !1;\n              if (r.connectedNodes) {\n                var M = r.connectedNodes[0], z = r.connectedNodes[1];\n                if (!(n(M, !0, I) && n(z, !0, R))) {\n                  if (!n(M, !0, R) || !n(z, !0, I)) return !1;\n                }\n              }\n              return !0;\n            };\n            y.exports = {\n              matches: function(r) {\n                if (this.invalid()) return !1;\n                for (var l = 0; l < this.length; l++) {\n                  var h = this[l];\n                  if (t(h, r)) return !0;\n                }\n                return !1;\n              },\n              filter: function(r) {\n                var l = this, h = r.cy();\n                if (l.invalid()) return h.collection();\n                if (l.length === 1 && l[0].length === 1 && l[0].ids.length === 1)\n                  return r.getElementById(l[0].ids[0]).collection();\n                var i = function(d) {\n                  for (var p = 0; p < l.length; p++) {\n                    var f = l[p];\n                    if (t(f, d)) return !0;\n                  }\n                  return !1;\n                };\n                return l.text() == null && (i = function() {\n                  return !0;\n                }), r.filter(i);\n              }\n            };\n          },\n          function(y, x, g) {\n            var o = g(8), c = {\n              parent: function(l) {\n                var h = [];\n                if (this.length === 1) {\n                  var i = this[0]._private.parent;\n                  if (i) return i;\n                }\n                for (var d = 0; d < this.length; d++) {\n                  var p = this[d]._private.parent;\n                  p && h.push(p);\n                }\n                return this.spawn(h, { unique: !0 }).filter(l);\n              },\n              parents: function(l) {\n                for (var h = [], i = this.parent(); i.nonempty(); ) {\n                  for (var d = 0; d < i.length; d++) {\n                    var p = i[d];\n                    h.push(p);\n                  }\n                  i = i.parent();\n                }\n                return this.spawn(h, { unique: !0 }).filter(l);\n              },\n              commonAncestors: function(l) {\n                for (var h = void 0, i = 0; i < this.length; i++) {\n                  var d = this[i].parents();\n                  h = (h = h || d).intersect(d);\n                }\n                return h.filter(l);\n              },\n              orphans: function(l) {\n                return this.stdFilter(function(h) {\n                  return h.isOrphan();\n                }).filter(l);\n              },\n              nonorphans: function(l) {\n                return this.stdFilter(function(h) {\n                  return h.isChild();\n                }).filter(l);\n              },\n              children: function(l) {\n                for (var h = [], i = 0; i < this.length; i++) {\n                  var d = this[i];\n                  h = h.concat(d._private.children);\n                }\n                return this.spawn(h, { unique: !0 }).filter(l);\n              },\n              siblings: function(l) {\n                return this.parent().children().not(this).filter(l);\n              },\n              isParent: function() {\n                var l = this[0];\n                if (l)\n                  return l.isNode() && l._private.children.length !== 0;\n              },\n              isChildless: function() {\n                var l = this[0];\n                if (l)\n                  return l.isNode() && l._private.children.length === 0;\n              },\n              isChild: function() {\n                var l = this[0];\n                if (l) return l.isNode() && l._private.parent != null;\n              },\n              isOrphan: function() {\n                var l = this[0];\n                if (l) return l.isNode() && l._private.parent == null;\n              },\n              descendants: function(l) {\n                var h = [];\n                return function i(d) {\n                  for (var p = 0; p < d.length; p++) {\n                    var f = d[p];\n                    h.push(f), f.children().nonempty() && i(f.children());\n                  }\n                }(this.children()), this.spawn(h, { unique: !0 }).filter(l);\n              }\n            };\n            function a(l, h, i, d) {\n              for (var p = [], f = new o(), v = l.cy().hasCompoundNodes(), k = 0; k < l.length; k++) {\n                var s = l[k];\n                i ? p.push(s) : v && d(p, f, s);\n              }\n              for (; p.length > 0; ) {\n                var S = p.shift();\n                h(S), f.add(S.id()), v && d(p, f, S);\n              }\n              return l;\n            }\n            function n(l, h, i) {\n              if (i.isParent())\n                for (var d = i._private.children, p = 0; p < d.length; p++) {\n                  var f = d[p];\n                  h.has(f.id()) || l.push(f);\n                }\n            }\n            function t(l, h, i) {\n              if (i.isChild()) {\n                var d = i._private.parent;\n                h.has(d.id()) || l.push(d);\n              }\n            }\n            function r(l, h, i) {\n              t(l, h, i), n(l, h, i);\n            }\n            c.forEachDown = function(l) {\n              var h = !(arguments.length > 1 && arguments[1] !== void 0) || arguments[1];\n              return a(this, l, h, n);\n            }, c.forEachUp = function(l) {\n              var h = !(arguments.length > 1 && arguments[1] !== void 0) || arguments[1];\n              return a(this, l, h, t);\n            }, c.forEachUpAndDown = function(l) {\n              var h = !(arguments.length > 1 && arguments[1] !== void 0) || arguments[1];\n              return a(this, l, h, r);\n            }, c.ancestors = c.parents, y.exports = c;\n          },\n          function(y, x, g) {\n            var o, c = g(4), a = void 0;\n            (a = o = {\n              data: c.data({\n                field: \"data\",\n                bindingEvent: \"data\",\n                allowBinding: !0,\n                allowSetting: !0,\n                settingEvent: \"data\",\n                settingTriggersEvent: !0,\n                triggerFnName: \"trigger\",\n                allowGetting: !0,\n                immutableKeys: {\n                  id: !0,\n                  source: !0,\n                  target: !0,\n                  parent: !0\n                },\n                updateStyle: !0\n              }),\n              removeData: c.removeData({\n                field: \"data\",\n                event: \"data\",\n                triggerFnName: \"trigger\",\n                triggerEvent: !0,\n                immutableKeys: {\n                  id: !0,\n                  source: !0,\n                  target: !0,\n                  parent: !0\n                },\n                updateStyle: !0\n              }),\n              scratch: c.data({\n                field: \"scratch\",\n                bindingEvent: \"scratch\",\n                allowBinding: !0,\n                allowSetting: !0,\n                settingEvent: \"scratch\",\n                settingTriggersEvent: !0,\n                triggerFnName: \"trigger\",\n                allowGetting: !0,\n                updateStyle: !0\n              }),\n              removeScratch: c.removeData({\n                field: \"scratch\",\n                event: \"scratch\",\n                triggerFnName: \"trigger\",\n                triggerEvent: !0,\n                updateStyle: !0\n              }),\n              rscratch: c.data({\n                field: \"rscratch\",\n                allowBinding: !1,\n                allowSetting: !0,\n                settingTriggersEvent: !1,\n                allowGetting: !0\n              }),\n              removeRscratch: c.removeData({\n                field: \"rscratch\",\n                triggerEvent: !1\n              }),\n              id: function() {\n                var n = this[0];\n                if (n) return n._private.data.id;\n              }\n            }).attr = a.data, a.removeAttr = a.removeData, y.exports = o;\n          },\n          function(y, x, g) {\n            var o = g(1), c = {};\n            function a(t) {\n              return function(r) {\n                if (r === void 0 && (r = !0), this.length !== 0 && this.isNode() && !this.removed()) {\n                  for (var l = 0, h = this[0], i = h._private.edges, d = 0; d < i.length; d++) {\n                    var p = i[d];\n                    !r && p.isLoop() || (l += t(h, p));\n                  }\n                  return l;\n                }\n              };\n            }\n            function n(t, r) {\n              return function(l) {\n                for (var h = void 0, i = this.nodes(), d = 0; d < i.length; d++) {\n                  var p = i[d][t](l);\n                  p === void 0 || h !== void 0 && !r(p, h) || (h = p);\n                }\n                return h;\n              };\n            }\n            o.extend(c, {\n              degree: a(function(t, r) {\n                return r.source().same(r.target()) ? 2 : 1;\n              }),\n              indegree: a(function(t, r) {\n                return r.target().same(t) ? 1 : 0;\n              }),\n              outdegree: a(function(t, r) {\n                return r.source().same(t) ? 1 : 0;\n              })\n            }), o.extend(c, {\n              minDegree: n(\"degree\", function(t, r) {\n                return t < r;\n              }),\n              maxDegree: n(\"degree\", function(t, r) {\n                return t > r;\n              }),\n              minIndegree: n(\"indegree\", function(t, r) {\n                return t < r;\n              }),\n              maxIndegree: n(\"indegree\", function(t, r) {\n                return t > r;\n              }),\n              minOutdegree: n(\"outdegree\", function(t, r) {\n                return t < r;\n              }),\n              maxOutdegree: n(\"outdegree\", function(t, r) {\n                return t > r;\n              })\n            }), o.extend(c, {\n              totalDegree: function(t) {\n                for (var r = 0, l = this.nodes(), h = 0; h < l.length; h++)\n                  r += l[h].degree(t);\n                return r;\n              }\n            }), y.exports = c;\n          },\n          function(y, x, g) {\n            var o = g(1), c = g(57), a = g(58), n = g(59), t = g(60);\n            y.exports = o.assign({}, c, a, n, t);\n          },\n          function(y, x, g) {\n            var o, c = g(4), a = g(0), n = g(2), t = void 0, r = function(l, h) {\n              for (var i = 0; i < l.length; i++) {\n                var d = l[i];\n                if (d.isParent() && !d.locked()) {\n                  var p = d._private.position, f = { x: h.x - p.x, y: h.y - p.y };\n                  l.children().shift(f);\n                }\n              }\n            };\n            (t = o = {\n              position: c.data({\n                field: \"position\",\n                bindingEvent: \"position\",\n                allowBinding: !0,\n                allowSetting: !0,\n                settingEvent: \"position\",\n                settingTriggersEvent: !0,\n                triggerFnName: \"emitAndNotify\",\n                allowGetting: !0,\n                validKeys: [\"x\", \"y\"],\n                beforeGet: function(l) {\n                  l.updateCompoundBounds();\n                },\n                beforeSet: r,\n                onSet: function(l) {\n                  l.dirtyCompoundBoundsCache();\n                },\n                canSet: function(l) {\n                  return !l.locked();\n                }\n              }),\n              silentPosition: c.data({\n                field: \"position\",\n                bindingEvent: \"position\",\n                allowBinding: !1,\n                allowSetting: !0,\n                settingEvent: \"position\",\n                settingTriggersEvent: !1,\n                triggerFnName: \"trigger\",\n                allowGetting: !1,\n                validKeys: [\"x\", \"y\"],\n                beforeSet: r,\n                onSet: function(l) {\n                  l.dirtyCompoundBoundsCache();\n                },\n                canSet: function(l) {\n                  return !l.locked();\n                }\n              }),\n              positions: function(l, h) {\n                if (a.plainObject(l))\n                  h ? this.silentPosition(l) : this.position(l);\n                else if (a.fn(l)) {\n                  var i = l, d = this.cy();\n                  d.startBatch();\n                  for (var p = 0; p < this.length; p++) {\n                    var f, v = this[p];\n                    (f = i(v, p)) && (h ? v.silentPosition(f) : v.position(f));\n                  }\n                  d.endBatch();\n                }\n                return this;\n              },\n              silentPositions: function(l) {\n                return this.positions(l, !0);\n              },\n              shift: function(l, h) {\n                var i = void 0;\n                if (a.plainObject(l) ? i = l : a.string(l) && a.number(h) && ((i = { x: 0, y: 0 })[l] = h), i != null)\n                  for (var d = 0; d < this.length; d++) {\n                    var p = this[d], f = p.position();\n                    p.position({ x: f.x + i.x, y: f.y + i.y });\n                  }\n                return this;\n              },\n              renderedPosition: function(l, h) {\n                var i = this[0], d = this.cy(), p = d.zoom(), f = d.pan(), v = a.plainObject(l) ? l : void 0, k = v !== void 0 || h !== void 0 && a.string(l);\n                if (i && i.isNode()) {\n                  if (!k) {\n                    var s = i.position();\n                    return v = n.modelToRenderedPosition(s, p, f), l === void 0 ? v : v[l];\n                  }\n                  for (var S = 0; S < this.length; S++) {\n                    var j = this[S];\n                    h !== void 0 ? j.position(l, (h - f[l]) / p) : v !== void 0 && j.position(n.renderedToModelPosition(v, p, f));\n                  }\n                } else if (!k) return;\n                return this;\n              },\n              relativePosition: function(l, h) {\n                var i = this[0], d = this.cy(), p = a.plainObject(l) ? l : void 0, f = p !== void 0 || h !== void 0 && a.string(l), v = d.hasCompoundNodes();\n                if (i && i.isNode()) {\n                  if (!f) {\n                    var k = i.position(), s = v ? i.parent() : null, S = s && s.length > 0, j = S;\n                    S && (s = s[0]);\n                    var I = j ? s.position() : { x: 0, y: 0 };\n                    return p = { x: k.x - I.x, y: k.y - I.y }, l === void 0 ? p : p[l];\n                  }\n                  for (var R = 0; R < this.length; R++) {\n                    var M = this[R], z = v ? M.parent() : null, V = z && z.length > 0, G = V;\n                    V && (z = z[0]);\n                    var Y = G ? z.position() : { x: 0, y: 0 };\n                    h !== void 0 ? M.position(l, h + Y[l]) : p !== void 0 && M.position({ x: p.x + Y.x, y: p.y + Y.y });\n                  }\n                } else if (!f) return;\n                return this;\n              }\n            }).modelPosition = t.point = t.position, t.modelPositions = t.points = t.positions, t.renderedPoint = t.renderedPosition, t.relativePoint = t.relativePosition, y.exports = o;\n          },\n          function(y, x, g) {\n            var o = g(0), c = g(1), a = g(2), n = void 0, t = void 0;\n            n = t = {}, t.renderedBoundingBox = function(j) {\n              var I = this.boundingBox(j), R = this.cy(), M = R.zoom(), z = R.pan(), V = I.x1 * M + z.x, G = I.x2 * M + z.x, Y = I.y1 * M + z.y, tt = I.y2 * M + z.y;\n              return { x1: V, x2: G, y1: Y, y2: tt, w: G - V, h: tt - Y };\n            }, t.dirtyCompoundBoundsCache = function() {\n              var j = this.cy();\n              return j.styleEnabled() && j.hasCompoundNodes() ? (this.forEachUp(function(I) {\n                I._private.compoundBoundsClean = !1, I.isParent() && I.emit(\"bounds\");\n              }), this) : this;\n            }, t.updateCompoundBounds = function() {\n              var j = this.cy();\n              if (!j.styleEnabled() || !j.hasCompoundNodes()) return this;\n              if (j.batching()) return this;\n              function I(V) {\n                if (V.isParent()) {\n                  var G = V._private, Y = V.children(), tt = V.pstyle(\"compound-sizing-wrt-labels\").value === \"include\", Z = {\n                    width: {\n                      val: V.pstyle(\"min-width\").pfValue,\n                      left: V.pstyle(\"min-width-bias-left\"),\n                      right: V.pstyle(\"min-width-bias-right\")\n                    },\n                    height: {\n                      val: V.pstyle(\"min-height\").pfValue,\n                      top: V.pstyle(\"min-height-bias-top\"),\n                      bottom: V.pstyle(\"min-height-bias-bottom\")\n                    }\n                  }, at = Y.boundingBox({\n                    includeLabels: tt,\n                    includeOverlays: !1,\n                    useCache: !1\n                  }), nt = G.position;\n                  at.w !== 0 && at.h !== 0 || ((at = {\n                    w: V.pstyle(\"width\").pfValue,\n                    h: V.pstyle(\"height\").pfValue\n                  }).x1 = nt.x - at.w / 2, at.x2 = nt.x + at.w / 2, at.y1 = nt.y - at.h / 2, at.y2 = nt.y + at.h / 2);\n                  var ht = Z.width.left.value;\n                  Z.width.left.units === \"px\" && Z.width.val > 0 && (ht = 100 * ht / Z.width.val);\n                  var ct = Z.width.right.value;\n                  Z.width.right.units === \"px\" && Z.width.val > 0 && (ct = 100 * ct / Z.width.val);\n                  var ot = Z.height.top.value;\n                  Z.height.top.units === \"px\" && Z.height.val > 0 && (ot = 100 * ot / Z.height.val);\n                  var gt = Z.height.bottom.value;\n                  Z.height.bottom.units === \"px\" && Z.height.val > 0 && (gt = 100 * gt / Z.height.val);\n                  var xt = ne(Z.width.val - at.w, ht, ct), St = xt.biasDiff, zt = xt.biasComplementDiff, Nt = ne(Z.height.val - at.h, ot, gt), re = Nt.biasDiff, be = Nt.biasComplementDiff;\n                  G.autoPadding = function(ce, xe, we, ae) {\n                    if (we.units !== \"%\")\n                      return we.units === \"px\" ? we.pfValue : 0;\n                    switch (ae) {\n                      case \"width\":\n                        return ce > 0 ? we.pfValue * ce : 0;\n                      case \"height\":\n                        return xe > 0 ? we.pfValue * xe : 0;\n                      case \"average\":\n                        return ce > 0 && xe > 0 ? we.pfValue * (ce + xe) / 2 : 0;\n                      case \"min\":\n                        return ce > 0 && xe > 0 ? ce > xe ? we.pfValue * xe : we.pfValue * ce : 0;\n                      case \"max\":\n                        return ce > 0 && xe > 0 ? ce > xe ? we.pfValue * ce : we.pfValue * xe : 0;\n                      default:\n                        return 0;\n                    }\n                  }(\n                    at.w,\n                    at.h,\n                    V.pstyle(\"padding\"),\n                    V.pstyle(\"padding-relative-to\").value\n                  ), G.autoWidth = Math.max(at.w, Z.width.val), nt.x = (-St + at.x1 + at.x2 + zt) / 2, G.autoHeight = Math.max(at.h, Z.height.val), nt.y = (-re + at.y1 + at.y2 + be) / 2;\n                }\n                function ne(ce, xe, we) {\n                  var ae = 0, Le = 0, lt = xe + we;\n                  return ce > 0 && lt > 0 && (ae = xe / lt * ce, Le = we / lt * ce), { biasDiff: ae, biasComplementDiff: Le };\n                }\n              }\n              for (var R = 0; R < this.length; R++) {\n                var M = this[R], z = M._private;\n                z.compoundBoundsClean || (I(M), j._private.batchingStyle || (z.compoundBoundsClean = !0));\n              }\n              return this;\n            };\n            var r = function(j) {\n              return j === 1 / 0 || j === -1 / 0 ? 0 : j;\n            }, l = function(j, I, R, M, z) {\n              M - I != 0 && z - R != 0 && I != null && R != null && M != null && z != null && (j.x1 = I < j.x1 ? I : j.x1, j.x2 = M > j.x2 ? M : j.x2, j.y1 = R < j.y1 ? R : j.y1, j.y2 = z > j.y2 ? z : j.y2);\n            }, h = function(j, I, R) {\n              return c.getPrefixedProperty(j, I, R);\n            }, i = function(j, I, R) {\n              if (!I.cy().headless()) {\n                var M = I._private.rstyle, z = M.arrowWidth / 2, V = void 0, G = void 0;\n                I.pstyle(R + \"-arrow-shape\").value !== \"none\" && (R === \"source\" ? (V = M.srcX, G = M.srcY) : R === \"target\" ? (V = M.tgtX, G = M.tgtY) : (V = M.midX, G = M.midY), l(j, V - z, G - z, V + z, G + z));\n              }\n            }, d = function(j, I, R) {\n              if (!I.cy().headless()) {\n                var M = void 0;\n                M = R ? R + \"-\" : \"\";\n                var z = I._private, V = z.rstyle;\n                if (I.pstyle(M + \"label\").strValue) {\n                  var G = I.pstyle(\"text-halign\"), Y = I.pstyle(\"text-valign\"), tt = h(V, \"labelWidth\", R), Z = h(V, \"labelHeight\", R), at = h(V, \"labelX\", R), nt = h(V, \"labelY\", R), ht = I.pstyle(M + \"text-margin-x\").pfValue, ct = I.pstyle(M + \"text-margin-y\").pfValue, ot = I.isEdge(), gt = I.pstyle(M + \"text-rotation\"), xt = I.pstyle(\"text-outline-width\").pfValue, St = I.pstyle(\"text-border-width\").pfValue / 2, zt = I.pstyle(\"text-background-padding\").pfValue, Nt = Z + 2 * zt, re = tt + 2 * zt, be = re / 2, ne = Nt / 2, ce = void 0, xe = void 0, we = void 0, ae = void 0;\n                  if (ot) ce = at - be, xe = at + be, we = nt - ne, ae = nt + ne;\n                  else {\n                    switch (G.value) {\n                      case \"left\":\n                        ce = at - re, xe = at;\n                        break;\n                      case \"center\":\n                        ce = at - be, xe = at + be;\n                        break;\n                      case \"right\":\n                        ce = at, xe = at + re;\n                    }\n                    switch (Y.value) {\n                      case \"top\":\n                        we = nt - Nt, ae = nt;\n                        break;\n                      case \"center\":\n                        we = nt - ne, ae = nt + ne;\n                        break;\n                      case \"bottom\":\n                        we = nt, ae = nt + Nt;\n                    }\n                  }\n                  var Le = ot && gt.strValue === \"autorotate\", lt = gt.pfValue != null && gt.pfValue !== 0;\n                  if (Le || lt) {\n                    var kt = Le ? h(z.rstyle, \"labelAngle\", R) : gt.pfValue, Dt = Math.cos(kt), yt = Math.sin(kt), ft = function(pe, je) {\n                      return {\n                        x: (pe -= at) * Dt - (je -= nt) * yt + at,\n                        y: pe * yt + je * Dt + nt\n                      };\n                    }, Rt = ft(ce, we), Wt = ft(ce, ae), le = ft(xe, we), ye = ft(xe, ae);\n                    ce = Math.min(Rt.x, Wt.x, le.x, ye.x), xe = Math.max(Rt.x, Wt.x, le.x, ye.x), we = Math.min(Rt.y, Wt.y, le.y, ye.y), ae = Math.max(Rt.y, Wt.y, le.y, ye.y);\n                  }\n                  ce += ht - Math.max(xt, St), xe += ht + Math.max(xt, St), we += ct - Math.max(xt, St), ae += ct + Math.max(xt, St), l(j, ce, we, xe, ae);\n                }\n                return j;\n              }\n            }, p = function(j) {\n              return j ? \"t\" : \"f\";\n            }, f = function(j) {\n              var I = \"\";\n              return I += p(j.incudeNodes), I += p(j.includeEdges), I += p(j.includeLabels), I += p(j.includeOverlays);\n            }, v = function(j, I) {\n              var R = j._private, M = void 0, z = j.cy().headless(), V = I === k ? s : f(I);\n              return I.useCache && !z && R.bbCache && R.bbCache[V] ? M = R.bbCache[V] : (M = function(G, Y) {\n                var tt = G._private.cy, Z = tt.styleEnabled(), at = tt.headless(), nt = {\n                  x1: 1 / 0,\n                  y1: 1 / 0,\n                  x2: -1 / 0,\n                  y2: -1 / 0\n                }, ht = G._private, ct = Z ? G.pstyle(\"display\").value : \"element\", ot = G.isNode(), gt = G.isEdge(), xt = void 0, St = void 0, zt = void 0, Nt = void 0, re = void 0, be = void 0, ne = ct !== \"none\";\n                if (ne) {\n                  var ce = 0;\n                  Z && Y.includeOverlays && G.pstyle(\"overlay-opacity\").value !== 0 && (ce = G.pstyle(\"overlay-padding\").value);\n                  var xe = 0;\n                  if (Z && (xe = G.pstyle(\"width\").pfValue / 2), ot && Y.includeNodes) {\n                    var we = G.position();\n                    re = we.x, be = we.y;\n                    var ae = G.outerWidth() / 2, Le = G.outerHeight() / 2;\n                    l(\n                      nt,\n                      xt = re - ae - ce,\n                      zt = be - Le - ce,\n                      St = re + ae + ce,\n                      Nt = be + Le + ce\n                    );\n                  } else if (gt && Y.includeEdges) {\n                    var lt = ht.rstyle || {};\n                    if (Z && !at && (xt = Math.min(lt.srcX, lt.midX, lt.tgtX), St = Math.max(lt.srcX, lt.midX, lt.tgtX), zt = Math.min(lt.srcY, lt.midY, lt.tgtY), Nt = Math.max(lt.srcY, lt.midY, lt.tgtY), l(nt, xt -= xe, zt -= xe, St += xe, Nt += xe)), Z && !at && G.pstyle(\"curve-style\").strValue === \"haystack\") {\n                      var kt = lt.haystackPts || [];\n                      if (xt = kt[0].x, zt = kt[0].y, xt > (St = kt[1].x)) {\n                        var Dt = xt;\n                        xt = St, St = Dt;\n                      }\n                      if (zt > (Nt = kt[1].y)) {\n                        var yt = zt;\n                        zt = Nt, Nt = yt;\n                      }\n                      l(nt, xt - xe, zt - xe, St + xe, Nt + xe);\n                    } else {\n                      for (var ft = lt.bezierPts || lt.linePts || [], Rt = 0; Rt < ft.length; Rt++) {\n                        var Wt = ft[Rt];\n                        xt = Wt.x - xe, St = Wt.x + xe, zt = Wt.y - xe, Nt = Wt.y + xe, l(nt, xt, zt, St, Nt);\n                      }\n                      if (ft.length === 0) {\n                        var le = G.source().position(), ye = G.target().position();\n                        if ((xt = le.x) > (St = ye.x)) {\n                          var pe = xt;\n                          xt = St, St = pe;\n                        }\n                        if ((zt = le.y) > (Nt = ye.y)) {\n                          var je = zt;\n                          zt = Nt, Nt = je;\n                        }\n                        l(nt, xt -= xe, zt -= xe, St += xe, Nt += xe);\n                      }\n                    }\n                  }\n                  if (Z && Y.includeEdges && gt && (i(nt, G, \"mid-source\"), i(nt, G, \"mid-target\"), i(nt, G, \"source\"), i(nt, G, \"target\")), Z && G.pstyle(\"ghost\").value === \"yes\") {\n                    var Me = G.pstyle(\"ghost-offset-x\").pfValue, Ze = G.pstyle(\"ghost-offset-y\").pfValue;\n                    l(nt, nt.x1 + Me, nt.y1 + Ze, nt.x2 + Me, nt.y2 + Ze);\n                  }\n                  Z && (xt = nt.x1, St = nt.x2, zt = nt.y1, Nt = nt.y2, l(nt, xt - ce, zt - ce, St + ce, Nt + ce)), Z && Y.includeLabels && (d(nt, G, null), gt && (d(nt, G, \"source\"), d(nt, G, \"target\")));\n                }\n                return nt.x1 = r(nt.x1), nt.y1 = r(nt.y1), nt.x2 = r(nt.x2), nt.y2 = r(nt.y2), nt.w = r(nt.x2 - nt.x1), nt.h = r(nt.y2 - nt.y1), nt.w > 0 && nt.h > 0 && ne && a.expandBoundingBox(nt, 1), nt;\n              }(j, I), z || (R.bbCache = R.bbCache || {}, R.bbCache[V] = M)), M;\n            }, k = {\n              includeNodes: !0,\n              includeEdges: !0,\n              includeLabels: !0,\n              includeOverlays: !0,\n              useCache: !0\n            }, s = f(k);\n            function S(j) {\n              return {\n                includeNodes: c.default(j.includeNodes, k.includeNodes),\n                includeEdges: c.default(j.includeEdges, k.includeEdges),\n                includeLabels: c.default(j.includeLabels, k.includeLabels),\n                includeOverlays: c.default(\n                  j.includeOverlays,\n                  k.includeOverlays\n                ),\n                useCache: c.default(j.useCache, k.useCache)\n              };\n            }\n            t.boundingBox = function(j) {\n              if (this.length === 1 && this[0]._private.bbCache && (j === void 0 || j.useCache === void 0 || j.useCache === !0))\n                return j = j === void 0 ? k : S(j), v(this[0], j);\n              var I = { x1: 1 / 0, y1: 1 / 0, x2: -1 / 0, y2: -1 / 0 }, R = S(j = j || c.staticEmptyObject()), M = this.cy().styleEnabled();\n              M && this.recalculateRenderedStyle(R.useCache), this.updateCompoundBounds();\n              for (var z, V, G = {}, Y = 0; Y < this.length; Y++) {\n                var tt = this[Y];\n                if (M && tt.isEdge() && tt.pstyle(\"curve-style\").strValue === \"bezier\" && !G[tt.id()]) {\n                  for (var Z = tt.parallelEdges(), at = 0; at < Z.length; at++)\n                    G[Z[at].id()] = !0;\n                  Z.recalculateRenderedStyle(R.useCache);\n                }\n                z = I, V = v(tt, R), l(z, V.x1, V.y1, V.x2, V.y2);\n              }\n              return I.x1 = r(I.x1), I.y1 = r(I.y1), I.x2 = r(I.x2), I.y2 = r(I.y2), I.w = r(I.x2 - I.x1), I.h = r(I.y2 - I.y1), I;\n            }, t.boundingBoxAt = function(j) {\n              var I = this.nodes();\n              if (o.plainObject(j)) {\n                var R = j;\n                j = function() {\n                  return R;\n                };\n              }\n              for (var M = 0; M < I.length; M++) {\n                var z = I[M], V = z._private, G = V.position, Y = j.call(z, z, M);\n                V.bbAtOldPos = { x: G.x, y: G.y }, Y && (G.x = Y.x, G.y = Y.y);\n              }\n              this.emit(\"dirty\"), I.dirtyCompoundBoundsCache().updateCompoundBounds();\n              for (var tt = this.boundingBox({ useCache: !1 }), Z = 0; Z < I.length; Z++) {\n                var at = I[Z], nt = at._private, ht = at._private.position, ct = nt.bbAtOldPos;\n                ht.x = ct.x, ht.y = ct.y;\n              }\n              return I.dirtyCompoundBoundsCache(), this.emit(\"dirty\"), tt;\n            }, n.boundingbox = n.boundingBox, n.renderedBoundingbox = n.renderedBoundingBox, y.exports = t;\n          },\n          function(y, x, g) {\n            var o = g(1), c = void 0, a = void 0;\n            c = a = {};\n            var n = function(t) {\n              t.uppercaseName = o.capitalize(t.name), t.autoName = \"auto\" + t.uppercaseName, t.labelName = \"label\" + t.uppercaseName, t.outerName = \"outer\" + t.uppercaseName, t.uppercaseOuterName = o.capitalize(t.outerName), c[t.name] = function() {\n                var r = this[0], l = r._private, h = l.cy._private.styleEnabled;\n                if (r) {\n                  if (!h) return 1;\n                  if (r.isParent())\n                    return r.updateCompoundBounds(), l[t.autoName] || 0;\n                  var i = r.pstyle(t.name);\n                  switch (i.strValue) {\n                    case \"label\":\n                      return r.recalculateRenderedStyle(), l.rstyle[t.labelName] || 0;\n                    default:\n                      return i.pfValue;\n                  }\n                }\n              }, c[\"outer\" + t.uppercaseName] = function() {\n                var r = this[0], l = r._private.cy._private.styleEnabled;\n                if (r)\n                  return l ? r[t.name]() + r.pstyle(\"border-width\").pfValue + 2 * r.padding() : 1;\n              }, c[\"rendered\" + t.uppercaseName] = function() {\n                var r = this[0];\n                if (r) return r[t.name]() * this.cy().zoom();\n              }, c[\"rendered\" + t.uppercaseOuterName] = function() {\n                var r = this[0];\n                if (r) return r[t.outerName]() * this.cy().zoom();\n              };\n            };\n            n({ name: \"width\" }), n({ name: \"height\" }), a.padding = function() {\n              var t = this[0], r = t._private;\n              return t.isParent() ? (t.updateCompoundBounds(), r.autoPadding !== void 0 ? r.autoPadding : t.pstyle(\"padding\").pfValue) : t.pstyle(\"padding\").pfValue;\n            }, y.exports = a;\n          },\n          function(y, x, g) {\n            var o = function(c, a) {\n              if (c.isEdge()) return a(c.renderer());\n            };\n            y.exports = {\n              controlPoints: function() {\n                var c = this;\n                return o(this, function(a) {\n                  return a.getControlPoints(c);\n                });\n              },\n              segmentPoints: function() {\n                var c = this;\n                return o(this, function(a) {\n                  return a.getSegmentPoints(c);\n                });\n              },\n              sourceEndpoint: function() {\n                var c = this;\n                return o(this, function(a) {\n                  return a.getSourceEndpoint(c);\n                });\n              },\n              targetEndpoint: function() {\n                var c = this;\n                return o(this, function(a) {\n                  return a.getTargetEndpoint(c);\n                });\n              },\n              midpoint: function() {\n                var c = this;\n                return o(this, function(a) {\n                  return a.getEdgeMidpoint(c);\n                });\n              }\n            };\n          },\n          function(y, x, g) {\n            var o = g(11), c = g(4), a = g(0), n = g(1), t = g(6), r = {\n              qualifierCompare: function(i, d) {\n                return i == null || d == null ? i == null && d == null : i.sameText(d);\n              },\n              eventMatches: function(i, d, p) {\n                var f = d.qualifier;\n                return f == null || i !== p.target && a.element(p.target) && f.matches(p.target);\n              },\n              eventFields: function(i) {\n                return { cy: i.cy(), target: i };\n              },\n              callbackContext: function(i, d, p) {\n                return d.qualifier != null ? p.target : i;\n              },\n              beforeEmit: function(i, d) {\n                d.conf && d.conf.once && d.conf.onceCollection.removeListener(\n                  d.event,\n                  d.qualifier,\n                  d.callback\n                );\n              },\n              bubble: function() {\n                return !0;\n              },\n              parent: function(i) {\n                return i.isChild() ? i.parent() : i.cy();\n              }\n            }, l = function(i) {\n              return a.string(i) ? new t(i) : i;\n            }, h = {\n              createEmitter: function() {\n                for (var i = 0; i < this.length; i++) {\n                  var d = this[i], p = d._private;\n                  p.emitter || (p.emitter = new o(n.assign({ context: d }, r)));\n                }\n                return this;\n              },\n              emitter: function() {\n                return this._private.emitter;\n              },\n              on: function(i, d, p) {\n                for (var f = 0; f < this.length; f++)\n                  this[f].emitter().on(i, l(d), p);\n                return this;\n              },\n              removeListener: function(i, d, p) {\n                for (var f = 0; f < this.length; f++)\n                  this[f].emitter().removeListener(i, l(d), p);\n                return this;\n              },\n              one: function(i, d, p) {\n                for (var f = 0; f < this.length; f++)\n                  this[f].emitter().one(i, l(d), p);\n                return this;\n              },\n              once: function(i, d, p) {\n                for (var f = 0; f < this.length; f++)\n                  this[f].emitter().on(i, l(d), p, { once: !0, onceCollection: this });\n              },\n              emit: function(i, d) {\n                for (var p = 0; p < this.length; p++)\n                  this[p].emitter().emit(i, d);\n                return this;\n              },\n              emitAndNotify: function(i, d) {\n                if (this.length !== 0)\n                  return this.cy().notify({ type: i, eles: this }), this.emit(i, d), this;\n              }\n            };\n            c.eventAliasesOn(h), y.exports = h;\n          },\n          function(y, x, g) {\n            var o = g(0), c = g(6), a = {\n              nodes: function(t) {\n                return this.filter(function(r) {\n                  return r.isNode();\n                }).filter(t);\n              },\n              edges: function(t) {\n                return this.filter(function(r) {\n                  return r.isEdge();\n                }).filter(t);\n              },\n              filter: function(t, r) {\n                if (t === void 0) return this;\n                if (o.string(t) || o.elementOrCollection(t))\n                  return new c(t).filter(this);\n                if (o.fn(t)) {\n                  for (var l = this.spawn(), h = 0; h < this.length; h++) {\n                    var i = this[h];\n                    (r ? t.apply(r, [i, h, this]) : t(i, h, this)) && l.merge(i);\n                  }\n                  return l;\n                }\n                return this.spawn();\n              },\n              not: function(t) {\n                if (t) {\n                  o.string(t) && (t = this.filter(t));\n                  for (var r = [], l = t._private.map, h = 0; h < this.length; h++) {\n                    var i = this[h];\n                    l.has(i.id()) || r.push(i);\n                  }\n                  return this.spawn(r);\n                }\n                return this;\n              },\n              absoluteComplement: function() {\n                return this.cy().mutableElements().not(this);\n              },\n              intersect: function(t) {\n                if (o.string(t)) {\n                  var r = t;\n                  return this.filter(r);\n                }\n                for (var l = [], h = t, i = this.length < t.length, d = i ? h._private.map : this._private.map, p = i ? this : h, f = 0; f < p.length; f++) {\n                  var v = p[f]._private.data.id, k = d.get(v);\n                  k && l.push(k.ele);\n                }\n                return this.spawn(l);\n              },\n              xor: function(t) {\n                var r = this._private.cy;\n                o.string(t) && (t = r.$(t));\n                var l = [], h = t, i = function(d, p) {\n                  for (var f = 0; f < d.length; f++) {\n                    var v = d[f], k = v._private.data.id;\n                    p.hasElementWithId(k) || l.push(v);\n                  }\n                };\n                return i(this, h), i(h, this), this.spawn(l);\n              },\n              diff: function(t) {\n                var r = this._private.cy;\n                o.string(t) && (t = r.$(t));\n                var l = [], h = [], i = [], d = t, p = function(f, v, k) {\n                  for (var s = 0; s < f.length; s++) {\n                    var S = f[s], j = S._private.data.id;\n                    v.hasElementWithId(j) ? i.push(S) : k.push(S);\n                  }\n                };\n                return p(this, d, l), p(d, this, h), {\n                  left: this.spawn(l, { unique: !0 }),\n                  right: this.spawn(h, { unique: !0 }),\n                  both: this.spawn(i, { unique: !0 })\n                };\n              },\n              add: function(t) {\n                var r = this._private.cy;\n                if (!t) return this;\n                if (o.string(t)) {\n                  var l = t;\n                  t = r.mutableElements().filter(l);\n                }\n                for (var h = [], i = 0; i < this.length; i++)\n                  h.push(this[i]);\n                for (var d = this._private.map, p = 0; p < t.length; p++) {\n                  var f = !d.has(t[p].id());\n                  f && h.push(t[p]);\n                }\n                return this.spawn(h);\n              },\n              merge: function(t) {\n                var r = this._private, l = r.cy;\n                if (!t) return this;\n                if (t && o.string(t)) {\n                  var h = t;\n                  t = l.mutableElements().filter(h);\n                }\n                for (var i = r.map, d = 0; d < t.length; d++) {\n                  var p = t[d], f = p._private.data.id;\n                  if (i.has(f)) {\n                    var v = i.get(f).index;\n                    this[v] = p, i.set(f, { ele: p, index: v });\n                  } else {\n                    var k = this.length++;\n                    this[k] = p, i.set(f, { ele: p, index: k });\n                  }\n                }\n                return this;\n              },\n              unmergeOne: function(t) {\n                t = t[0];\n                var r = this._private, l = t._private.data.id, h = r.map, i = h.get(l);\n                if (!i) return this;\n                var d = i.index;\n                this[d] = void 0, h.delete(l);\n                var p = d === this.length - 1;\n                if (this.length > 1 && !p) {\n                  var f = this.length - 1, v = this[f], k = v._private.data.id;\n                  this[f] = void 0, this[d] = v, h.set(k, { ele: v, index: d });\n                }\n                return this.length--, this;\n              },\n              unmerge: function(t) {\n                var r = this._private.cy;\n                if (!t) return this;\n                if (t && o.string(t)) {\n                  var l = t;\n                  t = r.mutableElements().filter(l);\n                }\n                for (var h = 0; h < t.length; h++) this.unmergeOne(t[h]);\n                return this;\n              },\n              map: function(t, r) {\n                for (var l = [], h = 0; h < this.length; h++) {\n                  var i = this[h], d = r ? t.apply(r, [i, h, this]) : t(i, h, this);\n                  l.push(d);\n                }\n                return l;\n              },\n              reduce: function(t, r) {\n                for (var l = r, h = 0; h < this.length; h++)\n                  l = t(l, this[h], h, this);\n                return l;\n              },\n              max: function(t, r) {\n                for (var l = -1 / 0, h = void 0, i = 0; i < this.length; i++) {\n                  var d = this[i], p = r ? t.apply(r, [d, i, this]) : t(d, i, this);\n                  p > l && (l = p, h = d);\n                }\n                return { value: l, ele: h };\n              },\n              min: function(t, r) {\n                for (var l = 1 / 0, h = void 0, i = 0; i < this.length; i++) {\n                  var d = this[i], p = r ? t.apply(r, [d, i, this]) : t(d, i, this);\n                  p < l && (l = p, h = d);\n                }\n                return { value: l, ele: h };\n              }\n            }, n = a;\n            n.u = n[\"|\"] = n[\"+\"] = n.union = n.or = n.add, n[\"\\\\\"] = n[\"!\"] = n[\"-\"] = n.difference = n.relativeComplement = n.subtract = n.not, n.n = n[\"&\"] = n[\".\"] = n.and = n.intersection = n.intersect, n[\"^\"] = n[\"(+)\"] = n[\"(-)\"] = n.symmetricDifference = n.symdiff = n.xor, n.fnFilter = n.filterFn = n.stdFilter = n.filter, n.complement = n.abscomp = n.absoluteComplement, y.exports = a;\n          },\n          function(y, x, g) {\n            y.exports = {\n              isNode: function() {\n                return this.group() === \"nodes\";\n              },\n              isEdge: function() {\n                return this.group() === \"edges\";\n              },\n              isLoop: function() {\n                return this.isEdge() && this.source().id() === this.target().id();\n              },\n              isSimple: function() {\n                return this.isEdge() && this.source().id() !== this.target().id();\n              },\n              group: function() {\n                var o = this[0];\n                if (o) return o._private.group;\n              }\n            };\n          },\n          function(y, x, g) {\n            var o = g(0), c = g(17), a = g(1), n = {\n              forEach: function(t, r) {\n                if (o.fn(t))\n                  for (var l = 0; l < this.length; l++) {\n                    var h = this[l];\n                    if ((r ? t.apply(r, [h, l, this]) : t(h, l, this)) === !1)\n                      break;\n                  }\n                return this;\n              },\n              toArray: function() {\n                for (var t = [], r = 0; r < this.length; r++)\n                  t.push(this[r]);\n                return t;\n              },\n              slice: function(t, r) {\n                var l = [], h = this.length;\n                r == null && (r = h), t == null && (t = 0), t < 0 && (t = h + t), r < 0 && (r = h + r);\n                for (var i = t; i >= 0 && i < r && i < h; i++)\n                  l.push(this[i]);\n                return this.spawn(l);\n              },\n              size: function() {\n                return this.length;\n              },\n              eq: function(t) {\n                return this[t] || this.spawn();\n              },\n              first: function() {\n                return this[0] || this.spawn();\n              },\n              last: function() {\n                return this[this.length - 1] || this.spawn();\n              },\n              empty: function() {\n                return this.length === 0;\n              },\n              nonempty: function() {\n                return !this.empty();\n              },\n              sort: function(t) {\n                if (!o.fn(t)) return this;\n                var r = this.toArray().sort(t);\n                return this.spawn(r);\n              },\n              sortByZIndex: function() {\n                return this.sort(c);\n              },\n              zDepth: function() {\n                var t = this[0];\n                if (t) {\n                  var r = t._private;\n                  if (r.group === \"nodes\") {\n                    var l = r.data.parent ? t.parents().size() : 0;\n                    return t.isParent() ? l : a.MAX_INT - 1;\n                  }\n                  var h = r.source, i = r.target, d = h.zDepth(), p = i.zDepth();\n                  return Math.max(d, p, 0);\n                }\n              }\n            };\n            n.each = n.forEach, y.exports = n;\n          },\n          function(y, x, g) {\n            var o = g(0), c = g(1), a = g(5), n = g(2), t = {\n              layoutDimensions: function(r) {\n                if ((r = c.assign({ nodeDimensionsIncludeLabels: !0 }, r)).nodeDimensionsIncludeLabels) {\n                  var l = this.boundingBox();\n                  return { w: l.w, h: l.h };\n                }\n                return { w: this.outerWidth(), h: this.outerHeight() };\n              },\n              layoutPositions: function(r, l, h) {\n                var i = this.nodes(), d = this.cy(), p = l.eles, f = function(G, Y) {\n                  return G.id() + \"$\" + Y;\n                }, v = c.memoize(h, f);\n                r.emit({ type: \"layoutstart\", layout: r }), r.animations = [];\n                var k = l.spacingFactor && l.spacingFactor !== 1, s = function() {\n                  if (!k) return null;\n                  for (var G = n.makeBoundingBox(), Y = 0; Y < i.length; Y++) {\n                    var tt = i[Y], Z = v(tt, Y);\n                    n.expandBoundingBoxByPoint(G, Z.x, Z.y);\n                  }\n                  return G;\n                }(), S = c.memoize(function(G, Y) {\n                  var tt = v(G, Y), Z = G.position();\n                  return o.number(Z.x) && o.number(Z.y) || G.silentPosition({ x: 0, y: 0 }), k && (tt = function(at, nt, ht) {\n                    var ct = nt.x1 + nt.w / 2, ot = nt.y1 + nt.h / 2;\n                    return {\n                      x: ct + (ht.x - ct) * at,\n                      y: ot + (ht.y - ot) * at\n                    };\n                  }(Math.abs(l.spacingFactor), s, tt)), l.transform != null && (tt = l.transform(G, tt)), tt;\n                }, f);\n                if (l.animate) {\n                  for (var j = 0; j < i.length; j++) {\n                    var I = i[j], R = S(I, j);\n                    if (l.animateFilter == null || l.animateFilter(I, j)) {\n                      var M = I.animation({\n                        position: R,\n                        duration: l.animationDuration,\n                        easing: l.animationEasing\n                      });\n                      r.animations.push(M), M.play();\n                    } else I.position(R);\n                  }\n                  if (l.fit) {\n                    var z = d.animation({\n                      fit: {\n                        boundingBox: p.boundingBoxAt(S),\n                        padding: l.padding\n                      },\n                      duration: l.animationDuration,\n                      easing: l.animationEasing\n                    });\n                    r.animations.push(z), z.play();\n                  } else if (l.zoom !== void 0 && l.pan !== void 0) {\n                    var V = d.animation({\n                      zoom: l.zoom,\n                      pan: l.pan,\n                      duration: l.animationDuration,\n                      easing: l.animationEasing\n                    });\n                    r.animations.push(V), V.play();\n                  }\n                  r.one(\"layoutready\", l.ready), r.emit({ type: \"layoutready\", layout: r }), a.all(\n                    r.animations.map(function(G) {\n                      return G.promise();\n                    })\n                  ).then(function() {\n                    r.one(\"layoutstop\", l.stop), r.emit({ type: \"layoutstop\", layout: r });\n                  });\n                } else\n                  i.positions(S), l.fit && d.fit(l.eles, l.padding), l.zoom != null && d.zoom(l.zoom), l.pan && d.pan(l.pan), r.one(\"layoutready\", l.ready), r.emit({ type: \"layoutready\", layout: r }), r.one(\"layoutstop\", l.stop), r.emit({ type: \"layoutstop\", layout: r });\n                return this;\n              },\n              layout: function(r) {\n                return this.cy().makeLayout(\n                  c.extend({}, r, { eles: this })\n                );\n              }\n            };\n            t.createLayout = t.makeLayout = t.layout, y.exports = t;\n          },\n          function(y, x, g) {\n            var o = g(0);\n            function c(v, k, s) {\n              var S, j = s._private, I = j.styleCache = j.styleCache || {};\n              return (S = I[v]) != null ? S : S = I[v] = k(s);\n            }\n            function a(v, k) {\n              return function(s) {\n                return c(v, k, s);\n              };\n            }\n            function n(v, k) {\n              var s = function(S) {\n                return k.call(S);\n              };\n              return function() {\n                var S = this[0];\n                if (S) return c(v, s, S);\n              };\n            }\n            var t = {\n              recalculateRenderedStyle: function(v) {\n                var k = this.cy(), s = k.renderer(), S = k.styleEnabled();\n                return s && S && s.recalculateRenderedStyle(this, v), this;\n              },\n              dirtyStyleCache: function() {\n                var v = this.cy(), k = function(S) {\n                  return S._private.styleCache = {};\n                };\n                if (v.hasCompoundNodes()) {\n                  var s = void 0;\n                  (s = this.spawnSelf().merge(this.descendants()).merge(this.parents())).merge(s.connectedEdges()), s.forEach(k);\n                } else\n                  this.forEach(function(S) {\n                    k(S), S.connectedEdges().forEach(k);\n                  });\n                return this;\n              },\n              updateStyle: function(v) {\n                var k = this._private.cy;\n                if (!k.styleEnabled()) return this;\n                if (k._private.batchingStyle)\n                  return k._private.batchStyleEles.merge(this), this;\n                var s = k.hasCompoundNodes(), S = k.style(), j = this;\n                v = !(!v && v !== void 0), s && (j = this.spawnSelf().merge(this.descendants()).merge(this.parents()));\n                var I = S.apply(j);\n                return I.dirtyStyleCache(), I.dirtyCompoundBoundsCache(), v ? I.emitAndNotify(\"style\") : I.emit(\"style\"), this;\n              },\n              updateMappers: function(v) {\n                var k = this._private.cy, s = k.style();\n                if (v = !(!v && v !== void 0), !k.styleEnabled())\n                  return this;\n                var S = s.updateMappers(this);\n                return S.dirtyStyleCache(), S.dirtyCompoundBoundsCache(), v ? S.emitAndNotify(\"style\") : S.emit(\"style\"), this;\n              },\n              parsedStyle: function(v) {\n                var k = this[0], s = k.cy();\n                if (s.styleEnabled())\n                  return k ? k._private.style[v] || s.style().getDefaultProperty(v) : void 0;\n              },\n              numericStyle: function(v) {\n                var k = this[0];\n                if (k.cy().styleEnabled() && k) {\n                  var s = k.pstyle(v);\n                  return s.pfValue !== void 0 ? s.pfValue : s.value;\n                }\n              },\n              numericStyleUnits: function(v) {\n                var k = this[0];\n                if (k.cy().styleEnabled())\n                  return k ? k.pstyle(v).units : void 0;\n              },\n              renderedStyle: function(v) {\n                var k = this.cy();\n                if (!k.styleEnabled()) return this;\n                var s = this[0];\n                return s ? k.style().getRenderedStyle(s, v) : void 0;\n              },\n              style: function(v, k) {\n                var s = this.cy();\n                if (!s.styleEnabled()) return this;\n                var S = s.style();\n                if (o.plainObject(v)) {\n                  var j = v;\n                  S.applyBypass(this, j, !1), this.dirtyStyleCache(), this.dirtyCompoundBoundsCache(), this.emitAndNotify(\"style\");\n                } else if (o.string(v)) {\n                  if (k === void 0) {\n                    var I = this[0];\n                    return I ? S.getStylePropertyValue(I, v) : void 0;\n                  }\n                  S.applyBypass(this, v, k, !1), this.dirtyStyleCache(), this.dirtyCompoundBoundsCache(), this.emitAndNotify(\"style\");\n                } else if (v === void 0) {\n                  var R = this[0];\n                  return R ? S.getRawStyle(R) : void 0;\n                }\n                return this;\n              },\n              removeStyle: function(v) {\n                var k = this.cy();\n                if (!k.styleEnabled()) return this;\n                var s = k.style();\n                if (v === void 0)\n                  for (var S = 0; S < this.length; S++) {\n                    var j = this[S];\n                    s.removeAllBypasses(j, !1);\n                  }\n                else {\n                  v = v.split(/\\s+/);\n                  for (var I = 0; I < this.length; I++) {\n                    var R = this[I];\n                    s.removeBypasses(R, v, !1);\n                  }\n                }\n                return this.dirtyStyleCache(), this.dirtyCompoundBoundsCache(), this.emitAndNotify(\"style\"), this;\n              },\n              show: function() {\n                return this.css(\"display\", \"element\"), this;\n              },\n              hide: function() {\n                return this.css(\"display\", \"none\"), this;\n              },\n              effectiveOpacity: function() {\n                var v = this.cy();\n                if (!v.styleEnabled()) return 1;\n                var k = v.hasCompoundNodes(), s = this[0];\n                if (s) {\n                  var S = s._private, j = s.pstyle(\"opacity\").value;\n                  if (!k) return j;\n                  var I = S.data.parent ? s.parents() : null;\n                  if (I)\n                    for (var R = 0; R < I.length; R++)\n                      j *= I[R].pstyle(\"opacity\").value;\n                  return j;\n                }\n              },\n              transparent: function() {\n                if (!this.cy().styleEnabled()) return !1;\n                var v = this[0], k = v.cy().hasCompoundNodes();\n                return v ? k ? v.effectiveOpacity() === 0 : v.pstyle(\"opacity\").value === 0 : void 0;\n              },\n              backgrounding: function() {\n                return !!this.cy().styleEnabled() && !!this[0]._private.backgrounding;\n              }\n            };\n            function r(v, k) {\n              var s = v._private.data.parent ? v.parents() : null;\n              if (s) {\n                for (var S = 0; S < s.length; S++) if (!k(s[S])) return !1;\n              }\n              return !0;\n            }\n            function l(v) {\n              var k = v.ok, s = v.edgeOkViaNode || v.ok, S = v.parentOk || v.ok;\n              return function() {\n                var j = this.cy();\n                if (!j.styleEnabled()) return !0;\n                var I = this[0], R = j.hasCompoundNodes();\n                if (I) {\n                  var M = I._private;\n                  if (!k(I)) return !1;\n                  if (I.isNode()) return !R || r(I, S);\n                  var z = M.source, V = M.target;\n                  return s(z) && (!R || r(z, s)) && (z === V || s(V) && (!R || r(V, s)));\n                }\n              };\n            }\n            var h = a(\"eleTakesUpSpace\", function(v) {\n              return v.pstyle(\"display\").value === \"element\" && v.width() !== 0 && (!v.isNode() || v.height() !== 0);\n            });\n            t.takesUpSpace = n(\"takesUpSpace\", l({ ok: h }));\n            var i = a(\"eleInteractive\", function(v) {\n              return v.pstyle(\"events\").value === \"yes\" && v.pstyle(\"visibility\").value === \"visible\" && h(v);\n            }), d = a(\"parentInteractive\", function(v) {\n              return v.pstyle(\"visibility\").value === \"visible\" && h(v);\n            });\n            t.interactive = n(\n              \"interactive\",\n              l({ ok: i, parentOk: d, edgeOkViaNode: h })\n            ), t.noninteractive = function() {\n              var v = this[0];\n              if (v) return !v.interactive();\n            };\n            var p = a(\"eleVisible\", function(v) {\n              return v.pstyle(\"visibility\").value === \"visible\" && v.pstyle(\"opacity\").pfValue !== 0 && h(v);\n            }), f = h;\n            t.visible = n(\"visible\", l({ ok: p, edgeOkViaNode: f })), t.hidden = function() {\n              var v = this[0];\n              if (v) return !v.visible();\n            }, t.bypass = t.css = t.style, t.renderedCss = t.renderedStyle, t.removeBypass = t.removeCss = t.removeStyle, t.pstyle = t.parsedStyle, y.exports = t;\n          },\n          function(y, x, g) {\n            var o = {};\n            function c(n) {\n              return function() {\n                var t = arguments, r = [];\n                if (t.length === 2) {\n                  var l = t[0], h = t[1];\n                  this.on(n.event, l, h);\n                } else if (t.length === 1) {\n                  var i = t[0];\n                  this.on(n.event, i);\n                } else if (t.length === 0) {\n                  for (var d = 0; d < this.length; d++) {\n                    var p = this[d], f = !n.ableField || p._private[n.ableField], v = p._private[n.field] != n.value;\n                    if (n.overrideAble) {\n                      var k = n.overrideAble(p);\n                      if (k !== void 0 && (f = k, !k)) return this;\n                    }\n                    f && (p._private[n.field] = n.value, v && r.push(p));\n                  }\n                  var s = this.spawn(r);\n                  s.updateStyle(), s.emit(n.event);\n                }\n                return this;\n              };\n            }\n            function a(n) {\n              o[n.field] = function() {\n                var t = this[0];\n                if (t) {\n                  if (n.overrideField) {\n                    var r = n.overrideField(t);\n                    if (r !== void 0) return r;\n                  }\n                  return t._private[n.field];\n                }\n              }, o[n.on] = c({\n                event: n.on,\n                field: n.field,\n                ableField: n.ableField,\n                overrideAble: n.overrideAble,\n                value: !0\n              }), o[n.off] = c({\n                event: n.off,\n                field: n.field,\n                ableField: n.ableField,\n                overrideAble: n.overrideAble,\n                value: !1\n              });\n            }\n            a({\n              field: \"locked\",\n              overrideField: function(n) {\n                return !!n.cy().autolock() || void 0;\n              },\n              on: \"lock\",\n              off: \"unlock\"\n            }), a({\n              field: \"grabbable\",\n              overrideField: function(n) {\n                return !n.cy().autoungrabify() && void 0;\n              },\n              on: \"grabify\",\n              off: \"ungrabify\"\n            }), a({\n              field: \"selected\",\n              ableField: \"selectable\",\n              overrideAble: function(n) {\n                return !n.cy().autounselectify() && void 0;\n              },\n              on: \"select\",\n              off: \"unselect\"\n            }), a({\n              field: \"selectable\",\n              overrideField: function(n) {\n                return !n.cy().autounselectify() && void 0;\n              },\n              on: \"selectify\",\n              off: \"unselectify\"\n            }), o.deselect = o.unselect, o.grabbed = function() {\n              var n = this[0];\n              if (n) return n._private.grabbed;\n            }, a({ field: \"active\", on: \"activate\", off: \"unactivate\" }), o.inactive = function() {\n              var n = this[0];\n              if (n) return !n._private.active;\n            }, y.exports = o;\n          },\n          function(y, x, g) {\n            var o = g(1), c = g(0), a = {}, n = function(p, f) {\n              return function(v, k, s, S) {\n                var j = v, I = void 0;\n                if (j == null ? I = \"null\" : c.elementOrCollection(j) && j.length === 1 && (I = \"#\" + j.id()), this.length === 1 && I) {\n                  var R = this[0]._private, M = R.traversalCache = R.traversalCache || {}, z = M[f] = M[f] || {}, V = z[I];\n                  return V || (z[I] = p.call(this, v, k, s, S));\n                }\n                return p.call(this, v, k, s, S);\n              };\n            }, t = function(p) {\n              return function(f) {\n                for (var v = [], k = 0; k < this.length; k++) {\n                  var s = this[k];\n                  if (s.isNode()) {\n                    for (var S = !1, j = s.connectedEdges(), I = 0; I < j.length; I++) {\n                      var R = j[I], M = R.source(), z = R.target();\n                      if (p.noIncomingEdges && z === s && M !== s || p.noOutgoingEdges && M === s && z !== s) {\n                        S = !0;\n                        break;\n                      }\n                    }\n                    S || v.push(s);\n                  }\n                }\n                return this.spawn(v, { unique: !0 }).filter(f);\n              };\n            }, r = function(p) {\n              return function(f) {\n                for (var v = [], k = 0; k < this.length; k++) {\n                  var s = this[k];\n                  if (s.isNode())\n                    for (var S = s.connectedEdges(), j = 0; j < S.length; j++) {\n                      var I = S[j], R = I.source(), M = I.target();\n                      p.outgoing && R === s ? (v.push(I), v.push(M)) : p.incoming && M === s && (v.push(I), v.push(R));\n                    }\n                }\n                return this.spawn(v, { unique: !0 }).filter(f);\n              };\n            }, l = function(p) {\n              return function(f) {\n                for (var v = this, k = [], s = {}; ; ) {\n                  var S = p.outgoing ? v.outgoers() : v.incomers();\n                  if (S.length === 0) break;\n                  for (var j = !1, I = 0; I < S.length; I++) {\n                    var R = S[I], M = R.id();\n                    s[M] || (s[M] = !0, k.push(R), j = !0);\n                  }\n                  if (!j) break;\n                  v = S;\n                }\n                return this.spawn(k, { unique: !0 }).filter(f);\n              };\n            };\n            function h(p) {\n              return function(f) {\n                for (var v = [], k = 0; k < this.length; k++) {\n                  var s = this[k]._private[p.attr];\n                  s && v.push(s);\n                }\n                return this.spawn(v, { unique: !0 }).filter(f);\n              };\n            }\n            function i(p) {\n              return function(f) {\n                var v = [], k = this._private.cy, s = p || {};\n                c.string(f) && (f = k.$(f));\n                for (var S = 0; S < f.length; S++)\n                  for (var j = f[S]._private.edges, I = 0; I < j.length; I++) {\n                    var R = j[I], M = R._private.data, z = this.hasElementWithId(M.source) && f.hasElementWithId(M.target), V = f.hasElementWithId(M.source) && this.hasElementWithId(M.target);\n                    if (z || V) {\n                      if ((s.thisIsSrc || s.thisIsTgt) && (s.thisIsSrc && !z || s.thisIsTgt && !V))\n                        continue;\n                      v.push(R);\n                    }\n                  }\n                return this.spawn(v, { unique: !0 });\n              };\n            }\n            function d(p) {\n              return p = o.extend({}, { codirected: !1 }, p), function(f) {\n                for (var v = [], k = this.edges(), s = p, S = 0; S < k.length; S++)\n                  for (var j = k[S]._private, I = j.source, R = I._private.data.id, M = j.data.target, z = I._private.edges, V = 0; V < z.length; V++) {\n                    var G = z[V], Y = G._private.data, tt = Y.target, Z = Y.source, at = tt === M && Z === R, nt = R === tt && M === Z;\n                    (s.codirected && at || !s.codirected && (at || nt)) && v.push(G);\n                  }\n                return this.spawn(v, { unique: !0 }).filter(f);\n              };\n            }\n            a.clearTraversalCache = function() {\n              for (var p = 0; p < this.length; p++)\n                this[p]._private.traversalCache = null;\n            }, o.extend(a, {\n              roots: t({ noIncomingEdges: !0 }),\n              leaves: t({ noOutgoingEdges: !0 }),\n              outgoers: n(r({ outgoing: !0 }), \"outgoers\"),\n              successors: l({ outgoing: !0 }),\n              incomers: n(r({ incoming: !0 }), \"incomers\"),\n              predecessors: l({ incoming: !0 })\n            }), o.extend(a, {\n              neighborhood: n(function(p) {\n                for (var f = [], v = this.nodes(), k = 0; k < v.length; k++)\n                  for (var s = v[k], S = s.connectedEdges(), j = 0; j < S.length; j++) {\n                    var I = S[j], R = I.source(), M = I.target(), z = s === R ? M : R;\n                    z.length > 0 && f.push(z[0]), f.push(I[0]);\n                  }\n                return this.spawn(f, { unique: !0 }).filter(p);\n              }, \"neighborhood\"),\n              closedNeighborhood: function(p) {\n                return this.neighborhood().add(this).filter(p);\n              },\n              openNeighborhood: function(p) {\n                return this.neighborhood(p);\n              }\n            }), a.neighbourhood = a.neighborhood, a.closedNeighbourhood = a.closedNeighborhood, a.openNeighbourhood = a.openNeighborhood, o.extend(a, {\n              source: n(function(p) {\n                var f = this[0], v = void 0;\n                return f && (v = f._private.source || f.cy().collection()), v && p ? v.filter(p) : v;\n              }, \"source\"),\n              target: n(function(p) {\n                var f = this[0], v = void 0;\n                return f && (v = f._private.target || f.cy().collection()), v && p ? v.filter(p) : v;\n              }, \"target\"),\n              sources: h({ attr: \"source\" }),\n              targets: h({ attr: \"target\" })\n            }), o.extend(a, {\n              edgesWith: n(i(), \"edgesWith\"),\n              edgesTo: n(i({ thisIsSrc: !0 }), \"edgesTo\")\n            }), o.extend(a, {\n              connectedEdges: n(function(p) {\n                for (var f = [], v = 0; v < this.length; v++) {\n                  var k = this[v];\n                  if (k.isNode())\n                    for (var s = k._private.edges, S = 0; S < s.length; S++) {\n                      var j = s[S];\n                      f.push(j);\n                    }\n                }\n                return this.spawn(f, { unique: !0 }).filter(p);\n              }, \"connectedEdges\"),\n              connectedNodes: n(function(p) {\n                for (var f = [], v = 0; v < this.length; v++) {\n                  var k = this[v];\n                  k.isEdge() && (f.push(k.source()[0]), f.push(k.target()[0]));\n                }\n                return this.spawn(f, { unique: !0 }).filter(p);\n              }, \"connectedNodes\"),\n              parallelEdges: n(d(), \"parallelEdges\"),\n              codirectedEdges: n(d({ codirected: !0 }), \"codirectedEdges\")\n            }), o.extend(a, {\n              components: function() {\n                var p = this, f = p.cy(), v = p.spawn(), k = p.nodes().spawnSelf(), s = [], S = function(I, R) {\n                  v.merge(I), k.unmerge(I), R.merge(I);\n                };\n                if (k.empty()) return p.spawn();\n                var j = function() {\n                  var I = f.collection();\n                  s.push(I);\n                  var R = k[0];\n                  S(R, I), p.bfs({\n                    directed: !1,\n                    roots: R,\n                    visit: function(M, z, V, G, Y) {\n                      S(M, I);\n                    }\n                  });\n                };\n                do\n                  j();\n                while (k.length > 0);\n                return s.map(function(I) {\n                  var R = I.connectedEdges().stdFilter(function(M) {\n                    return I.anySame(M.source()) && I.anySame(M.target());\n                  });\n                  return I.union(R);\n                });\n              }\n            }), y.exports = a;\n          },\n          function(y, x, g) {\n            var o = g(0), c = g(1), a = g(7), n = g(14), t = {\n              add: function(r) {\n                var l = void 0, h = this;\n                if (o.elementOrCollection(r)) {\n                  var i = r;\n                  if (i._private.cy === h) l = i.restore();\n                  else {\n                    for (var d = [], p = 0; p < i.length; p++) {\n                      var f = i[p];\n                      d.push(f.json());\n                    }\n                    l = new a(h, d);\n                  }\n                } else if (o.array(r)) l = new a(h, r);\n                else if (o.plainObject(r) && (o.array(r.nodes) || o.array(r.edges))) {\n                  for (var v = r, k = [], s = [\"nodes\", \"edges\"], S = 0, j = s.length; S < j; S++) {\n                    var I = s[S], R = v[I];\n                    if (o.array(R))\n                      for (var M = 0, z = R.length; M < z; M++) {\n                        var V = c.extend({ group: I }, R[M]);\n                        k.push(V);\n                      }\n                  }\n                  l = new a(h, k);\n                } else l = new n(h, r).collection();\n                return l;\n              },\n              remove: function(r) {\n                if (!o.elementOrCollection(r)) {\n                  if (o.string(r)) {\n                    var l = r;\n                    r = this.$(l);\n                  }\n                }\n                return r.remove();\n              }\n            };\n            y.exports = t;\n          },\n          function(y, x, g) {\n            var o = g(4), c = g(1), a = g(71), n = {\n              animate: o.animate(),\n              animation: o.animation(),\n              animated: o.animated(),\n              clearQueue: o.clearQueue(),\n              delay: o.delay(),\n              delayAnimation: o.delayAnimation(),\n              stop: o.stop(),\n              addToAnimationPool: function(t) {\n                this.styleEnabled() && this._private.aniEles.merge(t);\n              },\n              stopAnimationLoop: function() {\n                this._private.animationsRunning = !1;\n              },\n              startAnimationLoop: function() {\n                var t = this;\n                if (t._private.animationsRunning = !0, t.styleEnabled()) {\n                  var r = t.renderer();\n                  r && r.beforeRender ? r.beforeRender(function(l, h) {\n                    a(h, t);\n                  }, r.beforeRenderPriorities.animations) : function l() {\n                    t._private.animationsRunning && c.requestAnimationFrame(function(h) {\n                      a(h, t), l();\n                    });\n                  }();\n                }\n              }\n            };\n            y.exports = n;\n          },\n          function(y, x, g) {\n            var o = g(72), c = g(77);\n            y.exports = function(a, n) {\n              var t = n._private.aniEles, r = [];\n              function l(f, v) {\n                var k = f._private, s = k.animation.current, S = k.animation.queue, j = !1;\n                if (!v && f.pstyle(\"display\").value === \"none\") {\n                  s = s.splice(0, s.length).concat(S.splice(0, S.length));\n                  for (var I = 0; I < s.length; I++) s[I].stop();\n                }\n                if (s.length === 0) {\n                  var R = S.shift();\n                  R && s.push(R);\n                }\n                for (var M = function(Y) {\n                  for (var tt = Y.length - 1; tt >= 0; tt--) (0, Y[tt])();\n                  Y.splice(0, Y.length);\n                }, z = s.length - 1; z >= 0; z--) {\n                  var V = s[z], G = V._private;\n                  G.stopped ? (s.splice(z, 1), G.hooked = !1, G.playing = !1, G.started = !1, M(G.frames)) : (G.playing || G.applying) && (G.playing && G.applying && (G.applying = !1), G.started || c(f, V, a, v), o(f, V, a, v), G.applying && (G.applying = !1), M(G.frames), V.completed() && (s.splice(z, 1), G.hooked = !1, G.playing = !1, G.started = !1, M(G.completes)), j = !0);\n                }\n                return v || s.length !== 0 || S.length !== 0 || r.push(f), j;\n              }\n              for (var h = !1, i = 0; i < t.length; i++) {\n                var d = l(t[i]);\n                h = h || d;\n              }\n              var p = l(n, !0);\n              (h || p) && (t.length > 0 ? (t.dirtyCompoundBoundsCache(), n.notify({ type: \"draw\", eles: t })) : n.notify({ type: \"draw\" })), t.unmerge(r), n.emit(\"step\");\n            };\n          },\n          function(y, x, g) {\n            var o = g(73), c = g(76), a = g(0);\n            function n(t, r) {\n              return !!(t != null && r != null && (a.number(t) && a.number(r) || t && r));\n            }\n            y.exports = function(t, r, l, h) {\n              var i = !h, d = t._private, p = r._private, f = p.easing, v = p.startTime, k = (h ? t : t.cy()).style();\n              if (!p.easingImpl)\n                if (f == null) p.easingImpl = o.linear;\n                else {\n                  var s = void 0;\n                  s = a.string(f) ? k.parse(\"transition-timing-function\", f).value : f;\n                  var S = void 0, j = void 0;\n                  a.string(s) ? (S = s, j = []) : (S = s[1], j = s.slice(2).map(function(be) {\n                    return +be;\n                  })), j.length > 0 ? (S === \"spring\" && j.push(p.duration), p.easingImpl = o[S].apply(null, j)) : p.easingImpl = o[S];\n                }\n              var I = p.easingImpl, R = void 0;\n              if (R = p.duration === 0 ? 1 : (l - v) / p.duration, p.applying && (R = p.progress), R < 0 ? R = 0 : R > 1 && (R = 1), p.delay == null) {\n                var M = p.startPosition, z = p.position;\n                if (z && i && !t.locked()) {\n                  var V = t.position();\n                  n(M.x, z.x) && (V.x = c(M.x, z.x, R, I)), n(M.y, z.y) && (V.y = c(M.y, z.y, R, I)), t.emit(\"position\");\n                }\n                var G = p.startPan, Y = p.pan, tt = d.pan, Z = Y != null && h;\n                Z && (n(G.x, Y.x) && (tt.x = c(G.x, Y.x, R, I)), n(G.y, Y.y) && (tt.y = c(G.y, Y.y, R, I)), t.emit(\"pan\"));\n                var at = p.startZoom, nt = p.zoom, ht = nt != null && h;\n                ht && (n(at, nt) && (d.zoom = c(at, nt, R, I)), t.emit(\"zoom\")), (Z || ht) && t.emit(\"viewport\");\n                var ct = p.style;\n                if (ct && ct.length > 0 && i) {\n                  for (var ot = 0; ot < ct.length; ot++) {\n                    var gt = ct[ot], xt = gt.name, St = gt, zt = p.startStyle[xt], Nt = k.properties[zt.name], re = c(zt, St, R, I, Nt);\n                    k.overrideBypass(t, xt, re);\n                  }\n                  t.emit(\"style\");\n                }\n              }\n              return p.progress = R, R;\n            };\n          },\n          function(y, x, g) {\n            var o = g(74), c = g(75), a = function(t, r, l, h) {\n              var i = o(t, r, l, h);\n              return function(d, p, f) {\n                return d + (p - d) * i(f);\n              };\n            }, n = {\n              linear: function(t, r, l) {\n                return t + (r - t) * l;\n              },\n              ease: a(0.25, 0.1, 0.25, 1),\n              \"ease-in\": a(0.42, 0, 1, 1),\n              \"ease-out\": a(0, 0, 0.58, 1),\n              \"ease-in-out\": a(0.42, 0, 0.58, 1),\n              \"ease-in-sine\": a(0.47, 0, 0.745, 0.715),\n              \"ease-out-sine\": a(0.39, 0.575, 0.565, 1),\n              \"ease-in-out-sine\": a(0.445, 0.05, 0.55, 0.95),\n              \"ease-in-quad\": a(0.55, 0.085, 0.68, 0.53),\n              \"ease-out-quad\": a(0.25, 0.46, 0.45, 0.94),\n              \"ease-in-out-quad\": a(0.455, 0.03, 0.515, 0.955),\n              \"ease-in-cubic\": a(0.55, 0.055, 0.675, 0.19),\n              \"ease-out-cubic\": a(0.215, 0.61, 0.355, 1),\n              \"ease-in-out-cubic\": a(0.645, 0.045, 0.355, 1),\n              \"ease-in-quart\": a(0.895, 0.03, 0.685, 0.22),\n              \"ease-out-quart\": a(0.165, 0.84, 0.44, 1),\n              \"ease-in-out-quart\": a(0.77, 0, 0.175, 1),\n              \"ease-in-quint\": a(0.755, 0.05, 0.855, 0.06),\n              \"ease-out-quint\": a(0.23, 1, 0.32, 1),\n              \"ease-in-out-quint\": a(0.86, 0, 0.07, 1),\n              \"ease-in-expo\": a(0.95, 0.05, 0.795, 0.035),\n              \"ease-out-expo\": a(0.19, 1, 0.22, 1),\n              \"ease-in-out-expo\": a(1, 0, 0, 1),\n              \"ease-in-circ\": a(0.6, 0.04, 0.98, 0.335),\n              \"ease-out-circ\": a(0.075, 0.82, 0.165, 1),\n              \"ease-in-out-circ\": a(0.785, 0.135, 0.15, 0.86),\n              spring: function(t, r, l) {\n                if (l === 0) return n.linear;\n                var h = c(t, r, l);\n                return function(i, d, p) {\n                  return i + (d - i) * h(p);\n                };\n              },\n              \"cubic-bezier\": a\n            };\n            y.exports = n;\n          },\n          function(y, x, g) {\n            /*! Bezier curve function generator. Copyright Gaetan Renaudeau. MIT License: http://en.wikipedia.org/wiki/MIT_License */\n            y.exports = function(o, c, a, n) {\n              var t = 4, r = 1e-3, l = 1e-7, h = 10, i = 11, d = 1 / (i - 1), p = typeof Float32Array < \"u\";\n              if (arguments.length !== 4) return !1;\n              for (var f = 0; f < 4; ++f)\n                if (typeof arguments[f] != \"number\" || isNaN(arguments[f]) || !isFinite(arguments[f]))\n                  return !1;\n              o = Math.min(o, 1), a = Math.min(a, 1), o = Math.max(o, 0), a = Math.max(a, 0);\n              var v = p ? new Float32Array(i) : new Array(i);\n              function k(at, nt) {\n                return 1 - 3 * nt + 3 * at;\n              }\n              function s(at, nt) {\n                return 3 * nt - 6 * at;\n              }\n              function S(at) {\n                return 3 * at;\n              }\n              function j(at, nt, ht) {\n                return ((k(nt, ht) * at + s(nt, ht)) * at + S(nt)) * at;\n              }\n              function I(at, nt, ht) {\n                return 3 * k(nt, ht) * at * at + 2 * s(nt, ht) * at + S(nt);\n              }\n              function R(at, nt) {\n                for (var ht = 0; ht < t; ++ht) {\n                  var ct = I(nt, o, a);\n                  if (ct === 0) return nt;\n                  nt -= (j(nt, o, a) - at) / ct;\n                }\n                return nt;\n              }\n              function M() {\n                for (var at = 0; at < i; ++at) v[at] = j(at * d, o, a);\n              }\n              function z(at, nt, ht) {\n                var ct = void 0, ot = void 0, gt = 0;\n                do\n                  (ct = j(ot = nt + (ht - nt) / 2, o, a) - at) > 0 ? ht = ot : nt = ot;\n                while (Math.abs(ct) > l && ++gt < h);\n                return ot;\n              }\n              function V(at) {\n                for (var nt = 0, ht = 1, ct = i - 1; ht !== ct && v[ht] <= at; ++ht)\n                  nt += d;\n                --ht;\n                var ot = nt + (at - v[ht]) / (v[ht + 1] - v[ht]) * d, gt = I(ot, o, a);\n                return gt >= r ? R(at, ot) : gt === 0 ? ot : z(at, nt, nt + d);\n              }\n              var G = !1;\n              function Y() {\n                G = !0, o === c && a === n || M();\n              }\n              var tt = function(at) {\n                return G || Y(), o === c && a === n ? at : at === 0 ? 0 : at === 1 ? 1 : j(V(at), c, n);\n              };\n              tt.getControlPoints = function() {\n                return [\n                  { x: o, y: c },\n                  { x: a, y: n }\n                ];\n              };\n              var Z = \"generateBezier(\" + [o, c, a, n] + \")\";\n              return tt.toString = function() {\n                return Z;\n              }, tt;\n            };\n          },\n          function(y, x, g) {\n            /*! Runge-Kutta spring physics function generator. Adapted from Framer.js, copyright Koen Bok. MIT License: http://en.wikipedia.org/wiki/MIT_License */\n            var o = /* @__PURE__ */ function() {\n              function c(t) {\n                return -t.tension * t.x - t.friction * t.v;\n              }\n              function a(t, r, l) {\n                var h = {\n                  x: t.x + l.dx * r,\n                  v: t.v + l.dv * r,\n                  tension: t.tension,\n                  friction: t.friction\n                };\n                return { dx: h.v, dv: c(h) };\n              }\n              function n(t, r) {\n                var l = { dx: t.v, dv: c(t) }, h = a(t, 0.5 * r, l), i = a(t, 0.5 * r, h), d = a(t, r, i), p = 1 / 6 * (l.dx + 2 * (h.dx + i.dx) + d.dx), f = 1 / 6 * (l.dv + 2 * (h.dv + i.dv) + d.dv);\n                return t.x = t.x + p * r, t.v = t.v + f * r, t;\n              }\n              return function t(r, l, h) {\n                var i, d = { x: -1, v: 0, tension: null, friction: null }, p = [0], f = 0, v = void 0, k = void 0;\n                for (r = parseFloat(r) || 500, l = parseFloat(l) || 20, h = h || null, d.tension = r, d.friction = l, v = (i = h !== null) ? (f = t(r, l)) / h * 0.016 : 0.016; k = n(k || d, v), p.push(1 + k.x), f += 16, Math.abs(k.x) > 1e-4 && Math.abs(k.v) > 1e-4; ) ;\n                return i ? function(s) {\n                  return p[s * (p.length - 1) | 0];\n                } : f;\n              };\n            }();\n            y.exports = o;\n          },\n          function(y, x, g) {\n            var o = g(0);\n            function c(n, t, r, l, h) {\n              if (l === 1) return r;\n              var i = h(t, r, l);\n              return n == null || ((n.roundValue || n.color) && (i = Math.round(i)), n.min !== void 0 && (i = Math.max(i, n.min)), n.max !== void 0 && (i = Math.min(i, n.max))), i;\n            }\n            function a(n, t) {\n              return n.pfValue != null || n.value != null ? n.pfValue == null || t != null && t.type.units === \"%\" ? n.value : n.pfValue : n;\n            }\n            y.exports = function(n, t, r, l, h) {\n              var i = h != null ? h.type : null;\n              r < 0 ? r = 0 : r > 1 && (r = 1);\n              var d = a(n, h), p = a(t, h);\n              if (o.number(d) && o.number(p)) return c(i, d, p, r, l);\n              if (o.array(d) && o.array(p)) {\n                for (var f = [], v = 0; v < p.length; v++) {\n                  var k = d[v], s = p[v];\n                  if (k != null && s != null) {\n                    var S = c(i, k, s, r, l);\n                    f.push(S);\n                  } else f.push(s);\n                }\n                return f;\n              }\n            };\n          },\n          function(y, x, g) {\n            y.exports = function(o, c, a, n) {\n              var t = !n, r = o, l = c._private, h = n ? o : o.cy(), i = h.style();\n              if (t) {\n                var d = r.position();\n                l.startPosition = l.startPosition || { x: d.x, y: d.y }, l.startStyle = l.startStyle || i.getAnimationStartStyle(r, l.style);\n              }\n              if (n) {\n                var p = h._private.pan;\n                l.startPan = l.startPan || { x: p.x, y: p.y }, l.startZoom = l.startZoom != null ? l.startZoom : h._private.zoom;\n              }\n              l.started = !0, l.startTime = a - l.progress * l.duration;\n            };\n          },\n          function(y, x, g) {\n            var o = g(11), c = g(4), a = g(0), n = g(1), t = g(6), r = {\n              qualifierCompare: function(i, d) {\n                return i == null || d == null ? i == null && d == null : i.sameText(d);\n              },\n              eventMatches: function(i, d, p) {\n                var f = d.qualifier;\n                return f == null || i !== p.target && a.element(p.target) && f.matches(p.target);\n              },\n              eventFields: function(i) {\n                return { cy: i, target: i };\n              },\n              callbackContext: function(i, d, p) {\n                return d.qualifier != null ? p.target : i;\n              }\n            }, l = function(i) {\n              return a.string(i) ? new t(i) : i;\n            }, h = {\n              createEmitter: function() {\n                var i = this._private;\n                return i.emitter || (i.emitter = new o(n.assign({ context: this }, r))), this;\n              },\n              emitter: function() {\n                return this._private.emitter;\n              },\n              on: function(i, d, p) {\n                return this.emitter().on(i, l(d), p), this;\n              },\n              removeListener: function(i, d, p) {\n                return this.emitter().removeListener(i, l(d), p), this;\n              },\n              one: function(i, d, p) {\n                return this.emitter().one(i, l(d), p), this;\n              },\n              once: function(i, d, p) {\n                return this.emitter().one(i, l(d), p), this;\n              },\n              emit: function(i, d) {\n                return this.emitter().emit(i, d), this;\n              }\n            };\n            c.eventAliasesOn(h), y.exports = h;\n          },\n          function(y, x, g) {\n            var o = {\n              png: function(c) {\n                return c = c || {}, this._private.renderer.png(c);\n              },\n              jpg: function(c) {\n                var a = this._private.renderer;\n                return (c = c || {}).bg = c.bg || \"#fff\", a.jpg(c);\n              }\n            };\n            o.jpeg = o.jpg, y.exports = o;\n          },\n          function(y, x, g) {\n            var o = g(1), c = g(0), a = {\n              layout: function(n) {\n                if (n != null)\n                  if (n.name != null) {\n                    var t = n.name, r = this.extension(\"layout\", t);\n                    if (r != null) {\n                      var l = void 0;\n                      l = c.string(n.eles) ? this.$(n.eles) : n.eles != null ? n.eles : this.$();\n                      var h = new r(o.extend({}, n, { cy: this, eles: l }));\n                      return h;\n                    }\n                    o.error(\n                      \"Can not apply layout: No such layout `\" + t + \"` found; did you include its JS file?\"\n                    );\n                  } else\n                    o.error(\"A `name` must be specified to make a layout\");\n                else\n                  o.error(\n                    \"Layout options must be specified to make a layout\"\n                  );\n              }\n            };\n            a.createLayout = a.makeLayout = a.layout, y.exports = a;\n          },\n          function(y, x, g) {\n            var o = {\n              notify: function(c) {\n                var a = this._private;\n                if (a.batchingNotify) {\n                  var n = a.batchNotifyEles, t = a.batchNotifyTypes;\n                  return c.eles && n.merge(c.eles), void (t.ids[c.type] || (t.push(c.type), t.ids[c.type] = !0));\n                }\n                if (a.notificationsEnabled) {\n                  var r = this.renderer();\n                  !this.isDestroyed() && r && r.notify(c);\n                }\n              },\n              notifications: function(c) {\n                var a = this._private;\n                if (c === void 0) return a.notificationsEnabled;\n                a.notificationsEnabled = !!c;\n              },\n              noNotifications: function(c) {\n                this.notifications(!1), c(), this.notifications(!0);\n              },\n              batching: function() {\n                return this._private.batchCount > 0;\n              },\n              startBatch: function() {\n                var c = this._private;\n                return c.batchCount == null && (c.batchCount = 0), c.batchCount === 0 && (c.batchingStyle = c.batchingNotify = !0, c.batchStyleEles = this.collection(), c.batchNotifyEles = this.collection(), c.batchNotifyTypes = [], c.batchNotifyTypes.ids = {}), c.batchCount++, this;\n              },\n              endBatch: function() {\n                var c = this._private;\n                return c.batchCount--, c.batchCount === 0 && (c.batchingStyle = !1, c.batchStyleEles.updateStyle(), c.batchingNotify = !1, this.notify({\n                  type: c.batchNotifyTypes,\n                  eles: c.batchNotifyEles\n                })), this;\n              },\n              batch: function(c) {\n                return this.startBatch(), c(), this.endBatch(), this;\n              },\n              batchData: function(c) {\n                var a = this;\n                return this.batch(function() {\n                  for (var n = Object.keys(c), t = 0; t < n.length; t++) {\n                    var r = n[t], l = c[r];\n                    a.getElementById(r).data(l);\n                  }\n                });\n              }\n            };\n            y.exports = o;\n          },\n          function(y, x, g) {\n            var o = g(1), c = {\n              renderTo: function(a, n, t, r) {\n                return this._private.renderer.renderTo(a, n, t, r), this;\n              },\n              renderer: function() {\n                return this._private.renderer;\n              },\n              forceRender: function() {\n                return this.notify({ type: \"draw\" }), this;\n              },\n              resize: function() {\n                return this.invalidateSize(), this.notify({ type: \"resize\" }), this.emit(\"resize\"), this;\n              },\n              initRenderer: function(a) {\n                var n = this.extension(\"renderer\", a.name);\n                n != null ? (this._private.renderer = new n(\n                  o.extend({}, a, { cy: this })\n                ), this.notify({ type: \"init\" })) : o.error(\n                  \"Can not initialise: No such renderer `%s` found; did you include its JS file?\",\n                  a.name\n                );\n              },\n              destroyRenderer: function() {\n                this.notify({ type: \"destroy\" });\n                var a = this.container();\n                if (a)\n                  for (a._cyreg = null; a.childNodes.length > 0; )\n                    a.removeChild(a.childNodes[0]);\n                this._private.renderer = null;\n              },\n              onRender: function(a) {\n                return this.on(\"render\", a);\n              },\n              offRender: function(a) {\n                return this.off(\"render\", a);\n              }\n            };\n            c.invalidateDimensions = c.resize, y.exports = c;\n          },\n          function(y, x, g) {\n            var o = g(0), c = g(7), a = {\n              collection: function(n, t) {\n                return o.string(n) ? this.$(n) : o.elementOrCollection(n) ? n.collection() : o.array(n) ? new c(this, n, t) : new c(this);\n              },\n              nodes: function(n) {\n                var t = this.$(function(r) {\n                  return r.isNode();\n                });\n                return n ? t.filter(n) : t;\n              },\n              edges: function(n) {\n                var t = this.$(function(r) {\n                  return r.isEdge();\n                });\n                return n ? t.filter(n) : t;\n              },\n              $: function(n) {\n                var t = this._private.elements;\n                return n ? t.filter(n) : t.spawnSelf();\n              },\n              mutableElements: function() {\n                return this._private.elements;\n              }\n            };\n            a.elements = a.filter = a.$, y.exports = a;\n          },\n          function(y, x, g) {\n            var o = g(0), c = g(18), a = {\n              style: function(n) {\n                return n && this.setStyle(n).update(), this._private.style;\n              },\n              setStyle: function(n) {\n                var t = this._private;\n                return o.stylesheet(n) ? t.style = n.generateStyle(this) : o.array(n) ? t.style = c.fromJson(this, n) : o.string(n) ? t.style = c.fromString(this, n) : t.style = c(this), t.style;\n              }\n            };\n            y.exports = a;\n          },\n          function(y, x, g) {\n            var o = g(1), c = g(0), a = g(5), n = {\n              apply: function(t) {\n                var r = this._private, l = r.cy.collection();\n                r.newStyle && (r.contextStyles = {}, r.propDiffs = {}, this.cleanElements(t, !0));\n                for (var h = 0; h < t.length; h++) {\n                  var i = t[h], d = this.getContextMeta(i);\n                  if (!d.empty) {\n                    l.merge(i);\n                    var p = this.getContextStyle(d), f = this.applyContextStyle(d, p, i);\n                    r.newStyle || this.updateTransitions(i, f.diffProps), this.updateStyleHints(i);\n                  }\n                }\n                return r.newStyle = !1, l;\n              },\n              getPropertiesDiff: function(t, r) {\n                var l = this._private.propDiffs = this._private.propDiffs || {}, h = t + \"-\" + r, i = l[h];\n                if (i) return i;\n                for (var d = [], p = {}, f = 0; f < this.length; f++) {\n                  var v = this[f], k = t[f] === \"t\" != (r[f] === \"t\"), s = v.mappedProperties.length > 0;\n                  if (k || s) {\n                    var S = void 0;\n                    k && s || k ? S = v.properties : s && (S = v.mappedProperties);\n                    for (var j = 0; j < S.length; j++) {\n                      for (var I = S[j], R = I.name, M = !1, z = f + 1; z < this.length; z++) {\n                        var V = this[z];\n                        if (r[z] === \"t\" && (M = V.properties[I.name] != null))\n                          break;\n                      }\n                      p[R] || M || (p[R] = !0, d.push(R));\n                    }\n                  }\n                }\n                return l[h] = d, d;\n              },\n              getContextMeta: function(t) {\n                var r, l = \"\", h = t._private.styleCxtKey || \"\";\n                this._private.newStyle && (h = \"\");\n                for (var i = 0; i < this.length; i++) {\n                  var d = this[i];\n                  l += d.selector && d.selector.matches(t) ? \"t\" : \"f\";\n                }\n                return r = this.getPropertiesDiff(h, l), t._private.styleCxtKey = l, { key: l, diffPropNames: r, empty: r.length === 0 };\n              },\n              getContextStyle: function(t) {\n                var r = t.key, l = this._private.contextStyles = this._private.contextStyles || {};\n                if (l[r]) return l[r];\n                for (var h = { _private: { key: r } }, i = 0; i < this.length; i++) {\n                  var d = this[i];\n                  if (r[i] === \"t\")\n                    for (var p = 0; p < d.properties.length; p++) {\n                      var f = d.properties[p];\n                      h[f.name] = f;\n                    }\n                }\n                return l[r] = h, h;\n              },\n              applyContextStyle: function(t, r, l) {\n                for (var h = t.diffPropNames, i = {}, d = 0; d < h.length; d++) {\n                  var p = h[d], f = r[p], v = l.pstyle(p);\n                  if (!f) {\n                    if (!v) continue;\n                    f = v.bypass ? { name: p, deleteBypassed: !0 } : { name: p, delete: !0 };\n                  }\n                  if (v !== f) {\n                    var k = i[p] = { prev: v };\n                    this.applyParsedProperty(l, f), k.next = l.pstyle(p), k.next && k.next.bypass && (k.next = k.next.bypassed);\n                  }\n                }\n                return { diffProps: i };\n              },\n              updateStyleHints: function(t) {\n                var r = t._private;\n                if (!t.removed()) {\n                  var l = !1;\n                  if (r.group === \"nodes\") {\n                    for (var h = 1; h <= this.pieBackgroundN; h++)\n                      if (t.pstyle(\"pie-\" + h + \"-background-size\").value > 0) {\n                        l = !0;\n                        break;\n                      }\n                  }\n                  r.hasPie = l;\n                  var i = t.pstyle(\"text-transform\").strValue, d = t.pstyle(\"label\").strValue, p = t.pstyle(\"source-label\").strValue, f = t.pstyle(\"target-label\").strValue, v = t.pstyle(\"font-style\").strValue, k = t.pstyle(\"font-size\").pfValue + \"px\", s = t.pstyle(\"font-family\").strValue, S = t.pstyle(\"font-weight\").strValue, j = v + \"$\" + k + \"$\" + s + \"$\" + S + \"$\" + i + \"$\" + t.pstyle(\"text-valign\").strValue + \"$\" + t.pstyle(\"text-valign\").strValue + \"$\" + t.pstyle(\"text-outline-width\").pfValue + \"$\" + t.pstyle(\"text-wrap\").strValue + \"$\" + t.pstyle(\"text-max-width\").pfValue;\n                  r.labelStyleKey = j, r.sourceLabelKey = j + \"$\" + p, r.targetLabelKey = j + \"$\" + f, r.labelKey = j + \"$\" + d, r.fontKey = v + \"$\" + S + \"$\" + k + \"$\" + s, r.styleKey = Date.now();\n                }\n              },\n              applyParsedProperty: function(t, r) {\n                var l = this, h = r, i = t._private.style, d = void 0, p = l.types, f = l.properties[h.name].type, v = h.bypass, k = i[h.name], s = k && k.bypass, S = t._private, j = function() {\n                  l.checkZOrderTrigger(\n                    t,\n                    h.name,\n                    k ? k.value : null,\n                    h.value\n                  );\n                };\n                if (r.name === \"curve-style\" && r.value === \"haystack\" && t.isEdge() && (t.isLoop() || t.source().isParent() || t.target().isParent()) && (h = r = this.parse(r.name, \"bezier\", v)), h.delete)\n                  return i[h.name] = void 0, j(), !0;\n                if (h.deleteBypassed)\n                  return k ? !!k.bypass && (k.bypassed = void 0, j(), !0) : (j(), !0);\n                if (h.deleteBypass)\n                  return k ? !!k.bypass && (i[h.name] = k.bypassed, j(), !0) : (j(), !0);\n                var I = function() {\n                  o.error(\n                    \"Do not assign mappings to elements without corresponding data (e.g. ele `\" + t.id() + \"` for property `\" + h.name + \"` with data field `\" + h.field + \"`); try a `[\" + h.field + \"]` selector to limit scope to elements with `\" + h.field + \"` defined\"\n                  );\n                };\n                switch (h.mapped) {\n                  case p.mapData:\n                    for (var R = h.field.split(\".\"), M = S.data, z = 0; z < R.length && M; z++)\n                      M = M[R[z]];\n                    var V = void 0;\n                    if ((V = c.number(M) ? (M - h.fieldMin) / (h.fieldMax - h.fieldMin) : 0) < 0 ? V = 0 : V > 1 && (V = 1), f.color) {\n                      var G = h.valueMin[0], Y = h.valueMax[0], tt = h.valueMin[1], Z = h.valueMax[1], at = h.valueMin[2], nt = h.valueMax[2], ht = h.valueMin[3] == null ? 1 : h.valueMin[3], ct = h.valueMax[3] == null ? 1 : h.valueMax[3], ot = [\n                        Math.round(G + (Y - G) * V),\n                        Math.round(tt + (Z - tt) * V),\n                        Math.round(at + (nt - at) * V),\n                        Math.round(ht + (ct - ht) * V)\n                      ];\n                      d = {\n                        bypass: h.bypass,\n                        name: h.name,\n                        value: ot,\n                        strValue: \"rgb(\" + ot[0] + \", \" + ot[1] + \", \" + ot[2] + \")\"\n                      };\n                    } else {\n                      if (!f.number) return !1;\n                      var gt = h.valueMin + (h.valueMax - h.valueMin) * V;\n                      d = this.parse(h.name, gt, h.bypass, \"mapping\");\n                    }\n                    d || (d = this.parse(\n                      h.name,\n                      k.strValue,\n                      h.bypass,\n                      \"mapping\"\n                    )), d || I(), d.mapping = h, h = d;\n                    break;\n                  case p.data:\n                    var xt = h.field.split(\".\"), St = S.data;\n                    if (St) for (var zt = 0; zt < xt.length; zt++) St = St[xt[zt]];\n                    if (!(d = this.parse(h.name, St, h.bypass, \"mapping\"))) {\n                      var Nt = k ? k.strValue : \"\";\n                      d = this.parse(h.name, Nt, h.bypass, \"mapping\");\n                    }\n                    d || I(), d.mapping = h, h = d;\n                    break;\n                  case p.fn:\n                    var re = (0, h.value)(t);\n                    (d = this.parse(\n                      h.name,\n                      re,\n                      h.bypass,\n                      \"mapping\"\n                    )).mapping = h, h = d;\n                    break;\n                  case void 0:\n                    break;\n                  default:\n                    return !1;\n                }\n                return v ? (h.bypassed = s ? k.bypassed : k, i[h.name] = h) : s ? k.bypassed = h : i[h.name] = h, j(), !0;\n              },\n              cleanElements: function(t, r) {\n                for (var l = this.properties, h = 0; h < t.length; h++) {\n                  var i = t[h];\n                  if (r)\n                    for (var d = i._private.style, p = 0; p < l.length; p++) {\n                      var f = l[p], v = d[f.name];\n                      v && (v.bypass ? v.bypassed = null : d[f.name] = null);\n                    }\n                  else i._private.style = {};\n                }\n              },\n              update: function() {\n                this._private.cy.mutableElements().updateStyle();\n              },\n              updateMappers: function(t) {\n                for (var r = this._private.cy.collection(), l = 0; l < t.length; l++) {\n                  for (var h = t[l], i = h._private.style, d = !1, p = 0; p < this.properties.length; p++) {\n                    var f = i[this.properties[p].name];\n                    if (f && f.mapping) {\n                      var v = f.mapping;\n                      this.applyParsedProperty(h, v), d = !0;\n                    }\n                  }\n                  d && (this.updateStyleHints(h), r.merge(h));\n                }\n                return r;\n              },\n              updateTransitions: function(t, r, l) {\n                var h = this, i = t._private, d = t.pstyle(\"transition-property\").value, p = t.pstyle(\"transition-duration\").pfValue, f = t.pstyle(\"transition-delay\").pfValue;\n                if (d.length > 0 && p > 0) {\n                  for (var v = {}, k = !1, s = 0; s < d.length; s++) {\n                    var S = d[s], j = t.pstyle(S), I = r[S];\n                    if (I) {\n                      var R = I.prev, M = I.next != null ? I.next : j, z = !1, V = void 0;\n                      R && (c.number(R.pfValue) && c.number(M.pfValue) ? (z = M.pfValue - R.pfValue, V = R.pfValue + 1e-6 * z) : c.number(R.value) && c.number(M.value) ? (z = M.value - R.value, V = R.value + 1e-6 * z) : c.array(R.value) && c.array(M.value) && (z = R.value[0] !== M.value[0] || R.value[1] !== M.value[1] || R.value[2] !== M.value[2], V = R.strValue), z && (v[S] = M.strValue, this.applyBypass(t, S, V), k = !0));\n                    }\n                  }\n                  if (!k) return;\n                  i.transitioning = !0, new a(function(G) {\n                    f > 0 ? t.delayAnimation(f).play().promise().then(G) : G();\n                  }).then(function() {\n                    return t.animation({\n                      style: v,\n                      duration: p,\n                      easing: t.pstyle(\"transition-timing-function\").value,\n                      queue: !1\n                    }).play().promise();\n                  }).then(function() {\n                    h.removeBypasses(t, d), t.emitAndNotify(\"style\"), i.transitioning = !1;\n                  });\n                } else\n                  i.transitioning && (this.removeBypasses(t, d), t.emitAndNotify(\"style\"), i.transitioning = !1);\n              },\n              checkZOrderTrigger: function(t, r, l, h) {\n                var i = this.properties[r];\n                i.triggersZOrder == null || l != null && !i.triggersZOrder(l, h) || this._private.cy.notify({ type: \"zorder\", eles: t });\n              }\n            };\n            y.exports = n;\n          },\n          function(y, x, g) {\n            var o = g(0), c = g(1), a = {\n              applyBypass: function(n, t, r, l) {\n                var h = [];\n                if (t === \"*\" || t === \"**\") {\n                  if (r !== void 0)\n                    for (var i = 0; i < this.properties.length; i++) {\n                      var d = this.properties[i].name, p = this.parse(d, r, !0);\n                      p && h.push(p);\n                    }\n                } else if (o.string(t)) {\n                  var f = this.parse(t, r, !0);\n                  f && h.push(f);\n                } else {\n                  if (!o.plainObject(t)) return !1;\n                  var v = t;\n                  l = r;\n                  for (var k = Object.keys(v), s = 0; s < k.length; s++) {\n                    var S = k[s], j = (this.properties[S], v[S]);\n                    if (j === void 0 && (j = v[c.dash2camel(S)]), j !== void 0) {\n                      var I = this.parse(S, j, !0);\n                      I && h.push(I);\n                    }\n                  }\n                }\n                if (h.length === 0) return !1;\n                for (var R = !1, M = 0; M < n.length; M++) {\n                  for (var z = n[M], V = {}, G = void 0, Y = 0; Y < h.length; Y++) {\n                    var tt = h[Y];\n                    if (l) {\n                      var Z = z.pstyle(tt.name);\n                      G = V[tt.name] = { prev: Z };\n                    }\n                    R = this.applyParsedProperty(z, tt) || R, l && (G.next = z.pstyle(tt.name));\n                  }\n                  R && this.updateStyleHints(z), l && this.updateTransitions(z, V, !0);\n                }\n                return R;\n              },\n              overrideBypass: function(n, t, r) {\n                t = c.camel2dash(t);\n                for (var l = 0; l < n.length; l++) {\n                  var h = n[l], i = h._private.style[t], d = this.properties[t].type, p = d.color, f = d.mutiple;\n                  if (i && i.bypass) {\n                    var v = i.pfValue != null ? i.pfValue : i.value;\n                    i.value = r, i.pfValue != null && (i.pfValue = r), i.strValue = p ? \"rgb(\" + r.join(\",\") + \")\" : f ? r.join(\" \") : \"\" + r, this.checkZOrderTrigger(h, t, v, r);\n                  } else this.applyBypass(h, t, r);\n                }\n              },\n              removeAllBypasses: function(n, t) {\n                return this.removeBypasses(n, this.propertyNames, t);\n              },\n              removeBypasses: function(n, t, r) {\n                for (var l = 0; l < n.length; l++) {\n                  for (var h = n[l], i = {}, d = 0; d < t.length; d++) {\n                    var p = t[d], f = this.properties[p], v = h.pstyle(f.name);\n                    if (v && v.bypass) {\n                      var k = this.parse(p, \"\", !0), s = i[f.name] = { prev: v };\n                      this.applyParsedProperty(h, k), s.next = h.pstyle(f.name);\n                    }\n                  }\n                  this.updateStyleHints(h), r && this.updateTransitions(h, i, !0);\n                }\n              }\n            };\n            y.exports = a;\n          },\n          function(y, x, g) {\n            var o = g(3), c = {\n              getEmSizeInPixels: function() {\n                var a = this.containerCss(\"font-size\");\n                return a != null ? parseFloat(a) : 1;\n              },\n              containerCss: function(a) {\n                var n = this._private.cy.container();\n                if (o && n && o.getComputedStyle)\n                  return o.getComputedStyle(n).getPropertyValue(a);\n              }\n            };\n            y.exports = c;\n          },\n          function(y, x, g) {\n            var o = g(1), c = g(0), a = {\n              getRenderedStyle: function(n, t) {\n                return t ? this.getStylePropertyValue(n, t, !0) : this.getRawStyle(n, !0);\n              },\n              getRawStyle: function(n, t) {\n                if (n = n[0]) {\n                  for (var r = {}, l = 0; l < this.properties.length; l++) {\n                    var h = this.properties[l], i = this.getStylePropertyValue(n, h.name, t);\n                    i != null && (r[h.name] = i, r[o.dash2camel(h.name)] = i);\n                  }\n                  return r;\n                }\n              },\n              getIndexedStyle: function(n, t, r, l) {\n                var h = n.pstyle(t)[r][l];\n                return h ?? n.cy().style().getDefaultProperty(t)[r][0];\n              },\n              getStylePropertyValue: function(n, t, r) {\n                if (n = n[0]) {\n                  var l = this.properties[t];\n                  l.alias && (l = l.pointsTo);\n                  var h = l.type, i = n.pstyle(l.name), d = n.cy().zoom();\n                  if (i) {\n                    var p = i.units ? h.implicitUnits || \"px\" : null;\n                    return p ? [].concat(i.pfValue).map(function(f) {\n                      return f * (r ? d : 1) + p;\n                    }).join(\" \") : i.strValue;\n                  }\n                }\n              },\n              getAnimationStartStyle: function(n, t) {\n                for (var r = {}, l = 0; l < t.length; l++) {\n                  var h = t[l].name, i = n.pstyle(h);\n                  i !== void 0 && (i = c.plainObject(i) ? this.parse(h, i.strValue) : this.parse(h, i)), i && (r[h] = i);\n                }\n                return r;\n              },\n              getPropsList: function(n) {\n                var t = [], r = n, l = this.properties;\n                if (r)\n                  for (var h = Object.keys(r), i = 0; i < h.length; i++) {\n                    var d = h[i], p = r[d], f = l[d] || l[o.camel2dash(d)], v = this.parse(f.name, p);\n                    v && t.push(v);\n                  }\n                return t;\n              }\n            };\n            y.exports = a;\n          },\n          function(y, x, g) {\n            var o = {\n              appendFromJson: function(c) {\n                for (var a = 0; a < c.length; a++) {\n                  var n = c[a], t = n.selector, r = n.style || n.css, l = Object.keys(r);\n                  this.selector(t);\n                  for (var h = 0; h < l.length; h++) {\n                    var i = l[h], d = r[i];\n                    this.css(i, d);\n                  }\n                }\n                return this;\n              },\n              fromJson: function(c) {\n                return this.resetToDefault(), this.appendFromJson(c), this;\n              },\n              json: function() {\n                for (var c = [], a = this.defaultLength; a < this.length; a++) {\n                  for (var n = this[a], t = n.selector, r = n.properties, l = {}, h = 0; h < r.length; h++) {\n                    var i = r[h];\n                    l[i.name] = i.strValue;\n                  }\n                  c.push({ selector: t ? t.toString() : \"core\", style: l });\n                }\n                return c;\n              }\n            };\n            y.exports = o;\n          },\n          function(y, x, g) {\n            var o = g(1), c = g(6), a = {\n              appendFromString: function(n) {\n                var t = \"\" + n, r = void 0, l = void 0, h = void 0;\n                function i() {\n                  t = t.length > r.length ? t.substr(r.length) : \"\";\n                }\n                function d() {\n                  l = l.length > h.length ? l.substr(h.length) : \"\";\n                }\n                for (t = t.replace(/[/][*](\\s|.)+?[*][/]/g, \"\"); !t.match(/^\\s*$/); ) {\n                  var p = t.match(/^\\s*((?:.|\\s)+?)\\s*\\{((?:.|\\s)+?)\\}/);\n                  if (!p) {\n                    o.error(\n                      \"Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: \" + t\n                    );\n                    break;\n                  }\n                  r = p[0];\n                  var f = p[1];\n                  if (f !== \"core\" && new c(f)._private.invalid)\n                    o.error(\n                      \"Skipping parsing of block: Invalid selector found in string stylesheet: \" + f\n                    ), i();\n                  else {\n                    var v = p[2], k = !1;\n                    l = v;\n                    for (var s = []; !l.match(/^\\s*$/); ) {\n                      var S = l.match(/^\\s*(.+?)\\s*:\\s*(.+?)\\s*;/);\n                      if (!S) {\n                        o.error(\n                          \"Skipping parsing of block: Invalid formatting of style property and value definitions found in:\" + v\n                        ), k = !0;\n                        break;\n                      }\n                      h = S[0];\n                      var j = S[1], I = S[2];\n                      this.properties[j] ? this.parse(j, I) ? (s.push({ name: j, val: I }), d()) : (o.error(\n                        \"Skipping property: Invalid property definition in: \" + h\n                      ), d()) : (o.error(\n                        \"Skipping property: Invalid property name in: \" + h\n                      ), d());\n                    }\n                    if (k) {\n                      i();\n                      break;\n                    }\n                    this.selector(f);\n                    for (var R = 0; R < s.length; R++) {\n                      var M = s[R];\n                      this.css(M.name, M.val);\n                    }\n                    i();\n                  }\n                }\n                return this;\n              },\n              fromString: function(n) {\n                return this.resetToDefault(), this.appendFromString(n), this;\n              }\n            };\n            y.exports = a;\n          },\n          function(y, x, g) {\n            var o = g(1), c = g(0), a = {};\n            (function() {\n              var n = o.regex.number, t = o.regex.rgbaNoBackRefs, r = o.regex.hslaNoBackRefs, l = o.regex.hex3, h = o.regex.hex6, i = function(Y) {\n                return \"^\" + Y + \"\\\\s*\\\\(\\\\s*([\\\\w\\\\.]+)\\\\s*\\\\)$\";\n              }, d = function(Y) {\n                var tt = n + \"|\\\\w+|\" + t + \"|\" + r + \"|\" + l + \"|\" + h;\n                return \"^\" + Y + \"\\\\s*\\\\(([\\\\w\\\\.]+)\\\\s*\\\\,\\\\s*(\" + n + \")\\\\s*\\\\,\\\\s*(\" + n + \")\\\\s*,\\\\s*(\" + tt + \")\\\\s*\\\\,\\\\s*(\" + tt + \")\\\\)$\";\n              }, p = [\n                `^url\\\\s*\\\\(\\\\s*['\"]?(.+?)['\"]?\\\\s*\\\\)$`,\n                \"^(none)$\",\n                \"^(.+)$\"\n              ];\n              a.types = {\n                time: {\n                  number: !0,\n                  min: 0,\n                  units: \"s|ms\",\n                  implicitUnits: \"ms\"\n                },\n                percent: {\n                  number: !0,\n                  min: 0,\n                  max: 100,\n                  units: \"%\",\n                  implicitUnits: \"%\"\n                },\n                zeroOneNumber: { number: !0, min: 0, max: 1, unitless: !0 },\n                zeroOneNumbers: {\n                  number: !0,\n                  min: 0,\n                  max: 1,\n                  unitless: !0,\n                  multiple: !0\n                },\n                nOneOneNumber: { number: !0, min: -1, max: 1, unitless: !0 },\n                nonNegativeInt: {\n                  number: !0,\n                  min: 0,\n                  integer: !0,\n                  unitless: !0\n                },\n                position: { enums: [\"parent\", \"origin\"] },\n                nodeSize: { number: !0, min: 0, enums: [\"label\"] },\n                number: { number: !0, unitless: !0 },\n                numbers: { number: !0, unitless: !0, multiple: !0 },\n                positiveNumber: {\n                  number: !0,\n                  unitless: !0,\n                  min: 0,\n                  strictMin: !0\n                },\n                size: { number: !0, min: 0 },\n                bidirectionalSize: { number: !0 },\n                bidirectionalSizes: { number: !0, multiple: !0 },\n                sizeMaybePercent: { number: !0, min: 0, allowPercent: !0 },\n                paddingRelativeTo: {\n                  enums: [\"width\", \"height\", \"average\", \"min\", \"max\"]\n                },\n                bgWH: {\n                  number: !0,\n                  min: 0,\n                  allowPercent: !0,\n                  enums: [\"auto\"],\n                  multiple: !0\n                },\n                bgPos: { number: !0, allowPercent: !0, multiple: !0 },\n                bgRelativeTo: {\n                  enums: [\"inner\", \"include-padding\"],\n                  multiple: !0\n                },\n                bgRepeat: {\n                  enums: [\"repeat\", \"repeat-x\", \"repeat-y\", \"no-repeat\"],\n                  multiple: !0\n                },\n                bgFit: { enums: [\"none\", \"contain\", \"cover\"], multiple: !0 },\n                bgCrossOrigin: {\n                  enums: [\"anonymous\", \"use-credentials\"],\n                  multiple: !0\n                },\n                bgClip: { enums: [\"none\", \"node\"] },\n                color: { color: !0 },\n                bool: { enums: [\"yes\", \"no\"] },\n                lineStyle: { enums: [\"solid\", \"dotted\", \"dashed\"] },\n                borderStyle: {\n                  enums: [\"solid\", \"dotted\", \"dashed\", \"double\"]\n                },\n                curveStyle: {\n                  enums: [\n                    \"bezier\",\n                    \"unbundled-bezier\",\n                    \"haystack\",\n                    \"segments\"\n                  ]\n                },\n                fontFamily: {\n                  regex: '^([\\\\w- \\\\\"]+(?:\\\\s*,\\\\s*[\\\\w- \\\\\"]+)*)$'\n                },\n                fontletiant: { enums: [\"small-caps\", \"normal\"] },\n                fontStyle: { enums: [\"italic\", \"normal\", \"oblique\"] },\n                fontWeight: {\n                  enums: [\n                    \"normal\",\n                    \"bold\",\n                    \"bolder\",\n                    \"lighter\",\n                    \"100\",\n                    \"200\",\n                    \"300\",\n                    \"400\",\n                    \"500\",\n                    \"600\",\n                    \"800\",\n                    \"900\",\n                    100,\n                    200,\n                    300,\n                    400,\n                    500,\n                    600,\n                    700,\n                    800,\n                    900\n                  ]\n                },\n                textDecoration: {\n                  enums: [\"none\", \"underline\", \"overline\", \"line-through\"]\n                },\n                textTransform: { enums: [\"none\", \"uppercase\", \"lowercase\"] },\n                textWrap: { enums: [\"none\", \"wrap\", \"ellipsis\"] },\n                textBackgroundShape: {\n                  enums: [\"rectangle\", \"roundrectangle\"]\n                },\n                nodeShape: {\n                  enums: [\n                    \"rectangle\",\n                    \"roundrectangle\",\n                    \"cutrectangle\",\n                    \"bottomroundrectangle\",\n                    \"barrel\",\n                    \"ellipse\",\n                    \"triangle\",\n                    \"square\",\n                    \"pentagon\",\n                    \"hexagon\",\n                    \"concavehexagon\",\n                    \"heptagon\",\n                    \"octagon\",\n                    \"tag\",\n                    \"star\",\n                    \"diamond\",\n                    \"vee\",\n                    \"rhomboid\",\n                    \"polygon\"\n                  ]\n                },\n                compoundIncludeLabels: { enums: [\"include\", \"exclude\"] },\n                arrowShape: {\n                  enums: [\n                    \"tee\",\n                    \"triangle\",\n                    \"triangle-tee\",\n                    \"triangle-cross\",\n                    \"triangle-backcurve\",\n                    \"half-triangle-overshot\",\n                    \"vee\",\n                    \"square\",\n                    \"circle\",\n                    \"diamond\",\n                    \"none\"\n                  ]\n                },\n                arrowFill: { enums: [\"filled\", \"hollow\"] },\n                display: { enums: [\"element\", \"none\"] },\n                visibility: { enums: [\"hidden\", \"visible\"] },\n                zCompoundDepth: {\n                  enums: [\"bottom\", \"orphan\", \"auto\", \"top\"]\n                },\n                zIndexCompare: { enums: [\"auto\", \"manual\"] },\n                valign: { enums: [\"top\", \"center\", \"bottom\"] },\n                halign: { enums: [\"left\", \"center\", \"right\"] },\n                text: { string: !0 },\n                data: { mapping: !0, regex: i(\"data\") },\n                layoutData: { mapping: !0, regex: i(\"layoutData\") },\n                scratch: { mapping: !0, regex: i(\"scratch\") },\n                mapData: { mapping: !0, regex: d(\"mapData\") },\n                mapLayoutData: { mapping: !0, regex: d(\"mapLayoutData\") },\n                mapScratch: { mapping: !0, regex: d(\"mapScratch\") },\n                fn: { mapping: !0, fn: !0 },\n                url: { regexes: p, singleRegexMatchValue: !0 },\n                urls: { regexes: p, singleRegexMatchValue: !0, multiple: !0 },\n                propList: { propList: !0 },\n                angle: { number: !0, units: \"deg|rad\", implicitUnits: \"rad\" },\n                textRotation: {\n                  number: !0,\n                  units: \"deg|rad\",\n                  implicitUnits: \"rad\",\n                  enums: [\"none\", \"autorotate\"]\n                },\n                polygonPointList: {\n                  number: !0,\n                  multiple: !0,\n                  evenMultiple: !0,\n                  min: -1,\n                  max: 1,\n                  unitless: !0\n                },\n                edgeDistances: { enums: [\"intersection\", \"node-position\"] },\n                edgeEndpoint: {\n                  number: !0,\n                  multiple: !0,\n                  units: \"%|px|em|deg|rad\",\n                  implicitUnits: \"px\",\n                  enums: [\n                    \"inside-to-node\",\n                    \"outside-to-node\",\n                    \"outside-to-line\"\n                  ],\n                  singleEnum: !0,\n                  validate: function(Y, tt) {\n                    switch (Y.length) {\n                      case 2:\n                        return tt[0] !== \"deg\" && tt[0] !== \"rad\" && tt[1] !== \"deg\" && tt[1] !== \"rad\";\n                      case 1:\n                        return c.string(Y[0]) || tt[0] === \"deg\" || tt[0] === \"rad\";\n                      default:\n                        return !1;\n                    }\n                  }\n                },\n                easing: {\n                  regexes: [\n                    \"^(spring)\\\\s*\\\\(\\\\s*(\" + n + \")\\\\s*,\\\\s*(\" + n + \")\\\\s*\\\\)$\",\n                    \"^(cubic-bezier)\\\\s*\\\\(\\\\s*(\" + n + \")\\\\s*,\\\\s*(\" + n + \")\\\\s*,\\\\s*(\" + n + \")\\\\s*,\\\\s*(\" + n + \")\\\\s*\\\\)$\"\n                  ],\n                  enums: [\n                    \"linear\",\n                    \"ease\",\n                    \"ease-in\",\n                    \"ease-out\",\n                    \"ease-in-out\",\n                    \"ease-in-sine\",\n                    \"ease-out-sine\",\n                    \"ease-in-out-sine\",\n                    \"ease-in-quad\",\n                    \"ease-out-quad\",\n                    \"ease-in-out-quad\",\n                    \"ease-in-cubic\",\n                    \"ease-out-cubic\",\n                    \"ease-in-out-cubic\",\n                    \"ease-in-quart\",\n                    \"ease-out-quart\",\n                    \"ease-in-out-quart\",\n                    \"ease-in-quint\",\n                    \"ease-out-quint\",\n                    \"ease-in-out-quint\",\n                    \"ease-in-expo\",\n                    \"ease-out-expo\",\n                    \"ease-in-out-expo\",\n                    \"ease-in-circ\",\n                    \"ease-out-circ\",\n                    \"ease-in-out-circ\"\n                  ]\n                }\n              };\n              var f = {\n                zeroNonZero: function(Y, tt) {\n                  return Y === 0 && tt !== 0 || Y !== 0 && tt === 0;\n                },\n                anyDiff: function(Y, tt) {\n                  return Y !== tt;\n                }\n              }, v = a.types, k = a.properties = [\n                { name: \"label\", type: v.text },\n                { name: \"text-rotation\", type: v.textRotation },\n                { name: \"text-margin-x\", type: v.bidirectionalSize },\n                { name: \"text-margin-y\", type: v.bidirectionalSize },\n                { name: \"source-label\", type: v.text },\n                { name: \"source-text-rotation\", type: v.textRotation },\n                { name: \"source-text-margin-x\", type: v.bidirectionalSize },\n                { name: \"source-text-margin-y\", type: v.bidirectionalSize },\n                { name: \"source-text-offset\", type: v.size },\n                { name: \"target-label\", type: v.text },\n                { name: \"target-text-rotation\", type: v.textRotation },\n                { name: \"target-text-margin-x\", type: v.bidirectionalSize },\n                { name: \"target-text-margin-y\", type: v.bidirectionalSize },\n                { name: \"target-text-offset\", type: v.size },\n                { name: \"text-valign\", type: v.valign },\n                { name: \"text-halign\", type: v.halign },\n                { name: \"color\", type: v.color },\n                { name: \"text-outline-color\", type: v.color },\n                { name: \"text-outline-width\", type: v.size },\n                { name: \"text-outline-opacity\", type: v.zeroOneNumber },\n                { name: \"text-opacity\", type: v.zeroOneNumber },\n                { name: \"text-background-color\", type: v.color },\n                { name: \"text-background-opacity\", type: v.zeroOneNumber },\n                { name: \"text-background-padding\", type: v.size },\n                { name: \"text-border-opacity\", type: v.zeroOneNumber },\n                { name: \"text-border-color\", type: v.color },\n                { name: \"text-border-width\", type: v.size },\n                { name: \"text-border-style\", type: v.borderStyle },\n                {\n                  name: \"text-background-shape\",\n                  type: v.textBackgroundShape\n                },\n                { name: \"text-transform\", type: v.textTransform },\n                { name: \"text-wrap\", type: v.textWrap },\n                { name: \"text-max-width\", type: v.size },\n                { name: \"text-events\", type: v.bool },\n                { name: \"font-family\", type: v.fontFamily },\n                { name: \"font-style\", type: v.fontStyle },\n                { name: \"font-weight\", type: v.fontWeight },\n                { name: \"font-size\", type: v.size },\n                { name: \"min-zoomed-font-size\", type: v.size },\n                { name: \"events\", type: v.bool },\n                {\n                  name: \"display\",\n                  type: v.display,\n                  triggersZOrder: f.anyDiff\n                },\n                {\n                  name: \"visibility\",\n                  type: v.visibility,\n                  triggersZOrder: f.anyDiff\n                },\n                {\n                  name: \"opacity\",\n                  type: v.zeroOneNumber,\n                  triggersZOrder: f.zeroNonZero\n                },\n                {\n                  name: \"z-compound-depth\",\n                  type: v.zCompoundDepth,\n                  triggersZOrder: f.anyDiff\n                },\n                {\n                  name: \"z-index-compare\",\n                  type: v.zIndexCompare,\n                  triggersZOrder: f.anyDiff\n                },\n                {\n                  name: \"z-index\",\n                  type: v.nonNegativeInt,\n                  triggersZOrder: f.anyDiff\n                },\n                { name: \"overlay-padding\", type: v.size },\n                { name: \"overlay-color\", type: v.color },\n                { name: \"overlay-opacity\", type: v.zeroOneNumber },\n                { name: \"transition-property\", type: v.propList },\n                { name: \"transition-duration\", type: v.time },\n                { name: \"transition-delay\", type: v.time },\n                { name: \"transition-timing-function\", type: v.easing },\n                { name: \"height\", type: v.nodeSize },\n                { name: \"width\", type: v.nodeSize },\n                { name: \"shape\", type: v.nodeShape },\n                { name: \"shape-polygon-points\", type: v.polygonPointList },\n                { name: \"background-color\", type: v.color },\n                { name: \"background-opacity\", type: v.zeroOneNumber },\n                { name: \"background-blacken\", type: v.nOneOneNumber },\n                { name: \"padding\", type: v.sizeMaybePercent },\n                { name: \"padding-relative-to\", type: v.paddingRelativeTo },\n                { name: \"border-color\", type: v.color },\n                { name: \"border-opacity\", type: v.zeroOneNumber },\n                { name: \"border-width\", type: v.size },\n                { name: \"border-style\", type: v.borderStyle },\n                { name: \"background-image\", type: v.urls },\n                {\n                  name: \"background-image-crossorigin\",\n                  type: v.bgCrossOrigin\n                },\n                {\n                  name: \"background-image-opacity\",\n                  type: v.zeroOneNumbers\n                },\n                { name: \"background-position-x\", type: v.bgPos },\n                { name: \"background-position-y\", type: v.bgPos },\n                {\n                  name: \"background-width-relative-to\",\n                  type: v.bgRelativeTo\n                },\n                {\n                  name: \"background-height-relative-to\",\n                  type: v.bgRelativeTo\n                },\n                { name: \"background-repeat\", type: v.bgRepeat },\n                { name: \"background-fit\", type: v.bgFit },\n                { name: \"background-clip\", type: v.bgClip },\n                { name: \"background-width\", type: v.bgWH },\n                { name: \"background-height\", type: v.bgWH },\n                { name: \"position\", type: v.position },\n                {\n                  name: \"compound-sizing-wrt-labels\",\n                  type: v.compoundIncludeLabels\n                },\n                { name: \"min-width\", type: v.size },\n                { name: \"min-width-bias-left\", type: v.sizeMaybePercent },\n                { name: \"min-width-bias-right\", type: v.sizeMaybePercent },\n                { name: \"min-height\", type: v.size },\n                { name: \"min-height-bias-top\", type: v.sizeMaybePercent },\n                {\n                  name: \"min-height-bias-bottom\",\n                  type: v.sizeMaybePercent\n                },\n                { name: \"line-style\", type: v.lineStyle },\n                { name: \"line-color\", type: v.color },\n                { name: \"curve-style\", type: v.curveStyle },\n                { name: \"haystack-radius\", type: v.zeroOneNumber },\n                { name: \"source-endpoint\", type: v.edgeEndpoint },\n                { name: \"target-endpoint\", type: v.edgeEndpoint },\n                { name: \"control-point-step-size\", type: v.size },\n                {\n                  name: \"control-point-distances\",\n                  type: v.bidirectionalSizes\n                },\n                { name: \"control-point-weights\", type: v.numbers },\n                { name: \"segment-distances\", type: v.bidirectionalSizes },\n                { name: \"segment-weights\", type: v.numbers },\n                { name: \"edge-distances\", type: v.edgeDistances },\n                { name: \"arrow-scale\", type: v.positiveNumber },\n                { name: \"loop-direction\", type: v.angle },\n                { name: \"loop-sweep\", type: v.angle },\n                { name: \"source-distance-from-node\", type: v.size },\n                { name: \"target-distance-from-node\", type: v.size },\n                { name: \"ghost\", type: v.bool },\n                { name: \"ghost-offset-x\", type: v.bidirectionalSize },\n                { name: \"ghost-offset-y\", type: v.bidirectionalSize },\n                { name: \"ghost-opacity\", type: v.zeroOneNumber },\n                { name: \"selection-box-color\", type: v.color },\n                { name: \"selection-box-opacity\", type: v.zeroOneNumber },\n                { name: \"selection-box-border-color\", type: v.color },\n                { name: \"selection-box-border-width\", type: v.size },\n                { name: \"active-bg-color\", type: v.color },\n                { name: \"active-bg-opacity\", type: v.zeroOneNumber },\n                { name: \"active-bg-size\", type: v.size },\n                { name: \"outside-texture-bg-color\", type: v.color },\n                {\n                  name: \"outside-texture-bg-opacity\",\n                  type: v.zeroOneNumber\n                }\n              ], s = a.aliases = [\n                { name: \"content\", pointsTo: \"label\" },\n                {\n                  name: \"control-point-distance\",\n                  pointsTo: \"control-point-distances\"\n                },\n                {\n                  name: \"control-point-weight\",\n                  pointsTo: \"control-point-weights\"\n                },\n                { name: \"edge-text-rotation\", pointsTo: \"text-rotation\" },\n                { name: \"padding-left\", pointsTo: \"padding\" },\n                { name: \"padding-right\", pointsTo: \"padding\" },\n                { name: \"padding-top\", pointsTo: \"padding\" },\n                { name: \"padding-bottom\", pointsTo: \"padding\" }\n              ];\n              a.pieBackgroundN = 16, k.push({ name: \"pie-size\", type: v.sizeMaybePercent });\n              for (var S = 1; S <= a.pieBackgroundN; S++)\n                k.push({\n                  name: \"pie-\" + S + \"-background-color\",\n                  type: v.color\n                }), k.push({\n                  name: \"pie-\" + S + \"-background-size\",\n                  type: v.percent\n                }), k.push({\n                  name: \"pie-\" + S + \"-background-opacity\",\n                  type: v.zeroOneNumber\n                });\n              var j = a.arrowPrefixes = [\n                \"source\",\n                \"mid-source\",\n                \"target\",\n                \"mid-target\"\n              ];\n              [\n                { name: \"arrow-shape\", type: v.arrowShape },\n                { name: \"arrow-color\", type: v.color },\n                { name: \"arrow-fill\", type: v.arrowFill }\n              ].forEach(function(Y) {\n                j.forEach(function(tt) {\n                  var Z = tt + \"-\" + Y.name, at = Y.type;\n                  k.push({ name: Z, type: at });\n                });\n              }, {}), a.propertyNames = k.map(function(Y) {\n                return Y.name;\n              });\n              for (var I = 0; I < k.length; I++) {\n                var R = k[I];\n                k[R.name] = R;\n              }\n              for (var M = 0; M < s.length; M++) {\n                var z = s[M], V = k[z.pointsTo], G = { name: z.name, alias: !0, pointsTo: V };\n                k.push(G), k[z.name] = G;\n              }\n            })(), a.getDefaultProperty = function(n) {\n              return this.getDefaultProperties()[n];\n            }, a.getDefaultProperties = o.memoize(function() {\n              for (var n = o.extend(\n                {\n                  events: \"yes\",\n                  \"text-events\": \"no\",\n                  \"text-valign\": \"top\",\n                  \"text-halign\": \"center\",\n                  color: \"#000\",\n                  \"text-outline-color\": \"#000\",\n                  \"text-outline-width\": 0,\n                  \"text-outline-opacity\": 1,\n                  \"text-opacity\": 1,\n                  \"text-decoration\": \"none\",\n                  \"text-transform\": \"none\",\n                  \"text-wrap\": \"none\",\n                  \"text-max-width\": 9999,\n                  \"text-background-color\": \"#000\",\n                  \"text-background-opacity\": 0,\n                  \"text-background-shape\": \"rectangle\",\n                  \"text-background-padding\": 0,\n                  \"text-border-opacity\": 0,\n                  \"text-border-width\": 0,\n                  \"text-border-style\": \"solid\",\n                  \"text-border-color\": \"#000\",\n                  \"font-family\": \"Helvetica Neue, Helvetica, sans-serif\",\n                  \"font-style\": \"normal\",\n                  \"font-weight\": \"normal\",\n                  \"font-size\": 16,\n                  \"min-zoomed-font-size\": 0,\n                  \"text-rotation\": \"none\",\n                  \"source-text-rotation\": \"none\",\n                  \"target-text-rotation\": \"none\",\n                  visibility: \"visible\",\n                  display: \"element\",\n                  opacity: 1,\n                  \"z-compound-depth\": \"auto\",\n                  \"z-index-compare\": \"auto\",\n                  \"z-index\": 0,\n                  label: \"\",\n                  \"text-margin-x\": 0,\n                  \"text-margin-y\": 0,\n                  \"source-label\": \"\",\n                  \"source-text-offset\": 0,\n                  \"source-text-margin-x\": 0,\n                  \"source-text-margin-y\": 0,\n                  \"target-label\": \"\",\n                  \"target-text-offset\": 0,\n                  \"target-text-margin-x\": 0,\n                  \"target-text-margin-y\": 0,\n                  \"overlay-opacity\": 0,\n                  \"overlay-color\": \"#000\",\n                  \"overlay-padding\": 10,\n                  \"transition-property\": \"none\",\n                  \"transition-duration\": 0,\n                  \"transition-delay\": 0,\n                  \"transition-timing-function\": \"linear\",\n                  \"background-blacken\": 0,\n                  \"background-color\": \"#999\",\n                  \"background-opacity\": 1,\n                  \"background-image\": \"none\",\n                  \"background-image-crossorigin\": \"anonymous\",\n                  \"background-image-opacity\": 1,\n                  \"background-position-x\": \"50%\",\n                  \"background-position-y\": \"50%\",\n                  \"background-width-relative-to\": \"include-padding\",\n                  \"background-height-relative-to\": \"include-padding\",\n                  \"background-repeat\": \"no-repeat\",\n                  \"background-fit\": \"none\",\n                  \"background-clip\": \"node\",\n                  \"background-width\": \"auto\",\n                  \"background-height\": \"auto\",\n                  \"border-color\": \"#000\",\n                  \"border-opacity\": 1,\n                  \"border-width\": 0,\n                  \"border-style\": \"solid\",\n                  height: 30,\n                  width: 30,\n                  shape: \"ellipse\",\n                  \"shape-polygon-points\": \"-1, -1,   1, -1,   1, 1,   -1, 1\",\n                  ghost: \"no\",\n                  \"ghost-offset-y\": 0,\n                  \"ghost-offset-x\": 0,\n                  \"ghost-opacity\": 0,\n                  padding: 0,\n                  \"padding-relative-to\": \"width\",\n                  position: \"origin\",\n                  \"compound-sizing-wrt-labels\": \"include\",\n                  \"min-width\": 0,\n                  \"min-width-bias-left\": 0,\n                  \"min-width-bias-right\": 0,\n                  \"min-height\": 0,\n                  \"min-height-bias-top\": 0,\n                  \"min-height-bias-bottom\": 0\n                },\n                { \"pie-size\": \"100%\" },\n                [\n                  {\n                    name: \"pie-{{i}}-background-color\",\n                    value: \"black\"\n                  },\n                  { name: \"pie-{{i}}-background-size\", value: \"0%\" },\n                  { name: \"pie-{{i}}-background-opacity\", value: 1 }\n                ].reduce(function(p, f) {\n                  for (var v = 1; v <= a.pieBackgroundN; v++) {\n                    var k = f.name.replace(\"{{i}}\", v), s = f.value;\n                    p[k] = s;\n                  }\n                  return p;\n                }, {}),\n                {\n                  \"line-style\": \"solid\",\n                  \"line-color\": \"#999\",\n                  \"control-point-step-size\": 40,\n                  \"control-point-weights\": 0.5,\n                  \"segment-weights\": 0.5,\n                  \"segment-distances\": 20,\n                  \"edge-distances\": \"intersection\",\n                  \"curve-style\": \"bezier\",\n                  \"haystack-radius\": 0,\n                  \"arrow-scale\": 1,\n                  \"loop-direction\": \"-45deg\",\n                  \"loop-sweep\": \"-90deg\",\n                  \"source-distance-from-node\": 0,\n                  \"target-distance-from-node\": 0,\n                  \"source-endpoint\": \"outside-to-node\",\n                  \"target-endpoint\": \"outside-to-node\"\n                },\n                [\n                  { name: \"arrow-shape\", value: \"none\" },\n                  { name: \"arrow-color\", value: \"#999\" },\n                  { name: \"arrow-fill\", value: \"filled\" }\n                ].reduce(function(p, f) {\n                  return a.arrowPrefixes.forEach(function(v) {\n                    var k = v + \"-\" + f.name, s = f.value;\n                    p[k] = s;\n                  }), p;\n                }, {})\n              ), t = {}, r = 0; r < this.properties.length; r++) {\n                var l = this.properties[r];\n                if (!l.pointsTo) {\n                  var h = l.name, i = n[h], d = this.parse(h, i);\n                  t[h] = d;\n                }\n              }\n              return t;\n            }), a.addDefaultStylesheet = function() {\n              this.selector(\"$node > node\").css({\n                shape: \"rectangle\",\n                padding: 10,\n                \"background-color\": \"#eee\",\n                \"border-color\": \"#ccc\",\n                \"border-width\": 1\n              }).selector(\"edge\").css({ width: 3, \"curve-style\": \"haystack\" }).selector(\":parent <-> node\").css({\n                \"curve-style\": \"bezier\",\n                \"source-endpoint\": \"outside-to-line\",\n                \"target-endpoint\": \"outside-to-line\"\n              }).selector(\":selected\").css({\n                \"background-color\": \"#0169D9\",\n                \"line-color\": \"#0169D9\",\n                \"source-arrow-color\": \"#0169D9\",\n                \"target-arrow-color\": \"#0169D9\",\n                \"mid-source-arrow-color\": \"#0169D9\",\n                \"mid-target-arrow-color\": \"#0169D9\"\n              }).selector(\"node:parent:selected\").css({\n                \"background-color\": \"#CCE1F9\",\n                \"border-color\": \"#aec8e5\"\n              }).selector(\":active\").css({\n                \"overlay-color\": \"black\",\n                \"overlay-padding\": 10,\n                \"overlay-opacity\": 0.25\n              }).selector(\"core\").css({\n                \"selection-box-color\": \"#ddd\",\n                \"selection-box-opacity\": 0.65,\n                \"selection-box-border-color\": \"#aaa\",\n                \"selection-box-border-width\": 1,\n                \"active-bg-color\": \"black\",\n                \"active-bg-opacity\": 0.15,\n                \"active-bg-size\": 30,\n                \"outside-texture-bg-color\": \"#000\",\n                \"outside-texture-bg-opacity\": 0.125\n              }), this.defaultLength = this.length;\n            }, y.exports = a;\n          },\n          function(y, x, g) {\n            var o = g(1), c = g(0), a = g(2), n = {\n              parse: function(t, r, l, h) {\n                if (c.fn(r)) return this.parseImplWarn(t, r, l, h);\n                var i = [\n                  t,\n                  r,\n                  l,\n                  h === \"mapping\" || h === !0 || h === !1 || h == null ? \"dontcare\" : h\n                ].join(\"$\"), d = this.propCache = this.propCache || {}, p = void 0;\n                return (p = d[i]) || (p = d[i] = this.parseImplWarn(t, r, l, h)), (l || h === \"mapping\") && (p = o.copy(p)) && (p.value = o.copy(p.value)), p;\n              },\n              parseImplWarn: function(t, r, l, h) {\n                var i = this.parseImpl(t, r, l, h);\n                return i || r == null || o.error(\"The style property `%s: %s` is invalid\", t, r), i;\n              },\n              parseImpl: function(t, r, l, h) {\n                t = o.camel2dash(t);\n                var i = this.properties[t], d = r, p = this.types;\n                if (!i || r === void 0) return null;\n                i.alias && (i = i.pointsTo, t = i.name);\n                var f = c.string(r);\n                f && (r = r.trim());\n                var v = i.type;\n                if (!v) return null;\n                if (l && (r === \"\" || r === null))\n                  return {\n                    name: t,\n                    value: r,\n                    bypass: !0,\n                    deleteBypass: !0\n                  };\n                if (c.fn(r))\n                  return {\n                    name: t,\n                    value: r,\n                    strValue: \"fn\",\n                    mapped: p.fn,\n                    bypass: l\n                  };\n                var k = void 0, s = void 0;\n                if (!(!f || h)) {\n                  if (k = new RegExp(p.data.regex).exec(r)) {\n                    if (l) return !1;\n                    var S = p.data;\n                    return {\n                      name: t,\n                      value: k,\n                      strValue: \"\" + r,\n                      mapped: S,\n                      field: k[1],\n                      bypass: l\n                    };\n                  }\n                  if (s = new RegExp(p.mapData.regex).exec(r)) {\n                    if (l || v.multiple) return !1;\n                    var j = p.mapData;\n                    if (!v.color && !v.number) return !1;\n                    var I = this.parse(t, s[4]);\n                    if (!I || I.mapped) return !1;\n                    var R = this.parse(t, s[5]);\n                    if (!R || R.mapped || I.value === R.value) return !1;\n                    if (v.color) {\n                      var M = I.value, z = R.value;\n                      if (!(M[0] !== z[0] || M[1] !== z[1] || M[2] !== z[2] || M[3] !== z[3] && (M[3] != null && M[3] !== 1 || z[3] != null && z[3] !== 1)))\n                        return !1;\n                    }\n                    return {\n                      name: t,\n                      value: s,\n                      strValue: \"\" + r,\n                      mapped: j,\n                      field: s[1],\n                      fieldMin: parseFloat(s[2]),\n                      fieldMax: parseFloat(s[3]),\n                      valueMin: I.value,\n                      valueMax: R.value,\n                      bypass: l\n                    };\n                  }\n                }\n                if (v.multiple && h !== \"multiple\") {\n                  var V = void 0;\n                  if (V = f ? r.split(/\\s+/) : c.array(r) ? r : [r], v.evenMultiple && V.length % 2 != 0)\n                    return null;\n                  for (var G = [], Y = [], tt = [], Z = !1, at = 0; at < V.length; at++) {\n                    var nt = this.parse(t, V[at], l, \"multiple\");\n                    Z = Z || c.string(nt.value), G.push(nt.value), tt.push(nt.pfValue != null ? nt.pfValue : nt.value), Y.push(nt.units);\n                  }\n                  return v.validate && !v.validate(G, Y) ? null : v.singleEnum && Z ? G.length === 1 && c.string(G[0]) ? { name: t, value: G[0], strValue: G[0], bypass: l } : null : {\n                    name: t,\n                    value: G,\n                    pfValue: tt,\n                    strValue: G.map(function(lt, kt) {\n                      return lt + (Y[kt] || \"\");\n                    }).join(\" \"),\n                    bypass: l,\n                    units: Y\n                  };\n                }\n                var ht = function() {\n                  for (var lt = 0; lt < v.enums.length; lt++)\n                    if (v.enums[lt] === r)\n                      return {\n                        name: t,\n                        value: r,\n                        strValue: \"\" + r,\n                        bypass: l\n                      };\n                  return null;\n                };\n                if (v.number) {\n                  var ct = void 0, ot = \"px\";\n                  if (v.units && (ct = v.units), v.implicitUnits && (ot = v.implicitUnits), !v.unitless)\n                    if (f) {\n                      var gt = \"px|em\" + (v.allowPercent ? \"|\\\\%\" : \"\");\n                      ct && (gt = ct);\n                      var xt = r.match(\n                        \"^(\" + o.regex.number + \")(\" + gt + \")?$\"\n                      );\n                      xt && (r = xt[1], ct = xt[2] || ot);\n                    } else ct && !v.implicitUnits || (ct = ot);\n                  if (r = parseFloat(r), isNaN(r) && v.enums === void 0)\n                    return null;\n                  if (isNaN(r) && v.enums !== void 0) return r = d, ht();\n                  if (v.integer && !c.integer(r) || v.min !== void 0 && (r < v.min || v.strictMin && r === v.min) || v.max !== void 0 && (r > v.max || v.strictMax && r === v.max))\n                    return null;\n                  var St = {\n                    name: t,\n                    value: r,\n                    strValue: \"\" + r + (ct || \"\"),\n                    units: ct,\n                    bypass: l\n                  };\n                  return v.unitless || ct !== \"px\" && ct !== \"em\" ? St.pfValue = r : St.pfValue = ct !== \"px\" && ct ? this.getEmSizeInPixels() * r : r, ct !== \"ms\" && ct !== \"s\" || (St.pfValue = ct === \"ms\" ? r : 1e3 * r), ct !== \"deg\" && ct !== \"rad\" || (St.pfValue = ct === \"rad\" ? r : a.deg2rad(r)), ct === \"%\" && (St.pfValue = r / 100), St;\n                }\n                if (v.propList) {\n                  var zt = [], Nt = \"\" + r;\n                  if (Nt !== \"none\") {\n                    for (var re = Nt.split(\",\"), be = 0; be < re.length; be++) {\n                      var ne = re[be].trim();\n                      this.properties[ne] && zt.push(ne);\n                    }\n                    if (zt.length === 0) return null;\n                  }\n                  return {\n                    name: t,\n                    value: zt,\n                    strValue: zt.length === 0 ? \"none\" : zt.join(\", \"),\n                    bypass: l\n                  };\n                }\n                if (v.color) {\n                  var ce = o.color2tuple(r);\n                  return ce ? {\n                    name: t,\n                    value: ce,\n                    pfValue: ce,\n                    strValue: \"\" + r,\n                    bypass: l\n                  } : null;\n                }\n                if (v.regex || v.regexes) {\n                  if (v.enums) {\n                    var xe = ht();\n                    if (xe) return xe;\n                  }\n                  for (var we = v.regexes ? v.regexes : [v.regex], ae = 0; ae < we.length; ae++) {\n                    var Le = new RegExp(we[ae]).exec(r);\n                    if (Le)\n                      return {\n                        name: t,\n                        value: v.singleRegexMatchValue ? Le[1] : Le,\n                        strValue: \"\" + r,\n                        bypass: l\n                      };\n                  }\n                  return null;\n                }\n                return v.string ? { name: t, value: \"\" + r, strValue: \"\" + r, bypass: l } : v.enums ? ht() : null;\n              }\n            };\n            y.exports = n;\n          },\n          function(y, x, g) {\n            var o = g(0), c = g(3), a = g(2), n = {\n              autolock: function(t) {\n                return t === void 0 ? this._private.autolock : (this._private.autolock = !!t, this);\n              },\n              autoungrabify: function(t) {\n                return t === void 0 ? this._private.autoungrabify : (this._private.autoungrabify = !!t, this);\n              },\n              autounselectify: function(t) {\n                return t === void 0 ? this._private.autounselectify : (this._private.autounselectify = !!t, this);\n              },\n              panningEnabled: function(t) {\n                return t === void 0 ? this._private.panningEnabled : (this._private.panningEnabled = !!t, this);\n              },\n              userPanningEnabled: function(t) {\n                return t === void 0 ? this._private.userPanningEnabled : (this._private.userPanningEnabled = !!t, this);\n              },\n              zoomingEnabled: function(t) {\n                return t === void 0 ? this._private.zoomingEnabled : (this._private.zoomingEnabled = !!t, this);\n              },\n              userZoomingEnabled: function(t) {\n                return t === void 0 ? this._private.userZoomingEnabled : (this._private.userZoomingEnabled = !!t, this);\n              },\n              boxSelectionEnabled: function(t) {\n                return t === void 0 ? this._private.boxSelectionEnabled : (this._private.boxSelectionEnabled = !!t, this);\n              },\n              pan: function() {\n                var t = arguments, r = this._private.pan, l = void 0, h = void 0, i = void 0, d = void 0, p = void 0;\n                switch (t.length) {\n                  case 0:\n                    return r;\n                  case 1:\n                    if (o.string(t[0])) return r[l = t[0]];\n                    if (o.plainObject(t[0])) {\n                      if (!this._private.panningEnabled) return this;\n                      d = (i = t[0]).x, p = i.y, o.number(d) && (r.x = d), o.number(p) && (r.y = p), this.emit(\"pan viewport\");\n                    }\n                    break;\n                  case 2:\n                    if (!this._private.panningEnabled) return this;\n                    l = t[0], h = t[1], l !== \"x\" && l !== \"y\" || !o.number(h) || (r[l] = h), this.emit(\"pan viewport\");\n                }\n                return this.notify({ type: \"viewport\" }), this;\n              },\n              panBy: function(t, r) {\n                var l = arguments, h = this._private.pan, i = void 0, d = void 0, p = void 0, f = void 0, v = void 0;\n                if (!this._private.panningEnabled) return this;\n                switch (l.length) {\n                  case 1:\n                    o.plainObject(t) && (f = (p = l[0]).x, v = p.y, o.number(f) && (h.x += f), o.number(v) && (h.y += v), this.emit(\"pan viewport\"));\n                    break;\n                  case 2:\n                    d = r, (i = t) !== \"x\" && i !== \"y\" || !o.number(d) || (h[i] += d), this.emit(\"pan viewport\");\n                }\n                return this.notify({ type: \"viewport\" }), this;\n              },\n              fit: function(t, r) {\n                var l = this.getFitViewport(t, r);\n                if (l) {\n                  var h = this._private;\n                  h.zoom = l.zoom, h.pan = l.pan, this.emit(\"pan zoom viewport\"), this.notify({ type: \"viewport\" });\n                }\n                return this;\n              },\n              getFitViewport: function(t, r) {\n                if (o.number(t) && r === void 0 && (r = t, t = void 0), this._private.panningEnabled && this._private.zoomingEnabled) {\n                  var l = void 0;\n                  if (o.string(t)) {\n                    var h = t;\n                    t = this.$(h);\n                  } else if (o.boundingBox(t)) {\n                    var i = t;\n                    (l = { x1: i.x1, y1: i.y1, x2: i.x2, y2: i.y2 }).w = l.x2 - l.x1, l.h = l.y2 - l.y1;\n                  } else\n                    o.elementOrCollection(t) || (t = this.mutableElements());\n                  if (!o.elementOrCollection(t) || !t.empty()) {\n                    l = l || t.boundingBox();\n                    var d = this.width(), p = this.height(), f = void 0;\n                    if (r = o.number(r) ? r : 0, !isNaN(d) && !isNaN(p) && d > 0 && p > 0 && !isNaN(l.w) && !isNaN(l.h) && l.w > 0 && l.h > 0)\n                      return {\n                        zoom: f = (f = (f = Math.min(\n                          (d - 2 * r) / l.w,\n                          (p - 2 * r) / l.h\n                        )) > this._private.maxZoom ? this._private.maxZoom : f) < this._private.minZoom ? this._private.minZoom : f,\n                        pan: {\n                          x: (d - f * (l.x1 + l.x2)) / 2,\n                          y: (p - f * (l.y1 + l.y2)) / 2\n                        }\n                      };\n                  }\n                }\n              },\n              minZoom: function(t) {\n                return t === void 0 ? this._private.minZoom : (o.number(t) && (this._private.minZoom = t), this);\n              },\n              maxZoom: function(t) {\n                return t === void 0 ? this._private.maxZoom : (o.number(t) && (this._private.maxZoom = t), this);\n              },\n              getZoomedViewport: function(t) {\n                var r = this._private, l = r.pan, h = r.zoom, i = void 0, d = void 0, p = !1;\n                if (r.zoomingEnabled || (p = !0), o.number(t) ? d = t : o.plainObject(t) && (d = t.level, t.position != null ? i = a.modelToRenderedPosition(t.position, h, l) : t.renderedPosition != null && (i = t.renderedPosition), i == null || r.panningEnabled || (p = !0)), d = (d = d > r.maxZoom ? r.maxZoom : d) < r.minZoom ? r.minZoom : d, p || !o.number(d) || d === h || i != null && (!o.number(i.x) || !o.number(i.y)))\n                  return null;\n                if (i != null) {\n                  var f = l, v = h, k = d;\n                  return {\n                    zoomed: !0,\n                    panned: !0,\n                    zoom: k,\n                    pan: {\n                      x: -k / v * (i.x - f.x) + i.x,\n                      y: -k / v * (i.y - f.y) + i.y\n                    }\n                  };\n                }\n                return { zoomed: !0, panned: !1, zoom: d, pan: l };\n              },\n              zoom: function(t) {\n                if (t === void 0) return this._private.zoom;\n                var r = this.getZoomedViewport(t), l = this._private;\n                return r != null && r.zoomed ? (l.zoom = r.zoom, r.panned && (l.pan.x = r.pan.x, l.pan.y = r.pan.y), this.emit(\n                  \"zoom\" + (r.panned ? \" pan\" : \"\") + \" viewport\"\n                ), this.notify({ type: \"viewport\" }), this) : this;\n              },\n              viewport: function(t) {\n                var r = this._private, l = !0, h = !0, i = [], d = !1, p = !1;\n                if (!t) return this;\n                if (o.number(t.zoom) || (l = !1), o.plainObject(t.pan) || (h = !1), !l && !h)\n                  return this;\n                if (l) {\n                  var f = t.zoom;\n                  f < r.minZoom || f > r.maxZoom || !r.zoomingEnabled ? d = !0 : (r.zoom = f, i.push(\"zoom\"));\n                }\n                if (h && (!d || !t.cancelOnFailedZoom) && r.panningEnabled) {\n                  var v = t.pan;\n                  o.number(v.x) && (r.pan.x = v.x, p = !1), o.number(v.y) && (r.pan.y = v.y, p = !1), p || i.push(\"pan\");\n                }\n                return i.length > 0 && (i.push(\"viewport\"), this.emit(i.join(\" \")), this.notify({ type: \"viewport\" })), this;\n              },\n              center: function(t) {\n                var r = this.getCenterPan(t);\n                return r && (this._private.pan = r, this.emit(\"pan viewport\"), this.notify({ type: \"viewport\" })), this;\n              },\n              getCenterPan: function(t, r) {\n                if (this._private.panningEnabled) {\n                  if (o.string(t)) {\n                    var l = t;\n                    t = this.mutableElements().filter(l);\n                  } else\n                    o.elementOrCollection(t) || (t = this.mutableElements());\n                  if (t.length !== 0) {\n                    var h = t.boundingBox(), i = this.width(), d = this.height();\n                    return {\n                      x: (i - (r = r === void 0 ? this._private.zoom : r) * (h.x1 + h.x2)) / 2,\n                      y: (d - r * (h.y1 + h.y2)) / 2\n                    };\n                  }\n                }\n              },\n              reset: function() {\n                return this._private.panningEnabled && this._private.zoomingEnabled ? (this.viewport({ pan: { x: 0, y: 0 }, zoom: 1 }), this) : this;\n              },\n              invalidateSize: function() {\n                this._private.sizeCache = null;\n              },\n              size: function() {\n                var t, r, l = this._private, h = l.container;\n                return l.sizeCache = l.sizeCache || (h ? (t = c.getComputedStyle(h), r = function(i) {\n                  return parseFloat(t.getPropertyValue(i));\n                }, {\n                  width: h.clientWidth - r(\"padding-left\") - r(\"padding-right\"),\n                  height: h.clientHeight - r(\"padding-top\") - r(\"padding-bottom\")\n                }) : { width: 1, height: 1 });\n              },\n              width: function() {\n                return this.size().width;\n              },\n              height: function() {\n                return this.size().height;\n              },\n              extent: function() {\n                var t = this._private.pan, r = this._private.zoom, l = this.renderedExtent(), h = {\n                  x1: (l.x1 - t.x) / r,\n                  x2: (l.x2 - t.x) / r,\n                  y1: (l.y1 - t.y) / r,\n                  y2: (l.y2 - t.y) / r\n                };\n                return h.w = h.x2 - h.x1, h.h = h.y2 - h.y1, h;\n              },\n              renderedExtent: function() {\n                var t = this.width(), r = this.height();\n                return { x1: 0, y1: 0, x2: t, y2: r, w: t, h: r };\n              }\n            };\n            n.centre = n.center, n.autolockNodes = n.autolock, n.autoungrabifyNodes = n.autoungrabify, y.exports = n;\n          },\n          function(y, x, g) {\n            var o = g(1), c = g(4), a = g(7), n = g(12), t = g(95), r = g(0), l = g(11), h = {}, i = {};\n            function d(s, S, j) {\n              var I = j, R = function(Nt) {\n                o.error(\n                  \"Can not register `\" + S + \"` for `\" + s + \"` since `\" + Nt + \"` already exists in the prototype and can not be overridden\"\n                );\n              };\n              if (s === \"core\") {\n                if (n.prototype[S]) return R(S);\n                n.prototype[S] = j;\n              } else if (s === \"collection\") {\n                if (a.prototype[S]) return R(S);\n                a.prototype[S] = j;\n              } else if (s === \"layout\") {\n                for (var M = function(Nt) {\n                  this.options = Nt, j.call(this, Nt), r.plainObject(this._private) || (this._private = {}), this._private.cy = Nt.cy, this._private.listeners = [], this.createEmitter();\n                }, z = M.prototype = Object.create(j.prototype), V = [], G = 0; G < V.length; G++) {\n                  var Y = V[G];\n                  z[Y] = z[Y] || function() {\n                    return this;\n                  };\n                }\n                z.start && !z.run ? z.run = function() {\n                  return this.start(), this;\n                } : !z.start && z.run && (z.start = function() {\n                  return this.run(), this;\n                });\n                var tt = j.prototype.stop;\n                z.stop = function() {\n                  var Nt = this.options;\n                  if (Nt && Nt.animate) {\n                    var re = this.animations;\n                    if (re) for (var be = 0; be < re.length; be++) re[be].stop();\n                  }\n                  return tt ? tt.call(this) : this.emit(\"layoutstop\"), this;\n                }, z.destroy || (z.destroy = function() {\n                  return this;\n                }), z.cy = function() {\n                  return this._private.cy;\n                };\n                var Z = function(Nt) {\n                  return Nt._private.cy;\n                };\n                o.assign(z, {\n                  createEmitter: function() {\n                    return this._private.emitter = new l({\n                      eventFields: function(Nt) {\n                        return { layout: Nt, cy: Z(Nt), target: Nt };\n                      },\n                      bubble: function() {\n                        return !0;\n                      },\n                      parent: function(Nt) {\n                        return Z(Nt);\n                      },\n                      context: this\n                    }), this;\n                  },\n                  emitter: function() {\n                    return this._private.emitter;\n                  },\n                  on: function(Nt, re) {\n                    return this.emitter().on(Nt, re), this;\n                  },\n                  one: function(Nt, re) {\n                    return this.emitter().one(Nt, re), this;\n                  },\n                  once: function(Nt, re) {\n                    return this.emitter().one(Nt, re), this;\n                  },\n                  removeListener: function(Nt, re) {\n                    return this.emitter().removeListener(Nt, re), this;\n                  },\n                  emit: function(Nt, re) {\n                    return this.emitter().emit(Nt, re), this;\n                  }\n                }), c.eventAliasesOn(z), I = M;\n              } else if (s === \"renderer\" && S !== \"null\" && S !== \"base\") {\n                var at = p(\"renderer\", \"base\"), nt = at.prototype, ht = j, ct = j.prototype, ot = function() {\n                  at.apply(this, arguments), ht.apply(this, arguments);\n                }, gt = ot.prototype;\n                for (var xt in nt) {\n                  var St = nt[xt];\n                  if (ct[xt] != null) return R(xt);\n                  gt[xt] = St;\n                }\n                for (var zt in ct) gt[zt] = ct[zt];\n                nt.clientFunctions.forEach(function(Nt) {\n                  gt[Nt] = gt[Nt] || function() {\n                    o.error(\n                      \"Renderer does not implement `renderer.\" + Nt + \"()` on its prototype\"\n                    );\n                  };\n                }), I = ot;\n              }\n              return o.setMap({ map: h, keys: [s, S], value: I });\n            }\n            function p(s, S) {\n              return o.getMap({ map: h, keys: [s, S] });\n            }\n            function f(s, S, j, I, R) {\n              return o.setMap({ map: i, keys: [s, S, j, I], value: R });\n            }\n            function v(s, S, j, I) {\n              return o.getMap({ map: i, keys: [s, S, j, I] });\n            }\n            var k = function() {\n              return arguments.length === 2 ? p.apply(null, arguments) : arguments.length === 3 ? d.apply(null, arguments) : arguments.length === 4 ? v.apply(null, arguments) : arguments.length === 5 ? f.apply(null, arguments) : void o.error(\"Invalid extension access syntax\");\n            };\n            n.prototype.extension = k, t.forEach(function(s) {\n              s.extensions.forEach(function(S) {\n                d(s.type, S.name, S.impl);\n              });\n            }), y.exports = k;\n          },\n          function(y, x, g) {\n            y.exports = [\n              { type: \"layout\", extensions: g(96) },\n              { type: \"renderer\", extensions: g(105) }\n            ];\n          },\n          function(y, x, g) {\n            y.exports = [\n              { name: \"breadthfirst\", impl: g(97) },\n              { name: \"circle\", impl: g(98) },\n              { name: \"concentric\", impl: g(99) },\n              { name: \"cose\", impl: g(100) },\n              { name: \"grid\", impl: g(101) },\n              { name: \"null\", impl: g(102) },\n              { name: \"preset\", impl: g(103) },\n              { name: \"random\", impl: g(104) }\n            ];\n          },\n          function(y, x, g) {\n            var o = g(1), c = g(2), a = g(0), n = {\n              fit: !0,\n              directed: !1,\n              padding: 30,\n              circle: !1,\n              spacingFactor: 1.75,\n              boundingBox: void 0,\n              avoidOverlap: !0,\n              nodeDimensionsIncludeLabels: !1,\n              roots: void 0,\n              maximalAdjustments: 0,\n              animate: !1,\n              animationDuration: 500,\n              animationEasing: void 0,\n              animateFilter: function(r, l) {\n                return !0;\n              },\n              ready: void 0,\n              stop: void 0,\n              transform: function(r, l) {\n                return l;\n              }\n            };\n            function t(r) {\n              this.options = o.extend({}, n, r);\n            }\n            t.prototype.run = function() {\n              var r = this.options, l = r, h = r.cy, i = l.eles, d = i.nodes().not(\":parent\"), p = i, f = c.makeBoundingBox(\n                l.boundingBox ? l.boundingBox : { x1: 0, y1: 0, w: h.width(), h: h.height() }\n              ), v = void 0;\n              if (a.elementOrCollection(l.roots)) v = l.roots;\n              else if (a.array(l.roots)) {\n                for (var k = [], s = 0; s < l.roots.length; s++) {\n                  var S = l.roots[s], j = h.getElementById(S);\n                  k.push(j);\n                }\n                v = h.collection(k);\n              } else if (a.string(l.roots)) v = h.$(l.roots);\n              else if (l.directed) v = d.roots();\n              else {\n                for (var I = [], R = d, M = function() {\n                  var ar = h.collection();\n                  i.bfs({\n                    roots: R[0],\n                    visit: function(Yr, gn, vn, Wr, Ur) {\n                      ar = ar.add(Yr);\n                    },\n                    directed: !1\n                  }), R = R.not(ar), I.push(ar);\n                }; R.length > 0; )\n                  M();\n                v = h.collection();\n                for (var z = function(ar) {\n                  var Yr = I[ar], gn = Yr.maxDegree(!1), vn = Yr.filter(function(Wr) {\n                    return Wr.degree(!1) === gn;\n                  });\n                  v = v.add(vn);\n                }, V = 0; V < I.length; V++)\n                  z(V);\n              }\n              var G = [], Y = {}, tt = {}, Z = {};\n              p.bfs({\n                roots: v,\n                directed: l.directed,\n                visit: function(ar, Yr, gn, vn, Wr) {\n                  var Ur = ar[0], Pn = Ur.id();\n                  if (G[Wr] || (G[Wr] = []), G[Wr].push(Ur), Y[Pn] = !0, tt[Pn] = Wr, gn) {\n                    var Fn = gn.id();\n                    (Z[Fn] = Z[Fn] || []).push(ar);\n                  }\n                }\n              });\n              for (var at = [], nt = 0; nt < d.length; nt++) {\n                var ht = d[nt];\n                Y[ht.id()] || at.push(ht);\n              }\n              for (var ct = 3 * at.length, ot = 0; at.length !== 0 && ot < ct; ) {\n                for (var gt = at.shift(), xt = gt.neighborhood().nodes(), St = !1, zt = 0; zt < xt.length; zt++) {\n                  var Nt = tt[xt[zt].id()];\n                  if (Nt !== void 0) {\n                    G[Nt].push(gt), St = !0;\n                    break;\n                  }\n                }\n                St || at.push(gt), ot++;\n              }\n              for (; at.length !== 0; ) {\n                var re = at.shift();\n                G.length === 0 && G.push([]), G[0].push(re);\n              }\n              var be = function() {\n                for (var ar = 0; ar < G.length; ar++)\n                  for (var Yr = G[ar], gn = 0; gn < Yr.length; gn++) {\n                    var vn = Yr[gn];\n                    vn != null ? vn._private.scratch.breadthfirst = {\n                      depth: ar,\n                      index: gn\n                    } : (Yr.splice(gn, 1), gn--);\n                  }\n              };\n              be();\n              for (var ne = function(ar) {\n                for (var Yr = ar.connectedEdges(function(In) {\n                  return In.data(\"target\") === ar.id();\n                }), gn = ar._private.scratch.breadthfirst, vn = 0, Wr = void 0, Ur = 0; Ur < Yr.length; Ur++) {\n                  var Pn = Yr[Ur].source()[0], Fn = Pn._private.scratch.breadthfirst;\n                  gn.depth <= Fn.depth && vn < Fn.depth && (vn = Fn.depth, Wr = Pn);\n                }\n                return Wr;\n              }, ce = 0; ce < l.maximalAdjustments; ce++) {\n                for (var xe = G.length, we = [], ae = 0; ae < xe; ae++)\n                  for (var Le = G[ae], lt = Le.length, kt = 0; kt < lt; kt++) {\n                    var Dt = Le[kt], yt = Dt._private.scratch.breadthfirst, ft = ne(Dt);\n                    ft && (yt.intEle = ft, we.push(Dt));\n                  }\n                for (var Rt = 0; Rt < we.length; Rt++) {\n                  var Wt = we[Rt], le = Wt._private.scratch.breadthfirst, ye = le.intEle._private.scratch.breadthfirst;\n                  G[le.depth][le.index] = null;\n                  for (var pe = ye.depth + 1; pe > G.length - 1; ) G.push([]);\n                  G[pe].push(Wt), le.depth = pe, le.index = G[pe].length - 1;\n                }\n                be();\n              }\n              var je = 0;\n              if (l.avoidOverlap)\n                for (var Me = 0; Me < d.length; Me++) {\n                  var Ze = d[Me].layoutDimensions(l), ir = Ze.w, Ar = Ze.h;\n                  je = Math.max(je, ir, Ar);\n                }\n              for (var rr = {}, zr = function(ar) {\n                if (rr[ar.id()]) return rr[ar.id()];\n                for (var Yr = ar._private.scratch.breadthfirst.depth, gn = ar.neighborhood().nodes().not(\":parent\").intersection(d), vn = 0, Wr = 0, Ur = 0; Ur < gn.length; Ur++) {\n                  var Pn = gn[Ur]._private.scratch.breadthfirst, Fn = Pn.index, In = Pn.depth, ni = G[In].length;\n                  (Yr > In || Yr === 0) && (vn += Fn / ni, Wr++);\n                }\n                return vn /= Wr = Math.max(1, Wr), Wr === 0 && (vn = void 0), rr[ar.id()] = vn, vn;\n              }, ln = function(ar, Yr) {\n                return zr(ar) - zr(Yr);\n              }, mn = 0; mn < 3; mn++) {\n                for (var un = 0; un < G.length; un++) G[un] = G[un].sort(ln);\n                be();\n              }\n              for (var Kr = 0, yn = 0; yn < G.length; yn++)\n                Kr = Math.max(G[yn].length, Kr);\n              for (var nn = f.x1 + f.w / 2, Ei = f.x1 + f.h / 2, ri = function(ar, Yr) {\n                var gn = ar._private.scratch.breadthfirst, vn = gn.depth, Wr = gn.index, Ur = G[vn].length, Pn = Math.max(f.w / (Ur + 1), je), Fn = Math.max(f.h / (G.length + 1), je), In = Math.min(f.w / 2 / G.length, f.h / 2 / G.length);\n                if (In = Math.max(In, je), l.circle) {\n                  if (l.circle) {\n                    var ni = In * vn + In - (G.length > 0 && G[0].length <= 3 ? In / 2 : 0), Xn = 2 * Math.PI / G[vn].length * Wr;\n                    return vn === 0 && G[0].length === 1 && (ni = 1), { x: nn + ni * Math.cos(Xn), y: Ei + ni * Math.sin(Xn) };\n                  }\n                  return {\n                    x: nn + (Wr + 1 - (Ur + 1) / 2) * Pn,\n                    y: (vn + 1) * Fn\n                  };\n                }\n                var ur = {\n                  x: nn + (Wr + 1 - (Ur + 1) / 2) * Pn,\n                  y: (vn + 1) * Fn\n                };\n                return ur;\n              }, Yn = {}, tn = G.length - 1; tn >= 0; tn--)\n                for (var xn = G[tn], Tn = 0; Tn < xn.length; Tn++) {\n                  var Kn = xn[Tn];\n                  Yn[Kn.id()] = ri(Kn, G.length);\n                }\n              return d.layoutPositions(this, l, function(ar) {\n                return Yn[ar.id()];\n              }), this;\n            }, y.exports = t;\n          },\n          function(y, x, g) {\n            var o = g(1), c = g(2), a = g(0), n = {\n              fit: !0,\n              padding: 30,\n              boundingBox: void 0,\n              avoidOverlap: !0,\n              nodeDimensionsIncludeLabels: !1,\n              spacingFactor: void 0,\n              radius: void 0,\n              startAngle: 1.5 * Math.PI,\n              sweep: void 0,\n              clockwise: !0,\n              sort: void 0,\n              animate: !1,\n              animationDuration: 500,\n              animationEasing: void 0,\n              animateFilter: function(r, l) {\n                return !0;\n              },\n              ready: void 0,\n              stop: void 0,\n              transform: function(r, l) {\n                return l;\n              }\n            };\n            function t(r) {\n              this.options = o.extend({}, n, r);\n            }\n            t.prototype.run = function() {\n              var r = this.options, l = r, h = r.cy, i = l.eles, d = l.counterclockwise !== void 0 ? !l.counterclockwise : l.clockwise, p = i.nodes().not(\":parent\");\n              l.sort && (p = p.sort(l.sort));\n              for (var f = c.makeBoundingBox(\n                l.boundingBox ? l.boundingBox : { x1: 0, y1: 0, w: h.width(), h: h.height() }\n              ), v = f.x1 + f.w / 2, k = f.y1 + f.h / 2, s = (l.sweep === void 0 ? 2 * Math.PI - 2 * Math.PI / p.length : l.sweep) / Math.max(1, p.length - 1), S = void 0, j = 0, I = 0; I < p.length; I++) {\n                var R = p[I].layoutDimensions(l), M = R.w, z = R.h;\n                j = Math.max(j, M, z);\n              }\n              if (S = a.number(l.radius) ? l.radius : p.length <= 1 ? 0 : Math.min(f.h, f.w) / 2 - j, p.length > 1 && l.avoidOverlap) {\n                j *= 1.75;\n                var V = Math.cos(s) - Math.cos(0), G = Math.sin(s) - Math.sin(0), Y = Math.sqrt(j * j / (V * V + G * G));\n                S = Math.max(Y, S);\n              }\n              return p.layoutPositions(this, l, function(tt, Z) {\n                var at = l.startAngle + Z * s * (d ? 1 : -1), nt = S * Math.cos(at), ht = S * Math.sin(at);\n                return { x: v + nt, y: k + ht };\n              }), this;\n            }, y.exports = t;\n          },\n          function(y, x, g) {\n            var o = g(1), c = g(2), a = {\n              fit: !0,\n              padding: 30,\n              startAngle: 1.5 * Math.PI,\n              sweep: void 0,\n              clockwise: !0,\n              equidistant: !1,\n              minNodeSpacing: 10,\n              boundingBox: void 0,\n              avoidOverlap: !0,\n              nodeDimensionsIncludeLabels: !1,\n              height: void 0,\n              width: void 0,\n              spacingFactor: void 0,\n              concentric: function(t) {\n                return t.degree();\n              },\n              levelWidth: function(t) {\n                return t.maxDegree() / 4;\n              },\n              animate: !1,\n              animationDuration: 500,\n              animationEasing: void 0,\n              animateFilter: function(t, r) {\n                return !0;\n              },\n              ready: void 0,\n              stop: void 0,\n              transform: function(t, r) {\n                return r;\n              }\n            };\n            function n(t) {\n              this.options = o.extend({}, a, t);\n            }\n            n.prototype.run = function() {\n              for (var t = this.options, r = t, l = r.counterclockwise !== void 0 ? !r.counterclockwise : r.clockwise, h = t.cy, i = r.eles.nodes().not(\":parent\"), d = c.makeBoundingBox(\n                r.boundingBox ? r.boundingBox : { x1: 0, y1: 0, w: h.width(), h: h.height() }\n              ), p = d.x1 + d.w / 2, f = d.y1 + d.h / 2, v = [], k = (r.startAngle, 0), s = 0; s < i.length; s++) {\n                var S, j = i[s];\n                S = r.concentric(j), v.push({ value: S, node: j }), j._private.scratch.concentric = S;\n              }\n              i.updateStyle();\n              for (var I = 0; I < i.length; I++) {\n                var R = i[I].layoutDimensions(r);\n                k = Math.max(k, R.w, R.h);\n              }\n              v.sort(function(Wt, le) {\n                return le.value - Wt.value;\n              });\n              for (var M = r.levelWidth(i), z = [[]], V = z[0], G = 0; G < v.length; G++) {\n                var Y = v[G];\n                V.length > 0 && Math.abs(V[0].value - Y.value) >= M && (V = [], z.push(V)), V.push(Y);\n              }\n              var tt = k + r.minNodeSpacing;\n              if (!r.avoidOverlap) {\n                var Z = z.length > 0 && z[0].length > 1, at = (Math.min(d.w, d.h) / 2 - tt) / (z.length + Z ? 1 : 0);\n                tt = Math.min(tt, at);\n              }\n              for (var nt = 0, ht = 0; ht < z.length; ht++) {\n                var ct = z[ht], ot = r.sweep === void 0 ? 2 * Math.PI - 2 * Math.PI / ct.length : r.sweep, gt = ct.dTheta = ot / Math.max(1, ct.length - 1);\n                if (ct.length > 1 && r.avoidOverlap) {\n                  var xt = Math.cos(gt) - Math.cos(0), St = Math.sin(gt) - Math.sin(0), zt = Math.sqrt(tt * tt / (xt * xt + St * St));\n                  nt = Math.max(zt, nt);\n                }\n                ct.r = nt, nt += tt;\n              }\n              if (r.equidistant) {\n                for (var Nt = 0, re = 0, be = 0; be < z.length; be++) {\n                  var ne = z[be].r - re;\n                  Nt = Math.max(Nt, ne);\n                }\n                re = 0;\n                for (var ce = 0; ce < z.length; ce++) {\n                  var xe = z[ce];\n                  ce === 0 && (re = xe.r), xe.r = re, re += Nt;\n                }\n              }\n              for (var we = {}, ae = 0; ae < z.length; ae++)\n                for (var Le = z[ae], lt = Le.dTheta, kt = Le.r, Dt = 0; Dt < Le.length; Dt++) {\n                  var yt = Le[Dt], ft = r.startAngle + (l ? 1 : -1) * lt * Dt, Rt = { x: p + kt * Math.cos(ft), y: f + kt * Math.sin(ft) };\n                  we[yt.node.id()] = Rt;\n                }\n              return i.layoutPositions(this, r, function(Wt) {\n                var le = Wt.id();\n                return we[le];\n              }), this;\n            }, y.exports = n;\n          },\n          function(y, x, g) {\n            var o, c = g(1), a = g(2), n = g(0), t = g(5), r = {\n              ready: function() {\n              },\n              stop: function() {\n              },\n              animate: !0,\n              animationEasing: void 0,\n              animationDuration: void 0,\n              animateFilter: function(k, s) {\n                return !0;\n              },\n              animationThreshold: 250,\n              refresh: 20,\n              fit: !0,\n              padding: 30,\n              boundingBox: void 0,\n              nodeDimensionsIncludeLabels: !1,\n              randomize: !1,\n              componentSpacing: 40,\n              nodeRepulsion: function(k) {\n                return 2048;\n              },\n              nodeOverlap: 4,\n              idealEdgeLength: function(k) {\n                return 32;\n              },\n              edgeElasticity: function(k) {\n                return 32;\n              },\n              nestingFactor: 1.2,\n              gravity: 1,\n              numIter: 1e3,\n              initialTemp: 1e3,\n              coolingFactor: 0.99,\n              minTemp: 1,\n              weaver: !1\n            };\n            function l(k) {\n              this.options = c.extend({}, r, k), this.options.layout = this;\n            }\n            l.prototype.run = function() {\n              var k = this.options, s = k.cy, S = this, j = this.thread, I = k.weaver ? k.weaver.Thread : null, R = {\n                listeners: [],\n                on: function(tt, Z) {\n                  return this.listeners.push({ event: tt, callback: Z }), this;\n                },\n                trigger: function(tt) {\n                  n.string(tt) && (tt = { type: tt });\n                  var Z = function(at) {\n                    at.callback(tt);\n                  };\n                  return this.listeners.filter(function(at) {\n                    return at.event === tt.type;\n                  }).forEach(Z), this;\n                },\n                pass: function(tt) {\n                  return this.pass = tt, this;\n                },\n                run: function(tt) {\n                  var Z = this.pass;\n                  return new t(function(at) {\n                    at(tt(Z));\n                  });\n                },\n                stop: function() {\n                  return this;\n                },\n                stopped: function() {\n                  return !0;\n                }\n              };\n              j && !j.stopped() || (j = this.thread = I ? new I() : R), S.stopped = !1, k.animate !== !0 && k.animate !== !1 || S.emit({ type: \"layoutstart\", layout: S }), o = k.debug === !0;\n              var M = h(s, S, k);\n              o && p(M), k.randomize && f(M);\n              var z = Date.now(), V = !1, G = function(tt) {\n                tt = tt || {}, V && !tt.next || !tt.force && Date.now() - z < k.animationThreshold || (V = !0, c.requestAnimationFrame(function() {\n                  v(M, s, k), k.fit === !0 && s.fit(k.padding), V = !1, tt.next && tt.next();\n                }));\n              };\n              j.on(\"message\", function(tt) {\n                var Z = tt.message;\n                M.layoutNodes = Z, G();\n              }), j.pass({\n                layoutInfo: M,\n                options: {\n                  animate: k.animate,\n                  refresh: k.refresh,\n                  componentSpacing: k.componentSpacing,\n                  nodeOverlap: k.nodeOverlap,\n                  nestingFactor: k.nestingFactor,\n                  gravity: k.gravity,\n                  numIter: k.numIter,\n                  initialTemp: k.initialTemp,\n                  coolingFactor: k.coolingFactor,\n                  minTemp: k.minTemp\n                }\n              }).run(function(tt) {\n                var Z, at, nt = tt.layoutInfo, ht = tt.options, ct = function(lt, kt) {\n                  for (var Dt = 0; Dt < lt.graphSet.length; Dt++)\n                    for (var yt = lt.graphSet[Dt], ft = yt.length, Rt = 0; Rt < ft; Rt++)\n                      for (var Wt = lt.layoutNodes[lt.idToIndex[yt[Rt]]], le = Rt + 1; le < ft; le++) {\n                        var ye = lt.layoutNodes[lt.idToIndex[yt[le]]];\n                        gt(Wt, ye, lt, kt);\n                      }\n                }, ot = function(lt) {\n                  return -lt + 2 * lt * Math.random();\n                }, gt = function(lt, kt, Dt, yt) {\n                  if (lt.cmptId === kt.cmptId || Dt.isCompound) {\n                    var ft = kt.positionX - lt.positionX, Rt = kt.positionY - lt.positionY;\n                    ft === 0 && Rt === 0 && (ft = ot(1), Rt = ot(1));\n                    var Wt = xt(lt, kt, ft, Rt);\n                    if (Wt > 0)\n                      var le = (pe = yt.nodeOverlap * Wt) * ft / (rr = Math.sqrt(ft * ft + Rt * Rt)), ye = pe * Rt / rr;\n                    else {\n                      var pe, je = St(lt, ft, Rt), Me = St(kt, -1 * ft, -1 * Rt), Ze = Me.x - je.x, ir = Me.y - je.y, Ar = Ze * Ze + ir * ir, rr = Math.sqrt(Ar);\n                      le = (pe = (lt.nodeRepulsion + kt.nodeRepulsion) / Ar) * Ze / rr, ye = pe * ir / rr;\n                    }\n                    lt.isLocked || (lt.offsetX -= le, lt.offsetY -= ye), kt.isLocked || (kt.offsetX += le, kt.offsetY += ye);\n                  }\n                }, xt = function(lt, kt, Dt, yt) {\n                  if (Dt > 0) var ft = lt.maxX - kt.minX;\n                  else ft = kt.maxX - lt.minX;\n                  if (yt > 0) var Rt = lt.maxY - kt.minY;\n                  else Rt = kt.maxY - lt.minY;\n                  return ft >= 0 && Rt >= 0 ? Math.sqrt(ft * ft + Rt * Rt) : 0;\n                }, St = function(lt, kt, Dt) {\n                  var yt = lt.positionX, ft = lt.positionY, Rt = lt.height || 1, Wt = lt.width || 1, le = Dt / kt, ye = Rt / Wt, pe = {};\n                  return kt === 0 && 0 < Dt || kt === 0 && 0 > Dt ? (pe.x = yt, pe.y = ft + Rt / 2, pe) : 0 < kt && -1 * ye <= le && le <= ye ? (pe.x = yt + Wt / 2, pe.y = ft + Wt * Dt / 2 / kt, pe) : 0 > kt && -1 * ye <= le && le <= ye ? (pe.x = yt - Wt / 2, pe.y = ft - Wt * Dt / 2 / kt, pe) : 0 < Dt && (le <= -1 * ye || le >= ye) ? (pe.x = yt + Rt * kt / 2 / Dt, pe.y = ft + Rt / 2, pe) : (0 > Dt && (le <= -1 * ye || le >= ye) && (pe.x = yt - Rt * kt / 2 / Dt, pe.y = ft - Rt / 2), pe);\n                }, zt = function(lt, kt) {\n                  for (var Dt = 0; Dt < lt.edgeSize; Dt++) {\n                    var yt = lt.layoutEdges[Dt], ft = lt.idToIndex[yt.sourceId], Rt = lt.layoutNodes[ft], Wt = lt.idToIndex[yt.targetId], le = lt.layoutNodes[Wt], ye = le.positionX - Rt.positionX, pe = le.positionY - Rt.positionY;\n                    if (ye !== 0 || pe !== 0) {\n                      var je = St(Rt, ye, pe), Me = St(le, -1 * ye, -1 * pe), Ze = Me.x - je.x, ir = Me.y - je.y, Ar = Math.sqrt(Ze * Ze + ir * ir), rr = Math.pow(yt.idealLength - Ar, 2) / yt.elasticity;\n                      if (Ar !== 0)\n                        var zr = rr * Ze / Ar, ln = rr * ir / Ar;\n                      else zr = 0, ln = 0;\n                      Rt.isLocked || (Rt.offsetX += zr, Rt.offsetY += ln), le.isLocked || (le.offsetX -= zr, le.offsetY -= ln);\n                    }\n                  }\n                }, Nt = function(lt, kt) {\n                  for (var Dt = 0; Dt < lt.graphSet.length; Dt++) {\n                    var yt = lt.graphSet[Dt], ft = yt.length;\n                    if (Dt === 0)\n                      var Rt = lt.clientHeight / 2, Wt = lt.clientWidth / 2;\n                    else {\n                      var le = lt.layoutNodes[lt.idToIndex[yt[0]]], ye = lt.layoutNodes[lt.idToIndex[le.parentId]];\n                      Rt = ye.positionX, Wt = ye.positionY;\n                    }\n                    for (var pe = 0; pe < ft; pe++) {\n                      var je = lt.layoutNodes[lt.idToIndex[yt[pe]]];\n                      if (!je.isLocked) {\n                        var Me = Rt - je.positionX, Ze = Wt - je.positionY, ir = Math.sqrt(Me * Me + Ze * Ze);\n                        if (ir > 1) {\n                          var Ar = kt.gravity * Me / ir, rr = kt.gravity * Ze / ir;\n                          je.offsetX += Ar, je.offsetY += rr;\n                        }\n                      }\n                    }\n                  }\n                }, re = function(lt, kt) {\n                  var Dt = [], yt = 0, ft = -1;\n                  for (Dt.push.apply(Dt, lt.graphSet[0]), ft += lt.graphSet[0].length; yt <= ft; ) {\n                    var Rt = Dt[yt++], Wt = lt.idToIndex[Rt], le = lt.layoutNodes[Wt], ye = le.children;\n                    if (0 < ye.length && !le.isLocked) {\n                      for (var pe = le.offsetX, je = le.offsetY, Me = 0; Me < ye.length; Me++) {\n                        var Ze = lt.layoutNodes[lt.idToIndex[ye[Me]]];\n                        Ze.offsetX += pe, Ze.offsetY += je, Dt[++ft] = ye[Me];\n                      }\n                      le.offsetX = 0, le.offsetY = 0;\n                    }\n                  }\n                }, be = function(lt, kt) {\n                  for (var Dt = 0; Dt < lt.nodeSize; Dt++)\n                    0 < (ft = lt.layoutNodes[Dt]).children.length && (ft.maxX = void 0, ft.minX = void 0, ft.maxY = void 0, ft.minY = void 0);\n                  for (Dt = 0; Dt < lt.nodeSize; Dt++)\n                    if (!(0 < (ft = lt.layoutNodes[Dt]).children.length || ft.isLocked)) {\n                      var yt = ne(ft.offsetX, ft.offsetY, lt.temperature);\n                      ft.positionX += yt.x, ft.positionY += yt.y, ft.offsetX = 0, ft.offsetY = 0, ft.minX = ft.positionX - ft.width, ft.maxX = ft.positionX + ft.width, ft.minY = ft.positionY - ft.height, ft.maxY = ft.positionY + ft.height, ce(ft, lt);\n                    }\n                  for (Dt = 0; Dt < lt.nodeSize; Dt++) {\n                    var ft;\n                    0 < (ft = lt.layoutNodes[Dt]).children.length && !ft.isLocked && (ft.positionX = (ft.maxX + ft.minX) / 2, ft.positionY = (ft.maxY + ft.minY) / 2, ft.width = ft.maxX - ft.minX, ft.height = ft.maxY - ft.minY);\n                  }\n                }, ne = function(lt, kt, Dt) {\n                  var yt = Math.sqrt(lt * lt + kt * kt);\n                  if (yt > Dt) var ft = { x: Dt * lt / yt, y: Dt * kt / yt };\n                  else ft = { x: lt, y: kt };\n                  return ft;\n                }, ce = function lt(kt, Dt) {\n                  var yt = kt.parentId;\n                  if (yt != null) {\n                    var ft = Dt.layoutNodes[Dt.idToIndex[yt]], Rt = !1;\n                    return (ft.maxX == null || kt.maxX + ft.padRight > ft.maxX) && (ft.maxX = kt.maxX + ft.padRight, Rt = !0), (ft.minX == null || kt.minX - ft.padLeft < ft.minX) && (ft.minX = kt.minX - ft.padLeft, Rt = !0), (ft.maxY == null || kt.maxY + ft.padBottom > ft.maxY) && (ft.maxY = kt.maxY + ft.padBottom, Rt = !0), (ft.minY == null || kt.minY - ft.padTop < ft.minY) && (ft.minY = kt.minY - ft.padTop, Rt = !0), Rt ? lt(ft, Dt) : void 0;\n                  }\n                }, xe = function(lt) {\n                  return function(kt, Dt, yt) {\n                    ct(kt, Dt), zt(kt), Nt(kt, Dt), re(kt), be(kt);\n                  }(nt, ht), nt.temperature = nt.temperature * ht.coolingFactor, !(nt.temperature < ht.minTemp);\n                }, we = 0;\n                do {\n                  for (var ae = 0; ae < ht.refresh && we < ht.numIter; ) {\n                    var Le;\n                    if (!(Le = xe())) break;\n                    ae++, we++;\n                  }\n                  ht.animate === !0 && (Z = nt.layoutNodes, at = void 0, at = { type: \"message\", message: Z }, R.trigger(at));\n                } while (Le && we + 1 < ht.numIter);\n                return function(lt, kt) {\n                  for (var Dt = nt.layoutNodes, yt = [], ft = 0; ft < Dt.length; ft++) {\n                    var Rt = Dt[ft], Wt = Rt.cmptId;\n                    (yt[Wt] = yt[Wt] || []).push(Rt);\n                  }\n                  var le = 0;\n                  for (ft = 0; ft < yt.length; ft++)\n                    if (rr = yt[ft]) {\n                      rr.x1 = 1 / 0, rr.x2 = -1 / 0, rr.y1 = 1 / 0, rr.y2 = -1 / 0;\n                      for (var ye = 0; ye < rr.length; ye++) {\n                        var pe = rr[ye];\n                        rr.x1 = Math.min(\n                          rr.x1,\n                          pe.positionX - pe.width / 2\n                        ), rr.x2 = Math.max(\n                          rr.x2,\n                          pe.positionX + pe.width / 2\n                        ), rr.y1 = Math.min(\n                          rr.y1,\n                          pe.positionY - pe.height / 2\n                        ), rr.y2 = Math.max(\n                          rr.y2,\n                          pe.positionY + pe.height / 2\n                        );\n                      }\n                      rr.w = rr.x2 - rr.x1, rr.h = rr.y2 - rr.y1, le += rr.w * rr.h;\n                    }\n                  yt.sort(function(zr, ln) {\n                    return ln.w * ln.h - zr.w * zr.h;\n                  });\n                  var je = 0, Me = 0, Ze = 0, ir = 0, Ar = Math.sqrt(le) * nt.clientWidth / nt.clientHeight;\n                  for (ft = 0; ft < yt.length; ft++) {\n                    var rr;\n                    if (rr = yt[ft]) {\n                      for (ye = 0; ye < rr.length; ye++)\n                        (pe = rr[ye]).isLocked || (pe.positionX += je, pe.positionY += Me);\n                      je += rr.w + kt.componentSpacing, Ze += rr.w + kt.componentSpacing, ir = Math.max(ir, rr.h), Ze > Ar && (Me += ir + kt.componentSpacing, je = 0, Ze = 0, ir = 0);\n                    }\n                  }\n                }(0, ht), nt;\n              }).then(function(tt) {\n                M.layoutNodes = tt.layoutNodes, j.stop(), Y();\n              });\n              var Y = function() {\n                k.animate === !0 || k.animate === !1 ? G({\n                  force: !0,\n                  next: function() {\n                    S.one(\"layoutstop\", k.stop), S.emit({ type: \"layoutstop\", layout: S });\n                  }\n                }) : k.eles.nodes().layoutPositions(S, k, function(tt) {\n                  var Z = M.layoutNodes[M.idToIndex[tt.data(\"id\")]];\n                  return { x: Z.positionX, y: Z.positionY };\n                });\n              };\n              return this;\n            }, l.prototype.stop = function() {\n              return this.stopped = !0, this.thread && this.thread.stop(), this.emit(\"layoutstop\"), this;\n            }, l.prototype.destroy = function() {\n              return this.thread && this.thread.stop(), this;\n            };\n            var h = function(k, s, S) {\n              for (var j = S.eles.edges(), I = S.eles.nodes(), R = {\n                isCompound: k.hasCompoundNodes(),\n                layoutNodes: [],\n                idToIndex: {},\n                nodeSize: I.size(),\n                graphSet: [],\n                indexToGraph: [],\n                layoutEdges: [],\n                edgeSize: j.size(),\n                temperature: S.initialTemp,\n                clientWidth: k.width(),\n                clientHeight: k.width(),\n                boundingBox: a.makeBoundingBox(\n                  S.boundingBox ? S.boundingBox : { x1: 0, y1: 0, w: k.width(), h: k.height() }\n                )\n              }, M = S.eles.components(), z = {}, V = 0; V < M.length; V++)\n                for (var G = M[V], Y = 0; Y < G.length; Y++)\n                  z[G[Y].id()] = V;\n              for (V = 0; V < R.nodeSize; V++) {\n                var tt = (ct = I[V]).layoutDimensions(S);\n                (kt = {}).isLocked = ct.locked(), kt.id = ct.data(\"id\"), kt.parentId = ct.data(\"parent\"), kt.cmptId = z[ct.id()], kt.children = [], kt.positionX = ct.position(\"x\"), kt.positionY = ct.position(\"y\"), kt.offsetX = 0, kt.offsetY = 0, kt.height = tt.w, kt.width = tt.h, kt.maxX = kt.positionX + kt.width / 2, kt.minX = kt.positionX - kt.width / 2, kt.maxY = kt.positionY + kt.height / 2, kt.minY = kt.positionY - kt.height / 2, kt.padLeft = parseFloat(ct.style(\"padding\")), kt.padRight = parseFloat(ct.style(\"padding\")), kt.padTop = parseFloat(ct.style(\"padding\")), kt.padBottom = parseFloat(ct.style(\"padding\")), kt.nodeRepulsion = n.fn(S.nodeRepulsion) ? S.nodeRepulsion(ct) : S.nodeRepulsion, R.layoutNodes.push(kt), R.idToIndex[kt.id] = V;\n              }\n              var Z = [], at = 0, nt = -1, ht = [];\n              for (V = 0; V < R.nodeSize; V++) {\n                var ct, ot = (ct = R.layoutNodes[V]).parentId;\n                ot != null ? R.layoutNodes[R.idToIndex[ot]].children.push(ct.id) : (Z[++nt] = ct.id, ht.push(ct.id));\n              }\n              for (R.graphSet.push(ht); at <= nt; ) {\n                var gt = Z[at++], xt = R.idToIndex[gt], St = R.layoutNodes[xt].children;\n                if (St.length > 0)\n                  for (R.graphSet.push(St), V = 0; V < St.length; V++)\n                    Z[++nt] = St[V];\n              }\n              for (V = 0; V < R.graphSet.length; V++) {\n                var zt = R.graphSet[V];\n                for (Y = 0; Y < zt.length; Y++) {\n                  var Nt = R.idToIndex[zt[Y]];\n                  R.indexToGraph[Nt] = V;\n                }\n              }\n              for (V = 0; V < R.edgeSize; V++) {\n                var re = j[V], be = {};\n                be.id = re.data(\"id\"), be.sourceId = re.data(\"source\"), be.targetId = re.data(\"target\");\n                var ne = n.fn(S.idealEdgeLength) ? S.idealEdgeLength(re) : S.idealEdgeLength, ce = n.fn(S.edgeElasticity) ? S.edgeElasticity(re) : S.edgeElasticity, xe = R.idToIndex[be.sourceId], we = R.idToIndex[be.targetId];\n                if (R.indexToGraph[xe] != R.indexToGraph[we]) {\n                  for (var ae = i(be.sourceId, be.targetId, R), Le = R.graphSet[ae], lt = 0, kt = R.layoutNodes[xe]; Le.indexOf(kt.id) === -1; )\n                    kt = R.layoutNodes[R.idToIndex[kt.parentId]], lt++;\n                  for (kt = R.layoutNodes[we]; Le.indexOf(kt.id) === -1; )\n                    kt = R.layoutNodes[R.idToIndex[kt.parentId]], lt++;\n                  ne *= lt * S.nestingFactor;\n                }\n                be.idealLength = ne, be.elasticity = ce, R.layoutEdges.push(be);\n              }\n              return R;\n            }, i = function(k, s, S) {\n              var j = d(k, s, 0, S);\n              return 2 > j.count ? 0 : j.graph;\n            }, d = function k(s, S, j, I) {\n              var R = I.graphSet[j];\n              if (-1 < R.indexOf(s) && -1 < R.indexOf(S))\n                return { count: 2, graph: j };\n              for (var M = 0, z = 0; z < R.length; z++) {\n                var V = R[z], G = I.idToIndex[V], Y = I.layoutNodes[G].children;\n                if (Y.length !== 0) {\n                  var tt = k(s, S, I.indexToGraph[I.idToIndex[Y[0]]], I);\n                  if (tt.count !== 0) {\n                    if (tt.count !== 1) return tt;\n                    if (++M == 2) break;\n                  }\n                }\n              }\n              return { count: M, graph: j };\n            }, p = function(k) {\n              if (o) {\n                console.debug(\"layoutNodes:\");\n                for (var s = 0; s < k.nodeSize; s++) {\n                  var S = k.layoutNodes[s], j = `\nindex: ` + s + `\nId: ` + S.id + `\nChildren: ` + S.children.toString() + `\nparentId: ` + S.parentId + `\npositionX: ` + S.positionX + `\npositionY: ` + S.positionY + `\nOffsetX: ` + S.offsetX + `\nOffsetY: ` + S.offsetY + `\npadLeft: ` + S.padLeft + `\npadRight: ` + S.padRight + `\npadTop: ` + S.padTop + `\npadBottom: ` + S.padBottom;\n                  console.debug(j);\n                }\n                for (var s in console.debug(\"idToIndex\"), k.idToIndex)\n                  console.debug(\"Id: \" + s + `\nIndex: ` + k.idToIndex[s]);\n                console.debug(\"Graph Set\");\n                var I = k.graphSet;\n                for (s = 0; s < I.length; s++)\n                  console.debug(\"Set : \" + s + \": \" + I[s].toString());\n                for (j = \"IndexToGraph\", s = 0; s < k.indexToGraph.length; s++)\n                  j += `\nIndex : ` + s + \" Graph: \" + k.indexToGraph[s];\n                for (console.debug(j), j = \"Layout Edges\", s = 0; s < k.layoutEdges.length; s++) {\n                  var R = k.layoutEdges[s];\n                  j += `\nEdge Index: ` + s + \" ID: \" + R.id + \" SouceID: \" + R.sourceId + \" TargetId: \" + R.targetId + \" Ideal Length: \" + R.idealLength;\n                }\n                console.debug(j), j = \"nodeSize: \" + k.nodeSize, j += `\nedgeSize: ` + k.edgeSize, j += `\ntemperature: ` + k.temperature, console.debug(j);\n              }\n            }, f = function(k, s) {\n              for (var S = k.clientWidth, j = k.clientHeight, I = 0; I < k.nodeSize; I++) {\n                var R = k.layoutNodes[I];\n                R.children.length !== 0 || R.isLocked || (R.positionX = Math.random() * S, R.positionY = Math.random() * j);\n              }\n            }, v = function(k, s, S) {\n              var j = S.layout, I = S.eles.nodes(), R = k.boundingBox, M = { x1: 1 / 0, x2: -1 / 0, y1: 1 / 0, y2: -1 / 0 };\n              S.boundingBox && (I.forEach(function(z) {\n                var V = k.layoutNodes[k.idToIndex[z.data(\"id\")]];\n                M.x1 = Math.min(M.x1, V.positionX), M.x2 = Math.max(M.x2, V.positionX), M.y1 = Math.min(M.y1, V.positionY), M.y2 = Math.max(M.y2, V.positionY);\n              }), M.w = M.x2 - M.x1, M.h = M.y2 - M.y1), I.positions(function(z, V) {\n                var G = k.layoutNodes[k.idToIndex[z.data(\"id\")]];\n                if (S.boundingBox) {\n                  var Y = (G.positionX - M.x1) / M.w, tt = (G.positionY - M.y1) / M.h;\n                  return { x: R.x1 + Y * R.w, y: R.y1 + tt * R.h };\n                }\n                return { x: G.positionX, y: G.positionY };\n              }), k.ready !== !0 && (k.ready = !0, j.one(\"layoutready\", S.ready), j.emit({ type: \"layoutready\", layout: this }));\n            };\n            y.exports = l;\n          },\n          function(y, x, g) {\n            var o = g(1), c = g(2), a = {\n              fit: !0,\n              padding: 30,\n              boundingBox: void 0,\n              avoidOverlap: !0,\n              avoidOverlapPadding: 10,\n              nodeDimensionsIncludeLabels: !1,\n              spacingFactor: void 0,\n              condense: !1,\n              rows: void 0,\n              cols: void 0,\n              position: function(t) {\n              },\n              sort: void 0,\n              animate: !1,\n              animationDuration: 500,\n              animationEasing: void 0,\n              animateFilter: function(t, r) {\n                return !0;\n              },\n              ready: void 0,\n              stop: void 0,\n              transform: function(t, r) {\n                return r;\n              }\n            };\n            function n(t) {\n              this.options = o.extend({}, a, t);\n            }\n            n.prototype.run = function() {\n              var t = this.options, r = t, l = t.cy, h = r.eles.nodes().not(\":parent\");\n              r.sort && (h = h.sort(r.sort));\n              var i = c.makeBoundingBox(\n                r.boundingBox ? r.boundingBox : { x1: 0, y1: 0, w: l.width(), h: l.height() }\n              );\n              if (i.h === 0 || i.w === 0)\n                h.layoutPositions(this, r, function(we) {\n                  return { x: i.x1, y: i.y1 };\n                });\n              else {\n                var d = h.size(), p = Math.sqrt(d * i.h / i.w), f = Math.round(p), v = Math.round(i.w / i.h * p), k = function(we) {\n                  if (we == null) return Math.min(f, v);\n                  Math.min(f, v) == f ? f = we : v = we;\n                }, s = function(we) {\n                  if (we == null) return Math.max(f, v);\n                  Math.max(f, v) == f ? f = we : v = we;\n                }, S = r.rows, j = r.cols != null ? r.cols : r.columns;\n                if (S != null && j != null) f = S, v = j;\n                else if (S != null && j == null)\n                  f = S, v = Math.ceil(d / f);\n                else if (S == null && j != null)\n                  v = j, f = Math.ceil(d / v);\n                else if (v * f > d) {\n                  var I = k(), R = s();\n                  (I - 1) * R >= d ? k(I - 1) : (R - 1) * I >= d && s(R - 1);\n                } else\n                  for (; v * f < d; ) {\n                    var M = k(), z = s();\n                    (z + 1) * M >= d ? s(z + 1) : k(M + 1);\n                  }\n                var V = i.w / v, G = i.h / f;\n                if (r.condense && (V = 0, G = 0), r.avoidOverlap)\n                  for (var Y = 0; Y < h.length; Y++) {\n                    var tt = h[Y], Z = tt._private.position;\n                    Z.x != null && Z.y != null || (Z.x = 0, Z.y = 0);\n                    var at = tt.layoutDimensions(r), nt = r.avoidOverlapPadding, ht = at.w + nt, ct = at.h + nt;\n                    V = Math.max(V, ht), G = Math.max(G, ct);\n                  }\n                for (var ot = {}, gt = function(we, ae) {\n                  return !!ot[\"c-\" + we + \"-\" + ae];\n                }, xt = function(we, ae) {\n                  ot[\"c-\" + we + \"-\" + ae] = !0;\n                }, St = 0, zt = 0, Nt = function() {\n                  ++zt >= v && (zt = 0, St++);\n                }, re = {}, be = 0; be < h.length; be++) {\n                  var ne = h[be], ce = r.position(ne);\n                  if (ce && (ce.row !== void 0 || ce.col !== void 0)) {\n                    var xe = { row: ce.row, col: ce.col };\n                    if (xe.col === void 0)\n                      for (xe.col = 0; gt(xe.row, xe.col); ) xe.col++;\n                    else if (xe.row === void 0)\n                      for (xe.row = 0; gt(xe.row, xe.col); ) xe.row++;\n                    re[ne.id()] = xe, xt(xe.row, xe.col);\n                  }\n                }\n                h.layoutPositions(this, r, function(we, ae) {\n                  var Le = void 0, lt = void 0;\n                  if (we.locked() || we.isParent()) return !1;\n                  var kt = re[we.id()];\n                  if (kt)\n                    Le = kt.col * V + V / 2 + i.x1, lt = kt.row * G + G / 2 + i.y1;\n                  else {\n                    for (; gt(St, zt); ) Nt();\n                    Le = zt * V + V / 2 + i.x1, lt = St * G + G / 2 + i.y1, xt(St, zt), Nt();\n                  }\n                  return { x: Le, y: lt };\n                });\n              }\n              return this;\n            }, y.exports = n;\n          },\n          function(y, x, g) {\n            var o = g(1), c = { ready: function() {\n            }, stop: function() {\n            } };\n            function a(n) {\n              this.options = o.extend({}, c, n);\n            }\n            a.prototype.run = function() {\n              var n = this.options, t = n.eles;\n              return n.cy, this.emit(\"layoutstart\"), t.nodes().positions(function() {\n                return { x: 0, y: 0 };\n              }), this.one(\"layoutready\", n.ready), this.emit(\"layoutready\"), this.one(\"layoutstop\", n.stop), this.emit(\"layoutstop\"), this;\n            }, a.prototype.stop = function() {\n              return this;\n            }, y.exports = a;\n          },\n          function(y, x, g) {\n            var o = g(1), c = g(0), a = {\n              positions: void 0,\n              zoom: void 0,\n              pan: void 0,\n              fit: !0,\n              padding: 30,\n              animate: !1,\n              animationDuration: 500,\n              animationEasing: void 0,\n              animateFilter: function(t, r) {\n                return !0;\n              },\n              ready: void 0,\n              stop: void 0,\n              transform: function(t, r) {\n                return r;\n              }\n            };\n            function n(t) {\n              this.options = o.extend({}, a, t);\n            }\n            n.prototype.run = function() {\n              var t = this.options, r = t.eles.nodes(), l = c.fn(t.positions);\n              return r.layoutPositions(this, t, function(h, i) {\n                var d = function(p) {\n                  if (t.positions == null) return null;\n                  if (l) return t.positions(p);\n                  var f = t.positions[p._private.data.id];\n                  return f ?? null;\n                }(h);\n                return !h.locked() && d != null && d;\n              }), this;\n            }, y.exports = n;\n          },\n          function(y, x, g) {\n            var o = g(1), c = g(2), a = {\n              fit: !0,\n              padding: 30,\n              boundingBox: void 0,\n              animate: !1,\n              animationDuration: 500,\n              animationEasing: void 0,\n              animateFilter: function(t, r) {\n                return !0;\n              },\n              ready: void 0,\n              stop: void 0,\n              transform: function(t, r) {\n                return r;\n              }\n            };\n            function n(t) {\n              this.options = o.extend({}, a, t);\n            }\n            n.prototype.run = function() {\n              var t = this.options, r = t.cy, l = t.eles.nodes().not(\":parent\"), h = c.makeBoundingBox(\n                t.boundingBox ? t.boundingBox : { x1: 0, y1: 0, w: r.width(), h: r.height() }\n              );\n              return l.layoutPositions(this, t, function(i, d) {\n                return {\n                  x: h.x1 + Math.round(Math.random() * h.w),\n                  y: h.y1 + Math.round(Math.random() * h.h)\n                };\n              }), this;\n            }, y.exports = n;\n          },\n          function(y, x, g) {\n            y.exports = [\n              { name: \"null\", impl: g(106) },\n              { name: \"base\", impl: g(107) },\n              { name: \"canvas\", impl: g(123) }\n            ];\n          },\n          function(y, x, g) {\n            function o(a) {\n              this.options = a, this.notifications = 0;\n            }\n            var c = function() {\n            };\n            o.prototype = {\n              recalculateRenderedStyle: c,\n              notify: function() {\n                this.notifications++;\n              },\n              init: c\n            }, y.exports = o;\n          },\n          function(y, x, g) {\n            var o = g(0), c = g(1), a = g(3), n = function(r) {\n              this.init(r);\n            }, t = n.prototype;\n            t.clientFunctions = [\n              \"redrawHint\",\n              \"render\",\n              \"renderTo\",\n              \"matchCanvasSize\",\n              \"nodeShapeImpl\",\n              \"arrowShapeImpl\"\n            ], t.init = function(r) {\n              var l = this;\n              l.options = r, l.cy = r.cy;\n              var h = l.container = r.cy.container();\n              if (a) {\n                var i = a.document, d = i.head, p = \"__________cytoscape_container\", f = i.getElementById(\"__________cytoscape_stylesheet\") != null;\n                if (h.className.indexOf(p) < 0 && (h.className = (h.className || \"\") + \" \" + p), !f) {\n                  var v = i.createElement(\"style\");\n                  v.id = \"__________cytoscape_stylesheet\", v.innerHTML = \".\" + p + \" { position: relative; }\", d.insertBefore(v, d.children[0]);\n                }\n                a.getComputedStyle(h).getPropertyValue(\"position\") === \"static\" && c.error(\n                  \"A Cytoscape container has style position:static and so can not use UI extensions properly\"\n                );\n              }\n              l.selection = [void 0, void 0, void 0, void 0, 0], l.bezierProjPcts = [\n                0.05,\n                0.225,\n                0.4,\n                0.5,\n                0.6,\n                0.775,\n                0.95\n              ], l.hoverData = {\n                down: null,\n                last: null,\n                downTime: null,\n                triggerMode: null,\n                dragging: !1,\n                initialPan: [null, null],\n                capture: !1\n              }, l.dragData = { possibleDragElements: [] }, l.touchData = {\n                start: null,\n                capture: !1,\n                startPosition: [null, null, null, null, null, null],\n                singleTouchStartTime: null,\n                singleTouchMoved: !0,\n                now: [null, null, null, null, null, null],\n                earlier: [null, null, null, null, null, null]\n              }, l.redraws = 0, l.showFps = r.showFps, l.debug = r.debug, l.hideEdgesOnViewport = r.hideEdgesOnViewport, l.hideLabelsOnViewport = r.hideLabelsOnViewport, l.textureOnViewport = r.textureOnViewport, l.wheelSensitivity = r.wheelSensitivity, l.motionBlurEnabled = r.motionBlur, l.forcedPixelRatio = r.pixelRatio, l.motionBlur = r.motionBlur, l.motionBlurOpacity = r.motionBlurOpacity, l.motionBlurTransparency = 1 - l.motionBlurOpacity, l.motionBlurPxRatio = 1, l.mbPxRBlurry = 1, l.minMbLowQualFrames = 4, l.fullQualityMb = !1, l.clearedForMotionBlur = [], l.desktopTapThreshold = r.desktopTapThreshold, l.desktopTapThreshold2 = r.desktopTapThreshold * r.desktopTapThreshold, l.touchTapThreshold = r.touchTapThreshold, l.touchTapThreshold2 = r.touchTapThreshold * r.touchTapThreshold, l.tapholdDuration = 500, l.bindings = [], l.beforeRenderCallbacks = [], l.beforeRenderPriorities = {\n                animations: 400,\n                eleCalcs: 300,\n                eleTxrDeq: 200,\n                lyrTxrDeq: 100\n              }, l.registerNodeShapes(), l.registerArrowShapes(), l.registerCalculationListeners();\n            }, t.notify = function(r) {\n              var l, h = this;\n              if (!this.destroyed) {\n                l = o.array(r.type) ? r.type : [r.type];\n                for (var i = {}, d = 0; d < l.length; d++) i[l[d]] = !0;\n                i.init ? h.load() : i.destroy ? h.destroy() : ((i.add || i.remove || i.load || i.zorder) && h.invalidateCachedZSortedEles(), i.viewport && h.redrawHint(\"select\", !0), (i.load || i.resize) && (h.invalidateContainerClientCoordsCache(), h.matchCanvasSize(h.container)), h.redrawHint(\"eles\", !0), h.redrawHint(\"drag\", !0), this.startRenderLoop(), this.redraw());\n              }\n            }, t.destroy = function() {\n              var r = this;\n              r.destroyed = !0, r.cy.stopAnimationLoop();\n              for (var l = 0; l < r.bindings.length; l++) {\n                var h = r.bindings[l], i = h.target;\n                (i.off || i.removeEventListener).apply(i, h.args);\n              }\n              if (r.bindings = [], r.beforeRenderCallbacks = [], r.onUpdateEleCalcsFns = [], r.removeObserver && r.removeObserver.disconnect(), r.styleObserver && r.styleObserver.disconnect(), r.labelCalcDiv)\n                try {\n                  document.body.removeChild(r.labelCalcDiv);\n                } catch {\n                }\n            }, [g(108), g(109), g(119), g(120), g(121), g(122)].forEach(\n              function(r) {\n                c.extend(t, r);\n              }\n            ), y.exports = n;\n          },\n          function(y, x, g) {\n            var o = g(2), c = g(0), a = g(1), n = {\n              arrowShapeWidth: 0.3,\n              registerArrowShapes: function() {\n                var t = this.arrowShapes = {}, r = this, l = function(v, k, s, S, j, I, R) {\n                  var M = j.x - s / 2 - R, z = j.x + s / 2 + R, V = j.y - s / 2 - R, G = j.y + s / 2 + R;\n                  return M <= v && v <= z && V <= k && k <= G;\n                }, h = function(v, k, s, S, j) {\n                  var I = v * Math.cos(S) - k * Math.sin(S), R = (v * Math.sin(S) + k * Math.cos(S)) * s;\n                  return { x: I * s + j.x, y: R + j.y };\n                }, i = function(v, k, s, S) {\n                  for (var j = [], I = 0; I < v.length; I += 2) {\n                    var R = v[I], M = v[I + 1];\n                    j.push(h(R, M, k, s, S));\n                  }\n                  return j;\n                }, d = function(v) {\n                  for (var k = [], s = 0; s < v.length; s++) {\n                    var S = v[s];\n                    k.push(S.x, S.y);\n                  }\n                  return k;\n                }, p = function(v) {\n                  return v.pstyle(\"width\").pfValue * v.pstyle(\"arrow-scale\").pfValue * 2;\n                }, f = function(v, k) {\n                  c.string(k) && (k = t[k]), t[v] = a.extend(\n                    {\n                      name: v,\n                      points: [\n                        -0.15,\n                        -0.3,\n                        0.15,\n                        -0.3,\n                        0.15,\n                        0.3,\n                        -0.15,\n                        0.3\n                      ],\n                      collide: function(s, S, j, I, R, M) {\n                        var z = d(i(this.points, j + 2 * M, I, R));\n                        return o.pointInsidePolygonPoints(s, S, z);\n                      },\n                      roughCollide: l,\n                      draw: function(s, S, j, I) {\n                        var R = i(this.points, S, j, I);\n                        r.arrowShapeImpl(\"polygon\")(s, R);\n                      },\n                      spacing: function(s) {\n                        return 0;\n                      },\n                      gap: p\n                    },\n                    k\n                  );\n                };\n                f(\"none\", {\n                  collide: a.falsify,\n                  roughCollide: a.falsify,\n                  draw: a.noop,\n                  spacing: a.zeroify,\n                  gap: a.zeroify\n                }), f(\"triangle\", {\n                  points: [-0.15, -0.3, 0, 0, 0.15, -0.3]\n                }), f(\"arrow\", \"triangle\"), f(\"triangle-backcurve\", {\n                  points: t.triangle.points,\n                  controlPoint: [0, -0.15],\n                  roughCollide: l,\n                  draw: function(v, k, s, S, j) {\n                    var I = i(this.points, k, s, S), R = this.controlPoint, M = h(R[0], R[1], k, s, S);\n                    r.arrowShapeImpl(this.name)(v, I, M);\n                  },\n                  gap: function(v) {\n                    return 0.8 * p(v);\n                  }\n                }), f(\"triangle-tee\", {\n                  points: [-0.15, -0.3, 0, 0, 0.15, -0.3, -0.15, -0.3],\n                  pointsTee: [\n                    -0.15,\n                    -0.4,\n                    -0.15,\n                    -0.5,\n                    0.15,\n                    -0.5,\n                    0.15,\n                    -0.4\n                  ],\n                  collide: function(v, k, s, S, j, I, R) {\n                    var M = d(i(this.points, s + 2 * R, S, j)), z = d(i(this.pointsTee, s + 2 * R, S, j));\n                    return o.pointInsidePolygonPoints(v, k, M) || o.pointInsidePolygonPoints(v, k, z);\n                  },\n                  draw: function(v, k, s, S, j) {\n                    var I = i(this.points, k, s, S), R = i(this.pointsTee, k, s, S);\n                    r.arrowShapeImpl(this.name)(v, I, R);\n                  }\n                }), f(\"triangle-cross\", {\n                  points: [-0.15, -0.3, 0, 0, 0.15, -0.3, -0.15, -0.3],\n                  baseCrossLinePts: [\n                    -0.15,\n                    -0.4,\n                    -0.15,\n                    -0.4,\n                    0.15,\n                    -0.4,\n                    0.15,\n                    -0.4\n                  ],\n                  crossLinePts: function(v, k) {\n                    var s = this.baseCrossLinePts.slice(), S = k / v;\n                    return s[3] = s[3] - S, s[5] = s[5] - S, s;\n                  },\n                  collide: function(v, k, s, S, j, I, R) {\n                    var M = d(i(this.points, s + 2 * R, S, j)), z = d(i(this.crossLinePts(s, I), s + 2 * R, S, j));\n                    return o.pointInsidePolygonPoints(v, k, M) || o.pointInsidePolygonPoints(v, k, z);\n                  },\n                  draw: function(v, k, s, S, j) {\n                    var I = i(this.points, k, s, S), R = i(this.crossLinePts(k, j), k, s, S);\n                    r.arrowShapeImpl(this.name)(v, I, R);\n                  }\n                }), f(\"vee\", {\n                  points: [-0.15, -0.3, 0, 0, 0.15, -0.3, 0, -0.15],\n                  gap: function(v) {\n                    return 0.525 * p(v);\n                  }\n                }), f(\"circle\", {\n                  radius: 0.15,\n                  collide: function(v, k, s, S, j, I, R) {\n                    var M = j;\n                    return Math.pow(M.x - v, 2) + Math.pow(M.y - k, 2) <= Math.pow((s + 2 * R) * this.radius, 2);\n                  },\n                  draw: function(v, k, s, S, j) {\n                    r.arrowShapeImpl(this.name)(\n                      v,\n                      S.x,\n                      S.y,\n                      this.radius * k\n                    );\n                  },\n                  spacing: function(v) {\n                    return r.getArrowWidth(\n                      v.pstyle(\"width\").pfValue,\n                      v.pstyle(\"arrow-scale\").value\n                    ) * this.radius;\n                  }\n                }), f(\"tee\", {\n                  points: [-0.15, 0, -0.15, -0.1, 0.15, -0.1, 0.15, 0],\n                  spacing: function(v) {\n                    return 1;\n                  },\n                  gap: function(v) {\n                    return 1;\n                  }\n                }), f(\"square\", {\n                  points: [-0.15, 0, 0.15, 0, 0.15, -0.3, -0.15, -0.3]\n                }), f(\"diamond\", {\n                  points: [-0.15, -0.15, 0, -0.3, 0.15, -0.15, 0, 0],\n                  gap: function(v) {\n                    return v.pstyle(\"width\").pfValue * v.pstyle(\"arrow-scale\").value;\n                  }\n                });\n              }\n            };\n            y.exports = n;\n          },\n          function(y, x, g) {\n            var o = g(1), c = {};\n            [\n              g(110),\n              g(111),\n              g(112),\n              g(113),\n              g(114),\n              g(115),\n              g(116),\n              g(117),\n              g(118)\n            ].forEach(function(a) {\n              o.extend(c, a);\n            }), y.exports = c;\n          },\n          function(y, x, g) {\n            var o = g(3), c = g(2), a = g(1), n = (o = g(3), {\n              projectIntoViewport: function(t, r) {\n                var l = this.cy, h = this.findContainerClientCoords(), i = h[0], d = h[1], p = h[4], f = l.pan(), v = l.zoom();\n                return [((t - i) / p - f.x) / v, ((r - d) / p - f.y) / v];\n              },\n              findContainerClientCoords: function() {\n                if (this.containerBB) return this.containerBB;\n                var t = this.container, r = t.getBoundingClientRect(), l = o.getComputedStyle(t), h = function(Z) {\n                  return parseFloat(l.getPropertyValue(Z));\n                }, i = h(\"padding-left\"), d = h(\"padding-right\"), p = h(\"padding-top\"), f = h(\"padding-bottom\"), v = h(\"border-left-width\"), k = h(\"border-right-width\"), s = h(\"border-top-width\"), S = (h(\"border-bottom-width\"), t.clientWidth), j = t.clientHeight, I = i + d, R = p + f, M = v + k, z = r.width / (S + M), V = S - I, G = j - R, Y = (r.width, r.height, r.left + i + v), tt = r.top + p + s;\n                return this.containerBB = [Y, tt, V, G, z];\n              },\n              invalidateContainerClientCoordsCache: function() {\n                this.containerBB = null;\n              },\n              findNearestElement: function(t, r, l, h) {\n                return this.findNearestElements(t, r, l, h)[0];\n              },\n              findNearestElements: function(t, r, l, h) {\n                var i, d, p = this, f = this, v = f.getCachedZSortedEles(), k = [], s = f.cy.zoom(), S = f.cy.hasCompoundNodes(), j = (h ? 24 : 8) / s, I = (h ? 8 : 2) / s, R = (h ? 8 : 2) / s, M = 1 / 0;\n                function z(nt, ht) {\n                  if (nt.isNode()) {\n                    if (d) return;\n                    d = nt, k.push(nt);\n                  }\n                  if (nt.isEdge() && (ht == null || ht < M))\n                    if (i) {\n                      if (i.pstyle(\"z-index\").value === nt.pstyle(\"z-index\").value) {\n                        for (var ct = 0; ct < k.length; ct++)\n                          if (k[ct].isEdge()) {\n                            k[ct] = nt, i = nt, M = ht ?? M;\n                            break;\n                          }\n                      }\n                    } else k.push(nt), i = nt, M = ht ?? M;\n                }\n                function V(nt) {\n                  var ht = nt.outerWidth() + 2 * I, ct = nt.outerHeight() + 2 * I, ot = ht / 2, gt = ct / 2, xt = nt.position();\n                  if (xt.x - ot <= t && t <= xt.x + ot && xt.y - gt <= r && r <= xt.y + gt && f.nodeShapes[p.getNodeShape(nt)].checkPoint(\n                    t,\n                    r,\n                    0,\n                    ht,\n                    ct,\n                    xt.x,\n                    xt.y\n                  ))\n                    return z(nt, 0), !0;\n                }\n                function G(nt) {\n                  var ht, ct = nt._private, ot = ct.rscratch, gt = nt.pstyle(\"width\").pfValue, xt = nt.pstyle(\"arrow-scale\").value, St = gt / 2 + j, zt = St * St, Nt = 2 * St, re = ct.source, be = ct.target;\n                  if (ot.edgeType === \"segments\" || ot.edgeType === \"straight\" || ot.edgeType === \"haystack\") {\n                    for (var ne = ot.allpts, ce = 0; ce + 3 < ne.length; ce += 2)\n                      if (c.inLineVicinity(\n                        t,\n                        r,\n                        ne[ce],\n                        ne[ce + 1],\n                        ne[ce + 2],\n                        ne[ce + 3],\n                        Nt\n                      ) && zt > (ht = c.sqdistToFiniteLine(\n                        t,\n                        r,\n                        ne[ce],\n                        ne[ce + 1],\n                        ne[ce + 2],\n                        ne[ce + 3]\n                      )))\n                        return z(nt, ht), !0;\n                  } else if (ot.edgeType === \"bezier\" || ot.edgeType === \"multibezier\" || ot.edgeType === \"self\" || ot.edgeType === \"compound\") {\n                    for (ne = ot.allpts, ce = 0; ce + 5 < ot.allpts.length; ce += 4)\n                      if (c.inBezierVicinity(\n                        t,\n                        r,\n                        ne[ce],\n                        ne[ce + 1],\n                        ne[ce + 2],\n                        ne[ce + 3],\n                        ne[ce + 4],\n                        ne[ce + 5],\n                        Nt\n                      ) && zt > (ht = c.sqdistToQuadraticBezier(\n                        t,\n                        r,\n                        ne[ce],\n                        ne[ce + 1],\n                        ne[ce + 2],\n                        ne[ce + 3],\n                        ne[ce + 4],\n                        ne[ce + 5]\n                      )))\n                        return z(nt, ht), !0;\n                  }\n                  re = re || ct.source, be = be || ct.target;\n                  var xe = p.getArrowWidth(gt, xt), we = [\n                    {\n                      name: \"source\",\n                      x: ot.arrowStartX,\n                      y: ot.arrowStartY,\n                      angle: ot.srcArrowAngle\n                    },\n                    {\n                      name: \"target\",\n                      x: ot.arrowEndX,\n                      y: ot.arrowEndY,\n                      angle: ot.tgtArrowAngle\n                    },\n                    {\n                      name: \"mid-source\",\n                      x: ot.midX,\n                      y: ot.midY,\n                      angle: ot.midsrcArrowAngle\n                    },\n                    {\n                      name: \"mid-target\",\n                      x: ot.midX,\n                      y: ot.midY,\n                      angle: ot.midtgtArrowAngle\n                    }\n                  ];\n                  for (ce = 0; ce < we.length; ce++) {\n                    var ae = we[ce], Le = f.arrowShapes[nt.pstyle(ae.name + \"-arrow-shape\").value], lt = nt.pstyle(\"width\").pfValue;\n                    if (Le.roughCollide(\n                      t,\n                      r,\n                      xe,\n                      ae.angle,\n                      { x: ae.x, y: ae.y },\n                      lt,\n                      j\n                    ) && Le.collide(\n                      t,\n                      r,\n                      xe,\n                      ae.angle,\n                      { x: ae.x, y: ae.y },\n                      lt,\n                      j\n                    ))\n                      return z(nt), !0;\n                  }\n                  S && k.length > 0 && (V(re), V(be));\n                }\n                function Y(nt, ht, ct) {\n                  return a.getPrefixedProperty(nt, ht, ct);\n                }\n                function tt(nt, ht) {\n                  var ct, ot = nt._private, gt = R;\n                  ct = ht ? ht + \"-\" : \"\";\n                  var xt = nt.pstyle(ct + \"label\").value;\n                  if (nt.pstyle(\"text-events\").strValue === \"yes\" && xt) {\n                    var St = ot.rstyle, zt = nt.pstyle(\"text-border-width\").pfValue, Nt = nt.pstyle(\"text-background-padding\").pfValue, re = Y(St, \"labelWidth\", ht) + zt + 2 * gt + 2 * Nt, be = Y(St, \"labelHeight\", ht) + zt + 2 * gt + 2 * Nt, ne = Y(St, \"labelX\", ht), ce = Y(St, \"labelY\", ht), xe = Y(ot.rscratch, \"labelAngle\", ht), we = ne - re / 2, ae = ne + re / 2, Le = ce - be / 2, lt = ce + be / 2;\n                    if (xe) {\n                      var kt = Math.cos(xe), Dt = Math.sin(xe), yt = function(je, Me) {\n                        return {\n                          x: (je -= ne) * kt - (Me -= ce) * Dt + ne,\n                          y: je * Dt + Me * kt + ce\n                        };\n                      }, ft = yt(we, Le), Rt = yt(we, lt), Wt = yt(ae, Le), le = yt(ae, lt), ye = [ft.x, ft.y, Wt.x, Wt.y, le.x, le.y, Rt.x, Rt.y];\n                      if (c.pointInsidePolygonPoints(t, r, ye))\n                        return z(nt), !0;\n                    } else {\n                      var pe = { w: re, h: be, x1: we, x2: ae, y1: Le, y2: lt };\n                      if (c.inBoundingBox(pe, t, r)) return z(nt), !0;\n                    }\n                  }\n                }\n                l && (v = v.interactive);\n                for (var Z = v.length - 1; Z >= 0; Z--) {\n                  var at = v[Z];\n                  at.isNode() ? V(at) || tt(at) : G(at) || tt(at) || tt(at, \"source\") || tt(at, \"target\");\n                }\n                return k;\n              },\n              getAllInBox: function(t, r, l, h) {\n                var i = this.getCachedZSortedEles().interactive, d = [], p = Math.min(t, l), f = Math.max(t, l), v = Math.min(r, h), k = Math.max(r, h);\n                t = p, l = f, r = v, h = k;\n                for (var s = c.makeBoundingBox({\n                  x1: t,\n                  y1: r,\n                  x2: l,\n                  y2: h\n                }), S = 0; S < i.length; S++) {\n                  var j = i[S];\n                  if (j.isNode()) {\n                    var I = j, R = I.boundingBox({\n                      includeNodes: !0,\n                      includeEdges: !1,\n                      includeLabels: !1\n                    });\n                    c.boundingBoxesIntersect(s, R) && !c.boundingBoxInBoundingBox(R, s) && d.push(I);\n                  } else {\n                    var M = j, z = M._private, V = z.rscratch;\n                    if (V.startX != null && V.startY != null && !c.inBoundingBox(s, V.startX, V.startY) || V.endX != null && V.endY != null && !c.inBoundingBox(s, V.endX, V.endY))\n                      continue;\n                    if (V.edgeType === \"bezier\" || V.edgeType === \"multibezier\" || V.edgeType === \"self\" || V.edgeType === \"compound\" || V.edgeType === \"segments\" || V.edgeType === \"haystack\") {\n                      for (var G = z.rstyle.bezierPts || z.rstyle.linePts || z.rstyle.haystackPts, Y = !0, tt = 0; tt < G.length; tt++)\n                        if (!c.pointInBoundingBox(s, G[tt])) {\n                          Y = !1;\n                          break;\n                        }\n                      Y && d.push(M);\n                    } else\n                      V.edgeType !== \"haystack\" && V.edgeType !== \"straight\" || d.push(M);\n                  }\n                }\n                return d;\n              }\n            });\n            y.exports = n;\n          },\n          function(y, x, g) {\n            var o = g(2), c = {\n              calculateArrowAngles: function(a) {\n                var n, t, r, l, h, i, d = a._private.rscratch, p = d.edgeType === \"haystack\", f = d.edgeType === \"bezier\", v = d.edgeType === \"multibezier\", k = d.edgeType === \"segments\", s = d.edgeType === \"compound\", S = d.edgeType === \"self\";\n                if (p ? (r = d.haystackPts[0], l = d.haystackPts[1], h = d.haystackPts[2], i = d.haystackPts[3]) : (r = d.arrowStartX, l = d.arrowStartY, h = d.arrowEndX, i = d.arrowEndY), I = d.midX, R = d.midY, k)\n                  n = r - d.segpts[0], t = l - d.segpts[1];\n                else if (v || s || S || f) {\n                  var j = d.allpts;\n                  n = r - o.qbezierAt(j[0], j[2], j[4], 0.1), t = l - o.qbezierAt(j[1], j[3], j[5], 0.1);\n                } else n = r - I, t = l - R;\n                d.srcArrowAngle = o.getAngleFromDisp(n, t);\n                var I = d.midX, R = d.midY;\n                if (p && (I = (r + h) / 2, R = (l + i) / 2), n = h - r, t = i - l, k)\n                  if ((j = d.allpts).length / 2 % 2 == 0) {\n                    var M = (z = j.length / 2) - 2;\n                    n = j[z] - j[M], t = j[z + 1] - j[M + 1];\n                  } else {\n                    M = (z = j.length / 2 - 1) - 2;\n                    var z, V = z + 2;\n                    n = j[z] - j[M], t = j[z + 1] - j[M + 1];\n                  }\n                else if (v || s || S) {\n                  var G, Y, tt, Z, j = d.allpts;\n                  if (d.ctrlpts.length / 2 % 2 == 0) {\n                    var at = 2 + (nt = 2 + (ht = j.length / 2 - 1));\n                    G = o.qbezierAt(j[ht], j[nt], j[at], 0), Y = o.qbezierAt(j[ht + 1], j[nt + 1], j[at + 1], 0), tt = o.qbezierAt(j[ht], j[nt], j[at], 1e-4), Z = o.qbezierAt(j[ht + 1], j[nt + 1], j[at + 1], 1e-4);\n                  } else {\n                    var nt, ht = (nt = j.length / 2 - 1) - 2;\n                    at = nt + 2, G = o.qbezierAt(j[ht], j[nt], j[at], 0.4999), Y = o.qbezierAt(\n                      j[ht + 1],\n                      j[nt + 1],\n                      j[at + 1],\n                      0.4999\n                    ), tt = o.qbezierAt(j[ht], j[nt], j[at], 0.5), Z = o.qbezierAt(j[ht + 1], j[nt + 1], j[at + 1], 0.5);\n                  }\n                  n = tt - G, t = Z - Y;\n                }\n                if (d.midtgtArrowAngle = o.getAngleFromDisp(n, t), d.midDispX = n, d.midDispY = t, n *= -1, t *= -1, k && ((j = d.allpts).length / 2 % 2 == 0 || (n = -(j[V = 2 + (z = j.length / 2 - 1)] - j[z]), t = -(j[V + 1] - j[z + 1]))), d.midsrcArrowAngle = o.getAngleFromDisp(n, t), k)\n                  n = h - d.segpts[d.segpts.length - 2], t = i - d.segpts[d.segpts.length - 1];\n                else if (v || s || S || f) {\n                  var ct = (j = d.allpts).length;\n                  n = h - o.qbezierAt(j[ct - 6], j[ct - 4], j[ct - 2], 0.9), t = i - o.qbezierAt(j[ct - 5], j[ct - 3], j[ct - 1], 0.9);\n                } else n = h - I, t = i - R;\n                d.tgtArrowAngle = o.getAngleFromDisp(n, t);\n              }\n            };\n            c.getArrowWidth = c.getArrowHeight = function(a, n) {\n              var t = this.arrowWidthCache = this.arrowWidthCache || {}, r = t[a + \", \" + n];\n              return r || (r = Math.max(Math.pow(13.37 * a, 0.9), 29) * n, t[a + \", \" + n] = r, r);\n            }, y.exports = c;\n          },\n          function(y, x, g) {\n            var o = g(2), c = g(0), a = {};\n            function n(t) {\n              var r = [];\n              if (t != null) {\n                for (var l = 0; l < t.length; l += 2) {\n                  var h = t[l], i = t[l + 1];\n                  r.push({ x: h, y: i });\n                }\n                return r;\n              }\n            }\n            a.findEdgeControlPoints = function(t) {\n              if (t && t.length !== 0) {\n                for (var r, l, h, i, d, p = this, f = p.cy.hasCompoundNodes(), v = {}, k = [], s = [], S = 0; S < t.length; S++) {\n                  var j = (ke = (Xt = t[S])._private).data, I = (Nt = Xt.pstyle(\"curve-style\").value) === \"unbundled-bezier\" || Nt === \"segments\", R = Nt === \"unbundled-bezier\" || Nt === \"bezier\";\n                  if (Xt.pstyle(\"display\").value !== \"none\")\n                    if (Nt !== \"haystack\") {\n                      var M = j.source, z = j.target;\n                      r = M > z ? z + \"$-$\" + M : M + \"$-$\" + z, I && (r = \"unbundled$-$\" + j.id);\n                      var V = v[r];\n                      V == null && (V = v[r] = [], k.push(r)), V.push(Xt), I && (V.hasUnbundled = !0), R && (V.hasBezier = !0);\n                    } else s.push(Xt);\n                }\n                for (var G = 0; G < k.length; G++) {\n                  var Y = v[r = k[G]];\n                  if (Y.sort(function(de, me) {\n                    return de.poolIndex() - me.poolIndex();\n                  }), W = Y[0]._private.source, et = Y[0]._private.target, !Y.hasUnbundled && W.id() > et.id()) {\n                    var tt = W;\n                    W = et, et = tt;\n                  }\n                  dt = W.position(), mt = et.position(), Mt = W.outerWidth(), Zt = W.outerHeight(), Ut = et.outerWidth(), ve = et.outerHeight(), l = p.nodeShapes[this.getNodeShape(W)], h = p.nodeShapes[this.getNodeShape(et)], d = !1;\n                  var Z = {\n                    north: 0,\n                    west: 0,\n                    south: 0,\n                    east: 0,\n                    northwest: 0,\n                    southwest: 0,\n                    northeast: 0,\n                    southeast: 0\n                  }, at = dt.x, nt = dt.y, ht = Mt, ct = Zt, ot = mt.x, gt = mt.y, xt = Ut, St = ve, zt = Y.length;\n                  for (S = 0; S < Y.length; S++) {\n                    var Nt, re, be = (P = (Xt = Y[S])._private.rscratch).lastEdgeIndex, ne = S, ce = P.lastNumEdges, xe = (I = (Nt = Xt.pstyle(\"curve-style\").value) === \"unbundled-bezier\" || Nt === \"segments\", W.id() !== Xt.source().id()), we = Xt.pstyle(\"control-point-distances\"), ae = Xt.pstyle(\"loop-direction\").pfValue, Le = Xt.pstyle(\"loop-sweep\").pfValue, lt = Xt.pstyle(\"control-point-weights\"), kt = we && lt ? Math.min(we.value.length, lt.value.length) : 1, Dt = Xt.pstyle(\"control-point-step-size\").pfValue, yt = we ? we.pfValue[0] : void 0, ft = lt.value[0], Rt = Xt.pstyle(\"edge-distances\").value, Wt = Xt.pstyle(\"segment-weights\"), le = Xt.pstyle(\"segment-distances\"), ye = Math.min(Wt.pfValue.length, le.pfValue.length), pe = Xt.pstyle(\"source-endpoint\").value, je = Xt.pstyle(\"target-endpoint\").value, Me = Xt.pstyle(\"source-arrow-shape\").value, Ze = Xt.pstyle(\"target-arrow-shape\").value, ir = Xt.pstyle(\"arrow-scale\").value, Ar = Xt.pstyle(\"width\").pfValue, rr = P.lastSrcCtlPtX, zr = P.lastSrcCtlPtY, ln = P.lastSrcCtlPtW, mn = P.lastSrcCtlPtH, un = P.lastTgtCtlPtX, Kr = P.lastTgtCtlPtY, yn = P.lastTgtCtlPtW, nn = P.lastTgtCtlPtH, Ei = P.lastCurveStyle, ri = Nt, Yn = P.lastCtrlptDists, tn = we ? we.strValue : null, xn = P.lastCtrlptWs, Tn = lt.strValue, Kn = P.lastSegmentWs, ar = Wt.strValue, Yr = P.lastSegmentDs, gn = le.strValue, vn = P.lastStepSize, Wr = Dt, Ur = P.lastLoopDir, Pn = ae, Fn = P.lastLoopSwp, In = Le, ni = P.lastEdgeDistances, Xn = Rt, ur = P.lastSrcEndpt, _r = pe, Gi = P.lastTgtEndpt, Si = je, $a = P.lastSrcArr, To = Me, wo = P.lastTgtArr, Vn = Ze, pa = P.lastLineW, ko = Ar, Ao = P.lastArrScl, Po = ir;\n                    if (P.badBezier = !!d, rr === at && zr === nt && ln === ht && mn === ct && un === ot && Kr === gt && yn === xt && nn === St && Ei === ri && Yn === tn && xn === Tn && Kn === ar && Yr === gn && vn === Wr && Ur === Pn && Fn === In && ni === Xn && ur === _r && Gi === Si && $a === To && wo === Vn && pa === ko && Ao === Po && (be === ne && ce === zt || I) ? re = !0 : (re = !1, P.lastSrcCtlPtX = at, P.lastSrcCtlPtY = nt, P.lastSrcCtlPtW = ht, P.lastSrcCtlPtH = ct, P.lastTgtCtlPtX = ot, P.lastTgtCtlPtY = gt, P.lastTgtCtlPtW = xt, P.lastTgtCtlPtH = St, P.lastEdgeIndex = ne, P.lastNumEdges = zt, P.lastCurveStyle = ri, P.lastCtrlptDists = tn, P.lastCtrlptWs = Tn, P.lastSegmentDs = gn, P.lastSegmentWs = ar, P.lastStepSize = Wr, P.lastLoopDir = Pn, P.lastLoopSwp = In, P.lastEdgeDistances = Xn, P.lastSrcEndpt = _r, P.lastTgtEndpt = Si, P.lastSrcArr = To, P.lastTgtArr = Vn, P.lastLineW = ko, P.lastArrScl = Po), !re) {\n                      if (!Y.calculatedIntersection && W !== et && (Y.hasBezier || Y.hasUnbundled)) {\n                        Y.calculatedIntersection = !0;\n                        var Nn = l.intersectLine(\n                          dt.x,\n                          dt.y,\n                          Mt,\n                          Zt,\n                          mt.x,\n                          mt.y,\n                          0\n                        );\n                        Y.srcIntn = Nn;\n                        var pi = h.intersectLine(\n                          mt.x,\n                          mt.y,\n                          Ut,\n                          ve,\n                          dt.x,\n                          dt.y,\n                          0\n                        );\n                        Y.tgtIntn = pi;\n                        var Fo = {\n                          x1: Nn[0],\n                          x2: pi[0],\n                          y1: Nn[1],\n                          y2: pi[1]\n                        }, ui = { x1: dt.x, x2: mt.x, y1: dt.y, y2: mt.y }, Ri = pi[1] - Nn[1], qo = pi[0] - Nn[0], wn = Math.sqrt(qo * qo + Ri * Ri), Sn = { x: qo, y: Ri }, Do = { x: Sn.x / wn, y: Sn.y / wn };\n                        i = { x: -Do.y, y: Do.x }, h.checkPoint(Nn[0], Nn[1], 0, Ut, ve, mt.x, mt.y) && l.checkPoint(\n                          pi[0],\n                          pi[1],\n                          0,\n                          Mt,\n                          Zt,\n                          dt.x,\n                          dt.y\n                        ) && (i = {}, d = !0);\n                      }\n                      if (xe ? (P.srcIntn = Y.tgtIntn, P.tgtIntn = Y.srcIntn) : (P.srcIntn = Y.srcIntn, P.tgtIntn = Y.tgtIntn), W === et) {\n                        P.edgeType = \"self\";\n                        var Dn = S, Wi = Dt;\n                        I && (Dn = 0, Wi = yt);\n                        var Eo = ae - Math.PI / 2, hi = Eo - Le / 2, ro = Eo + Le / 2, Ro = ae + \"_\" + Le;\n                        Dn = Z[Ro] === void 0 ? Z[Ro] = 0 : ++Z[Ro], P.ctrlpts = [\n                          dt.x + 1.4 * Math.cos(hi) * Wi * (Dn / 3 + 1),\n                          dt.y + 1.4 * Math.sin(hi) * Wi * (Dn / 3 + 1),\n                          dt.x + 1.4 * Math.cos(ro) * Wi * (Dn / 3 + 1),\n                          dt.y + 1.4 * Math.sin(ro) * Wi * (Dn / 3 + 1)\n                        ];\n                      } else if (f && (W.isParent() || W.isChild() || et.isParent() || et.isChild()) && (W.parents().anySame(et) || et.parents().anySame(W))) {\n                        P.edgeType = \"compound\", P.badBezier = !1, Dn = S, Wi = Dt, I && (Dn = 0, Wi = yt);\n                        var sr = { x: dt.x - Mt / 2, y: dt.y - Zt / 2 }, Ci = { x: mt.x - Ut / 2, y: mt.y - ve / 2 }, gi = {\n                          x: Math.min(sr.x, Ci.x),\n                          y: Math.min(sr.y, Ci.y)\n                        }, ha = Math.max(0.5, Math.log(0.01 * Mt)), Io = Math.max(0.5, Math.log(0.01 * Ut));\n                        P.ctrlpts = [\n                          gi.x,\n                          gi.y - (1 + Math.pow(50, 1.12) / 100) * Wi * (Dn / 3 + 1) * ha,\n                          gi.x - (1 + Math.pow(50, 1.12) / 100) * Wi * (Dn / 3 + 1) * Io,\n                          gi.y\n                        ];\n                      } else if (Nt === \"segments\") {\n                        P.edgeType = \"segments\", P.segpts = [];\n                        for (var $i = 0; $i < ye; $i++) {\n                          var _i = Wt.pfValue[$i], Yi = le.pfValue[$i], ci = 1 - _i, Ii = _i, xi = {\n                            x: (di = Rt === \"node-position\" ? ui : Fo).x1 * ci + di.x2 * Ii,\n                            y: di.y1 * ci + di.y2 * Ii\n                          };\n                          P.segpts.push(xi.x + i.x * Yi, xi.y + i.y * Yi);\n                        }\n                      } else if (Y.length % 2 != 1 || S !== Math.floor(Y.length / 2) || I) {\n                        var Xi = I;\n                        P.edgeType = Xi ? \"multibezier\" : \"bezier\", P.ctrlpts = [];\n                        for (var fn = 0; fn < kt; fn++) {\n                          var mi, No = (0.5 - Y.length / 2 + S) * Dt, no = o.signum(No);\n                          Xi && (yt = we ? we.pfValue[fn] : Dt, ft = lt.value[fn]);\n                          var di, Zi = (mi = I ? yt : yt !== void 0 ? no * yt : void 0) !== void 0 ? mi : No;\n                          ci = 1 - ft, Ii = ft, xe && (tt = ci, ci = Ii, Ii = tt), xi = {\n                            x: (di = Rt === \"node-position\" ? ui : Fo).x1 * ci + di.x2 * Ii,\n                            y: di.y1 * ci + di.y2 * Ii\n                          }, P.ctrlpts.push(xi.x + i.x * Zi, xi.y + i.y * Zi);\n                        }\n                      } else P.edgeType = \"straight\";\n                      this.findEndpoints(Xt);\n                      var qn = !c.number(P.startX) || !c.number(P.startY), co = !c.number(P.arrowStartX) || !c.number(P.arrowStartY), fo = !c.number(P.endX) || !c.number(P.endY), wi = !c.number(P.arrowEndX) || !c.number(P.arrowEndY), Oi = this.getArrowWidth(\n                        Xt.pstyle(\"width\").pfValue,\n                        Xt.pstyle(\"arrow-scale\").value\n                      ) * this.arrowShapeWidth * 3;\n                      if (P.edgeType === \"bezier\") {\n                        var Uo = o.dist(\n                          { x: P.ctrlpts[0], y: P.ctrlpts[1] },\n                          { x: P.startX, y: P.startY }\n                        ), ga = Uo < Oi, Vo = o.dist(\n                          { x: P.ctrlpts[0], y: P.ctrlpts[1] },\n                          { x: P.endX, y: P.endY }\n                        ), io = Vo < Oi, po = !1;\n                        if (qn || co || ga) {\n                          po = !0;\n                          var Hn = {\n                            x: P.ctrlpts[0] - dt.x,\n                            y: P.ctrlpts[1] - dt.y\n                          }, Ni = Math.sqrt(Hn.x * Hn.x + Hn.y * Hn.y), Mn = { x: Hn.x / Ni, y: Hn.y / Ni }, Mi = Math.max(Mt, Zt), So = {\n                            x: P.ctrlpts[0] + 2 * Mn.x * Mi,\n                            y: P.ctrlpts[1] + 2 * Mn.y * Mi\n                          }, Li = l.intersectLine(\n                            dt.x,\n                            dt.y,\n                            Mt,\n                            Zt,\n                            So.x,\n                            So.y,\n                            0\n                          );\n                          ga ? (P.ctrlpts[0] = P.ctrlpts[0] + Mn.x * (Oi - Uo), P.ctrlpts[1] = P.ctrlpts[1] + Mn.y * (Oi - Uo)) : (P.ctrlpts[0] = Li[0] + Mn.x * Oi, P.ctrlpts[1] = Li[1] + Mn.y * Oi);\n                        }\n                        if (fo || wi || io) {\n                          po = !0, Hn = {\n                            x: P.ctrlpts[0] - mt.x,\n                            y: P.ctrlpts[1] - mt.y\n                          }, Ni = Math.sqrt(Hn.x * Hn.x + Hn.y * Hn.y), Mn = { x: Hn.x / Ni, y: Hn.y / Ni }, Mi = Math.max(Mt, Zt), So = {\n                            x: P.ctrlpts[0] + 2 * Mn.x * Mi,\n                            y: P.ctrlpts[1] + 2 * Mn.y * Mi\n                          };\n                          var ki = h.intersectLine(\n                            mt.x,\n                            mt.y,\n                            Ut,\n                            ve,\n                            So.x,\n                            So.y,\n                            0\n                          );\n                          io ? (P.ctrlpts[0] = P.ctrlpts[0] + Mn.x * (Oi - Vo), P.ctrlpts[1] = P.ctrlpts[1] + Mn.y * (Oi - Vo)) : (P.ctrlpts[0] = ki[0] + Mn.x * Oi, P.ctrlpts[1] = ki[1] + Mn.y * Oi);\n                        }\n                        po && this.findEndpoints(Xt);\n                      }\n                      if (P.edgeType === \"multibezier\" || P.edgeType === \"bezier\" || P.edgeType === \"self\" || P.edgeType === \"compound\") {\n                        for (P.allpts = [], P.allpts.push(P.startX, P.startY), fn = 0; fn + 1 < P.ctrlpts.length; fn += 2)\n                          P.allpts.push(P.ctrlpts[fn], P.ctrlpts[fn + 1]), fn + 3 < P.ctrlpts.length && P.allpts.push(\n                            (P.ctrlpts[fn] + P.ctrlpts[fn + 2]) / 2,\n                            (P.ctrlpts[fn + 1] + P.ctrlpts[fn + 3]) / 2\n                          );\n                        var ji;\n                        P.allpts.push(P.endX, P.endY), P.ctrlpts.length / 2 % 2 == 0 ? (ji = P.allpts.length / 2 - 1, P.midX = P.allpts[ji], P.midY = P.allpts[ji + 1]) : (ji = P.allpts.length / 2 - 3, P.midX = o.qbezierAt(\n                          P.allpts[ji],\n                          P.allpts[ji + 2],\n                          P.allpts[ji + 4],\n                          0.5\n                        ), P.midY = o.qbezierAt(\n                          P.allpts[ji + 1],\n                          P.allpts[ji + 3],\n                          P.allpts[ji + 5],\n                          0.5\n                        ));\n                      } else if (P.edgeType === \"straight\")\n                        P.allpts = [\n                          P.startX,\n                          P.startY,\n                          P.endX,\n                          P.endY\n                        ], P.midX = (P.startX + P.endX + P.arrowStartX + P.arrowEndX) / 4, P.midY = (P.startY + P.endY + P.arrowStartY + P.arrowEndY) / 4;\n                      else if (P.edgeType === \"segments\")\n                        if (P.allpts = [], P.allpts.push(P.startX, P.startY), P.allpts.push.apply(P.allpts, P.segpts), P.allpts.push(P.endX, P.endY), P.segpts.length % 4 == 0) {\n                          var zi = P.segpts.length / 2, oo = zi - 2;\n                          P.midX = (P.segpts[oo] + P.segpts[zi]) / 2, P.midY = (P.segpts[oo + 1] + P.segpts[zi + 1]) / 2;\n                        } else\n                          oo = P.segpts.length / 2 - 1, P.midX = P.segpts[oo], P.midY = P.segpts[oo + 1];\n                      this.storeEdgeProjections(Xt), this.calculateArrowAngles(Xt);\n                    }\n                    this.recalculateEdgeLabelProjections(Xt), this.calculateLabelAngles(Xt);\n                  }\n                }\n                for (S = 0; S < s.length; S++) {\n                  var Xt, ke, $ = (ke = (Xt = s[S])._private).rscratch, P = $;\n                  if (!$.haystack) {\n                    var U = 2 * Math.random() * Math.PI;\n                    $.source = { x: Math.cos(U), y: Math.sin(U) }, U = 2 * Math.random() * Math.PI, $.target = { x: Math.cos(U), y: Math.sin(U) };\n                  }\n                  var W = ke.source, et = ke.target, dt = W.position(), mt = et.position(), Mt = W.width(), Ut = et.width(), Zt = W.height(), ve = et.height(), Ae = (Mi = Xt.pstyle(\"haystack-radius\").value) / 2;\n                  P.haystackPts = P.allpts = [\n                    P.source.x * Mt * Ae + dt.x,\n                    P.source.y * Zt * Ae + dt.y,\n                    P.target.x * Ut * Ae + mt.x,\n                    P.target.y * ve * Ae + mt.y\n                  ], P.midX = (P.allpts[0] + P.allpts[2]) / 2, P.midY = (P.allpts[1] + P.allpts[3]) / 2, $.edgeType = $.lastCurveStyle = \"haystack\", $.haystack = !0, this.storeEdgeProjections(Xt), this.calculateArrowAngles(Xt), this.recalculateEdgeLabelProjections(Xt), this.calculateLabelAngles(Xt);\n                }\n              }\n            }, a.getSegmentPoints = function(t) {\n              var r = t[0]._private.rscratch;\n              if (r.edgeType === \"segments\") return n(r.segpts);\n            }, a.getControlPoints = function(t) {\n              var r = t[0]._private.rscratch, l = r.edgeType;\n              if (l === \"bezier\" || l === \"multibezier\" || l === \"self\" || l === \"compound\")\n                return n(r.ctrlpts);\n            }, a.getEdgeMidpoint = function(t) {\n              var r = t[0]._private.rscratch;\n              return { x: r.midX, y: r.midY };\n            }, y.exports = a;\n          },\n          function(y, x, g) {\n            var o = g(2), c = g(0), a = {\n              manualEndptToPx: function(n, t) {\n                var r = n.position(), l = n.outerWidth(), h = n.outerHeight();\n                if (t.value.length === 2) {\n                  var i = [t.pfValue[0], t.pfValue[1]];\n                  return t.units[0] === \"%\" && (i[0] = i[0] * l), t.units[1] === \"%\" && (i[1] = i[1] * h), i[0] += r.x, i[1] += r.y, i;\n                }\n                var d = t.pfValue[0];\n                d = -Math.PI / 2 + d;\n                var p = 2 * Math.max(l, h), f = [r.x + Math.cos(d) * p, r.y + Math.sin(d) * p];\n                return this.nodeShapes[this.getNodeShape(n)].intersectLine(\n                  r.x,\n                  r.y,\n                  l,\n                  h,\n                  f[0],\n                  f[1],\n                  0\n                );\n              },\n              findEndpoints: function(n) {\n                var t = this, r = void 0, l = n.source()[0], h = n.target()[0], i = l.position(), d = h.position(), p = n.pstyle(\"target-arrow-shape\").value, f = n.pstyle(\"source-arrow-shape\").value, v = n.pstyle(\"target-distance-from-node\").pfValue, k = n.pstyle(\"source-distance-from-node\").pfValue, s = n._private.rscratch, S = s.edgeType, j = S === \"self\" || S === \"compound\", I = S === \"bezier\" || S === \"multibezier\" || j, R = S !== \"bezier\", M = S === \"straight\" || S === \"segments\", z = S === \"segments\", V = I || R || M, G = n.pstyle(\"source-endpoint\"), Y = j ? \"outside-to-node\" : G.value, tt = n.pstyle(\"target-endpoint\"), Z = j ? \"outside-to-node\" : tt.value;\n                s.srcManEndpt = G, s.tgtManEndpt = tt;\n                var at = void 0, nt = void 0, ht = void 0, ct = void 0;\n                if (I) {\n                  var ot = [s.ctrlpts[0], s.ctrlpts[1]];\n                  at = R ? [\n                    s.ctrlpts[s.ctrlpts.length - 2],\n                    s.ctrlpts[s.ctrlpts.length - 1]\n                  ] : ot, nt = ot;\n                } else if (M) {\n                  var gt = z ? s.segpts.slice(0, 2) : [d.x, d.y];\n                  at = z ? s.segpts.slice(s.segpts.length - 2) : [i.x, i.y], nt = gt;\n                }\n                Z === \"inside-to-node\" ? r = [d.x, d.y] : tt.units ? r = this.manualEndptToPx(h, tt) : Z === \"outside-to-line\" ? r = s.tgtIntn : (Z === \"outside-to-node\" ? ht = at : Z === \"outside-to-line\" && (ht = [i.x, i.y]), r = t.nodeShapes[this.getNodeShape(h)].intersectLine(\n                  d.x,\n                  d.y,\n                  h.outerWidth(),\n                  h.outerHeight(),\n                  ht[0],\n                  ht[1],\n                  0\n                ));\n                var xt = o.shortenIntersection(\n                  r,\n                  at,\n                  t.arrowShapes[p].spacing(n) + v\n                ), St = o.shortenIntersection(\n                  r,\n                  at,\n                  t.arrowShapes[p].gap(n) + v\n                );\n                n.hasClass(\"horizontal\") ? (s.endX = r[0] - v, s.endY = r[1], s.arrowEndX = r[0] - v / 2, s.arrowEndY = r[1]) : n.hasClass(\"vertical\") ? (s.endX = r[0], s.endY = r[1] - v, s.arrowEndX = r[0], s.arrowEndY = r[1] - v / 2) : (s.endX = St[0], s.endY = St[1], s.arrowEndX = xt[0], s.arrowEndY = xt[1]), Y === \"inside-to-node\" ? r = [i.x, i.y] : G.units ? r = this.manualEndptToPx(l, G) : Y === \"outside-to-line\" ? r = s.srcIntn : (Y === \"outside-to-node\" ? ct = nt : Y === \"outside-to-line\" && (ct = [d.x, d.y]), r = t.nodeShapes[this.getNodeShape(l)].intersectLine(\n                  i.x,\n                  i.y,\n                  l.outerWidth(),\n                  l.outerHeight(),\n                  ct[0],\n                  ct[1],\n                  0\n                ));\n                var zt = o.shortenIntersection(\n                  r,\n                  nt,\n                  t.arrowShapes[f].spacing(n) + k\n                ), Nt = o.shortenIntersection(\n                  r,\n                  nt,\n                  t.arrowShapes[f].gap(n) + k\n                );\n                s.startX = Nt[0], s.startY = Nt[1], s.arrowStartX = zt[0], s.arrowStartY = zt[1], V && (c.number(s.startX) && c.number(s.startY) && c.number(s.endX) && c.number(s.endY) ? s.badLine = !1 : s.badLine = !0);\n              },\n              getSourceEndpoint: function(n) {\n                var t = n[0]._private.rscratch;\n                switch (t.edgeType) {\n                  case \"haystack\":\n                    return { x: t.haystackPts[0], y: t.haystackPts[1] };\n                  default:\n                    return { x: t.arrowStartX, y: t.arrowStartY };\n                }\n              },\n              getTargetEndpoint: function(n) {\n                var t = n[0]._private.rscratch;\n                switch (t.edgeType) {\n                  case \"haystack\":\n                    return { x: t.haystackPts[2], y: t.haystackPts[3] };\n                  default:\n                    return { x: t.arrowEndX, y: t.arrowEndY };\n                }\n              }\n            };\n            y.exports = a;\n          },\n          function(y, x, g) {\n            var o = g(2), c = {};\n            function a(n, t, r) {\n              for (var l = function(p, f, v, k) {\n                return o.qbezierAt(p, f, v, k);\n              }, h = t._private.rstyle.bezierPts, i = 0; i < n.bezierProjPcts.length; i++) {\n                var d = n.bezierProjPcts[i];\n                h.push({\n                  x: l(r[0], r[2], r[4], d),\n                  y: l(r[1], r[3], r[5], d)\n                });\n              }\n            }\n            c.storeEdgeProjections = function(n) {\n              var t = n._private, r = t.rscratch, l = r.edgeType;\n              if (t.rstyle.bezierPts = null, t.rstyle.linePts = null, t.rstyle.haystackPts = null, l === \"multibezier\" || l === \"bezier\" || l === \"self\" || l === \"compound\") {\n                t.rstyle.bezierPts = [];\n                for (var h = 0; h + 5 < r.allpts.length; h += 4)\n                  a(this, n, r.allpts.slice(h, h + 6));\n              } else if (l === \"segments\") {\n                var i = t.rstyle.linePts = [];\n                for (h = 0; h + 1 < r.allpts.length; h += 2)\n                  i.push({ x: r.allpts[h], y: r.allpts[h + 1] });\n              } else if (l === \"haystack\") {\n                var d = r.haystackPts;\n                t.rstyle.haystackPts = [\n                  { x: d[0], y: d[1] },\n                  { x: d[2], y: d[3] }\n                ];\n              }\n              t.rstyle.arrowWidth = this.getArrowWidth(\n                n.pstyle(\"width\").pfValue,\n                n.pstyle(\"arrow-scale\").value\n              ) * this.arrowShapeWidth;\n            }, c.recalculateEdgeProjections = function(n) {\n              this.findEdgeControlPoints(n);\n            }, y.exports = c;\n          },\n          function(y, x, g) {\n            var o = g(2), c = g(0), a = g(1), n = {\n              recalculateNodeLabelProjection: function(t) {\n                var r = t.pstyle(\"label\").strValue;\n                if (!c.emptyString(r)) {\n                  var l, h, i = t._private, d = t.width(), p = t.height(), f = t.padding(), v = t.position(), k = t.pstyle(\"text-halign\").strValue, s = t.pstyle(\"text-valign\").strValue, S = i.rscratch, j = i.rstyle;\n                  switch (k) {\n                    case \"left\":\n                      l = v.x - d / 2 - f;\n                      break;\n                    case \"right\":\n                      l = v.x + d / 2 + f;\n                      break;\n                    default:\n                      l = v.x;\n                  }\n                  switch (s) {\n                    case \"top\":\n                      h = v.y - p / 2 - f;\n                      break;\n                    case \"bottom\":\n                      h = v.y + p / 2 + f;\n                      break;\n                    default:\n                      h = v.y;\n                  }\n                  S.labelX = l, S.labelY = h, j.labelX = l, j.labelY = h, this.applyLabelDimensions(t);\n                }\n              },\n              recalculateEdgeLabelProjections: function(t) {\n                var r, l = t._private, h = l.rscratch, i = this, d = {\n                  mid: t.pstyle(\"label\").strValue,\n                  source: t.pstyle(\"source-label\").strValue,\n                  target: t.pstyle(\"target-label\").strValue\n                };\n                if (d.mid || d.source || d.target) {\n                  r = { x: h.midX, y: h.midY };\n                  var p = function(v, k, s) {\n                    a.setPrefixedProperty(l.rscratch, v, k, s), a.setPrefixedProperty(l.rstyle, v, k, s);\n                  };\n                  p(\"labelX\", null, r.x), p(\"labelY\", null, r.y);\n                  var f = function(v) {\n                    var k, s = v === \"source\";\n                    if (d[v]) {\n                      var S = t.pstyle(v + \"-text-offset\").pfValue, j = function(Nt, re) {\n                        var be = re.x - Nt.x, ne = re.y - Nt.y;\n                        return Math.atan(ne / be);\n                      };\n                      switch (h.edgeType) {\n                        case \"self\":\n                        case \"compound\":\n                        case \"bezier\":\n                        case \"multibezier\":\n                          for (var I, R = function Nt() {\n                            if (Nt.cache) return Nt.cache;\n                            for (var re = [], be = 0; be + 5 < h.allpts.length; be += 4) {\n                              var ne = {\n                                x: h.allpts[be],\n                                y: h.allpts[be + 1]\n                              }, ce = {\n                                x: h.allpts[be + 2],\n                                y: h.allpts[be + 3]\n                              }, xe = {\n                                x: h.allpts[be + 4],\n                                y: h.allpts[be + 5]\n                              };\n                              re.push({\n                                p0: ne,\n                                p1: ce,\n                                p2: xe,\n                                startDist: 0,\n                                length: 0,\n                                segments: []\n                              });\n                            }\n                            var we = l.rstyle.bezierPts, ae = i.bezierProjPcts.length;\n                            function Le(yt, ft, Rt, Wt, le) {\n                              var ye = o.dist(ft, Rt), pe = yt.segments[yt.segments.length - 1], je = {\n                                p0: ft,\n                                p1: Rt,\n                                t0: Wt,\n                                t1: le,\n                                startDist: pe ? pe.startDist + pe.length : 0,\n                                length: ye\n                              };\n                              yt.segments.push(je), yt.length += ye;\n                            }\n                            for (be = 0; be < re.length; be++) {\n                              var lt = re[be], kt = re[be - 1];\n                              kt && (lt.startDist = kt.startDist + kt.length), Le(\n                                lt,\n                                lt.p0,\n                                we[be * ae],\n                                0,\n                                i.bezierProjPcts[0]\n                              );\n                              for (var Dt = 0; Dt < ae - 1; Dt++)\n                                Le(\n                                  lt,\n                                  we[be * ae + Dt],\n                                  we[be * ae + Dt + 1],\n                                  i.bezierProjPcts[Dt],\n                                  i.bezierProjPcts[Dt + 1]\n                                );\n                              Le(\n                                lt,\n                                we[be * ae + ae - 1],\n                                lt.p2,\n                                i.bezierProjPcts[ae - 1],\n                                1\n                              );\n                            }\n                            return Nt.cache = re;\n                          }(), M = 0, z = 0, V = 0; V < R.length; V++) {\n                            for (var G = R[s ? V : R.length - 1 - V], Y = 0; Y < G.segments.length; Y++) {\n                              var tt = G.segments[s ? Y : G.segments.length - 1 - Y], Z = V === R.length - 1 && Y === G.segments.length - 1;\n                              if (M = z, (z += tt.length) >= S || Z) {\n                                I = { cp: G, segment: tt };\n                                break;\n                              }\n                            }\n                            if (I) break;\n                          }\n                          G = I.cp;\n                          var at = (S - M) / (tt = I.segment).length, nt = tt.t1 - tt.t0, ht = s ? tt.t0 + nt * at : tt.t1 - nt * at;\n                          ht = o.bound(0, ht, 1), r = o.qbezierPtAt(G.p0, G.p1, G.p2, ht), k = function(Nt, re, be, ne) {\n                            var ce = o.bound(0, ne - 1e-3, 1), xe = o.bound(0, ne + 1e-3, 1), we = o.qbezierPtAt(Nt, re, be, ce), ae = o.qbezierPtAt(Nt, re, be, xe);\n                            return j(we, ae);\n                          }(G.p0, G.p1, G.p2, ht);\n                          break;\n                        case \"straight\":\n                        case \"segments\":\n                        case \"haystack\":\n                          var ct, ot, gt, xt, St = 0, zt = h.allpts.length;\n                          for (V = 0; V + 3 < zt && (s ? (gt = {\n                            x: h.allpts[V],\n                            y: h.allpts[V + 1]\n                          }, xt = {\n                            x: h.allpts[V + 2],\n                            y: h.allpts[V + 3]\n                          }) : (gt = {\n                            x: h.allpts[zt - 2 - V],\n                            y: h.allpts[zt - 1 - V]\n                          }, xt = {\n                            x: h.allpts[zt - 4 - V],\n                            y: h.allpts[zt - 3 - V]\n                          }), ot = St, !((St += ct = o.dist(gt, xt)) >= S)); V += 2) ;\n                          ht = (S - ot) / ct, ht = o.bound(0, ht, 1), r = o.lineAt(gt, xt, ht), k = j(gt, xt);\n                      }\n                      p(\"labelX\", v, r.x), p(\"labelY\", v, r.y), p(\"labelAutoAngle\", v, k);\n                    }\n                  };\n                  f(\"source\"), f(\"target\"), this.applyLabelDimensions(t);\n                }\n              },\n              applyLabelDimensions: function(t) {\n                this.applyPrefixedLabelDimensions(t), t.isEdge() && (this.applyPrefixedLabelDimensions(t, \"source\"), this.applyPrefixedLabelDimensions(t, \"target\"));\n              },\n              applyPrefixedLabelDimensions: function(t, r) {\n                var l = t._private, h = this.getLabelText(t, r), i = this.calculateLabelDimensions(t, h);\n                a.setPrefixedProperty(l.rstyle, \"labelWidth\", r, i.width), a.setPrefixedProperty(\n                  l.rscratch,\n                  \"labelWidth\",\n                  r,\n                  i.width\n                ), a.setPrefixedProperty(\n                  l.rstyle,\n                  \"labelHeight\",\n                  r,\n                  i.height\n                ), a.setPrefixedProperty(\n                  l.rscratch,\n                  \"labelHeight\",\n                  r,\n                  i.height\n                );\n              },\n              getLabelText: function(t, r) {\n                var l = t._private, h = r ? r + \"-\" : \"\", i = t.pstyle(h + \"label\").strValue, d = t.pstyle(\"text-transform\").value, p = function(at, nt) {\n                  return nt ? (a.setPrefixedProperty(l.rscratch, at, r, nt), nt) : a.getPrefixedProperty(l.rscratch, at, r);\n                };\n                d == \"none\" || (d == \"uppercase\" ? i = i.toUpperCase() : d == \"lowercase\" && (i = i.toLowerCase()));\n                var f = t.pstyle(\"text-wrap\").value;\n                if (f === \"wrap\") {\n                  var v = p(\"labelKey\");\n                  if (v && p(\"labelWrapKey\") === v)\n                    return p(\"labelWrapCachedText\");\n                  for (var k = i.split(`\n`), s = t.pstyle(\"text-max-width\").pfValue, S = [], j = 0; j < k.length; j++) {\n                    var I = k[j];\n                    if (this.calculateLabelDimensions(t, I, \"line=\" + I).width > s) {\n                      for (var R = I.split(/\\s+/), M = \"\", z = 0; z < R.length; z++) {\n                        var V = R[z], G = M.length === 0 ? V : M + \" \" + V;\n                        this.calculateLabelDimensions(t, G, \"testLine=\" + G).width <= s ? M += V + \" \" : (S.push(M), M = V + \" \");\n                      }\n                      M.match(/^\\s+$/) || S.push(M);\n                    } else S.push(I);\n                  }\n                  p(\"labelWrapCachedLines\", S), i = p(\"labelWrapCachedText\", S.join(`\n`)), p(\"labelWrapKey\", v);\n                } else if (f === \"ellipsis\") {\n                  s = t.pstyle(\"text-max-width\").pfValue;\n                  for (var Y = \"\", tt = !1, Z = 0; Z < i.length && !(this.calculateLabelDimensions(t, Y + i[Z] + \"…\").width > s); Z++)\n                    Y += i[Z], Z === i.length - 1 && (tt = !0);\n                  return tt || (Y += \"…\"), Y;\n                }\n                return i;\n              },\n              calculateLabelDimensions: function(t, r, l) {\n                var h = t._private.labelStyleKey + \"$@$\" + r;\n                l && (h += \"$@$\" + l);\n                var i = this.labelDimCache || (this.labelDimCache = {});\n                if (i[h]) return i[h];\n                var d = t.pstyle(\"font-style\").strValue, p = 1 * t.pstyle(\"font-size\").pfValue + \"px\", f = t.pstyle(\"font-family\").strValue, v = t.pstyle(\"font-weight\").strValue, k = this.labelCalcDiv;\n                k || (k = this.labelCalcDiv = document.createElement(\"div\"), document.body.appendChild(k));\n                var s = k.style;\n                return s.fontFamily = f, s.fontStyle = d, s.fontSize = p, s.fontWeight = v, s.position = \"absolute\", s.left = \"-9999px\", s.top = \"-9999px\", s.zIndex = \"-1\", s.visibility = \"hidden\", s.pointerEvents = \"none\", s.padding = \"0\", s.lineHeight = \"1\", t.pstyle(\"text-wrap\").value === \"wrap\" ? s.whiteSpace = \"pre\" : s.whiteSpace = \"normal\", k.textContent = r, i[h] = {\n                  width: Math.ceil(k.clientWidth / 1),\n                  height: Math.ceil(k.clientHeight / 1)\n                }, i[h];\n              },\n              calculateLabelAngles: function(t) {\n                var r = t._private.rscratch, l = t.isEdge(), h = t.pstyle(\"text-rotation\"), i = h.strValue;\n                i === \"none\" ? r.labelAngle = r.sourceLabelAngle = r.targetLabelAngle = 0 : l && i === \"autorotate\" ? (r.labelAngle = Math.atan(r.midDispY / r.midDispX), r.sourceLabelAngle = r.sourceLabelAutoAngle, r.targetLabelAngle = r.targetLabelAutoAngle) : r.labelAngle = r.sourceLabelAngle = r.targetLabelAngle = i === \"autorotate\" ? 0 : h.pfValue;\n              }\n            };\n            y.exports = n;\n          },\n          function(y, x, g) {\n            var o = {\n              getNodeShape: function(c) {\n                var a = c.pstyle(\"shape\").value;\n                if (c.isParent())\n                  return a === \"rectangle\" || a === \"roundrectangle\" || a === \"cutrectangle\" || a === \"barrel\" ? a : \"rectangle\";\n                if (a === \"polygon\") {\n                  var n = c.pstyle(\"shape-polygon-points\").value;\n                  return this.nodeShapes.makePolygon(n).name;\n                }\n                return a;\n              }\n            };\n            y.exports = o;\n          },\n          function(y, x, g) {\n            var o = {\n              registerCalculationListeners: function() {\n                var c = this.cy, a = c.collection(), n = this, t = function(r, l) {\n                  var h = !(arguments.length > 2 && arguments[2] !== void 0) || arguments[2];\n                  a.merge(r);\n                  for (var i = 0; i < r.length; i++) {\n                    var d = r[i], p = d._private, f = p.rstyle;\n                    h && (f.clean = !1, p.bbCache = null);\n                    var v = f.dirtyEvents = f.dirtyEvents || {\n                      length: 0\n                    };\n                    v[l.type] || (v[l.type] = !0, v.length++);\n                  }\n                };\n                n.binder(c).on(\n                  \"position.* style.* free.* bounds.*\",\n                  \"node\",\n                  function(r) {\n                    var l = r.target;\n                    t(l, r), t(l.connectedEdges(), r);\n                  }\n                ).on(\"add.*\", \"node\", function(r) {\n                  var l = r.target;\n                  t(l, r);\n                }).on(\"background.*\", \"node\", function(r) {\n                  var l = r.target;\n                  t(l, r, !1);\n                }).on(\"add.* style.*\", \"edge\", function(r) {\n                  var l = r.target;\n                  t(l, r), t(l.parallelEdges(), r);\n                }).on(\"remove.*\", \"edge\", function(r) {\n                  for (var l = r.target.parallelEdges(), h = 0; h < l.length; h++) {\n                    var i = l[h];\n                    i.removed() || t(i, r);\n                  }\n                }).on(\"dirty.*\", \"node\", function(r) {\n                  var l = r.target;\n                  t(l, r);\n                }), n.beforeRender(function(r) {\n                  if (r) {\n                    var l = n.onUpdateEleCalcsFns;\n                    if (l)\n                      for (var h = 0; h < l.length; h++) (0, l[h])(r, a);\n                    for (n.recalculateRenderedStyle(a, !1), h = 0; h < a.length; h++)\n                      a[h]._private.rstyle.dirtyEvents = null;\n                    a = c.collection();\n                  }\n                }, n.beforeRenderPriorities.eleCalcs);\n              },\n              onUpdateEleCalcs: function(c) {\n                (this.onUpdateEleCalcsFns = this.onUpdateEleCalcsFns || []).push(c);\n              },\n              recalculateRenderedStyle: function(c, a) {\n                var n = [], t = [];\n                if (!this.destroyed) {\n                  a === void 0 && (a = !0);\n                  for (var r = 0; r < c.length; r++) {\n                    var l = (d = (i = c[r])._private).rstyle;\n                    a && l.clean || i.removed() || i.pstyle(\"display\").value !== \"none\" && (d.group === \"nodes\" ? t.push(i) : n.push(i), l.clean = !0);\n                  }\n                  for (r = 0; r < t.length; r++) {\n                    l = (d = (i = t[r])._private).rstyle;\n                    var h = i.position();\n                    this.recalculateNodeLabelProjection(i), l.nodeX = h.x, l.nodeY = h.y, l.nodeW = i.pstyle(\"width\").pfValue, l.nodeH = i.pstyle(\"height\").pfValue;\n                  }\n                  for (this.recalculateEdgeProjections(n), r = 0; r < n.length; r++) {\n                    l = (d = (i = n[r])._private).rstyle;\n                    var i, d, p = d.rscratch;\n                    this.recalculateEdgeLabelProjections(i), l.srcX = p.arrowStartX, l.srcY = p.arrowStartY, l.tgtX = p.arrowEndX, l.tgtY = p.arrowEndY, l.midX = p.midX, l.midY = p.midY, l.labelAngle = p.labelAngle, l.sourceLabelAngle = p.sourceLabelAngle, l.targetLabelAngle = p.targetLabelAngle;\n                  }\n                }\n              }\n            };\n            y.exports = o;\n          },\n          function(y, x, g) {\n            var o = g(17), c = {\n              updateCachedGrabbedEles: function() {\n                var a = this.cachedZSortedEles;\n                if (a) {\n                  a.drag = [], a.nondrag = [];\n                  for (var n = [], t = 0; t < a.length; t++) {\n                    var r = (l = a[t])._private.rscratch;\n                    l.grabbed() && !l.isParent() ? n.push(l) : r.inDragLayer ? a.drag.push(l) : a.nondrag.push(l);\n                  }\n                  for (t = 0; t < n.length; t++) {\n                    var l = n[t];\n                    a.drag.push(l);\n                  }\n                }\n              },\n              invalidateCachedZSortedEles: function() {\n                this.cachedZSortedEles = null;\n              },\n              getCachedZSortedEles: function(a) {\n                if (a || !this.cachedZSortedEles) {\n                  var n = this.cy.mutableElements().toArray();\n                  n.sort(o), n.interactive = n.filter(function(t) {\n                    return t.interactive();\n                  }), this.cachedZSortedEles = n, this.updateCachedGrabbedEles();\n                } else n = this.cachedZSortedEles;\n                return n;\n              }\n            };\n            y.exports = c;\n          },\n          function(y, x, g) {\n            var o = {\n              getCachedImage: function(c, a, n) {\n                var t = this.imageCache = this.imageCache || {}, r = t[c];\n                if (r)\n                  return r.image.complete || r.image.addEventListener(\"load\", n), r.image;\n                var l = (r = t[c] = t[c] || {}).image = new Image();\n                return l.addEventListener(\"load\", n), l.addEventListener(\"error\", function() {\n                  l.error = !0;\n                }), c.substring(0, 5).toLowerCase() === \"data:\" || (l.crossOrigin = a), l.src = c, l;\n              }\n            };\n            y.exports = o;\n          },\n          function(y, x, g) {\n            var o = g(0), c = g(1), a = g(2), n = (g(16), {\n              registerBinding: function(t, r, l, h) {\n                var i = Array.prototype.slice.apply(arguments, [1]), d = this.binder(t);\n                return d.on.apply(d, i);\n              },\n              binder: function(t) {\n                var r = this, l = t === window || t === document || t === document.body || o.domElement(t);\n                if (r.supportsPassiveEvents == null) {\n                  var h = !1;\n                  try {\n                    var i = Object.defineProperty({}, \"passive\", {\n                      get: function() {\n                        h = !0;\n                      }\n                    });\n                    window.addEventListener(\"test\", null, i);\n                  } catch {\n                  }\n                  r.supportsPassiveEvents = h;\n                }\n                var d = function(p, f, v) {\n                  var k = Array.prototype.slice.call(arguments);\n                  return l && r.supportsPassiveEvents && (k[2] = {\n                    capture: v != null && v,\n                    passive: !1,\n                    once: !1\n                  }), r.bindings.push({ target: t, args: k }), (t.addEventListener || t.on).apply(t, k), this;\n                };\n                return {\n                  on: d,\n                  addEventListener: d,\n                  addListener: d,\n                  bind: d\n                };\n              },\n              nodeIsDraggable: function(t) {\n                return t && t.isNode() && !t.locked() && t.grabbable();\n              },\n              nodeIsGrabbable: function(t) {\n                return this.nodeIsDraggable(t) && t.interactive();\n              }\n            });\n            n.load = function() {\n              var t = this, r = function(lt, kt, Dt, yt) {\n                lt == null && (lt = t.cy);\n                for (var ft = 0; ft < kt.length; ft++) {\n                  var Rt = kt[ft];\n                  lt.emit(c.extend({ originalEvent: Dt, type: Rt }, yt));\n                }\n              }, l = function(lt) {\n                return lt.shiftKey || lt.metaKey || lt.ctrlKey;\n              }, h = function(lt, kt) {\n                var Dt = !0;\n                if (t.cy.hasCompoundNodes() && lt && lt.isEdge()) {\n                  for (var yt = 0; kt && yt < kt.length; yt++)\n                    if ((lt = kt[yt]).isNode() && lt.isParent()) {\n                      Dt = !1;\n                      break;\n                    }\n                } else Dt = !0;\n                return Dt;\n              }, i = function(lt) {\n                lt[0]._private.rscratch.inDragLayer = !0;\n              }, d = function(lt) {\n                lt[0]._private.rscratch.isGrabTarget = !0;\n              }, p = function(lt, kt) {\n                var Dt = function(yt) {\n                  var ft;\n                  if (yt.addToList && t.cy.hasCompoundNodes()) {\n                    if (!yt.addToList.hasId) {\n                      yt.addToList.hasId = {};\n                      for (var Rt = 0; Rt < yt.addToList.length; Rt++) {\n                        var Wt = yt.addToList[Rt];\n                        yt.addToList.hasId[Wt.id()] = !0;\n                      }\n                    }\n                    ft = yt.addToList.hasId;\n                  }\n                  return ft || {};\n                }(kt);\n                Dt[lt.id()] || (kt.addToList.push(lt), Dt[lt.id()] = !0, function(yt) {\n                  yt[0]._private.grabbed = !0;\n                }(lt));\n              }, f = function(lt, kt) {\n                kt = kt || {};\n                var Dt = lt.cy().hasCompoundNodes();\n                kt.inDragLayer && (lt.forEach(i), lt.neighborhood().stdFilter(function(yt) {\n                  return !Dt || yt.isEdge();\n                }).forEach(i)), kt.addToList && lt.forEach(function(yt) {\n                  p(yt, kt);\n                }), function(yt, ft) {\n                  if (yt.cy().hasCompoundNodes() && (ft.inDragLayer != null || ft.addToList != null)) {\n                    var Rt = yt.descendants();\n                    ft.inDragLayer && (Rt.forEach(i), Rt.connectedEdges().forEach(i)), ft.addToList && Rt.forEach(function(Wt) {\n                      p(Wt, ft);\n                    });\n                  }\n                }(lt, kt), s(lt, { inDragLayer: kt.inDragLayer }), t.updateCachedGrabbedEles();\n              }, v = f, k = function(lt) {\n                lt && (lt.hasId = {}, t.getCachedZSortedEles().forEach(function(kt) {\n                  (function(Dt) {\n                    Dt[0]._private.grabbed = !1;\n                  })(kt), function(Dt) {\n                    Dt[0]._private.rscratch.inDragLayer = !1;\n                  }(kt), function(Dt) {\n                    Dt[0]._private.rscratch.isGrabTarget = !1;\n                  }(kt);\n                }), t.updateCachedGrabbedEles());\n              }, s = function(lt, kt) {\n                if ((kt.inDragLayer != null || kt.addToList != null) && lt.cy().hasCompoundNodes()) {\n                  var Dt = lt.ancestors().orphans();\n                  if (!Dt.same(lt)) {\n                    var yt = Dt.descendants().spawnSelf().merge(Dt).unmerge(lt).unmerge(lt.descendants()), ft = yt.connectedEdges();\n                    kt.inDragLayer && (ft.forEach(i), yt.forEach(i)), kt.addToList && yt.forEach(function(Rt) {\n                      p(Rt, kt);\n                    });\n                  }\n                }\n              }, S = typeof MutationObserver < \"u\";\n              S ? (t.removeObserver = new MutationObserver(function(lt) {\n                for (var kt = 0; kt < lt.length; kt++) {\n                  var Dt = lt[kt].removedNodes;\n                  if (Dt) {\n                    for (var yt = 0; yt < Dt.length; yt++)\n                      if (Dt[yt] === t.container) {\n                        t.destroy();\n                        break;\n                      }\n                  }\n                }\n              }), t.container.parentNode && t.removeObserver.observe(t.container.parentNode, {\n                childList: !0\n              })) : t.registerBinding(\n                t.container,\n                \"DOMNodeRemoved\",\n                function(lt) {\n                  t.destroy();\n                }\n              );\n              var j = c.debounce(function() {\n                t.cy.resize();\n              }, 100);\n              S && (t.styleObserver = new MutationObserver(j), t.styleObserver.observe(t.container, { attributes: !0 })), t.registerBinding(window, \"resize\", j);\n              var I = function() {\n                t.invalidateContainerClientCoordsCache();\n              };\n              (function(lt, kt) {\n                for (; lt != null; ) kt(lt), lt = lt.parentNode;\n              })(t.container, function(lt) {\n                t.registerBinding(lt, \"transitionend\", I), t.registerBinding(lt, \"animationend\", I), t.registerBinding(lt, \"scroll\", I);\n              }), t.registerBinding(t.container, \"contextmenu\", function(lt) {\n                lt.preventDefault();\n              });\n              var R, M, z, V, G, Y, tt, Z, at, nt, ht, ct, ot, gt = function(lt) {\n                for (var kt = t.findContainerClientCoords(), Dt = kt[0], yt = kt[1], ft = kt[2], Rt = kt[3], Wt = lt.touches ? lt.touches : [lt], le = !1, ye = 0; ye < Wt.length; ye++) {\n                  var pe = Wt[ye];\n                  if (Dt <= pe.clientX && pe.clientX <= Dt + ft && yt <= pe.clientY && pe.clientY <= yt + Rt) {\n                    le = !0;\n                    break;\n                  }\n                }\n                if (!le) return !1;\n                for (var je = t.container, Me = lt.target.parentNode, Ze = !1; Me; ) {\n                  if (Me === je) {\n                    Ze = !0;\n                    break;\n                  }\n                  Me = Me.parentNode;\n                }\n                return !!Ze;\n              };\n              t.registerBinding(\n                t.container,\n                \"mousedown\",\n                function(lt) {\n                  if (gt(lt)) {\n                    lt.preventDefault(), t.hoverData.capture = !0, t.hoverData.which = lt.which;\n                    var kt = t.cy, Dt = [lt.clientX, lt.clientY], yt = t.projectIntoViewport(Dt[0], Dt[1]), ft = t.selection, Rt = t.findNearestElements(yt[0], yt[1], !0, !1), Wt = Rt[0], le = t.dragData.possibleDragElements;\n                    if (t.hoverData.mdownPos = yt, t.hoverData.mdownGPos = Dt, lt.which == 3) {\n                      t.hoverData.cxtStarted = !0;\n                      var ye = {\n                        originalEvent: lt,\n                        type: \"cxttapstart\",\n                        position: { x: yt[0], y: yt[1] }\n                      };\n                      Wt ? (Wt.activate(), Wt.emit(ye), t.hoverData.down = Wt) : kt.emit(ye), t.hoverData.downTime = (/* @__PURE__ */ new Date()).getTime(), t.hoverData.cxtDragged = !1;\n                    } else if (lt.which == 1) {\n                      if (Wt && Wt.activate(), Wt != null && t.nodeIsGrabbable(Wt)) {\n                        var pe = function(Me) {\n                          return {\n                            originalEvent: lt,\n                            type: Me,\n                            position: { x: yt[0], y: yt[1] }\n                          };\n                        };\n                        if (d(Wt), Wt.selected()) {\n                          le = t.dragData.possibleDragElements = [];\n                          var je = kt.$(function(Me) {\n                            return Me.isNode() && Me.selected() && t.nodeIsGrabbable(Me);\n                          });\n                          f(je, { addToList: le }), Wt.emit(pe(\"grabon\")), je.forEach(function(Me) {\n                            Me.emit(pe(\"grab\"));\n                          });\n                        } else\n                          le = t.dragData.possibleDragElements = [], v(Wt, { addToList: le }), Wt.emit(pe(\"grabon\")).emit(pe(\"grab\"));\n                        t.redrawHint(\"eles\", !0), t.redrawHint(\"drag\", !0);\n                      }\n                      t.hoverData.down = Wt, t.hoverData.downs = Rt, t.hoverData.downTime = (/* @__PURE__ */ new Date()).getTime(), r(Wt, [\"mousedown\", \"tapstart\", \"vmousedown\"], lt, {\n                        position: { x: yt[0], y: yt[1] }\n                      }), Wt == null ? (ft[4] = 1, t.data.bgActivePosistion = { x: yt[0], y: yt[1] }, t.redrawHint(\"select\", !0), t.redraw()) : Wt.isEdge() && (ft[4] = 1), t.hoverData.tapholdCancelled = !1, clearTimeout(t.hoverData.tapholdTimeout), t.hoverData.tapholdTimeout = setTimeout(function() {\n                        if (!t.hoverData.tapholdCancelled) {\n                          var Me = t.hoverData.down;\n                          Me ? Me.emit({\n                            originalEvent: lt,\n                            type: \"taphold\",\n                            position: { x: yt[0], y: yt[1] }\n                          }) : kt.emit({\n                            originalEvent: lt,\n                            type: \"taphold\",\n                            position: { x: yt[0], y: yt[1] }\n                          });\n                        }\n                      }, t.tapholdDuration);\n                    }\n                    ft[0] = ft[2] = yt[0], ft[1] = ft[3] = yt[1];\n                  }\n                },\n                !1\n              ), t.registerBinding(\n                window,\n                \"mousemove\",\n                function(lt) {\n                  if (t.hoverData.capture || gt(lt)) {\n                    var kt = !1, Dt = t.cy, yt = Dt.zoom(), ft = [lt.clientX, lt.clientY], Rt = t.projectIntoViewport(ft[0], ft[1]), Wt = t.hoverData.mdownPos, le = t.hoverData.mdownGPos, ye = t.selection, pe = null;\n                    t.hoverData.draggingEles || t.hoverData.dragging || t.hoverData.selecting || (pe = t.findNearestElement(Rt[0], Rt[1], !0, !1));\n                    var je, Me = t.hoverData.last, Ze = t.hoverData.down, ir = [Rt[0] - ye[2], Rt[1] - ye[3]], Ar = t.dragData.possibleDragElements;\n                    if (le) {\n                      var rr = ft[0] - le[0], zr = rr * rr, ln = ft[1] - le[1], mn = zr + ln * ln;\n                      t.hoverData.isOverThresholdDrag = je = mn >= t.desktopTapThreshold2;\n                    }\n                    var un = l(lt);\n                    je && (t.hoverData.tapholdCancelled = !0), kt = !0, r(pe, [\"mousemove\", \"vmousemove\", \"tapdrag\"], lt, {\n                      position: { x: Rt[0], y: Rt[1] }\n                    });\n                    var Kr = function() {\n                      t.data.bgActivePosistion = void 0, t.hoverData.selecting || Dt.emit(\"boxstart\"), ye[4] = 1, t.hoverData.selecting = !0, t.redrawHint(\"select\", !0), t.redraw();\n                    };\n                    if (t.hoverData.which === 3) {\n                      if (je) {\n                        var yn = {\n                          originalEvent: lt,\n                          type: \"cxtdrag\",\n                          position: { x: Rt[0], y: Rt[1] }\n                        };\n                        Ze ? Ze.emit(yn) : Dt.emit(yn), t.hoverData.cxtDragged = !0, t.hoverData.cxtOver && pe === t.hoverData.cxtOver || (t.hoverData.cxtOver && t.hoverData.cxtOver.emit({\n                          originalEvent: lt,\n                          type: \"cxtdragout\",\n                          position: { x: Rt[0], y: Rt[1] }\n                        }), t.hoverData.cxtOver = pe, pe && pe.emit({\n                          originalEvent: lt,\n                          type: \"cxtdragover\",\n                          position: { x: Rt[0], y: Rt[1] }\n                        }));\n                      }\n                    } else if (t.hoverData.dragging) {\n                      if (kt = !0, Dt.panningEnabled() && Dt.userPanningEnabled()) {\n                        var nn;\n                        if (t.hoverData.justStartedPan) {\n                          var Ei = t.hoverData.mdownPos;\n                          nn = {\n                            x: (Rt[0] - Ei[0]) * yt,\n                            y: (Rt[1] - Ei[1]) * yt\n                          }, t.hoverData.justStartedPan = !1;\n                        } else nn = { x: ir[0] * yt, y: ir[1] * yt };\n                        Dt.panBy(nn), t.hoverData.dragged = !0;\n                      }\n                      Rt = t.projectIntoViewport(lt.clientX, lt.clientY);\n                    } else if (ye[4] != 1 || Ze != null && !Ze.isEdge()) {\n                      if (Ze && Ze.isEdge() && Ze.active() && Ze.unactivate(), Ze && Ze.grabbed() || pe == Me || (Me && r(Me, [\"mouseout\", \"tapdragout\"], lt, {\n                        position: { x: Rt[0], y: Rt[1] }\n                      }), pe && r(pe, [\"mouseover\", \"tapdragover\"], lt, {\n                        position: { x: Rt[0], y: Rt[1] }\n                      }), t.hoverData.last = pe), Ze)\n                        if (je) {\n                          if (Dt.boxSelectionEnabled() && un)\n                            Ze && Ze.grabbed() && (k(Ar), Ze.emit(\"free\")), Kr();\n                          else if (Ze && Ze.grabbed() && t.nodeIsDraggable(Ze)) {\n                            var ri = !t.dragData.didDrag;\n                            ri && t.redrawHint(\"eles\", !0), t.dragData.didDrag = !0;\n                            var Yn = [];\n                            t.hoverData.draggingEles || f(Dt.collection(Ar), { inDragLayer: !0 });\n                            for (var tn = 0; tn < Ar.length; tn++) {\n                              var xn = Ar[tn];\n                              if (t.nodeIsDraggable(xn) && xn.grabbed()) {\n                                var Tn = xn.position();\n                                if (Yn.push(xn), o.number(ir[0]) && o.number(ir[1]) && (Tn.x += ir[0], Tn.y += ir[1], ri)) {\n                                  var Kn = t.hoverData.dragDelta;\n                                  Kn && o.number(Kn[0]) && o.number(Kn[1]) && (Tn.x += Kn[0], Tn.y += Kn[1]);\n                                }\n                              }\n                            }\n                            t.hoverData.draggingEles = !0;\n                            var ar = Dt.collection(Yn);\n                            ar.dirtyCompoundBoundsCache(), ar.emit(\"position drag\"), t.redrawHint(\"drag\", !0), t.redraw();\n                          }\n                        } else\n                          (function() {\n                            var Yr = t.hoverData.dragDelta = t.hoverData.dragDelta || [];\n                            Yr.length === 0 ? (Yr.push(ir[0]), Yr.push(ir[1])) : (Yr[0] += ir[0], Yr[1] += ir[1]);\n                          })();\n                      kt = !0;\n                    } else\n                      je && (t.hoverData.dragging || !Dt.boxSelectionEnabled() || !un && Dt.panningEnabled() && Dt.userPanningEnabled() ? !t.hoverData.selecting && Dt.panningEnabled() && Dt.userPanningEnabled() && h(Ze, t.hoverData.downs) && (t.hoverData.dragging = !0, t.hoverData.justStartedPan = !0, ye[4] = 0, t.data.bgActivePosistion = a.array2point(Wt), t.redrawHint(\"select\", !0), t.redraw()) : Kr(), Ze && Ze.isEdge() && Ze.active() && Ze.unactivate());\n                    return ye[2] = Rt[0], ye[3] = Rt[1], kt ? (lt.stopPropagation && lt.stopPropagation(), lt.preventDefault && lt.preventDefault(), !1) : void 0;\n                  }\n                },\n                !1\n              ), t.registerBinding(\n                window,\n                \"mouseup\",\n                function(lt) {\n                  if (t.hoverData.capture) {\n                    t.hoverData.capture = !1;\n                    var kt = t.cy, Dt = t.projectIntoViewport(lt.clientX, lt.clientY), yt = t.selection, ft = t.findNearestElement(Dt[0], Dt[1], !0, !1), Rt = t.dragData.possibleDragElements, Wt = t.hoverData.down, le = l(lt);\n                    if (t.data.bgActivePosistion && (t.redrawHint(\"select\", !0), t.redraw()), t.hoverData.tapholdCancelled = !0, t.data.bgActivePosistion = void 0, Wt && Wt.unactivate(), t.hoverData.which === 3) {\n                      var ye = {\n                        originalEvent: lt,\n                        type: \"cxttapend\",\n                        position: { x: Dt[0], y: Dt[1] }\n                      };\n                      if (Wt ? Wt.emit(ye) : kt.emit(ye), !t.hoverData.cxtDragged) {\n                        var pe = {\n                          originalEvent: lt,\n                          type: \"cxttap\",\n                          position: { x: Dt[0], y: Dt[1] }\n                        };\n                        Wt ? Wt.emit(pe) : kt.emit(pe);\n                      }\n                      t.hoverData.cxtDragged = !1, t.hoverData.which = null;\n                    } else if (t.hoverData.which === 1) {\n                      if (Wt != null || t.dragData.didDrag || t.hoverData.selecting || t.hoverData.dragged || l(lt) || (kt.$(function(ir) {\n                        return ir.selected();\n                      }).unselect(), Rt.length > 0 && t.redrawHint(\"eles\", !0), t.dragData.possibleDragElements = Rt = []), r(ft, [\"mouseup\", \"tapend\", \"vmouseup\"], lt, {\n                        position: { x: Dt[0], y: Dt[1] }\n                      }), t.dragData.didDrag || t.hoverData.dragged || t.hoverData.selecting || t.hoverData.isOverThresholdDrag || r(Wt, [\"click\", \"tap\", \"vclick\"], lt, {\n                        position: { x: Dt[0], y: Dt[1] }\n                      }), ft != Wt || t.dragData.didDrag || t.hoverData.selecting || ft != null && ft._private.selectable && (t.hoverData.dragging || (kt.selectionType() === \"additive\" || le ? ft.selected() ? ft.unselect() : ft.select() : le || (kt.$(\":selected\").unmerge(ft).unselect(), ft.select())), t.redrawHint(\"eles\", !0)), t.hoverData.selecting) {\n                        var je = kt.collection(\n                          t.getAllInBox(yt[0], yt[1], yt[2], yt[3])\n                        );\n                        t.redrawHint(\"select\", !0), je.length > 0 && t.redrawHint(\"eles\", !0), kt.emit(\"boxend\");\n                        var Me = function(ir) {\n                          return ir.selectable() && !ir.selected();\n                        };\n                        kt.selectionType() === \"additive\" || le || kt.$(\":selected\").unmerge(je).unselect(), je.emit(\"box\").stdFilter(Me).select().emit(\"boxselect\"), t.redraw();\n                      }\n                      if (t.hoverData.dragging && (t.hoverData.dragging = !1, t.redrawHint(\"select\", !0), t.redrawHint(\"eles\", !0), t.redraw()), !yt[4]) {\n                        t.redrawHint(\"drag\", !0), t.redrawHint(\"eles\", !0);\n                        var Ze = Wt && Wt.grabbed();\n                        k(Rt), Ze && Wt.emit(\"free\");\n                      }\n                    }\n                    yt[4] = 0, t.hoverData.down = null, t.hoverData.cxtStarted = !1, t.hoverData.draggingEles = !1, t.hoverData.selecting = !1, t.hoverData.isOverThresholdDrag = !1, t.dragData.didDrag = !1, t.hoverData.dragged = !1, t.hoverData.dragDelta = [], t.hoverData.mdownPos = null, t.hoverData.mdownGPos = null;\n                  }\n                },\n                !1\n              ), t.registerBinding(\n                t.container,\n                \"wheel\",\n                function(lt) {\n                  if (!t.scrollingPage) {\n                    var kt, Dt = t.cy, yt = t.projectIntoViewport(lt.clientX, lt.clientY), ft = [\n                      yt[0] * Dt.zoom() + Dt.pan().x,\n                      yt[1] * Dt.zoom() + Dt.pan().y\n                    ];\n                    t.hoverData.draggingEles || t.hoverData.dragging || t.hoverData.cxtStarted || t.selection[4] !== 0 ? lt.preventDefault() : Dt.panningEnabled() && Dt.userPanningEnabled() && Dt.zoomingEnabled() && Dt.userZoomingEnabled() && (lt.preventDefault(), t.data.wheelZooming = !0, clearTimeout(t.data.wheelTimeout), t.data.wheelTimeout = setTimeout(function() {\n                      t.data.wheelZooming = !1, t.redrawHint(\"eles\", !0), t.redraw();\n                    }, 150), kt = lt.deltaY != null ? lt.deltaY / -250 : lt.wheelDeltaY != null ? lt.wheelDeltaY / 1e3 : lt.wheelDelta / 1e3, kt *= t.wheelSensitivity, lt.deltaMode === 1 && (kt *= 33), Dt.zoom({\n                      level: Dt.zoom() * Math.pow(10, kt),\n                      renderedPosition: { x: ft[0], y: ft[1] }\n                    }));\n                  }\n                },\n                !0\n              ), t.registerBinding(\n                window,\n                \"scroll\",\n                function(lt) {\n                  t.scrollingPage = !0, clearTimeout(t.scrollingPageTimeout), t.scrollingPageTimeout = setTimeout(function() {\n                    t.scrollingPage = !1;\n                  }, 250);\n                },\n                !0\n              ), t.registerBinding(\n                t.container,\n                \"mouseout\",\n                function(lt) {\n                  var kt = t.projectIntoViewport(lt.clientX, lt.clientY);\n                  t.cy.emit({\n                    originalEvent: lt,\n                    type: \"mouseout\",\n                    position: { x: kt[0], y: kt[1] }\n                  });\n                },\n                !1\n              ), t.registerBinding(\n                t.container,\n                \"mouseover\",\n                function(lt) {\n                  var kt = t.projectIntoViewport(lt.clientX, lt.clientY);\n                  t.cy.emit({\n                    originalEvent: lt,\n                    type: \"mouseover\",\n                    position: { x: kt[0], y: kt[1] }\n                  });\n                },\n                !1\n              );\n              var xt, St, zt, Nt, re = function(lt, kt, Dt, yt) {\n                return Math.sqrt((Dt - lt) * (Dt - lt) + (yt - kt) * (yt - kt));\n              }, be = function(lt, kt, Dt, yt) {\n                return (Dt - lt) * (Dt - lt) + (yt - kt) * (yt - kt);\n              };\n              if (t.registerBinding(\n                t.container,\n                \"touchstart\",\n                xt = function(lt) {\n                  if (gt(lt)) {\n                    t.touchData.capture = !0, t.data.bgActivePosistion = void 0;\n                    var kt = t.cy, Dt = t.touchData.now, yt = t.touchData.earlier;\n                    if (lt.touches[0]) {\n                      var ft = t.projectIntoViewport(\n                        lt.touches[0].clientX,\n                        lt.touches[0].clientY\n                      );\n                      Dt[0] = ft[0], Dt[1] = ft[1];\n                    }\n                    if (lt.touches[1] && (ft = t.projectIntoViewport(\n                      lt.touches[1].clientX,\n                      lt.touches[1].clientY\n                    ), Dt[2] = ft[0], Dt[3] = ft[1]), lt.touches[2] && (ft = t.projectIntoViewport(\n                      lt.touches[2].clientX,\n                      lt.touches[2].clientY\n                    ), Dt[4] = ft[0], Dt[5] = ft[1]), lt.touches[1]) {\n                      k(t.dragData.touchDragEles);\n                      var Rt = t.findContainerClientCoords();\n                      at = Rt[0], nt = Rt[1], ht = Rt[2], ct = Rt[3], R = lt.touches[0].clientX - at, M = lt.touches[0].clientY - nt, z = lt.touches[1].clientX - at, V = lt.touches[1].clientY - nt, ot = 0 <= R && R <= ht && 0 <= z && z <= ht && 0 <= M && M <= ct && 0 <= V && V <= ct;\n                      var Wt = kt.pan(), le = kt.zoom();\n                      if (G = re(R, M, z, V), Y = be(R, M, z, V), Z = [\n                        ((tt = [(R + z) / 2, (M + V) / 2])[0] - Wt.x) / le,\n                        (tt[1] - Wt.y) / le\n                      ], Y < 4e4 && !lt.touches[2]) {\n                        var ye = t.findNearestElement(Dt[0], Dt[1], !0, !0), pe = t.findNearestElement(Dt[2], Dt[3], !0, !0);\n                        return ye && ye.isNode() ? (ye.activate().emit({\n                          originalEvent: lt,\n                          type: \"cxttapstart\",\n                          position: { x: Dt[0], y: Dt[1] }\n                        }), t.touchData.start = ye) : pe && pe.isNode() ? (pe.activate().emit({\n                          originalEvent: lt,\n                          type: \"cxttapstart\",\n                          position: { x: Dt[0], y: Dt[1] }\n                        }), t.touchData.start = pe) : kt.emit({\n                          originalEvent: lt,\n                          type: \"cxttapstart\",\n                          position: { x: Dt[0], y: Dt[1] }\n                        }), t.touchData.start && (t.touchData.start._private.grabbed = !1), t.touchData.cxt = !0, t.touchData.cxtDragged = !1, t.data.bgActivePosistion = void 0, void t.redraw();\n                      }\n                    }\n                    if (!lt.touches[2]) {\n                      if (!lt.touches[1]) {\n                        if (lt.touches[0]) {\n                          var je = t.findNearestElements(Dt[0], Dt[1], !0, !0), Me = je[0];\n                          if (Me != null && (Me.activate(), t.touchData.start = Me, t.touchData.starts = je, t.nodeIsGrabbable(Me))) {\n                            var Ze = t.dragData.touchDragEles = [], ir = null;\n                            t.redrawHint(\"eles\", !0), t.redrawHint(\"drag\", !0), Me.selected() ? (ir = kt.$(function(mn) {\n                              return mn.selected() && t.nodeIsGrabbable(mn);\n                            }), f(ir, { addToList: Ze })) : v(Me, { addToList: Ze }), d(Me);\n                            var Ar = function(mn) {\n                              return {\n                                originalEvent: lt,\n                                type: mn,\n                                position: { x: Dt[0], y: Dt[1] }\n                              };\n                            };\n                            Me.emit(Ar(\"grabon\")), ir ? ir.forEach(function(mn) {\n                              mn.emit(Ar(\"grab\"));\n                            }) : Me.emit(Ar(\"grab\"));\n                          }\n                          r(Me, [\"touchstart\", \"tapstart\", \"vmousedown\"], lt, {\n                            position: { x: Dt[0], y: Dt[1] }\n                          }), Me == null && (t.data.bgActivePosistion = {\n                            x: ft[0],\n                            y: ft[1]\n                          }, t.redrawHint(\"select\", !0), t.redraw()), t.touchData.singleTouchMoved = !1, t.touchData.singleTouchStartTime = +/* @__PURE__ */ new Date(), clearTimeout(t.touchData.tapholdTimeout), t.touchData.tapholdTimeout = setTimeout(\n                            function() {\n                              t.touchData.singleTouchMoved !== !1 || t.pinching || t.touchData.selecting || (r(t.touchData.start, [\"taphold\"], lt, {\n                                position: { x: Dt[0], y: Dt[1] }\n                              }), t.touchData.start || kt.$(\":selected\").unselect());\n                            },\n                            t.tapholdDuration\n                          );\n                        }\n                      }\n                    }\n                    if (lt.touches.length >= 1) {\n                      for (var rr = t.touchData.startPosition = [], zr = 0; zr < Dt.length; zr++)\n                        rr[zr] = yt[zr] = Dt[zr];\n                      var ln = lt.touches[0];\n                      t.touchData.startGPosition = [ln.clientX, ln.clientY];\n                    }\n                  }\n                },\n                !1\n              ), t.registerBinding(\n                window,\n                \"touchmove\",\n                St = function(lt) {\n                  var kt = t.touchData.capture;\n                  if (kt || gt(lt)) {\n                    var Dt = t.selection, yt = t.cy, ft = t.touchData.now, Rt = t.touchData.earlier, Wt = yt.zoom();\n                    if (lt.touches[0]) {\n                      var le = t.projectIntoViewport(\n                        lt.touches[0].clientX,\n                        lt.touches[0].clientY\n                      );\n                      ft[0] = le[0], ft[1] = le[1];\n                    }\n                    lt.touches[1] && (le = t.projectIntoViewport(\n                      lt.touches[1].clientX,\n                      lt.touches[1].clientY\n                    ), ft[2] = le[0], ft[3] = le[1]), lt.touches[2] && (le = t.projectIntoViewport(\n                      lt.touches[2].clientX,\n                      lt.touches[2].clientY\n                    ), ft[4] = le[0], ft[5] = le[1]);\n                    var ye, pe = t.touchData.startGPosition;\n                    if (kt && lt.touches[0] && pe) {\n                      for (var je = [], Me = 0; Me < ft.length; Me++)\n                        je[Me] = ft[Me] - Rt[Me];\n                      var Ze = lt.touches[0].clientX - pe[0], ir = Ze * Ze, Ar = lt.touches[0].clientY - pe[1];\n                      ye = ir + Ar * Ar >= t.touchTapThreshold2;\n                    }\n                    if (kt && t.touchData.cxt) {\n                      lt.preventDefault();\n                      var rr = lt.touches[0].clientX - at, zr = lt.touches[0].clientY - nt, ln = lt.touches[1].clientX - at, mn = lt.touches[1].clientY - nt, un = be(rr, zr, ln, mn);\n                      if (un / Y >= 2.25 || un >= 22500) {\n                        t.touchData.cxt = !1, t.data.bgActivePosistion = void 0, t.redrawHint(\"select\", !0);\n                        var Kr = {\n                          originalEvent: lt,\n                          type: \"cxttapend\",\n                          position: { x: ft[0], y: ft[1] }\n                        };\n                        t.touchData.start ? (t.touchData.start.unactivate().emit(Kr), t.touchData.start = null) : yt.emit(Kr);\n                      }\n                    }\n                    if (kt && t.touchData.cxt) {\n                      Kr = {\n                        originalEvent: lt,\n                        type: \"cxtdrag\",\n                        position: { x: ft[0], y: ft[1] }\n                      }, t.data.bgActivePosistion = void 0, t.redrawHint(\"select\", !0), t.touchData.start ? t.touchData.start.emit(Kr) : yt.emit(Kr), t.touchData.start && (t.touchData.start._private.grabbed = !1), t.touchData.cxtDragged = !0;\n                      var yn = t.findNearestElement(ft[0], ft[1], !0, !0);\n                      t.touchData.cxtOver && yn === t.touchData.cxtOver || (t.touchData.cxtOver && t.touchData.cxtOver.emit({\n                        originalEvent: lt,\n                        type: \"cxtdragout\",\n                        position: { x: ft[0], y: ft[1] }\n                      }), t.touchData.cxtOver = yn, yn && yn.emit({\n                        originalEvent: lt,\n                        type: \"cxtdragover\",\n                        position: { x: ft[0], y: ft[1] }\n                      }));\n                    } else if (kt && lt.touches[2] && yt.boxSelectionEnabled())\n                      lt.preventDefault(), t.data.bgActivePosistion = void 0, this.lastThreeTouch = +/* @__PURE__ */ new Date(), t.touchData.selecting || yt.emit(\"boxstart\"), t.touchData.selecting = !0, t.redrawHint(\"select\", !0), Dt && Dt.length !== 0 && Dt[0] !== void 0 ? (Dt[2] = (ft[0] + ft[2] + ft[4]) / 3, Dt[3] = (ft[1] + ft[3] + ft[5]) / 3) : (Dt[0] = (ft[0] + ft[2] + ft[4]) / 3, Dt[1] = (ft[1] + ft[3] + ft[5]) / 3, Dt[2] = (ft[0] + ft[2] + ft[4]) / 3 + 1, Dt[3] = (ft[1] + ft[3] + ft[5]) / 3 + 1), Dt[4] = 1, t.touchData.selecting = !0, t.redraw();\n                    else if (kt && lt.touches[1] && yt.zoomingEnabled() && yt.panningEnabled() && yt.userZoomingEnabled() && yt.userPanningEnabled()) {\n                      if (lt.preventDefault(), t.data.bgActivePosistion = void 0, t.redrawHint(\"select\", !0), Wr = t.dragData.touchDragEles) {\n                        t.redrawHint(\"drag\", !0);\n                        for (var nn = 0; nn < Wr.length; nn++) {\n                          var Ei = Wr[nn]._private;\n                          Ei.grabbed = !1, Ei.rscratch.inDragLayer = !1;\n                        }\n                      }\n                      rr = lt.touches[0].clientX - at, zr = lt.touches[0].clientY - nt, ln = lt.touches[1].clientX - at, mn = lt.touches[1].clientY - nt;\n                      var ri = re(rr, zr, ln, mn), Yn = ri / G;\n                      if (ot) {\n                        var tn = (rr - R + (ln - z)) / 2, xn = (zr - M + (mn - V)) / 2, Tn = yt.zoom(), Kn = Tn * Yn, ar = yt.pan(), Yr = Z[0] * Tn + ar.x, gn = Z[1] * Tn + ar.y, vn = {\n                          x: -Kn / Tn * (Yr - ar.x - tn) + Yr,\n                          y: -Kn / Tn * (gn - ar.y - xn) + gn\n                        };\n                        if (t.touchData.start && t.touchData.start.active()) {\n                          var Wr = t.dragData.touchDragEles;\n                          k(Wr), t.redrawHint(\"drag\", !0), t.redrawHint(\"eles\", !0), t.touchData.start.unactivate().emit(\"free\");\n                        }\n                        yt.viewport({\n                          zoom: Kn,\n                          pan: vn,\n                          cancelOnFailedZoom: !0\n                        }), G = ri, R = rr, M = zr, z = ln, V = mn, t.pinching = !0;\n                      }\n                      lt.touches[0] && (le = t.projectIntoViewport(\n                        lt.touches[0].clientX,\n                        lt.touches[0].clientY\n                      ), ft[0] = le[0], ft[1] = le[1]), lt.touches[1] && (le = t.projectIntoViewport(\n                        lt.touches[1].clientX,\n                        lt.touches[1].clientY\n                      ), ft[2] = le[0], ft[3] = le[1]), lt.touches[2] && (le = t.projectIntoViewport(\n                        lt.touches[2].clientX,\n                        lt.touches[2].clientY\n                      ), ft[4] = le[0], ft[5] = le[1]);\n                    } else if (lt.touches[0]) {\n                      var Ur = t.touchData.start, Pn = t.touchData.last;\n                      if (t.hoverData.draggingEles || t.swipePanning || (yn = t.findNearestElement(ft[0], ft[1], !0, !0)), kt && Ur != null && lt.preventDefault(), kt && Ur != null && t.nodeIsDraggable(Ur))\n                        if (ye) {\n                          Wr = t.dragData.touchDragEles;\n                          var Fn = !t.dragData.didDrag;\n                          Fn && f(yt.collection(Wr), { inDragLayer: !0 });\n                          for (var In = 0; In < Wr.length; In++) {\n                            var ni = Wr[In];\n                            if (t.nodeIsDraggable(ni) && ni.grabbed()) {\n                              t.dragData.didDrag = !0;\n                              var Xn = ni.position();\n                              o.number(je[0]) && o.number(je[1]) && (Xn.x += je[0], Xn.y += je[1]), Fn && (t.redrawHint(\"eles\", !0), (_r = t.touchData.dragDelta) && o.number(_r[0]) && o.number(_r[1]) && (Xn.x += _r[0], Xn.y += _r[1]));\n                            }\n                          }\n                          var ur = yt.collection(Wr);\n                          ur.dirtyCompoundBoundsCache(), ur.emit(\"position drag\"), t.hoverData.draggingEles = !0, t.redrawHint(\"drag\", !0), t.touchData.startPosition[0] == Rt[0] && t.touchData.startPosition[1] == Rt[1] && t.redrawHint(\"eles\", !0), t.redraw();\n                        } else {\n                          var _r;\n                          (_r = t.touchData.dragDelta = t.touchData.dragDelta || []).length === 0 ? (_r.push(je[0]), _r.push(je[1])) : (_r[0] += je[0], _r[1] += je[1]);\n                        }\n                      if (r(\n                        Ur || yn,\n                        [\"touchmove\", \"tapdrag\", \"vmousemove\"],\n                        lt,\n                        { position: { x: ft[0], y: ft[1] } }\n                      ), Ur && Ur.grabbed() || yn == Pn || (Pn && Pn.emit({\n                        originalEvent: lt,\n                        type: \"tapdragout\",\n                        position: { x: ft[0], y: ft[1] }\n                      }), yn && yn.emit({\n                        originalEvent: lt,\n                        type: \"tapdragover\",\n                        position: { x: ft[0], y: ft[1] }\n                      })), t.touchData.last = yn, kt)\n                        for (nn = 0; nn < ft.length; nn++)\n                          ft[nn] && t.touchData.startPosition[nn] && ye && (t.touchData.singleTouchMoved = !0);\n                      kt && (Ur == null || Ur.isEdge()) && yt.panningEnabled() && yt.userPanningEnabled() && (h(Ur, t.touchData.starts) && (lt.preventDefault(), t.swipePanning ? yt.panBy({ x: je[0] * Wt, y: je[1] * Wt }) : ye && (t.swipePanning = !0, yt.panBy({ x: Ze * Wt, y: Ar * Wt }), Ur && (Ur.unactivate(), t.data.bgActivePosistion || (t.data.bgActivePosistion = a.array2point(\n                        t.touchData.startPosition\n                      )), t.redrawHint(\"select\", !0), t.touchData.start = null))), le = t.projectIntoViewport(\n                        lt.touches[0].clientX,\n                        lt.touches[0].clientY\n                      ), ft[0] = le[0], ft[1] = le[1]);\n                    }\n                    for (Me = 0; Me < ft.length; Me++) Rt[Me] = ft[Me];\n                  }\n                },\n                !1\n              ), t.registerBinding(\n                window,\n                \"touchcancel\",\n                zt = function(lt) {\n                  var kt = t.touchData.start;\n                  t.touchData.capture = !1, kt && kt.unactivate();\n                }\n              ), t.registerBinding(\n                window,\n                \"touchend\",\n                Nt = function(lt) {\n                  var kt = t.touchData.start;\n                  if (t.touchData.capture) {\n                    t.touchData.capture = !1, lt.preventDefault();\n                    var Dt = t.selection;\n                    t.swipePanning = !1, t.hoverData.draggingEles = !1;\n                    var yt, ft = t.cy, Rt = ft.zoom(), Wt = t.touchData.now, le = t.touchData.earlier;\n                    if (lt.touches[0]) {\n                      var ye = t.projectIntoViewport(\n                        lt.touches[0].clientX,\n                        lt.touches[0].clientY\n                      );\n                      Wt[0] = ye[0], Wt[1] = ye[1];\n                    }\n                    if (lt.touches[1] && (ye = t.projectIntoViewport(\n                      lt.touches[1].clientX,\n                      lt.touches[1].clientY\n                    ), Wt[2] = ye[0], Wt[3] = ye[1]), lt.touches[2] && (ye = t.projectIntoViewport(\n                      lt.touches[2].clientX,\n                      lt.touches[2].clientY\n                    ), Wt[4] = ye[0], Wt[5] = ye[1]), kt && kt.unactivate(), t.touchData.cxt) {\n                      if (yt = {\n                        originalEvent: lt,\n                        type: \"cxttapend\",\n                        position: { x: Wt[0], y: Wt[1] }\n                      }, kt ? kt.emit(yt) : ft.emit(yt), !t.touchData.cxtDragged) {\n                        var pe = {\n                          originalEvent: lt,\n                          type: \"cxttap\",\n                          position: { x: Wt[0], y: Wt[1] }\n                        };\n                        kt ? kt.emit(pe) : ft.emit(pe);\n                      }\n                      return t.touchData.start && (t.touchData.start._private.grabbed = !1), t.touchData.cxt = !1, t.touchData.start = null, void t.redraw();\n                    }\n                    if (!lt.touches[2] && ft.boxSelectionEnabled() && t.touchData.selecting) {\n                      t.touchData.selecting = !1;\n                      var je = ft.collection(\n                        t.getAllInBox(Dt[0], Dt[1], Dt[2], Dt[3])\n                      );\n                      Dt[0] = void 0, Dt[1] = void 0, Dt[2] = void 0, Dt[3] = void 0, Dt[4] = 0, t.redrawHint(\"select\", !0), ft.emit(\"boxend\"), je.emit(\"box\").stdFilter(function(un) {\n                        return un.selectable() && !un.selected();\n                      }).select().emit(\"boxselect\"), je.nonempty() && t.redrawHint(\"eles\", !0), t.redraw();\n                    }\n                    if (kt != null && kt.unactivate(), lt.touches[2])\n                      t.data.bgActivePosistion = void 0, t.redrawHint(\"select\", !0);\n                    else if (!lt.touches[1]) {\n                      if (!lt.touches[0]) {\n                        if (!lt.touches[0]) {\n                          t.data.bgActivePosistion = void 0, t.redrawHint(\"select\", !0);\n                          var Me = t.dragData.touchDragEles;\n                          if (kt != null) {\n                            var Ze = kt._private.grabbed;\n                            k(Me), t.redrawHint(\"drag\", !0), t.redrawHint(\"eles\", !0), Ze && kt.emit(\"free\"), r(\n                              kt,\n                              [\n                                \"touchend\",\n                                \"tapend\",\n                                \"vmouseup\",\n                                \"tapdragout\"\n                              ],\n                              lt,\n                              { position: { x: Wt[0], y: Wt[1] } }\n                            ), kt.unactivate(), t.touchData.start = null;\n                          } else {\n                            var ir = t.findNearestElement(Wt[0], Wt[1], !0, !0);\n                            r(\n                              ir,\n                              [\"touchend\", \"tapend\", \"vmouseup\", \"tapdragout\"],\n                              lt,\n                              { position: { x: Wt[0], y: Wt[1] } }\n                            );\n                          }\n                          var Ar = t.touchData.startPosition[0] - Wt[0], rr = Ar * Ar, zr = t.touchData.startPosition[1] - Wt[1], ln = (rr + zr * zr) * Rt * Rt;\n                          kt != null && !t.dragData.didDrag && kt._private.selectable && ln < t.touchTapThreshold2 && !t.pinching && (ft.selectionType() === \"single\" ? (ft.$(\":selected\").unmerge(kt).unselect(), kt.select()) : kt.selected() ? kt.unselect() : kt.select(), t.redrawHint(\"eles\", !0)), t.touchData.singleTouchMoved || r(kt, [\"tap\", \"vclick\"], lt, {\n                            position: { x: Wt[0], y: Wt[1] }\n                          }), t.touchData.singleTouchMoved = !0;\n                        }\n                      }\n                    }\n                    for (var mn = 0; mn < Wt.length; mn++) le[mn] = Wt[mn];\n                    t.dragData.didDrag = !1, lt.touches.length === 0 && (t.touchData.dragDelta = [], t.touchData.startPosition = null, t.touchData.startGPosition = null), lt.touches.length < 2 && (t.pinching = !1, t.redrawHint(\"eles\", !0), t.redraw());\n                  }\n                },\n                !1\n              ), typeof TouchEvent > \"u\") {\n                var ne = [], ce = function(lt) {\n                  return {\n                    clientX: lt.clientX,\n                    clientY: lt.clientY,\n                    force: 1,\n                    identifier: lt.pointerId,\n                    pageX: lt.pageX,\n                    pageY: lt.pageY,\n                    radiusX: lt.width / 2,\n                    radiusY: lt.height / 2,\n                    screenX: lt.screenX,\n                    screenY: lt.screenY,\n                    target: lt.target\n                  };\n                }, xe = function(lt) {\n                  ne.push(\n                    function(kt) {\n                      return { event: kt, touch: ce(kt) };\n                    }(lt)\n                  );\n                }, we = function(lt) {\n                  for (var kt = 0; kt < ne.length; kt++)\n                    if (ne[kt].event.pointerId === lt.pointerId)\n                      return void ne.splice(kt, 1);\n                }, ae = function(lt) {\n                  lt.touches = ne.map(function(kt) {\n                    return kt.touch;\n                  });\n                }, Le = function(lt) {\n                  return lt.pointerType === \"mouse\" || lt.pointerType === 4;\n                };\n                t.registerBinding(t.container, \"pointerdown\", function(lt) {\n                  Le(lt) || (lt.preventDefault(), xe(lt), ae(lt), xt(lt));\n                }), t.registerBinding(t.container, \"pointerup\", function(lt) {\n                  Le(lt) || (we(lt), ae(lt), Nt(lt));\n                }), t.registerBinding(\n                  t.container,\n                  \"pointercancel\",\n                  function(lt) {\n                    Le(lt) || (we(lt), ae(lt), zt());\n                  }\n                ), t.registerBinding(t.container, \"pointermove\", function(lt) {\n                  Le(lt) || (lt.preventDefault(), function(kt) {\n                    var Dt = ne.filter(function(yt) {\n                      return yt.event.pointerId === kt.pointerId;\n                    })[0];\n                    Dt.event = kt, Dt.touch = ce(kt);\n                  }(lt), ae(lt), St(lt));\n                });\n              }\n            }, y.exports = n;\n          },\n          function(y, x, g) {\n            var o = g(2), c = {\n              generatePolygon: function(a, n) {\n                return this.nodeShapes[a] = {\n                  renderer: this,\n                  name: a,\n                  points: n,\n                  draw: function(t, r, l, h, i) {\n                    this.renderer.nodeShapeImpl(\n                      \"polygon\",\n                      t,\n                      r,\n                      l,\n                      h,\n                      i,\n                      this.points\n                    );\n                  },\n                  intersectLine: function(t, r, l, h, i, d, p) {\n                    return o.polygonIntersectLine(\n                      i,\n                      d,\n                      this.points,\n                      t,\n                      r,\n                      l / 2,\n                      h / 2,\n                      p\n                    );\n                  },\n                  checkPoint: function(t, r, l, h, i, d, p) {\n                    return o.pointInsidePolygon(\n                      t,\n                      r,\n                      this.points,\n                      d,\n                      p,\n                      h,\n                      i,\n                      [0, -1],\n                      l\n                    );\n                  }\n                };\n              },\n              generateEllipse: function() {\n                return this.nodeShapes.ellipse = {\n                  renderer: this,\n                  name: \"ellipse\",\n                  draw: function(a, n, t, r, l) {\n                    this.renderer.nodeShapeImpl(this.name, a, n, t, r, l);\n                  },\n                  intersectLine: function(a, n, t, r, l, h, i) {\n                    return o.intersectLineEllipse(\n                      l,\n                      h,\n                      a,\n                      n,\n                      t / 2 + i,\n                      r / 2 + i\n                    );\n                  },\n                  checkPoint: function(a, n, t, r, l, h, i) {\n                    return o.checkInEllipse(a, n, r, l, h, i, t);\n                  }\n                };\n              },\n              generateRoundRectangle: function() {\n                return this.nodeShapes.roundrectangle = {\n                  renderer: this,\n                  name: \"roundrectangle\",\n                  points: o.generateUnitNgonPointsFitToSquare(4, 0),\n                  draw: function(a, n, t, r, l) {\n                    this.renderer.nodeShapeImpl(this.name, a, n, t, r, l);\n                  },\n                  intersectLine: function(a, n, t, r, l, h, i) {\n                    return o.roundRectangleIntersectLine(\n                      l,\n                      h,\n                      a,\n                      n,\n                      t,\n                      r,\n                      i\n                    );\n                  },\n                  checkPoint: function(a, n, t, r, l, h, i) {\n                    var d = o.getRoundRectangleRadius(r, l), p = 2 * d;\n                    return !!(o.pointInsidePolygon(\n                      a,\n                      n,\n                      this.points,\n                      h,\n                      i,\n                      r,\n                      l - p,\n                      [0, -1],\n                      t\n                    ) || o.pointInsidePolygon(\n                      a,\n                      n,\n                      this.points,\n                      h,\n                      i,\n                      r - p,\n                      l,\n                      [0, -1],\n                      t\n                    ) || o.checkInEllipse(\n                      a,\n                      n,\n                      p,\n                      p,\n                      h - r / 2 + d,\n                      i - l / 2 + d,\n                      t\n                    ) || o.checkInEllipse(\n                      a,\n                      n,\n                      p,\n                      p,\n                      h + r / 2 - d,\n                      i - l / 2 + d,\n                      t\n                    ) || o.checkInEllipse(\n                      a,\n                      n,\n                      p,\n                      p,\n                      h + r / 2 - d,\n                      i + l / 2 - d,\n                      t\n                    ) || o.checkInEllipse(\n                      a,\n                      n,\n                      p,\n                      p,\n                      h - r / 2 + d,\n                      i + l / 2 - d,\n                      t\n                    ));\n                  }\n                };\n              },\n              generateCutRectangle: function() {\n                return this.nodeShapes.cutrectangle = {\n                  renderer: this,\n                  name: \"cutrectangle\",\n                  cornerLength: o.getCutRectangleCornerLength(),\n                  points: o.generateUnitNgonPointsFitToSquare(4, 0),\n                  draw: function(a, n, t, r, l) {\n                    this.renderer.nodeShapeImpl(this.name, a, n, t, r, l);\n                  },\n                  generateCutTrianglePts: function(a, n, t, r) {\n                    var l = this.cornerLength, h = n / 2, i = a / 2, d = t - i, p = t + i, f = r - h, v = r + h;\n                    return {\n                      topLeft: [d, f + l, d + l, f, d + l, f + l],\n                      topRight: [p - l, f, p, f + l, p - l, f + l],\n                      bottomRight: [p, v - l, p - l, v, p - l, v - l],\n                      bottomLeft: [d + l, v, d, v - l, d + l, v - l]\n                    };\n                  },\n                  intersectLine: function(a, n, t, r, l, h, i) {\n                    var d = this.generateCutTrianglePts(\n                      t + 2 * i,\n                      r + 2 * i,\n                      a,\n                      n\n                    ), p = [].concat.apply(\n                      [],\n                      [\n                        d.topLeft.splice(0, 4),\n                        d.topRight.splice(0, 4),\n                        d.bottomRight.splice(0, 4),\n                        d.bottomLeft.splice(0, 4)\n                      ]\n                    );\n                    return o.polygonIntersectLine(l, h, p, a, n);\n                  },\n                  checkPoint: function(a, n, t, r, l, h, i) {\n                    if (o.pointInsidePolygon(\n                      a,\n                      n,\n                      this.points,\n                      h,\n                      i,\n                      r,\n                      l - 2 * this.cornerLength,\n                      [0, -1],\n                      t\n                    ) || o.pointInsidePolygon(\n                      a,\n                      n,\n                      this.points,\n                      h,\n                      i,\n                      r - 2 * this.cornerLength,\n                      l,\n                      [0, -1],\n                      t\n                    ))\n                      return !0;\n                    var d = this.generateCutTrianglePts(r, l, h, i);\n                    return o.pointInsidePolygonPoints(a, n, d.topLeft) || o.pointInsidePolygonPoints(a, n, d.topRight) || o.pointInsidePolygonPoints(a, n, d.bottomRight) || o.pointInsidePolygonPoints(a, n, d.bottomLeft);\n                  }\n                };\n              },\n              generateBarrel: function() {\n                return this.nodeShapes.barrel = {\n                  renderer: this,\n                  name: \"barrel\",\n                  points: o.generateUnitNgonPointsFitToSquare(4, 0),\n                  draw: function(a, n, t, r, l) {\n                    this.renderer.nodeShapeImpl(this.name, a, n, t, r, l);\n                  },\n                  intersectLine: function(a, n, t, r, l, h, i) {\n                    var d = this.generateBarrelBezierPts(\n                      t + 2 * i,\n                      r + 2 * i,\n                      a,\n                      n\n                    ), p = function(v) {\n                      var k = o.qbezierPtAt(\n                        { x: v[0], y: v[1] },\n                        { x: v[2], y: v[3] },\n                        { x: v[4], y: v[5] },\n                        0.15\n                      ), s = o.qbezierPtAt(\n                        { x: v[0], y: v[1] },\n                        { x: v[2], y: v[3] },\n                        { x: v[4], y: v[5] },\n                        0.5\n                      ), S = o.qbezierPtAt(\n                        { x: v[0], y: v[1] },\n                        { x: v[2], y: v[3] },\n                        { x: v[4], y: v[5] },\n                        0.85\n                      );\n                      return [\n                        v[0],\n                        v[1],\n                        k.x,\n                        k.y,\n                        s.x,\n                        s.y,\n                        S.x,\n                        S.y,\n                        v[4],\n                        v[5]\n                      ];\n                    }, f = [].concat(\n                      p(d.topLeft),\n                      p(d.topRight),\n                      p(d.bottomRight),\n                      p(d.bottomLeft)\n                    );\n                    return o.polygonIntersectLine(l, h, f, a, n);\n                  },\n                  generateBarrelBezierPts: function(a, n, t, r) {\n                    var l = n / 2, h = a / 2, i = t - h, d = t + h, p = r - l, f = r + l, v = o.getBarrelCurveConstants(a, n), k = v.heightOffset, s = v.widthOffset, S = v.ctrlPtOffsetPct * a, j = {\n                      topLeft: [i, p + k, i + S, p, i + s, p],\n                      topRight: [d - s, p, d - S, p, d, p + k],\n                      bottomRight: [d, f - k, d - S, f, d - s, f],\n                      bottomLeft: [i + s, f, i + S, f, i, f - k]\n                    };\n                    return j.topLeft.isTop = !0, j.topRight.isTop = !0, j.bottomLeft.isBottom = !0, j.bottomRight.isBottom = !0, j;\n                  },\n                  checkPoint: function(a, n, t, r, l, h, i) {\n                    var d = o.getBarrelCurveConstants(r, l), p = d.heightOffset, f = d.widthOffset;\n                    if (o.pointInsidePolygon(\n                      a,\n                      n,\n                      this.points,\n                      h,\n                      i,\n                      r,\n                      l - 2 * p,\n                      [0, -1],\n                      t\n                    ) || o.pointInsidePolygon(\n                      a,\n                      n,\n                      this.points,\n                      h,\n                      i,\n                      r - 2 * f,\n                      l,\n                      [0, -1],\n                      t\n                    ))\n                      return !0;\n                    for (var v = this.generateBarrelBezierPts(r, l, h, i), k = function(G, Y, tt) {\n                      var Z = tt[4], at = tt[2], nt = tt[0], ht = tt[5], ct = tt[1], ot = Math.min(Z, nt), gt = Math.max(Z, nt), xt = Math.min(ht, ct), St = Math.max(ht, ct);\n                      if (ot <= G && G <= gt && xt <= Y && Y <= St) {\n                        var zt = o.bezierPtsToQuadCoeff(Z, at, nt), Nt = o.solveQuadratic(zt[0], zt[1], zt[2], G).filter(function(re) {\n                          return 0 <= re && re <= 1;\n                        });\n                        if (Nt.length > 0) return Nt[0];\n                      }\n                      return null;\n                    }, s = Object.keys(v), S = 0; S < s.length; S++) {\n                      var j = v[s[S]], I = k(a, n, j);\n                      if (I != null) {\n                        var R = j[5], M = j[3], z = j[1], V = o.qbezierAt(R, M, z, I);\n                        if (j.isTop && V <= n || j.isBottom && n <= V) return !0;\n                      }\n                    }\n                    return !1;\n                  }\n                };\n              },\n              generateBottomRoundrectangle: function() {\n                return this.nodeShapes.bottomroundrectangle = {\n                  renderer: this,\n                  name: \"bottomroundrectangle\",\n                  points: o.generateUnitNgonPointsFitToSquare(4, 0),\n                  draw: function(a, n, t, r, l) {\n                    this.renderer.nodeShapeImpl(this.name, a, n, t, r, l);\n                  },\n                  intersectLine: function(a, n, t, r, l, h, i) {\n                    var d = a - (t / 2 + i), p = n - (r / 2 + i), f = p, v = a + (t / 2 + i), k = o.finiteLinesIntersect(\n                      l,\n                      h,\n                      a,\n                      n,\n                      d,\n                      p,\n                      v,\n                      f,\n                      !1\n                    );\n                    return k.length > 0 ? k : o.roundRectangleIntersectLine(l, h, a, n, t, r, i);\n                  },\n                  checkPoint: function(a, n, t, r, l, h, i) {\n                    var d = o.getRoundRectangleRadius(r, l), p = 2 * d;\n                    if (o.pointInsidePolygon(\n                      a,\n                      n,\n                      this.points,\n                      h,\n                      i,\n                      r,\n                      l - p,\n                      [0, -1],\n                      t\n                    ) || o.pointInsidePolygon(\n                      a,\n                      n,\n                      this.points,\n                      h,\n                      i,\n                      r - p,\n                      l,\n                      [0, -1],\n                      t\n                    ))\n                      return !0;\n                    var f = r / 2 + 2 * t, v = l / 2 + 2 * t, k = [h - f, i - v, h - f, i, h + f, i, h + f, i - v];\n                    return !!o.pointInsidePolygonPoints(a, n, k) || !!o.checkInEllipse(\n                      a,\n                      n,\n                      p,\n                      p,\n                      h + r / 2 - d,\n                      i + l / 2 - d,\n                      t\n                    ) || !!o.checkInEllipse(\n                      a,\n                      n,\n                      p,\n                      p,\n                      h - r / 2 + d,\n                      i + l / 2 - d,\n                      t\n                    );\n                  }\n                };\n              },\n              registerNodeShapes: function() {\n                var a = this.nodeShapes = {}, n = this;\n                this.generateEllipse(), this.generatePolygon(\n                  \"triangle\",\n                  o.generateUnitNgonPointsFitToSquare(3, 0)\n                ), this.generatePolygon(\n                  \"rectangle\",\n                  o.generateUnitNgonPointsFitToSquare(4, 0)\n                ), a.square = a.rectangle, this.generateRoundRectangle(), this.generateCutRectangle(), this.generateBarrel(), this.generateBottomRoundrectangle(), this.generatePolygon(\n                  \"diamond\",\n                  [0, 1, 1, 0, 0, -1, -1, 0]\n                ), this.generatePolygon(\n                  \"pentagon\",\n                  o.generateUnitNgonPointsFitToSquare(5, 0)\n                ), this.generatePolygon(\n                  \"hexagon\",\n                  o.generateUnitNgonPointsFitToSquare(6, 0)\n                ), this.generatePolygon(\n                  \"heptagon\",\n                  o.generateUnitNgonPointsFitToSquare(7, 0)\n                ), this.generatePolygon(\n                  \"octagon\",\n                  o.generateUnitNgonPointsFitToSquare(8, 0)\n                );\n                var t = new Array(20), r = o.generateUnitNgonPoints(5, 0), l = o.generateUnitNgonPoints(5, Math.PI / 5), h = 0.5 * (3 - Math.sqrt(5));\n                h *= 1.57;\n                for (var i = 0; i < l.length / 2; i++)\n                  l[2 * i] *= h, l[2 * i + 1] *= h;\n                for (i = 0; i < 5; i++)\n                  t[4 * i] = r[2 * i], t[4 * i + 1] = r[2 * i + 1], t[4 * i + 2] = l[2 * i], t[4 * i + 3] = l[2 * i + 1];\n                t = o.fitPolygonToSquare(t), this.generatePolygon(\"star\", t), this.generatePolygon(\n                  \"vee\",\n                  [-1, -1, 0, -0.333, 1, -1, 0, 1]\n                ), this.generatePolygon(\n                  \"rhomboid\",\n                  [-1, -1, 0.333, -1, 1, 1, -0.333, 1]\n                ), this.generatePolygon(\n                  \"concavehexagon\",\n                  [\n                    -1,\n                    -0.95,\n                    -0.75,\n                    0,\n                    -1,\n                    0.95,\n                    1,\n                    0.95,\n                    0.75,\n                    0,\n                    1,\n                    -0.95\n                  ]\n                ), this.generatePolygon(\n                  \"tag\",\n                  [-1, -1, 0.25, -1, 1, 0, 0.25, 1, -1, 1]\n                ), a.makePolygon = function(d) {\n                  var p, f = \"polygon-\" + d.join(\"$\");\n                  return (p = this[f]) ? p : n.generatePolygon(f, d);\n                };\n              }\n            };\n            y.exports = c;\n          },\n          function(y, x, g) {\n            var o = g(1), c = {\n              timeToRender: function() {\n                return this.redrawTotalTime / this.redrawCount;\n              },\n              redraw: function(n) {\n                n = n || o.staticEmptyObject();\n                var t = this;\n                t.averageRedrawTime === void 0 && (t.averageRedrawTime = 0), t.lastRedrawTime === void 0 && (t.lastRedrawTime = 0), t.lastDrawTime === void 0 && (t.lastDrawTime = 0), t.requestedFrame = !0, t.renderOptions = n;\n              },\n              beforeRender: function(n, t) {\n                if (!this.destroyed) {\n                  t = t || 0;\n                  var r = this.beforeRenderCallbacks;\n                  r.push({ fn: n, priority: t }), r.sort(function(l, h) {\n                    return h.priority - l.priority;\n                  });\n                }\n              }\n            }, a = function(n, t, r) {\n              for (var l = n.beforeRenderCallbacks, h = 0; h < l.length; h++)\n                l[h].fn(t, r);\n            };\n            c.startRenderLoop = function() {\n              var n = this;\n              n.renderLoopStarted || (n.renderLoopStarted = !0, o.requestAnimationFrame(function t(r) {\n                if (!n.destroyed) {\n                  if (n.requestedFrame && !n.skipFrame) {\n                    a(n, !0, r);\n                    var l = o.performanceNow();\n                    n.render(n.renderOptions);\n                    var h = n.lastDrawTime = o.performanceNow();\n                    n.averageRedrawTime === void 0 && (n.averageRedrawTime = h - l), n.redrawCount === void 0 && (n.redrawCount = 0), n.redrawCount++, n.redrawTotalTime === void 0 && (n.redrawTotalTime = 0);\n                    var i = h - l;\n                    n.redrawTotalTime += i, n.lastRedrawTime = i, n.averageRedrawTime = n.averageRedrawTime / 2 + i / 2, n.requestedFrame = !1;\n                  } else a(n, !1, r);\n                  n.skipFrame = !1, o.requestAnimationFrame(t);\n                }\n              }));\n            }, y.exports = c;\n          },\n          function(y, x, g) {\n            var o = g(1), c = g(0), a = g(124), n = g(125), t = l, r = l.prototype;\n            function l(i) {\n              var d = this;\n              d.data = {\n                canvases: new Array(r.CANVAS_LAYERS),\n                contexts: new Array(r.CANVAS_LAYERS),\n                canvasNeedsRedraw: new Array(r.CANVAS_LAYERS),\n                bufferCanvases: new Array(r.BUFFER_COUNT),\n                bufferContexts: new Array(r.CANVAS_LAYERS)\n              };\n              var p = \"-webkit-tap-highlight-color: rgba(0,0,0,0);\";\n              d.data.canvasContainer = document.createElement(\"div\");\n              var f = d.data.canvasContainer.style;\n              d.data.canvasContainer.setAttribute(\"style\", p), f.position = \"relative\", f.zIndex = \"0\", f.overflow = \"hidden\";\n              var v = i.cy.container();\n              v.appendChild(d.data.canvasContainer), (v.getAttribute(\"style\") || \"\").indexOf(p) < 0 && v.setAttribute(\n                \"style\",\n                (v.getAttribute(\"style\") || \"\") + p\n              );\n              for (var k = 0; k < r.CANVAS_LAYERS; k++) {\n                var s = d.data.canvases[k] = document.createElement(\"canvas\");\n                d.data.contexts[k] = s.getContext(\"2d\"), s.setAttribute(\n                  \"style\",\n                  \"-webkit-user-select: none; -moz-user-select: -moz-none; user-select: none; -webkit-tap-highlight-color: rgba(0,0,0,0); outline-style: none;\" + (c.ms() ? \" -ms-touch-action: none; touch-action: none; \" : \"\")\n                ), s.style.position = \"absolute\", s.setAttribute(\"data-id\", \"layer\" + k), s.style.zIndex = String(r.CANVAS_LAYERS - k), d.data.canvasContainer.appendChild(s), d.data.canvasNeedsRedraw[k] = !1;\n              }\n              for (d.data.topCanvas = d.data.canvases[0], d.data.canvases[r.NODE].setAttribute(\n                \"data-id\",\n                \"layer\" + r.NODE + \"-node\"\n              ), d.data.canvases[r.SELECT_BOX].setAttribute(\n                \"data-id\",\n                \"layer\" + r.SELECT_BOX + \"-selectbox\"\n              ), d.data.canvases[r.DRAG].setAttribute(\n                \"data-id\",\n                \"layer\" + r.DRAG + \"-drag\"\n              ), k = 0; k < r.BUFFER_COUNT; k++)\n                d.data.bufferCanvases[k] = document.createElement(\"canvas\"), d.data.bufferContexts[k] = d.data.bufferCanvases[k].getContext(\"2d\"), d.data.bufferCanvases[k].style.position = \"absolute\", d.data.bufferCanvases[k].setAttribute(\n                  \"data-id\",\n                  \"buffer\" + k\n                ), d.data.bufferCanvases[k].style.zIndex = String(-k - 1), d.data.bufferCanvases[k].style.visibility = \"hidden\";\n              d.pathsEnabled = !0, d.data.eleTxrCache = new a(d), d.data.lyrTxrCache = new n(d, d.data.eleTxrCache), d.onUpdateEleCalcs(function(S, j) {\n                for (var I = 0; I < j.length; I++) {\n                  var R = j[I], M = R._private.rstyle, z = M.dirtyEvents;\n                  if (!(R.isNode() && z && z.length === 1 && z.position)) {\n                    if (d.data.eleTxrCache.invalidateElement(R), R.isParent() && z.style) {\n                      var V = M.prevParentOpacity, G = R.pstyle(\"opacity\").pfValue;\n                      if (M.prevParentOpacity = G, V !== G)\n                        for (var Y = R.descendants(), tt = 0; tt < Y.length; tt++)\n                          d.data.eleTxrCache.invalidateElement(Y[tt]);\n                    }\n                  }\n                }\n                j.length > 0 && d.data.lyrTxrCache.invalidateElements(j);\n              });\n            }\n            r.CANVAS_LAYERS = 3, r.SELECT_BOX = 0, r.DRAG = 1, r.NODE = 2, r.BUFFER_COUNT = 3, r.TEXTURE_BUFFER = 0, r.MOTIONBLUR_BUFFER_NODE = 1, r.MOTIONBLUR_BUFFER_DRAG = 2, r.redrawHint = function(i, d) {\n              var p = this;\n              switch (i) {\n                case \"eles\":\n                  p.data.canvasNeedsRedraw[r.NODE] = d;\n                  break;\n                case \"drag\":\n                  p.data.canvasNeedsRedraw[r.DRAG] = d;\n                  break;\n                case \"select\":\n                  p.data.canvasNeedsRedraw[r.SELECT_BOX] = d;\n              }\n            };\n            var h = typeof Path2D < \"u\";\n            r.path2dEnabled = function(i) {\n              if (i === void 0) return this.pathsEnabled;\n              this.pathsEnabled = !!i;\n            }, r.usePaths = function() {\n              return h && this.pathsEnabled;\n            }, [\n              g(126),\n              g(127),\n              g(128),\n              g(129),\n              g(130),\n              g(131),\n              g(132),\n              g(133),\n              g(134),\n              g(135)\n            ].forEach(function(i) {\n              o.extend(r, i);\n            }), y.exports = t;\n          },\n          function(y, x, g) {\n            var o = g(2), c = g(1), a = g(9), n = g(19), t = {\n              dequeue: \"dequeue\",\n              downscale: \"downscale\",\n              highQuality: \"highQuality\"\n            }, r = function(h) {\n              this.renderer = h, this.onDequeues = [], this.setupDequeueing();\n            }, l = r.prototype;\n            l.reasons = t, l.getTextureQueue = function(h) {\n              return this.eleImgCaches = this.eleImgCaches || {}, this.eleImgCaches[h] = this.eleImgCaches[h] || [];\n            }, l.getRetiredTextureQueue = function(h) {\n              var i = this.eleImgCaches.retired = this.eleImgCaches.retired || {};\n              return i[h] = i[h] || [];\n            }, l.getElementQueue = function() {\n              return this.eleCacheQueue = this.eleCacheQueue || new a(function(h, i) {\n                return i.reqs - h.reqs;\n              });\n            }, l.getElementIdToQueue = function() {\n              return this.eleIdToCacheQueue = this.eleIdToCacheQueue || {};\n            }, l.getElement = function(h, i, d, p, f) {\n              var v = this, k = this.renderer, s = h._private.rscratch, S = k.cy.zoom();\n              if (i.w === 0 || i.h === 0 || !h.visible()) return null;\n              if (p == null && (p = Math.ceil(o.log2(S * d))), p < -4)\n                p = -4;\n              else if (S >= 3.99 || p > 2) return null;\n              var j, I = Math.pow(2, p), R = i.h * I, M = i.w * I, z = s.imgCaches = s.imgCaches || {}, V = z[p];\n              if (V) return V;\n              if (j = R <= 25 ? 25 : R <= 50 ? 50 : 50 * Math.ceil(R / 50), R > 1024 || M > 1024 || h.isEdge() || h.isParent())\n                return null;\n              var G = v.getTextureQueue(j), Y = G[G.length - 2], tt = function() {\n                return v.recycleTexture(j, M) || v.addTexture(j, M);\n              };\n              Y || (Y = G[G.length - 1]), Y || (Y = tt()), Y.width - Y.usedWidth < M && (Y = tt());\n              for (var Z, at = k.eleTextBiggerThanMin(h, I), nt = function(re) {\n                return re && re.scaledLabelShown === at;\n              }, ht = f && f === t.dequeue, ct = f && f === t.highQuality, ot = f && f === t.downscale, gt = p + 1; gt <= 2; gt++)\n                if (Nt = z[gt]) {\n                  Z = Nt;\n                  break;\n                }\n              var xt = Z && Z.level === p + 1 ? Z : null, St = function() {\n                Y.context.drawImage(\n                  xt.texture.canvas,\n                  xt.x,\n                  0,\n                  xt.width,\n                  xt.height,\n                  Y.usedWidth,\n                  0,\n                  M,\n                  R\n                );\n              };\n              if (Y.context.setTransform(1, 0, 0, 1, 0, 0), Y.context.clearRect(Y.usedWidth, 0, M, j), nt(xt))\n                St();\n              else if (nt(Z)) {\n                if (!ct) return v.queueElement(h, Z.level - 1), Z;\n                for (gt = Z.level; gt > p; gt--)\n                  xt = v.getElement(h, i, d, gt, t.downscale);\n                St();\n              } else {\n                var zt;\n                if (!ht && !ct && !ot)\n                  for (gt = p - 1; gt >= -4; gt--) {\n                    var Nt;\n                    if (Nt = z[gt]) {\n                      zt = Nt;\n                      break;\n                    }\n                  }\n                if (nt(zt)) return v.queueElement(h, p), zt;\n                Y.context.translate(Y.usedWidth, 0), Y.context.scale(I, I), k.drawElement(Y.context, h, i, at), Y.context.scale(1 / I, 1 / I), Y.context.translate(-Y.usedWidth, 0);\n              }\n              return V = z[p] = {\n                ele: h,\n                x: Y.usedWidth,\n                texture: Y,\n                level: p,\n                scale: I,\n                width: M,\n                height: R,\n                scaledLabelShown: at\n              }, Y.usedWidth += Math.ceil(M + 8), Y.eleCaches.push(V), v.checkTextureFullness(Y), V;\n            }, l.invalidateElement = function(h) {\n              var i = h._private.rscratch.imgCaches;\n              if (i)\n                for (var d = -4; d <= 2; d++) {\n                  var p = i[d];\n                  if (p) {\n                    var f = p.texture;\n                    f.invalidatedWidth += p.width, i[d] = null, c.removeFromArray(f.eleCaches, p), this.removeFromQueue(h), this.checkTextureUtility(f);\n                  }\n                }\n            }, l.checkTextureUtility = function(h) {\n              h.invalidatedWidth >= 0.5 * h.width && this.retireTexture(h);\n            }, l.checkTextureFullness = function(h) {\n              var i = this.getTextureQueue(h.height);\n              h.usedWidth / h.width > 0.8 && h.fullnessChecks >= 10 ? c.removeFromArray(i, h) : h.fullnessChecks++;\n            }, l.retireTexture = function(h) {\n              var i = h.height, d = this.getTextureQueue(i);\n              c.removeFromArray(d, h), h.retired = !0;\n              for (var p = h.eleCaches, f = 0; f < p.length; f++) {\n                var v = p[f], k = v.ele, s = v.level, S = k._private.rscratch.imgCaches;\n                S && (S[s] = null);\n              }\n              c.clearArray(p), this.getRetiredTextureQueue(i).push(h);\n            }, l.addTexture = function(h, i) {\n              var d = {};\n              return this.getTextureQueue(h).push(d), d.eleCaches = [], d.height = h, d.width = Math.max(1024, i), d.usedWidth = 0, d.invalidatedWidth = 0, d.fullnessChecks = 0, d.canvas = document.createElement(\"canvas\"), d.canvas.width = d.width, d.canvas.height = d.height, d.context = d.canvas.getContext(\"2d\"), d;\n            }, l.recycleTexture = function(h, i) {\n              for (var d = this.getTextureQueue(h), p = this.getRetiredTextureQueue(h), f = 0; f < p.length; f++) {\n                var v = p[f];\n                if (v.width >= i)\n                  return v.retired = !1, v.usedWidth = 0, v.invalidatedWidth = 0, v.fullnessChecks = 0, c.clearArray(v.eleCaches), v.context.setTransform(1, 0, 0, 1, 0, 0), v.context.clearRect(0, 0, v.width, v.height), c.removeFromArray(p, v), d.push(v), v;\n              }\n            }, l.queueElement = function(h, i) {\n              var d = this.getElementQueue(), p = this.getElementIdToQueue(), f = h.id(), v = p[f];\n              if (v)\n                v.level = Math.max(v.level, i), v.reqs++, d.updateItem(v);\n              else {\n                var k = { ele: h, level: i, reqs: 1 };\n                d.push(k), p[f] = k;\n              }\n            }, l.dequeue = function(h) {\n              for (var i = this.getElementQueue(), d = this.getElementIdToQueue(), p = [], f = 0; f < 1 && i.size() > 0; f++) {\n                var v = i.pop(), k = v.ele;\n                if (k._private.rscratch.imgCaches[v.level] == null) {\n                  d[k.id()] = null, p.push(v);\n                  var s = k.boundingBox();\n                  this.getElement(k, s, h, v.level, t.dequeue);\n                }\n              }\n              return p;\n            }, l.removeFromQueue = function(h) {\n              var i = this.getElementQueue(), d = this.getElementIdToQueue(), p = d[h.id()];\n              p != null && (p.reqs = c.MAX_INT, i.updateItem(p), i.pop(), d[h.id()] = null);\n            }, l.onDequeue = function(h) {\n              this.onDequeues.push(h);\n            }, l.offDequeue = function(h) {\n              c.removeFromArray(this.onDequeues, h);\n            }, l.setupDequeueing = n.setupDequeueing({\n              deqRedrawThreshold: 100,\n              deqCost: 0.15,\n              deqAvgCost: 0.1,\n              deqNoDrawCost: 0.9,\n              deqFastCost: 0.9,\n              deq: function(h, i, d) {\n                return h.dequeue(i, d);\n              },\n              onDeqd: function(h, i) {\n                for (var d = 0; d < h.onDequeues.length; d++)\n                  (0, h.onDequeues[d])(i);\n              },\n              shouldRedraw: function(h, i, d, p) {\n                for (var f = 0; f < i.length; f++) {\n                  var v = i[f].ele.boundingBox();\n                  if (o.boundingBoxesIntersect(v, p)) return !0;\n                }\n                return !1;\n              },\n              priority: function(h) {\n                return h.renderer.beforeRenderPriorities.eleTxrDeq;\n              }\n            }), y.exports = r;\n          },\n          function(y, x, g) {\n            var o = g(1), c = g(2), a = g(9), n = g(0), t = g(19), r = function(p, f) {\n              var v = this, k = v.renderer = p;\n              v.layersByLevel = {}, v.firstGet = !0, v.lastInvalidationTime = o.performanceNow() - 500, v.skipping = !1, k.beforeRender(function(s, S) {\n                S - v.lastInvalidationTime <= 250 ? v.skipping = !0 : v.skipping = !1;\n              }), v.layersQueue = new a(function(s, S) {\n                return S.reqs - s.reqs;\n              }), v.eleTxrCache = f, v.setupEleCacheInvalidation(), v.setupDequeueing();\n            }, l = r.prototype, h = 0, i = Math.pow(2, 53) - 1;\n            function d(p, f) {\n              p.imageSmoothingEnabled != null ? p.imageSmoothingEnabled = f : (p.webkitImageSmoothingEnabled = f, p.mozImageSmoothingEnabled = f, p.msImageSmoothingEnabled = f);\n            }\n            l.makeLayer = function(p, f) {\n              var v = Math.pow(2, f), k = Math.ceil(p.w * v), s = Math.ceil(p.h * v), S = document.createElement(\"canvas\");\n              S.width = k, S.height = s;\n              var j = {\n                id: h = ++h % i,\n                bb: p,\n                level: f,\n                width: k,\n                height: s,\n                canvas: S,\n                context: S.getContext(\"2d\"),\n                eles: [],\n                elesQueue: [],\n                reqs: 0\n              }, I = j.context, R = -j.bb.x1, M = -j.bb.y1;\n              return I.scale(v, v), I.translate(R, M), j;\n            }, l.getLayers = function(p, f, v) {\n              var k = this, s = k.renderer.cy.zoom(), S = k.firstGet;\n              if (k.firstGet = !1, v == null) {\n                if ((v = Math.ceil(c.log2(s * f))) < -4) v = -4;\n                else if (s >= 3.99 || v > 2) return null;\n              }\n              k.validateLayersElesOrdering(v, p);\n              var j, I, R = k.layersByLevel, M = Math.pow(2, v), z = R[v] = R[v] || [];\n              if (k.levelIsComplete(v, p)) return z;\n              (function() {\n                var ot = function(zt) {\n                  if (k.validateLayersElesOrdering(zt, p), k.levelIsComplete(zt, p))\n                    return I = R[zt], !0;\n                }, gt = function(zt) {\n                  if (!I)\n                    for (var Nt = v + zt; -4 <= Nt && Nt <= 2 && !ot(Nt); Nt += zt) ;\n                };\n                gt(1), gt(-1);\n                for (var xt = z.length - 1; xt >= 0; xt--) {\n                  var St = z[xt];\n                  St.invalid && o.removeFromArray(z, St);\n                }\n              })();\n              var V = function(ot) {\n                var gt = (ot = ot || {}).after;\n                if (function() {\n                  if (!j) {\n                    j = c.makeBoundingBox();\n                    for (var zt = 0; zt < p.length; zt++)\n                      c.updateBoundingBox(j, p[zt].boundingBox());\n                  }\n                }(), j.w * M * (j.h * M) > 16e6)\n                  return null;\n                var xt = k.makeLayer(j, v);\n                if (gt != null) {\n                  var St = z.indexOf(gt) + 1;\n                  z.splice(St, 0, xt);\n                } else (ot.insert === void 0 || ot.insert) && z.unshift(xt);\n                return xt;\n              };\n              if (k.skipping && !S) return null;\n              for (var G = null, Y = p.length / 1, tt = !S, Z = 0; Z < p.length; Z++) {\n                var at = p[Z], nt = at._private.rscratch, ht = nt.imgLayerCaches = nt.imgLayerCaches || {}, ct = ht[v];\n                if (ct) G = ct;\n                else {\n                  if ((!G || G.eles.length >= Y || !c.boundingBoxInBoundingBox(G.bb, at.boundingBox())) && !(G = V({ insert: !0, after: G })))\n                    return null;\n                  I || tt ? k.queueLayer(G, at) : k.drawEleInLayer(G, at, v, f), G.eles.push(at), ht[v] = G;\n                }\n              }\n              return I || (tt ? null : z);\n            }, l.getEleLevelForLayerLevel = function(p, f) {\n              return p;\n            }, l.drawEleInLayer = function(p, f, v, k) {\n              var s = this.renderer, S = p.context, j = f.boundingBox();\n              if (j.w !== 0 && j.h !== 0 && f.visible()) {\n                var I = this.eleTxrCache, R = I.reasons.highQuality;\n                v = this.getEleLevelForLayerLevel(v, k);\n                var M = I.getElement(f, j, null, v, R);\n                M ? (d(S, !1), S.drawImage(\n                  M.texture.canvas,\n                  M.x,\n                  0,\n                  M.width,\n                  M.height,\n                  j.x1,\n                  j.y1,\n                  j.w,\n                  j.h\n                ), d(S, !0)) : s.drawElement(S, f);\n              }\n            }, l.levelIsComplete = function(p, f) {\n              var v = this.layersByLevel[p];\n              if (!v || v.length === 0) return !1;\n              for (var k = 0, s = 0; s < v.length; s++) {\n                var S = v[s];\n                if (S.reqs > 0 || S.invalid) return !1;\n                k += S.eles.length;\n              }\n              return k === f.length;\n            }, l.validateLayersElesOrdering = function(p, f) {\n              var v = this.layersByLevel[p];\n              if (v)\n                for (var k = 0; k < v.length; k++) {\n                  for (var s = v[k], S = -1, j = 0; j < f.length; j++)\n                    if (s.eles[0] === f[j]) {\n                      S = j;\n                      break;\n                    }\n                  if (S < 0) this.invalidateLayer(s);\n                  else {\n                    var I = S;\n                    for (j = 0; j < s.eles.length; j++)\n                      if (s.eles[j] !== f[I + j]) {\n                        this.invalidateLayer(s);\n                        break;\n                      }\n                  }\n                }\n            }, l.updateElementsInLayers = function(p, f) {\n              for (var v = n.element(p[0]), k = 0; k < p.length; k++)\n                for (var s = v ? null : p[k], S = v ? p[k] : p[k].ele, j = S._private.rscratch, I = j.imgLayerCaches = j.imgLayerCaches || {}, R = -4; R <= 2; R++) {\n                  var M = I[R];\n                  M && (s && this.getEleLevelForLayerLevel(M.level) !== s.level || f(M, S, s));\n                }\n            }, l.haveLayers = function() {\n              for (var p = !1, f = -4; f <= 2; f++) {\n                var v = this.layersByLevel[f];\n                if (v && v.length > 0) {\n                  p = !0;\n                  break;\n                }\n              }\n              return p;\n            }, l.invalidateElements = function(p) {\n              var f = this;\n              f.lastInvalidationTime = o.performanceNow(), p.length !== 0 && f.haveLayers() && f.updateElementsInLayers(p, function(v, k, s) {\n                f.invalidateLayer(v);\n              });\n            }, l.invalidateLayer = function(p) {\n              if (this.lastInvalidationTime = o.performanceNow(), !p.invalid) {\n                var f = p.level, v = p.eles, k = this.layersByLevel[f];\n                o.removeFromArray(k, p), p.elesQueue = [], p.invalid = !0, p.replacement && (p.replacement.invalid = !0);\n                for (var s = 0; s < v.length; s++) {\n                  var S = v[s]._private.rscratch.imgLayerCaches;\n                  S && (S[f] = null);\n                }\n              }\n            }, l.refineElementTextures = function(p) {\n              var f = this;\n              f.updateElementsInLayers(p, function(v, k, s) {\n                var S = v.replacement;\n                if (S || ((S = v.replacement = f.makeLayer(v.bb, v.level)).replaces = v, S.eles = v.eles), !S.reqs)\n                  for (var j = 0; j < S.eles.length; j++)\n                    f.queueLayer(S, S.eles[j]);\n              });\n            }, l.setupEleCacheInvalidation = function() {\n              var p = this, f = [], v = o.debounce(function() {\n                p.refineElementTextures(f), f = [];\n              }, 50);\n              p.eleTxrCache.onDequeue(function(k) {\n                for (var s = 0; s < k.length; s++) f.push(k[s]);\n                v();\n              });\n            }, l.queueLayer = function(p, f) {\n              var v = this.layersQueue, k = p.elesQueue, s = k.hasId = k.hasId || {};\n              if (!p.replacement) {\n                if (f) {\n                  if (s[f.id()]) return;\n                  k.push(f), s[f.id()] = !0;\n                }\n                p.reqs ? (p.reqs++, v.updateItem(p)) : (p.reqs = 1, v.push(p));\n              }\n            }, l.dequeue = function(p) {\n              for (var f = this.layersQueue, v = [], k = 0; k < 1 && f.size() !== 0; ) {\n                var s = f.peek();\n                if (s.replacement) f.pop();\n                else if (s.replaces && s !== s.replaces.replacement)\n                  f.pop();\n                else if (s.invalid) f.pop();\n                else {\n                  var S = s.elesQueue.shift();\n                  S && (this.drawEleInLayer(s, S, s.level, p), k++), v.length === 0 && v.push(!0), s.elesQueue.length === 0 && (f.pop(), s.reqs = 0, s.replaces && this.applyLayerReplacement(s), this.requestRedraw());\n                }\n              }\n              return v;\n            }, l.applyLayerReplacement = function(p) {\n              var f = this.layersByLevel[p.level], v = p.replaces, k = f.indexOf(v);\n              if (!(k < 0 || v.invalid)) {\n                f[k] = p;\n                for (var s = 0; s < p.eles.length; s++) {\n                  var S = p.eles[s]._private, j = S.imgLayerCaches = S.imgLayerCaches || {};\n                  j && (j[p.level] = p);\n                }\n                this.requestRedraw();\n              }\n            }, l.requestRedraw = o.debounce(function() {\n              var p = this.renderer;\n              p.redrawHint(\"eles\", !0), p.redrawHint(\"drag\", !0), p.redraw();\n            }, 100), l.setupDequeueing = t.setupDequeueing({\n              deqRedrawThreshold: 50,\n              deqCost: 0.15,\n              deqAvgCost: 0.1,\n              deqNoDrawCost: 0.9,\n              deqFastCost: 0.9,\n              deq: function(p, f) {\n                return p.dequeue(f);\n              },\n              onDeqd: o.noop,\n              shouldRedraw: o.trueify,\n              priority: function(p) {\n                return p.renderer.beforeRenderPriorities.lyrTxrDeq;\n              }\n            }), y.exports = r;\n          },\n          function(y, x, g) {\n            var o, c = {\n              arrowShapeImpl: function(a) {\n                return (o || (o = {\n                  polygon: function(n, t) {\n                    for (var r = 0; r < t.length; r++) {\n                      var l = t[r];\n                      n.lineTo(l.x, l.y);\n                    }\n                  },\n                  \"triangle-backcurve\": function(n, t, r) {\n                    for (var l, h = 0; h < t.length; h++) {\n                      var i = t[h];\n                      h === 0 && (l = i), n.lineTo(i.x, i.y);\n                    }\n                    n.quadraticCurveTo(r.x, r.y, l.x, l.y);\n                  },\n                  \"triangle-tee\": function(n, t, r) {\n                    n.beginPath && n.beginPath();\n                    for (var l = t, h = 0; h < l.length; h++) {\n                      var i = l[h];\n                      n.lineTo(i.x, i.y);\n                    }\n                    n.closePath && n.closePath(), n.beginPath && n.beginPath();\n                    var d = r, p = r[0];\n                    for (n.moveTo(p.x, p.y), h = 0; h < d.length; h++)\n                      i = d[h], n.lineTo(i.x, i.y);\n                    n.closePath && n.closePath();\n                  },\n                  \"triangle-cross\": function(n, t, r) {\n                    n.beginPath && n.beginPath();\n                    for (var l = t, h = 0; h < l.length; h++) {\n                      var i = l[h];\n                      n.lineTo(i.x, i.y);\n                    }\n                    n.closePath && n.closePath(), n.beginPath && n.beginPath();\n                    var d = r, p = r[0];\n                    for (n.moveTo(p.x, p.y), h = 0; h < d.length; h++)\n                      i = d[h], n.lineTo(i.x, i.y);\n                    n.closePath && n.closePath();\n                  },\n                  circle: function(n, t, r, l) {\n                    n.arc(t, r, l, 0, 2 * Math.PI, !1);\n                  }\n                }))[a];\n              }\n            };\n            y.exports = c;\n          },\n          function(y, x, g) {\n            var o = g(2), c = {\n              drawElement: function(a, n, t, r) {\n                n.isNode() ? this.drawNode(a, n, t, r) : this.drawEdge(a, n, t, r);\n              },\n              drawCachedElement: function(a, n, t, r) {\n                var l = n.boundingBox();\n                if (l.w !== 0 && l.h !== 0 && (!r || o.boundingBoxesIntersect(l, r))) {\n                  var h = this.data.eleTxrCache.getElement(n, l, t);\n                  h != null ? a.drawImage(\n                    h.texture.canvas,\n                    h.x,\n                    0,\n                    h.width,\n                    h.height,\n                    l.x1,\n                    l.y1,\n                    l.w,\n                    l.h\n                  ) : this.drawElement(a, n);\n                }\n              },\n              drawElements: function(a, n) {\n                for (var t = 0; t < n.length; t++) {\n                  var r = n[t];\n                  this.drawElement(a, r);\n                }\n              },\n              drawCachedElements: function(a, n, t, r) {\n                for (var l = 0; l < n.length; l++) {\n                  var h = n[l];\n                  this.drawCachedElement(a, h, t, r);\n                }\n              },\n              drawCachedNodes: function(a, n, t, r) {\n                for (var l = 0; l < n.length; l++) {\n                  var h = n[l];\n                  h.isNode() && this.drawCachedElement(a, h, t, r);\n                }\n              },\n              drawLayeredElements: function(a, n, t, r) {\n                var l = this.data.lyrTxrCache.getLayers(n, t);\n                if (l)\n                  for (var h = 0; h < l.length; h++) {\n                    var i = l[h], d = i.bb;\n                    d.w !== 0 && d.h !== 0 && a.drawImage(i.canvas, d.x1, d.y1, d.w, d.h);\n                  }\n                else this.drawCachedElements(a, n, t, r);\n              },\n              drawDebugPoints: function(a, n) {\n                for (var t = function(f, v, k) {\n                  a.fillStyle = k, a.fillRect(f - 1, v - 1, 3, 3);\n                }, r = 0; r < n.length; r++) {\n                  var l = n[r], h = l._private.rscratch;\n                  if (l.isNode()) {\n                    var i = l.position();\n                    t(i.x, i.y, \"magenta\");\n                  } else {\n                    for (var d = h.allpts, p = 0; p + 1 < d.length; p += 2)\n                      t(d[p], d[p + 1], \"cyan\");\n                    t(h.midX, h.midY, \"yellow\");\n                  }\n                }\n              }\n            };\n            y.exports = c;\n          },\n          function(y, x, g) {\n            var o = {\n              drawEdge: function(c, a, n, t) {\n                var r = this, l = a._private.rscratch, h = r.usePaths();\n                if (a.visible() && !l.badLine && l.allpts != null && !isNaN(l.allpts[0])) {\n                  var i = void 0;\n                  n && (i = n, c.translate(-i.x1, -i.y1));\n                  var d = 2 * a.pstyle(\"overlay-padding\").pfValue, p = a.pstyle(\"overlay-opacity\").value, f = a.pstyle(\"overlay-color\").value, v = a.pstyle(\"line-color\").value, k = a.pstyle(\"opacity\").value, s = a.pstyle(\"line-style\").value, S = a.pstyle(\"width\").pfValue, j = function() {\n                    var G = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : k;\n                    c.lineWidth = S, c.lineCap = \"butt\", r.strokeStyle(c, v[0], v[1], v[2], G), r.drawEdgePath(a, c, l.allpts, s);\n                  }, I = function() {\n                    var G = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : k;\n                    r.drawArrowheads(c, a, G);\n                  };\n                  if (c.lineJoin = \"round\", a.pstyle(\"ghost\").value === \"yes\") {\n                    var R = a.pstyle(\"ghost-offset-x\").pfValue, M = a.pstyle(\"ghost-offset-y\").pfValue, z = a.pstyle(\"ghost-opacity\").value, V = k * z;\n                    c.translate(R, M), j(V), I(V), c.translate(-R, -M);\n                  }\n                  j(), I(), function() {\n                    var G = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : p;\n                    c.lineWidth = d, l.edgeType !== \"self\" || h ? c.lineCap = \"round\" : c.lineCap = \"butt\", r.strokeStyle(c, f[0], f[1], f[2], G), r.drawEdgePath(a, c, l.allpts, \"solid\");\n                  }(), r.drawElementText(c, a, t), n && c.translate(i.x1, i.y1);\n                }\n              },\n              drawEdgePath: function(c, a, n, t) {\n                var r = c._private.rscratch, l = a, h = void 0, i = !1, d = this.usePaths();\n                if (d) {\n                  var p = n.join(\"$\");\n                  r.pathCacheKey && r.pathCacheKey === p ? (h = a = r.pathCache, i = !0) : (h = a = new Path2D(), r.pathCacheKey = p, r.pathCache = h);\n                }\n                if (l.setLineDash)\n                  switch (t) {\n                    case \"dotted\":\n                      l.setLineDash([1, 1]);\n                      break;\n                    case \"dashed\":\n                      l.setLineDash([6, 3]);\n                      break;\n                    case \"solid\":\n                      l.setLineDash([]);\n                  }\n                if (!i && !r.badLine)\n                  switch (a.beginPath && a.beginPath(), a.moveTo(n[0], n[1]), r.edgeType) {\n                    case \"bezier\":\n                    case \"self\":\n                    case \"compound\":\n                    case \"multibezier\":\n                      if (c.hasClass(\"horizontal\")) {\n                        var f = n[4], v = n[5], k = (n[0] + n[4]) / 2;\n                        a.lineTo(n[0] + 10, n[1]), a.bezierCurveTo(k, n[1], k, n[5], n[4] - 10, n[5]), a.lineTo(f, v);\n                      } else if (c.hasClass(\"vertical\")) {\n                        var s = n[4], S = n[5], j = (n[1] + n[5]) / 2;\n                        a.bezierCurveTo(n[0], j, n[4], j, n[4], n[5] - 10), a.lineTo(s, S);\n                      } else\n                        for (var I = 2; I + 3 < n.length; I += 4)\n                          a.quadraticCurveTo(\n                            n[I],\n                            n[I + 1],\n                            n[I + 2],\n                            n[I + 3]\n                          );\n                      break;\n                    case \"straight\":\n                    case \"segments\":\n                    case \"haystack\":\n                      for (var R = 2; R + 1 < n.length; R += 2)\n                        a.lineTo(n[R], n[R + 1]);\n                  }\n                a = l, d ? a.stroke(h) : a.stroke(), a.setLineDash && a.setLineDash([]);\n              },\n              drawArrowheads: function(c, a, n) {\n                var t = a._private.rscratch, r = t.edgeType === \"haystack\";\n                r || this.drawArrowhead(\n                  c,\n                  a,\n                  \"source\",\n                  t.arrowStartX,\n                  t.arrowStartY,\n                  t.srcArrowAngle,\n                  n\n                ), this.drawArrowhead(\n                  c,\n                  a,\n                  \"mid-target\",\n                  t.midX,\n                  t.midY,\n                  t.midtgtArrowAngle,\n                  n\n                ), this.drawArrowhead(\n                  c,\n                  a,\n                  \"mid-source\",\n                  t.midX,\n                  t.midY,\n                  t.midsrcArrowAngle,\n                  n\n                ), r || (a.hasClass(\"horizontal\") ? this.drawArrowhead(\n                  c,\n                  a,\n                  \"target\",\n                  t.arrowEndX,\n                  t.arrowEndY,\n                  -Math.PI / 2,\n                  n\n                ) : a.hasClass(\"vertical\") ? this.drawArrowhead(\n                  c,\n                  a,\n                  \"target\",\n                  t.arrowEndX,\n                  t.arrowEndY,\n                  0,\n                  n\n                ) : this.drawArrowhead(\n                  c,\n                  a,\n                  \"target\",\n                  t.arrowEndX,\n                  t.arrowEndY,\n                  t.tgtArrowAngle,\n                  n\n                ));\n              },\n              drawArrowhead: function(c, a, n, t, r, l, h) {\n                if (!(isNaN(t) || t == null || isNaN(r) || r == null || isNaN(l) || l == null)) {\n                  var i = a.pstyle(n + \"-arrow-shape\").value;\n                  if (i !== \"none\") {\n                    var d = a.pstyle(n + \"-arrow-fill\").value === \"hollow\" ? \"both\" : \"filled\", p = a.pstyle(n + \"-arrow-fill\").value, f = a.pstyle(\"width\").pfValue, v = a.pstyle(\"opacity\").value;\n                    h === void 0 && (h = v);\n                    var k = c.globalCompositeOperation;\n                    h === 1 && p !== \"hollow\" || (c.globalCompositeOperation = \"destination-out\", this.fillStyle(c, 255, 255, 255, 1), this.strokeStyle(c, 255, 255, 255, 1), this.drawArrowShape(a, n, c, d, f, i, t, r, l), c.globalCompositeOperation = k);\n                    var s = a.pstyle(n + \"-arrow-color\").value;\n                    this.fillStyle(c, s[0], s[1], s[2], h), this.strokeStyle(c, s[0], s[1], s[2], h), this.drawArrowShape(a, n, c, p, f, i, t, r, l);\n                  }\n                }\n              },\n              drawArrowShape: function(c, a, n, t, r, l, h, i, d) {\n                var p = this.usePaths(), f = c._private.rscratch, v = !1, k = void 0, s = n, S = { x: h, y: i }, j = c.pstyle(\"arrow-scale\").value, I = this.getArrowWidth(r, j), R = this.arrowShapes[l];\n                if (p) {\n                  var M = I + \"$\" + l + \"$\" + d + \"$\" + h + \"$\" + i;\n                  f.arrowPathCacheKey = f.arrowPathCacheKey || {}, f.arrowPathCache = f.arrowPathCache || {}, f.arrowPathCacheKey[a] === M ? (k = n = f.arrowPathCache[a], v = !0) : (k = n = new Path2D(), f.arrowPathCacheKey[a] = M, f.arrowPathCache[a] = k);\n                }\n                n.beginPath && n.beginPath(), v || R.draw(n, I, d, S, r), !R.leavePathOpen && n.closePath && n.closePath(), n = s, t !== \"filled\" && t !== \"both\" || (p ? n.fill(k) : n.fill()), t !== \"hollow\" && t !== \"both\" || (n.lineWidth = R.matchEdgeWidth ? r : 1, n.lineJoin = \"miter\", p ? n.stroke(k) : n.stroke());\n              }\n            };\n            y.exports = o;\n          },\n          function(y, x, g) {\n            var o = {\n              safeDrawImage: function(c, a, n, t, r, l, h, i, d, p) {\n                r <= 0 || l <= 0 || d <= 0 || p <= 0 || c.drawImage(a, n, t, r, l, h, i, d, p);\n              },\n              drawInscribedImage: function(c, a, n, t, r) {\n                var l = this, h = n.position(), i = h.x, d = h.y, p = n.cy().style(), f = p.getIndexedStyle.bind(p), v = f(n, \"background-fit\", \"value\", t), k = f(n, \"background-repeat\", \"value\", t), s = n.width(), S = n.height(), j = 2 * n.padding(), I = s + (f(n, \"background-width-relative-to\", \"value\", t) === \"inner\" ? 0 : j), R = S + (f(n, \"background-height-relative-to\", \"value\", t) === \"inner\" ? 0 : j), M = n._private.rscratch, z = n.pstyle(\"background-clip\").value === \"node\", V = f(n, \"background-image-opacity\", \"value\", t) * r, G = a.width || a.cachedW, Y = a.height || a.cachedH;\n                G != null && Y != null || (document.body.appendChild(a), G = a.cachedW = a.width || a.offsetWidth, Y = a.cachedH = a.height || a.offsetHeight, document.body.removeChild(a));\n                var tt = G, Z = Y;\n                if (f(n, \"background-width\", \"value\", t) !== \"auto\" && (tt = f(n, \"background-width\", \"units\", t) === \"%\" ? f(n, \"background-width\", \"pfValue\", t) * I : f(n, \"background-width\", \"pfValue\", t)), f(n, \"background-height\", \"value\", t) !== \"auto\" && (Z = f(n, \"background-height\", \"units\", t) === \"%\" ? f(n, \"background-height\", \"pfValue\", t) * R : f(n, \"background-height\", \"pfValue\", t)), tt !== 0 && Z !== 0) {\n                  if (v === \"contain\")\n                    tt *= at = Math.min(I / tt, R / Z), Z *= at;\n                  else if (v === \"cover\") {\n                    var at;\n                    tt *= at = Math.max(I / tt, R / Z), Z *= at;\n                  }\n                  var nt = i - I / 2;\n                  f(n, \"background-position-x\", \"units\", t) === \"%\" ? nt += (I - tt) * f(n, \"background-position-x\", \"pfValue\", t) : nt += f(n, \"background-position-x\", \"pfValue\", t);\n                  var ht = d - R / 2;\n                  f(n, \"background-position-y\", \"units\", t) === \"%\" ? ht += (R - Z) * f(n, \"background-position-y\", \"pfValue\", t) : ht += f(n, \"background-position-y\", \"pfValue\", t), M.pathCache && (nt -= i, ht -= d, i = 0, d = 0);\n                  var ct = c.globalAlpha;\n                  if (c.globalAlpha = V, k === \"no-repeat\")\n                    z && (c.save(), M.pathCache ? c.clip(M.pathCache) : (l.nodeShapes[l.getNodeShape(n)].draw(\n                      c,\n                      i,\n                      d,\n                      I,\n                      R\n                    ), c.clip())), l.safeDrawImage(c, a, 0, 0, G, Y, nt, ht, tt, Z), z && c.restore();\n                  else {\n                    var ot = c.createPattern(a, k);\n                    c.fillStyle = ot, l.nodeShapes[l.getNodeShape(n)].draw(c, i, d, I, R), c.translate(nt, ht), c.fill(), c.translate(-nt, -ht);\n                  }\n                  c.globalAlpha = ct;\n                }\n              }\n            };\n            y.exports = o;\n          },\n          function(y, x, g) {\n            var o = g(1), c = g(2), a = {\n              eleTextBiggerThanMin: function(n, t) {\n                if (!t) {\n                  var r = n.cy().zoom(), l = this.getPixelRatio(), h = Math.ceil(c.log2(r * l));\n                  t = Math.pow(2, h);\n                }\n                return !(n.pstyle(\"font-size\").pfValue * t < n.pstyle(\"min-zoomed-font-size\").pfValue);\n              },\n              drawElementText: function(n, t, r) {\n                var l = this;\n                if (r === void 0) {\n                  if (!l.eleTextBiggerThanMin(t)) return;\n                } else if (!r) return;\n                if (t.isNode()) {\n                  if (!(i = t.pstyle(\"label\")) || !i.value) return;\n                  var h = t.pstyle(\"text-halign\").strValue;\n                  switch (t.pstyle(\"text-valign\").strValue, h) {\n                    case \"left\":\n                      n.textAlign = \"right\";\n                      break;\n                    case \"right\":\n                      n.textAlign = \"left\";\n                      break;\n                    default:\n                      n.textAlign = \"center\";\n                  }\n                  n.textBaseline = \"bottom\";\n                } else {\n                  var i = t.pstyle(\"label\"), d = t.pstyle(\"source-label\"), p = t.pstyle(\"target-label\");\n                  if (!(i && i.value || d && d.value || p && p.value))\n                    return;\n                  n.textAlign = \"center\", n.textBaseline = \"bottom\";\n                }\n                l.drawText(n, t), t.isEdge() && (l.drawText(n, t, \"source\"), l.drawText(n, t, \"target\"));\n              }\n            };\n            a.drawNodeText = a.drawEdgeText = a.drawElementText, a.getFontCache = function(n) {\n              var t;\n              this.fontCaches = this.fontCaches || [];\n              for (var r = 0; r < this.fontCaches.length; r++)\n                if ((t = this.fontCaches[r]).context === n) return t;\n              return t = { context: n }, this.fontCaches.push(t), t;\n            }, a.setupTextStyle = function(n, t) {\n              var r = t.effectiveOpacity(), l = t.pstyle(\"font-style\").strValue, h = t.pstyle(\"font-size\").pfValue + \"px\", i = t.pstyle(\"font-family\").strValue, d = t.pstyle(\"font-weight\").strValue, p = t.pstyle(\"text-opacity\").value * t.pstyle(\"opacity\").value * r, f = t.pstyle(\"text-outline-opacity\").value * p, v = t.pstyle(\"color\").value, k = t.pstyle(\"text-outline-color\").value, s = t._private.fontKey, S = this.getFontCache(n);\n              S.key !== s && (n.font = l + \" \" + d + \" \" + h + \" \" + i, S.key = s), n.lineJoin = \"round\", this.fillStyle(n, v[0], v[1], v[2], p), this.strokeStyle(n, k[0], k[1], k[2], f);\n            }, a.drawText = function(n, t, r) {\n              var l = t._private.rscratch, h = t.effectiveOpacity();\n              if (h !== 0 && t.pstyle(\"text-opacity\").value !== 0) {\n                var i, d, p, f, v, k, s = o.getPrefixedProperty(l, \"labelX\", r), S = o.getPrefixedProperty(l, \"labelY\", r), j = this.getLabelText(t, r);\n                if (j != null && j !== \"\" && !isNaN(s) && !isNaN(S)) {\n                  this.setupTextStyle(n, t);\n                  var I = r ? r + \"-\" : \"\", R = o.getPrefixedProperty(l, \"labelWidth\", r), M = o.getPrefixedProperty(l, \"labelHeight\", r), z = o.getPrefixedProperty(l, \"labelAngle\", r), V = t.pstyle(I + \"text-margin-x\").pfValue, G = t.pstyle(I + \"text-margin-y\").pfValue, Y = t.isEdge(), tt = (t.isNode(), t.pstyle(\"text-halign\").value), Z = t.pstyle(\"text-valign\").value;\n                  Y && (tt = \"center\", Z = \"center\"), s += V, S += G;\n                  var at, nt = t.pstyle(\"text-rotation\");\n                  if ((at = nt.strValue === \"autorotate\" ? Y ? z : 0 : nt.strValue === \"none\" ? 0 : nt.pfValue) !== 0) {\n                    var ht = s, ct = S;\n                    n.translate(ht, ct), n.rotate(at), s = 0, S = 0;\n                  }\n                  switch (Z) {\n                    case \"top\":\n                      break;\n                    case \"center\":\n                      S += M / 2;\n                      break;\n                    case \"bottom\":\n                      S += M;\n                  }\n                  var ot = t.pstyle(\"text-background-opacity\").value, gt = t.pstyle(\"text-border-opacity\").value, xt = t.pstyle(\"text-border-width\").pfValue, St = t.pstyle(\"text-background-padding\").pfValue;\n                  if (ot > 0 || xt > 0 && gt > 0) {\n                    var zt = s - St;\n                    switch (tt) {\n                      case \"left\":\n                        zt -= R;\n                        break;\n                      case \"center\":\n                        zt -= R / 2;\n                    }\n                    var Nt = S - M - St, re = R + 2 * St, be = M + 2 * St;\n                    if (ot > 0) {\n                      var ne = n.fillStyle, ce = t.pstyle(\"text-background-color\").value;\n                      n.fillStyle = \"rgba(\" + ce[0] + \",\" + ce[1] + \",\" + ce[2] + \",\" + ot * h + \")\", t.pstyle(\"text-background-shape\").strValue == \"roundrectangle\" ? (d = zt, p = Nt, f = re, v = be, k = (k = 2) || 5, (i = n).beginPath(), i.moveTo(d + k, p), i.lineTo(d + f - k, p), i.quadraticCurveTo(d + f, p, d + f, p + k), i.lineTo(d + f, p + v - k), i.quadraticCurveTo(\n                        d + f,\n                        p + v,\n                        d + f - k,\n                        p + v\n                      ), i.lineTo(d + k, p + v), i.quadraticCurveTo(d, p + v, d, p + v - k), i.lineTo(d, p + k), i.quadraticCurveTo(d, p, d + k, p), i.closePath(), i.fill()) : n.fillRect(zt, Nt, re, be), n.fillStyle = ne;\n                    }\n                    if (xt > 0 && gt > 0) {\n                      var xe = n.strokeStyle, we = n.lineWidth, ae = t.pstyle(\"text-border-color\").value, Le = t.pstyle(\"text-border-style\").value;\n                      if (n.strokeStyle = \"rgba(\" + ae[0] + \",\" + ae[1] + \",\" + ae[2] + \",\" + gt * h + \")\", n.lineWidth = xt, n.setLineDash)\n                        switch (Le) {\n                          case \"dotted\":\n                            n.setLineDash([1, 1]);\n                            break;\n                          case \"dashed\":\n                            n.setLineDash([4, 2]);\n                            break;\n                          case \"double\":\n                            n.lineWidth = xt / 4, n.setLineDash([]);\n                            break;\n                          case \"solid\":\n                            n.setLineDash([]);\n                        }\n                      if (n.strokeRect(zt, Nt, re, be), Le === \"double\") {\n                        var lt = xt / 2;\n                        n.strokeRect(zt + lt, Nt + lt, re - 2 * lt, be - 2 * lt);\n                      }\n                      n.setLineDash && n.setLineDash([]), n.lineWidth = we, n.strokeStyle = xe;\n                    }\n                  }\n                  var kt = 2 * t.pstyle(\"text-outline-width\").pfValue;\n                  if (kt > 0 && (n.lineWidth = kt), t.pstyle(\"text-wrap\").value === \"wrap\") {\n                    var Dt = o.getPrefixedProperty(\n                      l,\n                      \"labelWrapCachedLines\",\n                      r\n                    ), yt = M / Dt.length;\n                    switch (Z) {\n                      case \"top\":\n                        S -= (Dt.length - 1) * yt;\n                        break;\n                      case \"center\":\n                      case \"bottom\":\n                        S -= (Dt.length - 1) * yt;\n                    }\n                    for (var ft = 0; ft < Dt.length; ft++)\n                      kt > 0 && n.strokeText(Dt[ft], s, S), n.fillText(Dt[ft], s, S), S += yt;\n                  } else\n                    kt > 0 && n.strokeText(j, s, S), n.fillText(j, s, S);\n                  at !== 0 && (n.rotate(-at), n.translate(-ht, -ct));\n                }\n              }\n            }, y.exports = a;\n          },\n          function(y, x, g) {\n            var o = g(0), c = {\n              drawNode: function(a, n, t, r) {\n                var l, h, i = this, d = n._private, p = d.rscratch, f = n.position();\n                if (o.number(f.x) && o.number(f.y) && n.visible()) {\n                  var v = n.effectiveOpacity(), k = i.usePaths(), s = void 0, S = !1, j = n.padding();\n                  l = n.width() + 2 * j, h = n.height() + 2 * j;\n                  var I = void 0;\n                  t && (I = t, a.translate(-I.x1, -I.y1));\n                  for (var R = n.pstyle(\"background-image\").value, M = new Array(R.length), z = new Array(R.length), V = 0, G = 0; G < R.length; G++) {\n                    var Y = R[G];\n                    if (M[G] = Y != null && Y !== \"none\") {\n                      var tt = n.cy().style().getIndexedStyle(\n                        n,\n                        \"background-image-crossorigin\",\n                        \"value\",\n                        G\n                      );\n                      V++, z[G] = i.getCachedImage(Y, tt, function() {\n                        n.emitAndNotify(\"background\");\n                      });\n                    }\n                  }\n                  var Z = n.pstyle(\"background-blacken\").value, at = n.pstyle(\"border-width\").pfValue, nt = n.pstyle(\"background-color\").value, ht = n.pstyle(\"background-opacity\").value * v, ct = n.pstyle(\"border-color\").value, ot = n.pstyle(\"border-style\").value, gt = n.pstyle(\"border-opacity\").value * v;\n                  a.lineJoin = \"miter\";\n                  var xt = function() {\n                    var Rt = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : ht;\n                    i.fillStyle(a, nt[0], nt[1], nt[2], Rt);\n                  }, St = function() {\n                    var Rt = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : gt;\n                    i.strokeStyle(a, ct[0], ct[1], ct[2], Rt);\n                  }, zt = n.pstyle(\"shape\").strValue, Nt = n.pstyle(\"shape-polygon-points\").pfValue;\n                  if (k) {\n                    var re = zt + \"$\" + l + \"$\" + h + (zt === \"polygon\" ? \"$\" + Nt.join(\"$\") : \"\");\n                    a.translate(f.x, f.y), p.pathCacheKey === re ? (s = p.pathCache, S = !0) : (s = new Path2D(), p.pathCacheKey = re, p.pathCache = s);\n                  }\n                  var be, ne, ce, xe = function() {\n                    if (!S) {\n                      var Rt = f;\n                      k && (Rt = { x: 0, y: 0 }), i.nodeShapes[i.getNodeShape(n)].draw(\n                        s || a,\n                        Rt.x,\n                        Rt.y,\n                        l,\n                        h\n                      );\n                    }\n                    k ? a.fill(s) : a.fill();\n                  }, we = function() {\n                    for (var Rt = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : v, Wt = d.backgrounding, le = 0, ye = 0; ye < z.length; ye++)\n                      M[ye] && z[ye].complete && !z[ye].error && (le++, i.drawInscribedImage(a, z[ye], n, ye, Rt));\n                    d.backgrounding = le !== V, Wt !== d.backgrounding && n.updateStyle(!1);\n                  }, ae = function() {\n                    var Rt = arguments.length > 0 && arguments[0] !== void 0 && arguments[0], Wt = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : v;\n                    i.hasPie(n) && (i.drawPie(a, n, Wt), Rt && (k || i.nodeShapes[i.getNodeShape(n)].draw(\n                      a,\n                      f.x,\n                      f.y,\n                      l,\n                      h\n                    )));\n                  }, Le = function() {\n                    var Rt = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : v, Wt = (Z > 0 ? Z : -Z) * Rt, le = Z > 0 ? 0 : 255;\n                    Z !== 0 && (i.fillStyle(a, le, le, le, Wt), k ? a.fill(s) : a.fill());\n                  }, lt = function() {\n                    if (at > 0) {\n                      if (a.lineWidth = at, a.lineCap = \"butt\", a.setLineDash)\n                        switch (ot) {\n                          case \"dotted\":\n                            a.setLineDash([1, 1]);\n                            break;\n                          case \"dashed\":\n                            a.setLineDash([4, 2]);\n                            break;\n                          case \"solid\":\n                          case \"double\":\n                            a.setLineDash([]);\n                        }\n                      if (k ? a.stroke(s) : a.stroke(), ot === \"double\") {\n                        a.lineWidth = at / 3;\n                        var Rt = a.globalCompositeOperation;\n                        a.globalCompositeOperation = \"destination-out\", k ? a.stroke(s) : a.stroke(), a.globalCompositeOperation = Rt;\n                      }\n                      a.setLineDash && a.setLineDash([]);\n                    }\n                  };\n                  if (n.pstyle(\"ghost\").value === \"yes\") {\n                    var kt = n.pstyle(\"ghost-offset-x\").pfValue, Dt = n.pstyle(\"ghost-offset-y\").pfValue, yt = n.pstyle(\"ghost-opacity\").value, ft = yt * v;\n                    a.translate(kt, Dt), xt(yt * ht), xe(), we(ft), ae(Z !== 0 || at !== 0), Le(ft), St(yt * gt), lt(), a.translate(-kt, -Dt);\n                  }\n                  xt(), xe(), we(), ae(Z !== 0 || at !== 0), Le(), St(), lt(), k && a.translate(-f.x, -f.y), i.drawElementText(a, n, r), be = n.pstyle(\"overlay-padding\").pfValue, ne = n.pstyle(\"overlay-opacity\").value, ce = n.pstyle(\"overlay-color\").value, ne > 0 && (i.fillStyle(a, ce[0], ce[1], ce[2], ne), i.nodeShapes.roundrectangle.draw(\n                    a,\n                    f.x,\n                    f.y,\n                    l + 2 * be,\n                    h + 2 * be\n                  ), a.fill()), t && a.translate(I.x1, I.y1);\n                }\n              },\n              hasPie: function(a) {\n                return (a = a[0])._private.hasPie;\n              },\n              drawPie: function(a, n, t, r) {\n                n = n[0], r = r || n.position();\n                var l = n.cy().style(), h = n.pstyle(\"pie-size\"), i = r.x, d = r.y, p = n.width(), f = n.height(), v = Math.min(p, f) / 2, k = 0;\n                this.usePaths() && (i = 0, d = 0), h.units === \"%\" ? v *= h.pfValue : h.pfValue !== void 0 && (v = h.pfValue / 2);\n                for (var s = 1; s <= l.pieBackgroundN; s++) {\n                  var S = n.pstyle(\"pie-\" + s + \"-background-size\").value, j = n.pstyle(\"pie-\" + s + \"-background-color\").value, I = n.pstyle(\"pie-\" + s + \"-background-opacity\").value * t, R = S / 100;\n                  R + k > 1 && (R = 1 - k);\n                  var M = 1.5 * Math.PI + 2 * Math.PI * k, z = M + 2 * Math.PI * R;\n                  S === 0 || k >= 1 || k + R > 1 || (a.beginPath(), a.moveTo(i, d), a.arc(i, d, v, M, z), a.closePath(), this.fillStyle(a, j[0], j[1], j[2], I), a.fill(), k += R);\n                }\n              }\n            };\n            y.exports = c;\n          },\n          function(y, x, g) {\n            var o = {}, c = g(1);\n            o.getPixelRatio = function() {\n              var a = this.data.contexts[0];\n              if (this.forcedPixelRatio != null) return this.forcedPixelRatio;\n              var n = a.backingStorePixelRatio || a.webkitBackingStorePixelRatio || a.mozBackingStorePixelRatio || a.msBackingStorePixelRatio || a.oBackingStorePixelRatio || a.backingStorePixelRatio || 1;\n              return (window.devicePixelRatio || 1) / n;\n            }, o.paintCache = function(a) {\n              for (var n, t = this.paintCaches = this.paintCaches || [], r = !0, l = 0; l < t.length; l++)\n                if ((n = t[l]).context === a) {\n                  r = !1;\n                  break;\n                }\n              return r && (n = { context: a }, t.push(n)), n;\n            }, o.fillStyle = function(a, n, t, r, l) {\n              a.fillStyle = \"rgba(\" + n + \",\" + t + \",\" + r + \",\" + l + \")\";\n            }, o.strokeStyle = function(a, n, t, r, l) {\n              a.strokeStyle = \"rgba(\" + n + \",\" + t + \",\" + r + \",\" + l + \")\";\n            }, o.matchCanvasSize = function(a) {\n              var n = this, t = n.data, r = n.findContainerClientCoords(), l = r[2], h = r[3], i = n.getPixelRatio(), d = n.motionBlurPxRatio;\n              a !== n.data.bufferCanvases[n.MOTIONBLUR_BUFFER_NODE] && a !== n.data.bufferCanvases[n.MOTIONBLUR_BUFFER_DRAG] || (i = d);\n              var p, f = l * i, v = h * i;\n              if (f !== n.canvasWidth || v !== n.canvasHeight) {\n                n.fontCaches = null;\n                var k = t.canvasContainer;\n                k.style.width = l + \"px\", k.style.height = h + \"px\";\n                for (var s = 0; s < n.CANVAS_LAYERS; s++)\n                  (p = t.canvases[s]).width = f, p.height = v, p.style.width = l + \"px\", p.style.height = h + \"px\";\n                for (s = 0; s < n.BUFFER_COUNT; s++)\n                  (p = t.bufferCanvases[s]).width = f, p.height = v, p.style.width = l + \"px\", p.style.height = h + \"px\";\n                n.textureMult = 1, i <= 1 && (p = t.bufferCanvases[n.TEXTURE_BUFFER], n.textureMult = 2, p.width = f * n.textureMult, p.height = v * n.textureMult), n.canvasWidth = f, n.canvasHeight = v;\n              }\n            }, o.renderTo = function(a, n, t, r) {\n              this.render({\n                forcedContext: a,\n                forcedZoom: n,\n                forcedPan: t,\n                drawAllLayers: !0,\n                forcedPxRatio: r\n              });\n            }, o.render = function(a) {\n              var n = (a = a || c.staticEmptyObject()).forcedContext, t = a.drawAllLayers, r = a.drawOnlyNodeLayer, l = a.forcedZoom, h = a.forcedPan, i = this, d = a.forcedPxRatio === void 0 ? this.getPixelRatio() : a.forcedPxRatio, p = i.cy, f = i.data, v = f.canvasNeedsRedraw, k = i.textureOnViewport && !n && (i.pinching || i.hoverData.dragging || i.swipePanning || i.data.wheelZooming), s = a.motionBlur !== void 0 ? a.motionBlur : i.motionBlur, S = i.motionBlurPxRatio, j = p.hasCompoundNodes(), I = i.hoverData.draggingEles, R = !(!i.hoverData.selecting && !i.touchData.selecting), M = s = s && !n && i.motionBlurEnabled && !R;\n              n || (i.prevPxRatio !== d && (i.invalidateContainerClientCoordsCache(), i.matchCanvasSize(i.container), i.redrawHint(\"eles\", !0), i.redrawHint(\"drag\", !0)), i.prevPxRatio = d), !n && i.motionBlurTimeout && clearTimeout(i.motionBlurTimeout), s && (i.mbFrames == null && (i.mbFrames = 0), i.mbFrames++, i.mbFrames < 3 && (M = !1), i.mbFrames > i.minMbLowQualFrames && (i.motionBlurPxRatio = i.mbPxRBlurry)), i.clearingMotionBlur && (i.motionBlurPxRatio = 1), i.textureDrawLastFrame && !k && (v[i.NODE] = !0, v[i.SELECT_BOX] = !0);\n              var z = p.style()._private.coreStyle, V = p.zoom(), G = l !== void 0 ? l : V, Y = p.pan(), tt = { x: Y.x, y: Y.y }, Z = { zoom: V, pan: { x: Y.x, y: Y.y } }, at = i.prevViewport;\n              at === void 0 || Z.zoom !== at.zoom || Z.pan.x !== at.pan.x || Z.pan.y !== at.pan.y || I && !j || (i.motionBlurPxRatio = 1), h && (tt = h), G *= d, tt.x *= d, tt.y *= d;\n              var nt = i.getCachedZSortedEles();\n              function ht(Rt, Wt, le, ye, pe) {\n                var je = Rt.globalCompositeOperation;\n                Rt.globalCompositeOperation = \"destination-out\", i.fillStyle(Rt, 255, 255, 255, i.motionBlurTransparency), Rt.fillRect(Wt, le, ye, pe), Rt.globalCompositeOperation = je;\n              }\n              function ct(Rt, Wt) {\n                var le, ye, pe, je;\n                i.clearingMotionBlur || Rt !== f.bufferContexts[i.MOTIONBLUR_BUFFER_NODE] && Rt !== f.bufferContexts[i.MOTIONBLUR_BUFFER_DRAG] ? (le = tt, ye = G, pe = i.canvasWidth, je = i.canvasHeight) : (le = { x: Y.x * S, y: Y.y * S }, ye = V * S, pe = i.canvasWidth * S, je = i.canvasHeight * S), Rt.setTransform(1, 0, 0, 1, 0, 0), Wt === \"motionBlur\" ? ht(Rt, 0, 0, pe, je) : n || Wt !== void 0 && !Wt || Rt.clearRect(0, 0, pe, je), t || (Rt.translate(le.x, le.y), Rt.scale(ye, ye)), h && Rt.translate(h.x, h.y), l && Rt.scale(l, l);\n              }\n              if (k || (i.textureDrawLastFrame = !1), k) {\n                if (i.textureDrawLastFrame = !0, !i.textureCache) {\n                  i.textureCache = {}, i.textureCache.bb = p.mutableElements().boundingBox(), i.textureCache.texture = i.data.bufferCanvases[i.TEXTURE_BUFFER];\n                  var ot = i.data.bufferContexts[i.TEXTURE_BUFFER];\n                  ot.setTransform(1, 0, 0, 1, 0, 0), ot.clearRect(\n                    0,\n                    0,\n                    i.canvasWidth * i.textureMult,\n                    i.canvasHeight * i.textureMult\n                  ), i.render({\n                    forcedContext: ot,\n                    drawOnlyNodeLayer: !0,\n                    forcedPxRatio: d * i.textureMult\n                  }), (Z = i.textureCache.viewport = {\n                    zoom: p.zoom(),\n                    pan: p.pan(),\n                    width: i.canvasWidth,\n                    height: i.canvasHeight\n                  }).mpan = {\n                    x: (0 - Z.pan.x) / Z.zoom,\n                    y: (0 - Z.pan.y) / Z.zoom\n                  };\n                }\n                v[i.DRAG] = !1, v[i.NODE] = !1;\n                var gt = f.contexts[i.NODE], xt = i.textureCache.texture;\n                Z = i.textureCache.viewport, i.textureCache.bb, gt.setTransform(1, 0, 0, 1, 0, 0), s ? ht(gt, 0, 0, Z.width, Z.height) : gt.clearRect(0, 0, Z.width, Z.height);\n                var St = z[\"outside-texture-bg-color\"].value, zt = z[\"outside-texture-bg-opacity\"].value;\n                i.fillStyle(gt, St[0], St[1], St[2], zt), gt.fillRect(0, 0, Z.width, Z.height), V = p.zoom(), ct(gt, !1), gt.clearRect(\n                  Z.mpan.x,\n                  Z.mpan.y,\n                  Z.width / Z.zoom / d,\n                  Z.height / Z.zoom / d\n                ), gt.drawImage(\n                  xt,\n                  Z.mpan.x,\n                  Z.mpan.y,\n                  Z.width / Z.zoom / d,\n                  Z.height / Z.zoom / d\n                );\n              } else i.textureOnViewport && !n && (i.textureCache = null);\n              var Nt = p.extent(), re = i.pinching || i.hoverData.dragging || i.swipePanning || i.data.wheelZooming || i.hoverData.draggingEles, be = i.hideEdgesOnViewport && re, ne = [];\n              if (ne[i.NODE] = !v[i.NODE] && s && !i.clearedForMotionBlur[i.NODE] || i.clearingMotionBlur, ne[i.NODE] && (i.clearedForMotionBlur[i.NODE] = !0), ne[i.DRAG] = !v[i.DRAG] && s && !i.clearedForMotionBlur[i.DRAG] || i.clearingMotionBlur, ne[i.DRAG] && (i.clearedForMotionBlur[i.DRAG] = !0), v[i.NODE] || t || r || ne[i.NODE]) {\n                var ce = s && !ne[i.NODE] && S !== 1;\n                ct(\n                  gt = n || (ce ? i.data.bufferContexts[i.MOTIONBLUR_BUFFER_NODE] : f.contexts[i.NODE]),\n                  s && !ce ? \"motionBlur\" : void 0\n                ), be ? i.drawCachedNodes(gt, nt.nondrag, d, Nt) : i.drawLayeredElements(gt, nt.nondrag, d, Nt), i.debug && i.drawDebugPoints(gt, nt.nondrag), t || s || (v[i.NODE] = !1);\n              }\n              if (!r && (v[i.DRAG] || t || ne[i.DRAG]) && (ce = s && !ne[i.DRAG] && S !== 1, ct(\n                gt = n || (ce ? i.data.bufferContexts[i.MOTIONBLUR_BUFFER_DRAG] : f.contexts[i.DRAG]),\n                s && !ce ? \"motionBlur\" : void 0\n              ), be ? i.drawCachedNodes(gt, nt.drag, d, Nt) : i.drawCachedElements(gt, nt.drag, d, Nt), i.debug && i.drawDebugPoints(gt, nt.drag), t || s || (v[i.DRAG] = !1)), i.showFps || !r && v[i.SELECT_BOX] && !t) {\n                if (ct(gt = n || f.contexts[i.SELECT_BOX]), i.selection[4] == 1 && (i.hoverData.selecting || i.touchData.selecting)) {\n                  V = i.cy.zoom();\n                  var xe = z[\"selection-box-border-width\"].value / V;\n                  gt.lineWidth = xe, gt.fillStyle = \"rgba(\" + z[\"selection-box-color\"].value[0] + \",\" + z[\"selection-box-color\"].value[1] + \",\" + z[\"selection-box-color\"].value[2] + \",\" + z[\"selection-box-opacity\"].value + \")\", gt.fillRect(\n                    i.selection[0],\n                    i.selection[1],\n                    i.selection[2] - i.selection[0],\n                    i.selection[3] - i.selection[1]\n                  ), xe > 0 && (gt.strokeStyle = \"rgba(\" + z[\"selection-box-border-color\"].value[0] + \",\" + z[\"selection-box-border-color\"].value[1] + \",\" + z[\"selection-box-border-color\"].value[2] + \",\" + z[\"selection-box-opacity\"].value + \")\", gt.strokeRect(\n                    i.selection[0],\n                    i.selection[1],\n                    i.selection[2] - i.selection[0],\n                    i.selection[3] - i.selection[1]\n                  ));\n                }\n                if (f.bgActivePosistion && !i.hoverData.selecting) {\n                  V = i.cy.zoom();\n                  var we = f.bgActivePosistion;\n                  gt.fillStyle = \"rgba(\" + z[\"active-bg-color\"].value[0] + \",\" + z[\"active-bg-color\"].value[1] + \",\" + z[\"active-bg-color\"].value[2] + \",\" + z[\"active-bg-opacity\"].value + \")\", gt.beginPath(), gt.arc(\n                    we.x,\n                    we.y,\n                    z[\"active-bg-size\"].pfValue / V,\n                    0,\n                    2 * Math.PI\n                  ), gt.fill();\n                }\n                var ae = i.lastRedrawTime;\n                if (i.showFps && ae) {\n                  ae = Math.round(ae);\n                  var Le = Math.round(1e3 / ae);\n                  gt.setTransform(1, 0, 0, 1, 0, 0), gt.fillStyle = \"rgba(255, 0, 0, 0.75)\", gt.strokeStyle = \"rgba(255, 0, 0, 0.75)\", gt.lineWidth = 1, gt.fillText(\n                    \"1 frame = \" + ae + \" ms = \" + Le + \" fps\",\n                    0,\n                    20\n                  ), gt.strokeRect(0, 30, 250, 20), gt.fillRect(0, 30, 250 * Math.min(Le / 60, 1), 20);\n                }\n                t || (v[i.SELECT_BOX] = !1);\n              }\n              if (s && S !== 1) {\n                var lt = f.contexts[i.NODE], kt = i.data.bufferCanvases[i.MOTIONBLUR_BUFFER_NODE], Dt = f.contexts[i.DRAG], yt = i.data.bufferCanvases[i.MOTIONBLUR_BUFFER_DRAG], ft = function(Rt, Wt, le) {\n                  Rt.setTransform(1, 0, 0, 1, 0, 0), le || !M ? Rt.clearRect(0, 0, i.canvasWidth, i.canvasHeight) : ht(Rt, 0, 0, i.canvasWidth, i.canvasHeight);\n                  var ye = S;\n                  Rt.drawImage(\n                    Wt,\n                    0,\n                    0,\n                    i.canvasWidth * ye,\n                    i.canvasHeight * ye,\n                    0,\n                    0,\n                    i.canvasWidth,\n                    i.canvasHeight\n                  );\n                };\n                (v[i.NODE] || ne[i.NODE]) && (ft(lt, kt, ne[i.NODE]), v[i.NODE] = !1), (v[i.DRAG] || ne[i.DRAG]) && (ft(Dt, yt, ne[i.DRAG]), v[i.DRAG] = !1);\n              }\n              i.prevViewport = Z, i.clearingMotionBlur && (i.clearingMotionBlur = !1, i.motionBlurCleared = !0, i.motionBlur = !0), s && (i.motionBlurTimeout = setTimeout(function() {\n                i.motionBlurTimeout = null, i.clearedForMotionBlur[i.NODE] = !1, i.clearedForMotionBlur[i.DRAG] = !1, i.motionBlur = !1, i.clearingMotionBlur = !k, i.mbFrames = 0, v[i.NODE] = !0, v[i.DRAG] = !0, i.redraw();\n              }, 100)), n || p.emit(\"render\");\n            }, y.exports = o;\n          },\n          function(y, x, g) {\n            for (var o = g(2), c = {\n              drawPolygonPath: function(i, d, p, f, v, k) {\n                var s = f / 2, S = v / 2;\n                i.beginPath && i.beginPath(), i.moveTo(d + s * k[0], p + S * k[1]);\n                for (var j = 1; j < k.length / 2; j++)\n                  i.lineTo(d + s * k[2 * j], p + S * k[2 * j + 1]);\n                i.closePath();\n              },\n              drawRoundRectanglePath: function(i, d, p, f, v) {\n                var k = f / 2, s = v / 2, S = o.getRoundRectangleRadius(f, v);\n                i.beginPath && i.beginPath(), i.moveTo(d, p - s), i.arcTo(d + k, p - s, d + k, p, S), i.arcTo(d + k, p + s, d, p + s, S), i.arcTo(d - k, p + s, d - k, p, S), i.arcTo(d - k, p - s, d, p - s, S), i.lineTo(d, p - s), i.closePath();\n              },\n              drawBottomRoundRectanglePath: function(i, d, p, f, v) {\n                var k = f / 2, s = v / 2, S = o.getRoundRectangleRadius(f, v);\n                i.beginPath && i.beginPath(), i.moveTo(d, p - s), i.lineTo(d + k, p - s), i.lineTo(d + k, p), i.arcTo(d + k, p + s, d, p + s, S), i.arcTo(d - k, p + s, d - k, p, S), i.lineTo(d - k, p - s), i.lineTo(d, p - s), i.closePath();\n              },\n              drawCutRectanglePath: function(i, d, p, f, v) {\n                var k = f / 2, s = v / 2, S = o.getCutRectangleCornerLength();\n                i.beginPath && i.beginPath(), i.moveTo(d - k + S, p - s), i.lineTo(d + k - S, p - s), i.lineTo(d + k, p - s + S), i.lineTo(d + k, p + s - S), i.lineTo(d + k - S, p + s), i.lineTo(d - k + S, p + s), i.lineTo(d - k, p + s - S), i.lineTo(d - k, p - s + S), i.closePath();\n              },\n              drawBarrelPath: function(i, d, p, f, v) {\n                var k = f / 2, s = v / 2, S = d - k, j = d + k, I = p - s, R = p + s, M = o.getBarrelCurveConstants(f, v), z = M.widthOffset, V = M.heightOffset, G = M.ctrlPtOffsetPct * z;\n                i.beginPath && i.beginPath(), i.moveTo(S, I + V), i.lineTo(S, R - V), i.quadraticCurveTo(S + G, R, S + z, R), i.lineTo(j - z, R), i.quadraticCurveTo(j - G, R, j, R - V), i.lineTo(j, I + V), i.quadraticCurveTo(j - G, I, j - z, I), i.lineTo(S + z, I), i.quadraticCurveTo(S + G, I, S, I + V), i.closePath();\n              }\n            }, a = Math.sin(0), n = Math.cos(0), t = {}, r = {}, l = Math.PI / 40, h = 0 * Math.PI; h < 2 * Math.PI; h += l)\n              t[h] = Math.sin(h), r[h] = Math.cos(h);\n            c.drawEllipsePath = function(i, d, p, f, v) {\n              if (i.beginPath && i.beginPath(), i.ellipse)\n                i.ellipse(d, p, f / 2, v / 2, 0, 0, 2 * Math.PI);\n              else\n                for (var k, s, S = f / 2, j = v / 2, I = 0 * Math.PI; I < 2 * Math.PI; I += l)\n                  k = d - S * t[I] * a + S * r[I] * n, s = p + j * r[I] * a + j * t[I] * n, I === 0 ? i.moveTo(k, s) : i.lineTo(k, s);\n              i.closePath();\n            }, y.exports = c;\n          },\n          function(y, x, g) {\n            var o = g(0), c = {};\n            function a(t) {\n              var r = t.indexOf(\",\");\n              return t.substr(r + 1);\n            }\n            function n(t, r, l) {\n              var h = r.toDataURL(l, t.quality);\n              switch (t.output) {\n                case \"blob\":\n                  return function(i, d) {\n                    for (var p = atob(i), f = new ArrayBuffer(p.length), v = new Uint8Array(f), k = 0; k < p.length; k++)\n                      v[k] = p.charCodeAt(k);\n                    return new Blob([f], { type: d });\n                  }(a(h), l);\n                case \"base64\":\n                  return a(h);\n                case \"base64uri\":\n                default:\n                  return h;\n              }\n            }\n            c.createBuffer = function(t, r) {\n              var l = document.createElement(\"canvas\");\n              return l.width = t, l.height = r, [l, l.getContext(\"2d\")];\n            }, c.bufferCanvasImage = function(t) {\n              var r = this.cy, l = r.mutableElements().boundingBox(), h = this.findContainerClientCoords(), i = t.full ? Math.ceil(l.w) : h[2], d = t.full ? Math.ceil(l.h) : h[3], p = o.number(t.maxWidth) || o.number(t.maxHeight), f = this.getPixelRatio(), v = 1;\n              if (t.scale !== void 0)\n                i *= t.scale, d *= t.scale, v = t.scale;\n              else if (p) {\n                var k = 1 / 0, s = 1 / 0;\n                o.number(t.maxWidth) && (k = v * t.maxWidth / i), o.number(t.maxHeight) && (s = v * t.maxHeight / d), i *= v = Math.min(k, s), d *= v;\n              }\n              p || (i *= f, d *= f, v *= f);\n              var S = document.createElement(\"canvas\");\n              S.width = i, S.height = d, S.style.width = i + \"px\", S.style.height = d + \"px\";\n              var j = S.getContext(\"2d\");\n              if (i > 0 && d > 0) {\n                j.clearRect(0, 0, i, d), j.globalCompositeOperation = \"source-over\";\n                var I = this.getCachedZSortedEles();\n                if (t.full)\n                  j.translate(-l.x1 * v, -l.y1 * v), j.scale(v, v), this.drawElements(j, I), j.scale(1 / v, 1 / v), j.translate(l.x1 * v, l.y1 * v);\n                else {\n                  var R = r.pan(), M = { x: R.x * v, y: R.y * v };\n                  v *= r.zoom(), j.translate(M.x, M.y), j.scale(v, v), this.drawElements(j, I), j.scale(1 / v, 1 / v), j.translate(-M.x, -M.y);\n                }\n                t.bg && (j.globalCompositeOperation = \"destination-over\", j.fillStyle = t.bg, j.rect(0, 0, i, d), j.fill());\n              }\n              return S;\n            }, c.png = function(t) {\n              return n(t, this.bufferCanvasImage(t), \"image/png\");\n            }, c.jpg = function(t) {\n              return n(t, this.bufferCanvasImage(t), \"image/jpeg\");\n            }, y.exports = c;\n          },\n          function(y, x, g) {\n            var o = {\n              nodeShapeImpl: function(c, a, n, t, r, l, h) {\n                switch (c) {\n                  case \"ellipse\":\n                    return this.drawEllipsePath(a, n, t, r, l);\n                  case \"polygon\":\n                    return this.drawPolygonPath(a, n, t, r, l, h);\n                  case \"roundrectangle\":\n                    return this.drawRoundRectanglePath(a, n, t, r, l);\n                  case \"cutrectangle\":\n                    return this.drawCutRectanglePath(a, n, t, r, l);\n                  case \"bottomroundrectangle\":\n                    return this.drawBottomRoundRectanglePath(a, n, t, r, l);\n                  case \"barrel\":\n                    return this.drawBarrelPath(a, n, t, r, l);\n                }\n              }\n            };\n            y.exports = o;\n          },\n          function(y, x, g) {\n            var o = g(0), c = g(1), a = g(18), n = function r() {\n              if (!(this instanceof r)) return new r();\n              this.length = 0;\n            }, t = n.prototype;\n            t.instanceString = function() {\n              return \"stylesheet\";\n            }, t.selector = function(r) {\n              return this[this.length++] = { selector: r, properties: [] }, this;\n            }, t.css = function(r, l) {\n              var h = this.length - 1;\n              if (o.string(r))\n                this[h].properties.push({ name: r, value: l });\n              else if (o.plainObject(r))\n                for (var i = r, d = 0; d < a.properties.length; d++) {\n                  var p = a.properties[d], f = i[p.name];\n                  if (f === void 0 && (f = i[c.dash2camel(p.name)]), f !== void 0) {\n                    var v = p.name, k = f;\n                    this[h].properties.push({ name: v, value: k });\n                  }\n                }\n              return this;\n            }, t.style = t.css, t.generateStyle = function(r) {\n              var l = new a(r);\n              return this.appendToStyle(l);\n            }, t.appendToStyle = function(r) {\n              for (var l = 0; l < this.length; l++) {\n                var h = this[l], i = h.selector, d = h.properties;\n                r.selector(i);\n                for (var p = 0; p < d.length; p++) {\n                  var f = d[p];\n                  r.css(f.name, f.value);\n                }\n              }\n              return r;\n            }, y.exports = n;\n          },\n          function(y, x, g) {\n            y.exports = \"snapshot-2fd4aa6cc2-1531011493999\";\n          }\n        ]);\n      }, L.exports = A(e(241), e(242));\n    }).call(this, e(238).setImmediate);\n  },\n  function(L, T, e) {\n    (function(u) {\n      var A = u !== void 0 && u || typeof self < \"u\" && self || window, w = Function.prototype.apply;\n      function E(y, x) {\n        this._id = y, this._clearFn = x;\n      }\n      T.setTimeout = function() {\n        return new E(w.call(setTimeout, A, arguments), clearTimeout);\n      }, T.setInterval = function() {\n        return new E(w.call(setInterval, A, arguments), clearInterval);\n      }, T.clearTimeout = T.clearInterval = function(y) {\n        y && y.close();\n      }, E.prototype.unref = E.prototype.ref = function() {\n      }, E.prototype.close = function() {\n        this._clearFn.call(A, this._id);\n      }, T.enroll = function(y, x) {\n        clearTimeout(y._idleTimeoutId), y._idleTimeout = x;\n      }, T.unenroll = function(y) {\n        clearTimeout(y._idleTimeoutId), y._idleTimeout = -1;\n      }, T._unrefActive = T.active = function(y) {\n        clearTimeout(y._idleTimeoutId);\n        var x = y._idleTimeout;\n        x >= 0 && (y._idleTimeoutId = setTimeout(function() {\n          y._onTimeout && y._onTimeout();\n        }, x));\n      }, e(239), T.setImmediate = typeof self < \"u\" && self.setImmediate || u !== void 0 && u.setImmediate || this && this.setImmediate, T.clearImmediate = typeof self < \"u\" && self.clearImmediate || u !== void 0 && u.clearImmediate || this && this.clearImmediate;\n    }).call(this, e(35));\n  },\n  function(L, T, e) {\n    (function(u, A) {\n      (function(w, E) {\n        if (!w.setImmediate) {\n          var y, x, g, o, c, a = 1, n = {}, t = !1, r = w.document, l = Object.getPrototypeOf && Object.getPrototypeOf(w);\n          l = l && l.setTimeout ? l : w, {}.toString.call(w.process) === \"[object process]\" ? y = function(d) {\n            A.nextTick(function() {\n              i(d);\n            });\n          } : function() {\n            if (w.postMessage && !w.importScripts) {\n              var d = !0, p = w.onmessage;\n              return w.onmessage = function() {\n                d = !1;\n              }, w.postMessage(\"\", \"*\"), w.onmessage = p, d;\n            }\n          }() ? (o = \"setImmediate$\" + Math.random() + \"$\", c = function(d) {\n            d.source === w && typeof d.data == \"string\" && d.data.indexOf(o) === 0 && i(+d.data.slice(o.length));\n          }, w.addEventListener ? w.addEventListener(\"message\", c, !1) : w.attachEvent(\"onmessage\", c), y = function(d) {\n            w.postMessage(o + d, \"*\");\n          }) : w.MessageChannel ? ((g = new MessageChannel()).port1.onmessage = function(d) {\n            i(d.data);\n          }, y = function(d) {\n            g.port2.postMessage(d);\n          }) : r && \"onreadystatechange\" in r.createElement(\"script\") ? (x = r.documentElement, y = function(d) {\n            var p = r.createElement(\"script\");\n            p.onreadystatechange = function() {\n              i(d), p.onreadystatechange = null, x.removeChild(p), p = null;\n            }, x.appendChild(p);\n          }) : y = function(d) {\n            setTimeout(i, 0, d);\n          }, l.setImmediate = function(d) {\n            typeof d != \"function\" && (d = new Function(\"\" + d));\n            for (var p = new Array(arguments.length - 1), f = 0; f < p.length; f++)\n              p[f] = arguments[f + 1];\n            var v = { callback: d, args: p };\n            return n[a] = v, y(a), a++;\n          }, l.clearImmediate = h;\n        }\n        function h(d) {\n          delete n[d];\n        }\n        function i(d) {\n          if (t) setTimeout(i, 0, d);\n          else {\n            var p = n[d];\n            if (p) {\n              t = !0;\n              try {\n                (function(f) {\n                  var v = f.callback, k = f.args;\n                  switch (k.length) {\n                    case 0:\n                      v();\n                      break;\n                    case 1:\n                      v(k[0]);\n                      break;\n                    case 2:\n                      v(k[0], k[1]);\n                      break;\n                    case 3:\n                      v(k[0], k[1], k[2]);\n                      break;\n                    default:\n                      v.apply(void 0, k);\n                  }\n                })(p);\n              } finally {\n                h(d), t = !1;\n              }\n            }\n          }\n        }\n      })(typeof self > \"u\" ? u === void 0 ? this : u : self);\n    }).call(this, e(35), e(240));\n  },\n  function(L, T) {\n    var e, u, A = L.exports = {};\n    function w() {\n      throw new Error(\"setTimeout has not been defined\");\n    }\n    function E() {\n      throw new Error(\"clearTimeout has not been defined\");\n    }\n    function y(l) {\n      if (e === setTimeout) return setTimeout(l, 0);\n      if ((e === w || !e) && setTimeout)\n        return e = setTimeout, setTimeout(l, 0);\n      try {\n        return e(l, 0);\n      } catch {\n        try {\n          return e.call(null, l, 0);\n        } catch {\n          return e.call(this, l, 0);\n        }\n      }\n    }\n    (function() {\n      try {\n        e = typeof setTimeout == \"function\" ? setTimeout : w;\n      } catch {\n        e = w;\n      }\n      try {\n        u = typeof clearTimeout == \"function\" ? clearTimeout : E;\n      } catch {\n        u = E;\n      }\n    })();\n    var x, g = [], o = !1, c = -1;\n    function a() {\n      o && x && (o = !1, x.length ? g = x.concat(g) : c = -1, g.length && n());\n    }\n    function n() {\n      if (!o) {\n        var l = y(a);\n        o = !0;\n        for (var h = g.length; h; ) {\n          for (x = g, g = []; ++c < h; ) x && x[c].run();\n          c = -1, h = g.length;\n        }\n        x = null, o = !1, function(i) {\n          if (u === clearTimeout) return clearTimeout(i);\n          if ((u === E || !u) && clearTimeout)\n            return u = clearTimeout, clearTimeout(i);\n          try {\n            u(i);\n          } catch {\n            try {\n              return u.call(null, i);\n            } catch {\n              return u.call(this, i);\n            }\n          }\n        }(l);\n      }\n    }\n    function t(l, h) {\n      this.fun = l, this.array = h;\n    }\n    function r() {\n    }\n    A.nextTick = function(l) {\n      var h = new Array(arguments.length - 1);\n      if (arguments.length > 1)\n        for (var i = 1; i < arguments.length; i++) h[i - 1] = arguments[i];\n      g.push(new t(l, h)), g.length !== 1 || o || y(n);\n    }, t.prototype.run = function() {\n      this.fun.apply(null, this.array);\n    }, A.title = \"browser\", A.browser = !0, A.env = {}, A.argv = [], A.version = \"\", A.versions = {}, A.on = r, A.addListener = r, A.once = r, A.off = r, A.removeListener = r, A.removeAllListeners = r, A.emit = r, A.prependListener = r, A.prependOnceListener = r, A.listeners = function(l) {\n      return [];\n    }, A.binding = function(l) {\n      throw new Error(\"process.binding is not supported\");\n    }, A.cwd = function() {\n      return \"/\";\n    }, A.chdir = function(l) {\n      throw new Error(\"process.chdir is not supported\");\n    }, A.umask = function() {\n      return 0;\n    };\n  },\n  function(L, T, e) {\n    (function(u) {\n      var A = /^\\s+|\\s+$/g, w = /^[-+]0x[0-9a-f]+$/i, E = /^0b[01]+$/i, y = /^0o[0-7]+$/i, x = parseInt, g = typeof u == \"object\" && u && u.Object === Object && u, o = typeof self == \"object\" && self && self.Object === Object && self, c = g || o || Function(\"return this\")(), a = Object.prototype.toString, n = Math.max, t = Math.min, r = function() {\n        return c.Date.now();\n      };\n      function l(i) {\n        var d = typeof i;\n        return !!i && (d == \"object\" || d == \"function\");\n      }\n      function h(i) {\n        if (typeof i == \"number\") return i;\n        if (function(f) {\n          return typeof f == \"symbol\" || /* @__PURE__ */ function(v) {\n            return !!v && typeof v == \"object\";\n          }(f) && a.call(f) == \"[object Symbol]\";\n        }(i))\n          return NaN;\n        if (l(i)) {\n          var d = typeof i.valueOf == \"function\" ? i.valueOf() : i;\n          i = l(d) ? d + \"\" : d;\n        }\n        if (typeof i != \"string\") return i === 0 ? i : +i;\n        i = i.replace(A, \"\");\n        var p = E.test(i);\n        return p || y.test(i) ? x(i.slice(2), p ? 2 : 8) : w.test(i) ? NaN : +i;\n      }\n      L.exports = function(i, d, p) {\n        var f, v, k, s, S, j, I = 0, R = !1, M = !1, z = !0;\n        if (typeof i != \"function\") throw new TypeError(\"Expected a function\");\n        function V(nt) {\n          var ht = f, ct = v;\n          return f = v = void 0, I = nt, s = i.apply(ct, ht);\n        }\n        function G(nt) {\n          return I = nt, S = setTimeout(tt, d), R ? V(nt) : s;\n        }\n        function Y(nt) {\n          var ht = nt - j;\n          return j === void 0 || ht >= d || ht < 0 || M && nt - I >= k;\n        }\n        function tt() {\n          var nt = r();\n          if (Y(nt)) return Z(nt);\n          S = setTimeout(\n            tt,\n            function(ht) {\n              var ct = d - (ht - j);\n              return M ? t(ct, k - (ht - I)) : ct;\n            }(nt)\n          );\n        }\n        function Z(nt) {\n          return S = void 0, z && f ? V(nt) : (f = v = void 0, s);\n        }\n        function at() {\n          var nt = r(), ht = Y(nt);\n          if (f = arguments, v = this, j = nt, ht) {\n            if (S === void 0) return G(j);\n            if (M) return S = setTimeout(tt, d), V(j);\n          }\n          return S === void 0 && (S = setTimeout(tt, d)), s;\n        }\n        return d = h(d) || 0, l(p) && (R = !!p.leading, k = (M = \"maxWait\" in p) ? n(h(p.maxWait) || 0, d) : k, z = \"trailing\" in p ? !!p.trailing : z), at.cancel = function() {\n          S !== void 0 && clearTimeout(S), I = 0, f = j = v = S = void 0;\n        }, at.flush = function() {\n          return S === void 0 ? s : Z(r());\n        }, at;\n      };\n    }).call(this, e(35));\n  },\n  function(L, T, e) {\n    L.exports = e(243);\n  },\n  function(L, T, e) {\n    var u, A, w;\n    (function() {\n      var E, y, x, g, o, c, a, n, t, r, l, h, i, d, p;\n      x = Math.floor, r = Math.min, y = function(f, v) {\n        return f < v ? -1 : f > v ? 1 : 0;\n      }, t = function(f, v, k, s, S) {\n        var j;\n        if (k == null && (k = 0), S == null && (S = y), k < 0)\n          throw new Error(\"lo must be non-negative\");\n        for (s == null && (s = f.length); k < s; )\n          S(v, f[j = x((k + s) / 2)]) < 0 ? s = j : k = j + 1;\n        return [].splice.apply(f, [k, k - k].concat(v)), v;\n      }, c = function(f, v, k) {\n        return k == null && (k = y), f.push(v), d(f, 0, f.length - 1, k);\n      }, o = function(f, v) {\n        var k, s;\n        return v == null && (v = y), k = f.pop(), f.length ? (s = f[0], f[0] = k, p(f, 0, v)) : s = k, s;\n      }, n = function(f, v, k) {\n        var s;\n        return k == null && (k = y), s = f[0], f[0] = v, p(f, 0, k), s;\n      }, a = function(f, v, k) {\n        var s;\n        return k == null && (k = y), f.length && k(f[0], v) < 0 && (v = (s = [f[0], v])[0], f[0] = s[1], p(f, 0, k)), v;\n      }, g = function(f, v) {\n        var k, s, S, j, I, R;\n        for (v == null && (v = y), I = [], s = 0, S = (j = (function() {\n          R = [];\n          for (var M = 0, z = x(f.length / 2); 0 <= z ? M < z : M > z; 0 <= z ? M++ : M--)\n            R.push(M);\n          return R;\n        }).apply(this).reverse()).length; s < S; s++)\n          k = j[s], I.push(p(f, k, v));\n        return I;\n      }, i = function(f, v, k) {\n        var s;\n        if (k == null && (k = y), (s = f.indexOf(v)) !== -1)\n          return d(f, 0, s, k), p(f, s, k);\n      }, l = function(f, v, k) {\n        var s, S, j, I, R;\n        if (k == null && (k = y), !(S = f.slice(0, v)).length) return S;\n        for (g(S, k), j = 0, I = (R = f.slice(v)).length; j < I; j++)\n          s = R[j], a(S, s, k);\n        return S.sort(k).reverse();\n      }, h = function(f, v, k) {\n        var s, S, j, I, R, M, z, V, G;\n        if (k == null && (k = y), 10 * v <= f.length) {\n          if (!(j = f.slice(0, v).sort(k)).length) return j;\n          for (S = j[j.length - 1], I = 0, M = (z = f.slice(v)).length; I < M; I++)\n            k(s = z[I], S) < 0 && (t(j, s, 0, null, k), j.pop(), S = j[j.length - 1]);\n          return j;\n        }\n        for (g(f, k), G = [], R = 0, V = r(v, f.length); 0 <= V ? R < V : R > V; 0 <= V ? ++R : --R)\n          G.push(o(f, k));\n        return G;\n      }, d = function(f, v, k, s) {\n        var S, j, I;\n        for (s == null && (s = y), S = f[k]; k > v && s(S, j = f[I = k - 1 >> 1]) < 0; )\n          f[k] = j, k = I;\n        return f[k] = S;\n      }, p = function(f, v, k) {\n        var s, S, j, I, R;\n        for (k == null && (k = y), S = f.length, R = v, j = f[v], s = 2 * v + 1; s < S; )\n          (I = s + 1) < S && !(k(f[s], f[I]) < 0) && (s = I), f[v] = f[s], s = 2 * (v = s) + 1;\n        return f[v] = j, d(f, R, v, k);\n      }, E = function() {\n        function f(v) {\n          this.cmp = v ?? y, this.nodes = [];\n        }\n        return f.push = c, f.pop = o, f.replace = n, f.pushpop = a, f.heapify = g, f.updateItem = i, f.nlargest = l, f.nsmallest = h, f.prototype.push = function(v) {\n          return c(this.nodes, v, this.cmp);\n        }, f.prototype.pop = function() {\n          return o(this.nodes, this.cmp);\n        }, f.prototype.peek = function() {\n          return this.nodes[0];\n        }, f.prototype.contains = function(v) {\n          return this.nodes.indexOf(v) !== -1;\n        }, f.prototype.replace = function(v) {\n          return n(this.nodes, v, this.cmp);\n        }, f.prototype.pushpop = function(v) {\n          return a(this.nodes, v, this.cmp);\n        }, f.prototype.heapify = function() {\n          return g(this.nodes, this.cmp);\n        }, f.prototype.updateItem = function(v) {\n          return i(this.nodes, v, this.cmp);\n        }, f.prototype.clear = function() {\n          return this.nodes = [];\n        }, f.prototype.empty = function() {\n          return this.nodes.length === 0;\n        }, f.prototype.size = function() {\n          return this.nodes.length;\n        }, f.prototype.clone = function() {\n          var v;\n          return (v = new f()).nodes = this.nodes.slice(0), v;\n        }, f.prototype.toArray = function() {\n          return this.nodes.slice(0);\n        }, f.prototype.insert = f.prototype.push, f.prototype.top = f.prototype.peek, f.prototype.front = f.prototype.peek, f.prototype.has = f.prototype.contains, f.prototype.copy = f.prototype.clone, f;\n      }(), A = [], (w = typeof (u = function() {\n        return E;\n      }) == \"function\" ? u.apply(T, A) : u) === void 0 || (L.exports = w);\n    }).call(this);\n  },\n  function(L, T, e) {\n    var u;\n    (function() {\n      var A = typeof jQuery > \"u\" ? null : jQuery, w = function(E, y) {\n        if (E) {\n          var x, g = {\n            menuItems: [],\n            menuItemClasses: [],\n            contextMenuClasses: []\n          };\n          E(\"core\", \"contextMenus\", function(o) {\n            var c = this;\n            c.scratch(\"cycontextmenus\") || c.scratch(\"cycontextmenus\", {});\n            var a, n = r(\"options\"), t = r(\"cxtMenu\");\n            function r(R) {\n              return c.scratch(\"cycontextmenus\")[R];\n            }\n            function l(R, M) {\n              c.scratch(\"cycontextmenus\")[R] = M;\n            }\n            function h(R) {\n              for (var M = \"\", z = 0; z < R.length; z++)\n                M += R[z], z !== R.length - 1 && (M += \" \");\n              return M;\n            }\n            function i(R) {\n              R.css(\"display\", \"block\");\n            }\n            function d(R) {\n              R.css(\"display\", \"none\");\n            }\n            function p(R, M, z) {\n              function V(tt) {\n                l(\"currentCyEvent\", tt), function(Z) {\n                  var at = r(\"cxtMenuPosition\"), nt = Z.position || Z.cyPosition;\n                  if (at != nt) {\n                    t.children().css(\"display\", \"none\"), l(\"anyVisibleChild\", !1), l(\"cxtMenuPosition\", nt);\n                    var ht = y(c.container()).offset(), ct = Z.renderedPosition || Z.cyRenderedPosition, ot = ht.left + ct.x, gt = ht.top + ct.y;\n                    t.css(\"left\", ot), t.css(\"top\", gt);\n                  }\n                }(tt), R.data(\"show\") && (t.is(\":visible\") || i(t), l(\"anyVisibleChild\", !0), i(R)), !r(\"anyVisibleChild\") && t.is(\":visible\") && d(t);\n              }\n              var G, Y;\n              z && c.on(\n                \"cxttap\",\n                Y = function(tt) {\n                  (tt.target || tt.cyTarget) == c && V(tt);\n                }\n              ), M && c.on(\n                \"cxttap\",\n                M,\n                G = function(tt) {\n                  V(tt);\n                }\n              ), R.data(\"cy-context-menus-cxtfcn\", G), R.data(\"cy-context-menus-cxtcorefcn\", Y);\n            }\n            function f(R, M, z, V) {\n              (function(G, Y) {\n                var tt;\n                G.on(\n                  \"click\",\n                  tt = function() {\n                    Y(r(\"currentCyEvent\"));\n                  }\n                ), G.data(\"call-on-click-function\", tt);\n              })(R, M), p(R, z, V);\n            }\n            function v(R) {\n              for (var M = 0; M < R.length; M++) k(R[M]);\n            }\n            function k(R) {\n              var M, z = S(R);\n              M = z, t.append(M), function(V) {\n                V.click(function() {\n                  d(t), l(\"cxtMenuPosition\", void 0);\n                });\n              }(M), f(z, R.onClickFunction, R.selector, R.coreAsWell);\n            }\n            function s(R, M) {\n              var z, V, G = S(R);\n              z = G, V = y(\"#\" + M), z.insertBefore(V), f(G, R.onClickFunction, R.selector, R.coreAsWell);\n            }\n            function S(R) {\n              var M, z, V, G = (M = n.menuItemClasses, z = R.hasTrailingDivider, V = h(M), V += \" cy-context-menus-cxt-menuitem\", z && (V += \" cy-context-menus-divider\"), V), Y = '<button id=\"' + R.id + '\" class=\"' + G + '\"';\n              R.tooltipText && (Y += ' title=\"' + R.tooltipText + '\"'), R.disabled && (Y += \" disabled\"), R.image ? Y += '><img src=\"' + R.image.src + '\" width=\"' + R.image.width + 'px\"; height=\"' + R.image.height + 'px\"; style=\"position:absolute; top: ' + R.image.y + \"px; left: \" + R.image.x + 'px;\">' + R.content + \"</button>\" : Y += \">\" + R.content + \"</button>\";\n              var tt = y(Y);\n              return tt.data(\"selector\", R.selector), tt.data(\"on-click-function\", R.onClickFunction), tt.data(\"show\", R.show === void 0 || R.show), tt;\n            }\n            function j() {\n              var R;\n              r(\"active\") && (R = t.children(), y(R).each(function() {\n                I(y(this));\n              }), c.off(\"tapstart\", x), t.remove(), l(t = void 0, void 0), l(\"active\", !1), l(\"anyVisibleChild\", !1));\n            }\n            function I(R) {\n              var M = typeof R == \"string\" ? y(\"#\" + R) : R, z = M.data(\"cy-context-menus-cxtfcn\"), V = M.data(\"selector\"), G = M.data(\"call-on-click-function\"), Y = M.data(\"cy-context-menus-cxtcorefcn\");\n              z && c.off(\"cxttap\", V, z), Y && c.off(\"cxttap\", Y), G && M.off(\"click\", G), M.remove();\n            }\n            return o !== \"get\" && (l(\n              \"options\",\n              n = function(R, M) {\n                var z = {};\n                for (var V in R) z[V] = R[V];\n                for (var V in M) z[V] = M[V];\n                return z;\n              }(g, o)\n            ), r(\"active\") && j(), l(\"active\", !0), a = h(n.contextMenuClasses), (t = y(\"<div class=\" + a + \"></div>\")).addClass(\n              \"cy-context-menus-cxt-menu\"\n            ), l(\"cxtMenu\", t), y(\"body\").append(t), t = t, v(n.menuItems), c.on(\n              \"tapstart\",\n              x = function() {\n                d(t), l(\"cxtMenuPosition\", void 0), l(\"currentCyEvent\", void 0);\n              }\n            ), y(\".cy-context-menus-cxt-menu\").contextmenu(function() {\n              return !1;\n            })), /* @__PURE__ */ function(R) {\n              return {\n                isActive: function() {\n                  return r(\"active\");\n                },\n                appendMenuItem: function(M) {\n                  return k(M), R;\n                },\n                appendMenuItems: function(M) {\n                  return v(M), R;\n                },\n                removeMenuItem: function(M) {\n                  return I(M), R;\n                },\n                setTrailingDivider: function(M, z) {\n                  return function(V, G) {\n                    var Y = y(\"#\" + V);\n                    G ? Y.addClass(\"cy-context-menus-divider\") : Y.removeClass(\"cy-context-menus-divider\");\n                  }(M, z), R;\n                },\n                insertBeforeMenuItem: function(M, z) {\n                  return s(M, z), R;\n                },\n                moveBeforeOtherMenuItem: function(M, z) {\n                  return function(V, G) {\n                    if (V !== G) {\n                      var Y = y(\"#\" + V).detach(), tt = y(\"#\" + G);\n                      Y.insertBefore(tt);\n                    }\n                  }(M, z), R;\n                },\n                disableMenuItem: function(M) {\n                  return y(\"#\" + M).attr(\"disabled\", !0), R;\n                },\n                enableMenuItem: function(M) {\n                  return y(\"#\" + M).attr(\"disabled\", !1), R;\n                },\n                hideMenuItem: function(M) {\n                  return y(\"#\" + M).data(\"show\", !1), d(y(\"#\" + M)), R;\n                },\n                showMenuItem: function(M) {\n                  return y(\"#\" + M).data(\"show\", !0), i(y(\"#\" + M)), R;\n                },\n                destroy: function() {\n                  return j(), R;\n                }\n              };\n            }(this);\n          });\n        }\n      };\n      L.exports && (L.exports = w), (u = (function() {\n        return w;\n      }).call(T, e, T, L)) === void 0 || (L.exports = u), typeof cytoscape < \"u\" && A && w(cytoscape, A);\n    })();\n  },\n  function(L, T, e) {\n    var u;\n    u = function(A) {\n      return function(w) {\n        var E = {};\n        function y(x) {\n          if (E[x]) return E[x].exports;\n          var g = E[x] = { i: x, l: !1, exports: {} };\n          return w[x].call(g.exports, g, g.exports, y), g.l = !0, g.exports;\n        }\n        return y.m = w, y.c = E, y.d = function(x, g, o) {\n          y.o(x, g) || Object.defineProperty(x, g, { enumerable: !0, get: o });\n        }, y.r = function(x) {\n          typeof Symbol < \"u\" && Symbol.toStringTag && Object.defineProperty(x, Symbol.toStringTag, { value: \"Module\" }), Object.defineProperty(x, \"__esModule\", { value: !0 });\n        }, y.t = function(x, g) {\n          if (1 & g && (x = y(x)), 8 & g || 4 & g && typeof x == \"object\" && x && x.__esModule) return x;\n          var o = /* @__PURE__ */ Object.create(null);\n          if (y.r(o), Object.defineProperty(o, \"default\", { enumerable: !0, value: x }), 2 & g && typeof x != \"string\")\n            for (var c in x)\n              y.d(\n                o,\n                c,\n                (function(a) {\n                  return x[a];\n                }).bind(null, c)\n              );\n          return o;\n        }, y.n = function(x) {\n          var g = x && x.__esModule ? function() {\n            return x.default;\n          } : function() {\n            return x;\n          };\n          return y.d(g, \"a\", g), g;\n        }, y.o = function(x, g) {\n          return Object.prototype.hasOwnProperty.call(x, g);\n        }, y.p = \"\", y(y.s = 0);\n      }([\n        function(w, E, y) {\n          var x = y(1), g = function(o) {\n            o && o(\"layout\", \"dagre\", x);\n          };\n          typeof cytoscape < \"u\" && g(cytoscape), w.exports = g;\n        },\n        function(w, E, y) {\n          function x(n) {\n            return (x = typeof Symbol == \"function\" && typeof Symbol.iterator == \"symbol\" ? function(t) {\n              return typeof t;\n            } : function(t) {\n              return t && typeof Symbol == \"function\" && t.constructor === Symbol && t !== Symbol.prototype ? \"symbol\" : typeof t;\n            })(n);\n          }\n          var g = y(2), o = y(3), c = y(4);\n          function a(n) {\n            this.options = o({}, g, n);\n          }\n          a.prototype.run = function() {\n            var n = this.options, t = n.cy, r = n.eles, l = function(Z, at) {\n              return typeof at == \"function\" ? at.apply(Z, [Z]) : at;\n            }, h = n.boundingBox || {\n              x1: 0,\n              y1: 0,\n              w: t.width(),\n              h: t.height()\n            };\n            h.x2 === void 0 && (h.x2 = h.x1 + h.w), h.w === void 0 && (h.w = h.x2 - h.x1), h.y2 === void 0 && (h.y2 = h.y1 + h.h), h.h === void 0 && (h.h = h.y2 - h.y1);\n            var i = new c.graphlib.Graph({ multigraph: !0, compound: !0 }), d = {}, p = function(Z, at) {\n              at != null && (d[Z] = at);\n            };\n            p(\"nodesep\", n.nodeSep), p(\"edgesep\", n.edgeSep), p(\"ranksep\", n.rankSep), p(\"rankdir\", n.rankDir), p(\"ranker\", n.ranker), i.setGraph(d), i.setDefaultEdgeLabel(function() {\n              return {};\n            }), i.setDefaultNodeLabel(function() {\n              return {};\n            });\n            for (var f = r.nodes(), v = 0; v < f.length; v++) {\n              var k = f[v], s = k.layoutDimensions(n);\n              i.setNode(k.id(), { width: s.w, height: s.h, name: k.id() });\n            }\n            for (var S = 0; S < f.length; S++) {\n              var j = f[S];\n              j.isChild() && i.setParent(j.id(), j.parent().id());\n            }\n            for (var I = r.edges().stdFilter(function(Z) {\n              return !Z.source().isParent() && !Z.target().isParent();\n            }), R = 0; R < I.length; R++) {\n              var M = I[R];\n              i.setEdge(\n                M.source().id(),\n                M.target().id(),\n                {\n                  minlen: l(M, n.minLen),\n                  weight: l(M, n.edgeWeight),\n                  name: M.id()\n                },\n                M.id()\n              );\n            }\n            c.layout(i);\n            for (var z, V = i.nodes(), G = 0; G < V.length; G++) {\n              var Y = V[G], tt = i.node(Y);\n              t.getElementById(Y).scratch().dagre = tt;\n            }\n            return n.boundingBox ? (z = { x1: 1 / 0, x2: -1 / 0, y1: 1 / 0, y2: -1 / 0 }, f.forEach(function(Z) {\n              var at = Z.scratch().dagre;\n              z.x1 = Math.min(z.x1, at.x), z.x2 = Math.max(z.x2, at.x), z.y1 = Math.min(z.y1, at.y), z.y2 = Math.max(z.y2, at.y);\n            }), z.w = z.x2 - z.x1, z.h = z.y2 - z.y1) : z = h, f.layoutPositions(this, n, function(Z) {\n              var at = (Z = x(Z) === \"object\" ? Z : this).scratch().dagre;\n              return function(nt) {\n                if (n.boundingBox) {\n                  var ht = z.w === 0 ? 0 : (nt.x - z.x1) / z.w, ct = z.h === 0 ? 0 : (nt.y - z.y1) / z.h;\n                  return { x: h.x1 + ht * h.w, y: h.y1 + ct * h.h };\n                }\n                return nt;\n              }({ x: at.x, y: at.y });\n            }), this;\n          }, w.exports = a;\n        },\n        function(w, E) {\n          var y = {\n            nodeSep: void 0,\n            edgeSep: void 0,\n            rankSep: void 0,\n            rankDir: void 0,\n            ranker: void 0,\n            minLen: function(x) {\n              return 1;\n            },\n            edgeWeight: function(x) {\n              return 1;\n            },\n            fit: !0,\n            padding: 30,\n            spacingFactor: void 0,\n            nodeDimensionsIncludeLabels: !1,\n            animate: !1,\n            animateFilter: function(x, g) {\n              return !0;\n            },\n            animationDuration: 500,\n            animationEasing: void 0,\n            boundingBox: void 0,\n            transform: function(x, g) {\n              return g;\n            },\n            ready: function() {\n            },\n            stop: function() {\n            }\n          };\n          w.exports = y;\n        },\n        function(w, E) {\n          w.exports = Object.assign != null ? Object.assign.bind(Object) : function(y) {\n            for (var x = arguments.length, g = new Array(x > 1 ? x - 1 : 0), o = 1; o < x; o++)\n              g[o - 1] = arguments[o];\n            return g.forEach(function(c) {\n              Object.keys(c).forEach(function(a) {\n                return y[a] = c[a];\n              });\n            }), y;\n          };\n        },\n        function(w, E) {\n          w.exports = A;\n        }\n      ]);\n    }, L.exports = u(e(246));\n  },\n  function(L, T, e) {\n    L.exports = {\n      graphlib: e(28),\n      layout: e(359),\n      debug: e(420),\n      util: { time: e(20).time, notime: e(20).notime },\n      version: e(421)\n    };\n  },\n  function(L, T, e) {\n    L.exports = { Graph: e(116), version: e(348) };\n  },\n  function(L, T, e) {\n    var u = e(149);\n    L.exports = function(A) {\n      return u(A, 4);\n    };\n  },\n  function(L, T) {\n    L.exports = function() {\n      this.__data__ = [], this.size = 0;\n    };\n  },\n  function(L, T, e) {\n    var u = e(75), A = Array.prototype.splice;\n    L.exports = function(w) {\n      var E = this.__data__, y = u(E, w);\n      return !(y < 0) && (y == E.length - 1 ? E.pop() : A.call(E, y, 1), --this.size, !0);\n    };\n  },\n  function(L, T, e) {\n    var u = e(75);\n    L.exports = function(A) {\n      var w = this.__data__, E = u(w, A);\n      return E < 0 ? void 0 : w[E][1];\n    };\n  },\n  function(L, T, e) {\n    var u = e(75);\n    L.exports = function(A) {\n      return u(this.__data__, A) > -1;\n    };\n  },\n  function(L, T, e) {\n    var u = e(75);\n    L.exports = function(A, w) {\n      var E = this.__data__, y = u(E, A);\n      return y < 0 ? (++this.size, E.push([A, w])) : E[y][1] = w, this;\n    };\n  },\n  function(L, T, e) {\n    var u = e(74);\n    L.exports = function() {\n      this.__data__ = new u(), this.size = 0;\n    };\n  },\n  function(L, T) {\n    L.exports = function(e) {\n      var u = this.__data__, A = u.delete(e);\n      return this.size = u.size, A;\n    };\n  },\n  function(L, T) {\n    L.exports = function(e) {\n      return this.__data__.get(e);\n    };\n  },\n  function(L, T) {\n    L.exports = function(e) {\n      return this.__data__.has(e);\n    };\n  },\n  function(L, T, e) {\n    var u = e(74), A = e(117), w = e(118);\n    L.exports = function(E, y) {\n      var x = this.__data__;\n      if (x instanceof u) {\n        var g = x.__data__;\n        if (!A || g.length < 199)\n          return g.push([E, y]), this.size = ++x.size, this;\n        x = this.__data__ = new w(g);\n      }\n      return x.set(E, y), this.size = x.size, this;\n    };\n  },\n  function(L, T, e) {\n    var u = e(64), A = e(262), w = e(23), E = e(151), y = /^\\[object .+?Constructor\\]$/, x = Function.prototype, g = Object.prototype, o = x.toString, c = g.hasOwnProperty, a = RegExp(\n      \"^\" + o.call(c).replace(/[\\\\^$.*+?()[\\]{}|]/g, \"\\\\$&\").replace(\n        /hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\n        \"$1.*?\"\n      ) + \"$\"\n    );\n    L.exports = function(n) {\n      return !(!w(n) || A(n)) && (u(n) ? a : y).test(E(n));\n    };\n  },\n  function(L, T, e) {\n    var u = e(58), A = Object.prototype, w = A.hasOwnProperty, E = A.toString, y = u ? u.toStringTag : void 0;\n    L.exports = function(x) {\n      var g = w.call(x, y), o = x[y];\n      try {\n        x[y] = void 0;\n        var c = !0;\n      } catch {\n      }\n      var a = E.call(x);\n      return c && (g ? x[y] = o : delete x[y]), a;\n    };\n  },\n  function(L, T) {\n    var e = Object.prototype.toString;\n    L.exports = function(u) {\n      return e.call(u);\n    };\n  },\n  function(L, T, e) {\n    var u, A = e(263), w = (u = /[^.]+$/.exec(A && A.keys && A.keys.IE_PROTO || \"\")) ? \"Symbol(src)_1.\" + u : \"\";\n    L.exports = function(E) {\n      return !!w && w in E;\n    };\n  },\n  function(L, T, e) {\n    var u = e(29)[\"__core-js_shared__\"];\n    L.exports = u;\n  },\n  function(L, T) {\n    L.exports = function(e, u) {\n      return e == null ? void 0 : e[u];\n    };\n  },\n  function(L, T, e) {\n    var u = e(266), A = e(74), w = e(117);\n    L.exports = function() {\n      this.size = 0, this.__data__ = {\n        hash: new u(),\n        map: new (w || A)(),\n        string: new u()\n      };\n    };\n  },\n  function(L, T, e) {\n    var u = e(267), A = e(268), w = e(269), E = e(270), y = e(271);\n    function x(g) {\n      var o = -1, c = g == null ? 0 : g.length;\n      for (this.clear(); ++o < c; ) {\n        var a = g[o];\n        this.set(a[0], a[1]);\n      }\n    }\n    x.prototype.clear = u, x.prototype.delete = A, x.prototype.get = w, x.prototype.has = E, x.prototype.set = y, L.exports = x;\n  },\n  function(L, T, e) {\n    var u = e(76);\n    L.exports = function() {\n      this.__data__ = u ? u(null) : {}, this.size = 0;\n    };\n  },\n  function(L, T) {\n    L.exports = function(e) {\n      var u = this.has(e) && delete this.__data__[e];\n      return this.size -= u ? 1 : 0, u;\n    };\n  },\n  function(L, T, e) {\n    var u = e(76), A = Object.prototype.hasOwnProperty;\n    L.exports = function(w) {\n      var E = this.__data__;\n      if (u) {\n        var y = E[w];\n        return y === \"__lodash_hash_undefined__\" ? void 0 : y;\n      }\n      return A.call(E, w) ? E[w] : void 0;\n    };\n  },\n  function(L, T, e) {\n    var u = e(76), A = Object.prototype.hasOwnProperty;\n    L.exports = function(w) {\n      var E = this.__data__;\n      return u ? E[w] !== void 0 : A.call(E, w);\n    };\n  },\n  function(L, T, e) {\n    var u = e(76);\n    L.exports = function(A, w) {\n      var E = this.__data__;\n      return this.size += this.has(A) ? 0 : 1, E[A] = u && w === void 0 ? \"__lodash_hash_undefined__\" : w, this;\n    };\n  },\n  function(L, T, e) {\n    var u = e(77);\n    L.exports = function(A) {\n      var w = u(this, A).delete(A);\n      return this.size -= w ? 1 : 0, w;\n    };\n  },\n  function(L, T) {\n    L.exports = function(e) {\n      var u = typeof e;\n      return u == \"string\" || u == \"number\" || u == \"symbol\" || u == \"boolean\" ? e !== \"__proto__\" : e === null;\n    };\n  },\n  function(L, T, e) {\n    var u = e(77);\n    L.exports = function(A) {\n      return u(this, A).get(A);\n    };\n  },\n  function(L, T, e) {\n    var u = e(77);\n    L.exports = function(A) {\n      return u(this, A).has(A);\n    };\n  },\n  function(L, T, e) {\n    var u = e(77);\n    L.exports = function(A, w) {\n      var E = u(this, A), y = E.size;\n      return E.set(A, w), this.size += E.size == y ? 0 : 1, this;\n    };\n  },\n  function(L, T, e) {\n    var u = e(65), A = e(41);\n    L.exports = function(w, E) {\n      return w && u(E, A(E), w);\n    };\n  },\n  function(L, T) {\n    L.exports = function(e, u) {\n      for (var A = -1, w = Array(e); ++A < e; ) w[A] = u(A);\n      return w;\n    };\n  },\n  function(L, T, e) {\n    var u = e(47), A = e(34);\n    L.exports = function(w) {\n      return A(w) && u(w) == \"[object Arguments]\";\n    };\n  },\n  function(L, T) {\n    L.exports = function() {\n      return !1;\n    };\n  },\n  function(L, T, e) {\n    var u = e(47), A = e(120), w = e(34), E = {};\n    E[\"[object Float32Array]\"] = E[\"[object Float64Array]\"] = E[\"[object Int8Array]\"] = E[\"[object Int16Array]\"] = E[\"[object Int32Array]\"] = E[\"[object Uint8Array]\"] = E[\"[object Uint8ClampedArray]\"] = E[\"[object Uint16Array]\"] = E[\"[object Uint32Array]\"] = !0, E[\"[object Arguments]\"] = E[\"[object Array]\"] = E[\"[object ArrayBuffer]\"] = E[\"[object Boolean]\"] = E[\"[object DataView]\"] = E[\"[object Date]\"] = E[\"[object Error]\"] = E[\"[object Function]\"] = E[\"[object Map]\"] = E[\"[object Number]\"] = E[\"[object Object]\"] = E[\"[object RegExp]\"] = E[\"[object Set]\"] = E[\"[object String]\"] = E[\"[object WeakMap]\"] = !1, L.exports = function(y) {\n      return w(y) && A(y.length) && !!E[u(y)];\n    };\n  },\n  function(L, T, e) {\n    var u = e(154)(Object.keys, Object);\n    L.exports = u;\n  },\n  function(L, T, e) {\n    var u = e(65), A = e(48);\n    L.exports = function(w, E) {\n      return w && u(E, A(E), w);\n    };\n  },\n  function(L, T, e) {\n    var u = e(23), A = e(83), w = e(285), E = Object.prototype.hasOwnProperty;\n    L.exports = function(y) {\n      if (!u(y)) return w(y);\n      var x = A(y), g = [];\n      for (var o in y)\n        (o != \"constructor\" || !x && E.call(y, o)) && g.push(o);\n      return g;\n    };\n  },\n  function(L, T) {\n    L.exports = function(e) {\n      var u = [];\n      if (e != null) for (var A in Object(e)) u.push(A);\n      return u;\n    };\n  },\n  function(L, T, e) {\n    var u = e(65), A = e(123);\n    L.exports = function(w, E) {\n      return u(w, A(w), E);\n    };\n  },\n  function(L, T, e) {\n    var u = e(65), A = e(159);\n    L.exports = function(w, E) {\n      return u(w, A(w), E);\n    };\n  },\n  function(L, T, e) {\n    var u = e(161), A = e(159), w = e(48);\n    L.exports = function(E) {\n      return u(E, w, A);\n    };\n  },\n  function(L, T, e) {\n    var u = e(46)(e(29), \"DataView\");\n    L.exports = u;\n  },\n  function(L, T, e) {\n    var u = e(46)(e(29), \"Promise\");\n    L.exports = u;\n  },\n  function(L, T, e) {\n    var u = e(46)(e(29), \"WeakMap\");\n    L.exports = u;\n  },\n  function(L, T) {\n    var e = Object.prototype.hasOwnProperty;\n    L.exports = function(u) {\n      var A = u.length, w = new u.constructor(A);\n      return A && typeof u[0] == \"string\" && e.call(u, \"index\") && (w.index = u.index, w.input = u.input), w;\n    };\n  },\n  function(L, T, e) {\n    var u = e(125), A = e(294), w = e(295), E = e(296), y = e(164);\n    L.exports = function(x, g, o) {\n      var c = x.constructor;\n      switch (g) {\n        case \"[object ArrayBuffer]\":\n          return u(x);\n        case \"[object Boolean]\":\n        case \"[object Date]\":\n          return new c(+x);\n        case \"[object DataView]\":\n          return A(x, o);\n        case \"[object Float32Array]\":\n        case \"[object Float64Array]\":\n        case \"[object Int8Array]\":\n        case \"[object Int16Array]\":\n        case \"[object Int32Array]\":\n        case \"[object Uint8Array]\":\n        case \"[object Uint8ClampedArray]\":\n        case \"[object Uint16Array]\":\n        case \"[object Uint32Array]\":\n          return y(x, o);\n        case \"[object Map]\":\n          return new c();\n        case \"[object Number]\":\n        case \"[object String]\":\n          return new c(x);\n        case \"[object RegExp]\":\n          return w(x);\n        case \"[object Set]\":\n          return new c();\n        case \"[object Symbol]\":\n          return E(x);\n      }\n    };\n  },\n  function(L, T, e) {\n    var u = e(125);\n    L.exports = function(A, w) {\n      var E = w ? u(A.buffer) : A.buffer;\n      return new A.constructor(E, A.byteOffset, A.byteLength);\n    };\n  },\n  function(L, T) {\n    var e = /\\w*$/;\n    L.exports = function(u) {\n      var A = new u.constructor(u.source, e.exec(u));\n      return A.lastIndex = u.lastIndex, A;\n    };\n  },\n  function(L, T, e) {\n    var u = e(58), A = u ? u.prototype : void 0, w = A ? A.valueOf : void 0;\n    L.exports = function(E) {\n      return w ? Object(w.call(E)) : {};\n    };\n  },\n  function(L, T, e) {\n    var u = e(298), A = e(82), w = e(121), E = w && w.isMap, y = E ? A(E) : u;\n    L.exports = y;\n  },\n  function(L, T, e) {\n    var u = e(60), A = e(34);\n    L.exports = function(w) {\n      return A(w) && u(w) == \"[object Map]\";\n    };\n  },\n  function(L, T, e) {\n    var u = e(300), A = e(82), w = e(121), E = w && w.isSet, y = E ? A(E) : u;\n    L.exports = y;\n  },\n  function(L, T, e) {\n    var u = e(60), A = e(34);\n    L.exports = function(w) {\n      return A(w) && u(w) == \"[object Set]\";\n    };\n  },\n  function(L, T) {\n    L.exports = function(e) {\n      return function(u, A, w) {\n        for (var E = -1, y = Object(u), x = w(u), g = x.length; g--; ) {\n          var o = x[e ? g : ++E];\n          if (A(y[o], o, y) === !1) break;\n        }\n        return u;\n      };\n    };\n  },\n  function(L, T, e) {\n    var u = e(36);\n    L.exports = function(A, w) {\n      return function(E, y) {\n        if (E == null) return E;\n        if (!u(E)) return A(E, y);\n        for (var x = E.length, g = w ? x : -1, o = Object(E); (w ? g-- : ++g < x) && y(o[g], g, o) !== !1; ) ;\n        return E;\n      };\n    };\n  },\n  function(L, T, e) {\n    var u = e(85);\n    L.exports = function(A, w) {\n      var E = [];\n      return u(A, function(y, x, g) {\n        w(y, x, g) && E.push(y);\n      }), E;\n    };\n  },\n  function(L, T, e) {\n    var u = e(305), A = e(313), w = e(176);\n    L.exports = function(E) {\n      var y = A(E);\n      return y.length == 1 && y[0][2] ? w(y[0][0], y[0][1]) : function(x) {\n        return x === E || u(x, E, y);\n      };\n    };\n  },\n  function(L, T, e) {\n    var u = e(73), A = e(171);\n    L.exports = function(w, E, y, x) {\n      var g = y.length, o = g, c = !x;\n      if (w == null) return !o;\n      for (w = Object(w); g--; ) {\n        var a = y[g];\n        if (c && a[2] ? a[1] !== w[a[0]] : !(a[0] in w)) return !1;\n      }\n      for (; ++g < o; ) {\n        var n = (a = y[g])[0], t = w[n], r = a[1];\n        if (c && a[2]) {\n          if (t === void 0 && !(n in w)) return !1;\n        } else {\n          var l = new u();\n          if (x) var h = x(t, r, n, w, E, l);\n          if (!(h === void 0 ? A(r, t, 3, x, l) : h)) return !1;\n        }\n      }\n      return !0;\n    };\n  },\n  function(L, T, e) {\n    var u = e(73), A = e(172), w = e(310), E = e(312), y = e(60), x = e(13), g = e(59), o = e(67), c = \"[object Object]\", a = Object.prototype.hasOwnProperty;\n    L.exports = function(n, t, r, l, h, i) {\n      var d = x(n), p = x(t), f = d ? \"[object Array]\" : y(n), v = p ? \"[object Array]\" : y(t), k = (f = f == \"[object Arguments]\" ? c : f) == c, s = (v = v == \"[object Arguments]\" ? c : v) == c, S = f == v;\n      if (S && g(n)) {\n        if (!g(t)) return !1;\n        d = !0, k = !1;\n      }\n      if (S && !k)\n        return i || (i = new u()), d || o(n) ? A(n, t, r, l, h, i) : w(n, t, f, r, l, h, i);\n      if (!(1 & r)) {\n        var j = k && a.call(n, \"__wrapped__\"), I = s && a.call(t, \"__wrapped__\");\n        if (j || I) {\n          var R = j ? n.value() : n, M = I ? t.value() : t;\n          return i || (i = new u()), h(R, M, r, l, i);\n        }\n      }\n      return !!S && (i || (i = new u()), E(n, t, r, l, h, i));\n    };\n  },\n  function(L, T) {\n    L.exports = function(e) {\n      return this.__data__.set(e, \"__lodash_hash_undefined__\"), this;\n    };\n  },\n  function(L, T) {\n    L.exports = function(e) {\n      return this.__data__.has(e);\n    };\n  },\n  function(L, T) {\n    L.exports = function(e, u) {\n      for (var A = -1, w = e == null ? 0 : e.length; ++A < w; )\n        if (u(e[A], A, e)) return !0;\n      return !1;\n    };\n  },\n  function(L, T, e) {\n    var u = e(58), A = e(163), w = e(57), E = e(172), y = e(311), x = e(129), g = u ? u.prototype : void 0, o = g ? g.valueOf : void 0;\n    L.exports = function(c, a, n, t, r, l, h) {\n      switch (n) {\n        case \"[object DataView]\":\n          if (c.byteLength != a.byteLength || c.byteOffset != a.byteOffset)\n            return !1;\n          c = c.buffer, a = a.buffer;\n        case \"[object ArrayBuffer]\":\n          return !(c.byteLength != a.byteLength || !l(new A(c), new A(a)));\n        case \"[object Boolean]\":\n        case \"[object Date]\":\n        case \"[object Number]\":\n          return w(+c, +a);\n        case \"[object Error]\":\n          return c.name == a.name && c.message == a.message;\n        case \"[object RegExp]\":\n        case \"[object String]\":\n          return c == a + \"\";\n        case \"[object Map]\":\n          var i = y;\n        case \"[object Set]\":\n          var d = 1 & t;\n          if (i || (i = x), c.size != a.size && !d) return !1;\n          var p = h.get(c);\n          if (p) return p == a;\n          t |= 2, h.set(c, a);\n          var f = E(i(c), i(a), t, r, l, h);\n          return h.delete(c), f;\n        case \"[object Symbol]\":\n          if (o) return o.call(c) == o.call(a);\n      }\n      return !1;\n    };\n  },\n  function(L, T) {\n    L.exports = function(e) {\n      var u = -1, A = Array(e.size);\n      return e.forEach(function(w, E) {\n        A[++u] = [E, w];\n      }), A;\n    };\n  },\n  function(L, T, e) {\n    var u = e(160), A = Object.prototype.hasOwnProperty;\n    L.exports = function(w, E, y, x, g, o) {\n      var c = 1 & y, a = u(w), n = a.length;\n      if (n != u(E).length && !c) return !1;\n      for (var t = n; t--; ) {\n        var r = a[t];\n        if (!(c ? r in E : A.call(E, r))) return !1;\n      }\n      var l = o.get(w), h = o.get(E);\n      if (l && h) return l == E && h == w;\n      var i = !0;\n      o.set(w, E), o.set(E, w);\n      for (var d = c; ++t < n; ) {\n        var p = w[r = a[t]], f = E[r];\n        if (x) var v = c ? x(f, p, r, E, w, o) : x(p, f, r, w, E, o);\n        if (!(v === void 0 ? p === f || g(p, f, y, x, o) : v)) {\n          i = !1;\n          break;\n        }\n        d || (d = r == \"constructor\");\n      }\n      if (i && !d) {\n        var k = w.constructor, s = E.constructor;\n        k == s || !(\"constructor\" in w) || !(\"constructor\" in E) || typeof k == \"function\" && k instanceof k && typeof s == \"function\" && s instanceof s || (i = !1);\n      }\n      return o.delete(w), o.delete(E), i;\n    };\n  },\n  function(L, T, e) {\n    var u = e(175), A = e(41);\n    L.exports = function(w) {\n      for (var E = A(w), y = E.length; y--; ) {\n        var x = E[y], g = w[x];\n        E[y] = [x, g, u(g)];\n      }\n      return E;\n    };\n  },\n  function(L, T, e) {\n    var u = e(171), A = e(315), w = e(178), E = e(130), y = e(175), x = e(176), g = e(68);\n    L.exports = function(o, c) {\n      return E(o) && y(c) ? x(g(o), c) : function(a) {\n        var n = A(a, o);\n        return n === void 0 && n === c ? w(a, o) : u(c, n, 3);\n      };\n    };\n  },\n  function(L, T, e) {\n    var u = e(86);\n    L.exports = function(A, w, E) {\n      var y = A == null ? void 0 : u(A, w);\n      return y === void 0 ? E : y;\n    };\n  },\n  function(L, T, e) {\n    var u = e(317), A = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g, w = /\\\\(\\\\)?/g, E = u(function(y) {\n      var x = [];\n      return y.charCodeAt(0) === 46 && x.push(\"\"), y.replace(A, function(g, o, c, a) {\n        x.push(c ? a.replace(w, \"$1\") : o || g);\n      }), x;\n    });\n    L.exports = E;\n  },\n  function(L, T, e) {\n    var u = e(318);\n    L.exports = function(A) {\n      var w = u(A, function(y) {\n        return E.size === 500 && E.clear(), y;\n      }), E = w.cache;\n      return w;\n    };\n  },\n  function(L, T, e) {\n    var u = e(118);\n    function A(w, E) {\n      if (typeof w != \"function\" || E != null && typeof E != \"function\")\n        throw new TypeError(\"Expected a function\");\n      var y = function() {\n        var x = arguments, g = E ? E.apply(this, x) : x[0], o = y.cache;\n        if (o.has(g)) return o.get(g);\n        var c = w.apply(this, x);\n        return y.cache = o.set(g, c) || o, c;\n      };\n      return y.cache = new (A.Cache || u)(), y;\n    }\n    A.Cache = u, L.exports = A;\n  },\n  function(L, T, e) {\n    var u = e(58), A = e(88), w = e(13), E = e(61), y = u ? u.prototype : void 0, x = y ? y.toString : void 0;\n    L.exports = function g(o) {\n      if (typeof o == \"string\") return o;\n      if (w(o)) return A(o, g) + \"\";\n      if (E(o)) return x ? x.call(o) : \"\";\n      var c = o + \"\";\n      return c == \"0\" && 1 / o == -1 / 0 ? \"-0\" : c;\n    };\n  },\n  function(L, T) {\n    L.exports = function(e, u) {\n      return e != null && u in Object(e);\n    };\n  },\n  function(L, T, e) {\n    var u = e(180), A = e(322), w = e(130), E = e(68);\n    L.exports = function(y) {\n      return w(y) ? u(E(y)) : A(y);\n    };\n  },\n  function(L, T, e) {\n    var u = e(86);\n    L.exports = function(A) {\n      return function(w) {\n        return u(w, A);\n      };\n    };\n  },\n  function(L, T) {\n    var e = Object.prototype.hasOwnProperty;\n    L.exports = function(u, A) {\n      return u != null && e.call(u, A);\n    };\n  },\n  function(L, T, e) {\n    var u = e(122), A = e(60), w = e(66), E = e(13), y = e(36), x = e(59), g = e(83), o = e(67), c = Object.prototype.hasOwnProperty;\n    L.exports = function(a) {\n      if (a == null) return !0;\n      if (y(a) && (E(a) || typeof a == \"string\" || typeof a.splice == \"function\" || x(a) || o(a) || w(a)))\n        return !a.length;\n      var n = A(a);\n      if (n == \"[object Map]\" || n == \"[object Set]\") return !a.size;\n      if (g(a)) return !u(a).length;\n      for (var t in a) if (c.call(a, t)) return !1;\n      return !0;\n    };\n  },\n  function(L, T) {\n    L.exports = function(e, u, A, w) {\n      var E = -1, y = e == null ? 0 : e.length;\n      for (w && y && (A = e[++E]); ++E < y; ) A = u(A, e[E], E, e);\n      return A;\n    };\n  },\n  function(L, T) {\n    L.exports = function(e, u, A, w, E) {\n      return E(e, function(y, x, g) {\n        A = w ? (w = !1, y) : u(A, y, x, g);\n      }), A;\n    };\n  },\n  function(L, T, e) {\n    var u = e(122), A = e(60), w = e(36), E = e(328), y = e(329);\n    L.exports = function(x) {\n      if (x == null) return 0;\n      if (w(x)) return E(x) ? y(x) : x.length;\n      var g = A(x);\n      return g == \"[object Map]\" || g == \"[object Set]\" ? x.size : u(x).length;\n    };\n  },\n  function(L, T, e) {\n    var u = e(47), A = e(13), w = e(34);\n    L.exports = function(E) {\n      return typeof E == \"string\" || !A(E) && w(E) && u(E) == \"[object String]\";\n    };\n  },\n  function(L, T, e) {\n    var u = e(330), A = e(331), w = e(332);\n    L.exports = function(E) {\n      return A(E) ? w(E) : u(E);\n    };\n  },\n  function(L, T, e) {\n    var u = e(180)(\"length\");\n    L.exports = u;\n  },\n  function(L, T) {\n    var e = RegExp(\n      \"[\\\\u200d\\\\ud800-\\\\udfff\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff\\\\ufe0e\\\\ufe0f]\"\n    );\n    L.exports = function(u) {\n      return e.test(u);\n    };\n  },\n  function(L, T) {\n    var e = \"[\\\\ud800-\\\\udfff]\", u = \"[\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff]\", A = \"\\\\ud83c[\\\\udffb-\\\\udfff]\", w = \"[^\\\\ud800-\\\\udfff]\", E = \"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\", y = \"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\", x = \"(?:\" + u + \"|\" + A + \")?\", g = \"[\\\\ufe0e\\\\ufe0f]?\" + x + (\"(?:\\\\u200d(?:\" + [w, E, y].join(\"|\") + \")[\\\\ufe0e\\\\ufe0f]?\" + x + \")*\"), o = \"(?:\" + [w + u + \"?\", u, E, y, e].join(\"|\") + \")\", c = RegExp(A + \"(?=\" + A + \")|\" + o + g, \"g\");\n    L.exports = function(a) {\n      for (var n = c.lastIndex = 0; c.test(a); ) ++n;\n      return n;\n    };\n  },\n  function(L, T, e) {\n    var u = e(119), A = e(166), w = e(127), E = e(37), y = e(84), x = e(13), g = e(59), o = e(64), c = e(23), a = e(67);\n    L.exports = function(n, t, r) {\n      var l = x(n), h = l || g(n) || a(n);\n      if (t = E(t, 4), r == null) {\n        var i = n && n.constructor;\n        r = h ? l ? new i() : [] : c(n) && o(i) ? A(y(n)) : {};\n      }\n      return (h ? u : w)(n, function(d, p, f) {\n        return t(r, d, p, f);\n      }), r;\n    };\n  },\n  function(L, T, e) {\n    var u = e(131), A = e(89), w = e(339), E = e(189), y = A(function(x) {\n      return w(u(x, 1, E, !0));\n    });\n    L.exports = y;\n  },\n  function(L, T, e) {\n    var u = e(58), A = e(66), w = e(13), E = u ? u.isConcatSpreadable : void 0;\n    L.exports = function(y) {\n      return w(y) || A(y) || !!(E && y && y[E]);\n    };\n  },\n  function(L, T) {\n    L.exports = function(e, u, A) {\n      switch (A.length) {\n        case 0:\n          return e.call(u);\n        case 1:\n          return e.call(u, A[0]);\n        case 2:\n          return e.call(u, A[0], A[1]);\n        case 3:\n          return e.call(u, A[0], A[1], A[2]);\n      }\n      return e.apply(u, A);\n    };\n  },\n  function(L, T, e) {\n    var u = e(126), A = e(152), w = e(49), E = A ? function(y, x) {\n      return A(y, \"toString\", {\n        configurable: !0,\n        enumerable: !1,\n        value: u(x),\n        writable: !0\n      });\n    } : w;\n    L.exports = E;\n  },\n  function(L, T) {\n    var e = Date.now;\n    L.exports = function(u) {\n      var A = 0, w = 0;\n      return function() {\n        var E = e(), y = 16 - (E - w);\n        if (w = E, y > 0) {\n          if (++A >= 800) return arguments[0];\n        } else A = 0;\n        return u.apply(void 0, arguments);\n      };\n    };\n  },\n  function(L, T, e) {\n    var u = e(173), A = e(340), w = e(344), E = e(174), y = e(345), x = e(129);\n    L.exports = function(g, o, c) {\n      var a = -1, n = A, t = g.length, r = !0, l = [], h = l;\n      if (c) r = !1, n = w;\n      else if (t >= 200) {\n        var i = o ? null : y(g);\n        if (i) return x(i);\n        r = !1, n = E, h = new u();\n      } else h = o ? [] : l;\n      t: for (; ++a < t; ) {\n        var d = g[a], p = o ? o(d) : d;\n        if (d = c || d !== 0 ? d : 0, r && p == p) {\n          for (var f = h.length; f--; ) if (h[f] === p) continue t;\n          o && h.push(p), l.push(d);\n        } else n(h, p, c) || (h !== l && h.push(p), l.push(d));\n      }\n      return l;\n    };\n  },\n  function(L, T, e) {\n    var u = e(341);\n    L.exports = function(A, w) {\n      return !!(A != null && A.length) && u(A, w, 0) > -1;\n    };\n  },\n  function(L, T, e) {\n    var u = e(188), A = e(342), w = e(343);\n    L.exports = function(E, y, x) {\n      return y == y ? w(E, y, x) : u(E, A, x);\n    };\n  },\n  function(L, T) {\n    L.exports = function(e) {\n      return e != e;\n    };\n  },\n  function(L, T) {\n    L.exports = function(e, u, A) {\n      for (var w = A - 1, E = e.length; ++w < E; ) if (e[w] === u) return w;\n      return -1;\n    };\n  },\n  function(L, T) {\n    L.exports = function(e, u, A) {\n      for (var w = -1, E = e == null ? 0 : e.length; ++w < E; )\n        if (A(u, e[w])) return !0;\n      return !1;\n    };\n  },\n  function(L, T, e) {\n    var u = e(162), A = e(346), w = e(129), E = u && 1 / w(new u([, -0]))[1] == 1 / 0 ? function(y) {\n      return new u(y);\n    } : A;\n    L.exports = E;\n  },\n  function(L, T) {\n    L.exports = function() {\n    };\n  },\n  function(L, T, e) {\n    var u = e(88);\n    L.exports = function(A, w) {\n      return u(w, function(E) {\n        return A[E];\n      });\n    };\n  },\n  function(L, T) {\n    L.exports = \"2.1.8\";\n  },\n  function(L, T, e) {\n    var u = e(22), A = e(116);\n    function w(y) {\n      return u.map(y.nodes(), function(x) {\n        var g = y.node(x), o = y.parent(x), c = { v: x };\n        return u.isUndefined(g) || (c.value = g), u.isUndefined(o) || (c.parent = o), c;\n      });\n    }\n    function E(y) {\n      return u.map(y.edges(), function(x) {\n        var g = y.edge(x), o = { v: x.v, w: x.w };\n        return u.isUndefined(x.name) || (o.name = x.name), u.isUndefined(g) || (o.value = g), o;\n      });\n    }\n    L.exports = {\n      write: function(y) {\n        var x = {\n          options: {\n            directed: y.isDirected(),\n            multigraph: y.isMultigraph(),\n            compound: y.isCompound()\n          },\n          nodes: w(y),\n          edges: E(y)\n        };\n        return u.isUndefined(y.graph()) || (x.value = u.clone(y.graph())), x;\n      },\n      read: function(y) {\n        var x = new A(y.options).setGraph(y.value);\n        return u.each(y.nodes, function(g) {\n          x.setNode(g.v, g.value), g.parent && x.setParent(g.v, g.parent);\n        }), u.each(y.edges, function(g) {\n          x.setEdge({ v: g.v, w: g.w, name: g.name }, g.value);\n        }), x;\n      }\n    };\n  },\n  function(L, T, e) {\n    L.exports = {\n      components: e(351),\n      dijkstra: e(191),\n      dijkstraAll: e(352),\n      findCycles: e(353),\n      floydWarshall: e(354),\n      isAcyclic: e(355),\n      postorder: e(356),\n      preorder: e(357),\n      prim: e(358),\n      tarjan: e(193),\n      topsort: e(194)\n    };\n  },\n  function(L, T, e) {\n    var u = e(22);\n    L.exports = function(A) {\n      var w, E = {}, y = [];\n      function x(g) {\n        u.has(E, g) || (E[g] = !0, w.push(g), u.each(A.successors(g), x), u.each(A.predecessors(g), x));\n      }\n      return u.each(A.nodes(), function(g) {\n        w = [], x(g), w.length && y.push(w);\n      }), y;\n    };\n  },\n  function(L, T, e) {\n    var u = e(191), A = e(22);\n    L.exports = function(w, E, y) {\n      return A.transform(\n        w.nodes(),\n        function(x, g) {\n          x[g] = u(w, g, E, y);\n        },\n        {}\n      );\n    };\n  },\n  function(L, T, e) {\n    var u = e(22), A = e(193);\n    L.exports = function(w) {\n      return u.filter(A(w), function(E) {\n        return E.length > 1 || E.length === 1 && w.hasEdge(E[0], E[0]);\n      });\n    };\n  },\n  function(L, T, e) {\n    var u = e(22);\n    L.exports = function(w, E, y) {\n      return function(x, g, o) {\n        var c = {}, a = x.nodes();\n        return a.forEach(function(n) {\n          c[n] = {}, c[n][n] = { distance: 0 }, a.forEach(function(t) {\n            n !== t && (c[n][t] = { distance: Number.POSITIVE_INFINITY });\n          }), o(n).forEach(function(t) {\n            var r = t.v === n ? t.w : t.v, l = g(t);\n            c[n][r] = { distance: l, predecessor: n };\n          });\n        }), a.forEach(function(n) {\n          var t = c[n];\n          a.forEach(function(r) {\n            var l = c[r];\n            a.forEach(function(h) {\n              var i = l[n], d = t[h], p = l[h], f = i.distance + d.distance;\n              f < p.distance && (p.distance = f, p.predecessor = d.predecessor);\n            });\n          });\n        }), c;\n      }(\n        w,\n        E || A,\n        y || function(x) {\n          return w.outEdges(x);\n        }\n      );\n    };\n    var A = u.constant(1);\n  },\n  function(L, T, e) {\n    var u = e(194);\n    L.exports = function(A) {\n      try {\n        u(A);\n      } catch (w) {\n        if (w instanceof u.CycleException) return !1;\n        throw w;\n      }\n      return !0;\n    };\n  },\n  function(L, T, e) {\n    var u = e(195);\n    L.exports = function(A, w) {\n      return u(A, w, \"post\");\n    };\n  },\n  function(L, T, e) {\n    var u = e(195);\n    L.exports = function(A, w) {\n      return u(A, w, \"pre\");\n    };\n  },\n  function(L, T, e) {\n    var u = e(22), A = e(116), w = e(192);\n    L.exports = function(E, y) {\n      var x, g = new A(), o = {}, c = new w();\n      function a(t) {\n        var r = t.v === x ? t.w : t.v, l = c.priority(r);\n        if (l !== void 0) {\n          var h = y(t);\n          h < l && (o[r] = x, c.decrease(r, h));\n        }\n      }\n      if (E.nodeCount() === 0) return g;\n      u.each(E.nodes(), function(t) {\n        c.add(t, Number.POSITIVE_INFINITY), g.setNode(t);\n      }), c.decrease(E.nodes()[0], 0);\n      for (var n = !1; c.size() > 0; ) {\n        if (x = c.removeMin(), u.has(o, x)) g.setEdge(x, o[x]);\n        else {\n          if (n) throw new Error(\"Input graph is not connected: \" + E);\n          n = !0;\n        }\n        E.nodeEdges(x).forEach(a);\n      }\n      return g;\n    };\n  },\n  function(L, T, e) {\n    var u = e(11), A = e(399), w = e(402), E = e(403), y = e(20).normalizeRanks, x = e(405), g = e(20).removeEmptyRanks, o = e(406), c = e(407), a = e(408), n = e(409), t = e(418), r = e(20), l = e(28).Graph;\n    L.exports = function(I, R) {\n      var M = R && R.debugTiming ? r.time : r.notime;\n      M(\"layout\", function() {\n        var z = M(\"  buildLayoutGraph\", function() {\n          return function(V) {\n            var G = new l({ multigraph: !0, compound: !0 }), Y = j(V.graph());\n            return G.setGraph(u.merge({}, i, S(Y, h), u.pick(Y, d))), u.forEach(V.nodes(), function(tt) {\n              var Z = j(V.node(tt));\n              G.setNode(tt, u.defaults(S(Z, p), f)), G.setParent(tt, V.parent(tt));\n            }), u.forEach(V.edges(), function(tt) {\n              var Z = j(V.edge(tt));\n              G.setEdge(tt, u.merge({}, k, S(Z, v), u.pick(Z, s)));\n            }), G;\n          }(I);\n        });\n        M(\"  runLayout\", function() {\n          (function(V, G) {\n            G(\"    makeSpaceForEdgeLabels\", function() {\n              (function(Y) {\n                var tt = Y.graph();\n                tt.ranksep /= 2, u.forEach(Y.edges(), function(Z) {\n                  var at = Y.edge(Z);\n                  at.minlen *= 2, at.labelpos.toLowerCase() !== \"c\" && (tt.rankdir === \"TB\" || tt.rankdir === \"BT\" ? at.width += at.labeloffset : at.height += at.labeloffset);\n                });\n              })(V);\n            }), G(\"    removeSelfEdges\", function() {\n              (function(Y) {\n                u.forEach(Y.edges(), function(tt) {\n                  if (tt.v === tt.w) {\n                    var Z = Y.node(tt.v);\n                    Z.selfEdges || (Z.selfEdges = []), Z.selfEdges.push({ e: tt, label: Y.edge(tt) }), Y.removeEdge(tt);\n                  }\n                });\n              })(V);\n            }), G(\"    acyclic\", function() {\n              A.run(V);\n            }), G(\"    nestingGraph.run\", function() {\n              o.run(V);\n            }), G(\"    rank\", function() {\n              E(r.asNonCompoundGraph(V));\n            }), G(\"    injectEdgeLabelProxies\", function() {\n              (function(Y) {\n                u.forEach(Y.edges(), function(tt) {\n                  var Z = Y.edge(tt);\n                  if (Z.width && Z.height) {\n                    var at = Y.node(tt.v), nt = {\n                      rank: (Y.node(tt.w).rank - at.rank) / 2 + at.rank,\n                      e: tt\n                    };\n                    r.addDummyNode(Y, \"edge-proxy\", nt, \"_ep\");\n                  }\n                });\n              })(V);\n            }), G(\"    removeEmptyRanks\", function() {\n              g(V);\n            }), G(\"    nestingGraph.cleanup\", function() {\n              o.cleanup(V);\n            }), G(\"    normalizeRanks\", function() {\n              y(V);\n            }), G(\"    assignRankMinMax\", function() {\n              (function(Y) {\n                var tt = 0;\n                u.forEach(Y.nodes(), function(Z) {\n                  var at = Y.node(Z);\n                  at.borderTop && (at.minRank = Y.node(at.borderTop).rank, at.maxRank = Y.node(at.borderBottom).rank, tt = u.max(tt, at.maxRank));\n                }), Y.graph().maxRank = tt;\n              })(V);\n            }), G(\"    removeEdgeLabelProxies\", function() {\n              (function(Y) {\n                u.forEach(Y.nodes(), function(tt) {\n                  var Z = Y.node(tt);\n                  Z.dummy === \"edge-proxy\" && (Y.edge(Z.e).labelRank = Z.rank, Y.removeNode(tt));\n                });\n              })(V);\n            }), G(\"    normalize.run\", function() {\n              w.run(V);\n            }), G(\"    parentDummyChains\", function() {\n              x(V);\n            }), G(\"    addBorderSegments\", function() {\n              c(V);\n            }), G(\"    order\", function() {\n              n(V);\n            }), G(\"    insertSelfEdges\", function() {\n              (function(Y) {\n                var tt = r.buildLayerMatrix(Y);\n                u.forEach(tt, function(Z) {\n                  var at = 0;\n                  u.forEach(Z, function(nt, ht) {\n                    var ct = Y.node(nt);\n                    ct.order = ht + at, u.forEach(ct.selfEdges, function(ot) {\n                      r.addDummyNode(\n                        Y,\n                        \"selfedge\",\n                        {\n                          width: ot.label.width,\n                          height: ot.label.height,\n                          rank: ct.rank,\n                          order: ht + ++at,\n                          e: ot.e,\n                          label: ot.label\n                        },\n                        \"_se\"\n                      );\n                    }), delete ct.selfEdges;\n                  });\n                });\n              })(V);\n            }), G(\"    adjustCoordinateSystem\", function() {\n              a.adjust(V);\n            }), G(\"    position\", function() {\n              t(V);\n            }), G(\"    positionSelfEdges\", function() {\n              (function(Y) {\n                u.forEach(Y.nodes(), function(tt) {\n                  var Z = Y.node(tt);\n                  if (Z.dummy === \"selfedge\") {\n                    var at = Y.node(Z.e.v), nt = at.x + at.width / 2, ht = at.y, ct = Z.x - nt, ot = at.height / 2;\n                    Y.setEdge(Z.e, Z.label), Y.removeNode(tt), Z.label.points = [\n                      { x: nt + 2 * ct / 3, y: ht - ot },\n                      { x: nt + 5 * ct / 6, y: ht - ot },\n                      { x: nt + ct, y: ht },\n                      { x: nt + 5 * ct / 6, y: ht + ot },\n                      { x: nt + 2 * ct / 3, y: ht + ot }\n                    ], Z.label.x = Z.x, Z.label.y = Z.y;\n                  }\n                });\n              })(V);\n            }), G(\"    removeBorderNodes\", function() {\n              (function(Y) {\n                u.forEach(Y.nodes(), function(tt) {\n                  if (Y.children(tt).length) {\n                    var Z = Y.node(tt), at = Y.node(Z.borderTop), nt = Y.node(Z.borderBottom), ht = Y.node(u.last(Z.borderLeft)), ct = Y.node(u.last(Z.borderRight));\n                    Z.width = Math.abs(ct.x - ht.x), Z.height = Math.abs(nt.y - at.y), Z.x = ht.x + Z.width / 2, Z.y = at.y + Z.height / 2;\n                  }\n                }), u.forEach(Y.nodes(), function(tt) {\n                  Y.node(tt).dummy === \"border\" && Y.removeNode(tt);\n                });\n              })(V);\n            }), G(\"    normalize.undo\", function() {\n              w.undo(V);\n            }), G(\"    fixupEdgeLabelCoords\", function() {\n              (function(Y) {\n                u.forEach(Y.edges(), function(tt) {\n                  var Z = Y.edge(tt);\n                  if (u.has(Z, \"x\"))\n                    switch (Z.labelpos !== \"l\" && Z.labelpos !== \"r\" || (Z.width -= Z.labeloffset), Z.labelpos) {\n                      case \"l\":\n                        Z.x -= Z.width / 2 + Z.labeloffset;\n                        break;\n                      case \"r\":\n                        Z.x += Z.width / 2 + Z.labeloffset;\n                    }\n                });\n              })(V);\n            }), G(\"    undoCoordinateSystem\", function() {\n              a.undo(V);\n            }), G(\"    translateGraph\", function() {\n              (function(Y) {\n                var tt = Number.POSITIVE_INFINITY, Z = 0, at = Number.POSITIVE_INFINITY, nt = 0, ht = Y.graph(), ct = ht.marginx || 0, ot = ht.marginy || 0;\n                function gt(xt) {\n                  var St = xt.x, zt = xt.y, Nt = xt.width, re = xt.height;\n                  tt = Math.min(tt, St - Nt / 2), Z = Math.max(Z, St + Nt / 2), at = Math.min(at, zt - re / 2), nt = Math.max(nt, zt + re / 2);\n                }\n                u.forEach(Y.nodes(), function(xt) {\n                  gt(Y.node(xt));\n                }), u.forEach(Y.edges(), function(xt) {\n                  var St = Y.edge(xt);\n                  u.has(St, \"x\") && gt(St);\n                }), tt -= ct, at -= ot, u.forEach(Y.nodes(), function(xt) {\n                  var St = Y.node(xt);\n                  St.x -= tt, St.y -= at;\n                }), u.forEach(Y.edges(), function(xt) {\n                  var St = Y.edge(xt);\n                  u.forEach(St.points, function(zt) {\n                    zt.x -= tt, zt.y -= at;\n                  }), u.has(St, \"x\") && (St.x -= tt), u.has(St, \"y\") && (St.y -= at);\n                }), ht.width = Z - tt + ct, ht.height = nt - at + ot;\n              })(V);\n            }), G(\"    assignNodeIntersects\", function() {\n              (function(Y) {\n                u.forEach(Y.edges(), function(tt) {\n                  var Z, at, nt = Y.edge(tt), ht = Y.node(tt.v), ct = Y.node(tt.w);\n                  nt.points ? (Z = nt.points[0], at = nt.points[nt.points.length - 1]) : (nt.points = [], Z = ct, at = ht), nt.points.unshift(r.intersectRect(ht, Z)), nt.points.push(r.intersectRect(ct, at));\n                });\n              })(V);\n            }), G(\"    reversePoints\", function() {\n              (function(Y) {\n                u.forEach(Y.edges(), function(tt) {\n                  var Z = Y.edge(tt);\n                  Z.reversed && Z.points.reverse();\n                });\n              })(V);\n            }), G(\"    acyclic.undo\", function() {\n              A.undo(V);\n            });\n          })(z, M);\n        }), M(\"  updateInputGraph\", function() {\n          (function(V, G) {\n            u.forEach(V.nodes(), function(Y) {\n              var tt = V.node(Y), Z = G.node(Y);\n              tt && (tt.x = Z.x, tt.y = Z.y, G.children(Y).length && (tt.width = Z.width, tt.height = Z.height));\n            }), u.forEach(V.edges(), function(Y) {\n              var tt = V.edge(Y), Z = G.edge(Y);\n              tt.points = Z.points, u.has(Z, \"x\") && (tt.x = Z.x, tt.y = Z.y);\n            }), V.graph().width = G.graph().width, V.graph().height = G.graph().height;\n          })(I, z);\n        });\n      });\n    };\n    var h = [\"nodesep\", \"edgesep\", \"ranksep\", \"marginx\", \"marginy\"], i = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: \"tb\" }, d = [\"acyclicer\", \"ranker\", \"rankdir\", \"align\"], p = [\"width\", \"height\"], f = { width: 0, height: 0 }, v = [\"minlen\", \"weight\", \"width\", \"height\", \"labeloffset\"], k = {\n      minlen: 1,\n      weight: 1,\n      width: 0,\n      height: 0,\n      labeloffset: 10,\n      labelpos: \"r\"\n    }, s = [\"labelpos\"];\n    function S(I, R) {\n      return u.mapValues(u.pick(I, R), Number);\n    }\n    function j(I) {\n      var R = {};\n      return u.forEach(I, function(M, z) {\n        R[z.toLowerCase()] = M;\n      }), R;\n    }\n  },\n  function(L, T, e) {\n    var u = e(149);\n    L.exports = function(A) {\n      return u(A, 5);\n    };\n  },\n  function(L, T, e) {\n    var u = e(89), A = e(57), w = e(90), E = e(48), y = Object.prototype, x = y.hasOwnProperty, g = u(function(o, c) {\n      o = Object(o);\n      var a = -1, n = c.length, t = n > 2 ? c[2] : void 0;\n      for (t && w(c[0], c[1], t) && (n = 1); ++a < n; )\n        for (var r = c[a], l = E(r), h = -1, i = l.length; ++h < i; ) {\n          var d = l[h], p = o[d];\n          (p === void 0 || A(p, y[d]) && !x.call(o, d)) && (o[d] = r[d]);\n        }\n      return o;\n    });\n    L.exports = g;\n  },\n  function(L, T, e) {\n    var u = e(363)(e(364));\n    L.exports = u;\n  },\n  function(L, T, e) {\n    var u = e(37), A = e(36), w = e(41);\n    L.exports = function(E) {\n      return function(y, x, g) {\n        var o = Object(y);\n        if (!A(y)) {\n          var c = u(x, 3);\n          y = w(y), x = function(n) {\n            return c(o[n], n, o);\n          };\n        }\n        var a = E(y, x, g);\n        return a > -1 ? o[c ? y[a] : a] : void 0;\n      };\n    };\n  },\n  function(L, T, e) {\n    var u = e(188), A = e(37), w = e(365), E = Math.max;\n    L.exports = function(y, x, g) {\n      var o = y == null ? 0 : y.length;\n      if (!o) return -1;\n      var c = g == null ? 0 : w(g);\n      return c < 0 && (c = E(o + c, 0)), u(y, A(x, 3), c);\n    };\n  },\n  function(L, T, e) {\n    var u = e(196);\n    L.exports = function(A) {\n      var w = u(A), E = w % 1;\n      return w == w ? E ? w - E : w : 0;\n    };\n  },\n  function(L, T, e) {\n    var u = e(367), A = e(23), w = e(61), E = /^[-+]0x[0-9a-f]+$/i, y = /^0b[01]+$/i, x = /^0o[0-7]+$/i, g = parseInt;\n    L.exports = function(o) {\n      if (typeof o == \"number\") return o;\n      if (w(o)) return NaN;\n      if (A(o)) {\n        var c = typeof o.valueOf == \"function\" ? o.valueOf() : o;\n        o = A(c) ? c + \"\" : c;\n      }\n      if (typeof o != \"string\") return o === 0 ? o : +o;\n      o = u(o);\n      var a = y.test(o);\n      return a || x.test(o) ? g(o.slice(2), a ? 2 : 8) : E.test(o) ? NaN : +o;\n    };\n  },\n  function(L, T, e) {\n    var u = e(368), A = /^\\s+/;\n    L.exports = function(w) {\n      return w && w.slice(0, u(w) + 1).replace(A, \"\");\n    };\n  },\n  function(L, T) {\n    var e = /\\s/;\n    L.exports = function(u) {\n      for (var A = u.length; A-- && e.test(u.charAt(A)); ) ;\n      return A;\n    };\n  },\n  function(L, T, e) {\n    var u = e(128), A = e(169), w = e(48);\n    L.exports = function(E, y) {\n      return E == null ? E : u(E, A(y), w);\n    };\n  },\n  function(L, T) {\n    L.exports = function(e) {\n      var u = e == null ? 0 : e.length;\n      return u ? e[u - 1] : void 0;\n    };\n  },\n  function(L, T, e) {\n    var u = e(79), A = e(127), w = e(37);\n    L.exports = function(E, y) {\n      var x = {};\n      return y = w(y, 3), A(E, function(g, o, c) {\n        u(x, o, y(g, o, c));\n      }), x;\n    };\n  },\n  function(L, T, e) {\n    var u = e(132), A = e(373), w = e(49);\n    L.exports = function(E) {\n      return E && E.length ? u(E, w, A) : void 0;\n    };\n  },\n  function(L, T) {\n    L.exports = function(e, u) {\n      return e > u;\n    };\n  },\n  function(L, T, e) {\n    var u = e(375), A = e(379)(function(w, E, y) {\n      u(w, E, y);\n    });\n    L.exports = A;\n  },\n  function(L, T, e) {\n    var u = e(73), A = e(198), w = e(128), E = e(376), y = e(23), x = e(48), g = e(199);\n    L.exports = function o(c, a, n, t, r) {\n      c !== a && w(\n        a,\n        function(l, h) {\n          if (r || (r = new u()), y(l)) E(c, a, h, n, o, t, r);\n          else {\n            var i = t ? t(g(c, h), l, h + \"\", c, a, r) : void 0;\n            i === void 0 && (i = l), A(c, h, i);\n          }\n        },\n        x\n      );\n    };\n  },\n  function(L, T, e) {\n    var u = e(198), A = e(155), w = e(164), E = e(156), y = e(165), x = e(66), g = e(13), o = e(189), c = e(59), a = e(64), n = e(23), t = e(377), r = e(67), l = e(199), h = e(378);\n    L.exports = function(i, d, p, f, v, k, s) {\n      var S = l(i, p), j = l(d, p), I = s.get(j);\n      if (I) u(i, p, I);\n      else {\n        var R = k ? k(S, j, p + \"\", i, d, s) : void 0, M = R === void 0;\n        if (M) {\n          var z = g(j), V = !z && c(j), G = !z && !V && r(j);\n          R = j, z || V || G ? g(S) ? R = S : o(S) ? R = E(S) : V ? (M = !1, R = A(j, !0)) : G ? (M = !1, R = w(j, !0)) : R = [] : t(j) || x(j) ? (R = S, x(S) ? R = h(S) : n(S) && !a(S) || (R = y(j))) : M = !1;\n        }\n        M && (s.set(j, R), v(R, j, f, k, s), s.delete(j)), u(i, p, R);\n      }\n    };\n  },\n  function(L, T, e) {\n    var u = e(47), A = e(84), w = e(34), E = Function.prototype, y = Object.prototype, x = E.toString, g = y.hasOwnProperty, o = x.call(Object);\n    L.exports = function(c) {\n      if (!w(c) || u(c) != \"[object Object]\") return !1;\n      var a = A(c);\n      if (a === null) return !0;\n      var n = g.call(a, \"constructor\") && a.constructor;\n      return typeof n == \"function\" && n instanceof n && x.call(n) == o;\n    };\n  },\n  function(L, T, e) {\n    var u = e(65), A = e(48);\n    L.exports = function(w) {\n      return u(w, A(w));\n    };\n  },\n  function(L, T, e) {\n    var u = e(89), A = e(90);\n    L.exports = function(w) {\n      return u(function(E, y) {\n        var x = -1, g = y.length, o = g > 1 ? y[g - 1] : void 0, c = g > 2 ? y[2] : void 0;\n        for (o = w.length > 3 && typeof o == \"function\" ? (g--, o) : void 0, c && A(y[0], y[1], c) && (o = g < 3 ? void 0 : o, g = 1), E = Object(E); ++x < g; ) {\n          var a = y[x];\n          a && w(E, a, x, o);\n        }\n        return E;\n      });\n    };\n  },\n  function(L, T, e) {\n    var u = e(132), A = e(200), w = e(49);\n    L.exports = function(E) {\n      return E && E.length ? u(E, w, A) : void 0;\n    };\n  },\n  function(L, T, e) {\n    var u = e(132), A = e(37), w = e(200);\n    L.exports = function(E, y) {\n      return E && E.length ? u(E, A(y, 2), w) : void 0;\n    };\n  },\n  function(L, T, e) {\n    var u = e(29);\n    L.exports = function() {\n      return u.Date.now();\n    };\n  },\n  function(L, T, e) {\n    var u = e(384), A = e(387)(function(w, E) {\n      return w == null ? {} : u(w, E);\n    });\n    L.exports = A;\n  },\n  function(L, T, e) {\n    var u = e(385), A = e(178);\n    L.exports = function(w, E) {\n      return u(w, E, function(y, x) {\n        return A(w, x);\n      });\n    };\n  },\n  function(L, T, e) {\n    var u = e(86), A = e(386), w = e(87);\n    L.exports = function(E, y, x) {\n      for (var g = -1, o = y.length, c = {}; ++g < o; ) {\n        var a = y[g], n = u(E, a);\n        x(n, a) && A(c, w(a, E), n);\n      }\n      return c;\n    };\n  },\n  function(L, T, e) {\n    var u = e(78), A = e(87), w = e(81), E = e(23), y = e(68);\n    L.exports = function(x, g, o, c) {\n      if (!E(x)) return x;\n      for (var a = -1, n = (g = A(g, x)).length, t = n - 1, r = x; r != null && ++a < n; ) {\n        var l = y(g[a]), h = o;\n        if (l === \"__proto__\" || l === \"constructor\" || l === \"prototype\")\n          return x;\n        if (a != t) {\n          var i = r[l];\n          (h = c ? c(i, l, r) : void 0) === void 0 && (h = E(i) ? i : w(g[a + 1]) ? [] : {});\n        }\n        u(r, l, h), r = r[l];\n      }\n      return x;\n    };\n  },\n  function(L, T, e) {\n    var u = e(197), A = e(186), w = e(187);\n    L.exports = function(E) {\n      return w(A(E, void 0, u), E + \"\");\n    };\n  },\n  function(L, T, e) {\n    var u = e(389)();\n    L.exports = u;\n  },\n  function(L, T, e) {\n    var u = e(390), A = e(90), w = e(196);\n    L.exports = function(E) {\n      return function(y, x, g) {\n        return g && typeof g != \"number\" && A(y, x, g) && (x = g = void 0), y = w(y), x === void 0 ? (x = y, y = 0) : x = w(x), g = g === void 0 ? y < x ? 1 : -1 : w(g), u(y, x, g, E);\n      };\n    };\n  },\n  function(L, T) {\n    var e = Math.ceil, u = Math.max;\n    L.exports = function(A, w, E, y) {\n      for (var x = -1, g = u(e((w - A) / (E || 1)), 0), o = Array(g); g--; )\n        o[y ? g : ++x] = A, A += E;\n      return o;\n    };\n  },\n  function(L, T, e) {\n    var u = e(131), A = e(392), w = e(89), E = e(90), y = w(function(x, g) {\n      if (x == null) return [];\n      var o = g.length;\n      return o > 1 && E(x, g[0], g[1]) ? g = [] : o > 2 && E(g[0], g[1], g[2]) && (g = [g[0]]), A(x, u(g, 1), []);\n    });\n    L.exports = y;\n  },\n  function(L, T, e) {\n    var u = e(88), A = e(86), w = e(37), E = e(184), y = e(393), x = e(82), g = e(394), o = e(49), c = e(13);\n    L.exports = function(a, n, t) {\n      n = n.length ? u(n, function(h) {\n        return c(h) ? function(i) {\n          return A(i, h.length === 1 ? h[0] : h);\n        } : h;\n      }) : [o];\n      var r = -1;\n      n = u(n, x(w));\n      var l = E(a, function(h, i, d) {\n        return {\n          criteria: u(n, function(p) {\n            return p(h);\n          }),\n          index: ++r,\n          value: h\n        };\n      });\n      return y(l, function(h, i) {\n        return g(h, i, t);\n      });\n    };\n  },\n  function(L, T) {\n    L.exports = function(e, u) {\n      var A = e.length;\n      for (e.sort(u); A--; ) e[A] = e[A].value;\n      return e;\n    };\n  },\n  function(L, T, e) {\n    var u = e(395);\n    L.exports = function(A, w, E) {\n      for (var y = -1, x = A.criteria, g = w.criteria, o = x.length, c = E.length; ++y < o; ) {\n        var a = u(x[y], g[y]);\n        if (a) return y >= c ? a : a * (E[y] == \"desc\" ? -1 : 1);\n      }\n      return A.index - w.index;\n    };\n  },\n  function(L, T, e) {\n    var u = e(61);\n    L.exports = function(A, w) {\n      if (A !== w) {\n        var E = A !== void 0, y = A === null, x = A == A, g = u(A), o = w !== void 0, c = w === null, a = w == w, n = u(w);\n        if (!c && !n && !g && A > w || g && o && a && !c && !n || y && o && a || !E && a || !x)\n          return 1;\n        if (!y && !g && !n && A < w || n && E && x && !y && !g || c && E && x || !o && x || !a)\n          return -1;\n      }\n      return 0;\n    };\n  },\n  function(L, T, e) {\n    var u = e(177), A = 0;\n    L.exports = function(w) {\n      var E = ++A;\n      return u(w) + E;\n    };\n  },\n  function(L, T, e) {\n    var u = e(78), A = e(398);\n    L.exports = function(w, E) {\n      return A(w || [], E || [], u);\n    };\n  },\n  function(L, T) {\n    L.exports = function(e, u, A) {\n      for (var w = -1, E = e.length, y = u.length, x = {}; ++w < E; ) {\n        var g = w < y ? u[w] : void 0;\n        A(x, e[w], g);\n      }\n      return x;\n    };\n  },\n  function(L, T, e) {\n    var u = e(11), A = e(400);\n    L.exports = {\n      run: function(w) {\n        var E = w.graph().acyclicer === \"greedy\" ? A(\n          w,\n          /* @__PURE__ */ function(y) {\n            return function(x) {\n              return y.edge(x).weight;\n            };\n          }(w)\n        ) : function(y) {\n          var x = [], g = {}, o = {};\n          function c(a) {\n            u.has(o, a) || (o[a] = !0, g[a] = !0, u.forEach(y.outEdges(a), function(n) {\n              u.has(g, n.w) ? x.push(n) : c(n.w);\n            }), delete g[a]);\n          }\n          return u.forEach(y.nodes(), c), x;\n        }(w);\n        u.forEach(E, function(y) {\n          var x = w.edge(y);\n          w.removeEdge(y), x.forwardName = y.name, x.reversed = !0, w.setEdge(y.w, y.v, x, u.uniqueId(\"rev\"));\n        });\n      },\n      undo: function(w) {\n        u.forEach(w.edges(), function(E) {\n          var y = w.edge(E);\n          if (y.reversed) {\n            w.removeEdge(E);\n            var x = y.forwardName;\n            delete y.reversed, delete y.forwardName, w.setEdge(E.w, E.v, y, x);\n          }\n        });\n      }\n    };\n  },\n  function(L, T, e) {\n    var u = e(11), A = e(28).Graph, w = e(401);\n    L.exports = function(g, o) {\n      if (g.nodeCount() <= 1) return [];\n      var c = function(n, t) {\n        var r = new A(), l = 0, h = 0;\n        u.forEach(n.nodes(), function(p) {\n          r.setNode(p, { v: p, in: 0, out: 0 });\n        }), u.forEach(n.edges(), function(p) {\n          var f = r.edge(p.v, p.w) || 0, v = t(p), k = f + v;\n          r.setEdge(p.v, p.w, k), h = Math.max(h, r.node(p.v).out += v), l = Math.max(l, r.node(p.w).in += v);\n        });\n        var i = u.range(h + l + 3).map(function() {\n          return new w();\n        }), d = l + 1;\n        return u.forEach(r.nodes(), function(p) {\n          x(i, d, r.node(p));\n        }), { graph: r, buckets: i, zeroIdx: d };\n      }(g, o || E), a = function(n, t, r) {\n        for (var l, h = [], i = t[t.length - 1], d = t[0]; n.nodeCount(); ) {\n          for (; l = d.dequeue(); ) y(n, t, r, l);\n          for (; l = i.dequeue(); ) y(n, t, r, l);\n          if (n.nodeCount()) {\n            for (var p = t.length - 2; p > 0; --p)\n              if (l = t[p].dequeue()) {\n                h = h.concat(y(n, t, r, l, !0));\n                break;\n              }\n          }\n        }\n        return h;\n      }(c.graph, c.buckets, c.zeroIdx);\n      return u.flatten(\n        u.map(a, function(n) {\n          return g.outEdges(n.v, n.w);\n        }),\n        !0\n      );\n    };\n    var E = u.constant(1);\n    function y(g, o, c, a, n) {\n      var t = n ? [] : void 0;\n      return u.forEach(g.inEdges(a.v), function(r) {\n        var l = g.edge(r), h = g.node(r.v);\n        n && t.push({ v: r.v, w: r.w }), h.out -= l, x(o, c, h);\n      }), u.forEach(g.outEdges(a.v), function(r) {\n        var l = g.edge(r), h = r.w, i = g.node(h);\n        i.in -= l, x(o, c, i);\n      }), g.removeNode(a.v), t;\n    }\n    function x(g, o, c) {\n      c.out ? c.in ? g[c.out - c.in + o].enqueue(c) : g[g.length - 1].enqueue(c) : g[0].enqueue(c);\n    }\n  },\n  function(L, T) {\n    function e() {\n      var w = {};\n      w._next = w._prev = w, this._sentinel = w;\n    }\n    function u(w) {\n      w._prev._next = w._next, w._next._prev = w._prev, delete w._next, delete w._prev;\n    }\n    function A(w, E) {\n      if (w !== \"_next\" && w !== \"_prev\") return E;\n    }\n    L.exports = e, e.prototype.dequeue = function() {\n      var w = this._sentinel, E = w._prev;\n      if (E !== w) return u(E), E;\n    }, e.prototype.enqueue = function(w) {\n      var E = this._sentinel;\n      w._prev && w._next && u(w), w._next = E._next, E._next._prev = w, E._next = w, w._prev = E;\n    }, e.prototype.toString = function() {\n      for (var w = [], E = this._sentinel, y = E._prev; y !== E; )\n        w.push(JSON.stringify(y, A)), y = y._prev;\n      return \"[\" + w.join(\", \") + \"]\";\n    };\n  },\n  function(L, T, e) {\n    var u = e(11), A = e(20);\n    L.exports = {\n      run: function(w) {\n        w.graph().dummyChains = [], u.forEach(w.edges(), function(E) {\n          (function(y, x) {\n            var g, o, c, a = x.v, n = y.node(a).rank, t = x.w, r = y.node(t).rank, l = x.name, h = y.edge(x), i = h.labelRank;\n            if (r !== n + 1) {\n              for (y.removeEdge(x), c = 0, ++n; n < r; ++c, ++n)\n                h.points = [], o = {\n                  width: 0,\n                  height: 0,\n                  edgeLabel: h,\n                  edgeObj: x,\n                  rank: n\n                }, g = A.addDummyNode(y, \"edge\", o, \"_d\"), n === i && (o.width = h.width, o.height = h.height, o.dummy = \"edge-label\", o.labelpos = h.labelpos), y.setEdge(a, g, { weight: h.weight }, l), c === 0 && y.graph().dummyChains.push(g), a = g;\n              y.setEdge(a, t, { weight: h.weight }, l);\n            }\n          })(w, E);\n        });\n      },\n      undo: function(w) {\n        u.forEach(w.graph().dummyChains, function(E) {\n          var y, x = w.node(E), g = x.edgeLabel;\n          for (w.setEdge(x.edgeObj, g); x.dummy; )\n            y = w.successors(E)[0], w.removeNode(E), g.points.push({ x: x.x, y: x.y }), x.dummy === \"edge-label\" && (g.x = x.x, g.y = x.y, g.width = x.width, g.height = x.height), E = y, x = w.node(E);\n        });\n      }\n    };\n  },\n  function(L, T, e) {\n    var u = e(91).longestPath, A = e(201), w = e(404);\n    L.exports = function(x) {\n      switch (x.graph().ranker) {\n        case \"network-simplex\":\n          y(x);\n          break;\n        case \"tight-tree\":\n          (function(g) {\n            u(g), A(g);\n          })(x);\n          break;\n        case \"longest-path\":\n          E(x);\n          break;\n        default:\n          y(x);\n      }\n    };\n    var E = u;\n    function y(x) {\n      w(x);\n    }\n  },\n  function(L, T, e) {\n    var u = e(11), A = e(201), w = e(91).slack, E = e(91).longestPath, y = e(28).alg.preorder, x = e(28).alg.postorder, g = e(20).simplify;\n    function o(d) {\n      d = g(d), E(d);\n      var p, f = A(d);\n      for (n(f), c(f, d); p = r(f); ) h(f, d, p, l(f, d, p));\n    }\n    function c(d, p) {\n      var f = x(d, d.nodes());\n      f = f.slice(0, f.length - 1), u.forEach(f, function(v) {\n        (function(k, s, S) {\n          var j = k.node(S).parent;\n          k.edge(S, j).cutvalue = a(k, s, S);\n        })(d, p, v);\n      });\n    }\n    function a(d, p, f) {\n      var v = d.node(f).parent, k = !0, s = p.edge(f, v), S = 0;\n      return s || (k = !1, s = p.edge(v, f)), S = s.weight, u.forEach(p.nodeEdges(f), function(j) {\n        var I, R, M = j.v === f, z = M ? j.w : j.v;\n        if (z !== v) {\n          var V = M === k, G = p.edge(j).weight;\n          if (S += V ? G : -G, I = f, R = z, d.hasEdge(I, R)) {\n            var Y = d.edge(f, z).cutvalue;\n            S += V ? -Y : Y;\n          }\n        }\n      }), S;\n    }\n    function n(d, p) {\n      arguments.length < 2 && (p = d.nodes()[0]), t(d, {}, 1, p);\n    }\n    function t(d, p, f, v, k) {\n      var s = f, S = d.node(v);\n      return p[v] = !0, u.forEach(d.neighbors(v), function(j) {\n        u.has(p, j) || (f = t(d, p, f, j, v));\n      }), S.low = s, S.lim = f++, k ? S.parent = k : delete S.parent, f;\n    }\n    function r(d) {\n      return u.find(d.edges(), function(p) {\n        return d.edge(p).cutvalue < 0;\n      });\n    }\n    function l(d, p, f) {\n      var v = f.v, k = f.w;\n      p.hasEdge(v, k) || (v = f.w, k = f.v);\n      var s = d.node(v), S = d.node(k), j = s, I = !1;\n      s.lim > S.lim && (j = S, I = !0);\n      var R = u.filter(p.edges(), function(M) {\n        return I === i(d, d.node(M.v), j) && I !== i(d, d.node(M.w), j);\n      });\n      return u.minBy(R, function(M) {\n        return w(p, M);\n      });\n    }\n    function h(d, p, f, v) {\n      var k = f.v, s = f.w;\n      d.removeEdge(k, s), d.setEdge(v.v, v.w, {}), n(d), c(d, p), function(S, j) {\n        var I = u.find(S.nodes(), function(M) {\n          return !j.node(M).parent;\n        }), R = y(S, I);\n        R = R.slice(1), u.forEach(R, function(M) {\n          var z = S.node(M).parent, V = j.edge(M, z), G = !1;\n          V || (V = j.edge(z, M), G = !0), j.node(M).rank = j.node(z).rank + (G ? V.minlen : -V.minlen);\n        });\n      }(d, p);\n    }\n    function i(d, p, f) {\n      return f.low <= p.lim && p.lim <= f.lim;\n    }\n    L.exports = o, o.initLowLimValues = n, o.initCutValues = c, o.calcCutValue = a, o.leaveEdge = r, o.enterEdge = l, o.exchangeEdges = h;\n  },\n  function(L, T, e) {\n    var u = e(11);\n    L.exports = function(A) {\n      var w = function(E) {\n        var y = {}, x = 0;\n        function g(o) {\n          var c = x;\n          u.forEach(E.children(o), g), y[o] = { low: c, lim: x++ };\n        }\n        return u.forEach(E.children(), g), y;\n      }(A);\n      u.forEach(A.graph().dummyChains, function(E) {\n        for (var y = A.node(E), x = y.edgeObj, g = function(r, l, h, i) {\n          var d, p, f = [], v = [], k = Math.min(l[h].low, l[i].low), s = Math.max(l[h].lim, l[i].lim);\n          d = h;\n          do\n            d = r.parent(d), f.push(d);\n          while (d && (l[d].low > k || s > l[d].lim));\n          for (p = d, d = i; (d = r.parent(d)) !== p; ) v.push(d);\n          return { path: f.concat(v.reverse()), lca: p };\n        }(A, w, x.v, x.w), o = g.path, c = g.lca, a = 0, n = o[a], t = !0; E !== x.w; ) {\n          if (y = A.node(E), t) {\n            for (; (n = o[a]) !== c && A.node(n).maxRank < y.rank; ) a++;\n            n === c && (t = !1);\n          }\n          if (!t) {\n            for (; a < o.length - 1 && A.node(n = o[a + 1]).minRank <= y.rank; )\n              a++;\n            n = o[a];\n          }\n          A.setParent(E, n), E = A.successors(E)[0];\n        }\n      });\n    };\n  },\n  function(L, T, e) {\n    var u = e(11), A = e(20);\n    L.exports = {\n      run: function(w) {\n        var E = A.addDummyNode(w, \"root\", {}, \"_root\"), y = function(c) {\n          var a = {};\n          return u.forEach(c.children(), function(n) {\n            (function t(r, l) {\n              var h = c.children(r);\n              h && h.length && u.forEach(h, function(i) {\n                t(i, l + 1);\n              }), a[r] = l;\n            })(n, 1);\n          }), a;\n        }(w), x = u.max(u.values(y)) - 1, g = 2 * x + 1;\n        w.graph().nestingRoot = E, u.forEach(w.edges(), function(c) {\n          w.edge(c).minlen *= g;\n        });\n        var o = function(c) {\n          return u.reduce(\n            c.edges(),\n            function(a, n) {\n              return a + c.edge(n).weight;\n            },\n            0\n          );\n        }(w) + 1;\n        u.forEach(w.children(), function(c) {\n          (function a(n, t, r, l, h, i, d) {\n            var p = n.children(d);\n            if (!p.length)\n              return void (d !== t && n.setEdge(t, d, { weight: 0, minlen: r }));\n            var f = A.addBorderNode(n, \"_bt\"), v = A.addBorderNode(n, \"_bb\"), k = n.node(d);\n            n.setParent(f, d), k.borderTop = f, n.setParent(v, d), k.borderBottom = v, u.forEach(p, function(s) {\n              a(n, t, r, l, h, i, s);\n              var S = n.node(s), j = S.borderTop ? S.borderTop : s, I = S.borderBottom ? S.borderBottom : s, R = S.borderTop ? l : 2 * l, M = j !== I ? 1 : h - i[d] + 1;\n              n.setEdge(f, j, { weight: R, minlen: M, nestingEdge: !0 }), n.setEdge(I, v, { weight: R, minlen: M, nestingEdge: !0 });\n            }), n.parent(d) || n.setEdge(t, f, { weight: 0, minlen: h + i[d] });\n          })(w, E, g, o, x, y, c);\n        }), w.graph().nodeRankFactor = g;\n      },\n      cleanup: function(w) {\n        var E = w.graph();\n        w.removeNode(E.nestingRoot), delete E.nestingRoot, u.forEach(w.edges(), function(y) {\n          w.edge(y).nestingEdge && w.removeEdge(y);\n        });\n      }\n    };\n  },\n  function(L, T, e) {\n    var u = e(11), A = e(20);\n    function w(E, y, x, g, o, c) {\n      var a = { width: 0, height: 0, rank: c, borderType: y }, n = o[y][c - 1], t = A.addDummyNode(E, \"border\", a, x);\n      o[y][c] = t, E.setParent(t, g), n && E.setEdge(n, t, { weight: 1 });\n    }\n    L.exports = function(E) {\n      u.forEach(E.children(), function y(x) {\n        var g = E.children(x), o = E.node(x);\n        if (g.length && u.forEach(g, y), u.has(o, \"minRank\")) {\n          o.borderLeft = [], o.borderRight = [];\n          for (var c = o.minRank, a = o.maxRank + 1; c < a; ++c)\n            w(E, \"borderLeft\", \"_bl\", x, o, c), w(E, \"borderRight\", \"_br\", x, o, c);\n        }\n      });\n    };\n  },\n  function(L, T, e) {\n    var u = e(11);\n    function A(x) {\n      u.forEach(x.nodes(), function(g) {\n        w(x.node(g));\n      }), u.forEach(x.edges(), function(g) {\n        w(x.edge(g));\n      });\n    }\n    function w(x) {\n      var g = x.width;\n      x.width = x.height, x.height = g;\n    }\n    function E(x) {\n      x.y = -x.y;\n    }\n    function y(x) {\n      var g = x.x;\n      x.x = x.y, x.y = g;\n    }\n    L.exports = {\n      adjust: function(x) {\n        var g = x.graph().rankdir.toLowerCase();\n        g !== \"lr\" && g !== \"rl\" || A(x);\n      },\n      undo: function(x) {\n        var g = x.graph().rankdir.toLowerCase();\n        g !== \"bt\" && g !== \"rl\" || function(o) {\n          u.forEach(o.nodes(), function(c) {\n            E(o.node(c));\n          }), u.forEach(o.edges(), function(c) {\n            var a = o.edge(c);\n            u.forEach(a.points, E), u.has(a, \"y\") && E(a);\n          });\n        }(x), g !== \"lr\" && g !== \"rl\" || (function(o) {\n          u.forEach(o.nodes(), function(c) {\n            y(o.node(c));\n          }), u.forEach(o.edges(), function(c) {\n            var a = o.edge(c);\n            u.forEach(a.points, y), u.has(a, \"x\") && y(a);\n          });\n        }(x), A(x));\n      }\n    };\n  },\n  function(L, T, e) {\n    var u = e(11), A = e(410), w = e(411), E = e(412), y = e(416), x = e(417), g = e(28).Graph, o = e(20);\n    function c(t, r, l) {\n      return u.map(r, function(h) {\n        return y(t, h, l);\n      });\n    }\n    function a(t, r) {\n      var l = new g();\n      u.forEach(t, function(h) {\n        var i = h.graph().root, d = E(h, i, l, r);\n        u.forEach(d.vs, function(p, f) {\n          h.node(p).order = f;\n        }), x(h, l, d.vs);\n      });\n    }\n    function n(t, r) {\n      u.forEach(r, function(l) {\n        u.forEach(l, function(h, i) {\n          t.node(h).order = i;\n        });\n      });\n    }\n    L.exports = function(t) {\n      var r = o.maxRank(t), l = c(t, u.range(1, r + 1), \"inEdges\"), h = c(t, u.range(r - 1, -1, -1), \"outEdges\"), i = A(t);\n      n(t, i);\n      for (var d, p = Number.POSITIVE_INFINITY, f = 0, v = 0; v < 4; ++f, ++v) {\n        a(f % 2 ? l : h, f % 4 >= 2), i = o.buildLayerMatrix(t);\n        var k = w(t, i);\n        k < p && (v = 0, d = u.cloneDeep(i), p = k);\n      }\n      n(t, d);\n    };\n  },\n  function(L, T, e) {\n    var u = e(11);\n    L.exports = function(A) {\n      var w = {}, E = u.filter(A.nodes(), function(o) {\n        return !A.children(o).length;\n      }), y = u.max(\n        u.map(E, function(o) {\n          return A.node(o).rank;\n        })\n      ), x = u.map(u.range(y + 1), function() {\n        return [];\n      }), g = u.sortBy(E, function(o) {\n        return A.node(o).rank;\n      });\n      return u.forEach(g, function o(c) {\n        if (!u.has(w, c)) {\n          w[c] = !0;\n          var a = A.node(c);\n          x[a.rank].push(c), u.forEach(A.successors(c), o);\n        }\n      }), x;\n    };\n  },\n  function(L, T, e) {\n    var u = e(11);\n    function A(w, E, y) {\n      for (var x = u.zipObject(\n        y,\n        u.map(y, function(t, r) {\n          return r;\n        })\n      ), g = u.flatten(\n        u.map(E, function(t) {\n          return u.sortBy(\n            u.map(w.outEdges(t), function(r) {\n              return { pos: x[r.w], weight: w.edge(r).weight };\n            }),\n            \"pos\"\n          );\n        }),\n        !0\n      ), o = 1; o < y.length; )\n        o <<= 1;\n      var c = 2 * o - 1;\n      o -= 1;\n      var a = u.map(new Array(c), function() {\n        return 0;\n      }), n = 0;\n      return u.forEach(\n        g.forEach(function(t) {\n          var r = t.pos + o;\n          a[r] += t.weight;\n          for (var l = 0; r > 0; )\n            r % 2 && (l += a[r + 1]), a[r = r - 1 >> 1] += t.weight;\n          n += t.weight * l;\n        })\n      ), n;\n    }\n    L.exports = function(w, E) {\n      for (var y = 0, x = 1; x < E.length; ++x) y += A(w, E[x - 1], E[x]);\n      return y;\n    };\n  },\n  function(L, T, e) {\n    var u = e(11), A = e(413), w = e(414), E = e(415);\n    L.exports = function y(x, g, o, c) {\n      var a = x.children(g), n = x.node(g), t = n ? n.borderLeft : void 0, r = n ? n.borderRight : void 0, l = {};\n      t && (a = u.filter(a, function(v) {\n        return v !== t && v !== r;\n      }));\n      var h = A(x, a);\n      u.forEach(h, function(v) {\n        if (x.children(v.v).length) {\n          var k = y(x, v.v, o, c);\n          l[v.v] = k, u.has(k, \"barycenter\") && (s = v, S = k, u.isUndefined(s.barycenter) ? (s.barycenter = S.barycenter, s.weight = S.weight) : (s.barycenter = (s.barycenter * s.weight + S.barycenter * S.weight) / (s.weight + S.weight), s.weight += S.weight));\n        }\n        var s, S;\n      });\n      var i = w(h, o);\n      (function(v, k) {\n        u.forEach(v, function(s) {\n          s.vs = u.flatten(\n            s.vs.map(function(S) {\n              return k[S] ? k[S].vs : S;\n            }),\n            !0\n          );\n        });\n      })(i, l);\n      var d = E(i, c);\n      if (t && (d.vs = u.flatten([t, d.vs, r], !0), x.predecessors(t).length)) {\n        var p = x.node(x.predecessors(t)[0]), f = x.node(x.predecessors(r)[0]);\n        u.has(d, \"barycenter\") || (d.barycenter = 0, d.weight = 0), d.barycenter = (d.barycenter * d.weight + p.order + f.order) / (d.weight + 2), d.weight += 2;\n      }\n      return d;\n    };\n  },\n  function(L, T, e) {\n    var u = e(11);\n    L.exports = function(A, w) {\n      return u.map(w, function(E) {\n        var y = A.inEdges(E);\n        if (y.length) {\n          var x = u.reduce(\n            y,\n            function(g, o) {\n              var c = A.edge(o), a = A.node(o.v);\n              return {\n                sum: g.sum + c.weight * a.order,\n                weight: g.weight + c.weight\n              };\n            },\n            { sum: 0, weight: 0 }\n          );\n          return { v: E, barycenter: x.sum / x.weight, weight: x.weight };\n        }\n        return { v: E };\n      });\n    };\n  },\n  function(L, T, e) {\n    var u = e(11);\n    L.exports = function(A, w) {\n      var E = {};\n      return u.forEach(A, function(y, x) {\n        var g = E[y.v] = { indegree: 0, in: [], out: [], vs: [y.v], i: x };\n        u.isUndefined(y.barycenter) || (g.barycenter = y.barycenter, g.weight = y.weight);\n      }), u.forEach(w.edges(), function(y) {\n        var x = E[y.v], g = E[y.w];\n        u.isUndefined(x) || u.isUndefined(g) || (g.indegree++, x.out.push(E[y.w]));\n      }), function(y) {\n        var x = [];\n        function g(a) {\n          return function(n) {\n            n.merged || (u.isUndefined(n.barycenter) || u.isUndefined(a.barycenter) || n.barycenter >= a.barycenter) && function(t, r) {\n              var l = 0, h = 0;\n              t.weight && (l += t.barycenter * t.weight, h += t.weight), r.weight && (l += r.barycenter * r.weight, h += r.weight), t.vs = r.vs.concat(t.vs), t.barycenter = l / h, t.weight = h, t.i = Math.min(r.i, t.i), r.merged = !0;\n            }(a, n);\n          };\n        }\n        function o(a) {\n          return function(n) {\n            n.in.push(a), --n.indegree == 0 && y.push(n);\n          };\n        }\n        for (; y.length; ) {\n          var c = y.pop();\n          x.push(c), u.forEach(c.in.reverse(), g(c)), u.forEach(c.out, o(c));\n        }\n        return u.map(\n          u.filter(x, function(a) {\n            return !a.merged;\n          }),\n          function(a) {\n            return u.pick(a, [\"vs\", \"i\", \"barycenter\", \"weight\"]);\n          }\n        );\n      }(\n        u.filter(E, function(y) {\n          return !y.indegree;\n        })\n      );\n    };\n  },\n  function(L, T, e) {\n    var u = e(11), A = e(20);\n    function w(E, y, x) {\n      for (var g; y.length && (g = u.last(y)).i <= x; )\n        y.pop(), E.push(g.vs), x++;\n      return x;\n    }\n    L.exports = function(E, y) {\n      var x = A.partition(E, function(h) {\n        return u.has(h, \"barycenter\");\n      }), g = x.lhs, o = u.sortBy(x.rhs, function(h) {\n        return -h.i;\n      }), c = [], a = 0, n = 0, t = 0;\n      g.sort(\n        (r = !!y, function(h, i) {\n          return h.barycenter < i.barycenter ? -1 : h.barycenter > i.barycenter ? 1 : r ? i.i - h.i : h.i - i.i;\n        })\n      ), t = w(c, o, t), u.forEach(g, function(h) {\n        t += h.vs.length, c.push(h.vs), a += h.barycenter * h.weight, n += h.weight, t = w(c, o, t);\n      });\n      var r, l = { vs: u.flatten(c, !0) };\n      return n && (l.barycenter = a / n, l.weight = n), l;\n    };\n  },\n  function(L, T, e) {\n    var u = e(11), A = e(28).Graph;\n    L.exports = function(w, E, y) {\n      var x = function(o) {\n        for (var c; o.hasNode(c = u.uniqueId(\"_root\")); ) ;\n        return c;\n      }(w), g = new A({ compound: !0 }).setGraph({ root: x }).setDefaultNodeLabel(function(o) {\n        return w.node(o);\n      });\n      return u.forEach(w.nodes(), function(o) {\n        var c = w.node(o), a = w.parent(o);\n        (c.rank === E || c.minRank <= E && E <= c.maxRank) && (g.setNode(o), g.setParent(o, a || x), u.forEach(w[y](o), function(n) {\n          var t = n.v === o ? n.w : n.v, r = g.edge(t, o), l = u.isUndefined(r) ? 0 : r.weight;\n          g.setEdge(t, o, { weight: w.edge(n).weight + l });\n        }), u.has(c, \"minRank\") && g.setNode(o, {\n          borderLeft: c.borderLeft[E],\n          borderRight: c.borderRight[E]\n        }));\n      }), g;\n    };\n  },\n  function(L, T, e) {\n    var u = e(11);\n    L.exports = function(A, w, E) {\n      var y, x = {};\n      u.forEach(E, function(g) {\n        for (var o, c, a = A.parent(g); a; ) {\n          if ((o = A.parent(a)) ? (c = x[o], x[o] = a) : (c = y, y = a), c && c !== a)\n            return void w.setEdge(c, a);\n          a = o;\n        }\n      });\n    };\n  },\n  function(L, T, e) {\n    var u = e(11), A = e(20), w = e(419).positionX;\n    L.exports = function(E) {\n      (function(y) {\n        var x = A.buildLayerMatrix(y), g = y.graph().ranksep, o = 0;\n        u.forEach(x, function(c) {\n          var a = u.max(\n            u.map(c, function(n) {\n              return y.node(n).height;\n            })\n          );\n          u.forEach(c, function(n) {\n            y.node(n).y = o + a / 2;\n          }), o += a + g;\n        });\n      })(E = A.asNonCompoundGraph(E)), u.forEach(w(E), function(y, x) {\n        E.node(x).x = y;\n      });\n    };\n  },\n  function(L, T, e) {\n    var u = e(11), A = e(28).Graph, w = e(20);\n    function E(r, l) {\n      var h = {};\n      return u.reduce(l, function(i, d) {\n        var p = 0, f = 0, v = i.length, k = u.last(d);\n        return u.forEach(d, function(s, S) {\n          var j = function(R, M) {\n            if (R.node(M).dummy)\n              return u.find(R.predecessors(M), function(z) {\n                return R.node(z).dummy;\n              });\n          }(r, s), I = j ? r.node(j).order : v;\n          (j || s === k) && (u.forEach(d.slice(f, S + 1), function(R) {\n            u.forEach(r.predecessors(R), function(M) {\n              var z = r.node(M), V = z.order;\n              !(V < p || I < V) || z.dummy && r.node(R).dummy || x(h, M, R);\n            });\n          }), f = S + 1, p = I);\n        }), d;\n      }), h;\n    }\n    function y(r, l) {\n      var h = {};\n      function i(d, p, f, v, k) {\n        var s;\n        u.forEach(u.range(p, f), function(S) {\n          s = d[S], r.node(s).dummy && u.forEach(r.predecessors(s), function(j) {\n            var I = r.node(j);\n            I.dummy && (I.order < v || I.order > k) && x(h, j, s);\n          });\n        });\n      }\n      return u.reduce(l, function(d, p) {\n        var f, v = -1, k = 0;\n        return u.forEach(p, function(s, S) {\n          if (r.node(s).dummy === \"border\") {\n            var j = r.predecessors(s);\n            j.length && (f = r.node(j[0]).order, i(p, k, S, v, f), k = S, v = f);\n          }\n          i(p, k, p.length, f, d.length);\n        }), p;\n      }), h;\n    }\n    function x(r, l, h) {\n      if (l > h) {\n        var i = l;\n        l = h, h = i;\n      }\n      var d = r[l];\n      d || (r[l] = d = {}), d[h] = !0;\n    }\n    function g(r, l, h) {\n      if (l > h) {\n        var i = l;\n        l = h, h = i;\n      }\n      return u.has(r[l], h);\n    }\n    function o(r, l, h, i) {\n      var d = {}, p = {}, f = {};\n      return u.forEach(l, function(v) {\n        u.forEach(v, function(k, s) {\n          d[k] = k, p[k] = k, f[k] = s;\n        });\n      }), u.forEach(l, function(v) {\n        var k = -1;\n        u.forEach(v, function(s) {\n          var S = i(s);\n          if (S.length)\n            for (var j = ((S = u.sortBy(S, function(z) {\n              return f[z];\n            })).length - 1) / 2, I = Math.floor(j), R = Math.ceil(j); I <= R; ++I) {\n              var M = S[I];\n              p[s] === s && k < f[M] && !g(h, s, M) && (p[M] = s, p[s] = d[s] = d[M], k = f[M]);\n            }\n        });\n      }), { root: d, align: p };\n    }\n    function c(r, l, h, i, d) {\n      var p = {}, f = function(s, S, j, I) {\n        var R = new A(), M = s.graph(), z = /* @__PURE__ */ function(V, G, Y) {\n          return function(tt, Z, at) {\n            var nt, ht = tt.node(Z), ct = tt.node(at), ot = 0;\n            if (ot += ht.width / 2, u.has(ht, \"labelpos\"))\n              switch (ht.labelpos.toLowerCase()) {\n                case \"l\":\n                  nt = -ht.width / 2;\n                  break;\n                case \"r\":\n                  nt = ht.width / 2;\n              }\n            if (nt && (ot += Y ? nt : -nt), nt = 0, ot += (ht.dummy ? G : V) / 2, ot += (ct.dummy ? G : V) / 2, ot += ct.width / 2, u.has(ct, \"labelpos\"))\n              switch (ct.labelpos.toLowerCase()) {\n                case \"l\":\n                  nt = ct.width / 2;\n                  break;\n                case \"r\":\n                  nt = -ct.width / 2;\n              }\n            return nt && (ot += Y ? nt : -nt), nt = 0, ot;\n          };\n        }(M.nodesep, M.edgesep, I);\n        return u.forEach(S, function(V) {\n          var G;\n          u.forEach(V, function(Y) {\n            var tt = j[Y];\n            if (R.setNode(tt), G) {\n              var Z = j[G], at = R.edge(Z, tt);\n              R.setEdge(Z, tt, Math.max(z(s, Y, G), at || 0));\n            }\n            G = Y;\n          });\n        }), R;\n      }(r, l, h, d), v = d ? \"borderLeft\" : \"borderRight\";\n      function k(s, S) {\n        for (var j = f.nodes(), I = j.pop(), R = {}; I; )\n          R[I] ? s(I) : (R[I] = !0, j.push(I), j = j.concat(S(I))), I = j.pop();\n      }\n      return k(function(s) {\n        p[s] = f.inEdges(s).reduce(function(S, j) {\n          return Math.max(S, p[j.v] + f.edge(j));\n        }, 0);\n      }, f.predecessors.bind(f)), k(function(s) {\n        var S = f.outEdges(s).reduce(function(I, R) {\n          return Math.min(I, p[R.w] - f.edge(R));\n        }, Number.POSITIVE_INFINITY), j = r.node(s);\n        S !== Number.POSITIVE_INFINITY && j.borderType !== v && (p[s] = Math.max(p[s], S));\n      }, f.successors.bind(f)), u.forEach(i, function(s) {\n        p[s] = p[h[s]];\n      }), p;\n    }\n    function a(r, l) {\n      return u.minBy(u.values(l), function(h) {\n        var i = Number.NEGATIVE_INFINITY, d = Number.POSITIVE_INFINITY;\n        return u.forIn(h, function(p, f) {\n          var v = function(k, s) {\n            return k.node(s).width;\n          }(r, f) / 2;\n          i = Math.max(p + v, i), d = Math.min(p - v, d);\n        }), i - d;\n      });\n    }\n    function n(r, l) {\n      var h = u.values(l), i = u.min(h), d = u.max(h);\n      u.forEach([\"u\", \"d\"], function(p) {\n        u.forEach([\"l\", \"r\"], function(f) {\n          var v, k = p + f, s = r[k];\n          if (s !== l) {\n            var S = u.values(s);\n            (v = f === \"l\" ? i - u.min(S) : d - u.max(S)) && (r[k] = u.mapValues(s, function(j) {\n              return j + v;\n            }));\n          }\n        });\n      });\n    }\n    function t(r, l) {\n      return u.mapValues(r.ul, function(h, i) {\n        if (l) return r[l.toLowerCase()][i];\n        var d = u.sortBy(u.map(r, i));\n        return (d[1] + d[2]) / 2;\n      });\n    }\n    L.exports = {\n      positionX: function(r) {\n        var l, h = w.buildLayerMatrix(r), i = u.merge(E(r, h), y(r, h)), d = {};\n        u.forEach([\"u\", \"d\"], function(f) {\n          l = f === \"u\" ? h : u.values(h).reverse(), u.forEach([\"l\", \"r\"], function(v) {\n            v === \"r\" && (l = u.map(l, function(j) {\n              return u.values(j).reverse();\n            }));\n            var k = (f === \"u\" ? r.predecessors : r.successors).bind(r), s = o(r, l, i, k), S = c(r, l, s.root, s.align, v === \"r\");\n            v === \"r\" && (S = u.mapValues(S, function(j) {\n              return -j;\n            })), d[f + v] = S;\n          });\n        });\n        var p = a(r, d);\n        return n(d, p), t(d, r.graph().align);\n      },\n      findType1Conflicts: E,\n      findType2Conflicts: y,\n      addConflict: x,\n      hasConflict: g,\n      verticalAlignment: o,\n      horizontalCompaction: c,\n      alignCoordinates: n,\n      findSmallestWidthAlignment: a,\n      balance: t\n    };\n  },\n  function(L, T, e) {\n    var u = e(11), A = e(20), w = e(28).Graph;\n    L.exports = {\n      debugOrdering: function(E) {\n        var y = A.buildLayerMatrix(E), x = new w({ compound: !0, multigraph: !0 }).setGraph({});\n        return u.forEach(E.nodes(), function(g) {\n          x.setNode(g, { label: g }), x.setParent(g, \"layer\" + E.node(g).rank);\n        }), u.forEach(E.edges(), function(g) {\n          x.setEdge(g.v, g.w, {}, g.name);\n        }), u.forEach(y, function(g, o) {\n          var c = \"layer\" + o;\n          x.setNode(c, { rank: \"same\" }), u.reduce(g, function(a, n) {\n            return x.setEdge(a, n, { style: \"invis\" }), n;\n          });\n        }), x;\n      }\n    };\n  },\n  function(L, T) {\n    L.exports = \"0.8.5\";\n  },\n  function(L, T, e) {\n    const u = e(423);\n    angular.module(\"dbt\").directive(\"modelTree\", [\n      function() {\n        return {\n          scope: { tree: \"=\" },\n          templateUrl: u,\n          link: function(A) {\n            A.nav_selected = \"project\";\n          }\n        };\n      }\n    ]);\n  },\n  function(L, T) {\n    var e = \"/components/model_tree/model_tree.html\";\n    window.angular.module(\"ng\").run([\n      \"$templateCache\",\n      function(u) {\n        u.put(\n          e,\n          `<style>\n.menu ul ul {\n    margin-left: 12px;\n}\n</style>\n\n<div class=\"menu\">\n    <ul>\n        <li>\n            <a ui-sref=\"dbt.overview()\" class=\"menu-link menu-main\">\n                Overview\n            </a>\n        </li>\n\n        <li>\n            <div class=\"switches\">\n                <div class=\"switch \">\n                    <span\n                       class=\"switch-label btn btn-sm\"\n                       ng-class=\"{active: (nav_selected == 'project')}\"\n                       ng-click=\"nav_selected = 'project'\">\n                        <svg class=\"icn menu-icon-on\"><use xlink:href=\"#icn-dir-on\"></use></svg>\n                        Project\n                    </span>\n                </div>\n                <div class=\"switch\">\n                    <span\n                       class=\"switch-label btn btn-sm\"\n                       ng-class=\"{active: (nav_selected == 'database')}\"\n                       ng-click=\"nav_selected = 'database'\">\n                        <svg class=\"icn menu-icon-on\"><use xlink:href=\"#icn-tree-on\"></use></svg>\n                        Database\n                    </span>\n                </div>\n                <div class=\"switch\">\n                    <span\n                       class=\"switch-label btn btn-sm\"\n                       ng-class=\"{active: (nav_selected == 'group')}\"\n                       ng-click=\"nav_selected = 'group'\">\n                        <svg class=\"icn menu-icon-on\"><use xlink:href=\"#icn-filter\"></use></svg>\n                        Group\n                    </span>\n                </div>\n            </div>\n        </li>\n\n        <li>\n            <div class=\"menu\" ng-show=\"nav_selected == 'project'\">\n                <div ng-show=\"tree.sources.length > 0\">\n                    <strong>Sources</strong>\n                    <ul style=\"display: block\">\n                        <model-tree-line\n                            item=\"item\"\n                            resource-type=\"source\"\n                            ng-repeat=\"item in tree.sources\"></source-tree-line>\n                    </ul>\n                    <br />\n                </div>\n\n                <div ng-show=\"tree.exposures.length > 0\">\n                    <strong>Exposures</strong>\n                    <ul style=\"display: block\">\n                        <model-tree-line\n                            item=\"item\"\n                            resource-type=\"exposure\"\n                            ng-repeat=\"item in tree.exposures\"></model-tree-line>\n                    </ul>\n                    <br />\n                </div>\n                \n                <div ng-show=\"tree.metrics.length > 0\">\n                    <strong>Metrics</strong>\n                    <ul style=\"display: block\">\n                        <model-tree-line\n                            item=\"item\"\n                            resource-type=\"metric\"\n                            ng-repeat=\"item in tree.metrics\"></model-tree-line>\n                    </ul>\n                    <br />\n                </div>\n                \n                <div ng-show=\"tree.semantic_models.length > 0\">\n                    <strong>Semantic Models</strong>\n                    <ul style=\"display: block\">\n                        <model-tree-line\n                            item=\"item\"\n                            resource-type=\"semantic_model\"\n                            ng-repeat=\"item in tree.semantic_models\"></model-tree-line>\n                    </ul>\n                    <br />\n                </div>\n\n                <strong>Projects</strong>\n                <ul>\n                    <model-tree-line\n                        item=\"item\"\n                        resource-type=\"model\"\n                        ng-repeat=\"item in tree.project\"></model-tree-line>\n                </ul>\n            </div>\n        </li>\n\n        <li>\n            <div class=\"menu\" ng-show=\"nav_selected == 'database'\">\n                <strong>Tables and Views</strong>\n                <ul>\n                    <model-tree-line\n                        item=\"item\"\n                        resource-type=\"model\"\n                        ng-repeat=\"item in tree.database\"></model-tree-line>\n                </ul>\n            </div>\n        </li>\n\n        <li>\n            <div class=\"menu\" ng-show=\"nav_selected == 'group'\">\n                <strong>Public Models</strong>\n                <ul><model-tree-line\n                        item=\"item\"\n                        resource-type=\"model\"\n                        ng-repeat=\"item in tree.groups\"></model-tree-line>\n                </ul>\n            </div>\n        </li>\n    </ul>\n</div>\n`\n        );\n      }\n    ]), L.exports = e;\n  },\n  function(L, T, e) {\n    const u = e(425), A = e(21);\n    e(426), angular.module(\"dbt\").directive(\"modelTreeLine\", [\n      \"$state\",\n      function(w) {\n        return {\n          scope: { item: \"=\", depth: \"<\", resourceType: \"@\" },\n          replace: !0,\n          templateUrl: u,\n          link: function(E, y, x, g) {\n            E.depth || (E.depth = 0);\n            var o = E.item.name;\n            if (o) {\n              var c = A.last(o, 15).join(\"\"), a = A.initial(o, c.length).join(\"\");\n              E.name = { name: o, start: a, end: c }, E.name_start = a, E.name_end = c, E.onFolderClick = function(n) {\n                if (n.active = !n.active, E.resourceType == \"source\") {\n                  var t = n.name;\n                  w.go(\"dbt.source_list\", { source: t });\n                } else\n                  E.depth === 0 && n.type !== \"database\" && w.go(\"dbt.project_overview\", { project_name: n.name });\n              }, E.activate = function(n) {\n                E.$emit(\"clearSearch\"), n.active = !0;\n                var t = \"dbt.\" + n.node.resource_type;\n                w.go(t, { unique_id: n.unique_id });\n              }, E.getIcon = function(n, t) {\n                return \"#\" + {\n                  header: { on: \"icn-down\", off: \"icn-right\" },\n                  database: { on: \"icn-db-on\", off: \"icn-db\" },\n                  schema: { on: \"icn-tree-on\", off: \"icn-tree\" },\n                  table: { on: \"icn-doc-on\", off: \"icn-doc\" },\n                  folder: { on: \"icn-dir-on\", off: \"icn-dir\" },\n                  file: { on: \"icn-doc-on\", off: \"icn-doc\" },\n                  group: { on: \"icn-filter\", off: \"icn-filter\" }\n                }[n][t];\n              }, E.getClass = function(n) {\n                return {\n                  active: n.active,\n                  \"menu-tree\": n.type == \"header\" || n.type == \"schema\" || n.type == \"folder\",\n                  \"menu-main\": n.type == \"header\",\n                  \"menu-node\": n.type == \"file\" || n.type == \"table\"\n                };\n              };\n            }\n          }\n        };\n      }\n    ]);\n  },\n  function(L, T) {\n    var e = \"/components/model_tree/model_tree_line.html\";\n    window.angular.module(\"ng\").run([\n      \"$templateCache\",\n      function(u) {\n        u.put(\n          e,\n          `<li class='unselectable'>\n\n    <a ng-if=\"!item.unique_id\"\n       class='unselectable'\n       ng-class=\"getClass(item)\"\n       ng-click=\"onFolderClick(item)\">\n        <span class=\"filename\">\n            <span class=\"filename-normal\">\n                <svg class=\"icn menu-icon-on\"><use xlink:href=\"{{ getIcon(item.type, 'on') }}\"></use></svg>\n                <svg class=\"icn menu-icon-off\"><use xlink:href=\"{{ getIcon(item.type, 'off') }}\"></use></svg>\n            </span>\n            <span class=\"filename-ellip\">{{name.start}}</span>\n            <span class=\"filename-normal\">{{name.end}}</span>\n        </span>\n    </a>\n\n    <a ng-if=\"item.unique_id\"\n       class='unselectable'\n       ng-class=\"getClass(item)\"\n       ng-click=\"activate(item)\"\n       data-nav-unique-id=\"{{ item.unique_id }}\"\n       title=\"{{ name.name }}\">\n        <span class=\"filename\">\n            <span class=\"filename-normal\">\n                <svg class=\"icn menu-icon-on\"><use xlink:href=\"{{ getIcon(item.type, 'on') }}\"></use></svg>\n                <svg class=\"icn menu-icon-off\"><use xlink:href=\"{{ getIcon(item.type, 'off') }}\"></use></svg>\n            </span>\n            <span class=\"filename-ellip\">{{name.start}}</span>\n            <span class=\"filename-normal\">{{name.end}}</span>\n        </span>\n    </a>\n\n    <ul ng-if=\"item.items\">\n        <model-tree-line\n                resource-type=\"{{ resourceType }}\"\n                item=\"subitem\"\n                depth=\"depth + 1\"\n                ng-repeat=\"subitem in item.items\" />\n    </ul>\n</li>\n`\n        );\n      }\n    ]), L.exports = e;\n  },\n  function(L, T, e) {\n    var u = e(427);\n    typeof u == \"string\" && (u = [[L.i, u, \"\"]]);\n    var A = { hmr: !0, transform: void 0, insertInto: void 0 };\n    e(40)(u, A), u.locals && (L.exports = u.locals);\n  },\n  function(L, T, e) {\n    (L.exports = e(39)(!1)).push([\n      L.i,\n      `\n.unselectable{\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n`,\n      \"\"\n    ]);\n  },\n  function(L, T, e) {\n    const u = e(9), A = e(429);\n    e(33), e(206), u.module(\"dbt\").directive(\"docsSearch\", [\n      \"$sce\",\n      \"project\",\n      function(w, E) {\n        return {\n          scope: { query: \"=\", results: \"=\", onSelect: \"&\" },\n          replace: !0,\n          templateUrl: A,\n          link: function(y) {\n            y.max_results = 20, y.show_all = !1, y.max_results_columns = 3, y.limit_columns = {}, y.checkboxStatus = {\n              show_names: !1,\n              show_descriptions: !1,\n              show_columns: !1,\n              show_column_descriptions: !1,\n              show_code: !1,\n              show_tags: !1\n            }, y.limit_search = function(o, c, a) {\n              return c < y.max_results || y.show_all;\n            }, y.getState = function(o) {\n              return \"dbt.\" + o.resource_type;\n            }, y.getModelName = function(o) {\n              return o.resource_type == \"source\" ? o.source_name + \".\" + o.name : o.resource_type == \"macro\" ? o.package_name + \".\" + o.name : o.resource_type == \"metric\" ? o.label : o.resource_type == \"semantic_model\" ? o.name : o.resource_type == \"exposure\" || o.resource_type == \"model\" && o.version != null ? o.label : o.name;\n            };\n            function x(o) {\n              return o.replace(/[.*+\\-?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n            }\n            function g(o) {\n              return _.words(o.toLowerCase());\n            }\n            y.$watchGroup(\n              [\n                \"query\",\n                \"checkboxStatus.show_names\",\n                \"checkboxStatus.show_descriptions\",\n                \"checkboxStatus.show_columns\",\n                \"checkboxStatus.show_column_descriptions\",\n                \"checkboxStatus.show_code\",\n                \"checkboxStatus.show_tags\"\n              ],\n              function() {\n                y.results = function(o, c) {\n                  if (!_.some(_.values(c))) return o;\n                  let a = [], n = [];\n                  const {\n                    show_names: t,\n                    show_descriptions: r,\n                    show_columns: l,\n                    show_column_descriptions: h,\n                    show_code: i,\n                    show_tags: d\n                  } = c;\n                  return _.each(o, function(p) {\n                    _.each(p.matches, function(f) {\n                      if (!n.includes(p.model.unique_id)) {\n                        const v = t && (f.key === \"name\" || f.key == \"label\"), k = r && f.key == \"description\", s = l && f.key === \"columns\", S = h && f.key === \"column_description\", j = i && f.key === \"raw_code\", I = d && f.key === \"tags\";\n                        (v || k || s || S || j || I) && (n.push(p.model.unique_id), a.push(p));\n                      }\n                    });\n                  }), a;\n                }(E.search(y.query), y.checkboxStatus);\n              }\n            ), y.shorten = function(o) {\n              if (o != null && o.trim().length > 0 && y.query != null && y.query.trim().length > 0) {\n                let c = o.replace(/\\s+/g, \" \"), a = x(g(y.query)[0]), n = c.search(new RegExp(a)), t = n - 75 < 0 ? 0 : n - 75, r = n + 75 > c.length ? c.length : n + 75;\n                return \"...\" + c.substring(t, r) + \"...\";\n              }\n              return o;\n            }, y.highlight = function(o) {\n              if (!y.query || !o) return w.trustAsHtml(o);\n              let c = \"(\" + g(y.query).map((a) => x(a)).join(\")|(\") + \")\";\n              return w.trustAsHtml(\n                o.replace(\n                  new RegExp(c, \"gi\"),\n                  '<span class=\"search-result-match\">$&</span>'\n                )\n              );\n            }, y.$watch(\"query\", function(o, c) {\n              o.length == 0 && (y.show_all = !1, y.limit_columns = {});\n            }), y.columnFilter = function(o) {\n              var c = [];\n              let a = g(y.query);\n              for (var n in o)\n                a.every((t) => n.toLowerCase().indexOf(t) != -1) && c.push(n);\n              return c;\n            }, y.limitColumns = function(o) {\n              return y.limit_columns[o] !== void 0 ? y.limit_columns[o] : 3;\n            };\n          }\n        };\n      }\n    ]);\n  },\n  function(L, T) {\n    var e = \"/components/search/search.html\";\n    window.angular.module(\"ng\").run([\n      \"$templateCache\",\n      function(u) {\n        u.put(\n          e,\n          `<div class=\"app-scroll\">\n    <style>\n    .search-result-match {\n        background-color: #eee;\n    }\n    .spacing {\n        margin-right: 0.25em;\n    }\n    .sub-results {\n        margin-left: 36px;\n    }\n    </style>\n    <div class=\"app-title\">\n        <div class=\"app-frame app-pad\">\n            <h1>\n                <span class=\"break\">{{ query }}</span>\n                <small><span>{{ results.length }}</span> search results</small>\n            </h1>\n            <input type=\"checkbox\" id=\"name\" ng-model=\"checkboxStatus.show_names\" ng-click=\"filterResults(results, checkboxStatus)\" style = \"margin-left:10px;margin-right:5px\">\n            <label for=\"name\" style=\"margin-right:25px\">Name</label> \n            <input type=\"checkbox\" id=\"desc\" ng-model=\"checkboxStatus.show_descriptions\" ng-click = \"filterResults(results, checkboxStatus)\" style = \"margin-right:5px\">\n            <label for=\"desc\" style=\"margin-right:25px;\">Description</label> \n            <input type=\"checkbox\" id=\"column\" ng-model=\"checkboxStatus.show_columns\" ng-click = \"filterResults(results, checkboxStatus)\" style = \"margin-right:5px\">\n            <label for=\"column\" style=\"margin-right:25px;\">Column</label> \n            <input type=\"checkbox\" id=\"column_description\" ng-model=\"checkboxStatus.show_column_descriptions\" ng-click = \"filterResults(results, checkboxStatus)\" style = \"margin-right:5px\">\n            <label for=\"column_description\" style=\"margin-right:25px;\">Column Description</label>\n            <input type=\"checkbox\" id=\"code\" ng-model=\"checkboxStatus.show_code\" ng-click = \"filterResults(results, checkboxStatus)\" style = \"margin-right:5px\">\n            <label for=\"code\" style=\"margin-right:15px;\">SQL</label>\n            <input type=\"checkbox\" id=\"tag\" ng-model=\"checkboxStatus.show_tags\" ng-click = \"filterResults(results, checkboxStatus)\" style = \"margin-right:5px\">\n            <label for=\"code\" style=\"margin-right:15px;\">Tags</label>\n        </div>\n    </div>\n    <div class=\"app-details\">\n        <div class=\"app-frame app-pad\">\n            <div class=\"results\">\n                <div ng-repeat=\"result in results | filter:limit_search | orderBy:'overallWeight':true track by result.model.unique_id\"\n                     data-ui-state=\"getState(result.model)\" data-ui-state-params=\"{unique_id: result.model.unique_id}\"\n                     ng-click=\"onSelect()\"\n                     class=\"result search-result a\">\n                        <div class=\"result-content\">\n                            <div class=\"result-icn\">\n                                <svg class=\"icn \"><use xlink:href=\"#icn-doc\"></use></svg>\n                            </div>\n                            <div class=\"result-body\">\n                                <h4 class=\"a\">\n                                    <span ng-bind-html=\"highlight(getModelName(result.model))\"></span>\n                                    <small>{{result.model.resource_type}}</small>\n                                </h4>\n                                <p ng-bind-html=\"highlight(shorten(result.model.description))\"></p>\n                            </div>\n                        </div>\n                        <div class=\"sub-results\" ng-show=\"query.length > 0\">\n                        <span ng-repeat=\"column in columnFilter(result.model.columns) | limitTo:limitColumns(result.model.unique_id)\">\n                            <span ng-show=\"$first === true\">columns:</span>\n                            <span ng-bind-html=\"highlight(column + ',')\" ng-show=\"$last === false\"></span>\n                            <span ng-bind-html=\"highlight(column)\" ng-show=\"$last === true\"></span>\n                        </span>\n                        <a\n                            ng-show=\"columnFilter(result.model.columns).length > max_results_columns && !limit_columns[result.model.unique_id]\"\n                            ng-click=\"$event.stopPropagation(); limit_columns[result.model.unique_id] = 100\">Show {{ columnFilter(result.model.columns).length - max_results_columns }} more</a>\n                        </div>\n                        <div class=\"sub-results\" ng-show=\"query.length > 0\">\n                        <span>\n                            <span ng-bind-html = \"highlight(shorten(result.model['raw_code']))\"></span>\n                        </span>\n                        </div>\n                        <div class=\"sub-results\" ng-show=\"query.length > 0\">\n                        <span ng-repeat=\"tag in result.model.tags\">\n                            <span ng-show=\"$first === true\">tags:</span>\n                            <span ng-bind-html=\"highlight(tag + ',')\" ng-show=\"$last === false\"></span>\n                            <span ng-bind-html=\"highlight(tag)\" ng-show=\"$last === true\"></span>\n                        </span>\n                        </div>\n                </div>\n                <a\n                    ng-show=\"results.length >= max_results && !show_all\"\n                    ng-click=\"show_all = true\">Show {{ results.length - max_results }} more</a>\n            </div>\n        </div>\n    </div>\n</div>\n`\n        );\n      }\n    ]), L.exports = e;\n  },\n  function(L, T) {\n    L.exports = {\n      getQuoteChar: function(e) {\n        var u = (e || {}).adapter_type;\n        return [\"bigquery\", \"spark\", \"databricks\"].indexOf(u) >= 0 ? \"`\" : '\"';\n      }\n    };\n  },\n  function(L, T, e) {\n    const u = e(432);\n    e(433);\n    const A = e(21);\n    angular.module(\"dbt\").directive(\"tableDetails\", [\n      \"$sce\",\n      \"$filter\",\n      \"project\",\n      function(w, E, y) {\n        return {\n          scope: { model: \"=\", extras: \"=\", exclude: \"<\" },\n          templateUrl: u,\n          link: function(x) {\n            function g(n, t) {\n              if (n == 0) return \"0 bytes\";\n              if (n < 1 && (n *= 1e6), isNaN(parseFloat(n)) || !isFinite(n))\n                return \"-\";\n              t === void 0 && (t = 0);\n              var r = Math.floor(Math.log(n) / Math.log(1024));\n              return (n / Math.pow(1024, Math.floor(r))).toFixed(t) + \" \" + [\"bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"][r];\n            }\n            function o(n, t) {\n              return t === void 0 && (t = 2), E(\"number\")(100 * n, t) + \"%\";\n            }\n            function c(n, t) {\n              return t === void 0 && (t = 0), E(\"number\")(n, t);\n            }\n            function a(n) {\n              var t, r, l = !n.metadata, h = n.metadata || {};\n              t = n.database ? n.database + \".\" : \"\", r = l ? void 0 : n.resource_type == \"source\" ? t + n.schema + \".\" + n.identifier : t + n.schema + \".\" + n.alias;\n              var i, d = [\n                {\n                  name: \"Owner\",\n                  value: n.group ? function(p) {\n                    const { name: f, email: v } = y.project.groups[p].owner, k = [];\n                    if (f && k.push(f), v) {\n                      const s = k.length > 0 ? `<${v}>` : v;\n                      k.push(s);\n                    }\n                    return k.join(\" \");\n                  }(`group.${n.package_name}.${n.group}`) : h.owner\n                },\n                {\n                  name: \"Type\",\n                  value: l ? void 0 : (i = h.type, i == \"BASE TABLE\" ? { type: \"table\", name: \"table\" } : i == \"LATE BINDING VIEW\" ? { type: \"view\", name: \"late binding view\" } : { type: i.toLowerCase(), name: i.toLowerCase() }).name\n                },\n                { name: \"Package\", value: n.package_name },\n                { name: \"Language\", value: n.language },\n                { name: \"Relation\", value: r },\n                { name: \"Access\", value: n.access },\n                { name: \"Version\", value: n.version },\n                {\n                  name: \"Contract\",\n                  value: n.config.contract.enforced ? \"Enforced\" : \"Not Enforced\"\n                }\n              ];\n              return A.filter(d, function(p) {\n                return p.value !== void 0;\n              });\n            }\n            x.details = [], x.extended = [], x.exclude = x.exclude || [], x.meta = null, x._show_expanded = !1, x.show_expanded = function(n) {\n              return n !== void 0 && (x._show_expanded = n), x._show_expanded;\n            }, x.hasData = function(n) {\n              return !(!n || A.isEmpty(n)) && (n.length != 1 || n[0].include != 0);\n            }, x.$watch(\"model\", function(n, t) {\n              A.property([\"metadata\", \"type\"])(n);\n              var r, l, h, i = n.hasOwnProperty(\"sources\") && n.sources[0] != null ? n.sources[0].source_meta : null;\n              if (x.meta = n.meta || i, x.details = a(n), x.extended = (r = n.stats, l = {\n                rows: c,\n                row_count: c,\n                num_rows: c,\n                max_varchar: c,\n                pct_used: o,\n                size: g,\n                bytes: g,\n                num_bytes: g\n              }, h = A.sortBy(A.values(r), \"label\"), A.map(h, function(p) {\n                var f = A.clone(p), v = l[p.id];\n                return v && (f.value = v(p.value), f.label = p.label.replace(\"Approximate\", \"~\"), f.label = p.label.replace(\"Utilization\", \"Used\")), f;\n              })), x.extras) {\n                var d = A.filter(x.extras, function(p) {\n                  return p.value !== void 0 && p.value !== null;\n                });\n                x.details = x.details.concat(d);\n              }\n              x.show_extended = A.where(x.extended, { include: !0 }).length > 0;\n            }), x.queryTag = function(n) {\n              x.$emit(\"query\", n);\n            };\n          }\n        };\n      }\n    ]);\n  },\n  function(L, T) {\n    var e = \"/components/table_details/table_details.html\";\n    window.angular.module(\"ng\").run([\n      \"$templateCache\",\n      function(u) {\n        u.put(\n          e,\n          `<div class=\"section-content\">\n    <h6>Details</h6>\n    <div class=\"panel\">\n        <div class=\"panel-body\">\n            <div class=\"details\">\n                <div class=\"details-content\">\n                    <div class=\"detail-group\" ng-if=\"hasData(meta)\">\n                        <div class=\"detail-body\">\n                            <dl class=\"detail\"\n                                ng-repeat=\"(k, v) in meta\">\n                                <dt class=\"detail-label\">{{ k }}</dt>\n                                <dd class=\"detail-value\">{{ v }}</dd>\n                            </dl>\n                        </div>\n                    </div>\n                    <div class=\"detail-group\">\n                        <div class=\"detail-body\">\n                            <dl class='detail' ng-if=\"model.tags != undefined && exclude.indexOf('tags') == -1\">\n                                <dt class=\"detail-label\">Tags</dt>\n                                <dd ng-if=\"model.tags.length > 0\" class=\"detail-value\">\n                                    <span ng-repeat=\"tag in model.tags\"><code><a ng-click=queryTag(tag)>{{ tag }}</a></code>&nbsp;</span>\n                                </dd>\n                                <dd ng-if=\"model.tags.length == 0\" class=\"detail-value\">untagged</dd>\n                            </dl>\n                            <dl class=\"detail\"\n                                ng-repeat=\"item in details\">\n                                <dt class=\"detail-label\">{{ item.name }}</dt>\n                                <dd class=\"detail-value\">{{ item.value }}</dd>\n                            </dl>\n                        </div>\n                    </div>\n                    <div class=\"detail-group\" ng-if=\"hasData(extended)\">\n                        <div class=\"detail-body\">\n                            <dl class=\"detail\"\n                                ng-repeat=\"item in extended\"\n                                ng-if=\"item.include\">\n                                <dt data-toggle=\"tooltip\" title=\"{{ item.description }}\" class=\"detail-label\">{{ item.label }}</dt>\n                                <dd class=\"detail-value\">{{ item.value }}</dd>\n                            </dl>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n`\n        );\n      }\n    ]), L.exports = e;\n  },\n  function(L, T, e) {\n    var u = e(434);\n    typeof u == \"string\" && (u = [[L.i, u, \"\"]]);\n    var A = { hmr: !0, transform: void 0, insertInto: void 0 };\n    e(40)(u, A), u.locals && (L.exports = u.locals);\n  },\n  function(L, T, e) {\n    (L.exports = e(39)(!1)).push([\n      L.i,\n      `\n\n.details-content {\n    table-layout: fixed;\n}\n\n.detail-body {\n    white-space: nowrap;\n    overflow-x: scroll;\n}\n`,\n      \"\"\n    ]);\n  },\n  function(L, T, e) {\n    const u = e(436), A = e(21);\n    angular.module(\"dbt\").directive(\"columnDetails\", [\n      \"project\",\n      function(w) {\n        return {\n          scope: { model: \"=\" },\n          templateUrl: u,\n          link: function(E) {\n            E.has_test = function(y, x) {\n              return A.pluck(y.tests, \"short\").indexOf(x) != -1;\n            }, E.has_constraint = function(y, x) {\n              return y.constraints.some((g) => g.type === x);\n            }, E.has_more_info = function(y) {\n              var x = y.tests || [], g = y.description || \"\", o = y.meta || {}, c = y.constraints || [];\n              return x.length || g.length || c.length || !A.isEmpty(o);\n            }, E.toggle_column_expanded = function(y) {\n              E.has_more_info(y) && (y.expanded = !y.expanded);\n            }, E.getState = function(y) {\n              return \"dbt.\" + y.resource_type;\n            }, E.get_col_name = function(y) {\n              return w.caseColumn(y);\n            }, E.get_columns = function(y) {\n              var x = A.chain(y.columns).values().sortBy(\"index\").value();\n              return A.each(x, function(g, o) {\n                g.index = o;\n              }), x;\n            };\n          }\n        };\n      }\n    ]);\n  },\n  function(L, T) {\n    var e = \"/components/column_details/column_details.html\";\n    window.angular.module(\"ng\").run([\n      \"$templateCache\",\n      function(u) {\n        u.put(\n          e,\n          `<div class=\"panel\">\n    <div class=\"panel-body\">\n        <div ng-if=\"_.isEmpty(model.columns)\">\n            Column information is not available for this seed\n        </div>\n        <div class=\"table-responsive\"\n             style=\"max-height: 800px; overflow-y: scroll;\"\n             ng-if=\"!_.isEmpty(model.columns)\">\n            <table class=\"table table-borderless table-hover\">\n                <thead>\n                    <tr>\n                        <th style=\"background-color: white; position: sticky; top: 0; z-index: 1;\">Column</th>\n                        <th style=\"background-color: white; position: sticky; top: 0; z-index: 1;\">Type</th>\n                        <th style=\"background-color: white; position: sticky; top: 0; z-index: 1;\">Description</th>\n                        <th style=\"width: 1px; background-color: white; position: sticky; top: 0; z-index: 1;\">Constraints</th>\n                        <th style=\"width: 1px; background-color: white; position: sticky; top: 0; z-index: 1;\">Tests</th>\n                        <th style=\"width: 1px; background-color: white; position: sticky; top: 0; z-index: 1;\" class='text-center'>More?</th>\n                    </tr>\n                </thead>\n                <tbody>\n                    <tr\n                        ng-repeat-start=\"column in get_columns(model) track by column.index\"\n                        ng-click=\"toggle_column_expanded(column)\"\n                        class=\"column-row\"\n                        ng-class=\"{'column-row-selected': column.expanded}\"\n                        ng-style=\"{cursor: has_more_info(column) ? 'pointer' : 'auto'}\">\n                        <td>\n                            <div>\n                                <span class='text-dark'>{{ get_col_name(column.name) }}</span>\n                            </div>\n                        </td>\n                        <td>\n                            <span class='text-dark'>{{ column.type }}</p>\n                        </td>\n                        <td style=\"text-overflow: ellipsis; overflow-x: hidden; white-space: nowrap; max-width: 1px;\">\n                            <span ng-show=\"!column.expanded\">{{ column.description }}</span>\n                        </td>\n                        <td>\n                            <span class=\"text-light\" ng-show=\"!column.expanded\">\n                                <span data-toggle=\"tooltip\" title=\"Not Null\" ng-if=\"has_constraint(column, 'not_null')\">N</span>\n                                <span data-toggle=\"tooltip\" title=\"Primary Key\" ng-if=\"has_constraint(column, 'primary_key')\">PK</span>\n                                <span data-toggle=\"tooltip\" title=\"Foreign Key\" ng-if=\"has_constraint(column, 'foreign_key')\">FK</span>\n                                <span data-toggle=\"tooltip\" title=\"Check\" ng-if=\"has_constraint(column, 'check')\">C</span>\n                                <span data-toggle=\"tooltip\" title=\"Custom\" ng-if=\"has_constraint(column, 'custom')\">+</span>\n                            </span>\n                        </td>\n                        <td>\n                            <span class=\"text-light\" ng-show=\"!column.expanded\">\n                                <span data-toggle=\"tooltip\" title=\"Unique\" ng-if=\"has_test(column, 'U')\">U</span>\n                                <span data-toggle=\"tooltip\" title=\"Not Null\" ng-if=\"has_test(column, 'N')\">N</span>\n                                <span data-toggle=\"tooltip\" title=\"Foreign Key\" ng-if=\"has_test(column, 'F')\">F</span>\n                                <span data-toggle=\"tooltip\" title=\"Accepted Values\" ng-if=\"has_test(column, 'A')\">A</span>\n                                <span data-toggle=\"tooltip\" title=\"Custom Test\" ng-if=\"has_test(column, '+')\">+</span>\n                            </span>\n                        </td>\n                        <td class='text-center'>\n                            <span class='text-light' ng-show=\"has_more_info(column)\">\n                                <span ng-if=\"column.expanded\">\n                                    <svg class=\"icn\"><use xlink:href=\"#icn-up\"></use></svg>\n                                </span>\n                                <span ng-if=\"!column.expanded\">\n                                    <svg class=\"icn\"><use xlink:href=\"#icn-right\"></use></svg>\n                                </span>\n                            </span>\n                        </td>\n                    </tr>\n                    <tr ng-repeat-end ng-show=\"column.expanded\" style=\"background-color: white; padding: 10px\">\n                        <td colspan=\"5\" class=\"column-expanded\">\n                            <div style=\"padding: 5px 20px\">\n                                <div ng-show=\"column.meta\">\n                                    <h5>Details</h5>\n                                    <div class=\"detail-group\" style=\"padding-bottom: 0\">\n                                        <div class=\"detail-body\" style=\"padding-left: 0\">\n                                            <dl class=\"detail\"\n                                                ng-style=\"{'padding-left': $index == 0 ? 0 : 'auto'}\"\n                                                ng-repeat=\"(k, v) in column.meta\">\n                                                <dt class=\"detail-label\">{{ k }}</dt>\n                                                <dd class=\"detail-value\">{{ v }}</dd>\n                                            </dl>\n                                        </div>\n                                    </div>\n                                </div>\n\n                                <div style=\"margin-bottom: 15px\" ng-if=\"column.description.length\">\n                                    <h5>Description</h5>\n                                    <span marked=\"column.description\"></span>\n                                </div>\n\n                                <div ng-show=\"column.constraints && column.constraints.length\" style=\"margin-bottom: 15px\">\n                                    <h5>Constraints</h5>\n                                    <div class=\"detail-group\" style=\"padding-bottom: 0\">\n                                        <div class=\"detail-body\" style=\"padding-left: 0\">\n                                            <dl class=\"detail\" ng-style=\"{'padding-left': $index == 0 ? 0 : 'auto'}\"\n                                                ng-repeat=\"constraint in column.constraints\">\n                                                <dt class=\"detail-label\">Name</dt>\n                                                <dd class=\"detail-value\">{{ constraint.name }}</dd>\n                                                <dt class=\"detail-label\">Type</dt>\n                                                <dd class=\"detail-value\">{{ constraint.type }}</dd>\n                                                <dt class=\"detail-label\">Expression</dt>\n                                                <dd class=\"detail-value\">{{ constraint.expression }}</dd>\n                                            </dl>\n                                        </div>\n                                    </div>\n                                </div>\n\n                                <div ng-show=\"column.tests && column.tests.length\" style=\"margin-bottom: 15px\">\n                                    <h5>Generic Tests</h5>\n                                    <ul class=\"list-unstyled\" style=\"margin-top: 2px\">\n                                        <li ng-repeat=\"test in column.tests\" ng-switch on=\"test.short\" class='text-light'>\n                                            <span ng-switch-when=\"F\">\n                                                Foreign Key\n                                                <span ng-if=\"test.fk_model.unique_id\">\n                                                    <a data-ui-state=\"getState(test.fk_model)\"\n                                                        data-ui-state-params=\"{unique_id: test.fk_model.unique_id}\">\n                                                        to {{ test.fk_model.name }}\n                                                    </a> on <code>{{ test.fk_field }}</code>\n                                                </span>\n                                            </span>\n                                            <span ng-switch-when=\"P\">Primary Key</span>\n                                            <span ng-switch-when=\"U\">Unique</span>\n                                            <span ng-switch-when=\"N\">Not Null</span>\n                                            <span ng-switch-default>{{ test.label }}</span>\n                                        </li>\n                                    </ul>\n                                </div>\n                            </div>\n                        </td>\n                    </tr>\n                </tbody>\n            </table>\n        </div>\n    </div>\n</div>\n`\n        );\n      }\n    ]), L.exports = e;\n  },\n  function(L, T, e) {\n    const u = e(438);\n    e(33), e(439);\n    function A(w) {\n      return w === \"python\" ? \"language-python\" : \"language-sql\";\n    }\n    angular.module(\"dbt\").directive(\"codeBlock\", [\n      \"code\",\n      \"$timeout\",\n      function(w, E) {\n        return {\n          scope: { versions: \"=\", default: \"<\", language: \"=\" },\n          restrict: \"E\",\n          templateUrl: u,\n          link: function(y, x) {\n            y.selected_version = y.default, y.language_class = A(y.language), y.source = null, y.setSelected = function(g) {\n              y.selected_version = g, y.source = y.versions[g] || \"\";\n              const o = y.source.trim();\n              y.highlighted = w.highlight(o, y.language), E(function() {\n                Prism.highlightAll();\n              });\n            }, y.titleCase = function(g) {\n              return g.charAt(0).toUpperCase() + g.substring(1);\n            }, y.copied = !1, y.copy_to_clipboard = function() {\n              w.copy_to_clipboard(y.source), y.copied = !0, setTimeout(function() {\n                y.$apply(function() {\n                  y.copied = !1;\n                });\n              }, 1e3);\n            }, y.$watch(\n              \"language\",\n              function(g, o) {\n                g && g != o && (y.language_class = A(g));\n              },\n              !0\n            ), y.$watch(\n              \"versions\",\n              function(g, o) {\n                if (g)\n                  if (y.default) y.setSelected(y.default);\n                  else {\n                    var c = Object.keys(y.versions);\n                    c.length > 0 && y.setSelected(c[0]);\n                  }\n              },\n              !0\n            );\n          }\n        };\n      }\n    ]);\n  },\n  function(L, T) {\n    var e = \"/components/code_block/code_block.html\";\n    window.angular.module(\"ng\").run([\n      \"$templateCache\",\n      function(u) {\n        u.put(\n          e,\n          `<h6>Code</h6>\n<div class=\"panel\">\n    <div class=\"panel-body\">\n        <ul class=\"nav nav-tabs\">\n            <li\n                ng-repeat=\"(version_name, version) in versions\"\n                ng-class=\"{active: version_name == selected_version}\">\n                <a ng-click=\"setSelected(version_name)\">{{ titleCase(version_name) }}</a>\n            </li>\n            <li class='nav-pull-right'></li>\n            <li>\n                <a class='unselectable'\n                   ng-click=\"copy_to_clipboard()\">{{ copied ? 'copied' : 'copy to clipboard' }}</a>\n            </li>\n        </ul>\n        <div style=\"margin-top: 1px\">\n            <pre style=\"background-color: white\"\n                 class='code line-numbers'><code class=\"source-code highlight\" ng-class=\"language_class\" ng-bind-html=\"highlighted\"></code></pre>\n        </div>\n    </div>\n</div>\n`\n        );\n      }\n    ]), L.exports = e;\n  },\n  function(L, T, e) {\n    var u = e(440);\n    typeof u == \"string\" && (u = [[L.i, u, \"\"]]);\n    var A = { hmr: !0, transform: void 0, insertInto: void 0 };\n    e(40)(u, A), u.locals && (L.exports = u.locals);\n  },\n  function(L, T, e) {\n    (L.exports = e(39)(!1)).push([\n      L.i,\n      `pre.code {\n    border: none !important;\n    overflow-y: visible !important;\n    overflow-x: scroll !important;\n    padding-bottom: 10px;\n}\n\npre.code code {\n    font-family: Monaco, monospace !important;\n    font-weight: 400 !important;\n}\n\n.line-numbers-rows {\n    border: none !important;\n}\n`,\n      \"\"\n    ]);\n  },\n  function(L, T, e) {\n    const u = e(442);\n    angular.module(\"dbt\").directive(\"macroArguments\", [\n      function() {\n        return {\n          scope: { macro: \"=\" },\n          templateUrl: u,\n          link: function(A) {\n            _.each(A.macro.arguments, function(w) {\n              w.expanded = !1;\n            });\n          }\n        };\n      }\n    ]);\n  },\n  function(L, T) {\n    var e = \"/components/macro_arguments/index.html\";\n    window.angular.module(\"ng\").run([\n      \"$templateCache\",\n      function(u) {\n        u.put(\n          e,\n          `<style>\n    .arg-header {\n        background-color: white;\n        position: sticky;\n        top: 0;\n        z-index: 1;\n    }\n\n</style>\n\n<div class=\"panel\">\n    <div class=\"panel-body\">\n        <div ng-if=\"macro.arguments.length == 0\">\n            Details are not available for this macro. This may be due to the fact that this macro doesn't have any\n            arguments or that they haven't been documented yet.\n        </div>\n        <div ng-if=\"macro.arguments.length > 0\" class=\"table-responsive\" style=\"max-height: 800px; overflow-y: scroll;\">\n            <table class=\"table table-borderless table-hover\">\n                <thead>\n                    <tr>\n                        <th class=\"arg-header\">Argument</th>\n                        <th class=\"arg-header\">Type</th>\n                        <th class=\"arg-header\">Description</th>\n                        <th style=\"width: 1px;\" class='text-center'>More?</th>\n                    </tr>\n                </thead>\n                <tbody>\n                    <tr ng-repeat-start=\"arg in macro.arguments\" ng-click=\"arg.expanded = !arg.expanded\"\n                        ng-class=\"{'column-row-selected': arg.expanded}\"\n                        ng-style=\"{cursor: arg.description ? 'pointer' : 'auto'}\" class=\"column-row\">\n                        <td>\n                            <div>\n                                <span class='text-dark'>{{ arg.name }}</span>\n                            </div>\n                        </td>\n                        <td>\n                            <span class='text-dark'>{{ arg.type }}</p>\n                        </td>\n                        <td style=\"text-overflow: ellipsis; overflow-x: hidden; white-space: nowrap; max-width: 1px;\">\n                            <span ng-show=\"!arg.expanded\">{{ arg.description }}</span>\n                        </td>\n                        <td class='text-center'>\n                            <span class='text-light' ng-show=\"arg.description\">\n                                <span ng-if=\"arg.expanded\">\n                                    <svg class=\"icn\">\n                                        <use xlink:href=\"#icn-up\"></use>\n                                    </svg>\n                                </span>\n                                <span ng-if=\"!arg.expanded\">\n                                    <svg class=\"icn\">\n                                        <use xlink:href=\"#icn-right\"></use>\n                                    </svg>\n                                </span>\n                            </span>\n                        </td>\n                    </tr>\n                    <tr ng-repeat-end ng-show=\"arg.expanded\" style=\"background-color: white; padding: 10px\">\n                        <td colspan=\"4\" class=\"column-expanded\">\n                            <div style=\"padding: 5px 20px\">\n                                <div style=\"margin-bottom: 15px\">\n                                    <h5>Description</h5>\n                                    <span marked=\"arg.description\"></span>\n                                </div>\n                            </div>\n                        </td>\n                    </tr>\n                </tbody>\n            </table>\n        </div>\n    </div>\n</div>\n`\n        );\n      }\n    ]), L.exports = e;\n  },\n  function(L, T, e) {\n    const u = e(444);\n    angular.module(\"dbt\").directive(\"referenceList\", [\n      \"$state\",\n      function(A) {\n        return {\n          scope: { references: \"=\", node: \"=\" },\n          restrict: \"E\",\n          templateUrl: u,\n          link: function(w) {\n            w.selected_type = null, w.setType = function(E) {\n              w.selected_type = E, w.nodes = w.references[w.selected_type];\n            }, w.getNodeUrl = function(E) {\n              var y = \"dbt.\" + E.resource_type;\n              return A.href(y, { unique_id: E.unique_id, \"#\": null });\n            }, w.mapResourceType = function(E) {\n              return E == \"model\" ? \"Models\" : E == \"seed\" ? \"Seeds\" : E == \"test\" ? \"Tests\" : E == \"snapshot\" ? \"Snapshots\" : E == \"analysis\" ? \"Analyses\" : E == \"macro\" ? \"Macros\" : E == \"exposure\" ? \"Exposures\" : E == \"metric\" ? \"Metrics\" : E == \"semantic_model\" ? \"Semantic Models\" : E == \"operation\" ? \"Operations\" : \"Nodes\";\n            }, w.$watch(\"references\", function(E) {\n              E && _.size(E) > 0 ? (w.selected_type = _.keys(E)[0], w.has_references = !0, w.nodes = w.references[w.selected_type]) : w.has_references = !1;\n            });\n          }\n        };\n      }\n    ]);\n  },\n  function(L, T) {\n    var e = \"/components/references/index.html\";\n    window.angular.module(\"ng\").run([\n      \"$templateCache\",\n      function(u) {\n        u.put(\n          e,\n          `<div class=\"panel\">\n    <div class=\"panel-body\" ng-if=\"!has_references\">\n        No resources reference this {{ node.resource_type }}\n    </div>\n    <div class=\"panel-body\" ng-if=\"has_references\">\n        <ul class=\"nav nav-tabs\">\n            <li\n                ng-repeat=\"(resource_type, nodes) in references\"\n                ng-class=\"{active: resource_type == selected_type}\">\n                <a ng-click=\"setType(resource_type)\">\n                    {{ mapResourceType(resource_type) }}\n                </a>\n            </li>\n        </ul>\n        <div style=\"margin-top: 15px\">\n            <ul class='list-unstyled'>\n                <li ng-repeat=\"node in nodes\">\n                    <a ng-href=\"{{ getNodeUrl(node) }}\">{{ node.name }}</a>\n                </li>\n            </ul>\n        <div>\n    </div>\n</div>\n`\n        );\n      }\n    ]), L.exports = e;\n  },\n  function(L, T, e) {\n    e(446), e(448), e(449), e(450), e(451), e(452), e(453), e(454), e(455), e(456), e(457);\n  },\n  function(L, T, e) {\n    const u = e(9), A = e(30);\n    e(31), u.module(\"dbt\").controller(\"ModelCtrl\", [\n      \"$scope\",\n      \"$state\",\n      \"project\",\n      \"code\",\n      \"$anchorScroll\",\n      \"$location\",\n      function(w, E, y, x, g, o) {\n        w.model_uid = E.params.unique_id, w.tab = E.params.tab, w.project = y, w.codeService = x, w.versions = {}, w.copied = !1, w.copy_to_clipboard = function(c) {\n          x.copy_to_clipboard(c), w.copied = !0, setTimeout(function() {\n            w.$apply(function() {\n              w.copied = !1;\n            });\n          }, 1e3);\n        }, w.model = {}, y.ready(function(c) {\n          let a = c.nodes[w.model_uid];\n          w.model = a, w.references = A.getReferences(c, a), w.referencesLength = Object.keys(w.references).length, w.parents = A.getParents(c, a), w.parentsLength = Object.keys(w.parents).length, w.language = a.language, w.versions = {\n            Source: w.model.raw_code,\n            Compiled: w.model.compiled_code || `\n-- compiled code not found for this model\n`\n          }, setTimeout(function() {\n            g();\n          }, 0);\n        });\n      }\n    ]);\n  },\n  function(L, T, e) {\n    (L.exports = e(39)(!1)).push([\n      L.i,\n      `\n.nav-tabs li.nav-pull-right {\n    flex: 1 0 auto;\n    text-align: right;\n}\n\ntr.column-row-selected {\n\n}\n\ntd.column-expanded{\n    padding: 0px !important;\n}\n\ntd.column-expanded > div {\n    padding: 5px 10px;\n    margin-left: 20px;\n    height: 100%;\n\n    border-left: 1px solid #ccc !important;\n}\n`,\n      \"\"\n    ]);\n  },\n  function(L, T, e) {\n    const u = e(9), A = e(30);\n    e(31), u.module(\"dbt\").controller(\"SourceCtrl\", [\n      \"$scope\",\n      \"$state\",\n      \"project\",\n      \"code\",\n      \"$anchorScroll\",\n      \"$location\",\n      function(w, E, y, x, g, o) {\n        w.model_uid = E.params.unique_id, w.project = y, w.codeService = x, w.extra_table_fields = [], w.versions = {}, w.model = {}, y.ready(function(c) {\n          let a = c.nodes[w.model_uid];\n          w.model = a, w.references = A.getReferences(c, a), w.referencesLength = Object.keys(w.references).length, w.parents = A.getParents(c, a), w.parentsLength = Object.keys(w.parents).length, w.versions = { \"Sample SQL\": x.generateSourceSQL(w.model) }, w.extra_table_fields = [\n            { name: \"Loader\", value: w.model.loader },\n            { name: \"Source\", value: w.model.source_name }\n          ];\n        });\n      }\n    ]);\n  },\n  function(L, T, e) {\n    const u = e(9), A = e(30);\n    e(31), u.module(\"dbt\").controller(\"SeedCtrl\", [\n      \"$scope\",\n      \"$state\",\n      \"project\",\n      \"code\",\n      \"$transitions\",\n      \"$anchorScroll\",\n      \"$location\",\n      function(w, E, y, x, g, o, c) {\n        w.model_uid = E.params.unique_id, w.tab = E.params.tab, w.project = y, w.codeService = x, w.versions = {}, w.model = {}, y.ready(function(a) {\n          let n = a.nodes[w.model_uid];\n          w.model = n, w.references = A.getReferences(a, n), w.referencesLength = Object.keys(w.references).length, w.parents = A.getParents(a, n), w.parentsLength = Object.keys(w.parents).length, w.versions = { \"Example SQL\": x.generateSourceSQL(w.model) };\n        });\n      }\n    ]);\n  },\n  function(L, T, e) {\n    const u = e(9), A = e(30);\n    e(31), u.module(\"dbt\").controller(\"SnapshotCtrl\", [\n      \"$scope\",\n      \"$state\",\n      \"project\",\n      \"code\",\n      \"$anchorScroll\",\n      \"$location\",\n      function(w, E, y, x, g, o) {\n        w.model_uid = E.params.unique_id, w.tab = E.params.tab, w.project = y, w.codeService = x, w.versions = {}, w.model = {}, y.ready(function(c) {\n          let a = c.nodes[w.model_uid];\n          w.model = a, w.references = A.getReferences(c, a), w.referencesLength = Object.keys(w.references).length, w.parents = A.getParents(c, a), w.parentsLength = Object.keys(w.parents).length, w.language = a.language, w.versions = {\n            Source: w.model.raw_code,\n            Compiled: w.model.compiled_code || \"Compiled SQL is not available for this snapshot\"\n          }, setTimeout(function() {\n            g();\n          }, 0);\n        });\n      }\n    ]);\n  },\n  function(L, T, e) {\n    const u = e(9), A = e(30);\n    e(31), u.module(\"dbt\").controller(\"TestCtrl\", [\n      \"$scope\",\n      \"$state\",\n      \"project\",\n      \"code\",\n      \"$anchorScroll\",\n      \"$location\",\n      function(w, E, y, x, g, o) {\n        w.model_uid = E.params.unique_id, w.tab = E.params.tab, w.project = y, w.codeService = x, w.versions = {}, w.model = {}, y.ready(function(c) {\n          let a = c.nodes[w.model_uid];\n          w.model = a, w.references = A.getReferences(c, a), w.referencesLength = Object.keys(w.references).length, w.parents = A.getParents(c, a), w.parentsLength = Object.keys(w.parents).length, w.language = a.language, w.versions = {\n            Source: w.model.raw_code,\n            Compiled: w.model.compiled_code || `\n-- compiled code not found for this model\n`\n          }, setTimeout(function() {\n            g();\n          }, 0);\n        });\n      }\n    ]);\n  },\n  function(L, T, e) {\n    const u = e(9), A = e(21), w = e(30);\n    e(31), u.module(\"dbt\").controller(\"MacroCtrl\", [\n      \"$scope\",\n      \"$state\",\n      \"project\",\n      \"code\",\n      \"$transitions\",\n      \"$anchorScroll\",\n      \"$location\",\n      function(E, y, x, g, o, c, a) {\n        E.model_uid = y.params.unique_id, E.tab = y.params.tab, E.project = x, E.codeService = g, E.macro = {}, x.ready(function(n) {\n          let t = n.macros[E.model_uid];\n          if (E.macro = t, E.references = w.getMacroReferences(n, t), E.referencesLength = Object.keys(E.references).length, E.parents = w.getMacroParents(n, t), E.parentsLength = Object.keys(E.parents).length, E.macro.is_adapter_macro) {\n            var r = n.metadata.adapter_type;\n            E.versions = t.impls, t.impls[r] ? E.default_version = r : t.impls.default ? E.default_version = \"default\" : E.default_version = A.keys(t.impls)[0];\n          } else E.default_version = \"Source\", E.versions = { Source: E.macro.macro_sql };\n        });\n      }\n    ]);\n  },\n  function(L, T, e) {\n    const u = e(9), A = e(30);\n    e(31), u.module(\"dbt\").controller(\"AnalysisCtrl\", [\n      \"$scope\",\n      \"$state\",\n      \"project\",\n      \"code\",\n      \"$transitions\",\n      \"$anchorScroll\",\n      \"$location\",\n      function(w, E, y, x, g, o, c) {\n        w.model_uid = E.params.unique_id, w.project = y, w.codeService = x, w.default_version = \"Source\", w.versions = { Source: \"\", Compiled: \"\" }, w.model = {}, y.ready(function(a) {\n          let n = a.nodes[w.model_uid];\n          w.model = n, w.references = A.getReferences(a, n), w.referencesLength = Object.keys(w.references).length, w.parents = A.getParents(a, n), w.parentsLength = Object.keys(w.parents).length, w.language = n.language, w.versions = {\n            Source: w.model.raw_code,\n            Compiled: w.model.compiled_code\n          };\n        });\n      }\n    ]);\n  },\n  function(L, T, e) {\n    const u = e(9), A = e(30);\n    e(31), u.module(\"dbt\").controller(\"ExposureCtrl\", [\n      \"$scope\",\n      \"$state\",\n      \"project\",\n      \"code\",\n      \"$anchorScroll\",\n      \"$location\",\n      function(w, E, y, x, g, o) {\n        w.model_uid = E.params.unique_id, w.project = y, w.codeService = x, w.extra_table_fields = [], w.versions = {}, w.exposure = {}, y.ready(function(c) {\n          let a = c.nodes[w.model_uid];\n          var n;\n          w.exposure = a, w.parents = A.getParents(c, a), w.parentsLength = w.parents.length, w.language = a.language, w.exposure.owner.name && w.exposure.owner.email ? n = `${w.exposure.owner.name} <${w.exposure.owner.email}>` : w.exposure.owner.name ? n = \"\" + w.exposure.owner.name : w.exposure.owner.email && (n = \"\" + w.exposure.owner.email), w.extra_table_fields = [\n            { name: \"Maturity\", value: w.exposure.maturity },\n            { name: \"Owner\", value: n },\n            { name: \"Exposure name\", value: w.exposure.name }\n          ];\n        });\n      }\n    ]);\n  },\n  function(L, T, e) {\n    const u = e(9), A = e(30);\n    e(31), u.module(\"dbt\").controller(\"MetricCtrl\", [\n      \"$scope\",\n      \"$state\",\n      \"project\",\n      \"code\",\n      \"$anchorScroll\",\n      \"$location\",\n      function(w, E, y, x, g, o) {\n        w.model_uid = E.params.unique_id, w.project = y, w.codeService = x, w.extra_table_fields = [], w.versions = {}, w.metric = {}, y.ready(function(c) {\n          let a = c.nodes[w.model_uid];\n          w.metric = a, w.parents = A.getParents(c, a), w.parentsLength = w.parents.length;\n          const n = w.metric.type === \"expression\" ? \"Expression metric\" : \"Aggregate metric\";\n          w.extra_table_fields = [\n            { name: \"Metric Type\", value: n },\n            { name: \"Metric name\", value: w.metric.name }\n          ];\n        });\n      }\n    ]);\n  },\n  function(L, T, e) {\n    const u = e(9), A = e(30);\n    e(31), u.module(\"dbt\").controller(\"SemanticModelCtrl\", [\n      \"$scope\",\n      \"$state\",\n      \"project\",\n      \"code\",\n      \"$anchorScroll\",\n      \"$location\",\n      function(w, E, y, x, g, o) {\n        w.model_uid = E.params.unique_id, w.project = y, w.codeService = x, w.extra_table_fields = [], w.versions = {}, w.semantic_model = {}, y.ready(function(c) {\n          let a = c.nodes[w.model_uid];\n          w.semantic_model = a, w.parents = A.getParents(c, a), w.parentsLength = w.parents.length;\n          const n = w.semantic_model.type === \"expression\" ? \"Expression semantic_model\" : \"Aggregate semantic_model\";\n          w.extra_table_fields = [\n            { name: \"Semantic Model Type\", value: n },\n            { name: \"Semantic Model name\", value: w.semantic_model.name }\n          ];\n        });\n      }\n    ]);\n  },\n  function(L, T, e) {\n    const u = e(9), A = e(30);\n    e(31), u.module(\"dbt\").controller(\"OperationCtrl\", [\n      \"$scope\",\n      \"$state\",\n      \"project\",\n      \"code\",\n      \"$anchorScroll\",\n      \"$location\",\n      function(w, E, y, x, g, o) {\n        w.model_uid = E.params.unique_id, w.tab = E.params.tab, w.project = y, w.codeService = x, w.versions = {}, w.model = {}, y.ready(function(c) {\n          let a = c.nodes[w.model_uid];\n          w.model = a, w.references = A.getReferences(c, a), w.referencesLength = Object.keys(w.references).length, w.parents = A.getParents(c, a), w.parentsLength = Object.keys(w.parents).length, w.language = a.language, w.versions = {\n            Source: w.model.raw_code,\n            Compiled: w.model.compiled_code || `\n-- compiled code not found for this model\n`\n          }, setTimeout(function() {\n            g();\n          }, 0);\n        });\n      }\n    ]);\n  },\n  function(L, T, e) {\n    e(9).module(\"dbt\").controller(\"GraphCtrl\", [\n      \"$scope\",\n      \"$state\",\n      \"$window\",\n      \"graph\",\n      \"project\",\n      \"selectorService\",\n      function(u, A, w, E, y, x) {\n        function g(o) {\n          return o && o.resource_type == \"source\" ? \"source:\" + o.source_name + \".\" + o.name : o && o.resource_type == \"exposure\" ? \"exposure:\" + o.name : o && o.resource_type == \"metric\" ? \"metric:\" + o.name : o && o.resource_type == \"semantic_model\" ? \"semantic_model:\" + o.name : o && o.resource_type == \"model\" && o.version != null ? o.label : o.name ? o.name : \"*\";\n        }\n        u.graph = E.graph, u.graphService = E, u.graphRendered = function(o) {\n          E.setGraphReady(o);\n        }, u.$watch(\n          function() {\n            return A.params.unique_id;\n          },\n          function(o, c) {\n            o && o != c && y.find_by_id(o, function(a) {\n              a && (E.orientation == \"sidebar\" ? E.showVerticalGraph(g(a), !1) : E.showFullGraph(g(a)));\n            }), o || x.clearViewNode();\n          }\n        );\n      }\n    ]);\n  },\n  function(L, T, e) {\n    const u = e(9), A = e(21), w = e(33), E = e(460);\n    e(461), e(206), e(469), e(471), e(474), e(478), u.module(\"dbt\").controller(\"MainController\", [\n      \"$scope\",\n      \"$route\",\n      \"$state\",\n      \"project\",\n      \"graph\",\n      \"selectorService\",\n      \"trackingService\",\n      \"locationService\",\n      \"$transitions\",\n      function(y, x, g, o, c, a, n, t, r) {\n        function l(i) {\n          y.model_uid = i;\n          var d = o.node(i);\n          d && a.resetSelection(d);\n        }\n        function h(i) {\n          i && setTimeout(function() {\n            var d = w(\"*[data-nav-unique-id='\" + i + \"']\");\n            d.length && d[0].scrollIntoView && d[0].scrollIntoView({\n              behavior: \"smooth\",\n              block: \"center\",\n              inline: \"center\"\n            });\n          }, 1);\n        }\n        y.tree = { database: {}, project: {}, sources: {} }, y.search = { query: \"\", results: [], is_focused: !1 }, y.logo = E, y.model_uid = null, y.project = {}, w(\"body\").bind(\"keydown\", function(i) {\n          event.key == \"t\" && event.target.tagName != \"INPUT\" && (w(\"#search\").focus(), event.preventDefault());\n        }), y.onSearchFocus = function(i, d) {\n          y.search.is_focused = d;\n        }, y.clearSearch = function() {\n          y.search.is_focused = !1, y.search.query = \"\", y.search.results = [], w(\"#search\").blur();\n        }, y.$on(\"clearSearch\", function() {\n          y.clearSearch();\n        }), y.$on(\"query\", function(i, d) {\n          y.search.is_focused = !0, y.search.query = d;\n        }), y.onSearchKeypress = function(i) {\n          i.key == \"Escape\" && (y.clearSearch(), i.preventDefault());\n        }, o.getModelTree(g.params.unique_id, function(i) {\n          y.tree.database = i.database, y.tree.project = i.project, y.tree.sources = i.sources, y.tree.exposures = i.exposures, y.tree.metrics = i.metrics, y.tree.semantic_models = i.semantic_models, y.tree.groups = i.groups, setTimeout(function() {\n            h(y.model_uid);\n          });\n        }), r.onSuccess({}, function(i, d) {\n          var p = i.router.globals.params, f = a.getViewNode(), v = f ? f.unique_id : null, k = p.unique_id, s = !0;\n          if (i.from().name == i.to().name && v == k && (s = !1), s && p.unique_id) {\n            var S = o.updateSelected(p.unique_id);\n            y.tree.database = S.database, y.tree.groups = S.groups, y.tree.project = S.project, y.tree.sources = S.sources, y.search.query = \"\", l(p.unique_id), setTimeout(function() {\n              h(p.unique_id);\n            });\n          }\n          s && n.track_pageview();\n        }), y.$watch(\"search.query\", function(i) {\n          y.search.results = function(d) {\n            if (y.search.query === \"\") return d;\n            let p = {\n              name: 10,\n              tags: 5,\n              description: 3,\n              raw_code: 2,\n              columns: 1\n            };\n            return A.each(d, function(f) {\n              f.overallWeight = 0, A.each(Object.keys(p), function(v) {\n                if (f.model[v] != null) {\n                  let k = 0, s = f.model[v], S = y.search.query.toLowerCase();\n                  if (v === \"columns\")\n                    A.each(s, function(j) {\n                      if (j.name) {\n                        let I = j.name.toLowerCase(), R = 0;\n                        for (; R != -1; )\n                          R = I.indexOf(S, R), R != -1 && (k++, R++);\n                      }\n                    });\n                  else if (v === \"tags\")\n                    A.each(s, function(j) {\n                      let I = j.toLowerCase(), R = 0;\n                      for (; R != -1; )\n                        R = I.indexOf(S, R), R != -1 && (k++, R++);\n                    });\n                  else {\n                    s = s.toLowerCase();\n                    let j = 0;\n                    for (; j != -1; )\n                      j = s.indexOf(S, j), j != -1 && (k++, j++);\n                  }\n                  f.overallWeight += k * p[v];\n                }\n              });\n            }), d;\n          }(o.search(i));\n        }), o.init(), o.ready(function(i) {\n          y.project = i, y.search.results = o.search(\"\");\n          var d = A.unique(A.pluck(A.values(i.nodes), \"package_name\")).sort(), p = [null];\n          A.each(i.nodes, function(k) {\n            var s = k.tags;\n            p = A.union(p, s).sort();\n          }), a.init({ packages: d, tags: p }), l(g.params.unique_id);\n          var f = t.parseState(g.params);\n          f.show_graph && c.ready(function() {\n            A.assign(a.selection.dirty, f.selected);\n            var k = a.updateSelection();\n            c.updateGraph(k);\n          });\n          var v = i.metadata || {};\n          n.init({\n            track: v.send_anonymous_usage_stats,\n            project_id: v.project_id\n          });\n        });\n      }\n    ]);\n  },\n  function(L, T) {\n    L.exports = \"data:image/svg+xml,%3Csvg width='242' height='90' viewBox='0 0 242 90' fill='none' xmlns='http://www.w3.org/2000/svg'%3E %3Cpath d='M240.384 74.5122L239.905 75.8589H239.728L239.249 74.5156V75.8589H238.941V74.0234H239.324L239.816 75.3872L240.309 74.0234H240.691V75.8589H240.384V74.5122ZM238.671 74.3003H238.169V75.8589H237.858V74.3003H237.352V74.0234H238.671V74.3003Z' fill='%23262A38'/%3E %3Cpath d='M154.123 13.915V75.3527H141.672V69.0868C140.37 71.2839 138.499 73.0742 136.22 74.2134C133.779 75.434 131.012 76.085 128.246 76.085C124.828 76.1664 121.41 75.1899 118.562 73.2369C115.633 71.2839 113.354 68.5986 111.889 65.425C110.262 61.7631 109.448 57.8572 109.529 53.8698C109.448 49.8825 110.262 45.9765 111.889 42.3961C113.354 39.3038 115.633 36.6185 118.481 34.7469C121.41 32.8753 124.828 31.9801 128.246 32.0615C130.931 32.0615 133.616 32.6311 135.976 33.8517C138.255 34.991 140.126 36.6999 141.428 38.8156V18.0651L154.123 13.915ZM139.15 63.2279C140.777 61.1121 141.672 58.0199 141.672 54.0326C141.672 50.0452 140.859 47.0344 139.15 44.9187C137.441 42.8029 134.755 41.5823 131.989 41.6637C129.222 41.5009 126.537 42.7215 124.746 44.8373C123.038 46.953 122.142 49.9639 122.142 53.8698C122.142 57.8572 123.038 60.9494 124.746 63.1465C126.455 65.3436 129.222 66.5642 131.989 66.4828C135.081 66.4828 137.522 65.3436 139.15 63.2279Z' fill='%23262A38'/%3E %3Cpath d='M198.635 34.6655C201.564 36.5371 203.843 39.2225 205.226 42.3147C206.853 45.8952 207.667 49.8011 207.586 53.7885C207.667 57.7758 206.853 61.7632 205.226 65.3436C203.761 68.5172 201.483 71.2026 198.553 73.1556C195.705 75.0272 192.287 76.0037 188.87 75.9223C186.103 76.0037 183.336 75.3527 180.895 74.0507C178.617 72.9114 176.745 71.1212 175.524 68.9241V75.2713H162.993V18.0651L175.606 13.915V38.9783C176.826 36.7812 178.698 34.991 180.976 33.8517C183.418 32.5498 186.103 31.8988 188.87 31.9801C192.287 31.8988 195.705 32.8753 198.635 34.6655ZM192.45 63.1465C194.159 60.9494 194.973 57.8572 194.973 53.7885C194.973 49.8825 194.159 46.8716 192.45 44.7559C190.741 42.6402 188.381 41.5823 185.289 41.5823C182.523 41.4196 179.837 42.6402 178.047 44.8373C176.338 47.0344 175.524 50.0452 175.524 53.9512C175.524 57.9386 176.338 61.0308 178.047 63.1465C179.756 65.3436 182.441 66.5642 185.289 66.4015C188.056 66.5642 190.741 65.3436 192.45 63.1465Z' fill='%23262A38'/%3E %3Cpath d='M225 42.4774V58.915C225 61.2749 225.651 62.9838 226.791 64.0416C228.093 65.1809 229.801 65.7505 231.592 65.6691C232.975 65.6691 234.44 65.425 235.742 65.0995V74.8644C233.382 75.6782 230.941 76.085 228.499 76.0037C223.292 76.0037 219.304 74.5389 216.537 71.6094C213.771 68.68 212.387 64.5299 212.387 59.1592V23.1103L225 19.0416V33.038H235.742V42.4774H225Z' fill='%23262A38'/%3E %3Cpath d='M86.1754 3.74322C88.2911 5.77758 89.6745 8.46293 90 11.3924C90 12.613 89.6745 13.4268 88.9421 14.9729C88.2098 16.519 79.1772 32.1429 76.4919 36.4557C74.9458 38.9783 74.132 41.9892 74.132 44.9186C74.132 47.9295 74.9458 50.859 76.4919 53.3816C79.1772 57.6944 88.2098 73.3996 88.9421 74.9457C89.6745 76.4919 90 77.2242 90 78.4448C89.6745 81.3743 88.3725 84.0597 86.2568 86.0127C84.2224 88.1284 81.5371 89.5118 78.689 89.7559C77.4684 89.7559 76.6546 89.4304 75.1899 88.698C73.7251 87.9656 57.7758 79.1772 53.4629 76.4919C53.1374 76.3291 52.8119 76.085 52.4051 75.9222L31.085 63.3092C31.5732 67.3779 33.3635 71.2839 36.2929 74.132C36.8626 74.7016 37.4322 75.1899 38.0832 75.6781C37.5949 75.9222 37.0253 76.1664 36.5371 76.4919C32.2242 79.1772 16.519 88.2098 14.9729 88.9421C13.4268 89.6745 12.6944 90 11.3924 90C8.46293 89.6745 5.77758 88.3725 3.82459 86.2568C1.70886 84.2224 0.325497 81.5371 0 78.6076C0.0813743 77.387 0.406872 76.1664 1.05787 75.1085C1.79024 73.5624 10.8228 57.8571 13.5081 53.5443C15.0542 51.0217 15.868 48.0922 15.868 45.0814C15.868 42.0705 15.0542 39.141 13.5081 36.6184C10.8228 32.1429 1.70886 16.4376 1.05787 14.8915C0.406872 13.8336 0.0813743 12.613 0 11.3924C0.325497 8.46293 1.62749 5.77758 3.74322 3.74322C5.77758 1.62749 8.46293 0.325497 11.3924 0C12.613 0.0813743 13.8336 0.406872 14.9729 1.05787C16.2749 1.62749 27.7486 8.30018 33.8517 11.8807L35.2351 12.6944C35.7233 13.0199 36.1302 13.264 36.4557 13.4268L37.1067 13.8336L58.8336 26.6908C58.3454 21.8083 55.8228 17.3327 51.9168 14.3219C52.4051 14.0778 52.9747 13.8336 53.4629 13.5081C57.7758 10.8228 73.481 1.70886 75.0271 1.05787C76.085 0.406872 77.3056 0.0813743 78.6076 0C81.4557 0.325497 84.1411 1.62749 86.1754 3.74322ZM46.1392 50.7776L50.7776 46.1392C51.4286 45.4882 51.4286 44.5118 50.7776 43.8608L46.1392 39.2224C45.4882 38.5714 44.5118 38.5714 43.8608 39.2224L39.2224 43.8608C38.5714 44.5118 38.5714 45.4882 39.2224 46.1392L43.8608 50.7776C44.4304 51.3472 45.4882 51.3472 46.1392 50.7776Z' fill='%23FF694A'/%3E %3C/svg%3E\";\n  },\n  function(L, T, e) {\n    e.r(T);\n    var u = e(63), A = e.n(u);\n    e(462), e(463), e(464), e(465), e(467);\n    const w = e(9), E = (e(33), e(21));\n    window.Prism = A.a, w.module(\"dbt\").factory(\"code\", [\n      \"$sce\",\n      function(y) {\n        var x = {\n          copied: !1,\n          highlight: function(g, o = \"sql\") {\n            if (o == \"sql\")\n              var c = A.a.highlight(g, A.a.languages.sql, \"sql\");\n            else o == \"python\" && (c = A.a.highlight(g, A.a.languages.python, \"python\"));\n            return y.trustAsHtml(c);\n          },\n          copy_to_clipboard: function(g) {\n            var o = document.createElement(\"textarea\");\n            o.value = g, o.setAttribute(\"readonly\", \"\"), o.style.position = \"absolute\", o.style.left = \"-9999px\", document.body.appendChild(o), o.select(), document.execCommand(\"copy\"), document.body.removeChild(o);\n          },\n          generateSourceSQL: function(g) {\n            var o = [\"select\"], c = E.size(g.columns), a = E.keys(g.columns);\n            E.each(a, function(t, r) {\n              var l = \"    \" + t;\n              r + 1 != c && (l += \",\"), o.push(l);\n            });\n            const n = (g.database ? g.database + \".\" : \"\") + g.schema + \".\" + g.identifier;\n            return o.push(\"from \" + n), o.join(`\n`);\n          }\n        };\n        return x;\n      }\n    ]);\n  },\n  function(L, T) {\n    Prism.languages.sql = {\n      comment: {\n        pattern: /(^|[^\\\\])(?:\\/\\*[\\s\\S]*?\\*\\/|(?:--|\\/\\/|#).*)/,\n        lookbehind: !0\n      },\n      variable: [\n        { pattern: /@([\"'`])(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])+\\1/, greedy: !0 },\n        /@[\\w.$]+/\n      ],\n      string: {\n        pattern: /(^|[^@\\\\])(\"|')(?:\\\\[\\s\\S]|(?!\\2)[^\\\\]|\\2\\2)*\\2/,\n        greedy: !0,\n        lookbehind: !0\n      },\n      identifier: {\n        pattern: /(^|[^@\\\\])`(?:\\\\[\\s\\S]|[^`\\\\]|``)*`/,\n        greedy: !0,\n        lookbehind: !0,\n        inside: { punctuation: /^`|`$/ }\n      },\n      function: /\\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\\s*\\()/i,\n      keyword: /\\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\\b/i,\n      boolean: /\\b(?:FALSE|NULL|TRUE)\\b/i,\n      number: /\\b0x[\\da-f]+\\b|\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+\\b/i,\n      operator: /[-+*\\/=%^~]|&&?|\\|\\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\\b/i,\n      punctuation: /[;[\\]()`,.]/\n    };\n  },\n  function(L, T) {\n    Prism.languages.python = {\n      comment: { pattern: /(^|[^\\\\])#.*/, lookbehind: !0, greedy: !0 },\n      \"string-interpolation\": {\n        pattern: /(?:f|fr|rf)(?:(\"\"\"|''')[\\s\\S]*?\\1|(\"|')(?:\\\\.|(?!\\2)[^\\\\\\r\\n])*\\2)/i,\n        greedy: !0,\n        inside: {\n          interpolation: {\n            pattern: /((?:^|[^{])(?:\\{\\{)*)\\{(?!\\{)(?:[^{}]|\\{(?!\\{)(?:[^{}]|\\{(?!\\{)(?:[^{}])+\\})+\\})+\\}/,\n            lookbehind: !0,\n            inside: {\n              \"format-spec\": { pattern: /(:)[^:(){}]+(?=\\}$)/, lookbehind: !0 },\n              \"conversion-option\": {\n                pattern: /![sra](?=[:}]$)/,\n                alias: \"punctuation\"\n              },\n              rest: null\n            }\n          },\n          string: /[\\s\\S]+/\n        }\n      },\n      \"triple-quoted-string\": {\n        pattern: /(?:[rub]|br|rb)?(\"\"\"|''')[\\s\\S]*?\\1/i,\n        greedy: !0,\n        alias: \"string\"\n      },\n      string: {\n        pattern: /(?:[rub]|br|rb)?(\"|')(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1/i,\n        greedy: !0\n      },\n      function: {\n        pattern: /((?:^|\\s)def[ \\t]+)[a-zA-Z_]\\w*(?=\\s*\\()/g,\n        lookbehind: !0\n      },\n      \"class-name\": { pattern: /(\\bclass\\s+)\\w+/i, lookbehind: !0 },\n      decorator: {\n        pattern: /(^[\\t ]*)@\\w+(?:\\.\\w+)*/m,\n        lookbehind: !0,\n        alias: [\"annotation\", \"punctuation\"],\n        inside: { punctuation: /\\./ }\n      },\n      keyword: /\\b(?:_(?=\\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\\b/,\n      builtin: /\\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\\b/,\n      boolean: /\\b(?:False|None|True)\\b/,\n      number: /\\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\\b|(?:\\b\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\B\\.\\d+(?:_\\d+)*)(?:e[+-]?\\d+(?:_\\d+)*)?j?(?!\\w)/i,\n      operator: /[-+%=]=?|!=|:=|\\*\\*?=?|\\/\\/?=?|<[<=>]?|>[=>]?|[&|^~]/,\n      punctuation: /[{}[\\];(),.:]/\n    }, Prism.languages.python[\"string-interpolation\"].inside.interpolation.inside.rest = Prism.languages.python, Prism.languages.py = Prism.languages.python;\n  },\n  function(L, T) {\n    (function() {\n      if (typeof Prism < \"u\" && typeof document < \"u\") {\n        var e = /\\n(?!$)/g, u = Prism.plugins.lineNumbers = {\n          getLine: function(E, y) {\n            if (E.tagName === \"PRE\" && E.classList.contains(\"line-numbers\")) {\n              var x = E.querySelector(\".line-numbers-rows\");\n              if (x) {\n                var g = parseInt(E.getAttribute(\"data-start\"), 10) || 1, o = g + (x.children.length - 1);\n                y < g && (y = g), y > o && (y = o);\n                var c = y - g;\n                return x.children[c];\n              }\n            }\n          },\n          resize: function(E) {\n            w([E]);\n          },\n          assumeViewportIndependence: !0\n        }, A = void 0;\n        window.addEventListener(\"resize\", function() {\n          u.assumeViewportIndependence && A === window.innerWidth || (A = window.innerWidth, w(\n            Array.prototype.slice.call(\n              document.querySelectorAll(\"pre.line-numbers\")\n            )\n          ));\n        }), Prism.hooks.add(\"complete\", function(E) {\n          if (E.code) {\n            var y = E.element, x = y.parentNode;\n            if (x && /pre/i.test(x.nodeName) && !y.querySelector(\".line-numbers-rows\") && Prism.util.isActive(y, \"line-numbers\")) {\n              y.classList.remove(\"line-numbers\"), x.classList.add(\"line-numbers\");\n              var g, o = E.code.match(e), c = o ? o.length + 1 : 1, a = new Array(c + 1).join(\"<span></span>\");\n              (g = document.createElement(\"span\")).setAttribute(\n                \"aria-hidden\",\n                \"true\"\n              ), g.className = \"line-numbers-rows\", g.innerHTML = a, x.hasAttribute(\"data-start\") && (x.style.counterReset = \"linenumber \" + (parseInt(x.getAttribute(\"data-start\"), 10) - 1)), E.element.appendChild(g), w([x]), Prism.hooks.run(\"line-numbers\", E);\n            }\n          }\n        }), Prism.hooks.add(\"line-numbers\", function(E) {\n          E.plugins = E.plugins || {}, E.plugins.lineNumbers = !0;\n        });\n      }\n      function w(E) {\n        if ((E = E.filter(function(x) {\n          var g = function(o) {\n            return o ? window.getComputedStyle ? getComputedStyle(o) : o.currentStyle || null : null;\n          }(x)[\"white-space\"];\n          return g === \"pre-wrap\" || g === \"pre-line\";\n        })).length != 0) {\n          var y = E.map(function(x) {\n            var g = x.querySelector(\"code\"), o = x.querySelector(\".line-numbers-rows\");\n            if (g && o) {\n              var c = x.querySelector(\".line-numbers-sizer\"), a = g.textContent.split(e);\n              c || ((c = document.createElement(\"span\")).className = \"line-numbers-sizer\", g.appendChild(c)), c.innerHTML = \"0\", c.style.display = \"block\";\n              var n = c.getBoundingClientRect().height;\n              return c.innerHTML = \"\", {\n                element: x,\n                lines: a,\n                lineHeights: [],\n                oneLinerHeight: n,\n                sizer: c\n              };\n            }\n          }).filter(Boolean);\n          y.forEach(function(x) {\n            var g = x.sizer, o = x.lines, c = x.lineHeights, a = x.oneLinerHeight;\n            c[o.length - 1] = void 0, o.forEach(function(n, t) {\n              if (n && n.length > 1) {\n                var r = g.appendChild(document.createElement(\"span\"));\n                r.style.display = \"block\", r.textContent = n;\n              } else c[t] = a;\n            });\n          }), y.forEach(function(x) {\n            for (var g = x.sizer, o = x.lineHeights, c = 0, a = 0; a < o.length; a++)\n              o[a] === void 0 && (o[a] = g.children[c++].getBoundingClientRect().height);\n          }), y.forEach(function(x) {\n            var g = x.sizer, o = x.element.querySelector(\".line-numbers-rows\");\n            g.style.display = \"none\", g.innerHTML = \"\", x.lineHeights.forEach(function(c, a) {\n              o.children[a].style.height = c + \"px\";\n            });\n          });\n        }\n      }\n    })();\n  },\n  function(L, T, e) {\n    var u = e(466);\n    typeof u == \"string\" && (u = [[L.i, u, \"\"]]);\n    var A = { hmr: !0, transform: void 0, insertInto: void 0 };\n    e(40)(u, A), u.locals && (L.exports = u.locals);\n  },\n  function(L, T, e) {\n    (L.exports = e(39)(!1)).push([\n      L.i,\n      `pre[class*=\"language-\"].line-numbers {\n\tposition: relative;\n\tpadding-left: 3.8em;\n\tcounter-reset: linenumber;\n}\n\npre[class*=\"language-\"].line-numbers > code {\n\tposition: relative;\n\twhite-space: inherit;\n}\n\n.line-numbers .line-numbers-rows {\n\tposition: absolute;\n\tpointer-events: none;\n\ttop: 0;\n\tfont-size: 100%;\n\tleft: -3.8em;\n\twidth: 3em; /* works for line-numbers below 1000 lines */\n\tletter-spacing: -1px;\n\tborder-right: 1px solid #999;\n\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\n}\n\n\t.line-numbers-rows > span {\n\t\tdisplay: block;\n\t\tcounter-increment: linenumber;\n\t}\n\n\t\t.line-numbers-rows > span:before {\n\t\t\tcontent: counter(linenumber);\n\t\t\tcolor: #999;\n\t\t\tdisplay: block;\n\t\t\tpadding-right: 0.8em;\n\t\t\ttext-align: right;\n\t\t}\n`,\n      \"\"\n    ]);\n  },\n  function(L, T, e) {\n    var u = e(468);\n    typeof u == \"string\" && (u = [[L.i, u, \"\"]]);\n    var A = { hmr: !0, transform: void 0, insertInto: void 0 };\n    e(40)(u, A), u.locals && (L.exports = u.locals);\n  },\n  function(L, T, e) {\n    (L.exports = e(39)(!1)).push([\n      L.i,\n      `/**\n * GHColors theme by Avi Aryan (http://aviaryan.in)\n * Inspired by Github syntax coloring\n */\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: #393A34;\n\tfont-family: \"Consolas\", \"Bitstream Vera Sans Mono\", \"Courier New\", Courier, monospace;\n\tdirection: ltr;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tfont-size: .9em;\n\tline-height: 1.2em;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n}\n\npre > code[class*=\"language-\"] {\n\tfont-size: 1em;\n}\n\npre[class*=\"language-\"]::-moz-selection, pre[class*=\"language-\"] ::-moz-selection,\ncode[class*=\"language-\"]::-moz-selection, code[class*=\"language-\"] ::-moz-selection {\n\tbackground: #b3d4fc;\n}\n\npre[class*=\"language-\"]::selection, pre[class*=\"language-\"] ::selection,\ncode[class*=\"language-\"]::selection, code[class*=\"language-\"] ::selection {\n\tbackground: #b3d4fc;\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tpadding: 1em;\n\tmargin: .5em 0;\n\toverflow: auto;\n\tborder: 1px solid #dddddd;\n\tbackground-color: white;\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tpadding: .2em;\n\tpadding-top: 1px;\n\tpadding-bottom: 1px;\n\tbackground: #f8f8f8;\n\tborder: 1px solid #dddddd;\n}\n\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: #999988;\n\tfont-style: italic;\n}\n\n.token.namespace {\n\topacity: .7;\n}\n\n.token.string,\n.token.attr-value {\n\tcolor: #e3116c;\n}\n\n.token.punctuation,\n.token.operator {\n\tcolor: #393A34; /* no highlight */\n}\n\n.token.entity,\n.token.url,\n.token.symbol,\n.token.number,\n.token.boolean,\n.token.variable,\n.token.constant,\n.token.property,\n.token.regex,\n.token.inserted {\n\tcolor: #36acaa;\n}\n\n.token.atrule,\n.token.keyword,\n.token.attr-name,\n.language-autohotkey .token.selector {\n\tcolor: #00a4db;\n}\n\n.token.function,\n.token.deleted,\n.language-autohotkey .token.tag {\n\tcolor: #9a050f;\n}\n\n.token.tag,\n.token.selector,\n.language-autohotkey .token.keyword {\n\tcolor: #00009f;\n}\n\n.token.important,\n.token.function,\n.token.bold {\n\tfont-weight: bold;\n}\n\n.token.italic {\n\tfont-style: italic;\n}\n`,\n      \"\"\n    ]);\n  },\n  function(L, T, e) {\n    e(33);\n    const u = e(21), A = e(148), w = e(203), E = e(470);\n    angular.module(\"dbt\").factory(\"graph\", [\n      \"$state\",\n      \"$window\",\n      \"$q\",\n      \"selectorService\",\n      \"project\",\n      \"locationService\",\n      function(y, x, g, o, c, a) {\n        var n = {\n          vertical: {\n            userPanningEnabled: !1,\n            boxSelectionEnabled: !1,\n            maxZoom: 1.5\n          },\n          horizontal: {\n            userPanningEnabled: !0,\n            boxSelectionEnabled: !1,\n            maxZoom: 1,\n            minZoom: 0.05\n          }\n        }, t = {\n          none: { name: \"null\" },\n          left_right: {\n            name: \"dagre\",\n            rankDir: \"LR\",\n            rankSep: 200,\n            edgeSep: 30,\n            nodeSep: 50\n          },\n          top_down: {\n            name: \"preset\",\n            positions: function(i) {\n              var d = y.params.unique_id;\n              if (!d) return { x: 0, y: 0 };\n              var p = r.graph.pristine.dag, f = u.sortBy(w.ancestorNodes(p, d, 1)), v = u.sortBy(w.descendentNodes(p, d, 1)), k = u.partial(u.includes, f), s = u.partial(u.includes, v), S = p.filterNodes(k), j = p.filterNodes(s);\n              return function(I, R, M, z) {\n                var V, G = 100 / (1 + Math.max(R.length, M.length));\n                if (I == z) return { x: 0, y: 0 };\n                if (u.includes(R, z))\n                  V = {\n                    set: R,\n                    index: u.indexOf(R, z),\n                    factor: -1,\n                    type: \"parent\"\n                  };\n                else {\n                  if (!u.includes(M, z)) return { x: 0, y: 0 };\n                  V = {\n                    set: M,\n                    index: u.indexOf(M, z),\n                    factor: 1,\n                    type: \"child\"\n                  };\n                }\n                var Y = V.set.length;\n                if (V.type == \"parent\")\n                  var tt = {\n                    x: (0 + V.index) * G,\n                    y: -200 - 100 * (Y - V.index - 1)\n                  };\n                else\n                  tt = {\n                    x: (0 + V.index) * G,\n                    y: 200 + 100 * (Y - V.index - 1)\n                  };\n                return tt;\n              }(\n                d,\n                A.alg.topsort(S),\n                A.alg.topsort(j).reverse(),\n                i.data(\"id\")\n              );\n            }\n          }\n        }, r = {\n          loading: !0,\n          loaded: g.defer(),\n          graph_element: null,\n          orientation: \"sidebar\",\n          expanded: !1,\n          graph: {\n            options: n.vertical,\n            pristine: { nodes: {}, edges: {}, dag: null },\n            elements: [],\n            layout: t.none,\n            style: [\n              {\n                selector: \"edge.vertical\",\n                style: {\n                  \"curve-style\": \"unbundled-bezier\",\n                  \"target-arrow-shape\": \"triangle-backcurve\",\n                  \"target-arrow-color\": \"#027599\",\n                  \"arrow-scale\": 1.5,\n                  \"line-color\": \"#027599\",\n                  width: 3,\n                  \"target-distance-from-node\": \"5px\",\n                  \"source-endpoint\": \"0% 50%\",\n                  \"target-endpoint\": \"0deg\"\n                }\n              },\n              {\n                selector: \"edge.horizontal\",\n                style: {\n                  \"curve-style\": \"unbundled-bezier\",\n                  \"target-arrow-shape\": \"triangle-backcurve\",\n                  \"target-arrow-color\": \"#006f8a\",\n                  \"arrow-scale\": 1.5,\n                  \"target-distance-from-node\": \"10px\",\n                  \"source-distance-from-node\": \"5px\",\n                  \"line-color\": \"#006f8a\",\n                  width: 3,\n                  \"source-endpoint\": \"50% 0%\",\n                  \"target-endpoint\": \"270deg\"\n                }\n              },\n              {\n                selector: \"edge[selected=1]\",\n                style: {\n                  \"line-color\": \"#bd6bb6\",\n                  \"target-arrow-color\": \"#bd6bb6\",\n                  \"z-index\": 1\n                }\n              },\n              {\n                selector: 'node[display=\"none\"]',\n                style: { display: \"none\" }\n              },\n              {\n                selector: \"node.vertical\",\n                style: {\n                  \"text-margin-x\": \"5px\",\n                  \"background-color\": \"#0094b3\",\n                  \"border-color\": \"#0094b3\",\n                  \"font-size\": \"16px\",\n                  shape: \"ellipse\",\n                  color: \"#fff\",\n                  width: \"5px\",\n                  height: \"5px\",\n                  padding: \"5px\",\n                  content: \"data(label)\",\n                  \"font-weight\": 300,\n                  \"text-valign\": \"center\",\n                  \"text-halign\": \"right\"\n                }\n              },\n              {\n                selector: \"node.horizontal\",\n                style: {\n                  \"background-color\": \"#0094b3\",\n                  \"border-color\": \"#0094b3\",\n                  \"font-size\": \"24px\",\n                  shape: \"roundrectangle\",\n                  color: \"#fff\",\n                  width: \"label\",\n                  height: \"label\",\n                  padding: \"12px\",\n                  content: \"data(label)\",\n                  \"font-weight\": 300,\n                  \"font-family\": '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif',\n                  \"text-valign\": \"center\",\n                  \"text-halign\": \"center\",\n                  ghost: \"yes\",\n                  \"ghost-offset-x\": \"2px\",\n                  \"ghost-offset-y\": \"4px\",\n                  \"ghost-opacity\": 0.5,\n                  \"text-outline-color\": \"#000\",\n                  \"text-outline-width\": \"1px\",\n                  \"text-outline-opacity\": 0.2\n                }\n              },\n              {\n                selector: 'node[resource_type=\"source\"]',\n                style: {\n                  \"background-color\": \"#5fb825\",\n                  \"border-color\": \"#5fb825\"\n                }\n              },\n              {\n                selector: 'node[resource_type=\"exposure\"]',\n                style: {\n                  \"background-color\": \"#ff694b\",\n                  \"border-color\": \"#ff694b\"\n                }\n              },\n              {\n                selector: 'node[resource_type=\"metric\"]',\n                style: {\n                  \"background-color\": \"#ff5688\",\n                  \"border-color\": \"#ff5688\"\n                }\n              },\n              {\n                selector: 'node[resource_type=\"semantic_model\"]',\n                style: {\n                  \"background-color\": \"#ffa8c2\",\n                  \"border-color\": \"#ffa8c2\"\n                }\n              },\n              {\n                selector: 'node[language=\"python\"]',\n                style: {\n                  \"background-color\": \"#6a5acd\",\n                  \"border-color\": \"#6a5acd\"\n                }\n              },\n              {\n                selector: \"node[node_color]\",\n                style: {\n                  \"background-color\": \"data(node_color)\",\n                  \"border-color\": \"data(node_color)\"\n                }\n              },\n              {\n                selector: \"node[selected=1]\",\n                style: {\n                  \"background-color\": \"#bd6bb6\",\n                  \"border-color\": \"#bd6bb6\"\n                }\n              },\n              {\n                selector: \"node.horizontal[selected=1]\",\n                style: {\n                  \"background-color\": \"#88447d\",\n                  \"border-color\": \"#88447d\"\n                }\n              },\n              {\n                selector: \"node.horizontal.dirty\",\n                style: {\n                  \"background-color\": \"#919599\",\n                  \"border-color\": \"#919599\"\n                }\n              },\n              {\n                selector: \"node[hidden=1]\",\n                style: {\n                  \"background-color\": \"#919599\",\n                  \"border-color\": \"#919599\",\n                  \"background-opacity\": 0.5\n                }\n              },\n              {\n                selector: 'node[access=\"private\"]',\n                style: {\n                  \"background-opacity\": 0.2,\n                  \"border-width\": 2,\n                  ghost: \"no\"\n                }\n              }\n            ],\n            ready: function(i) {\n              console.log(\"graph ready\");\n            }\n          }\n        };\n        function l(i, d, p) {\n          var f = u.map(i, function(s) {\n            return r.graph.pristine.nodes[s];\n          }), v = [];\n          u.flatten(\n            u.each(i, function(s) {\n              var S = r.graph.pristine.edges[s];\n              u.each(S, function(j) {\n                u.includes(i, j.data.target) && u.includes(i, j.data.source) && v.push(j);\n              });\n            })\n          );\n          var k = u.compact(f).concat(u.compact(v));\n          return u.each(r.graph.elements, function(s) {\n            s.data.display = \"none\", s.data.selected = 0, s.data.hidden = 0, s.classes = p;\n          }), u.each(k, function(s) {\n            s.data.display = \"element\", s.classes = p, d && u.includes(d, s.data.unique_id) && (s.data.selected = 1), u.get(s, [\"data\", \"docs\", \"show\"], !0) || (s.data.hidden = 1);\n            var S = u.get(s, [\"data\", \"docs\", \"node_color\"]);\n            S && E.isValidColor(S) && (s.data.node_color = S);\n          }), r.graph.elements = u.filter(k, function(s) {\n            return s.data.display == \"element\";\n          }), i;\n        }\n        function h(i, d, p) {\n          var f = r.graph.pristine.dag;\n          if (f) {\n            var v = r.graph.pristine.nodes, k = o.selectNodes(f, v, i), s = p ? k.matched : [];\n            return l(k.selected, s, d);\n          }\n        }\n        return r.setGraphReady = function(i) {\n          r.loading = !1, r.loaded.resolve(), r.graph_element = i;\n        }, r.ready = function(i) {\n          r.loaded.promise.then(function() {\n            i(r);\n          });\n        }, r.manifest = {}, r.packages = [], r.selected_node = null, r.getCanvasHeight = function() {\n          return 0.8 * x.innerHeight + \"px\";\n        }, c.ready(function(i) {\n          r.manifest = i, r.packages = u.uniq(u.map(r.manifest.nodes, \"package_name\")), u.each(\n            u.filter(r.manifest.nodes, function(p) {\n              var f = u.includes(\n                [\n                  \"model\",\n                  \"seed\",\n                  \"source\",\n                  \"snapshot\",\n                  \"analysis\",\n                  \"exposure\",\n                  \"metric\",\n                  \"semantic_model\",\n                  \"operation\"\n                ],\n                p.resource_type\n              ), v = p.resource_type == \"test\" && !p.hasOwnProperty(\"test_metadata\");\n              return f || v;\n            }),\n            function(p) {\n              var f = {\n                group: \"nodes\",\n                data: u.assign(p, {\n                  parent: p.package_name,\n                  id: p.unique_id,\n                  is_group: \"false\"\n                })\n              };\n              r.graph.pristine.nodes[p.unique_id] = f;\n            }\n          ), u.each(r.manifest.parent_map, function(p, f) {\n            u.each(p, function(v) {\n              var k = r.manifest.nodes[v], s = r.manifest.nodes[f];\n              if (u.includes(\n                [\n                  \"model\",\n                  \"source\",\n                  \"seed\",\n                  \"snapshot\",\n                  \"metric\",\n                  \"semantic_model\"\n                ],\n                k.resource_type\n              ) && (s.resource_type != \"test\" || !s.hasOwnProperty(\"test_metadata\"))) {\n                var S = k.unique_id + \"|\" + s.unique_id, j = {\n                  group: \"edges\",\n                  data: {\n                    source: k.unique_id,\n                    target: s.unique_id,\n                    unique_id: S\n                  }\n                }, I = s.unique_id;\n                r.graph.pristine.edges[I] || (r.graph.pristine.edges[I] = []), r.graph.pristine.edges[I].push(j);\n              }\n            });\n          });\n          var d = new A.Graph({ directed: !0 });\n          u.each(r.graph.pristine.nodes, function(p) {\n            d.setNode(p.data.unique_id, p.data.name);\n          }), u.each(r.graph.pristine.edges, function(p) {\n            u.each(p, function(f) {\n              d.setEdge(f.data.source, f.data.target);\n            });\n          }), r.graph.pristine.dag = d, r.graph.elements = u.flatten(\n            u.values(r.graph.pristine.nodes).concat(u.values(r.graph.pristine.edges))\n          ), l(d.nodes());\n        }), r.hideGraph = function() {\n          r.orientation = \"sidebar\", r.expanded = !1;\n        }, r.showVerticalGraph = function(i, d) {\n          r.orientation = \"sidebar\", d && (r.expanded = !0);\n          var p = h(\n            u.assign({}, o.options, {\n              include: \"+\" + i + \"+\",\n              exclude: \"\",\n              hops: 1\n            }),\n            \"vertical\",\n            !0\n          );\n          return r.graph.layout = t.top_down, r.graph.options = n.vertical, p;\n        }, r.showFullGraph = function(i) {\n          r.orientation = \"fullscreen\", r.expanded = !0;\n          var d = u.assign({}, o.options);\n          i ? (d.include = \"+\" + i + \"+\", d.exclude = \"\") : (d.include = \"\", d.exclude = \"\");\n          var p = h(d, \"horizontal\", !0);\n          return r.graph.layout = t.left_right, r.graph.options = n.horizontal, a.setState(d), p;\n        }, r.updateGraph = function(i) {\n          r.orientation = \"fullscreen\", r.expanded = !0;\n          var d = h(i, \"horizontal\", !1);\n          return r.graph.layout = t.left_right, r.graph.options = n.horizontal, a.setState(i), d;\n        }, r.deselectNodes = function() {\n          r.orientation == \"fullscreen\" && r.graph_element.elements().data(\"selected\", 0);\n        }, r.selectNode = function(i) {\n          if (r.orientation == \"fullscreen\") {\n            r.graph.pristine.nodes[i];\n            var d = r.graph.pristine.dag, p = u.indexBy(w.ancestorNodes(d, i)), f = u.indexBy(w.descendentNodes(d, i));\n            p[i] = i, f[i] = i;\n            var v = r.graph_element;\n            u.each(r.graph.elements, function(k) {\n              var s = v.$id(k.data.id);\n              p[k.data.source] && p[k.data.target] || f[k.data.source] && f[k.data.target] || k.data.unique_id == i ? s.data(\"selected\", 1) : s.data(\"selected\", 0);\n            });\n          }\n        }, r.markDirty = function(i) {\n          r.markAllClean(), u.each(i, function(d) {\n            r.graph_element.$id(d).addClass(\"dirty\");\n          });\n        }, r.markAllClean = function() {\n          r.graph_element && r.graph_element.elements().removeClass(\"dirty\");\n        }, r;\n      }\n    ]);\n  },\n  function(L, T, e) {\n    e.r(T), e.d(T, \"isValidColor\", function() {\n      return A;\n    });\n    const u = /* @__PURE__ */ new Set([\n      \"aliceblue\",\n      \"antiquewhite\",\n      \"aqua\",\n      \"aquamarine\",\n      \"azure\",\n      \"beige\",\n      \"bisque\",\n      \"black\",\n      \"blanchedalmond\",\n      \"blue\",\n      \"blueviolet\",\n      \"brown\",\n      \"burlywood\",\n      \"cadetblue\",\n      \"chartreuse\",\n      \"chocolate\",\n      \"coral\",\n      \"cornflowerblue\",\n      \"cornsilk\",\n      \"crimson\",\n      \"cyan\",\n      \"darkblue\",\n      \"darkcyan\",\n      \"darkgoldenrod\",\n      \"darkgray\",\n      \"darkgreen\",\n      \"darkkhaki\",\n      \"darkmagenta\",\n      \"darkolivegreen\",\n      \"darkorange\",\n      \"darkorchid\",\n      \"darkred\",\n      \"darksalmon\",\n      \"darkseagreen\",\n      \"darkslateblue\",\n      \"darkslategray\",\n      \"darkturquoise\",\n      \"darkviolet\",\n      \"deeppink\",\n      \"deepskyblue\",\n      \"dimgray\",\n      \"dodgerblue\",\n      \"firebrick\",\n      \"floralwhite\",\n      \"forestgreen\",\n      \"fuchsia\",\n      \"ghostwhite\",\n      \"gold\",\n      \"goldenrod\",\n      \"gray\",\n      \"green\",\n      \"greenyellow\",\n      \"honeydew\",\n      \"hotpink\",\n      \"indianred\",\n      \"indigo\",\n      \"ivory\",\n      \"khaki\",\n      \"lavender\",\n      \"lavenderblush\",\n      \"lawngreen\",\n      \"lemonchiffon\",\n      \"lightblue\",\n      \"lightcoral\",\n      \"lightcyan\",\n      \"lightgoldenrodyellow\",\n      \"lightgray\",\n      \"lightgreen\",\n      \"lightpink\",\n      \"lightsalmon\",\n      \"lightsalmon\",\n      \"lightseagreen\",\n      \"lightskyblue\",\n      \"lightslategray\",\n      \"lightsteelblue\",\n      \"lightyellow\",\n      \"lime\",\n      \"limegreen\",\n      \"linen\",\n      \"magenta\",\n      \"maroon\",\n      \"mediumaquamarine\",\n      \"mediumblue\",\n      \"mediumorchid\",\n      \"mediumpurple\",\n      \"mediumseagreen\",\n      \"mediumslateblue\",\n      \"mediumslateblue\",\n      \"mediumspringgreen\",\n      \"mediumturquoise\",\n      \"mediumvioletred\",\n      \"midnightblue\",\n      \"mintcream\",\n      \"mistyrose\",\n      \"moccasin\",\n      \"navajowhite\",\n      \"navy\",\n      \"oldlace\",\n      \"olive\",\n      \"olivedrab\",\n      \"orange\",\n      \"orangered\",\n      \"orchid\",\n      \"palegoldenrod\",\n      \"palegreen\",\n      \"paleturquoise\",\n      \"palevioletred\",\n      \"papayawhip\",\n      \"peachpuff\",\n      \"peru\",\n      \"pink\",\n      \"plum\",\n      \"powderblue\",\n      \"purple\",\n      \"rebeccapurple\",\n      \"red\",\n      \"rosybrown\",\n      \"royalblue\",\n      \"saddlebrown\",\n      \"salmon\",\n      \"sandybrown\",\n      \"seagreen\",\n      \"seashell\",\n      \"sienna\",\n      \"silver\",\n      \"skyblue\",\n      \"slateblue\",\n      \"slategray\",\n      \"snow\",\n      \"springgreen\",\n      \"steelblue\",\n      \"tan\",\n      \"teal\",\n      \"thistle\",\n      \"tomato\",\n      \"turquoise\",\n      \"violet\",\n      \"wheat\",\n      \"white\",\n      \"whitesmoke\",\n      \"yellow\",\n      \"yellowgreen\"\n    ]);\n    function A(w) {\n      if (!w) return !1;\n      const E = w.trim().toLowerCase();\n      if (E === \"\") return !1;\n      const y = E.match(/^#([A-Fa-f0-9]{3}){1,2}$/), x = u.has(E);\n      return !!y || x;\n    }\n  },\n  function(L, T, e) {\n    e(33);\n    const u = e(21), A = e(472);\n    angular.module(\"dbt\").factory(\"selectorService\", [\n      \"$state\",\n      function(w) {\n        var E = {\n          include: \"\",\n          exclude: \"\",\n          packages: [],\n          tags: [null],\n          resource_types: [\n            \"model\",\n            \"seed\",\n            \"snapshot\",\n            \"source\",\n            \"test\",\n            \"analysis\",\n            \"exposure\",\n            \"metric\",\n            \"semantic_model\"\n          ],\n          depth: 1\n        }, y = {\n          view_node: null,\n          selection: { clean: u.clone(E), dirty: u.clone(E) },\n          options: {\n            packages: [],\n            tags: [null],\n            resource_types: [\n              \"model\",\n              \"seed\",\n              \"snapshot\",\n              \"source\",\n              \"test\",\n              \"analysis\",\n              \"exposure\",\n              \"metric\",\n              \"semantic_model\"\n            ]\n          },\n          init: function(x) {\n            u.each(x, function(g, o) {\n              y.options[o] = g, E[o] = g, y.selection.clean[o] = g, y.selection.dirty[o] = g;\n            });\n          },\n          resetSelection: function(x) {\n            var g = {\n              include: x && u.includes([\"model\", \"seed\", \"snapshot\"], x.resource_type) ? \"+\" + x.name + \"+\" : x && x.resource_type == \"source\" ? \"+source:\" + x.source_name + \".\" + x.name + \"+\" : x && x.resource_type == \"exposure\" ? \"+exposure:\" + x.name : x && x.resource_type == \"metric\" ? \"+metric:\" + x.name : x && x.resource_type == \"semantic_model\" ? \"+semantic_model:\" + x.name : x && u.includes([\"analysis\", \"test\"], x.resource_type) ? \"+\" + x.name : \"\"\n            }, o = u.assign({}, E, g);\n            y.selection.clean = u.clone(o), y.selection.dirty = u.clone(o), y.view_node = x;\n          },\n          getViewNode: function() {\n            return y.view_node;\n          },\n          excludeNode: function(x, g) {\n            var o, c = y.selection.dirty.exclude, a = g.parents ? \"+\" : \"\", n = g.children ? \"+\" : \"\", t = c.length > 0 ? \" \" : \"\";\n            x.resource_type == \"source\" ? (a += \"source:\", o = x.source_name + \".\" + x.name) : ([\"exposure\", \"metric\", \"semantic_model\"].indexOf(\n              x.resource_type\n            ) > -1 && (a += x.resource_type + \":\"), o = x.name);\n            var r = c + t + a + o + n;\n            return y.selection.dirty.exclude = r, y.updateSelection();\n          },\n          selectSource: function(x, g) {\n            var o = \"source:\" + x + (g.children ? \"+\" : \"\");\n            return y.selection.dirty.include = o, y.updateSelection();\n          },\n          clearViewNode: function() {\n            y.view_node = null;\n          },\n          isDirty: function() {\n            return !u.isEqual(y.selection.clean, y.selection.dirty);\n          },\n          updateSelection: function() {\n            return y.selection.clean = u.clone(y.selection.dirty), y.selection.clean;\n          },\n          selectNodes: function(x, g, o) {\n            return A.selectNodes(x, g, o);\n          }\n        };\n        return y;\n      }\n    ]);\n  },\n  function(L, T, e) {\n    const u = e(21), A = e(473);\n    function w(g, o) {\n      return o || (o = \" \"), u.filter(u.uniq(g.split(o)), function(c) {\n        return c.length > 0;\n      });\n    }\n    function E(g) {\n      var o = {\n        raw: g,\n        select_at: !1,\n        select_children: !1,\n        children_depth: null,\n        select_parents: !1,\n        parents_depth: null\n      };\n      const c = new RegExp(\n        \"\" + /^/.source + /(?<childs_parents>(\\@))?/.source + /(?<parents>((?<parents_depth>(\\d*))\\+))?/.source + /((?<method>([\\w.]+)):)?/.source + /(?<value>(.*?))/.source + /(?<children>(\\+(?<children_depth>(\\d*))))?/.source + /$/.source\n      ).exec(g).groups;\n      o.select_at = c.childs_parents == \"@\", o.select_parents = !!c.parents, o.select_children = !!c.children, c.parents_depth && (o.parents_depth = parseInt(c.parents_depth)), c.children_depth && (o.children_depth = parseInt(c.children_depth));\n      var a = c.method, n = c.value;\n      return a ? a.indexOf(\".\") != -1 && ([a, selector_modifier] = a.split(\".\", 2), n = { config: selector_modifier, value: n }) : a = \"implicit\", o.selector_type = a, o.selector_value = n, o;\n    }\n    function y(g) {\n      var o = w(g, \" \");\n      return u.map(o, function(c) {\n        var a = w(c, \",\");\n        return a.length > 1 ? { method: \"intersect\", selectors: u.map(a, E) } : { method: \"none\", selectors: u.map([c], E) };\n      });\n    }\n    function x(g, o) {\n      var c = y(g), a = null, n = null;\n      return u.each(c, function(t) {\n        var r = t.method == \"intersect\" ? u.intersection : u.union;\n        u.each(t.selectors, function(l) {\n          var h = o(l);\n          a === null ? (a = h.matched, n = h.selected) : (a = r(a, h.matched), n = r(n, h.selected));\n        });\n      }), { matched: a || [], selected: n || [] };\n    }\n    L.exports = {\n      splitSpecs: w,\n      parseSpec: E,\n      parseSpecs: y,\n      buildSpec: function(g, o, c) {\n        return { include: y(g), exclude: y(o), hops: c };\n      },\n      applySpec: x,\n      selectNodes: function(g, o, c) {\n        c.include, c.exclude;\n        var a, n = u.partial(A.getNodesFromSpec, g, o, c.hops);\n        u.values(o), a = c.include.trim().length == 0 ? { selected: g.nodes(), matched: [] } : x(c.include, n);\n        var t = x(c.exclude, n), r = a.selected, l = a.matched;\n        r = u.difference(r, t.selected), l = u.difference(l, t.matched);\n        var h = [];\n        return u.each(r, function(i) {\n          var d = o[i];\n          d.data.tags || (d.data.tags = []);\n          var p = u.includes(c.packages, d.data.package_name), f = u.intersection(c.tags, d.data.tags).length > 0, v = u.includes(c.tags, null) && d.data.tags.length == 0, k = u.includes(c.resource_types, d.data.resource_type);\n          p && (f || v) && k || h.push(d.data.unique_id);\n        }), { selected: u.difference(r, h), matched: u.difference(l, h) };\n      }\n    };\n  },\n  function(L, T, e) {\n    const u = e(21), A = e(203);\n    var w = \"fqn\", E = \"tag\", y = \"source\", x = \"exposure\", g = \"metric\", o = \"semantic_model\", c = \"group\", a = \"path\", n = \"file\", t = \"package\", r = \"config\", l = \"test_name\", h = \"test_type\", i = {};\n    function d(M, z, V) {\n      var G = M.slice(-1)[0], Y = M.slice(-2, -1)[0];\n      if (z === G || (version_options = [Y, Y + \"_\" + G, Y + \".\" + G], V && version_options.includes(z)))\n        return !0;\n      var tt = M.reduce((ht, ct) => ht.concat(ct.split(\".\")), []), Z = z.split(\".\");\n      if (tt.length < Z.length) return !1;\n      for (var at = 0; at < Z.length; at++) {\n        var nt = Z[at];\n        if (nt == \"*\") return !0;\n        if (tt[at] != nt) return !1;\n      }\n      return !0;\n    }\n    function p(M, z) {\n      var V = [];\n      return u.each(M, function(G) {\n        var Y = G.data, tt = Y.fqn, Z = Y.version !== null;\n        if (tt && Y.resource_type != \"source\" && Y.resource_type != \"exposure\" && Y.resource_type != \"metric\" && Y.resource_type != \"semantic_model\") {\n          var at = u.rest(tt);\n          (d(tt, z, Z) || d(at, z, Z)) && V.push(Y);\n        }\n      }), u.uniq(V);\n    }\n    function f(M, z) {\n      var V = [], G = z.split(\"/\");\n      return u.each(M, function(Y) {\n        var tt = (Y.data.original_file_path || \"\").split(\"/\"), Z = !0;\n        u.each(G, function(at, nt) {\n          at == \"*\" || at == \"\" || at != tt[nt] && (Z = !1);\n        }), Z && V.push(Y.data);\n      }), V;\n    }\n    function v(M, z) {\n      var V = [];\n      return u.each(M, function(G) {\n        var Y = G.data.original_file_path.split(\"/\");\n        u.last(Y) == z && V.push(G.data);\n      }), V;\n    }\n    function k(M, z) {\n      var V = [];\n      return u.each(M, function(G) {\n        var Y = G.data.tags;\n        u.includes(Y, z) && V.push(G.data);\n      }), V;\n    }\n    function s(M, z) {\n      var V = [];\n      return u.each(M, function(G) {\n        G.data.package_name == z && V.push(G.data);\n      }), V;\n    }\n    function S(M, z) {\n      var V = [];\n      return u.each(M, function(G) {\n        var Y = G.data;\n        Y.config && Y.config[z.config] == z.value && V.push(Y);\n      }), V;\n    }\n    function j(M, z) {\n      var V = [];\n      return u.each(M, function(G) {\n        var Y = G.data;\n        Y.test_metadata && Y.test_metadata.name == z && V.push(Y);\n      }), V;\n    }\n    function I(M, z) {\n      var V = [];\n      return u.each(M, function(G) {\n        var Y = G.data;\n        if (Y.resource_type != \"test\") return !1;\n        (Y.hasOwnProperty(\"test_metadata\") && [\"schema\", \"generic\"].indexOf(z) > -1 || !Y.hasOwnProperty(\"test_metadata\") && [\"data\", \"singular\"].indexOf(z) > -1) && V.push(Y);\n      }), V;\n    }\n    function R(M, z) {\n      var V = [];\n      return u.each(M, function(G) {\n        var Y = G.data;\n        if (Y.resource_type == \"source\") {\n          var tt, Z, at = Y.source_name, nt = Y.name;\n          z.indexOf(\".\") != -1 ? [tt, Z] = z.split(\".\", 2) : (tt = z, Z = null), (tt == \"*\" || tt == at && Z === \"*\" || tt == at && Z === nt || tt == at && Z === null) && V.push(G.data);\n        }\n      }), V;\n    }\n    i.implicit = function(M, z) {\n      var V = p(M, z), G = f(M, z), Y = [];\n      z.toLowerCase().endsWith(\".sql\") && (Y = v(M, z));\n      var tt = u.uniq(\n        [].concat(\n          u.map(V, \"unique_id\"),\n          u.map(G, \"unique_id\"),\n          u.map(Y, \"unique_id\")\n        )\n      );\n      return u.map(tt, (Z) => M[Z].data);\n    }, i[w] = p, i[E] = k, i[y] = R, i[x] = function(M, z) {\n      var V = [];\n      return u.each(M, function(G) {\n        var Y = G.data;\n        if (Y.resource_type == \"exposure\") {\n          var tt = Y.name;\n          (z == \"*\" || z == tt) && V.push(G.data);\n        }\n      }), V;\n    }, i[g] = function(M, z) {\n      var V = [];\n      return u.each(M, function(G) {\n        var Y = G.data;\n        if (Y.resource_type == \"metric\") {\n          var tt = Y.name;\n          (z == \"*\" || z == tt) && V.push(G.data);\n        }\n      }), V;\n    }, i[o] = function(M, z) {\n      var V = [];\n      return u.each(M, function(G) {\n        var Y = G.data;\n        if (Y.resource_type == \"semantic_model\") {\n          var tt = Y.name;\n          (z == \"*\" || z == tt) && V.push(G.data);\n        }\n      }), V;\n    }, i[c] = function(M, z) {\n      var V = [];\n      return u.each(M, function(G) {\n        var Y = G.data;\n        Y.group == z && V.push(Y);\n      }), V;\n    }, i[a] = f, i[n] = v, i[t] = s, i[r] = S, i[l] = j, i[h] = I, L.exports = {\n      isFQNMatch: d,\n      getNodesByFQN: p,\n      getNodesByTag: k,\n      getNodesBySource: R,\n      getNodesByPath: f,\n      getNodesByPackage: s,\n      getNodesByConfig: S,\n      getNodesByTestName: j,\n      getNodesByTestType: I,\n      getNodesFromSpec: function(M, z, V, G) {\n        const Y = i[G.selector_type];\n        if (!Y) return { selected: [], matched: [] };\n        var tt = Y(z, G.selector_value), Z = [], at = [];\n        return u.each(tt, function(nt) {\n          var ht = nt.unique_id;\n          at.push(nt.unique_id);\n          var ct = [], ot = [], gt = [];\n          if (G.select_at && (gt = u.union(A.selectAt(M, ht))), G.select_parents) {\n            var xt = V || G.parents_depth;\n            ct = A.ancestorNodes(M, ht, xt);\n          }\n          G.select_children && (xt = V || G.children_depth, ot = A.descendentNodes(M, ht, xt)), Z = u.union([ht], Z, ot, ct, gt);\n        }), { selected: Z, matched: at };\n      }\n    };\n  },\n  function(L, T, e) {\n    const u = e(9);\n    e(475), u.module(\"dbt\").factory(\"trackingService\", [\n      \"$location\",\n      \"selectorService\",\n      \"$rootScope\",\n      function(A, w, E) {\n        var y = {\n          initialized: !1,\n          snowplow: null,\n          project_id: null,\n          init: function(x) {\n            y.initialized || (y.initialized = !0, y.project_id = x.project_id, x.track === !0 && y.turn_on_tracking());\n          },\n          isHosted: function() {\n            return window.location.hostname.indexOf(\".getdbt.com\") > -1;\n          },\n          turn_on_tracking: function() {\n            var x, g, o, c, a, n;\n            x = window, g = document, o = \"script\", x[c = \"snowplow\"] || (x.GlobalSnowplowNamespace = x.GlobalSnowplowNamespace || [], x.GlobalSnowplowNamespace.push(c), x[c] = function() {\n              (x[c].q = x[c].q || []).push(arguments);\n            }, x[c].q = x[c].q || [], a = g.createElement(o), n = g.getElementsByTagName(o)[0], a.async = 1, a.src = \"//d1fc8wv8zag5ca.cloudfront.net/2.9.0/sp.js\", n.parentNode.insertBefore(a, n));\n            var t = {\n              appId: \"dbt-docs\",\n              forceSecureTracker: !0,\n              respectDoNotTrack: !0,\n              userFingerprint: !1,\n              contexts: { webPage: !0 }\n            };\n            y.isHosted() && (t.cookieDomain = \".getdbt.com\"), y.snowplow = window.snowplow, y.snowplow(\n              \"newTracker\",\n              \"sp\",\n              \"fishtownanalytics.sinter-collect.com\",\n              t\n            ), y.snowplow(\"enableActivityTracking\", 30, 30), y.track_pageview();\n          },\n          fuzzUrls: function() {\n            y.isHosted() || (y.snowplow(\"setCustomUrl\", \"https://fuzzed.getdbt.com/\"), y.snowplow(\"setReferrerUrl\", \"https://fuzzed.getdbt.com/\"));\n          },\n          getContext: function() {\n            return [\n              {\n                schema: \"iglu:com.dbt/dbt_docs/jsonschema/1-0-0\",\n                data: {\n                  is_cloud_hosted: y.isHosted(),\n                  core_project_id: y.project_id\n                }\n              }\n            ];\n          },\n          track_pageview: function() {\n            y.snowplow && (y.fuzzUrls(), y.snowplow(\"trackPageView\", null, y.getContext()));\n          },\n          track_event: function(x, g, o, c) {\n            y.snowplow && (y.fuzzUrls(), y.snowplow(\n              \"trackStructEvent\",\n              \"dbt-docs\",\n              x,\n              g,\n              o,\n              c,\n              y.getContext()\n            ));\n          },\n          track_graph_interaction: function(x, g) {\n            y.snowplow && (y.fuzzUrls(), y.track_event(\"graph\", \"interact\", x, g));\n          }\n        };\n        return y;\n      }\n    ]);\n  },\n  function(L, T, e) {\n    var u, A, w, E, y;\n    u = e(476), A = e(204).utf8, w = e(477), E = e(204).bin, (y = function(x, g) {\n      x.constructor == String ? x = g && g.encoding === \"binary\" ? E.stringToBytes(x) : A.stringToBytes(x) : w(x) ? x = Array.prototype.slice.call(x, 0) : Array.isArray(x) || x.constructor === Uint8Array || (x = x.toString());\n      for (var o = u.bytesToWords(x), c = 8 * x.length, a = 1732584193, n = -271733879, t = -1732584194, r = 271733878, l = 0; l < o.length; l++)\n        o[l] = 16711935 & (o[l] << 8 | o[l] >>> 24) | 4278255360 & (o[l] << 24 | o[l] >>> 8);\n      o[c >>> 5] |= 128 << c % 32, o[14 + (c + 64 >>> 9 << 4)] = c;\n      var h = y._ff, i = y._gg, d = y._hh, p = y._ii;\n      for (l = 0; l < o.length; l += 16) {\n        var f = a, v = n, k = t, s = r;\n        a = h(a, n, t, r, o[l + 0], 7, -680876936), r = h(r, a, n, t, o[l + 1], 12, -389564586), t = h(t, r, a, n, o[l + 2], 17, 606105819), n = h(n, t, r, a, o[l + 3], 22, -1044525330), a = h(a, n, t, r, o[l + 4], 7, -176418897), r = h(r, a, n, t, o[l + 5], 12, 1200080426), t = h(t, r, a, n, o[l + 6], 17, -1473231341), n = h(n, t, r, a, o[l + 7], 22, -45705983), a = h(a, n, t, r, o[l + 8], 7, 1770035416), r = h(r, a, n, t, o[l + 9], 12, -1958414417), t = h(t, r, a, n, o[l + 10], 17, -42063), n = h(n, t, r, a, o[l + 11], 22, -1990404162), a = h(a, n, t, r, o[l + 12], 7, 1804603682), r = h(r, a, n, t, o[l + 13], 12, -40341101), t = h(t, r, a, n, o[l + 14], 17, -1502002290), a = i(\n          a,\n          n = h(n, t, r, a, o[l + 15], 22, 1236535329),\n          t,\n          r,\n          o[l + 1],\n          5,\n          -165796510\n        ), r = i(r, a, n, t, o[l + 6], 9, -1069501632), t = i(t, r, a, n, o[l + 11], 14, 643717713), n = i(n, t, r, a, o[l + 0], 20, -373897302), a = i(a, n, t, r, o[l + 5], 5, -701558691), r = i(r, a, n, t, o[l + 10], 9, 38016083), t = i(t, r, a, n, o[l + 15], 14, -660478335), n = i(n, t, r, a, o[l + 4], 20, -405537848), a = i(a, n, t, r, o[l + 9], 5, 568446438), r = i(r, a, n, t, o[l + 14], 9, -1019803690), t = i(t, r, a, n, o[l + 3], 14, -187363961), n = i(n, t, r, a, o[l + 8], 20, 1163531501), a = i(a, n, t, r, o[l + 13], 5, -1444681467), r = i(r, a, n, t, o[l + 2], 9, -51403784), t = i(t, r, a, n, o[l + 7], 14, 1735328473), a = d(\n          a,\n          n = i(n, t, r, a, o[l + 12], 20, -1926607734),\n          t,\n          r,\n          o[l + 5],\n          4,\n          -378558\n        ), r = d(r, a, n, t, o[l + 8], 11, -2022574463), t = d(t, r, a, n, o[l + 11], 16, 1839030562), n = d(n, t, r, a, o[l + 14], 23, -35309556), a = d(a, n, t, r, o[l + 1], 4, -1530992060), r = d(r, a, n, t, o[l + 4], 11, 1272893353), t = d(t, r, a, n, o[l + 7], 16, -155497632), n = d(n, t, r, a, o[l + 10], 23, -1094730640), a = d(a, n, t, r, o[l + 13], 4, 681279174), r = d(r, a, n, t, o[l + 0], 11, -358537222), t = d(t, r, a, n, o[l + 3], 16, -722521979), n = d(n, t, r, a, o[l + 6], 23, 76029189), a = d(a, n, t, r, o[l + 9], 4, -640364487), r = d(r, a, n, t, o[l + 12], 11, -421815835), t = d(t, r, a, n, o[l + 15], 16, 530742520), a = p(\n          a,\n          n = d(n, t, r, a, o[l + 2], 23, -995338651),\n          t,\n          r,\n          o[l + 0],\n          6,\n          -198630844\n        ), r = p(r, a, n, t, o[l + 7], 10, 1126891415), t = p(t, r, a, n, o[l + 14], 15, -1416354905), n = p(n, t, r, a, o[l + 5], 21, -57434055), a = p(a, n, t, r, o[l + 12], 6, 1700485571), r = p(r, a, n, t, o[l + 3], 10, -1894986606), t = p(t, r, a, n, o[l + 10], 15, -1051523), n = p(n, t, r, a, o[l + 1], 21, -2054922799), a = p(a, n, t, r, o[l + 8], 6, 1873313359), r = p(r, a, n, t, o[l + 15], 10, -30611744), t = p(t, r, a, n, o[l + 6], 15, -1560198380), n = p(n, t, r, a, o[l + 13], 21, 1309151649), a = p(a, n, t, r, o[l + 4], 6, -145523070), r = p(r, a, n, t, o[l + 11], 10, -1120210379), t = p(t, r, a, n, o[l + 2], 15, 718787259), n = p(n, t, r, a, o[l + 9], 21, -343485551), a = a + f >>> 0, n = n + v >>> 0, t = t + k >>> 0, r = r + s >>> 0;\n      }\n      return u.endian([a, n, t, r]);\n    })._ff = function(x, g, o, c, a, n, t) {\n      var r = x + (g & o | ~g & c) + (a >>> 0) + t;\n      return (r << n | r >>> 32 - n) + g;\n    }, y._gg = function(x, g, o, c, a, n, t) {\n      var r = x + (g & c | o & ~c) + (a >>> 0) + t;\n      return (r << n | r >>> 32 - n) + g;\n    }, y._hh = function(x, g, o, c, a, n, t) {\n      var r = x + (g ^ o ^ c) + (a >>> 0) + t;\n      return (r << n | r >>> 32 - n) + g;\n    }, y._ii = function(x, g, o, c, a, n, t) {\n      var r = x + (o ^ (g | ~c)) + (a >>> 0) + t;\n      return (r << n | r >>> 32 - n) + g;\n    }, y._blocksize = 16, y._digestsize = 16, L.exports = function(x, g) {\n      if (x == null) throw new Error(\"Illegal argument \" + x);\n      var o = u.wordsToBytes(y(x, g));\n      return g && g.asBytes ? o : g && g.asString ? E.bytesToString(o) : u.bytesToHex(o);\n    };\n  },\n  function(L, T) {\n    var e, u;\n    e = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\", u = {\n      rotl: function(A, w) {\n        return A << w | A >>> 32 - w;\n      },\n      rotr: function(A, w) {\n        return A << 32 - w | A >>> w;\n      },\n      endian: function(A) {\n        if (A.constructor == Number)\n          return 16711935 & u.rotl(A, 8) | 4278255360 & u.rotl(A, 24);\n        for (var w = 0; w < A.length; w++) A[w] = u.endian(A[w]);\n        return A;\n      },\n      randomBytes: function(A) {\n        for (var w = []; A > 0; A--) w.push(Math.floor(256 * Math.random()));\n        return w;\n      },\n      bytesToWords: function(A) {\n        for (var w = [], E = 0, y = 0; E < A.length; E++, y += 8)\n          w[y >>> 5] |= A[E] << 24 - y % 32;\n        return w;\n      },\n      wordsToBytes: function(A) {\n        for (var w = [], E = 0; E < 32 * A.length; E += 8)\n          w.push(A[E >>> 5] >>> 24 - E % 32 & 255);\n        return w;\n      },\n      bytesToHex: function(A) {\n        for (var w = [], E = 0; E < A.length; E++)\n          w.push((A[E] >>> 4).toString(16)), w.push((15 & A[E]).toString(16));\n        return w.join(\"\");\n      },\n      hexToBytes: function(A) {\n        for (var w = [], E = 0; E < A.length; E += 2)\n          w.push(parseInt(A.substr(E, 2), 16));\n        return w;\n      },\n      bytesToBase64: function(A) {\n        for (var w = [], E = 0; E < A.length; E += 3)\n          for (var y = A[E] << 16 | A[E + 1] << 8 | A[E + 2], x = 0; x < 4; x++)\n            8 * E + 6 * x <= 8 * A.length ? w.push(e.charAt(y >>> 6 * (3 - x) & 63)) : w.push(\"=\");\n        return w.join(\"\");\n      },\n      base64ToBytes: function(A) {\n        A = A.replace(/[^A-Z0-9+\\/]/gi, \"\");\n        for (var w = [], E = 0, y = 0; E < A.length; y = ++E % 4)\n          y != 0 && w.push(\n            (e.indexOf(A.charAt(E - 1)) & Math.pow(2, -2 * y + 8) - 1) << 2 * y | e.indexOf(A.charAt(E)) >>> 6 - 2 * y\n          );\n        return w;\n      }\n    }, L.exports = u;\n  },\n  function(L, T) {\n    function e(u) {\n      return !!u.constructor && typeof u.constructor.isBuffer == \"function\" && u.constructor.isBuffer(u);\n    }\n    /*!\n     * Determine if an object is a Buffer\n     *\n     * @author   Feross Aboukhadijeh <https://feross.org>\n     * @license  MIT\n     */\n    L.exports = function(u) {\n      return u != null && (e(u) || function(A) {\n        return typeof A.readFloatLE == \"function\" && typeof A.slice == \"function\" && e(A.slice(0, 0));\n      }(u) || !!u._isBuffer);\n    };\n  },\n  function(L, T, e) {\n    e(9).module(\"dbt\").factory(\"locationService\", [\n      \"$state\",\n      function(u) {\n        var A = {};\n        return A.parseState = function(w) {\n          return function(E) {\n            return {\n              selected: { include: E.g_i || \"\", exclude: E.g_e || \"\" },\n              show_graph: !!E.g_v\n            };\n          }(w);\n        }, A.setState = function(w) {\n          var E = function(x) {\n            var g = { g_v: 1 };\n            return g.g_i = x.include, g.g_e = x.exclude, g;\n          }(w), y = u.current.name;\n          u.go(y, E);\n        }, A.clearState = function() {\n          var w = u.current.name;\n          u.go(w, { g_i: null, g_e: null, g_v: null });\n        }, A;\n      }\n    ]);\n  },\n  function(L, T, e) {\n    const u = e(9), A = e(202);\n    u.module(\"dbt\").controller(\"OverviewCtrl\", [\n      \"$scope\",\n      \"$state\",\n      \"project\",\n      function(w, E, y) {\n        w.overview_md = \"(loading)\", y.ready(function(x) {\n          let g = E.params.project_name ? E.params.project_name : null;\n          var o = x.docs[\"doc.dbt.__overview__\"], c = A.filter(x.docs, { name: \"__overview__\" });\n          if (A.each(c, function(a) {\n            a.package_name != \"dbt\" && (o = a);\n          }), g !== null) {\n            o = x.docs[`doc.${g}.__${g}__`] || o;\n            let a = A.filter(x.docs, { name: `__${g}__` });\n            A.each(a, (n) => {\n              n.package_name !== g && (o = n);\n            });\n          }\n          w.overview_md = o.block_contents;\n        });\n      }\n    ]);\n  },\n  function(L, T, e) {\n    e(9).module(\"dbt\").controller(\"SourceListCtrl\", [\n      \"$scope\",\n      \"$state\",\n      \"project\",\n      function(u, A, w) {\n        u.source = A.params.source, u.model = {}, u.extra_table_fields = [], u.has_more_info = function(E) {\n          return (E.description || \"\").length;\n        }, u.toggle_source_expanded = function(E) {\n          u.has_more_info(E) && (E.expanded = !E.expanded);\n        }, w.ready(function(E) {\n          var y = _.filter(E.nodes, function(a) {\n            return a.source_name == u.source;\n          });\n          if (y.length != 0) {\n            y.sort((a, n) => a.name.localeCompare(n.name));\n            var x = y[0];\n            u.model = {\n              name: u.source,\n              source_description: x.source_description,\n              sources: y\n            };\n            var g = _.uniq(_.map(y, \"metadata.owner\")), o = _.uniq(_.map(y, \"database\")), c = _.uniq(_.map(y, \"schema\"));\n            u.extra_table_fields = [\n              { name: \"Loader\", value: x.loader },\n              {\n                name: g.length == 1 ? \"Owner\" : \"Owners\",\n                value: g.join(\", \")\n              },\n              {\n                name: o.length == 1 ? \"Database\" : \"Databases\",\n                value: o.join(\", \")\n              },\n              {\n                name: c.length == 1 ? \"Schema\" : \"Schemas\",\n                value: c.join(\", \")\n              },\n              { name: \"Tables\", value: y.length }\n            ];\n          }\n        });\n      }\n    ]);\n  },\n  function(L, T, e) {\n    const u = e(9), A = {\n      main: e(482),\n      overview: e(483),\n      graph: e(484),\n      source: e(205),\n      source_list: e(485),\n      model: e(486),\n      source: e(205),\n      snapshot: e(487),\n      seed: e(488),\n      test: e(489),\n      analysis: e(490),\n      macro: e(491),\n      exposure: e(492),\n      metric: e(493),\n      semantic_model: e(494),\n      operation: e(495)\n    };\n    u.module(\"dbt\").config([\n      \"$stateProvider\",\n      \"$urlRouterProvider\",\n      function(w, E) {\n        var y = \"g_v&g_i&g_e&g_p&g_n\";\n        E.otherwise(\"/overview\"), w.state(\"dbt\", {\n          url: \"/\",\n          abstract: !0,\n          controller: \"MainController\",\n          templateUrl: A.main\n        }).state(\"dbt.overview\", {\n          url: \"overview?\" + y,\n          controller: \"OverviewCtrl\",\n          templateUrl: A.overview\n        }).state(\"dbt.project_overview\", {\n          url: \"overview/:project_name?\" + y,\n          controller: \"OverviewCtrl\",\n          templateUrl: A.overview,\n          params: { project_name: { type: \"string\" } }\n        }).state(\"dbt.graph\", {\n          url: \"graph\",\n          controller: \"GraphCtrl\",\n          templateUrl: A.graph\n        }).state(\"dbt.model\", {\n          url: \"model/:unique_id?section&\" + y,\n          controller: \"ModelCtrl\",\n          templateUrl: A.model,\n          params: { unique_id: { type: \"string\" } }\n        }).state(\"dbt.seed\", {\n          url: \"seed/:unique_id?section&\" + y,\n          controller: \"SeedCtrl\",\n          templateUrl: A.seed,\n          params: { unique_id: { type: \"string\" } }\n        }).state(\"dbt.snapshot\", {\n          url: \"snapshot/:unique_id?section&\" + y,\n          controller: \"SnapshotCtrl\",\n          templateUrl: A.snapshot,\n          params: { unique_id: { type: \"string\" } }\n        }).state(\"dbt.test\", {\n          url: \"test/:unique_id?section&\" + y,\n          controller: \"TestCtrl\",\n          templateUrl: A.test,\n          params: { unique_id: { type: \"string\" } }\n        }).state(\"dbt.analysis\", {\n          url: \"analysis/:unique_id?section&\" + y,\n          controller: \"AnalysisCtrl\",\n          templateUrl: A.analysis,\n          params: { unique_id: { type: \"string\" } }\n        }).state(\"dbt.source\", {\n          url: \"source/:unique_id?section&\" + y,\n          controller: \"SourceCtrl\",\n          templateUrl: A.source,\n          params: { unique_id: { type: \"string\" } }\n        }).state(\"dbt.source_list\", {\n          url: \"source_list/:source?section&\" + y,\n          controller: \"SourceListCtrl\",\n          templateUrl: A.source_list,\n          params: { source: { type: \"string\" } }\n        }).state(\"dbt.macro\", {\n          url: \"macro/:unique_id?section\",\n          controller: \"MacroCtrl\",\n          templateUrl: A.macro,\n          params: { unique_id: { type: \"string\" } }\n        }).state(\"dbt.exposure\", {\n          url: \"exposure/:unique_id?section&\" + y,\n          controller: \"ExposureCtrl\",\n          templateUrl: A.exposure,\n          params: { unique_id: { type: \"string\" } }\n        }).state(\"dbt.metric\", {\n          url: \"metric/:unique_id?section&\" + y,\n          controller: \"MetricCtrl\",\n          templateUrl: A.metric,\n          params: { unique_id: { type: \"string\" } }\n        }).state(\"dbt.semantic_model\", {\n          url: \"semantic_model/:unique_id?section&\" + y,\n          controller: \"SemanticModelCtrl\",\n          templateUrl: A.semantic_model,\n          params: { unique_id: { type: \"string\" } }\n        }).state(\"dbt.operation\", {\n          url: \"operation/:unique_id?section&\" + y,\n          controller: \"OperationCtrl\",\n          templateUrl: A.operation,\n          params: { unique_id: { type: \"string\" } }\n        });\n      }\n    ]);\n  },\n  function(L, T) {\n    var e = \"/main/main.html\";\n    window.angular.module(\"ng\").run([\n      \"$templateCache\",\n      function(u) {\n        u.put(\n          e,\n          `<style>\n.no-x-overflow {\n    overflow-x: hidden;\n}\n\n.logo {\n    width: 140px;\n    height: 46px ;\n}\n</style>\n\n<div>\n    <graph-launcher></graph-launcher>\n\n    <div class=\"app app-row\">\n        <div class=\"app-menu app-column\">\n            <div class=\"app-overlay\" data-toggle=\".app-menu\"></div>\n            <div class=\"app-header app-navbar app-shadow app-pad\">\n                <div class=\"app-row app-middle\">\n                    <div class=\"app-body\">\n                        <div class=\"logo\">\n                            <a ui-sref=\"dbt.overview()\">\n                                <img style=\"width: 100px; height: 40px\" class=\"logo\" ng-src=\"{{ logo }}\" />\n                            </a>\n                        </div>\n                    </div>\n                </div>\n            </div>\n            <div class=\"app-body\">\n                <div class=\"app-scroll app-pad app-flush-right no-x-overflow\">\n                    <model-tree tree=\"tree\"></model-tree>\n                </div>\n            </div>\n        </div>\n        <div class=\"app-content app-column\">\n            <div class=\"app-header app-navbar app-shadow\">\n                <div class=\"app-frame app-pad app-row app-middle\">\n                        <input\n                            id=\"search\"\n                            ng-model=\"search.query\"\n                            ng-focus=\"onSearchFocus($event, true)\"\n                            ng-keydown=\"onSearchKeypress($event)\"\n                            type=\"text\"\n                            class=\"form-control\"\n                            placeholder=\"Search for models...\" />\n                    <div class=\"app-body\">\n                    </div>\n                    <div class=\"app-footer app-icn\" ng-show=\"search.is_focused\" ng-click=\"clearSearch()\">\n                        <svg class=\"icn icn-md\"><use xlink:href=\"#icn-close\"></use></svg>\n                    </div>\n                </div>\n            </div>\n            <div class='app-body' ng-show='!search.is_focused' ui-view></div>\n            <div class=\"app-body\" ng-show=\"search.is_focused\">\n                <docs-search query=\"search.query\" results=\"search.results\" on-select=\"clearSearch()\"></docs-search>\n            </div>\n        </div>\n    </div>\n</div>\n`\n        );\n      }\n    ]), L.exports = e;\n  },\n  function(L, T) {\n    var e = \"/overview/overview.html\";\n    window.angular.module(\"ng\").run([\n      \"$templateCache\",\n      function(u) {\n        u.put(\n          e,\n          `<div class=\"app-details app-scroll app-pad\">\n    <app-scroll div class=\"app-frame app-pad\">\n        <div class=\"panel panel-default\">\n            <div class=\"panel-body\">\n                <p marked='overview_md'></p>\n            </div>\n        </div>\n    </div>\n</div>\n`\n        );\n      }\n    ]), L.exports = e;\n  },\n  function(L, T) {\n    var e = \"/graph/graph.html\";\n    window.angular.module(\"ng\").run([\n      \"$templateCache\",\n      function(u) {\n        u.put(\n          e,\n          `<div ng-controller=\"GraphCtrl\" id='graph-container' style=\"width: 100%\">\n    <div class='row viz-container' style=\"margin: 0\">\n        <div class='col-md-12'>\n             <div graph-viz\n                        viz-options=\"graph.options\"\n                        viz-elements=\"graph.elements\"\n                        viz-style=\"graph.style\"\n                        viz-layout=\"graph.layout\"\n                        viz-ready=\"graph.ready\"\n                        viz-size=\"{height: '800px', width: '100%'}\"></div>\n        </div>\n    </div>\n</div>\n`\n        );\n      }\n    ]), L.exports = e;\n  },\n  function(L, T) {\n    var e = \"/sources/source_list.html\";\n    window.angular.module(\"ng\").run([\n      \"$templateCache\",\n      function(u) {\n        u.put(\n          e,\n          `<style>\n/* TODO */\n.section-target {\n    top: -8em;\n}\n\n.noflex {\n    flex: 0 0 160px !important;\n}\n\n.highlight {\n    color: #24292e;\n    background-color: white;\n}\n\n</style>\n\n<div class='app-scroll'>\n    <div class=\"app-links app-sticky\">\n        <div class=\"app-title\">\n            <div class=\"app-frame app-pad app-flush-bottom\">\n                <h1>\n                    <span class=\"break\">{{ source }}</span>\n                    <small>source</small>\n                </h1>\n            </div>\n        </div>\n        <div class=\"app-frame app-pad-h\">\n            <ul class=\"nav nav-tabs\">\n                <li ui-sref-active='active'><a ui-sref=\"dbt.source_list({'#': 'details'})\">Details</a></li>\n                <li ui-sref-active='active'><a ui-sref=\"dbt.source_list({'#': 'description'})\">Description</a></li>\n                <li ui-sref-active='active'><a ui-sref=\"dbt.source_list({'#': 'sources'})\">Sources</a></li>\n            </ul>\n        </div>\n    </div>\n    <div class=\"app-details\">\n        <div class=\"app-frame app-pad\">\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"details\"></div>\n                <table-details model=\"model\" extras=\"extra_table_fields\"/>\n            </section>\n\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"description\"></div>\n                <div class=\"section-content\">\n                    <h6>Description</h6>\n                    <div class=\"panel\">\n                        <div class=\"panel-body\">\n                            <div ng-if=\"model.source_description\" class=\"model-markdown\" marked=\"model.source_description\"></div>\n                            <div ng-if=\"!model.source_description\">This {{ model.resource_type }} is not currently documented</div>\n                        </div>\n                    </div>\n                </div>\n            </section>\n\n\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"sources\"></div>\n                <div class=\"section-content\">\n                    <h6>Source Tables</h6>\n                    <div class=\"panel\">\n                        <div class=\"panel-body\">\n                            <div class=\"table-responsive\" style=\"max-height: 800px; overflow-y: scroll;\" ng-if=\"!_.isEmpty(model.sources)\">\n                                <table class=\"table table-borderless table-hover\">\n                                    <thead>\n                                        <tr>\n                                            <th style=\"background-color: white; position: sticky; top: 0; z-index: 1;\">Source</th>\n                                            <th style=\"background-color: white; position: sticky; top: 0; z-index: 1;\">Table</th>\n                                            <th style=\"background-color: white; position: sticky; top: 0; z-index: 1;\">Description</th>\n                                            <th style=\"background-color: white; position: sticky; top: 0; z-index: 1;\">Link</th>\n                                            <th style=\"width: 1px; background-color: white; position: sticky; top: 0; z-index: 1;\" class='text-center'>More?</th>\n                                        </tr>\n                                    </thead>\n                                    <tbody>\n                                        <tr\n                                            ng-repeat-start=\"source in model.sources track by source.name\"\n                                            ng-click=\"toggle_source_expanded(source)\"\n                                            class=\"column-row\"\n                                            ng-class=\"{'column-row-selected': source.expanded}\"\n                                            ng-style=\"{cursor: has_more_info(source) ? 'pointer' : 'auto'}\">\n                                            <td>\n                                                <div>\n                                                    <span class='text-dark'>{{ source.source_name }}</span>\n                                                </div>\n                                            </td>\n                                            <td>\n                                                <span class='text-dark'>{{ source.name }}</p>\n                                            </td>\n                                            <td style=\"text-overflow: ellipsis; overflow-x: hidden; white-space: nowrap; max-width: 1px;\">\n                                                <span ng-show=\"!column.expanded\">{{ source.description }}</span>\n                                            </td>\n                                            <td>\n                                                <a ui-sref=\"dbt.source({unique_id: source.unique_id})\">View docs</a>\n                                            </td>\n                                            <td class='text-center'>\n                                                <span class='text-light' ng-show=\"has_more_info(source)\">\n                                                    <span ng-if=\"source.expanded\">\n                                                        <svg class=\"icn\"><use xlink:href=\"#icn-up\"></use></svg>\n                                                    </span>\n                                                    <span ng-if=\"!source.expanded\">\n                                                        <svg class=\"icn\"><use xlink:href=\"#icn-right\"></use></svg>\n                                                    </span>\n                                                </span>\n                                            </td>\n                                        </tr>\n                                        <tr ng-repeat-end ng-show=\"source.expanded\" style=\"background-color: white; padding: 10px\">\n                                            <td colspan=\"5\" class=\"column-expanded\">\n                                                <div style=\"padding: 5px 20px\">\n                                                    <div style=\"margin-bottom: 15px\">\n                                                        <h5>Description</h5>\n                                                        <span marked=\"source.description\"></span>\n                                                    </div>\n                                                </div>\n                                            </td>\n                                        </tr>\n                                    </tbody>\n                                </table>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </section>\n        </div>\n    </div>\n</div>\n`\n        );\n      }\n    ]), L.exports = e;\n  },\n  function(L, T) {\n    var e = \"/docs/model.html\";\n    window.angular.module(\"ng\").run([\n      \"$templateCache\",\n      function(u) {\n        u.put(\n          e,\n          `<style>\n/* TODO */\n.section-target {\n    top: -8em;\n}\n\n.noflex {\n    flex: 0 0 160px !important;\n}\n\n.highlight {\n    color: #24292e;\n    background-color: white;\n}\n\n</style>\n\n<div class='app-scroll'>\n    <div class=\"app-links app-sticky\">\n        <div class=\"app-title\">\n            <div class=\"app-frame app-pad app-flush-bottom\">\n                <h1 ng-if=\"model.docs.show === false\">\n                    <small class='text-bold text-right'>\n                        <i data-icon=\"eye\"></i>\n                        This model is hidden\n                    </small>\n                </h1>\n                <h1>\n                    <span class=\"break\">{{ model.name }}</span>\n                    <small>{{ model.config.materialized }}</small>\n                </h1>\n            </div>\n        </div>\n        <div class=\"app-frame app-pad-h\">\n            <ul class=\"nav nav-tabs\">\n                <li ui-sref-active='active'><a ui-sref=\"dbt.model({'#': 'details'})\">Details</a></li>\n                <li ui-sref-active='active'><a ui-sref=\"dbt.model({'#': 'description'})\">Description</a></li>\n                <li ui-sref-active='active'><a ui-sref=\"dbt.model({'#': 'columns'})\">Columns</a></li>\n                <li ui-sref-active='active' ng-show = \"referencesLength != 0\"><a ui-sref=\"dbt.model({'#': 'referenced_by'})\">Referenced By</a></li>\n                <li ui-sref-active='active' ng-show = \"parentsLength != 0\"><a ui-sref=\"dbt.model({'#': 'depends_on'})\">Depends On</a></li>\n                <li ui-sref-active='active'><a ui-sref=\"dbt.model({'#': 'code'})\">Code</a></li>\n            </ul>\n        </div>\n    </div>\n    <div class=\"app-details\">\n        <div class=\"app-frame app-pad\">\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"details\"></div>\n                <table-details model=\"model\"></table-details>\n            </section>\n\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"description\"></div>\n                <div class=\"section-content\">\n                    <h6>Description</h6>\n                    <div class=\"panel\">\n                        <div class=\"panel-body\">\n                            <div ng-if=\"model.description\" class=\"model-markdown\" marked=\"model.description\"></div>\n                            <div ng-if=\"!model.description\">This {{ model.resource_type }} is not currently documented</div>\n                        </div>\n                    </div>\n                </div>\n            </section>\n\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"columns\"></div>\n                <div class=\"section-content\">\n                    <h6>Columns</h6>\n                    <column-details model=\"model\" />\n                </div>\n            </section>\n\n            <section class=\"section\" ng-show = \"referencesLength != 0\">\n                <div class=\"section-target\" id=\"referenced_by\"></div>\n                <div class=\"section-content\">\n                    <h6>Referenced By</h6>\n                    <reference-list references=\"references\" node=\"model\" />\n                </div>\n            </section>\n\n            <section class=\"section\" ng-show = \"parentsLength != 0\">\n                <div class=\"section-target\" id=\"depends_on\"></div>\n                <div class=\"section-content\">\n                    <h6>Depends On</h6>\n                    <reference-list references=\"parents\" node=\"model\" />\n                </div>\n            </section>\n\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"code\"></div>\n                <div class=\"section-content\">\n                    <code-block versions=\"versions\" default=\"default_version\" language=\"language\"></code-block>\n                </div>\n            </section>\n        </div>\n    </div>\n</div>\n`\n        );\n      }\n    ]), L.exports = e;\n  },\n  function(L, T) {\n    var e = \"/docs/snapshot.html\";\n    window.angular.module(\"ng\").run([\n      \"$templateCache\",\n      function(u) {\n        u.put(\n          e,\n          `<style>\n/* TODO */\n.section-target {\n    top: -8em;\n}\n\n.noflex {\n    flex: 0 0 160px !important;\n}\n\n.highlight {\n    color: #24292e;\n    background-color: white;\n}\n\n</style>\n\n<div class='app-scroll'>\n    <div class=\"app-links app-sticky\">\n        <div class=\"app-title\">\n            <div class=\"app-frame app-pad app-flush-bottom\">\n                <h1 ng-if=\"model.docs.show === false\">\n                    <small class='text-bold text-right'>\n                        <i data-icon=\"eye\"></i>\n                        This {{ model.resource_type }} is hidden\n                    </small>\n                </h1>\n                <h1>\n                    <span class=\"break\">{{ model.name }}</span>\n                    <small>{{ model.config.materialized }}</small>\n                </h1>\n            </div>\n        </div>\n        <div class=\"app-frame app-pad-h\">\n            <ul class=\"nav nav-tabs\">\n                <li ui-sref-active='active'><a ui-sref=\"dbt.snapshot({'#': 'details'})\">Details</a></li>\n                <li ui-sref-active='active'><a ui-sref=\"dbt.snapshot({'#': 'description'})\">Description</a></li>\n                <li ui-sref-active='active'><a ui-sref=\"dbt.snapshot({'#': 'columns'})\">Columns</a></li>\n                <li ui-sref-active='active' ng-show = \"referencesLength != 0\"><a ui-sref=\"dbt.snapshot({'#': 'referenced_by'})\">Referenced By</a></li>\n                <li ui-sref-active='active' ng-show = \"parentsLength != 0\"><a ui-sref=\"dbt.snapshot({'#': 'depends_on'})\">Depends On</a></li>\n                <li ui-sref-active='active'><a ui-sref=\"dbt.snapshot({'#': 'code'})\">SQL</a></li>\n            </ul>\n        </div>\n    </div>\n    <div class=\"app-details\">\n        <div class=\"app-frame app-pad\">\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"details\"></div>\n                <table-details model=\"model\" />\n            </section>\n\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"description\"></div>\n                <div class=\"section-content\">\n                    <h6>Description</h6>\n                    <div class=\"panel\">\n                        <div class=\"panel-body\">\n                            <div ng-if=\"model.description\" class=\"model-markdown\" marked=\"model.description\"></div>\n                            <div ng-if=\"!model.description\">This {{ model.resource_type }} is not currently documented</div>\n                        </div>\n                    </div>\n                </div>\n            </section>\n\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"columns\"></div>\n                <div class=\"section-content\">\n                    <h6>Columns</h6>\n                    <column-details model=\"model\" />\n                </div>\n            </section>\n\n            <section class=\"section\" ng-show = \"referencesLength != 0\">\n                <div class=\"section-target\" id=\"referenced_by\"></div>\n                <div class=\"section-content\">\n                    <h6>Referenced By</h6>\n                    <reference-list references=\"references\" node=\"model\" />\n                </div>\n            </section>\n\n            <section class=\"section\" ng-show = \"parentsLength != 0\">\n                <div class=\"section-target\" id=\"depends_on\"></div>\n                <div class=\"section-content\">\n                    <h6>Depends On</h6>\n                    <reference-list references=\"parents\" node=\"model\" />\n                </div>\n            </section>\n\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"code\"></div>\n                <div class=\"section-content\">\n                    <code-block versions=\"versions\" default=\"default_version\" language=\"language\"></code-block>\n                </div>\n            </section>\n        </div>\n    </div>\n</div>\n`\n        );\n      }\n    ]), L.exports = e;\n  },\n  function(L, T) {\n    var e = \"/docs/seed.html\";\n    window.angular.module(\"ng\").run([\n      \"$templateCache\",\n      function(u) {\n        u.put(\n          e,\n          `<style>\n/* TODO */\n.section-target {\n    top: -8em;\n}\n\n.noflex {\n    flex: 0 0 160px !important;\n}\n\n.highlight {\n    color: #24292e;\n    background-color: white;\n}\n\n</style>\n\n<div class='app-scroll'>\n    <div class=\"app-links app-sticky\">\n        <div class=\"app-title\">\n            <div class=\"app-frame app-pad app-flush-bottom\">\n                <h1 ng-if=\"model.docs.show === false\">\n                    <small class='text-bold text-right'>\n                        <i data-icon=\"eye\"></i>\n                        This {{ model.resource_type }} is hidden\n                    </small>\n                </h1>\n                <h1>\n                    <span class=\"break\">{{ model.name }}</span>\n                    <small>{{ model.config.materialized }}</small>\n                </h1>\n            </div>\n        </div>\n        <div class=\"app-frame app-pad-h\">\n            <ul class=\"nav nav-tabs\">\n                <li ui-sref-active='active'><a ui-sref=\"dbt.seed({'#': 'details'})\">Details</a></li>\n                <li ui-sref-active='active'><a ui-sref=\"dbt.seed({'#': 'description'})\">Description</a></li>\n                <li ui-sref-active='active'><a ui-sref=\"dbt.seed({'#': 'columns'})\">Columns</a></li>\n                <li ui-sref-active='active' ng-show = \"referencesLength != 0\"><a ui-sref=\"dbt.seed({'#': 'referenced_by'})\">Referenced By</a></li>\n                <li ui-sref-active='active' ng-show = \"parentsLength != 0\"><a ui-sref=\"dbt.seed({'#': 'depends_on'})\">Depends On</a></li>\n                <li ui-sref-active='active'><a ui-sref=\"dbt.seed({'#': 'code'})\">SQL</a></li>\n            </ul>\n        </div>\n    </div>\n    <div class=\"app-details\">\n        <div class=\"app-frame app-pad\">\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"details\"></div>\n                <table-details model=\"model\" />\n            </section>\n\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"description\"></div>\n                <div class=\"section-content\">\n                    <h6>Description</h6>\n                    <div class=\"panel\">\n                        <div class=\"panel-body\">\n                            <div ng-if=\"model.description\" class=\"model-markdown\" marked=\"model.description\"></div>\n                            <div ng-if=\"!model.description\">This {{ model.resource_type }} is not currently documented</div>\n                        </div>\n                    </div>\n                </div>\n            </section>\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"columns\"></div>\n                <div class=\"section-content\">\n                    <h6>Columns</h6>\n                    <column-details model=\"model\" />\n                </div>\n            </section>\n\n            <section class=\"section\" ng-show = \"referencesLength != 0\">\n                <div class=\"section-target\" id=\"referenced_by\"></div>\n                <div class=\"section-content\">\n                    <h6>Referenced By</h6>\n                    <reference-list references=\"references\" node=\"model\" />\n                </div>\n            </section>\n\n            <section class=\"section\" ng-show = \"parentsLength != 0\">\n                <div class=\"section-target\" id=\"depends_on\"></div>\n                <div class=\"section-content\">\n                    <h6>Depends On</h6>\n                    <reference-list references=\"parents\" node=\"model\" />\n                </div>\n            </section>\n\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"code\"></div>\n                <div class=\"section-content\">\n                    <code-block versions=\"versions\" default=\"default_version\" language=\"language\"></code-block>\n                </div>\n            </section>\n        </div>\n    </div>\n</div>\n`\n        );\n      }\n    ]), L.exports = e;\n  },\n  function(L, T) {\n    var e = \"/docs/test.html\";\n    window.angular.module(\"ng\").run([\n      \"$templateCache\",\n      function(u) {\n        u.put(\n          e,\n          `<style>\n/* TODO */\n.section-target {\n    top: -8em;\n}\n\n.noflex {\n    flex: 0 0 160px !important;\n}\n\n.highlight {\n    color: #24292e;\n    background-color: white;\n}\n\n</style>\n\n<div class='app-scroll'>\n    <div class=\"app-links app-sticky\">\n        <div class=\"app-title\">\n            <div class=\"app-frame app-pad app-flush-bottom\">\n                <h1>\n                    <span class=\"break\">{{ model.name }}</span>\n                    <small>test</small>\n                </h1>\n            </div>\n        </div>\n        <div class=\"app-frame app-pad-h\">\n            <ul class=\"nav nav-tabs\">\n                <li ui-sref-active='active'><a ui-sref=\"dbt.test({'#': 'description'})\">Description</a></li>\n                <li ui-sref-active='active' ng-show = \"parentsLength != 0\"><a ui-sref=\"dbt.test({'#': 'depends_on'})\">Depends On</a></li>\n                <li ui-sref-active='active'><a ui-sref=\"dbt.test({'#': 'code'})\">SQL</a></li>\n            </ul>\n        </div>\n    </div>\n    <div class=\"app-details\">\n        <div class=\"app-frame app-pad\">\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"description\"></div>\n                <div class=\"section-content\">\n                    <h6>Description</h6>\n                    <div class=\"panel\">\n                        <div class=\"panel-body\">\n                            <div ng-if=\"model.description\" class=\"model-markdown\" marked=\"model.description\"></div>\n                            <div ng-if=\"!model.description\">This {{ model.resource_type }} is not currently documented</div>\n                        </div>\n                    </div>\n                </div>\n            </section>\n\n            <section class=\"section\" ng-show = \"parentsLength != 0\">\n                <div class=\"section-target\" id=\"depends_on\"></div>\n                <div class=\"section-content\">\n                    <h6>Depends On</h6>\n                    <reference-list references=\"parents\" node=\"model\" />\n                </div>\n            </section>\n\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"code\"></div>\n                <div class=\"section-content\">\n                    <code-block versions=\"versions\" default=\"default_version\" language=\"language\"></code-block>\n                </div>\n            </section>\n        </div>\n    </div>\n</div>\n`\n        );\n      }\n    ]), L.exports = e;\n  },\n  function(L, T) {\n    var e = \"/docs/analysis.html\";\n    window.angular.module(\"ng\").run([\n      \"$templateCache\",\n      function(u) {\n        u.put(\n          e,\n          `<style>\n/* TODO */\n.section-target {\n    top: -8em;\n}\n\n.noflex {\n    flex: 0 0 160px !important;\n}\n\n.highlight {\n    color: #24292e;\n    background-color: white;\n}\n\n</style>\n\n<div class='app-scroll'>\n    <div class=\"app-links app-sticky\">\n        <div class=\"app-title\">\n            <div class=\"app-frame app-pad app-flush-bottom\">\n                <h1 ng-if=\"model.docs.show === false\">\n                    <small class='text-bold text-right'>\n                        <i data-icon=\"eye\"></i>\n                        This {{ model.resource_type }} is hidden\n                    </small>\n                </h1>\n                <h1>\n                    <span class=\"break\">{{ model.name }}</span>\n                    <small>Analysis</small>\n                </h1>\n            </div>\n        </div>\n        <div class=\"app-frame app-pad-h\">\n            <ul class=\"nav nav-tabs\">\n                <li ui-sref-active='active'><a ui-sref=\"dbt.analysis({'#': 'description'})\">Description</a></li>\n                <li ui-sref-active='active' ng-show = \"parentsLength != 0\"><a ui-sref=\"dbt.analysis({'#': 'depends_on'})\">Depends On</a></li>\n                <li ui-sref-active='active'><a ui-sref=\"dbt.analysis({'#': 'sql'})\">SQL</a></li>\n            </ul>\n        </div>\n    </div>\n    <div class=\"app-details\">\n        <div class=\"app-frame app-pad\">\n\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"description\"></div>\n                <div class=\"section-content\">\n                    <h6>Description</h6>\n                    <div class=\"panel\">\n                        <div class=\"panel-body\">\n                            <div ng-if=\"model.description\" class=\"model-markdown\" marked=\"model.description\"></div>\n                            <div ng-if=\"!model.description\">This {{ model.resource_type }} is not currently documented</div>\n                        </div>\n                    </div>\n                </div>\n            </section>\n\n            <section class=\"section\" ng-show = \"parentsLength != 0\">\n                <div class=\"section-target\" id=\"depends_on\"></div>\n                <div class=\"section-content\">\n                    <h6>Depends On</h6>\n                    <reference-list references=\"parents\" />\n                </div>\n            </section>\n\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"sql\"></div>\n                <div class=\"section-content\">\n                    <code-block versions=\"versions\" default=\"default_version\" language=\"language\"></code-block>\n                </div>\n            </section>\n        </div>\n    </div>\n</div>\n`\n        );\n      }\n    ]), L.exports = e;\n  },\n  function(L, T) {\n    var e = \"/docs/macro.html\";\n    window.angular.module(\"ng\").run([\n      \"$templateCache\",\n      function(u) {\n        u.put(\n          e,\n          `<style>\n/* TODO */\n.section-target {\n    top: -8em;\n}\n\n.noflex {\n    flex: 0 0 160px !important;\n}\n\n.highlight {\n    color: #24292e;\n    background-color: white;\n}\n\n</style>\n\n<div class='app-scroll'>\n    <div class=\"app-links app-sticky\">\n        <div class=\"app-title\">\n            <div class=\"app-frame app-pad app-flush-bottom\">\n                <h1>\n                    <span class=\"break\">{{ macro.package_name }}.{{ macro.name }}</span>\n                    <small ng-if=\"macro.is_adapter_macro\">adapter macro</small>\n                    <small ng-if=\"!macro.is_adapter_macro\">macro</small>\n                </h1>\n            </div>\n        </div>\n        <div class=\"app-frame app-pad-h\">\n            <ul class=\"nav nav-tabs\">\n                <li ui-sref-active='active'><a ui-sref=\"dbt.macro({'#': 'description'})\">Description</a></li>\n                <li ui-sref-active='active'><a ui-sref=\"dbt.macro({'#': 'arguments'})\">Arguments</a></li>\n                <li ui-sref-active='active' ng-show = \"referencesLength != 0\"><a ui-sref=\"dbt.macro({'#': 'referenced_by'})\">Referenced By</a></li>\n                <li ui-sref-active='active' ng-show = \"parentsLength != 0\"><a ui-sref=\"dbt.macro({'#': 'depends_on'})\">Depends On</a></li>\n                <li ui-sref-active='active'><a ui-sref=\"dbt.macro({'#': 'code'})\">Code</a></li>\n            </ul>\n        </div>\n    </div>\n    <div class=\"app-details\">\n        <div class=\"app-frame app-pad\">\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"description\"></div>\n                <div class=\"section-content\">\n                    <h6>Description</h6>\n                    <div class=\"panel\">\n                        <div class=\"panel-body\">\n                            <div ng-if=\"macro.description\" class=\"model-markdown\" marked=\"macro.description\"></div>\n                            <div ng-if=\"!macro.description\">This {{ macro.resource_type }} is not currently documented</div>\n                        </div>\n                    </div>\n                </div>\n            </section>\n\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"arguments\"></div>\n                <div class=\"section-content\">\n                    <h6>Arguments</h6>\n                    <macro-arguments macro=\"macro\"></macro-arguments>\n                </div>\n            </section>\n\n            <section class=\"section\" ng-show = \"referencesLength != 0\">\n                <div class=\"section-target\" id=\"referenced_by\"></div>\n                <div class=\"section-content\">\n                    <h6>Referenced By</h6>\n                    <reference-list references=\"references\" node=\"macro\" />\n                </div>\n            </section>\n\n            <section class=\"section\" ng-show = \"parentsLength != 0\">\n                <div class=\"section-target\" id=\"depends_on\"></div>\n                <div class=\"section-content\">\n                    <h6>Depends On</h6>\n                    <reference-list references=\"parents\" node=\"macro\" />\n                </div>\n            </section>\n\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"code\"></div>\n                <div class=\"section-content\">\n                    <code-block versions=\"versions\" default=\"default_version\" language=\"language\"></code-block>\n                </div>\n            </section>\n        </div>\n    </div>\n</div>\n`\n        );\n      }\n    ]), L.exports = e;\n  },\n  function(L, T) {\n    var e = \"/docs/exposure.html\";\n    window.angular.module(\"ng\").run([\n      \"$templateCache\",\n      function(u) {\n        u.put(\n          e,\n          `<style>\n/* TODO */\n.section-target {\n    top: -8em;\n}\n\n.noflex {\n    flex: 0 0 160px !important;\n}\n\n.highlight {\n    color: #24292e;\n    background-color: white;\n}\n\n</style>\n\n<div class='app-scroll'>\n    <div class=\"app-links app-sticky\">\n        <div class=\"app-title\">\n            <div class=\"app-frame app-pad app-flush-bottom\">\n\n                <h1>\n                    <span class=\"break\">{{ exposure.label }}</span>\n                    <small>exposure</small>\n\n                    <div class='pull-right' ng-show=\"exposure.url\">\n                        <a class='btn text-white btn-primary btn-sm' ng-href=\"{{ exposure.url }}\" target=\"_blank\">View this exposure</a>\n                    </div>\n\n                    <div class='clearfix'></div>\n                </h1>\n\n            </div>\n        </div>\n        <div class=\"app-frame app-pad-h\">\n            <ul class=\"nav nav-tabs\">\n                <li ui-sref-active='active'><a ui-sref=\"dbt.exposure({'#': 'details'})\">Details</a></li>\n                <li ui-sref-active='active'><a ui-sref=\"dbt.exposure({'#': 'description'})\">Description</a></li>\n                <li ui-sref-active='active' ng-show = \"parentsLength != 0\"><a ui-sref=\"dbt.exposure({'#': 'depends_on'})\">Depends On</a></li>\n            </ul>\n        </div>\n    </div>\n    <div class=\"app-details\">\n        <div class=\"app-frame app-pad\">\n\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"details\"></div>\n                <table-details model=\"exposure\" extras=\"extra_table_fields\" />\n            </section>\n\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"description\"></div>\n                <div class=\"section-content\">\n                    <h6>Description</h6>\n                    <div class=\"panel\">\n                        <div class=\"panel-body\">\n                            <div ng-if=\"exposure.description\" class=\"model-markdown\" marked=\"exposure.description\"></div>\n                            <div ng-if=\"!exposure.description\">This {{ exposure.resource_type }} is not currently documented</div>\n                        </div>\n                    </div>\n                </div>\n            </section>\n\n            <section class=\"section\" ng-show = \"parentsLength != 0\">\n                <div class=\"section-target\" id=\"depends_on\"></div>\n                <div class=\"section-content\">\n                    <h6>Depends On</h6>\n                    <reference-list references=\"parents\" node=\"exposure\" />\n                </div>\n            </section>\n\n        </div>\n    </div>\n</div>\n`\n        );\n      }\n    ]), L.exports = e;\n  },\n  function(L, T) {\n    var e = \"/docs/metric.html\";\n    window.angular.module(\"ng\").run([\n      \"$templateCache\",\n      function(u) {\n        u.put(\n          e,\n          `<style>\n/* TODO */\n.section-target {\n    top: -8em;\n}\n\n.noflex {\n    flex: 0 0 160px !important;\n}\n\n.highlight {\n    color: #24292e;\n    background-color: white;\n}\n\n</style>\n\n<div class='app-scroll'>\n    <div class=\"app-links app-sticky\">\n        <div class=\"app-title\">\n            <div class=\"app-frame app-pad app-flush-bottom\">\n\n                <h1>\n                    <span class=\"break\">{{ metric.label }}</span>\n                    <small>metric</small>\n\n                    <div class='clearfix'></div>\n                </h1>\n\n            </div>\n        </div>\n        <div class=\"app-frame app-pad-h\">\n            <ul class=\"nav nav-tabs\">\n                <li ui-sref-active='active'><a ui-sref=\"dbt.metric({'#': 'details'})\">Details</a></li>\n                <li ui-sref-active='active'><a ui-sref=\"dbt.metric({'#': 'description'})\">Description</a></li>\n                <li ui-sref-active='active' ng-show = \"parentsLength != 0\"><a ui-sref=\"dbt.metric({'#': 'depends_on'})\">Depends On</a></li>\n            </ul>\n        </div>\n    </div>\n    <div class=\"app-details\">\n        <div class=\"app-frame app-pad\">\n\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"details\"></div>\n                <table-details model=\"metric\" extras=\"extra_table_fields\" />\n            </section>\n\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"description\"></div>\n                <div class=\"section-content\">\n                    <h6>Description</h6>\n                    <div class=\"panel\">\n                        <div class=\"panel-body\">\n                            <div ng-if=\"metric.description\" class=\"model-markdown\" marked=\"metric.description\"></div>\n                            <div ng-if=\"!metric.description\">This {{ metric.resource_type }} is not currently documented</div>\n                        </div>\n                    </div>\n                </div>\n            </section>\n\n            <section class=\"section\" ng-show = \"parentsLength != 0\">\n                <div class=\"section-target\" id=\"depends_on\"></div>\n                <div class=\"section-content\">\n                    <h6>Depends On</h6>\n                    <reference-list references=\"parents\" node=\"metric\" />\n                </div>\n            </section>\n\n        </div>\n    </div>\n</div>\n`\n        );\n      }\n    ]), L.exports = e;\n  },\n  function(L, T) {\n    var e = \"/docs/semantic_model.html\";\n    window.angular.module(\"ng\").run([\n      \"$templateCache\",\n      function(u) {\n        u.put(\n          e,\n          `<style>\n/* TODO */\n.section-target {\n    top: -8em;\n}\n\n.noflex {\n    flex: 0 0 160px !important;\n}\n\n.highlight {\n    color: #24292e;\n    background-color: white;\n}\n\n</style>\n\n<div class='app-scroll'>\n    <div class=\"app-links app-sticky\">\n        <div class=\"app-title\">\n            <div class=\"app-frame app-pad app-flush-bottom\">\n\n                <h1>\n                    <span class=\"break\">{{ semantic_model.name }}</span>\n                    <small>semantic_model</small>\n\n                    <div class='clearfix'></div>\n                </h1>\n\n            </div>\n        </div>\n        <div class=\"app-frame app-pad-h\">\n            <ul class=\"nav nav-tabs\">\n                <li ui-sref-active='active'><a ui-sref=\"dbt.semantic_model({'#': 'details'})\">Details</a></li>\n                <li ui-sref-active='active'><a ui-sref=\"dbt.semantic_model({'#': 'description'})\">Description</a></li>\n                <li ui-sref-active='active' ng-show = \"parentsLength != 0\"><a ui-sref=\"dbt.semantic_model({'#': 'depends_on'})\">Depends On</a></li>\n            </ul>\n        </div>\n    </div>\n    <div class=\"app-details\">\n        <div class=\"app-frame app-pad\">\n\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"details\"></div>\n                <table-details model=\"semantic_model\" extras=\"extra_table_fields\" />\n            </section>\n\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"description\"></div>\n                <div class=\"section-content\">\n                    <h6>Description</h6>\n                    <div class=\"panel\">\n                        <div class=\"panel-body\">\n                            <div ng-if=\"semantic_model.description\" class=\"model-markdown\" marked=\"semantic_model.description\"></div>\n                            <div ng-if=\"!semantic_model.description\">This {{ semantic_model.resource_type }} is not currently documented</div>\n                        </div>\n                    </div>\n                </div>\n            </section>\n\n            <section class=\"section\" ng-show = \"semantic_model.entities.length != 0\">\n                <div class=\"section-target\" id=\"entities\"></div>\n                <div class=\"section-content\">\n                    <h6>Entities</h6>\n\n                <div class=\"panel\">\n                    <div class=\"detail-group\" style=\"padding-bottom: 0\">\n                        <div class=\"detail-body\" style=\"padding-left: 0\">\n                            <dl class=\"detail\" ng-style=\"{'padding-left': $index == 0 ? 0 : 'auto'}\"\n                                ng-repeat=\"entity in semantic_model.entities\">\n                                <dt class=\"detail-label\">Name</dt>\n                                <dd class=\"detail-value\" ng-if=\"entity.name\">{{ entity.name }}</dd>\n                                <dd class=\"detail-value\" ng-if=\"!entity.name\">None</dd>\n                                <dt class=\"detail-label\">Type</dt>\n                                <dd class=\"detail-value\" ng-if=\"entity.type\">{{ entity.type }}</dd>\n                                <dd class=\"detail-value\" ng-if=\"!entity.type\">None</dd>\n                                <dt class=\"detail-label\">Expression</dt>\n                                <dd class=\"detail-value\" ng-if=\"entity.expr\">{{ entity.expr }}</dd>\n                                <dd class=\"detail-value\" ng-if=\"!entity.expr\">None</dd>\n                            </dl>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </section>\n\n            <section class=\"section\" ng-show = \"parentsLength != 0\">\n                <div class=\"section-target\" id=\"depends_on\"></div>\n                <div class=\"section-content\">\n                    <h6>Depends On</h6>\n                    <reference-list references=\"parents\" node=\"semantic_model\" />\n                </div>\n            </section>\n\n        </div>\n    </div>\n</div>\n`\n        );\n      }\n    ]), L.exports = e;\n  },\n  function(L, T) {\n    var e = \"/docs/operation.html\";\n    window.angular.module(\"ng\").run([\n      \"$templateCache\",\n      function(u) {\n        u.put(\n          e,\n          `<style>\n/* TODO */\n.section-target {\n    top: -8em;\n}\n\n.noflex {\n    flex: 0 0 160px !important;\n}\n\n.highlight {\n    color: #24292e;\n    background-color: white;\n}\n\n</style>\n\n<div class='app-scroll'>\n    <div class=\"app-links app-sticky\">\n        <div class=\"app-title\">\n            <div class=\"app-frame app-pad app-flush-bottom\">\n                <h1>\n                    <span class=\"break\">{{ model.name }}</span>\n                    <small>operation</small>\n                </h1>\n            </div>\n        </div>\n        <div class=\"app-frame app-pad-h\">\n            <ul class=\"nav nav-tabs\">\n                <li ui-sref-active='active'><a ui-sref=\"dbt.operation({'#': 'description'})\">Description</a></li>\n                <li ui-sref-active='active' ng-show = \"parentsLength != 0\"><a ui-sref=\"dbt.operation({'#': 'depends_on'})\">Depends On</a></li>\n                <li ui-sref-active='active'><a ui-sref=\"dbt.operation({'#': 'code'})\">SQL</a></li>\n            </ul>\n        </div>\n    </div>\n    <div class=\"app-details\">\n        <div class=\"app-frame app-pad\">\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"description\"></div>\n                <div class=\"section-content\">\n                    <h6>Description</h6>\n                    <div class=\"panel\">\n                        <div class=\"panel-body\">\n                            <div ng-if=\"model.description\" class=\"model-markdown\" marked=\"model.description\"></div>\n                            <div ng-if=\"!model.description\">This {{ model.resource_type }} is not currently documented</div>\n                        </div>\n                    </div>\n                </div>\n            </section>\n\n            <section class=\"section\" ng-show = \"parentsLength != 0\">\n                <div class=\"section-target\" id=\"depends_on\"></div>\n                <div class=\"section-content\">\n                    <h6>Depends On</h6>\n                    <reference-list references=\"parents\" node=\"model\" />\n                </div>\n            </section>\n\n            <section class=\"section\">\n                <div class=\"section-target\" id=\"code\"></div>\n                <div class=\"section-content\">\n                    <code-block versions=\"versions\" default=\"default_version\" language=\"language\"></code-block>\n                </div>\n            </section>\n        </div>\n    </div>\n</div>\n`\n        );\n      }\n    ]), L.exports = e;\n  }\n]);\nconst oc = {}, Wu = { start: { x: -1, y: -1 }, end: { x: -1, y: -1 } };\nlet qu, Ou = Wu;\nconst ac = (L) => {\n  [\"mousedown\", \"mouseup\", \"selectionchange\"].map((T) => {\n    (L || document).addEventListener(T.toString(), (e) => {\n      if (qu && e.type == \"selectionchange\" && clearTimeout(qu), e.type == \"mousedown\") {\n        const { x: u, y: A } = e;\n        Ou.start = { x: u, y: A };\n      }\n      qu = setTimeout(function() {\n        var u;\n        if (e.type == \"mouseup\" && ((u = window.getSelection()) == null ? void 0 : u.toString()) != \"\") {\n          const { x: A, y: w } = e;\n          Ou.end = { x: A, y: w }, (L || document).dispatchEvent(\n            new CustomEvent(\"selectionend\", { detail: { selectionRange: Ou } })\n          ), Ou = Wu;\n        }\n      }, 100);\n    });\n  });\n}, uc = ({ shareDetails: L, onSelectionEnd: T }) => {\n  const e = rc(null), u = Yu(), A = Xu(\n    (E) => E.docsAppRendered\n  ), w = nc(() => {\n    u(Zu(Qu())), u(Gu(!1)), setTimeout(() => {\n      Ju().forEach((y) => {\n        y && (ac(y), y.removeEventListener(\"selectionend\", T), y.addEventListener(\"selectionend\", T));\n      });\n      const E = Ku();\n      E && (E.innerHTML = E.innerHTML.replace(\n        /\\n\\n/g,\n        `\n<div>\n</div>`\n      ), u(Gu(!0)));\n    }, 100);\n  }, [u, T]);\n  return ic(() => {\n    console.log(\"dbtDocsAngularApp rendered\", !!oc);\n    const E = window.angular;\n    if (E && E.module) {\n      if (E.element(e.current).scope()) {\n        console.log(\"dbt docs already initialized\");\n        return;\n      }\n      if (E.module(\"dbt\").config([\n        \"$httpProvider\",\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        function(x) {\n          const g = [\n            \"$q\",\n            \"$rootScope\",\n            function() {\n              return {\n                request: function(c) {\n                  return c.url.includes(\"manifest.json\") && L.manifest_presigned_url && (c.url = L.manifest_presigned_url), c.url.includes(\"catalog.json\") && L.catalog_presigned_url && (c.url = L.catalog_presigned_url), c;\n                }\n              };\n            }\n          ];\n          x.interceptors.push(g);\n        }\n      ]), E.bootstrap(e.current, [\"dbt\"]), window.addEventListener(\"hashchange\", w), e.current) {\n        const x = () => {\n          var c;\n          A || ((c = e.current) == null ? void 0 : c.querySelector(\n            \".panel-body\"\n          )).innerText !== \"(loading)\" && (u(ec(!0)), o.disconnect());\n        }, g = { attributes: !1, childList: !0, subtree: !0 }, o = new MutationObserver(x);\n        o.observe(e.current, g);\n      }\n    }\n  }, [\n    L.manifest_presigned_url,\n    L.catalog_presigned_url,\n    T,\n    u,\n    A,\n    w\n  ]), /* @__PURE__ */ pr.jsxs(pr.Fragment, { children: [\n    /* @__PURE__ */ pr.jsx(\"div\", { style: { display: \"none\" }, children: /* @__PURE__ */ pr.jsxs(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", viewBox: \"0 0 16 16\", children: [\n      /* @__PURE__ */ pr.jsx(\"title\", { children: \"icons\" }),\n      /* @__PURE__ */ pr.jsx(\"g\", { id: \"icn\", children: /* @__PURE__ */ pr.jsx(\"rect\", { width: \"16\", height: \"16\", fill: \"none\" }) }),\n      /* @__PURE__ */ pr.jsx(\"g\", { id: \"icn-menu\", children: /* @__PURE__ */ pr.jsx(\n        \"path\",\n        {\n          d: \"M14.5,8a.5.5,0,0,1-.5.5H2a.5.5,0,0,1,0-1H14A.5.5,0,0,1,14.5,8ZM2,3H14a.5.5,0,0,0,0-1H2A.5.5,0,0,0,2,3ZM14,13H2a.5.5,0,0,0,0,1H14a.5.5,0,0,0,0-1Z\",\n          transform: \"translate(0 0)\"\n        }\n      ) }),\n      /* @__PURE__ */ pr.jsx(\"g\", { id: \"icn-dbt\", children: /* @__PURE__ */ pr.jsx(\n        \"path\",\n        {\n          d: \"M12.6,9.265l0,0L10.9,6.325a3.31,3.31,0,0,0-.529-.7h0a3.264,3.264,0,0,0-3.184-.867,4.022,4.022,0,0,1,4.194.938,3.977,3.977,0,0,1,.635.833l.38.657a2.488,2.488,0,0,1,.2-.465l2.226-3.851a1.2,1.2,0,0,0-.2-1.5,1.2,1.2,0,0,0-1.5-.2h0L9.27,3.4a2.539,2.539,0,0,1-2.54,0L2.877,1.178A1.253,1.253,0,0,0,2.247,1a1.247,1.247,0,0,0-.871.375,1.2,1.2,0,0,0-.2,1.5L3.4,6.726a2.542,2.542,0,0,1,0,2.539l-2.226,3.85a1.2,1.2,0,0,0,.2,1.5,1.2,1.2,0,0,0,1.5.2L6.73,12.588a2.455,2.455,0,0,1,.465-.2l-.657-.379a3.857,3.857,0,0,1-1.462-1.467,4.118,4.118,0,0,1-.288-3.368,3.453,3.453,0,0,0,.33,2.507A3.141,3.141,0,0,0,6.329,10.89l2.94,1.7h0l3.853,2.224a1.243,1.243,0,0,0,1.7-1.7Zm.814-7.353a.478.478,0,1,1,0,.676A.48.48,0,0,1,13.41,1.912ZM2.59,2.588a.478.478,0,1,1,0-.676A.479.479,0,0,1,2.59,2.588Zm0,11.49a.478.478,0,1,1,0-.676A.479.479,0,0,1,2.59,14.078Zm6.827-5.9a1.022,1.022,0,1,0-1.231,1.23,1.433,1.433,0,1,1,1.231-1.23Zm4.67,5.9a.478.478,0,1,1,0-.676A.479.479,0,0,1,14.087,14.078Z\",\n          transform: \"translate(0 0)\"\n        }\n      ) }),\n      /* @__PURE__ */ pr.jsx(\"g\", { id: \"icn-doc-on\", children: /* @__PURE__ */ pr.jsx(\n        \"path\",\n        {\n          d: \"M13.707,4.707,10.293,1.293A1,1,0,0,0,9.586,1H3A1,1,0,0,0,2,2V14a1,1,0,0,0,1,1H13a1,1,0,0,0,1-1V5.414A1,1,0,0,0,13.707,4.707ZM5,4H9V5H5Zm6,8H5V11h6Zm0-2H5V9h6Zm0-2H5V7h6Z\",\n          transform: \"translate(0 0)\"\n        }\n      ) }),\n      /* @__PURE__ */ pr.jsxs(\"g\", { id: \"icn-doc\", children: [\n        /* @__PURE__ */ pr.jsx(\n          \"path\",\n          {\n            d: \"M9.586,2h0L13,5.414V14H3V2H9.586m0-1H3A1,1,0,0,0,2,2V14a1,1,0,0,0,1,1H13a1,1,0,0,0,1-1V5.414a1,1,0,0,0-.293-.707L10.293,1.293A1,1,0,0,0,9.586,1Z\",\n            transform: \"translate(0 0)\"\n          }\n        ),\n        /* @__PURE__ */ pr.jsx(\"rect\", { x: \"5\", y: \"11\", width: \"6\", height: \"1\", fill: \"#fff\" }),\n        /* @__PURE__ */ pr.jsx(\"polygon\", { points: \"11 11 5 11 5 12 11 12 11 11 11 11\" }),\n        /* @__PURE__ */ pr.jsx(\"rect\", { x: \"5\", y: \"9\", width: \"6\", height: \"1\", fill: \"#fff\" }),\n        /* @__PURE__ */ pr.jsx(\"polygon\", { points: \"11 9 5 9 5 10 11 10 11 9 11 9\" }),\n        /* @__PURE__ */ pr.jsx(\"rect\", { x: \"5\", y: \"7\", width: \"6\", height: \"1\", fill: \"#fff\" }),\n        /* @__PURE__ */ pr.jsx(\"polygon\", { points: \"11 7 5 7 5 8 11 8 11 7 11 7\" }),\n        /* @__PURE__ */ pr.jsx(\"rect\", { x: \"5\", y: \"4\", width: \"4\", height: \"1\", fill: \"#fff\" }),\n        /* @__PURE__ */ pr.jsx(\"polygon\", { points: \"9 4 5 4 5 5 9 5 9 4 9 4\" })\n      ] }),\n      /* @__PURE__ */ pr.jsx(\"g\", { id: \"icn-down\", children: /* @__PURE__ */ pr.jsx(\n        \"path\",\n        {\n          d: \"M8,10.5a.5.5,0,0,1-.354-.146l-3-3a.5.5,0,0,1,.708-.708L8,9.293l2.646-2.647a.5.5,0,0,1,.708.708l-3,3A.5.5,0,0,1,8,10.5Z\",\n          transform: \"translate(0 0)\"\n        }\n      ) }),\n      /* @__PURE__ */ pr.jsx(\"g\", { id: \"icn-up\", children: /* @__PURE__ */ pr.jsx(\n        \"path\",\n        {\n          d: \"M11,9.5a.5.5,0,0,1-.354-.146L8,6.707,5.354,9.354a.5.5,0,0,1-.708-.708l3-3a.5.5,0,0,1,.708,0l3,3A.5.5,0,0,1,11,9.5Z\",\n          transform: \"translate(0 0)\"\n        }\n      ) }),\n      /* @__PURE__ */ pr.jsx(\"g\", { id: \"icn-left\", children: /* @__PURE__ */ pr.jsx(\n        \"path\",\n        {\n          d: \"M9.5,5a.5.5,0,0,1-.146.354L6.707,8l2.647,2.646a.5.5,0,0,1-.708.708l-3-3a.5.5,0,0,1,0-.708l3-3A.5.5,0,0,1,9.5,5Z\",\n          transform: \"translate(0 0)\"\n        }\n      ) }),\n      /* @__PURE__ */ pr.jsx(\"g\", { id: \"icn-right\", children: /* @__PURE__ */ pr.jsx(\n        \"path\",\n        {\n          d: \"M10.5,8a.5.5,0,0,1-.146.354l-3,3a.5.5,0,0,1-.708-.708L9.293,8,6.646,5.354a.5.5,0,0,1,.708-.708l3,3A.5.5,0,0,1,10.5,8Z\",\n          transform: \"translate(0 0)\"\n        }\n      ) }),\n      /* @__PURE__ */ pr.jsx(\"g\", { id: \"icn-dir\", children: /* @__PURE__ */ pr.jsx(\n        \"path\",\n        {\n          d: \"M14,4H8.414a1,1,0,0,1-.707-.293L6.293,2.293A1,1,0,0,0,5.586,2H2A1,1,0,0,0,1,3V13a1,1,0,0,0,1,1H14a1,1,0,0,0,1-1V5A1,1,0,0,0,14,4ZM2,3H5.586l1,1H2ZM14,13H2V5H14Z\",\n          transform: \"translate(0 0)\"\n        }\n      ) }),\n      /* @__PURE__ */ pr.jsx(\"g\", { id: \"icn-tree\", children: /* @__PURE__ */ pr.jsx(\n        \"path\",\n        {\n          d: \"M14,5V2H11V3H4V2H1V5H4V4H7V14h4v1h3V12H11v1H8V9h3v1h3V7H11V8H8V4h3V5ZM3,4H2V3H3Zm9,9h1v1H12Zm0-5h1V9H12Zm0-5h1V4H12Z\",\n          transform: \"translate(0 0)\"\n        }\n      ) }),\n      /* @__PURE__ */ pr.jsx(\"g\", { id: \"icn-tree-on\", children: /* @__PURE__ */ pr.jsx(\n        \"path\",\n        {\n          d: \"M14,5V2H11V3H4V2H1V5H4V4H7V14h4v1h3V12H11v1H8V9h3v1h3V7H11V8H8V4h3V5Z\",\n          transform: \"translate(0 0)\"\n        }\n      ) }),\n      /* @__PURE__ */ pr.jsx(\"g\", { id: \"icn-dir-on\", children: /* @__PURE__ */ pr.jsx(\n        \"path\",\n        {\n          d: \"M14.878,7H14V5a1,1,0,0,0-1-1H7.414a1,1,0,0,1-.707-.293L5.293,2.293A1,1,0,0,0,4.586,2H1A1,1,0,0,0,0,3V13a1,1,0,0,0,1,1H13.271a1,1,0,0,0,.952-.694l1.607-5A1,1,0,0,0,14.878,7ZM4.586,3,6,4.414A1.986,1.986,0,0,0,7.414,5H13V7H2.979a1,1,0,0,0-.952.694L1,10.889V3Z\",\n          transform: \"translate(0 0)\"\n        }\n      ) }),\n      /* @__PURE__ */ pr.jsx(\"g\", { id: \"icn-db-on\", children: /* @__PURE__ */ pr.jsx(\n        \"path\",\n        {\n          d: \"M8,1C7,1,2,1.121,2,3.5v9C2,14.879,7,15,8,15s6-.121,6-2.5v-9C14,1.121,9,1,8,1Zm5,10.482c0,.828-2.239,1.5-5,1.5s-5-.672-5-1.5V11c1.511.915,4.281.982,5,.982s3.489-.067,5-.982ZM13,8.5c0,.828-2.239,1.5-5,1.5S3,9.328,3,8.5V8.018C4.511,8.933,7.281,9,8,9s3.489-.067,5-.982Zm0-3C13,6.328,10.761,7,8,7S3,6.328,3,5.5V5.018C4.511,5.933,7.281,6,8,6s3.489-.067,5-.982Z\",\n          transform: \"translate(0 0)\"\n        }\n      ) }),\n      /* @__PURE__ */ pr.jsx(\"g\", { id: \"icn-db\", children: /* @__PURE__ */ pr.jsx(\n        \"path\",\n        {\n          d: \"M8,1C7,1,2,1.121,2,3.5v9C2,14.879,7,15,8,15s6-.121,6-2.5v-9C14,1.121,9,1,8,1ZM3,8.018C4.511,8.933,7.281,9,8,9s3.489-.067,5-.982V9.5c0,.828-2.239,1.5-5,1.5s-5-.672-5-1.5ZM8,8C5.239,8,3,7.328,3,6.5V5.018C4.511,5.933,7.281,6,8,6s3.489-.067,5-.982V6.5C13,7.328,10.761,8,8,8ZM8,2c2.761,0,5,.672,5,1.5S10.761,5,8,5,3,4.328,3,3.5,5.239,2,8,2ZM8,14c-2.761,0-5-.672-5-1.5V11.018C4.511,11.933,7.281,12,8,12s3.489-.067,5-.982V12.5C13,13.328,10.761,14,8,14Z\",\n          transform: \"translate(0 0)\"\n        }\n      ) }),\n      /* @__PURE__ */ pr.jsx(\"g\", { id: \"icn-close\", children: /* @__PURE__ */ pr.jsx(\n        \"path\",\n        {\n          d: \"M12.354,11.646a.5.5,0,0,1-.708.708L8,8.707,4.354,12.354a.5.5,0,0,1-.708-.708L7.293,8,3.646,4.354a.5.5,0,0,1,.708-.708L8,7.293l3.646-3.647a.5.5,0,0,1,.708.708L8.707,8Z\",\n          transform: \"translate(0 0)\"\n        }\n      ) }),\n      /* @__PURE__ */ pr.jsx(\"g\", { id: \"icn-search\", children: /* @__PURE__ */ pr.jsx(\n        \"path\",\n        {\n          d: \"M6.5,1A5.5,5.5,0,1,0,12,6.5,5.5,5.5,0,0,0,6.5,1Zm0,10A4.5,4.5,0,1,1,11,6.5,4.505,4.505,0,0,1,6.5,11Zm8.854,4.354a.5.5,0,0,1-.708,0l-3-3a.5.5,0,0,1,.708-.708l3,3A.5.5,0,0,1,15.354,15.354Z\",\n          transform: \"translate(0 0)\"\n        }\n      ) }),\n      /* @__PURE__ */ pr.jsx(\"g\", { id: \"icn-more\", children: /* @__PURE__ */ pr.jsx(\n        \"path\",\n        {\n          d: \"M8,6a2,2,0,1,0,2,2A2,2,0,0,0,8,6ZM8,9A1,1,0,1,1,9,8,1,1,0,0,1,8,9ZM2,6A2,2,0,1,0,4,8,2,2,0,0,0,2,6ZM2,9A1,1,0,1,1,3,8,1,1,0,0,1,2,9ZM14,6a2,2,0,1,0,2,2A2,2,0,0,0,14,6Zm0,3a1,1,0,1,1,1-1A1,1,0,0,1,14,9Z\",\n          transform: \"translate(0 0)\"\n        }\n      ) }),\n      /* @__PURE__ */ pr.jsxs(\"g\", { id: \"icn-flow\", children: [\n        /* @__PURE__ */ pr.jsx(\n          \"path\",\n          {\n            d: \"M4,3V2H1V5H4V4H7v9a1,1,0,0,0,1,1h5V13H8V9h5V8H8V4h5V3H4ZM3,4H2V3H3Z\",\n            transform: \"translate(0 0)\"\n          }\n        ),\n        /* @__PURE__ */ pr.jsx(\"polygon\", { points: \"13 1.5 13 5.5 15 3.5 13 1.5\" }),\n        /* @__PURE__ */ pr.jsx(\"polygon\", { points: \"13 6.5 13 10.5 15 8.5 13 6.5\" }),\n        /* @__PURE__ */ pr.jsx(\"polygon\", { points: \"13 11.5 13 15.5 15 13.5 13 11.5\" })\n      ] }),\n      /* @__PURE__ */ pr.jsx(\"g\", { id: \"icn-expand\", children: /* @__PURE__ */ pr.jsx(\n        \"path\",\n        {\n          d: \"M6,2.5a.5.5,0,0,1-.5.5H3V5.5a.5.5,0,0,1-1,0v-3A.5.5,0,0,1,2.5,2h3A.5.5,0,0,1,6,2.5ZM13.5,2h-3a.5.5,0,0,0,0,1H13V5.5a.5.5,0,0,0,1,0v-3A.5.5,0,0,0,13.5,2Zm0,8a.5.5,0,0,0-.5.5V13H10.5a.5.5,0,0,0,0,1h3a.5.5,0,0,0,.5-.5v-3A.5.5,0,0,0,13.5,10Zm-8,3H3V10.5a.5.5,0,0,0-1,0v3a.5.5,0,0,0,.5.5h3a.5.5,0,0,0,0-1Z\",\n          transform: \"translate(0 0)\"\n        }\n      ) }),\n      /* @__PURE__ */ pr.jsx(\"g\", { id: \"icn-contract\", children: /* @__PURE__ */ pr.jsx(\n        \"path\",\n        {\n          d: \"M6,2.5v3a.5.5,0,0,1-.5.5h-3a.5.5,0,0,1,0-1H5V2.5a.5.5,0,0,1,1,0ZM10.5,6h3a.5.5,0,0,0,0-1H11V2.5a.5.5,0,0,0-1,0v3A.5.5,0,0,0,10.5,6Zm3,4h-3a.5.5,0,0,0-.5.5v3a.5.5,0,0,0,1,0V11h2.5a.5.5,0,0,0,0-1Zm-8,0h-3a.5.5,0,0,0,0,1H5v2.5a.5.5,0,0,0,1,0v-3A.5.5,0,0,0,5.5,10Z\",\n          transform: \"translate(0 0)\"\n        }\n      ) }),\n      /* @__PURE__ */ pr.jsx(\"g\", { id: \"icn-filter\", children: /* @__PURE__ */ pr.jsx(\n        \"path\",\n        {\n          d: \"M14.5,4.5A.5.5,0,0,1,14,5H2A.5.5,0,0,1,2,4H14A.5.5,0,0,1,14.5,4.5ZM12,8H4A.5.5,0,0,0,4,9h8a.5.5,0,0,0,0-1Zm-2,4H6a.5.5,0,0,0,0,1h4a.5.5,0,0,0,0-1Z\",\n          transform: \"translate(0 0)\"\n        }\n      ) })\n    ] }) }),\n    /* @__PURE__ */ pr.jsx(\"div\", { ref: e, className: tc.dbtDocs, children: /* @__PURE__ */ pr.jsx(\"ui-view\", {}) })\n  ] });\n};\nexport {\n  uc as default\n};\n"
  },
  {
    "path": "webview_panels/src/lib/altimate/altimate-components.d.ts",
    "content": "import { BadgeProps } from 'reactstrap';\r\nimport { ButtonHTMLAttributes } from 'react';\r\nimport { ButtonProps } from 'reactstrap';\r\nimport { CaseReducerActions } from '@reduxjs/toolkit';\r\nimport { ChatMessage } from '@ant-design/pro-chat';\r\nimport { ComponentType } from 'react';\r\nimport { Dispatch } from 'react';\r\nimport { ForwardRefExoticComponent } from 'react';\r\nimport { JSX as JSX_2 } from 'react/jsx-runtime';\r\nimport { PayloadAction } from '@reduxjs/toolkit';\r\nimport { ProChatProps } from '@ant-design/pro-chat/es/ProChat/container';\r\nimport { ReactNode } from 'react';\r\nimport { RefAttributes } from 'react';\r\nimport { UnknownAction } from '@reduxjs/toolkit';\r\nimport { WritableDraft } from 'immer';\r\nimport { z } from 'zod';\r\n\r\nexport declare const ApiHelper: {\r\n    get: <T>(_url: string, _data?: Record<string, unknown>, _request?: RequestInit) => Promise<T>;\r\n    post: <T>(_url: string, _data: Record<string, unknown>, _request?: RequestInit) => Promise<T>;\r\n};\r\n\r\nexport declare const Badge: ({ tooltip, ...props }: Props_5) => JSX_2.Element;\r\n\r\nexport declare const Chatbot: ({ loading, onRequest, sessionId: sessionIdProp, onFollowupRequest, frontendUrl, ...props }: Props_9) => JSX_2.Element;\r\n\r\nexport declare const ChatTriggerLink: ({ text }: {\r\n    text: string;\r\n}) => JSX_2.Element;\r\n\r\nexport declare interface Citation {\r\n    id: string;\r\n    content: string;\r\n    taskLabel: TaskLabels;\r\n}\r\n\r\nexport declare const Citations: ({ citations, frontendUrl, }: {\r\n    citations?: Citation[];\r\n    frontendUrl: string;\r\n}) => JSX.Element | null;\r\n\r\nexport declare class CLL {\r\n    static isCancelled: boolean;\r\n    static inProgress: boolean;\r\n    static linkCount: number;\r\n    static onCancel(): void;\r\n    static cancel(): void;\r\n    static start(): void;\r\n    static end(): void;\r\n    static addLinks(n: number): void;\r\n    static showCllInProgressMsg(): void;\r\n}\r\n\r\nexport declare enum CllEvents {\r\n    CANCEL = \"cancel\",\r\n    END = \"end\",\r\n    START = \"start\"\r\n}\r\n\r\nexport declare interface CoachAiConfirmationResponse {\r\n    ok: boolean;\r\n    train_doc_uid: string;\r\n    frontend_url: string;\r\n}\r\n\r\nexport declare interface CoachAiResponse {\r\n    ai_response: string;\r\n    category: string;\r\n    personalizationScope: string;\r\n}\r\n\r\nexport declare const CoachForm: (props: CoachFormProps) => JSX_2.Element;\r\n\r\nexport declare const CoachFormButton: ({}: Props_10) => JSX_2.Element;\r\n\r\ndeclare interface CoachFormProps {\r\n    taskLabel: keyof typeof TaskLabels;\r\n    context?: Record<string, unknown>;\r\n    extra?: Record<string, unknown>;\r\n    onClose: (data?: unknown) => void;\r\n}\r\n\r\nexport declare const CodeBlock: ({ code, language, fileName, editorTheme, theme, showLineNumbers, className, titleActions, }: Props_4) => JSX.Element;\r\n\r\nexport declare interface CollectColumn {\r\n    column: string;\r\n    viewsType?: ViewsTypes;\r\n}\r\n\r\nexport declare interface Column {\r\n    name: string;\r\n    table: string;\r\n    datatype?: string;\r\n    can_lineage_expand: boolean;\r\n    description: string;\r\n    meta?: Map<any, any>;\r\n}\r\n\r\nexport declare interface ColumnLineage {\r\n    source: [string, string];\r\n    target: [string, string];\r\n    type: string;\r\n    viewsType?: ViewsTypes;\r\n    viewsCode?: [string, string][];\r\n}\r\n\r\nexport declare interface Columns {\r\n    id: string;\r\n    purpose: string;\r\n    columns: Column[];\r\n}\r\n\r\nexport declare interface Confidence {\r\n    confidence: string;\r\n    operator_list?: string[];\r\n}\r\n\r\nexport declare enum ContentCategory {\r\n    TERM_CLARIFICATION = \"TermClarification\",\r\n    GENERAL_GUIDELINES = \"GeneralGuidelines\",\r\n    BUSINESS_EXPLANATION = \"BusinessExplanation\"\r\n}\r\n\r\nexport declare interface Conversation {\r\n    timestamp: string;\r\n    user_id: number;\r\n    message: string;\r\n    conversation_id: number;\r\n}\r\n\r\nexport declare interface ConversationGroup {\r\n    owner: number;\r\n    conversation_group_id: number;\r\n    conversations: Conversation[];\r\n    status: \"Pending\" | \"Expired\";\r\n    meta: {\r\n        field?: \"description\";\r\n        column?: string;\r\n        filePath: string;\r\n        highlight: string;\r\n        uniqueId?: string;\r\n        resource_type?: string;\r\n        range: {\r\n            end: {\r\n                line: number;\r\n                character: number;\r\n            };\r\n            start: {\r\n                line: number;\r\n                character: number;\r\n            };\r\n        };\r\n    };\r\n}\r\n\r\nexport declare const ConversationGroupProvider: ({ currentUser, conversationGroup, shareId, onSelect, isSelected, users, onResolve, onReplyAdd, source, }: Props_8) => JSX.Element | null;\r\n\r\nexport declare const ConversationInputForm: ({ comment, setComment, loading, users, currentUser, placeholder, onEnterKeypress, }: Props_7) => JSX_2.Element;\r\n\r\nexport declare enum ConversationSources {\r\n    DBT_DOCS = \"dbt-docs\",\r\n    DOCUMENTATION_EDITOR = \"documentation-editor\",\r\n    SAAS = \"saas\"\r\n}\r\n\r\nexport declare const DbtDocs: ({ shareId, userId, conversationGroupId, source }: Props_6) => JSX_2.Element;\r\n\r\nexport declare interface DbtDocsShareDetails {\r\n    catalog_presigned_url?: string;\r\n    manifest_presigned_url?: string;\r\n    share_id: number;\r\n}\r\n\r\nexport declare type Details = Record<string, {\r\n    columns?: {\r\n        name: string;\r\n        datatype?: string;\r\n        expression?: string;\r\n    }[];\r\n    sql?: string;\r\n    nodeType?: string;\r\n    nodeId?: string;\r\n    name?: string;\r\n    type: string;\r\n    purpose?: string;\r\n}>;\r\n\r\nexport declare interface ExposureMetaData {\r\n    description?: string;\r\n    depends_on: {\r\n        macros: [string];\r\n        nodes: [string];\r\n        sources: [string];\r\n    };\r\n    label?: string;\r\n    maturity?: string;\r\n    name: string;\r\n    owner: {\r\n        email: string;\r\n        name: string;\r\n    };\r\n    tags: [string];\r\n    url?: string;\r\n    type: string;\r\n    config: {\r\n        enabled: boolean;\r\n    };\r\n    path: string;\r\n    unique_id: string;\r\n    sources?: [string];\r\n    metrics?: unknown[];\r\n    meta?: Record<string, unknown>;\r\n}\r\n\r\nexport declare const IconButton: (props: Props) => JSX.Element;\r\n\r\nexport declare interface Learning extends z.infer<typeof learningSchema> {\r\n}\r\n\r\nexport declare const Learnings: ({ filters, learning }: Props_11) => JSX_2.Element;\r\n\r\nexport declare const learningSchema: z.ZodObject<{\r\n    train_doc_uid: z.ZodString;\r\n    userId: z.ZodString;\r\n    display_name: z.ZodString;\r\n    taskLabel: z.ZodString;\r\n    category: z.ZodEnum<[string, ...string[]]>;\r\n    personalizationScope: z.ZodDefault<z.ZodEnum<[string, ...string[]]>>;\r\n    createdDate: z.ZodString;\r\n    updatedDate: z.ZodString;\r\n    content: z.ZodString;\r\n    metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;\r\n    isActive: z.ZodDefault<z.ZodBoolean>;\r\n}, \"strip\", z.ZodTypeAny, {\r\n    content: string;\r\n    display_name: string;\r\n    userId: string;\r\n    train_doc_uid: string;\r\n    taskLabel: string;\r\n    category: string;\r\n    personalizationScope: string;\r\n    createdDate: string;\r\n    updatedDate: string;\r\n    isActive: boolean;\r\n    metadata?: Record<string, unknown> | undefined;\r\n}, {\r\n    content: string;\r\n    display_name: string;\r\n    userId: string;\r\n    train_doc_uid: string;\r\n    taskLabel: string;\r\n    category: string;\r\n    createdDate: string;\r\n    updatedDate: string;\r\n    metadata?: Record<string, unknown> | undefined;\r\n    personalizationScope?: string | undefined;\r\n    isActive?: boolean | undefined;\r\n}>;\r\n\r\nexport declare const Lineage: ForwardRefExoticComponent<LineageProviderProps & RefAttributes<LineageRef>>;\r\n\r\ndeclare interface LineageProviderProps {\r\n    dynamicLineage?: {\r\n        node?: Table;\r\n        aiEnabled: boolean;\r\n    };\r\n    sqlLineage?: SqlLineage;\r\n    staticLineage?: StaticLineage;\r\n    theme: \"dark\" | \"light\";\r\n    lineageType: LineageType;\r\n    allowSyncColumnsWithDB?: boolean;\r\n    externalSidePanel?: boolean;\r\n}\r\n\r\nexport declare interface LineageRef {\r\n    rerender: () => void;\r\n}\r\n\r\ndeclare type LineageType = \"static\" | \"dynamic\" | \"sql\";\r\n\r\nexport declare const LoadingButton: ({ loading, ...rest }: Props_3) => JSX.Element;\r\n\r\nexport declare interface ModalArgs {\r\n    type: \"none\" | \"views_code\" | \"op_node\";\r\n    args?: ViewsCodeModalArgs | OpNodeArgs;\r\n}\r\n\r\nexport declare interface OpNodeArgs {\r\n    op_type: string;\r\n    op_code: string;\r\n}\r\n\r\nexport declare enum PersonalizationScope {\r\n    USER_SPECIFIC = \"UserSpecific\",\r\n    ALL_USERS = \"AllUsers\"\r\n}\r\n\r\nexport declare enum ProjectGovernorAllowedFiles {\r\n    Manifest = \"Manifest\",\r\n    Catalog = \"Catalog\"\r\n}\r\n\r\nexport declare interface ProjectGovernorCheck extends z.infer<typeof ProjectGovernorCheckSchema> {\r\n    id: string;\r\n}\r\n\r\nexport declare interface ProjectGovernorCheckConfirmationResponse {\r\n    ok: boolean;\r\n}\r\n\r\nexport declare interface ProjectGovernorCheckFormValues {\r\n    description: string;\r\n    type: ProjectGovernorCheckTypes;\r\n}\r\n\r\nexport declare const ProjectGovernorCheckSchema: z.ZodObject<{\r\n    name: z.ZodString;\r\n    alias: z.ZodString;\r\n    type: z.ZodEnum<[string, ...string[]]>;\r\n    description: z.ZodString;\r\n    files_required: z.ZodArray<z.ZodEnum<[string, ...string[]]>, \"many\">;\r\n    config: z.ZodRecord<z.ZodString, z.ZodUnknown>;\r\n}, \"strip\", z.ZodTypeAny, {\r\n    type: string;\r\n    name: string;\r\n    description: string;\r\n    alias: string;\r\n    files_required: string[];\r\n    config: Record<string, unknown>;\r\n}, {\r\n    type: string;\r\n    name: string;\r\n    description: string;\r\n    alias: string;\r\n    files_required: string[];\r\n    config: Record<string, unknown>;\r\n}>;\r\n\r\nexport declare enum ProjectGovernorCheckTypes {\r\n    DOCUMENTATION = \"documentation\",\r\n    TESTS = \"tests\",\r\n    MODEL = \"model\",\r\n    FILE_STRUCTURE = \"file_structure\"\r\n}\r\n\r\nexport declare interface ProjectGovernorCheckValidateResponse {\r\n    name: string;\r\n    description: string;\r\n}\r\n\r\ndeclare interface Props extends ButtonHTMLAttributes<HTMLButtonElement> {\r\n    color?: string;\r\n}\r\n\r\ndeclare interface Props_10 {\r\n}\r\n\r\ndeclare interface Props_11 {\r\n    filters?: {\r\n        taskLabel?: keyof typeof TaskLabels;\r\n    };\r\n    learning?: string | null;\r\n}\r\n\r\ndeclare interface Props_12 {\r\n    onSelect: (selected: (typeof TeamMatesConfig)[0], action: TeamMateActionType) => Promise<boolean | undefined>;\r\n    client: keyof typeof TeamMateAvailability;\r\n}\r\n\r\ndeclare interface Props_2 {\r\n    children: ReactNode;\r\n    title?: string | ReactNode;\r\n    id?: string;\r\n    className?: string;\r\n}\r\n\r\ndeclare interface Props_3 extends ButtonProps {\r\n    loading: boolean;\r\n}\r\n\r\ndeclare interface Props_4 {\r\n    code: string;\r\n    language: \"sql\" | \"yaml\" | \"markdown\" | \"json\" | \"javascript\";\r\n    fileName?: string;\r\n    showLineNumbers?: boolean;\r\n    editorTheme?: \"vs\" | \"vsc-dark-plus\" | \"solarizedLight\" | \"tomorrow\";\r\n    theme: \"light\" | \"dark\";\r\n    className?: string;\r\n    titleActions?: ReactNode;\r\n}\r\n\r\ndeclare interface Props_5 extends BadgeProps {\r\n    tooltip: Parameters<typeof Tooltip>[0][\"title\"];\r\n}\r\n\r\ndeclare interface Props_6 {\r\n    shareId: number;\r\n    userId?: number;\r\n    conversationGroupId?: number;\r\n    source: ConversationSources;\r\n}\r\n\r\ndeclare interface Props_7 {\r\n    comment: string;\r\n    setComment: (comment: string) => void;\r\n    loading: boolean;\r\n    users: User[];\r\n    currentUser: User | null;\r\n    placeholder?: string;\r\n    onEnterKeypress?: () => void;\r\n}\r\n\r\ndeclare interface Props_8 {\r\n    currentUser?: User;\r\n    conversationGroup?: ConversationGroup;\r\n    shareId?: DbtDocsShareDetails[\"share_id\"];\r\n    isSelected: boolean;\r\n    users: Record<User[\"id\"], User>;\r\n    onSelect: () => void;\r\n    onResolve: () => void;\r\n    onReplyAdd: () => void;\r\n    source: ConversationSources;\r\n}\r\n\r\ndeclare interface Props_9 extends ProChatProps<any> {\r\n    loading?: boolean;\r\n    onRequest: (messages: ChatMessage[], sessionId: string, onStatusUpdate: (info: StatusInfoMessage) => void) => any;\r\n    sessionId?: string;\r\n    onFollowupRequest?: (sessionId: string) => Promise<string[] | undefined>;\r\n    frontendUrl: string;\r\n}\r\n\r\nexport declare interface SelectedColumn {\r\n    name: string;\r\n    table: string;\r\n}\r\n\r\ndeclare interface SqlLineage {\r\n    tableEdges: [string, string][];\r\n    details: StaticLineageDetails;\r\n    errorMessage?: undefined;\r\n    nodePositions?: Record<string, [number, number]>;\r\n}\r\n\r\nexport declare interface StaticLineage {\r\n    selectedColumn: {\r\n        table: string;\r\n        name: string;\r\n    };\r\n    collectColumns: Record<string, CollectColumn[]>;\r\n    columnEdges?: [string, string, string][];\r\n    tableEdges: [string, string][];\r\n    details: Details;\r\n}\r\n\r\nexport declare type StaticLineageDetails = Record<string, {\r\n    columns?: {\r\n        name: string;\r\n        expression?: string;\r\n        datatype?: string;\r\n    }[];\r\n    name?: string;\r\n    sql?: string;\r\n    type: string;\r\n    nodeId?: string;\r\n    node_id?: string;\r\n    nodeType?: string;\r\n    expression?: string;\r\n    join_type?: string;\r\n}>;\r\n\r\nexport declare interface StatusInfoMessage {\r\n    type: \"info\" | \"agent_outcome\" | \"citations\";\r\n    message: string;\r\n    citations?: Citation[];\r\n    id?: string;\r\n}\r\n\r\nexport declare interface Table {\r\n    table: string;\r\n    label: string;\r\n    url?: string;\r\n    nodeType: string;\r\n    materialization?: string;\r\n    downstreamCount: number;\r\n    upstreamCount: number;\r\n    isExternalProject: boolean;\r\n    tests: {\r\n        key: string;\r\n        path: string;\r\n    }[];\r\n    schema?: string;\r\n    meta?: Map<any, any>;\r\n}\r\n\r\nexport declare enum TaskLabels {\r\n    DocGen = \"DocGen\",\r\n    ChartBot = \"ChartBot\",\r\n    SqlBot = \"SqlExpert\",\r\n    OpportunitiesBot = \"OpportunitiesBot\",\r\n    ProjectGovernor = \"ProjectGovernor\"\r\n}\r\n\r\nexport declare const TeammateActions: CaseReducerActions<    {\r\nsetShowCoachingForm: (state: WritableDraft<TeamMateState>, action: PayloadAction<TeamMateState[\"showCoachingForm\"]>) => void;\r\n}, \"teamMate\">;\r\n\r\nexport declare enum TeamMateActionType {\r\n    SEE_IN_ACTION = \"SEE_IN_ACTION\",\r\n    REQUEST_ACCESS = \"REQUEST_ACCESS\",\r\n    VIEW_DETAILS = \"VIEW_DETAILS\"\r\n}\r\n\r\nexport declare enum TeamMateAvailability {\r\n    EXTENSION = \"VSCode Extension\",\r\n    SAAS = \"SaaS\"\r\n}\r\n\r\nexport declare interface TeamMateConfig {\r\n    name: string;\r\n    avatar: string;\r\n    description: string;\r\n    availability: TeamMateAvailability[];\r\n    key: TaskLabels;\r\n    seeInAction?: boolean;\r\n    comingSoon?: boolean;\r\n    displayComponent?: ComponentType<any>;\r\n    formComponent?: ComponentType<any>;\r\n}\r\n\r\nexport declare interface TeamMateContextProps {\r\n    state: TeamMateState;\r\n    dispatch: Dispatch<UnknownAction>;\r\n}\r\n\r\nexport declare const TeamMateProvider: ({ children, }: {\r\n    children: ReactNode;\r\n}) => JSX.Element;\r\n\r\nexport declare const TeamMates: ({ onSelect, client }: Props_12) => JSX_2.Element;\r\n\r\nexport declare const TeamMatesConfig: TeamMateConfig[];\r\n\r\nexport declare interface TeamMateState {\r\n    showCoachingForm: boolean;\r\n}\r\n\r\nexport declare const Tooltip: (props: Props_2) => JSX.Element;\r\n\r\ndeclare interface User {\r\n    display_name: string;\r\n    first_name: string;\r\n    last_name: string;\r\n    id: number;\r\n}\r\n\r\nexport declare const useTeamMateContext: () => TeamMateContextProps;\r\n\r\ndeclare const VIEWS_TYPE_COLOR: {\r\n    Original: string;\r\n    Alias: string;\r\n    Transformation: string;\r\n    Unchanged: string;\r\n    \"Not sure\": string;\r\n    \"Non select\": string;\r\n};\r\n\r\nexport declare interface ViewsCodeModalArgs {\r\n    table: string;\r\n    column: string;\r\n    viewsType: ViewsTypes;\r\n    viewsCode: Record<string, [string, string][]>;\r\n    nodeType: string;\r\n}\r\n\r\ndeclare type ViewsTypes = keyof typeof VIEWS_TYPE_COLOR;\r\n\r\nexport { }\r\n\ndeclare global {\n    interface HTMLElementEventMap {\n        selectionend: CustomEvent;\n    }\n}\n\n"
  },
  {
    "path": "webview_panels/src/lib/altimate/altimate-components.js",
    "content": "import { A as s, B as t, m as n, p as r, o as i, q as C, n as c, t as m, v as l, C as T, F as p, k as v, i as g, h, D as L, I as u, y as M, l as P, L as d, P as k, N as A, O as B, M as y, G as F, K as G, J as b, r as S, z as j, E as x, x as D, T as I, H as f, w } from \"./main.js\";\nimport \"reactstrap\";\nexport {\n  s as ApiHelper,\n  t as Badge,\n  n as CLL,\n  r as ChatTriggerLink,\n  i as Chatbot,\n  C as Citations,\n  c as CllEvents,\n  m as CoachForm,\n  l as CoachFormButton,\n  T as CodeBlock,\n  p as ContentCategory,\n  v as ConversationGroupProvider,\n  g as ConversationInputForm,\n  h as ConversationSources,\n  L as DbtDocs,\n  u as IconButton,\n  M as Learnings,\n  P as Lineage,\n  d as LoadingButton,\n  k as PersonalizationScope,\n  A as ProjectGovernorAllowedFiles,\n  B as ProjectGovernorCheckSchema,\n  y as ProjectGovernorCheckTypes,\n  F as TaskLabels,\n  G as TeamMateActionType,\n  b as TeamMateAvailability,\n  S as TeamMateProvider,\n  j as TeamMates,\n  x as TeamMatesConfig,\n  D as TeammateActions,\n  I as Tooltip,\n  f as learningSchema,\n  w as useTeamMateContext\n};\n"
  },
  {
    "path": "webview_panels/src/lib/altimate/main.css",
    "content": "@font-face {\n  font-family: codicon;\n  font-display: block;\n  src: url(data:font/ttf;base64,AAEAAAALAIAAAwAwR1NVQiCLJXoAAAE4AAAAVE9TLzI3T0ZkAAABjAAAAGBjbWFwL+qkfQAACMgAABmUZ2x5ZsaPozMAACXMAADp0GhlYWRYl6BTAAAA4AAAADZoaGVhAlsC4gAAALwAAAAkaG10eAFN//oAAAHsAAAG3GxvY2GbvtQ4AAAiXAAAA3BtYXhwAtgBgQAAARgAAAAgbmFtZZP2uUoAAQ+cAAAB+HBvc3RTBRrQAAERlAAAF9gAAQAAASwAAAAAASz////+AS4AAQAAAAAAAAAAAAAAAAAAAbcAAQAAAAEAAP3wtIdfDzz1AAsBLAAAAAB8JbCAAAAAAHwlsID////9AS4BLQAAAAgAAgAAAAAAAAABAAABtwF1ABcAAAAAAAIAAAAKAAoAAAD/AAAAAAAAAAEAAAAKADAAPgACREZMVAAObGF0bgAaAAQAAAAAAAAAAQAAAAQAAAAAAAAAAQAAAAFsaWdhAAgAAAABAAAAAQAEAAQAAAABAAgAAQAGAAAAAQAAAAQBKwGQAAUAAADLANIAAAAqAMsA0gAAAJAADgBNAAACAAUDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBmRWQAwOpg7B4BLAAAABsBRwADAAAAAQAAAAAAAAAAAAAAAAACAAAAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLP//ASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASz//wEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLP//ASwAAAEsAAABLAAAASwAAAEs//8BLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASz//wEsAAABLAAAASwAAAEs//8BLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAAAAAUAAAADAAAALAAAAAQAAATwAAEAAAAAA+oAAwABAAAALAADAAoAAATwAAQDvgAAABAAEAADAADqiOqM6sfqyesJ607sHv//AADqYOqK6o/qyerM6wvrUP//AAAAAAAAAAAAAAAAAAAAAQAQAGAAZADUANQBTgHUAAAAAwDmATsBOACvASkBgAEXAVsBAQFgAEwBrAFOAVcBVgCMADUBIgCBAMUA8wBAAX4AdgAWAakAlgCDATUBEAEHAQgBkwC/AKEAswGLAWsAhgF8AWQBcwFxAWUBdAF7AXYBbwC1AWoBeAACAAQABQAKAAsADAANAA4ADwAQABIAGgAcAB0AHgBZAFoAWwBcAF8AYAAhACIAIwAkACUAKAAqACsALAAtAC4ALwAxADIAMwA0ADsAOAA8AD0APgA/AEEAQgBEAEYARwBJAFIAUwBUAFUAZABmAGgAawBvAHEAcgBzAHQAdQB3AHgAeQB6AHsAfAB9AH4AfwCAAIIAhACHAIoAiwCOAI8AkACRAJIAkwCUAJUAlwCZAJoAmwCcAJ0AngCgAKMApAClAI8ApgCnAKkAsACxALQAtgC6ALsAvgDAAMEAwgDDAMkAygDLAMwAzQDOAM8A0ADlAOcA6ADrAO4A7wDwAPEA9QD2APkA+gD7AQABAgEDAQQBBgEKAQsBDgEPARIBEwEaAR4BHwEgASEBIwEkASUBJgEnASgBLQEuAS8BMAExATIBMwE0ATYBNwE5AToBPAE9AT4BPwFAAUEBQgFHAUgBSQFKAUsBTQFSAVMBVAFVAVgBWgFdAV4BXwFhAWIBZgFnAWgBaQFsAW0BbgFwAXIBdQF3AXkBggGDAYwBjQGPAZEBkgGUAZUBlgGXAZgBnAGeAZ8BoAGjAaQBpQGnAagBrQGuAa8BsAGxAbUBtgDpAOoA7ADtAF0AXgBtADkAbgBhAXoAbABwAGoAWAAmACcA/ACIAI0AvAGdAAEAFwBiAOQBEQFEAX0BHACyAVEBUAEVAWMBHQErAFcBpgBDAP0AiQC3APQBDQEsACkBGwEUADYANwBIAX8BoQGbAZkBmgCrAUMBRQEMAGkBsgG0AbMBhQGGAYcBiAGJAYoBhAARAFEBFgCYAasAZwDHANMA0gDRAE8ATgBNABQAyACqAKwAVgBlAUYAnwBjABUAuAC5ARkAHwAgAPIAEwGiAQkA4wDUANUA2gDYANkA3ADdAN8A4QDiANcA1gGBAMQBKgCFAAYABwAIAAkA4ADbAN4AGwC9APgA9wA6ABkAGABLAK0ArgFMAEoBTwFcAMYA/wGOAZAARQFZAKIBqgAwARgBBQD+AKgAUAAAAQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAUpAAAAAAAAAG3AADqYAAA6mAAAAADAADqYQAA6mEAAADmAADqYgAA6mIAAAE7AADqYwAA6mMAAAE4AADqZAAA6mQAAACvAADqZQAA6mUAAAEpAADqZgAA6mYAAAGAAADqZwAA6mcAAAEXAADqaAAA6mgAAAFbAADqaQAA6mkAAAEBAADqagAA6moAAAFgAADqawAA6msAAABMAADqbAAA6mwAAAGsAADqbQAA6m0AAAFOAADqbgAA6m4AAAFXAADqbwAA6m8AAAFWAADqcAAA6nAAAACMAADqcQAA6nEAAAA1AADqcgAA6nIAAAEiAADqcwAA6nMAAACBAADqdAAA6nQAAADFAADqdQAA6nUAAADzAADqdgAA6nYAAABAAADqdwAA6ncAAAF+AADqeAAA6ngAAAB2AADqeQAA6nkAAAAWAADqegAA6noAAAGpAADqewAA6nsAAACWAADqfAAA6nwAAACDAADqfQAA6n0AAAE1AADqfgAA6n4AAAEQAADqfwAA6n8AAAEHAADqgAAA6oAAAAEIAADqgQAA6oEAAAGTAADqggAA6oIAAAC/AADqgwAA6oMAAAChAADqhAAA6oQAAACzAADqhQAA6oUAAAGLAADqhgAA6oYAAAFrAADqhwAA6ocAAACGAADqiAAA6ogAAAF8AADqigAA6ooAAAFkAADqiwAA6osAAAFzAADqjAAA6owAAAFxAADqjwAA6o8AAAFlAADqkAAA6pAAAAF0AADqkQAA6pEAAAF7AADqkgAA6pIAAAF2AADqkwAA6pMAAAFvAADqlAAA6pQAAAC1AADqlQAA6pUAAAFqAADqlgAA6pYAAAF4AADqlwAA6pcAAAACAADqmAAA6pgAAAAEAADqmQAA6pkAAAAFAADqmgAA6poAAAAKAADqmwAA6psAAAALAADqnAAA6pwAAAAMAADqnQAA6p0AAAANAADqngAA6p4AAAAOAADqnwAA6p8AAAAPAADqoAAA6qAAAAAQAADqoQAA6qEAAAASAADqogAA6qIAAAAaAADqowAA6qMAAAAcAADqpAAA6qQAAAAdAADqpQAA6qUAAAAeAADqpgAA6qYAAABZAADqpwAA6qcAAABaAADqqAAA6qgAAABbAADqqQAA6qkAAABcAADqqgAA6qoAAABfAADqqwAA6qsAAABgAADqrAAA6qwAAAAhAADqrQAA6q0AAAAiAADqrgAA6q4AAAAjAADqrwAA6q8AAAAkAADqsAAA6rAAAAAlAADqsQAA6rEAAAAoAADqsgAA6rIAAAAqAADqswAA6rMAAAArAADqtAAA6rQAAAAsAADqtQAA6rUAAAAtAADqtgAA6rYAAAAuAADqtwAA6rcAAAAvAADquAAA6rgAAAAxAADquQAA6rkAAAAyAADqugAA6roAAAAzAADquwAA6rsAAAA0AADqvAAA6rwAAAA7AADqvQAA6r0AAAA4AADqvgAA6r4AAAA8AADqvwAA6r8AAAA9AADqwAAA6sAAAAA+AADqwQAA6sEAAAA/AADqwgAA6sIAAABBAADqwwAA6sMAAABCAADqxAAA6sQAAABEAADqxQAA6sUAAABGAADqxgAA6sYAAABHAADqxwAA6scAAABJAADqyQAA6skAAABSAADqzAAA6swAAABTAADqzQAA6s0AAABUAADqzgAA6s4AAABVAADqzwAA6s8AAABkAADq0AAA6tAAAABmAADq0QAA6tEAAABoAADq0gAA6tIAAABrAADq0wAA6tMAAABvAADq1AAA6tQAAABxAADq1QAA6tUAAAByAADq1gAA6tYAAABzAADq1wAA6tcAAAB0AADq2AAA6tgAAAB1AADq2QAA6tkAAAB3AADq2gAA6toAAAB4AADq2wAA6tsAAAB5AADq3AAA6twAAAB6AADq3QAA6t0AAAB7AADq3gAA6t4AAAB8AADq3wAA6t8AAAB9AADq4AAA6uAAAAB+AADq4QAA6uEAAAB/AADq4gAA6uIAAACAAADq4wAA6uMAAACCAADq5AAA6uQAAACEAADq5QAA6uUAAACHAADq5gAA6uYAAACKAADq5wAA6ucAAACLAADq6AAA6ugAAACOAADq6QAA6ukAAACPAADq6gAA6uoAAACQAADq6wAA6usAAACRAADq7AAA6uwAAACSAADq7QAA6u0AAACTAADq7gAA6u4AAACUAADq7wAA6u8AAACVAADq8AAA6vAAAACXAADq8QAA6vEAAACZAADq8gAA6vIAAACaAADq8wAA6vMAAACbAADq9AAA6vQAAACcAADq9QAA6vUAAACdAADq9gAA6vYAAACeAADq9wAA6vcAAACgAADq+AAA6vgAAACjAADq+QAA6vkAAACkAADq+gAA6voAAAClAADq+wAA6vsAAACPAADq/AAA6vwAAACmAADq/QAA6v0AAACnAADq/gAA6v4AAACpAADq/wAA6v8AAACwAADrAAAA6wAAAACxAADrAQAA6wEAAAC0AADrAgAA6wIAAAC2AADrAwAA6wMAAAC6AADrBAAA6wQAAAC7AADrBQAA6wUAAAC+AADrBgAA6wYAAADAAADrBwAA6wcAAADBAADrCAAA6wgAAADCAADrCQAA6wkAAADDAADrCwAA6wsAAADJAADrDAAA6wwAAADKAADrDQAA6w0AAADLAADrDgAA6w4AAADMAADrDwAA6w8AAADNAADrEAAA6xAAAADOAADrEQAA6xEAAADPAADrEgAA6xIAAADQAADrEwAA6xMAAADlAADrFAAA6xQAAADnAADrFQAA6xUAAADoAADrFgAA6xYAAADrAADrFwAA6xcAAADuAADrGAAA6xgAAADvAADrGQAA6xkAAADwAADrGgAA6xoAAADxAADrGwAA6xsAAAD1AADrHAAA6xwAAAD2AADrHQAA6x0AAAD5AADrHgAA6x4AAAD6AADrHwAA6x8AAAD7AADrIAAA6yAAAAEAAADrIQAA6yEAAAECAADrIgAA6yIAAAEDAADrIwAA6yMAAAEEAADrJAAA6yQAAAEGAADrJQAA6yUAAAEKAADrJgAA6yYAAAELAADrJwAA6ycAAAEOAADrKAAA6ygAAAEPAADrKQAA6ykAAAESAADrKgAA6yoAAAETAADrKwAA6ysAAAEaAADrLAAA6ywAAAEeAADrLQAA6y0AAAEfAADrLgAA6y4AAAEgAADrLwAA6y8AAAEhAADrMAAA6zAAAAEjAADrMQAA6zEAAAEkAADrMgAA6zIAAAElAADrMwAA6zMAAAEmAADrNAAA6zQAAAEnAADrNQAA6zUAAAEoAADrNgAA6zYAAAEtAADrNwAA6zcAAAEuAADrOAAA6zgAAAEvAADrOQAA6zkAAAEwAADrOgAA6zoAAAExAADrOwAA6zsAAAEyAADrPAAA6zwAAAEzAADrPQAA6z0AAAE0AADrPgAA6z4AAAE2AADrPwAA6z8AAAE3AADrQAAA60AAAAE5AADrQQAA60EAAAE6AADrQgAA60IAAAE8AADrQwAA60MAAAE9AADrRAAA60QAAAE+AADrRQAA60UAAAE/AADrRgAA60YAAAFAAADrRwAA60cAAAFBAADrSAAA60gAAAFCAADrSQAA60kAAAFHAADrSgAA60oAAAFIAADrSwAA60sAAAFJAADrTAAA60wAAAFKAADrTQAA600AAAFLAADrTgAA604AAAFNAADrUAAA61AAAAFSAADrUQAA61EAAAFTAADrUgAA61IAAAFUAADrUwAA61MAAAFVAADrVAAA61QAAAFYAADrVQAA61UAAAFaAADrVgAA61YAAAFdAADrVwAA61cAAAFeAADrWAAA61gAAAFfAADrWQAA61kAAAFhAADrWgAA61oAAAFiAADrWwAA61sAAAFmAADrXAAA61wAAAFnAADrXQAA610AAAFoAADrXgAA614AAAFpAADrXwAA618AAAFsAADrYAAA62AAAAFtAADrYQAA62EAAAFuAADrYgAA62IAAAFwAADrYwAA62MAAAFyAADrZAAA62QAAAF1AADrZQAA62UAAAF3AADrZgAA62YAAAF5AADrZwAA62cAAAGCAADraAAA62gAAAGDAADraQAA62kAAAGMAADragAA62oAAAGNAADrawAA62sAAAGPAADrbAAA62wAAAGRAADrbQAA620AAAGSAADrbgAA624AAAGUAADrbwAA628AAAGVAADrcAAA63AAAAGWAADrcQAA63EAAAGXAADrcgAA63IAAAGYAADrcwAA63MAAAGcAADrdAAA63QAAAGeAADrdQAA63UAAAGfAADrdgAA63YAAAGgAADrdwAA63cAAAGjAADreAAA63gAAAGkAADreQAA63kAAAGlAADregAA63oAAAGnAADrewAA63sAAAGoAADrfAAA63wAAAGtAADrfQAA630AAAGuAADrfgAA634AAAGvAADrfwAA638AAAGwAADrgAAA64AAAAGxAADrgQAA64EAAAG1AADrggAA64IAAAG2AADrgwAA64MAAADpAADrhAAA64QAAADqAADrhQAA64UAAADsAADrhgAA64YAAADtAADrhwAA64cAAABdAADriAAA64gAAABeAADriQAA64kAAABtAADrigAA64oAAAA5AADriwAA64sAAABuAADrjAAA64wAAABhAADrjQAA640AAAF6AADrjgAA644AAABsAADrjwAA648AAABwAADrkAAA65AAAABqAADrkQAA65EAAABYAADrkgAA65IAAAAmAADrkwAA65MAAAAnAADrlAAA65QAAAD8AADrlQAA65UAAACIAADrlgAA65YAAACNAADrlwAA65cAAAC8AADrmAAA65gAAAGdAADrmQAA65kAAAABAADrmgAA65oAAAAXAADrmwAA65sAAABiAADrnAAA65wAAADkAADrnQAA650AAAERAADrngAA654AAAFEAADrnwAA658AAAF9AADroAAA66AAAAEcAADroQAA66EAAACyAADrogAA66IAAAFRAADrowAA66MAAAFQAADrpAAA66QAAAEVAADrpQAA66UAAAFjAADrpgAA66YAAAEdAADrpwAA66cAAAErAADrqAAA66gAAABXAADrqQAA66kAAAGmAADrqgAA66oAAABDAADrqwAA66sAAAD9AADrrAAA66wAAACJAADrrQAA660AAAC3AADrrgAA664AAAD0AADrrwAA668AAAENAADrsAAA67AAAAEsAADrsQAA67EAAAApAADrsgAA67IAAAEbAADrswAA67MAAAEUAADrtAAA67QAAAA2AADrtQAA67UAAAA3AADrtgAA67YAAABIAADrtwAA67cAAAF/AADruAAA67gAAAGhAADruQAA67kAAAGbAADrugAA67oAAAGZAADruwAA67sAAAGaAADrvAAA67wAAACrAADrvQAA670AAAFDAADrvgAA674AAAFFAADrvwAA678AAAEMAADrwAAA68AAAABpAADrwQAA68EAAAGyAADrwgAA68IAAAG0AADrwwAA68MAAAGzAADrxAAA68QAAAGFAADrxQAA68UAAAGGAADrxgAA68YAAAGHAADrxwAA68cAAAGIAADryAAA68gAAAGJAADryQAA68kAAAGKAADrygAA68oAAAGEAADrywAA68sAAAARAADrzAAA68wAAABRAADrzQAA680AAAEWAADrzgAA684AAACYAADrzwAA688AAAGrAADr0AAA69AAAABnAADr0QAA69EAAADHAADr0gAA69IAAADTAADr0wAA69MAAADSAADr1AAA69QAAADRAADr1QAA69UAAABPAADr1gAA69YAAABOAADr1wAA69cAAABNAADr2AAA69gAAAAUAADr2QAA69kAAADIAADr2gAA69oAAACqAADr2wAA69sAAACsAADr3AAA69wAAABWAADr3QAA690AAABlAADr3gAA694AAAFGAADr3wAA698AAACfAADr4AAA6+AAAABjAADr4QAA6+EAAAAVAADr4gAA6+IAAAC4AADr4wAA6+MAAAC5AADr5AAA6+QAAAEZAADr5QAA6+UAAAAfAADr5gAA6+YAAAAgAADr5wAA6+cAAADyAADr6AAA6+gAAAATAADr6QAA6+kAAAGiAADr6gAA6+oAAAEJAADr6wAA6+sAAADjAADr7AAA6+wAAADUAADr7QAA6+0AAADVAADr7gAA6+4AAADaAADr7wAA6+8AAADYAADr8AAA6/AAAADZAADr8QAA6/EAAADcAADr8gAA6/IAAADdAADr8wAA6/MAAADfAADr9AAA6/QAAADhAADr9QAA6/UAAADiAADr9gAA6/YAAADXAADr9wAA6/cAAADWAADr+AAA6/gAAAGBAADr+QAA6/kAAADEAADr+gAA6/oAAAEqAADr+wAA6/sAAACFAADr/AAA6/wAAAAGAADr/QAA6/0AAAAHAADr/gAA6/4AAAAIAADr/wAA6/8AAAAJAADsAAAA7AAAAADgAADsAQAA7AEAAADbAADsAgAA7AIAAADeAADsAwAA7AMAAAAbAADsBAAA7AQAAAC9AADsBQAA7AUAAAD4AADsBgAA7AYAAAD3AADsBwAA7AcAAAA6AADsCAAA7AgAAAAZAADsCQAA7AkAAAAYAADsCgAA7AoAAABLAADsCwAA7AsAAACtAADsDAAA7AwAAACuAADsDQAA7A0AAAFMAADsDgAA7A4AAABKAADsDwAA7A8AAAFPAADsEAAA7BAAAAFcAADsEQAA7BEAAADGAADsEgAA7BIAAAD/AADsEwAA7BMAAAGOAADsFAAA7BQAAAGQAADsFQAA7BUAAABFAADsFgAA7BYAAAFZAADsFwAA7BcAAACiAADsGAAA7BgAAAGqAADsGQAA7BkAAAAwAADsGgAA7BoAAAEYAADsGwAA7BsAAAEFAADsHAAA7BwAAAD+AADsHQAA7B0AAACoAADsHgAA7B4AAABQAAAAAACUANQA6AEUATIBbAGmAeACGgIuAkICVgJqAn4CkgKmAsgC3gL8A04DqAPUBCoEkATgBS4FLgVcBa4FygZqBx4HXgfoCAYIbgjgCZgKTAqSCroKzAsUCyYLOAtKC1wLpAu+C9AL3Av6DCYMVAy4DO4NAg0qDVINwA3yDkAOeg6UDuoPRA+MD7AQPBBoEI4Q7BEmEXoRsBHUEkISoBLqE54TwhPsE/gUahS+FSgViBXqFiAWRBZcFmwWfBaIFpwWqhbOF0wXZheAF84YPhhqGHwYthkAGTAZShlyGY4ZpBnWGfgaHBpQGmga6BsYGz4bjBuqG9Ab8BwUHDAcUhyEHLAc0hz6HSYdTh2GHd4eYB6SHqwe5B9CH4Qf6CBEIHwgziE2IX4hxCIEImoijCK6Iswi6CNsI4ojpiPCJBAkTiSCJLAlIiWUJgwmWCaCJwInKCeuKEIovilGKZAp1CpoKqYrSCvCLFws3i0cLTAtdi2aLcYuBi4sLoouui8cL1gvhi/MMCwwXDB6MMgw/DEgMY4x5DIgMlAynjNWM4gz7jRWNKo07DUaNTI1SjVoNZA1tDXWNfQ2EjYwNkg2ZjZ+Npw2tDbMNwY3QjeUN9Q3+DhaOHI4jjkkOTw5XDmOOfI6EDpiOo46vDsCOyg7SDtgO4w7sjviPEI8XDyyPPQ9SD1yPa495j4mPlo+qj7cPwo/RD9iP6Y/zkBUQI5BCEFSQjZCbkKgQwZDKkN4Q9pEMkRuRLRFCEWARdRGJkY8RmxGskbqRwJHKkdKR6pH3khoSMZJKElaSapJ1ko8SmxKkkrqSwZLFEvOTDRMWEzSTRpNik3wTjxOlE7CTvJPTE+oUAJQKlBOUHJQklC2URJRTFGMUbJR5lIgUmpSyFL6UxhTVFPgVEpUxFUMVYJVulX0Vk5WwlcIV3RYOlhYWHZZZFmWWaxZ0locWjxablqyW0JbZFueW95cAlwuXFBchl0cXVBdfF3CXnpepF8kX2Bfyl/yYCxgomDeYSJhZGGgYeZiMmKKYq5i+GOQY+hl6GeeZ8pn7mhaaIJormjGaPRpRml0acZqZGqeaq5qvmrOat5rPmt+a75sCGxObL5s6G02bbxuWG6IbtpvDG9Ib55v4HAscExwvnEYcThxdnGicfxyGnLec05z8HRodKx06AAEAAD//wEsASwAEQAiADQAZAAAJTQuASIOARUUFh8BFjI/AT4BByInNz4EMzIeARcWFwYnJjQ+AjIeAhQOAQcGJy4BFzA9AS4BJyYnNjc2NzYnNi4CIg4CFRQeARcWFwYHDgEHFS4BNTQ+ATIeARUUBgEsKEVSRSgcGQ0mXCYOGByWKSIBAwoOEBUKDx0VBgMCIlgECA0SFhEOCAgOCRMUCA6HBBEMCQsFBAcFCgEBCxQaHRoTCwYICAQFCgkMEQUSFCM8SDwjE5YpRSgoRSkhPBUKGhoKFTxiGAcKEQ4KBQsVDggJGIsJFBINCQgOEhURDgQICAQOWwEBDhgJBwUDBAcIEBQOGhQKChQaDgoTDggEBAQHCRgPARIwGiQ8IyM8JBowAAAAAAIAAAAAARoBGgAaACgAACUWDgEHNCc+ATcuAw4BByYjPgIzMh4CByIOARQeATI+ATQuASMBGQEUIhYDGSIBARAdIx4TAgkKAxglFREfGAyyFycWFicuJxcXJxfFFiUYAgoJAyUaER4SAQ8cEQMVIhQMGB8aFycuJxYWJy4nFgAAAQAAAAABBwEaAAsAACUVIxUjNSM1MzUzFQEHcRNwcBOpE3BwE3BwAAQAAAAAARoBGgANABIAFgAaAAABIwcVFzMVFzM3NTM3NQcjNTMVBzUzFScjFTMBEPQJCQoJzgoJCRzX4c+8JnBwARkJOAqfCQmfCjgvJiaplpZxEwAAAAABAAAAAAESAMwADwAANxcHJzU3FwczJzcXFQcnNzgoDTg4DSi8KA04OA0ogygNOA05DigoDjkNOA0oAAADAAAAAAEHAQcACQAWACMAADcXNTMVNxcHIyc3NC4BIg4BFB4BMj4BJxQOASIuATQ+ATIeAWUoEyYOOA04sB8zPjMeHjM+Mx8TGSwyLBkZLDIsGZQobGomDTc3Dx8zHx8zPjMeHjMfGSwZGSwyLBkZLAAAAAMAAAAAAQcBBwAJABcAJAAANyczNSM3JwcVFzcyHgEUDgIuAj4BFxUiDgEUHgEyPgE0LgGUKGxqJg03Nw8fMx8fMz4zHgEfMx8ZLBkZLDIsGRksZSgTJg44DTiwHzM+Mx4BHzM+Mx8BEhksMiwZGSwyLBkAAwAAAAABBwEHAAkAFgAjAAA3FyMVMwcXNzUnBwYuAj4BMh4BFA4BJzI+ATQuASIOARQeAZgobGomDTc3Dx8zHgEfMz4zHx8zHxksGRksMiwZGSzHKBMmDjgNOK8BHzM+Mx8fMz4zHhIZLDIsGRksMiwZAAADAAAAAAEHAQcACQAWACMAAD8BFTM1FzcnIwcXFA4CLgI+ATIeAQc0LgEiDgEUHgEyPgFlKBMmDjgNOLAfMz4zHgEfMz4zHxMZLDIsGRksMiwZmChsaiYNNzcPHzMeAR8zPjMfHzMfGSwZGSwyLBkZLAAAAAEAAAAAAQQBBwAJAAA3FzM3Jwc1IxUnO14NXg1OE06DXV0OTsTETgABAAAAAAEHAPMACQAANwcVFzcnMzUjN4NdXQ5OxMRO8l4NXg5NE04AAQAAAAABBwDxAAkAAD8BNScHFyMVMwepXl4OTsPDTihdDl0NThJOAAEAAAAAAMkA4QAJAAA3ByMnNxc1MxU3yS8NLw0fEx+KLy8NHmhoHwABAAAAAADRAM8ACQAANyc1NxcHMxUjF3ovLw0faWkfYy8NLw0fEx4AAQAAAAAA0QDPAAkAADcXFQcnNyM1MyeiLy8NHmhoHs4vDS8OHhMfAAEAAAAAAMkA4QAJAAA/ATMXBycVIzUHXi8NLw0fEx+yLy8NH2lpHwACAAAAAAEaARsACQATAAA3JzU3FwczFSMXPwE1JwcXIxUzB088PA0s6eksgTw8DSzp6SwSPA08DSwTLHY8DTwNLBMsAAEAAAAAAQQBBwAJAAAlJyMHFzcVMzUXAQReDV4NThNNqV5eDk7Dw04AAAAAAgAAAAABGgEaAAcADwAAJRUHJxUnFzUXJxUPARUXNQEZQWY6qAFeVhol6KA1JSVLDZABOSUaIUsRYQAAAwAAAAABIgEaABsAJwA2AAAlJy4BByMiBg8BBh4COwEyNj8BFxY7ATI+AgciLwEzNxccAQ4BIzMjNi8BMx4BFRcWDgIjASBLAgoHWAYKAkwCAgUJBTcFCgIMOAUGWAQJBQJrAgJsORQqAgQBV0UCAkxFAgRMAQECAgIs4QUIAQcF4QUJCAMHBiErAwQHCQgBUDR9AQMDAQYH4QECAuEBAwICAAAEAAAAAAEaARoAHQAsADUAPQAANzMmJyM3MzQ3Izc1MxUXNjcnNTM1IxUzFQcGHgI3NjMyHgIVFA4BLgI2FxYXMjcnBhUUNxc2NTQmIyI4XgsISx0bAhMkJgEJCQETcBJJAgEFCHISFw8cFQsZKi0gCRIUERcSD08KGE4LIRgSEwgKOQkJSE5PAwQCAUsTEkuOBQkJBIkNDBUbDxcmEQkgLCpZEAELTg4SGEZPDxIXIQAAAAADAAAAAAEKARoADwAWABoAACUnNTM1IxUzFQcGFjsBMjYnNzUzFRcjBzczFwEESBJwE0oECwq8CguIAiYkbicdgh0ujUsTEkuOChERkAROT0dLOTkAAAAAAwAAAAABGgEbACoAMQA6AAA3BiMVFB8BIzc2PQE0PgIXMzY3JicmDgIdARQPARczFBYyNjUzNycmNQcyNicjFBY3MjY0JiIGFBb0CQoIB7UHCQ0XHw8DBQcGBxQmHRAHCwhCFh8WQgkLB14HDAElC1MXISEuISGYAgQaGRQVGRkpEB4VCgIJBwIBAg0bJBQpFhYhDQ8WFg8NIRYWbQsICAuEIS4hIS4hAAAAAAYAAAAAASoBJgAVACcALgAzADgAQQAAEwYHIgcOAh0BFA8BNzY9ATQ+Ah8BBgcWHwEjBzMUFjI2NTM3JyYHBiImNTMWNyYnNxcPARc3JhcyNjQmIgYUFqIKBwkKDxcNBBwGBxAdJhRVCQoCBgd6EgwWHxZCCQsGUgYPCyUBdQYHCw2ClA2VBzMXISEuISEBGAgKAwUVHhApEREdExYWKRQkGw0CkQMBExIUEw8WFg8NIRFMBgsICN0HBwoNZ5UNlQYBIS4hIS4hAAAAAAQAAAAAASoBJgAVACcALgAyAAATJicmDgIdARQHNzY9ATQ+AhcWFwczJyY9ATcVFB8BByMUBiImJxcyNicjFBYHARcBzxUbFCYdEAcZAQ0XHw8UED1sBwgTBwsJQhYfFQEmBwwBJQt7AQkN/vcBBRAEAg0bJBQpFhUZCQkpEB4VCgIDDKwUGRoWEykWFiENDxYVDxILCAgLCQEJDf73AAADAAAAAAEGARsAGgAhADQAADcmPQE0LgInJg4CHQEUDwEXMxQWMjY1MzcHBiImNTMWJzc2PQE0PgIXFhceAR0BFB8B+wcMGB8SFCYdEAcLCEIWHxZCCWMGDwslAW4HCQ0XHw8eEwkKCAdmFRcmEiEbEQICDRskFCkXFSENDxYWDw0aBgsICBsVGBopEB4VCgIEFgsbDiYaGRQAAAADAAAAAADhAPQADgAWAB4AADc1MzIWFRQGBx4BFRQGIycVMzI2NTQjJzMyNjQmKwFePx8gEA0QEiIeKioSFCUrJxAUEhMmOLwaGA0VBQQYERkdWEQSECIUEB0OAAkAAAAAARoBBwAQABcAHgAiACYAKgAuADIANgAAASMPAS8BIwcVFzMXMzczNzUHLwEjNTMfASMPATU3MwcjFTMVIxUzJzMVIzcjFTMHMxUjFTMVIwEQZwcMDAdnCQljEA4QYwmMBAZdWQ56XgcCDVqWOTk5OTk5Obw4ODg4ODg4AQcDDAwDCrsKEBAKu7gDA6kOmwMCoQ0mEjkSOBM4EhMTExIAAgAAAAAA9AEaAAgADgAAEyMHFRc3Fzc1BycjBzUz6qgKEU1NERNEDkSWARkJ9AZWVgb020tL0gADAAAAAAEaAQcARwBxAH0AADcxIyIOAh0BFA4CBx4DHQEUHgI7ARUjIi4BJzEmJzUmNzU0JzEmJzUmJzEmKwE1MzI+ATcxNj0BJjcxNjcxPgI7ARczNSMiJzEmJzUmJzEmPQE2JzUmJzEuAisBFTMyHgIdARQeAhcjFgciDgEeAj4BNTQmcQIGCgcEAgQHBQUHBAIEBwoGAgIJEA0DAwEBAQICBAMFBQYBAQYKBwICAQEBAwMNEAkClAICBgUFAwQCAgEBAQMDDRAJAQEGCgcEAgQHBQEPFxEcDQYYIh8TIfQECAoGGQYMCwgEBAgLDAYZBgoIBBIGDQgIBwEICBAGBQUDAQMCAxIFBwUFBhAICAgICA0HehIDAgMBAwUFBhAICAEHCAgNBxMECAoGGQYMCwgEAhETHyIYBg0cERchAAQAAAAAARoBBwBHAHEAfgCKAAA3MSMiDgIdARQOAgceAx0BFB4COwEVIyIuAScxJic1Jjc1NCcxJic1JicxJisBNTMyPgE3MTY9ASY3MTY3MT4COwEXMzUjIicxJic1JicxJj0BNic1JicxLgIrARUzMh4CHQEUHgIXIxYHNjMyFhUUDgEuAjYXBycHFwcXNxc3JzdxAgYKBwQCBAcFBQcEAgQHCgYCAgkQDQMDAQEBAgIEAwUFBgEBBgoHAgIBAQEDAw0QCQKUAgIGBQUDBAICAQEBAwMNEAkBAQYKBwQCBAcFAQ82DhEXIRMfIhgGDUIVFQ4WFg4VFQ4WFvQECAoGGQYMCwgEBAgLDAYZBgoIBBIGDQgIBwEICBAGBQUDAQMCAxIFBwUFBhAICAgICA0HehIDAgMBAwUFBhAICAEHCAgNBxMECAoGGQYMCwgEAhoJIRcRHA0GGCIfAhYWDhUVDhYWDhUVAAUAAAAAARoBBwANABEAGwAfACkAACUjNScjBxUjBxUXMzc1JzMVIxcVBzUnIwcVJzUXFSM1BzUXFRczNzU3FQEQQgleCUIJCfQJqEtLlksKOAlLgyZdSwk4CkvhHAoKHAmWCgqWHBMTDioJCgoJKw04ExNLYCsGCQkGKl8AAAAABAAAAAABBwEaACIAPwBbAGQAABM2MzIeARcOAQc1MTY9AT4CJicuAQ4CFhcVFBcVLgI2FwYjFRQGKwEwIzEuAT0BIiY9ATQ2OwEyFh0BFAc3FAcWHQE+AiYnLgEOAhYXNTQ3Jj4CHgEHIxQGIiY0NjIWWBwiHzMeAQEpIQkRFwkHChE2OSgJGhkJHigIG3ICBAUEFAEEBAQFCwgSCAsDGQkGCQsBCwkNJCMaCQsNBgkBFB4eEwEeCxALCxALAQYTHjQeJDoMAQkLAwkgJicQGRUMKzo1DgMMCAELMUA6pwMvBAUBBAQvBQQmCAsLCCYEAlsPDQkKAgkZHBkJDgoKGiQjDQILCQ0fGgkLGRAICwsQCwsAAwAAAAABGgEaAAcACwAPAAATMxcVByMnNRcVMzUnMzUjHPQJCfQJE+Hh4eEBGQnhCQnhQpaWEyYAAAAAAwAAAAABGAEaADEAOQBJAAA3NTQmIgYdASMnBxcHBh0BIxU7ARYfAQcXNxceATI2PwEXNyc1NjcxMzUjNTYvATcnByM1NDYyFh0BFxUWFRQOAiIuAjU0NzXMIC0gEB8LHgEJJigBBA0BJQsjAgwfIh8MASQLJQ4FKScBCgEeCx9tFyAXHQkNFhsdHBYMCNgLFiAgFgsfCx4BGhsMEBsVASULIwEOEA8OASQLJgEWGxAMGxoBHgsfCxAXFxALEAEWGRcnHA8PHCcXGRYBAAAAABEAAAAAARoBGgAPABMAFwAbAB8AIwAnACsALwAzADcAOwA/AEMARwBLAE8AAAEjNSMVIzUjFSMHFRczNzUHIzUzNSM1MwcjFTMHMxUjFyMVMzczFSMXIxUzBzMVIzcjFTMXMxUjFyMVMwczFSM3IxUzFzMVIxcjFTMnMxUjARAcE5YTHAkJ9AkS4eHh4bwTExMTExMTEyYSEhISEhISEhISEiYTExMTExMTExMTEyUTExMTExMTEwEHEhISEgrhCQnh16gTE14TEhMTE14TEhMTE4QTExMSExMThBMTExITXhMAAAMAAAAAARoBGgA9AHkAggAANy4BDgEPAgYmLwEmJy4CPwI+AjU0Jy4DIyIPAQ4CFRQeBjMyPgE/ATY1NCYvASYvASYHBiciJicmJy4DNSY+AT8BNjMyHwEWHwEWFA8BDgIUFh8BFjMyNzY/AT4BMh8CFh8BFhUUDwEOATcHMxUjNTMVN+sFCwoHAwYFAwgCKQsLBAYBAwQHAwYDCAULDA0IDAgOBQkDChEYHCAiIRAKEQ0GDggDAwcEBA8EDQcIDh4OHxoNFhAJAQQGBQsDBAIEBwoHBgMCCwQFBAQFRQkMBQUJBgYCBgUEBwkFAwYDBAoFCi9XPl4TV30CAQUFBAYEAwEDJwsMBQgFAwUGAwcJBgwJBQwLCAgOBg0RCg8iISAcGREKBAgFDggMBQoECAQEDgRUAgEJBxIaDRweHg8HDgkFCgQDBggJBwQFAwsDBwoLCgVFCQIEBwYDBAMGCAQFCAMCBAMLBAfjVxNePlcAAwAAAAABGgEaAAgARACAAAA/ASM1MxUjNQcXMh8DHgEVFA8BDgIjIi4GNTQ+AT8BNjMyHgIXFhUUDgEPAgYUFhcWHwEeAT8CPgIHMj4BPwE2JzYvASYvAiYiBg8BDgIjIi8BLgE0PgI/ATY0LwQmIyIPAQ4CBx4DFxYXHgGiVz1dElgxDAkPCAcDAwgOBQ4RChAiISAcGBEKAwgGDggMBw4NCgUIAwYDBwQCBgQLCykCCAMFBgMICQYJDAoFCgQBAQMGAwUJBwQFBgIGAwcKBQwJRQUEBAUHAwUCAwYICQcEAgQDCwQHAwEBCRAWDRofDh6vWBJdPVcjCA4ICAQKBQwIDgUIBAoSGBwgISEQCxANBg4ICAsNBAkMBQkIAwYFAwUIBQwLJwMBAwQGBAUFWgMGBQsDBAIDCAUECAYDBAMGBAUECUUECwwJBwYDBQMFBAcJCAYDBAoECw0HDh8eHA0aEQgJAAAABAAAAAABAgDhAAcADwAkAC8AADcjJyMHIzczFycmJyMGDwEXIzUxBiMiJjU0PwE0IyIHNTYzMhUPAQ4BFRQWMzI2NaYTDz0PEjcREBYBAQEBARe2EQsVDxIiHxUSDw8UJBEYDAwLCQwQUSgokFk+AwYGAz43EBMQDh0FBBoMEAomDwQBCAsHChENAAAEAAAAAAElAPQABgAKAAwAEwAAJQcjJzcXNwc3Jw8BFwcXByMnNxcBJZIOOg40i5BSDVASCikLDw46DjTprVMKSaRtYgteFg8VDxFTCkkAAAEAAAAAAQ8A+gAGAAAlBy8BNxc3AQ+fDz8POJfuvAFZC0+yAAgAAAAAARoBBwAGAAoADgASABYAHQAkACsAADcjJzcXNx8BMxUjFTMVIxcjFTMHMxUjJzM3JwcnBxcjJzcXNxcHMzcnBycHRg0TDQ0aDhuWlpaWlpaWlpaWSg0iDhoNDSANEw0NGg4vDSIOGg0N2BQNDRsOBRMlEyYSJhNoIQ0aDQ5MFA0NGw1aIQ0aDQ0AAAEAAAAAAPMAwQAGAAA/ARcHIyc3llEMWAtYDG9SDFdXDAAAAAEAAAAAAMEA9AAGAAA3FwcnNTcXb1IMV1cMllEMWAtYDAAAAAEAAAAAAM8A8wAGAAA3JzcXFQcnvVIMV1cMllEMWAtYDAAAAAEAAAAAAPQAzwAGAAA3Byc3MxcHllEMWAtYDL1SDFdXDAAAAAIAAAAAAQcBGgA3ADsAABMzFTM1MxUzNTMVMxcVMxUjFTMVIxUzFSMVByMVIzUjFSM1IxUjNSMnNSM1MzUjNTM1IzUzNTczBzM1I14TEhMTExITJiYmJiYmExITExMSExMTJSUlJSUlExMTg4MBGSUlJSUlExMSExMTEhMTJSUlJSUlExMSExMTEhMTloMAAAEAAAAAAP0A/QALAAA3Bxc3FzcnNycHJweFVRFVVRFVVRFVVRGWVRFVVRFVVRFVVREAAAACAAAAAAD0APQAAwAHAAA3FTM1ByM1Mzi8E5aW9Ly8qZYAAAABAAAAAAEHAJYAAwAAJRUjNQEHz5YTEwADAAAAAAEHAPQAAwAHABEAADcVMzUHIzUzJzM1MxUjFTM1IzipE4ODcBODEyapzqioloQSE4MTqQAAAAABAAAAAADiAOIAGQAANzIXHgEXFhQHDgEHBiInLgEnJjQ2NzY3PgGWCgoTHAUDAwUcEwoUChMcBQMFBQoRCRPhAwUcEwoUChMcBQMDBRwTChQTCREKBQUAAQAAAAABGgEaABoAABMyFx4BFxYUBgcGBw4BIi4ENDY3Njc+AZYSESExCgQJCREeDyEkIR4YEQkJCREeDyEBGQQKMSERJCEPHhEJCQkRGB4hJCEPHhEJCQAAAAACAAAAAAEaARoAKgBEAAATJiIHMQYHBgcxDgEWFxYXHgI+ATcxNjc2NzE2JicxJicxJicxJicxJicXBgcOASIuBDQ2NzY3PgEyFx4BFxYUBrQPHg8ODRkPCAgBAwgVCxkdHxwNGQ8IAwUBBAMIBwsKDA0OUxEeDyEkIR4YEQkJCREeDyEkESExCgQJAQIFBQMIDxkNHR8OHBYKDwgBBwgPGQ0ODx8ODg0MCgsHCAOuHhEJCQkRGB4hJCEPHhEJCQQKMSERJCEAAAMAAAAAARoBGgAMABYAHwAAEzIeARQOASIuATQ+AQcUFhc3LgEOARUzNCYnBx4BPgGWJDwjIzxIPCMjPEwNDZ8ZQjsk4g4NnxlCOyQBGSM8SDwjIzxIPCODFCUQnxUJHDchFCUQnxUJHDcAAAEAAAAAALwAvAAIAAA3FAYuATQ2Mha8FiAVFSAWlhAWARUgFhYAAAACAAAAAAC8ALwACgAXAAA3DgEuAj4BMhYUFzY1NCYjIg4BHgI2pgQKCwgCBAkOCwwHFhALEwkEERYVjAUEAggLCgcLDg8KCxAWDRUWEQQJAAMAAAAAAOEA4gAMABUAFgAANzI+ATQuASIOARQeATcUBiImNDYyFieWFCMUFCMoIxQUI0UdKB0dKB0xSxQjKCMUFCMoIxRLFB0dKB0dIAAABQAAAAABGgEaAAcANAA9AEYATwAAASMHFRczNzUHIzUzHgEzMjY0JiIGFSMVIzUzFQ4BFRQWMjY1MxQWMjY0JiMiBgcjLgEjNTMHNDYyFhQGIiYnMhYUBiImNDYzMhYUBiImNDYBEPQJCfQJEqkrBBIKDxYWHxY4JSUICxYfFiYWHxYWEAoRBTAFEQqpcQoRCwsRCjgICwsRCgp5CQoKEQoKARkJ9AkJ9OolCAsWHxYWDzjhLAQSCRAWFhAQFhYfFgoJCQomqQgLCxEKCnkKEQoKEQoKEQoKEQoAAAUAAAAAARoA9AALAA8AEwAYABwAADcXNxc3JzcnBycHFychNSEVITUhFzUjFTMVNSMVvA0eHg8gIA8eHg0exwEG/voBBv76lpaWlkANHh4NHh4PICAPHoMTSxNCCRI5ExMAAAAEAAAAAAEWARoAFgAiACwANgAANyM1MxUzNScjNSM0JiIGFSMVIwcVFzM1PgIeARQOAS4CFwc1IxUnBxczNyczFwcnFSM1ByeDOJYTChwSFiAVFBsKCkEBCQsKBwUKCwgFhhQTFA4lDSR8DSUOFBMUDSaoJS8JEw8WFg8TCbwJ5QUJAgQKCgoFAQYKrBRkZBQNJCRbJA0UZGQUDQAEAAAAAAEHAQcACwAZACAAJAAANycHJwcXBxc3FzcvATczFxUHIxUHIyc1NzsCFxUzNSMXIxUzog4aGw0bGw0bGg4bKRODExMmEoQSEiYTSxImg0uEhJQOGxsOGhsNGxsNG3oTE4MTJhIShBISS4M4hAAAAAEAAAAAAOgA6AALAAA3FzcnNycHJwcXBxeWRA5FRQ5ERA5FRQ6JRQ5ERA5FRQ5ERA4AAAACAAAAAAEaAPYALwA5AAA3Mx4BFAYjNTI2NCYnIycuAgYPAScmJyIHDgEeATsBFSMiJicuAT4BNzYXPgEeAQcXNTMVNxcHIyfgARchIRcPFRUPEQICFx8bBgYQBQUUDQoGCxgOCQkOGgkMBwsbEQ4OCSYrH18YExgNKA0ovAEgLyETFh4WARAPFgUQDg4DAQEOChwaEBMLCw0jIhcDAwQUFgYfdhhmZRcNKCgAAgAAAAABGgD2ADIAPAAANzMeARQGKwE1MzI2NCYnIycuAgYPAScmJwYHDgEeATsBFSMiJicuATc+Ahc+AR4BFwcnFSM1Byc3MxfgARchIRclJQ8VFQ8RAgIXHxsGBhAFBRQNCgYLGA4vLw4aCQ8ECwcXHA4JJisfAx8ZEhgNKA0ovAEgLyETFh4WARAPFgUQDg4DAQEBDQocGhATCwsQKxIMEQUEFBYGHxZIGWZlGA4oKAAAAgAAAAABGgD2ABUALgAANzMeARQGKwEiJicuAT4BNzYXPgEeAQczMjY0JisBJy4CBg8BJyYnIgcOAR4BM+ABFyEhF4wOGgkMBwsbEQ4OCSYrH3+DEBYWEBECAhcfGwYGEAUFFA0KBgsYDrwBIC8hCwsNIyIXAwMEFBYGH3MWHxYQDxYFEA4OAwEBDgocGhAAAwAAAAABFAD0AAYADQARAAA3BxcHJzU3MwcXBxc3NQcXNydYMTENODiRDjIyDji4EV4RwzEyDTgNOQ4xMg04DWAIuwkAAAAABgAAAAABLAEaABUAKwBBAFMAXQBlAAATFRQWFzMWFxYdASM1NCYvASYnJj0BMxUGFhczFhcWHQEjNTQmJzUmJyY9ATMVFBYXMRYXFh0BIzU0Ji8BJicmPQEHNzMyFhQGKwEOASsBIi4BPQEXNSMVFBY7ATI2NxUzFjY0JiM4BwgBCgQIEwcIAQoECEwBBwgBCgQIEwYJCgUHSwYJCgUHEgcIAQoECHASxRQbGxQMBigaOBUiFbypIRc5FyETCQwQEAwBGQkGCAcIBQoMCgoGCAYBBwYKDAkJBggHCAUKDAoKBggGAQcGCgwJCQYIBwgFCgwKCgYIBgEHBgoMCXATHCcbGR8UIhQ5ODg4GCEhUDgBERcRAAAAAAQAAAAAAQcBBwADABEAGAAcAAA3IxUzJzczFxUHIxUHIyc1NzsCFxUzNSMXIxUzqV5eSxODExMmEoQSEiYTSxImg0uEhIMSgxMTgxMmEhKEEhJLgziEAAACAAAAAAEaARoADAAUAAATIg4BFB4BMj4BNC4BBzUyHgEUDgGWJDwjIzxIPCMjPCQfMx8fMwEZIzxIPCMjPEg8I/PhHzM+Mx4AAAAACgAAAAABLAEaAAcACwATABcAHwAjACsALwAzAD0AABMHFRczNzUnBzUzFQ8BFRczNzUnBzUzFQc3MxcVByMnNxUzNTcHFRczNzUnByM1MxUjNTMnIxUzBxc3NScHHAkJOAoKLiUvCQk4CgouJTgJOAoKOAkTJZ8JCTkJCQolJSUlbjo6Ew0iIg0BGQk4Cgo4CTgmJiUKOAkJOAo5JiYvCgo4CQkvJSWDCXEJCXEJOCZeJRMTEgwiDSINAAADAAAAAAEaARoAEgAeACcAAD8BFQcnNSMnNTczFxUjNSMVMx8CNzUzNzUnIwcVFzcjNTMVIwcVJ0sTFhAcCQnhChPOHAl2IxAcCQmWCQlLQoQdCRZYExsVBy8JlgkJVEuECUIiBhwKXQoKXQoTS0sJDxUAAAoAAAAAARoBBwAGAAoADgAUABgAIwAnAC0AMQA4AAABIxUzFTM1JzMVIyczFSMXHQEzNzUHNSMVJyMPATUnIxUXNzM3NSMVBzUjFRczPQEjFTcVIzU3MxUBEBwTEnAlJUslJakJCTglJgkHKAoJEDYFgxLhEwkKExMTCRwBBhITHAkSEhKEEhMJHCUTExMDKCEKQgc2SyUlOBIcCUslJV4THAkSAAAAAAIAAAAAARoBBwAXACMAABMzFxUmJzUjFTMXFT8BMwYVIwcnNSMnNRciDgEeAj4BNTQmHPQJCArhLgooBwsCBTYQLwnOERwNBhgiHxMhAQcKgAkGaJYKISgDCQo2By8JqXoTHyIYBg0cERchAAIAAAAAARoBBwALABQAAAEjBxUXMxUXNzM3NQcjDwE1JyM1MwEQ9AkJLxA2fwkSegcoCi7hAQcKqQkvBzYJqZ8DKCEKlgAAAAUAAP/9AS0BGgAsADIANgBDAEoAADcGIzUjFS4CJzM1Iz4CNxUzNR4CFyMVMwcWFzY1NC4BIg4BFB4BMzI3JjcvAR8BBi8CHwE2FzIWFRQOAS4CNhc3JwcnBxerBgYSGy4cAhISAh0tGxIbLhwCEhIBCQgDIzxIPCMjPCQODQQNNyZMGwYNEiQSRw8RFyETHyIYBw0uIg8cEAwYJwESEgIdLRsTGy0cAhISAhwuGxIMAgQNDiQ8IyM8SDwjAwhKG0wmNwQNJBIkJgoBIBgRHA0GGSEgPy0LJQ4PEwAEAAAAAAEsARoALAAyADYAPwAANwYjNSMVLgInMzUjPgI3FTM1HgIXIxUzBxYXNjU0LgEiDgEUHgEzMjcmNy8BHwEGLwIfARQWMjY0JiIGqwYGEhsuHAISEgIdLRsSGy4cAhISAQkIAyM8SDwjIzwkDg0EDTcmTBsGDRIkEi8gLyEhLyAnARISAh0tGxMbLRwCEhICHC4bEgwCBA0OJDwjIzxIPCMDCEobTCY3BA0kEiRVFyEhLyEhAAAAAAQAAAAAARoBGgADAAcAIwAwAAA3Fy8BFy8BFzMOAgc1IxUuAiczNSM+AjcVMzUeAhcjFQcyPgE0LgEiDgEUHgGpJkwmVBIkEnkCHC4bEhsuHAISEgIdLRsSGy4cAhJeJDwjIzxIPCMjPKlMJkxUJBIkGy4cAhISAh0tGxMbLRwCEhICHC4bEnojPEg8IyM8SDwjAAAG//8AAAEsAQsADAAYAE4AZwBxAHsAADcyFh0BFAYiJj0BNDYXNCYiBh0BFBYyNjUnFhc3NhcWFxYVFAcXMx4BHQEUBw4BDwEGBwYHBiInJicmLwEuAScmPQE0NjczNyY1NDc2NzYPARUXFhcWMjc2PwE1JwYjIicmJwYHBiMiNyYOARQWMjY3NjcGFx4BMjY0LgF1BggIDAgIVggMCAgMCDICAQMRJiMQDQUDAQ4PAwIHBwsGBwwNKVIpDQwHBgsHBwIDDw4BAwUNECMmSQEBCgwkRiQMCgEBDBQhEgYEBAYSIRQ6CDAPDCoTAgMnBwMCEyoMDzBxCQYcBggIBhwGCQ8GCQkGHAYICAayAQIDEwUEExEeEwwQBxkOGAUGAwkFCAUEBwUSEgUHBAUIBQkDBgUYDhkHEAwTHhETBAWCAlABBgUPDwUGAVACBhMGCAgGE2IIBRMoDhQUFggIFhQUDigTBQAAAAADAAAAAAEHARoABwAMABMAAD8BMxcVByMnNycjFTMnBxUXNTMnSxNlRBOWE6k4Xpa8EhJ5E+ETQ4sTE4M4u/MSvBPPEgAAAAAEAAAAAAEaAOIAAwAHABcAGwAAJRUjNRUzFSM3IyIGHQEUFjsBMjY9ATQmBzMVIwEH4eHh4eEICwsI4QcLC0AmJs4SEiVelgsIgwgLCwiDCAtwEwABAAAAAADPAJYAAwAANzMVI15wcJYTAAAGAAAAAAEJARwADAAcACgAMAA6AEgAABM+AR4CDgIuAjYXFjMyPgE1NC4CDgIeATcXBxYOAS4CPgEXBxY2NCYOARY3BxYVFAcXPgEvASYjIg4BFBcHJj4CF0kbQTskBB02QTolBBwmGiAcLxwWJTAuJBMDGIINKAQFERQPAgwUChIFCgcIBAFUDwUJDgwDCjQLDBIeEgkNEAMmOBoBBRIEHTZBOyQEHDdBOqgSHC8cGSoeCQwgLS8qig0pCRQMAg4VEQUEIQMECwUBBwcrDgsNEg8OEy4UFwUSHiQPDhg5KwwNAAADAAAAAAD0ARoAEwAkADUAADc0LgEiDgEVFyMVFx4BMjY/ATUjJzIXHgEUBgcGIicuATQ2NzYXBw4BBwYiJy4BLwE1FjcWN/QZLDIsGQEBAQQ1SDUEAQFdFRMQExMQEyoTEBMTEBNgAQETDxIqEg8TAQEjKCgj6g0WDAwWDQKmBxEXFxEHph4FBA4KDQQFBQQNCg4EBcQDBQwEBQUEDAUDjBQBARUAAAAFAAAAAAEoAQcAJQAsADUAPwBGAAA3By4BIgYHJwcXBxUjFTMVFhcHFzceATI2Nxc3JzY3NTM1IzUnNycyFhUjNDYXDgEHLgEnNTMnBxUzNRcHFTc1BzU3JzUXFYkRBBkgGQQRDRYDExMBBBgNFQcWGBYHFQ0YBAETEwMWSwwQOBAyAhUPDxUBSyoPE44wR0dpj6WDEA8UFA8QDRYCExMBCQkYDRUKCwsKFQ0YCQoBEhMCFg0QDAwQSw8VAQEVDxyzCFZEXyAXLxBkFkZfF24QAAAAAAQAAAAAARYBBwAlACwANQA/AAA3By4BIgYHJwcXBxUjFTMVFhcHFzceATI2Nxc3JzY3NTM1IzUnNycyFhUjNDYXDgEHLgEnNTMnNxcVBzU3JxUjiREEGSAZBBENFgMTEwEEGA0VBxYYFgcVDRgEARMTAxZLDBA4EDICFQ8PFQFLEw6pbFaOE4MQDxQUDxANFgITEwEJCRgNFQoLCwoVDRgJCgESEwIWDRAMDBBLDxUBARUPHKsIcRBIFzlfRAAAAAQAAAAAASkBLAAlACwANQBAAAA3By4BIgYHJwcXBxUjFTMVFhcHFzceATI2Nxc3JzY3NTM1IzUnNycyFhUjNDYXDgEHLgEnNTM3FQc1NycVJic1N4kRBBkgGQQRDRYDExMBBBgNFQcWGBYHFQ0YBAETEwIVSwwQOBAyAhUPDxUBS7iAaqIJCg6DEA8UFA8QDRUDExMBCQkYDRUKCwsKFQ0ZCAoBEhMDFQ0QDAwQSw8VAQEVDxxgEFEWQ2d2BgN+CAAAAAAEAAAAAADjAOMADAAYABwAIAAANz4BHgIOAi4CNhceAT4CJicmDgEWNyMVMxUjFTNsESgkFwISISgkFgMSHQwcGQ8CDQsSKRgISjg4ODjUDAIRIigkFwISISgkXggCDBccGQgLCCMqOxMSEwADAAAAAADhAOIADAAQABQAADciDgEUHgEyPgE0LgEXFSM1NxUjNZYUIxQUIygjFBQjEktLS+EUIygjFBQjKCMUXhISORMTAAACAAAAAADmAOEABQALAAA3IwcXMzcHIyc3Mxe6ViwsViw6Oh4eOh3hS0tLMzMzMwABAAAAAADmAOEABQAANwcjJzcz5StWLCxWlktLSwAAAAIAAAAAAOEA4QACAAUAADczJwczJ0uWSyNGI16DbD0AAQAAAAAA4QDhAAIAADcXI5ZLluGBAAAAAgAAAAAA9AD0AAMABwAAPwEXBzU3Jwc5XV1dNDQ0ll5eXSk0NTUAAAEAAAAAAPQA9AADAAA3Fwcnll5eXvReXl4AAAADAAAAAADjAOMADAAQABQAADc+AS4CDgIeAjYnIxUzJzUzFdQMAhEiKCQXAhEiKCQnFxcXF2wRKCQXAhEiKCQXAhEWEyVLSwAFAAAAAAEcARwAFQAeAEQATABWAAATNzMfAhUPASsBNTQnMzUjFSYjPQEXByYvATcnNxcHNxcHFxUzFSMVBgcXBycOASImJwcnNyYnNSM1MzU3JzcXPgEyFgcuAQ4BFTM0BzY3NSMVHgEXNlgCsQEPAQEPAVwHYKwJCoYjAgIGHC0KNFcRDRUCExMBBBgNFQcWGBYHFQ0YBAETEwMWDREEGSAZFQYREAk4AgoBSgEVDw8BGwEBDwGxAg8CCgesWwJcAWcjAwMFHC4KMzsQDRUDExIBCgkYDRUKCwsKFQ0ZCAkBExMDFQ0QDxQUBwYDBg4JDFQKDxwcDxUBAQADAAAAAAEMAQcAAwAJAAwAABMjFTM3BxUXNzUPATVLExM+Dw+DFmkBB+HVB7wHXRAITJgAAwAAAAABDwEHAAMACQAMAAATMxUjNwcVFzc1DwE1LxwcXBYWhCFdAQfh2Qu8C14WC0KEAAMAAAAAARYBBwAJAC4AOAAAPwEXFQc1NycVIxcOAR0BFA4CKwEiLgI9ATQuAjU0PgQyHgQVFAYHIxUUFjsBMjY1Xg6pbFaOExUFBgIDBQMQAwUDAgYLBwMGCAoMDAwKCAYEBxwWAgEQAQL/CHEQSBc5X0RgBQ0HEAMFAwICAwUDEAcNCxAKBgsLCAYDAwYICwsGChAZFgECAgEAAAQAAAAAAREBGgARAB8ANwBEAAA3Jic3JwcmJyYHBg8BFzc2NzYHBg8BJzc2NzYXHgEXFgc3JwcnNycHJwcOARQWFwcXNx4BMjY/AQcGIi4CNTQ/ARcHBv8DBRkLGgcJFBQLCB1RHQkECBcDBhI6EgYHEBAHCwQGYRwMGyMcDBwLHQkIBQYZCxoHEhUVCB02CBAPDAYMEjoSBuQJBxoLGQYCBwgECR1RHQgLFA4HBhI6EgYDBgYECwcQbh0MHSMdDB0LHQgVFREIGQwZBQYJCB0aBAcLDwgRDBI6EgUAAAAABgAAAAABGgEAAAMABwALAA8AFQAYAAA3NTMVJzMVIzcVIzUdATM1JTcXFQcnNxU3cahdXV1dqKj++g5lZQ4TSnESEksTSxMTqRMTrQdDD0QIdWMxAAAAAAIAAAAAANgA9AADAAcAADczFSM3FSM1VB0dhBz0vLy8vAAAAAIAAP/9ARYBBwAaACQAADcUDgEmJwceAT4CLgEGBzUjFRczNSM+AR4BJzcXFQc1NycVI4YZJyMIEgotMiMHGi8xDxMJLBgKIyUXKA6pWUOOE0sUHwgSEgcXGQclMiwTDRQXMgoTEQ4KHqEIcRA7Fi1fRAAABQAAAAABHAD0AAQACQAOABIALQAANzUzBgc3NjcjFRcmJyMVJRUhNRcyPgEuAQYHMxUjJzUzFT4BHgEOAiYnNx4BE2ECARcJC4lpBQNhAQb++scSGgYRISAJFCUIEA0qJxYGHiolCQ8GF3ESCQk4CggScQkKE7wTE7wWIh4MDA8QCCoTEQsRJCseBxUUBg0PAAAAAAEAAAAAAQwBDQAdAAA3FA4BJicHHgI+AjU0LgEGBzUjFRczNSM+AR4B7yY6NQwaCigyMykXKkRFFhwOQSMONTcjlh4uDRscCxghDQogLxokOxcVHCJLDhwZFg8tAAAAAAMAAAAAAP4BBwADAAkADAAAEyMVMycXFQcnNR8BNf0cHFwWFoQhXQEH4dkLvAteFgtChAADAAAAAAEQAQcACAASABcAADcUBi4BNDYyFjMvASMHFRczPwEHIzUzF7wWIBUVIBZUUBFfGBhfEVBhX19PlhAWARUgFhZZCBiyFwhZSrJZAAIAAAAAARABBwAJAA4AACUvASMHFRczPwEHIzUzFwEQUBFfGBhfEVBhX19PplkIGLIXCFlKslkAAgAAAAAA/AEAAAUACAAAPwEXFQcnNxU3UBaWlhYcbvQLZBdkDK2TSgAAAAACAAAAAAEMAQwAFwAgAAA3NTMVPgEzMh4BHwEjNS4CIgYHMxUjJxciJjQ2MhYUBiEcEDAbHTQgAgEdAhgnLikLNU4SdRAVFSAWFsBLLxMWGy4cBQQUIhQWExwSkBUgFhYgFQAAAgAAAAAA6gEaAAoAEwAANzM3Jwc1IxUnBx8BFAYiJjQ2MhaWCkkUMRwxFEkvFh8WFh8WeUkUMXR0MRRJQRAVFSAWFgACAAAAAADqARoACgATAAATIwcXNxUzNRc3JxcUBiImNDYyFpYKSRQxHDEUSRsWHxYWHxYBGUkUMXR0MRRJ4RAVFSAWFgAAAAACAAAAAAEMAQwAFwAhAAAlNSMVLgEjIg4BDwEzNT4CMhYXIxUzNwcyNjQuAQYUFjMBCxwQMBsdNCACAR0CGCcuKQs1ThJ1EBYWIBUVEMBLLxMWGy4cBQQUIhQWExwSkBUgFQEWIBYAAAIAAAAAAQcBBwAHAAsAABMXFQcjJzU3FyMVM/QTE7wSEreysgEHE7wSErwTGLIAAAUAAAAAASsBLAABAA0AQQBJAFkAADc1Fyc3FzcXBxcHJwcnNxUzNxcHFRYVBzMVIzEGDwEXBycHDgEiJi8BByc3JyYnKwE1MzU0NzUnNxczNTQ+ATIeAQcVMzU0JiIGFzUjBwYVFB4CMj4CNTQrWyYNKCcNJiYNKCcNdBAkDSIMASwuBg8BKw0pAQ4kJiQOASkMKgEPBQEuLAsjDSQSEB0iHRFrWRolGnqbAQkOGR8iHxkPiwEJJgwoKA0mJg0pKA2QDCQNIgEeHw4SHxkBKwwpAg8SEhACKAwqARkeEg4gHAEjDSQMER0RER0RDAwTGhoyAQEaHBktIRERIS0ZHQACAAAAAAEaAQcAFAAeAAA3NTI2NzY1Iyc1NzMXFSc1IxUzBxczNycHNSMVJwcXSxERAgJVCQn0CRLhawkuKC8NHxMeDi8TEwUFAwUKuwoKrRORqQkvLw0feXkfDS8AAAADAAAAAAEaAOEADQARABUAACUHNScjBxUXMzc1Fzc1ByM1MxcnNTcBCz0JqQkJqQk9Dl2Wlks5OdMjKAkJhAkJJiMJa21wXR8KIgAABQAAAAABGgEHAA0AFwAgACkAMgAANzMXFQcjJzU3Mz8BMxcHMzUjLwEjDwEjFyIGFBY+ATQmFzIWFAYuATQ2NyIGFBYyNjQmyUcJCfQJCUcQBzgHk+FCBxAwEAdBHAQGBggFBVAQFhYgFRUQFyEhLiEh9AqoCgqoChADA7mWAxAQAxMFCAYBBQgFEhYgFgEVIBYSIS4hIS4hAAAAAwAAAAAA9AEaAAcACwAPAAATMxcVByMnNRczNSMXMxUjVJYKCpYJE4ODLyUlARkJ9AkJ9OrhvBMAAAAAAwAAAAABBwEaAAcACwAXAAATMxcVByMnNRczNSMXIxUjFTMVMzUzNSMc4QoK4QkTzs5wEzg4Ezg4ARkJ4QkJ4djPJjgTODgTAAAAAAMAAAAAARoBGgAHAAsAEQAAEzMXFQcjJzUXMzUjFzMVByM1HPQJCfQJE+HhliVwJgEZCfQJCfTq4SYlcSYAAAADAAAAAAEaARoABwALABQAABMzFxUHIyc1FxUzNQcyNjQmIgYUFhz0CQn0CRPhcRchIS4hIQEZCfQJCfQJ4eGpIS4hIS4hAAADAAAAAAEHARoAAwALAA8AADcVIzUnMxcVByMnNRczNSO8XkLhCgrhCRPOzqkTE3AJ4QkJ4djPAAMAAAAAARoBGgAHAAsAEgAAEzMXFQcjJzUXMzUjFzMVNycVIxz0CQn0CRPh4SU4Xl44ARkJ9AkJ9OrhhDhLSzgAAAAABgAAAAABGgD0AAcACwAPABcAGwAfAAA/ATMXFQcjJzczNSM1MzUjNzMXFQcjJzUXMzUjNTM1IyYJXgkJXgkSS0tLS3peCQleCRNLS0tL6goKqAoKCXESExMKqAoKqJ8mJUsAAAEAAAAAAPcBCgAZAAATFRczNSM3PgEeAgYPARc3PgEuAgYPATVCCUIwEg0iIxkKCg1hDWIQDAwhLCwQDgEHQgkSEg0JCRkjIwxiDWERLCwhCwsRDScAAAADAAAAAAEaARoACQAMABAAABMjDwIXPwI1BzcXNyc3F/gbmwMsGk0FmuwdGxAhliEBGZoFTRosA5sbyzgbCiGWIQAAAAMAAAAAARoBGgANABEAGAAAJScjNScjBxUXMxUXMzcnNTMVFyM1Mzc1MwEZCY0JXgkJLwm8CfNLlqkcCYSyClQJCZcIVQkJZ3FxXUsIHQAAAwAAAAABBwCpAAgAEQAaAAA3FAYiJjQ2MhYXFAYiJjQ2MhYXFAYiJjQ2MhZLCxAKChALXgsQCwsQC14LEAsLEAuWCAsLEAsLCAgLCxALCwgICwsQCwsAAAIAAAAAARoBGgALABwAADczFSMVIzUjNTM1Mwc1MxUzNSM1MzUjNTMXFQcjSzg4Ezg4EzgT4XFxcXoJCfThEzg4Ezj9Z12DEyUTCs4JAAAAAwAAAAAA4gDhAAsAGAAhAAA3JwcnNyc3FzcXBxc3FA4BIi4BND4BMh4BBzQmIgYUFjI2rBYWERYWERYWERYWJBQjKCMUFCMoIxQTIS4hIS4hbxYWERYWERYWERYWFhQjFBQjKCMUFCMUFyEhLiEhAAMAAAAAARYBGwAVACgANAAAEx4BFxYVFAcOAQcGJy4DNzY3PgEXNjc2JzQmJyYnJgYHDgEWFx4BJzcXBxcHJwcnNyc3oRYpECYeDyYWMCcUHhADBw8mEishJhkZAhEPHSYTJg8gFyEiECYELQ0tLQ0tLQ0tLQ0BGQEUECk3KycSFwQJFgsiKi4VLhkMDPQJHyIlFyoQHQMBCQsYTkgTCgZ8Lw0vLw0vLw0vLw0AAAAABAAAAAABHQEaAC8AQwBQAFQAABMjBycHFwcVFwcXNxczJicjLwEHJzcvATU/ASc3Fz8BMx8BNxcHHwEVFhc1JzcnDwEyFhcGBy4BDgIWFwYHLgE+AR8BPgEeAg4CLgI2FxUzNbA0CiYmGi0tGiYmCicKCAYJDiYPGQYsLAYZDyYOCRYJDiYPGQYsCwgtGiYmJAwTBAkIAQsOCgEIBwYDDQ0EFQ4YDiMhFwUNHCIgFgYMCF4BGS0aJiYKNAomJhotCAssBhkPJg4JFgkOJg8ZBiwsBhkPJg4JBggKJwomJhowDgsDBgcIAQoOCwEICQUXGxIBNAwGDBwjIRYFDBsiIR4TEwAFAAAAAAEHAQcAAwAHABUAHAAgAAA3IxUzBzUjFSc3MxcVByMVByMnNTc7AhcVMzUjFyMVM6leXiYSExODExMmEoQSEiYTSxImg0uEhIMSJl5eqRMTgxMmEhKEEhJLgziEAAAAAgAAAAABGgDjAAgADAAANyc3FwcnNyM1JzMVI/UsDUNDDSy9JRMTqS0NREMNLRM4gwAAAAYAAAAAASwBLAAHAAsAFwAbAB8AIwAAEzczFxUHIyc3FTM1BTU3MxcVMxcVByMnNzUjFRcjFTsCNSOpE10TE10TE13+5xNeEl4TE84TcV5eXl4SXl4BGRMTXRMTXV1dqHATE14SXhMTcF5eEl5eAAAEAAAAAAEUARQAIAAmADcAOwAAEwYUHwEOAQcGHgE2Nz4BNxcGFBYyNxcWMjY0LwExJyYiHwEGIiY0NyIHFzYzMhYXHgE+AScuAgcXLgEcAwIzEhoFAQQHBwEFFxEWDh0pD0oDCAUCgGgDCGIsCRoSHxMRDwsKJTkJAQcHBAEHIzMaMAEbARACBwMzDSUWBAcCBAQUIAsXDikeD0oDBQcDgGgDdCwJExlRBRADLiMEBAIHBBsrGCwvExsAAAMAAAAAAREA6AAIABEAKAAANzIWFAYiJjQ2FyIGFBYyNjQmJzIeARcWDgEmJy4BIgYHDgEuATc+ApYVHR0qHR0VDRISGhISDRwzIwcBBAcHAQk5SjkJAQcHBAEHIzO7HSkeHikdEhMaEhIaEz4YKxsEBwIEBCMtLSMEBAIHBBsrGAAAAAP//wAAARoBGgAVADsARAAAEwcVNxc1MxUjBzUjFwczFRc3Mzc1Jwc+ATQuASIOARQWFw4BBwYPATM1ND4COwEyHgIdATMnJicuASciJjQ2MhYUBlQJCQqpIRgmAQEUECIiCQmYDhASHiMfERANDRYHBAEBEwoSGA0BDRgSChMBAQUGFjITGxsnGxsBGQkdAQEUXhgYCgkcByMJcQmxCR0jHhISHiMdCQYWEAsMEgoNFxMKChMXDQoTCwsQFg8bJxsbJxsAAAAACAAAAAABBwEaAAkADgAYAB0AJwAxADsAQAAAEx8BFQcjJzU3MwcVMzUnBxQzMjY1NCMiBhc0MhQiFzM1IzUHFTcVIwcjNTM1BzU3FTM3FDMyNjU0IyIGFzQyFCLGPgMKzgkJkYi8OGgZDQ4ZDQ4QFBQ8LQ8fEA8aLQ8QIA4UGg0NGQ0OEBQUARc+B7YJCfQJEuGoOUwlFBIlFBIaMgsMPQYNAy1qDC0DDQY9GCQTEyUUExoyAAAAAAUAAAAAAQcBGgAJAAwAEwAaACEAABMfARUHIyc1NzMHMycjFTM1Iyc1BzcnBxUXPwIXFQcnN8Y+AwrOCQmRBDg4hLxCCUoiDSkpDSQNKSkNIgEXPge2CQn0CUs54ZYJQo4jDSkNKQ1EDikNKQ0iAAAHAAAAAAEaARoAEQAUABwAJQApAC0ANgAAEzMVFzMVMzUvAiMHFRczNSM3FyMXIwcVFzM3NQcVJyMHJyMHNRc3FysBNTcXNzI2NCYiBhQWJnAJQhMDPgaRCQlCOIM4OGeWCQmWCRIfDRYoDQ1PDx0eXRMvJQQGBggFBQEHQgkTKQc+Agn0CRPhOTgJcQkJcQpLHhYoDCdQDxwbEy5BBgcGBgcGAAkAAAAAAQcBGgAOABEAGQAeACgALgA3AD8ASQAAJS8BIwcVMzUzFRczFTM1BzUXDwEVFzM3NScHFSM1MwcjFSM1MzIVFAYnIxUzMjQXNic0ByMVMzInNTM2FhQGJzcjFSM1MxUjFTMBBD4GkQkScQlCE0s4xQkJzgoKCby8lgYNFBUNCgUFCkIJAR4UFA0UBgcLCghNEg0hFBLZPgIJZ15CCRMpBDk5OAlxCQlxCV4SXTgTORMICxsRESYJDBwBOAsjAQsPCwELFjkLDgAAAAAEAAAAAAEaAQcAAwAhACsAMgAANzM1Izc1NzMfATMXFQcjJzUjJzU3Mx8BMxcVIzUjLwEjFRcnIxUzPwEzNSMHIxUzNSMHJhISEgpTCAhrCQnOChwJCVMICGsKE2cICERxCEQ7CAhxaBNBvGsIXksTCQkEDgqWCQkvCakKBQ4KLiUFDjgPDzkOBRM4S10OAAAEAAAAAAEaAQcACgASABwALAAANzMXFQcjJzU3Mx8BNTcjDwEjFTczNyMvASMVMzcXJzcXFQcnNyMOARcjNDY3kX8JCfQJCV4HhQF3EAZUZnoBegcQUFAQMRkOKSsNGxoPFQETHhf0CrsJCc4KA8wdZxADcZYTAxA5EEkaDSoNKg4ZARUOFiABAAAAAAUAAAAAAQcBGgARABQAHAAgACoAABMfARUHIzUzNSMnNSMVIzU3MwczJwcjBxUXMzc1ByM1MwcVIzUHJzcjNTPGPgMKQThCCXESCZEEODgdgwkJgwoTcHATEjINMSE4ARc+B7YJE5YJQktUCUs5XgqDCQmDeXAcOCExDTISAAAACwAAAAABBwEaAAoADgAjACcAKwAvADMANwA7AD8ASQAAEzMXFQ8BFQcjJzUXIxUzFTM1LwE1IxUHIxUjNSMnNSMVMzUzNRUzNScVIzU3MxUjNRUjNTczFSM1FSM1OwE1Ixc3NSMVHwEVMzUvzgoDEAq7CUsTE0sQAyYJCRMKCRMmExISExMSEhMTEhITExIScxA4DwMTARkJXgYRfwkJ9Akmu3YQB1QvChISCi/hEhMTExMTExMTJRISExMmExMTFhBRUQ8HenkAAAAAAwAAAAABBwEaAAkADwASAAAlLwEjBxUXMzc1ByM1MxUzJzUXAQE4DXETE6kTE6leSzg43DgFEuETE6io4UsSOTkAAAAEAAAAAAETASwADQAQABcAHQAAEyMHFSMHFRczNzUzNzUnFyMHIzUzFRczNyM1MxUz23ESORISlxI7EDgeHiaWORJLS5ZeOAEsEzgTvBISORKXHh7hu3ESE7s4AAEAAAAAARoBBwAHAAABFQcVIzUnNQEZXUteAQcgWWhoWSAAAAIAAAAAARoBBwAHAA8AAAEVBxUjNSc1FxUzNTc1IxUBGV1LXnAmXuEBByBZaGhZIHFeXlkFBQAAAgAAAAAA+wEaAC0AUwAANyc2JicmJwYHBhcWFwcuAjc1Njc2NzY/ATY3Njc2JzceAQc2PwEVFhcWBw4BJxcGFhceAQc+ATc2JicOAS8BNiYnBgcGDwEGBwYVMQYWFyY3NjerCgkDCxIEDgIDBgMKCxQfEQEBAwQJChAICQcKAwQGDR8bCQYEEQoGCwsJJTsQAQkJDQoEDBIFBQQIBhMKBgwJFAIRCQ8CFwkEARAPCgUGHBMOCxwJDxYTEQ4NCA4OBBglFAcJCQ0NDw4ICgsPDBEMDBZHJQcIAgEQEyUbFBp/Bw0ZCQkcDwQRCxEjEAkJAg0bOxYWGg0PAhQXDAoSHwoXFRwfAAAAAgAAAAABCwEaAAYADQAAAScHJwcXMzcnBycHFzMBCg1wcQ13DXcNcHENdw0BDA1wcA13Bg5xcQ53AAAAAgAAAAABDgEaAAYADQAANxc3FzcnIwcXNxc3JyMTDXBxDXYNeA1wcQ12DaENcXENeOgNcHANeAACAAAAAADuAQAABgANAAA3BycHFzM3BzcXNycjB+BKSwxRC1GjTUwMUwtS/0pKC1FRzkxMC1JSAAQAAP//AS4BBwAUAB4AKwAyAAA3MxcVJic1Iw8BIxUzFhcjJzU3Mx8BMzcjLwEjFTM3Fz4BHgIOAi4CNhc3JwcnBxeRfwkIC3YQBlVgAgRvCQleBwt6AXoHEFBQEDERKCQXAhIhKCQWAxI4LQ8nGAwg9ApUBwQbEANxCQkJzgoDNhMDEDkQQgwCESIoJBcCEiEoJFI7DDQTDhoAAAUAAAAAARoBBwASABwAIAAkACgAADczFxUjNSMPASMVMxUjJzU3Mx8BMzcjLwEjFTM3FzMVIzczFSM/ARcHkX8JEncQB1ReZwkJXgcLegF6BxBQUBAQExMmEhIlEiYR9ApBExADcRIJzgoDNhMDEDkQNXBwcGkHagYAAAADAAAAAAElAQcADQAZACAAADczPwEnIzUnIy8BIwcVNzMfATMVIw8BIw8BFyM3Mz8BMxzOCTIJFQpsEQZeCRNQEAdnVQYQRwkTvbofRQYQbSYGhAwuChADCs7FEAMlAxAHOTFeAxAAAAMAAAAAARoBBwAKABIAHAAAJSMvASMHFRczNzUHFSM1Mz8BMycjDwEjNTMfATMBEH8QB14JCfQJE+FVBhB3AXoGEFBQEAd69BADCs4JCbuVHXEDEBIDEDkQAwAABQAAAAABLAD0ABMAIwBAAEkAUwAANzMyHgEdARQOASsBIi4BPQE0PgEXIgYdARQWOwEyNj0BNCYjByIGHQEjIgYUFjsBFRQWMjY9ATMyNjQmKwE1NCYXFAYiJjQ2HgEHFAYiJj4BMhYVS5YUIxQUIxSWFCMUFCMUFyEhF5YXISEXegQFHAQGBgQcBQgGHAQFBQQcBokLEAsLEAsTCxALAQoQC/QUIxQ4FSIUFCIUORQjFBMhFzgYISEYOBchJQYEHAUIBhwEBQUEHAYIBRwEBhMICwsQCwEKQAgLCw8LCwgAAAAABAAAAAABGgEaAB8ANwBAAEkAADcnIw8BJwcXDwEVHwEHFzcfATM/ARc3Jz8BNS8BNycHJxc3FwcXFQcXBycHIycHJzcnNTcnNxc3FxQGIiY0NjIWBzI2NCYiBhQWqwoWCg0lERgDLS0FGA8lDwgWCg8lDxgFLC0GGA8lCAonJhstLRsmJwo0CiclGi0tGSYnCEAXHhYWHhcmCAsLEAsL2i0tBhgPJQ0KFgoPJQ8YBSstBRgPJQ8IFgoPJQ8YQy0ZJicINAonJRotLRkmJwg0CicmGy2DDxYWHhcXIgsQCwsQCwAABQAAAAABBwEaACIAJgA5AEwAUAAANyM2NSYnJi8BJiIGBwYHJicmIyIHBgcGDwEUFyMHFRczNzUHIzUzNSM1JjU3Njc2NzYyFxYXFhcWFTM0NzY3Njc2MhYXFh8BFAcVByMXIzUz/R4CBAMGCAUICQgDEQ0NEQwFCQgHBgMEAQIeCQnhCoRdXTgCAQIDAgcCDwQJBgQBAhMCAgQFCgMPCAUBAQICAjZeXl7hCA8LBQkDAgMBAgUUFAUDBQMJAwsDDggJqQkJqaCWEwQFCgMFAQQEAgIECAUDBQUFBQMFCAQCBAYBAwUKBQICqZYAAAAABQAAAAABGgEaABMAFgAmADAANAAANzMVFyMnNTczHwIVJic1Iyc1IxcnFRcVMxcVByMnNTczNTQ2MhYHBh0BMzU0LgEGBxUzNThLAlYJCZEGPgMIC0IJcbw4QRMJCXEJCRMWHxYzBSUGCgwlXiYSAQn0CQI+BzALBwgJQjk5OUsSCksJCUsKEhAWFgIGCBISBgkFAjc4OAACAAAAAADhASwADwAYAAATMxUeARQGBxUjNS4BNDY3FzI2NCYiBhQWjRIcJiYcEhwmJhwJFB0dKB0dASxMAyo6KgNMTAMqOioDex0oHR0oHQAAAAAEAAD//gEcARoAHwAqAEkAVQAANyc3FxUHJzcjBiY9AS4CPgEzMhcWFxYVFAYHFRQWMycWPgIuAQ4CFhcWFx4BBw4BLgI2NzY3NTQmKwEXByc1NxcHMzIWDwE+Ai4CDgIeAYsYDCgoDRgjExwOFAULFw8JCRIIAxUQEAw1CBQOAgoQEA0DB8gOCgwDCQgaHBQGCwwICRELIxgOKCgOGCMTHAEGBwwHAQkQEQwDBxA4GA0oDSgOGAEcE2gDFBwaEAMIEgkJERoDZwwRmwUCDhQPBwMNEBB7AwoMIQ4MCwYUHBoIBQJoDBAYDSgNKA0YGxSyAQgODg4GAwwREAoAAAAABAAAAAABBAEHAAMADQARABUAABMjFTMHJzcXNTMVNxcHJzMVIxcjFTOpExMQXg1OE00OXhATExMTEwEHE85dDk4bG04OXagSJhMAAAQAAAAAAQgBLQA0AD8ASgBXAAA3LgEHBgcGBy4BJzI3PgE1NCcmJyYjIg4BHgEXFQYHDgEeAj4BNTYuASc1FhcWFx4BPgE0Bx4BDgIuAT4CJyIuAT4CHgEOARcOAS4CPgIeAgb5DCEODAYBAR4qAwQEDRAEBxIJCg4XCwUUDgkICwsFFBwbDwEJEgsPFhMUBB0kGKgICgIOFA8HAw0QAwgOBwMNEBEKBA+NBQ4OCwYEDBEOCQMEmwwDCQgNBAQDKh4CBhcOCgkSBwQQGhwUA18CBQgbGxQGCxcPCRQPAi0VCwoBEhUDGyUyBA8UDgIKEBANA4IKDxEMAwcRFA17BQQDCQ4RDAMGCw0OAAAGAAD//gEaARoAIQAtADkASgBVAGEAADcGDwEVFhceARUUDgIjIi4BPgE3NS4CPgEzMh4CFRQHLgEiDgEeAj4CJxYyPgEuAg4CFhcWFxYVFA4BLgI2NzY3NTMXPgEuAQ4CHgE2JwcXNxc3JzcnBycHaQgNCAQEDRAHDRIJDxcLBRQODhQFCxcPCRINBxYEDRAOBwMNEBAJASwHEA0IAQkQEQwDB8gOCg4QGhwUBgsMBwoSCwcCChARDAMGEBQdHw0fIA0fHw0gHw3QDAYCXgECBRgOChEOBxAaHBQDXwMUHBoQBw0SCQ+fBwgKDxEMAwYOD54FCA4QDQcEDBAQewMKDhMOGAsGFBwaCAUCQ4UHFBAGAwwRDwsC2B8OICAOHyANHx8NAAAAAAUAAAAAASwBGgAdACoANgBKAFYAADcGDwEVFhcWFRQHDgEiLgE+ATc1LgI+ATM2FgcUBy4BIyIGFx4CPgInFjI+AS4CDgIWFyM1NCYrARcHJzU3FwczMhYXFgcVIzUjNTM1MxUzFSNpCA0IEwoIAwYYHRcLBRQODhQFCxcPEx0BFgQNCA0RAwENEBAJASwHEA0IAQkQEQwDB8gSEQsjGA4oKA4YIw4YBQQBEzg4Ezg40AwGAl4EEAwOCgkNEBAaHBQDXwMUHBoQARwUD58HCBUNCAwDBg4PngUIDhANBwQMEBAvHAwQGA0oDSgNGBANCQnFOBM4OBMABwAAAAABGwEaACAALAA4AEEASgBTAFwAADc+ATU0LgIjIg4BHgEXFQ4CHgEzMj4CNTQmJyYnNRceAQ4CLgI+ATInIi4BPgIeAg4BFxQGIiY0NjIWBzI2NCYiBhQWJxQWMjY0JiIGNRQWMjY0JiIGVA0QBw0SCQ8XCwUUDg4UBQsXDwkSDQcQDQQEBQYIAQkQEA0DBw4QCAgOBwMMERAJAQgN0BsnGxsnGy8MEREXEREHCw8LCw8LCw8LCw8LvgYXDwkSDQcQGhwUA18DFBwaEAcOEQoOGAUCAV51BA4PDgYDDBEPCoMKEBAMBAcNEA4InxQbGyccHC8QGBAQGBCICAsLDwsLSAcLCw8LCwAAAAAE//8AAAEHARoADwAbAB8ANQAANxUXMzc1LwIjFTMXFSM1NyM1IxUjFTMVMzUzBzMVIzcHJzcjIgYUFjsBFSMiJjQ2OwEnNxc4E6kSBTgOJSU5qYMlEyUlEyVdXV0TKA0YOAwQEAwJCRQbGxQ4GA0ocUsTE6gOOAUSOahLSyUlEyYmSxOZKA0YEBgQExsnHBgNKAAABAAAAAABGgEaABEAFgAiAC4AACUvASMHFRczJicjNTMXFRYXNQcjFTM0JzM1MxUzFSMVIzUjFyIOAR4CPgE1NCYBATgOcBMTZAkGVXA5CghuJyUlJRMlJRMlcBEcDQYYIh8TIdw4BRLhEwgK4jk6AwVCcBMKZyUlEyYmJhMfIhgGDRwRFyEAAAUAAP/+ARoBGgAdACoANgBXAGMAADcGDwEVFhcWFRQHDgEiLgE+ATc1LgI+ATM2FgcUBy4BIyIGFx4CPgInFjI+AS4CDgIWFxYXFhUUDgEuAjY3Njc1NCYrARcHJzU3FwczMhYXFgcXPgEuAQ4CHgI2aQgNCBMKCAMGGB0XCwUUDg4UBQsXDxMdARYEDQgNEQMBDRAQCQEsBxANCAEJEBEMAwfIDgoOEBocFAYLDAgJEQsjGA4oKA4YIw4YBQQBCwcCChARDAMGCw0O0AwGAl4EEAwOCgkNEBAaHBQDXwMUHBoQARwUD58HCBUNCAwDBg4PngUIDhANBwQMEBB7AwoOEw4YCwYUHBoIBQJoDBAYDSgNKA0YEA0JCaoHFBAGAwwRDgkDBAAABQAAAAABGgEaAAwAGAAfACMAJwAANzMXIyc1NzMXFSc1IxcHMzcnIzcnIw8BFzczBzMHNyMnIzUzByM1MzkwDUYKCuEJE85oGyppDR8PDzYRKxErNiNCbB8zCjY/GiUucRMJqQkJWiEwqUFsIBsdC14acDhtSDgTORMAAAEAAAAAARgBIQBsAAAlFhUUBwYHFh0BFAYiJj0BNiYnNzY3Njc2NTQvATYnBg8BJgcnJiMGFwcOARUUFxYXFh8BBhcVFgYiJj0BBicmJyYvAS4BJy4BPgEXFhcWHwEWFxY3NSY3JicmNTQ3Jj8BNhcWFzYXNjc2HwEWAQcRFxIgBgUHBQEFBQUWDREJCxACBwYREwcpKQcaCwYHAwgJCwgSDRYFCwEBBgcGEQ0LCQUIAQUHAwIDAgYDBwcDBwEKCA0VAgcgERkRBQkGBAoQFSkqFBALBAYJ6hQbLRgRBQoRLgQFBQQuCA0GDgMGBw8SHRYRChASBA0CCwsCEBMQCQgVCh0RDwgGAw8KDy8EBgYEGgQEAwgECwEGBgEBBgYEAgEFAwgCDQQHBQQODQYRGCscFBoVBAIBAw0KCg0EAgIFGQAAAAH//wAAAS0BLABUAAATIg4BFRQeARcyNj0BBicmJyYvAS4BLwEmNzYzMR4BHwEWFxY3NjcmJyY1NDcxJjczMhcWFzYzMhc2NzYXMRYPARYVFAcGBx4BHQEUFjM+AjU0LgGWKUUoGi4eBQUOCwkHBAMDAggDAwkEAgQGCwMDCQ4KCgEIHhAWEAcJBAYICg0PFxEUEg0HAwgFARAWDx8EBgUFHi8ZKUUBLChFKSA6KgoEBBkDAwIFBAUECAoDAQYDAQEHBAQPAQEEDAgEDRMnFxETFAMECQUFDAMCARMUAREXJxINBAMOCikEBAorOh8pRSgAAAACAAAAAAEtASwADABqAAATIg4BFB4BMj4BNC4BAyMiJj0BNCYnPgI3NjU0Jic+ATQmJyMiBg8CJgcvAS4BKwEOARQWFw4BFRQXHgIXDgEHDgEmLwIuASMHBhQfARYfAR4BNzM3FRQGKwEuAj4CMh4CDgEHlilFKChFUkUoKEUBAgIEBAUNFxADBAcGAQECAgIFCAQJByAgBwkECQQDAQIBAQYHBAMQFg0DBAEHDwsEBAQDBgMFAQIIAgIGAxEKBgcEAwEdLBMKJDc+NyQKEywdASwoRVJFKChFUkUo/vADAyMHDQQBCRALDQ4JEgcEBwkJBQICBQQJCQQFAgIFCQkHBAcSCQ4NCxAJAQMJBQMBCAcEBQEDAQECAgYCAgsJCgEBFgMDCSw6PjIcHDI+OiwJAAAAAAoAAAAAARoBGgAMABIAHgAqADEANwBBAEgATQBTAAATMh4BFA4BIi4BND4BFy4BJxYfATY1JicjFhUUBzM2JzU2NCcjBhUUFzM2JyYnKwEGByM2Nw4BDwEGFBczJjU0NyMXIx4BFyYnFzY3IxY3Bgc+ATefITghIThCOCEhOH0JHhIMBjIBAQMsAQQvAkEBAkgBBEMCAwcQCgkRBhQFDRMdCQgEBC8EASw0LAomFxIJLxIKNwlCCRIXJQsBGSE4QjggIDhCOCFLEhoGFxs4BQQPDQoIExMJCgEJEgkJCRMTCkEeGhoeGxgHGhISDh0OExMICkoWHAUZHTEWGxscHhkFHBYAAwAAAAABLAEaABYAJwAqAAA/ATUnBxcjIgYUFjsBNSMiLgE2OwEHFzcjJzMfAhUHIyc1FxUzNSM3FTNxJigNGDgUGxsUCQkMEAERDDgYDV8yE1gNOQUTqBMTqEsTOL0nDSgNGBwnGxMQGBAYDUsSBTgOqBMTjBB8lks5AAIAAAAAARoAvAADAAcAACUhFSEVIRUhARn++gEG/voBBrwTJhIAAAAHAAAAAAEaAQ8ACQARABUAHQAhACkALQAANxcHJzU3FwczFQc1NzMXFQcjNzUjFTc1NzMXFQcjNzUjFTcVFzM3NScjFxUjNSgQCyAgCw/wzgkmCQkmHRM4CSYJCSYdEzgJJgkJJh0T4RELHwwfDA8TxqsICKsIEZmZHYUICIUJEXV1fWAICGAIEFBQAAIAAAAAASABLAAGABMAACUVIyc1MxU3ByMnByc3Mxc3MxcHARn9CRPOYQ0fRA5LDh9gDSYNOBIJ/fS4YR9EDUsfYSYNAAAAAAYAAAAAARoBLAAGAAoADgASABYAGgAAJRUjJzUzFTczFSM3MxUjBzMVIwczFSM3MxUjARn9CRM4JSWDJiZLJiY4JSWDJiY4Egn99M8mOCUmJSYlOCUAAAAHAAAAAAEaASwABgAOABIAGgAeACYAKgAANzM1IzUjFTc1NzMXFQcjNzUjFTcVFzM3NScjFxUjNQc1NzMXFQcjNzUjFRz98xMlCiUKCiUcE4MKJQoKJRwTXgolCgolHBMmEvT9JZYKCpYJE4ODsrwJCbwJEqmps3EJCXEJE15eAAYAAAAAAM8A9AADAAcACwAPABMAFwAANzMVIxUzFSMVMxUjNzMVIxUzFSMVMxUjXiUlJSUlJUslJSUlJSX0JiUmJSa8JiUmJSYAAAALAAAAAAEHARoACQARABUAHQAhACkALQA1ADkAPQBBAAATMxUjFTMVIyc1FyMnNTczFxUnMzUjFyMnNTczFxUnMzUjByMnNTczFxUnMzUjFyMnNTczFxUnMzUrAhUzNSMVMxwmHBwmCXomCQkmCSUSEow4CQk4CjkmJkEmCQkmCSUSEow4CQk4CjkmJhImJiYmARkS4RMJ9GcJJgkJJgoSJQk4Cgo4CiWWCSYJCSYKEzkKOAkJOAkmE3ASAAEAAAAAARoBBwAcAAAlLgEnLgEiBg8BJy4BIgYHDgIUHgEfATc+AjQBFwIJBwoaGxkKDQ0KGRsaCgcJBAQJB29vBwkE0gkRBgoKCgkNDQkKCgoHEBISEhAHbm4HEBISAAIAAAAAARoBBwAdAD0AACUuAScuASIGDwEnLgEiBgcGBwYUHgEfATc2NzY1NAcGDwEnLgI0PgE3Njc2FxYfATc2NzYXFhcWFxYVFAcBFwIJBwoaGxkKDQ0KGRsaCg0FAgQJB29vBwQJFQMKYWIFBwMDBwUHChMUCQcaGQcKExQJBwUDBwHSCREGCgsLCQ0NCQsLCg0TCRISEAZvbwYIEBMJFQ0KYWEFDAwODQsFBwQICAMIGRkHBAgIBAcFBgsOBwYAAAACAAAAAAEdARsAHgAlAAA3PgEmJy4BDgEHNSMVFzM1Iz4BHgEOAiYnBx4CNic3JzUjFRf9Eg0MEhM8QTgQEwlCKRNISi4CMUtGEhAPOEI+Kw42EwNFFzk5FxocBCEcLUIJEiIdFT5NPBIhIgkdJgYbLA02R0sHAAACAAAAAAEUARMAEQAcAAATFwcnFQcjJzUjFQcjJzUHJzcHFTM1NzMXFTM1J513DRMKOAkmCTgKEg53RCYJOAolSwESbA4RegkJQkIJCXoRDmxYgkIJCUKCRAAAAAQAAAAAAPQA4gALACAALAAwAAA3MzUjFSM1IxUzNTMXMyc2NzY3NjQuAScmJyYrARUzNTM3BisBNTMyFhUUBwYXIxUzeQ8PMRAQMWoRGAMECAMCAwUEBgcEAy4PHAkDAiAgBgoBAxe8vHFwMTFwMDAxAQMGCQULCgcDBQIBcC4QASQKCAUDB2YTAAAABQAAAAABBwEaACQALgA7AD8AQwAANzMXFTMXFQcjFQcjByc1Iyc1Iyc1NzM1NzM1LgE1NDYyFhUGBxc1IxUXMxU/ATMnBgcxBiYnBx4BMjY3JyMVMzczFSOfSwkKCgoKCTovEC8KCQkJCQpLBAYLEAsBCUKWLwkiBzUoCw4NGAkNChkcGQlMExM4ExPhCSYKEgk5CTQHLQw2CRIKKAcVAwgGBwsLBwsFYThuAikmAy4KAwMICQ4JCwsJMxMTEwAAAwAAAAABGgEaAAkAEwAdAAA3Mzc1LwEjDwEVNyM1Mx8BMz8BMycjDwEjLwEjNzMc9Ak0CI0JNPThLw4IVggNMQE1CQxLDgg1MX8mCVSQBgaLWQk4FwUFFxMFFxcFhAAAAQAAAAAA9ADPABEAADcVFBY7ASc3FxUHJzcjIiY9AUsFBIEeDTAwDR6BCxHOJQQFHg4wCy8NHhAMJQAABAAAAAABGQEbABMAJwArAC8AABMeARceAQYHDgEmJy4DPgMXPgE3PgEmJy4BBgcOAR4BFx4BNyczNSMXFSM1oRYpDxgSDBUTNzwbFB4RAg0aJisgEiEMEgsQFBIxMxUZGgMfGhEmEh8YGBgYARkDExAYPkAaGBkCDgsiKi0sJBoL8wQUDxY3NRUSEQcOETU7Mg4JBgSUEiVLSwAABQAAAAABGgEaAAcACwATABcAHQAAARcVByMnNTcXIxUzFRcVByMnNTcXIxUzJxcHFzcnAQcSEpYTE5aWlhISlhMTlpaW9B4eDSsrARkSSxMTSxISSzkSSxMTSxISS44eHg0rKwAAAAADAAAAAAEnAQcADAAQABQAAD8BMxcVIzUjFTMVIycFJxU3BzUXIxMT4RIS4V1dEwEUfjMgPSX0ExNxcZYTEyB+sTMGVj4AAAAJAAAAAAEHARoABwANABUAGwAkACoAMgA4AEEAADcXNjQnBxYUJzcmJwcWJzcmIgcXNjIHJwYHFzYHNDcXBhYXByYXBxYXNyYXBx4BNycGIjcXNjcnBicyNjQmIgYUFu8SBgYSBQsQEiMJHiwFEicSBg8hPwkjEhEPLQYSBgEFEgYeERIjCR4tBhInEgUQIT8JIxIQEEwHCwsPCwt/BRInEgYPIT8JIxIRDxUSBgYSBgwREiMJHk0UEgYPIRAFEhsJIxIQEBYSBQEGEgULEBIjCR46Cw8LCw8LAAAAAwAAAAABIwEbABUAMAA5AAA3By8BNxc+Ax4DFyMuAgYHNx8BBycOAy4DJzM1FB4DPgI3Byc3JxQWMjY0JiIGYz0NGREPCBskKCklHBABEgQySD4MLK0ZEQ8IGyQpKSQcEAITDBgfJCMgFwcrBz1/CxALCxALwhkFPAckEx8UCAYUHiYUJDQJJyISQz0IJRMfFAgHFB4mFQkSIhwSBgYSHBESEhkKCAsLDwsLAAMAAAAAAQcBGgANABsAJAAAEyIOAR4CPgEnNi4CByIuAT4CHgEVFA4CJxQWMjY0JiIGjSU+HA41SEQqAQETIi0YIDQYDSw9OiMQHSYnCw8LCw8LARkpREk0Dhw9JRksIxLhIzo9LA0YNCAUJh0QZwcLCw8LCwAAAAEAAAAAAOABBwAcAAA3ByM3Mjc2NzY/ATY1NC4BIzczByYOAQ8BBhQeAakCXAIOBQcDBgYmBQQJDAJWAgoNCAYmBgQJLQYGAgMFCBSHEAkEBwIHBwEGDBWHEwkGAwAAAAIAAAAAARoBBwAbADEAADcjJzUjLwE/ARceARcWFxY3Nj8DHwEPASMVJzM1NzM3JwcGBw4BIiYnJi8BBxczF9+TCRsJDAZQDAEFAgUGDg0GBQUEDFAGDAkbk4AJHQg/AwMDCBQVEwcEAwNACRwKIQp9BzILGwYFBwIFAwUGAgUFCQYbCzIHfQl9CSMVBAUDCAgICAMFBBUjCQAAAAIAAAAAAQcBBwBGAI0AADc1IyIOAQcxBgcxBhcVFAcxBgcGKwEVMzIXFRYXFRYXMRYdAQYXFRYXMR4CFzM1IyIuAj0BNCYnJic2Nz4BPQE0Njc2MxcVMzI+ATcxNjcxNic1NDcxNjc2OwE1IyInNSYnNSYnMSY9ATYnNSYnMS4CByMVMzIeAh0BFBYXFhcGBw4BHQEUBgcGI3ECCREMAwMBAQECBAoFBgEBBgUFAwQCAgEBAQMDDRAJAgIGCgcEAgIFCQkFAgIJBwUGTQEJEA0DAwEBAQIECgUGAgIGBQUDBAICAQEBAwMNEAkBAQYKBwQCAgUJCQUCAgkHBQb0EwcNCAgICAgQBgUKBQISAgECAwEDBQUGEAgIAQcICA0GARMECAoGGQYMBQsHBwsFDAYZCQ0EArwSBg0IBwkICBAGBQoFAhICAQIDAQMFBQYQCAgBBwgIDQcBEgQICgYZBgwFCwcHCwUMBhkJDQQCAAAAAwAAAAAAqgEHAAsAFAAdAAA3HgE+AiYnJg4BFjciJjQ2MhYUBiciJjQ2MhYUBowECgkFAQQFBg8IAhEICwsQCwsICAsLEAsLKQMBBQgKCQMEAw0PVgsQCwsQC14LEAsLEAsAAAMAAAAAARwBHAAcADkARQAAEx4CBw4BIyInDwEjFQcjFQcjJzU/ASY1ND4CFzY3MTYuAgcOARUGFw8BFTM1NzM1NzM/ARYzMjc+AS4CBgcGHgE21RcjDAQGLx4NCw8HEwkcCjgJAl4EER0lLBIFAwkYIBEWHgEFAl4lCR0JFxEKDAwXAwMBBQgLCQIEAw0OARgFICsWHSYEEgMcChwJCSsHXQ0OEiMXCYoOFxEgGAkDBSQXDQwKXx4dCRwJEwMEQgQKCQYBBQQHDwgDAAYAAAAAARoBGgAvADYAOQA9AEAARwAAJSczNSM1IxUjFTMHIxUzHgEyNjczNSMnMxUjDwEXMzcvASM1MwcjFTMeATI2NzM1BwYiJiczBicjNx8BIz8BFyMXBiImJzMGARIeE14TXhMeBwIFGB4ZBQIIHzolCCUHqQclCCU6HwgCBRgfGAUCtwYPDAQvBAEmE3YXgxd2EyYgBg8MBC8EqUsTEhITSxMOEhIOE0uWBC8PDy8ElksTDhISDhMdAwcGBhktixwcii0cBAgGBgAAAAAGAAD//QEtARgABwALABcAHwAsADMAABMjBxUXMzc1BzcXDwEnMxc3MwcjIgYPARcHJyMXMzcmNzYXMhYVFA4BLgI2FzcnBycHF5kKb28Kc9ZeYWEFbSFRVCIPBxknCBMQFVEhbQoUBCsPERchEx8iGAcNLiIPHBAMGAEYTBBKShAIQUE/Qko3NwodFg0ODjdKDQk9CgEgGBEcDQYZISA/LQslDg8TAAAFAAAAAAEsARgABwALABcAHwAoAAATIwcVFzM3NQc3Fw8BJzMXNzMHIyIGDwEXBycjFzM3JjcUFjI2NCYiBpkKb28Kc9ZeYWEFbSFRVCIPBxknCBMQFVEhbQoUBBMgLyEhLyABGEwQSkoQCEFBP0JKNzcKHRYNDg43Sg0JDhchIS8hIQAEAAAAAAEMARgABwALABIAGQAAEzMXFQcjJzU3Bxc3BxczNyMHJxcnMxc3MwePCnNzCm90Xl5h020KcSJUUUxtIVFUInEBGEwQSkoQOUE/PzdKSjc3eUo3N0oAAAIAAAAAARoBGgAHAAsAABMHFRczNzUnFSM1MyYTE+ESEry8ARkS4RMT4RLz4QAAAAIAAAAAARoBGgAHAAsAABMHFRczNzUnBzUzFSYTE+ESEuG7ARkS4RMT4RLz4eEAAAMAAAAAARoBGgAHAAsADwAAEwcVFzM3NScHNTMVMzUzFSYTE+ESEuFLS0sBGRLhExPhEvPh4eHhAAAAAAUAAAAAARoBGgAHAAsADwATABcAABM3MxcVByMnNxUzNQczFSM3MxUjNyMVMxMT4RIS4RMT4c8mJjklJV0lJQEGExPhEhLh4eESExMTExMABAAAAAABGgEaAAcACwAPABMAABMHFRczNzUnBzUzFTc1MxU3MxUjJhMT4RIS4SUTcBMmJgEZEuETE+ES8+HhS5aWluEAAAAABAAAAAABGgEaAAcACwAPABMAABMHFRczNzUnBzUzFTM1MxUzNTMVJhMT4RIS4SUTcBMmARkS4RMT4RKolpaWlpaWAAADAAAAAAEaARoABwALAA8AABM3MxcVByMnNxUzNTMVMzUTE+ESEuETE5YSOQEHEhLhExPhlpbh4QAAAAADAAAAAAEaARoABwALAA8AABMHFRczNzUnBzUzFQczFSMmExPhEhLh4eHh4QEZE+ESEuETqZaWEjkAAAADAAAAAAEaARoABwALAA8AABM3MxcVByMnNxUzNTMVMzUTE+ESEuETEzgTlgEHEhLhExPh4eGWlgAAAAACAAAAAAEaARoABwALAAATBxUXMzc1Jwc1MxUmExPhEhLh4QEZEuETE+ESqJaWAAADAAAAAAEaARoABwALAA8AABMHFRczNzUnBzUzFTM1MxUmExPhEhLhSxKEARkT4RIS4RP04eHh4QAAAAACAAAAAAEaARoABwALAAATBxUXMzc1JxUjNTMmExPhEhKEhAEZEuETE+ES8+EAAAADAAAAAAEaARoABwALAA8AABMHFRczNzUnBzUzFTM1MxUmExPhEhLhgxNLARkT4RIS4RP04eHh4QAAAAACAAAAAAEaARoABwALAAATBxUXMzc1Jwc1MxUmExPhEhLhgwEZEuETE+ES8+HhAAACAAAAAAEaARoABwALAAATBxUXMzc1Jwc1MxUmExPhEhLh4QEZE+ESEuET4c7OAAAGAAAAAAEaAQcABwALABMAFwAfACMAABMHFRczNzUnBzUzFT8BMxcVByMnNxUzNQc3MxcVByMnNxUzNTgSEksTE0tLORI5EhI5EhI5SxI5EhI5EhI5AQcTvBISvBPPvLy8ExM4ExM4ODiDEhI5EhI5OTkAAAYAAAAAASgBBwAHAAsAEwAXAB8AIwAAPwEzFxUHIyc3FTM1Fz8BHwEPAS8BFzcvATczFxUHIyc3FTM1XgkmCQkmCRMSKQYjDEYFIwwyQBJBvwkmCQkmCRMS/QoKzgkJxby8BwwNBcIMDQXAsAawDAoKzgkJxby8AAMAAAAAARoBGgAIABIANwAANyIGFBYyNjQmFycHNyczNxczBycOAQcjFRQWOwEWFyMGJj0BNCYnLgE1NDc+AzMyHgEVFAcG4RchIS4hIQIZGAkWGwoKHBcfEh0HIwMDGgMFIgoPCgkMDgwFEBMVDBcnFwcEgyEuISEuIV0SEhwQHx8QUgMYEikCBAoIAQ8KHg0YCQsfERcTCg8LBhYnFxIOCQAAAgAAAAAA9QEaACEAKwAANw4BHQEUBgcGJyMGJj0BNCYnLgE1NDc+AzMyHgEVFAYHIxUUFjsBMjY12wkLCAcEBR4LDgoJDA4MBQ8TFgwXJxYNMykDAx4CA4oJGA0eBw0DAgEBDwoeDRgJCx8RFxMKDwsGFicXEh4uKQIEAwMAAAACAAAAAAEaARoADAAWAAATMxUjFTM1MxUHIyc1IRUjNQcnNyM1MxxVS+ESCfQJAQYSfw1+Y3oBGRLhS1UJCfR6Y34NfxIAAAACAAAAAAEaAPQAJABJAAA3MzIeAR0BFA4BKwE1MzI2PQE0JisBIgYdAR4BFxUuAT0BND4BFzUeAR0BFA4BKwEiLgE9ATQ+ATsBFSMiBh0BFBY7ATI2NzUuAVM5Eh0RER0SCQkTGhoTORMbARUQGCARHaAYIBEdEToSHRERHRIJCRMaGhM6EhoBARX0ER4RBBEdEhMbEgQTGhoTBBAZAxMDJBgEER4RTBMDJBgEER4RER4RBBEdERIbEgQTGhoTBBAZAAAAAwAAAAABBwD0AAMABwALAAA3NTMVJzMVIzcVIzVxS3GWlrzhSxMTXhNeExMAAAAABAAAAAABBwD0AAMABwALAA8AADczFSMVMxUjNTMVIzUzFSMmqKiWluHhzs6DEiYThBNLEwAAAAAGAAAAAAEaAQcABgAKAA4AEgAzAGsAABM3MxUjNQc3MxUjFTMVIxcjFTMnPwE2NCcmJyYiBwYHBgcVMzU0PwEyMxcVFg8CFTM1IxcyFxYVFAcGBwYiLgEvASYnMTMVFxYzPwIvASsBNTczPwEnNCYPAQYdASM1NDc+AjIeAhQHKwcNDQczu7u7u7u7u9MBAQMBAgcFCAUGAgEBEAEBAQIBAQECEyURCwIBAwECBwUIBQQCAgEBEAECAQEBAQEBAQQEAQEBAQMBAQEPAwEEBgcGBgQDAQAHOSoGAhM4EzgTUgEBBQgEBwICAgIHAwMBAQECAQIBAwMDFQsNOgIEBgMDBwICAgMCBAMEAgIBAQICAwIMAQEDAgEBAQEBAgEBBgUCAwICAwcJBAAAAAADAAAAAAEaAPQAAwAHAAsAADc1MxUnIRUhNxUjNROpqQEG/vrOzksTE14TXhMTAAAFAAAAAAEHAPQAAwAHAAsADwATAAA3MxUjFTMVIzUzFSMnMxUjOwEVI0upqYODvLw4zs44ExODEiYThBNLE6kACAAAAAABGgD0AAMABwALAA8AEwAXABsAHwAANyMVMxUjFTMHMxUjFyMVMzczFSMXIxUzBzMVIxcjFTMmExMTExMTExMTEyXOzs7Ozs7Ozs7OzvQTJRMmEiYTvBMlEyYSJhMAAAQAAAAAASMBIAAWACcAMwA/AAATNxcVByc1IyIHBgcGBycmNz4DFzMXFTcnFSMmBgcGBzY3Njc2Mwc+AR4CBgcGLgE2Fx4BPgImJyYOARasEmRkEggfDxYUFRcTAQQEGSgwGg0WR0YkGC4RFQkUFBIWDxxCDB0aEAINDBMrGQkeBxEQCQIIBwwaDwYBFwlQEUwJIwMEDQ8eBg4OGSwgEQFBIzY4IQERERYdEwoIAwJKCQINGB0bBwwJJCw7BQIIDxEQBAgGFhoAAQAAAAABGAEaAA8AACUuAiIOAQcjPgIyHgEXAQUFHzA2MB8FEwUlOEA4JQWpGisYGCsaIDMdHTMgAAAABAAAAAAA4gEQABAAHgAnADMAADcuASMxIg4CHwEzNzYnNCYnOwEeARcUDwEnJjU+ARcmDgEeAT4BJic+AR4CBgcGLgE2ywocDxUiFAEMOwo7DAELQQECFiABCTAwCQEgIgYQCAMNDwkDJggVEgsBCQkMHhEF+goMFSIqEnd3EhYPGw4BIRcQDWFhDRAXISgFAw0PCQMNDxQGAgkRFRIFCAYZHgADAAAAAAD0AQcABwALABsAAD8BMxcVByMnNxUzNSc1NCYiBh0BMzU0NjIWHQE4E5YTE5YTE5YTIS4hExUgFZYTE14SEl5eXhMlGCEhGCUlEBYWECUAAAAAAwAAAAABBwEaABEAGQAdAAA3IzU0LgEiDgEdASMHFRczNzUnND4BFh0BIxcjNTP0ExQjKCMUExISvBOpIS4hcJa8vKklFSIUFCIVJRNwExNwOBggASEYJYNwAAAEAAAAAAEaARAAFgAaAB4AMAAAEyIOAR0BFzM3NTQ2MhYdARczNzU0LgEHIzUzFyM1Myc1NCYiBgcVIzU0PgEyHgEdAZYkPCMTOBMWHhcSORIjPFw4OKk5OTkgLiEBOB40PDQfARAjPCReExNeDxYWD14TE14kPCPhODg4ExMYIB8WFhMeNB4eNB4TAAMAAAAAARoBDwAHAAwAFAAAEyMHFRczNzUnFwcjJxcjNR8BMz8Bmwp+CfQJg2oaoBjZ4RQIqAgVAQ9LlQkJlTg/HR2FchoDAxoAAAADAAAAAAEaAPQABwANABAAAD8BMxcVByMnNxUzNQcjNyMXEwn0CQn0CRPhawxkvF7qCgqoCgqVjIxSXEkAAAAAAwAAAAABBwD0AAMABwALAAA3FTc1FzUnFRc1NxUmQUs4S0LFjSmNsI0jjSONKY0ABAAAAAABEAD8AAMABwAVABkAADcVNzUzFRc1DwEnNT8BMxc3FxUPASM3FTc1LzgTOEFHDgVLCUdGDgVLCQ44wHcjd3cjd2QsCI0ILywsCI0IL5B3I3cAAAIAAAAAARoAzwAQABcAADczFSM3ByMnFBUXIzUzFxYXNzUjFSMXN3cnGwEhFyEBGSgPDgGcJSQ3Ns56Y2NjBy8teisrBBZCQjY2AAADAAAAAAEaAO4ADwAXABsAAD8BFxUHJw4CLgI3LwE1FwYVFB4BNjcnFzUHJucMDHIDDxUWDwYDJghAAQsQDgJY19etQAqhCh4LDwYFEBULCgokPQICCQwCCAgsOYo9AAACAAAAAADuAPUAOABCAAA3BicGLgI3ND4CMzIXFhUUBiMiNQ4BIyImND4BMzYWFzczBwYWMzI2NTQmIyIOARUGHgI3FjcnFDMyNjc2IyIGxBofESEZDAEOHSYUJBYZHxcVBhEKDhENFw0JDwMEEQ8DAwYOFSUfGCUVAQkUGw4cGUwRCxAECRkOEkQPAQEMGSASFCcdEBMVIx4nEgkJEyIdEgEKCA88DQofFh0gGCkYDxoUCgEBDTgXEhEkHgAAAAADAAAAAAEsAOEAAwAHAAsAACUhNSEVITUhNSE1IQEs/tQBLP7UASz+1AEszhOpEzgTAAAAAgAAAAAA6wD+ACYAOwAANycjBxc3FTEVMRUUHwEWFx4BHwEeAh0BMzU0LgIvAS4CNycXBzY3Ji8BBg8BDgMdATM1ND4BN8UoDigNFQECAgIEDQcOBwwHGgULDAcNBgsGAQEVNAMDBwQCBQYNBwwLBRoHDAfVKCgNFBMJBgUFCwYGCxEIDwcREw0REQ0YEhAHDgYQFAsdFFMEAwoMBQcGDgcPExgNERENExEHAAIAAAAAAPQBGgAMACsAABMiBh0BFBYyNj0BNCYXNjUzFAYHDgEHBgcVIzUmJy4BJy4BNTMUHgIyPgGWFyEhLiEhLgYTBAMIGhENDhIODREaCAMEEwsWGx4bFgEZIRdLFyEhF0sXIaAODwkTCBEaCAUBJiYBBQgaEQgTCQ8bFgsLFgAAAAMAAAAAAPQBGgAMABkAOAAAEyIGHQEUFjI2PQE0JhcOASImPQE0PgEWHQEXNjUzFAYHDgEHBgcVIzUmJy4BJy4BNTMUHgIyPgGWFyEhLiEhDwEVIBUVIBUgBhMEAwgaEQ0OEg4NERoIAwQTCxYbHhsWARkhF0sXISEXSxchgxAVFRBLEBUBFhBLHQ4PCRMIERoIBQEmJgEFCBoRCBMJDxsWCwsWAAAAAAMAAAAAARoBGgARABYAGgAAEyMVIwcVFzMVMzUzPwE1LwEjFyM1MxcnMxUjlhNnCQlnE1QHKCgHVFDAwB+nXl4BGSUKSwmDgwImDiUDSzgcCRIAAAMAAAAAARoBGgAKABUAJQAAEx8BFQcnByc1PwEfATUnFSM1BxU3MT8BFxUHJzcjFwcnNTcXBzOhdAQOdXUOBHQVZ2cTZ2cjDi4uDR5xHg0uLg0fcgEZSwesCEtLCKwHS6tClkI2NkKWQloNLw0uDR4eDS4NLw0fAAMAAAAAARoA9AATAB4AIgAAJScjBxUzNRcGHQEfATM/ATU0JzcHFQcnNTY3FzM3Fi8BNxcBGYAGgBMrDwVLCEkGDz9CQUIBDTEHMA1BZ2dnwjIyd14RFRoIByIiCAgZFRlHAR4eARYSExMSESgoKAAEAAAAAAEQARoACQATAB0AJwAANwc1IxUnBxczNycXNxUzNRc3JyMPATMVIxcHJzU3FzMnNxcVByc3I8AhEiENMA4wbg0hEiENMA41IUFBIQ0xMWVBIQ0xMQ0hQWMgQEAgDTAwkw0gQEAgDTBQIBMgDjENMC0gDTANMQ4gAAAAAAUAAAAAARoBGgAMABAAGAAcACAAABM3MxcVByM1MzUjFSM3FTM1DwEVFzM3NScHNTMVBzMVI3EJlgkJLyaEEhKE6wkJlgoKjIODg4MBEAkJgwoTSxM5ExNeCoMJCYMKJhMTEksAAAAABQAAAAABBwEHAAwAFQAnACsANAAAJSMVJiMiBhQWPgE9AQcyFhQGIiY+ATcPARUmIw4BFBYyNj0BNxUzNQcVBzUHMhYUBiImNDYBBxMNDxQbGycbLgsRERcRARAxlgkNDxQbGycbhBMTgy8LEREXEBCpLwkbJxwBGxNVOBEXEREXEZUJCY0KARsnGxsUcQgSVAolCSaNERcQEBcRAAAAAAMAAAAAARkBFwAJABEAHQAANzM3FxUHJyMnNR8BNQ8BIxUzNxcHFwcnByc3JzcXHDRJEBBJNAlIOzsHLi63DSAgDSEgDSAgDSDOSAb0BkgJXlg7xzsCS0kNICENICANISANIAADAAAAAAEsARoAEAATAB8AABMfARUjNSM1IxUzFSMnNTczBxUzFyM1IzUzNTMVMxUjskACE0teS1QJCX4ENhUTODgTODgBF0EIJRNLzxIJ4QkSOc44Ezg4EwAAAAMAAAAAASwBGgASABwAKAAAASMvASMHFRczNSM1Mz8BMwczNQcjDwEjNTMfATMHIzUjNTM1MxUzFSMBEH8QB14JCWdeVQYQdwETE3oGEFBQEAd6ExM4OBM4OAEHDwMJzgoTcQIQJVQcAxA4EAL0OBM4OBMAAQAAAAAA9ADFABEAADcVFAYrATcnBxUXNyczMjY9AeEFBIEeDTAwDR6BCxHFJQQGHw0wCjANHxAMJQAABAAAAAABGgDSAAgADwAWACgAADc2HgEOAS4BNhcuAQ4BFh8BHgE+ASYnNxUUBisBNycHFRc3JzMyNj0BLBMuGgknLhoJRgkUEgoBBQ0JFBIKAQWcBgRNHg0wMA0eTQwQxQ0JJy4aCScuAgUBChIUCQ0FAQoSFAklJQQFHg4wCy8NHhAMJQAAAAUAAAAAARoBBwAHAAsADwATABcAABMzFxUHIyc1FxUzNQczFSMXIxUzBzMVIxz0CQn0CRPhvJaWcXFxcUtLAQcKuwoKuwmpqSYSExMTEgAAFwAAAAABLAEsAAMABwALAA8AEwAXABsAHwAjACcAKwAvADMANwA7AD8AQwBLAE8AUwBXAFsAXwAANyM1MxUjNTMVIzUzFSM1MxUjNTMdASM1FzMVIzczFSMDIzUzFyM1OwIVIzMjNTMXIzUzFyM1MxU1Mx0BIzUzKwE1Mxc3MxcVByMnNxUzNRczFSMVMxUjFTMVIyczFSMTExMTExMTExMTExMTExMlExMlExMlEhITExM4EhImExMlEhITExPOExNLE4MTE4MTE4MlExMTExMTll5ezhM4EzkTOBM5EyUTExMTExMBGRMTExMTExMTEyUSEiYTE0sSEqkTE6mpqRMmEiYTJYMTAAAAAAcAAAAAARoBGgAHAAsAEwAXABsAHwAjAAATNzMXFQcjJzcVMzUHNzMXFQcjJzcVMzUXIxUzBzMVIxcjFTMmEqkTE6kSEqmWE14SEl4TE15dEhISEhISEhIBBxIS4RMT4eHhJhMTExISExMTEyUTJRMmAAAABAAAAAABGgD6ACUAQABJAFIAACU2NzYnIyYHBgcGByYiByYnJgcxBhcWFwYVFBcWFxYyNzY3NjU0ByInJicmNTQ3NjcyFxYyNzYzFhcWFRQHBgcGJyIGFBYyNjQmMyIGFBYyNjQmAQQDAQEHBAQGCAkMDhJCEhkSCQUHAQEDFREPHxpTGx8PEYMhEBgMDREIDwoWERISFQoPCBENDBgQSggMDBAMDEoIDAwQDAzCCAoSEgECAQUFCQUFEAQCARISCggXICkYFQoICAoVGCkgeAMECwwZEw8IAgEBAQECCA8TGA0LBANSERgRERgRERgRERgRAAQAAAAAAS0BGgAMABAAIgAuAAATMxcVJic1IxUHIyc1FzM1IxciByMOARcHFzceAT4CLgIHBi4BPgIeAg4BOM8SCQpdFVwSEl5ewwwKAREJCywNLAkXFQ8HBA0VCAoPBwQMEBAJAQYMARkSZAQCXswVEs/Pz3EHCicRLA0sBgMIEBUWEgpLAQsPEQwDBg0PDggAAAAKAAAAAAEaARwACwAXACQALQBIAGIAdwCSAJ4ApwAANw4BLgI2NzYeAQYnLgEOAhYXFj4BJjc2FhceAQ4CJicmNhcWMjY0JiIGFAczFSMiJj0BIiY9ATQ2OwEGByMiBh0BMxUUFjcmKwEiBh0BFBYzFQYXFhczPgE9ATI2PQE0ByMVFAYrASImPQEjNSY2OwEyHgEVFyM1MzI2PQEzNTQmKwEmJzMyFh0BFAYjFRQGJyIOAR4CPgE1NCYHIiY0NjIWFAarCRQSCwIKCA0eEgYYBAoJBgEFBQYPCAMrCRQHBQQDCQ4RBgkCFAMIBQUIBZwiIgkOBwsTDiIHAxgGCRMCiwoOLg4TCwgBBwUHJggLBwsSEwICHgICEgEJBi4FBwM0IiIBAxMJBhgDByIOEwsHDq4JDgYDDBEQCRAMBAUFCAUF1QYCCREUEgYIBhkfJgMBBAkKCQMEBAwPBAUCBwUNDgsGAwYKGhYDBQgGBgilEw0KIgwIKQ0UCAsJBSo1AgJ6ChQOOwgMLAkHBQECDAgsDAg8DUo/AQICAT89BQkFBwJ2EwICNSoFCQsIFA0pCAwiCg3ZChARDAMGDwgMESYFCAYGCAUAAAAFAAAAAAEHASwAFQAZAB0AIQAlAAATFRcVByMnNTc1MxUzNTMVMzUzFTM1AzM1IxczFSMXIxUzBzMVI/QTE7wSEhMmEiYTJam8vCZwcHBwcHBwcAEsExL0ExP0EhMTExMTExP+5/QmEzgTOBMAAAAABAAAAAABGgD0AAoAEAAUABwAADcfARUPAS8BNT8BFwcfAT8BBxc1JxcVNzUHFQc1oWwMB3NzBgtrBEsKQDkRsV5ecV4mE/QdCX4JICAJfgkdExMDEQ8FdxpsGRlsGmsKMAUwAAMAAAAAARIBGgAjAC0AQgAAJSc1JzU0JyYnJiMiBh0BBwYUHwEWFxY3Nj8BBxQeAjI+AicmPgIeAR0BBxcOASYvASY0PwEVBhQeAT4BJic1FwERFlwCBAsGBQwQOQkJRAQFCwoFBF0NAQYHCggGApYBAQMEBgQSEwEFBgFEAwNSBQYKCQQDBEhPOgFcFwYFCwQCEAw9OAgXCUQEAgQEAgRdKgQJBwQEBwizAgQDAQEFBBcTqgICAgJEAggDUTUECwkDBQkKAzVJAAAAAAIAAAAAARoBGgAMABMAADcyPgE0LgEiDgEUHgE3Iyc3FzcXliQ8IyM8SDwjIzwRDSsNJE8NEyM8SDwjIzxIPCNNKw0kTw0AAAMAAAAAARYBGwAGABwALwAANzM3JwcnBzceARcWFRQHDgEHBicuAzc2Nz4BFzY3Nic0JicmJyYGBw4BFhceAXYNVQ1PJA1WFikQJh4PJhYwJxQeEAMHDyYSKyEmGRkCEQ8dJhMmDyAXISIQJmBWDU8kDY4BFBApNysnEhcECRYLIiouFS4ZDAz0CR8iJRcqEB0DAQkLGE5IEwoGAAQAAAAAARoBGwALABcAIwBFAAA3IxUjFTMVMzUzNSMnLgEOAhYXFj4BJic+AR4CBgcGLgE2FzMyFh0BIzU0JisBIgYdATMVFBY7ARUjIiY3NSImNzU0NvQTJSUTJSVUBAoJBQEEBQYPCQMmCRQSCwIKCA0eEQYKLg4TEgkGLgYJEwICDw8JDgEJCwETcSYTJSUTuAMBBQgKCQMEAw0PFAYBCREUEgUJBxkeRRMODg4GCAgGMz8BAhMNCSwMCDIOEwAAAAAEAAAAAADPARoACAARACkAPQAAEzIWFAYiJjQ2NyIGHgEyNjQmFyMiBh0BBhYzFQYWOwEyNj0BMjYnNTQmBzUmNjsBMhYHFSMVFAYrASImPQGWCAsLEAsLCBAWARUgFhYHLg4TAQsJAQ4JHgoNCAsBE0oBCQYuBgkBEgICHgICAQcLEAsLEAsSFh8WFh8WVBMOMggMLAkNDQorDAgyDhNUMwYICAYzPwECAgE/AAAAAAEAAAAAASwBBwAtAAATBxUzNTMVFzM3NTMVFzM3NTMVFzM3NTMVIzUjFSM1IxUjNSMVIzUjFRchNzUnExMTJQoSCiUKEgolChIKJTgTLxIvEzgTEwEGExMBBxNxcWcKCmdnCgpnZwoKZ7w5OTk5OTlLSxISvBMAAAQAAAAAARoBGgAFAA4AGwAtAAA3My4BJxU3HgEXFhUjNTIHFzMOASMiLgE1NDY3FzI+ATc2NSM1IgcOAhcUHgG8SQYoHAEjMwYBcAkvE1wHMyIZLBkrIBMbMCAEAnEJChorGQEeM7wbKAZJXAYzIwoJcIMTICsZLBkiMwfMGCsaCglxAgQgMBsfMx4AAgAAAAABBwDhABwANwAAJRUjIiYnIw4DKwE1Iyc3MzUzMhYXFhczPgEzBwYHBg8BIycmJy4BJxU+ATc2PwEzFxYfARYXAQcGCxMHNgQMDxIKCTwTEzwJChEIEAg2BxMLCQMDBQMETQIECQQPBgYPBAkEAk0EAQIFAgTOgwoJCQ4KBUsKCUsFBQoSCQoUAQIDBgUGDAgDBwGDAQcECAsHBgMCBAIBAAAAAgAAAAABLQEHADYAUAAAEzMVFAYHFR4BFwYHMSYvATU3Nj8BNjcjFhcWHwEVBwYHDgEHMwYHIxUHJzUjNTQ2NzY3NS4BNRc+AhceARcWFAcOAQcGIicuAScmNjc2NzZLgwkKCQ0ECQgJDAYFAwIEAgFbAgEEBQYHCwgEBwFeBQQKCQpLBgQKEgkKjAcODwgOFQQCAgQVDggPBw4WBAIBAQUMBAEHBgsTBzYECwYDBQoEAk0EAQIFAwMEAgUDBE0CBAkEDwYHCDwTEzwJChEIEAg2BxMLmAQDAQMDFQ8HDwgOFQQCAgQVDggPBxALBAAAAgAAAAAA4QEHABwANwAAEzMVFAYHFR4DHQEjFQcnNSM1NDY3Njc1LgE1FxYXFh8BFQcGBw4BBzMuAScmLwE1NzY/ATY3S4MJCgkOCgVLCQpLBgQKEgkKFAIBBAUGBwsIBAcBgwEGBAgMBgUDAgQCAQEHBgsTBzYEDA8SCgk8ExM8CQoRCBAINgcTCwkEAgUDBE0CBAkEDwYGDwQJBAJNBAECBQMDAAAABAAAAAABFgEbABUAKAAuADEAABMeARcWFRQHDgEHBicuAzc2Nz4BFzY3Nic0JicmJyYGBw4BFhceASc3FxUHJzcVN6EWKRAmHg8mFjAnFB4QAwcPJhIrISYZGQIRDx0mEyYPIBchIhAmJw5UVA4SOgEZARQQKTcrJxIXBAkWCyIqLhUuGQwM9AkfIiUXKhAdAwEJCxhOSBMKBqsIOBA4CF9OJwACAAAAAADwAQcABQAIAAATBxUXNzUHNRdHDw+ppY8BBwjhCHAQZ75fAAAAAAIAAAAAAOIBGgAVAB8AABMjFSMHFRQWFxUzNT4BPQEnIzUjFSMXDgEuAT0BMxUUgxIdCSUdEh0lCRwTJjsMIh8TcAEZOAlCHCsDOTkDKxxCCTg4cwwGDRwRODgXAAAAAAUAAAAAAQ0A7wAHAA8AHwAnAC8AADcjJyMHIzczFycmJzEGDwEXNTMyFhUUBgcVHgEVFAYjJxUzMjY1NCMHFTMyNjU0I6ATDz4OEzgREBcBAQECFm4pExYOCw4SGxQZEQ4QHBMXDxAjXigokFk+AwcHAz43kBIPDBIEAQETDxIXgS8ODBU+NA4MGgAACAAAAAABGgEHAAcACwAPABMAFwAbAB8AIwAAEzMXFQcjJzUXMzUjFyMVMycjNTMHMzUjFzMVIycjFTMHMxUjJuESEuETE+Hhzry8E5aWOEtLEyUlOUtLS0tLAQcTvBISvLy8EzgTEoNLEyU4EyUTAAIAAAAAAOsA6wAHAAsAAD8BMxcVByMnNxUzNUIJlgkJlgkShOEJCZYJCY2EhAAAAAUAAAAAARoBGgAHAAsADwATABcAABMzFxUHIyc1FzM1IxczFSM3IxUzNzMVIxz0CQn0CRPh4RImJnEmJiUmJgEZCfQJCfTq4RO8vHFxlgAAAQAAAAABGgD0ABIAADcnIwcnIwcjFTM/ARczNx8BMzXdIRMjFhIWNTwKDRYTIxsJQ4NxfV1REgcyX4RYBhIAAAQAAAAAAQcBGgAMABkAPABAAAATIg4BFB4BMj4BNC4BByIuAT4CMh4BFA4BNy4BIg4CBzM0PgEyHgIUBg8BDgEXFTM1NDY/AT4CNCYHMxUjjSE4ISE4QjghITghHDAcARswOC8cHC8BBQ8RDwoEARcFBwYFBAIEAw4DBAEWBAMHBAYEBC4VFQEZIThCOCAgOEI4IeEcLzgwHBwwOC8cngUGBgsNBwUHAwEDBQgJBBAECQUMCQQIBAgECgsNDF4WAAIAAAAAAQoBDQAQACIAADcOARUyMzIWFAYjIiY1NDY3Fw4BFTIzMhYUBiMiJjU0NjcXhiMgAwUTHBoVGx0vL5kkIAMFExwaFRsdMC4W6hYzJBgrGyomNU4bIxYzJBgrGyomNU4bIwAACAAAAAABGQEaAAwAGQAlADEAQwBOAFIAVgAANzQ2NycOARQWFzcuATcUFhc3LgE0NjcnDgEXJz4BNCYnNx4BFAY3Bx4BFAYHFz4BNCYHFg8BFwcnIwcnNy4BPgIeAQcOAh4BMjY0LgEXIwczFycjBzgQDw4RExMRDg8QFA0MDQkKCgkNDA2QDgoKCgoOCw0NDg0OEBAODRETE0sBBQVAEQ5oDxFABQQHDQ8NCR4CBAECBQYGBAUCBREmGRE2EMMVJg4NESwxLBENDiYUEB8MDQkYGhgJDgwfTQ4JGBoYCQ0MHyEfhg0OJikmDg0RLDEsQgoIBJEIISEIkQYQEAkBBgwBAQQFBQMFBwQCJyQ4JSUAAAAABQAAAAABGgELABUAHgAqADMAPwAANxQHMzYuAQ4CHgE3NQYuAT4CHgEHMjY0JiIGFBYXMjcXDgEiJic3HgE3MjY0JiIGFBYXMxUzFSMVIzUjNTPhARMDIDtALgwcOSAaLhgGIzMxHnoICwsQCwsuFA4NCRkbGQkNBxIvCAsLEAsLNxMlJRMlJZ8EBSA5HAwuQDsgAxMDGC80Jw0TKxELDwsLDwsvDg0JCwsKDQcILwsPCwsPCzgmEyUlEwAOAAAAAAEaAPQADwATABcAGwAfACMAJwArAC8AMwA3ADsAPwBDAAAlIyIGHQEUFjsBMjY9ATQmByM1MwcjFTMHIxUzNzMVIxcjFTMnMxUjNyMVMyczFSMVIxUzBzMVIzUzFSM3IxUzBzMVIwEHzwgKCgjPBwsLB8/PORISEhMTJRMTExMTg11dgyYmXhMTExNLExMTEzgSEjgmJvQLCIMICwsIgwgLloMTEhMTOBI5EhISOBM4EhMTExJdEhISExMAAAAAAwAAAAAA4gDhAAgAFQAeAAA3MjY0JiIGFBY3FA4BIi4BND4BMh4BBzQmIgYUFjI2lggLCxALC1MUIygjFBQjKCMUEyEuISEuIYMLEAsLEAsTFCMUFCMoIxQUIxQXISEuISEAAAMAAAAAARYBGwAIAB4AMQAANzI2NCYiBh4BNx4BFxYVFAcOAQcGJy4DNzY3PgEXNjc2JzQmJyYnJgYHDgEWFx4BlhAWFiAWARUbFikQJh4PJhYwJxQeEAMHDyYSKyEmGRkCEQ8dJhMmDyAXISIQJnEVIBYWIBWoARQQKTcrJxIXBAkWCyIqLhUuGQwM9AkfIiUXKhAdAwEJCxhOSBMKBgABAAAAAADrAQoAGQAAExUHIzUzJy4BDgIWHwEHJy4BPgIWHwE16glCMBINIiMZCgoNYQ1iEAwMISwsEQ0BB0IJEhINCQkZIyMMYg1hESwsIQsLEQ0nAAAACgAAAAABKgEsABUAHQAhAC4AMgA2ADoAPgBCAEcAADcHJzcjIgYUFjsBFSMuATQ2NzMnNxcTIyc1NzMXFSczNSM3MxcVByM1MzUjFSM1FyMVMwczFSMXIxUzNzMVIxcjFTMnMTMVI4srDho8DRERDQsLFBwcFDwaDitFeAoKeAp4ZGRGeAoKMihkFBQ8PDw8PDw8PBQ8PDwUFCoqFvMrDhoRGRIUAR0oHQEaDiv+/wqgCgqgCox4CqAKFIw8RoIUFBQUFMgUPBQ8FAAAAQAAAAABCQEHAB0AADcjNTMXFSM1DgEeAT4CJic3HgIOAy4CPgFYMkEKExoRGjlAKwUkHwUZJRIEGiszMSUSBBr0EwpBJRM/PB8LMEE1ChIIIzAzLB0HECMwMywAAAAAAgAAAAABCAEHABEAFQAAEzMVNxcHFwcnFSM1Byc3JzcXBzMVI7wSMAkwMAkwEjAJMDAJMJZLSwEHOx0QHR4QHTo6HRAeHRAdW0sAAAUAAAAAAS0BEgASAB8ALAAyADgAABMzFxUmJzUjFTMUFyM1MzUjJzUXIg4BFB4BMj4BNC4BByIuATQ+ATIeARQOATcnNxcHFycXBxc3JxH+CQkK6mEUTjprCtcVJBUVJCokFRUkFRAbEBAbIBsPDxsQGhoJExNLEhIIGxsBEQlsBwVWsCAaExQJxGwVJCokFRUkKiQViA8bIBsQEBsgGw8nGxsJEhMREhMIGxsAAAAAAgAAAAAA8gEaAAYADQAANyc3JwcVFycXBxc3NSfyS0sMUFCuTU0MUlJ5SksLUAxQVk1MDFMLUgABAAAAAAEaAKkAAwAAJSE1IQEZ/voBBpYTAAAACwAAAAABGgEaAAsAFQAmADoARABYAGEAcwB7AH8AhgAANzYyFhQGIicHIzUzFRQWMjY0JiIGFQcnNxc1NDY7ARUjIgYdATcXNzM1NCMiBgcVNjIPAQYVFBYzMj8BFRQGIiY1ND8BByM1BiMiJjU0PwE0Igc1PgE3MhUHNQcGFRQWMjYXMjc1BiImNDYyFzUmJyIGFBYnNzMXFQcjJzcVMzUnNzMXFQc12gQOCAkOAwELCwQHBAMHBYwnDBMPCywsBAUSDDsNEgQJAwcPAQsOBwYIBAEFBgMGBywMBAgGBw4LDgcDCQQRDAcGAwYENwkFBQwHCAsEAwgMDg19EqkTE6kSEqlwEoQSEvoJDhgPBwZKNAQHCA4HCAVOKAwTHQoQEQYDHRIMDSAXAwIMBQkBAxAHCQkSBAQHBAIHAQGvBwkJBxADAQkFDAICARcLBAEBBwIEBhIDDgQIDgkEDgIBEBoPSxMTXRMTXV1dJhMTXhNxAAAABgAAAAAA4gEaABAAHQAnADoAQgBGAAA3FzcnBzU0NjsBNSMiBh0BJxczFj4BNCYiBycjFTM9ATQ2MhYUBiImBwYjIiY1JjYzMhcVJiIGFBYyNycHFRczNzUnBzMVIzwrKQ0TBgMdHAwQFG8BBRUNCxYGARAQBgsGBgsGEAcOEBMBFhEMBgcRCwoRCF4TE4MTE4ODg+YrKg0THgQGEhAMHhQvCQESHhELJ1wbBwcICREKCZYFFBASFQMTBQsTCwVbE3ATE3ATE3AAAAAAAQAAAAABBwEEABUAABMHFRc3JzMyFhcWHQEzNTQuAisBN3ZLSw49JCc0EB4TESY8KSI7AQRMDUsNPBAQH0cGBic5JhM6AAAACQAAAAABGgEaACgALAAwADQAOwBLAFMAVwBbAAA3IzUzNSMiDgIdAQYWFxYXMzUjIicmJzQ9ATQ1Njc2OwEVIxUzNzUjJyMVMwczFSMVMxUjFyM1MxUjJzczFxUHIxUjNSMiJj0BNDYXMzUjIgYeATsBNSMnMzUj9KlLUAYNCQQBCwoGBgUFAwIGAgIGAgOuS1QKE4MTExMTExMTBQU4BRdCVAkJLxMSCAsLEQkJBAYBBSAmJhM5OXGWEgUKDAayChAEAgETAQMFAwIKAgMFAwEmEwpUcRMTEhMTgzg4HOoJcQkTEwsIXgcLcBMGCAUTEjkAAAIAAAAAAQcBGgAhADMAABMzFxUHIzUzNSM1MzUjFTMVIyIGHQEUFjsBFSMGJjc1JjYfATcVBxc3FTM1FzcnNRc3JyNGtwoKQTg4OKk4PQYICAY9PQ0UAQEUKw0lMQ0kEyYNMyUNNA4BGQnhCRImE5aWEwkFCgUJEgEUDbIOE1oNJBsxDSSOkCYNMxolDTUAAAQAAAAAAQcBCAAvADgAQQBKAAAlNC4BDgEWFxUUDwEnJj0BPgEuASIOARYXFRQWHwEVDgEeATI+ASYnNTc+AT0BPgEnNDYyFhQGIiYXFAYiJjQ2MhY3IiY0NjIWFAYBBxQeFwQQDgU0NAUOEAQVHBUEEA4IBzMOEAQVHRUDEA0yCAgMD7sLEAoKEAtnCxALCxALLwgLCxALC+EPFQMTHBkDFAYDGhoDBhQDGBwSEhwYAxQIDgMbGAQXHBMTHBcEGBoEDggUAxQNCAsLEAsLoQgKChALC44LEAsLEAsAAAAABwAAAAABGAEaACsALQAxADUAOQBDAEoAABMVIzUjFTMVByM1MzUjIgcGBxQdARQVFhcWOwEVIyInJicmPQE0NzY3NjsBBzUXIxUzFSMVMwczFSM3BxcjFTMHFzc1DwEjNTMVI/QTqbwKVEuuAwIFAwMFAgMFBQYGDQUCAgUNBga3xDgTExMTExMTlw0kdngmDTWwFwU4BQEQHBOWQgkSJgEDBQMCCgIDBQMBEgIFDQYGsgYGDQYCrIsEExMSExNWDSQTJg01DYgcODgABQAAAAABBwEaACEAJQApADMANwAAEyMiBhcVBhY3MzUjIiY9ATQ2OwE1IzUzFSMVMxUjFTM3NQcwHQE3IxUzBxc3FTM1FzcnIyczFSP9tw0UAQEUDT09BggIBj04qTg4OEEKzzkTEwwNJBMmDTUNPBMTARkTDrINFAESCQUKBQkTlpYTJhIJ4RcBi4cTVw0kjpAmDTUPEgAGAAAAAAEHARoAJgAqAC4AMgA2AD0AACU1JyMiBwYHBgcVFBcWFxY7ATUjIicmJyY9ATQ3Njc2OwEVIxUzNyc1MxUnMxUjFTMVIxcjFTMXByM1MxUjAQcKtwYGDQUCAQMFDQYGBQUDAgYCAQECBgIDrktUCryplhMTExMTExMJFwU4BXGfCQIGDQYGsgYGDQUCEgEDBQMCCgIDBQMBJhIJQpaWgxMTEhMTZxw4OAAAAAQAAAAAARoBGgALABQAGAAcAAATMxcVByMHJzUjJzUXMzUjFTMXFT8BMxUjFTM1Ixz0CQl/NhAvCXp64S4KKAcSEhISARkJvAk2By8JvLKpqQohKJleJRIAAAAABAAAAAABBwEaAAkADgAaAB4AABMfARUHIyc1NzMHMzUnIxcjFTMVMzUzNSM1IwczFSPJOAUSqRMTcHCpOXBLJSUTJSUTJV1dARQ4DqgTE+ES86g5SxMmJhMlgxMAAAAABgAAAAABGgEaABEAFgAbACgALgA3AAABIgcGByMHFR8CMzc1Njc2NQczBgcnFyc2NxUvATY3Njc2NwYHBgcGBzUjNSMVNzYuAQ4BHgE2ARAvLiUkTgkDcAc4CSETF/MxFxMHagcbF0BAEBUjJDAvAx4XJBdIJRO3BgUTFw0FExcBGRcTIQk4B3ECCU4kJS4vVBgbB2oHExcxFUAYFyQXHgMvMCQjFTgTJTiQCRcNBRMXDQUABAAAAAABJQEHAB4AKAA1AD4AADc1NzMfATMXFTMXDwEjNjczNyMmJz8BMzUjLwEjFQYXFAYiJjQ2MhYVMxQOASIuATQ+ATIeAQcyNjQmIgYUFhMJXgYRbAoVCTIJRgcFMy1sBggDBlVnBxBQClURFxERFxAmEh4jHxERHyMeEkIUGxsnGxu3RgoDEAouDIQGCApxBwYDAyUDEDEFVwwQEBgQEAwSHhERHiQeEhIeQRwnGxsnHAAAAAQAAAAAARoBBwAcACYAMwA8AAA3MxcVByM2NzM3IxUmJz8BMzcjLwEjFQYHNTczFwcUBiImNDYyFhUzFA4BIi4BND4BMh4BBzI2NCYiBhQWkX8JCWwHBVYBdwgJBwZ6AXoHEFAKCQleBxARFxERFxAmEh4jHxERHyMeEkIUGxsnGxv0CrsJCAqEAQYEBgMTAxAxBQdGCgOdDBAQGBAQDBIeEREeJB4SEh5BHCcbGyccAAAAAAMAAAAAAPQA9AAEAA4AGAAANyM1MhYnFTIeARUzNC4BBxUyHgEVMzQuAV4mEBYmLk4tEzNWMxorGRMfMzgmFqwTLU4uM1YzSxMZKxofMx8AAwAAAAABGgD0AAkADgASAAA3FzM3NS8BIw8BFyc3MxcnMxcHE3wOfD4HfAc+g281dDVvMiJUpXx8Dj4DAz52bzU1IiJTAAAAAwAAAAABIAEaAAUACAASAAATBxUXNzUHNR8BMxcHJxUjNQcnIQ4OqaSOMA0vDR8THw0BGQjhB3AQZ75fCy8NH2ZmHw0AAAAAAwAAAAABFgEHAAUACAAPAAATBxUXNzUHNRcHNzUnFRcHNA4OqaWPVqSkjo4BBwjhCHAQZ75fdW0QbhdfXwAAAAMAAAAAASABGgAFAAgAEgAAEwcVFzc1BzUfASMnNxc1MxU3FyIPD6mljj0NLw0fEx8NARkI4QdwEGe+X44vDR9mZh8OAAAAAAQAAAAAARYBBwAJABwALgA6AAA/ARcVBzU3JxUjByYGBwYWFx4BNjcxNjU0JzUuAQc2FzEWFx4BFTEWDgEuATcxNhcnBxcHFzcXNyc3J14OqWxWjhMDGSgIBAIECSsxERAUCRYwDhQSDgcIARgkIBAGBSwWDBcXDBYXDBcXDP8IcRBIFzlfRA8BGhkMGAwWGQoTFRceFQEICxkKAQINCBQLER8IEyETExcXDBgXDBcXDBcYDAAAAAAEAAAAAAEaARoADwAYABwAJgAAJS8BIwcVIwcVFzM3NTM3NQcjNTMVMzUzFwc1MxUXIzUvAiM1MxcBFhwGoAkvCQm8CS8JS6gScQ8WXSVxJgMcBl6SF/ocAwkvCbwJCS8JoM6oOTkWDyUlS14GHAMmFwAAAAUAAAAAARoBGQAUABgAIAAjACcAABMfARUjBzUnIxUjNSMVMwcjJzU3MwczNSMfARUPASc/AQ8BPwEXNyfPHwYKCR8GcSU4Ci4TE5w/JiZ6HHI5DBxyZwoTAw9hDwETHw4GCQ8gS0u8EhK8E0s5ORwNchwNOHKHEwkdD2EOAAAAAwAAAAABGgEaAAkAEgAWAAATHwEVByMnNTczBxUzNScjFSM1MxUzNfocAwn0CQnYzuEXIoNLJgEXHQbYCQn0CRLhyhdLSzk5AAAAAAYAAAAAARoBBwADAAcADgAVABwAIwAANzM1IxczFSMnIzU3MxUjNxUjNSM1MwczFQcjNTMjMxUjJzUzOLy8JnBwOBMJQjjzEjlCCRIJQjnhOEIJE0uWJUtLQQoTCUE4E5ZCCRISCUIABgAAAAABGgEaAAYADQAUABsAIwAnAAA3IzUzNTMVNzUjFRczNQcVMzUzNSsBFTMVMzUnNwcjJzU3MxcHIxUzQi8lE6kTCS84EyUv1yUTCZ8JhAkJhAklS0vhEyUvCiUvCROyLyUTEyUvCRwJCV4JCRwmAAADAAD//wEsARAAEgAfAC8AABMiDgEVFBYXBxc3FjMyPgE0LgEHND4BMh4BFA4BIi4BFwcjJzcXNzMXNzMXFScHI5YXJxYMC0UNRhUaFycWFidZEh4kHhISHiQeElUoDhwNFigNKSgNHyUpDQEQFycWER4MRQ1GDhcnLScXVBEeEhIeIx4SEh6CKBwNFSgoKB8aJSgABAAAAAABGwEfABwAKQAyADoAADcOARcWFwYXFScHJzcuAT4BHgEVFAcmJzU0LgEGFz4BHgIOAi4CNhcWNxY3JwYVFDcXNic2JiMibBMJCwgPAgEJRw5HFwUkQUIpAQgJHS8yJxApJBYDEiIoJBYCERIRFxIPTwoYTgsBASEYEu4TNRgSDAkJAwZFDUUZRToZEzcjBwgHBgIaKhQKZAsDEiEoJBcCESIoJFsRAQELTg4SGEZPDxIXIQAAAAACAAAAAAEsAS0ADwAdAAATIg4BFhcHFzceAT4BLgEjFSIuATQ+ATIeARQOASO/HzMZCRRkDmQbQzgWFDchFycXFycuJhcXJhcBLCE4PBZzDHIVAiZAQSi7FicuJxYWJy4nFwAAAgAAAAABGgEQAAYADQAAEzcXFQcnNxcHNycfARUTDvj4Dh0UGNHRGGUBCAhwEXAIbwlXYl9WAhIAAAAABgAAAAABHAEaAAMABwALAB0AIQApAAA3MxUjFTMVIxUzFSMXITczNTQ+AjsBMh4CHQEzBzM1IxcnIxUjNSMHcUtLS0tLS6v+9BgjAwUHBHAEBwUDI6ZwcKYOFZYVDvQTXhITE0teqQMHBQMDBQcEqCbP9DglJTgABgAAAAABGgEHAAwAEAAuADcAVQBeAAATMxcVIzUjFTMVIyc1FzM1Ixc1JicHJzcmNyc3FzY3NTMVFhc3FwcWBxcHJwYHFScUFjI2NCYiBhc1JicHJzcmNyc3FzY3NTMVFhc3FwcWBxcHJwYHFScUFjI2NCYiBhz0CRLhg40JE+HhXQUEEQoSAQESChEFBBMFBBIJEgEBEgkSBAUXCAsJCQsJZQUEEgkRAQERCRIEBRIFBBIJEQEBEQkSBAUXCAwICAwIAQcKejmEEgnOLyapFQEDChEKBQUKEAoEARUVAQQKEAoFBQoRCwQBFS8GCAgMCAhtFAIDChALBQUKEAoDAhUVAgMKEAoFBQsQCgMCFC8GCQkLCQkAAAYAAAAAAQcBGgAHABsAIwA3AD8AUwAANyc1NzMXFQcnIxUjNSMVIzUjFSM1IxUzNSMVIwcnNTczFxUHJyMVIzUjFTM1IxUjNSMVIzUjFSMXNzUnIwcVFzc1MxUzNTMVMzUzFTM1MxUzNTMVLwkJzgoKQRMTExITExO8JhKNCQnOCgqMExMTvCYSExMTEowKCs4JCQkTExMSExMTEibOCjgJCTgKORMTExMTEyYmE4MJOAoKOAk4ExMmJhMTExMTgwk4Cgo4CRMlExMTExMTExMlAAAABAAAAAABLAEsABcANwBDAE4AADcXFQcXBycHIycHJzcnNTcnNxc3Mxc3Fwc3NS8BNycHLwEjDwEnBxcPARUfAQcXNx8BMz8BFzcvATYzMhYVFA4BLgE2FxYzMjY0LgEOARb4NDQeKywLPAssKh00NB0qLAs8CywrMTIyBxwRKxEKGQoQKxIdBzIyBx0SKxAKGQoRKxEcYAsNEhkUHhsLCBkGBgkMCQ8OBgW/CzwLLCodNDQeKywLPAssKx40NB4rbAoZCxArEh0HMjIHHRIrEAsZChArEh0HMjIHHRIrSwcZEg8YBg4dHS0DDBELAwcODwAAAAkAAAAAARoBBwADAAsAEwAXABsAHwAnACsALwAAEyMVOwEjJzU3MxcVByMnNTczFxU3IxUzBzMVIycjFTM3Mzc1JyMHFTcjFTMHMxUjQhMTcjwHBzwIZjwHBzwIQRISEhISSxMTlDwHBzwILxMTExMTAQdeChMICRNBCRMJCRONJktwODg4CRIJCRKgcUslAAMAAAAAARoBHAAkAEUAUQAANy4FNzU3Mj4CNzY3NhcWFxYXHgMzFxUUDgQHJxUUHgMfATY3PgQ9ASMmJyYvASYnJgcOAwcXPgEuASIOARYXBzObDxwaFhEKAQkKEBEPBwsMEhMMCwYFCA8REAoJCREXGRwPbAgPFRgNFgwLDRgVDgkLCQoUEQkICg4PCRETEwpoCQoEEBQPBAkKCCUYCRMWGR4jEjwJAgMGBQcEBQMBBgMDBQYDAgk8EiMeGRYTCdEzEB0bFxUIDwcICRQXGx0QMwECBAsFBAICBAMLCAQBUQQSEw0NExIEMQAAAwAAAAABGwEHABUAGQAjAAA3NRc1JyMHFR8BNzUzNzUHFSM1LwEzByc1HwEzFSMXByc1NxfPEgmpCQZeDEIJEjkGRINMS0s6XVweDi4vDeUBEyoKCsoJIAkTCSoTDpwIGNQZrRkuEx4NLg0vDQAAAAMAAAAAARsBBwAXABsAJQAANxU3NScjBxUxFR8BNzUzNzUnFSM1LwEzByc1HwEjNTMnNxcVByfPEgmpCQZeDEIJEjkGRINMS0t7Xl0eDS4uDeUdEyIKCgnBCSAJEwkiEyycCBjUGa0ZQBMeDS4OLg0AAAAABQAAAAABHQEdAAwAGQAiACsAOAAAEz4BHgIOAi4CNhceAT4CLgIOAhY3FAYiJjQ2MhYXFAYiJjQ2MhYHIiYnBx4BPgE3Jw4BTR1HPygEIDtFPygEHikZPDYiBBszOzYiBBo8CxALCxALXgsQCwsQC0IQGggQCiUqIwkQBxwBAxQFHztGQCcEHjxFP7cQBRsyPTYhBBsyPDVfCAsLEAsLCAgLCxALC1MQDQkSFQEWEwgOEQAAAwAAAAABGgEaAAgAMQBYAAA3FAYiJjQ2MhYnIgYVFBcHIxUzFTM1NxYXMxUjIgYVIgYeATsBPgE0JiM0JiM1NC4BIwc0NjsBMhYdARczMhYdATMyFhQGKwEiJjQ2OwE1NDY7ATc1JyMiJpYFCAYGCAUvExwIFSIdEhUMDhwSEBYQFgEVEKkPFhYPFhARHxFCEAwmExsKCQgLEwgLCwipCAsLCBMLCBwJCSYMEOoEBQUIBgYrGxQOCxUTHCEVBwElFg8WIBYBFSAWDxZCER8RLwwRHBNLCgsIEgsQCwsQCxMHCwo4CREAAAcAAAAAARoBBwAKAA4AEgAaAB4AIgAsAAATBxUzNTMVNxc1JwczFSMHIxUzJwcVFzM3NScHNTMVJyMVMzcjFScHFzM3JweDEhKEAw8ScSYmOCYmOBMTgxMTg4MTJSVeExYNJg0mDRYBBxM4OC4DDzoTJiU5JUsTXhISXhNxXl45JpZIFg4mJg4WAAAABAAA//8BBwEsACwANQA+AEcAACU0LgEOAh4BFw4BKwEiBzU+AS4BIg4BFhcVDgEeAj4BJic+ATsBMjY3PgEnNDYyFhQGIiYXFAYiJjQ2MhY3IiY0NjIWFAYBBw4YGhYJBBINBRILJRYQEhUDGyQbAxUSEhYDGSQcBhISBRILJRIdBhEYzhAYEBAYEDgQGBAQGBBnDBAQFxERxQ0XDAIQGRoTBAoLD1sDHSQYGCQdA3IEHCQZAhYkHgUKCxURAhtJDBAQFxERwgwQEBcREW4RFxAQFxEAAAAABAAAAAABGgEaACwAQABrAH8AADcWMjY/AT4BPwE+Ai4BLwEuAS8BLgIOAQ8BDgEPAQ4CHgEfARYXFh8BFj8BFx4BHwEHDgEPAScuAS8BNz4BFxYyNj8BPgE/AT4CLgEvAS4BLwEuAg4BDwEOAQ8BDgEUFh8BHgEfARYvATc+AT8BFx4BHwEHDgEPAScuAWUFDQoCCAQOChoFBgMCBgcZCg8DCQIJCQkGAggDDwkaBQYDAgYGGgwJBAMIAgcKCAUVDhoaDhUFCQkEFQ4aGg4UdgQKCAEFAQcFDgUFAQMFAw8EBwEFAgYIBgUCBAIGBQ4FBQUFDgUHAQUBDQMDCQ0DAQEDDQkDAwkNAwEBAw1hAwcGGgoOBAgCBgkJCQIJAw4KGgYGAgMHBBoKDgMJAQcJCQkCCAQLBgcaBocaGg4VBAoJBBUOGhoOFQUJCQUUyAMFBQ4FBwEFAQcHBwUBBQEHBQ4FBQEDBQMOBQYCBQEICggBBQEHBQ4FMgEBAw0JAwMJDQMBAQMNCQMDCQ0AAwAAAAABGgEaAAcACwAPAAABIwcVFzM3NQcjNTMXIzUzAQfPEhLPEoNeXnFeXgEZEs8SEs/Pz8/PAAAAAwAAAAABGgEaAAcACwAPAAABIwcVFzM3NQcjNTM1IzUzAQfPEhLPEhLPz8/PARkSzxISz89eE14AAAAAAwAAAAABGgESAE0AnACmAAA3JiMuASMVDgEHFRYXFhcyMQYHBgcGHQEUFjI3MwYHIw4BFQYWOwEWPgInJi8BLgE2PwEzMhcWFxY2NzY1NCcmJyYHBgcGByYnNTQmJxcWBwYHBisBNDY7ATUmNjcnBgcjIgcGJj4BOwEyNj8BBiYnPgE3MzIXFhcWHwEzNSY2Nz4BNzYXHgEXFRQOASYnJgcOAQcGFh8BHgEHJi8BIgYUFj4BNCYjaAEBAg8KFh4EBREICgEQCggEAwsPBycFAgYRFwEEBH0QHBYJAQENAgcFAwMCAwMDBgcKEgUCDQwRGBoSDQoFBQcPDGQCAgMOCAluCggYARIODAgDPAMCBQUECgcTBAUBBg8cCgQhFQIIBwoQCAYBAwECAQQTDhMQDRECBQcIBAoLBwkCAwcIAgoBBgEHgwQGBgcGBgT6AQkMGQkjFwgKBgQCAgcGCAYHBgcKAwkKAhsSBAUBCxcdEBYRAwgLCQIBAQQCAQkJBgcRFhILDQUDDgsOBwcDCxABuQ8JDggDBwsKDRQBEQMCAQIDCwgFAxgCCQoVHAEDBRULCgEBBxcGDBMCBAkIGwwCBwUCAgIGAwIKBwsXCAMMHg0NDHAFCAYBBQgFAAAFAAAAAAEaARoACQANAA8AEQAbAAA3JwcjFwc3Fyc3BzM3DwI3IwczNxczBxcnBze0Hh5lUh9QUB9S7VIYGBAYqlJSLA4OLCQOJCQOt2JiQGQ+PmRACU9PNFCEES0tHC0cHC0AAQAAAAABGgEaAAkAADcnByMXBzcXJze0Hh5lUh9QUB9St2JiQGQ+PmRAAAAEAAAAAAEaARoACQAPABAAEgAAPwEXMwcXJwc3Jx8BJzcjJzUXI3geHmVSH1BQH1KDJA4kLA5qUrdiYkBkPj5kQEccLRwtM08AAAAAAwAAAAABFgEbAAMAGQAsAAA3MxUjNx4BFxYVFAcOAQcGJy4DNzY3PgEXNjc2JzQmJyYnJgYHDgEWFx4BcUtLMBYpECYeDyYWMCcUHhADBw8mEishJhkZAhEPHSYTJg8gFyEiECa8S6gBFBApNysnEhcECRYLIiouFS4ZDAz0CR8iJRcqEB0DAQkLGE5IEwoGAAAAAAIAAAAAARoBBwAJABMAABMHFRczNSM1MzUXNzUnIxUzFSMVHAkJLyUlxQkJLyYmAQcKzgkSvBPhCc4KE7wSAAACAAAAAAEaAPQABwAfAAA/ATMXFQcjJzcjFSM3JwcVFzcnMzUzJzcXFQcnNyMVMxMJ9AkJ9An0cUwnDTg4DShNSScNNzcNJ0lx6goKqAoKn0EnDTcONw0oEigNNw43DSdBAAAABAAAAAABFAEaACAAJAAoACwAADczNzUnIwcjNTc1JyMHFRczNxUXMxUXMzc1JyMHIzUzFTcXBycfAQcvAjcX1Q0yGQ0iXiMmDUslDhUJWBgOMhkNI15POAwlDCUMJQyQGD0ZdjINGSIYIg4lSw0mFm0JChkyDhkjSwkqCyYMOAwmDHgZPRgAAAcAAAAAARoBGgAZADUAPgBHAFAAWQBiAAATIg4CHQEeAT4BHgIOARYXMzI+ATQuASMHIy4BNSY3NjQmIgcGJyImPQE0PgEyHgEUDgEjNxQGIiY0NjIWFxQGIiY+ATIWJzI2LgEiBhQWNxQGIiY+ATIWFxQGIiY0NjIWlhowJRQBExoUHBQBFAMODwsjPSMjPSMBCgQFAggPHywQBwoCBB8zPTQeHjQeEgsQCwsQCzgLEAsBChALgwgLAQoQCwuLCxALAQoQCxMLEAsLEAsBGRQlMBoIDg0EEwEUGxUcFQEkPEc8JPUBBAQMCBArIBAIAgQDBx8zHx8zPTQevAgLCxALC4sICwsPCwtWCxALCxALEwgLCxALC0AICwsQCwsAAAQAAAAAARoA9AADAAcADwATAAA3MxUjFyMVMyc3MxcVByMnNxUzNUuWlpaWls4T4RIS4RMT4bwTJhJwExOWExOWlpYABgAAAAABGgEHAAwAFQAZAB4AIgAmAAA/ATMXFQcjNTM1IxUjFzUnIwcVFzM3JxUjNTcnNTMVJzMVIwcjFTODE3ESEktLcRMmE3ATE3ATE3CLCEtLS0smS0v0ExNeExNeODkTExNeEhJeXl4TCAsTOBNdEwAHAAAAAAEaAQcADAARABoAHgAiACYAKgAAASMHFTM1MxUjFTM3NQczFSMnByMHFRczNzUnFSM1MwczFSMVMxUjNzMVIwEHcRMTcUtLEnBLRAcmXRMTcBMTcHBeS0tLS3FLSwEHEzg4XhMTXjgTBwcTXhISXhNxXhMSExOWEwAAAAIAAAAAAO8BGgALABIAABM3MxcHMxcHJzcjJxcHNyM3IweLET4PKSEOhh4oFxFHNoVFPj5AAQ8KHUAgiRZIGwljiV6EAAAAAAQAAAAAARoBBwALAA8AEwAXAAAlJyMPARUfATM/ATUHJzUXNyc3HwEHNTcBD14RgwoKXhGDCqBUVAlXfVcHenrYL0IRVBEvQhFUkSpGJhAnPyxXPUk5AAADAAAAAAEHARoACQAMABMAACUvASMHFRczNzUHIzUHNTMVFzMVAQQ+BpEJCc4KEziEcQlC2T4CCfQJCbYEOeHhQgmWAAIAAAAAARsA4gAXACEAADciBgcjLgEOARQeATY3Mx4CPgIuAgciJjQ2MhYUBiPYGSUDOgQXHRISHRcEOgIVHyIcDwISHREUGxsnGxsT4SAYDRADFR0VBBAOERsOBBMeIxwRcBsnGxsnHAAAAAUAAAAAARoA6wASACUAPwBKAGUAADcWPgE3Nic2Jy4BIyIHNSMVMzU3Nhc2FxYVFgcOAScGJjc1Jjc2Jw4BDwEVNzY3MhYVBw4BFBYzMj8BFTM1NiYXFAYjIiY0NzY/ARcWNxY/ATUHBiImNDYXMh8BNScmIgYHBhQXFocKFBIGDQEBDAYQCRAMExMQBQYLBgcBCQMJBgsPAQEIBFAJEQcCCAsPBwkXDhUTDgsJBhEBEwEPCwYJBAgKE5wICg4MAwkJFxASDQoICAMKFhMHDw4GXwYBCAgRFhQPBwcLNI8GTAMBAQkKDQ8NBAYBARELCwwKBBYBBQUBFwcKAQwIBAESGhIGBQk/EBc5DREIDAQFAQMvBAEBCAEWBgcUHBYBBQUWAQUIBxEqEAcAAAgAAAAAARoBBwADAAcACwAPABMAFwAbAB8AACUjNTMHIxUzJyMVMxcjFTMnIxUzNyMVMycVIzUXIxUzARldXRImJkupqSXOzl5wcJZdXYODcF1d4RNLExMTXhJLExMTqTk5ExMAAAAABAAAAAABBwEaAAsADwATABcAADcnIw8BFR8BMz8BNQcnNRcnNxcHFwc1N/1dE14JCV4TXQp6VVVQWVlZXlRU4Tg4EHEQODgQcaMyYS5BNTUxQzJlLgAAAAUAAAAAARwBGgAIAAwAEAAdACkAABMzFRYXNSMVNxcnBzMnPwEXNz4BHgIOAi4CNhceAT4CJicmDgEWS5YKCbwTKBVLlnYgCysqDyMgFAIQHiIfFAIPGQoZFw4CDAoQJhYIAQdLAQRinyEqJYMTOBNLeAoCDx4jIBMCEB0iIFQHAgsVGhYHCwggJgAAAgAAAAABBwEHAEYAjQAANzUjIg4BBzEGBzEGFxUUBzEGBwYrARUzMhcVFhcVFhcxFh0BBhcVFhcxHgIXMzUjIi4CPQE0JicmJzY3PgE9ATQ2NzYzFxUzMj4BNzE2NzE2JzU0NzE2NzY7ATUjIic1Jic1JicxJj0BNic1JicxLgIHIxUzMh4CHQEUFhcWFwYHDgEdARQHDgEjcQIJEQwDAwEBAQIECgUGAQEGBQUDBAICAQEBAwMNEAkCAgYKBwQCAgUJCQUCAgkHBQZNAQkQDQMDAQEBAgQKBQYCAgYFBQMEAgIBAQEDAwwRCQEBBgoHBAICBQkJBQICCAMKBvQTBw0ICAgICBAGBQoFAhICAQIDAQMFBQYQCAgBBwgIDQYBEwQICgYZBgwFCwcHCwUMBhkJDQQCvBIGDQgHCQgIEAYFCgUCEgIBAgMBAwUFBhAICAEHCAgNBwESBAgKBhkGDAULBwcLBQwGGQwIBAQAAAACAAAAAAEaARoAGwAfAAATFTMVIxUzFSMVIzUjFSM1IzUzNSM1MzUzFTM1BxUzNc5LS0tLEksTS0tLSxNLS0sBGUsSSxNLS0tLE0sSS0tLXUtLAAAIAAAAAAEaARwADgAZAB0AKQA1AEIATwBTAAATFhcWFA4BIyImNTQ2NzYXNjc0LgEOARQeATcHFzcXMxUzFSMVIzUjNTMnFwcXBycHJzcnNxc3LgEiDgEeAz4CBwYHBicuAT4CFhcWNyMVMzYKBAIGDAgKDwgHCgQGAQUGBgQFBkxkDWNTEi8vEi8vbA0hIQ0hIQ0hIQ0hOgMMEA0FAQcLDQwHAREBBAYFAgIBBQYFAQWNS0sBFwQJBQwLCA8LBw0DBCUDBwMGAgMFBwUCImQMY4cvEi8vEiUNISENISENISENIXAHCQkNDQoGAQcKDQgEAQMFAQUGBQECAgU0EwAAAwAAAAABGQDhABsAIgApAAA3IzU0JisBFRQWOwEVIzUzMjY9ASMiBgcVIzUzFyc3FxUHJyMnNycHFRfOEgYEEwUECjkKBAUSBAUBEnA3HA4iIQ6nHBsOISK8CQQFZwQFExMFBGcFBAklTBwNIg4hDhsbDSEOIgAAAgAAAAABGgEbAB8AQwAANyIuATc2NyY0NzY3PgEfAQcXNxcWFAYHBgcOAScGBwY3IgcGBw4BHwEHBgcGHgIyNzY/ARcWNjc2Nz4BNTQnByc3JjUOEwIII0AFBgoVESkSDDYXOAUGDAsGCBAlEkQgCYkSEAYFDgcIAwREIwMBBwYIAx5JBQUPIA4GBQkJATEwMAYTExkKJj4OHg4YDQsECAU4FzYMDyAeCwYFCwQHRR4I9QsDBQ4mEgYEQiUFCwcCAxtLBAIHAwkDBQkXDQYGMDAxAQACAAAAAAD0ARoABwAbAAATBxUXMzc1Jwc1MxUjNTM1IzUzNSM1MzUjNTM1SxMTlhMTlpaWJiZLSyYmSwEZEuETE+ESJRPhEhMmEiYTJRMAAAgAAAAAARoBGgAJAA0AEQAVABkAHQAhACUAABMHFTM1MxUzNScDNTMVNyMVMzczFSM3IxUzNzMVIzM1IxUnMxUjLwkSzxIJ6hImExMTEhI4ExMTEhJdEiYTEwEZCdjPz9gJ/voTExMTExMTExMTExMTEwAABwAAAAABGgEHAAcACwAfACkANgBAAFIAABMHFRczNzUnBzUzFSczNTQjIgYHFTYyFQcGFRQWMzI/ARUUBiImNTQ/ARcjFSM1Mxc2MhYUBiInFRQWMjY0JiIGFzI3NQYiJjQ2Mhc1JgcmBhQWJhMT4RIS4eGjDRIECQMHDwwOBwYIBAEFBgMGBysBCwsBBA4ICQ4EBAcEAwcFRQkFBQsHBwwEBAgLDg0BBxOpExOpE7ypqTogFwMCDAUJAQMQBwkJEgQEBwQCBwEBFAZKHwkOGA8cBQQHCA4HCCEDDgQIDgkEDgMBARAaDwAAAAAGAAAAAAEaAQcABwALABMAGAAgACUAABMHFRczNzUnBzMVIwc3MxcVByMnNyMVMzUzNzMXFQcjJzcjFTM1JhMT4RIS4eHhExM4ExM4EyUSOF4SORISORIlEzkBBxM4ExM4ExM4SxISORISOTk5EhI5EhI5OTkAAAAGAAAAAAEaAOEACQATAB8AIwAnACsAADczNSMHFRczNSM3IxUzFSMVMzc1BxcVDwEjLwE1PwEzBxc1JzcXNycHNzUHJiUvCQkvJeovJiYvCTwEBlQJLgUGVAlQHBwLGz8bG0JCzhMJlgoTlhODEwqWJwgvCSUcCC8IJlcRGREPEBwQVx0aHQAAAwAAAAABKwEIABEAIwAnAAA3Jz4BHgEXNxcHIyc3Fy4CBh8BBi4CJwcnNzMXByceAyc3FwdnDxo9NiABFw4nDycPFwEaLDFADxo6Mh4BFw8nDigPFgIYJy6SDd8N5w0RAxwzHxYOJygOFxgqGAGzDQ4BHTEdFw4nKA4WFycXA74N0A4AAgAAAAABKwENABEAIwAANwcnNzMXByceAjY3Fw4BLgE3JwcXMzcnBy4CBgcXPgEeASYXDycOKA8WAyk9OQ8PE0VJMM0XDycPJw4XAS5IRRQPEDo8J5EXDicoDhYfLw0aHAshHhE6LxcOKCcOFiU6ExsgCxsYEDAACwAAAAABBwEHAAcACwAPABMAFwAbAB8AIwAnACsALwAAEyMHFRczNzUHMxUjFyM1Mx0BIzUnMxUjFTMVIxU1MxUzNTMVMyM1MzUjNTMnNTMV/eEJCeEK4c7Ogzg4OEs4ODg4OBM4Szg4ODg4OAEHCs4JCc4JEzglOCUlOCUTJTkmJiYmJhMlEyUlAAADAAAAAAEnAQcAEQAjADAAABMjDwEVFzM3FjI+AT8BNCYnNQcmIyIGFBYzMhcVBwYPASc3MxceARUGFQ4DJz8B+GIGfWENKhIqJRcCARQREw4OBAUFBA8NSQMCJVRzVBMJCgECERseDkUDAQcDfQ1iKgoUIhUKFSUMKiEFBQgGBihKAQMmVHQ5ChcNBQUPGQ8CBkUHAAAAAAUAAAAAARoBGgAIABUAHgArADgAADcyNjQmIgYUFjcUDgEiLgE0PgEyHgEHMjY0JiIGFBY3FA4BIi4BND4BMh4BBzI+ATQuASIOARQeAZYICwsQCwtTFCMoIxQUIygjFEsXISEuISGaIzxIPCMjPEg8I4MfMx8fMz4zHh4zgwsQCwsQCxMUIxQUIygjFBQjTCEuISEuITgkPCMjPEg8IyM8lB4zPjMfHzM+Mx4AAAAABAAAAAABGgEaAAYACgAOABIAAD8BJwcnBxc3IzczBzMVIxcjFTNDaw1kHA4i5JkrbqioqKioqK5dDlYiDCofJksmJSYAAAAABQAAAAABBgEaABMAFwAbACAAKgAAEx8BDwEvAQcvAQcvAT8BJz8BJzcHFzcnNxc3JzcXNycPARcjJxUjNQcjN9MLJwQ+CwNDCgMwCw4FLwMEQwMFZwYqBwoVOBQKIyshLgU5FiMTIxUgARkEXQsaBAgcBAcUBR8LFAgKHQgLYhAREBcuGC0YTRNNE3NbOEthTkkAAAQAAAAAARIBIwAXAEcAUQBuAAAlJyYiDwEOAR0BFBYfARYyPwE+AT0BNCYHFRQPAQY9AQYnIjU3NDczFjc2NCImNTQ3NTQ/ATIdATYXMg8BFAcxJgYVFBYzMhQ3FCMHIzU0PwExNwcOAR0BFBcjIi8BLgE9ATQ2PwE2Mh8BFhcuAQcBAFkIEghZCAkJCFkIEghZCAkJTQEFAQUFAQIBAQUEBw0GCgEFAQQEAgECAQUKBAQMJAEWAQEWEFQJCQgFBwdZBggIBlkHDwZZCwICCQbpNQUFNQUQCWoJEAU1BQU1BRAJagkQnwgBAQMBAggDAgEHAQEBAgMNBAcNCAgBAQMBCAIBAgYBAQEFBwICGgQBDgYBAQ18NAUMCWcLAwM1BA4HagcOBDUDAzUHDQQCAwAHAAAAAAEsARoAAwAgACQAKAAwADQAOAAANxcjJwciDgIUHgIyNxcGIwYiLgI0PgIyFhcHLgEXMxUjFTMVIzchBxUXITc1ByE1ITUhNSHMJg4lUwgMCgUFCQwSCQIEBQcQEAwHBwwSEgoCAgQJJRMTExON/uYJCQEaCRP++gEG/voBBqleXgsFCQ8QDQkFAwkCAgYMERQRDAcCAgkCAggTEhO7CfQJCfTqqBMmAAAAAA///wAAAPIBLQAEARcBGgEtATUBOwFKAVABUgFXAV4BYwFkAW4BdAAAEyIrATcXNjUHNj0BIy4BJy4BBz4BJw4BBwYHBjM3MAcjDgEHFDYxByYHBgczBgcxBhUHBhUUFwcXIx4DFyYnFBYXBxYfASYXFh8BNwYXMx4BMwcWFzMWFycXHgIXIyYnLgI3Jjc0JzU2NzUxFj8BNjczNjc2NzE2NxU2NzY/AQYzNwc2FzEyMwcGMRY3MTYXJxcWFzI3MTYXFRYXMicxHgEXJjEVFiMWFzUmJxQjMSYGFxY3MTQxFxYfASInMSYVHgEVMSIVFBY3MwcGFycUFTEWBzY0BxYHMQYVJwYWBzY1MTQ3Ig8BDgEnNCcmJyY3Njc2Nz4CFhcuAQ4BFzcyNRQeATcVNj8BBwY2PwE2NTEmPwEHMDkBFBYXFjcGLgEnMhcxFhcmJxYXNyIjMhYjMCcXNCIHFxQHBgc0JjY3FAcxBhQ/ATYHLgE3FjcnDwIXFhcnFh8BJyYnNwcGBzYnFTAzMTIUDwE1NgcUBzU0N4UEAwIOSAMCAgEBGxANIwkBBgEHCAMGBgEBBgMFBQgFBAIIDw0FAwIEBQECBAEDAQIEBQUEBAIFAwICAwEEAwIGAwIBCAUBCAMDBQIBAwYDBgUNDgUEFAccMhwCAQEBBwcCAwMDAQIBBQQHBwIHDAcNCAEBDwcFBAQFBQIFBQYGAQsKCgICBAUBCAEFDxoFAwEBBAIGBgMCAQIBAQIBAQEBAQIBAwECAQECAwEDAQIBAgEFBAMEAQMBAQEFBxAmFAISBgkDAgIDBQQSFhIFCRoYDgEBARUfDgUDCQEDBQ4DAQECBFQGAwsSCRsYBgEFCAQEBgkLAwEBBgICBDYCAQIDAgQEAQQCAgQBAxkFBgQHBRoBJwEDBAMFAgIBAQMBjAECBgfgAgEBBAIGAgMBKwGQCAYFCBAKEyYHBgIEAQEBAQICBAIBAQIBAwYBAgMBDwwJBQcJBAwRCA0FBwcJBAEFCQEEAgkFAgMCAQIGAwgEAgUJAwcEAQIDAgQFBgUCAgECCC1AIQYMDwICFg4BAgUFBwQEBgQHBgIDBgcDBgMBAgQBAQEBAQIBAgMEAwUBAQIBAwQFCB4RBAQFCwoBFAkCAQMFAgEBBAIGBQIDAQQGAQMFAwEECQcIAwQFBgYJAwcKCAMEBwUEAgEBAgUHDQUHAQIOCw8XAQYLAwcMAQoHCAQLGQ4BAhEbCwcBAQIIAgMBDQMCAgIDAykBBAIEAQQGEAoFCgEDCAoFuwEBegYEAwELBwYBAQQFAgIEAQIBBBMBAgEBAZkBnwQEBgMXBAIFAgYDGAIPDQ5XAQEDAwEDFQQEAgQEAAAFAAAAAAESAS0AWgCxAM8BGQE+AAA3HgEfARYfAR4BFA4BDwEOAgcOASMiJicmLwIiDwEiDwEOASImJyYvAS4CNDY1JzQ2NzY/Ayc0PgI3PgE1JzQ1ND4CMzIeAh0BFhcWHwEeAhUUJzIWHwEVDwEGDwEGFBcWHwEeATsBMj8DNC8CLgEvAT0BND4BMzIWFAYUFzMyNjUnLgIjIgYHFycmByMiPQEuAiIOARUHFB8BFjI2NSMiLwEmNgcyPgMmLwIuAgYPAQ4CFRcUBhQWHwIWFzcyNzY3Njc1PwE0PgE3NTQ/ATY/AS8BJi8BJjUnJi8CJiIPAQYiJi8BJiIdAQcGBxcUFwcOAR0CMh8BFh8BFh8BFAYHHgMXMj4BNzY/AjY9AS8CJiMiDwEGIiYvAQcGBwYVBwYPAhQW+QQFAQIBAwMCAwMGBAcGCQoGBAcECAsEAgEEHQcGDQEBBAMICwoFCQkZAwUDAwEHBwMCBQcBAQcKDAYICQEFCxINDhIJAwEDAwQOBwwIfgIDAQEBBAECBgICAwEEAQYGAQYFDgsBAQIFAwcDAQIDAgUEAgECAwMBAQMGBAgGAQEFAgICAgECBAYDAwECAQECAgEBAQIBBB0EBgYDAQICDQoCBAUGAwoDCAUBAgUEEAgDBUMEBQkJBAQCBQMGAwECAQIDBQICAgcBAQIDAwMCBQUUBQkHAwUDAggDAQEBBQYEAwMHBAQGBAECBQMCCAgKQAMHCAMICgoDAQUDBQMGAwIKAwUFAQQCAgECAgEDAQEJWwIHBQYEBQQCBgcFBAEEAwcKBAIDBggCAQEBAQICBQIEAgMEAgQBAwYICAUNBwcCAQIECQIHChQTEggKGA4LBgYMEg4HDBMXDA0KCQQGEgkUFg0KjwIBBAQCBQEBBQIDAQIEBgMFAwgIBAIBAgEBBAEBAgcCAwIHBQQCAQMDBwQIBAcICQEBAQEGAwYFAwQDBQQDBQECAQEFBAbkAgMGBwUCEhAEBgQBAgoDAwQEDAQHBwMBAwEBAw4BAgQCAwEIHwQGBQIBAQIDAQECFwYEAgoCAgQHBwcFAwMNAgUEBgMCBw0HCAQCAgcIEwkKBAIEAwQIAwQGBAUBBAYEAhUCBQQJBQUCAgICCAUPBAEGAQMCCgMCAgUFEQgIBQUHCgAAAAAEAAAAAAErARoABwALAA8AFQAAEx8BDwEvATcHFzcnFwcXNy8BBxcHFy/0CCIL9AgiDuEg4U0DXgI9RQ0yPQkBGQMJ8gkDCvHoA98CnRICEy83DycnDwAABAAAAAABBwEaAAcADAAQABQAABMjBxUXMzc1BxUjNTMXIzUzNSM1M/3hCQnhCoRdXXFeXl5eARkJ9AkJ9HFnz89eE14AAAAABv//AAABHAEaAAgAEQAeACcANABEAAA3FAYiJjQ2MhYHFAYiJjQ2MhYXLgEnBiceARcWMyY1NxQGIiY0NjIWFzY3NiYnBgcWBwYHFiciMT4BFwYPAQ4BByYnJiP2FyEXFyEXphghFxchGDIWIgoREg0xIA4OC2EXIRgYIRcQEwYGCg8GEBEIAwkO0gESRCYJAgEYKQ4ICgYG8xEWFiEWFmURFhYhFhZ0BBoTCAQeKAcCDhIBEBYWIRYWAhcdGTIWEQkfIhAOC3wgIwMKDQgBFRMFAgEAAAAABAAAAAABGgEaAAcACwASABYAABM3MxcVByMnNxUzNQ8BFwcXNzUVMxUjExPhEhLhExPhrw01NQ0+S0sBBxIS4RMT4eHhOQ01NQ09CjMTAAAEAAAAAAEaAOEABwAKABIAGAAANwczNzMXMycHNxc3IwczNzMXMyc3NjcfAT8sGQkrChksGw8OhR49Hg4/Dh1kFgIBAhepcRwccUIoKHqpKytCQwYFC0MAAwAAAAABBwD0AAMABwALAAAlIzUzFSM1MwczNSMBB+Hh4eHh4eHOJnEmcSYAAAAAAQAAAAABGgEHABsAADciLgE/ASMGLgI3Njc+ATczHgEdARQGKwEHBmYIDgUEEjQHDAcBAyMIAw0IpwsPDwsZbggjCxEJKQEGCw4GShcHCQEBDwtCCg9nBwAAAAACAAAAAAEaAQcAGwA2AAA3Ii4BPwEjBi4CNzY3PgE3Mx4BHQEUBisBBwYnIgcGBwYWNzMXFQcGHgEyPwIzMjY9ATQmI2YIDgUEEjQHDAcBAyMIAw0IpwsPDwsZbggYBQILIAIEBT4JFAEBBAUCcgkZAwUFAyMLEQkpAQYLDgZKFwcJAQEPC0IKD2cH0QUfQwQHAQwJLgIFAwJoAwQDQgMFAAAAAAEAAAAAARoBBwAbAAATHgIPATM2HgIHBgcOASsBLgE9ATQ2OwE3NsYIDgUEEjQHDAcBAyMIAw0IpwsPDwsabQgBBwEKEQkpAQcLDQZKFwcKAQ8LQgoPZwYAAAAAAgAAAAABGgEHABsANgAAEx4CDwEzNh4CBwYHDgErAS4BPQE0NjsBNzYXMjc2NzYmByMnNTc2LgEiDwIjIgYXFQYWM8YIDgUEEjQHDAcBAyMIAw0IpwsPDwsabQgYBQILIQEEBT0KFAEBBAUCcgkZAwUBAQUDAQcBChEJKQEHCw0GShcHCgEPC0IKD2cG0AUfQwQHAQwJLgIFAwJoAwQDQgMFAAAGAAAAAAEZARoAIAAvAEEATQBSAGgAACUnByc3JyYiDgIUFwYHBhYXHgEzMjc2NzY3FjI+AjQHBisBIi4CNzY3HgEXBjcWBiInLgE3PgI7AQcVFzM3BzMXNyc3LwEPAhcnFxUjJxc3FxYUBw4BJyYvATcXHgE+AjQmJwEVDycXJwMNGxoUCwU6OQYBCAQJBQkHFSQiGg0cGhQL4gECAgICAwIBKkYDBgRJqQEgLA8MBgYEDxQKBSIjDSLKHA4MDAEENgsPAiMKKxQcig06CAgGDwgFAzsNOgIFBQIBAQHrAycXKA8ECxQbHQ06OwgVBwQFBxMlIRsGCxUaHLcBAQQGAixGBAcDS4UXHw8MIA8KEAgjDSMiJw4NDR8IJAIPDDZAHRUsfQ08CBYIBgMDAgQ8DTwCAgIDAwQDAQAABgAAAAAA9AEaABMAFwAbAB8AIwAnAAA3MxUjFQcjJzUjNTM1NDY7ATIWFSsBFTMHMzUjFyMVMzczFSM3MxUjvDgTE4MTEjgLCDgICxM4OF6DgyYTExITEyYTE/QTqRISqRMTBwsLBxO8qRODg4ODgwAAAAABAAAAAAEHAM8ABQAAPwEzFwcjJgfSCGoQxAoKZgAAAAEAAAAAAM8BBwAFAAATFxUHJzXECgpmAQcI0ghqEAAAAQAAAAAAzwEHAAUAADcnNTcXFWgKCmYmB9IIahAAAAABAAAAAAEHAM8ABQAAJQcjJzczAQcI0gdpEGgKCmYAAAEAAAAAARoA/wA+AAAlDgEHFxQGBw4DIiYnFjY3IiYnJicXFjcuAScmNTEWMyYnJicmNzY3FhcWFxYXJzU0NzY3NjIWFzY3Bgc2ARkFDggBBwcJHSQrLSoSFSoQDBcHBQMFCgkJEAYMDA0LBwMCAwQBBAoNGR8QEAEECBUKFhQIEhAGEhDlCA4GBxAfDxUiGAwMDAILDgwKBwgBAQMCCQgOFAYHDAYGDg0HBgwKFQgEAQYGDAkVCAQJCAQJEwoBAAQAAAAAAQcBGgAeACIAJgAqAAA3IyczNzUnIwcVFzMHIwcVFzM3NScjNxcjBxUXMzc1JzUzFQcVIzUXIzUz/SA/FAoKSwkJFD4hCQk4CgoBOjkBCQk4CpY4XiXOJiZeXglLCQlLCV4KOAkJOApWVgo4CQk4ejk5gyUlJSUAAAAABAAAAAABBwEaAB4AIgAmACoAABMjBxUXMwcnMzc1JyMHFRczFyMHFRczNzUnIzczNzUHNTMVFxUjNTcjNTP9OAkJATk6AQoKOAkJIT4UCQlLCgoUPyAK4SVeOIMmJgEZCTgKVlYKOAkJOApdCksJCUsKXQo4LyYmgzg4gyYAAAAFAAAAAAEHARoAIwAnACsALwAzAAA3Iyc1JyM1Mzc1JyMHFRczFSMHFQcjBxUXMzc1NzMXFRczNzUnMxUjBzMVIwcjNTMXIzUz/SEgChwJCgolCQkJHAkgIgkJJgkgQyAKJQqEExMSODg5EhK8ExNLIEcKJQkmCQkmCSUKRyAJJgkJIiAgIgkJJsUTSzhLEhISAAAAAwAAAAABBwEaAAkAEwAtAAA3NQcnNzMXBycVBxUnBxczNycHNTcXBxcHIzUzJyMHMxUjJzcnNzMVIxczNyM1jRMNIg4iDRMSEw0iDiINE2IGRUUGTjg4ODo5TwVFRQVPOTg4OjiySxMOISINE0s4SxMNIiINE0tnEzc5ExMtLRMTNzkTEy0tEwAAAAAMAAAAAAEaARoACQATABsAHwAnACsAMwA3AD8AQwBHAEsAABMXBycVIzUHJzcXNSMVJwcXMzcnNyMnNTczFxUnMzUjFyMnNTczFxUnMzUjByMnNTczFxUnMzUjFyMnNTczFxUnMzUrAhUzNSMVMzYoDxcSFw0nDxIXDScNKA1OJQkJJQomExONOAoKOAk4JiZCJQkJJQomExONOAoKOAk4JiYTJSUlJQEZJw0WUlQYDSfoUlIWDScnDWIJJgkJJgoSJQk4Cgo4CiWWCSYJCSYKEzkKOAkJOAkmE3ASAAAAAAIAAAAAAQcBHQAVABoAADc1ND4BFhczLgEOAR0BIwcVFzM3NScHMxUjNV4aKSMHFAguOCYTEhK8ExMmJrypJRUfBxUTGyAHKh0lE3ATE3ATE3BwAAUAAAAAARoBGgAJABEAHgAnAC8AADczNxcVBycjJzUfATUPASMVMzcUBgcnPgEnNic3HgEHFAcnNjQnNxYHFAcnNic3Fhw0SRAQSTQJSDs7By4uxQ8ODgwNAQEZDg4PJRMNDQ0NEyYIDgcHDgjRSAb0BkgJXlc7xjoDSyUXKhINDyQTJx8NESsXHxkNFC8TDRkfEA0ODxANDQAAAAQAAAAAARUBFAAXAC8AWwBfAAA3MzczNzU3NSc1JyMnIwcjBxUHFRcVFzM3IzUvAT8BNTM/AR8BMxUfAQ8BFSMPASc3Bg8BIzU2Nz4DMzIeAhQOAQ8BDgEdASM1NDY/AT4BNCcxLgEnMSYiBhcjNTOQDSAtCiAgCS4gDR8vCh8fCi8DKQIdHAMpBhwdBigDHR0DKAccHBUCAQERAQMCBAcJBQgLCAMEBQMGAgQRBAMLAwMBAQMCAwYGDxAQGCAKLSAOIC4JICAKLSAOIC0KEygHHBwHKAMcHAMoBxwcBygDHBxxAwMGAQkHAwYEAwUICwwJCAQHAwYDCQoFCAMOAwgHAwIEAQIEXRAAAAAGAAAAAAEsARoAQgBOAFoAYgBmAGoAADc0Nh8BFjI2PwInLgIiBzU3Fh8BNz4DFhUUIyImIgYHBgcXFh8BFjI3Nj8BFw4DIi4BLwEmJw8BDgIiJhc+ATQmJzMWFRQGByMuATU0NzMOARUUFzchBxUXITc1ByE1ITUhNSFlBwQFAQMFAwsGBwEFBgcDGwYDBQUDCQkJBggDBQYGAwUECAEBAgEEAQUDAwMBBgcIBgUDAQQBAQkGAwgHCAZzBwkJBw0SCQmeCQkSDQgIEM/+5gkJARoJE/76AQb++gEGVAQFAgQBBQMQDRsDBQMBBAUGCBAIBgkGAQQECAMGBAYIIgQDAwEBBAUEAgMIBwYEBgMUBAMPCQUGBQUFChgaGAoVGg4XCgkZDRoVChkMGxTOCfQJCfTqqBMmAAACAAAAAAEVARQAFwAeAAA3IycjJzUnNTc1NzM3MxczFxUXFQcVByMnMzcnBycHnQ0fLwofHwovHw0gLgkgIAotPw5GDUAaDRggCi0gDiAtCiAgCS4gDiAtCjBGDkEaDQADAAAAAAEVARQAFwAvADYAADczNzM3NTc1JzUnIycjByMHFQcVFxUXMzcjNS8BPwE1Mz8BHwEzFR8BDwEVIw8BJzczNycHJweQDSAtCiAgCS4gDR8vCh8fCi8DKQIdHAMpBhwdBigDHR0DKAccHAQORg1AGg0YIAotIA4gLgkgIAotIA4gLQoTKAccHAcoAxwcAygHHBwHKAMcHCBGDkEaDQAAAAQAAAAAARoA9AAHAAsAFgAhAAA3BxUXMzc1JxUjNTMHNTM1IwcVFzM1Iyc1MzUjBxUXMzUjlhMTcRIScXGpEx0JCR0TOBIcCQkcEvQTlhMTlhOpll5LEwmECRM4JhIJXgkTAAADAAD//wEuAQcAEgAfACYAABMzFxUmJzUjFTMUFyM1MzUjJzUXPgEeAg4CLgI2FzcnBycHFxz0CQgL4F0TSzhnCaQRKCQXAhIhKCQWAxI4LQ8nGAwgAQcKZwcEU6kfGRMSCrt0DAIRIigkFwISISgkUjsMNBMOGgAFAAAAAAEsAQcAEgAfACsAMQA3AAATMxcVJic1IxUzFBcjNTM1Iyc1FyIOARQeATI+ATQuAQciLgE0PgEzMhYUBicXNyc3JwcnNxcHJxz0CQgL4F0TSzhnCc4UIxQUIygjFBQjFA8aDw8aDxchIRUbCRMTCTASCBsbCAEHCmcHBFOpHxkTEgq7ZxQjKCMUFCMoIxSDDxoeGg8hLiFDGwgTEgguEggaGwgAAAAAAwAAAAABLAEHABIAHwArAAATMxcVJic1IxUzFBcjNTM1Iyc1FyIOARQeATI+ATQuAQciLgE0PgEzMhYUBhz0CQgL4F0TSzhnCc4UIxQUIygjFBQjFA8aDw8aDxchIQEHCmcHBFOpHxkTEgq7ZxQjKCMUFCMoIxSDDxoeGg8hLiEAAAAAAwAA//4BLgEHABIALgAxAAATMxcVJic1IxUzFBcjNTM1Iyc1FzIeAhceAQcOAgcOAScuAicuATc+Ajc2FycVHPQJCAvgXRNLOGcJzgoTEQ4FBwQEAgoOCA0eDwkRDgUHBAQCCg4IEjo5AQcKZwcEU6kfGRMSCrtnBQoOCA0eDwkRDgUHBAQCCg4IDR4PCREOBQpLJksAAAACAAAAAAEaAQcADwATAAABIwcVFzMVIxUzNSM1Mzc1ByM1MwEQ9AkJZziWOGcJEuHhAQcKuwoSExMSCruyqQAABgAAAAABLAD0ABkAMwA3ADsARwBTAAA3MzIWHQEUBisBIi8BJiIPAQYrASImPQE0NhciBh0BHgE7ATI/ATYyHwEWOwEyNj0BNCYjBzMVIyUzFSMnMhYUBisBIiY0NjsBMhYUBisBIiY0NjNLlhchIRcHEQ8PChYKDw8RBxchIRcQFgEVEAcMCRAOIg4QCQwHEBYWEOETEwEZExOfBAUFBC8EBQUElgQFBQQvBAUFBPQhF0sYIQoKBgYKCiEYSxchExYPSxAWBgsJCQsGFhBLDxY4ODg4JQUIBgYIBQUIBgYIBQAABgAAAAABGgEaAAsAFwAjADAAOABAAAA3MzUzNSM1IxUjFTMXIxUjFTMVMzUzNSM3NSMVIxUzFTM1MzUHJiIPAQYUFjI/ATY0BwYiJjQ/ARc3Byc3NjIWFFITExMTExOWExISExMTHxMTExMSSggXCYwIEBgIjAiiAggGA3kOEwYNBgIIBs4TExMTE14SExMTE5YSEhMTExMuCAiNCBcRCYwIF54DBgcDeQ0TBg4GAgUIAAAABAAAAAABGQEaAAUACAAMABAAABMzFwcjJzcHMyc1IxU9ATMVjhB7CPYIg2vWXxgYARnmDQ3OyRMTEyZLSwAAAAMAAAAAAPQBGgAGABoAJwAANzM1IzUjFScOARQWFxUXMzc1PgE0Jic1JyMHFxQOASIuATQ+ATIeAY0lHBMcFhkZFgpLCRYZGRYJSwp6FCMoIxQUIygjFIMTLzhaDCwyLAwpCQkpDCwyLAwpCQl6FCMUFCMoIxQUIwAAAAADAAAAAADhARoAEQAZAB0AABM1IyIOARQeATsBFSMVMzUjNQcjIiY0NjsBFyM1M+FnEh4SEh4SHBNeEzgcFBsbFBwmExMBBxIRHyMeEl4SEs9eGyccz88ABQAAAAABLAD3AAcAHAAnADcAQwAANTMVITUzFSE3IzUjBiMiJjU0PwE0IyIHNTYzMhUPAQ4BFRQWMzI2NRcxFSM1MxUxNjMyFhUUBiInFRQWMzI2NTQmIgYTAQYT/tSAEAEKFRARIh8WEg8PFCQQGQwLCgkNED8REQwYFBYZKgsQDQ8REBwRXiYmODgQExENHQUEGgwRCSYPBAEICwcKEQ4bD5hDFBsYGh87Dg0SFxURExQAAwAAAAABGgEHAAcACwAPAAABIwcVFzM3NQcjNTM1IzUzARD0CQn0CRLh4eHhAQcKzgkJzsWEEiYAAAAABgAAAAABGgEaAB8ALwBFAFoAegCKAAA3JicmBwYPARU3PgEyFhcHDgIHBhYXFjMyNxUzNTQmBxUUBw4BJy4CPQE0PgEzNy4CIgcGBzUjFTM1FhcWMzI+AjQHFA4BBwYnLgI9AT4DFzYXHgEHPgEyFh8BNScmDgMUHgIyNj8BNQ8BBicuAjQ2NyM1MxcVByMXByc1NxcHM0kEBQkLBwYGBAQLCwUBEgcJBgEDBgkFBQsHEwMPAQIKBQICAQMEA2sBBgsOBQMCEhIDBgIEBwsHBBICBAIGBQIEAgECAwUDBgQBAl4DBggGAwcCCBIOCgUFCQ0OCgQCBgoGBgMFAwTcS1QJCXwnDjY2DiZy6wUCAwIBAwMUAwMFBgYCAQUHBAoSBAIJBzEHCx8FAwMGBQIBAgMCBAEDAhYGCwcEAgMudAUFAQEGDBAQBwcKBgEDAgIEBgQKBAgFAwEBBgIJYAMDAgIFFQEFAQYMDxEOCgYDAgERAgQBAgIGCAsJTRIJcQknDTYNNw4lAAADAAAAAAElAS0AJAA/AEwAABMyHgIXFhcWFxYzFRQOBA8BJy4FPQEyPgI3PgEXLgEnLgEiBgcOAQcVFB4EFz4FNS8BDwEvAQ8BHwI/AZcIDQ0MBwoLFRcMCwsTGR8hEQQFESIeGhMKCxgWFQoMGogVKRIJFhYVCRIpFgoRGBoeDxAdGxcSCTQICFEcCAgCJAQJBFsBLAIEBgQGBQgCAUoWJiMeGxcKAwMKFxseIycUTAEFCQYICDgBDAwGBgYGDAwBORIiIBsYFQkJFBkbICISGQcBYCcCBwczAgECawAAAAQAAAAAASUBLQAkAD8AaQBxAAATMh4CFxYXFhcyFxUUDgQPAScuBT0BFj4CNz4BFy4BJy4BIgYHDgEHFRQeBBc+BTUnHgEUDgEPAQ4BHQEHIyc1ND4BPwE+ATQmJyYiBw4BFQcjJzQ+ATc2FxYHNzMXFQcjJ5cIDQ0MBwoLFRYNCwsTGR8hEQUEESIeGhMKCxgWFQoMGogVKRIJFhYVCRIpFgoRGBoeDxAdGxcRCmAFBgUGBAYDAwMNAwUGBAYDAwMCBQ8FAgMDDQMGCgYODwYeAw0DAw0DASwCBAYEBgUIAgFKFiYjHhsXCgMDChcbHiMnFEwBAgUJBggIOAEMDAYGBgYMDAE5EiIgGxgVCQkUGRsgIhIZBgwOCwgDBgMGBAYDAwYHCwcDBgQGBwYDBQUDBgQCAggNCgIGBgNhAwMNAwMAAAMAAAAAASUBLQAkAD8AUwAAEzIeAhcWFxYXMhcVFA4EDwEnLgU9ARY+Ajc+ARcuAScuASIGBw4BBxUUHgQXPgU1LwEjBycjBxUXBxUXMzcXMzc1JzeXCA0NDAcKCxUWDQsLExkfIREFBBEiHhoTCgsYFhUKDBqIFSkSCRYWFQkSKRYKERgaHg8QHRsXEQpHBwQlJQQIJSUIBCUlBAclJQEsAgQGBAYFCAIBShYmIx4bFwoDAwoXGx4jJxRMAQIFCQYICDgBDAwGBgYGDAwBORIiIBsYFQkJFBkbICISCwgmJggEJSUECCYmCAQlJQAAAAMAAAAAARoBHgAOAB8AKwAANxYGBxcHJw4BLgE+AR4BBzI2Nwc+ATU0LgEiDgEUHgE3NSM1IxUjFTMVMzXiAQ0MUA5PHEg5Exw/RzBkER8MAQwOFycuJhcXJkUlEyYmE7kUJhBPDlAXAitFQiMMNYANDAEMHxEXJxcXJy0nF0sTJSUTJSUAAAADAAAAAAEaAR4ADgAfACMAADcWBgcXBycOAS4BPgEeAQcyNjcHPgE1NC4BIg4BFB4BJzMVI+IBDQxQDk8cSDkTHD9HMGQRHwwBDA4XJy4mFxcmGF1duRQmEE8OUBcCK0VCIww1gA0MAQwfERcnFxcnLScXXRIAAAAAABAAxgABAAAAAAABAAcAAAABAAAAAAACAAcABwABAAAAAAADAAcADgABAAAAAAAEAAcAFQABAAAAAAAFAAwAHAABAAAAAAAGAAcAKAABAAAAAAAKACQALwABAAAAAAALABMAUwADAAEECQABAA4AZgADAAEECQACAA4AdAADAAEECQADAA4AggADAAEECQAEAA4AkAADAAEECQAFABgAngADAAEECQAGAA4AtgADAAEECQAKAEgAxAADAAEECQALACYBDGNvZGljb25SZWd1bGFyY29kaWNvbmNvZGljb25WZXJzaW9uIDEuMTBjb2RpY29uVGhlIGljb24gZm9udCBmb3IgVmlzdWFsIFN0dWRpbyBDb2RlaHR0cDovL2ZvbnRlbGxvLmNvbQBjAG8AZABpAGMAbwBuAFIAZQBnAHUAbABhAHIAYwBvAGQAaQBjAG8AbgBjAG8AZABpAGMAbwBuAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAwAGMAbwBkAGkAYwBvAG4AVABoAGUAIABpAGMAbwBuACAAZgBvAG4AdAAgAGYAbwByACAAVgBpAHMAdQBhAGwAIABTAHQAdQBkAGkAbwAgAEMAbwBkAGUAaAB0AHQAcAA6AC8ALwBmAG8AbgB0AGUAbABsAG8ALgBjAG8AbQACAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbcBAgEDAQQBBQEGAQcBCAEJAQoBCwEMAQ0BDgEPARABEQESARMBFAEVARYBFwEYARkBGgEbARwBHQEeAR8BIAEhASIBIwEkASUBJgEnASgBKQEqASsBLAEtAS4BLwEwATEBMgEzATQBNQE2ATcBOAE5AToBOwE8AT0BPgE/AUABQQFCAUMBRAFFAUYBRwFIAUkBSgFLAUwBTQFOAU8BUAFRAVIBUwFUAVUBVgFXAVgBWQFaAVsBXAFdAV4BXwFgAWEBYgFjAWQBZQFmAWcBaAFpAWoBawFsAW0BbgFvAXABcQFyAXMBdAF1AXYBdwF4AXkBegF7AXwBfQF+AX8BgAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEBkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngGfAaABoQGiAaMBpAGlAaYBpwGoAakBqgGrAawBrQGuAa8BsAGxAbIBswG0AbUBtgG3AbgBuQG6AbsBvAG9Ab4BvwHAAcEBwgHDAcQBxQHGAccByAHJAcoBywHMAc0BzgHPAdAB0QHSAdMB1AHVAdYB1wHYAdkB2gHbAdwB3QHeAd8B4AHhAeIB4wHkAeUB5gHnAegB6QHqAesB7AHtAe4B7wHwAfEB8gHzAfQB9QH2AfcB+AH5AfoB+wH8Af0B/gH/AgACAQICAgMCBAIFAgYCBwIIAgkCCgILAgwCDQIOAg8CEAIRAhICEwIUAhUCFgIXAhgCGQIaAhsCHAIdAh4CHwIgAiECIgIjAiQCJQImAicCKAIpAioCKwIsAi0CLgIvAjACMQIyAjMCNAI1AjYCNwI4AjkCOgI7AjwCPQI+Aj8CQAJBAkICQwJEAkUCRgJHAkgCSQJKAksCTAJNAk4CTwJQAlECUgJTAlQCVQJWAlcCWAJZAloCWwJcAl0CXgJfAmACYQJiAmMCZAJlAmYCZwJoAmkCagJrAmwCbQJuAm8CcAJxAnICcwJ0AnUCdgJ3AngCeQJ6AnsCfAJ9An4CfwKAAoECggKDAoQChQKGAocCiAKJAooCiwKMAo0CjgKPApACkQKSApMClAKVApYClwKYApkCmgKbApwCnQKeAp8CoAKhAqICowKkAqUCpgKnAqgCqQKqAqsCrAKtAq4CrwKwArECsgKzArQCtQK2ArcCuAAHYWNjb3VudBRhY3RpdmF0ZS1icmVha3BvaW50cwNhZGQHYXJjaGl2ZQphcnJvdy1ib3RoEWFycm93LWNpcmNsZS1kb3duEWFycm93LWNpcmNsZS1sZWZ0EmFycm93LWNpcmNsZS1yaWdodA9hcnJvdy1jaXJjbGUtdXAKYXJyb3ctZG93bgphcnJvdy1sZWZ0C2Fycm93LXJpZ2h0EGFycm93LXNtYWxsLWRvd24QYXJyb3ctc21hbGwtbGVmdBFhcnJvdy1zbWFsbC1yaWdodA5hcnJvdy1zbWFsbC11cAphcnJvdy1zd2FwCGFycm93LXVwDGF6dXJlLWRldm9wcwVhenVyZQtiZWFrZXItc3RvcAZiZWFrZXIIYmVsbC1kb3QOYmVsbC1zbGFzaC1kb3QKYmVsbC1zbGFzaARiZWxsBWJsYW5rBGJvbGQEYm9vawhib29rbWFyawticmFja2V0LWRvdA1icmFja2V0LWVycm9yCWJyaWVmY2FzZQlicm9hZGNhc3QHYnJvd3NlcgNidWcIY2FsZW5kYXINY2FsbC1pbmNvbWluZw1jYWxsLW91dGdvaW5nDmNhc2Utc2Vuc2l0aXZlCWNoZWNrLWFsbAVjaGVjawljaGVja2xpc3QMY2hldnJvbi1kb3duDGNoZXZyb24tbGVmdA1jaGV2cm9uLXJpZ2h0CmNoZXZyb24tdXAEY2hpcAxjaHJvbWUtY2xvc2UPY2hyb21lLW1heGltaXplD2Nocm9tZS1taW5pbWl6ZQ5jaHJvbWUtcmVzdG9yZQ1jaXJjbGUtZmlsbGVkE2NpcmNsZS1sYXJnZS1maWxsZWQMY2lyY2xlLWxhcmdlDGNpcmNsZS1zbGFzaBNjaXJjbGUtc21hbGwtZmlsbGVkDGNpcmNsZS1zbWFsbAZjaXJjbGUNY2lyY3VpdC1ib2FyZAljbGVhci1hbGwGY2xpcHB5CWNsb3NlLWFsbAVjbG9zZQ5jbG91ZC1kb3dubG9hZAxjbG91ZC11cGxvYWQFY2xvdWQEY29kZQZjb2ZmZWUMY29sbGFwc2UtYWxsCmNvbG9yLW1vZGUHY29tYmluZRJjb21tZW50LWRpc2N1c3Npb24NY29tbWVudC1kcmFmdBJjb21tZW50LXVucmVzb2x2ZWQHY29tbWVudA5jb21wYXNzLWFjdGl2ZQtjb21wYXNzLWRvdAdjb21wYXNzB2NvcGlsb3QEY29weQtjcmVkaXQtY2FyZARkYXNoCWRhc2hib2FyZAhkYXRhYmFzZQlkZWJ1Zy1hbGwPZGVidWctYWx0LXNtYWxsCWRlYnVnLWFsdCdkZWJ1Zy1icmVha3BvaW50LWNvbmRpdGlvbmFsLXVudmVyaWZpZWQcZGVidWctYnJlYWtwb2ludC1jb25kaXRpb25hbCBkZWJ1Zy1icmVha3BvaW50LWRhdGEtdW52ZXJpZmllZBVkZWJ1Zy1icmVha3BvaW50LWRhdGEkZGVidWctYnJlYWtwb2ludC1mdW5jdGlvbi11bnZlcmlmaWVkGWRlYnVnLWJyZWFrcG9pbnQtZnVuY3Rpb24fZGVidWctYnJlYWtwb2ludC1sb2ctdW52ZXJpZmllZBRkZWJ1Zy1icmVha3BvaW50LWxvZxxkZWJ1Zy1icmVha3BvaW50LXVuc3VwcG9ydGVkDWRlYnVnLWNvbnNvbGUUZGVidWctY29udGludWUtc21hbGwOZGVidWctY29udGludWUOZGVidWctY292ZXJhZ2UQZGVidWctZGlzY29ubmVjdBJkZWJ1Zy1saW5lLWJ5LWxpbmULZGVidWctcGF1c2ULZGVidWctcmVydW4TZGVidWctcmVzdGFydC1mcmFtZQ1kZWJ1Zy1yZXN0YXJ0FmRlYnVnLXJldmVyc2UtY29udGludWUXZGVidWctc3RhY2tmcmFtZS1hY3RpdmUQZGVidWctc3RhY2tmcmFtZQtkZWJ1Zy1zdGFydA9kZWJ1Zy1zdGVwLWJhY2sPZGVidWctc3RlcC1pbnRvDmRlYnVnLXN0ZXAtb3V0D2RlYnVnLXN0ZXAtb3ZlcgpkZWJ1Zy1zdG9wBWRlYnVnEGRlc2t0b3AtZG93bmxvYWQTZGV2aWNlLWNhbWVyYS12aWRlbw1kZXZpY2UtY2FtZXJhDWRldmljZS1tb2JpbGUKZGlmZi1hZGRlZAxkaWZmLWlnbm9yZWQNZGlmZi1tb2RpZmllZAxkaWZmLXJlbW92ZWQMZGlmZi1yZW5hbWVkBGRpZmYHZGlzY2FyZARlZGl0DWVkaXRvci1sYXlvdXQIZWxsaXBzaXMMZW1wdHktd2luZG93C2Vycm9yLXNtYWxsBWVycm9yB2V4Y2x1ZGUKZXhwYW5kLWFsbAZleHBvcnQKZXh0ZW5zaW9ucwpleWUtY2xvc2VkA2V5ZQhmZWVkYmFjawtmaWxlLWJpbmFyeQlmaWxlLWNvZGUKZmlsZS1tZWRpYQhmaWxlLXBkZg5maWxlLXN1Ym1vZHVsZRZmaWxlLXN5bWxpbmstZGlyZWN0b3J5EWZpbGUtc3ltbGluay1maWxlCGZpbGUtemlwBGZpbGUFZmlsZXMNZmlsdGVyLWZpbGxlZAZmaWx0ZXIFZmxhbWUJZm9sZC1kb3duB2ZvbGQtdXAEZm9sZA1mb2xkZXItYWN0aXZlDmZvbGRlci1saWJyYXJ5DWZvbGRlci1vcGVuZWQGZm9sZGVyBGdhbWUEZ2VhcgRnaWZ0C2dpc3Qtc2VjcmV0CmdpdC1jb21taXQLZ2l0LWNvbXBhcmUJZ2l0LWZldGNoCWdpdC1tZXJnZRdnaXQtcHVsbC1yZXF1ZXN0LWNsb3NlZBdnaXQtcHVsbC1yZXF1ZXN0LWNyZWF0ZRZnaXQtcHVsbC1yZXF1ZXN0LWRyYWZ0HmdpdC1wdWxsLXJlcXVlc3QtZ28tdG8tY2hhbmdlcxxnaXQtcHVsbC1yZXF1ZXN0LW5ldy1jaGFuZ2VzEGdpdC1wdWxsLXJlcXVlc3QNZ2l0aHViLWFjdGlvbgpnaXRodWItYWx0D2dpdGh1Yi1pbnZlcnRlZAZnaXRodWIFZ2xvYmUKZ28tdG8tZmlsZQdncmFiYmVyCmdyYXBoLWxlZnQKZ3JhcGgtbGluZQ1ncmFwaC1zY2F0dGVyBWdyYXBoB2dyaXBwZXIRZ3JvdXAtYnktcmVmLXR5cGUMaGVhcnQtZmlsbGVkBWhlYXJ0B2hpc3RvcnkEaG9tZQ9ob3Jpem9udGFsLXJ1bGUFaHVib3QFaW5ib3gGaW5kZW50BGluZm8GaW5zZXJ0B2luc3BlY3QLaXNzdWUtZHJhZnQOaXNzdWUtcmVvcGVuZWQGaXNzdWVzBml0YWxpYwZqZXJzZXkEanNvbg5rZWJhYi12ZXJ0aWNhbANrZXkDbGF3DWxheWVycy1hY3RpdmUKbGF5ZXJzLWRvdAZsYXllcnMXbGF5b3V0LWFjdGl2aXR5YmFyLWxlZnQYbGF5b3V0LWFjdGl2aXR5YmFyLXJpZ2h0D2xheW91dC1jZW50ZXJlZA5sYXlvdXQtbWVudWJhchNsYXlvdXQtcGFuZWwtY2VudGVyFGxheW91dC1wYW5lbC1qdXN0aWZ5EWxheW91dC1wYW5lbC1sZWZ0EGxheW91dC1wYW5lbC1vZmYSbGF5b3V0LXBhbmVsLXJpZ2h0DGxheW91dC1wYW5lbBdsYXlvdXQtc2lkZWJhci1sZWZ0LW9mZhNsYXlvdXQtc2lkZWJhci1sZWZ0GGxheW91dC1zaWRlYmFyLXJpZ2h0LW9mZhRsYXlvdXQtc2lkZWJhci1yaWdodBBsYXlvdXQtc3RhdHVzYmFyBmxheW91dAdsaWJyYXJ5EWxpZ2h0YnVsYi1hdXRvZml4CWxpZ2h0YnVsYg1saW5rLWV4dGVybmFsBGxpbmsLbGlzdC1maWx0ZXIJbGlzdC1mbGF0DGxpc3Qtb3JkZXJlZA5saXN0LXNlbGVjdGlvbglsaXN0LXRyZWUObGlzdC11bm9yZGVyZWQKbGl2ZS1zaGFyZQdsb2FkaW5nCGxvY2F0aW9uCmxvY2stc21hbGwEbG9jawZtYWduZXQJbWFpbC1yZWFkBG1haWwKbWFwLWZpbGxlZANtYXAIbWFya2Rvd24JbWVnYXBob25lB21lbnRpb24EbWVudQVtZXJnZQptaWMtZmlsbGVkA21pYwltaWxlc3RvbmUGbWlycm9yDG1vcnRhci1ib2FyZARtb3ZlEG11bHRpcGxlLXdpbmRvd3MFbXVzaWMEbXV0ZQhuZXctZmlsZQpuZXctZm9sZGVyB25ld2xpbmUKbm8tbmV3bGluZQRub3RlEW5vdGVib29rLXRlbXBsYXRlCG5vdGVib29rCG9jdG9mYWNlDG9wZW4tcHJldmlldwxvcmdhbml6YXRpb24Gb3V0cHV0B3BhY2thZ2UIcGFpbnRjYW4LcGFzcy1maWxsZWQEcGFzcwpwZXJzb24tYWRkBnBlcnNvbgVwaWFubwlwaWUtY2hhcnQDcGluDHBpbm5lZC1kaXJ0eQZwaW5uZWQLcGxheS1jaXJjbGUEcGxheQRwbHVnDXByZXNlcnZlLWNhc2UHcHJldmlldxBwcmltaXRpdmUtc3F1YXJlB3Byb2plY3QFcHVsc2UIcXVlc3Rpb24FcXVvdGULcmFkaW8tdG93ZXIJcmVhY3Rpb25zC3JlY29yZC1rZXlzDHJlY29yZC1zbWFsbAZyZWNvcmQEcmVkbwpyZWZlcmVuY2VzB3JlZnJlc2gFcmVnZXgPcmVtb3RlLWV4cGxvcmVyBnJlbW90ZQZyZW1vdmULcmVwbGFjZS1hbGwHcmVwbGFjZQVyZXBseQpyZXBvLWNsb25lD3JlcG8tZm9yY2UtcHVzaAtyZXBvLWZvcmtlZAlyZXBvLXB1bGwJcmVwby1wdXNoBHJlcG8GcmVwb3J0D3JlcXVlc3QtY2hhbmdlcwZyb2NrZXQScm9vdC1mb2xkZXItb3BlbmVkC3Jvb3QtZm9sZGVyA3JzcwRydWJ5CXJ1bi1hYm92ZQdydW4tYWxsCXJ1bi1iZWxvdwpydW4tZXJyb3JzCHNhdmUtYWxsB3NhdmUtYXMEc2F2ZQtzY3JlZW4tZnVsbA1zY3JlZW4tbm9ybWFsDHNlYXJjaC1mdXp6eQtzZWFyY2gtc3RvcAZzZWFyY2gEc2VuZBJzZXJ2ZXItZW52aXJvbm1lbnQOc2VydmVyLXByb2Nlc3MGc2VydmVyDXNldHRpbmdzLWdlYXIIc2V0dGluZ3MGc2hpZWxkB3NpZ24taW4Ic2lnbi1vdXQGc21pbGV5BXNuYWtlD3NvcnQtcHJlY2VkZW5jZQ5zb3VyY2UtY29udHJvbAdzcGFya2xlEHNwbGl0LWhvcml6b250YWwOc3BsaXQtdmVydGljYWwIc3F1aXJyZWwKc3Rhci1lbXB0eQlzdGFyLWZ1bGwJc3Rhci1oYWxmC3N0b3AtY2lyY2xlDHN5bWJvbC1hcnJheQ5zeW1ib2wtYm9vbGVhbgxzeW1ib2wtY2xhc3MMc3ltYm9sLWNvbG9yD3N5bWJvbC1jb25zdGFudBJzeW1ib2wtZW51bS1tZW1iZXILc3ltYm9sLWVudW0Mc3ltYm9sLWV2ZW50DHN5bWJvbC1maWVsZAtzeW1ib2wtZmlsZRBzeW1ib2wtaW50ZXJmYWNlCnN5bWJvbC1rZXkOc3ltYm9sLWtleXdvcmQNc3ltYm9sLW1ldGhvZAtzeW1ib2wtbWlzYxBzeW1ib2wtbmFtZXNwYWNlDnN5bWJvbC1udW1lcmljD3N5bWJvbC1vcGVyYXRvchBzeW1ib2wtcGFyYW1ldGVyD3N5bWJvbC1wcm9wZXJ0eQxzeW1ib2wtcnVsZXIOc3ltYm9sLXNuaXBwZXQNc3ltYm9sLXN0cmluZxBzeW1ib2wtc3RydWN0dXJlD3N5bWJvbC12YXJpYWJsZQxzeW5jLWlnbm9yZWQEc3luYwV0YWJsZQN0YWcGdGFyZ2V0CHRhc2tsaXN0CXRlbGVzY29wZQ10ZXJtaW5hbC1iYXNoDHRlcm1pbmFsLWNtZA90ZXJtaW5hbC1kZWJpYW4OdGVybWluYWwtbGludXgTdGVybWluYWwtcG93ZXJzaGVsbA10ZXJtaW5hbC10bXV4D3Rlcm1pbmFsLXVidW50dQh0ZXJtaW5hbAl0ZXh0LXNpemUKdGhyZWUtYmFycxF0aHVtYnNkb3duLWZpbGxlZAp0aHVtYnNkb3duD3RodW1ic3VwLWZpbGxlZAh0aHVtYnN1cAV0b29scwV0cmFzaA10cmlhbmdsZS1kb3duDXRyaWFuZ2xlLWxlZnQOdHJpYW5nbGUtcmlnaHQLdHJpYW5nbGUtdXAHdHdpdHRlchJ0eXBlLWhpZXJhcmNoeS1zdWIUdHlwZS1oaWVyYXJjaHktc3VwZXIOdHlwZS1oaWVyYXJjaHkGdW5mb2xkE3VuZ3JvdXAtYnktcmVmLXR5cGUGdW5sb2NrBnVubXV0ZQp1bnZlcmlmaWVkDnZhcmlhYmxlLWdyb3VwD3ZlcmlmaWVkLWZpbGxlZAh2ZXJpZmllZAh2ZXJzaW9ucwl2bS1hY3RpdmUKdm0tY29ubmVjdAp2bS1vdXRsaW5lCnZtLXJ1bm5pbmcCdm0CdnIEd2FuZAd3YXJuaW5nBXdhdGNoCndoaXRlc3BhY2UKd2hvbGUtd29yZAZ3aW5kb3cJd29yZC13cmFwEXdvcmtzcGFjZS10cnVzdGVkEXdvcmtzcGFjZS11bmtub3duE3dvcmtzcGFjZS11bnRydXN0ZWQHem9vbS1pbgh6b29tLW91dAAA)\n    format(\"truetype\");\n}\n.codicon[class*=\"codicon-\"] {\n  font: 16px/1 codicon;\n  display: inline-block;\n  text-decoration: none;\n  text-rendering: auto;\n  text-align: center;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  user-select: none;\n  -webkit-user-select: none;\n  -ms-user-select: none;\n}\n@keyframes codicon-spin {\n  to {\n    transform: rotate(360deg);\n  }\n}\n.codicon-sync.codicon-modifier-spin,\n.codicon-loading.codicon-modifier-spin,\n.codicon-gear.codicon-modifier-spin {\n  animation: codicon-spin 1.5s steps(30) infinite;\n}\n.codicon-modifier-disabled {\n  opacity: 0.5;\n}\n.codicon-modifier-hidden {\n  opacity: 0;\n}\n.codicon-loading {\n  animation-duration: 1s !important;\n  animation-timing-function: cubic-bezier(0.53, 0.21, 0.29, 0.67) !important;\n}\n.codicon-add:before {\n  content: \"\";\n}\n.codicon-plus:before {\n  content: \"\";\n}\n.codicon-gist-new:before {\n  content: \"\";\n}\n.codicon-repo-create:before {\n  content: \"\";\n}\n.codicon-lightbulb:before {\n  content: \"\";\n}\n.codicon-light-bulb:before {\n  content: \"\";\n}\n.codicon-repo:before {\n  content: \"\";\n}\n.codicon-repo-delete:before {\n  content: \"\";\n}\n.codicon-gist-fork:before {\n  content: \"\";\n}\n.codicon-repo-forked:before {\n  content: \"\";\n}\n.codicon-git-pull-request:before {\n  content: \"\";\n}\n.codicon-git-pull-request-abandoned:before {\n  content: \"\";\n}\n.codicon-record-keys:before {\n  content: \"\";\n}\n.codicon-keyboard:before {\n  content: \"\";\n}\n.codicon-tag:before {\n  content: \"\";\n}\n.codicon-git-pull-request-label:before {\n  content: \"\";\n}\n.codicon-tag-add:before {\n  content: \"\";\n}\n.codicon-tag-remove:before {\n  content: \"\";\n}\n.codicon-person:before {\n  content: \"\";\n}\n.codicon-person-follow:before {\n  content: \"\";\n}\n.codicon-person-outline:before {\n  content: \"\";\n}\n.codicon-person-filled:before {\n  content: \"\";\n}\n.codicon-git-branch:before {\n  content: \"\";\n}\n.codicon-git-branch-create:before {\n  content: \"\";\n}\n.codicon-git-branch-delete:before {\n  content: \"\";\n}\n.codicon-source-control:before {\n  content: \"\";\n}\n.codicon-mirror:before {\n  content: \"\";\n}\n.codicon-mirror-public:before {\n  content: \"\";\n}\n.codicon-star:before {\n  content: \"\";\n}\n.codicon-star-add:before {\n  content: \"\";\n}\n.codicon-star-delete:before {\n  content: \"\";\n}\n.codicon-star-empty:before {\n  content: \"\";\n}\n.codicon-comment:before {\n  content: \"\";\n}\n.codicon-comment-add:before {\n  content: \"\";\n}\n.codicon-alert:before {\n  content: \"\";\n}\n.codicon-warning:before {\n  content: \"\";\n}\n.codicon-search:before {\n  content: \"\";\n}\n.codicon-search-save:before {\n  content: \"\";\n}\n.codicon-log-out:before {\n  content: \"\";\n}\n.codicon-sign-out:before {\n  content: \"\";\n}\n.codicon-log-in:before {\n  content: \"\";\n}\n.codicon-sign-in:before {\n  content: \"\";\n}\n.codicon-eye:before {\n  content: \"\";\n}\n.codicon-eye-unwatch:before {\n  content: \"\";\n}\n.codicon-eye-watch:before {\n  content: \"\";\n}\n.codicon-circle-filled:before {\n  content: \"\";\n}\n.codicon-primitive-dot:before {\n  content: \"\";\n}\n.codicon-close-dirty:before {\n  content: \"\";\n}\n.codicon-debug-breakpoint:before {\n  content: \"\";\n}\n.codicon-debug-breakpoint-disabled:before {\n  content: \"\";\n}\n.codicon-debug-hint:before {\n  content: \"\";\n}\n.codicon-terminal-decoration-success:before {\n  content: \"\";\n}\n.codicon-primitive-square:before {\n  content: \"\";\n}\n.codicon-edit:before {\n  content: \"\";\n}\n.codicon-pencil:before {\n  content: \"\";\n}\n.codicon-info:before {\n  content: \"\";\n}\n.codicon-issue-opened:before {\n  content: \"\";\n}\n.codicon-gist-private:before {\n  content: \"\";\n}\n.codicon-git-fork-private:before {\n  content: \"\";\n}\n.codicon-lock:before {\n  content: \"\";\n}\n.codicon-mirror-private:before {\n  content: \"\";\n}\n.codicon-close:before {\n  content: \"\";\n}\n.codicon-remove-close:before {\n  content: \"\";\n}\n.codicon-x:before {\n  content: \"\";\n}\n.codicon-repo-sync:before {\n  content: \"\";\n}\n.codicon-sync:before {\n  content: \"\";\n}\n.codicon-clone:before {\n  content: \"\";\n}\n.codicon-desktop-download:before {\n  content: \"\";\n}\n.codicon-beaker:before {\n  content: \"\";\n}\n.codicon-microscope:before {\n  content: \"\";\n}\n.codicon-vm:before {\n  content: \"\";\n}\n.codicon-device-desktop:before {\n  content: \"\";\n}\n.codicon-file:before {\n  content: \"\";\n}\n.codicon-file-text:before {\n  content: \"\";\n}\n.codicon-more:before {\n  content: \"\";\n}\n.codicon-ellipsis:before {\n  content: \"\";\n}\n.codicon-kebab-horizontal:before {\n  content: \"\";\n}\n.codicon-mail-reply:before {\n  content: \"\";\n}\n.codicon-reply:before {\n  content: \"\";\n}\n.codicon-organization:before {\n  content: \"\";\n}\n.codicon-organization-filled:before {\n  content: \"\";\n}\n.codicon-organization-outline:before {\n  content: \"\";\n}\n.codicon-new-file:before {\n  content: \"\";\n}\n.codicon-file-add:before {\n  content: \"\";\n}\n.codicon-new-folder:before {\n  content: \"\";\n}\n.codicon-file-directory-create:before {\n  content: \"\";\n}\n.codicon-trash:before {\n  content: \"\";\n}\n.codicon-trashcan:before {\n  content: \"\";\n}\n.codicon-history:before {\n  content: \"\";\n}\n.codicon-clock:before {\n  content: \"\";\n}\n.codicon-folder:before {\n  content: \"\";\n}\n.codicon-file-directory:before {\n  content: \"\";\n}\n.codicon-symbol-folder:before {\n  content: \"\";\n}\n.codicon-logo-github:before {\n  content: \"\";\n}\n.codicon-mark-github:before {\n  content: \"\";\n}\n.codicon-github:before {\n  content: \"\";\n}\n.codicon-terminal:before {\n  content: \"\";\n}\n.codicon-console:before {\n  content: \"\";\n}\n.codicon-repl:before {\n  content: \"\";\n}\n.codicon-zap:before {\n  content: \"\";\n}\n.codicon-symbol-event:before {\n  content: \"\";\n}\n.codicon-error:before {\n  content: \"\";\n}\n.codicon-stop:before {\n  content: \"\";\n}\n.codicon-variable:before {\n  content: \"\";\n}\n.codicon-symbol-variable:before {\n  content: \"\";\n}\n.codicon-array:before {\n  content: \"\";\n}\n.codicon-symbol-array:before {\n  content: \"\";\n}\n.codicon-symbol-module:before {\n  content: \"\";\n}\n.codicon-symbol-package:before {\n  content: \"\";\n}\n.codicon-symbol-namespace:before {\n  content: \"\";\n}\n.codicon-symbol-object:before {\n  content: \"\";\n}\n.codicon-symbol-method:before {\n  content: \"\";\n}\n.codicon-symbol-function:before {\n  content: \"\";\n}\n.codicon-symbol-constructor:before {\n  content: \"\";\n}\n.codicon-symbol-boolean:before {\n  content: \"\";\n}\n.codicon-symbol-null:before {\n  content: \"\";\n}\n.codicon-symbol-numeric:before {\n  content: \"\";\n}\n.codicon-symbol-number:before {\n  content: \"\";\n}\n.codicon-symbol-structure:before {\n  content: \"\";\n}\n.codicon-symbol-struct:before {\n  content: \"\";\n}\n.codicon-symbol-parameter:before {\n  content: \"\";\n}\n.codicon-symbol-type-parameter:before {\n  content: \"\";\n}\n.codicon-symbol-key:before {\n  content: \"\";\n}\n.codicon-symbol-text:before {\n  content: \"\";\n}\n.codicon-symbol-reference:before {\n  content: \"\";\n}\n.codicon-go-to-file:before {\n  content: \"\";\n}\n.codicon-symbol-enum:before {\n  content: \"\";\n}\n.codicon-symbol-value:before {\n  content: \"\";\n}\n.codicon-symbol-ruler:before {\n  content: \"\";\n}\n.codicon-symbol-unit:before {\n  content: \"\";\n}\n.codicon-activate-breakpoints:before {\n  content: \"\";\n}\n.codicon-archive:before {\n  content: \"\";\n}\n.codicon-arrow-both:before {\n  content: \"\";\n}\n.codicon-arrow-down:before {\n  content: \"\";\n}\n.codicon-arrow-left:before {\n  content: \"\";\n}\n.codicon-arrow-right:before {\n  content: \"\";\n}\n.codicon-arrow-small-down:before {\n  content: \"\";\n}\n.codicon-arrow-small-left:before {\n  content: \"\";\n}\n.codicon-arrow-small-right:before {\n  content: \"\";\n}\n.codicon-arrow-small-up:before {\n  content: \"\";\n}\n.codicon-arrow-up:before {\n  content: \"\";\n}\n.codicon-bell:before {\n  content: \"\";\n}\n.codicon-bold:before {\n  content: \"\";\n}\n.codicon-book:before {\n  content: \"\";\n}\n.codicon-bookmark:before {\n  content: \"\";\n}\n.codicon-debug-breakpoint-conditional-unverified:before {\n  content: \"\";\n}\n.codicon-debug-breakpoint-conditional:before {\n  content: \"\";\n}\n.codicon-debug-breakpoint-conditional-disabled:before {\n  content: \"\";\n}\n.codicon-debug-breakpoint-data-unverified:before {\n  content: \"\";\n}\n.codicon-debug-breakpoint-data:before {\n  content: \"\";\n}\n.codicon-debug-breakpoint-data-disabled:before {\n  content: \"\";\n}\n.codicon-debug-breakpoint-log-unverified:before {\n  content: \"\";\n}\n.codicon-debug-breakpoint-log:before {\n  content: \"\";\n}\n.codicon-debug-breakpoint-log-disabled:before {\n  content: \"\";\n}\n.codicon-briefcase:before {\n  content: \"\";\n}\n.codicon-broadcast:before {\n  content: \"\";\n}\n.codicon-browser:before {\n  content: \"\";\n}\n.codicon-bug:before {\n  content: \"\";\n}\n.codicon-calendar:before {\n  content: \"\";\n}\n.codicon-case-sensitive:before {\n  content: \"\";\n}\n.codicon-check:before {\n  content: \"\";\n}\n.codicon-checklist:before {\n  content: \"\";\n}\n.codicon-chevron-down:before {\n  content: \"\";\n}\n.codicon-chevron-left:before {\n  content: \"\";\n}\n.codicon-chevron-right:before {\n  content: \"\";\n}\n.codicon-chevron-up:before {\n  content: \"\";\n}\n.codicon-chrome-close:before {\n  content: \"\";\n}\n.codicon-chrome-maximize:before {\n  content: \"\";\n}\n.codicon-chrome-minimize:before {\n  content: \"\";\n}\n.codicon-chrome-restore:before {\n  content: \"\";\n}\n.codicon-circle-outline:before {\n  content: \"\";\n}\n.codicon-circle:before {\n  content: \"\";\n}\n.codicon-debug-breakpoint-unverified:before {\n  content: \"\";\n}\n.codicon-terminal-decoration-incomplete:before {\n  content: \"\";\n}\n.codicon-circle-slash:before {\n  content: \"\";\n}\n.codicon-circuit-board:before {\n  content: \"\";\n}\n.codicon-clear-all:before {\n  content: \"\";\n}\n.codicon-clippy:before {\n  content: \"\";\n}\n.codicon-close-all:before {\n  content: \"\";\n}\n.codicon-cloud-download:before {\n  content: \"\";\n}\n.codicon-cloud-upload:before {\n  content: \"\";\n}\n.codicon-code:before {\n  content: \"\";\n}\n.codicon-collapse-all:before {\n  content: \"\";\n}\n.codicon-color-mode:before {\n  content: \"\";\n}\n.codicon-comment-discussion:before {\n  content: \"\";\n}\n.codicon-credit-card:before {\n  content: \"\";\n}\n.codicon-dash:before {\n  content: \"\";\n}\n.codicon-dashboard:before {\n  content: \"\";\n}\n.codicon-database:before {\n  content: \"\";\n}\n.codicon-debug-continue:before {\n  content: \"\";\n}\n.codicon-debug-disconnect:before {\n  content: \"\";\n}\n.codicon-debug-pause:before {\n  content: \"\";\n}\n.codicon-debug-restart:before {\n  content: \"\";\n}\n.codicon-debug-start:before {\n  content: \"\";\n}\n.codicon-debug-step-into:before {\n  content: \"\";\n}\n.codicon-debug-step-out:before {\n  content: \"\";\n}\n.codicon-debug-step-over:before {\n  content: \"\";\n}\n.codicon-debug-stop:before {\n  content: \"\";\n}\n.codicon-debug:before {\n  content: \"\";\n}\n.codicon-device-camera-video:before {\n  content: \"\";\n}\n.codicon-device-camera:before {\n  content: \"\";\n}\n.codicon-device-mobile:before {\n  content: \"\";\n}\n.codicon-diff-added:before {\n  content: \"\";\n}\n.codicon-diff-ignored:before {\n  content: \"\";\n}\n.codicon-diff-modified:before {\n  content: \"\";\n}\n.codicon-diff-removed:before {\n  content: \"\";\n}\n.codicon-diff-renamed:before {\n  content: \"\";\n}\n.codicon-diff:before {\n  content: \"\";\n}\n.codicon-discard:before {\n  content: \"\";\n}\n.codicon-editor-layout:before {\n  content: \"\";\n}\n.codicon-empty-window:before {\n  content: \"\";\n}\n.codicon-exclude:before {\n  content: \"\";\n}\n.codicon-extensions:before {\n  content: \"\";\n}\n.codicon-eye-closed:before {\n  content: \"\";\n}\n.codicon-file-binary:before {\n  content: \"\";\n}\n.codicon-file-code:before {\n  content: \"\";\n}\n.codicon-file-media:before {\n  content: \"\";\n}\n.codicon-file-pdf:before {\n  content: \"\";\n}\n.codicon-file-submodule:before {\n  content: \"\";\n}\n.codicon-file-symlink-directory:before {\n  content: \"\";\n}\n.codicon-file-symlink-file:before {\n  content: \"\";\n}\n.codicon-file-zip:before {\n  content: \"\";\n}\n.codicon-files:before {\n  content: \"\";\n}\n.codicon-filter:before {\n  content: \"\";\n}\n.codicon-flame:before {\n  content: \"\";\n}\n.codicon-fold-down:before {\n  content: \"\";\n}\n.codicon-fold-up:before {\n  content: \"\";\n}\n.codicon-fold:before {\n  content: \"\";\n}\n.codicon-folder-active:before {\n  content: \"\";\n}\n.codicon-folder-opened:before {\n  content: \"\";\n}\n.codicon-gear:before {\n  content: \"\";\n}\n.codicon-gift:before {\n  content: \"\";\n}\n.codicon-gist-secret:before {\n  content: \"\";\n}\n.codicon-gist:before {\n  content: \"\";\n}\n.codicon-git-commit:before {\n  content: \"\";\n}\n.codicon-git-compare:before {\n  content: \"\";\n}\n.codicon-compare-changes:before {\n  content: \"\";\n}\n.codicon-git-merge:before {\n  content: \"\";\n}\n.codicon-github-action:before {\n  content: \"\";\n}\n.codicon-github-alt:before {\n  content: \"\";\n}\n.codicon-globe:before {\n  content: \"\";\n}\n.codicon-grabber:before {\n  content: \"\";\n}\n.codicon-graph:before {\n  content: \"\";\n}\n.codicon-gripper:before {\n  content: \"\";\n}\n.codicon-heart:before {\n  content: \"\";\n}\n.codicon-home:before {\n  content: \"\";\n}\n.codicon-horizontal-rule:before {\n  content: \"\";\n}\n.codicon-hubot:before {\n  content: \"\";\n}\n.codicon-inbox:before {\n  content: \"\";\n}\n.codicon-issue-reopened:before {\n  content: \"\";\n}\n.codicon-issues:before {\n  content: \"\";\n}\n.codicon-italic:before {\n  content: \"\";\n}\n.codicon-jersey:before {\n  content: \"\";\n}\n.codicon-json:before {\n  content: \"\";\n}\n.codicon-kebab-vertical:before {\n  content: \"\";\n}\n.codicon-key:before {\n  content: \"\";\n}\n.codicon-law:before {\n  content: \"\";\n}\n.codicon-lightbulb-autofix:before {\n  content: \"\";\n}\n.codicon-link-external:before {\n  content: \"\";\n}\n.codicon-link:before {\n  content: \"\";\n}\n.codicon-list-ordered:before {\n  content: \"\";\n}\n.codicon-list-unordered:before {\n  content: \"\";\n}\n.codicon-live-share:before {\n  content: \"\";\n}\n.codicon-loading:before {\n  content: \"\";\n}\n.codicon-location:before {\n  content: \"\";\n}\n.codicon-mail-read:before {\n  content: \"\";\n}\n.codicon-mail:before {\n  content: \"\";\n}\n.codicon-markdown:before {\n  content: \"\";\n}\n.codicon-megaphone:before {\n  content: \"\";\n}\n.codicon-mention:before {\n  content: \"\";\n}\n.codicon-milestone:before {\n  content: \"\";\n}\n.codicon-git-pull-request-milestone:before {\n  content: \"\";\n}\n.codicon-mortar-board:before {\n  content: \"\";\n}\n.codicon-move:before {\n  content: \"\";\n}\n.codicon-multiple-windows:before {\n  content: \"\";\n}\n.codicon-mute:before {\n  content: \"\";\n}\n.codicon-no-newline:before {\n  content: \"\";\n}\n.codicon-note:before {\n  content: \"\";\n}\n.codicon-octoface:before {\n  content: \"\";\n}\n.codicon-open-preview:before {\n  content: \"\";\n}\n.codicon-package:before {\n  content: \"\";\n}\n.codicon-paintcan:before {\n  content: \"\";\n}\n.codicon-pin:before {\n  content: \"\";\n}\n.codicon-play:before {\n  content: \"\";\n}\n.codicon-run:before {\n  content: \"\";\n}\n.codicon-plug:before {\n  content: \"\";\n}\n.codicon-preserve-case:before {\n  content: \"\";\n}\n.codicon-preview:before {\n  content: \"\";\n}\n.codicon-project:before {\n  content: \"\";\n}\n.codicon-pulse:before {\n  content: \"\";\n}\n.codicon-question:before {\n  content: \"\";\n}\n.codicon-quote:before {\n  content: \"\";\n}\n.codicon-radio-tower:before {\n  content: \"\";\n}\n.codicon-reactions:before {\n  content: \"\";\n}\n.codicon-references:before {\n  content: \"\";\n}\n.codicon-refresh:before {\n  content: \"\";\n}\n.codicon-regex:before {\n  content: \"\";\n}\n.codicon-remote-explorer:before {\n  content: \"\";\n}\n.codicon-remote:before {\n  content: \"\";\n}\n.codicon-remove:before {\n  content: \"\";\n}\n.codicon-replace-all:before {\n  content: \"\";\n}\n.codicon-replace:before {\n  content: \"\";\n}\n.codicon-repo-clone:before {\n  content: \"\";\n}\n.codicon-repo-force-push:before {\n  content: \"\";\n}\n.codicon-repo-pull:before {\n  content: \"\";\n}\n.codicon-repo-push:before {\n  content: \"\";\n}\n.codicon-report:before {\n  content: \"\";\n}\n.codicon-request-changes:before {\n  content: \"\";\n}\n.codicon-rocket:before {\n  content: \"\";\n}\n.codicon-root-folder-opened:before {\n  content: \"\";\n}\n.codicon-root-folder:before {\n  content: \"\";\n}\n.codicon-rss:before {\n  content: \"\";\n}\n.codicon-ruby:before {\n  content: \"\";\n}\n.codicon-save-all:before {\n  content: \"\";\n}\n.codicon-save-as:before {\n  content: \"\";\n}\n.codicon-save:before {\n  content: \"\";\n}\n.codicon-screen-full:before {\n  content: \"\";\n}\n.codicon-screen-normal:before {\n  content: \"\";\n}\n.codicon-search-stop:before {\n  content: \"\";\n}\n.codicon-server:before {\n  content: \"\";\n}\n.codicon-settings-gear:before {\n  content: \"\";\n}\n.codicon-settings:before {\n  content: \"\";\n}\n.codicon-shield:before {\n  content: \"\";\n}\n.codicon-smiley:before {\n  content: \"\";\n}\n.codicon-sort-precedence:before {\n  content: \"\";\n}\n.codicon-split-horizontal:before {\n  content: \"\";\n}\n.codicon-split-vertical:before {\n  content: \"\";\n}\n.codicon-squirrel:before {\n  content: \"\";\n}\n.codicon-star-full:before {\n  content: \"\";\n}\n.codicon-star-half:before {\n  content: \"\";\n}\n.codicon-symbol-class:before {\n  content: \"\";\n}\n.codicon-symbol-color:before {\n  content: \"\";\n}\n.codicon-symbol-constant:before {\n  content: \"\";\n}\n.codicon-symbol-enum-member:before {\n  content: \"\";\n}\n.codicon-symbol-field:before {\n  content: \"\";\n}\n.codicon-symbol-file:before {\n  content: \"\";\n}\n.codicon-symbol-interface:before {\n  content: \"\";\n}\n.codicon-symbol-keyword:before {\n  content: \"\";\n}\n.codicon-symbol-misc:before {\n  content: \"\";\n}\n.codicon-symbol-operator:before {\n  content: \"\";\n}\n.codicon-symbol-property:before {\n  content: \"\";\n}\n.codicon-wrench:before {\n  content: \"\";\n}\n.codicon-wrench-subaction:before {\n  content: \"\";\n}\n.codicon-symbol-snippet:before {\n  content: \"\";\n}\n.codicon-tasklist:before {\n  content: \"\";\n}\n.codicon-telescope:before {\n  content: \"\";\n}\n.codicon-text-size:before {\n  content: \"\";\n}\n.codicon-three-bars:before {\n  content: \"\";\n}\n.codicon-thumbsdown:before {\n  content: \"\";\n}\n.codicon-thumbsup:before {\n  content: \"\";\n}\n.codicon-tools:before {\n  content: \"\";\n}\n.codicon-triangle-down:before {\n  content: \"\";\n}\n.codicon-triangle-left:before {\n  content: \"\";\n}\n.codicon-triangle-right:before {\n  content: \"\";\n}\n.codicon-triangle-up:before {\n  content: \"\";\n}\n.codicon-twitter:before {\n  content: \"\";\n}\n.codicon-unfold:before {\n  content: \"\";\n}\n.codicon-unlock:before {\n  content: \"\";\n}\n.codicon-unmute:before {\n  content: \"\";\n}\n.codicon-unverified:before {\n  content: \"\";\n}\n.codicon-verified:before {\n  content: \"\";\n}\n.codicon-versions:before {\n  content: \"\";\n}\n.codicon-vm-active:before {\n  content: \"\";\n}\n.codicon-vm-outline:before {\n  content: \"\";\n}\n.codicon-vm-running:before {\n  content: \"\";\n}\n.codicon-watch:before {\n  content: \"\";\n}\n.codicon-whitespace:before {\n  content: \"\";\n}\n.codicon-whole-word:before {\n  content: \"\";\n}\n.codicon-window:before {\n  content: \"\";\n}\n.codicon-word-wrap:before {\n  content: \"\";\n}\n.codicon-zoom-in:before {\n  content: \"\";\n}\n.codicon-zoom-out:before {\n  content: \"\";\n}\n.codicon-list-filter:before {\n  content: \"\";\n}\n.codicon-list-flat:before {\n  content: \"\";\n}\n.codicon-list-selection:before {\n  content: \"\";\n}\n.codicon-selection:before {\n  content: \"\";\n}\n.codicon-list-tree:before {\n  content: \"\";\n}\n.codicon-debug-breakpoint-function-unverified:before {\n  content: \"\";\n}\n.codicon-debug-breakpoint-function:before {\n  content: \"\";\n}\n.codicon-debug-breakpoint-function-disabled:before {\n  content: \"\";\n}\n.codicon-debug-stackframe-active:before {\n  content: \"\";\n}\n.codicon-circle-small-filled:before {\n  content: \"\";\n}\n.codicon-debug-stackframe-dot:before {\n  content: \"\";\n}\n.codicon-terminal-decoration-mark:before {\n  content: \"\";\n}\n.codicon-debug-stackframe:before {\n  content: \"\";\n}\n.codicon-debug-stackframe-focused:before {\n  content: \"\";\n}\n.codicon-debug-breakpoint-unsupported:before {\n  content: \"\";\n}\n.codicon-symbol-string:before {\n  content: \"\";\n}\n.codicon-debug-reverse-continue:before {\n  content: \"\";\n}\n.codicon-debug-step-back:before {\n  content: \"\";\n}\n.codicon-debug-restart-frame:before {\n  content: \"\";\n}\n.codicon-debug-alt:before {\n  content: \"\";\n}\n.codicon-call-incoming:before {\n  content: \"\";\n}\n.codicon-call-outgoing:before {\n  content: \"\";\n}\n.codicon-menu:before {\n  content: \"\";\n}\n.codicon-expand-all:before {\n  content: \"\";\n}\n.codicon-feedback:before {\n  content: \"\";\n}\n.codicon-git-pull-request-reviewer:before {\n  content: \"\";\n}\n.codicon-group-by-ref-type:before {\n  content: \"\";\n}\n.codicon-ungroup-by-ref-type:before {\n  content: \"\";\n}\n.codicon-account:before {\n  content: \"\";\n}\n.codicon-git-pull-request-assignee:before {\n  content: \"\";\n}\n.codicon-bell-dot:before {\n  content: \"\";\n}\n.codicon-debug-console:before {\n  content: \"\";\n}\n.codicon-library:before {\n  content: \"\";\n}\n.codicon-output:before {\n  content: \"\";\n}\n.codicon-run-all:before {\n  content: \"\";\n}\n.codicon-sync-ignored:before {\n  content: \"\";\n}\n.codicon-pinned:before {\n  content: \"\";\n}\n.codicon-github-inverted:before {\n  content: \"\";\n}\n.codicon-server-process:before {\n  content: \"\";\n}\n.codicon-server-environment:before {\n  content: \"\";\n}\n.codicon-pass:before {\n  content: \"\";\n}\n.codicon-issue-closed:before {\n  content: \"\";\n}\n.codicon-stop-circle:before {\n  content: \"\";\n}\n.codicon-play-circle:before {\n  content: \"\";\n}\n.codicon-record:before {\n  content: \"\";\n}\n.codicon-debug-alt-small:before {\n  content: \"\";\n}\n.codicon-vm-connect:before {\n  content: \"\";\n}\n.codicon-cloud:before {\n  content: \"\";\n}\n.codicon-merge:before {\n  content: \"\";\n}\n.codicon-export:before {\n  content: \"\";\n}\n.codicon-graph-left:before {\n  content: \"\";\n}\n.codicon-magnet:before {\n  content: \"\";\n}\n.codicon-notebook:before {\n  content: \"\";\n}\n.codicon-redo:before {\n  content: \"\";\n}\n.codicon-check-all:before {\n  content: \"\";\n}\n.codicon-pinned-dirty:before {\n  content: \"\";\n}\n.codicon-pass-filled:before {\n  content: \"\";\n}\n.codicon-circle-large-filled:before {\n  content: \"\";\n}\n.codicon-circle-large:before {\n  content: \"\";\n}\n.codicon-circle-large-outline:before {\n  content: \"\";\n}\n.codicon-combine:before {\n  content: \"\";\n}\n.codicon-gather:before {\n  content: \"\";\n}\n.codicon-table:before {\n  content: \"\";\n}\n.codicon-variable-group:before {\n  content: \"\";\n}\n.codicon-type-hierarchy:before {\n  content: \"\";\n}\n.codicon-type-hierarchy-sub:before {\n  content: \"\";\n}\n.codicon-type-hierarchy-super:before {\n  content: \"\";\n}\n.codicon-git-pull-request-create:before {\n  content: \"\";\n}\n.codicon-run-above:before {\n  content: \"\";\n}\n.codicon-run-below:before {\n  content: \"\";\n}\n.codicon-notebook-template:before {\n  content: \"\";\n}\n.codicon-debug-rerun:before {\n  content: \"\";\n}\n.codicon-workspace-trusted:before {\n  content: \"\";\n}\n.codicon-workspace-untrusted:before {\n  content: \"\";\n}\n.codicon-workspace-unknown:before {\n  content: \"\";\n}\n.codicon-terminal-cmd:before {\n  content: \"\";\n}\n.codicon-terminal-debian:before {\n  content: \"\";\n}\n.codicon-terminal-linux:before {\n  content: \"\";\n}\n.codicon-terminal-powershell:before {\n  content: \"\";\n}\n.codicon-terminal-tmux:before {\n  content: \"\";\n}\n.codicon-terminal-ubuntu:before {\n  content: \"\";\n}\n.codicon-terminal-bash:before {\n  content: \"\";\n}\n.codicon-arrow-swap:before {\n  content: \"\";\n}\n.codicon-copy:before {\n  content: \"\";\n}\n.codicon-person-add:before {\n  content: \"\";\n}\n.codicon-filter-filled:before {\n  content: \"\";\n}\n.codicon-wand:before {\n  content: \"\";\n}\n.codicon-debug-line-by-line:before {\n  content: \"\";\n}\n.codicon-inspect:before {\n  content: \"\";\n}\n.codicon-layers:before {\n  content: \"\";\n}\n.codicon-layers-dot:before {\n  content: \"\";\n}\n.codicon-layers-active:before {\n  content: \"\";\n}\n.codicon-compass:before {\n  content: \"\";\n}\n.codicon-compass-dot:before {\n  content: \"\";\n}\n.codicon-compass-active:before {\n  content: \"\";\n}\n.codicon-azure:before {\n  content: \"\";\n}\n.codicon-issue-draft:before {\n  content: \"\";\n}\n.codicon-git-pull-request-closed:before {\n  content: \"\";\n}\n.codicon-git-pull-request-draft:before {\n  content: \"\";\n}\n.codicon-debug-all:before {\n  content: \"\";\n}\n.codicon-debug-coverage:before {\n  content: \"\";\n}\n.codicon-run-errors:before {\n  content: \"\";\n}\n.codicon-folder-library:before {\n  content: \"\";\n}\n.codicon-debug-continue-small:before {\n  content: \"\";\n}\n.codicon-beaker-stop:before {\n  content: \"\";\n}\n.codicon-graph-line:before {\n  content: \"\";\n}\n.codicon-graph-scatter:before {\n  content: \"\";\n}\n.codicon-pie-chart:before {\n  content: \"\";\n}\n.codicon-bracket:before {\n  content: \"\";\n}\n.codicon-bracket-dot:before {\n  content: \"\";\n}\n.codicon-bracket-error:before {\n  content: \"\";\n}\n.codicon-lock-small:before {\n  content: \"\";\n}\n.codicon-azure-devops:before {\n  content: \"\";\n}\n.codicon-verified-filled:before {\n  content: \"\";\n}\n.codicon-newline:before {\n  content: \"\";\n}\n.codicon-layout:before {\n  content: \"\";\n}\n.codicon-layout-activitybar-left:before {\n  content: \"\";\n}\n.codicon-layout-activitybar-right:before {\n  content: \"\";\n}\n.codicon-layout-panel-left:before {\n  content: \"\";\n}\n.codicon-layout-panel-center:before {\n  content: \"\";\n}\n.codicon-layout-panel-justify:before {\n  content: \"\";\n}\n.codicon-layout-panel-right:before {\n  content: \"\";\n}\n.codicon-layout-panel:before {\n  content: \"\";\n}\n.codicon-layout-sidebar-left:before {\n  content: \"\";\n}\n.codicon-layout-sidebar-right:before {\n  content: \"\";\n}\n.codicon-layout-statusbar:before {\n  content: \"\";\n}\n.codicon-layout-menubar:before {\n  content: \"\";\n}\n.codicon-layout-centered:before {\n  content: \"\";\n}\n.codicon-target:before {\n  content: \"\";\n}\n.codicon-indent:before {\n  content: \"\";\n}\n.codicon-record-small:before {\n  content: \"\";\n}\n.codicon-error-small:before {\n  content: \"\";\n}\n.codicon-terminal-decoration-error:before {\n  content: \"\";\n}\n.codicon-arrow-circle-down:before {\n  content: \"\";\n}\n.codicon-arrow-circle-left:before {\n  content: \"\";\n}\n.codicon-arrow-circle-right:before {\n  content: \"\";\n}\n.codicon-arrow-circle-up:before {\n  content: \"\";\n}\n.codicon-layout-sidebar-right-off:before {\n  content: \"\";\n}\n.codicon-layout-panel-off:before {\n  content: \"\";\n}\n.codicon-layout-sidebar-left-off:before {\n  content: \"\";\n}\n.codicon-blank:before {\n  content: \"\";\n}\n.codicon-heart-filled:before {\n  content: \"\";\n}\n.codicon-map:before {\n  content: \"\";\n}\n.codicon-map-filled:before {\n  content: \"\";\n}\n.codicon-circle-small:before {\n  content: \"\";\n}\n.codicon-bell-slash:before {\n  content: \"\";\n}\n.codicon-bell-slash-dot:before {\n  content: \"\";\n}\n.codicon-comment-unresolved:before {\n  content: \"\";\n}\n.codicon-git-pull-request-go-to-changes:before {\n  content: \"\";\n}\n.codicon-git-pull-request-new-changes:before {\n  content: \"\";\n}\n.codicon-search-fuzzy:before {\n  content: \"\";\n}\n.codicon-comment-draft:before {\n  content: \"\";\n}\n.codicon-send:before {\n  content: \"\";\n}\n.codicon-sparkle:before {\n  content: \"\";\n}\n.codicon-insert:before {\n  content: \"\";\n}\n.codicon-mic:before {\n  content: \"\";\n}\n.codicon-thumbsdown-filled:before {\n  content: \"\";\n}\n.codicon-thumbsup-filled:before {\n  content: \"\";\n}\n.codicon-coffee:before {\n  content: \"\";\n}\n.codicon-snake:before {\n  content: \"\";\n}\n.codicon-game:before {\n  content: \"\";\n}\n.codicon-vr:before {\n  content: \"\";\n}\n.codicon-chip:before {\n  content: \"\";\n}\n.codicon-piano:before {\n  content: \"\";\n}\n.codicon-music:before {\n  content: \"\";\n}\n.codicon-mic-filled:before {\n  content: \"\";\n}\n.codicon-git-fetch:before {\n  content: \"\";\n}\n.codicon-copilot:before {\n  content: \"\";\n}\n.altimate-component {\n  --spacing-3xl: 1.846rem;\n  --spacing-2xl: 1.538rem;\n  --spacing-xl: 1.231rem;\n  --spacing-lg: 0.857rem;\n  --primary-color: #247efe;\n  --text-color--title: #171717;\n  --text-color--paragraph: #4a4d51;\n  --text-color--caption: #808080;\n  --text-color--white: #ffffff;\n  --text-color--brand: #247efe;\n  --background--base: #ffffff;\n  --background--01: #f6f5f8;\n  --background--02: #f5f6f7;\n  --background--03: #eaf3ff;\n  --background--04: #d3e5ff;\n  --background: #171717;\n  --background--blue: #247efe;\n  --action--active: #247efe;\n  --action--secondary: #eaf3ff;\n  --action--disable: #8390a3;\n  --action--brand: #004fbf;\n  --action-yellow: #ffce73;\n  --action-red: #ee140f;\n  --action-beta: #ff754c;\n  --action-brand-dark: #004fbf;\n  --icon--active: #535456;\n  --icon--default: #8390a3;\n  --icon--deactive: #c4cad2;\n  --icon--blue: #247efe;\n  --stroke--active: #424750;\n  --stroke--default: #8390a3;\n  --stroke--disable: #c4cad2;\n  --stroke--orange: #e38e00;\n  --stroke--blue: #247efe;\n  --gray--gray-01: #484e55;\n  --gray--gray-02: #3a3d41;\n  --gray--blue--gray-01: #082247;\n  --gray--blue--gray-02: #374c6a;\n  --background-orange: #32240c;\n}\n.altimate-component.vscode-dark {\n  --primary-color: #247efe;\n  --text-color--title: #e8e8e8;\n  --text-color--paragraph: #c4cad2;\n  --text-color--caption: #808080;\n  --text-color--white: #ffffff;\n  --text-color--brand: #247efe;\n  --background--base: #1e1e1e;\n  --background--01: #171717;\n  --background--02: #28292c;\n  --background--03: #3c3c3c;\n  --background--04: #4a4d51;\n  --background: #ffffff;\n  --background--blue: #247efe;\n  --action--active: #247efe;\n  --action--brand: #004fbf;\n  --action--secondary: #8390a3;\n  --action--disable: #424750;\n  --action-red: #ee140f;\n  --action-yellow: #ffce73;\n  --action-brand-dark: #004fbf;\n  --stroke--active: #e8e8e8;\n  --stroke--default: #8390a3;\n  --stroke--disable: #424750;\n  --stroke--orange: #e38e00;\n  --stroke--blue: #247efe;\n  --icon--active: #e8e8e8;\n  --icon--default: #8390a3;\n  --icon--deactive: #424750;\n  --icon--blue: #247efe;\n  --gray--gray-01: #484e55;\n  --gray--gray-02: #3a3d41;\n  --gray--blue--gray-01: #082247;\n  --gray--blue--gray-02: #374c6a;\n  --background-orange: #32240c;\n}\n.altimate-component .card {\n  padding: 16px;\n  border-radius: 8px;\n  background: var(--background--02);\n  border-color: var(--stroke--disable);\n}\n.altimate-component .card .card-title {\n  font-size: 12px;\n  color: var(--text-color--title);\n  margin-bottom: 0.75rem;\n}\n.altimate-component .card .card-body {\n  padding: 0;\n  color: var(--text-color--paragraph, #c4cad2);\n}\n.altimate-component .card .card-body .card-text {\n  font-size: 12px;\n  font-style: normal;\n  font-weight: 300;\n  line-height: 18px;\n  color: var(--text-color--paragraph, #c4cad2);\n}\n.altimate-component .card .card-footer {\n  background-color: transparent;\n  padding: 0;\n}\n.altimate-component .btn {\n  border-radius: 2px;\n  font-size: 12px;\n  font-weight: 400;\n  border: none;\n}\n.altimate-component .btn svg {\n  vertical-align: sub;\n}\n.altimate-component .btn-outline-secondary,\n.altimate-component .btn-outline-primary {\n  border: var(--bs-btn-border-width) solid var(--bs-btn-border-color);\n}\n.altimate-component .btn.btn-primary {\n  background: var(--primary-color);\n}\n.altimate-component .btn.btn-danger {\n  background: var(--action-red);\n}\n.altimate-component .btn.btn-warning {\n  background: var(--stroke--orange);\n  color: #fff;\n}\n.altimate-component .form-label,\n.altimate-component .col-form-label {\n  font-size: 12px;\n  font-weight: 500;\n  color: var(--text-color--title);\n}\n.altimate-component .form-control {\n  border-radius: 2px;\n  border: 1px solid var(--stroke--disable);\n  background-color: var(--background--02);\n  color: var(--text-color--title);\n}\n.altimate-component .form-control:focus {\n  border: 1px solid var(--primary-color);\n  background-color: var(--background--02);\n  color: var(--text-color--title);\n  box-shadow: none;\n}\n.altimate-component .form-control::placeholder {\n  color: var(--text-color--caption);\n}\n.altimate-component input.form-control {\n  padding: 2px 10px 2px 8px;\n}\n.altimate-component .dropdown-toggle {\n  background-color: var(--background--01);\n}\n.altimate-component .dropdown-menu {\n  --bs-border-radius: 0 0 4px 4px;\n  background: var(--background--02);\n  border-color: var(--stroke--disable);\n}\n.altimate-component .dropdown-menu .dropdown-item,\n.altimate-component .dropdown-menu .dropdown-item-text {\n  color: var(--text-color--title);\n  font-size: 14px;\n}\n.altimate-component .h1,\n.altimate-component h1 {\n  font-size: 2rem;\n}\n.altimate-component .h2,\n.altimate-component h2 {\n  font-size: 1.714rem;\n}\n.altimate-component .h3,\n.altimate-component h3 {\n  font-size: 1.429rem;\n}\n.altimate-component .h4,\n.altimate-component h4 {\n  font-size: 1.286rem;\n}\n.altimate-component .h5,\n.altimate-component h5 {\n  font-size: 1.143rem;\n}\n.altimate-component .h6,\n.altimate-component h6 {\n  font-size: 1rem;\n}\n.altimate-component .p1 {\n  font-size: 1.429rem;\n}\n.altimate-component .p2 {\n  font-size: 1.286rem;\n}\n.altimate-component caption,\n.altimate-component .p3 {\n  font-size: 1.143rem;\n}\n.altimate-component .p4 {\n  font-size: 0.857rem;\n}\n.altimate-component .p5 {\n  font-size: 0.714rem;\n}\n.altimate-component .p6 {\n  font-size: 0.571rem;\n}\n.altimate-component caption {\n  padding: 0;\n  color: inherit;\n}\n.altimate-component .alert {\n  border-radius: 4px;\n}\n.altimate-component .alert.alert-warning {\n  background: transparent;\n  border: 1px solid var(--stroke--orange, #e38e00);\n  color: var(--stroke--orange, #e38e00);\n}\n.altimate-component .offcanvas {\n  background-color: var(--background--base);\n  color: var(--text-color--title);\n}\n.altimate-component.vscode-dark .alert-warning {\n  background: #ffce731a;\n  border: none;\n  color: var(--Action-Yellow, #ffce73);\n}\n._iconButton_eti7u_1 {\n  padding: 6px 7px;\n  color: var(--text-color--title);\n}\n._iconButton_eti7u_1.outline {\n  border-radius: 5px;\n  border: 1px solid var(--stroke--disable, #424750);\n}\n._loadingBtn_gadec_1 .spinner-border {\n  width: 1rem;\n  height: 1rem;\n  margin-top: 0.15rem;\n  border-width: 2px;\n}\n._codeblock_19tsp_1 ._dark_19tsp_1,\n._codeblock_19tsp_1 ._dark_19tsp_1 .card-body {\n  padding: 0;\n}\n._codeblock_19tsp_1 ._dark_19tsp_1 pre {\n  background: transparent !important;\n}\n._codeblock_19tsp_1 ._dark_19tsp_1 pre.language-markdown {\n  border: none;\n}\n._codeblock_19tsp_1 ._dark_19tsp_1 pre code {\n  background: transparent !important;\n  white-space: pre-wrap !important;\n  font-size: 13px !important;\n  line-height: 1.5 !important;\n}\n._codeblock_19tsp_1 ._dark_19tsp_1 pre code .number {\n  margin-right: 0.75rem;\n}\n._codeblock_19tsp_1 ._dark_19tsp_1 pre code.language-markdown {\n  white-space: normal !important;\n}\n._codeblock_19tsp_1 {\n  padding: 0;\n  --code-bg: #082247;\n}\n._codeblock_19tsp_1 .card-body {\n  padding: 0;\n}\n._codeblock_19tsp_1 pre {\n  background: var(--code-bg) !important;\n  margin: 0 !important;\n  border-radius: 0.5rem;\n}\n._codeblock_19tsp_1 pre.language-markdown {\n  border: none;\n}\n._codeblock_19tsp_1 pre code {\n  background: var(--code-bg) !important;\n  white-space: pre-wrap !important;\n  font-size: 13px !important;\n  line-height: 1.5 !important;\n}\n._codeblock_19tsp_1 pre code .number {\n  margin-right: 0.75rem;\n}\n._codeblock_19tsp_1 pre code.language-markdown {\n  white-space: normal !important;\n}\n._stack_73h55_1 {\n  display: flex;\n  flex-direction: row;\n  gap: 10px;\n}\n._stack_73h55_1.stack-column {\n  flex-direction: column;\n}\n@keyframes _pulse_14zop_1 {\n  0% {\n    box-shadow: 0 0 0 0 var(--primary-color);\n  }\n  to {\n    box-shadow: 0 0 0 15px #0000;\n  }\n}\n._dbtDocs_14zop_9 .app.app-row {\n  height: calc(100vh - 114px);\n  position: static;\n}\n._dbtDocs_14zop_9 .altimate-display--highlight {\n  background-color: #0bb;\n  color: #fff;\n}\n._dbtDocs_14zop_9 .btn-icon.btn-lg,\n._dbtDocs_14zop_9 .btn-group-lg > .btn-icon.btn {\n  height: initial;\n}\n._dbtDocs_14zop_9 .model-markdown p {\n  z-index: 1;\n  display: inline-block;\n}\n._dbtDocs_14zop_9 .model-markdown .altimate-highlighter {\n  z-index: 0;\n}\n._dbtDocs_14zop_9 .model-markdown .altimate-highlighter i {\n  left: -20px;\n}\n._dbtDocs_14zop_9 .model-markdown + #altimate-display--highlight {\n  margin-top: 15px;\n  margin-left: 5px;\n}\n._dbtDocs_14zop_9 .model-markdown span[id^=\"tooltip-\"] {\n  position: absolute;\n  top: -4px;\n  left: -21px;\n  z-index: 1;\n}\n._dbtDocs_14zop_9 .column-row .altimate-highlighter i {\n  left: -8px;\n  top: 8px;\n}\n._hotspotButton_14zop_46.btn {\n  height: 16px;\n  width: 16px;\n  color: var(--primary-color);\n  padding: 1px;\n  border: none;\n  border-radius: 50%;\n  box-sizing: content-box;\n  background-color: #fff;\n}\n._hotspotButton_14zop_46.btn {\n  animation-name: _pulse_14zop_1;\n  animation-duration: 1.5s;\n  animation-iteration-count: infinite;\n}\n._conversationRightPanelCloseButton_14zop_62 {\n  position: fixed;\n  background-color: #247efe;\n  opacity: 1;\n  top: 0;\n  right: 480px;\n  z-index: 5;\n  padding: 1rem;\n  border-radius: 0;\n}\n._conversationRightPanel_14zop_62 {\n  position: fixed;\n  right: 0;\n  top: 0;\n  padding: 1rem;\n  border-left: 1px solid #ccc;\n  width: 480px;\n  background: #fff;\n  height: 100vh;\n  z-index: 31;\n  overflow-y: auto;\n}\n._conversationRightPanel_14zop_62 h3 {\n  border-bottom: 1px solid var(--background--01);\n  padding-bottom: 8px;\n  margin-bottom: 1rem;\n}\n._conversationRightPanel_14zop_62 .card {\n  padding: 0.75rem;\n  box-shadow:\n    2px 2px 6px 2px #001e3c1a,\n    0 3px 3px -1.5px #00000008;\n}\n._conversationRightPanel_14zop_62 ._newConversationForm_14zop_94 {\n  box-shadow: none;\n  margin: 0;\n  padding: 0;\n}\n._conversationRightPanel_14zop_62 ._newConversationForm_14zop_94 .card-body {\n  min-height: 60px;\n  padding: 10px 5px;\n}\n._conversationRightPanel_14zop_62\n  ._newConversationForm_14zop_94\n  .card-body\n  form {\n  position: relative;\n  width: 100%;\n}\n._highlightText_14zop_108 {\n  border-left: 3px solid var(--action-yellow);\n  padding-left: 1rem;\n  margin: 1rem 0;\n}\n._highlightText_14zop_108 pre {\n  max-height: 130px;\n}\n._highlightText_14zop_108 .card {\n  padding: 0;\n  background: transparent;\n  box-shadow: none;\n}\n._highlightText_14zop_108 .card .card-body {\n  padding: 0;\n}\n._highlightText_14zop_108 .card .card-body pre {\n  padding: 0 0 0 0.5em !important;\n  color: inherit !important;\n  margin: 0;\n}\n._conversationInputForm_14zop_130 {\n  background: #fff;\n  display: flex;\n  align-items: center;\n  gap: 4px;\n  z-index: 1;\n  border: 1px solid var(--stroke--disable);\n  border-radius: 8px;\n  padding-left: 0.5rem;\n}\n._conversationInputForm_14zop_130 .mentions-input {\n  width: 100%;\n  margin: 0 !important;\n  padding-top: 4px;\n}\n._conversationInputForm_14zop_130 .btn {\n  background: none;\n  color: var(--primary-color);\n  padding: 0;\n  margin-right: 1rem;\n}\n._conversationInputForm_14zop_130 .btn:hover {\n  background: none;\n  color: var(--primary-color);\n}\n._conversationGroup_14zop_156 {\n  cursor: pointer;\n  border: 1px solid transparent !important;\n}\n._conversationGroup_14zop_156 .card.active {\n  box-shadow:\n    2px 2px 6px 2px #001e3c1a,\n    0 3px 3px -1.5px #00000008;\n  background-color: var(--background--02);\n  border: 1px solid #e7e8ea;\n}\n._conversationGroup_14zop_156 h4 {\n  margin: 0 0 0 4px;\n}\n._conversationGroup_14zop_156 .card {\n  margin-bottom: 1rem;\n  padding: 1rem;\n}\n._conversationGroup_14zop_156 .card-title span {\n  color: var(--text-color--caption);\n}\n._conversationGroup_14zop_156 .card-body {\n  padding: 10px 10px 0 0;\n}\n._conversationGroup_14zop_156 .card-body p {\n  color: var(--text-color--caption);\n  margin: 0;\n}\n._conversationGroup_14zop_156 .card-body .btn-link {\n  text-decoration: none;\n  font-weight: 500;\n}\n._conversationGroup_14zop_156 ._replyForm_14zop_189 textarea.form-control {\n  height: auto;\n}\n._conversationGroup_14zop_156 ._replyForm_14zop_189 button {\n  float: right;\n}\n.altimate-highlighter {\n  position: absolute;\n  z-index: 0;\n  width: 100%;\n  background-color: #247efe1a !important;\n  left: 0;\n  cursor: pointer;\n}\n.altimate-highlighter:hover {\n  background-color: #247efe33 !important;\n}\n.altimate-highlighter.active {\n  background-color: #247efe66 !important;\n}\n.altimate-highlighter i {\n  position: relative;\n  left: 0;\n}\n.code.line-numbers.language-sql:hover span[id^=\"tooltip-\"] .btn {\n  animation: none;\n}\n.code.line-numbers.language-sql + #altimate-display--highlight {\n  margin-left: 10px;\n  margin-top: 1px;\n}\ncode.highlight.source-code {\n  z-index: 1;\n  background: transparent;\n}\ncode.highlight.source-code > div {\n  height: calc(1em + 0.153 * (5rem - 1em));\n}\ncode.highlight.source-code + span[id^=\"tooltip-\"] {\n  position: absolute;\n  top: 14px;\n  left: 13px;\n  z-index: 1;\n}\n._resolveButton_14zop_237 {\n  color: green !important;\n  box-shadow: none !important;\n}\n._resolveButton_14zop_237 i.codicon {\n  font-size: 1.5rem;\n}\n._profileImage_11vaf_1 {\n  border-radius: 50%;\n  padding: 0.5rem;\n  background: var(--primary-color);\n  width: 30px;\n  text-align: center;\n  box-sizing: border-box;\n  height: 30px;\n  line-height: normal;\n  color: #fff;\n}\n._table_node_1h0by_1 {\n  width: 300px;\n  display: flex;\n  flex-direction: column;\n  cursor: default;\n  color: var(--text-color);\n}\n._table_node_1h0by_1 ._header_1h0by_8 {\n  background: var(--table-node-expand-bg);\n  border-top: 2px solid var(--table-node-border-color);\n  border-left: 2px solid var(--table-node-border-color);\n  border-right: 2px solid var(--table-node-border-color);\n  border-radius: 0.25em 0.25em 0 0;\n  padding: 0.25em;\n}\n._table_node_1h0by_1 ._header_1h0by_8._collapse_1h0by_16 {\n  background: var(--table-node-collapse-bg);\n  border-bottom: 2px solid var(--table-node-border-color);\n  border-radius: 0.25em;\n}\n._table_node_1h0by_1 ._header_1h0by_8._selected_1h0by_21 {\n  border-color: #e38e00;\n}\n._table_node_1h0by_1 ._content_1h0by_24 {\n  flex-grow: 1;\n  background: var(--table-node-content-bg);\n  border-bottom: 2px solid var(--table-node-border-color);\n  border-left: 2px solid var(--table-node-border-color);\n  border-right: 2px solid var(--table-node-border-color);\n  border-radius: 0 0 0.25em 0.25em;\n  padding: 0.25em;\n}\n._table_node_1h0by_1 ._content_1h0by_24._selected_1h0by_21 {\n  border-color: #e38e00;\n}\n._table_header_1h0by_37 {\n  display: grid;\n  grid-template-columns: 3.2em 1fr 1em;\n  gap: 0em 0.5em;\n  width: 100%;\n  height: 3.2em;\n  align-items: center;\n  border-radius: 0.25em;\n  border: 1px solid var(--table-node-border-color);\n  overflow-x: hidden;\n}\n._table_header_1h0by_37 ._seed_1h0by_48 {\n  border: 1px solid rgba(1, 205, 140, 0.3);\n  color: #01cd8c;\n  background-color: #01cd8c1a;\n}\n._table_header_1h0by_37 ._model_1h0by_53 {\n  border: 1px solid rgba(var(--node-model-color), 0.3);\n  color: rgba(var(--node-model-color), 1);\n  background-color: rgba(var(--node-model-color), 0.1);\n}\n._table_header_1h0by_37 ._source_1h0by_58 {\n  border: 1px solid rgba(188, 226, 228, 0.3);\n  color: #bce2e4;\n  background-color: #bce2e41a;\n}\n._table_header_1h0by_37 ._exposure_1h0by_63 {\n  border: 1px solid rgba(241, 180, 151, 0.3);\n  color: #f1b497;\n  background-color: #f1b4971a;\n}\n._table_header_1h0by_37 ._snapshot_1h0by_68 {\n  border: 1px solid rgba(245, 197, 240, 0.3);\n  color: #f5c5f0;\n  background-color: #f5c5f01a;\n}\n._table_header_1h0by_37 ._metrics_1h0by_73 {\n  border: 1px solid rgba(199, 243, 192, 0.3);\n  color: #c7f3c0;\n  background-color: #c7f3c01a;\n}\n._table_header_1h0by_37 ._macros_1h0by_78 {\n  border: 1px solid rgba(221, 157, 165, 0.3);\n  color: #dd9da5;\n  background-color: #dd9da51a;\n}\n._table_header_1h0by_37 ._analysis_1h0by_83 {\n  border: 1px solid rgba(255, 132, 136, 0.3);\n  color: #ff8488;\n  background-color: #ff84881a;\n}\n._table_header_1h0by_37 ._node_icon_1h0by_88 {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  padding: 0.15em 0.5em;\n  border-radius: 0.25em;\n  font-size: 0.75em;\n}\n._table_header_1h0by_37 ._node_icon_1h0by_88 svg {\n  width: 2em;\n  height: 2em;\n}\n._table_header_1h0by_37 ._dialect_icon_1h0by_100 {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  width: 2em;\n  height: 2em;\n  justify-self: center;\n}\n._table_handle_1h0by_109 {\n  width: 1.2em;\n  height: 1.2em;\n  line-height: 1.2em;\n  border-radius: 50%;\n  background-color: var(--primary-accent);\n  border: 1px solid #d6e7ff;\n  color: #fff;\n  display: flex;\n  justify-content: center;\n  align-items: end;\n  cursor: default;\n}\n._see_more_node_1h0by_123 {\n  width: 300px;\n  display: flex;\n  background: var(--table-node-collapse-bg);\n  border: 1px solid var(--table-node-border-color);\n  border-radius: 0.5em;\n  padding: 0.5em;\n  cursor: default;\n  color: var(--text-color);\n}\n._table_card_1h0by_134 {\n  width: 100%;\n  overflow-x: hidden;\n  border-radius: 0.25em;\n  padding: 0.25em;\n  border: 1px solid var(--card-border-color);\n  cursor: pointer;\n  background-color: var(--card-bg);\n}\n._table_card_1h0by_134._selected_1h0by_21 {\n  border-color: #e38e00;\n}\n._table_card_1h0by_134._disabled_1h0by_146 {\n  background-color: #e5e6e7;\n  cursor: default;\n}\n._column_card_1h0by_151 {\n  display: flex;\n  flex-direction: column;\n  gap: 0.5em;\n  border-radius: 0.6em;\n  padding: 0.8em;\n  border: 1px solid var(--card-border-color);\n  background-color: var(--card-bg);\n}\n._column_card_1h0by_151._selected_1h0by_21 {\n  border-color: #e38e00;\n}\n._edit_icon_1h0by_164 {\n  width: 1.2rem;\n  height: 1.2rem;\n  color: #8390a3;\n}\n._edit_icon_1h0by_164:hover,\n._edit_icon_1h0by_164._active_1h0by_172 {\n  color: var(--primary-accent);\n}\n._expand_lineage_icon_1h0by_176 {\n  background-color: var(--primary-accent);\n  padding: 0.25rem;\n  border-radius: 0.25rem;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n}\n._expand_lineage_icon_1h0by_176 svg {\n  width: 1rem;\n  height: 1rem;\n}\n._processing_div_1h0by_189 {\n  background-color: #fff;\n}\n._processing_div_1h0by_189 ._gif_img_1h0by_192 {\n  max-width: 100%;\n  max-height: 90%;\n}\n._card_1h0by_197 {\n  box-shadow: 0 1px 2px #38414a26;\n  background-color: #fff;\n  border-radius: 0.5rem;\n  padding: 0.5rem;\n}\n._card_1h0by_197 .card {\n  background-color: var(--background--01);\n}\n._card_1h0by_197 .card pre {\n  border: none !important;\n  margin: 0 !important;\n  padding: 6px !important;\n}\n._column_node_1h0by_212 {\n  border: 1px solid var(--primary-accent);\n  width: 276px;\n  border-radius: 0.25em;\n  padding: 4px 8px;\n  color: var(--column-node-color);\n  position: relative;\n}\n._column_node_1h0by_212._default_1h0by_220 {\n  background: var(--column-node-bg);\n}\n._column_node_1h0by_212 ._column_name_1h0by_223 {\n  text-overflow: ellipsis;\n  overflow: hidden;\n  white-space: nowrap;\n}\n._column_node_1h0by_212 ._column_top_right_1h0by_228 {\n  position: absolute;\n  top: -6px;\n  right: 4px;\n  display: flex;\n  gap: 0.25rem;\n}\n._divider_1h0by_236 {\n  height: 2px;\n  width: 100%;\n  background-color: var(--card-border-color);\n}\n._table_details_header_1h0by_242 {\n  width: 100%;\n  display: grid;\n  grid-template-columns: 1.5rem 1fr;\n  gap: 0em 0.5em;\n  align-items: center;\n}\n._verticle_divider_1h0by_250 {\n  width: 2px;\n  background-color: #c4cad2;\n}\n._low_confidence_1h0by_255 {\n  padding: 0.125em 0.75em;\n  border-radius: 0.375rem;\n  background: #ff754c;\n  color: #fff;\n}\n._high_confidence_1h0by_262 {\n  padding: 0.125em 0.75em;\n  border-radius: 0.375rem;\n  background: #327e36;\n  color: #fff;\n}\n._alert_icon_1h0by_269 {\n  width: 1rem;\n  height: 1rem;\n  display: flex;\n}\n._menu_card_1h0by_275 {\n  padding: 0.275em !important;\n  font-size: 0.875em;\n}\n._menu_card_container_1h0by_280 {\n  background-color: var(--background--02);\n  border-color: var(--stroke--disable);\n  padding: 1px;\n  border-radius: 6px;\n}\n._table_details_tabs_1h0by_287 {\n  width: 100%;\n  padding: 0.25em;\n  border-radius: 0.5em;\n  display: flex;\n  background-color: var(--column-section-bg);\n}\n._table_details_tabs_1h0by_287 ._tab_1h0by_1 {\n  width: 100%;\n  padding: 0.5em;\n  border-radius: 0.5em;\n  color: var(--text-color);\n  text-align: center;\n  cursor: pointer;\n}\n._table_details_tabs_1h0by_287 ._tab_1h0by_1._selected_1h0by_21 {\n  background-color: var(--primary-accent);\n  color: #fff;\n}\n._table_node_pill_1h0by_307 {\n  display: flex;\n  align-items: center;\n  border-radius: 0.5em;\n  gap: 0.25em;\n  padding: 0.125em 0.325em;\n  font-size: 0.8em;\n  background-color: var(--tag-bg);\n  color: var(--text-color);\n}\n._table_node_pill_1h0by_307 ._icon_1h0by_317 {\n  width: 1rem;\n  height: 1rem;\n  display: flex;\n  align-items: center;\n}\n._node-checkbox_1h0by_324,\n._non_select_node_checkbox_1h0by_324,\n._select_node_checkbox_1h0by_324 {\n  display: flex;\n  align-items: start;\n  gap: 0.5em;\n  padding: 0.125em 0.5em;\n  border-radius: 0.5em;\n}\n._select_node_checkbox_1h0by_324 {\n  border: 2px solid var(--card-border-color);\n}\n._non_select_node_checkbox_1h0by_324 {\n  border: 2px dashed var(--card-border-color);\n}\n._node_extra_info_1h0by_340 {\n  height: 1.6em;\n}\n._help_body_1h0by_344,\n._feedback_body_1h0by_348 {\n  color: var(--text-grey2-color);\n}\n._feedback_body_1h0by_348 ._cancel_btn_1h0by_351 {\n  color: var(--text-grey-color);\n  text-decoration: none;\n}\n._expand_nav_1h0by_356 {\n  border-radius: 4px;\n  border: var(--table-node-border-color) solid 1px;\n  display: flex;\n  align-items: center;\n  background-color: var(--background--01);\n  color: var(--text-color);\n}\n._expand_nav_1h0by_356 ._expand_nav_btn_1h0by_364 {\n  background-color: var(--popover-bg);\n  border-radius: 4px;\n  margin: 0.125em;\n  display: flex;\n  align-items: center;\n}\n._expand_nav_1h0by_356 ._expand_nav_btn_1h0by_364 ._divider_1h0by_236 {\n  height: 1.75em;\n  width: 1px;\n  background-color: var(--divider-color);\n}\n._expand_nav_1h0by_356 ._expand_nav_btn_1h0by_364 ._icon_1h0by_317 {\n  padding: 0.125em;\n  cursor: pointer;\n}\n._expand_nav_1h0by_356 ._expand_nav_btn_1h0by_364 ._icon_1h0by_317 svg {\n  width: 1.5em;\n  height: 1.5em;\n}\n._expand_nav_1h0by_356._disabled_1h0by_146 {\n  opacity: 0.5;\n}\n._expand_nav_1h0by_356._disabled_1h0by_146 ._icon_1h0by_317 {\n  cursor: default;\n}\n._column_legend_1h0by_408 .popover {\n  border-radius: 2px;\n  --bs-popover-bg: --popover-bg;\n  background-color: var(--popover-bg);\n  color: var(--text-color) !important;\n  text-transform: capitalize;\n  border: 1px solid #d5dbe4;\n}\n._column_legend_1h0by_408 .popover .popover-body {\n  color: var(--text-color) !important;\n  padding: 0.5rem 1rem;\n}\n._column_legend_1h0by_408 .popover .popover-body > div {\n  margin-bottom: 1rem;\n  font-size: 10px;\n}\n._column_legend_1h0by_408 ._dot_1h0by_424 {\n  width: 0.75rem;\n  height: 0.75rem;\n  border-radius: 50%;\n  display: inline-block;\n  vertical-align: text-bottom;\n  margin-right: 0.4rem;\n  color: #fff;\n  text-align: center;\n  font-size: 8px;\n}\n._model_views_type_1h0by_436 {\n  padding: 0.5rem;\n  background-color: var(--column-section-bg);\n  border-radius: 6px;\n  display: flex;\n  align-items: center;\n  gap: 0.5rem;\n}\n._close_button_1h0by_445 {\n  background-color: var(--primary-accent);\n  padding: 0.5rem;\n  position: absolute;\n  top: 0;\n  right: 0;\n  cursor: pointer;\n}\n._close_button_1h0by_445 svg {\n  width: 1rem;\n  height: 1rem;\n}\n._op_node_1h0by_458 {\n  display: flex;\n  align-items: center;\n  gap: 0.25rem;\n  border-radius: 2rem;\n  background: var(--table-node-content-bg);\n  border: 2px solid var(--table-node-border-color);\n  padding: 0.25rem;\n}\n._op_node_1h0by_458 ._node_icon_1h0by_88 {\n  width: 2.5rem;\n  height: 2.5rem;\n  padding: 0.1rem;\n  border-radius: 50%;\n  border: 2px solid var(--table-node-border-color);\n  display: flex;\n  justify-content: center;\n  align-items: center;\n}\n._op_node_1h0by_458 ._node_icon_1h0by_88._light_mode_1h0by_477 {\n  background-color: #eaf3ff;\n}\n._op_node_1h0by_458 ._node_icon_1h0by_88._dark_mode_1h0by_480 {\n  background-color: #d3e5ff;\n}\n._op_node_1h0by_458._highlighted_1h0by_483 {\n  background-color: #fbe16b;\n}\n._op_node_1h0by_458._selected_1h0by_21 {\n  border-color: #e38e00;\n}\n._op_node_1h0by_458 ._cost_data_1h0by_489 {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  height: 2.5rem;\n  padding: 0rem 0.25rem;\n  border: solid 1px #ff754c;\n  background-color: #ffefeb;\n  color: #374c6a;\n  border-radius: 2rem;\n  font-size: 0.8em;\n  letter-spacing: -0.05em;\n  line-height: 0.75rem;\n}\n._op_node_1h0by_458 ._op_type_text_1h0by_504 {\n  color: var(--primary-accent);\n}\n._op_node_1h0by_458 ._op_type_text_1h0by_504 ._node_stats_1h0by_507 {\n  position: absolute;\n  right: 20%;\n  top: -0.45rem;\n  display: flex;\n  gap: 0.25em;\n}\n._node_stats_1h0by_507 {\n  position: absolute;\n  right: 5%;\n  top: -0.45rem;\n  display: flex;\n  gap: 0.25em;\n}\n._savings-performance_1h0by_523,\n._performance_1h0by_523,\n._savings_1h0by_523 {\n  display: flex;\n  align-items: center;\n  gap: 0.25rem;\n  border-radius: 1rem;\n  padding: 0rem 0.125rem;\n  font-size: 0.65rem;\n  text-wrap: nowrap;\n  line-height: 0.75rem;\n}\n._savings_1h0by_523 {\n  background: #dcfae6;\n  border: 1px solid #ade4cb;\n}\n._savings_1h0by_523 ._value_1h0by_538 {\n  color: #374c6a;\n}\n._savings_1h0by_523 ._percent_1h0by_541 {\n  color: #079455;\n}\n._performance_1h0by_523 {\n  background: #fff1d7;\n  border: 1px solid #e7a427;\n}\n._performance_1h0by_523 ._value_1h0by_538 {\n  color: #374c6a;\n}\n._performance_1h0by_523 ._percent_1h0by_541 {\n  color: #e7a427;\n}\n._static_table_node_1h0by_556 {\n  width: 300px;\n  display: flex;\n  flex-direction: column;\n  cursor: default;\n  color: var(--text-color);\n}\n._static_table_node_1h0by_556 ._header_1h0by_8 {\n  background: var(--table-node-expand-bg);\n  border-top: 2px solid var(--table-node-border-color);\n  border-left: 2px solid var(--table-node-border-color);\n  border-right: 2px solid var(--table-node-border-color);\n  border-radius: 0.25em 0.25em 0 0;\n}\n._static_table_node_1h0by_556 ._header_1h0by_8._collapse_1h0by_16 {\n  background: var(--table-node-collapse-bg);\n  border-bottom: 2px solid var(--table-node-border-color);\n  border-radius: 0.25em;\n}\n._static_table_node_1h0by_556 ._header_1h0by_8._selected_1h0by_21 {\n  border-color: #e38e00;\n}\n._static_table_node_1h0by_556 ._header_1h0by_8._highlighted_1h0by_483 {\n  background-color: #fbe16b;\n}\n._static_table_node_1h0by_556 ._node_icon_1h0by_88 {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  margin-top: 0.25rem;\n  margin-bottom: 0.25rem;\n}\n._static_table_node_1h0by_556 ._node_icon_1h0by_88 svg {\n  width: 2.8rem;\n  height: 2.8rem;\n}\n._static_table_node_1h0by_556 ._cost_data_1h0by_489 {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  margin-top: 0.25rem;\n  margin-bottom: 0.25rem;\n  height: 100%;\n  padding: 0.325rem 0.3rem;\n  border: solid 1px #ff754c;\n  background-color: #ffefeb;\n  color: #374c6a;\n  border-radius: 0.375rem;\n  font-size: 0.8em;\n  letter-spacing: -0.05em;\n}\n._static_table_node_1h0by_556 ._content_1h0by_24 {\n  flex-grow: 1;\n  background: var(--table-node-content-bg);\n  border-bottom: 2px solid var(--table-node-border-color);\n  border-left: 2px solid var(--table-node-border-color);\n  border-right: 2px solid var(--table-node-border-color);\n  border-radius: 0 0 0.25em 0.25em;\n  padding: 0.25em;\n}\n._static_table_node_1h0by_556 ._content_1h0by_24._selected_1h0by_21 {\n  border-color: #e38e00;\n}\n._static_table_node_1h0by_556 ._details_btn_1h0by_620 {\n  border-radius: 50%;\n  width: 1.25rem;\n  height: 1.25rem;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  padding: 0.2rem;\n}\n._static_table_node_1h0by_556 ._details_btn_1h0by_620._enable_1h0by_629 {\n  background-color: var(--primary-accent);\n  cursor: pointer;\n  color: #fff;\n}\n._static_table_node_1h0by_556 ._details_btn_1h0by_620._disable_1h0by_146 {\n  background-color: var(--btn-disable);\n  color: var(--btn-disable-text);\n  cursor: not-allowed;\n}\n._code_editor_container_1h0by_640 {\n  background-color: var(--code-bg) !important;\n  margin: 0 !important;\n  padding: 0.25rem !important;\n  flex-grow: 1;\n}\n._code_editor_1h0by_640 {\n  background-color: var(--code-bg) !important;\n  padding: 0.5rem;\n  width: 100%;\n  line-height: 2 !important;\n}\n._tooltip_container_1h0by_654 {\n  position: relative;\n  display: flex;\n  align-items: center;\n}\n._tooltip_container_1h0by_654:hover ._tooltip_text_1h0by_660 {\n  display: block;\n}\n._tooltip_text_1h0by_660 {\n  display: none;\n  position: absolute;\n  bottom: 125%;\n  left: 50%;\n  transform: translate(-50%);\n  padding: 8px;\n  color: #fff;\n  border-radius: 4px;\n  white-space: nowrap;\n  background: #082247;\n}\n._views_type_badge_1h0by_677 {\n  background-color: var(--views-color) !important;\n  font-size: 8px;\n  padding: 2px;\n  width: 12px;\n  height: 12px;\n  border-radius: 6px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  color: #fff;\n  cursor: default;\n}\n._lineage_legend_1h0by_391 {\n  position: absolute;\n  bottom: 1rem;\n  left: 3.5rem;\n  z-index: 4;\n  background-color: var(--card-bg) !important;\n  color: var(--text-color) !important;\n  border: 1px solid var(--input-border-color) !important;\n  border-radius: 5px !important;\n  font-size: 10px !important;\n  padding: 6px !important;\n}\n._lineage_legend_1h0by_391 svg {\n  margin-left: 0.6rem;\n  vertical-align: baseline;\n}\n._column_code_icon_1h0by_708 {\n  background-color: #082247 !important;\n  padding: 2px;\n  width: 12px;\n  height: 12px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  border-radius: 6px;\n  cursor: pointer;\n  color: #fff;\n}\n._column_code_icon_1h0by_708 .codicon {\n  font-size: 10px !important;\n}\n._edge_select_1h0by_724 {\n  display: flex;\n  align-items: center;\n}\n._edge_select_1h0by_724 div {\n  height: 2px;\n  width: 12px;\n  border-top: solid 2px #e38e00;\n}\n._edge_non_select_1h0by_734 {\n  display: flex;\n  align-items: center;\n}\n._edge_non_select_1h0by_734 div {\n  height: 2px;\n  width: 12px;\n  border-top: dashed 1px #e38e00;\n}\n._modal_views_code_container_1h0by_744 {\n  background-color: var(--card-bg);\n  border-radius: 6px;\n}\n._custom_node_code_block_1h0by_749 .tooltip {\n  --bs-tooltip-max-width: none;\n}\n._custom_node_code_block_1h0by_749 .tooltip .card {\n  border: none;\n  background-color: transparent;\n}\n._custom_node_code_block_1h0by_749 .tooltip .card pre {\n  padding: 0 !important;\n  white-space: nowrap !important;\n}\n._reset_btn_1h0by_761 {\n  align-items: center;\n  display: flex;\n  gap: 4px;\n}\n._error_tooltip_1h0by_767 {\n  padding: 8px;\n  color: #fff;\n  border-radius: 4px;\n  background: #082247;\n}\n:root {\n  --border-radius: 8px;\n}\n._tableWrapper_1h0by_778 {\n  width: 100%;\n  max-width: 800px;\n  margin: 0 auto;\n}\n._dataTable_1h0by_784 {\n  background-color: var(--background--02);\n  color: var(--text-color--paragraph);\n  border-radius: var(--border-radius);\n  overflow: hidden;\n}\n._dataTable_1h0by_784.table {\n  border: 1px solid var(--gray--gray-01);\n  margin-bottom: 0;\n}\n._dataTable_1h0by_784 td {\n  border-color: var(--gray--gray-01) !important;\n  padding: 0.25rem 0.5rem !important;\n  background-color: var(--background--02);\n}\n._dataTable_1h0by_784 thead th {\n  background-color: var(--background--04);\n  border-bottom-width: 2px;\n  border-color: var(--gray--gray-01) !important;\n  padding: 0.25rem 0.5rem !important;\n  font-weight: 500;\n}\n._dataTable_1h0by_784 thead th:first-child {\n  border-top-left-radius: calc(var(--border-radius) - 1px);\n}\n._dataTable_1h0by_784 thead th:last-child {\n  border-top-right-radius: calc(var(--border-radius) - 1px);\n}\n._dataTable_1h0by_784 tbody tr:last-child td:first-child {\n  border-bottom-left-radius: calc(var(--border-radius) - 1px);\n}\n._dataTable_1h0by_784 tbody tr:last-child td:last-child {\n  border-bottom-right-radius: calc(var(--border-radius) - 1px);\n}\n#lineage-sidebar .sidebar-modal {\n  position: fixed;\n  top: -1px;\n  height: calc(100% + 1px);\n  box-shadow: none;\n  transition: transform 0.3s ease-in-out;\n  z-index: 997;\n  color: var(--text-color);\n  left: 0;\n  width: 100vw;\n  background-color: transparent;\n}\n#lineage-sidebar .sidebar-background-screen {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100vw;\n  height: 100%;\n  background-color: #08224780;\n  z-index: 998;\n  display: block;\n}\n#lineage-sidebar .sidebar-modal-content {\n  border-radius: 0;\n  height: 100%;\n  right: 0;\n  position: absolute;\n  background-color: var(--card-bg);\n  z-index: 998;\n  min-width: 400px;\n  max-width: 600px;\n}\n#lineage-sidebar .sidebar-close-button {\n  position: absolute;\n  top: 0;\n  right: 100%;\n  height: 32px;\n  width: 32px;\n  background: 1px solid #e7e8ea;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  cursor: pointer;\n  z-index: 999;\n  padding: 8px;\n  background: var(--primary-accent, #247efe);\n}\n._component_13r39_1 {\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  transform: translate(-50%, -50%);\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  flex-direction: column;\n  border: 4px solid rgba(0, 0, 0, 0.1);\n  width: 40px;\n  height: 40px;\n  border-radius: 50%;\n  border-left-color: var(--primary-color);\n  margin: 0 auto;\n  animation: _spin_13r39_1 1s linear infinite;\n}\n@keyframes _spin_13r39_1 {\n  0% {\n    transform: rotate(0);\n  }\n  to {\n    transform: rotate(360deg);\n  }\n}\n._level_tag_x6wwh_1 {\n  width: min-content;\n  display: flex;\n  align-items: center;\n  padding: 2px 8px;\n  font-weight: 500;\n  border-radius: 30px;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  font-size: 0.8em;\n  background-color: var(--tag-bg);\n  color: var(--tag-text-color);\n}\n.react-flow {\n  direction: ltr;\n}\n.react-flow__container {\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  top: 0;\n  left: 0;\n}\n.react-flow__pane {\n  z-index: 1;\n  cursor: -webkit-grab;\n  cursor: grab;\n}\n.react-flow__pane.selection {\n  cursor: pointer;\n}\n.react-flow__pane.dragging {\n  cursor: -webkit-grabbing;\n  cursor: grabbing;\n}\n.react-flow__viewport {\n  transform-origin: 0 0;\n  z-index: 2;\n  pointer-events: none;\n}\n.react-flow__renderer {\n  z-index: 4;\n}\n.react-flow__selection {\n  z-index: 6;\n}\n.react-flow__nodesselection-rect:focus,\n.react-flow__nodesselection-rect:focus-visible {\n  outline: none;\n}\n.react-flow .react-flow__edges {\n  pointer-events: none;\n  overflow: visible;\n}\n.react-flow__edge-path,\n.react-flow__connection-path {\n  stroke: #b1b1b7;\n  stroke-width: 1;\n  fill: none;\n}\n.react-flow__edge {\n  pointer-events: visibleStroke;\n  cursor: pointer;\n}\n.react-flow__edge.animated path {\n  stroke-dasharray: 5;\n  -webkit-animation: dashdraw 0.5s linear infinite;\n  animation: dashdraw 0.5s linear infinite;\n}\n.react-flow__edge.animated path.react-flow__edge-interaction {\n  stroke-dasharray: none;\n  -webkit-animation: none;\n  animation: none;\n}\n.react-flow__edge.inactive {\n  pointer-events: none;\n}\n.react-flow__edge.selected,\n.react-flow__edge:focus,\n.react-flow__edge:focus-visible {\n  outline: none;\n}\n.react-flow__edge.selected .react-flow__edge-path,\n.react-flow__edge:focus .react-flow__edge-path,\n.react-flow__edge:focus-visible .react-flow__edge-path {\n  stroke: #555;\n}\n.react-flow__edge-textwrapper {\n  pointer-events: all;\n}\n.react-flow__edge-textbg {\n  fill: #fff;\n}\n.react-flow__edge .react-flow__edge-text {\n  pointer-events: none;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  user-select: none;\n}\n.react-flow__connection {\n  pointer-events: none;\n}\n.react-flow__connection .animated {\n  stroke-dasharray: 5;\n  -webkit-animation: dashdraw 0.5s linear infinite;\n  animation: dashdraw 0.5s linear infinite;\n}\n.react-flow__connectionline {\n  z-index: 1001;\n}\n.react-flow__nodes {\n  pointer-events: none;\n  transform-origin: 0 0;\n}\n.react-flow__node {\n  position: absolute;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  user-select: none;\n  pointer-events: all;\n  transform-origin: 0 0;\n  box-sizing: border-box;\n  cursor: -webkit-grab;\n  cursor: grab;\n}\n.react-flow__node.dragging {\n  cursor: -webkit-grabbing;\n  cursor: grabbing;\n}\n.react-flow__nodesselection {\n  z-index: 3;\n  transform-origin: left top;\n  pointer-events: none;\n}\n.react-flow__nodesselection-rect {\n  position: absolute;\n  pointer-events: all;\n  cursor: -webkit-grab;\n  cursor: grab;\n}\n.react-flow__handle {\n  position: absolute;\n  pointer-events: none;\n  min-width: 5px;\n  min-height: 5px;\n  width: 6px;\n  height: 6px;\n  background: #1a192b;\n  border: 1px solid white;\n  border-radius: 100%;\n}\n.react-flow__handle.connectionindicator {\n  pointer-events: all;\n  cursor: crosshair;\n}\n.react-flow__handle-bottom {\n  top: auto;\n  left: 50%;\n  bottom: -4px;\n  transform: translate(-50%);\n}\n.react-flow__handle-top {\n  left: 50%;\n  top: -4px;\n  transform: translate(-50%);\n}\n.react-flow__handle-left {\n  top: 50%;\n  left: -4px;\n  transform: translateY(-50%);\n}\n.react-flow__handle-right {\n  right: -4px;\n  top: 50%;\n  transform: translateY(-50%);\n}\n.react-flow__edgeupdater {\n  cursor: move;\n  pointer-events: all;\n}\n.react-flow__panel {\n  position: absolute;\n  z-index: 5;\n  margin: 15px;\n}\n.react-flow__panel.top {\n  top: 0;\n}\n.react-flow__panel.bottom {\n  bottom: 0;\n}\n.react-flow__panel.left {\n  left: 0;\n}\n.react-flow__panel.right {\n  right: 0;\n}\n.react-flow__panel.center {\n  left: 50%;\n  transform: translate(-50%);\n}\n.react-flow__attribution {\n  font-size: 10px;\n  background: #ffffff80;\n  padding: 2px 3px;\n  margin: 0;\n}\n.react-flow__attribution a {\n  text-decoration: none;\n  color: #999;\n}\n@-webkit-keyframes dashdraw {\n  0% {\n    stroke-dashoffset: 10;\n  }\n}\n@keyframes dashdraw {\n  0% {\n    stroke-dashoffset: 10;\n  }\n}\n.react-flow__edgelabel-renderer {\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  pointer-events: none;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  user-select: none;\n}\n.react-flow__edge.updating .react-flow__edge-path {\n  stroke: #777;\n}\n.react-flow__edge-text {\n  font-size: 10px;\n}\n.react-flow__node.selectable:focus,\n.react-flow__node.selectable:focus-visible {\n  outline: none;\n}\n.react-flow__node-default,\n.react-flow__node-input,\n.react-flow__node-output,\n.react-flow__node-group {\n  padding: 10px;\n  border-radius: 3px;\n  width: 150px;\n  font-size: 12px;\n  color: #222;\n  text-align: center;\n  border-width: 1px;\n  border-style: solid;\n  border-color: #1a192b;\n  background-color: #fff;\n}\n.react-flow__node-default.selectable:hover,\n.react-flow__node-input.selectable:hover,\n.react-flow__node-output.selectable:hover,\n.react-flow__node-group.selectable:hover {\n  box-shadow: 0 1px 4px 1px #00000014;\n}\n.react-flow__node-default.selectable.selected,\n.react-flow__node-default.selectable:focus,\n.react-flow__node-default.selectable:focus-visible,\n.react-flow__node-input.selectable.selected,\n.react-flow__node-input.selectable:focus,\n.react-flow__node-input.selectable:focus-visible,\n.react-flow__node-output.selectable.selected,\n.react-flow__node-output.selectable:focus,\n.react-flow__node-output.selectable:focus-visible,\n.react-flow__node-group.selectable.selected,\n.react-flow__node-group.selectable:focus,\n.react-flow__node-group.selectable:focus-visible {\n  box-shadow: 0 0 0 0.5px #1a192b;\n}\n.react-flow__node-group {\n  background-color: #f0f0f040;\n}\n.react-flow__nodesselection-rect,\n.react-flow__selection {\n  background: #0059dc14;\n  border: 1px dotted rgba(0, 89, 220, 0.8);\n}\n.react-flow__nodesselection-rect:focus,\n.react-flow__nodesselection-rect:focus-visible,\n.react-flow__selection:focus,\n.react-flow__selection:focus-visible {\n  outline: none;\n}\n.react-flow__controls {\n  box-shadow: 0 0 2px 1px #00000014;\n}\n.react-flow__controls-button {\n  border: none;\n  background: #fefefe;\n  border-bottom: 1px solid #eee;\n  box-sizing: content-box;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  width: 16px;\n  height: 16px;\n  cursor: pointer;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  user-select: none;\n  padding: 5px;\n}\n.react-flow__controls-button:hover {\n  background: #f4f4f4;\n}\n.react-flow__controls-button svg {\n  width: 100%;\n  max-width: 12px;\n  max-height: 12px;\n}\n.react-flow__controls-button:disabled {\n  pointer-events: none;\n}\n.react-flow__controls-button:disabled svg {\n  fill-opacity: 0.4;\n}\n.react-flow__minimap {\n  background-color: #fff;\n}\n.react-flow__minimap svg {\n  display: block;\n}\n.react-flow__resize-control {\n  position: absolute;\n}\n.react-flow__resize-control.left,\n.react-flow__resize-control.right {\n  cursor: ew-resize;\n}\n.react-flow__resize-control.top,\n.react-flow__resize-control.bottom {\n  cursor: ns-resize;\n}\n.react-flow__resize-control.top.left,\n.react-flow__resize-control.bottom.right {\n  cursor: nwse-resize;\n}\n.react-flow__resize-control.bottom.left,\n.react-flow__resize-control.top.right {\n  cursor: nesw-resize;\n}\n.react-flow__resize-control.handle {\n  width: 4px;\n  height: 4px;\n  border: 1px solid #fff;\n  border-radius: 1px;\n  background-color: #3367d9;\n  transform: translate(-50%, -50%);\n}\n.react-flow__resize-control.handle.left {\n  left: 0;\n  top: 50%;\n}\n.react-flow__resize-control.handle.right {\n  left: 100%;\n  top: 50%;\n}\n.react-flow__resize-control.handle.top {\n  left: 50%;\n  top: 0;\n}\n.react-flow__resize-control.handle.bottom {\n  left: 50%;\n  top: 100%;\n}\n.react-flow__resize-control.handle.top.left,\n.react-flow__resize-control.handle.bottom.left {\n  left: 0;\n}\n.react-flow__resize-control.handle.top.right,\n.react-flow__resize-control.handle.bottom.right {\n  left: 100%;\n}\n.react-flow__resize-control.line {\n  border-color: #3367d9;\n  border-width: 0;\n  border-style: solid;\n}\n.react-flow__resize-control.line.left,\n.react-flow__resize-control.line.right {\n  width: 1px;\n  transform: translate(-50%);\n  top: 0;\n  height: 100%;\n}\n.react-flow__resize-control.line.left {\n  left: 0;\n  border-left-width: 1px;\n}\n.react-flow__resize-control.line.right {\n  left: 100%;\n  border-right-width: 1px;\n}\n.react-flow__resize-control.line.top,\n.react-flow__resize-control.line.bottom {\n  height: 1px;\n  transform: translateY(-50%);\n  left: 0;\n  width: 100%;\n}\n.react-flow__resize-control.line.top {\n  top: 0;\n  border-top-width: 1px;\n}\n.react-flow__resize-control.line.bottom {\n  border-bottom-width: 1px;\n  top: 100%;\n}\n.lineage-component {\n  --primary-color: #247efe;\n  --bg-color: #f5f5f7;\n  --primary-accent: #247efe;\n  --column-node-bg: #e9f2ff;\n  --column-node-color: var(--primary-accent);\n  --text-color: #000000;\n  --card-bg: #ffffff;\n  --card-border-color: #e7e8ea;\n  --table-node-border-color: rgba(167, 178, 193, 0.3);\n  --table-node-expand-bg: #eaf3ff;\n  --table-node-collapse-bg: #ffffff;\n  --table-node-content-bg: #ffffff;\n  --text-grey-color: #8390a3;\n  --text-grey2-color: #c4cad2;\n  --purpose-section-bg: #eaf3ff;\n  --column-section-bg: #f5f6f7;\n  --tag-bg: #f5f6f7;\n  --tag-text-color: #082247;\n  --input-placeholder-color: rgba(8, 34, 71, 0.5);\n  --input-bg: #ffffff;\n  --input-text-color: #212529;\n  --input-border-color: #dee2e6;\n  --modal-bg: #ffffff;\n  --popover-bg: #ffffff;\n  --divider-color: #e8e8e8;\n  --code-bg: #082247;\n  --node-model-color: 36, 126, 254;\n  line-height: var(--bs-body-line-height);\n  height: 100%;\n}\n.vscode-dark .lineage-component {\n  --bg-color: #1e1e1e;\n  --primary-accent: #247efe;\n  --column-node-bg: rgba(131, 144, 163, 0.2);\n  --column-node-color: #ffffff;\n  --text-color: #ffffff;\n  --card-bg: #252526;\n  --card-border-color: #d5dbe433;\n  --table-node-border-color: rgba(213, 219, 228, 0.1);\n  --table-node-expand-bg: #494e56;\n  --table-node-collapse-bg: #3a3d41;\n  --table-node-content-bg: #3a3d41;\n  --text-grey-color: #66768d;\n  --text-grey2-color: #c4cad2;\n  --purpose-section-bg: #3c3c3c;\n  --column-section-bg: #3c3c3c;\n  --tag-bg: #4a4d51;\n  --tag-text-color: #ffffff;\n  --input-placeholder-color: #ffffff;\n  --input-bg: rgba(131, 144, 163, 0.2);\n  --input-text-color: #ffffff;\n  --input-border-color: rgba(131, 144, 163, 0.1);\n  --modal-bg: #484e55;\n  --popover-bg: #28292c;\n  --divider-color: #424750;\n  --code-bg: #171717;\n  --node-model-color: 202, 232, 249;\n}\nbody.lineage .popover {\n  --bs-popover-bg: var(--background--02);\n}\nbody.vscode-dark .bs-modal {\n  --bs-modal-bg: #252526 !important;\n  --bs-modal-color: #ffffff !important;\n}\n.position-relative {\n  position: relative;\n}\n.gap-xxs {\n  gap: 0.25rem;\n}\n.gap-xs {\n  gap: 0.5rem;\n}\n.gap-sm {\n  gap: 0.75rem;\n}\n.gap-md {\n  gap: 1rem;\n}\n.gap-lg {\n  gap: 1.25rem;\n}\n.gap-xl {\n  gap: 2rem;\n}\n.overflow-y {\n  overflow-y: auto;\n}\n.overflow-x {\n  overflow-x: auto;\n}\n.lines-2 {\n  display: -webkit-box;\n  text-overflow: ellipsis;\n  overflow: hidden;\n  -webkit-line-clamp: 2;\n  -webkit-box-orient: vertical;\n  word-break: break-word;\n}\n.text-blue {\n  color: var(--primary-accent);\n}\n.text-grey {\n  color: var(--text-grey-color);\n}\n.text-overflow {\n  text-overflow: ellipsis;\n  overflow-x: hidden;\n  white-space: nowrap;\n}\n.invisible {\n  visibility: hidden;\n}\n.spacer {\n  flex-grow: 1;\n}\n.fw-semibold {\n  font-weight: 600;\n}\n.top-right-container {\n  position: absolute;\n  top: 16px;\n  right: 16px;\n  display: flex;\n  gap: 8px;\n  z-index: 1;\n  align-items: center;\n}\n.fs-xxs {\n  font-size: 0.875rem;\n}\n.purpose-section {\n  background-color: var(--purpose-section-bg);\n}\n.column-section {\n  background-color: var(--column-section-bg);\n}\n.custom-input {\n  background-color: var(--input-bg) !important;\n  color: var(--input-text-color) !important;\n  border-color: var(--input-border-color) !important;\n}\n.custom-input::placeholder {\n  color: var(--input-placeholder-color) !important;\n  opacity: 1 !important;\n}\n.custom-input::-moz-placeholder {\n  color: var(--input-placeholder-color) !important;\n  opacity: 1 !important;\n}\n.custom-input::-ms-input-placeholder {\n  color: var(--input-placeholder-color) !important;\n  opacity: 1 !important;\n}\n.cursor-pointer {\n  cursor: pointer;\n}\n.tooltip-container {\n  position: relative;\n  display: flex;\n  align-items: center;\n}\n.tooltip-container:hover .tooltip-text {\n  display: block;\n}\n.tooltip-text {\n  display: none;\n  position: absolute;\n  bottom: 125%;\n  left: 50%;\n  transform: translate(-50%);\n  padding: 8px;\n  color: #082247;\n  border-radius: 4px;\n  white-space: nowrap;\n  background: #ffce73;\n}\n.bottom-right-container {\n  position: absolute;\n  bottom: 16px;\n  right: 16px;\n  display: flex;\n  gap: 8px;\n  z-index: 100;\n  align-items: center;\n}\n.normal-text {\n  color: var(--text-color);\n}\n.theme-bg {\n  background-color: var(--bg-color) !important;\n}\n.cursor-disable {\n  cursor: not-allowed;\n}\npre[class*=\"language-\"],\ncode[class*=\"language-\"] {\n  overflow: auto;\n  word-break: break-word;\n}\n.text-primary {\n  color: var(--primary-accent);\n}\n.text-white {\n  color: #fff;\n}\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n  color: #ccc;\n  background: none;\n  font-family:\n    Consolas,\n    Monaco,\n    Andale Mono,\n    Ubuntu Mono,\n    monospace;\n  font-size: 1em;\n  text-align: left;\n  white-space: pre;\n  word-spacing: normal;\n  word-break: normal;\n  word-wrap: normal;\n  line-height: 1.5;\n  -moz-tab-size: 4;\n  -o-tab-size: 4;\n  tab-size: 4;\n  -webkit-hyphens: none;\n  -moz-hyphens: none;\n  -ms-hyphens: none;\n  hyphens: none;\n}\npre[class*=\"language-\"] {\n  padding: 1em;\n  margin: 0.5em 0;\n  overflow: auto;\n}\n:not(pre) > code[class*=\"language-\"],\npre[class*=\"language-\"] {\n  background: #2d2d2d;\n}\n:not(pre) > code[class*=\"language-\"] {\n  padding: 0.1em;\n  border-radius: 0.3em;\n  white-space: normal;\n}\n.token.comment,\n.token.block-comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n  color: #999;\n}\n.token.punctuation {\n  color: #ccc;\n}\n.token.tag,\n.token.attr-name,\n.token.namespace,\n.token.deleted {\n  color: #e2777a;\n}\n.token.function-name {\n  color: #6196cc;\n}\n.token.boolean,\n.token.number,\n.token.function {\n  color: #f08d49;\n}\n.token.property,\n.token.class-name,\n.token.constant,\n.token.symbol {\n  color: #f8c555;\n}\n.token.selector,\n.token.important,\n.token.atrule,\n.token.keyword,\n.token.builtin {\n  color: #cc99cd;\n}\n.token.string,\n.token.char,\n.token.attr-value,\n.token.regex,\n.token.variable {\n  color: #7ec699;\n}\n.token.operator,\n.token.entity,\n.token.url {\n  color: #67cdcc;\n}\n.token.important,\n.token.bold {\n  font-weight: 700;\n}\n.token.italic {\n  font-style: italic;\n}\n.token.entity {\n  cursor: help;\n}\n.token.inserted {\n  color: green;\n}\n.learnings .card {\n  border: 1px solid transparent;\n  margin-bottom: 1rem;\n  padding: 1rem;\n}\n.learnings .card.active {\n  border: 1px solid rgb(36, 126, 254);\n}\n.learnings .card.active h6 {\n  color: #247efe;\n  border-bottom: 1px solid #f1f0f0;\n  padding-bottom: 0.75rem;\n}\n.learnings .card .form-switch,\n.learnings .card .codicon-trash {\n  margin-top: 1px;\n}\n.learnings .card button {\n  padding: 6px 3px;\n}\n.learnings .card .codicon-pencil {\n  font-size: 0.9rem;\n  margin-top: -3px;\n}\n.learnings .card .codicon-chevron-down {\n  font-size: 1.2rem;\n}\n.learnings .card dl {\n  display: flex;\n  gap: 1rem;\n  margin-bottom: 0;\n}\n.learnings .card dt {\n  font-size: 14px;\n  font-weight: 600;\n}\n.learnings .card dd {\n  font-size: 14px;\n  margin-left: -4px;\n  margin-bottom: 0;\n}\n.learnings .card strong {\n  font-size: 16px;\n  font-weight: 600;\n}\n.learnings .card .collapse {\n  font-size: 14px;\n}\n.teammates {\n  container-type: inline-size;\n  width: 100%;\n}\n.teammates .col {\n  flex: none;\n}\n@container (min-width: 600px) {\n  .teammates > .row > .col {\n    width: 50%;\n  }\n}\n@container (min-width: 800px) {\n  .teammates > .row > .col {\n    width: 33.3333333333%;\n  }\n}\n.teammates .card {\n  margin-bottom: 1rem;\n  padding: 0.5rem 1rem;\n  cursor: default;\n  box-shadow: 0 20px 24px -4px #10182808;\n}\n.teammates .card:hover {\n  background-color: #f8f8f8;\n}\n.teammates .card .extension {\n  background: #f4efff !important;\n  color: #7046d3 !important;\n  font-weight: 500;\n  padding: 0.3rem 0.7rem;\n}\n.teammates .card .saas {\n  background: #d6fff2 !important;\n  color: #01cd8c !important;\n  font-weight: 500;\n  padding: 0.3rem 0.7rem;\n}\n.teammates .card .card-img {\n  width: 60px;\n}\n.teammates .card .card-body {\n  padding: 0.5rem;\n  display: flex;\n  flex-direction: column;\n}\n.teammates .card .card-body .card-text {\n  flex: 1;\n}\n._chatbot_1ti7a_1 ._chatTriggerLink_1ti7a_1 {\n  border: 1px solid #e0e6ef;\n  text-decoration: none;\n  text-align: left;\n}\n._chatbot_1ti7a_1 div[data-id=\"default\"] .ant-pro-chat-message-content,\n._chatbot_1ti7a_1 div[data-id=\"default\"] .ant-pro-chat-message-content > div {\n  width: 100%;\n}\n._chatbot_1ti7a_1\n  div[data-id=\"default\"]\n  .ant-pro-chat-list-item-message-content {\n  margin-top: 6px;\n  padding: 0;\n}\n._chatbot_1ti7a_1\n  div[data-id=\"default\"]\n  .ant-pro-chat-list-item-message-content\n  .ant-default-message {\n  background: #eef5ff;\n  padding: 1rem;\n  line-height: 1.5;\n  border-radius: 8px;\n  margin-bottom: 1rem;\n}\n._chatbot_1ti7a_1 .ant-pro-chat-chat-list-container {\n  overflow: hidden auto;\n}\n._chatbot_1ti7a_1 .ant-pro-chat-list-item {\n  content-visibility: visible;\n}\n._chatbot_1ti7a_1 .ant-pro-chat-list-item-actions {\n  position: absolute;\n  bottom: -24px;\n}\n._chatbot_1ti7a_1 .ant-pro-chat-list-item-left {\n  display: block;\n}\n._chatbot_1ti7a_1 .ant-pro-chat-list-item-title {\n  left: 52px;\n  top: -16px;\n}\n._chatbot_1ti7a_1 .ant-pro-chat-message-content,\n._chatbot_1ti7a_1 .js-plotly-plot,\n._chatbot_1ti7a_1 .ant-pro-chat-list-item-message-content {\n  max-width: 100%;\n}\n._chatbot_1ti7a_1 .ant-pro-chat-message-content {\n  flex-direction: column;\n  position: static;\n}\n._chatbot_1ti7a_1 .ant-pro-chat p {\n  word-break: break-word;\n  margin: 0;\n}\n._chatbot_1ti7a_1 ._statusUpdates_1ti7a_51 {\n  padding: 0.5rem;\n  border: 1px solid var(--primary, #247efe);\n  border-radius: 6px;\n  margin-top: 1rem;\n}\n._chatbot_1ti7a_1 ._statusUpdates_1ti7a_51 .card-title {\n  color: var(--primary, #247efe);\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  cursor: pointer;\n  line-height: 1.5;\n}\n._chatbot_1ti7a_1 ._statusUpdates_1ti7a_51 .card-title .codicon-pass-filled {\n  color: var(--primary, #247efe);\n}\n._chatbot_1ti7a_1 ._statusUpdates_1ti7a_51 .card {\n  background-color: #f2f4f7;\n  border: none;\n}\n._chatbot_1ti7a_1 ._statusUpdates_1ti7a_51 .card li {\n  display: flex;\n  gap: 6px;\n  align-items: center;\n}\n._chatbot_1ti7a_1 ._statusUpdates_1ti7a_51 .card li code {\n  white-space: normal;\n  color: inherit;\n}\n._chatbot_1ti7a_1 ._statusUpdates_1ti7a_51 .card li:not(:last-child) {\n  border-bottom: 1px solid #e0e6ef;\n  padding-bottom: 0.5rem;\n  margin-bottom: 0.5rem;\n}\n._chatbot_1ti7a_1 ._statusUpdates_1ti7a_51 .codicon-pass-filled {\n  color: #17b26a;\n  vertical-align: text-bottom;\n}\n._citations_18435_1 {\n  background: #17b26a1a;\n  color: #17b26a;\n  padding: 0.5rem 1rem;\n  border-radius: 2rem;\n  align-items: center;\n}\n._citations_18435_1 ul {\n  margin: 0;\n}\n._citations_18435_1 button,\n._citations_18435_1 a {\n  text-decoration: none;\n  border-radius: 50%;\n  background: #17b26a !important;\n  border: none;\n  padding: 4px 5px;\n  margin-top: -1px;\n}\n._citations_18435_1 button:hover,\n._citations_18435_1 a:hover {\n  background: #07a058 !important;\n}\n"
  },
  {
    "path": "webview_panels/src/lib/altimate/main.js",
    "content": "// * version 0.1.0\n\nimport \"./main.css\";\nvar Kf = Object.defineProperty;\nvar Xf = (e, t, n) =>\n  t in e\n    ? Kf(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n })\n    : (e[t] = n);\nvar Yr = (e, t, n) => Xf(e, typeof t != \"symbol\" ? t + \"\" : t, n);\nimport {\n  Tooltip as Qf,\n  Button as Re,\n  Spinner as rc,\n  Card as bt,\n  CardTitle as Io,\n  CardBody as Mt,\n  Badge as Jf,\n  CloseButton as e4,\n  Popover as od,\n  PopoverBody as rd,\n  UncontrolledTooltip as t4,\n  Input as Qt,\n  Collapse as rr,\n  Table as n4,\n  Label as bi,\n  Modal as id,\n  ModalBody as ad,\n  FormGroup as Xn,\n  FormFeedback as dr,\n  Alert as Nr,\n  CardFooter as ld,\n  Offcanvas as o4,\n  OffcanvasHeader as r4,\n  OffcanvasBody as i4,\n  Col as a4,\n  CardImg as l4,\n  CardSubtitle as s4,\n  CardText as c4,\n  Row as u4,\n  List as d4,\n} from \"reactstrap\";\nimport * as O from \"react\";\nimport $, {\n  createContext as Pt,\n  Component as f4,\n  createElement as O1,\n  isValidElement as sd,\n  useState as se,\n  useRef as he,\n  forwardRef as ea,\n  useEffect as ue,\n  useReducer as ic,\n  useCallback as Oe,\n  useMemo as ze,\n  useContext as Xe,\n  useLayoutEffect as h4,\n  useId as cd,\n  useInsertionEffect as p4,\n  Children as ko,\n  lazy as g4,\n  memo as Ke,\n  useImperativeHandle as m4,\n} from \"react\";\nimport { Prism as b4 } from \"react-syntax-highlighter\";\nimport y4, { createPortal as Hn } from \"react-dom\";\nimport { useProChat as C4, ProChat as v4 } from \"@ant-design/pro-chat\";\nimport { z as Pe } from \"zod\";\nimport {\n  useFormikContext as ud,\n  Form as dd,\n  Field as cs,\n  Formik as fd,\n  useFormik as hd,\n} from \"formik\";\nimport { Select as us, notification as x4, Popconfirm as pd } from \"antd\";\nvar Qn =\n  typeof globalThis < \"u\"\n    ? globalThis\n    : typeof window < \"u\"\n      ? window\n      : typeof global < \"u\"\n        ? global\n        : typeof self < \"u\"\n          ? self\n          : {};\nfunction fn(e) {\n  return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, \"default\")\n    ? e.default\n    : e;\n}\nvar ds = { exports: {} },\n  Wo = {};\n/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar N1;\nfunction w4() {\n  if (N1) return Wo;\n  N1 = 1;\n  var e = $,\n    t = Symbol.for(\"react.element\"),\n    n = Symbol.for(\"react.fragment\"),\n    o = Object.prototype.hasOwnProperty,\n    r = e.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,\n    i = { key: !0, ref: !0, __self: !0, __source: !0 };\n  function a(l, s, u) {\n    var c,\n      d = {},\n      p = null,\n      h = null;\n    u !== void 0 && (p = \"\" + u),\n      s.key !== void 0 && (p = \"\" + s.key),\n      s.ref !== void 0 && (h = s.ref);\n    for (c in s) o.call(s, c) && !i.hasOwnProperty(c) && (d[c] = s[c]);\n    if (l && l.defaultProps)\n      for (c in ((s = l.defaultProps), s)) d[c] === void 0 && (d[c] = s[c]);\n    return {\n      $$typeof: t,\n      type: l,\n      key: p,\n      ref: h,\n      props: d,\n      _owner: r.current,\n    };\n  }\n  return (Wo.Fragment = n), (Wo.jsx = a), (Wo.jsxs = a), Wo;\n}\nvar Zo = {};\n/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar L1;\nfunction E4() {\n  return (\n    L1 ||\n      ((L1 = 1),\n      process.env.NODE_ENV !== \"production\" &&\n        (function () {\n          var e = $,\n            t = Symbol.for(\"react.element\"),\n            n = Symbol.for(\"react.portal\"),\n            o = Symbol.for(\"react.fragment\"),\n            r = Symbol.for(\"react.strict_mode\"),\n            i = Symbol.for(\"react.profiler\"),\n            a = Symbol.for(\"react.provider\"),\n            l = Symbol.for(\"react.context\"),\n            s = Symbol.for(\"react.forward_ref\"),\n            u = Symbol.for(\"react.suspense\"),\n            c = Symbol.for(\"react.suspense_list\"),\n            d = Symbol.for(\"react.memo\"),\n            p = Symbol.for(\"react.lazy\"),\n            h = Symbol.for(\"react.offscreen\"),\n            m = Symbol.iterator,\n            b = \"@@iterator\";\n          function y(z) {\n            if (z === null || typeof z != \"object\") return null;\n            var X = (m && z[m]) || z[b];\n            return typeof X == \"function\" ? X : null;\n          }\n          var g = e.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n          function x(z) {\n            {\n              for (\n                var X = arguments.length,\n                  re = new Array(X > 1 ? X - 1 : 0),\n                  fe = 1;\n                fe < X;\n                fe++\n              )\n                re[fe - 1] = arguments[fe];\n              v(\"error\", z, re);\n            }\n          }\n          function v(z, X, re) {\n            {\n              var fe = g.ReactDebugCurrentFrame,\n                Me = fe.getStackAddendum();\n              Me !== \"\" && ((X += \"%s\"), (re = re.concat([Me])));\n              var Ie = re.map(function (we) {\n                return String(we);\n              });\n              Ie.unshift(\"Warning: \" + X),\n                Function.prototype.apply.call(console[z], console, Ie);\n            }\n          }\n          var S = !1,\n            w = !1,\n            E = !1,\n            M = !1,\n            _ = !1,\n            j;\n          j = Symbol.for(\"react.module.reference\");\n          function R(z) {\n            return !!(\n              typeof z == \"string\" ||\n              typeof z == \"function\" ||\n              z === o ||\n              z === i ||\n              _ ||\n              z === r ||\n              z === u ||\n              z === c ||\n              M ||\n              z === h ||\n              S ||\n              w ||\n              E ||\n              (typeof z == \"object\" &&\n                z !== null &&\n                (z.$$typeof === p ||\n                  z.$$typeof === d ||\n                  z.$$typeof === a ||\n                  z.$$typeof === l ||\n                  z.$$typeof === s || // This needs to include all possible module reference object\n                  // types supported by any Flight configuration anywhere since\n                  // we don't know which Flight build this will end up being used\n                  // with.\n                  z.$$typeof === j ||\n                  z.getModuleId !== void 0))\n            );\n          }\n          function D(z, X, re) {\n            var fe = z.displayName;\n            if (fe) return fe;\n            var Me = X.displayName || X.name || \"\";\n            return Me !== \"\" ? re + \"(\" + Me + \")\" : re;\n          }\n          function P(z) {\n            return z.displayName || \"Context\";\n          }\n          function V(z) {\n            if (z == null) return null;\n            if (\n              (typeof z.tag == \"number\" &&\n                x(\n                  \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\",\n                ),\n              typeof z == \"function\")\n            )\n              return z.displayName || z.name || null;\n            if (typeof z == \"string\") return z;\n            switch (z) {\n              case o:\n                return \"Fragment\";\n              case n:\n                return \"Portal\";\n              case i:\n                return \"Profiler\";\n              case r:\n                return \"StrictMode\";\n              case u:\n                return \"Suspense\";\n              case c:\n                return \"SuspenseList\";\n            }\n            if (typeof z == \"object\")\n              switch (z.$$typeof) {\n                case l:\n                  var X = z;\n                  return P(X) + \".Consumer\";\n                case a:\n                  var re = z;\n                  return P(re._context) + \".Provider\";\n                case s:\n                  return D(z, z.render, \"ForwardRef\");\n                case d:\n                  var fe = z.displayName || null;\n                  return fe !== null ? fe : V(z.type) || \"Memo\";\n                case p: {\n                  var Me = z,\n                    Ie = Me._payload,\n                    we = Me._init;\n                  try {\n                    return V(we(Ie));\n                  } catch {\n                    return null;\n                  }\n                }\n              }\n            return null;\n          }\n          var k = Object.assign,\n            N = 0,\n            T,\n            F,\n            I,\n            L,\n            C,\n            H,\n            B;\n          function A() {}\n          A.__reactDisabledLog = !0;\n          function W() {\n            {\n              if (N === 0) {\n                (T = console.log),\n                  (F = console.info),\n                  (I = console.warn),\n                  (L = console.error),\n                  (C = console.group),\n                  (H = console.groupCollapsed),\n                  (B = console.groupEnd);\n                var z = {\n                  configurable: !0,\n                  enumerable: !0,\n                  value: A,\n                  writable: !0,\n                };\n                Object.defineProperties(console, {\n                  info: z,\n                  log: z,\n                  warn: z,\n                  error: z,\n                  group: z,\n                  groupCollapsed: z,\n                  groupEnd: z,\n                });\n              }\n              N++;\n            }\n          }\n          function G() {\n            {\n              if ((N--, N === 0)) {\n                var z = {\n                  configurable: !0,\n                  enumerable: !0,\n                  writable: !0,\n                };\n                Object.defineProperties(console, {\n                  log: k({}, z, {\n                    value: T,\n                  }),\n                  info: k({}, z, {\n                    value: F,\n                  }),\n                  warn: k({}, z, {\n                    value: I,\n                  }),\n                  error: k({}, z, {\n                    value: L,\n                  }),\n                  group: k({}, z, {\n                    value: C,\n                  }),\n                  groupCollapsed: k({}, z, {\n                    value: H,\n                  }),\n                  groupEnd: k({}, z, {\n                    value: B,\n                  }),\n                });\n              }\n              N < 0 &&\n                x(\n                  \"disabledDepth fell below zero. This is a bug in React. Please file an issue.\",\n                );\n            }\n          }\n          var K = g.ReactCurrentDispatcher,\n            Q;\n          function ne(z, X, re) {\n            {\n              if (Q === void 0)\n                try {\n                  throw Error();\n                } catch (Me) {\n                  var fe = Me.stack.trim().match(/\\n( *(at )?)/);\n                  Q = (fe && fe[1]) || \"\";\n                }\n              return (\n                `\n` +\n                Q +\n                z\n              );\n            }\n          }\n          var oe = !1,\n            U;\n          {\n            var ge = typeof WeakMap == \"function\" ? WeakMap : Map;\n            U = new ge();\n          }\n          function J(z, X) {\n            if (!z || oe) return \"\";\n            {\n              var re = U.get(z);\n              if (re !== void 0) return re;\n            }\n            var fe;\n            oe = !0;\n            var Me = Error.prepareStackTrace;\n            Error.prepareStackTrace = void 0;\n            var Ie;\n            (Ie = K.current), (K.current = null), W();\n            try {\n              if (X) {\n                var we = function () {\n                  throw Error();\n                };\n                if (\n                  (Object.defineProperty(we.prototype, \"props\", {\n                    set: function () {\n                      throw Error();\n                    },\n                  }),\n                  typeof Reflect == \"object\" && Reflect.construct)\n                ) {\n                  try {\n                    Reflect.construct(we, []);\n                  } catch (dt) {\n                    fe = dt;\n                  }\n                  Reflect.construct(z, [], we);\n                } else {\n                  try {\n                    we.call();\n                  } catch (dt) {\n                    fe = dt;\n                  }\n                  z.call(we.prototype);\n                }\n              } else {\n                try {\n                  throw Error();\n                } catch (dt) {\n                  fe = dt;\n                }\n                z();\n              }\n            } catch (dt) {\n              if (dt && fe && typeof dt.stack == \"string\") {\n                for (\n                  var ye = dt.stack.split(`\n`),\n                    st = fe.stack.split(`\n`),\n                    Ue = ye.length - 1,\n                    Ye = st.length - 1;\n                  Ue >= 1 && Ye >= 0 && ye[Ue] !== st[Ye];\n\n                )\n                  Ye--;\n                for (; Ue >= 1 && Ye >= 0; Ue--, Ye--)\n                  if (ye[Ue] !== st[Ye]) {\n                    if (Ue !== 1 || Ye !== 1)\n                      do\n                        if ((Ue--, Ye--, Ye < 0 || ye[Ue] !== st[Ye])) {\n                          var pt =\n                            `\n` + ye[Ue].replace(\" at new \", \" at \");\n                          return (\n                            z.displayName &&\n                              pt.includes(\"<anonymous>\") &&\n                              (pt = pt.replace(\"<anonymous>\", z.displayName)),\n                            typeof z == \"function\" && U.set(z, pt),\n                            pt\n                          );\n                        }\n                      while (Ue >= 1 && Ye >= 0);\n                    break;\n                  }\n              }\n            } finally {\n              (oe = !1), (K.current = Ie), G(), (Error.prepareStackTrace = Me);\n            }\n            var _n = z ? z.displayName || z.name : \"\",\n              gn = _n ? ne(_n) : \"\";\n            return typeof z == \"function\" && U.set(z, gn), gn;\n          }\n          function _e(z, X, re) {\n            return J(z, !1);\n          }\n          function ie(z) {\n            var X = z.prototype;\n            return !!(X && X.isReactComponent);\n          }\n          function Ae(z, X, re) {\n            if (z == null) return \"\";\n            if (typeof z == \"function\") return J(z, ie(z));\n            if (typeof z == \"string\") return ne(z);\n            switch (z) {\n              case u:\n                return ne(\"Suspense\");\n              case c:\n                return ne(\"SuspenseList\");\n            }\n            if (typeof z == \"object\")\n              switch (z.$$typeof) {\n                case s:\n                  return _e(z.render);\n                case d:\n                  return Ae(z.type, X, re);\n                case p: {\n                  var fe = z,\n                    Me = fe._payload,\n                    Ie = fe._init;\n                  try {\n                    return Ae(Ie(Me), X, re);\n                  } catch {}\n                }\n              }\n            return \"\";\n          }\n          var We = Object.prototype.hasOwnProperty,\n            Ee = {},\n            le = g.ReactDebugCurrentFrame;\n          function Qe(z) {\n            if (z) {\n              var X = z._owner,\n                re = Ae(z.type, z._source, X ? X.type : null);\n              le.setExtraStackFrame(re);\n            } else le.setExtraStackFrame(null);\n          }\n          function Lt(z, X, re, fe, Me) {\n            {\n              var Ie = Function.call.bind(We);\n              for (var we in z)\n                if (Ie(z, we)) {\n                  var ye = void 0;\n                  try {\n                    if (typeof z[we] != \"function\") {\n                      var st = Error(\n                        (fe || \"React class\") +\n                          \": \" +\n                          re +\n                          \" type `\" +\n                          we +\n                          \"` is invalid; it must be a function, usually from the `prop-types` package, but received `\" +\n                          typeof z[we] +\n                          \"`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.\",\n                      );\n                      throw ((st.name = \"Invariant Violation\"), st);\n                    }\n                    ye = z[we](\n                      X,\n                      we,\n                      fe,\n                      re,\n                      null,\n                      \"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\",\n                    );\n                  } catch (Ue) {\n                    ye = Ue;\n                  }\n                  ye &&\n                    !(ye instanceof Error) &&\n                    (Qe(Me),\n                    x(\n                      \"%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).\",\n                      fe || \"React class\",\n                      re,\n                      we,\n                      typeof ye,\n                    ),\n                    Qe(null)),\n                    ye instanceof Error &&\n                      !(ye.message in Ee) &&\n                      ((Ee[ye.message] = !0),\n                      Qe(Me),\n                      x(\"Failed %s type: %s\", re, ye.message),\n                      Qe(null));\n                }\n            }\n          }\n          var nn = Array.isArray;\n          function Dt(z) {\n            return nn(z);\n          }\n          function on(z) {\n            {\n              var X = typeof Symbol == \"function\" && Symbol.toStringTag,\n                re =\n                  (X && z[Symbol.toStringTag]) ||\n                  z.constructor.name ||\n                  \"Object\";\n              return re;\n            }\n          }\n          function kt(z) {\n            try {\n              return Wt(z), !1;\n            } catch {\n              return !0;\n            }\n          }\n          function Wt(z) {\n            return \"\" + z;\n          }\n          function jt(z) {\n            if (kt(z))\n              return (\n                x(\n                  \"The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.\",\n                  on(z),\n                ),\n                Wt(z)\n              );\n          }\n          var Z = g.ReactCurrentOwner,\n            ee = {\n              key: !0,\n              ref: !0,\n              __self: !0,\n              __source: !0,\n            },\n            ce,\n            xe,\n            de;\n          de = {};\n          function $e(z) {\n            if (We.call(z, \"ref\")) {\n              var X = Object.getOwnPropertyDescriptor(z, \"ref\").get;\n              if (X && X.isReactWarning) return !1;\n            }\n            return z.ref !== void 0;\n          }\n          function nt(z) {\n            if (We.call(z, \"key\")) {\n              var X = Object.getOwnPropertyDescriptor(z, \"key\").get;\n              if (X && X.isReactWarning) return !1;\n            }\n            return z.key !== void 0;\n          }\n          function tt(z, X) {\n            if (\n              typeof z.ref == \"string\" &&\n              Z.current &&\n              X &&\n              Z.current.stateNode !== X\n            ) {\n              var re = V(Z.current.type);\n              de[re] ||\n                (x(\n                  'Component \"%s\" contains the string ref \"%s\". Support for string refs will be removed in a future major release. This case cannot be automatically converted to an arrow function. We ask you to manually fix this case by using useRef() or createRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref',\n                  V(Z.current.type),\n                  z.ref,\n                ),\n                (de[re] = !0));\n            }\n          }\n          function ht(z, X) {\n            {\n              var re = function () {\n                ce ||\n                  ((ce = !0),\n                  x(\n                    \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)\",\n                    X,\n                  ));\n              };\n              (re.isReactWarning = !0),\n                Object.defineProperty(z, \"key\", {\n                  get: re,\n                  configurable: !0,\n                });\n            }\n          }\n          function at(z, X) {\n            {\n              var re = function () {\n                xe ||\n                  ((xe = !0),\n                  x(\n                    \"%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)\",\n                    X,\n                  ));\n              };\n              (re.isReactWarning = !0),\n                Object.defineProperty(z, \"ref\", {\n                  get: re,\n                  configurable: !0,\n                });\n            }\n          }\n          var Se = function (z, X, re, fe, Me, Ie, we) {\n            var ye = {\n              // This tag allows us to uniquely identify this as a React Element\n              $$typeof: t,\n              // Built-in properties that belong on the element\n              type: z,\n              key: X,\n              ref: re,\n              props: we,\n              // Record the component responsible for creating this element.\n              _owner: Ie,\n            };\n            return (\n              (ye._store = {}),\n              Object.defineProperty(ye._store, \"validated\", {\n                configurable: !1,\n                enumerable: !1,\n                writable: !0,\n                value: !1,\n              }),\n              Object.defineProperty(ye, \"_self\", {\n                configurable: !1,\n                enumerable: !1,\n                writable: !1,\n                value: fe,\n              }),\n              Object.defineProperty(ye, \"_source\", {\n                configurable: !1,\n                enumerable: !1,\n                writable: !1,\n                value: Me,\n              }),\n              Object.freeze && (Object.freeze(ye.props), Object.freeze(ye)),\n              ye\n            );\n          };\n          function Zt(z, X, re, fe, Me) {\n            {\n              var Ie,\n                we = {},\n                ye = null,\n                st = null;\n              re !== void 0 && (jt(re), (ye = \"\" + re)),\n                nt(X) && (jt(X.key), (ye = \"\" + X.key)),\n                $e(X) && ((st = X.ref), tt(X, Me));\n              for (Ie in X)\n                We.call(X, Ie) && !ee.hasOwnProperty(Ie) && (we[Ie] = X[Ie]);\n              if (z && z.defaultProps) {\n                var Ue = z.defaultProps;\n                for (Ie in Ue) we[Ie] === void 0 && (we[Ie] = Ue[Ie]);\n              }\n              if (ye || st) {\n                var Ye =\n                  typeof z == \"function\"\n                    ? z.displayName || z.name || \"Unknown\"\n                    : z;\n                ye && ht(we, Ye), st && at(we, Ye);\n              }\n              return Se(z, ye, st, Me, fe, Z.current, we);\n            }\n          }\n          var lt = g.ReactCurrentOwner,\n            kn = g.ReactDebugCurrentFrame;\n          function rn(z) {\n            if (z) {\n              var X = z._owner,\n                re = Ae(z.type, z._source, X ? X.type : null);\n              kn.setExtraStackFrame(re);\n            } else kn.setExtraStackFrame(null);\n          }\n          var ao;\n          ao = !1;\n          function Ut(z) {\n            return typeof z == \"object\" && z !== null && z.$$typeof === t;\n          }\n          function Vr() {\n            {\n              if (lt.current) {\n                var z = V(lt.current.type);\n                if (z)\n                  return (\n                    `\n\nCheck the render method of \\`` +\n                    z +\n                    \"`.\"\n                  );\n              }\n              return \"\";\n            }\n          }\n          function xa(z) {\n            return \"\";\n          }\n          var $r = {};\n          function wa(z) {\n            {\n              var X = Vr();\n              if (!X) {\n                var re = typeof z == \"string\" ? z : z.displayName || z.name;\n                re &&\n                  (X =\n                    `\n\nCheck the top-level render call using <` +\n                    re +\n                    \">.\");\n              }\n              return X;\n            }\n          }\n          function Wr(z, X) {\n            {\n              if (!z._store || z._store.validated || z.key != null) return;\n              z._store.validated = !0;\n              var re = wa(X);\n              if ($r[re]) return;\n              $r[re] = !0;\n              var fe = \"\";\n              z &&\n                z._owner &&\n                z._owner !== lt.current &&\n                (fe = \" It was passed a child from \" + V(z._owner.type) + \".\"),\n                rn(z),\n                x(\n                  'Each child in a list should have a unique \"key\" prop.%s%s See https://reactjs.org/link/warning-keys for more information.',\n                  re,\n                  fe,\n                ),\n                rn(null);\n            }\n          }\n          function Zr(z, X) {\n            {\n              if (typeof z != \"object\") return;\n              if (Dt(z))\n                for (var re = 0; re < z.length; re++) {\n                  var fe = z[re];\n                  Ut(fe) && Wr(fe, X);\n                }\n              else if (Ut(z)) z._store && (z._store.validated = !0);\n              else if (z) {\n                var Me = y(z);\n                if (typeof Me == \"function\" && Me !== z.entries)\n                  for (var Ie = Me.call(z), we; !(we = Ie.next()).done; )\n                    Ut(we.value) && Wr(we.value, X);\n              }\n            }\n          }\n          function Ea(z) {\n            {\n              var X = z.type;\n              if (X == null || typeof X == \"string\") return;\n              var re;\n              if (typeof X == \"function\") re = X.propTypes;\n              else if (\n                typeof X == \"object\" &&\n                (X.$$typeof === s || // Note: Memo only checks outer props here.\n                  // Inner props are checked in the reconciler.\n                  X.$$typeof === d)\n              )\n                re = X.propTypes;\n              else return;\n              if (re) {\n                var fe = V(X);\n                Lt(re, z.props, \"prop\", fe, z);\n              } else if (X.PropTypes !== void 0 && !ao) {\n                ao = !0;\n                var Me = V(X);\n                x(\n                  \"Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?\",\n                  Me || \"Unknown\",\n                );\n              }\n              typeof X.getDefaultProps == \"function\" &&\n                !X.getDefaultProps.isReactClassApproved &&\n                x(\n                  \"getDefaultProps is only used on classic React.createClass definitions. Use a static property named `defaultProps` instead.\",\n                );\n            }\n          }\n          function Sa(z) {\n            {\n              for (var X = Object.keys(z.props), re = 0; re < X.length; re++) {\n                var fe = X[re];\n                if (fe !== \"children\" && fe !== \"key\") {\n                  rn(z),\n                    x(\n                      \"Invalid prop `%s` supplied to `React.Fragment`. React.Fragment can only have `key` and `children` props.\",\n                      fe,\n                    ),\n                    rn(null);\n                  break;\n                }\n              }\n              z.ref !== null &&\n                (rn(z),\n                x(\"Invalid attribute `ref` supplied to `React.Fragment`.\"),\n                rn(null));\n            }\n          }\n          var Ur = {};\n          function qr(z, X, re, fe, Me, Ie) {\n            {\n              var we = R(z);\n              if (!we) {\n                var ye = \"\";\n                (z === void 0 ||\n                  (typeof z == \"object\" &&\n                    z !== null &&\n                    Object.keys(z).length === 0)) &&\n                  (ye +=\n                    \" You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.\");\n                var st = xa();\n                st ? (ye += st) : (ye += Vr());\n                var Ue;\n                z === null\n                  ? (Ue = \"null\")\n                  : Dt(z)\n                    ? (Ue = \"array\")\n                    : z !== void 0 && z.$$typeof === t\n                      ? ((Ue = \"<\" + (V(z.type) || \"Unknown\") + \" />\"),\n                        (ye =\n                          \" Did you accidentally export a JSX literal instead of a component?\"))\n                      : (Ue = typeof z),\n                  x(\n                    \"React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s\",\n                    Ue,\n                    ye,\n                  );\n              }\n              var Ye = Zt(z, X, re, Me, Ie);\n              if (Ye == null) return Ye;\n              if (we) {\n                var pt = X.children;\n                if (pt !== void 0)\n                  if (fe)\n                    if (Dt(pt)) {\n                      for (var _n = 0; _n < pt.length; _n++) Zr(pt[_n], z);\n                      Object.freeze && Object.freeze(pt);\n                    } else\n                      x(\n                        \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\",\n                      );\n                  else Zr(pt, z);\n              }\n              if (We.call(X, \"key\")) {\n                var gn = V(z),\n                  dt = Object.keys(X).filter(function (Oa) {\n                    return Oa !== \"key\";\n                  }),\n                  $o =\n                    dt.length > 0\n                      ? \"{key: someKey, \" + dt.join(\": ..., \") + \": ...}\"\n                      : \"{key: someKey}\";\n                if (!Ur[gn + $o]) {\n                  var Ta =\n                    dt.length > 0 ? \"{\" + dt.join(\": ..., \") + \": ...}\" : \"{}\";\n                  x(\n                    `A props object containing a \"key\" prop is being spread into JSX:\n  let props = %s;\n  <%s {...props} />\nReact keys must be passed directly to JSX without using spread:\n  let props = %s;\n  <%s key={someKey} {...props} />`,\n                    $o,\n                    gn,\n                    Ta,\n                    gn,\n                  ),\n                    (Ur[gn + $o] = !0);\n                }\n              }\n              return z === o ? Sa(Ye) : Ea(Ye), Ye;\n            }\n          }\n          function ka(z, X, re) {\n            return qr(z, X, re, !0);\n          }\n          function _a(z, X, re) {\n            return qr(z, X, re, !1);\n          }\n          var Aa = _a,\n            Ma = ka;\n          (Zo.Fragment = o), (Zo.jsx = Aa), (Zo.jsxs = Ma);\n        })()),\n    Zo\n  );\n}\nprocess.env.NODE_ENV === \"production\"\n  ? (ds.exports = w4())\n  : (ds.exports = E4());\nvar f = ds.exports;\nconst S4 = \"_iconButton_eti7u_1\",\n  k4 = {\n    iconButton: S4,\n  },\n  jn = (e) =>\n    /* @__PURE__ */ f.jsx(Sn, {\n      title: e.title,\n      children: /* @__PURE__ */ f.jsx(\"button\", {\n        ...e,\n        className: `btn ${e.color ? `btn-${e.color}` : \"\"} ${e.className ?? \"\"} ${k4.iconButton}`,\n        type: e.type ?? \"button\",\n        children: e.children,\n      }),\n    }),\n  _4 = Pt(null),\n  La = {\n    didCatch: !1,\n    error: null,\n  };\nclass A4 extends f4 {\n  constructor(t) {\n    super(t),\n      (this.resetErrorBoundary = this.resetErrorBoundary.bind(this)),\n      (this.state = La);\n  }\n  static getDerivedStateFromError(t) {\n    return {\n      didCatch: !0,\n      error: t,\n    };\n  }\n  resetErrorBoundary() {\n    const { error: t } = this.state;\n    if (t !== null) {\n      for (var n, o, r = arguments.length, i = new Array(r), a = 0; a < r; a++)\n        i[a] = arguments[a];\n      (n = (o = this.props).onReset) === null ||\n        n === void 0 ||\n        n.call(o, {\n          args: i,\n          reason: \"imperative-api\",\n        }),\n        this.setState(La);\n    }\n  }\n  componentDidCatch(t, n) {\n    var o, r;\n    (o = (r = this.props).onError) === null || o === void 0 || o.call(r, t, n);\n  }\n  componentDidUpdate(t, n) {\n    const { didCatch: o } = this.state,\n      { resetKeys: r } = this.props;\n    if (o && n.error !== null && M4(t.resetKeys, r)) {\n      var i, a;\n      (i = (a = this.props).onReset) === null ||\n        i === void 0 ||\n        i.call(a, {\n          next: r,\n          prev: t.resetKeys,\n          reason: \"keys\",\n        }),\n        this.setState(La);\n    }\n  }\n  render() {\n    const {\n        children: t,\n        fallbackRender: n,\n        FallbackComponent: o,\n        fallback: r,\n      } = this.props,\n      { didCatch: i, error: a } = this.state;\n    let l = t;\n    if (i) {\n      const s = {\n        error: a,\n        resetErrorBoundary: this.resetErrorBoundary,\n      };\n      if (typeof n == \"function\") l = n(s);\n      else if (o) l = O1(o, s);\n      else if (r === null || sd(r)) l = r;\n      else throw a;\n    }\n    return O1(\n      _4.Provider,\n      {\n        value: {\n          didCatch: i,\n          error: a,\n          resetErrorBoundary: this.resetErrorBoundary,\n        },\n      },\n      l,\n    );\n  }\n}\nfunction M4() {\n  let e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : [],\n    t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [];\n  return e.length !== t.length || e.some((n, o) => !Object.is(n, t[o]));\n}\nconst Sn = (e) => {\n    const [t, n] = se(!1),\n      o = () => n(!t),\n      r = he(\n        (\n          e.id ?? `tooltip-${Math.random().toString(36).substring(3, 9)}`\n        ).replace(/\\s/g, \"-\"),\n      );\n    return /* @__PURE__ */ f.jsxs(A4, {\n      fallback: /* @__PURE__ */ f.jsx(\"span\", {\n        id: r.current,\n        children: e.children,\n      }),\n      children: [\n        /* @__PURE__ */ f.jsx(\"span\", { id: r.current, children: e.children }),\n        e.title\n          ? /* @__PURE__ */ f.jsx(Qf, {\n              isOpen: t,\n              target: r.current,\n              toggle: o,\n              className: e.className,\n              placement: \"top\",\n              children: e.title,\n            })\n          : null,\n      ],\n    });\n  },\n  T4 = \"_loadingBtn_gadec_1\",\n  O4 = {\n    loadingBtn: T4,\n  },\n  In = ({ loading: e, ...t }) =>\n    /* @__PURE__ */ f.jsx(Re, {\n      ...t,\n      disabled: t.disabled ?? e,\n      className: `${t.className ?? \"\"} ${O4.loadingBtn}`,\n      children: e ? /* @__PURE__ */ f.jsx(rc, {}) : t.children,\n    });\nvar Jo = {},\n  gd = { exports: {} };\n(function (e) {\n  function t(n) {\n    return n && n.__esModule\n      ? n\n      : {\n          default: n,\n        };\n  }\n  (e.exports = t), (e.exports.__esModule = !0), (e.exports.default = e.exports);\n})(gd);\nvar N4 = gd.exports,\n  Da = {},\n  D1;\nfunction L4() {\n  return (\n    D1 ||\n      ((D1 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            color: \"black\",\n            background: \"none\",\n            fontFamily:\n              \"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace\",\n            fontSize: \"1em\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            maxHeight: \"inherit\",\n            height: \"inherit\",\n            padding: \"0 1em\",\n            display: \"block\",\n            overflow: \"auto\",\n          },\n          'pre[class*=\"language-\"]': {\n            color: \"black\",\n            background: \"none\",\n            fontFamily:\n              \"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace\",\n            fontSize: \"1em\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            position: \"relative\",\n            margin: \".5em 0\",\n            overflow: \"visible\",\n            padding: \"1px\",\n            backgroundColor: \"#fdfdfd\",\n            WebkitBoxSizing: \"border-box\",\n            MozBoxSizing: \"border-box\",\n            boxSizing: \"border-box\",\n            marginBottom: \"1em\",\n          },\n          'pre[class*=\"language-\"] > code': {\n            position: \"relative\",\n            zIndex: \"1\",\n            borderLeft: \"10px solid #358ccb\",\n            boxShadow: \"-1px 0px 0px 0px #358ccb, 0px 0px 0px 1px #dfdfdf\",\n            backgroundColor: \"#fdfdfd\",\n            backgroundImage:\n              \"linear-gradient(transparent 50%, rgba(69, 142, 209, 0.04) 50%)\",\n            backgroundSize: \"3em 3em\",\n            backgroundOrigin: \"content-box\",\n            backgroundAttachment: \"local\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            backgroundColor: \"#fdfdfd\",\n            WebkitBoxSizing: \"border-box\",\n            MozBoxSizing: \"border-box\",\n            boxSizing: \"border-box\",\n            marginBottom: \"1em\",\n            position: \"relative\",\n            padding: \".2em\",\n            borderRadius: \"0.3em\",\n            color: \"#c92c2c\",\n            border: \"1px solid rgba(0, 0, 0, 0.1)\",\n            display: \"inline\",\n            whiteSpace: \"normal\",\n          },\n          'pre[class*=\"language-\"]:before': {\n            content: \"''\",\n            display: \"block\",\n            position: \"absolute\",\n            bottom: \"0.75em\",\n            left: \"0.18em\",\n            width: \"40%\",\n            height: \"20%\",\n            maxHeight: \"13em\",\n            boxShadow: \"0px 13px 8px #979797\",\n            WebkitTransform: \"rotate(-2deg)\",\n            MozTransform: \"rotate(-2deg)\",\n            msTransform: \"rotate(-2deg)\",\n            OTransform: \"rotate(-2deg)\",\n            transform: \"rotate(-2deg)\",\n          },\n          'pre[class*=\"language-\"]:after': {\n            content: \"''\",\n            display: \"block\",\n            position: \"absolute\",\n            bottom: \"0.75em\",\n            left: \"auto\",\n            width: \"40%\",\n            height: \"20%\",\n            maxHeight: \"13em\",\n            boxShadow: \"0px 13px 8px #979797\",\n            WebkitTransform: \"rotate(2deg)\",\n            MozTransform: \"rotate(2deg)\",\n            msTransform: \"rotate(2deg)\",\n            OTransform: \"rotate(2deg)\",\n            transform: \"rotate(2deg)\",\n            right: \"0.75em\",\n          },\n          comment: {\n            color: \"#7D8B99\",\n          },\n          \"block-comment\": {\n            color: \"#7D8B99\",\n          },\n          prolog: {\n            color: \"#7D8B99\",\n          },\n          doctype: {\n            color: \"#7D8B99\",\n          },\n          cdata: {\n            color: \"#7D8B99\",\n          },\n          punctuation: {\n            color: \"#5F6364\",\n          },\n          property: {\n            color: \"#c92c2c\",\n          },\n          tag: {\n            color: \"#c92c2c\",\n          },\n          boolean: {\n            color: \"#c92c2c\",\n          },\n          number: {\n            color: \"#c92c2c\",\n          },\n          \"function-name\": {\n            color: \"#c92c2c\",\n          },\n          constant: {\n            color: \"#c92c2c\",\n          },\n          symbol: {\n            color: \"#c92c2c\",\n          },\n          deleted: {\n            color: \"#c92c2c\",\n          },\n          selector: {\n            color: \"#2f9c0a\",\n          },\n          \"attr-name\": {\n            color: \"#2f9c0a\",\n          },\n          string: {\n            color: \"#2f9c0a\",\n          },\n          char: {\n            color: \"#2f9c0a\",\n          },\n          function: {\n            color: \"#2f9c0a\",\n          },\n          builtin: {\n            color: \"#2f9c0a\",\n          },\n          inserted: {\n            color: \"#2f9c0a\",\n          },\n          operator: {\n            color: \"#a67f59\",\n            background: \"rgba(255, 255, 255, 0.5)\",\n          },\n          entity: {\n            color: \"#a67f59\",\n            background: \"rgba(255, 255, 255, 0.5)\",\n            cursor: \"help\",\n          },\n          url: {\n            color: \"#a67f59\",\n            background: \"rgba(255, 255, 255, 0.5)\",\n          },\n          variable: {\n            color: \"#a67f59\",\n            background: \"rgba(255, 255, 255, 0.5)\",\n          },\n          atrule: {\n            color: \"#1990b8\",\n          },\n          \"attr-value\": {\n            color: \"#1990b8\",\n          },\n          keyword: {\n            color: \"#1990b8\",\n          },\n          \"class-name\": {\n            color: \"#1990b8\",\n          },\n          regex: {\n            color: \"#e90\",\n          },\n          important: {\n            color: \"#e90\",\n            fontWeight: \"normal\",\n          },\n          \".language-css .token.string\": {\n            color: \"#a67f59\",\n            background: \"rgba(255, 255, 255, 0.5)\",\n          },\n          \".style .token.string\": {\n            color: \"#a67f59\",\n            background: \"rgba(255, 255, 255, 0.5)\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n          namespace: {\n            Opacity: \".7\",\n          },\n          'pre[class*=\"language-\"].line-numbers.line-numbers': {\n            paddingLeft: \"0\",\n          },\n          'pre[class*=\"language-\"].line-numbers.line-numbers code': {\n            paddingLeft: \"3.8em\",\n          },\n          'pre[class*=\"language-\"].line-numbers.line-numbers .line-numbers-rows':\n            {\n              left: \"0\",\n            },\n          'pre[class*=\"language-\"][data-line]': {\n            paddingTop: \"0\",\n            paddingBottom: \"0\",\n            paddingLeft: \"0\",\n          },\n          \"pre[data-line] code\": {\n            position: \"relative\",\n            paddingLeft: \"4em\",\n          },\n          \"pre .line-highlight\": {\n            marginTop: \"0\",\n          },\n        };\n        e.default = t;\n      })(Da)),\n    Da\n  );\n}\nvar ja = {},\n  j1;\nfunction D4() {\n  return (\n    j1 ||\n      ((j1 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            color: \"white\",\n            background: \"none\",\n            textShadow: \"0 -.1em .2em black\",\n            fontFamily:\n              \"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace\",\n            fontSize: \"1em\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            color: \"white\",\n            background: \"hsl(30, 20%, 25%)\",\n            textShadow: \"0 -.1em .2em black\",\n            fontFamily:\n              \"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace\",\n            fontSize: \"1em\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            padding: \"1em\",\n            margin: \".5em 0\",\n            overflow: \"auto\",\n            border: \".3em solid hsl(30, 20%, 40%)\",\n            borderRadius: \".5em\",\n            boxShadow: \"1px 1px .5em black inset\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            background: \"hsl(30, 20%, 25%)\",\n            padding: \".15em .2em .05em\",\n            borderRadius: \".3em\",\n            border: \".13em solid hsl(30, 20%, 40%)\",\n            boxShadow: \"1px 1px .3em -.1em black inset\",\n            whiteSpace: \"normal\",\n          },\n          comment: {\n            color: \"hsl(30, 20%, 50%)\",\n          },\n          prolog: {\n            color: \"hsl(30, 20%, 50%)\",\n          },\n          doctype: {\n            color: \"hsl(30, 20%, 50%)\",\n          },\n          cdata: {\n            color: \"hsl(30, 20%, 50%)\",\n          },\n          punctuation: {\n            Opacity: \".7\",\n          },\n          namespace: {\n            Opacity: \".7\",\n          },\n          property: {\n            color: \"hsl(350, 40%, 70%)\",\n          },\n          tag: {\n            color: \"hsl(350, 40%, 70%)\",\n          },\n          boolean: {\n            color: \"hsl(350, 40%, 70%)\",\n          },\n          number: {\n            color: \"hsl(350, 40%, 70%)\",\n          },\n          constant: {\n            color: \"hsl(350, 40%, 70%)\",\n          },\n          symbol: {\n            color: \"hsl(350, 40%, 70%)\",\n          },\n          selector: {\n            color: \"hsl(75, 70%, 60%)\",\n          },\n          \"attr-name\": {\n            color: \"hsl(75, 70%, 60%)\",\n          },\n          string: {\n            color: \"hsl(75, 70%, 60%)\",\n          },\n          char: {\n            color: \"hsl(75, 70%, 60%)\",\n          },\n          builtin: {\n            color: \"hsl(75, 70%, 60%)\",\n          },\n          inserted: {\n            color: \"hsl(75, 70%, 60%)\",\n          },\n          operator: {\n            color: \"hsl(40, 90%, 60%)\",\n          },\n          entity: {\n            color: \"hsl(40, 90%, 60%)\",\n            cursor: \"help\",\n          },\n          url: {\n            color: \"hsl(40, 90%, 60%)\",\n          },\n          \".language-css .token.string\": {\n            color: \"hsl(40, 90%, 60%)\",\n          },\n          \".style .token.string\": {\n            color: \"hsl(40, 90%, 60%)\",\n          },\n          variable: {\n            color: \"hsl(40, 90%, 60%)\",\n          },\n          atrule: {\n            color: \"hsl(350, 40%, 70%)\",\n          },\n          \"attr-value\": {\n            color: \"hsl(350, 40%, 70%)\",\n          },\n          keyword: {\n            color: \"hsl(350, 40%, 70%)\",\n          },\n          regex: {\n            color: \"#e90\",\n          },\n          important: {\n            color: \"#e90\",\n            fontWeight: \"bold\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n          deleted: {\n            color: \"red\",\n          },\n        };\n        e.default = t;\n      })(ja)),\n    ja\n  );\n}\nvar Fa = {},\n  F1;\nfunction j4() {\n  return (\n    F1 ||\n      ((F1 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            fontFamily:\n              \"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace\",\n            fontSize: \"1em\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            background: \"black\",\n            color: \"white\",\n            boxShadow: \"-.3em 0 0 .3em black, .3em 0 0 .3em black\",\n          },\n          'pre[class*=\"language-\"]': {\n            fontFamily:\n              \"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace\",\n            fontSize: \"1em\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            padding: \".4em .8em\",\n            margin: \".5em 0\",\n            overflow: \"auto\",\n            background: `url('data:image/svg+xml;charset=utf-8,<svg%20version%3D\"1.1\"%20xmlns%3D\"http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg\"%20width%3D\"100\"%20height%3D\"100\"%20fill%3D\"rgba(0%2C0%2C0%2C.2)\">%0D%0A<polygon%20points%3D\"0%2C50%2050%2C0%200%2C0\"%20%2F>%0D%0A<polygon%20points%3D\"0%2C100%2050%2C100%20100%2C50%20100%2C0\"%20%2F>%0D%0A<%2Fsvg>')`,\n            backgroundSize: \"1em 1em\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            padding: \".2em\",\n            borderRadius: \".3em\",\n            boxShadow: \"none\",\n            whiteSpace: \"normal\",\n          },\n          comment: {\n            color: \"#aaa\",\n          },\n          prolog: {\n            color: \"#aaa\",\n          },\n          doctype: {\n            color: \"#aaa\",\n          },\n          cdata: {\n            color: \"#aaa\",\n          },\n          punctuation: {\n            color: \"#999\",\n          },\n          namespace: {\n            Opacity: \".7\",\n          },\n          property: {\n            color: \"#0cf\",\n          },\n          tag: {\n            color: \"#0cf\",\n          },\n          boolean: {\n            color: \"#0cf\",\n          },\n          number: {\n            color: \"#0cf\",\n          },\n          constant: {\n            color: \"#0cf\",\n          },\n          symbol: {\n            color: \"#0cf\",\n          },\n          selector: {\n            color: \"yellow\",\n          },\n          \"attr-name\": {\n            color: \"yellow\",\n          },\n          string: {\n            color: \"yellow\",\n          },\n          char: {\n            color: \"yellow\",\n          },\n          builtin: {\n            color: \"yellow\",\n          },\n          operator: {\n            color: \"yellowgreen\",\n          },\n          entity: {\n            color: \"yellowgreen\",\n            cursor: \"help\",\n          },\n          url: {\n            color: \"yellowgreen\",\n          },\n          \".language-css .token.string\": {\n            color: \"yellowgreen\",\n          },\n          variable: {\n            color: \"yellowgreen\",\n          },\n          inserted: {\n            color: \"yellowgreen\",\n          },\n          atrule: {\n            color: \"deeppink\",\n          },\n          \"attr-value\": {\n            color: \"deeppink\",\n          },\n          keyword: {\n            color: \"deeppink\",\n          },\n          regex: {\n            color: \"orange\",\n          },\n          important: {\n            color: \"orange\",\n            fontWeight: \"bold\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n          deleted: {\n            color: \"red\",\n          },\n          \"pre.diff-highlight.diff-highlight > code .token.deleted:not(.prefix)\":\n            {\n              backgroundColor: \"rgba(255, 0, 0, .3)\",\n              display: \"inline\",\n            },\n          \"pre > code.diff-highlight.diff-highlight .token.deleted:not(.prefix)\":\n            {\n              backgroundColor: \"rgba(255, 0, 0, .3)\",\n              display: \"inline\",\n            },\n          \"pre.diff-highlight.diff-highlight > code .token.inserted:not(.prefix)\":\n            {\n              backgroundColor: \"rgba(0, 255, 128, .3)\",\n              display: \"inline\",\n            },\n          \"pre > code.diff-highlight.diff-highlight .token.inserted:not(.prefix)\":\n            {\n              backgroundColor: \"rgba(0, 255, 128, .3)\",\n              display: \"inline\",\n            },\n        };\n        e.default = t;\n      })(Fa)),\n    Fa\n  );\n}\nvar Ra = {},\n  R1;\nfunction F4() {\n  return (\n    R1 ||\n      ((R1 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            color: \"#f8f8f2\",\n            background: \"none\",\n            textShadow: \"0 1px rgba(0, 0, 0, 0.3)\",\n            fontFamily:\n              \"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace\",\n            fontSize: \"1em\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            color: \"#f8f8f2\",\n            background: \"#272822\",\n            textShadow: \"0 1px rgba(0, 0, 0, 0.3)\",\n            fontFamily:\n              \"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace\",\n            fontSize: \"1em\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            padding: \"1em\",\n            margin: \".5em 0\",\n            overflow: \"auto\",\n            borderRadius: \"0.3em\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            background: \"#272822\",\n            padding: \".1em\",\n            borderRadius: \".3em\",\n            whiteSpace: \"normal\",\n          },\n          comment: {\n            color: \"#8292a2\",\n          },\n          prolog: {\n            color: \"#8292a2\",\n          },\n          doctype: {\n            color: \"#8292a2\",\n          },\n          cdata: {\n            color: \"#8292a2\",\n          },\n          punctuation: {\n            color: \"#f8f8f2\",\n          },\n          namespace: {\n            Opacity: \".7\",\n          },\n          property: {\n            color: \"#f92672\",\n          },\n          tag: {\n            color: \"#f92672\",\n          },\n          constant: {\n            color: \"#f92672\",\n          },\n          symbol: {\n            color: \"#f92672\",\n          },\n          deleted: {\n            color: \"#f92672\",\n          },\n          boolean: {\n            color: \"#ae81ff\",\n          },\n          number: {\n            color: \"#ae81ff\",\n          },\n          selector: {\n            color: \"#a6e22e\",\n          },\n          \"attr-name\": {\n            color: \"#a6e22e\",\n          },\n          string: {\n            color: \"#a6e22e\",\n          },\n          char: {\n            color: \"#a6e22e\",\n          },\n          builtin: {\n            color: \"#a6e22e\",\n          },\n          inserted: {\n            color: \"#a6e22e\",\n          },\n          operator: {\n            color: \"#f8f8f2\",\n          },\n          entity: {\n            color: \"#f8f8f2\",\n            cursor: \"help\",\n          },\n          url: {\n            color: \"#f8f8f2\",\n          },\n          \".language-css .token.string\": {\n            color: \"#f8f8f2\",\n          },\n          \".style .token.string\": {\n            color: \"#f8f8f2\",\n          },\n          variable: {\n            color: \"#f8f8f2\",\n          },\n          atrule: {\n            color: \"#e6db74\",\n          },\n          \"attr-value\": {\n            color: \"#e6db74\",\n          },\n          function: {\n            color: \"#e6db74\",\n          },\n          \"class-name\": {\n            color: \"#e6db74\",\n          },\n          keyword: {\n            color: \"#66d9ef\",\n          },\n          regex: {\n            color: \"#fd971f\",\n          },\n          important: {\n            color: \"#fd971f\",\n            fontWeight: \"bold\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n        };\n        e.default = t;\n      })(Ra)),\n    Ra\n  );\n}\nvar Ia = {},\n  I1;\nfunction R4() {\n  return (\n    I1 ||\n      ((I1 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            color: \"#657b83\",\n            fontFamily:\n              \"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace\",\n            fontSize: \"1em\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            color: \"#657b83\",\n            fontFamily:\n              \"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace\",\n            fontSize: \"1em\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            padding: \"1em\",\n            margin: \".5em 0\",\n            overflow: \"auto\",\n            borderRadius: \"0.3em\",\n            backgroundColor: \"#fdf6e3\",\n          },\n          'pre[class*=\"language-\"]::-moz-selection': {\n            background: \"#073642\",\n          },\n          'pre[class*=\"language-\"] ::-moz-selection': {\n            background: \"#073642\",\n          },\n          'code[class*=\"language-\"]::-moz-selection': {\n            background: \"#073642\",\n          },\n          'code[class*=\"language-\"] ::-moz-selection': {\n            background: \"#073642\",\n          },\n          'pre[class*=\"language-\"]::selection': {\n            background: \"#073642\",\n          },\n          'pre[class*=\"language-\"] ::selection': {\n            background: \"#073642\",\n          },\n          'code[class*=\"language-\"]::selection': {\n            background: \"#073642\",\n          },\n          'code[class*=\"language-\"] ::selection': {\n            background: \"#073642\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            backgroundColor: \"#fdf6e3\",\n            padding: \".1em\",\n            borderRadius: \".3em\",\n          },\n          comment: {\n            color: \"#93a1a1\",\n          },\n          prolog: {\n            color: \"#93a1a1\",\n          },\n          doctype: {\n            color: \"#93a1a1\",\n          },\n          cdata: {\n            color: \"#93a1a1\",\n          },\n          punctuation: {\n            color: \"#586e75\",\n          },\n          namespace: {\n            Opacity: \".7\",\n          },\n          property: {\n            color: \"#268bd2\",\n          },\n          tag: {\n            color: \"#268bd2\",\n          },\n          boolean: {\n            color: \"#268bd2\",\n          },\n          number: {\n            color: \"#268bd2\",\n          },\n          constant: {\n            color: \"#268bd2\",\n          },\n          symbol: {\n            color: \"#268bd2\",\n          },\n          deleted: {\n            color: \"#268bd2\",\n          },\n          selector: {\n            color: \"#2aa198\",\n          },\n          \"attr-name\": {\n            color: \"#2aa198\",\n          },\n          string: {\n            color: \"#2aa198\",\n          },\n          char: {\n            color: \"#2aa198\",\n          },\n          builtin: {\n            color: \"#2aa198\",\n          },\n          url: {\n            color: \"#2aa198\",\n          },\n          inserted: {\n            color: \"#2aa198\",\n          },\n          entity: {\n            color: \"#657b83\",\n            background: \"#eee8d5\",\n            cursor: \"help\",\n          },\n          atrule: {\n            color: \"#859900\",\n          },\n          \"attr-value\": {\n            color: \"#859900\",\n          },\n          keyword: {\n            color: \"#859900\",\n          },\n          function: {\n            color: \"#b58900\",\n          },\n          \"class-name\": {\n            color: \"#b58900\",\n          },\n          regex: {\n            color: \"#cb4b16\",\n          },\n          important: {\n            color: \"#cb4b16\",\n            fontWeight: \"bold\",\n          },\n          variable: {\n            color: \"#cb4b16\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n        };\n        e.default = t;\n      })(Ia)),\n    Ia\n  );\n}\nvar Ha = {},\n  H1;\nfunction I4() {\n  return (\n    H1 ||\n      ((H1 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            color: \"#ccc\",\n            background: \"none\",\n            fontFamily:\n              \"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace\",\n            fontSize: \"1em\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            color: \"#ccc\",\n            background: \"#2d2d2d\",\n            fontFamily:\n              \"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace\",\n            fontSize: \"1em\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            padding: \"1em\",\n            margin: \".5em 0\",\n            overflow: \"auto\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            background: \"#2d2d2d\",\n            padding: \".1em\",\n            borderRadius: \".3em\",\n            whiteSpace: \"normal\",\n          },\n          comment: {\n            color: \"#999\",\n          },\n          \"block-comment\": {\n            color: \"#999\",\n          },\n          prolog: {\n            color: \"#999\",\n          },\n          doctype: {\n            color: \"#999\",\n          },\n          cdata: {\n            color: \"#999\",\n          },\n          punctuation: {\n            color: \"#ccc\",\n          },\n          tag: {\n            color: \"#e2777a\",\n          },\n          \"attr-name\": {\n            color: \"#e2777a\",\n          },\n          namespace: {\n            color: \"#e2777a\",\n          },\n          deleted: {\n            color: \"#e2777a\",\n          },\n          \"function-name\": {\n            color: \"#6196cc\",\n          },\n          boolean: {\n            color: \"#f08d49\",\n          },\n          number: {\n            color: \"#f08d49\",\n          },\n          function: {\n            color: \"#f08d49\",\n          },\n          property: {\n            color: \"#f8c555\",\n          },\n          \"class-name\": {\n            color: \"#f8c555\",\n          },\n          constant: {\n            color: \"#f8c555\",\n          },\n          symbol: {\n            color: \"#f8c555\",\n          },\n          selector: {\n            color: \"#cc99cd\",\n          },\n          important: {\n            color: \"#cc99cd\",\n            fontWeight: \"bold\",\n          },\n          atrule: {\n            color: \"#cc99cd\",\n          },\n          keyword: {\n            color: \"#cc99cd\",\n          },\n          builtin: {\n            color: \"#cc99cd\",\n          },\n          string: {\n            color: \"#7ec699\",\n          },\n          char: {\n            color: \"#7ec699\",\n          },\n          \"attr-value\": {\n            color: \"#7ec699\",\n          },\n          regex: {\n            color: \"#7ec699\",\n          },\n          variable: {\n            color: \"#7ec699\",\n          },\n          operator: {\n            color: \"#67cdcc\",\n          },\n          entity: {\n            color: \"#67cdcc\",\n            cursor: \"help\",\n          },\n          url: {\n            color: \"#67cdcc\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n          inserted: {\n            color: \"green\",\n          },\n        };\n        e.default = t;\n      })(Ha)),\n    Ha\n  );\n}\nvar za = {},\n  z1;\nfunction H4() {\n  return (\n    z1 ||\n      ((z1 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            color: \"white\",\n            background: \"none\",\n            fontFamily:\n              \"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace\",\n            fontSize: \"1em\",\n            textAlign: \"left\",\n            textShadow: \"0 -.1em .2em black\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            color: \"white\",\n            background: \"hsl(0, 0%, 8%)\",\n            fontFamily:\n              \"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace\",\n            fontSize: \"1em\",\n            textAlign: \"left\",\n            textShadow: \"0 -.1em .2em black\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            borderRadius: \".5em\",\n            border: \".3em solid hsl(0, 0%, 33%)\",\n            boxShadow: \"1px 1px .5em black inset\",\n            margin: \".5em 0\",\n            overflow: \"auto\",\n            padding: \"1em\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            background: \"hsl(0, 0%, 8%)\",\n            borderRadius: \".3em\",\n            border: \".13em solid hsl(0, 0%, 33%)\",\n            boxShadow: \"1px 1px .3em -.1em black inset\",\n            padding: \".15em .2em .05em\",\n            whiteSpace: \"normal\",\n          },\n          'pre[class*=\"language-\"]::-moz-selection': {\n            background: \"hsla(0, 0%, 93%, 0.15)\",\n            textShadow: \"none\",\n          },\n          'pre[class*=\"language-\"]::selection': {\n            background: \"hsla(0, 0%, 93%, 0.15)\",\n            textShadow: \"none\",\n          },\n          'pre[class*=\"language-\"] ::-moz-selection': {\n            textShadow: \"none\",\n            background: \"hsla(0, 0%, 93%, 0.15)\",\n          },\n          'code[class*=\"language-\"]::-moz-selection': {\n            textShadow: \"none\",\n            background: \"hsla(0, 0%, 93%, 0.15)\",\n          },\n          'code[class*=\"language-\"] ::-moz-selection': {\n            textShadow: \"none\",\n            background: \"hsla(0, 0%, 93%, 0.15)\",\n          },\n          'pre[class*=\"language-\"] ::selection': {\n            textShadow: \"none\",\n            background: \"hsla(0, 0%, 93%, 0.15)\",\n          },\n          'code[class*=\"language-\"]::selection': {\n            textShadow: \"none\",\n            background: \"hsla(0, 0%, 93%, 0.15)\",\n          },\n          'code[class*=\"language-\"] ::selection': {\n            textShadow: \"none\",\n            background: \"hsla(0, 0%, 93%, 0.15)\",\n          },\n          comment: {\n            color: \"hsl(0, 0%, 47%)\",\n          },\n          prolog: {\n            color: \"hsl(0, 0%, 47%)\",\n          },\n          doctype: {\n            color: \"hsl(0, 0%, 47%)\",\n          },\n          cdata: {\n            color: \"hsl(0, 0%, 47%)\",\n          },\n          punctuation: {\n            Opacity: \".7\",\n          },\n          namespace: {\n            Opacity: \".7\",\n          },\n          tag: {\n            color: \"hsl(14, 58%, 55%)\",\n          },\n          boolean: {\n            color: \"hsl(14, 58%, 55%)\",\n          },\n          number: {\n            color: \"hsl(14, 58%, 55%)\",\n          },\n          deleted: {\n            color: \"hsl(14, 58%, 55%)\",\n          },\n          keyword: {\n            color: \"hsl(53, 89%, 79%)\",\n          },\n          property: {\n            color: \"hsl(53, 89%, 79%)\",\n          },\n          selector: {\n            color: \"hsl(53, 89%, 79%)\",\n          },\n          constant: {\n            color: \"hsl(53, 89%, 79%)\",\n          },\n          symbol: {\n            color: \"hsl(53, 89%, 79%)\",\n          },\n          builtin: {\n            color: \"hsl(53, 89%, 79%)\",\n          },\n          \"attr-name\": {\n            color: \"hsl(76, 21%, 52%)\",\n          },\n          \"attr-value\": {\n            color: \"hsl(76, 21%, 52%)\",\n          },\n          string: {\n            color: \"hsl(76, 21%, 52%)\",\n          },\n          char: {\n            color: \"hsl(76, 21%, 52%)\",\n          },\n          operator: {\n            color: \"hsl(76, 21%, 52%)\",\n          },\n          entity: {\n            color: \"hsl(76, 21%, 52%)\",\n            cursor: \"help\",\n          },\n          url: {\n            color: \"hsl(76, 21%, 52%)\",\n          },\n          \".language-css .token.string\": {\n            color: \"hsl(76, 21%, 52%)\",\n          },\n          \".style .token.string\": {\n            color: \"hsl(76, 21%, 52%)\",\n          },\n          variable: {\n            color: \"hsl(76, 21%, 52%)\",\n          },\n          inserted: {\n            color: \"hsl(76, 21%, 52%)\",\n          },\n          atrule: {\n            color: \"hsl(218, 22%, 55%)\",\n          },\n          regex: {\n            color: \"hsl(42, 75%, 65%)\",\n          },\n          important: {\n            color: \"hsl(42, 75%, 65%)\",\n            fontWeight: \"bold\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n          \".language-markup .token.tag\": {\n            color: \"hsl(33, 33%, 52%)\",\n          },\n          \".language-markup .token.attr-name\": {\n            color: \"hsl(33, 33%, 52%)\",\n          },\n          \".language-markup .token.punctuation\": {\n            color: \"hsl(33, 33%, 52%)\",\n          },\n          \"\": {\n            position: \"relative\",\n            zIndex: \"1\",\n          },\n          \".line-highlight.line-highlight\": {\n            background:\n              \"linear-gradient(to right, hsla(0, 0%, 33%, .1) 70%, hsla(0, 0%, 33%, 0))\",\n            borderBottom: \"1px dashed hsl(0, 0%, 33%)\",\n            borderTop: \"1px dashed hsl(0, 0%, 33%)\",\n            marginTop: \"0.75em\",\n            zIndex: \"0\",\n          },\n          \".line-highlight.line-highlight:before\": {\n            backgroundColor: \"hsl(215, 15%, 59%)\",\n            color: \"hsl(24, 20%, 95%)\",\n          },\n          \".line-highlight.line-highlight[data-end]:after\": {\n            backgroundColor: \"hsl(215, 15%, 59%)\",\n            color: \"hsl(24, 20%, 95%)\",\n          },\n        };\n        e.default = t;\n      })(za)),\n    za\n  );\n}\nvar Pa = {},\n  P1;\nfunction z4() {\n  return (\n    P1 ||\n      ((P1 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            color: \"black\",\n            background: \"none\",\n            textShadow: \"0 1px white\",\n            fontFamily:\n              \"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace\",\n            fontSize: \"1em\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            color: \"black\",\n            background: \"#f5f2f0\",\n            textShadow: \"0 1px white\",\n            fontFamily:\n              \"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace\",\n            fontSize: \"1em\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            padding: \"1em\",\n            margin: \".5em 0\",\n            overflow: \"auto\",\n          },\n          'pre[class*=\"language-\"]::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#b3d4fc\",\n          },\n          'pre[class*=\"language-\"] ::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#b3d4fc\",\n          },\n          'code[class*=\"language-\"]::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#b3d4fc\",\n          },\n          'code[class*=\"language-\"] ::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#b3d4fc\",\n          },\n          'pre[class*=\"language-\"]::selection': {\n            textShadow: \"none\",\n            background: \"#b3d4fc\",\n          },\n          'pre[class*=\"language-\"] ::selection': {\n            textShadow: \"none\",\n            background: \"#b3d4fc\",\n          },\n          'code[class*=\"language-\"]::selection': {\n            textShadow: \"none\",\n            background: \"#b3d4fc\",\n          },\n          'code[class*=\"language-\"] ::selection': {\n            textShadow: \"none\",\n            background: \"#b3d4fc\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            background: \"#f5f2f0\",\n            padding: \".1em\",\n            borderRadius: \".3em\",\n            whiteSpace: \"normal\",\n          },\n          comment: {\n            color: \"slategray\",\n          },\n          prolog: {\n            color: \"slategray\",\n          },\n          doctype: {\n            color: \"slategray\",\n          },\n          cdata: {\n            color: \"slategray\",\n          },\n          punctuation: {\n            color: \"#999\",\n          },\n          namespace: {\n            Opacity: \".7\",\n          },\n          property: {\n            color: \"#905\",\n          },\n          tag: {\n            color: \"#905\",\n          },\n          boolean: {\n            color: \"#905\",\n          },\n          number: {\n            color: \"#905\",\n          },\n          constant: {\n            color: \"#905\",\n          },\n          symbol: {\n            color: \"#905\",\n          },\n          deleted: {\n            color: \"#905\",\n          },\n          selector: {\n            color: \"#690\",\n          },\n          \"attr-name\": {\n            color: \"#690\",\n          },\n          string: {\n            color: \"#690\",\n          },\n          char: {\n            color: \"#690\",\n          },\n          builtin: {\n            color: \"#690\",\n          },\n          inserted: {\n            color: \"#690\",\n          },\n          operator: {\n            color: \"#9a6e3a\",\n            background: \"hsla(0, 0%, 100%, .5)\",\n          },\n          entity: {\n            color: \"#9a6e3a\",\n            background: \"hsla(0, 0%, 100%, .5)\",\n            cursor: \"help\",\n          },\n          url: {\n            color: \"#9a6e3a\",\n            background: \"hsla(0, 0%, 100%, .5)\",\n          },\n          \".language-css .token.string\": {\n            color: \"#9a6e3a\",\n            background: \"hsla(0, 0%, 100%, .5)\",\n          },\n          \".style .token.string\": {\n            color: \"#9a6e3a\",\n            background: \"hsla(0, 0%, 100%, .5)\",\n          },\n          atrule: {\n            color: \"#07a\",\n          },\n          \"attr-value\": {\n            color: \"#07a\",\n          },\n          keyword: {\n            color: \"#07a\",\n          },\n          function: {\n            color: \"#DD4A68\",\n          },\n          \"class-name\": {\n            color: \"#DD4A68\",\n          },\n          regex: {\n            color: \"#e90\",\n          },\n          important: {\n            color: \"#e90\",\n            fontWeight: \"bold\",\n          },\n          variable: {\n            color: \"#e90\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n        };\n        e.default = t;\n      })(Pa)),\n    Pa\n  );\n}\nvar Ba = {},\n  B1;\nfunction P4() {\n  return (\n    B1 ||\n      ((B1 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            color: \"#f8f8f2\",\n            background: \"none\",\n            fontFamily:\n              \"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            color: \"#f8f8f2\",\n            background: \"#2b2b2b\",\n            fontFamily:\n              \"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            padding: \"1em\",\n            margin: \"0.5em 0\",\n            overflow: \"auto\",\n            borderRadius: \"0.3em\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            background: \"#2b2b2b\",\n            padding: \"0.1em\",\n            borderRadius: \"0.3em\",\n            whiteSpace: \"normal\",\n          },\n          comment: {\n            color: \"#d4d0ab\",\n          },\n          prolog: {\n            color: \"#d4d0ab\",\n          },\n          doctype: {\n            color: \"#d4d0ab\",\n          },\n          cdata: {\n            color: \"#d4d0ab\",\n          },\n          punctuation: {\n            color: \"#fefefe\",\n          },\n          property: {\n            color: \"#ffa07a\",\n          },\n          tag: {\n            color: \"#ffa07a\",\n          },\n          constant: {\n            color: \"#ffa07a\",\n          },\n          symbol: {\n            color: \"#ffa07a\",\n          },\n          deleted: {\n            color: \"#ffa07a\",\n          },\n          boolean: {\n            color: \"#00e0e0\",\n          },\n          number: {\n            color: \"#00e0e0\",\n          },\n          selector: {\n            color: \"#abe338\",\n          },\n          \"attr-name\": {\n            color: \"#abe338\",\n          },\n          string: {\n            color: \"#abe338\",\n          },\n          char: {\n            color: \"#abe338\",\n          },\n          builtin: {\n            color: \"#abe338\",\n          },\n          inserted: {\n            color: \"#abe338\",\n          },\n          operator: {\n            color: \"#00e0e0\",\n          },\n          entity: {\n            color: \"#00e0e0\",\n            cursor: \"help\",\n          },\n          url: {\n            color: \"#00e0e0\",\n          },\n          \".language-css .token.string\": {\n            color: \"#00e0e0\",\n          },\n          \".style .token.string\": {\n            color: \"#00e0e0\",\n          },\n          variable: {\n            color: \"#00e0e0\",\n          },\n          atrule: {\n            color: \"#ffd700\",\n          },\n          \"attr-value\": {\n            color: \"#ffd700\",\n          },\n          function: {\n            color: \"#ffd700\",\n          },\n          keyword: {\n            color: \"#00e0e0\",\n          },\n          regex: {\n            color: \"#ffd700\",\n          },\n          important: {\n            color: \"#ffd700\",\n            fontWeight: \"bold\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n        };\n        e.default = t;\n      })(Ba)),\n    Ba\n  );\n}\nvar Va = {},\n  V1;\nfunction B4() {\n  return (\n    V1 ||\n      ((V1 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            color: \"#c5c8c6\",\n            textShadow: \"0 1px rgba(0, 0, 0, 0.3)\",\n            fontFamily:\n              \"Inconsolata, Monaco, Consolas, 'Courier New', Courier, monospace\",\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            color: \"#c5c8c6\",\n            textShadow: \"0 1px rgba(0, 0, 0, 0.3)\",\n            fontFamily:\n              \"Inconsolata, Monaco, Consolas, 'Courier New', Courier, monospace\",\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            padding: \"1em\",\n            margin: \".5em 0\",\n            overflow: \"auto\",\n            borderRadius: \"0.3em\",\n            background: \"#1d1f21\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            background: \"#1d1f21\",\n            padding: \".1em\",\n            borderRadius: \".3em\",\n          },\n          comment: {\n            color: \"#7C7C7C\",\n          },\n          prolog: {\n            color: \"#7C7C7C\",\n          },\n          doctype: {\n            color: \"#7C7C7C\",\n          },\n          cdata: {\n            color: \"#7C7C7C\",\n          },\n          punctuation: {\n            color: \"#c5c8c6\",\n          },\n          \".namespace\": {\n            Opacity: \".7\",\n          },\n          property: {\n            color: \"#96CBFE\",\n          },\n          keyword: {\n            color: \"#96CBFE\",\n          },\n          tag: {\n            color: \"#96CBFE\",\n          },\n          \"class-name\": {\n            color: \"#FFFFB6\",\n            textDecoration: \"underline\",\n          },\n          boolean: {\n            color: \"#99CC99\",\n          },\n          constant: {\n            color: \"#99CC99\",\n          },\n          symbol: {\n            color: \"#f92672\",\n          },\n          deleted: {\n            color: \"#f92672\",\n          },\n          number: {\n            color: \"#FF73FD\",\n          },\n          selector: {\n            color: \"#A8FF60\",\n          },\n          \"attr-name\": {\n            color: \"#A8FF60\",\n          },\n          string: {\n            color: \"#A8FF60\",\n          },\n          char: {\n            color: \"#A8FF60\",\n          },\n          builtin: {\n            color: \"#A8FF60\",\n          },\n          inserted: {\n            color: \"#A8FF60\",\n          },\n          variable: {\n            color: \"#C6C5FE\",\n          },\n          operator: {\n            color: \"#EDEDED\",\n          },\n          entity: {\n            color: \"#FFFFB6\",\n            cursor: \"help\",\n          },\n          url: {\n            color: \"#96CBFE\",\n          },\n          \".language-css .token.string\": {\n            color: \"#87C38A\",\n          },\n          \".style .token.string\": {\n            color: \"#87C38A\",\n          },\n          atrule: {\n            color: \"#F9EE98\",\n          },\n          \"attr-value\": {\n            color: \"#F9EE98\",\n          },\n          function: {\n            color: \"#DAD085\",\n          },\n          regex: {\n            color: \"#E9C062\",\n          },\n          important: {\n            color: \"#fd971f\",\n            fontWeight: \"bold\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n        };\n        e.default = t;\n      })(Va)),\n    Va\n  );\n}\nvar $a = {},\n  $1;\nfunction V4() {\n  return (\n    $1 ||\n      (($1 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            fontFamily:\n              'Consolas, Menlo, Monaco, \"Andale Mono WT\", \"Andale Mono\", \"Lucida Console\", \"Lucida Sans Typewriter\", \"DejaVu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Liberation Mono\", \"Nimbus Mono L\", \"Courier New\", Courier, monospace',\n            fontSize: \"14px\",\n            lineHeight: \"1.375\",\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            background: \"#f5f7ff\",\n            color: \"#5e6687\",\n          },\n          'pre[class*=\"language-\"]': {\n            fontFamily:\n              'Consolas, Menlo, Monaco, \"Andale Mono WT\", \"Andale Mono\", \"Lucida Console\", \"Lucida Sans Typewriter\", \"DejaVu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Liberation Mono\", \"Nimbus Mono L\", \"Courier New\", Courier, monospace',\n            fontSize: \"14px\",\n            lineHeight: \"1.375\",\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            background: \"#f5f7ff\",\n            color: \"#5e6687\",\n            padding: \"1em\",\n            margin: \".5em 0\",\n            overflow: \"auto\",\n          },\n          'pre > code[class*=\"language-\"]': {\n            fontSize: \"1em\",\n          },\n          'pre[class*=\"language-\"]::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#dfe2f1\",\n          },\n          'pre[class*=\"language-\"] ::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#dfe2f1\",\n          },\n          'code[class*=\"language-\"]::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#dfe2f1\",\n          },\n          'code[class*=\"language-\"] ::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#dfe2f1\",\n          },\n          'pre[class*=\"language-\"]::selection': {\n            textShadow: \"none\",\n            background: \"#dfe2f1\",\n          },\n          'pre[class*=\"language-\"] ::selection': {\n            textShadow: \"none\",\n            background: \"#dfe2f1\",\n          },\n          'code[class*=\"language-\"]::selection': {\n            textShadow: \"none\",\n            background: \"#dfe2f1\",\n          },\n          'code[class*=\"language-\"] ::selection': {\n            textShadow: \"none\",\n            background: \"#dfe2f1\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            padding: \".1em\",\n            borderRadius: \".3em\",\n          },\n          comment: {\n            color: \"#898ea4\",\n          },\n          prolog: {\n            color: \"#898ea4\",\n          },\n          doctype: {\n            color: \"#898ea4\",\n          },\n          cdata: {\n            color: \"#898ea4\",\n          },\n          punctuation: {\n            color: \"#5e6687\",\n          },\n          namespace: {\n            Opacity: \".7\",\n          },\n          operator: {\n            color: \"#c76b29\",\n          },\n          boolean: {\n            color: \"#c76b29\",\n          },\n          number: {\n            color: \"#c76b29\",\n          },\n          property: {\n            color: \"#c08b30\",\n          },\n          tag: {\n            color: \"#3d8fd1\",\n          },\n          string: {\n            color: \"#22a2c9\",\n          },\n          selector: {\n            color: \"#6679cc\",\n          },\n          \"attr-name\": {\n            color: \"#c76b29\",\n          },\n          entity: {\n            color: \"#22a2c9\",\n            cursor: \"help\",\n          },\n          url: {\n            color: \"#22a2c9\",\n          },\n          \".language-css .token.string\": {\n            color: \"#22a2c9\",\n          },\n          \".style .token.string\": {\n            color: \"#22a2c9\",\n          },\n          \"attr-value\": {\n            color: \"#ac9739\",\n          },\n          keyword: {\n            color: \"#ac9739\",\n          },\n          control: {\n            color: \"#ac9739\",\n          },\n          directive: {\n            color: \"#ac9739\",\n          },\n          unit: {\n            color: \"#ac9739\",\n          },\n          statement: {\n            color: \"#22a2c9\",\n          },\n          regex: {\n            color: \"#22a2c9\",\n          },\n          atrule: {\n            color: \"#22a2c9\",\n          },\n          placeholder: {\n            color: \"#3d8fd1\",\n          },\n          variable: {\n            color: \"#3d8fd1\",\n          },\n          deleted: {\n            textDecoration: \"line-through\",\n          },\n          inserted: {\n            borderBottom: \"1px dotted #202746\",\n            textDecoration: \"none\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n          important: {\n            fontWeight: \"bold\",\n            color: \"#c94922\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          \"pre > code.highlight\": {\n            Outline: \"0.4em solid #c94922\",\n            OutlineOffset: \".4em\",\n          },\n          \".line-numbers.line-numbers .line-numbers-rows\": {\n            borderRightColor: \"#dfe2f1\",\n          },\n          \".line-numbers .line-numbers-rows > span:before\": {\n            color: \"#979db4\",\n          },\n          \".line-highlight.line-highlight\": {\n            background:\n              \"linear-gradient(to right, rgba(107, 115, 148, 0.2) 70%, rgba(107, 115, 148, 0))\",\n          },\n        };\n        e.default = t;\n      })($a)),\n    $a\n  );\n}\nvar Wa = {},\n  W1;\nfunction $4() {\n  return (\n    W1 ||\n      ((W1 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            color: \"#fff\",\n            textShadow: \"0 1px 1px #000\",\n            fontFamily: 'Menlo, Monaco, \"Courier New\", monospace',\n            direction: \"ltr\",\n            textAlign: \"left\",\n            wordSpacing: \"normal\",\n            whiteSpace: \"pre\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.4\",\n            background: \"none\",\n            border: \"0\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            color: \"#fff\",\n            textShadow: \"0 1px 1px #000\",\n            fontFamily: 'Menlo, Monaco, \"Courier New\", monospace',\n            direction: \"ltr\",\n            textAlign: \"left\",\n            wordSpacing: \"normal\",\n            whiteSpace: \"pre\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.4\",\n            background: \"#222\",\n            border: \"0\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            padding: \"15px\",\n            margin: \"1em 0\",\n            overflow: \"auto\",\n            MozBorderRadius: \"8px\",\n            WebkitBorderRadius: \"8px\",\n            borderRadius: \"8px\",\n          },\n          'pre[class*=\"language-\"] code': {\n            float: \"left\",\n            padding: \"0 15px 0 0\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            background: \"#222\",\n            padding: \"5px 10px\",\n            lineHeight: \"1\",\n            MozBorderRadius: \"3px\",\n            WebkitBorderRadius: \"3px\",\n            borderRadius: \"3px\",\n          },\n          comment: {\n            color: \"#797979\",\n          },\n          prolog: {\n            color: \"#797979\",\n          },\n          doctype: {\n            color: \"#797979\",\n          },\n          cdata: {\n            color: \"#797979\",\n          },\n          selector: {\n            color: \"#fff\",\n          },\n          operator: {\n            color: \"#fff\",\n          },\n          punctuation: {\n            color: \"#fff\",\n          },\n          namespace: {\n            Opacity: \".7\",\n          },\n          tag: {\n            color: \"#ffd893\",\n          },\n          boolean: {\n            color: \"#ffd893\",\n          },\n          atrule: {\n            color: \"#B0C975\",\n          },\n          \"attr-value\": {\n            color: \"#B0C975\",\n          },\n          hex: {\n            color: \"#B0C975\",\n          },\n          string: {\n            color: \"#B0C975\",\n          },\n          property: {\n            color: \"#c27628\",\n          },\n          entity: {\n            color: \"#c27628\",\n            cursor: \"help\",\n          },\n          url: {\n            color: \"#c27628\",\n          },\n          \"attr-name\": {\n            color: \"#c27628\",\n          },\n          keyword: {\n            color: \"#c27628\",\n          },\n          regex: {\n            color: \"#9B71C6\",\n          },\n          function: {\n            color: \"#e5a638\",\n          },\n          constant: {\n            color: \"#e5a638\",\n          },\n          variable: {\n            color: \"#fdfba8\",\n          },\n          number: {\n            color: \"#8799B0\",\n          },\n          important: {\n            color: \"#E45734\",\n          },\n          deliminator: {\n            color: \"#E45734\",\n          },\n          \".line-highlight.line-highlight\": {\n            background: \"rgba(255, 255, 255, .2)\",\n          },\n          \".line-highlight.line-highlight:before\": {\n            top: \".3em\",\n            backgroundColor: \"rgba(255, 255, 255, .3)\",\n            color: \"#fff\",\n            MozBorderRadius: \"8px\",\n            WebkitBorderRadius: \"8px\",\n            borderRadius: \"8px\",\n          },\n          \".line-highlight.line-highlight[data-end]:after\": {\n            top: \".3em\",\n            backgroundColor: \"rgba(255, 255, 255, .3)\",\n            color: \"#fff\",\n            MozBorderRadius: \"8px\",\n            WebkitBorderRadius: \"8px\",\n            borderRadius: \"8px\",\n          },\n          \".line-numbers .line-numbers-rows > span\": {\n            borderRight: \"3px #d9d336 solid\",\n          },\n        };\n        e.default = t;\n      })(Wa)),\n    Wa\n  );\n}\nvar Za = {},\n  Z1;\nfunction W4() {\n  return (\n    Z1 ||\n      ((Z1 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            color: \"#111b27\",\n            background: \"none\",\n            fontFamily:\n              'Consolas, Monaco, \"Andale Mono\", \"Ubuntu Mono\", monospace',\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            color: \"#111b27\",\n            background: \"#e3eaf2\",\n            fontFamily:\n              'Consolas, Monaco, \"Andale Mono\", \"Ubuntu Mono\", monospace',\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            padding: \"1em\",\n            margin: \"0.5em 0\",\n            overflow: \"auto\",\n          },\n          'pre[class*=\"language-\"]::-moz-selection': {\n            background: \"#8da1b9\",\n          },\n          'pre[class*=\"language-\"] ::-moz-selection': {\n            background: \"#8da1b9\",\n          },\n          'code[class*=\"language-\"]::-moz-selection': {\n            background: \"#8da1b9\",\n          },\n          'code[class*=\"language-\"] ::-moz-selection': {\n            background: \"#8da1b9\",\n          },\n          'pre[class*=\"language-\"]::selection': {\n            background: \"#8da1b9\",\n          },\n          'pre[class*=\"language-\"] ::selection': {\n            background: \"#8da1b9\",\n          },\n          'code[class*=\"language-\"]::selection': {\n            background: \"#8da1b9\",\n          },\n          'code[class*=\"language-\"] ::selection': {\n            background: \"#8da1b9\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            background: \"#e3eaf2\",\n            padding: \"0.1em 0.3em\",\n            borderRadius: \"0.3em\",\n            whiteSpace: \"normal\",\n          },\n          comment: {\n            color: \"#3c526d\",\n          },\n          prolog: {\n            color: \"#3c526d\",\n          },\n          doctype: {\n            color: \"#3c526d\",\n          },\n          cdata: {\n            color: \"#3c526d\",\n          },\n          punctuation: {\n            color: \"#111b27\",\n          },\n          \"delimiter.important\": {\n            color: \"#006d6d\",\n            fontWeight: \"inherit\",\n          },\n          \"selector.parent\": {\n            color: \"#006d6d\",\n          },\n          tag: {\n            color: \"#006d6d\",\n          },\n          \"tag.punctuation\": {\n            color: \"#006d6d\",\n          },\n          \"attr-name\": {\n            color: \"#755f00\",\n          },\n          boolean: {\n            color: \"#755f00\",\n          },\n          \"boolean.important\": {\n            color: \"#755f00\",\n          },\n          number: {\n            color: \"#755f00\",\n          },\n          constant: {\n            color: \"#755f00\",\n          },\n          \"selector.attribute\": {\n            color: \"#755f00\",\n          },\n          \"class-name\": {\n            color: \"#005a8e\",\n          },\n          key: {\n            color: \"#005a8e\",\n          },\n          parameter: {\n            color: \"#005a8e\",\n          },\n          property: {\n            color: \"#005a8e\",\n          },\n          \"property-access\": {\n            color: \"#005a8e\",\n          },\n          variable: {\n            color: \"#005a8e\",\n          },\n          \"attr-value\": {\n            color: \"#116b00\",\n          },\n          inserted: {\n            color: \"#116b00\",\n          },\n          color: {\n            color: \"#116b00\",\n          },\n          \"selector.value\": {\n            color: \"#116b00\",\n          },\n          string: {\n            color: \"#116b00\",\n          },\n          \"string.url-link\": {\n            color: \"#116b00\",\n          },\n          builtin: {\n            color: \"#af00af\",\n          },\n          \"keyword-array\": {\n            color: \"#af00af\",\n          },\n          package: {\n            color: \"#af00af\",\n          },\n          regex: {\n            color: \"#af00af\",\n          },\n          function: {\n            color: \"#7c00aa\",\n          },\n          \"selector.class\": {\n            color: \"#7c00aa\",\n          },\n          \"selector.id\": {\n            color: \"#7c00aa\",\n          },\n          \"atrule.rule\": {\n            color: \"#a04900\",\n          },\n          combinator: {\n            color: \"#a04900\",\n          },\n          keyword: {\n            color: \"#a04900\",\n          },\n          operator: {\n            color: \"#a04900\",\n          },\n          \"pseudo-class\": {\n            color: \"#a04900\",\n          },\n          \"pseudo-element\": {\n            color: \"#a04900\",\n          },\n          selector: {\n            color: \"#a04900\",\n          },\n          unit: {\n            color: \"#a04900\",\n          },\n          deleted: {\n            color: \"#c22f2e\",\n          },\n          important: {\n            color: \"#c22f2e\",\n            fontWeight: \"bold\",\n          },\n          \"keyword-this\": {\n            color: \"#005a8e\",\n            fontWeight: \"bold\",\n          },\n          this: {\n            color: \"#005a8e\",\n            fontWeight: \"bold\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n          entity: {\n            cursor: \"help\",\n          },\n          \".language-markdown .token.title\": {\n            color: \"#005a8e\",\n            fontWeight: \"bold\",\n          },\n          \".language-markdown .token.title .token.punctuation\": {\n            color: \"#005a8e\",\n            fontWeight: \"bold\",\n          },\n          \".language-markdown .token.blockquote.punctuation\": {\n            color: \"#af00af\",\n          },\n          \".language-markdown .token.code\": {\n            color: \"#006d6d\",\n          },\n          \".language-markdown .token.hr.punctuation\": {\n            color: \"#005a8e\",\n          },\n          \".language-markdown .token.url > .token.content\": {\n            color: \"#116b00\",\n          },\n          \".language-markdown .token.url-link\": {\n            color: \"#755f00\",\n          },\n          \".language-markdown .token.list.punctuation\": {\n            color: \"#af00af\",\n          },\n          \".language-markdown .token.table-header\": {\n            color: \"#111b27\",\n          },\n          \".language-json .token.operator\": {\n            color: \"#111b27\",\n          },\n          \".language-scss .token.variable\": {\n            color: \"#006d6d\",\n          },\n          \"token.tab:not(:empty):before\": {\n            color: \"#3c526d\",\n          },\n          \"token.cr:before\": {\n            color: \"#3c526d\",\n          },\n          \"token.lf:before\": {\n            color: \"#3c526d\",\n          },\n          \"token.space:before\": {\n            color: \"#3c526d\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a\": {\n            color: \"#e3eaf2\",\n            background: \"#005a8e\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button\": {\n            color: \"#e3eaf2\",\n            background: \"#005a8e\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover\": {\n            color: \"#e3eaf2\",\n            background: \"#005a8eda\",\n            textDecoration: \"none\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus\": {\n            color: \"#e3eaf2\",\n            background: \"#005a8eda\",\n            textDecoration: \"none\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover\":\n            {\n              color: \"#e3eaf2\",\n              background: \"#005a8eda\",\n              textDecoration: \"none\",\n            },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus\":\n            {\n              color: \"#e3eaf2\",\n              background: \"#005a8eda\",\n              textDecoration: \"none\",\n            },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span\": {\n            color: \"#e3eaf2\",\n            background: \"#3c526d\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover\": {\n            color: \"#e3eaf2\",\n            background: \"#3c526d\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus\": {\n            color: \"#e3eaf2\",\n            background: \"#3c526d\",\n          },\n          \".line-highlight.line-highlight\": {\n            background: \"linear-gradient(to right, #8da1b92f 70%, #8da1b925)\",\n          },\n          \".line-highlight.line-highlight:before\": {\n            backgroundColor: \"#3c526d\",\n            color: \"#e3eaf2\",\n            boxShadow: \"0 1px #8da1b9\",\n          },\n          \".line-highlight.line-highlight[data-end]:after\": {\n            backgroundColor: \"#3c526d\",\n            color: \"#e3eaf2\",\n            boxShadow: \"0 1px #8da1b9\",\n          },\n          \"pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before\":\n            {\n              backgroundColor: \"#3c526d1f\",\n            },\n          \".line-numbers.line-numbers .line-numbers-rows\": {\n            borderRight: \"1px solid #8da1b97a\",\n            background: \"#d0dae77a\",\n          },\n          \".line-numbers .line-numbers-rows > span:before\": {\n            color: \"#3c526dda\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-1\": {\n            color: \"#755f00\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-5\": {\n            color: \"#755f00\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-9\": {\n            color: \"#755f00\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-2\": {\n            color: \"#af00af\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-6\": {\n            color: \"#af00af\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-10\": {\n            color: \"#af00af\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-3\": {\n            color: \"#005a8e\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-7\": {\n            color: \"#005a8e\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-11\": {\n            color: \"#005a8e\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-4\": {\n            color: \"#7c00aa\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-8\": {\n            color: \"#7c00aa\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-12\": {\n            color: \"#7c00aa\",\n          },\n          \"pre.diff-highlight > code .token.token.deleted:not(.prefix)\": {\n            backgroundColor: \"#c22f2e1f\",\n          },\n          \"pre > code.diff-highlight .token.token.deleted:not(.prefix)\": {\n            backgroundColor: \"#c22f2e1f\",\n          },\n          \"pre.diff-highlight > code .token.token.inserted:not(.prefix)\": {\n            backgroundColor: \"#116b001f\",\n          },\n          \"pre > code.diff-highlight .token.token.inserted:not(.prefix)\": {\n            backgroundColor: \"#116b001f\",\n          },\n          \".command-line .command-line-prompt\": {\n            borderRight: \"1px solid #8da1b97a\",\n          },\n          \".command-line .command-line-prompt > span:before\": {\n            color: \"#3c526dda\",\n          },\n        };\n        e.default = t;\n      })(Za)),\n    Za\n  );\n}\nvar Ua = {},\n  U1;\nfunction Z4() {\n  return (\n    U1 ||\n      ((U1 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            color: \"#e3eaf2\",\n            background: \"none\",\n            fontFamily:\n              'Consolas, Monaco, \"Andale Mono\", \"Ubuntu Mono\", monospace',\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            color: \"#e3eaf2\",\n            background: \"#111b27\",\n            fontFamily:\n              'Consolas, Monaco, \"Andale Mono\", \"Ubuntu Mono\", monospace',\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            padding: \"1em\",\n            margin: \"0.5em 0\",\n            overflow: \"auto\",\n          },\n          'pre[class*=\"language-\"]::-moz-selection': {\n            background: \"#3c526d\",\n          },\n          'pre[class*=\"language-\"] ::-moz-selection': {\n            background: \"#3c526d\",\n          },\n          'code[class*=\"language-\"]::-moz-selection': {\n            background: \"#3c526d\",\n          },\n          'code[class*=\"language-\"] ::-moz-selection': {\n            background: \"#3c526d\",\n          },\n          'pre[class*=\"language-\"]::selection': {\n            background: \"#3c526d\",\n          },\n          'pre[class*=\"language-\"] ::selection': {\n            background: \"#3c526d\",\n          },\n          'code[class*=\"language-\"]::selection': {\n            background: \"#3c526d\",\n          },\n          'code[class*=\"language-\"] ::selection': {\n            background: \"#3c526d\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            background: \"#111b27\",\n            padding: \"0.1em 0.3em\",\n            borderRadius: \"0.3em\",\n            whiteSpace: \"normal\",\n          },\n          comment: {\n            color: \"#8da1b9\",\n          },\n          prolog: {\n            color: \"#8da1b9\",\n          },\n          doctype: {\n            color: \"#8da1b9\",\n          },\n          cdata: {\n            color: \"#8da1b9\",\n          },\n          punctuation: {\n            color: \"#e3eaf2\",\n          },\n          \"delimiter.important\": {\n            color: \"#66cccc\",\n            fontWeight: \"inherit\",\n          },\n          \"selector.parent\": {\n            color: \"#66cccc\",\n          },\n          tag: {\n            color: \"#66cccc\",\n          },\n          \"tag.punctuation\": {\n            color: \"#66cccc\",\n          },\n          \"attr-name\": {\n            color: \"#e6d37a\",\n          },\n          boolean: {\n            color: \"#e6d37a\",\n          },\n          \"boolean.important\": {\n            color: \"#e6d37a\",\n          },\n          number: {\n            color: \"#e6d37a\",\n          },\n          constant: {\n            color: \"#e6d37a\",\n          },\n          \"selector.attribute\": {\n            color: \"#e6d37a\",\n          },\n          \"class-name\": {\n            color: \"#6cb8e6\",\n          },\n          key: {\n            color: \"#6cb8e6\",\n          },\n          parameter: {\n            color: \"#6cb8e6\",\n          },\n          property: {\n            color: \"#6cb8e6\",\n          },\n          \"property-access\": {\n            color: \"#6cb8e6\",\n          },\n          variable: {\n            color: \"#6cb8e6\",\n          },\n          \"attr-value\": {\n            color: \"#91d076\",\n          },\n          inserted: {\n            color: \"#91d076\",\n          },\n          color: {\n            color: \"#91d076\",\n          },\n          \"selector.value\": {\n            color: \"#91d076\",\n          },\n          string: {\n            color: \"#91d076\",\n          },\n          \"string.url-link\": {\n            color: \"#91d076\",\n          },\n          builtin: {\n            color: \"#f4adf4\",\n          },\n          \"keyword-array\": {\n            color: \"#f4adf4\",\n          },\n          package: {\n            color: \"#f4adf4\",\n          },\n          regex: {\n            color: \"#f4adf4\",\n          },\n          function: {\n            color: \"#c699e3\",\n          },\n          \"selector.class\": {\n            color: \"#c699e3\",\n          },\n          \"selector.id\": {\n            color: \"#c699e3\",\n          },\n          \"atrule.rule\": {\n            color: \"#e9ae7e\",\n          },\n          combinator: {\n            color: \"#e9ae7e\",\n          },\n          keyword: {\n            color: \"#e9ae7e\",\n          },\n          operator: {\n            color: \"#e9ae7e\",\n          },\n          \"pseudo-class\": {\n            color: \"#e9ae7e\",\n          },\n          \"pseudo-element\": {\n            color: \"#e9ae7e\",\n          },\n          selector: {\n            color: \"#e9ae7e\",\n          },\n          unit: {\n            color: \"#e9ae7e\",\n          },\n          deleted: {\n            color: \"#cd6660\",\n          },\n          important: {\n            color: \"#cd6660\",\n            fontWeight: \"bold\",\n          },\n          \"keyword-this\": {\n            color: \"#6cb8e6\",\n            fontWeight: \"bold\",\n          },\n          this: {\n            color: \"#6cb8e6\",\n            fontWeight: \"bold\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n          entity: {\n            cursor: \"help\",\n          },\n          \".language-markdown .token.title\": {\n            color: \"#6cb8e6\",\n            fontWeight: \"bold\",\n          },\n          \".language-markdown .token.title .token.punctuation\": {\n            color: \"#6cb8e6\",\n            fontWeight: \"bold\",\n          },\n          \".language-markdown .token.blockquote.punctuation\": {\n            color: \"#f4adf4\",\n          },\n          \".language-markdown .token.code\": {\n            color: \"#66cccc\",\n          },\n          \".language-markdown .token.hr.punctuation\": {\n            color: \"#6cb8e6\",\n          },\n          \".language-markdown .token.url .token.content\": {\n            color: \"#91d076\",\n          },\n          \".language-markdown .token.url-link\": {\n            color: \"#e6d37a\",\n          },\n          \".language-markdown .token.list.punctuation\": {\n            color: \"#f4adf4\",\n          },\n          \".language-markdown .token.table-header\": {\n            color: \"#e3eaf2\",\n          },\n          \".language-json .token.operator\": {\n            color: \"#e3eaf2\",\n          },\n          \".language-scss .token.variable\": {\n            color: \"#66cccc\",\n          },\n          \"token.tab:not(:empty):before\": {\n            color: \"#8da1b9\",\n          },\n          \"token.cr:before\": {\n            color: \"#8da1b9\",\n          },\n          \"token.lf:before\": {\n            color: \"#8da1b9\",\n          },\n          \"token.space:before\": {\n            color: \"#8da1b9\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a\": {\n            color: \"#111b27\",\n            background: \"#6cb8e6\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button\": {\n            color: \"#111b27\",\n            background: \"#6cb8e6\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover\": {\n            color: \"#111b27\",\n            background: \"#6cb8e6da\",\n            textDecoration: \"none\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus\": {\n            color: \"#111b27\",\n            background: \"#6cb8e6da\",\n            textDecoration: \"none\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover\":\n            {\n              color: \"#111b27\",\n              background: \"#6cb8e6da\",\n              textDecoration: \"none\",\n            },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus\":\n            {\n              color: \"#111b27\",\n              background: \"#6cb8e6da\",\n              textDecoration: \"none\",\n            },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span\": {\n            color: \"#111b27\",\n            background: \"#8da1b9\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover\": {\n            color: \"#111b27\",\n            background: \"#8da1b9\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus\": {\n            color: \"#111b27\",\n            background: \"#8da1b9\",\n          },\n          \".line-highlight.line-highlight\": {\n            background: \"linear-gradient(to right, #3c526d5f 70%, #3c526d55)\",\n          },\n          \".line-highlight.line-highlight:before\": {\n            backgroundColor: \"#8da1b9\",\n            color: \"#111b27\",\n            boxShadow: \"0 1px #3c526d\",\n          },\n          \".line-highlight.line-highlight[data-end]:after\": {\n            backgroundColor: \"#8da1b9\",\n            color: \"#111b27\",\n            boxShadow: \"0 1px #3c526d\",\n          },\n          \"pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before\":\n            {\n              backgroundColor: \"#8da1b918\",\n            },\n          \".line-numbers.line-numbers .line-numbers-rows\": {\n            borderRight: \"1px solid #0b121b\",\n            background: \"#0b121b7a\",\n          },\n          \".line-numbers .line-numbers-rows > span:before\": {\n            color: \"#8da1b9da\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-1\": {\n            color: \"#e6d37a\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-5\": {\n            color: \"#e6d37a\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-9\": {\n            color: \"#e6d37a\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-2\": {\n            color: \"#f4adf4\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-6\": {\n            color: \"#f4adf4\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-10\": {\n            color: \"#f4adf4\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-3\": {\n            color: \"#6cb8e6\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-7\": {\n            color: \"#6cb8e6\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-11\": {\n            color: \"#6cb8e6\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-4\": {\n            color: \"#c699e3\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-8\": {\n            color: \"#c699e3\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-12\": {\n            color: \"#c699e3\",\n          },\n          \"pre.diff-highlight > code .token.token.deleted:not(.prefix)\": {\n            backgroundColor: \"#cd66601f\",\n          },\n          \"pre > code.diff-highlight .token.token.deleted:not(.prefix)\": {\n            backgroundColor: \"#cd66601f\",\n          },\n          \"pre.diff-highlight > code .token.token.inserted:not(.prefix)\": {\n            backgroundColor: \"#91d0761f\",\n          },\n          \"pre > code.diff-highlight .token.token.inserted:not(.prefix)\": {\n            backgroundColor: \"#91d0761f\",\n          },\n          \".command-line .command-line-prompt\": {\n            borderRight: \"1px solid #0b121b\",\n          },\n          \".command-line .command-line-prompt > span:before\": {\n            color: \"#8da1b9da\",\n          },\n        };\n        e.default = t;\n      })(Ua)),\n    Ua\n  );\n}\nvar qa = {},\n  q1;\nfunction U4() {\n  return (\n    q1 ||\n      ((q1 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            color: \"black\",\n            background: \"none\",\n            fontFamily:\n              \"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace\",\n            fontSize: \"1em\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            color: \"black\",\n            background: \"none\",\n            fontFamily:\n              \"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace\",\n            fontSize: \"1em\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            position: \"relative\",\n            borderLeft: \"10px solid #358ccb\",\n            boxShadow: \"-1px 0 0 0 #358ccb, 0 0 0 1px #dfdfdf\",\n            backgroundColor: \"#fdfdfd\",\n            backgroundImage:\n              \"linear-gradient(transparent 50%, rgba(69, 142, 209, 0.04) 50%)\",\n            backgroundSize: \"3em 3em\",\n            backgroundOrigin: \"content-box\",\n            backgroundAttachment: \"local\",\n            margin: \".5em 0\",\n            padding: \"0 1em\",\n          },\n          'pre[class*=\"language-\"] > code': {\n            display: \"block\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            position: \"relative\",\n            padding: \".2em\",\n            borderRadius: \"0.3em\",\n            color: \"#c92c2c\",\n            border: \"1px solid rgba(0, 0, 0, 0.1)\",\n            display: \"inline\",\n            whiteSpace: \"normal\",\n            backgroundColor: \"#fdfdfd\",\n            WebkitBoxSizing: \"border-box\",\n            MozBoxSizing: \"border-box\",\n            boxSizing: \"border-box\",\n          },\n          comment: {\n            color: \"#7D8B99\",\n          },\n          \"block-comment\": {\n            color: \"#7D8B99\",\n          },\n          prolog: {\n            color: \"#7D8B99\",\n          },\n          doctype: {\n            color: \"#7D8B99\",\n          },\n          cdata: {\n            color: \"#7D8B99\",\n          },\n          punctuation: {\n            color: \"#5F6364\",\n          },\n          property: {\n            color: \"#c92c2c\",\n          },\n          tag: {\n            color: \"#c92c2c\",\n          },\n          boolean: {\n            color: \"#c92c2c\",\n          },\n          number: {\n            color: \"#c92c2c\",\n          },\n          \"function-name\": {\n            color: \"#c92c2c\",\n          },\n          constant: {\n            color: \"#c92c2c\",\n          },\n          symbol: {\n            color: \"#c92c2c\",\n          },\n          deleted: {\n            color: \"#c92c2c\",\n          },\n          selector: {\n            color: \"#2f9c0a\",\n          },\n          \"attr-name\": {\n            color: \"#2f9c0a\",\n          },\n          string: {\n            color: \"#2f9c0a\",\n          },\n          char: {\n            color: \"#2f9c0a\",\n          },\n          function: {\n            color: \"#2f9c0a\",\n          },\n          builtin: {\n            color: \"#2f9c0a\",\n          },\n          inserted: {\n            color: \"#2f9c0a\",\n          },\n          operator: {\n            color: \"#a67f59\",\n            background: \"rgba(255, 255, 255, 0.5)\",\n          },\n          entity: {\n            color: \"#a67f59\",\n            background: \"rgba(255, 255, 255, 0.5)\",\n            cursor: \"help\",\n          },\n          url: {\n            color: \"#a67f59\",\n            background: \"rgba(255, 255, 255, 0.5)\",\n          },\n          variable: {\n            color: \"#a67f59\",\n            background: \"rgba(255, 255, 255, 0.5)\",\n          },\n          atrule: {\n            color: \"#1990b8\",\n          },\n          \"attr-value\": {\n            color: \"#1990b8\",\n          },\n          keyword: {\n            color: \"#1990b8\",\n          },\n          \"class-name\": {\n            color: \"#1990b8\",\n          },\n          regex: {\n            color: \"#e90\",\n          },\n          important: {\n            color: \"#e90\",\n            fontWeight: \"normal\",\n          },\n          \".language-css .token.string\": {\n            color: \"#a67f59\",\n            background: \"rgba(255, 255, 255, 0.5)\",\n          },\n          \".style .token.string\": {\n            color: \"#a67f59\",\n            background: \"rgba(255, 255, 255, 0.5)\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n          namespace: {\n            Opacity: \".7\",\n          },\n        };\n        e.default = t;\n      })(qa)),\n    qa\n  );\n}\nvar Ya = {},\n  Y1;\nfunction q4() {\n  return (\n    Y1 ||\n      ((Y1 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            color: \"#a9b7c6\",\n            fontFamily: \"Consolas, Monaco, 'Andale Mono', monospace\",\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            color: \"#a9b7c6\",\n            fontFamily: \"Consolas, Monaco, 'Andale Mono', monospace\",\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            padding: \"1em\",\n            margin: \".5em 0\",\n            overflow: \"auto\",\n            background: \"#2b2b2b\",\n          },\n          'pre[class*=\"language-\"]::-moz-selection': {\n            color: \"inherit\",\n            background: \"rgba(33, 66, 131, .85)\",\n          },\n          'pre[class*=\"language-\"] ::-moz-selection': {\n            color: \"inherit\",\n            background: \"rgba(33, 66, 131, .85)\",\n          },\n          'code[class*=\"language-\"]::-moz-selection': {\n            color: \"inherit\",\n            background: \"rgba(33, 66, 131, .85)\",\n          },\n          'code[class*=\"language-\"] ::-moz-selection': {\n            color: \"inherit\",\n            background: \"rgba(33, 66, 131, .85)\",\n          },\n          'pre[class*=\"language-\"]::selection': {\n            color: \"inherit\",\n            background: \"rgba(33, 66, 131, .85)\",\n          },\n          'pre[class*=\"language-\"] ::selection': {\n            color: \"inherit\",\n            background: \"rgba(33, 66, 131, .85)\",\n          },\n          'code[class*=\"language-\"]::selection': {\n            color: \"inherit\",\n            background: \"rgba(33, 66, 131, .85)\",\n          },\n          'code[class*=\"language-\"] ::selection': {\n            color: \"inherit\",\n            background: \"rgba(33, 66, 131, .85)\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            background: \"#2b2b2b\",\n            padding: \".1em\",\n            borderRadius: \".3em\",\n          },\n          comment: {\n            color: \"#808080\",\n          },\n          prolog: {\n            color: \"#808080\",\n          },\n          cdata: {\n            color: \"#808080\",\n          },\n          delimiter: {\n            color: \"#cc7832\",\n          },\n          boolean: {\n            color: \"#cc7832\",\n          },\n          keyword: {\n            color: \"#cc7832\",\n          },\n          selector: {\n            color: \"#cc7832\",\n          },\n          important: {\n            color: \"#cc7832\",\n          },\n          atrule: {\n            color: \"#cc7832\",\n          },\n          operator: {\n            color: \"#a9b7c6\",\n          },\n          punctuation: {\n            color: \"#a9b7c6\",\n          },\n          \"attr-name\": {\n            color: \"#a9b7c6\",\n          },\n          tag: {\n            color: \"#e8bf6a\",\n          },\n          \"tag.punctuation\": {\n            color: \"#e8bf6a\",\n          },\n          doctype: {\n            color: \"#e8bf6a\",\n          },\n          builtin: {\n            color: \"#e8bf6a\",\n          },\n          entity: {\n            color: \"#6897bb\",\n          },\n          number: {\n            color: \"#6897bb\",\n          },\n          symbol: {\n            color: \"#6897bb\",\n          },\n          property: {\n            color: \"#9876aa\",\n          },\n          constant: {\n            color: \"#9876aa\",\n          },\n          variable: {\n            color: \"#9876aa\",\n          },\n          string: {\n            color: \"#6a8759\",\n          },\n          char: {\n            color: \"#6a8759\",\n          },\n          \"attr-value\": {\n            color: \"#a5c261\",\n          },\n          \"attr-value.punctuation\": {\n            color: \"#a5c261\",\n          },\n          \"attr-value.punctuation:first-child\": {\n            color: \"#a9b7c6\",\n          },\n          url: {\n            color: \"#287bde\",\n            textDecoration: \"underline\",\n          },\n          function: {\n            color: \"#ffc66d\",\n          },\n          regex: {\n            background: \"#364135\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n          inserted: {\n            background: \"#294436\",\n          },\n          deleted: {\n            background: \"#484a4a\",\n          },\n          \"code.language-css .token.property\": {\n            color: \"#a9b7c6\",\n          },\n          \"code.language-css .token.property + .token.punctuation\": {\n            color: \"#a9b7c6\",\n          },\n          \"code.language-css .token.id\": {\n            color: \"#ffc66d\",\n          },\n          \"code.language-css .token.selector > .token.class\": {\n            color: \"#ffc66d\",\n          },\n          \"code.language-css .token.selector > .token.attribute\": {\n            color: \"#ffc66d\",\n          },\n          \"code.language-css .token.selector > .token.pseudo-class\": {\n            color: \"#ffc66d\",\n          },\n          \"code.language-css .token.selector > .token.pseudo-element\": {\n            color: \"#ffc66d\",\n          },\n        };\n        e.default = t;\n      })(Ya)),\n    Ya\n  );\n}\nvar Ga = {},\n  G1;\nfunction Y4() {\n  return (\n    G1 ||\n      ((G1 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            color: \"#f8f8f2\",\n            background: \"none\",\n            textShadow: \"0 1px rgba(0, 0, 0, 0.3)\",\n            fontFamily:\n              \"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            color: \"#f8f8f2\",\n            background: \"#282a36\",\n            textShadow: \"0 1px rgba(0, 0, 0, 0.3)\",\n            fontFamily:\n              \"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            padding: \"1em\",\n            margin: \".5em 0\",\n            overflow: \"auto\",\n            borderRadius: \"0.3em\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            background: \"#282a36\",\n            padding: \".1em\",\n            borderRadius: \".3em\",\n            whiteSpace: \"normal\",\n          },\n          comment: {\n            color: \"#6272a4\",\n          },\n          prolog: {\n            color: \"#6272a4\",\n          },\n          doctype: {\n            color: \"#6272a4\",\n          },\n          cdata: {\n            color: \"#6272a4\",\n          },\n          punctuation: {\n            color: \"#f8f8f2\",\n          },\n          \".namespace\": {\n            Opacity: \".7\",\n          },\n          property: {\n            color: \"#ff79c6\",\n          },\n          tag: {\n            color: \"#ff79c6\",\n          },\n          constant: {\n            color: \"#ff79c6\",\n          },\n          symbol: {\n            color: \"#ff79c6\",\n          },\n          deleted: {\n            color: \"#ff79c6\",\n          },\n          boolean: {\n            color: \"#bd93f9\",\n          },\n          number: {\n            color: \"#bd93f9\",\n          },\n          selector: {\n            color: \"#50fa7b\",\n          },\n          \"attr-name\": {\n            color: \"#50fa7b\",\n          },\n          string: {\n            color: \"#50fa7b\",\n          },\n          char: {\n            color: \"#50fa7b\",\n          },\n          builtin: {\n            color: \"#50fa7b\",\n          },\n          inserted: {\n            color: \"#50fa7b\",\n          },\n          operator: {\n            color: \"#f8f8f2\",\n          },\n          entity: {\n            color: \"#f8f8f2\",\n            cursor: \"help\",\n          },\n          url: {\n            color: \"#f8f8f2\",\n          },\n          \".language-css .token.string\": {\n            color: \"#f8f8f2\",\n          },\n          \".style .token.string\": {\n            color: \"#f8f8f2\",\n          },\n          variable: {\n            color: \"#f8f8f2\",\n          },\n          atrule: {\n            color: \"#f1fa8c\",\n          },\n          \"attr-value\": {\n            color: \"#f1fa8c\",\n          },\n          function: {\n            color: \"#f1fa8c\",\n          },\n          \"class-name\": {\n            color: \"#f1fa8c\",\n          },\n          keyword: {\n            color: \"#8be9fd\",\n          },\n          regex: {\n            color: \"#ffb86c\",\n          },\n          important: {\n            color: \"#ffb86c\",\n            fontWeight: \"bold\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n        };\n        e.default = t;\n      })(Ga)),\n    Ga\n  );\n}\nvar Ka = {},\n  K1;\nfunction G4() {\n  return (\n    K1 ||\n      ((K1 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            fontFamily:\n              'Consolas, Menlo, Monaco, \"Andale Mono WT\", \"Andale Mono\", \"Lucida Console\", \"Lucida Sans Typewriter\", \"DejaVu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Liberation Mono\", \"Nimbus Mono L\", \"Courier New\", Courier, monospace',\n            fontSize: \"14px\",\n            lineHeight: \"1.375\",\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            background: \"#2a2734\",\n            color: \"#9a86fd\",\n          },\n          'pre[class*=\"language-\"]': {\n            fontFamily:\n              'Consolas, Menlo, Monaco, \"Andale Mono WT\", \"Andale Mono\", \"Lucida Console\", \"Lucida Sans Typewriter\", \"DejaVu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Liberation Mono\", \"Nimbus Mono L\", \"Courier New\", Courier, monospace',\n            fontSize: \"14px\",\n            lineHeight: \"1.375\",\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            background: \"#2a2734\",\n            color: \"#9a86fd\",\n            padding: \"1em\",\n            margin: \".5em 0\",\n            overflow: \"auto\",\n          },\n          'pre > code[class*=\"language-\"]': {\n            fontSize: \"1em\",\n          },\n          'pre[class*=\"language-\"]::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#6a51e6\",\n          },\n          'pre[class*=\"language-\"] ::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#6a51e6\",\n          },\n          'code[class*=\"language-\"]::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#6a51e6\",\n          },\n          'code[class*=\"language-\"] ::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#6a51e6\",\n          },\n          'pre[class*=\"language-\"]::selection': {\n            textShadow: \"none\",\n            background: \"#6a51e6\",\n          },\n          'pre[class*=\"language-\"] ::selection': {\n            textShadow: \"none\",\n            background: \"#6a51e6\",\n          },\n          'code[class*=\"language-\"]::selection': {\n            textShadow: \"none\",\n            background: \"#6a51e6\",\n          },\n          'code[class*=\"language-\"] ::selection': {\n            textShadow: \"none\",\n            background: \"#6a51e6\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            padding: \".1em\",\n            borderRadius: \".3em\",\n          },\n          comment: {\n            color: \"#6c6783\",\n          },\n          prolog: {\n            color: \"#6c6783\",\n          },\n          doctype: {\n            color: \"#6c6783\",\n          },\n          cdata: {\n            color: \"#6c6783\",\n          },\n          punctuation: {\n            color: \"#6c6783\",\n          },\n          namespace: {\n            Opacity: \".7\",\n          },\n          tag: {\n            color: \"#e09142\",\n          },\n          operator: {\n            color: \"#e09142\",\n          },\n          number: {\n            color: \"#e09142\",\n          },\n          property: {\n            color: \"#9a86fd\",\n          },\n          function: {\n            color: \"#9a86fd\",\n          },\n          \"tag-id\": {\n            color: \"#eeebff\",\n          },\n          selector: {\n            color: \"#eeebff\",\n          },\n          \"atrule-id\": {\n            color: \"#eeebff\",\n          },\n          \"code.language-javascript\": {\n            color: \"#c4b9fe\",\n          },\n          \"attr-name\": {\n            color: \"#c4b9fe\",\n          },\n          \"code.language-css\": {\n            color: \"#ffcc99\",\n          },\n          \"code.language-scss\": {\n            color: \"#ffcc99\",\n          },\n          boolean: {\n            color: \"#ffcc99\",\n          },\n          string: {\n            color: \"#ffcc99\",\n          },\n          entity: {\n            color: \"#ffcc99\",\n            cursor: \"help\",\n          },\n          url: {\n            color: \"#ffcc99\",\n          },\n          \".language-css .token.string\": {\n            color: \"#ffcc99\",\n          },\n          \".language-scss .token.string\": {\n            color: \"#ffcc99\",\n          },\n          \".style .token.string\": {\n            color: \"#ffcc99\",\n          },\n          \"attr-value\": {\n            color: \"#ffcc99\",\n          },\n          keyword: {\n            color: \"#ffcc99\",\n          },\n          control: {\n            color: \"#ffcc99\",\n          },\n          directive: {\n            color: \"#ffcc99\",\n          },\n          unit: {\n            color: \"#ffcc99\",\n          },\n          statement: {\n            color: \"#ffcc99\",\n          },\n          regex: {\n            color: \"#ffcc99\",\n          },\n          atrule: {\n            color: \"#ffcc99\",\n          },\n          placeholder: {\n            color: \"#ffcc99\",\n          },\n          variable: {\n            color: \"#ffcc99\",\n          },\n          deleted: {\n            textDecoration: \"line-through\",\n          },\n          inserted: {\n            borderBottom: \"1px dotted #eeebff\",\n            textDecoration: \"none\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n          important: {\n            fontWeight: \"bold\",\n            color: \"#c4b9fe\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          \"pre > code.highlight\": {\n            Outline: \".4em solid #8a75f5\",\n            OutlineOffset: \".4em\",\n          },\n          \".line-numbers.line-numbers .line-numbers-rows\": {\n            borderRightColor: \"#2c2937\",\n          },\n          \".line-numbers .line-numbers-rows > span:before\": {\n            color: \"#3c3949\",\n          },\n          \".line-highlight.line-highlight\": {\n            background:\n              \"linear-gradient(to right, rgba(224, 145, 66, 0.2) 70%, rgba(224, 145, 66, 0))\",\n          },\n        };\n        e.default = t;\n      })(Ka)),\n    Ka\n  );\n}\nvar Xa = {},\n  X1;\nfunction K4() {\n  return (\n    X1 ||\n      ((X1 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            fontFamily:\n              'Consolas, Menlo, Monaco, \"Andale Mono WT\", \"Andale Mono\", \"Lucida Console\", \"Lucida Sans Typewriter\", \"DejaVu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Liberation Mono\", \"Nimbus Mono L\", \"Courier New\", Courier, monospace',\n            fontSize: \"14px\",\n            lineHeight: \"1.375\",\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            background: \"#322d29\",\n            color: \"#88786d\",\n          },\n          'pre[class*=\"language-\"]': {\n            fontFamily:\n              'Consolas, Menlo, Monaco, \"Andale Mono WT\", \"Andale Mono\", \"Lucida Console\", \"Lucida Sans Typewriter\", \"DejaVu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Liberation Mono\", \"Nimbus Mono L\", \"Courier New\", Courier, monospace',\n            fontSize: \"14px\",\n            lineHeight: \"1.375\",\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            background: \"#322d29\",\n            color: \"#88786d\",\n            padding: \"1em\",\n            margin: \".5em 0\",\n            overflow: \"auto\",\n          },\n          'pre > code[class*=\"language-\"]': {\n            fontSize: \"1em\",\n          },\n          'pre[class*=\"language-\"]::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#6f5849\",\n          },\n          'pre[class*=\"language-\"] ::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#6f5849\",\n          },\n          'code[class*=\"language-\"]::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#6f5849\",\n          },\n          'code[class*=\"language-\"] ::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#6f5849\",\n          },\n          'pre[class*=\"language-\"]::selection': {\n            textShadow: \"none\",\n            background: \"#6f5849\",\n          },\n          'pre[class*=\"language-\"] ::selection': {\n            textShadow: \"none\",\n            background: \"#6f5849\",\n          },\n          'code[class*=\"language-\"]::selection': {\n            textShadow: \"none\",\n            background: \"#6f5849\",\n          },\n          'code[class*=\"language-\"] ::selection': {\n            textShadow: \"none\",\n            background: \"#6f5849\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            padding: \".1em\",\n            borderRadius: \".3em\",\n          },\n          comment: {\n            color: \"#6a5f58\",\n          },\n          prolog: {\n            color: \"#6a5f58\",\n          },\n          doctype: {\n            color: \"#6a5f58\",\n          },\n          cdata: {\n            color: \"#6a5f58\",\n          },\n          punctuation: {\n            color: \"#6a5f58\",\n          },\n          namespace: {\n            Opacity: \".7\",\n          },\n          tag: {\n            color: \"#bfa05a\",\n          },\n          operator: {\n            color: \"#bfa05a\",\n          },\n          number: {\n            color: \"#bfa05a\",\n          },\n          property: {\n            color: \"#88786d\",\n          },\n          function: {\n            color: \"#88786d\",\n          },\n          \"tag-id\": {\n            color: \"#fff3eb\",\n          },\n          selector: {\n            color: \"#fff3eb\",\n          },\n          \"atrule-id\": {\n            color: \"#fff3eb\",\n          },\n          \"code.language-javascript\": {\n            color: \"#a48774\",\n          },\n          \"attr-name\": {\n            color: \"#a48774\",\n          },\n          \"code.language-css\": {\n            color: \"#fcc440\",\n          },\n          \"code.language-scss\": {\n            color: \"#fcc440\",\n          },\n          boolean: {\n            color: \"#fcc440\",\n          },\n          string: {\n            color: \"#fcc440\",\n          },\n          entity: {\n            color: \"#fcc440\",\n            cursor: \"help\",\n          },\n          url: {\n            color: \"#fcc440\",\n          },\n          \".language-css .token.string\": {\n            color: \"#fcc440\",\n          },\n          \".language-scss .token.string\": {\n            color: \"#fcc440\",\n          },\n          \".style .token.string\": {\n            color: \"#fcc440\",\n          },\n          \"attr-value\": {\n            color: \"#fcc440\",\n          },\n          keyword: {\n            color: \"#fcc440\",\n          },\n          control: {\n            color: \"#fcc440\",\n          },\n          directive: {\n            color: \"#fcc440\",\n          },\n          unit: {\n            color: \"#fcc440\",\n          },\n          statement: {\n            color: \"#fcc440\",\n          },\n          regex: {\n            color: \"#fcc440\",\n          },\n          atrule: {\n            color: \"#fcc440\",\n          },\n          placeholder: {\n            color: \"#fcc440\",\n          },\n          variable: {\n            color: \"#fcc440\",\n          },\n          deleted: {\n            textDecoration: \"line-through\",\n          },\n          inserted: {\n            borderBottom: \"1px dotted #fff3eb\",\n            textDecoration: \"none\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n          important: {\n            fontWeight: \"bold\",\n            color: \"#a48774\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          \"pre > code.highlight\": {\n            Outline: \".4em solid #816d5f\",\n            OutlineOffset: \".4em\",\n          },\n          \".line-numbers.line-numbers .line-numbers-rows\": {\n            borderRightColor: \"#35302b\",\n          },\n          \".line-numbers .line-numbers-rows > span:before\": {\n            color: \"#46403d\",\n          },\n          \".line-highlight.line-highlight\": {\n            background:\n              \"linear-gradient(to right, rgba(191, 160, 90, 0.2) 70%, rgba(191, 160, 90, 0))\",\n          },\n        };\n        e.default = t;\n      })(Xa)),\n    Xa\n  );\n}\nvar Qa = {},\n  Q1;\nfunction X4() {\n  return (\n    Q1 ||\n      ((Q1 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            fontFamily:\n              'Consolas, Menlo, Monaco, \"Andale Mono WT\", \"Andale Mono\", \"Lucida Console\", \"Lucida Sans Typewriter\", \"DejaVu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Liberation Mono\", \"Nimbus Mono L\", \"Courier New\", Courier, monospace',\n            fontSize: \"14px\",\n            lineHeight: \"1.375\",\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            background: \"#2a2d2a\",\n            color: \"#687d68\",\n          },\n          'pre[class*=\"language-\"]': {\n            fontFamily:\n              'Consolas, Menlo, Monaco, \"Andale Mono WT\", \"Andale Mono\", \"Lucida Console\", \"Lucida Sans Typewriter\", \"DejaVu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Liberation Mono\", \"Nimbus Mono L\", \"Courier New\", Courier, monospace',\n            fontSize: \"14px\",\n            lineHeight: \"1.375\",\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            background: \"#2a2d2a\",\n            color: \"#687d68\",\n            padding: \"1em\",\n            margin: \".5em 0\",\n            overflow: \"auto\",\n          },\n          'pre > code[class*=\"language-\"]': {\n            fontSize: \"1em\",\n          },\n          'pre[class*=\"language-\"]::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#435643\",\n          },\n          'pre[class*=\"language-\"] ::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#435643\",\n          },\n          'code[class*=\"language-\"]::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#435643\",\n          },\n          'code[class*=\"language-\"] ::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#435643\",\n          },\n          'pre[class*=\"language-\"]::selection': {\n            textShadow: \"none\",\n            background: \"#435643\",\n          },\n          'pre[class*=\"language-\"] ::selection': {\n            textShadow: \"none\",\n            background: \"#435643\",\n          },\n          'code[class*=\"language-\"]::selection': {\n            textShadow: \"none\",\n            background: \"#435643\",\n          },\n          'code[class*=\"language-\"] ::selection': {\n            textShadow: \"none\",\n            background: \"#435643\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            padding: \".1em\",\n            borderRadius: \".3em\",\n          },\n          comment: {\n            color: \"#535f53\",\n          },\n          prolog: {\n            color: \"#535f53\",\n          },\n          doctype: {\n            color: \"#535f53\",\n          },\n          cdata: {\n            color: \"#535f53\",\n          },\n          punctuation: {\n            color: \"#535f53\",\n          },\n          namespace: {\n            Opacity: \".7\",\n          },\n          tag: {\n            color: \"#a2b34d\",\n          },\n          operator: {\n            color: \"#a2b34d\",\n          },\n          number: {\n            color: \"#a2b34d\",\n          },\n          property: {\n            color: \"#687d68\",\n          },\n          function: {\n            color: \"#687d68\",\n          },\n          \"tag-id\": {\n            color: \"#f0fff0\",\n          },\n          selector: {\n            color: \"#f0fff0\",\n          },\n          \"atrule-id\": {\n            color: \"#f0fff0\",\n          },\n          \"code.language-javascript\": {\n            color: \"#b3d6b3\",\n          },\n          \"attr-name\": {\n            color: \"#b3d6b3\",\n          },\n          \"code.language-css\": {\n            color: \"#e5fb79\",\n          },\n          \"code.language-scss\": {\n            color: \"#e5fb79\",\n          },\n          boolean: {\n            color: \"#e5fb79\",\n          },\n          string: {\n            color: \"#e5fb79\",\n          },\n          entity: {\n            color: \"#e5fb79\",\n            cursor: \"help\",\n          },\n          url: {\n            color: \"#e5fb79\",\n          },\n          \".language-css .token.string\": {\n            color: \"#e5fb79\",\n          },\n          \".language-scss .token.string\": {\n            color: \"#e5fb79\",\n          },\n          \".style .token.string\": {\n            color: \"#e5fb79\",\n          },\n          \"attr-value\": {\n            color: \"#e5fb79\",\n          },\n          keyword: {\n            color: \"#e5fb79\",\n          },\n          control: {\n            color: \"#e5fb79\",\n          },\n          directive: {\n            color: \"#e5fb79\",\n          },\n          unit: {\n            color: \"#e5fb79\",\n          },\n          statement: {\n            color: \"#e5fb79\",\n          },\n          regex: {\n            color: \"#e5fb79\",\n          },\n          atrule: {\n            color: \"#e5fb79\",\n          },\n          placeholder: {\n            color: \"#e5fb79\",\n          },\n          variable: {\n            color: \"#e5fb79\",\n          },\n          deleted: {\n            textDecoration: \"line-through\",\n          },\n          inserted: {\n            borderBottom: \"1px dotted #f0fff0\",\n            textDecoration: \"none\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n          important: {\n            fontWeight: \"bold\",\n            color: \"#b3d6b3\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          \"pre > code.highlight\": {\n            Outline: \".4em solid #5c705c\",\n            OutlineOffset: \".4em\",\n          },\n          \".line-numbers.line-numbers .line-numbers-rows\": {\n            borderRightColor: \"#2c302c\",\n          },\n          \".line-numbers .line-numbers-rows > span:before\": {\n            color: \"#3b423b\",\n          },\n          \".line-highlight.line-highlight\": {\n            background:\n              \"linear-gradient(to right, rgba(162, 179, 77, 0.2) 70%, rgba(162, 179, 77, 0))\",\n          },\n        };\n        e.default = t;\n      })(Qa)),\n    Qa\n  );\n}\nvar Ja = {},\n  J1;\nfunction Q4() {\n  return (\n    J1 ||\n      ((J1 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            fontFamily:\n              'Consolas, Menlo, Monaco, \"Andale Mono WT\", \"Andale Mono\", \"Lucida Console\", \"Lucida Sans Typewriter\", \"DejaVu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Liberation Mono\", \"Nimbus Mono L\", \"Courier New\", Courier, monospace',\n            fontSize: \"14px\",\n            lineHeight: \"1.375\",\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            background: \"#faf8f5\",\n            color: \"#728fcb\",\n          },\n          'pre[class*=\"language-\"]': {\n            fontFamily:\n              'Consolas, Menlo, Monaco, \"Andale Mono WT\", \"Andale Mono\", \"Lucida Console\", \"Lucida Sans Typewriter\", \"DejaVu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Liberation Mono\", \"Nimbus Mono L\", \"Courier New\", Courier, monospace',\n            fontSize: \"14px\",\n            lineHeight: \"1.375\",\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            background: \"#faf8f5\",\n            color: \"#728fcb\",\n            padding: \"1em\",\n            margin: \".5em 0\",\n            overflow: \"auto\",\n          },\n          'pre > code[class*=\"language-\"]': {\n            fontSize: \"1em\",\n          },\n          'pre[class*=\"language-\"]::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#faf8f5\",\n          },\n          'pre[class*=\"language-\"] ::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#faf8f5\",\n          },\n          'code[class*=\"language-\"]::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#faf8f5\",\n          },\n          'code[class*=\"language-\"] ::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#faf8f5\",\n          },\n          'pre[class*=\"language-\"]::selection': {\n            textShadow: \"none\",\n            background: \"#faf8f5\",\n          },\n          'pre[class*=\"language-\"] ::selection': {\n            textShadow: \"none\",\n            background: \"#faf8f5\",\n          },\n          'code[class*=\"language-\"]::selection': {\n            textShadow: \"none\",\n            background: \"#faf8f5\",\n          },\n          'code[class*=\"language-\"] ::selection': {\n            textShadow: \"none\",\n            background: \"#faf8f5\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            padding: \".1em\",\n            borderRadius: \".3em\",\n          },\n          comment: {\n            color: \"#b6ad9a\",\n          },\n          prolog: {\n            color: \"#b6ad9a\",\n          },\n          doctype: {\n            color: \"#b6ad9a\",\n          },\n          cdata: {\n            color: \"#b6ad9a\",\n          },\n          punctuation: {\n            color: \"#b6ad9a\",\n          },\n          namespace: {\n            Opacity: \".7\",\n          },\n          tag: {\n            color: \"#063289\",\n          },\n          operator: {\n            color: \"#063289\",\n          },\n          number: {\n            color: \"#063289\",\n          },\n          property: {\n            color: \"#b29762\",\n          },\n          function: {\n            color: \"#b29762\",\n          },\n          \"tag-id\": {\n            color: \"#2d2006\",\n          },\n          selector: {\n            color: \"#2d2006\",\n          },\n          \"atrule-id\": {\n            color: \"#2d2006\",\n          },\n          \"code.language-javascript\": {\n            color: \"#896724\",\n          },\n          \"attr-name\": {\n            color: \"#896724\",\n          },\n          \"code.language-css\": {\n            color: \"#728fcb\",\n          },\n          \"code.language-scss\": {\n            color: \"#728fcb\",\n          },\n          boolean: {\n            color: \"#728fcb\",\n          },\n          string: {\n            color: \"#728fcb\",\n          },\n          entity: {\n            color: \"#728fcb\",\n            cursor: \"help\",\n          },\n          url: {\n            color: \"#728fcb\",\n          },\n          \".language-css .token.string\": {\n            color: \"#728fcb\",\n          },\n          \".language-scss .token.string\": {\n            color: \"#728fcb\",\n          },\n          \".style .token.string\": {\n            color: \"#728fcb\",\n          },\n          \"attr-value\": {\n            color: \"#728fcb\",\n          },\n          keyword: {\n            color: \"#728fcb\",\n          },\n          control: {\n            color: \"#728fcb\",\n          },\n          directive: {\n            color: \"#728fcb\",\n          },\n          unit: {\n            color: \"#728fcb\",\n          },\n          statement: {\n            color: \"#728fcb\",\n          },\n          regex: {\n            color: \"#728fcb\",\n          },\n          atrule: {\n            color: \"#728fcb\",\n          },\n          placeholder: {\n            color: \"#93abdc\",\n          },\n          variable: {\n            color: \"#93abdc\",\n          },\n          deleted: {\n            textDecoration: \"line-through\",\n          },\n          inserted: {\n            borderBottom: \"1px dotted #2d2006\",\n            textDecoration: \"none\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n          important: {\n            fontWeight: \"bold\",\n            color: \"#896724\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          \"pre > code.highlight\": {\n            Outline: \".4em solid #896724\",\n            OutlineOffset: \".4em\",\n          },\n          \".line-numbers.line-numbers .line-numbers-rows\": {\n            borderRightColor: \"#ece8de\",\n          },\n          \".line-numbers .line-numbers-rows > span:before\": {\n            color: \"#cdc4b1\",\n          },\n          \".line-highlight.line-highlight\": {\n            background:\n              \"linear-gradient(to right, rgba(45, 32, 6, 0.2) 70%, rgba(45, 32, 6, 0))\",\n          },\n        };\n        e.default = t;\n      })(Ja)),\n    Ja\n  );\n}\nvar el = {},\n  e2;\nfunction J4() {\n  return (\n    e2 ||\n      ((e2 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            fontFamily:\n              'Consolas, Menlo, Monaco, \"Andale Mono WT\", \"Andale Mono\", \"Lucida Console\", \"Lucida Sans Typewriter\", \"DejaVu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Liberation Mono\", \"Nimbus Mono L\", \"Courier New\", Courier, monospace',\n            fontSize: \"14px\",\n            lineHeight: \"1.375\",\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            background: \"#1d262f\",\n            color: \"#57718e\",\n          },\n          'pre[class*=\"language-\"]': {\n            fontFamily:\n              'Consolas, Menlo, Monaco, \"Andale Mono WT\", \"Andale Mono\", \"Lucida Console\", \"Lucida Sans Typewriter\", \"DejaVu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Liberation Mono\", \"Nimbus Mono L\", \"Courier New\", Courier, monospace',\n            fontSize: \"14px\",\n            lineHeight: \"1.375\",\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            background: \"#1d262f\",\n            color: \"#57718e\",\n            padding: \"1em\",\n            margin: \".5em 0\",\n            overflow: \"auto\",\n          },\n          'pre > code[class*=\"language-\"]': {\n            fontSize: \"1em\",\n          },\n          'pre[class*=\"language-\"]::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#004a9e\",\n          },\n          'pre[class*=\"language-\"] ::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#004a9e\",\n          },\n          'code[class*=\"language-\"]::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#004a9e\",\n          },\n          'code[class*=\"language-\"] ::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#004a9e\",\n          },\n          'pre[class*=\"language-\"]::selection': {\n            textShadow: \"none\",\n            background: \"#004a9e\",\n          },\n          'pre[class*=\"language-\"] ::selection': {\n            textShadow: \"none\",\n            background: \"#004a9e\",\n          },\n          'code[class*=\"language-\"]::selection': {\n            textShadow: \"none\",\n            background: \"#004a9e\",\n          },\n          'code[class*=\"language-\"] ::selection': {\n            textShadow: \"none\",\n            background: \"#004a9e\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            padding: \".1em\",\n            borderRadius: \".3em\",\n          },\n          comment: {\n            color: \"#4a5f78\",\n          },\n          prolog: {\n            color: \"#4a5f78\",\n          },\n          doctype: {\n            color: \"#4a5f78\",\n          },\n          cdata: {\n            color: \"#4a5f78\",\n          },\n          punctuation: {\n            color: \"#4a5f78\",\n          },\n          namespace: {\n            Opacity: \".7\",\n          },\n          tag: {\n            color: \"#0aa370\",\n          },\n          operator: {\n            color: \"#0aa370\",\n          },\n          number: {\n            color: \"#0aa370\",\n          },\n          property: {\n            color: \"#57718e\",\n          },\n          function: {\n            color: \"#57718e\",\n          },\n          \"tag-id\": {\n            color: \"#ebf4ff\",\n          },\n          selector: {\n            color: \"#ebf4ff\",\n          },\n          \"atrule-id\": {\n            color: \"#ebf4ff\",\n          },\n          \"code.language-javascript\": {\n            color: \"#7eb6f6\",\n          },\n          \"attr-name\": {\n            color: \"#7eb6f6\",\n          },\n          \"code.language-css\": {\n            color: \"#47ebb4\",\n          },\n          \"code.language-scss\": {\n            color: \"#47ebb4\",\n          },\n          boolean: {\n            color: \"#47ebb4\",\n          },\n          string: {\n            color: \"#47ebb4\",\n          },\n          entity: {\n            color: \"#47ebb4\",\n            cursor: \"help\",\n          },\n          url: {\n            color: \"#47ebb4\",\n          },\n          \".language-css .token.string\": {\n            color: \"#47ebb4\",\n          },\n          \".language-scss .token.string\": {\n            color: \"#47ebb4\",\n          },\n          \".style .token.string\": {\n            color: \"#47ebb4\",\n          },\n          \"attr-value\": {\n            color: \"#47ebb4\",\n          },\n          keyword: {\n            color: \"#47ebb4\",\n          },\n          control: {\n            color: \"#47ebb4\",\n          },\n          directive: {\n            color: \"#47ebb4\",\n          },\n          unit: {\n            color: \"#47ebb4\",\n          },\n          statement: {\n            color: \"#47ebb4\",\n          },\n          regex: {\n            color: \"#47ebb4\",\n          },\n          atrule: {\n            color: \"#47ebb4\",\n          },\n          placeholder: {\n            color: \"#47ebb4\",\n          },\n          variable: {\n            color: \"#47ebb4\",\n          },\n          deleted: {\n            textDecoration: \"line-through\",\n          },\n          inserted: {\n            borderBottom: \"1px dotted #ebf4ff\",\n            textDecoration: \"none\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n          important: {\n            fontWeight: \"bold\",\n            color: \"#7eb6f6\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          \"pre > code.highlight\": {\n            Outline: \".4em solid #34659d\",\n            OutlineOffset: \".4em\",\n          },\n          \".line-numbers.line-numbers .line-numbers-rows\": {\n            borderRightColor: \"#1f2932\",\n          },\n          \".line-numbers .line-numbers-rows > span:before\": {\n            color: \"#2c3847\",\n          },\n          \".line-highlight.line-highlight\": {\n            background:\n              \"linear-gradient(to right, rgba(10, 163, 112, 0.2) 70%, rgba(10, 163, 112, 0))\",\n          },\n        };\n        e.default = t;\n      })(el)),\n    el\n  );\n}\nvar tl = {},\n  t2;\nfunction e6() {\n  return (\n    t2 ||\n      ((t2 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            fontFamily:\n              'Consolas, Menlo, Monaco, \"Andale Mono WT\", \"Andale Mono\", \"Lucida Console\", \"Lucida Sans Typewriter\", \"DejaVu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Liberation Mono\", \"Nimbus Mono L\", \"Courier New\", Courier, monospace',\n            fontSize: \"14px\",\n            lineHeight: \"1.375\",\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            background: \"#24242e\",\n            color: \"#767693\",\n          },\n          'pre[class*=\"language-\"]': {\n            fontFamily:\n              'Consolas, Menlo, Monaco, \"Andale Mono WT\", \"Andale Mono\", \"Lucida Console\", \"Lucida Sans Typewriter\", \"DejaVu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Liberation Mono\", \"Nimbus Mono L\", \"Courier New\", Courier, monospace',\n            fontSize: \"14px\",\n            lineHeight: \"1.375\",\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            background: \"#24242e\",\n            color: \"#767693\",\n            padding: \"1em\",\n            margin: \".5em 0\",\n            overflow: \"auto\",\n          },\n          'pre > code[class*=\"language-\"]': {\n            fontSize: \"1em\",\n          },\n          'pre[class*=\"language-\"]::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#5151e6\",\n          },\n          'pre[class*=\"language-\"] ::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#5151e6\",\n          },\n          'code[class*=\"language-\"]::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#5151e6\",\n          },\n          'code[class*=\"language-\"] ::-moz-selection': {\n            textShadow: \"none\",\n            background: \"#5151e6\",\n          },\n          'pre[class*=\"language-\"]::selection': {\n            textShadow: \"none\",\n            background: \"#5151e6\",\n          },\n          'pre[class*=\"language-\"] ::selection': {\n            textShadow: \"none\",\n            background: \"#5151e6\",\n          },\n          'code[class*=\"language-\"]::selection': {\n            textShadow: \"none\",\n            background: \"#5151e6\",\n          },\n          'code[class*=\"language-\"] ::selection': {\n            textShadow: \"none\",\n            background: \"#5151e6\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            padding: \".1em\",\n            borderRadius: \".3em\",\n          },\n          comment: {\n            color: \"#5b5b76\",\n          },\n          prolog: {\n            color: \"#5b5b76\",\n          },\n          doctype: {\n            color: \"#5b5b76\",\n          },\n          cdata: {\n            color: \"#5b5b76\",\n          },\n          punctuation: {\n            color: \"#5b5b76\",\n          },\n          namespace: {\n            Opacity: \".7\",\n          },\n          tag: {\n            color: \"#dd672c\",\n          },\n          operator: {\n            color: \"#dd672c\",\n          },\n          number: {\n            color: \"#dd672c\",\n          },\n          property: {\n            color: \"#767693\",\n          },\n          function: {\n            color: \"#767693\",\n          },\n          \"tag-id\": {\n            color: \"#ebebff\",\n          },\n          selector: {\n            color: \"#ebebff\",\n          },\n          \"atrule-id\": {\n            color: \"#ebebff\",\n          },\n          \"code.language-javascript\": {\n            color: \"#aaaaca\",\n          },\n          \"attr-name\": {\n            color: \"#aaaaca\",\n          },\n          \"code.language-css\": {\n            color: \"#fe8c52\",\n          },\n          \"code.language-scss\": {\n            color: \"#fe8c52\",\n          },\n          boolean: {\n            color: \"#fe8c52\",\n          },\n          string: {\n            color: \"#fe8c52\",\n          },\n          entity: {\n            color: \"#fe8c52\",\n            cursor: \"help\",\n          },\n          url: {\n            color: \"#fe8c52\",\n          },\n          \".language-css .token.string\": {\n            color: \"#fe8c52\",\n          },\n          \".language-scss .token.string\": {\n            color: \"#fe8c52\",\n          },\n          \".style .token.string\": {\n            color: \"#fe8c52\",\n          },\n          \"attr-value\": {\n            color: \"#fe8c52\",\n          },\n          keyword: {\n            color: \"#fe8c52\",\n          },\n          control: {\n            color: \"#fe8c52\",\n          },\n          directive: {\n            color: \"#fe8c52\",\n          },\n          unit: {\n            color: \"#fe8c52\",\n          },\n          statement: {\n            color: \"#fe8c52\",\n          },\n          regex: {\n            color: \"#fe8c52\",\n          },\n          atrule: {\n            color: \"#fe8c52\",\n          },\n          placeholder: {\n            color: \"#fe8c52\",\n          },\n          variable: {\n            color: \"#fe8c52\",\n          },\n          deleted: {\n            textDecoration: \"line-through\",\n          },\n          inserted: {\n            borderBottom: \"1px dotted #ebebff\",\n            textDecoration: \"none\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n          important: {\n            fontWeight: \"bold\",\n            color: \"#aaaaca\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          \"pre > code.highlight\": {\n            Outline: \".4em solid #7676f4\",\n            OutlineOffset: \".4em\",\n          },\n          \".line-numbers.line-numbers .line-numbers-rows\": {\n            borderRightColor: \"#262631\",\n          },\n          \".line-numbers .line-numbers-rows > span:before\": {\n            color: \"#393949\",\n          },\n          \".line-highlight.line-highlight\": {\n            background:\n              \"linear-gradient(to right, rgba(221, 103, 44, 0.2) 70%, rgba(221, 103, 44, 0))\",\n          },\n        };\n        e.default = t;\n      })(tl)),\n    tl\n  );\n}\nvar nl = {},\n  n2;\nfunction t6() {\n  return (\n    n2 ||\n      ((n2 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            color: \"#393A34\",\n            fontFamily:\n              '\"Consolas\", \"Bitstream Vera Sans Mono\", \"Courier New\", Courier, monospace',\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            fontSize: \".9em\",\n            lineHeight: \"1.2em\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            color: \"#393A34\",\n            fontFamily:\n              '\"Consolas\", \"Bitstream Vera Sans Mono\", \"Courier New\", Courier, monospace',\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            fontSize: \".9em\",\n            lineHeight: \"1.2em\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            padding: \"1em\",\n            margin: \".5em 0\",\n            overflow: \"auto\",\n            border: \"1px solid #dddddd\",\n            backgroundColor: \"white\",\n          },\n          'pre > code[class*=\"language-\"]': {\n            fontSize: \"1em\",\n          },\n          'pre[class*=\"language-\"]::-moz-selection': {\n            background: \"#b3d4fc\",\n          },\n          'pre[class*=\"language-\"] ::-moz-selection': {\n            background: \"#b3d4fc\",\n          },\n          'code[class*=\"language-\"]::-moz-selection': {\n            background: \"#b3d4fc\",\n          },\n          'code[class*=\"language-\"] ::-moz-selection': {\n            background: \"#b3d4fc\",\n          },\n          'pre[class*=\"language-\"]::selection': {\n            background: \"#b3d4fc\",\n          },\n          'pre[class*=\"language-\"] ::selection': {\n            background: \"#b3d4fc\",\n          },\n          'code[class*=\"language-\"]::selection': {\n            background: \"#b3d4fc\",\n          },\n          'code[class*=\"language-\"] ::selection': {\n            background: \"#b3d4fc\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            padding: \".2em\",\n            paddingTop: \"1px\",\n            paddingBottom: \"1px\",\n            background: \"#f8f8f8\",\n            border: \"1px solid #dddddd\",\n          },\n          comment: {\n            color: \"#999988\",\n            fontStyle: \"italic\",\n          },\n          prolog: {\n            color: \"#999988\",\n            fontStyle: \"italic\",\n          },\n          doctype: {\n            color: \"#999988\",\n            fontStyle: \"italic\",\n          },\n          cdata: {\n            color: \"#999988\",\n            fontStyle: \"italic\",\n          },\n          namespace: {\n            Opacity: \".7\",\n          },\n          string: {\n            color: \"#e3116c\",\n          },\n          \"attr-value\": {\n            color: \"#e3116c\",\n          },\n          punctuation: {\n            color: \"#393A34\",\n          },\n          operator: {\n            color: \"#393A34\",\n          },\n          entity: {\n            color: \"#36acaa\",\n          },\n          url: {\n            color: \"#36acaa\",\n          },\n          symbol: {\n            color: \"#36acaa\",\n          },\n          number: {\n            color: \"#36acaa\",\n          },\n          boolean: {\n            color: \"#36acaa\",\n          },\n          variable: {\n            color: \"#36acaa\",\n          },\n          constant: {\n            color: \"#36acaa\",\n          },\n          property: {\n            color: \"#36acaa\",\n          },\n          regex: {\n            color: \"#36acaa\",\n          },\n          inserted: {\n            color: \"#36acaa\",\n          },\n          atrule: {\n            color: \"#00a4db\",\n          },\n          keyword: {\n            color: \"#00a4db\",\n          },\n          \"attr-name\": {\n            color: \"#00a4db\",\n          },\n          \".language-autohotkey .token.selector\": {\n            color: \"#00a4db\",\n          },\n          function: {\n            color: \"#9a050f\",\n            fontWeight: \"bold\",\n          },\n          deleted: {\n            color: \"#9a050f\",\n          },\n          \".language-autohotkey .token.tag\": {\n            color: \"#9a050f\",\n          },\n          tag: {\n            color: \"#00009f\",\n          },\n          selector: {\n            color: \"#00009f\",\n          },\n          \".language-autohotkey .token.keyword\": {\n            color: \"#00009f\",\n          },\n          important: {\n            fontWeight: \"bold\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n        };\n        e.default = t;\n      })(nl)),\n    nl\n  );\n}\nvar ol = {},\n  o2;\nfunction n6() {\n  return (\n    o2 ||\n      ((o2 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            color: \"#ebdbb2\",\n            fontFamily: 'Consolas, Monaco, \"Andale Mono\", monospace',\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            color: \"#ebdbb2\",\n            fontFamily: 'Consolas, Monaco, \"Andale Mono\", monospace',\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            padding: \"1em\",\n            margin: \"0.5em 0\",\n            overflow: \"auto\",\n            background: \"#1d2021\",\n          },\n          'pre[class*=\"language-\"]::-moz-selection': {\n            color: \"#fbf1c7\",\n            background: \"#7c6f64\",\n          },\n          'pre[class*=\"language-\"] ::-moz-selection': {\n            color: \"#fbf1c7\",\n            background: \"#7c6f64\",\n          },\n          'code[class*=\"language-\"]::-moz-selection': {\n            color: \"#fbf1c7\",\n            background: \"#7c6f64\",\n          },\n          'code[class*=\"language-\"] ::-moz-selection': {\n            color: \"#fbf1c7\",\n            background: \"#7c6f64\",\n          },\n          'pre[class*=\"language-\"]::selection': {\n            color: \"#fbf1c7\",\n            background: \"#7c6f64\",\n          },\n          'pre[class*=\"language-\"] ::selection': {\n            color: \"#fbf1c7\",\n            background: \"#7c6f64\",\n          },\n          'code[class*=\"language-\"]::selection': {\n            color: \"#fbf1c7\",\n            background: \"#7c6f64\",\n          },\n          'code[class*=\"language-\"] ::selection': {\n            color: \"#fbf1c7\",\n            background: \"#7c6f64\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            background: \"#1d2021\",\n            padding: \"0.1em\",\n            borderRadius: \"0.3em\",\n          },\n          comment: {\n            color: \"#a89984\",\n          },\n          prolog: {\n            color: \"#a89984\",\n          },\n          cdata: {\n            color: \"#a89984\",\n          },\n          delimiter: {\n            color: \"#fb4934\",\n          },\n          boolean: {\n            color: \"#fb4934\",\n          },\n          keyword: {\n            color: \"#fb4934\",\n          },\n          selector: {\n            color: \"#fb4934\",\n          },\n          important: {\n            color: \"#fb4934\",\n          },\n          atrule: {\n            color: \"#fb4934\",\n          },\n          operator: {\n            color: \"#a89984\",\n          },\n          punctuation: {\n            color: \"#a89984\",\n          },\n          \"attr-name\": {\n            color: \"#a89984\",\n          },\n          tag: {\n            color: \"#fabd2f\",\n          },\n          \"tag.punctuation\": {\n            color: \"#fabd2f\",\n          },\n          doctype: {\n            color: \"#fabd2f\",\n          },\n          builtin: {\n            color: \"#fabd2f\",\n          },\n          entity: {\n            color: \"#d3869b\",\n          },\n          number: {\n            color: \"#d3869b\",\n          },\n          symbol: {\n            color: \"#d3869b\",\n          },\n          property: {\n            color: \"#fb4934\",\n          },\n          constant: {\n            color: \"#fb4934\",\n          },\n          variable: {\n            color: \"#fb4934\",\n          },\n          string: {\n            color: \"#b8bb26\",\n          },\n          char: {\n            color: \"#b8bb26\",\n          },\n          \"attr-value\": {\n            color: \"#a89984\",\n          },\n          \"attr-value.punctuation\": {\n            color: \"#a89984\",\n          },\n          url: {\n            color: \"#b8bb26\",\n            textDecoration: \"underline\",\n          },\n          function: {\n            color: \"#fabd2f\",\n          },\n          regex: {\n            background: \"#b8bb26\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n          inserted: {\n            background: \"#a89984\",\n          },\n          deleted: {\n            background: \"#fb4934\",\n          },\n        };\n        e.default = t;\n      })(ol)),\n    ol\n  );\n}\nvar rl = {},\n  r2;\nfunction o6() {\n  return (\n    r2 ||\n      ((r2 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            color: \"#3c3836\",\n            fontFamily: 'Consolas, Monaco, \"Andale Mono\", monospace',\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            color: \"#3c3836\",\n            fontFamily: 'Consolas, Monaco, \"Andale Mono\", monospace',\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            padding: \"1em\",\n            margin: \"0.5em 0\",\n            overflow: \"auto\",\n            background: \"#f9f5d7\",\n          },\n          'pre[class*=\"language-\"]::-moz-selection': {\n            color: \"#282828\",\n            background: \"#a89984\",\n          },\n          'pre[class*=\"language-\"] ::-moz-selection': {\n            color: \"#282828\",\n            background: \"#a89984\",\n          },\n          'code[class*=\"language-\"]::-moz-selection': {\n            color: \"#282828\",\n            background: \"#a89984\",\n          },\n          'code[class*=\"language-\"] ::-moz-selection': {\n            color: \"#282828\",\n            background: \"#a89984\",\n          },\n          'pre[class*=\"language-\"]::selection': {\n            color: \"#282828\",\n            background: \"#a89984\",\n          },\n          'pre[class*=\"language-\"] ::selection': {\n            color: \"#282828\",\n            background: \"#a89984\",\n          },\n          'code[class*=\"language-\"]::selection': {\n            color: \"#282828\",\n            background: \"#a89984\",\n          },\n          'code[class*=\"language-\"] ::selection': {\n            color: \"#282828\",\n            background: \"#a89984\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            background: \"#f9f5d7\",\n            padding: \"0.1em\",\n            borderRadius: \"0.3em\",\n          },\n          comment: {\n            color: \"#7c6f64\",\n          },\n          prolog: {\n            color: \"#7c6f64\",\n          },\n          cdata: {\n            color: \"#7c6f64\",\n          },\n          delimiter: {\n            color: \"#9d0006\",\n          },\n          boolean: {\n            color: \"#9d0006\",\n          },\n          keyword: {\n            color: \"#9d0006\",\n          },\n          selector: {\n            color: \"#9d0006\",\n          },\n          important: {\n            color: \"#9d0006\",\n          },\n          atrule: {\n            color: \"#9d0006\",\n          },\n          operator: {\n            color: \"#7c6f64\",\n          },\n          punctuation: {\n            color: \"#7c6f64\",\n          },\n          \"attr-name\": {\n            color: \"#7c6f64\",\n          },\n          tag: {\n            color: \"#b57614\",\n          },\n          \"tag.punctuation\": {\n            color: \"#b57614\",\n          },\n          doctype: {\n            color: \"#b57614\",\n          },\n          builtin: {\n            color: \"#b57614\",\n          },\n          entity: {\n            color: \"#8f3f71\",\n          },\n          number: {\n            color: \"#8f3f71\",\n          },\n          symbol: {\n            color: \"#8f3f71\",\n          },\n          property: {\n            color: \"#9d0006\",\n          },\n          constant: {\n            color: \"#9d0006\",\n          },\n          variable: {\n            color: \"#9d0006\",\n          },\n          string: {\n            color: \"#797403\",\n          },\n          char: {\n            color: \"#797403\",\n          },\n          \"attr-value\": {\n            color: \"#7c6f64\",\n          },\n          \"attr-value.punctuation\": {\n            color: \"#7c6f64\",\n          },\n          url: {\n            color: \"#797403\",\n            textDecoration: \"underline\",\n          },\n          function: {\n            color: \"#b57614\",\n          },\n          regex: {\n            background: \"#797403\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n          inserted: {\n            background: \"#7c6f64\",\n          },\n          deleted: {\n            background: \"#9d0006\",\n          },\n        };\n        e.default = t;\n      })(rl)),\n    rl\n  );\n}\nvar il = {},\n  i2;\nfunction r6() {\n  return (\n    i2 ||\n      ((i2 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          \"code[class*='language-']\": {\n            color: \"#d6e7ff\",\n            background: \"#030314\",\n            textShadow: \"none\",\n            fontFamily:\n              'Consolas, Monaco, \"Andale Mono\", \"Ubuntu Mono\", monospace',\n            fontSize: \"1em\",\n            lineHeight: \"1.5\",\n            letterSpacing: \".2px\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            textAlign: \"left\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          \"pre[class*='language-']\": {\n            color: \"#d6e7ff\",\n            background: \"#030314\",\n            textShadow: \"none\",\n            fontFamily:\n              'Consolas, Monaco, \"Andale Mono\", \"Ubuntu Mono\", monospace',\n            fontSize: \"1em\",\n            lineHeight: \"1.5\",\n            letterSpacing: \".2px\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            textAlign: \"left\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            border: \"1px solid #2a4555\",\n            borderRadius: \"5px\",\n            padding: \"1.5em 1em\",\n            margin: \"1em 0\",\n            overflow: \"auto\",\n          },\n          \"pre[class*='language-']::-moz-selection\": {\n            color: \"inherit\",\n            background: \"#1d3b54\",\n            textShadow: \"none\",\n          },\n          \"pre[class*='language-'] ::-moz-selection\": {\n            color: \"inherit\",\n            background: \"#1d3b54\",\n            textShadow: \"none\",\n          },\n          \"code[class*='language-']::-moz-selection\": {\n            color: \"inherit\",\n            background: \"#1d3b54\",\n            textShadow: \"none\",\n          },\n          \"code[class*='language-'] ::-moz-selection\": {\n            color: \"inherit\",\n            background: \"#1d3b54\",\n            textShadow: \"none\",\n          },\n          \"pre[class*='language-']::selection\": {\n            color: \"inherit\",\n            background: \"#1d3b54\",\n            textShadow: \"none\",\n          },\n          \"pre[class*='language-'] ::selection\": {\n            color: \"inherit\",\n            background: \"#1d3b54\",\n            textShadow: \"none\",\n          },\n          \"code[class*='language-']::selection\": {\n            color: \"inherit\",\n            background: \"#1d3b54\",\n            textShadow: \"none\",\n          },\n          \"code[class*='language-'] ::selection\": {\n            color: \"inherit\",\n            background: \"#1d3b54\",\n            textShadow: \"none\",\n          },\n          \":not(pre) > code[class*='language-']\": {\n            color: \"#f0f6f6\",\n            background: \"#2a4555\",\n            padding: \"0.2em 0.3em\",\n            borderRadius: \"0.2em\",\n            boxDecorationBreak: \"clone\",\n          },\n          comment: {\n            color: \"#446e69\",\n          },\n          prolog: {\n            color: \"#446e69\",\n          },\n          doctype: {\n            color: \"#446e69\",\n          },\n          cdata: {\n            color: \"#446e69\",\n          },\n          punctuation: {\n            color: \"#d6b007\",\n          },\n          property: {\n            color: \"#d6e7ff\",\n          },\n          tag: {\n            color: \"#d6e7ff\",\n          },\n          boolean: {\n            color: \"#d6e7ff\",\n          },\n          number: {\n            color: \"#d6e7ff\",\n          },\n          constant: {\n            color: \"#d6e7ff\",\n          },\n          symbol: {\n            color: \"#d6e7ff\",\n          },\n          deleted: {\n            color: \"#d6e7ff\",\n          },\n          selector: {\n            color: \"#e60067\",\n          },\n          \"attr-name\": {\n            color: \"#e60067\",\n          },\n          builtin: {\n            color: \"#e60067\",\n          },\n          inserted: {\n            color: \"#e60067\",\n          },\n          string: {\n            color: \"#49c6ec\",\n          },\n          char: {\n            color: \"#49c6ec\",\n          },\n          operator: {\n            color: \"#ec8e01\",\n            background: \"transparent\",\n          },\n          entity: {\n            color: \"#ec8e01\",\n            background: \"transparent\",\n          },\n          url: {\n            color: \"#ec8e01\",\n            background: \"transparent\",\n          },\n          \".language-css .token.string\": {\n            color: \"#ec8e01\",\n            background: \"transparent\",\n          },\n          \".style .token.string\": {\n            color: \"#ec8e01\",\n            background: \"transparent\",\n          },\n          atrule: {\n            color: \"#0fe468\",\n          },\n          \"attr-value\": {\n            color: \"#0fe468\",\n          },\n          keyword: {\n            color: \"#0fe468\",\n          },\n          function: {\n            color: \"#78f3e9\",\n          },\n          \"class-name\": {\n            color: \"#78f3e9\",\n          },\n          regex: {\n            color: \"#d6e7ff\",\n          },\n          important: {\n            color: \"#d6e7ff\",\n          },\n          variable: {\n            color: \"#d6e7ff\",\n          },\n        };\n        e.default = t;\n      })(il)),\n    il\n  );\n}\nvar al = {},\n  a2;\nfunction i6() {\n  return (\n    a2 ||\n      ((a2 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            fontFamily:\n              '\"Fira Mono\", Menlo, Monaco, \"Lucida Console\", \"Courier New\", Courier, monospace',\n            fontSize: \"16px\",\n            lineHeight: \"1.375\",\n            direction: \"ltr\",\n            textAlign: \"left\",\n            wordSpacing: \"normal\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            whiteSpace: \"pre-wrap\",\n            wordBreak: \"break-all\",\n            wordWrap: \"break-word\",\n            background: \"#322931\",\n            color: \"#b9b5b8\",\n          },\n          'pre[class*=\"language-\"]': {\n            fontFamily:\n              '\"Fira Mono\", Menlo, Monaco, \"Lucida Console\", \"Courier New\", Courier, monospace',\n            fontSize: \"16px\",\n            lineHeight: \"1.375\",\n            direction: \"ltr\",\n            textAlign: \"left\",\n            wordSpacing: \"normal\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            whiteSpace: \"pre-wrap\",\n            wordBreak: \"break-all\",\n            wordWrap: \"break-word\",\n            background: \"#322931\",\n            color: \"#b9b5b8\",\n            padding: \"1em\",\n            margin: \".5em 0\",\n            overflow: \"auto\",\n          },\n          'pre > code[class*=\"language-\"]': {\n            fontSize: \"1em\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            padding: \".1em\",\n            borderRadius: \".3em\",\n          },\n          comment: {\n            color: \"#797379\",\n          },\n          prolog: {\n            color: \"#797379\",\n          },\n          doctype: {\n            color: \"#797379\",\n          },\n          cdata: {\n            color: \"#797379\",\n          },\n          punctuation: {\n            color: \"#b9b5b8\",\n          },\n          \".namespace\": {\n            Opacity: \".7\",\n          },\n          null: {\n            color: \"#fd8b19\",\n          },\n          operator: {\n            color: \"#fd8b19\",\n          },\n          boolean: {\n            color: \"#fd8b19\",\n          },\n          number: {\n            color: \"#fd8b19\",\n          },\n          property: {\n            color: \"#fdcc59\",\n          },\n          tag: {\n            color: \"#1290bf\",\n          },\n          string: {\n            color: \"#149b93\",\n          },\n          selector: {\n            color: \"#c85e7c\",\n          },\n          \"attr-name\": {\n            color: \"#fd8b19\",\n          },\n          entity: {\n            color: \"#149b93\",\n            cursor: \"help\",\n          },\n          url: {\n            color: \"#149b93\",\n          },\n          \".language-css .token.string\": {\n            color: \"#149b93\",\n          },\n          \".style .token.string\": {\n            color: \"#149b93\",\n          },\n          \"attr-value\": {\n            color: \"#8fc13e\",\n          },\n          keyword: {\n            color: \"#8fc13e\",\n          },\n          control: {\n            color: \"#8fc13e\",\n          },\n          directive: {\n            color: \"#8fc13e\",\n          },\n          unit: {\n            color: \"#8fc13e\",\n          },\n          statement: {\n            color: \"#149b93\",\n          },\n          regex: {\n            color: \"#149b93\",\n          },\n          atrule: {\n            color: \"#149b93\",\n          },\n          placeholder: {\n            color: \"#1290bf\",\n          },\n          variable: {\n            color: \"#1290bf\",\n          },\n          important: {\n            color: \"#dd464c\",\n            fontWeight: \"bold\",\n          },\n          \"pre > code.highlight\": {\n            Outline: \".4em solid red\",\n            OutlineOffset: \".4em\",\n          },\n        };\n        e.default = t;\n      })(al)),\n    al\n  );\n}\nvar ll = {},\n  l2;\nfunction a6() {\n  return (\n    l2 ||\n      ((l2 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            color: \"#f8f8f2\",\n            background: \"none\",\n            textShadow: \"0 1px rgba(0, 0, 0, 0.3)\",\n            fontFamily:\n              \"Monaco, Consolas, 'Andale Mono', 'Ubuntu Mono', monospace\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            color: \"#f8f8f2\",\n            background: \"#263E52\",\n            textShadow: \"0 1px rgba(0, 0, 0, 0.3)\",\n            fontFamily:\n              \"Monaco, Consolas, 'Andale Mono', 'Ubuntu Mono', monospace\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            padding: \"1em\",\n            margin: \".5em 0\",\n            overflow: \"auto\",\n            borderRadius: \"0.3em\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            background: \"#263E52\",\n            padding: \".1em\",\n            borderRadius: \".3em\",\n            whiteSpace: \"normal\",\n          },\n          comment: {\n            color: \"#5c98cd\",\n          },\n          prolog: {\n            color: \"#5c98cd\",\n          },\n          doctype: {\n            color: \"#5c98cd\",\n          },\n          cdata: {\n            color: \"#5c98cd\",\n          },\n          punctuation: {\n            color: \"#f8f8f2\",\n          },\n          \".namespace\": {\n            Opacity: \".7\",\n          },\n          property: {\n            color: \"#F05E5D\",\n          },\n          tag: {\n            color: \"#F05E5D\",\n          },\n          constant: {\n            color: \"#F05E5D\",\n          },\n          symbol: {\n            color: \"#F05E5D\",\n          },\n          deleted: {\n            color: \"#F05E5D\",\n          },\n          boolean: {\n            color: \"#BC94F9\",\n          },\n          number: {\n            color: \"#BC94F9\",\n          },\n          selector: {\n            color: \"#FCFCD6\",\n          },\n          \"attr-name\": {\n            color: \"#FCFCD6\",\n          },\n          string: {\n            color: \"#FCFCD6\",\n          },\n          char: {\n            color: \"#FCFCD6\",\n          },\n          builtin: {\n            color: \"#FCFCD6\",\n          },\n          inserted: {\n            color: \"#FCFCD6\",\n          },\n          operator: {\n            color: \"#f8f8f2\",\n          },\n          entity: {\n            color: \"#f8f8f2\",\n            cursor: \"help\",\n          },\n          url: {\n            color: \"#f8f8f2\",\n          },\n          \".language-css .token.string\": {\n            color: \"#f8f8f2\",\n          },\n          \".style .token.string\": {\n            color: \"#f8f8f2\",\n          },\n          variable: {\n            color: \"#f8f8f2\",\n          },\n          atrule: {\n            color: \"#66D8EF\",\n          },\n          \"attr-value\": {\n            color: \"#66D8EF\",\n          },\n          function: {\n            color: \"#66D8EF\",\n          },\n          \"class-name\": {\n            color: \"#66D8EF\",\n          },\n          keyword: {\n            color: \"#6EB26E\",\n          },\n          regex: {\n            color: \"#F05E5D\",\n          },\n          important: {\n            color: \"#F05E5D\",\n            fontWeight: \"bold\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n        };\n        e.default = t;\n      })(ll)),\n    ll\n  );\n}\nvar sl = {},\n  s2;\nfunction l6() {\n  return (\n    s2 ||\n      ((s2 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            color: \"#eee\",\n            background: \"#2f2f2f\",\n            fontFamily: \"Roboto Mono, monospace\",\n            fontSize: \"1em\",\n            lineHeight: \"1.5em\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            color: \"#eee\",\n            background: \"#2f2f2f\",\n            fontFamily: \"Roboto Mono, monospace\",\n            fontSize: \"1em\",\n            lineHeight: \"1.5em\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            overflow: \"auto\",\n            position: \"relative\",\n            margin: \"0.5em 0\",\n            padding: \"1.25em 1em\",\n          },\n          'code[class*=\"language-\"]::-moz-selection': {\n            background: \"#363636\",\n          },\n          'pre[class*=\"language-\"]::-moz-selection': {\n            background: \"#363636\",\n          },\n          'code[class*=\"language-\"] ::-moz-selection': {\n            background: \"#363636\",\n          },\n          'pre[class*=\"language-\"] ::-moz-selection': {\n            background: \"#363636\",\n          },\n          'code[class*=\"language-\"]::selection': {\n            background: \"#363636\",\n          },\n          'pre[class*=\"language-\"]::selection': {\n            background: \"#363636\",\n          },\n          'code[class*=\"language-\"] ::selection': {\n            background: \"#363636\",\n          },\n          'pre[class*=\"language-\"] ::selection': {\n            background: \"#363636\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            whiteSpace: \"normal\",\n            borderRadius: \"0.2em\",\n            padding: \"0.1em\",\n          },\n          \".language-css > code\": {\n            color: \"#fd9170\",\n          },\n          \".language-sass > code\": {\n            color: \"#fd9170\",\n          },\n          \".language-scss > code\": {\n            color: \"#fd9170\",\n          },\n          '[class*=\"language-\"] .namespace': {\n            Opacity: \"0.7\",\n          },\n          atrule: {\n            color: \"#c792ea\",\n          },\n          \"attr-name\": {\n            color: \"#ffcb6b\",\n          },\n          \"attr-value\": {\n            color: \"#a5e844\",\n          },\n          attribute: {\n            color: \"#a5e844\",\n          },\n          boolean: {\n            color: \"#c792ea\",\n          },\n          builtin: {\n            color: \"#ffcb6b\",\n          },\n          cdata: {\n            color: \"#80cbc4\",\n          },\n          char: {\n            color: \"#80cbc4\",\n          },\n          class: {\n            color: \"#ffcb6b\",\n          },\n          \"class-name\": {\n            color: \"#f2ff00\",\n          },\n          comment: {\n            color: \"#616161\",\n          },\n          constant: {\n            color: \"#c792ea\",\n          },\n          deleted: {\n            color: \"#ff6666\",\n          },\n          doctype: {\n            color: \"#616161\",\n          },\n          entity: {\n            color: \"#ff6666\",\n          },\n          function: {\n            color: \"#c792ea\",\n          },\n          hexcode: {\n            color: \"#f2ff00\",\n          },\n          id: {\n            color: \"#c792ea\",\n            fontWeight: \"bold\",\n          },\n          important: {\n            color: \"#c792ea\",\n            fontWeight: \"bold\",\n          },\n          inserted: {\n            color: \"#80cbc4\",\n          },\n          keyword: {\n            color: \"#c792ea\",\n          },\n          number: {\n            color: \"#fd9170\",\n          },\n          operator: {\n            color: \"#89ddff\",\n          },\n          prolog: {\n            color: \"#616161\",\n          },\n          property: {\n            color: \"#80cbc4\",\n          },\n          \"pseudo-class\": {\n            color: \"#a5e844\",\n          },\n          \"pseudo-element\": {\n            color: \"#a5e844\",\n          },\n          punctuation: {\n            color: \"#89ddff\",\n          },\n          regex: {\n            color: \"#f2ff00\",\n          },\n          selector: {\n            color: \"#ff6666\",\n          },\n          string: {\n            color: \"#a5e844\",\n          },\n          symbol: {\n            color: \"#c792ea\",\n          },\n          tag: {\n            color: \"#ff6666\",\n          },\n          unit: {\n            color: \"#fd9170\",\n          },\n          url: {\n            color: \"#ff6666\",\n          },\n          variable: {\n            color: \"#ff6666\",\n          },\n        };\n        e.default = t;\n      })(sl)),\n    sl\n  );\n}\nvar cl = {},\n  c2;\nfunction s6() {\n  return (\n    c2 ||\n      ((c2 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            color: \"#90a4ae\",\n            background: \"#fafafa\",\n            fontFamily: \"Roboto Mono, monospace\",\n            fontSize: \"1em\",\n            lineHeight: \"1.5em\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            color: \"#90a4ae\",\n            background: \"#fafafa\",\n            fontFamily: \"Roboto Mono, monospace\",\n            fontSize: \"1em\",\n            lineHeight: \"1.5em\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            overflow: \"auto\",\n            position: \"relative\",\n            margin: \"0.5em 0\",\n            padding: \"1.25em 1em\",\n          },\n          'code[class*=\"language-\"]::-moz-selection': {\n            background: \"#cceae7\",\n            color: \"#263238\",\n          },\n          'pre[class*=\"language-\"]::-moz-selection': {\n            background: \"#cceae7\",\n            color: \"#263238\",\n          },\n          'code[class*=\"language-\"] ::-moz-selection': {\n            background: \"#cceae7\",\n            color: \"#263238\",\n          },\n          'pre[class*=\"language-\"] ::-moz-selection': {\n            background: \"#cceae7\",\n            color: \"#263238\",\n          },\n          'code[class*=\"language-\"]::selection': {\n            background: \"#cceae7\",\n            color: \"#263238\",\n          },\n          'pre[class*=\"language-\"]::selection': {\n            background: \"#cceae7\",\n            color: \"#263238\",\n          },\n          'code[class*=\"language-\"] ::selection': {\n            background: \"#cceae7\",\n            color: \"#263238\",\n          },\n          'pre[class*=\"language-\"] ::selection': {\n            background: \"#cceae7\",\n            color: \"#263238\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            whiteSpace: \"normal\",\n            borderRadius: \"0.2em\",\n            padding: \"0.1em\",\n          },\n          \".language-css > code\": {\n            color: \"#f76d47\",\n          },\n          \".language-sass > code\": {\n            color: \"#f76d47\",\n          },\n          \".language-scss > code\": {\n            color: \"#f76d47\",\n          },\n          '[class*=\"language-\"] .namespace': {\n            Opacity: \"0.7\",\n          },\n          atrule: {\n            color: \"#7c4dff\",\n          },\n          \"attr-name\": {\n            color: \"#39adb5\",\n          },\n          \"attr-value\": {\n            color: \"#f6a434\",\n          },\n          attribute: {\n            color: \"#f6a434\",\n          },\n          boolean: {\n            color: \"#7c4dff\",\n          },\n          builtin: {\n            color: \"#39adb5\",\n          },\n          cdata: {\n            color: \"#39adb5\",\n          },\n          char: {\n            color: \"#39adb5\",\n          },\n          class: {\n            color: \"#39adb5\",\n          },\n          \"class-name\": {\n            color: \"#6182b8\",\n          },\n          comment: {\n            color: \"#aabfc9\",\n          },\n          constant: {\n            color: \"#7c4dff\",\n          },\n          deleted: {\n            color: \"#e53935\",\n          },\n          doctype: {\n            color: \"#aabfc9\",\n          },\n          entity: {\n            color: \"#e53935\",\n          },\n          function: {\n            color: \"#7c4dff\",\n          },\n          hexcode: {\n            color: \"#f76d47\",\n          },\n          id: {\n            color: \"#7c4dff\",\n            fontWeight: \"bold\",\n          },\n          important: {\n            color: \"#7c4dff\",\n            fontWeight: \"bold\",\n          },\n          inserted: {\n            color: \"#39adb5\",\n          },\n          keyword: {\n            color: \"#7c4dff\",\n          },\n          number: {\n            color: \"#f76d47\",\n          },\n          operator: {\n            color: \"#39adb5\",\n          },\n          prolog: {\n            color: \"#aabfc9\",\n          },\n          property: {\n            color: \"#39adb5\",\n          },\n          \"pseudo-class\": {\n            color: \"#f6a434\",\n          },\n          \"pseudo-element\": {\n            color: \"#f6a434\",\n          },\n          punctuation: {\n            color: \"#39adb5\",\n          },\n          regex: {\n            color: \"#6182b8\",\n          },\n          selector: {\n            color: \"#e53935\",\n          },\n          string: {\n            color: \"#f6a434\",\n          },\n          symbol: {\n            color: \"#7c4dff\",\n          },\n          tag: {\n            color: \"#e53935\",\n          },\n          unit: {\n            color: \"#f76d47\",\n          },\n          url: {\n            color: \"#e53935\",\n          },\n          variable: {\n            color: \"#e53935\",\n          },\n        };\n        e.default = t;\n      })(cl)),\n    cl\n  );\n}\nvar ul = {},\n  u2;\nfunction c6() {\n  return (\n    u2 ||\n      ((u2 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            color: \"#c3cee3\",\n            background: \"#263238\",\n            fontFamily: \"Roboto Mono, monospace\",\n            fontSize: \"1em\",\n            lineHeight: \"1.5em\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            color: \"#c3cee3\",\n            background: \"#263238\",\n            fontFamily: \"Roboto Mono, monospace\",\n            fontSize: \"1em\",\n            lineHeight: \"1.5em\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            overflow: \"auto\",\n            position: \"relative\",\n            margin: \"0.5em 0\",\n            padding: \"1.25em 1em\",\n          },\n          'code[class*=\"language-\"]::-moz-selection': {\n            background: \"#363636\",\n          },\n          'pre[class*=\"language-\"]::-moz-selection': {\n            background: \"#363636\",\n          },\n          'code[class*=\"language-\"] ::-moz-selection': {\n            background: \"#363636\",\n          },\n          'pre[class*=\"language-\"] ::-moz-selection': {\n            background: \"#363636\",\n          },\n          'code[class*=\"language-\"]::selection': {\n            background: \"#363636\",\n          },\n          'pre[class*=\"language-\"]::selection': {\n            background: \"#363636\",\n          },\n          'code[class*=\"language-\"] ::selection': {\n            background: \"#363636\",\n          },\n          'pre[class*=\"language-\"] ::selection': {\n            background: \"#363636\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            whiteSpace: \"normal\",\n            borderRadius: \"0.2em\",\n            padding: \"0.1em\",\n          },\n          \".language-css > code\": {\n            color: \"#fd9170\",\n          },\n          \".language-sass > code\": {\n            color: \"#fd9170\",\n          },\n          \".language-scss > code\": {\n            color: \"#fd9170\",\n          },\n          '[class*=\"language-\"] .namespace': {\n            Opacity: \"0.7\",\n          },\n          atrule: {\n            color: \"#c792ea\",\n          },\n          \"attr-name\": {\n            color: \"#ffcb6b\",\n          },\n          \"attr-value\": {\n            color: \"#c3e88d\",\n          },\n          attribute: {\n            color: \"#c3e88d\",\n          },\n          boolean: {\n            color: \"#c792ea\",\n          },\n          builtin: {\n            color: \"#ffcb6b\",\n          },\n          cdata: {\n            color: \"#80cbc4\",\n          },\n          char: {\n            color: \"#80cbc4\",\n          },\n          class: {\n            color: \"#ffcb6b\",\n          },\n          \"class-name\": {\n            color: \"#f2ff00\",\n          },\n          color: {\n            color: \"#f2ff00\",\n          },\n          comment: {\n            color: \"#546e7a\",\n          },\n          constant: {\n            color: \"#c792ea\",\n          },\n          deleted: {\n            color: \"#f07178\",\n          },\n          doctype: {\n            color: \"#546e7a\",\n          },\n          entity: {\n            color: \"#f07178\",\n          },\n          function: {\n            color: \"#c792ea\",\n          },\n          hexcode: {\n            color: \"#f2ff00\",\n          },\n          id: {\n            color: \"#c792ea\",\n            fontWeight: \"bold\",\n          },\n          important: {\n            color: \"#c792ea\",\n            fontWeight: \"bold\",\n          },\n          inserted: {\n            color: \"#80cbc4\",\n          },\n          keyword: {\n            color: \"#c792ea\",\n            fontStyle: \"italic\",\n          },\n          number: {\n            color: \"#fd9170\",\n          },\n          operator: {\n            color: \"#89ddff\",\n          },\n          prolog: {\n            color: \"#546e7a\",\n          },\n          property: {\n            color: \"#80cbc4\",\n          },\n          \"pseudo-class\": {\n            color: \"#c3e88d\",\n          },\n          \"pseudo-element\": {\n            color: \"#c3e88d\",\n          },\n          punctuation: {\n            color: \"#89ddff\",\n          },\n          regex: {\n            color: \"#f2ff00\",\n          },\n          selector: {\n            color: \"#f07178\",\n          },\n          string: {\n            color: \"#c3e88d\",\n          },\n          symbol: {\n            color: \"#c792ea\",\n          },\n          tag: {\n            color: \"#f07178\",\n          },\n          unit: {\n            color: \"#f07178\",\n          },\n          url: {\n            color: \"#fd9170\",\n          },\n          variable: {\n            color: \"#f07178\",\n          },\n        };\n        e.default = t;\n      })(ul)),\n    ul\n  );\n}\nvar dl = {},\n  d2;\nfunction u6() {\n  return (\n    d2 ||\n      ((d2 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            color: \"#d6deeb\",\n            fontFamily:\n              'Consolas, Monaco, \"Andale Mono\", \"Ubuntu Mono\", monospace',\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            fontSize: \"1em\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            color: \"white\",\n            fontFamily:\n              'Consolas, Monaco, \"Andale Mono\", \"Ubuntu Mono\", monospace',\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            fontSize: \"1em\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            padding: \"1em\",\n            margin: \"0.5em 0\",\n            overflow: \"auto\",\n            background: \"#011627\",\n          },\n          'pre[class*=\"language-\"]::-moz-selection': {\n            textShadow: \"none\",\n            background: \"rgba(29, 59, 83, 0.99)\",\n          },\n          'pre[class*=\"language-\"] ::-moz-selection': {\n            textShadow: \"none\",\n            background: \"rgba(29, 59, 83, 0.99)\",\n          },\n          'code[class*=\"language-\"]::-moz-selection': {\n            textShadow: \"none\",\n            background: \"rgba(29, 59, 83, 0.99)\",\n          },\n          'code[class*=\"language-\"] ::-moz-selection': {\n            textShadow: \"none\",\n            background: \"rgba(29, 59, 83, 0.99)\",\n          },\n          'pre[class*=\"language-\"]::selection': {\n            textShadow: \"none\",\n            background: \"rgba(29, 59, 83, 0.99)\",\n          },\n          'pre[class*=\"language-\"] ::selection': {\n            textShadow: \"none\",\n            background: \"rgba(29, 59, 83, 0.99)\",\n          },\n          'code[class*=\"language-\"]::selection': {\n            textShadow: \"none\",\n            background: \"rgba(29, 59, 83, 0.99)\",\n          },\n          'code[class*=\"language-\"] ::selection': {\n            textShadow: \"none\",\n            background: \"rgba(29, 59, 83, 0.99)\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            color: \"white\",\n            background: \"#011627\",\n            padding: \"0.1em\",\n            borderRadius: \"0.3em\",\n            whiteSpace: \"normal\",\n          },\n          comment: {\n            color: \"rgb(99, 119, 119)\",\n            fontStyle: \"italic\",\n          },\n          prolog: {\n            color: \"rgb(99, 119, 119)\",\n            fontStyle: \"italic\",\n          },\n          cdata: {\n            color: \"rgb(99, 119, 119)\",\n            fontStyle: \"italic\",\n          },\n          punctuation: {\n            color: \"rgb(199, 146, 234)\",\n          },\n          \".namespace\": {\n            color: \"rgb(178, 204, 214)\",\n          },\n          deleted: {\n            color: \"rgba(239, 83, 80, 0.56)\",\n            fontStyle: \"italic\",\n          },\n          symbol: {\n            color: \"rgb(128, 203, 196)\",\n          },\n          property: {\n            color: \"rgb(128, 203, 196)\",\n          },\n          tag: {\n            color: \"rgb(127, 219, 202)\",\n          },\n          operator: {\n            color: \"rgb(127, 219, 202)\",\n          },\n          keyword: {\n            color: \"rgb(127, 219, 202)\",\n          },\n          boolean: {\n            color: \"rgb(255, 88, 116)\",\n          },\n          number: {\n            color: \"rgb(247, 140, 108)\",\n          },\n          constant: {\n            color: \"rgb(130, 170, 255)\",\n          },\n          function: {\n            color: \"rgb(130, 170, 255)\",\n          },\n          builtin: {\n            color: \"rgb(130, 170, 255)\",\n          },\n          char: {\n            color: \"rgb(130, 170, 255)\",\n          },\n          selector: {\n            color: \"rgb(199, 146, 234)\",\n            fontStyle: \"italic\",\n          },\n          doctype: {\n            color: \"rgb(199, 146, 234)\",\n            fontStyle: \"italic\",\n          },\n          \"attr-name\": {\n            color: \"rgb(173, 219, 103)\",\n            fontStyle: \"italic\",\n          },\n          inserted: {\n            color: \"rgb(173, 219, 103)\",\n            fontStyle: \"italic\",\n          },\n          string: {\n            color: \"rgb(173, 219, 103)\",\n          },\n          url: {\n            color: \"rgb(173, 219, 103)\",\n          },\n          entity: {\n            color: \"rgb(173, 219, 103)\",\n          },\n          \".language-css .token.string\": {\n            color: \"rgb(173, 219, 103)\",\n          },\n          \".style .token.string\": {\n            color: \"rgb(173, 219, 103)\",\n          },\n          \"class-name\": {\n            color: \"rgb(255, 203, 139)\",\n          },\n          atrule: {\n            color: \"rgb(255, 203, 139)\",\n          },\n          \"attr-value\": {\n            color: \"rgb(255, 203, 139)\",\n          },\n          regex: {\n            color: \"rgb(214, 222, 235)\",\n          },\n          important: {\n            color: \"rgb(214, 222, 235)\",\n            fontWeight: \"bold\",\n          },\n          variable: {\n            color: \"rgb(214, 222, 235)\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n        };\n        e.default = t;\n      })(dl)),\n    dl\n  );\n}\nvar fl = {},\n  f2;\nfunction d6() {\n  return (\n    f2 ||\n      ((f2 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            color: \"#f8f8f2\",\n            background: \"none\",\n            fontFamily: `\"Fira Code\", Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace`,\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            color: \"#f8f8f2\",\n            background: \"#2E3440\",\n            fontFamily: `\"Fira Code\", Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace`,\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            padding: \"1em\",\n            margin: \".5em 0\",\n            overflow: \"auto\",\n            borderRadius: \"0.3em\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            background: \"#2E3440\",\n            padding: \".1em\",\n            borderRadius: \".3em\",\n            whiteSpace: \"normal\",\n          },\n          comment: {\n            color: \"#636f88\",\n          },\n          prolog: {\n            color: \"#636f88\",\n          },\n          doctype: {\n            color: \"#636f88\",\n          },\n          cdata: {\n            color: \"#636f88\",\n          },\n          punctuation: {\n            color: \"#81A1C1\",\n          },\n          \".namespace\": {\n            Opacity: \".7\",\n          },\n          property: {\n            color: \"#81A1C1\",\n          },\n          tag: {\n            color: \"#81A1C1\",\n          },\n          constant: {\n            color: \"#81A1C1\",\n          },\n          symbol: {\n            color: \"#81A1C1\",\n          },\n          deleted: {\n            color: \"#81A1C1\",\n          },\n          number: {\n            color: \"#B48EAD\",\n          },\n          boolean: {\n            color: \"#81A1C1\",\n          },\n          selector: {\n            color: \"#A3BE8C\",\n          },\n          \"attr-name\": {\n            color: \"#A3BE8C\",\n          },\n          string: {\n            color: \"#A3BE8C\",\n          },\n          char: {\n            color: \"#A3BE8C\",\n          },\n          builtin: {\n            color: \"#A3BE8C\",\n          },\n          inserted: {\n            color: \"#A3BE8C\",\n          },\n          operator: {\n            color: \"#81A1C1\",\n          },\n          entity: {\n            color: \"#81A1C1\",\n            cursor: \"help\",\n          },\n          url: {\n            color: \"#81A1C1\",\n          },\n          \".language-css .token.string\": {\n            color: \"#81A1C1\",\n          },\n          \".style .token.string\": {\n            color: \"#81A1C1\",\n          },\n          variable: {\n            color: \"#81A1C1\",\n          },\n          atrule: {\n            color: \"#88C0D0\",\n          },\n          \"attr-value\": {\n            color: \"#88C0D0\",\n          },\n          function: {\n            color: \"#88C0D0\",\n          },\n          \"class-name\": {\n            color: \"#88C0D0\",\n          },\n          keyword: {\n            color: \"#81A1C1\",\n          },\n          regex: {\n            color: \"#EBCB8B\",\n          },\n          important: {\n            color: \"#EBCB8B\",\n            fontWeight: \"bold\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n        };\n        e.default = t;\n      })(fl)),\n    fl\n  );\n}\nvar hl = {},\n  h2;\nfunction f6() {\n  return (\n    h2 ||\n      ((h2 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            background: \"hsl(220, 13%, 18%)\",\n            color: \"hsl(220, 14%, 71%)\",\n            textShadow: \"0 1px rgba(0, 0, 0, 0.3)\",\n            fontFamily:\n              '\"Fira Code\", \"Fira Mono\", Menlo, Consolas, \"DejaVu Sans Mono\", monospace',\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"2\",\n            OTabSize: \"2\",\n            tabSize: \"2\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            background: \"hsl(220, 13%, 18%)\",\n            color: \"hsl(220, 14%, 71%)\",\n            textShadow: \"0 1px rgba(0, 0, 0, 0.3)\",\n            fontFamily:\n              '\"Fira Code\", \"Fira Mono\", Menlo, Consolas, \"DejaVu Sans Mono\", monospace',\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"2\",\n            OTabSize: \"2\",\n            tabSize: \"2\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            padding: \"1em\",\n            margin: \"0.5em 0\",\n            overflow: \"auto\",\n            borderRadius: \"0.3em\",\n          },\n          'code[class*=\"language-\"]::-moz-selection': {\n            background: \"hsl(220, 13%, 28%)\",\n            color: \"inherit\",\n            textShadow: \"none\",\n          },\n          'code[class*=\"language-\"] *::-moz-selection': {\n            background: \"hsl(220, 13%, 28%)\",\n            color: \"inherit\",\n            textShadow: \"none\",\n          },\n          'pre[class*=\"language-\"] *::-moz-selection': {\n            background: \"hsl(220, 13%, 28%)\",\n            color: \"inherit\",\n            textShadow: \"none\",\n          },\n          'code[class*=\"language-\"]::selection': {\n            background: \"hsl(220, 13%, 28%)\",\n            color: \"inherit\",\n            textShadow: \"none\",\n          },\n          'code[class*=\"language-\"] *::selection': {\n            background: \"hsl(220, 13%, 28%)\",\n            color: \"inherit\",\n            textShadow: \"none\",\n          },\n          'pre[class*=\"language-\"] *::selection': {\n            background: \"hsl(220, 13%, 28%)\",\n            color: \"inherit\",\n            textShadow: \"none\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            padding: \"0.2em 0.3em\",\n            borderRadius: \"0.3em\",\n            whiteSpace: \"normal\",\n          },\n          comment: {\n            color: \"hsl(220, 10%, 40%)\",\n            fontStyle: \"italic\",\n          },\n          prolog: {\n            color: \"hsl(220, 10%, 40%)\",\n          },\n          cdata: {\n            color: \"hsl(220, 10%, 40%)\",\n          },\n          doctype: {\n            color: \"hsl(220, 14%, 71%)\",\n          },\n          punctuation: {\n            color: \"hsl(220, 14%, 71%)\",\n          },\n          entity: {\n            color: \"hsl(220, 14%, 71%)\",\n            cursor: \"help\",\n          },\n          \"attr-name\": {\n            color: \"hsl(29, 54%, 61%)\",\n          },\n          \"class-name\": {\n            color: \"hsl(29, 54%, 61%)\",\n          },\n          boolean: {\n            color: \"hsl(29, 54%, 61%)\",\n          },\n          constant: {\n            color: \"hsl(29, 54%, 61%)\",\n          },\n          number: {\n            color: \"hsl(29, 54%, 61%)\",\n          },\n          atrule: {\n            color: \"hsl(29, 54%, 61%)\",\n          },\n          keyword: {\n            color: \"hsl(286, 60%, 67%)\",\n          },\n          property: {\n            color: \"hsl(355, 65%, 65%)\",\n          },\n          tag: {\n            color: \"hsl(355, 65%, 65%)\",\n          },\n          symbol: {\n            color: \"hsl(355, 65%, 65%)\",\n          },\n          deleted: {\n            color: \"hsl(355, 65%, 65%)\",\n          },\n          important: {\n            color: \"hsl(355, 65%, 65%)\",\n          },\n          selector: {\n            color: \"hsl(95, 38%, 62%)\",\n          },\n          string: {\n            color: \"hsl(95, 38%, 62%)\",\n          },\n          char: {\n            color: \"hsl(95, 38%, 62%)\",\n          },\n          builtin: {\n            color: \"hsl(95, 38%, 62%)\",\n          },\n          inserted: {\n            color: \"hsl(95, 38%, 62%)\",\n          },\n          regex: {\n            color: \"hsl(95, 38%, 62%)\",\n          },\n          \"attr-value\": {\n            color: \"hsl(95, 38%, 62%)\",\n          },\n          \"attr-value > .token.punctuation\": {\n            color: \"hsl(95, 38%, 62%)\",\n          },\n          variable: {\n            color: \"hsl(207, 82%, 66%)\",\n          },\n          operator: {\n            color: \"hsl(207, 82%, 66%)\",\n          },\n          function: {\n            color: \"hsl(207, 82%, 66%)\",\n          },\n          url: {\n            color: \"hsl(187, 47%, 55%)\",\n          },\n          \"attr-value > .token.punctuation.attr-equals\": {\n            color: \"hsl(220, 14%, 71%)\",\n          },\n          \"special-attr > .token.attr-value > .token.value.css\": {\n            color: \"hsl(220, 14%, 71%)\",\n          },\n          \".language-css .token.selector\": {\n            color: \"hsl(355, 65%, 65%)\",\n          },\n          \".language-css .token.property\": {\n            color: \"hsl(220, 14%, 71%)\",\n          },\n          \".language-css .token.function\": {\n            color: \"hsl(187, 47%, 55%)\",\n          },\n          \".language-css .token.url > .token.function\": {\n            color: \"hsl(187, 47%, 55%)\",\n          },\n          \".language-css .token.url > .token.string.url\": {\n            color: \"hsl(95, 38%, 62%)\",\n          },\n          \".language-css .token.important\": {\n            color: \"hsl(286, 60%, 67%)\",\n          },\n          \".language-css .token.atrule .token.rule\": {\n            color: \"hsl(286, 60%, 67%)\",\n          },\n          \".language-javascript .token.operator\": {\n            color: \"hsl(286, 60%, 67%)\",\n          },\n          \".language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation\":\n            {\n              color: \"hsl(5, 48%, 51%)\",\n            },\n          \".language-json .token.operator\": {\n            color: \"hsl(220, 14%, 71%)\",\n          },\n          \".language-json .token.null.keyword\": {\n            color: \"hsl(29, 54%, 61%)\",\n          },\n          \".language-markdown .token.url\": {\n            color: \"hsl(220, 14%, 71%)\",\n          },\n          \".language-markdown .token.url > .token.operator\": {\n            color: \"hsl(220, 14%, 71%)\",\n          },\n          \".language-markdown .token.url-reference.url > .token.string\": {\n            color: \"hsl(220, 14%, 71%)\",\n          },\n          \".language-markdown .token.url > .token.content\": {\n            color: \"hsl(207, 82%, 66%)\",\n          },\n          \".language-markdown .token.url > .token.url\": {\n            color: \"hsl(187, 47%, 55%)\",\n          },\n          \".language-markdown .token.url-reference.url\": {\n            color: \"hsl(187, 47%, 55%)\",\n          },\n          \".language-markdown .token.blockquote.punctuation\": {\n            color: \"hsl(220, 10%, 40%)\",\n            fontStyle: \"italic\",\n          },\n          \".language-markdown .token.hr.punctuation\": {\n            color: \"hsl(220, 10%, 40%)\",\n            fontStyle: \"italic\",\n          },\n          \".language-markdown .token.code-snippet\": {\n            color: \"hsl(95, 38%, 62%)\",\n          },\n          \".language-markdown .token.bold .token.content\": {\n            color: \"hsl(29, 54%, 61%)\",\n          },\n          \".language-markdown .token.italic .token.content\": {\n            color: \"hsl(286, 60%, 67%)\",\n          },\n          \".language-markdown .token.strike .token.content\": {\n            color: \"hsl(355, 65%, 65%)\",\n          },\n          \".language-markdown .token.strike .token.punctuation\": {\n            color: \"hsl(355, 65%, 65%)\",\n          },\n          \".language-markdown .token.list.punctuation\": {\n            color: \"hsl(355, 65%, 65%)\",\n          },\n          \".language-markdown .token.title.important > .token.punctuation\": {\n            color: \"hsl(355, 65%, 65%)\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n          namespace: {\n            Opacity: \"0.8\",\n          },\n          \"token.tab:not(:empty):before\": {\n            color: \"hsla(220, 14%, 71%, 0.15)\",\n            textShadow: \"none\",\n          },\n          \"token.cr:before\": {\n            color: \"hsla(220, 14%, 71%, 0.15)\",\n            textShadow: \"none\",\n          },\n          \"token.lf:before\": {\n            color: \"hsla(220, 14%, 71%, 0.15)\",\n            textShadow: \"none\",\n          },\n          \"token.space:before\": {\n            color: \"hsla(220, 14%, 71%, 0.15)\",\n            textShadow: \"none\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item\": {\n            marginRight: \"0.4em\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button\": {\n            background: \"hsl(220, 13%, 26%)\",\n            color: \"hsl(220, 9%, 55%)\",\n            padding: \"0.1em 0.4em\",\n            borderRadius: \"0.3em\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a\": {\n            background: \"hsl(220, 13%, 26%)\",\n            color: \"hsl(220, 9%, 55%)\",\n            padding: \"0.1em 0.4em\",\n            borderRadius: \"0.3em\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span\": {\n            background: \"hsl(220, 13%, 26%)\",\n            color: \"hsl(220, 9%, 55%)\",\n            padding: \"0.1em 0.4em\",\n            borderRadius: \"0.3em\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover\":\n            {\n              background: \"hsl(220, 13%, 28%)\",\n              color: \"hsl(220, 14%, 71%)\",\n            },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus\":\n            {\n              background: \"hsl(220, 13%, 28%)\",\n              color: \"hsl(220, 14%, 71%)\",\n            },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover\": {\n            background: \"hsl(220, 13%, 28%)\",\n            color: \"hsl(220, 14%, 71%)\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus\": {\n            background: \"hsl(220, 13%, 28%)\",\n            color: \"hsl(220, 14%, 71%)\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover\": {\n            background: \"hsl(220, 13%, 28%)\",\n            color: \"hsl(220, 14%, 71%)\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus\": {\n            background: \"hsl(220, 13%, 28%)\",\n            color: \"hsl(220, 14%, 71%)\",\n          },\n          \".line-highlight.line-highlight\": {\n            background: \"hsla(220, 100%, 80%, 0.04)\",\n          },\n          \".line-highlight.line-highlight:before\": {\n            background: \"hsl(220, 13%, 26%)\",\n            color: \"hsl(220, 14%, 71%)\",\n            padding: \"0.1em 0.6em\",\n            borderRadius: \"0.3em\",\n            boxShadow: \"0 2px 0 0 rgba(0, 0, 0, 0.2)\",\n          },\n          \".line-highlight.line-highlight[data-end]:after\": {\n            background: \"hsl(220, 13%, 26%)\",\n            color: \"hsl(220, 14%, 71%)\",\n            padding: \"0.1em 0.6em\",\n            borderRadius: \"0.3em\",\n            boxShadow: \"0 2px 0 0 rgba(0, 0, 0, 0.2)\",\n          },\n          \"pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before\":\n            {\n              backgroundColor: \"hsla(220, 100%, 80%, 0.04)\",\n            },\n          \".line-numbers.line-numbers .line-numbers-rows\": {\n            borderRightColor: \"hsla(220, 14%, 71%, 0.15)\",\n          },\n          \".command-line .command-line-prompt\": {\n            borderRightColor: \"hsla(220, 14%, 71%, 0.15)\",\n          },\n          \".line-numbers .line-numbers-rows > span:before\": {\n            color: \"hsl(220, 14%, 45%)\",\n          },\n          \".command-line .command-line-prompt > span:before\": {\n            color: \"hsl(220, 14%, 45%)\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-1\": {\n            color: \"hsl(355, 65%, 65%)\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-5\": {\n            color: \"hsl(355, 65%, 65%)\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-9\": {\n            color: \"hsl(355, 65%, 65%)\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-2\": {\n            color: \"hsl(95, 38%, 62%)\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-6\": {\n            color: \"hsl(95, 38%, 62%)\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-10\": {\n            color: \"hsl(95, 38%, 62%)\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-3\": {\n            color: \"hsl(207, 82%, 66%)\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-7\": {\n            color: \"hsl(207, 82%, 66%)\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-11\": {\n            color: \"hsl(207, 82%, 66%)\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-4\": {\n            color: \"hsl(286, 60%, 67%)\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-8\": {\n            color: \"hsl(286, 60%, 67%)\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-12\": {\n            color: \"hsl(286, 60%, 67%)\",\n          },\n          \"pre.diff-highlight > code .token.token.deleted:not(.prefix)\": {\n            backgroundColor: \"hsla(353, 100%, 66%, 0.15)\",\n          },\n          \"pre > code.diff-highlight .token.token.deleted:not(.prefix)\": {\n            backgroundColor: \"hsla(353, 100%, 66%, 0.15)\",\n          },\n          \"pre.diff-highlight > code .token.token.deleted:not(.prefix)::-moz-selection\":\n            {\n              backgroundColor: \"hsla(353, 95%, 66%, 0.25)\",\n            },\n          \"pre.diff-highlight > code .token.token.deleted:not(.prefix) *::-moz-selection\":\n            {\n              backgroundColor: \"hsla(353, 95%, 66%, 0.25)\",\n            },\n          \"pre > code.diff-highlight .token.token.deleted:not(.prefix)::-moz-selection\":\n            {\n              backgroundColor: \"hsla(353, 95%, 66%, 0.25)\",\n            },\n          \"pre > code.diff-highlight .token.token.deleted:not(.prefix) *::-moz-selection\":\n            {\n              backgroundColor: \"hsla(353, 95%, 66%, 0.25)\",\n            },\n          \"pre.diff-highlight > code .token.token.deleted:not(.prefix)::selection\":\n            {\n              backgroundColor: \"hsla(353, 95%, 66%, 0.25)\",\n            },\n          \"pre.diff-highlight > code .token.token.deleted:not(.prefix) *::selection\":\n            {\n              backgroundColor: \"hsla(353, 95%, 66%, 0.25)\",\n            },\n          \"pre > code.diff-highlight .token.token.deleted:not(.prefix)::selection\":\n            {\n              backgroundColor: \"hsla(353, 95%, 66%, 0.25)\",\n            },\n          \"pre > code.diff-highlight .token.token.deleted:not(.prefix) *::selection\":\n            {\n              backgroundColor: \"hsla(353, 95%, 66%, 0.25)\",\n            },\n          \"pre.diff-highlight > code .token.token.inserted:not(.prefix)\": {\n            backgroundColor: \"hsla(137, 100%, 55%, 0.15)\",\n          },\n          \"pre > code.diff-highlight .token.token.inserted:not(.prefix)\": {\n            backgroundColor: \"hsla(137, 100%, 55%, 0.15)\",\n          },\n          \"pre.diff-highlight > code .token.token.inserted:not(.prefix)::-moz-selection\":\n            {\n              backgroundColor: \"hsla(135, 73%, 55%, 0.25)\",\n            },\n          \"pre.diff-highlight > code .token.token.inserted:not(.prefix) *::-moz-selection\":\n            {\n              backgroundColor: \"hsla(135, 73%, 55%, 0.25)\",\n            },\n          \"pre > code.diff-highlight .token.token.inserted:not(.prefix)::-moz-selection\":\n            {\n              backgroundColor: \"hsla(135, 73%, 55%, 0.25)\",\n            },\n          \"pre > code.diff-highlight .token.token.inserted:not(.prefix) *::-moz-selection\":\n            {\n              backgroundColor: \"hsla(135, 73%, 55%, 0.25)\",\n            },\n          \"pre.diff-highlight > code .token.token.inserted:not(.prefix)::selection\":\n            {\n              backgroundColor: \"hsla(135, 73%, 55%, 0.25)\",\n            },\n          \"pre.diff-highlight > code .token.token.inserted:not(.prefix) *::selection\":\n            {\n              backgroundColor: \"hsla(135, 73%, 55%, 0.25)\",\n            },\n          \"pre > code.diff-highlight .token.token.inserted:not(.prefix)::selection\":\n            {\n              backgroundColor: \"hsla(135, 73%, 55%, 0.25)\",\n            },\n          \"pre > code.diff-highlight .token.token.inserted:not(.prefix) *::selection\":\n            {\n              backgroundColor: \"hsla(135, 73%, 55%, 0.25)\",\n            },\n          \".prism-previewer.prism-previewer:before\": {\n            borderColor: \"hsl(224, 13%, 17%)\",\n          },\n          \".prism-previewer-gradient.prism-previewer-gradient div\": {\n            borderColor: \"hsl(224, 13%, 17%)\",\n            borderRadius: \"0.3em\",\n          },\n          \".prism-previewer-color.prism-previewer-color:before\": {\n            borderRadius: \"0.3em\",\n          },\n          \".prism-previewer-easing.prism-previewer-easing:before\": {\n            borderRadius: \"0.3em\",\n          },\n          \".prism-previewer.prism-previewer:after\": {\n            borderTopColor: \"hsl(224, 13%, 17%)\",\n          },\n          \".prism-previewer-flipped.prism-previewer-flipped.after\": {\n            borderBottomColor: \"hsl(224, 13%, 17%)\",\n          },\n          \".prism-previewer-angle.prism-previewer-angle:before\": {\n            background: \"hsl(219, 13%, 22%)\",\n          },\n          \".prism-previewer-time.prism-previewer-time:before\": {\n            background: \"hsl(219, 13%, 22%)\",\n          },\n          \".prism-previewer-easing.prism-previewer-easing\": {\n            background: \"hsl(219, 13%, 22%)\",\n          },\n          \".prism-previewer-angle.prism-previewer-angle circle\": {\n            stroke: \"hsl(220, 14%, 71%)\",\n            strokeOpacity: \"1\",\n          },\n          \".prism-previewer-time.prism-previewer-time circle\": {\n            stroke: \"hsl(220, 14%, 71%)\",\n            strokeOpacity: \"1\",\n          },\n          \".prism-previewer-easing.prism-previewer-easing circle\": {\n            stroke: \"hsl(220, 14%, 71%)\",\n            fill: \"transparent\",\n          },\n          \".prism-previewer-easing.prism-previewer-easing path\": {\n            stroke: \"hsl(220, 14%, 71%)\",\n          },\n          \".prism-previewer-easing.prism-previewer-easing line\": {\n            stroke: \"hsl(220, 14%, 71%)\",\n          },\n        };\n        e.default = t;\n      })(hl)),\n    hl\n  );\n}\nvar pl = {},\n  p2;\nfunction h6() {\n  return (\n    p2 ||\n      ((p2 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            background: \"hsl(230, 1%, 98%)\",\n            color: \"hsl(230, 8%, 24%)\",\n            fontFamily:\n              '\"Fira Code\", \"Fira Mono\", Menlo, Consolas, \"DejaVu Sans Mono\", monospace',\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"2\",\n            OTabSize: \"2\",\n            tabSize: \"2\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            background: \"hsl(230, 1%, 98%)\",\n            color: \"hsl(230, 8%, 24%)\",\n            fontFamily:\n              '\"Fira Code\", \"Fira Mono\", Menlo, Consolas, \"DejaVu Sans Mono\", monospace',\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"2\",\n            OTabSize: \"2\",\n            tabSize: \"2\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            padding: \"1em\",\n            margin: \"0.5em 0\",\n            overflow: \"auto\",\n            borderRadius: \"0.3em\",\n          },\n          'code[class*=\"language-\"]::-moz-selection': {\n            background: \"hsl(230, 1%, 90%)\",\n            color: \"inherit\",\n          },\n          'code[class*=\"language-\"] *::-moz-selection': {\n            background: \"hsl(230, 1%, 90%)\",\n            color: \"inherit\",\n          },\n          'pre[class*=\"language-\"] *::-moz-selection': {\n            background: \"hsl(230, 1%, 90%)\",\n            color: \"inherit\",\n          },\n          'code[class*=\"language-\"]::selection': {\n            background: \"hsl(230, 1%, 90%)\",\n            color: \"inherit\",\n          },\n          'code[class*=\"language-\"] *::selection': {\n            background: \"hsl(230, 1%, 90%)\",\n            color: \"inherit\",\n          },\n          'pre[class*=\"language-\"] *::selection': {\n            background: \"hsl(230, 1%, 90%)\",\n            color: \"inherit\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            padding: \"0.2em 0.3em\",\n            borderRadius: \"0.3em\",\n            whiteSpace: \"normal\",\n          },\n          comment: {\n            color: \"hsl(230, 4%, 64%)\",\n            fontStyle: \"italic\",\n          },\n          prolog: {\n            color: \"hsl(230, 4%, 64%)\",\n          },\n          cdata: {\n            color: \"hsl(230, 4%, 64%)\",\n          },\n          doctype: {\n            color: \"hsl(230, 8%, 24%)\",\n          },\n          punctuation: {\n            color: \"hsl(230, 8%, 24%)\",\n          },\n          entity: {\n            color: \"hsl(230, 8%, 24%)\",\n            cursor: \"help\",\n          },\n          \"attr-name\": {\n            color: \"hsl(35, 99%, 36%)\",\n          },\n          \"class-name\": {\n            color: \"hsl(35, 99%, 36%)\",\n          },\n          boolean: {\n            color: \"hsl(35, 99%, 36%)\",\n          },\n          constant: {\n            color: \"hsl(35, 99%, 36%)\",\n          },\n          number: {\n            color: \"hsl(35, 99%, 36%)\",\n          },\n          atrule: {\n            color: \"hsl(35, 99%, 36%)\",\n          },\n          keyword: {\n            color: \"hsl(301, 63%, 40%)\",\n          },\n          property: {\n            color: \"hsl(5, 74%, 59%)\",\n          },\n          tag: {\n            color: \"hsl(5, 74%, 59%)\",\n          },\n          symbol: {\n            color: \"hsl(5, 74%, 59%)\",\n          },\n          deleted: {\n            color: \"hsl(5, 74%, 59%)\",\n          },\n          important: {\n            color: \"hsl(5, 74%, 59%)\",\n          },\n          selector: {\n            color: \"hsl(119, 34%, 47%)\",\n          },\n          string: {\n            color: \"hsl(119, 34%, 47%)\",\n          },\n          char: {\n            color: \"hsl(119, 34%, 47%)\",\n          },\n          builtin: {\n            color: \"hsl(119, 34%, 47%)\",\n          },\n          inserted: {\n            color: \"hsl(119, 34%, 47%)\",\n          },\n          regex: {\n            color: \"hsl(119, 34%, 47%)\",\n          },\n          \"attr-value\": {\n            color: \"hsl(119, 34%, 47%)\",\n          },\n          \"attr-value > .token.punctuation\": {\n            color: \"hsl(119, 34%, 47%)\",\n          },\n          variable: {\n            color: \"hsl(221, 87%, 60%)\",\n          },\n          operator: {\n            color: \"hsl(221, 87%, 60%)\",\n          },\n          function: {\n            color: \"hsl(221, 87%, 60%)\",\n          },\n          url: {\n            color: \"hsl(198, 99%, 37%)\",\n          },\n          \"attr-value > .token.punctuation.attr-equals\": {\n            color: \"hsl(230, 8%, 24%)\",\n          },\n          \"special-attr > .token.attr-value > .token.value.css\": {\n            color: \"hsl(230, 8%, 24%)\",\n          },\n          \".language-css .token.selector\": {\n            color: \"hsl(5, 74%, 59%)\",\n          },\n          \".language-css .token.property\": {\n            color: \"hsl(230, 8%, 24%)\",\n          },\n          \".language-css .token.function\": {\n            color: \"hsl(198, 99%, 37%)\",\n          },\n          \".language-css .token.url > .token.function\": {\n            color: \"hsl(198, 99%, 37%)\",\n          },\n          \".language-css .token.url > .token.string.url\": {\n            color: \"hsl(119, 34%, 47%)\",\n          },\n          \".language-css .token.important\": {\n            color: \"hsl(301, 63%, 40%)\",\n          },\n          \".language-css .token.atrule .token.rule\": {\n            color: \"hsl(301, 63%, 40%)\",\n          },\n          \".language-javascript .token.operator\": {\n            color: \"hsl(301, 63%, 40%)\",\n          },\n          \".language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation\":\n            {\n              color: \"hsl(344, 84%, 43%)\",\n            },\n          \".language-json .token.operator\": {\n            color: \"hsl(230, 8%, 24%)\",\n          },\n          \".language-json .token.null.keyword\": {\n            color: \"hsl(35, 99%, 36%)\",\n          },\n          \".language-markdown .token.url\": {\n            color: \"hsl(230, 8%, 24%)\",\n          },\n          \".language-markdown .token.url > .token.operator\": {\n            color: \"hsl(230, 8%, 24%)\",\n          },\n          \".language-markdown .token.url-reference.url > .token.string\": {\n            color: \"hsl(230, 8%, 24%)\",\n          },\n          \".language-markdown .token.url > .token.content\": {\n            color: \"hsl(221, 87%, 60%)\",\n          },\n          \".language-markdown .token.url > .token.url\": {\n            color: \"hsl(198, 99%, 37%)\",\n          },\n          \".language-markdown .token.url-reference.url\": {\n            color: \"hsl(198, 99%, 37%)\",\n          },\n          \".language-markdown .token.blockquote.punctuation\": {\n            color: \"hsl(230, 4%, 64%)\",\n            fontStyle: \"italic\",\n          },\n          \".language-markdown .token.hr.punctuation\": {\n            color: \"hsl(230, 4%, 64%)\",\n            fontStyle: \"italic\",\n          },\n          \".language-markdown .token.code-snippet\": {\n            color: \"hsl(119, 34%, 47%)\",\n          },\n          \".language-markdown .token.bold .token.content\": {\n            color: \"hsl(35, 99%, 36%)\",\n          },\n          \".language-markdown .token.italic .token.content\": {\n            color: \"hsl(301, 63%, 40%)\",\n          },\n          \".language-markdown .token.strike .token.content\": {\n            color: \"hsl(5, 74%, 59%)\",\n          },\n          \".language-markdown .token.strike .token.punctuation\": {\n            color: \"hsl(5, 74%, 59%)\",\n          },\n          \".language-markdown .token.list.punctuation\": {\n            color: \"hsl(5, 74%, 59%)\",\n          },\n          \".language-markdown .token.title.important > .token.punctuation\": {\n            color: \"hsl(5, 74%, 59%)\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n          namespace: {\n            Opacity: \"0.8\",\n          },\n          \"token.tab:not(:empty):before\": {\n            color: \"hsla(230, 8%, 24%, 0.2)\",\n          },\n          \"token.cr:before\": {\n            color: \"hsla(230, 8%, 24%, 0.2)\",\n          },\n          \"token.lf:before\": {\n            color: \"hsla(230, 8%, 24%, 0.2)\",\n          },\n          \"token.space:before\": {\n            color: \"hsla(230, 8%, 24%, 0.2)\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item\": {\n            marginRight: \"0.4em\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button\": {\n            background: \"hsl(230, 1%, 90%)\",\n            color: \"hsl(230, 6%, 44%)\",\n            padding: \"0.1em 0.4em\",\n            borderRadius: \"0.3em\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a\": {\n            background: \"hsl(230, 1%, 90%)\",\n            color: \"hsl(230, 6%, 44%)\",\n            padding: \"0.1em 0.4em\",\n            borderRadius: \"0.3em\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span\": {\n            background: \"hsl(230, 1%, 90%)\",\n            color: \"hsl(230, 6%, 44%)\",\n            padding: \"0.1em 0.4em\",\n            borderRadius: \"0.3em\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover\":\n            {\n              background: \"hsl(230, 1%, 78%)\",\n              color: \"hsl(230, 8%, 24%)\",\n            },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus\":\n            {\n              background: \"hsl(230, 1%, 78%)\",\n              color: \"hsl(230, 8%, 24%)\",\n            },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover\": {\n            background: \"hsl(230, 1%, 78%)\",\n            color: \"hsl(230, 8%, 24%)\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus\": {\n            background: \"hsl(230, 1%, 78%)\",\n            color: \"hsl(230, 8%, 24%)\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover\": {\n            background: \"hsl(230, 1%, 78%)\",\n            color: \"hsl(230, 8%, 24%)\",\n          },\n          \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus\": {\n            background: \"hsl(230, 1%, 78%)\",\n            color: \"hsl(230, 8%, 24%)\",\n          },\n          \".line-highlight.line-highlight\": {\n            background: \"hsla(230, 8%, 24%, 0.05)\",\n          },\n          \".line-highlight.line-highlight:before\": {\n            background: \"hsl(230, 1%, 90%)\",\n            color: \"hsl(230, 8%, 24%)\",\n            padding: \"0.1em 0.6em\",\n            borderRadius: \"0.3em\",\n            boxShadow: \"0 2px 0 0 rgba(0, 0, 0, 0.2)\",\n          },\n          \".line-highlight.line-highlight[data-end]:after\": {\n            background: \"hsl(230, 1%, 90%)\",\n            color: \"hsl(230, 8%, 24%)\",\n            padding: \"0.1em 0.6em\",\n            borderRadius: \"0.3em\",\n            boxShadow: \"0 2px 0 0 rgba(0, 0, 0, 0.2)\",\n          },\n          \"pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before\":\n            {\n              backgroundColor: \"hsla(230, 8%, 24%, 0.05)\",\n            },\n          \".line-numbers.line-numbers .line-numbers-rows\": {\n            borderRightColor: \"hsla(230, 8%, 24%, 0.2)\",\n          },\n          \".command-line .command-line-prompt\": {\n            borderRightColor: \"hsla(230, 8%, 24%, 0.2)\",\n          },\n          \".line-numbers .line-numbers-rows > span:before\": {\n            color: \"hsl(230, 1%, 62%)\",\n          },\n          \".command-line .command-line-prompt > span:before\": {\n            color: \"hsl(230, 1%, 62%)\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-1\": {\n            color: \"hsl(5, 74%, 59%)\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-5\": {\n            color: \"hsl(5, 74%, 59%)\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-9\": {\n            color: \"hsl(5, 74%, 59%)\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-2\": {\n            color: \"hsl(119, 34%, 47%)\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-6\": {\n            color: \"hsl(119, 34%, 47%)\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-10\": {\n            color: \"hsl(119, 34%, 47%)\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-3\": {\n            color: \"hsl(221, 87%, 60%)\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-7\": {\n            color: \"hsl(221, 87%, 60%)\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-11\": {\n            color: \"hsl(221, 87%, 60%)\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-4\": {\n            color: \"hsl(301, 63%, 40%)\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-8\": {\n            color: \"hsl(301, 63%, 40%)\",\n          },\n          \".rainbow-braces .token.token.punctuation.brace-level-12\": {\n            color: \"hsl(301, 63%, 40%)\",\n          },\n          \"pre.diff-highlight > code .token.token.deleted:not(.prefix)\": {\n            backgroundColor: \"hsla(353, 100%, 66%, 0.15)\",\n          },\n          \"pre > code.diff-highlight .token.token.deleted:not(.prefix)\": {\n            backgroundColor: \"hsla(353, 100%, 66%, 0.15)\",\n          },\n          \"pre.diff-highlight > code .token.token.deleted:not(.prefix)::-moz-selection\":\n            {\n              backgroundColor: \"hsla(353, 95%, 66%, 0.25)\",\n            },\n          \"pre.diff-highlight > code .token.token.deleted:not(.prefix) *::-moz-selection\":\n            {\n              backgroundColor: \"hsla(353, 95%, 66%, 0.25)\",\n            },\n          \"pre > code.diff-highlight .token.token.deleted:not(.prefix)::-moz-selection\":\n            {\n              backgroundColor: \"hsla(353, 95%, 66%, 0.25)\",\n            },\n          \"pre > code.diff-highlight .token.token.deleted:not(.prefix) *::-moz-selection\":\n            {\n              backgroundColor: \"hsla(353, 95%, 66%, 0.25)\",\n            },\n          \"pre.diff-highlight > code .token.token.deleted:not(.prefix)::selection\":\n            {\n              backgroundColor: \"hsla(353, 95%, 66%, 0.25)\",\n            },\n          \"pre.diff-highlight > code .token.token.deleted:not(.prefix) *::selection\":\n            {\n              backgroundColor: \"hsla(353, 95%, 66%, 0.25)\",\n            },\n          \"pre > code.diff-highlight .token.token.deleted:not(.prefix)::selection\":\n            {\n              backgroundColor: \"hsla(353, 95%, 66%, 0.25)\",\n            },\n          \"pre > code.diff-highlight .token.token.deleted:not(.prefix) *::selection\":\n            {\n              backgroundColor: \"hsla(353, 95%, 66%, 0.25)\",\n            },\n          \"pre.diff-highlight > code .token.token.inserted:not(.prefix)\": {\n            backgroundColor: \"hsla(137, 100%, 55%, 0.15)\",\n          },\n          \"pre > code.diff-highlight .token.token.inserted:not(.prefix)\": {\n            backgroundColor: \"hsla(137, 100%, 55%, 0.15)\",\n          },\n          \"pre.diff-highlight > code .token.token.inserted:not(.prefix)::-moz-selection\":\n            {\n              backgroundColor: \"hsla(135, 73%, 55%, 0.25)\",\n            },\n          \"pre.diff-highlight > code .token.token.inserted:not(.prefix) *::-moz-selection\":\n            {\n              backgroundColor: \"hsla(135, 73%, 55%, 0.25)\",\n            },\n          \"pre > code.diff-highlight .token.token.inserted:not(.prefix)::-moz-selection\":\n            {\n              backgroundColor: \"hsla(135, 73%, 55%, 0.25)\",\n            },\n          \"pre > code.diff-highlight .token.token.inserted:not(.prefix) *::-moz-selection\":\n            {\n              backgroundColor: \"hsla(135, 73%, 55%, 0.25)\",\n            },\n          \"pre.diff-highlight > code .token.token.inserted:not(.prefix)::selection\":\n            {\n              backgroundColor: \"hsla(135, 73%, 55%, 0.25)\",\n            },\n          \"pre.diff-highlight > code .token.token.inserted:not(.prefix) *::selection\":\n            {\n              backgroundColor: \"hsla(135, 73%, 55%, 0.25)\",\n            },\n          \"pre > code.diff-highlight .token.token.inserted:not(.prefix)::selection\":\n            {\n              backgroundColor: \"hsla(135, 73%, 55%, 0.25)\",\n            },\n          \"pre > code.diff-highlight .token.token.inserted:not(.prefix) *::selection\":\n            {\n              backgroundColor: \"hsla(135, 73%, 55%, 0.25)\",\n            },\n          \".prism-previewer.prism-previewer:before\": {\n            borderColor: \"hsl(0, 0, 95%)\",\n          },\n          \".prism-previewer-gradient.prism-previewer-gradient div\": {\n            borderColor: \"hsl(0, 0, 95%)\",\n            borderRadius: \"0.3em\",\n          },\n          \".prism-previewer-color.prism-previewer-color:before\": {\n            borderRadius: \"0.3em\",\n          },\n          \".prism-previewer-easing.prism-previewer-easing:before\": {\n            borderRadius: \"0.3em\",\n          },\n          \".prism-previewer.prism-previewer:after\": {\n            borderTopColor: \"hsl(0, 0, 95%)\",\n          },\n          \".prism-previewer-flipped.prism-previewer-flipped.after\": {\n            borderBottomColor: \"hsl(0, 0, 95%)\",\n          },\n          \".prism-previewer-angle.prism-previewer-angle:before\": {\n            background: \"hsl(0, 0%, 100%)\",\n          },\n          \".prism-previewer-time.prism-previewer-time:before\": {\n            background: \"hsl(0, 0%, 100%)\",\n          },\n          \".prism-previewer-easing.prism-previewer-easing\": {\n            background: \"hsl(0, 0%, 100%)\",\n          },\n          \".prism-previewer-angle.prism-previewer-angle circle\": {\n            stroke: \"hsl(230, 8%, 24%)\",\n            strokeOpacity: \"1\",\n          },\n          \".prism-previewer-time.prism-previewer-time circle\": {\n            stroke: \"hsl(230, 8%, 24%)\",\n            strokeOpacity: \"1\",\n          },\n          \".prism-previewer-easing.prism-previewer-easing circle\": {\n            stroke: \"hsl(230, 8%, 24%)\",\n            fill: \"transparent\",\n          },\n          \".prism-previewer-easing.prism-previewer-easing path\": {\n            stroke: \"hsl(230, 8%, 24%)\",\n          },\n          \".prism-previewer-easing.prism-previewer-easing line\": {\n            stroke: \"hsl(230, 8%, 24%)\",\n          },\n        };\n        e.default = t;\n      })(pl)),\n    pl\n  );\n}\nvar gl = {},\n  g2;\nfunction p6() {\n  return (\n    g2 ||\n      ((g2 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            whiteSpace: \"pre-wrap\",\n            wordBreak: \"break-all\",\n            wordWrap: \"break-word\",\n            fontFamily: 'Menlo, Monaco, \"Courier New\", monospace',\n            fontSize: \"15px\",\n            lineHeight: \"1.5\",\n            color: \"#dccf8f\",\n            textShadow: \"0\",\n          },\n          'pre[class*=\"language-\"]': {\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            whiteSpace: \"pre-wrap\",\n            wordBreak: \"break-all\",\n            wordWrap: \"break-word\",\n            fontFamily: 'Menlo, Monaco, \"Courier New\", monospace',\n            fontSize: \"15px\",\n            lineHeight: \"1.5\",\n            color: \"#DCCF8F\",\n            textShadow: \"0\",\n            borderRadius: \"5px\",\n            border: \"1px solid #000\",\n            background:\n              \"#181914 url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAMAAA/+4ADkFkb2JlAGTAAAAAAf/bAIQACQYGBgcGCQcHCQ0IBwgNDwsJCQsPEQ4ODw4OERENDg4ODg0RERQUFhQUERoaHBwaGiYmJiYmKysrKysrKysrKwEJCAgJCgkMCgoMDwwODA8TDg4ODhMVDg4PDg4VGhMRERERExoXGhYWFhoXHR0aGh0dJCQjJCQrKysrKysrKysr/8AAEQgAjACMAwEiAAIRAQMRAf/EAF4AAQEBAAAAAAAAAAAAAAAAAAABBwEBAQAAAAAAAAAAAAAAAAAAAAIQAAEDAwIHAQEAAAAAAAAAAADwAREhYaExkUFRcYGxwdHh8REBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AyGFEjHaBS2fDDs2zkhKmBKktb7km+ZwwCnXPkLVmCTMItj6AXFxRS465/BTnkAJvkLkJe+7AKKoi2AtRS2zuAWsCb5GOlBN8gKfmuGHZ8MFqIth3ALmFoFwbwKWyAlTAp17uKqBvgBD8sM4fTjhvAhkzhaRkBMKBrfs7jGPIpzy7gFrAqnC0C0gB0EWwBDW2cBVQwm+QtPpa3wBO3sVvszCnLAhkzgL5/RLf13cLQd8/AGlu0Cb5HTx9KuAEieGJEdcehS3eRTp2ATdt3CpIm+QtZwAhROXFeb7swp/ahaM3kBE/jSIUBc/AWrgBN8uNFAl+b7sAXFxFn2YLUU5Ns7gFX8C4ib+hN8gFWXwK3bZglxEJm+gKdciLPsFV/TClsgJUwKJ5FVA7tvIFrfZhVfGJDcsCKaYgAqv6YRbE+RWOWBtu7+AL3yRalXLyKqAIIfk+zARbDgFyEsncYwJvlgFRW+GEWntIi2P0BooyFxcNr8Ep3+ANLbMO+QyhvbiqdgC0kVvgUUiLYgBS2QtPbiVI1/sgOmG9uO+Y8DW+7jS2zAOnj6O2BndwuIAUtkdRN8gFoK3wwXMQyZwHVbClsuNLd4E3yAUR6FVDBR+BafQGt93LVMxJTv8ABts4CVLhcfYWsCb5kC9/BHdU8CLYFY5bMAd+eX9MGthhpbA1vu4B7+RKkaW2Yq4AQtVBBFsAJU/AuIXBhN8gGWnstefhiZyWvLAEnbYS1uzSFP6Jvn4Baxx70JKkQojLib5AVTey1jjgkKJGO0AKWyOm7N7cSpgSpAdPH0Tfd/gp1z5C1ZgKqN9J2wFxcUUuAFLZAm+QC0Fb4YUVRFsAOvj4KW2dwtYE3yAWk/wS/PLMKfmuGHZ8MAXF/Ja32Yi5haAKWz4Ydm2cSpgU693Atb7km+Zwwh+WGcPpxw3gAkzCLY+iYUDW/Z3Adc/gpzyFrAqnALkJe+7DoItgAtRS2zuKqGE3yAx0oJvkdvYrfZmALURbDuL5/RLf13cAuDeBS2RpbtAm+QFVA3wR+3fUtFHoBDJnC0jIXH0HWsgMY8inPLuOkd9chp4z20ALQLSA8cI9jYAIa2zjzjBd8gRafS1vgiUho/kAKcsCGTOGWvoOpkAtB3z8Hm8x2Ff5ADp4+lXAlIvcmwH/2Q==') repeat left top\",\n            padding: \"12px\",\n            overflow: \"auto\",\n          },\n          'pre > code[class*=\"language-\"]': {\n            fontSize: \"1em\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            borderRadius: \"5px\",\n            border: \"1px solid #000\",\n            color: \"#DCCF8F\",\n            background:\n              \"#181914 url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAMAAA/+4ADkFkb2JlAGTAAAAAAf/bAIQACQYGBgcGCQcHCQ0IBwgNDwsJCQsPEQ4ODw4OERENDg4ODg0RERQUFhQUERoaHBwaGiYmJiYmKysrKysrKysrKwEJCAgJCgkMCgoMDwwODA8TDg4ODhMVDg4PDg4VGhMRERERExoXGhYWFhoXHR0aGh0dJCQjJCQrKysrKysrKysr/8AAEQgAjACMAwEiAAIRAQMRAf/EAF4AAQEBAAAAAAAAAAAAAAAAAAABBwEBAQAAAAAAAAAAAAAAAAAAAAIQAAEDAwIHAQEAAAAAAAAAAADwAREhYaExkUFRcYGxwdHh8REBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AyGFEjHaBS2fDDs2zkhKmBKktb7km+ZwwCnXPkLVmCTMItj6AXFxRS465/BTnkAJvkLkJe+7AKKoi2AtRS2zuAWsCb5GOlBN8gKfmuGHZ8MFqIth3ALmFoFwbwKWyAlTAp17uKqBvgBD8sM4fTjhvAhkzhaRkBMKBrfs7jGPIpzy7gFrAqnC0C0gB0EWwBDW2cBVQwm+QtPpa3wBO3sVvszCnLAhkzgL5/RLf13cLQd8/AGlu0Cb5HTx9KuAEieGJEdcehS3eRTp2ATdt3CpIm+QtZwAhROXFeb7swp/ahaM3kBE/jSIUBc/AWrgBN8uNFAl+b7sAXFxFn2YLUU5Ns7gFX8C4ib+hN8gFWXwK3bZglxEJm+gKdciLPsFV/TClsgJUwKJ5FVA7tvIFrfZhVfGJDcsCKaYgAqv6YRbE+RWOWBtu7+AL3yRalXLyKqAIIfk+zARbDgFyEsncYwJvlgFRW+GEWntIi2P0BooyFxcNr8Ep3+ANLbMO+QyhvbiqdgC0kVvgUUiLYgBS2QtPbiVI1/sgOmG9uO+Y8DW+7jS2zAOnj6O2BndwuIAUtkdRN8gFoK3wwXMQyZwHVbClsuNLd4E3yAUR6FVDBR+BafQGt93LVMxJTv8ABts4CVLhcfYWsCb5kC9/BHdU8CLYFY5bMAd+eX9MGthhpbA1vu4B7+RKkaW2Yq4AQtVBBFsAJU/AuIXBhN8gGWnstefhiZyWvLAEnbYS1uzSFP6Jvn4Baxx70JKkQojLib5AVTey1jjgkKJGO0AKWyOm7N7cSpgSpAdPH0Tfd/gp1z5C1ZgKqN9J2wFxcUUuAFLZAm+QC0Fb4YUVRFsAOvj4KW2dwtYE3yAWk/wS/PLMKfmuGHZ8MAXF/Ja32Yi5haAKWz4Ydm2cSpgU693Atb7km+Zwwh+WGcPpxw3gAkzCLY+iYUDW/Z3Adc/gpzyFrAqnALkJe+7DoItgAtRS2zuKqGE3yAx0oJvkdvYrfZmALURbDuL5/RLf13cAuDeBS2RpbtAm+QFVA3wR+3fUtFHoBDJnC0jIXH0HWsgMY8inPLuOkd9chp4z20ALQLSA8cI9jYAIa2zjzjBd8gRafS1vgiUho/kAKcsCGTOGWvoOpkAtB3z8Hm8x2Ff5ADp4+lXAlIvcmwH/2Q==') repeat left top\",\n            padding: \"2px 6px\",\n          },\n          namespace: {\n            Opacity: \".7\",\n          },\n          comment: {\n            color: \"#586e75\",\n            fontStyle: \"italic\",\n          },\n          prolog: {\n            color: \"#586e75\",\n            fontStyle: \"italic\",\n          },\n          doctype: {\n            color: \"#586e75\",\n            fontStyle: \"italic\",\n          },\n          cdata: {\n            color: \"#586e75\",\n            fontStyle: \"italic\",\n          },\n          number: {\n            color: \"#b89859\",\n          },\n          string: {\n            color: \"#468966\",\n          },\n          char: {\n            color: \"#468966\",\n          },\n          builtin: {\n            color: \"#468966\",\n          },\n          inserted: {\n            color: \"#468966\",\n          },\n          \"attr-name\": {\n            color: \"#b89859\",\n          },\n          operator: {\n            color: \"#dccf8f\",\n          },\n          entity: {\n            color: \"#dccf8f\",\n            cursor: \"help\",\n          },\n          url: {\n            color: \"#dccf8f\",\n          },\n          \".language-css .token.string\": {\n            color: \"#dccf8f\",\n          },\n          \".style .token.string\": {\n            color: \"#dccf8f\",\n          },\n          selector: {\n            color: \"#859900\",\n          },\n          regex: {\n            color: \"#859900\",\n          },\n          atrule: {\n            color: \"#cb4b16\",\n          },\n          keyword: {\n            color: \"#cb4b16\",\n          },\n          \"attr-value\": {\n            color: \"#468966\",\n          },\n          function: {\n            color: \"#b58900\",\n          },\n          variable: {\n            color: \"#b58900\",\n          },\n          placeholder: {\n            color: \"#b58900\",\n          },\n          property: {\n            color: \"#b89859\",\n          },\n          tag: {\n            color: \"#ffb03b\",\n          },\n          boolean: {\n            color: \"#b89859\",\n          },\n          constant: {\n            color: \"#b89859\",\n          },\n          symbol: {\n            color: \"#b89859\",\n          },\n          important: {\n            color: \"#dc322f\",\n          },\n          statement: {\n            color: \"#dc322f\",\n          },\n          deleted: {\n            color: \"#dc322f\",\n          },\n          punctuation: {\n            color: \"#dccf8f\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n        };\n        e.default = t;\n      })(gl)),\n    gl\n  );\n}\nvar ml = {},\n  m2;\nfunction g6() {\n  return (\n    m2 ||\n      ((m2 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          \"code[class*='language-']\": {\n            color: \"#9efeff\",\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            fontFamily:\n              \"'Operator Mono', 'Fira Code', Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace\",\n            fontWeight: \"400\",\n            fontSize: \"17px\",\n            lineHeight: \"25px\",\n            letterSpacing: \"0.5px\",\n            textShadow: \"0 1px #222245\",\n          },\n          \"pre[class*='language-']\": {\n            color: \"#9efeff\",\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            fontFamily:\n              \"'Operator Mono', 'Fira Code', Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace\",\n            fontWeight: \"400\",\n            fontSize: \"17px\",\n            lineHeight: \"25px\",\n            letterSpacing: \"0.5px\",\n            textShadow: \"0 1px #222245\",\n            padding: \"2em\",\n            margin: \"0.5em 0\",\n            overflow: \"auto\",\n            background: \"#1e1e3f\",\n          },\n          \"pre[class*='language-']::-moz-selection\": {\n            color: \"inherit\",\n            background: \"#a599e9\",\n          },\n          \"pre[class*='language-'] ::-moz-selection\": {\n            color: \"inherit\",\n            background: \"#a599e9\",\n          },\n          \"code[class*='language-']::-moz-selection\": {\n            color: \"inherit\",\n            background: \"#a599e9\",\n          },\n          \"code[class*='language-'] ::-moz-selection\": {\n            color: \"inherit\",\n            background: \"#a599e9\",\n          },\n          \"pre[class*='language-']::selection\": {\n            color: \"inherit\",\n            background: \"#a599e9\",\n          },\n          \"pre[class*='language-'] ::selection\": {\n            color: \"inherit\",\n            background: \"#a599e9\",\n          },\n          \"code[class*='language-']::selection\": {\n            color: \"inherit\",\n            background: \"#a599e9\",\n          },\n          \"code[class*='language-'] ::selection\": {\n            color: \"inherit\",\n            background: \"#a599e9\",\n          },\n          \":not(pre) > code[class*='language-']\": {\n            background: \"#1e1e3f\",\n            padding: \"0.1em\",\n            borderRadius: \"0.3em\",\n          },\n          \"\": {\n            fontWeight: \"400\",\n          },\n          comment: {\n            color: \"#b362ff\",\n          },\n          prolog: {\n            color: \"#b362ff\",\n          },\n          cdata: {\n            color: \"#b362ff\",\n          },\n          delimiter: {\n            color: \"#ff9d00\",\n          },\n          keyword: {\n            color: \"#ff9d00\",\n          },\n          selector: {\n            color: \"#ff9d00\",\n          },\n          important: {\n            color: \"#ff9d00\",\n          },\n          atrule: {\n            color: \"#ff9d00\",\n          },\n          operator: {\n            color: \"rgb(255, 180, 84)\",\n            background: \"none\",\n          },\n          \"attr-name\": {\n            color: \"rgb(255, 180, 84)\",\n          },\n          punctuation: {\n            color: \"#ffffff\",\n          },\n          boolean: {\n            color: \"rgb(255, 98, 140)\",\n          },\n          tag: {\n            color: \"rgb(255, 157, 0)\",\n          },\n          \"tag.punctuation\": {\n            color: \"rgb(255, 157, 0)\",\n          },\n          doctype: {\n            color: \"rgb(255, 157, 0)\",\n          },\n          builtin: {\n            color: \"rgb(255, 157, 0)\",\n          },\n          entity: {\n            color: \"#6897bb\",\n            background: \"none\",\n          },\n          symbol: {\n            color: \"#6897bb\",\n          },\n          number: {\n            color: \"#ff628c\",\n          },\n          property: {\n            color: \"#ff628c\",\n          },\n          constant: {\n            color: \"#ff628c\",\n          },\n          variable: {\n            color: \"#ff628c\",\n          },\n          string: {\n            color: \"#a5ff90\",\n          },\n          char: {\n            color: \"#a5ff90\",\n          },\n          \"attr-value\": {\n            color: \"#a5c261\",\n          },\n          \"attr-value.punctuation\": {\n            color: \"#a5c261\",\n          },\n          \"attr-value.punctuation:first-child\": {\n            color: \"#a9b7c6\",\n          },\n          url: {\n            color: \"#287bde\",\n            textDecoration: \"underline\",\n            background: \"none\",\n          },\n          function: {\n            color: \"rgb(250, 208, 0)\",\n          },\n          regex: {\n            background: \"#364135\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n          inserted: {\n            background: \"#00ff00\",\n          },\n          deleted: {\n            background: \"#ff000d\",\n          },\n          \"code.language-css .token.property\": {\n            color: \"#a9b7c6\",\n          },\n          \"code.language-css .token.property + .token.punctuation\": {\n            color: \"#a9b7c6\",\n          },\n          \"code.language-css .token.id\": {\n            color: \"#ffc66d\",\n          },\n          \"code.language-css .token.selector > .token.class\": {\n            color: \"#ffc66d\",\n          },\n          \"code.language-css .token.selector > .token.attribute\": {\n            color: \"#ffc66d\",\n          },\n          \"code.language-css .token.selector > .token.pseudo-class\": {\n            color: \"#ffc66d\",\n          },\n          \"code.language-css .token.selector > .token.pseudo-element\": {\n            color: \"#ffc66d\",\n          },\n          \"class-name\": {\n            color: \"#fb94ff\",\n          },\n          \".language-css .token.string\": {\n            background: \"none\",\n          },\n          \".style .token.string\": {\n            background: \"none\",\n          },\n          \".line-highlight.line-highlight\": {\n            marginTop: \"36px\",\n            background:\n              \"linear-gradient(to right, rgba(179, 98, 255, 0.17), transparent)\",\n          },\n          \".line-highlight.line-highlight:before\": {\n            content: \"''\",\n          },\n          \".line-highlight.line-highlight[data-end]:after\": {\n            content: \"''\",\n          },\n        };\n        e.default = t;\n      })(ml)),\n    ml\n  );\n}\nvar bl = {},\n  b2;\nfunction m6() {\n  return (\n    b2 ||\n      ((b2 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            color: \"#839496\",\n            textShadow: \"0 1px rgba(0, 0, 0, 0.3)\",\n            fontFamily:\n              \"Inconsolata, Monaco, Consolas, 'Courier New', Courier, monospace\",\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            color: \"#839496\",\n            textShadow: \"0 1px rgba(0, 0, 0, 0.3)\",\n            fontFamily:\n              \"Inconsolata, Monaco, Consolas, 'Courier New', Courier, monospace\",\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            padding: \"1em\",\n            margin: \".5em 0\",\n            overflow: \"auto\",\n            borderRadius: \"0.3em\",\n            background: \"#002b36\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            background: \"#002b36\",\n            padding: \".1em\",\n            borderRadius: \".3em\",\n          },\n          comment: {\n            color: \"#586e75\",\n          },\n          prolog: {\n            color: \"#586e75\",\n          },\n          doctype: {\n            color: \"#586e75\",\n          },\n          cdata: {\n            color: \"#586e75\",\n          },\n          punctuation: {\n            color: \"#93a1a1\",\n          },\n          \".namespace\": {\n            Opacity: \".7\",\n          },\n          property: {\n            color: \"#268bd2\",\n          },\n          keyword: {\n            color: \"#268bd2\",\n          },\n          tag: {\n            color: \"#268bd2\",\n          },\n          \"class-name\": {\n            color: \"#FFFFB6\",\n            textDecoration: \"underline\",\n          },\n          boolean: {\n            color: \"#b58900\",\n          },\n          constant: {\n            color: \"#b58900\",\n          },\n          symbol: {\n            color: \"#dc322f\",\n          },\n          deleted: {\n            color: \"#dc322f\",\n          },\n          number: {\n            color: \"#859900\",\n          },\n          selector: {\n            color: \"#859900\",\n          },\n          \"attr-name\": {\n            color: \"#859900\",\n          },\n          string: {\n            color: \"#859900\",\n          },\n          char: {\n            color: \"#859900\",\n          },\n          builtin: {\n            color: \"#859900\",\n          },\n          inserted: {\n            color: \"#859900\",\n          },\n          variable: {\n            color: \"#268bd2\",\n          },\n          operator: {\n            color: \"#EDEDED\",\n          },\n          function: {\n            color: \"#268bd2\",\n          },\n          regex: {\n            color: \"#E9C062\",\n          },\n          important: {\n            color: \"#fd971f\",\n            fontWeight: \"bold\",\n          },\n          entity: {\n            color: \"#FFFFB6\",\n            cursor: \"help\",\n          },\n          url: {\n            color: \"#96CBFE\",\n          },\n          \".language-css .token.string\": {\n            color: \"#87C38A\",\n          },\n          \".style .token.string\": {\n            color: \"#87C38A\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n          atrule: {\n            color: \"#F9EE98\",\n          },\n          \"attr-value\": {\n            color: \"#F9EE98\",\n          },\n        };\n        e.default = t;\n      })(bl)),\n    bl\n  );\n}\nvar yl = {},\n  y2;\nfunction b6() {\n  return (\n    y2 ||\n      ((y2 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            color: \"#f92aad\",\n            textShadow: \"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3\",\n            background: \"none\",\n            fontFamily:\n              \"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace\",\n            fontSize: \"1em\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            color: \"#f92aad\",\n            textShadow: \"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3\",\n            background: \"none\",\n            fontFamily:\n              \"Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace\",\n            fontSize: \"1em\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            padding: \"1em\",\n            margin: \".5em 0\",\n            overflow: \"auto\",\n            backgroundColor: \"transparent !important\",\n            backgroundImage: \"linear-gradient(to bottom, #2a2139 75%, #34294f)\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            backgroundColor: \"transparent !important\",\n            backgroundImage: \"linear-gradient(to bottom, #2a2139 75%, #34294f)\",\n            padding: \".1em\",\n            borderRadius: \".3em\",\n            whiteSpace: \"normal\",\n          },\n          comment: {\n            color: \"#8e8e8e\",\n          },\n          \"block-comment\": {\n            color: \"#8e8e8e\",\n          },\n          prolog: {\n            color: \"#8e8e8e\",\n          },\n          doctype: {\n            color: \"#8e8e8e\",\n          },\n          cdata: {\n            color: \"#8e8e8e\",\n          },\n          punctuation: {\n            color: \"#ccc\",\n          },\n          tag: {\n            color: \"#e2777a\",\n          },\n          \"attr-name\": {\n            color: \"#e2777a\",\n          },\n          namespace: {\n            color: \"#e2777a\",\n          },\n          number: {\n            color: \"#e2777a\",\n          },\n          unit: {\n            color: \"#e2777a\",\n          },\n          hexcode: {\n            color: \"#e2777a\",\n          },\n          deleted: {\n            color: \"#e2777a\",\n          },\n          property: {\n            color: \"#72f1b8\",\n            textShadow:\n              \"0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475\",\n          },\n          selector: {\n            color: \"#72f1b8\",\n            textShadow:\n              \"0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475\",\n          },\n          \"function-name\": {\n            color: \"#6196cc\",\n          },\n          boolean: {\n            color: \"#fdfdfd\",\n            textShadow:\n              \"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975\",\n          },\n          \"selector.id\": {\n            color: \"#fdfdfd\",\n            textShadow:\n              \"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975\",\n          },\n          function: {\n            color: \"#fdfdfd\",\n            textShadow:\n              \"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975\",\n          },\n          \"class-name\": {\n            color: \"#fff5f6\",\n            textShadow:\n              \"0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, 0 0 25px #fc1f2c75\",\n          },\n          constant: {\n            color: \"#f92aad\",\n            textShadow: \"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3\",\n          },\n          symbol: {\n            color: \"#f92aad\",\n            textShadow: \"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3\",\n          },\n          important: {\n            color: \"#f4eee4\",\n            textShadow: \"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575\",\n            fontWeight: \"bold\",\n          },\n          atrule: {\n            color: \"#f4eee4\",\n            textShadow: \"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575\",\n          },\n          keyword: {\n            color: \"#f4eee4\",\n            textShadow: \"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575\",\n          },\n          \"selector.class\": {\n            color: \"#f4eee4\",\n            textShadow: \"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575\",\n          },\n          builtin: {\n            color: \"#f4eee4\",\n            textShadow: \"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575\",\n          },\n          string: {\n            color: \"#f87c32\",\n          },\n          char: {\n            color: \"#f87c32\",\n          },\n          \"attr-value\": {\n            color: \"#f87c32\",\n          },\n          regex: {\n            color: \"#f87c32\",\n          },\n          variable: {\n            color: \"#f87c32\",\n          },\n          operator: {\n            color: \"#67cdcc\",\n          },\n          entity: {\n            color: \"#67cdcc\",\n            cursor: \"help\",\n          },\n          url: {\n            color: \"#67cdcc\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n          inserted: {\n            color: \"green\",\n          },\n        };\n        e.default = t;\n      })(yl)),\n    yl\n  );\n}\nvar Cl = {},\n  C2;\nfunction y6() {\n  return (\n    C2 ||\n      ((C2 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            color: \"#393A34\",\n            fontFamily:\n              '\"Consolas\", \"Bitstream Vera Sans Mono\", \"Courier New\", Courier, monospace',\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            fontSize: \".9em\",\n            lineHeight: \"1.2em\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            color: \"#393A34\",\n            fontFamily:\n              '\"Consolas\", \"Bitstream Vera Sans Mono\", \"Courier New\", Courier, monospace',\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            fontSize: \".9em\",\n            lineHeight: \"1.2em\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            padding: \"1em\",\n            margin: \".5em 0\",\n            overflow: \"auto\",\n            border: \"1px solid #dddddd\",\n            backgroundColor: \"white\",\n          },\n          'pre > code[class*=\"language-\"]': {\n            fontSize: \"1em\",\n          },\n          'pre[class*=\"language-\"]::-moz-selection': {\n            background: \"#C1DEF1\",\n          },\n          'pre[class*=\"language-\"] ::-moz-selection': {\n            background: \"#C1DEF1\",\n          },\n          'code[class*=\"language-\"]::-moz-selection': {\n            background: \"#C1DEF1\",\n          },\n          'code[class*=\"language-\"] ::-moz-selection': {\n            background: \"#C1DEF1\",\n          },\n          'pre[class*=\"language-\"]::selection': {\n            background: \"#C1DEF1\",\n          },\n          'pre[class*=\"language-\"] ::selection': {\n            background: \"#C1DEF1\",\n          },\n          'code[class*=\"language-\"]::selection': {\n            background: \"#C1DEF1\",\n          },\n          'code[class*=\"language-\"] ::selection': {\n            background: \"#C1DEF1\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            padding: \".2em\",\n            paddingTop: \"1px\",\n            paddingBottom: \"1px\",\n            background: \"#f8f8f8\",\n            border: \"1px solid #dddddd\",\n          },\n          comment: {\n            color: \"#008000\",\n            fontStyle: \"italic\",\n          },\n          prolog: {\n            color: \"#008000\",\n            fontStyle: \"italic\",\n          },\n          doctype: {\n            color: \"#008000\",\n            fontStyle: \"italic\",\n          },\n          cdata: {\n            color: \"#008000\",\n            fontStyle: \"italic\",\n          },\n          namespace: {\n            Opacity: \".7\",\n          },\n          string: {\n            color: \"#A31515\",\n          },\n          punctuation: {\n            color: \"#393A34\",\n          },\n          operator: {\n            color: \"#393A34\",\n          },\n          url: {\n            color: \"#36acaa\",\n          },\n          symbol: {\n            color: \"#36acaa\",\n          },\n          number: {\n            color: \"#36acaa\",\n          },\n          boolean: {\n            color: \"#36acaa\",\n          },\n          variable: {\n            color: \"#36acaa\",\n          },\n          constant: {\n            color: \"#36acaa\",\n          },\n          inserted: {\n            color: \"#36acaa\",\n          },\n          atrule: {\n            color: \"#0000ff\",\n          },\n          keyword: {\n            color: \"#0000ff\",\n          },\n          \"attr-value\": {\n            color: \"#0000ff\",\n          },\n          \".language-autohotkey .token.selector\": {\n            color: \"#0000ff\",\n          },\n          \".language-json .token.boolean\": {\n            color: \"#0000ff\",\n          },\n          \".language-json .token.number\": {\n            color: \"#0000ff\",\n          },\n          'code[class*=\"language-css\"]': {\n            color: \"#0000ff\",\n          },\n          function: {\n            color: \"#393A34\",\n          },\n          deleted: {\n            color: \"#9a050f\",\n          },\n          \".language-autohotkey .token.tag\": {\n            color: \"#9a050f\",\n          },\n          selector: {\n            color: \"#800000\",\n          },\n          \".language-autohotkey .token.keyword\": {\n            color: \"#00009f\",\n          },\n          important: {\n            color: \"#e90\",\n            fontWeight: \"bold\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n          \"class-name\": {\n            color: \"#2B91AF\",\n          },\n          \".language-json .token.property\": {\n            color: \"#2B91AF\",\n          },\n          tag: {\n            color: \"#800000\",\n          },\n          \"attr-name\": {\n            color: \"#ff0000\",\n          },\n          property: {\n            color: \"#ff0000\",\n          },\n          regex: {\n            color: \"#ff0000\",\n          },\n          entity: {\n            color: \"#ff0000\",\n          },\n          \"directive.tag.tag\": {\n            background: \"#ffff00\",\n            color: \"#393A34\",\n          },\n          \".line-numbers.line-numbers .line-numbers-rows\": {\n            borderRightColor: \"#a5a5a5\",\n          },\n          \".line-numbers .line-numbers-rows > span:before\": {\n            color: \"#2B91AF\",\n          },\n          \".line-highlight.line-highlight\": {\n            background:\n              \"linear-gradient(to right, rgba(193, 222, 241, 0.2) 70%, rgba(221, 222, 241, 0))\",\n          },\n        };\n        e.default = t;\n      })(Cl)),\n    Cl\n  );\n}\nvar vl = {},\n  v2;\nfunction C6() {\n  return (\n    v2 ||\n      ((v2 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'pre[class*=\"language-\"]': {\n            color: \"#d4d4d4\",\n            fontSize: \"13px\",\n            textShadow: \"none\",\n            fontFamily:\n              'Menlo, Monaco, Consolas, \"Andale Mono\", \"Ubuntu Mono\", \"Courier New\", monospace',\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            padding: \"1em\",\n            margin: \".5em 0\",\n            overflow: \"auto\",\n            background: \"#1e1e1e\",\n          },\n          'code[class*=\"language-\"]': {\n            color: \"#d4d4d4\",\n            fontSize: \"13px\",\n            textShadow: \"none\",\n            fontFamily:\n              'Menlo, Monaco, Consolas, \"Andale Mono\", \"Ubuntu Mono\", \"Courier New\", monospace',\n            direction: \"ltr\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            lineHeight: \"1.5\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n          },\n          'pre[class*=\"language-\"]::selection': {\n            textShadow: \"none\",\n            background: \"#264F78\",\n          },\n          'code[class*=\"language-\"]::selection': {\n            textShadow: \"none\",\n            background: \"#264F78\",\n          },\n          'pre[class*=\"language-\"] *::selection': {\n            textShadow: \"none\",\n            background: \"#264F78\",\n          },\n          'code[class*=\"language-\"] *::selection': {\n            textShadow: \"none\",\n            background: \"#264F78\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            padding: \".1em .3em\",\n            borderRadius: \".3em\",\n            color: \"#db4c69\",\n            background: \"#1e1e1e\",\n          },\n          \".namespace\": {\n            Opacity: \".7\",\n          },\n          \"doctype.doctype-tag\": {\n            color: \"#569CD6\",\n          },\n          \"doctype.name\": {\n            color: \"#9cdcfe\",\n          },\n          comment: {\n            color: \"#6a9955\",\n          },\n          prolog: {\n            color: \"#6a9955\",\n          },\n          punctuation: {\n            color: \"#d4d4d4\",\n          },\n          \".language-html .language-css .token.punctuation\": {\n            color: \"#d4d4d4\",\n          },\n          \".language-html .language-javascript .token.punctuation\": {\n            color: \"#d4d4d4\",\n          },\n          property: {\n            color: \"#9cdcfe\",\n          },\n          tag: {\n            color: \"#569cd6\",\n          },\n          boolean: {\n            color: \"#569cd6\",\n          },\n          number: {\n            color: \"#b5cea8\",\n          },\n          constant: {\n            color: \"#9cdcfe\",\n          },\n          symbol: {\n            color: \"#b5cea8\",\n          },\n          inserted: {\n            color: \"#b5cea8\",\n          },\n          unit: {\n            color: \"#b5cea8\",\n          },\n          selector: {\n            color: \"#d7ba7d\",\n          },\n          \"attr-name\": {\n            color: \"#9cdcfe\",\n          },\n          string: {\n            color: \"#ce9178\",\n          },\n          char: {\n            color: \"#ce9178\",\n          },\n          builtin: {\n            color: \"#ce9178\",\n          },\n          deleted: {\n            color: \"#ce9178\",\n          },\n          \".language-css .token.string.url\": {\n            textDecoration: \"underline\",\n          },\n          operator: {\n            color: \"#d4d4d4\",\n          },\n          entity: {\n            color: \"#569cd6\",\n          },\n          \"operator.arrow\": {\n            color: \"#569CD6\",\n          },\n          atrule: {\n            color: \"#ce9178\",\n          },\n          \"atrule.rule\": {\n            color: \"#c586c0\",\n          },\n          \"atrule.url\": {\n            color: \"#9cdcfe\",\n          },\n          \"atrule.url.function\": {\n            color: \"#dcdcaa\",\n          },\n          \"atrule.url.punctuation\": {\n            color: \"#d4d4d4\",\n          },\n          keyword: {\n            color: \"#569CD6\",\n          },\n          \"keyword.module\": {\n            color: \"#c586c0\",\n          },\n          \"keyword.control-flow\": {\n            color: \"#c586c0\",\n          },\n          function: {\n            color: \"#dcdcaa\",\n          },\n          \"function.maybe-class-name\": {\n            color: \"#dcdcaa\",\n          },\n          regex: {\n            color: \"#d16969\",\n          },\n          important: {\n            color: \"#569cd6\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n          \"class-name\": {\n            color: \"#4ec9b0\",\n          },\n          \"maybe-class-name\": {\n            color: \"#4ec9b0\",\n          },\n          console: {\n            color: \"#9cdcfe\",\n          },\n          parameter: {\n            color: \"#9cdcfe\",\n          },\n          interpolation: {\n            color: \"#9cdcfe\",\n          },\n          \"punctuation.interpolation-punctuation\": {\n            color: \"#569cd6\",\n          },\n          variable: {\n            color: \"#9cdcfe\",\n          },\n          \"imports.maybe-class-name\": {\n            color: \"#9cdcfe\",\n          },\n          \"exports.maybe-class-name\": {\n            color: \"#9cdcfe\",\n          },\n          escape: {\n            color: \"#d7ba7d\",\n          },\n          \"tag.punctuation\": {\n            color: \"#808080\",\n          },\n          cdata: {\n            color: \"#808080\",\n          },\n          \"attr-value\": {\n            color: \"#ce9178\",\n          },\n          \"attr-value.punctuation\": {\n            color: \"#ce9178\",\n          },\n          \"attr-value.punctuation.attr-equals\": {\n            color: \"#d4d4d4\",\n          },\n          namespace: {\n            color: \"#4ec9b0\",\n          },\n          'pre[class*=\"language-javascript\"]': {\n            color: \"#9cdcfe\",\n          },\n          'code[class*=\"language-javascript\"]': {\n            color: \"#9cdcfe\",\n          },\n          'pre[class*=\"language-jsx\"]': {\n            color: \"#9cdcfe\",\n          },\n          'code[class*=\"language-jsx\"]': {\n            color: \"#9cdcfe\",\n          },\n          'pre[class*=\"language-typescript\"]': {\n            color: \"#9cdcfe\",\n          },\n          'code[class*=\"language-typescript\"]': {\n            color: \"#9cdcfe\",\n          },\n          'pre[class*=\"language-tsx\"]': {\n            color: \"#9cdcfe\",\n          },\n          'code[class*=\"language-tsx\"]': {\n            color: \"#9cdcfe\",\n          },\n          'pre[class*=\"language-css\"]': {\n            color: \"#ce9178\",\n          },\n          'code[class*=\"language-css\"]': {\n            color: \"#ce9178\",\n          },\n          'pre[class*=\"language-html\"]': {\n            color: \"#d4d4d4\",\n          },\n          'code[class*=\"language-html\"]': {\n            color: \"#d4d4d4\",\n          },\n          \".language-regex .token.anchor\": {\n            color: \"#dcdcaa\",\n          },\n          \".language-html .token.punctuation\": {\n            color: \"#808080\",\n          },\n          'pre[class*=\"language-\"] > code[class*=\"language-\"]': {\n            position: \"relative\",\n            zIndex: \"1\",\n          },\n          \".line-highlight.line-highlight\": {\n            background: \"#f7ebc6\",\n            boxShadow: \"inset 5px 0 0 #f7d87c\",\n            zIndex: \"0\",\n          },\n        };\n        e.default = t;\n      })(vl)),\n    vl\n  );\n}\nvar xl = {},\n  x2;\nfunction v6() {\n  return (\n    x2 ||\n      ((x2 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            MozTabSize: \"2\",\n            OTabSize: \"2\",\n            tabSize: \"2\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            whiteSpace: \"pre-wrap\",\n            wordWrap: \"normal\",\n            fontFamily: 'Menlo, Monaco, \"Courier New\", monospace',\n            fontSize: \"14px\",\n            color: \"#76d9e6\",\n            textShadow: \"none\",\n          },\n          'pre[class*=\"language-\"]': {\n            MozTabSize: \"2\",\n            OTabSize: \"2\",\n            tabSize: \"2\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            whiteSpace: \"pre-wrap\",\n            wordWrap: \"normal\",\n            fontFamily: 'Menlo, Monaco, \"Courier New\", monospace',\n            fontSize: \"14px\",\n            color: \"#76d9e6\",\n            textShadow: \"none\",\n            background: \"#2a2a2a\",\n            padding: \"15px\",\n            borderRadius: \"4px\",\n            border: \"1px solid #e1e1e8\",\n            overflow: \"auto\",\n            position: \"relative\",\n          },\n          'pre > code[class*=\"language-\"]': {\n            fontSize: \"1em\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            background: \"#2a2a2a\",\n            padding: \"0.15em 0.2em 0.05em\",\n            borderRadius: \".3em\",\n            border: \"0.13em solid #7a6652\",\n            boxShadow: \"1px 1px 0.3em -0.1em #000 inset\",\n          },\n          'pre[class*=\"language-\"] code': {\n            whiteSpace: \"pre\",\n            display: \"block\",\n          },\n          namespace: {\n            Opacity: \".7\",\n          },\n          comment: {\n            color: \"#6f705e\",\n          },\n          prolog: {\n            color: \"#6f705e\",\n          },\n          doctype: {\n            color: \"#6f705e\",\n          },\n          cdata: {\n            color: \"#6f705e\",\n          },\n          operator: {\n            color: \"#a77afe\",\n          },\n          boolean: {\n            color: \"#a77afe\",\n          },\n          number: {\n            color: \"#a77afe\",\n          },\n          \"attr-name\": {\n            color: \"#e6d06c\",\n          },\n          string: {\n            color: \"#e6d06c\",\n          },\n          entity: {\n            color: \"#e6d06c\",\n            cursor: \"help\",\n          },\n          url: {\n            color: \"#e6d06c\",\n          },\n          \".language-css .token.string\": {\n            color: \"#e6d06c\",\n          },\n          \".style .token.string\": {\n            color: \"#e6d06c\",\n          },\n          selector: {\n            color: \"#a6e22d\",\n          },\n          inserted: {\n            color: \"#a6e22d\",\n          },\n          atrule: {\n            color: \"#ef3b7d\",\n          },\n          \"attr-value\": {\n            color: \"#ef3b7d\",\n          },\n          keyword: {\n            color: \"#ef3b7d\",\n          },\n          important: {\n            color: \"#ef3b7d\",\n            fontWeight: \"bold\",\n          },\n          deleted: {\n            color: \"#ef3b7d\",\n          },\n          regex: {\n            color: \"#76d9e6\",\n          },\n          statement: {\n            color: \"#76d9e6\",\n            fontWeight: \"bold\",\n          },\n          placeholder: {\n            color: \"#fff\",\n          },\n          variable: {\n            color: \"#fff\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          punctuation: {\n            color: \"#bebec5\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n          \"code.language-markup\": {\n            color: \"#f9f9f9\",\n          },\n          \"code.language-markup .token.tag\": {\n            color: \"#ef3b7d\",\n          },\n          \"code.language-markup .token.attr-name\": {\n            color: \"#a6e22d\",\n          },\n          \"code.language-markup .token.attr-value\": {\n            color: \"#e6d06c\",\n          },\n          \"code.language-markup .token.style\": {\n            color: \"#76d9e6\",\n          },\n          \"code.language-markup .token.script\": {\n            color: \"#76d9e6\",\n          },\n          \"code.language-markup .token.script .token.keyword\": {\n            color: \"#76d9e6\",\n          },\n          \".line-highlight.line-highlight\": {\n            padding: \"0\",\n            background: \"rgba(255, 255, 255, 0.08)\",\n          },\n          \".line-highlight.line-highlight:before\": {\n            padding: \"0.2em 0.5em\",\n            backgroundColor: \"rgba(255, 255, 255, 0.4)\",\n            color: \"black\",\n            height: \"1em\",\n            lineHeight: \"1em\",\n            boxShadow: \"0 1px 1px rgba(255, 255, 255, 0.7)\",\n          },\n          \".line-highlight.line-highlight[data-end]:after\": {\n            padding: \"0.2em 0.5em\",\n            backgroundColor: \"rgba(255, 255, 255, 0.4)\",\n            color: \"black\",\n            height: \"1em\",\n            lineHeight: \"1em\",\n            boxShadow: \"0 1px 1px rgba(255, 255, 255, 0.7)\",\n          },\n        };\n        e.default = t;\n      })(xl)),\n    xl\n  );\n}\nvar wl = {},\n  w2;\nfunction x6() {\n  return (\n    w2 ||\n      ((w2 = 1),\n      (function (e) {\n        Object.defineProperty(e, \"__esModule\", {\n          value: !0,\n        }),\n          (e.default = void 0);\n        var t = {\n          'code[class*=\"language-\"]': {\n            color: \"#22da17\",\n            fontFamily: \"monospace\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            lineHeight: \"25px\",\n            fontSize: \"18px\",\n            margin: \"5px 0\",\n          },\n          'pre[class*=\"language-\"]': {\n            color: \"white\",\n            fontFamily: \"monospace\",\n            textAlign: \"left\",\n            whiteSpace: \"pre\",\n            wordSpacing: \"normal\",\n            wordBreak: \"normal\",\n            wordWrap: \"normal\",\n            MozTabSize: \"4\",\n            OTabSize: \"4\",\n            tabSize: \"4\",\n            WebkitHyphens: \"none\",\n            MozHyphens: \"none\",\n            msHyphens: \"none\",\n            hyphens: \"none\",\n            lineHeight: \"25px\",\n            fontSize: \"18px\",\n            margin: \"0.5em 0\",\n            background: \"#0a143c\",\n            padding: \"1em\",\n            overflow: \"auto\",\n          },\n          'pre[class*=\"language-\"] *': {\n            fontFamily: \"monospace\",\n          },\n          ':not(pre) > code[class*=\"language-\"]': {\n            color: \"white\",\n            background: \"#0a143c\",\n            padding: \"0.1em\",\n            borderRadius: \"0.3em\",\n            whiteSpace: \"normal\",\n          },\n          'pre[class*=\"language-\"]::-moz-selection': {\n            textShadow: \"none\",\n            background: \"rgba(29, 59, 83, 0.99)\",\n          },\n          'pre[class*=\"language-\"] ::-moz-selection': {\n            textShadow: \"none\",\n            background: \"rgba(29, 59, 83, 0.99)\",\n          },\n          'code[class*=\"language-\"]::-moz-selection': {\n            textShadow: \"none\",\n            background: \"rgba(29, 59, 83, 0.99)\",\n          },\n          'code[class*=\"language-\"] ::-moz-selection': {\n            textShadow: \"none\",\n            background: \"rgba(29, 59, 83, 0.99)\",\n          },\n          'pre[class*=\"language-\"]::selection': {\n            textShadow: \"none\",\n            background: \"rgba(29, 59, 83, 0.99)\",\n          },\n          'pre[class*=\"language-\"] ::selection': {\n            textShadow: \"none\",\n            background: \"rgba(29, 59, 83, 0.99)\",\n          },\n          'code[class*=\"language-\"]::selection': {\n            textShadow: \"none\",\n            background: \"rgba(29, 59, 83, 0.99)\",\n          },\n          'code[class*=\"language-\"] ::selection': {\n            textShadow: \"none\",\n            background: \"rgba(29, 59, 83, 0.99)\",\n          },\n          comment: {\n            color: \"rgb(99, 119, 119)\",\n            fontStyle: \"italic\",\n          },\n          prolog: {\n            color: \"rgb(99, 119, 119)\",\n            fontStyle: \"italic\",\n          },\n          cdata: {\n            color: \"rgb(99, 119, 119)\",\n            fontStyle: \"italic\",\n          },\n          punctuation: {\n            color: \"rgb(199, 146, 234)\",\n          },\n          \".namespace\": {\n            color: \"rgb(178, 204, 214)\",\n          },\n          deleted: {\n            color: \"rgba(239, 83, 80, 0.56)\",\n            fontStyle: \"italic\",\n          },\n          symbol: {\n            color: \"rgb(128, 203, 196)\",\n          },\n          property: {\n            color: \"rgb(128, 203, 196)\",\n          },\n          tag: {\n            color: \"rgb(127, 219, 202)\",\n          },\n          operator: {\n            color: \"rgb(127, 219, 202)\",\n          },\n          keyword: {\n            color: \"rgb(127, 219, 202)\",\n          },\n          boolean: {\n            color: \"rgb(255, 88, 116)\",\n          },\n          number: {\n            color: \"rgb(247, 140, 108)\",\n          },\n          constant: {\n            color: \"rgb(34 183 199)\",\n          },\n          function: {\n            color: \"rgb(34 183 199)\",\n          },\n          builtin: {\n            color: \"rgb(34 183 199)\",\n          },\n          char: {\n            color: \"rgb(34 183 199)\",\n          },\n          selector: {\n            color: \"rgb(199, 146, 234)\",\n            fontStyle: \"italic\",\n          },\n          doctype: {\n            color: \"rgb(199, 146, 234)\",\n            fontStyle: \"italic\",\n          },\n          \"attr-name\": {\n            color: \"rgb(173, 219, 103)\",\n            fontStyle: \"italic\",\n          },\n          inserted: {\n            color: \"rgb(173, 219, 103)\",\n            fontStyle: \"italic\",\n          },\n          string: {\n            color: \"rgb(173, 219, 103)\",\n          },\n          url: {\n            color: \"rgb(173, 219, 103)\",\n          },\n          entity: {\n            color: \"rgb(173, 219, 103)\",\n          },\n          \".language-css .token.string\": {\n            color: \"rgb(173, 219, 103)\",\n          },\n          \".style .token.string\": {\n            color: \"rgb(173, 219, 103)\",\n          },\n          \"class-name\": {\n            color: \"rgb(255, 203, 139)\",\n          },\n          atrule: {\n            color: \"rgb(255, 203, 139)\",\n          },\n          \"attr-value\": {\n            color: \"rgb(255, 203, 139)\",\n          },\n          regex: {\n            color: \"rgb(214, 222, 235)\",\n          },\n          important: {\n            color: \"rgb(214, 222, 235)\",\n            fontWeight: \"bold\",\n          },\n          variable: {\n            color: \"rgb(214, 222, 235)\",\n          },\n          bold: {\n            fontWeight: \"bold\",\n          },\n          italic: {\n            fontStyle: \"italic\",\n          },\n        };\n        e.default = t;\n      })(wl)),\n    wl\n  );\n}\n(function (e) {\n  var t = N4;\n  Object.defineProperty(e, \"__esModule\", {\n    value: !0,\n  }),\n    Object.defineProperty(e, \"a11yDark\", {\n      enumerable: !0,\n      get: function () {\n        return c.default;\n      },\n    }),\n    Object.defineProperty(e, \"atomDark\", {\n      enumerable: !0,\n      get: function () {\n        return d.default;\n      },\n    }),\n    Object.defineProperty(e, \"base16AteliersulphurpoolLight\", {\n      enumerable: !0,\n      get: function () {\n        return p.default;\n      },\n    }),\n    Object.defineProperty(e, \"cb\", {\n      enumerable: !0,\n      get: function () {\n        return h.default;\n      },\n    }),\n    Object.defineProperty(e, \"coldarkCold\", {\n      enumerable: !0,\n      get: function () {\n        return m.default;\n      },\n    }),\n    Object.defineProperty(e, \"coldarkDark\", {\n      enumerable: !0,\n      get: function () {\n        return b.default;\n      },\n    }),\n    Object.defineProperty(e, \"coy\", {\n      enumerable: !0,\n      get: function () {\n        return n.default;\n      },\n    }),\n    Object.defineProperty(e, \"coyWithoutShadows\", {\n      enumerable: !0,\n      get: function () {\n        return y.default;\n      },\n    }),\n    Object.defineProperty(e, \"darcula\", {\n      enumerable: !0,\n      get: function () {\n        return g.default;\n      },\n    }),\n    Object.defineProperty(e, \"dark\", {\n      enumerable: !0,\n      get: function () {\n        return o.default;\n      },\n    }),\n    Object.defineProperty(e, \"dracula\", {\n      enumerable: !0,\n      get: function () {\n        return x.default;\n      },\n    }),\n    Object.defineProperty(e, \"duotoneDark\", {\n      enumerable: !0,\n      get: function () {\n        return v.default;\n      },\n    }),\n    Object.defineProperty(e, \"duotoneEarth\", {\n      enumerable: !0,\n      get: function () {\n        return S.default;\n      },\n    }),\n    Object.defineProperty(e, \"duotoneForest\", {\n      enumerable: !0,\n      get: function () {\n        return w.default;\n      },\n    }),\n    Object.defineProperty(e, \"duotoneLight\", {\n      enumerable: !0,\n      get: function () {\n        return E.default;\n      },\n    }),\n    Object.defineProperty(e, \"duotoneSea\", {\n      enumerable: !0,\n      get: function () {\n        return M.default;\n      },\n    }),\n    Object.defineProperty(e, \"duotoneSpace\", {\n      enumerable: !0,\n      get: function () {\n        return _.default;\n      },\n    }),\n    Object.defineProperty(e, \"funky\", {\n      enumerable: !0,\n      get: function () {\n        return r.default;\n      },\n    }),\n    Object.defineProperty(e, \"ghcolors\", {\n      enumerable: !0,\n      get: function () {\n        return j.default;\n      },\n    }),\n    Object.defineProperty(e, \"gruvboxDark\", {\n      enumerable: !0,\n      get: function () {\n        return R.default;\n      },\n    }),\n    Object.defineProperty(e, \"gruvboxLight\", {\n      enumerable: !0,\n      get: function () {\n        return D.default;\n      },\n    }),\n    Object.defineProperty(e, \"holiTheme\", {\n      enumerable: !0,\n      get: function () {\n        return P.default;\n      },\n    }),\n    Object.defineProperty(e, \"hopscotch\", {\n      enumerable: !0,\n      get: function () {\n        return V.default;\n      },\n    }),\n    Object.defineProperty(e, \"lucario\", {\n      enumerable: !0,\n      get: function () {\n        return k.default;\n      },\n    }),\n    Object.defineProperty(e, \"materialDark\", {\n      enumerable: !0,\n      get: function () {\n        return N.default;\n      },\n    }),\n    Object.defineProperty(e, \"materialLight\", {\n      enumerable: !0,\n      get: function () {\n        return T.default;\n      },\n    }),\n    Object.defineProperty(e, \"materialOceanic\", {\n      enumerable: !0,\n      get: function () {\n        return F.default;\n      },\n    }),\n    Object.defineProperty(e, \"nightOwl\", {\n      enumerable: !0,\n      get: function () {\n        return I.default;\n      },\n    }),\n    Object.defineProperty(e, \"nord\", {\n      enumerable: !0,\n      get: function () {\n        return L.default;\n      },\n    }),\n    Object.defineProperty(e, \"okaidia\", {\n      enumerable: !0,\n      get: function () {\n        return i.default;\n      },\n    }),\n    Object.defineProperty(e, \"oneDark\", {\n      enumerable: !0,\n      get: function () {\n        return C.default;\n      },\n    }),\n    Object.defineProperty(e, \"oneLight\", {\n      enumerable: !0,\n      get: function () {\n        return H.default;\n      },\n    }),\n    Object.defineProperty(e, \"pojoaque\", {\n      enumerable: !0,\n      get: function () {\n        return B.default;\n      },\n    }),\n    Object.defineProperty(e, \"prism\", {\n      enumerable: !0,\n      get: function () {\n        return u.default;\n      },\n    }),\n    Object.defineProperty(e, \"shadesOfPurple\", {\n      enumerable: !0,\n      get: function () {\n        return A.default;\n      },\n    }),\n    Object.defineProperty(e, \"solarizedDarkAtom\", {\n      enumerable: !0,\n      get: function () {\n        return W.default;\n      },\n    }),\n    Object.defineProperty(e, \"solarizedlight\", {\n      enumerable: !0,\n      get: function () {\n        return a.default;\n      },\n    }),\n    Object.defineProperty(e, \"synthwave84\", {\n      enumerable: !0,\n      get: function () {\n        return G.default;\n      },\n    }),\n    Object.defineProperty(e, \"tomorrow\", {\n      enumerable: !0,\n      get: function () {\n        return l.default;\n      },\n    }),\n    Object.defineProperty(e, \"twilight\", {\n      enumerable: !0,\n      get: function () {\n        return s.default;\n      },\n    }),\n    Object.defineProperty(e, \"vs\", {\n      enumerable: !0,\n      get: function () {\n        return K.default;\n      },\n    }),\n    Object.defineProperty(e, \"vscDarkPlus\", {\n      enumerable: !0,\n      get: function () {\n        return Q.default;\n      },\n    }),\n    Object.defineProperty(e, \"xonokai\", {\n      enumerable: !0,\n      get: function () {\n        return ne.default;\n      },\n    }),\n    Object.defineProperty(e, \"zTouch\", {\n      enumerable: !0,\n      get: function () {\n        return oe.default;\n      },\n    });\n  var n = t(L4()),\n    o = t(D4()),\n    r = t(j4()),\n    i = t(F4()),\n    a = t(R4()),\n    l = t(I4()),\n    s = t(H4()),\n    u = t(z4()),\n    c = t(P4()),\n    d = t(B4()),\n    p = t(V4()),\n    h = t($4()),\n    m = t(W4()),\n    b = t(Z4()),\n    y = t(U4()),\n    g = t(q4()),\n    x = t(Y4()),\n    v = t(G4()),\n    S = t(K4()),\n    w = t(X4()),\n    E = t(Q4()),\n    M = t(J4()),\n    _ = t(e6()),\n    j = t(t6()),\n    R = t(n6()),\n    D = t(o6()),\n    P = t(r6()),\n    V = t(i6()),\n    k = t(a6()),\n    N = t(l6()),\n    T = t(s6()),\n    F = t(c6()),\n    I = t(u6()),\n    L = t(d6()),\n    C = t(f6()),\n    H = t(h6()),\n    B = t(p6()),\n    A = t(g6()),\n    W = t(m6()),\n    G = t(b6()),\n    K = t(y6()),\n    Q = t(C6()),\n    ne = t(v6()),\n    oe = t(x6());\n})(Jo);\nconst w6 = \"_codeblock_19tsp_1\",\n  E6 = \"_dark_19tsp_1\",\n  E2 = {\n    codeblock: w6,\n    dark: E6,\n  },\n  S6 = {\n    vs: Jo.vs,\n    \"vsc-dark-plus\": Jo.vscDarkPlus,\n    solarizedLight: Jo.solarizedlight,\n    tomorrow: Jo.tomorrow,\n  },\n  Lr = ({\n    code: e,\n    language: t,\n    fileName: n,\n    editorTheme: o = \"vs\",\n    theme: r,\n    showLineNumbers: i,\n    className: a,\n    titleActions: l,\n  }) =>\n    /* @__PURE__ */ f.jsxs(bt, {\n      className: `${E2.codeblock} ${a || \"\"} ${r === \"dark\" ? E2.dark : \"\"}`,\n      children: [\n        n\n          ? /* @__PURE__ */ f.jsxs(Io, {\n              className: \"d-flex justify-content-between\",\n              children: [n, \" \", l],\n            })\n          : null,\n        /* @__PURE__ */ f.jsx(Mt, {\n          children: /* @__PURE__ */ f.jsx(b4, {\n            showLineNumbers: i,\n            language: t,\n            style: S6[o],\n            children: e,\n          }),\n        }),\n      ],\n    }),\n  k6 = \"_stack_73h55_1\",\n  _6 = {\n    stack: k6,\n  },\n  Ze = ea(function ({ children: t, direction: n = \"row\", ...o }, r) {\n    return /* @__PURE__ */ f.jsx(\"div\", {\n      ...o,\n      className: `${o.className} ${_6.stack} stack-${n}`,\n      ref: r,\n      children: t,\n    });\n  }),\n  md = ({ tooltip: e, ...t }) =>\n    /* @__PURE__ */ f.jsx(Sn, {\n      title: e,\n      children: /* @__PURE__ */ f.jsx(Jf, { ...t }),\n    }),\n  ac = ({ queryFn: e }) => {\n    const [t, n] = se(),\n      [o, r] = se(!1),\n      [i, a] = se(),\n      l = async () => {\n        r(!0);\n        try {\n          const u = await e();\n          a(u);\n        } catch (u) {\n          n(u);\n        } finally {\n          r(!1);\n        }\n      };\n    return (\n      ue(() => {\n        l();\n      }, []),\n      {\n        error: t,\n        data: i,\n        loading: o,\n        refetch: () => {\n          l();\n        },\n      }\n    );\n  },\n  ro = ({ queryFn: e, onSuccess: t }) => {\n    const [n, o] = se(),\n      [r, i] = se(!1),\n      [a, l] = se();\n    return {\n      error: n,\n      data: a,\n      loading: r,\n      mutate: async (u) => {\n        i(!0);\n        try {\n          const c = await e(u);\n          l(c), t == null || t(c);\n        } catch (c) {\n          o(c);\n        } finally {\n          i(!1);\n        }\n      },\n    };\n  },\n  Te = {\n    get: async (e, t, n) => ({}),\n    post: async (e, t, n) => ({}),\n  };\nvar lc = /* @__PURE__ */ ((e) => (\n  (e.DBT_DOCS = \"dbt-docs\"),\n  (e.DOCUMENTATION_EDITOR = \"documentation-editor\"),\n  (e.SAAS = \"saas\"),\n  e\n))(lc || {});\nconst A6 = () => {\n  var t, n, o;\n  const e =\n    (o =\n      (n = (t = window.location.hash) == null ? void 0 : t.split(\"#\")[1]) ==\n      null\n        ? void 0\n        : n.replace(\"!/\", \"\")) == null\n      ? void 0\n      : o.split(\"/\");\n  return {\n    name: e == null ? void 0 : e[1],\n    resourceType: e == null ? void 0 : e[0],\n  };\n};\nvar bd = { exports: {} };\n/*! web-highlighter v0.7.4 https://github.com/alienzhou/web-highlighter */\n(function (e, t) {\n  (function (n, o) {\n    e.exports = o();\n  })(window, function () {\n    return (function (n) {\n      var o = {};\n      function r(i) {\n        if (o[i]) return o[i].exports;\n        var a = (o[i] = { i, l: !1, exports: {} });\n        return n[i].call(a.exports, a, a.exports, r), (a.l = !0), a.exports;\n      }\n      return (\n        (r.m = n),\n        (r.c = o),\n        (r.d = function (i, a, l) {\n          r.o(i, a) || Object.defineProperty(i, a, { enumerable: !0, get: l });\n        }),\n        (r.r = function (i) {\n          typeof Symbol < \"u\" &&\n            Symbol.toStringTag &&\n            Object.defineProperty(i, Symbol.toStringTag, { value: \"Module\" }),\n            Object.defineProperty(i, \"__esModule\", { value: !0 });\n        }),\n        (r.t = function (i, a) {\n          if (\n            (1 & a && (i = r(i)),\n            8 & a || (4 & a && typeof i == \"object\" && i && i.__esModule))\n          )\n            return i;\n          var l = /* @__PURE__ */ Object.create(null);\n          if (\n            (r.r(l),\n            Object.defineProperty(l, \"default\", { enumerable: !0, value: i }),\n            2 & a && typeof i != \"string\")\n          )\n            for (var s in i)\n              r.d(\n                l,\n                s,\n                function (u) {\n                  return i[u];\n                }.bind(null, s),\n              );\n          return l;\n        }),\n        (r.n = function (i) {\n          var a =\n            i && i.__esModule\n              ? function () {\n                  return i.default;\n                }\n              : function () {\n                  return i;\n                };\n          return r.d(a, \"a\", a), a;\n        }),\n        (r.o = function (i, a) {\n          return Object.prototype.hasOwnProperty.call(i, a);\n        }),\n        (r.p = \"\"),\n        r((r.s = 7))\n      );\n    })([\n      function (n, o, r) {\n        var i,\n          a =\n            (this && this.__extends) ||\n            ((i = function (d, p) {\n              return (i =\n                Object.setPrototypeOf ||\n                ({ __proto__: [] } instanceof Array &&\n                  function (h, m) {\n                    h.__proto__ = m;\n                  }) ||\n                function (h, m) {\n                  for (var b in m)\n                    Object.prototype.hasOwnProperty.call(m, b) && (h[b] = m[b]);\n                })(d, p);\n            }),\n            function (d, p) {\n              function h() {\n                this.constructor = d;\n              }\n              i(d, p),\n                (d.prototype =\n                  p === null\n                    ? Object.create(p)\n                    : ((h.prototype = p.prototype), new h()));\n            }),\n          l =\n            (this && this.__importDefault) ||\n            function (d) {\n              return d && d.__esModule ? d : { default: d };\n            };\n        Object.defineProperty(o, \"__esModule\", { value: !0 }),\n          (o.eventEmitter =\n            o.INTERNAL_ERROR_EVENT =\n            o.UNKNOWN_IDX =\n            o.ROOT_IDX =\n            o.getStylesheet =\n            o.getDefaultOptions =\n            o.CAMEL_DATASET_SPLIT_TYPE =\n            o.CAMEL_DATASET_IDENTIFIER_EXTRA =\n            o.CAMEL_DATASET_IDENTIFIER =\n            o.DATASET_SPLIT_TYPE =\n            o.DATASET_IDENTIFIER_EXTRA =\n            o.DATASET_IDENTIFIER =\n            o.STYLESHEET_ID =\n            o.LOCAL_STORE_KEY =\n            o.ID_DIVISION =\n              void 0);\n        var s = l(r(10)),\n          u = l(r(2));\n        (o.ID_DIVISION = \";\"),\n          (o.LOCAL_STORE_KEY = \"highlight-mengshou\"),\n          (o.STYLESHEET_ID = \"highlight-mengshou-style\"),\n          (o.DATASET_IDENTIFIER = \"highlight-id\"),\n          (o.DATASET_IDENTIFIER_EXTRA = \"highlight-id-extra\"),\n          (o.DATASET_SPLIT_TYPE = \"highlight-split-type\"),\n          (o.CAMEL_DATASET_IDENTIFIER = s.default(o.DATASET_IDENTIFIER)),\n          (o.CAMEL_DATASET_IDENTIFIER_EXTRA = s.default(\n            o.DATASET_IDENTIFIER_EXTRA,\n          )),\n          (o.CAMEL_DATASET_SPLIT_TYPE = s.default(o.DATASET_SPLIT_TYPE)),\n          (o.getDefaultOptions = function () {\n            return {\n              $root: document || document.documentElement,\n              exceptSelectors: null,\n              wrapTag: \"span\",\n              verbose: !1,\n              style: { className: \"highlight-mengshou-wrap\" },\n            };\n          }),\n          (o.getStylesheet = function () {\n            return (\n              `\n    .` +\n              o.getDefaultOptions().style.className +\n              ` {\n        background: #ff9;\n        cursor: pointer;\n    }\n    .` +\n              o.getDefaultOptions().style.className +\n              `.active {\n        background: #ffb;\n    }\n`\n            );\n          }),\n          (o.ROOT_IDX = -2),\n          (o.UNKNOWN_IDX = -1),\n          (o.INTERNAL_ERROR_EVENT = \"error\");\n        var c = (function (d) {\n          function p() {\n            return (d !== null && d.apply(this, arguments)) || this;\n          }\n          return a(p, d), p;\n        })(u.default);\n        o.eventEmitter = new c();\n      },\n      function (n, o, r) {\n        Object.defineProperty(o, \"__esModule\", { value: !0 }),\n          (o.UserInputEvent =\n            o.SelectedNodeType =\n            o.CreateFrom =\n            o.EventType =\n            o.ERROR =\n            o.SplitType =\n              void 0),\n          (function (i) {\n            (i.none = \"none\"),\n              (i.head = \"head\"),\n              (i.tail = \"tail\"),\n              (i.both = \"both\");\n          })(o.SplitType || (o.SplitType = {})),\n          (function (i) {\n            (i.DOM_TYPE_ERROR = \"[DOM] Receive wrong node type.\"),\n              (i.DOM_SELECTION_EMPTY =\n                \"[DOM] The selection contains no dom node, may be you except them.\"),\n              (i.RANGE_INVALID =\n                \"[RANGE] Got invalid dom range, can't convert to a valid highlight range.\"),\n              (i.RANGE_NODE_INVALID =\n                \"[RANGE] Start or end node isn't a text node, it may occur an error.\"),\n              (i.DB_ID_DUPLICATE_ERROR = \"[STORE] Unique id conflict.\"),\n              (i.CACHE_SET_ERROR =\n                \"[CACHE] Cache.data can't be set manually, please use .save().\"),\n              (i.SOURCE_TYPE_ERROR =\n                \"[SOURCE] Object isn't a highlight source instance.\"),\n              (i.HIGHLIGHT_RANGE_FROZEN =\n                \"[HIGHLIGHT_RANGE] A highlight range must be frozen before render.\"),\n              (i.HIGHLIGHT_SOURCE_RECREATE =\n                \"[HIGHLIGHT_SOURCE] Recreate highlights from sources error.\"),\n              (i.HIGHLIGHT_SOURCE_NONE_RENDER =\n                \"[HIGHLIGHT_SOURCE] This highlight source isn't rendered. May be the exception skips it or the dom structure has changed.\");\n          })(o.ERROR || (o.ERROR = {})),\n          (function (i) {\n            (i.CREATE = \"selection:create\"),\n              (i.REMOVE = \"selection:remove\"),\n              (i.MODIFY = \"selection:modify\"),\n              (i.HOVER = \"selection:hover\"),\n              (i.HOVER_OUT = \"selection:hover-out\"),\n              (i.CLICK = \"selection:click\");\n          })(o.EventType || (o.EventType = {})),\n          (function (i) {\n            (i.STORE = \"from-store\"), (i.INPUT = \"from-input\");\n          })(o.CreateFrom || (o.CreateFrom = {})),\n          (function (i) {\n            (i.text = \"text\"), (i.span = \"span\");\n          })(o.SelectedNodeType || (o.SelectedNodeType = {})),\n          (function (i) {\n            (i.touchend = \"touchend\"),\n              (i.mouseup = \"mouseup\"),\n              (i.touchstart = \"touchstart\"),\n              (i.click = \"click\"),\n              (i.mouseover = \"mouseover\");\n          })(o.UserInputEvent || (o.UserInputEvent = {}));\n      },\n      function (n, o, r) {\n        var i =\n            (this && this.__read) ||\n            function (s, u) {\n              var c = typeof Symbol == \"function\" && s[Symbol.iterator];\n              if (!c) return s;\n              var d,\n                p,\n                h = c.call(s),\n                m = [];\n              try {\n                for (; (u === void 0 || u-- > 0) && !(d = h.next()).done; )\n                  m.push(d.value);\n              } catch (b) {\n                p = { error: b };\n              } finally {\n                try {\n                  d && !d.done && (c = h.return) && c.call(h);\n                } finally {\n                  if (p) throw p.error;\n                }\n              }\n              return m;\n            },\n          a =\n            (this && this.__spread) ||\n            function () {\n              for (var s = [], u = 0; u < arguments.length; u++)\n                s = s.concat(i(arguments[u]));\n              return s;\n            };\n        Object.defineProperty(o, \"__esModule\", { value: !0 });\n        var l = (function () {\n          function s() {\n            this.handlersMap = /* @__PURE__ */ Object.create(null);\n          }\n          return (\n            (s.prototype.on = function (u, c) {\n              return (\n                this.handlersMap[u] || (this.handlersMap[u] = []),\n                this.handlersMap[u].push(c),\n                this\n              );\n            }),\n            (s.prototype.off = function (u, c) {\n              return (\n                this.handlersMap[u] &&\n                  this.handlersMap[u].splice(\n                    this.handlersMap[u].indexOf(c) >>> 0,\n                    1,\n                  ),\n                this\n              );\n            }),\n            (s.prototype.emit = function (u) {\n              for (var c = [], d = 1; d < arguments.length; d++)\n                c[d - 1] = arguments[d];\n              return (\n                this.handlersMap[u] &&\n                  this.handlersMap[u].slice().forEach(function (p) {\n                    p.apply(void 0, a(c));\n                  }),\n                this\n              );\n            }),\n            s\n          );\n        })();\n        o.default = l;\n      },\n      function (n, o, r) {\n        var i =\n          (this && this.__importDefault) ||\n          function (u) {\n            return u && u.__esModule ? u : { default: u };\n          };\n        Object.defineProperty(o, \"__esModule\", { value: !0 });\n        var a = i(r(5)),\n          l = r(9),\n          s = (function () {\n            function u(c, d, p, h, m) {\n              (this.startMeta = c),\n                (this.endMeta = d),\n                (this.text = p),\n                (this.id = h),\n                (this.__isHighlightSource = {}),\n                m && (this.extra = m);\n            }\n            return (\n              (u.prototype.deSerialize = function (c, d) {\n                var p = l.queryElementNode(this, c),\n                  h = p.start,\n                  m = p.end,\n                  b = l.getTextChildByOffset(h, this.startMeta.textOffset),\n                  y = l.getTextChildByOffset(m, this.endMeta.textOffset);\n                if (!d.Serialize.Restore.isEmpty()) {\n                  var g = d.Serialize.Restore.call(this, b, y) || [];\n                  (b = g[0] || b), (y = g[1] || y);\n                }\n                return new a.default(b, y, this.text, this.id, !0);\n              }),\n              u\n            );\n          })();\n        o.default = s;\n      },\n      function (n, o, r) {\n        var i =\n            (this && this.__values) ||\n            function (c) {\n              var d = typeof Symbol == \"function\" && Symbol.iterator,\n                p = d && c[d],\n                h = 0;\n              if (p) return p.call(c);\n              if (c && typeof c.length == \"number\")\n                return {\n                  next: function () {\n                    return (\n                      c && h >= c.length && (c = void 0),\n                      { value: c && c[h++], done: !c }\n                    );\n                  },\n                };\n              throw new TypeError(\n                d\n                  ? \"Object is not iterable.\"\n                  : \"Symbol.iterator is not defined.\",\n              );\n            },\n          a =\n            (this && this.__read) ||\n            function (c, d) {\n              var p = typeof Symbol == \"function\" && c[Symbol.iterator];\n              if (!p) return c;\n              var h,\n                m,\n                b = p.call(c),\n                y = [];\n              try {\n                for (; (d === void 0 || d-- > 0) && !(h = b.next()).done; )\n                  y.push(h.value);\n              } catch (g) {\n                m = { error: g };\n              } finally {\n                try {\n                  h && !h.done && (p = b.return) && p.call(b);\n                } finally {\n                  if (m) throw m.error;\n                }\n              }\n              return y;\n            },\n          l =\n            (this && this.__spread) ||\n            function () {\n              for (var c = [], d = 0; d < arguments.length; d++)\n                c = c.concat(a(arguments[d]));\n              return c;\n            };\n        Object.defineProperty(o, \"__esModule\", { value: !0 }),\n          (o.hasClass =\n            o.removeAllClass =\n            o.removeClass =\n            o.addClass =\n            o.addEventListener =\n            o.removeEventListener =\n            o.forEach =\n            o.getHighlightById =\n            o.getHighlightsByRoot =\n            o.getExtraHighlightId =\n            o.getHighlightId =\n            o.isHighlightWrapNode =\n              void 0);\n        var s = r(0);\n        o.isHighlightWrapNode = function (c) {\n          return !!c.dataset && !!c.dataset[s.CAMEL_DATASET_IDENTIFIER];\n        };\n        var u = function (c, d) {\n          for (var p = !1, h = null; c; ) {\n            if ((o.isHighlightWrapNode(c) && (h = c), c === d)) {\n              p = !0;\n              break;\n            }\n            c = c.parentNode;\n          }\n          return p ? h : null;\n        };\n        (o.getHighlightId = function (c, d) {\n          return (c = u(c, d)) ? c.dataset[s.CAMEL_DATASET_IDENTIFIER] : \"\";\n        }),\n          (o.getExtraHighlightId = function (c, d) {\n            return (c = u(c, d))\n              ? c.dataset[s.CAMEL_DATASET_IDENTIFIER_EXTRA]\n                  .split(s.ID_DIVISION)\n                  .filter(function (p) {\n                    return p;\n                  })\n              : [];\n          }),\n          (o.getHighlightsByRoot = function (c, d) {\n            var p, h;\n            Array.isArray(c) || (c = [c]);\n            var m = [];\n            try {\n              for (var b = i(c), y = b.next(); !y.done; y = b.next()) {\n                var g = y.value.querySelectorAll(\n                  d + \"[data-\" + s.DATASET_IDENTIFIER + \"]\",\n                );\n                m.push.apply(m, g);\n              }\n            } catch (x) {\n              p = { error: x };\n            } finally {\n              try {\n                y && !y.done && (h = b.return) && h.call(b);\n              } finally {\n                if (p) throw p.error;\n              }\n            }\n            return m;\n          }),\n          (o.getHighlightById = function (c, d, p) {\n            var h,\n              m,\n              b = [],\n              y = new RegExp(\n                \"(\" +\n                  d +\n                  \"\\\\\" +\n                  s.ID_DIVISION +\n                  \"|\\\\\" +\n                  s.ID_DIVISION +\n                  \"?\" +\n                  d +\n                  \"$)\",\n              ),\n              g = c.querySelectorAll(p + \"[data-\" + s.DATASET_IDENTIFIER + \"]\");\n            try {\n              for (var x = i(g), v = x.next(); !v.done; v = x.next()) {\n                var S = v.value;\n                if (S.dataset[s.CAMEL_DATASET_IDENTIFIER] !== d) {\n                  var w = S.dataset[s.CAMEL_DATASET_IDENTIFIER_EXTRA];\n                  y.test(w) && b.push(S);\n                } else b.push(S);\n              }\n            } catch (E) {\n              h = { error: E };\n            } finally {\n              try {\n                v && !v.done && (m = x.return) && m.call(x);\n              } finally {\n                if (h) throw h.error;\n              }\n            }\n            return b;\n          }),\n          (o.forEach = function (c, d) {\n            for (var p = 0; p < c.length; p++) d(c[p], p, c);\n          }),\n          (o.removeEventListener = function (c, d, p) {\n            c.removeEventListener(d, p);\n          }),\n          (o.addEventListener = function (c, d, p) {\n            return (\n              c.addEventListener(d, p),\n              function () {\n                o.removeEventListener(c, d, p);\n              }\n            );\n          }),\n          (o.addClass = function (c, d) {\n            var p;\n            Array.isArray(d) || (d = [d]), (p = c.classList).add.apply(p, l(d));\n          }),\n          (o.removeClass = function (c, d) {\n            c.classList.remove(d);\n          }),\n          (o.removeAllClass = function (c) {\n            c.className = \"\";\n          }),\n          (o.hasClass = function (c, d) {\n            return c.classList.contains(d);\n          });\n      },\n      function (n, o, r) {\n        var i =\n          (this && this.__importDefault) ||\n          function (h) {\n            return h && h.__esModule ? h : { default: h };\n          };\n        Object.defineProperty(o, \"__esModule\", { value: !0 });\n        var a = i(r(3)),\n          l = r(1),\n          s = r(11),\n          u = i(r(6)),\n          c = r(12),\n          d = r(0),\n          p = (function () {\n            function h(m, b, y, g, x) {\n              x === void 0 && (x = !1),\n                (m.$node.nodeType === 3 && b.$node.nodeType === 3) ||\n                  d.eventEmitter.emit(d.INTERNAL_ERROR_EVENT, {\n                    type: l.ERROR.RANGE_NODE_INVALID,\n                  }),\n                (this.start = c.formatDomNode(m)),\n                (this.end = c.formatDomNode(b)),\n                (this.text = y),\n                (this.frozen = x),\n                (this.id = g);\n            }\n            return (\n              (h.fromSelection = function (m) {\n                var b = s.getDomRange();\n                if (!b) return null;\n                var y = { $node: b.startContainer, offset: b.startOffset },\n                  g = { $node: b.endContainer, offset: b.endOffset },\n                  x = b.toString(),\n                  v = m.call(y, g, x);\n                return new h(y, g, x, (v = v ?? u.default()));\n              }),\n              (h.prototype.serialize = function (m, b) {\n                var y,\n                  g = c.getDomMeta(this.start.$node, this.start.offset, m),\n                  x = c.getDomMeta(this.end.$node, this.end.offset, m);\n                return (\n                  b.Serialize.RecordInfo.isEmpty() ||\n                    (y = b.Serialize.RecordInfo.call(this.start, this.end, m)),\n                  (this.frozen = !0),\n                  new a.default(g, x, this.text, this.id, y)\n                );\n              }),\n              (h.removeDomRange = s.removeSelection),\n              h\n            );\n          })();\n        o.default = p;\n      },\n      function (n, o, r) {\n        Object.defineProperty(o, \"__esModule\", { value: !0 }),\n          (o.default = function i(a) {\n            return a\n              ? (a ^ ((16 * Math.random()) >> (a / 4))).toString(16)\n              : (\"10000000-1000-4000-8000\" + -1e11).replace(/[018]/g, i);\n          });\n      },\n      function (n, o, r) {\n        n.exports = r(8);\n      },\n      function (n, o, r) {\n        var i,\n          a =\n            (this && this.__extends) ||\n            ((i = function (w, E) {\n              return (i =\n                Object.setPrototypeOf ||\n                ({ __proto__: [] } instanceof Array &&\n                  function (M, _) {\n                    M.__proto__ = _;\n                  }) ||\n                function (M, _) {\n                  for (var j in _)\n                    Object.prototype.hasOwnProperty.call(_, j) && (M[j] = _[j]);\n                })(w, E);\n            }),\n            function (w, E) {\n              function M() {\n                this.constructor = w;\n              }\n              i(w, E),\n                (w.prototype =\n                  E === null\n                    ? Object.create(E)\n                    : ((M.prototype = E.prototype), new M()));\n            }),\n          l =\n            (this && this.__assign) ||\n            function () {\n              return (l =\n                Object.assign ||\n                function (w) {\n                  for (var E, M = 1, _ = arguments.length; M < _; M++)\n                    for (var j in (E = arguments[M]))\n                      Object.prototype.hasOwnProperty.call(E, j) &&\n                        (w[j] = E[j]);\n                  return w;\n                }).apply(this, arguments);\n            },\n          s =\n            (this && this.__importDefault) ||\n            function (w) {\n              return w && w.__esModule ? w : { default: w };\n            };\n        Object.defineProperty(o, \"__esModule\", { value: !0 });\n        var u = s(r(2)),\n          c = s(r(5)),\n          d = s(r(3)),\n          p = s(r(6)),\n          h = s(r(13)),\n          m = s(r(14)),\n          b = s(r(16)),\n          y = s(r(17)),\n          g = r(0),\n          x = r(1),\n          v = r(4),\n          S = (function (w) {\n            function E(M) {\n              var _ = w.call(this) || this;\n              (_.event = m.default()),\n                (_.run = function () {\n                  return v.addEventListener(\n                    _.options.$root,\n                    _.event.PointerEnd,\n                    _._handleSelection,\n                  );\n                }),\n                (_.stop = function () {\n                  v.removeEventListener(\n                    _.options.$root,\n                    _.event.PointerEnd,\n                    _._handleSelection,\n                  );\n                }),\n                (_.addClass = function (R, D) {\n                  _.getDoms(D).forEach(function (P) {\n                    v.addClass(P, R);\n                  });\n                }),\n                (_.removeClass = function (R, D) {\n                  _.getDoms(D).forEach(function (P) {\n                    v.removeClass(P, R);\n                  });\n                }),\n                (_.getIdByDom = function (R) {\n                  return v.getHighlightId(R, _.options.$root);\n                }),\n                (_.getExtraIdByDom = function (R) {\n                  return v.getExtraHighlightId(R, _.options.$root);\n                }),\n                (_.getDoms = function (R) {\n                  return R\n                    ? v.getHighlightById(_.options.$root, R, _.options.wrapTag)\n                    : v.getHighlightsByRoot(_.options.$root, _.options.wrapTag);\n                }),\n                (_.dispose = function () {\n                  var R = _.options.$root;\n                  v.removeEventListener(\n                    R,\n                    _.event.PointerOver,\n                    _._handleHighlightHover,\n                  ),\n                    v.removeEventListener(\n                      R,\n                      _.event.PointerEnd,\n                      _._handleSelection,\n                    ),\n                    v.removeEventListener(\n                      R,\n                      _.event.PointerTap,\n                      _._handleHighlightClick,\n                    ),\n                    _.removeAll();\n                }),\n                (_.setOption = function (R) {\n                  (_.options = l(l({}, _.options), R)),\n                    (_.painter = new y.default(\n                      {\n                        $root: _.options.$root,\n                        wrapTag: _.options.wrapTag,\n                        className: _.options.style.className,\n                        exceptSelectors: _.options.exceptSelectors,\n                      },\n                      _.hooks,\n                    ));\n                }),\n                (_.fromRange = function (R) {\n                  var D = { $node: R.startContainer, offset: R.startOffset },\n                    P = { $node: R.endContainer, offset: R.endOffset },\n                    V = R.toString(),\n                    k = _.hooks.Render.UUID.call(D, P, V);\n                  k = k ?? p.default();\n                  var N = new c.default(D, P, V, k);\n                  return N\n                    ? _._highlightFromHRange(N)\n                    : (g.eventEmitter.emit(g.INTERNAL_ERROR_EVENT, {\n                        type: x.ERROR.RANGE_INVALID,\n                      }),\n                      null);\n                }),\n                (_.fromStore = function (R, D, P, V, k) {\n                  var N = new d.default(R, D, P, V, k);\n                  try {\n                    return _._highlightFromHSource(N), N;\n                  } catch (T) {\n                    return (\n                      g.eventEmitter.emit(g.INTERNAL_ERROR_EVENT, {\n                        type: x.ERROR.HIGHLIGHT_SOURCE_RECREATE,\n                        error: T,\n                        detail: N,\n                      }),\n                      null\n                    );\n                  }\n                }),\n                (_._getHooks = function () {\n                  return {\n                    Render: {\n                      UUID: new h.default(\"Render.UUID\"),\n                      SelectedNodes: new h.default(\"Render.SelectedNodes\"),\n                      WrapNode: new h.default(\"Render.WrapNode\"),\n                    },\n                    Serialize: {\n                      Restore: new h.default(\"Serialize.Restore\"),\n                      RecordInfo: new h.default(\"Serialize.RecordInfo\"),\n                    },\n                    Remove: {\n                      UpdateNodes: new h.default(\"Remove.UpdateNodes\"),\n                    },\n                  };\n                }),\n                (_._highlightFromHRange = function (R) {\n                  var D = R.serialize(_.options.$root, _.hooks);\n                  return _.painter.highlightRange(R).length === 0\n                    ? (g.eventEmitter.emit(g.INTERNAL_ERROR_EVENT, {\n                        type: x.ERROR.DOM_SELECTION_EMPTY,\n                      }),\n                      null)\n                    : (_.cache.save(D),\n                      _.emit(\n                        x.EventType.CREATE,\n                        { sources: [D], type: x.CreateFrom.INPUT },\n                        _,\n                      ),\n                      D);\n                }),\n                (_._handleSelection = function () {\n                  var R = c.default.fromSelection(_.hooks.Render.UUID);\n                  R && (_._highlightFromHRange(R), c.default.removeDomRange());\n                }),\n                (_._handleHighlightHover = function (R) {\n                  var D = R.target;\n                  if (!v.isHighlightWrapNode(D))\n                    return (\n                      _._hoverId &&\n                        _.emit(x.EventType.HOVER_OUT, { id: _._hoverId }, _, R),\n                      void (_._hoverId = null)\n                    );\n                  var P = v.getHighlightId(D, _.options.$root);\n                  _._hoverId !== P &&\n                    (_._hoverId &&\n                      _.emit(x.EventType.HOVER_OUT, { id: _._hoverId }, _, R),\n                    (_._hoverId = P),\n                    _.emit(x.EventType.HOVER, { id: _._hoverId }, _, R));\n                }),\n                (_._handleError = function (R) {\n                  _.options.verbose && console.warn(R);\n                }),\n                (_._handleHighlightClick = function (R) {\n                  var D = R.target;\n                  if (v.isHighlightWrapNode(D)) {\n                    var P = v.getHighlightId(D, _.options.$root);\n                    _.emit(x.EventType.CLICK, { id: P }, _, R);\n                  }\n                }),\n                (_.options = g.getDefaultOptions()),\n                (_.hooks = _._getHooks()),\n                _.setOption(M),\n                (_.cache = new b.default());\n              var j = _.options.$root;\n              return (\n                v.addEventListener(\n                  j,\n                  _.event.PointerOver,\n                  _._handleHighlightHover,\n                ),\n                v.addEventListener(\n                  j,\n                  _.event.PointerTap,\n                  _._handleHighlightClick,\n                ),\n                g.eventEmitter.on(g.INTERNAL_ERROR_EVENT, _._handleError),\n                _\n              );\n            }\n            return (\n              a(E, w),\n              (E.prototype.remove = function (M) {\n                if (M) {\n                  var _ = this.painter.removeHighlight(M);\n                  this.cache.remove(M),\n                    _ && this.emit(x.EventType.REMOVE, { ids: [M] }, this);\n                }\n              }),\n              (E.prototype.removeAll = function () {\n                this.painter.removeAllHighlight();\n                var M = this.cache.removeAll();\n                this.emit(x.EventType.REMOVE, { ids: M }, this);\n              }),\n              (E.prototype._highlightFromHSource = function (M) {\n                M === void 0 && (M = []);\n                var _ = this.painter.highlightSource(M);\n                this.emit(\n                  x.EventType.CREATE,\n                  { sources: _, type: x.CreateFrom.STORE },\n                  this,\n                ),\n                  this.cache.save(M);\n              }),\n              (E.event = x.EventType),\n              (E.isHighlightWrapNode = v.isHighlightWrapNode),\n              (E.isHighlightSource = function (M) {\n                return !!M.__isHighlightSource;\n              }),\n              E\n            );\n          })(u.default);\n        o.default = S;\n      },\n      function (n, o, r) {\n        Object.defineProperty(o, \"__esModule\", { value: !0 }),\n          (o.queryElementNode = o.getTextChildByOffset = void 0);\n        var i = r(0);\n        (o.getTextChildByOffset = function (a, l) {\n          for (var s = [a], u = null, c = 0, d = 0; (u = s.pop()); ) {\n            for (var p = u.childNodes, h = p.length - 1; h >= 0; h--)\n              s.push(p[h]);\n            if (\n              u.nodeType === 3 &&\n              ((d = l - c), (c += u.textContent.length) >= l)\n            )\n              break;\n          }\n          return u || (u = a), { $node: u, offset: d };\n        }),\n          (o.queryElementNode = function (a, l) {\n            return {\n              start:\n                a.startMeta.parentIndex === i.ROOT_IDX\n                  ? l\n                  : l.getElementsByTagName(a.startMeta.parentTagName)[\n                      a.startMeta.parentIndex\n                    ],\n              end:\n                a.endMeta.parentIndex === i.ROOT_IDX\n                  ? l\n                  : l.getElementsByTagName(a.endMeta.parentTagName)[\n                      a.endMeta.parentIndex\n                    ],\n            };\n          });\n      },\n      function (n, o, r) {\n        Object.defineProperty(o, \"__esModule\", { value: !0 }),\n          (o.default = function (i) {\n            return i.split(\"-\").reduce(function (a, l, s) {\n              return a + (s === 0 ? l : l[0].toUpperCase() + l.slice(1));\n            }, \"\");\n          });\n      },\n      function (n, o, r) {\n        Object.defineProperty(o, \"__esModule\", { value: !0 }),\n          (o.removeSelection = o.getDomRange = void 0),\n          (o.getDomRange = function () {\n            var i = window.getSelection();\n            return i.isCollapsed\n              ? (console.debug(\"no text selected\"), null)\n              : i.getRangeAt(0);\n          }),\n          (o.removeSelection = function () {\n            window.getSelection().removeAllRanges();\n          });\n      },\n      function (n, o, r) {\n        Object.defineProperty(o, \"__esModule\", { value: !0 }),\n          (o.formatDomNode = o.getDomMeta = void 0);\n        var i = r(0);\n        (o.getDomMeta = function (a, l, s) {\n          var u = (function (p) {\n              if (\n                p instanceof HTMLElement &&\n                (!p.dataset || !p.dataset[i.CAMEL_DATASET_IDENTIFIER])\n              )\n                return p;\n              for (\n                var h = p.parentNode;\n                h != null && h.dataset[i.CAMEL_DATASET_IDENTIFIER];\n\n              )\n                h = h.parentNode;\n              return h;\n            })(a),\n            c =\n              u === s\n                ? i.ROOT_IDX\n                : (function (p, h) {\n                    for (\n                      var m = p.tagName, b = h.getElementsByTagName(m), y = 0;\n                      y < b.length;\n                      y++\n                    )\n                      if (p === b[y]) return y;\n                    return i.UNKNOWN_IDX;\n                  })(u, s),\n            d = (function (p, h) {\n              for (var m = [p], b = null, y = 0; (b = m.pop()); ) {\n                for (var g = b.childNodes, x = g.length - 1; x >= 0; x--)\n                  m.push(g[x]);\n                if (b.nodeType === 3 && b !== h) y += b.textContent.length;\n                else if (b.nodeType === 3) break;\n              }\n              return y;\n            })(u, a);\n          return {\n            parentTagName: u.tagName,\n            parentIndex: c,\n            textOffset: d + l,\n          };\n        }),\n          (o.formatDomNode = function (a) {\n            return a.$node.nodeType === 3 ||\n              a.$node.nodeType === 4 ||\n              a.$node.nodeType === 8\n              ? a\n              : { $node: a.$node.childNodes[a.offset], offset: 0 };\n          });\n      },\n      function (n, o, r) {\n        var i =\n            (this && this.__read) ||\n            function (s, u) {\n              var c = typeof Symbol == \"function\" && s[Symbol.iterator];\n              if (!c) return s;\n              var d,\n                p,\n                h = c.call(s),\n                m = [];\n              try {\n                for (; (u === void 0 || u-- > 0) && !(d = h.next()).done; )\n                  m.push(d.value);\n              } catch (b) {\n                p = { error: b };\n              } finally {\n                try {\n                  d && !d.done && (c = h.return) && c.call(h);\n                } finally {\n                  if (p) throw p.error;\n                }\n              }\n              return m;\n            },\n          a =\n            (this && this.__spread) ||\n            function () {\n              for (var s = [], u = 0; u < arguments.length; u++)\n                s = s.concat(i(arguments[u]));\n              return s;\n            };\n        Object.defineProperty(o, \"__esModule\", { value: !0 });\n        var l = (function () {\n          function s(u) {\n            (this.name = \"\"), (this.ops = []), (this.name = u);\n          }\n          return (\n            (s.prototype.tap = function (u) {\n              var c = this;\n              return (\n                this.ops.indexOf(u) === -1 && this.ops.push(u),\n                function () {\n                  c.remove(u);\n                }\n              );\n            }),\n            (s.prototype.remove = function (u) {\n              var c = this.ops.indexOf(u);\n              c < 0 || this.ops.splice(c, 1);\n            }),\n            (s.prototype.isEmpty = function () {\n              return this.ops.length === 0;\n            }),\n            (s.prototype.call = function () {\n              for (var u, c = [], d = 0; d < arguments.length; d++)\n                c[d] = arguments[d];\n              return (\n                this.ops.forEach(function (p) {\n                  u = p.apply(void 0, a(c));\n                }),\n                u\n              );\n            }),\n            s\n          );\n        })();\n        o.default = l;\n      },\n      function (n, o, r) {\n        var i =\n          (this && this.__importDefault) ||\n          function (s) {\n            return s && s.__esModule ? s : { default: s };\n          };\n        Object.defineProperty(o, \"__esModule\", { value: !0 });\n        var a = r(1),\n          l = i(r(15));\n        o.default = function () {\n          var s = l.default(window.navigator.userAgent);\n          return {\n            PointerEnd: s\n              ? a.UserInputEvent.touchend\n              : a.UserInputEvent.mouseup,\n            PointerTap: s\n              ? a.UserInputEvent.touchstart\n              : a.UserInputEvent.click,\n            PointerOver: s\n              ? a.UserInputEvent.touchstart\n              : a.UserInputEvent.mouseover,\n          };\n        };\n      },\n      function (n, o, r) {\n        Object.defineProperty(o, \"__esModule\", { value: !0 });\n        var i =\n          /Android|iPhone|BlackBerry|BB10|Opera Mini|Phone|Mobile|Silk|Windows Phone|Mobile(?:.+)Firefox\\b/i;\n        o.default = function (a) {\n          return i.test(a);\n        };\n      },\n      function (n, o, r) {\n        var i,\n          a =\n            (this && this.__extends) ||\n            ((i = function (p, h) {\n              return (i =\n                Object.setPrototypeOf ||\n                ({ __proto__: [] } instanceof Array &&\n                  function (m, b) {\n                    m.__proto__ = b;\n                  }) ||\n                function (m, b) {\n                  for (var y in b)\n                    Object.prototype.hasOwnProperty.call(b, y) && (m[y] = b[y]);\n                })(p, h);\n            }),\n            function (p, h) {\n              function m() {\n                this.constructor = p;\n              }\n              i(p, h),\n                (p.prototype =\n                  h === null\n                    ? Object.create(h)\n                    : ((m.prototype = h.prototype), new m()));\n            }),\n          l =\n            (this && this.__values) ||\n            function (p) {\n              var h = typeof Symbol == \"function\" && Symbol.iterator,\n                m = h && p[h],\n                b = 0;\n              if (m) return m.call(p);\n              if (p && typeof p.length == \"number\")\n                return {\n                  next: function () {\n                    return (\n                      p && b >= p.length && (p = void 0),\n                      { value: p && p[b++], done: !p }\n                    );\n                  },\n                };\n              throw new TypeError(\n                h\n                  ? \"Object is not iterable.\"\n                  : \"Symbol.iterator is not defined.\",\n              );\n            },\n          s =\n            (this && this.__importDefault) ||\n            function (p) {\n              return p && p.__esModule ? p : { default: p };\n            };\n        Object.defineProperty(o, \"__esModule\", { value: !0 });\n        var u = s(r(2)),\n          c = r(1),\n          d = (function (p) {\n            function h() {\n              var m = (p !== null && p.apply(this, arguments)) || this;\n              return (m._data = /* @__PURE__ */ new Map()), m;\n            }\n            return (\n              a(h, p),\n              Object.defineProperty(h.prototype, \"data\", {\n                get: function () {\n                  return this.getAll();\n                },\n                set: function (m) {\n                  throw c.ERROR.CACHE_SET_ERROR;\n                },\n                enumerable: !1,\n                configurable: !0,\n              }),\n              (h.prototype.save = function (m) {\n                var b = this;\n                Array.isArray(m)\n                  ? m.forEach(function (y) {\n                      return b._data.set(y.id, y);\n                    })\n                  : this._data.set(m.id, m);\n              }),\n              (h.prototype.get = function (m) {\n                return this._data.get(m);\n              }),\n              (h.prototype.remove = function (m) {\n                this._data.delete(m);\n              }),\n              (h.prototype.getAll = function () {\n                var m,\n                  b,\n                  y = [];\n                try {\n                  for (\n                    var g = l(this._data), x = g.next();\n                    !x.done;\n                    x = g.next()\n                  ) {\n                    var v = x.value;\n                    y.push(v[1]);\n                  }\n                } catch (S) {\n                  m = { error: S };\n                } finally {\n                  try {\n                    x && !x.done && (b = g.return) && b.call(g);\n                  } finally {\n                    if (m) throw m.error;\n                  }\n                }\n                return y;\n              }),\n              (h.prototype.removeAll = function () {\n                var m,\n                  b,\n                  y = [];\n                try {\n                  for (\n                    var g = l(this._data), x = g.next();\n                    !x.done;\n                    x = g.next()\n                  ) {\n                    var v = x.value;\n                    y.push(v[0]);\n                  }\n                } catch (S) {\n                  m = { error: S };\n                } finally {\n                  try {\n                    x && !x.done && (b = g.return) && b.call(g);\n                  } finally {\n                    if (m) throw m.error;\n                  }\n                }\n                return (this._data = /* @__PURE__ */ new Map()), y;\n              }),\n              h\n            );\n          })(u.default);\n        o.default = d;\n      },\n      function (n, o, r) {\n        var i =\n            (this && this.__values) ||\n            function (y) {\n              var g = typeof Symbol == \"function\" && Symbol.iterator,\n                x = g && y[g],\n                v = 0;\n              if (x) return x.call(y);\n              if (y && typeof y.length == \"number\")\n                return {\n                  next: function () {\n                    return (\n                      y && v >= y.length && (y = void 0),\n                      { value: y && y[v++], done: !y }\n                    );\n                  },\n                };\n              throw new TypeError(\n                g\n                  ? \"Object is not iterable.\"\n                  : \"Symbol.iterator is not defined.\",\n              );\n            },\n          a =\n            (this && this.__read) ||\n            function (y, g) {\n              var x = typeof Symbol == \"function\" && y[Symbol.iterator];\n              if (!x) return y;\n              var v,\n                S,\n                w = x.call(y),\n                E = [];\n              try {\n                for (; (g === void 0 || g-- > 0) && !(v = w.next()).done; )\n                  E.push(v.value);\n              } catch (M) {\n                S = { error: M };\n              } finally {\n                try {\n                  v && !v.done && (x = w.return) && x.call(w);\n                } finally {\n                  if (S) throw S.error;\n                }\n              }\n              return E;\n            },\n          l =\n            (this && this.__spread) ||\n            function () {\n              for (var y = [], g = 0; g < arguments.length; g++)\n                y = y.concat(a(arguments[g]));\n              return y;\n            },\n          s =\n            (this && this.__importDefault) ||\n            function (y) {\n              return y && y.__esModule ? y : { default: y };\n            };\n        Object.defineProperty(o, \"__esModule\", { value: !0 });\n        var u = s(r(3)),\n          c = r(18),\n          d = r(4),\n          p = r(1),\n          h = r(20),\n          m = r(0),\n          b = (function () {\n            function y(g, x) {\n              (this.options = {\n                $root: g.$root,\n                wrapTag: g.wrapTag,\n                exceptSelectors: g.exceptSelectors,\n                className: g.className,\n              }),\n                (this.hooks = x),\n                h.initDefaultStylesheet();\n            }\n            return (\n              (y.prototype.highlightRange = function (g) {\n                var x = this;\n                if (!g.frozen) throw p.ERROR.HIGHLIGHT_RANGE_FROZEN;\n                var v = this.options,\n                  S = v.$root,\n                  w = v.className,\n                  E = v.exceptSelectors,\n                  M = this.hooks,\n                  _ = c.getSelectedNodes(S, g.start, g.end, E);\n                return (\n                  M.Render.SelectedNodes.isEmpty() ||\n                    (_ = M.Render.SelectedNodes.call(g.id, _) || []),\n                  _.map(function (j) {\n                    var R = c.wrapHighlight(j, g, w, x.options.wrapTag);\n                    return (\n                      M.Render.WrapNode.isEmpty() ||\n                        (R = M.Render.WrapNode.call(g.id, R)),\n                      R\n                    );\n                  })\n                );\n              }),\n              (y.prototype.highlightSource = function (g) {\n                var x = this,\n                  v = Array.isArray(g) ? g : [g],\n                  S = [];\n                return (\n                  v.forEach(function (w) {\n                    if (w instanceof u.default) {\n                      var E = w.deSerialize(x.options.$root, x.hooks);\n                      x.highlightRange(E).length > 0\n                        ? S.push(w)\n                        : m.eventEmitter.emit(m.INTERNAL_ERROR_EVENT, {\n                            type: p.ERROR.HIGHLIGHT_SOURCE_NONE_RENDER,\n                            detail: w,\n                          });\n                    } else\n                      m.eventEmitter.emit(m.INTERNAL_ERROR_EVENT, {\n                        type: p.ERROR.SOURCE_TYPE_ERROR,\n                      });\n                  }),\n                  S\n                );\n              }),\n              (y.prototype.removeHighlight = function (g) {\n                var x,\n                  v,\n                  S = new RegExp(\n                    \"(\" +\n                      g +\n                      \"\\\\\" +\n                      m.ID_DIVISION +\n                      \"|\\\\\" +\n                      m.ID_DIVISION +\n                      \"?\" +\n                      g +\n                      \"$)\",\n                  ),\n                  w = this.hooks,\n                  E = this.options.wrapTag,\n                  M = document.querySelectorAll(\n                    E + \"[data-\" + m.DATASET_IDENTIFIER + \"]\",\n                  ),\n                  _ = [],\n                  j = [],\n                  R = [];\n                try {\n                  for (var D = i(M), P = D.next(); !P.done; P = D.next()) {\n                    var V = P.value,\n                      k = V.dataset[m.CAMEL_DATASET_IDENTIFIER],\n                      N = V.dataset[m.CAMEL_DATASET_IDENTIFIER_EXTRA];\n                    k !== g || N\n                      ? k === g\n                        ? j.push(V)\n                        : k !== g && S.test(N) && R.push(V)\n                      : _.push(V);\n                  }\n                } catch (T) {\n                  x = { error: T };\n                } finally {\n                  try {\n                    P && !P.done && (v = D.return) && v.call(D);\n                  } finally {\n                    if (x) throw x.error;\n                  }\n                }\n                return (\n                  _.forEach(function (T) {\n                    var F = T.parentNode,\n                      I = document.createDocumentFragment();\n                    d.forEach(T.childNodes, function (H) {\n                      return I.appendChild(H.cloneNode(!1));\n                    });\n                    var L = T.previousSibling,\n                      C = T.nextSibling;\n                    F.replaceChild(I, T),\n                      c.normalizeSiblingText(L, !0),\n                      c.normalizeSiblingText(C, !1),\n                      w.Remove.UpdateNodes.call(g, T, \"remove\");\n                  }),\n                  j.forEach(function (T) {\n                    var F = T.dataset,\n                      I = F[m.CAMEL_DATASET_IDENTIFIER_EXTRA].split(\n                        m.ID_DIVISION,\n                      ),\n                      L = I.shift(),\n                      C = document.querySelector(\n                        E + \"[data-\" + m.DATASET_IDENTIFIER + '=\"' + L + '\"]',\n                      );\n                    C && (d.removeAllClass(T), d.addClass(T, l(C.classList))),\n                      (F[m.CAMEL_DATASET_IDENTIFIER] = L),\n                      (F[m.CAMEL_DATASET_IDENTIFIER_EXTRA] = I.join(\n                        m.ID_DIVISION,\n                      )),\n                      w.Remove.UpdateNodes.call(g, T, \"id-update\");\n                  }),\n                  R.forEach(function (T) {\n                    var F = T.dataset[m.CAMEL_DATASET_IDENTIFIER_EXTRA];\n                    (T.dataset[m.CAMEL_DATASET_IDENTIFIER_EXTRA] = F.replace(\n                      S,\n                      \"\",\n                    )),\n                      w.Remove.UpdateNodes.call(g, T, \"extra-update\");\n                  }),\n                  _.length + j.length + R.length !== 0\n                );\n              }),\n              (y.prototype.removeAllHighlight = function () {\n                var g = this.options,\n                  x = g.wrapTag,\n                  v = g.$root;\n                d.getHighlightsByRoot(v, x).forEach(function (S) {\n                  var w = S.parentNode,\n                    E = document.createDocumentFragment();\n                  d.forEach(S.childNodes, function (M) {\n                    return E.appendChild(M.cloneNode(!1));\n                  }),\n                    w.replaceChild(E, S);\n                });\n              }),\n              y\n            );\n          })();\n        o.default = b;\n      },\n      function (n, o, r) {\n        var i =\n            (this && this.__read) ||\n            function (m, b) {\n              var y = typeof Symbol == \"function\" && m[Symbol.iterator];\n              if (!y) return m;\n              var g,\n                x,\n                v = y.call(m),\n                S = [];\n              try {\n                for (; (b === void 0 || b-- > 0) && !(g = v.next()).done; )\n                  S.push(g.value);\n              } catch (w) {\n                x = { error: w };\n              } finally {\n                try {\n                  g && !g.done && (y = v.return) && y.call(v);\n                } finally {\n                  if (x) throw x.error;\n                }\n              }\n              return S;\n            },\n          a =\n            (this && this.__spread) ||\n            function () {\n              for (var m = [], b = 0; b < arguments.length; b++)\n                m = m.concat(i(arguments[b]));\n              return m;\n            };\n        Object.defineProperty(o, \"__esModule\", { value: !0 }),\n          (o.normalizeSiblingText =\n            o.wrapHighlight =\n            o.getSelectedNodes =\n              void 0);\n        var l = r(1),\n          s = r(4),\n          u = r(0),\n          c = r(19),\n          d = function (m, b) {\n            if (!m) return !1;\n            if (/^\\./.test(b)) {\n              var y = b.replace(/^\\./, \"\");\n              return m && s.hasClass(m, y);\n            }\n            if (/^#/.test(b)) {\n              var g = b.replace(/^#/, \"\");\n              return m && m.id === g;\n            }\n            var x = b.toUpperCase();\n            return m && m.tagName === x;\n          };\n        o.getSelectedNodes = function (m, b, y, g) {\n          var x = b.$node,\n            v = y.$node,\n            S = b.offset,\n            w = y.offset;\n          if (x === v && x instanceof Text)\n            return (function (k, N, T, F) {\n              for (\n                var I = k,\n                  L = function (H) {\n                    return F == null\n                      ? void 0\n                      : F.some(function (B) {\n                          return d(H, B);\n                        });\n                  };\n                I;\n\n              ) {\n                if (I.nodeType === 1 && L(I)) return [];\n                I = I.parentNode;\n              }\n              k.splitText(N);\n              var C = k.nextSibling;\n              return (\n                C.splitText(T - N),\n                [\n                  {\n                    $node: C,\n                    type: l.SelectedNodeType.text,\n                    splitType: l.SplitType.both,\n                  },\n                ]\n              );\n            })(x, S, w, g);\n          for (\n            var E = [m],\n              M = [],\n              _ = function (k) {\n                return g == null\n                  ? void 0\n                  : g.some(function (N) {\n                      return d(k, N);\n                    });\n              },\n              j = !1,\n              R = null;\n            (R = E.pop());\n\n          )\n            if (R.nodeType !== 1 || !_(R)) {\n              for (var D = R.childNodes, P = D.length - 1; P >= 0; P--)\n                E.push(D[P]);\n              if (R === x) {\n                if (R.nodeType === 3) {\n                  R.splitText(S);\n                  var V = R.nextSibling;\n                  M.push({\n                    $node: V,\n                    type: l.SelectedNodeType.text,\n                    splitType: l.SplitType.head,\n                  });\n                }\n                j = !0;\n              } else {\n                if (R === v) {\n                  R.nodeType === 3 &&\n                    ((V = R).splitText(w),\n                    M.push({\n                      $node: V,\n                      type: l.SelectedNodeType.text,\n                      splitType: l.SplitType.tail,\n                    }));\n                  break;\n                }\n                j &&\n                  R.nodeType === 3 &&\n                  M.push({\n                    $node: R,\n                    type: l.SelectedNodeType.text,\n                    splitType: l.SplitType.none,\n                  });\n              }\n            }\n          return M;\n        };\n        var p = function (m, b) {\n            var y = Array.isArray(b) ? b : [b];\n            return (\n              (y =\n                y.length === 0\n                  ? [u.getDefaultOptions().style.className]\n                  : y).forEach(function (g) {\n                s.addClass(m, g);\n              }),\n              m\n            );\n          },\n          h = function (m) {\n            return !m || !m.textContent;\n          };\n        (o.wrapHighlight = function (m, b, y, g) {\n          var x = m.$node.parentNode,\n            v = m.$node.previousSibling,\n            S = m.$node.nextSibling;\n          return s.isHighlightWrapNode(x)\n            ? !s.isHighlightWrapNode(x) || (h(v) && h(S))\n              ? (function (w, E, M) {\n                  var _ = w.$node.parentNode,\n                    j = _;\n                  s.removeAllClass(j), p(j, M);\n                  var R = _.dataset,\n                    D = R[u.CAMEL_DATASET_IDENTIFIER];\n                  return (\n                    (R[u.CAMEL_DATASET_IDENTIFIER] = E.id),\n                    (R[u.CAMEL_DATASET_IDENTIFIER_EXTRA] = R[\n                      u.CAMEL_DATASET_IDENTIFIER_EXTRA\n                    ]\n                      ? D + u.ID_DIVISION + R[u.CAMEL_DATASET_IDENTIFIER_EXTRA]\n                      : D),\n                    j\n                  );\n                })(m, b, y)\n              : (function (w, E, M, _) {\n                  var j = document.createElement(_),\n                    R = w.$node.parentNode,\n                    D = w.$node.previousSibling,\n                    P = w.$node.nextSibling,\n                    V = document.createDocumentFragment(),\n                    k = R.dataset[u.CAMEL_DATASET_IDENTIFIER],\n                    N = R.dataset[u.CAMEL_DATASET_IDENTIFIER_EXTRA],\n                    T = N ? k + u.ID_DIVISION + N : k;\n                  j.setAttribute(\"data-\" + u.DATASET_IDENTIFIER, E.id),\n                    j.setAttribute(\"data-\" + u.DATASET_IDENTIFIER_EXTRA, T),\n                    j.appendChild(w.$node.cloneNode(!1));\n                  var F,\n                    I = !1,\n                    L = !1;\n                  D &&\n                    (((C = R.cloneNode(!1)).textContent = D.textContent),\n                    V.appendChild(C),\n                    (I = !0));\n                  var C,\n                    H = [];\n                  return (\n                    Array.isArray(M) ? H.push.apply(H, a(M)) : H.push(M),\n                    p(j, c.unique(H)),\n                    V.appendChild(j),\n                    P &&\n                      (((C = R.cloneNode(!1)).textContent = P.textContent),\n                      V.appendChild(C),\n                      (L = !0)),\n                    (F =\n                      I && L\n                        ? l.SplitType.both\n                        : I\n                          ? l.SplitType.head\n                          : L\n                            ? l.SplitType.tail\n                            : l.SplitType.none),\n                    j.setAttribute(\"data-\" + u.DATASET_SPLIT_TYPE, F),\n                    R.parentNode.replaceChild(V, R),\n                    j\n                  );\n                })(m, b, y, g)\n            : (function (w, E, M, _) {\n                var j = document.createElement(_);\n                return (\n                  p(j, M),\n                  j.appendChild(w.$node.cloneNode(!1)),\n                  w.$node.parentNode.replaceChild(j, w.$node),\n                  j.setAttribute(\"data-\" + u.DATASET_IDENTIFIER, E.id),\n                  j.setAttribute(\"data-\" + u.DATASET_SPLIT_TYPE, w.splitType),\n                  j.setAttribute(\"data-\" + u.DATASET_IDENTIFIER_EXTRA, \"\"),\n                  j\n                );\n              })(m, b, y, g);\n        }),\n          (o.normalizeSiblingText = function (m, b) {\n            if ((b === void 0 && (b = !0), m && m.nodeType === 3)) {\n              var y = b ? m.nextSibling : m.previousSibling;\n              if (y.nodeType === 3) {\n                var g = y.nodeValue;\n                (m.nodeValue = b ? m.nodeValue + g : g + m.nodeValue),\n                  y.parentNode.removeChild(y);\n              }\n            }\n          });\n      },\n      function (n, o, r) {\n        var i =\n          (this && this.__values) ||\n          function (a) {\n            var l = typeof Symbol == \"function\" && Symbol.iterator,\n              s = l && a[l],\n              u = 0;\n            if (s) return s.call(a);\n            if (a && typeof a.length == \"number\")\n              return {\n                next: function () {\n                  return (\n                    a && u >= a.length && (a = void 0),\n                    { value: a && a[u++], done: !a }\n                  );\n                },\n              };\n            throw new TypeError(\n              l ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\",\n            );\n          };\n        Object.defineProperty(o, \"__esModule\", { value: !0 }),\n          (o.unique = void 0),\n          (o.unique = function (a) {\n            var l,\n              s,\n              u = [];\n            try {\n              for (var c = i(a), d = c.next(); !d.done; d = c.next()) {\n                var p = d.value;\n                u.indexOf(p) === -1 && u.push(p);\n              }\n            } catch (h) {\n              l = { error: h };\n            } finally {\n              try {\n                d && !d.done && (s = c.return) && s.call(c);\n              } finally {\n                if (l) throw l.error;\n              }\n            }\n            return u;\n          });\n      },\n      function (n, o, r) {\n        Object.defineProperty(o, \"__esModule\", { value: !0 }),\n          (o.initDefaultStylesheet = void 0);\n        var i = r(0);\n        o.initDefaultStylesheet = function () {\n          var a = i.STYLESHEET_ID,\n            l = document.getElementById(a);\n          if (!l) {\n            var s = document.createTextNode(i.getStylesheet());\n            ((l = document.createElement(\"style\")).id = a),\n              l.appendChild(s),\n              document.head.appendChild(l);\n          }\n          return l;\n        };\n      },\n    ]).default;\n  });\n})(bd);\nvar M6 = bd.exports;\nconst yd = /* @__PURE__ */ fn(M6),\n  ta = \"altimate-display-\",\n  T6 = `${ta}-highlight`,\n  S2 = `${ta}-highlight-hover`,\n  O6 = `${ta}-active-highlight`,\n  N6 = 1049,\n  mo = new yd({\n    style: {\n      className: T6,\n    },\n    // wrapTag: HIGHLIGHT_WRAPPER_TAGNAME,\n  }),\n  sc = new yd({\n    style: {\n      className: O6,\n    },\n    // wrapTag: ACTIVE_HIGHLIGHT_WRAPPER_TAGNAME,\n  }),\n  Cd = (e, t) =>\n    t.filter((n) => {\n      var o;\n      return ((o = n.$node.nodeValue) == null ? void 0 : o.trim()) !== \"\";\n    }),\n  vd = (e, t, n) => {\n    const o = t,\n      r = n,\n      i = [\"BR\", \"HR\"];\n    return (\n      i.includes(o.$node.nodeName) &&\n        o.$node.parentNode &&\n        (o.$node = o.$node.parentNode),\n      i.includes(r.$node.nodeName) &&\n        r.$node.parentNode &&\n        (r.$node = r.$node.parentNode),\n      [o, r]\n    );\n  };\nmo.hooks.Render.SelectedNodes.tap(Cd);\nmo.hooks.Serialize.Restore.tap(vd);\nsc.hooks.Render.SelectedNodes.tap(Cd);\nsc.hooks.Serialize.Restore.tap(vd);\nmo.on(\"selection:hover\", ({ id: e }) => {\n  mo.addClass(S2, e);\n}).on(\"selection:hover-out\", ({ id: e }) => {\n  mo.removeClass(S2, e);\n});\nconst L6 = (e) => {\n    var t, n;\n    return (t = e.meta) != null && t.highlight\n      ? JSON.parse((n = e.meta) == null ? void 0 : n.highlight)\n      : null;\n  },\n  D6 = (e) => {\n    const t = L6(e);\n    t && (mo.remove(t.id), sc.remove(t.id));\n  },\n  cc = () => {\n    var n, o;\n    const e = uc(),\n      t =\n        (e == null ? void 0 : e[1]) === \"analysis\"\n          ? document.getElementById(\"sql\")\n          : document.getElementById(\"code\");\n    return (o =\n      (n = t == null ? void 0 : t.parentElement) == null\n        ? void 0\n        : n.querySelector(\"code-block\")) == null\n      ? void 0\n      : o.querySelector(\"code.ng-binding.highlight\");\n  },\n  uc = () => {\n    var t;\n    return (t = window.location.hash\n      .split(\"#\")\n      .find((n) => n.startsWith(\"!\"))) == null\n      ? void 0\n      : t.split(\"/\");\n  },\n  dc = () => document.querySelector('[marked=\"model.description\"]'),\n  j6 = (e) => {\n    var t, n, o;\n    return e.field\n      ? e.column\n        ? (n =\n            (t = Array.from(\n              document.querySelectorAll(\n                \"column-details tr:not(.ng-hide) td:first-child\",\n              ),\n            ).find((i) => i.innerText === e.column)) == null\n              ? void 0\n              : t.parentElement) == null\n          ? void 0\n          : n.querySelector(\"td:nth-child(3)\")\n        : (o = dc()) == null\n          ? void 0\n          : o.firstChild\n      : cc();\n  },\n  F6 = (e) => {\n    if (e.getAttribute(\"marked\") === \"model.description\") return \"description\";\n  },\n  R6 = (e, t, n, o, r) => {\n    if (e === \"description\")\n      return {\n        start: 0,\n        end: 0,\n        x: 0,\n        y: 0,\n      };\n    const i = t.querySelectorAll(\".line-numbers-rows > span\"),\n      a = n.split(`\n`),\n      l = Math.max(r.y, o.y),\n      s = Array.from(i).findIndex((d) => {\n        const { height: p, y: h } = d.getBoundingClientRect();\n        return l >= h && l <= h + p;\n      }),\n      u = i[s],\n      c = s - a.length + 1;\n    return (\n      console.log(\"start and end lines found\", c, s),\n      {\n        x: u.offsetLeft,\n        y: u.offsetTop + u.offsetHeight / 2,\n        start: c,\n        end: s,\n      }\n    );\n  },\n  xA = () => {\n    var e;\n    return [(e = cc()) == null ? void 0 : e.parentElement, dc()];\n  };\nvar It = /* @__PURE__ */ ((e) => (\n  (e[(e.LOADING = 0)] = \"LOADING\"),\n  (e[(e.UNINITIALIZED = 1)] = \"UNINITIALIZED\"),\n  (e[(e.INITIALIZED = 2)] = \"INITIALIZED\"),\n  e\n))(It || {});\nfunction I6(e) {\n  if (typeof e != \"object\" || e === null) return !1;\n  let t = e;\n  for (; Object.getPrototypeOf(t) !== null; ) t = Object.getPrototypeOf(t);\n  return Object.getPrototypeOf(e) === t || Object.getPrototypeOf(e) === null;\n}\nfunction H6(e) {\n  return I6(e) && \"type\" in e && typeof e.type == \"string\";\n}\nvar xd = Symbol.for(\"immer-nothing\"),\n  k2 = Symbol.for(\"immer-draftable\"),\n  Tt = Symbol.for(\"immer-state\"),\n  z6 =\n    process.env.NODE_ENV !== \"production\"\n      ? [\n          // All error codes, starting by 0:\n          function (e) {\n            return `The plugin for '${e}' has not been loaded into Immer. To enable the plugin, import and call \\`enable${e}()\\` when initializing your application.`;\n          },\n          function (e) {\n            return `produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '${e}'`;\n          },\n          \"This object has been frozen and should not be mutated\",\n          function (e) {\n            return (\n              \"Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? \" +\n              e\n            );\n          },\n          \"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.\",\n          \"Immer forbids circular references\",\n          \"The first or second argument to `produce` must be a function\",\n          \"The third argument to `produce` must be a function or undefined\",\n          \"First argument to `createDraft` must be a plain object, an array, or an immerable object\",\n          \"First argument to `finishDraft` must be a draft returned by `createDraft`\",\n          function (e) {\n            return `'current' expects a draft, got: ${e}`;\n          },\n          \"Object.defineProperty() cannot be used on an Immer draft\",\n          \"Object.setPrototypeOf() cannot be used on an Immer draft\",\n          \"Immer only supports deleting array indices\",\n          \"Immer only supports setting array indices and the 'length' property\",\n          function (e) {\n            return `'original' expects a draft, got: ${e}`;\n          },\n          // Note: if more errors are added, the errorOffset in Patches.ts should be increased\n          // See Patches.ts for additional errors\n        ]\n      : [];\nfunction vt(e, ...t) {\n  if (process.env.NODE_ENV !== \"production\") {\n    const n = z6[e],\n      o = typeof n == \"function\" ? n.apply(null, t) : n;\n    throw new Error(`[Immer] ${o}`);\n  }\n  throw new Error(\n    `[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`,\n  );\n}\nvar _o = Object.getPrototypeOf;\nfunction Jn(e) {\n  return !!e && !!e[Tt];\n}\nfunction vn(e) {\n  var t;\n  return e\n    ? wd(e) ||\n        Array.isArray(e) ||\n        !!e[k2] ||\n        !!((t = e.constructor) != null && t[k2]) ||\n        oa(e) ||\n        ra(e)\n    : !1;\n}\nvar P6 = Object.prototype.constructor.toString();\nfunction wd(e) {\n  if (!e || typeof e != \"object\") return !1;\n  const t = _o(e);\n  if (t === null) return !0;\n  const n = Object.hasOwnProperty.call(t, \"constructor\") && t.constructor;\n  return n === Object\n    ? !0\n    : typeof n == \"function\" && Function.toString.call(n) === P6;\n}\nfunction Ti(e, t) {\n  na(e) === 0\n    ? Reflect.ownKeys(e).forEach((n) => {\n        t(n, e[n], e);\n      })\n    : e.forEach((n, o) => t(o, n, e));\n}\nfunction na(e) {\n  const t = e[Tt];\n  return t ? t.type_ : Array.isArray(e) ? 1 : oa(e) ? 2 : ra(e) ? 3 : 0;\n}\nfunction fs(e, t) {\n  return na(e) === 2 ? e.has(t) : Object.prototype.hasOwnProperty.call(e, t);\n}\nfunction Ed(e, t, n) {\n  const o = na(e);\n  o === 2 ? e.set(t, n) : o === 3 ? e.add(n) : (e[t] = n);\n}\nfunction B6(e, t) {\n  return e === t ? e !== 0 || 1 / e === 1 / t : e !== e && t !== t;\n}\nfunction oa(e) {\n  return e instanceof Map;\n}\nfunction ra(e) {\n  return e instanceof Set;\n}\nfunction Bn(e) {\n  return e.copy_ || e.base_;\n}\nfunction hs(e, t) {\n  if (oa(e)) return new Map(e);\n  if (ra(e)) return new Set(e);\n  if (Array.isArray(e)) return Array.prototype.slice.call(e);\n  const n = wd(e);\n  if (t === !0 || (t === \"class_only\" && !n)) {\n    const o = Object.getOwnPropertyDescriptors(e);\n    delete o[Tt];\n    let r = Reflect.ownKeys(o);\n    for (let i = 0; i < r.length; i++) {\n      const a = r[i],\n        l = o[a];\n      l.writable === !1 && ((l.writable = !0), (l.configurable = !0)),\n        (l.get || l.set) &&\n          (o[a] = {\n            configurable: !0,\n            writable: !0,\n            // could live with !!desc.set as well here...\n            enumerable: l.enumerable,\n            value: e[a],\n          });\n    }\n    return Object.create(_o(e), o);\n  } else {\n    const o = _o(e);\n    if (o !== null && n) return { ...e };\n    const r = Object.create(o);\n    return Object.assign(r, e);\n  }\n}\nfunction fc(e, t = !1) {\n  return (\n    ia(e) ||\n      Jn(e) ||\n      !vn(e) ||\n      (na(e) > 1 && (e.set = e.add = e.clear = e.delete = V6),\n      Object.freeze(e),\n      t && Object.entries(e).forEach(([n, o]) => fc(o, !0))),\n    e\n  );\n}\nfunction V6() {\n  vt(2);\n}\nfunction ia(e) {\n  return Object.isFrozen(e);\n}\nvar $6 = {};\nfunction eo(e) {\n  const t = $6[e];\n  return t || vt(0, e), t;\n}\nvar fr;\nfunction Sd() {\n  return fr;\n}\nfunction W6(e, t) {\n  return {\n    drafts_: [],\n    parent_: e,\n    immer_: t,\n    // Whenever the modified draft contains a draft from another scope, we\n    // need to prevent auto-freezing so the unowned draft can be finalized.\n    canAutoFreeze_: !0,\n    unfinalizedDrafts_: 0,\n  };\n}\nfunction _2(e, t) {\n  t &&\n    (eo(\"Patches\"),\n    (e.patches_ = []),\n    (e.inversePatches_ = []),\n    (e.patchListener_ = t));\n}\nfunction ps(e) {\n  gs(e), e.drafts_.forEach(Z6), (e.drafts_ = null);\n}\nfunction gs(e) {\n  e === fr && (fr = e.parent_);\n}\nfunction A2(e) {\n  return (fr = W6(fr, e));\n}\nfunction Z6(e) {\n  const t = e[Tt];\n  t.type_ === 0 || t.type_ === 1 ? t.revoke_() : (t.revoked_ = !0);\n}\nfunction M2(e, t) {\n  t.unfinalizedDrafts_ = t.drafts_.length;\n  const n = t.drafts_[0];\n  return (\n    e !== void 0 && e !== n\n      ? (n[Tt].modified_ && (ps(t), vt(4)),\n        vn(e) && ((e = Oi(t, e)), t.parent_ || Ni(t, e)),\n        t.patches_ &&\n          eo(\"Patches\").generateReplacementPatches_(\n            n[Tt].base_,\n            e,\n            t.patches_,\n            t.inversePatches_,\n          ))\n      : (e = Oi(t, n, [])),\n    ps(t),\n    t.patches_ && t.patchListener_(t.patches_, t.inversePatches_),\n    e !== xd ? e : void 0\n  );\n}\nfunction Oi(e, t, n) {\n  if (ia(t)) return t;\n  const o = t[Tt];\n  if (!o) return Ti(t, (r, i) => T2(e, o, t, r, i, n)), t;\n  if (o.scope_ !== e) return t;\n  if (!o.modified_) return Ni(e, o.base_, !0), o.base_;\n  if (!o.finalized_) {\n    (o.finalized_ = !0), o.scope_.unfinalizedDrafts_--;\n    const r = o.copy_;\n    let i = r,\n      a = !1;\n    o.type_ === 3 && ((i = new Set(r)), r.clear(), (a = !0)),\n      Ti(i, (l, s) => T2(e, o, r, l, s, n, a)),\n      Ni(e, r, !1),\n      n &&\n        e.patches_ &&\n        eo(\"Patches\").generatePatches_(o, n, e.patches_, e.inversePatches_);\n  }\n  return o.copy_;\n}\nfunction T2(e, t, n, o, r, i, a) {\n  if ((process.env.NODE_ENV !== \"production\" && r === n && vt(5), Jn(r))) {\n    const l =\n        i &&\n        t &&\n        t.type_ !== 3 && // Set objects are atomic since they have no keys.\n        !fs(t.assigned_, o)\n          ? i.concat(o)\n          : void 0,\n      s = Oi(e, r, l);\n    if ((Ed(n, o, s), Jn(s))) e.canAutoFreeze_ = !1;\n    else return;\n  } else a && n.add(r);\n  if (vn(r) && !ia(r)) {\n    if (!e.immer_.autoFreeze_ && e.unfinalizedDrafts_ < 1) return;\n    Oi(e, r),\n      (!t || !t.scope_.parent_) &&\n        typeof o != \"symbol\" &&\n        Object.prototype.propertyIsEnumerable.call(n, o) &&\n        Ni(e, r);\n  }\n}\nfunction Ni(e, t, n = !1) {\n  !e.parent_ && e.immer_.autoFreeze_ && e.canAutoFreeze_ && fc(t, n);\n}\nfunction U6(e, t) {\n  const n = Array.isArray(e),\n    o = {\n      type_: n ? 1 : 0,\n      // Track which produce call this is associated with.\n      scope_: t ? t.scope_ : Sd(),\n      // True for both shallow and deep changes.\n      modified_: !1,\n      // Used during finalization.\n      finalized_: !1,\n      // Track which properties have been assigned (true) or deleted (false).\n      assigned_: {},\n      // The parent draft state.\n      parent_: t,\n      // The base state.\n      base_: e,\n      // The base proxy.\n      draft_: null,\n      // set below\n      // The base copy with any updated values.\n      copy_: null,\n      // Called by the `produce` function.\n      revoke_: null,\n      isManual_: !1,\n    };\n  let r = o,\n    i = hc;\n  n && ((r = [o]), (i = hr));\n  const { revoke: a, proxy: l } = Proxy.revocable(r, i);\n  return (o.draft_ = l), (o.revoke_ = a), l;\n}\nvar hc = {\n    get(e, t) {\n      if (t === Tt) return e;\n      const n = Bn(e);\n      if (!fs(n, t)) return q6(e, n, t);\n      const o = n[t];\n      return e.finalized_ || !vn(o)\n        ? o\n        : o === El(e.base_, t)\n          ? (Sl(e), (e.copy_[t] = bs(o, e)))\n          : o;\n    },\n    has(e, t) {\n      return t in Bn(e);\n    },\n    ownKeys(e) {\n      return Reflect.ownKeys(Bn(e));\n    },\n    set(e, t, n) {\n      const o = kd(Bn(e), t);\n      if (o != null && o.set) return o.set.call(e.draft_, n), !0;\n      if (!e.modified_) {\n        const r = El(Bn(e), t),\n          i = r == null ? void 0 : r[Tt];\n        if (i && i.base_ === n)\n          return (e.copy_[t] = n), (e.assigned_[t] = !1), !0;\n        if (B6(n, r) && (n !== void 0 || fs(e.base_, t))) return !0;\n        Sl(e), ms(e);\n      }\n      return (\n        (e.copy_[t] === n && // special case: handle new props with value 'undefined'\n          (n !== void 0 || t in e.copy_)) || // special case: NaN\n          (Number.isNaN(n) && Number.isNaN(e.copy_[t])) ||\n          ((e.copy_[t] = n), (e.assigned_[t] = !0)),\n        !0\n      );\n    },\n    deleteProperty(e, t) {\n      return (\n        El(e.base_, t) !== void 0 || t in e.base_\n          ? ((e.assigned_[t] = !1), Sl(e), ms(e))\n          : delete e.assigned_[t],\n        e.copy_ && delete e.copy_[t],\n        !0\n      );\n    },\n    // Note: We never coerce `desc.value` into an Immer draft, because we can't make\n    // the same guarantee in ES5 mode.\n    getOwnPropertyDescriptor(e, t) {\n      const n = Bn(e),\n        o = Reflect.getOwnPropertyDescriptor(n, t);\n      return (\n        o && {\n          writable: !0,\n          configurable: e.type_ !== 1 || t !== \"length\",\n          enumerable: o.enumerable,\n          value: n[t],\n        }\n      );\n    },\n    defineProperty() {\n      vt(11);\n    },\n    getPrototypeOf(e) {\n      return _o(e.base_);\n    },\n    setPrototypeOf() {\n      vt(12);\n    },\n  },\n  hr = {};\nTi(hc, (e, t) => {\n  hr[e] = function () {\n    return (arguments[0] = arguments[0][0]), t.apply(this, arguments);\n  };\n});\nhr.deleteProperty = function (e, t) {\n  return (\n    process.env.NODE_ENV !== \"production\" && isNaN(parseInt(t)) && vt(13),\n    hr.set.call(this, e, t, void 0)\n  );\n};\nhr.set = function (e, t, n) {\n  return (\n    process.env.NODE_ENV !== \"production\" &&\n      t !== \"length\" &&\n      isNaN(parseInt(t)) &&\n      vt(14),\n    hc.set.call(this, e[0], t, n, e[0])\n  );\n};\nfunction El(e, t) {\n  const n = e[Tt];\n  return (n ? Bn(n) : e)[t];\n}\nfunction q6(e, t, n) {\n  var r;\n  const o = kd(t, n);\n  return o\n    ? \"value\" in o\n      ? o.value\n      : // This is a very special case, if the prop is a getter defined by the\n        // prototype, we should invoke it with the draft as context!\n        (r = o.get) == null\n        ? void 0\n        : r.call(e.draft_)\n    : void 0;\n}\nfunction kd(e, t) {\n  if (!(t in e)) return;\n  let n = _o(e);\n  for (; n; ) {\n    const o = Object.getOwnPropertyDescriptor(n, t);\n    if (o) return o;\n    n = _o(n);\n  }\n}\nfunction ms(e) {\n  e.modified_ || ((e.modified_ = !0), e.parent_ && ms(e.parent_));\n}\nfunction Sl(e) {\n  e.copy_ || (e.copy_ = hs(e.base_, e.scope_.immer_.useStrictShallowCopy_));\n}\nvar Y6 = class {\n  constructor(e) {\n    (this.autoFreeze_ = !0),\n      (this.useStrictShallowCopy_ = !1),\n      (this.produce = (t, n, o) => {\n        if (typeof t == \"function\" && typeof n != \"function\") {\n          const i = n;\n          n = t;\n          const a = this;\n          return function (s = i, ...u) {\n            return a.produce(s, (c) => n.call(this, c, ...u));\n          };\n        }\n        typeof n != \"function\" && vt(6),\n          o !== void 0 && typeof o != \"function\" && vt(7);\n        let r;\n        if (vn(t)) {\n          const i = A2(this),\n            a = bs(t, void 0);\n          let l = !0;\n          try {\n            (r = n(a)), (l = !1);\n          } finally {\n            l ? ps(i) : gs(i);\n          }\n          return _2(i, o), M2(r, i);\n        } else if (!t || typeof t != \"object\") {\n          if (\n            ((r = n(t)),\n            r === void 0 && (r = t),\n            r === xd && (r = void 0),\n            this.autoFreeze_ && fc(r, !0),\n            o)\n          ) {\n            const i = [],\n              a = [];\n            eo(\"Patches\").generateReplacementPatches_(t, r, i, a), o(i, a);\n          }\n          return r;\n        } else vt(1, t);\n      }),\n      (this.produceWithPatches = (t, n) => {\n        if (typeof t == \"function\")\n          return (a, ...l) => this.produceWithPatches(a, (s) => t(s, ...l));\n        let o, r;\n        return [\n          this.produce(t, n, (a, l) => {\n            (o = a), (r = l);\n          }),\n          o,\n          r,\n        ];\n      }),\n      typeof (e == null ? void 0 : e.autoFreeze) == \"boolean\" &&\n        this.setAutoFreeze(e.autoFreeze),\n      typeof (e == null ? void 0 : e.useStrictShallowCopy) == \"boolean\" &&\n        this.setUseStrictShallowCopy(e.useStrictShallowCopy);\n  }\n  createDraft(e) {\n    vn(e) || vt(8), Jn(e) && (e = G6(e));\n    const t = A2(this),\n      n = bs(e, void 0);\n    return (n[Tt].isManual_ = !0), gs(t), n;\n  }\n  finishDraft(e, t) {\n    const n = e && e[Tt];\n    (!n || !n.isManual_) && vt(9);\n    const { scope_: o } = n;\n    return _2(o, t), M2(void 0, o);\n  }\n  /**\n   * Pass true to automatically freeze all copies created by Immer.\n   *\n   * By default, auto-freezing is enabled.\n   */\n  setAutoFreeze(e) {\n    this.autoFreeze_ = e;\n  }\n  /**\n   * Pass true to enable strict shallow copy.\n   *\n   * By default, immer does not copy the object descriptors such as getter, setter and non-enumrable properties.\n   */\n  setUseStrictShallowCopy(e) {\n    this.useStrictShallowCopy_ = e;\n  }\n  applyPatches(e, t) {\n    let n;\n    for (n = t.length - 1; n >= 0; n--) {\n      const r = t[n];\n      if (r.path.length === 0 && r.op === \"replace\") {\n        e = r.value;\n        break;\n      }\n    }\n    n > -1 && (t = t.slice(n + 1));\n    const o = eo(\"Patches\").applyPatches_;\n    return Jn(e) ? o(e, t) : this.produce(e, (r) => o(r, t));\n  }\n};\nfunction bs(e, t) {\n  const n = oa(e)\n    ? eo(\"MapSet\").proxyMap_(e, t)\n    : ra(e)\n      ? eo(\"MapSet\").proxySet_(e, t)\n      : U6(e, t);\n  return (t ? t.scope_ : Sd()).drafts_.push(n), n;\n}\nfunction G6(e) {\n  return Jn(e) || vt(10, e), _d(e);\n}\nfunction _d(e) {\n  if (!vn(e) || ia(e)) return e;\n  const t = e[Tt];\n  let n;\n  if (t) {\n    if (!t.modified_) return t.base_;\n    (t.finalized_ = !0), (n = hs(e, t.scope_.immer_.useStrictShallowCopy_));\n  } else n = hs(e, !0);\n  return (\n    Ti(n, (o, r) => {\n      Ed(n, o, _d(r));\n    }),\n    t && (t.finalized_ = !1),\n    n\n  );\n}\nvar Ot = new Y6(),\n  Ad = Ot.produce;\nOt.produceWithPatches.bind(Ot);\nOt.setAutoFreeze.bind(Ot);\nOt.setUseStrictShallowCopy.bind(Ot);\nOt.applyPatches.bind(Ot);\nOt.createDraft.bind(Ot);\nOt.finishDraft.bind(Ot);\nfunction O2(e, t) {\n  function n(...o) {\n    if (t) {\n      let r = t(...o);\n      if (!r)\n        throw new Error(\n          process.env.NODE_ENV === \"production\"\n            ? ot(0)\n            : \"prepareAction did not return an object\",\n        );\n      return {\n        type: e,\n        payload: r.payload,\n        ...(\"meta\" in r && {\n          meta: r.meta,\n        }),\n        ...(\"error\" in r && {\n          error: r.error,\n        }),\n      };\n    }\n    return {\n      type: e,\n      payload: o[0],\n    };\n  }\n  return (\n    (n.toString = () => `${e}`),\n    (n.type = e),\n    (n.match = (o) => H6(o) && o.type === e),\n    n\n  );\n}\nfunction N2(e) {\n  return vn(e) ? Ad(e, () => {}) : e;\n}\nfunction L2(e, t, n) {\n  if (e.has(t)) {\n    let r = e.get(t);\n    return n.update && ((r = n.update(r, t, e)), e.set(t, r)), r;\n  }\n  if (!n.insert)\n    throw new Error(\n      process.env.NODE_ENV === \"production\"\n        ? ot(10)\n        : \"No insert provided for key not already in map\",\n    );\n  const o = n.insert(t, e);\n  return e.set(t, o), o;\n}\nfunction Md(e) {\n  const t = {},\n    n = [];\n  let o;\n  const r = {\n    addCase(i, a) {\n      if (process.env.NODE_ENV !== \"production\") {\n        if (n.length > 0)\n          throw new Error(\n            process.env.NODE_ENV === \"production\"\n              ? ot(26)\n              : \"`builder.addCase` should only be called before calling `builder.addMatcher`\",\n          );\n        if (o)\n          throw new Error(\n            process.env.NODE_ENV === \"production\"\n              ? ot(27)\n              : \"`builder.addCase` should only be called before calling `builder.addDefaultCase`\",\n          );\n      }\n      const l = typeof i == \"string\" ? i : i.type;\n      if (!l)\n        throw new Error(\n          process.env.NODE_ENV === \"production\"\n            ? ot(28)\n            : \"`builder.addCase` cannot be called with an empty action type\",\n        );\n      if (l in t)\n        throw new Error(\n          process.env.NODE_ENV === \"production\"\n            ? ot(29)\n            : `\\`builder.addCase\\` cannot be called with two reducers for the same action type '${l}'`,\n        );\n      return (t[l] = a), r;\n    },\n    addMatcher(i, a) {\n      if (process.env.NODE_ENV !== \"production\" && o)\n        throw new Error(\n          process.env.NODE_ENV === \"production\"\n            ? ot(30)\n            : \"`builder.addMatcher` should only be called before calling `builder.addDefaultCase`\",\n        );\n      return (\n        n.push({\n          matcher: i,\n          reducer: a,\n        }),\n        r\n      );\n    },\n    addDefaultCase(i) {\n      if (process.env.NODE_ENV !== \"production\" && o)\n        throw new Error(\n          process.env.NODE_ENV === \"production\"\n            ? ot(31)\n            : \"`builder.addDefaultCase` can only be called once\",\n        );\n      return (o = i), r;\n    },\n  };\n  return e(r), [t, n, o];\n}\nfunction K6(e) {\n  return typeof e == \"function\";\n}\nfunction X6(e, t) {\n  if (process.env.NODE_ENV !== \"production\" && typeof t == \"object\")\n    throw new Error(\n      process.env.NODE_ENV === \"production\"\n        ? ot(8)\n        : \"The object notation for `createReducer` has been removed. Please use the 'builder callback' notation instead: https://redux-toolkit.js.org/api/createReducer\",\n    );\n  let [n, o, r] = Md(t),\n    i;\n  if (K6(e)) i = () => N2(e());\n  else {\n    const l = N2(e);\n    i = () => l;\n  }\n  function a(l = i(), s) {\n    let u = [\n      n[s.type],\n      ...o.filter(({ matcher: c }) => c(s)).map(({ reducer: c }) => c),\n    ];\n    return (\n      u.filter((c) => !!c).length === 0 && (u = [r]),\n      u.reduce((c, d) => {\n        if (d)\n          if (Jn(c)) {\n            const h = d(c, s);\n            return h === void 0 ? c : h;\n          } else {\n            if (vn(c)) return Ad(c, (p) => d(p, s));\n            {\n              const p = d(c, s);\n              if (p === void 0) {\n                if (c === null) return c;\n                throw new Error(\n                  process.env.NODE_ENV === \"production\"\n                    ? ot(9)\n                    : \"A case reducer on a non-draftable value must not return undefined\",\n                );\n              }\n              return p;\n            }\n          }\n        return c;\n      }, l)\n    );\n  }\n  return (a.getInitialState = i), a;\n}\nvar Q6 = /* @__PURE__ */ Symbol.for(\"rtk-slice-createasyncthunk\");\nfunction J6(e, t) {\n  return `${e}/${t}`;\n}\nfunction e8({ creators: e } = {}) {\n  var n;\n  const t = (n = e == null ? void 0 : e.asyncThunk) == null ? void 0 : n[Q6];\n  return function (r) {\n    const { name: i, reducerPath: a = i } = r;\n    if (!i)\n      throw new Error(\n        process.env.NODE_ENV === \"production\"\n          ? ot(11)\n          : \"`name` is a required option for createSlice\",\n      );\n    typeof process < \"u\" &&\n      process.env.NODE_ENV === \"development\" &&\n      r.initialState === void 0 &&\n      console.error(\n        \"You must provide an `initialState` value that is not `undefined`. You may have misspelled `initialState`\",\n      );\n    const l =\n        (typeof r.reducers == \"function\" ? r.reducers(n8()) : r.reducers) || {},\n      s = Object.keys(l),\n      u = {\n        sliceCaseReducersByName: {},\n        sliceCaseReducersByType: {},\n        actionCreators: {},\n        sliceMatchers: [],\n      },\n      c = {\n        addCase(v, S) {\n          const w = typeof v == \"string\" ? v : v.type;\n          if (!w)\n            throw new Error(\n              process.env.NODE_ENV === \"production\"\n                ? ot(12)\n                : \"`context.addCase` cannot be called with an empty action type\",\n            );\n          if (w in u.sliceCaseReducersByType)\n            throw new Error(\n              process.env.NODE_ENV === \"production\"\n                ? ot(13)\n                : \"`context.addCase` cannot be called with two reducers for the same action type: \" +\n                  w,\n            );\n          return (u.sliceCaseReducersByType[w] = S), c;\n        },\n        addMatcher(v, S) {\n          return (\n            u.sliceMatchers.push({\n              matcher: v,\n              reducer: S,\n            }),\n            c\n          );\n        },\n        exposeAction(v, S) {\n          return (u.actionCreators[v] = S), c;\n        },\n        exposeCaseReducer(v, S) {\n          return (u.sliceCaseReducersByName[v] = S), c;\n        },\n      };\n    s.forEach((v) => {\n      const S = l[v],\n        w = {\n          reducerName: v,\n          type: J6(i, v),\n          createNotation: typeof r.reducers == \"function\",\n        };\n      r8(S) ? a8(w, S, c, t) : o8(w, S, c);\n    });\n    function d() {\n      if (\n        process.env.NODE_ENV !== \"production\" &&\n        typeof r.extraReducers == \"object\"\n      )\n        throw new Error(\n          process.env.NODE_ENV === \"production\"\n            ? ot(14)\n            : \"The object notation for `createSlice.extraReducers` has been removed. Please use the 'builder callback' notation instead: https://redux-toolkit.js.org/api/createSlice\",\n        );\n      const [v = {}, S = [], w = void 0] =\n          typeof r.extraReducers == \"function\"\n            ? Md(r.extraReducers)\n            : [r.extraReducers],\n        E = {\n          ...v,\n          ...u.sliceCaseReducersByType,\n        };\n      return X6(r.initialState, (M) => {\n        for (let _ in E) M.addCase(_, E[_]);\n        for (let _ of u.sliceMatchers) M.addMatcher(_.matcher, _.reducer);\n        for (let _ of S) M.addMatcher(_.matcher, _.reducer);\n        w && M.addDefaultCase(w);\n      });\n    }\n    const p = (v) => v,\n      h = /* @__PURE__ */ new Map();\n    let m;\n    function b(v, S) {\n      return m || (m = d()), m(v, S);\n    }\n    function y() {\n      return m || (m = d()), m.getInitialState();\n    }\n    function g(v, S = !1) {\n      function w(M) {\n        let _ = M[v];\n        if (typeof _ > \"u\") {\n          if (S) _ = y();\n          else if (process.env.NODE_ENV !== \"production\")\n            throw new Error(\n              process.env.NODE_ENV === \"production\"\n                ? ot(15)\n                : \"selectSlice returned undefined for an uninjected slice reducer\",\n            );\n        }\n        return _;\n      }\n      function E(M = p) {\n        const _ = L2(h, S, {\n          insert: () => /* @__PURE__ */ new WeakMap(),\n        });\n        return L2(_, M, {\n          insert: () => {\n            const j = {};\n            for (const [R, D] of Object.entries(r.selectors ?? {}))\n              j[R] = t8(D, M, y, S);\n            return j;\n          },\n        });\n      }\n      return {\n        reducerPath: v,\n        getSelectors: E,\n        get selectors() {\n          return E(w);\n        },\n        selectSlice: w,\n      };\n    }\n    const x = {\n      name: i,\n      reducer: b,\n      actions: u.actionCreators,\n      caseReducers: u.sliceCaseReducersByName,\n      getInitialState: y,\n      ...g(a),\n      injectInto(v, { reducerPath: S, ...w } = {}) {\n        const E = S ?? a;\n        return (\n          v.inject(\n            {\n              reducerPath: E,\n              reducer: b,\n            },\n            w,\n          ),\n          {\n            ...x,\n            ...g(E, !0),\n          }\n        );\n      },\n    };\n    return x;\n  };\n}\nfunction t8(e, t, n, o) {\n  function r(i, ...a) {\n    let l = t(i);\n    if (typeof l > \"u\") {\n      if (o) l = n();\n      else if (process.env.NODE_ENV !== \"production\")\n        throw new Error(\n          process.env.NODE_ENV === \"production\"\n            ? ot(16)\n            : \"selectState returned undefined for an uninjected slice reducer\",\n        );\n    }\n    return e(l, ...a);\n  }\n  return (r.unwrapped = e), r;\n}\nvar pc = /* @__PURE__ */ e8();\nfunction n8() {\n  function e(t, n) {\n    return {\n      _reducerDefinitionType: \"asyncThunk\",\n      payloadCreator: t,\n      ...n,\n    };\n  }\n  return (\n    (e.withTypes = () => e),\n    {\n      reducer(t) {\n        return Object.assign(\n          {\n            // hack so the wrapping function has the same name as the original\n            // we need to create a wrapper so the `reducerDefinitionType` is not assigned to the original\n            [t.name](...n) {\n              return t(...n);\n            },\n          }[t.name],\n          {\n            _reducerDefinitionType: \"reducer\",\n            /* reducer */\n          },\n        );\n      },\n      preparedReducer(t, n) {\n        return {\n          _reducerDefinitionType: \"reducerWithPrepare\",\n          prepare: t,\n          reducer: n,\n        };\n      },\n      asyncThunk: e,\n    }\n  );\n}\nfunction o8({ type: e, reducerName: t, createNotation: n }, o, r) {\n  let i, a;\n  if (\"reducer\" in o) {\n    if (n && !i8(o))\n      throw new Error(\n        process.env.NODE_ENV === \"production\"\n          ? ot(17)\n          : \"Please use the `create.preparedReducer` notation for prepared action creators with the `create` notation.\",\n      );\n    (i = o.reducer), (a = o.prepare);\n  } else i = o;\n  r.addCase(e, i)\n    .exposeCaseReducer(t, i)\n    .exposeAction(t, a ? O2(e, a) : O2(e));\n}\nfunction r8(e) {\n  return e._reducerDefinitionType === \"asyncThunk\";\n}\nfunction i8(e) {\n  return e._reducerDefinitionType === \"reducerWithPrepare\";\n}\nfunction a8({ type: e, reducerName: t }, n, o, r) {\n  if (!r)\n    throw new Error(\n      process.env.NODE_ENV === \"production\"\n        ? ot(18)\n        : \"Cannot use `create.asyncThunk` in the built-in `createSlice`. Use `buildCreateSlice({ creators: { asyncThunk: asyncThunkCreator } })` to create a customised version of `createSlice`.\",\n    );\n  const {\n      payloadCreator: i,\n      fulfilled: a,\n      pending: l,\n      rejected: s,\n      settled: u,\n      options: c,\n    } = n,\n    d = r(e, i, c);\n  o.exposeAction(t, d),\n    a && o.addCase(d.fulfilled, a),\n    l && o.addCase(d.pending, l),\n    s && o.addCase(d.rejected, s),\n    u && o.addMatcher(d.settled, u),\n    o.exposeCaseReducer(t, {\n      fulfilled: a || Gr,\n      pending: l || Gr,\n      rejected: s || Gr,\n      settled: u || Gr,\n    });\n}\nfunction Gr() {}\nfunction ot(e) {\n  return `Minified Redux Toolkit error #${e}; visit https://redux-toolkit.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `;\n}\nconst l8 = {\n    users: {},\n    isRightPanelOpen: !1,\n    selectedConversationId: void 0,\n    conversations: {},\n    conversationsLoadingState: It.UNINITIALIZED,\n    newConversation: void 0,\n    shareId: void 0,\n    docsAppRendered: !1,\n    currentPage: A6(),\n    codeblockLoaded: !1,\n    source: lc.DBT_DOCS,\n    manifest: {},\n  },\n  Li = pc({\n    name: \"appState\",\n    initialState: l8,\n    reducers: {\n      setDocsAppRendered: (e, t) => {\n        e.docsAppRendered = t.payload;\n      },\n      setManifest: (e, t) => {\n        e.manifest = t.payload;\n      },\n      updateCurrentPage: (e, t) => {\n        e.currentPage = t.payload;\n      },\n      setConversationSource: (e, t) => {\n        e.source = t.payload;\n      },\n      updateCodeblockLoaded: (e, t) => {\n        e.codeblockLoaded = t.payload;\n      },\n      setShareId: (e, t) => {\n        e.shareId = t.payload;\n      },\n      setCurrentUserId: (e, t) => {\n        e.currentUserId = t.payload;\n      },\n      setConversationsLoadingState: (e, t) => {\n        e.conversationsLoadingState = t.payload;\n      },\n      refetchConversations: (e) => {\n        e.conversationsLoadingState = It.UNINITIALIZED;\n      },\n      setUsers: (e, t) => {\n        var n;\n        return (n = t.payload) != null && n.length\n          ? {\n              ...e,\n              users: t.payload.reduce((o, r) => ((o[r.id] = r), o), {}),\n            }\n          : e;\n      },\n      updateRightPanelState: (e, t) => {\n        e.isRightPanelOpen = t.payload;\n      },\n      updateSelectedConversationId: (e, t) => {\n        e.selectedConversationId = t.payload;\n      },\n      upsertConversation: (e, t) => {\n        e.conversations = {\n          ...e.conversations,\n          [t.payload.conversation_group_id]: {\n            ...e.conversations[t.payload.conversation_group_id],\n            ...t.payload,\n          },\n        };\n      },\n      resolveConversationGroup: (\n        e,\n        { payload: { conversationGroupId: t } },\n      ) => {\n        e.conversations[t] && delete e.conversations[t];\n      },\n      updateNewConversation: (e, t) => {\n        var r, i;\n        const n = { ...t.payload };\n        if (!n.meta) {\n          console.log(\"Invalid meta\");\n          return;\n        }\n        const o = uc();\n        if (!o || o.length < 3) {\n          console.error(\"Unable to find model parts\", o);\n          return;\n        }\n        if (\n          (console.log(\"model parts found\", o),\n          (n.meta.uniqueId = o[2]),\n          (n.meta.resource_type = o[1]),\n          n.meta.range ||\n            (n.meta.range = {\n              end: { line: 0, character: 0 },\n              start: { line: 0, character: 0 },\n            }),\n          n.meta.uniqueId)\n        ) {\n          const a =\n            ((r = e.manifest.nodes) == null ? void 0 : r[n.meta.uniqueId]) ||\n            ((i = e.manifest.macros) == null ? void 0 : i[n.meta.uniqueId]);\n          n.meta.filePath = (a == null ? void 0 : a.original_file_path) || \"\";\n        }\n        e.newConversation = n;\n      },\n      resetNewConversation: (e) => {\n        e.newConversation = void 0;\n      },\n      setConversations: (e, t) => {\n        t.payload &&\n          ((e.conversations = t.payload.reduce(\n            (n, o) => ((n[o.conversation_group_id] = o), n),\n            {},\n          )),\n          (e.selectedConversationId =\n            e.selectedConversationId || t.payload[0].conversation_group_id));\n      },\n    },\n  }),\n  {\n    setCurrentUserId: wA,\n    setShareId: EA,\n    updateSelectedConversationId: gc,\n    updateRightPanelState: mc,\n    setUsers: s8,\n    setConversations: c8,\n    resetNewConversation: bc,\n    updateNewConversation: yc,\n    upsertConversation: SA,\n    setDocsAppRendered: kA,\n    updateCurrentPage: _A,\n    updateCodeblockLoaded: AA,\n    resolveConversationGroup: u8,\n    setConversationsLoadingState: D2,\n    refetchConversations: Td,\n    setConversationSource: MA,\n    setManifest: d8,\n  } = Li.actions,\n  aa = Pt({\n    state: Li.getInitialState(),\n    dispatch: () => null,\n    getValue: () => null,\n  }),\n  f8 = ({\n    children: e,\n    shareId: t,\n    userId: n,\n    conversationGroupId: o,\n    source: r,\n  }) => {\n    const [i, a] = ic(Li.reducer, {\n        ...Li.getInitialState(),\n        shareId: t,\n        currentUserId: n,\n        selectedConversationId: o,\n        isRightPanelOpen: !!o,\n        source: r,\n      }),\n      l = Oe((u) => u(i), [i]),\n      s = ze(\n        () => ({\n          state: i,\n          dispatch: a,\n          getValue: l,\n        }),\n        [i, a, l],\n      );\n    return /* @__PURE__ */ f.jsx(aa.Provider, { value: s, children: e });\n  },\n  h8 = () => Xe(aa),\n  He = (e) => {\n    const { getValue: t } = Xe(aa);\n    return t(e);\n  },\n  Bt = () => {\n    const { dispatch: e } = Xe(aa);\n    return e;\n  },\n  p8 = (e) => e;\nlet Od = p8;\nprocess.env.NODE_ENV !== \"production\" &&\n  (Od = (e, t) => {\n    if (!e) throw new Error(t);\n  });\nconst g8 = Pt(null),\n  m8 = Pt({}),\n  b8 = Pt({\n    transformPagePoint: (e) => e,\n    isStatic: !1,\n    reducedMotion: \"never\",\n  }),\n  y8 = typeof window < \"u\",\n  C8 = y8 ? h4 : ue;\nfunction Nd(e) {\n  const t = he(null);\n  return t.current === null && (t.current = e()), t.current;\n}\nclass v8 extends O.Component {\n  getSnapshotBeforeUpdate(t) {\n    const n = this.props.childRef.current;\n    if (n && t.isPresent && !this.props.isPresent) {\n      const o = this.props.sizeRef.current;\n      (o.height = n.offsetHeight || 0),\n        (o.width = n.offsetWidth || 0),\n        (o.top = n.offsetTop),\n        (o.left = n.offsetLeft);\n    }\n    return null;\n  }\n  /**\n   * Required with getSnapshotBeforeUpdate to stop React complaining.\n   */\n  componentDidUpdate() {}\n  render() {\n    return this.props.children;\n  }\n}\nfunction x8({ children: e, isPresent: t }) {\n  const n = cd(),\n    o = he(null),\n    r = he({\n      width: 0,\n      height: 0,\n      top: 0,\n      left: 0,\n    }),\n    { nonce: i } = Xe(b8);\n  return (\n    p4(() => {\n      const { width: a, height: l, top: s, left: u } = r.current;\n      if (t || !o.current || !a || !l) return;\n      o.current.dataset.motionPopId = n;\n      const c = document.createElement(\"style\");\n      return (\n        i && (c.nonce = i),\n        document.head.appendChild(c),\n        c.sheet &&\n          c.sheet.insertRule(`\n          [data-motion-pop-id=\"${n}\"] {\n            position: absolute !important;\n            width: ${a}px !important;\n            height: ${l}px !important;\n            top: ${s}px !important;\n            left: ${u}px !important;\n          }\n        `),\n        () => {\n          document.head.removeChild(c);\n        }\n      );\n    }, [t]),\n    f.jsx(v8, {\n      isPresent: t,\n      childRef: o,\n      sizeRef: r,\n      children: O.cloneElement(e, { ref: o }),\n    })\n  );\n}\nconst w8 = ({\n  children: e,\n  initial: t,\n  isPresent: n,\n  onExitComplete: o,\n  custom: r,\n  presenceAffectsLayout: i,\n  mode: a,\n}) => {\n  const l = Nd(E8),\n    s = cd(),\n    u = ze(\n      () => ({\n        id: s,\n        initial: t,\n        isPresent: n,\n        custom: r,\n        onExitComplete: (c) => {\n          l.set(c, !0);\n          for (const d of l.values()) if (!d) return;\n          o && o();\n        },\n        register: (c) => (l.set(c, !1), () => l.delete(c)),\n      }),\n      /**\n       * If the presence of a child affects the layout of the components around it,\n       * we want to make a new context value to ensure they get re-rendered\n       * so they can detect that layout change.\n       */\n      i ? [Math.random()] : [n],\n    );\n  return (\n    ze(() => {\n      l.forEach((c, d) => l.set(d, !1));\n    }, [n]),\n    O.useEffect(() => {\n      !n && !l.size && o && o();\n    }, [n]),\n    a === \"popLayout\" && (e = f.jsx(x8, { isPresent: n, children: e })),\n    f.jsx(g8.Provider, { value: u, children: e })\n  );\n};\nfunction E8() {\n  return /* @__PURE__ */ new Map();\n}\nconst Kr = (e) => e.key || \"\";\nfunction j2(e) {\n  const t = [];\n  return (\n    ko.forEach(e, (n) => {\n      sd(n) && t.push(n);\n    }),\n    t\n  );\n}\nconst S8 = ({\n    children: e,\n    exitBeforeEnter: t,\n    custom: n,\n    initial: o = !0,\n    onExitComplete: r,\n    presenceAffectsLayout: i = !0,\n    mode: a = \"sync\",\n  }) => {\n    Od(!t, \"Replace exitBeforeEnter with mode='wait'\");\n    const l = ze(() => j2(e), [e]),\n      s = l.map(Kr),\n      u = he(!0),\n      c = he(l),\n      d = Nd(() => /* @__PURE__ */ new Map()),\n      [p, h] = se(l),\n      [m, b] = se(l);\n    C8(() => {\n      (u.current = !1), (c.current = l);\n      for (let x = 0; x < m.length; x++) {\n        const v = Kr(m[x]);\n        s.includes(v) ? d.delete(v) : d.get(v) !== !0 && d.set(v, !1);\n      }\n    }, [m, s.length, s.join(\"-\")]);\n    const y = [];\n    if (l !== p) {\n      let x = [...l];\n      for (let v = 0; v < m.length; v++) {\n        const S = m[v],\n          w = Kr(S);\n        s.includes(w) || (x.splice(v, 0, S), y.push(S));\n      }\n      a === \"wait\" && y.length && (x = y), b(j2(x)), h(l);\n      return;\n    }\n    process.env.NODE_ENV !== \"production\" &&\n      a === \"wait\" &&\n      m.length > 1 &&\n      console.warn(\n        `You're attempting to animate multiple children within AnimatePresence, but its mode is set to \"wait\". This will lead to odd visual behaviour.`,\n      );\n    const { forceRender: g } = Xe(m8);\n    return f.jsx(f.Fragment, {\n      children: m.map((x) => {\n        const v = Kr(x),\n          S = l === m || s.includes(v),\n          w = () => {\n            if (d.has(v)) d.set(v, !0);\n            else return;\n            let E = !0;\n            d.forEach((M) => {\n              M || (E = !1);\n            }),\n              E && (g == null || g(), b(c.current), r && r());\n          };\n        return f.jsx(\n          w8,\n          {\n            isPresent: S,\n            initial: !u.current || o ? void 0 : !1,\n            custom: S ? void 0 : n,\n            presenceAffectsLayout: i,\n            mode: a,\n            onExitComplete: S ? void 0 : w,\n            children: x,\n          },\n          v,\n        );\n      }),\n    });\n  },\n  k8 =\n    \"data:image/svg+xml,%3csvg%20width='26'%20height='24'%20viewBox='0%200%2026%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20id='Frame'%20clip-path='url(%23clip0_15836_3582)'%3e%3cg%20id='Group'%3e%3cg%20id='Group_2'%3e%3cpath%20id='Vector'%20d='M2.66432%2011.3174C0.315394%208.57735%20-0.664635%205.72559%200.475762%204.94906C1.61616%204.1715%204.44409%205.76385%206.79407%208.50394C9.14299%2011.244%2010.123%2014.0958%208.98262%2014.8733C7.84223%2015.6499%205.01324%2014.0586%202.66432%2011.3174Z'%20fill='url(%23paint0_linear_15836_3582)'/%3e%3cpath%20id='Vector_2'%20d='M1.08995%209.13979C1.05432%209.08085%201.02077%209.02191%200.988281%208.96401C1.50398%208.75204%201.99451%208.49871%202.43579%208.23401C3.26488%207.73666%204.03423%207.15142%204.67151%206.46898C4.67885%206.46174%204.68514%206.4545%204.69248%206.44727C4.75012%206.4938%204.80777%206.54033%204.86437%206.58892C4.17049%207.31479%203.35293%207.9662%202.44417%208.47596C2.02072%208.71482%201.56477%208.94333%201.08995%209.13979Z'%20fill='%239D9CA9'/%3e%3c/g%3e%3cpath%20id='Vector_3'%20d='M8.11873%2011.4596C7.3368%2010.529%206.05385%2010.1403%205.25306%2010.5911C4.45331%2011.0419%204.43864%2012.1617%205.22057%2013.0923C6.00249%2014.0229%207.28544%2014.4117%208.08623%2013.9609C8.88598%2013.5101%208.90065%2012.3902%208.11873%2011.4596Z'%20fill='url(%23paint1_linear_15836_3582)'/%3e%3cpath%20id='Vector_4'%20d='M8.03714%2013.4942C8.50484%2012.928%208.23355%2011.9461%207.43118%2011.3011C6.62882%2010.6561%205.59923%2010.5922%205.13152%2011.1584C4.66382%2011.7246%204.93511%2012.7065%205.73748%2013.3515C6.53984%2013.9965%207.56943%2014.0604%208.03714%2013.4942Z'%20fill='url(%23paint2_radial_15836_3582)'/%3e%3cg%20id='Group_3'%3e%3cpath%20id='Vector_5'%20d='M21.5845%2013.7628C24.2783%2011.7713%2025.8684%209.37657%2025.1368%208.41392C24.4051%207.45127%2021.6286%208.28467%2018.9348%2010.2751C16.241%2012.2655%2014.651%2014.6613%2015.3826%2015.624C16.1142%2016.5866%2018.8908%2015.7532%2021.5845%2013.7628Z'%20fill='url(%23paint3_linear_15836_3582)'/%3e%3cpath%20id='Vector_6'%20d='M23.4827%2012.1157C23.5278%2012.0691%2023.5718%2012.0236%2023.6148%2011.9771C23.2458%2011.669%2022.9094%2011.3288%2022.6159%2010.9896C22.0656%2010.3517%2021.5887%209.64544%2021.248%208.88028C21.2438%208.87201%2021.2407%208.86374%2021.2365%208.85547C21.1768%208.88545%2021.116%208.91544%2021.0552%208.94646C21.4315%209.76435%2021.9304%2010.5409%2022.5425%2011.2088C22.8287%2011.5211%2023.1442%2011.8313%2023.4827%2012.1157Z'%20fill='%239D9CA9'/%3e%3c/g%3e%3cpath%20id='Vector_7'%20d='M17.0302%2012.6899C17.9316%2012.0106%2019.1003%2011.9382%2019.639%2012.5276C20.1778%2013.1169%2019.8843%2014.1458%2018.9818%2014.8251C18.0804%2015.5044%2016.9117%2015.5768%2016.373%2014.9874C15.8342%2014.3981%2016.1287%2013.3692%2017.0302%2012.6899Z'%20fill='url(%23paint4_linear_15836_3582)'/%3e%3cpath%20id='Vector_8'%20d='M17.2549%2012.9346C18.0032%2012.3711%2018.9728%2012.3101%2019.4193%2012.7992C19.8669%2013.2883%2019.6227%2014.1423%2018.8743%2014.7059C18.1259%2015.2694%2017.1563%2015.3304%2016.7098%2014.8413C16.2623%2014.3522%2016.5065%2013.4982%2017.2549%2012.9346Z'%20fill='url(%23paint5_radial_15836_3582)'/%3e%3cg%20id='Group_4'%3e%3cpath%20id='Vector_9'%20d='M8.4355%2010.8031L7.72484%2013.5297C6.96493%2016.4445%208.59272%2019.3769%2011.3609%2020.079C14.128%2020.7811%2016.9874%2018.9871%2017.7473%2016.0723L18.4706%2013.2981C18.4779%2013.2309%2018.4643%2013.1595%2018.4307%2013.0851C18.4265%2013.0737%2018.4213%2013.0634%2018.415%2013.053C18.349%2012.9238%2018.2263%2012.7863%2018.0555%2012.6425C18.0272%2012.6188%2017.9978%2012.595%2017.9664%2012.5712H17.9654C17.935%2012.5474%2017.9014%2012.5236%2017.8689%2012.4988C17.8522%2012.4864%2017.8343%2012.474%2017.8165%2012.4616C17.7987%2012.4492%2017.7809%2012.4368%2017.762%2012.4254C17.7442%2012.413%2017.7253%2012.4006%2017.7065%2012.3882C17.6687%2012.3634%2017.6299%2012.3385%2017.5901%2012.3137C17.4098%2012.2021%2017.2054%2012.0893%2016.979%2011.9777C16.4759%2011.7285%2015.868%2011.4814%2015.1877%2011.2549C15.1196%2011.2322%2015.0504%2011.2094%2014.9812%2011.1877C14.8429%2011.1432%2014.7003%2011.0998%2014.5567%2011.0574L12.9751%2010.6562C10.557%2010.1413%208.59586%2010.1878%208.4355%2010.8031Z'%20fill='url(%23paint6_linear_15836_3582)'/%3e%3cpath%20id='Vector_10'%20opacity='0.2'%20d='M8.81373%2011.0098C8.65126%2011.6344%2010.5862%2012.6642%2013.1363%2013.3105C15.6865%2013.9577%2017.8845%2013.9753%2018.048%2013.3518C18.2105%2012.7273%2016.2756%2011.6974%2013.7254%2011.0512C11.1752%2010.4039%208.97619%2010.3863%208.81373%2011.0098Z'%20fill='url(%23paint7_linear_15836_3582)'/%3e%3cpath%20id='Vector_11'%20d='M13.8752%2010.892C11.8208%2010.3709%2010.0337%2010.4184%209.88275%2010.9985C9.73182%2011.5786%2011.2747%2012.4709%2013.3281%2012.991C15.3824%2013.5121%2017.1696%2013.4646%2017.3205%2012.8845C17.4714%2012.3055%2015.9285%2011.4131%2013.8752%2010.892Z'%20fill='url(%23paint8_linear_15836_3582)'/%3e%3cpath%20id='Vector_12'%20d='M16.6706%2012.7859C16.796%2012.3048%2015.516%2011.5643%2013.8116%2011.132C12.1073%2010.6997%2010.624%2010.7394%2010.4985%2011.2206C10.3731%2011.7017%2011.6531%2012.4422%2013.3575%2012.8745C15.0619%2013.3068%2016.5452%2013.2671%2016.6706%2012.7859Z'%20fill='url(%23paint9_radial_15836_3582)'/%3e%3cpath%20id='Vector_13'%20d='M11.1729%2016.1522C10.609%2017.4602%2011.1038%2018.9202%2012.2787%2019.4134C13.4537%2019.9066%2014.8646%2019.247%2015.4285%2017.94C15.9924%2016.632%2015.4976%2015.172%2014.3227%2014.6788C13.1477%2014.1845%2011.7379%2014.8442%2011.1729%2016.1522Z'%20fill='url(%23paint10_linear_15836_3582)'/%3e%3cg%20id='Group_5'%3e%3cpath%20id='Vector_14'%20d='M8.72695%2011.4727C9.19129%2011.5906%209.27829%2012.7497%208.92401%2014.1104C8.62633%2015.252%208.12636%2016.1215%207.69871%2016.3025C7.68928%2016.2642%207.67984%2016.2249%207.67041%2016.1857C8.01945%2016.0243%208.5016%2015.2468%208.80557%2014.0804C9.16613%2012.699%209.04035%2011.6764%208.69761%2011.5895C8.54458%2011.5513%208.34018%2011.694%208.12741%2011.9856L8.19763%2011.7157C8.38211%2011.5223%208.56554%2011.4313%208.72695%2011.4727Z'%20fill='%239D9CA9'/%3e%3c/g%3e%3cpath%20id='Vector_15'%20d='M7.55699%2013.7083C7.27503%2014.7878%207.28028%2015.7225%207.56642%2015.7959C7.85362%2015.8683%208.31376%2015.0525%208.59572%2013.972C8.87767%2012.8925%208.87243%2011.9578%208.58628%2011.8843C8.29909%2011.812%207.8379%2012.6288%207.55699%2013.7083Z'%20fill='url(%23paint11_linear_15836_3582)'/%3e%3cpath%20id='Vector_16'%20d='M7.67662%2013.739C7.44288%2014.6355%207.44708%2015.411%207.68501%2015.471C7.92294%2015.5309%208.30552%2014.8537%208.53926%2013.9572C8.773%2013.0607%208.7688%2012.2852%208.53087%2012.2253C8.29189%2012.1663%207.90931%2012.8436%207.67662%2013.739Z'%20fill='url(%23paint12_radial_15836_3582)'/%3e%3c/g%3e%3cpath%20id='Vector_17'%20opacity='0.5'%20d='M8.36426%2011.0755C9.54763%2011.9916%2013.5568%2013.0783%2015.1123%2012.8602C16.7653%2012.6285%2014.4268%2011.3071%2014.4268%2011.3071L12.4594%2010.5523C10.2834%2010.1511%208.58437%2010.2328%208.43553%2010.8035L8.36426%2011.0755Z'%20fill='%23231F20'/%3e%3cg%20id='Group_6'%3e%3cpath%20id='Vector_18'%20d='M20.3665%208.35913C20.6243%205.04932%2017.94%202.79831%2014.4329%202.53257C10.9257%202.2658%207.92379%204.08563%207.66594%207.39545C7.4081%2010.7053%2010.2004%2011.5728%2013.7075%2011.8385C17.2147%2012.1053%2020.1086%2011.669%2020.3665%208.35913Z'%20fill='url(%23paint13_linear_15836_3582)'/%3e%3cg%20id='Group_7'%3e%3cpath%20id='Vector_19'%20d='M8.46122%209.06024C8.8742%209.09126%209.16978%208.18031%209.23791%207.30762C9.30604%206.43389%209.1551%205.48882%208.74213%205.4578C8.32915%205.42678%208.03357%206.33773%207.96544%207.21042C7.89731%208.08415%208.04825%209.02922%208.46122%209.06024ZM8.7306%205.60463C8.96119%205.62221%209.16453%206.32119%209.08907%207.29624C9.01255%208.2713%208.70334%208.93099%208.47275%208.91341C8.24215%208.89583%208.03881%208.19685%208.11428%207.2218C8.18975%206.24674%208.5%205.58705%208.7306%205.60463Z'%20fill='%239D9CA9'/%3e%3c/g%3e%3cpath%20id='Vector_20'%20d='M10.1709%206.95357C9.97486%209.46617%2011.915%2011.1443%2014.4547%2011.3377C16.9944%2011.53%2019.1714%2010.1641%2019.3674%207.65255C19.5634%205.13994%2017.4975%205.0717%2014.9589%204.87834C12.4181%204.68498%2010.3669%204.44096%2010.1709%206.95357Z'%20fill='%23E2E3E7'/%3e%3cpath%20id='Vector_21'%20d='M10.2478%206.97754C10.0549%209.44672%2011.9626%2011.0887%2014.4593%2011.2779C16.956%2011.4671%2019.0953%2010.1333%2019.2882%207.66307C19.481%205.1939%2017.4508%205.12565%2014.954%204.93643C12.4573%204.74721%2010.4407%204.50732%2010.2478%206.97754Z'%20fill='url(%23paint14_linear_15836_3582)'/%3e%3cpath%20id='Vector_22'%20d='M10.2729%203.35018C11.0339%204.02745%2011.602%204.87326%2011.6649%205.94551C11.6722%206.07062%2011.8662%206.03236%2011.8588%205.90829C11.7959%204.82052%2011.2247%203.9499%2010.4564%203.25195C10.3945%203.28297%2010.3337%203.31606%2010.2729%203.35018Z'%20fill='%239D9CA9'/%3e%3cpath%20id='Vector_23'%20d='M18.2494%206.54673C18.6152%205.85396%2018.9107%205.11051%2018.9139%204.40223C18.8416%204.33088%2018.7661%204.2616%2018.6896%204.19336C18.7598%204.94714%2018.4737%205.72884%2018.0743%206.48573C18.0156%206.59533%2018.1917%206.65737%2018.2494%206.54673Z'%20fill='%239D9CA9'/%3e%3cpath%20id='Vector_24'%20d='M10.4249%207.04055C10.2414%209.39289%2012.06%2010.9315%2014.4372%2011.1124C16.8144%2011.2934%2018.851%2010.0464%2019.0344%207.69507C19.2179%205.34273%2017.284%205.27862%2014.9068%205.09768C12.5296%204.91673%2010.6083%204.68821%2010.4249%207.04055Z'%20fill='url(%23paint15_radial_15836_3582)'/%3e%3cg%20id='Group_8'%3e%3cpath%20id='Vector_25'%20d='M13.9044%208.79297C13.8541%209.43922%2014.3436%2010.0027%2014.9987%2010.0524C15.6538%2010.102%2016.2251%209.61913%2016.2754%208.97288L13.9044%208.79297Z'%20fill='black'/%3e%3cpath%20id='Vector_26'%20d='M13.9283%208.80762C13.879%209.44042%2014.3591%209.99258%2015.0005%2010.0412C15.642%2010.0898%2016.2017%209.6162%2016.251%208.9834L13.9283%208.80762Z'%20fill='%23061417'/%3e%3cpath%20id='Vector_27'%20d='M13.9516%208.82129C13.9034%209.44065%2014.373%209.98143%2015.0009%2010.029C15.6287%2010.0766%2016.1769%209.61333%2016.2251%208.99397L13.9516%208.82129Z'%20fill='%230C282D'/%3e%3cpath%20id='Vector_28'%20d='M13.9755%208.83496C13.9283%209.44088%2014.3874%209.97029%2015.0027%2010.0168C15.6169%2010.0633%2016.1536%209.61046%2016.2007%209.0035L13.9755%208.83496Z'%20fill='%23133C44'/%3e%3cpath%20id='Vector_29'%20d='M13.9989%208.84863C13.9527%209.44111%2014.4024%209.95914%2015.003%2010.0046C15.6036%2010.0501%2016.1287%209.60655%2016.1748%209.01407L13.9989%208.84863Z'%20fill='%2319505B'/%3e%3cpath%20id='Vector_30'%20d='M14.0227%208.86328C13.9776%209.44232%2014.4168%209.94794%2015.0038%209.99344C15.5908%2010.0379%2016.1033%209.60466%2016.1494%209.02562L14.0227%208.86328Z'%20fill='%231F6472'/%3e%3cpath%20id='Vector_31'%20d='M14.0461%208.87695C14.0021%209.44255%2014.4308%209.9368%2015.0051%209.98023C15.5785%2010.0237%2016.0795%209.60075%2016.1235%209.03412L14.0461%208.87695Z'%20fill='%23257888'/%3e%3cpath%20id='Vector_32'%20d='M14.0699%208.88965C14.0269%209.44284%2014.4462%209.92468%2015.0059%209.96707C15.5656%2010.0095%2016.0551%209.59587%2016.0981%209.04371L14.0699%208.88965Z'%20fill='%232B8C9F'/%3e%3cpath%20id='Vector_33'%20d='M14.0933%208.9043C14.0514%209.44404%2014.4601%209.91451%2015.0073%209.95587C15.5544%209.99723%2016.0313%209.59397%2016.0733%209.05423L14.0933%208.9043Z'%20fill='%2331A0B6'/%3e%3cpath%20id='Vector_34'%20d='M14.1171%208.91797C14.0763%209.44427%2014.4746%209.90337%2015.0081%209.94369C15.5416%209.98402%2016.007%209.5911%2016.0479%209.0648L14.1171%208.91797Z'%20fill='%2338B4CD'/%3e%3cpath%20id='Vector_35'%20d='M14.1405%208.93262C14.1007%209.44548%2014.4895%209.8932%2015.0094%209.93249C15.5293%209.97178%2015.9832%209.58817%2016.023%209.07531L14.1405%208.93262Z'%20fill='%233EC8E3'/%3e%3cpath%20id='Vector_36'%20d='M14.1644%208.94629C14.1256%209.44571%2014.504%209.88102%2015.0102%209.92031C15.5165%209.95857%2015.9578%209.5853%2015.9976%209.08588L14.1644%208.94629Z'%20fill='%2344DCFA'/%3e%3c/g%3e%3cg%20id='Group_9'%3e%3cpath%20id='Vector_37'%20d='M14.6004%208.06197C14.6622%207.26786%2014.0606%206.57508%2013.2556%206.51408C12.4506%206.45307%2011.7484%207.04658%2011.6865%207.84069L14.6004%208.06197Z'%20fill='black'/%3e%3cpath%20id='Vector_38'%20d='M14.5723%208.04547C14.6331%207.26791%2014.043%206.58961%2013.2558%206.52964C12.4676%206.46967%2011.78%207.05181%2011.7192%207.82834L14.5723%208.04547Z'%20fill='%23061417'/%3e%3cpath%20id='Vector_39'%20d='M14.5429%208.02801C14.6026%207.26699%2014.0251%206.60317%2013.2536%206.54423C12.4822%206.48529%2011.8093%207.05502%2011.7495%207.81604L14.5429%208.02801Z'%20fill='%230C282D'/%3e%3cpath%20id='Vector_40'%20d='M14.5133%208.01042C14.571%207.26594%2014.0071%206.61556%2013.2524%206.55869C12.4977%206.50182%2011.8384%207.05811%2011.7808%207.80258L14.5133%208.01042Z'%20fill='%23133C44'/%3e%3cpath%20id='Vector_41'%20d='M14.4853%207.99392C14.5419%207.26599%2013.9895%206.63008%2013.2516%206.57425C12.5137%206.51841%2011.8691%207.06333%2011.8125%207.79126L14.4853%207.99392Z'%20fill='%2319505B'/%3e%3cpath%20id='Vector_42'%20d='M14.4558%207.97646C14.5113%207.26507%2013.9715%206.64364%2013.2504%206.58884C12.5292%206.53404%2011.8993%207.06654%2011.8438%207.77793L14.4558%207.97646Z'%20fill='%231F6472'/%3e%3cpath%20id='Vector_43'%20d='M14.4273%207.95984C14.4818%207.265%2013.9545%206.65701%2013.2491%206.60427C12.5437%206.55154%2011.9285%207.0706%2011.875%207.76648L14.4273%207.95984Z'%20fill='%23257888'/%3e%3cpath%20id='Vector_44'%20d='M14.3982%207.9425C14.4517%207.26317%2013.936%206.67069%2013.2484%206.61899C12.5597%206.56626%2011.9591%207.07498%2011.9067%207.75328L14.3982%207.9425Z'%20fill='%232B8C9F'/%3e%3cpath%20id='Vector_45'%20d='M14.3687%207.92588C14.4201%207.26309%2013.918%206.68509%2013.2462%206.63442C12.5743%206.58376%2011.9884%207.07904%2011.937%207.74183L14.3687%207.92588Z'%20fill='%2331A0B6'/%3e%3cpath%20id='Vector_46'%20d='M14.3407%207.9075C14.391%207.26126%2013.9016%206.69773%2013.2465%206.64706C12.5914%206.59743%2012.0201%207.08031%2011.9688%207.72655L14.3407%207.9075Z'%20fill='%2338B4CD'/%3e%3cpath%20id='Vector_47'%20d='M14.3113%207.89101C14.3605%207.26131%2013.8826%206.71122%2013.2442%206.66262C12.6059%206.61403%2012.0483%207.08553%2011.999%207.71523L14.3113%207.89101Z'%20fill='%233EC8E3'/%3e%3cpath%20id='Vector_48'%20d='M14.2827%207.87355C14.3309%207.26039%2013.8655%206.72478%2013.244%206.67721C12.6224%206.62965%2012.0795%207.08874%2012.0312%207.7019L14.2827%207.87355Z'%20fill='%2344DCFA'/%3e%3c/g%3e%3cg%20id='Group_10'%3e%3cpath%20id='Vector_49'%20d='M18.4852%208.35689C18.5471%207.56278%2018.0324%206.87725%2017.3365%206.82451C16.6405%206.77178%2016.0252%207.37253%2015.9634%208.1656L18.4852%208.35689Z'%20fill='black'/%3e%3cpath%20id='Vector_50'%20d='M18.4602%208.34046C18.521%207.5629%2018.0168%206.8908%2017.3355%206.8391C16.6532%206.7874%2016.0515%207.37574%2015.9907%208.15227L18.4602%208.34046Z'%20fill='%23061417'/%3e%3cpath%20id='Vector_51'%20d='M18.4362%208.32397C18.4959%207.56295%2018.0022%206.90533%2017.3346%206.85466C16.6669%206.804%2016.0778%207.37993%2016.0181%208.14095L18.4362%208.32397Z'%20fill='%230C282D'/%3e%3cpath%20id='Vector_52'%20d='M18.4106%208.30754C18.4683%207.56306%2017.9861%206.91889%2017.3331%206.86925C16.6801%206.81962%2016.1036%207.38315%2016.0449%208.12762L18.4106%208.30754Z'%20fill='%23133C44'/%3e%3cpath%20id='Vector_53'%20d='M18.3856%208.29007C18.4422%207.56214%2017.9706%206.93244%2017.3312%206.88384C16.6918%206.83524%2016.1279%207.38636%2016.0713%208.1143L18.3856%208.29007Z'%20fill='%2319505B'/%3e%3cpath%20id='Vector_54'%20d='M18.3615%208.27359C18.4171%207.5622%2017.9559%206.94697%2017.3312%206.89941C16.7065%206.85184%2016.1552%207.39055%2016.0996%208.10194L18.3615%208.27359Z'%20fill='%231F6472'/%3e%3cpath%20id='Vector_55'%20d='M18.3365%208.25715C18.391%207.56231%2017.9403%206.96052%2017.3302%206.914C16.7202%206.86747%2016.1815%207.39377%2016.127%208.08861L18.3365%208.25715Z'%20fill='%23257888'/%3e%3cpath%20id='Vector_56'%20d='M18.311%208.23969C18.3644%207.56035%2017.9242%206.97408%2017.3278%206.92858C16.7325%206.88309%2016.2063%207.39698%2016.1528%208.07632L18.311%208.23969Z'%20fill='%232B8C9F'/%3e%3cpath%20id='Vector_57'%20d='M18.2859%208.22222C18.3373%207.55943%2017.9086%206.9866%2017.3269%206.94317C16.7451%206.89871%2016.2326%207.4002%2016.1802%208.06299L18.2859%208.22222Z'%20fill='%2331A0B6'/%3e%3cpath%20id='Vector_58'%20d='M18.2618%208.20579C18.3122%207.55955%2017.8939%207.00119%2017.3269%206.95776C16.7598%206.91433%2016.2599%207.40341%2016.2085%208.04966L18.2618%208.20579Z'%20fill='%2338B4CD'/%3e%3cpath%20id='Vector_59'%20d='M18.2368%208.1893C18.2861%207.5596%2017.8773%207.01469%2017.3249%206.97333C16.7726%206.93093%2016.2841%207.4076%2016.2349%208.03731L18.2368%208.1893Z'%20fill='%233EC8E3'/%3e%3cpath%20id='Vector_60'%20d='M18.2117%208.17287C18.2599%207.55971%2017.8616%207.02927%2017.3239%206.98791C16.7852%206.94655%2016.3104%207.41082%2016.2632%208.02501L18.2117%208.17287Z'%20fill='%2344DCFA'/%3e%3c/g%3e%3cpath%20id='Vector_61'%20opacity='0.2'%20d='M10.7266%208.85254C11.3303%2010.1647%2012.7411%2010.9846%2014.437%2011.1129C16.0785%2011.238%2017.5574%2010.6817%2018.376%209.55152C18.1475%209.68077%2017.1266%209.89894%2016.1256%209.91549C13.653%209.95685%2011.0966%209.06864%2010.7266%208.85254Z'%20fill='url(%23paint16_linear_15836_3582)'/%3e%3cg%20id='Group_11'%3e%3cpath%20id='Vector_62'%20opacity='0.5'%20d='M11.2222%206.4588C11.3417%206.16928%2011.5356%205.83013%2011.8186%205.71846C11.9821%205.65332%2012.2116%205.62644%2012.4485%205.61816C12.3406%205.91595%2012.2441%206.21685%2012.155%206.52084C11.8437%206.50223%2011.5324%206.48052%2011.2222%206.4588Z'%20fill='url(%23paint17_linear_15836_3582)'/%3e%3cpath%20id='Vector_63'%20opacity='0.5'%20d='M12.1215%206.63637C12.087%206.75632%2012.0545%206.87626%2012.022%206.99724L11.0713%206.92486C11.0713%206.92486%2011.1048%206.77183%2011.1772%206.57227C11.4926%206.59501%2011.8071%206.61569%2012.1215%206.63637Z'%20fill='url(%23paint18_linear_15836_3582)'/%3e%3cpath%20id='Vector_64'%20opacity='0.5'%20d='M12.3248%206.53237C12.3049%206.53134%2012.285%206.52927%2012.2661%206.52824C12.3563%206.22114%2012.4558%205.91715%2012.5659%205.61626C13.0585%205.61419%2013.5491%205.68553%2013.5491%205.68553L13.4275%206.60062C13.0596%206.58924%2012.6917%206.55512%2012.3248%206.53237Z'%20fill='url(%23paint19_linear_15836_3582)'/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/g%3e%3cdefs%3e%3clinearGradient%20id='paint0_linear_15836_3582'%20x1='6.97955'%20y1='7.26947'%20x2='3.42246'%20y2='11.0928'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23E3E4E8'/%3e%3cstop%20offset='1'%20stop-color='%239E9EAB'/%3e%3c/linearGradient%3e%3clinearGradient%20id='paint1_linear_15836_3582'%20x1='5.83965'%20y1='11.0797'%20x2='7.63822'%20y2='13.9137'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23E3E4E8'/%3e%3cstop%20offset='1'%20stop-color='%239E9EAB'/%3e%3c/linearGradient%3e%3cradialGradient%20id='paint2_radial_15836_3582'%20cx='0'%20cy='0'%20r='1'%20gradientUnits='userSpaceOnUse'%20gradientTransform='translate(6.59902%2012.3229)%20rotate(-68.7958)%20scale(1.33886%201.39191)'%3e%3cstop%20stop-color='%2344DCFA'/%3e%3cstop%20offset='0.4438'%20stop-color='%234CAAE5'/%3e%3cstop%20offset='1'/%3e%3c/radialGradient%3e%3clinearGradient%20id='paint3_linear_15836_3582'%20x1='18.9194'%20y1='9.08262'%20x2='21.1401'%20y2='13.4021'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23E3E4E8'/%3e%3cstop%20offset='1'%20stop-color='%239E9EAB'/%3e%3c/linearGradient%3e%3clinearGradient%20id='paint4_linear_15836_3582'%20x1='19.0563'%20y1='12.8942'%20x2='16.7225'%20y2='14.9831'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23E3E4E8'/%3e%3cstop%20offset='1'%20stop-color='%239E9EAB'/%3e%3c/linearGradient%3e%3cradialGradient%20id='paint5_radial_15836_3582'%20cx='0'%20cy='0'%20r='1'%20gradientUnits='userSpaceOnUse'%20gradientTransform='translate(18.0786%2013.8269)%20rotate(-11.4054)%20scale(1.5459%201.0378)'%3e%3cstop%20stop-color='%2344DCFA'/%3e%3cstop%20offset='0.4438'%20stop-color='%234CAAE5'/%3e%3cstop%20offset='1'/%3e%3c/radialGradient%3e%3clinearGradient%20id='paint6_linear_15836_3582'%20x1='16.4136'%20y1='13.2152'%20x2='7.77357'%20y2='16.8418'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23E3E4E8'/%3e%3cstop%20offset='1'%20stop-color='%239E9EAB'/%3e%3c/linearGradient%3e%3clinearGradient%20id='paint7_linear_15836_3582'%20x1='13.1228'%20y1='13.5101'%20x2='13.8927'%20y2='10.0946'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='white'/%3e%3cstop%20offset='1'/%3e%3c/linearGradient%3e%3clinearGradient%20id='paint8_linear_15836_3582'%20x1='11.1224'%20y1='11.3127'%20x2='16.8305'%20y2='12.8003'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23E3E4E8'/%3e%3cstop%20offset='1'%20stop-color='%239E9EAB'/%3e%3c/linearGradient%3e%3cradialGradient%20id='paint9_radial_15836_3582'%20cx='0'%20cy='0'%20r='1'%20gradientUnits='userSpaceOnUse'%20gradientTransform='translate(13.6018%2011.9993)%20rotate(-115.351)%20scale(1.12129%201.92215)'%3e%3cstop%20stop-color='%2344DCFA'/%3e%3cstop%20offset='0.4438'%20stop-color='%234CAAE5'/%3e%3cstop%20offset='1'/%3e%3c/radialGradient%3e%3clinearGradient%20id='paint10_linear_15836_3582'%20x1='12.7619'%20y1='19.1153'%20x2='14.1622'%20y2='13.5938'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23E3E4E8'/%3e%3cstop%20offset='1'%20stop-color='%239E9EAB'/%3e%3c/linearGradient%3e%3clinearGradient%20id='paint11_linear_15836_3582'%20x1='7.73648'%20y1='15.1437'%20x2='8.50022'%20y2='12.1323'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23E3E4E8'/%3e%3cstop%20offset='1'%20stop-color='%239E9EAB'/%3e%3c/linearGradient%3e%3cradialGradient%20id='paint12_radial_15836_3582'%20cx='0'%20cy='0'%20r='1'%20gradientUnits='userSpaceOnUse'%20gradientTransform='translate(8.11332%2013.8562)%20rotate(-32.3967)%20scale(0.686669%201.07581)'%3e%3cstop%20stop-color='%2344DCFA'/%3e%3cstop%20offset='0.4438'%20stop-color='%234CAAE5'/%3e%3cstop%20offset='1'/%3e%3c/radialGradient%3e%3clinearGradient%20id='paint13_linear_15836_3582'%20x1='14.3226'%20y1='3.95403'%20x2='13.6519'%20y2='12.7924'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23E3E4E8'/%3e%3cstop%20offset='1'%20stop-color='%239E9EAB'/%3e%3c/linearGradient%3e%3clinearGradient%20id='paint14_linear_15836_3582'%20x1='14.485'%20y1='10.9477'%20x2='14.9061'%20y2='5.39774'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23E3E4E8'/%3e%3cstop%20offset='1'%20stop-color='%239E9EAB'/%3e%3c/linearGradient%3e%3cradialGradient%20id='paint15_radial_15836_3582'%20cx='0'%20cy='0'%20r='1'%20gradientUnits='userSpaceOnUse'%20gradientTransform='translate(15.9514%205.90347)%20rotate(-175.657)%20scale(5.63684%205.57701)'%3e%3cstop%20stop-color='%234D4178'/%3e%3cstop%20offset='1'%20stop-color='%2327213B'/%3e%3c/radialGradient%3e%3clinearGradient%20id='paint16_linear_15836_3582'%20x1='14.5737'%20y1='8.91767'%20x2='14.4352'%20y2='10.7426'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='white'/%3e%3cstop%20offset='1'/%3e%3c/linearGradient%3e%3clinearGradient%20id='paint17_linear_15836_3582'%20x1='11.869'%20y1='5.60405'%20x2='11.7294'%20y2='7.44393'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='white'/%3e%3cstop%20offset='1'/%3e%3c/linearGradient%3e%3clinearGradient%20id='paint18_linear_15836_3582'%20x1='11.6895'%20y1='5.59016'%20x2='11.5499'%20y2='7.43012'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='white'/%3e%3cstop%20offset='1'/%3e%3c/linearGradient%3e%3clinearGradient%20id='paint19_linear_15836_3582'%20x1='12.9403'%20y1='5.68553'%20x2='12.8006'%20y2='7.52546'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='white'/%3e%3cstop%20offset='1'/%3e%3c/linearGradient%3e%3cclipPath%20id='clip0_15836_3582'%3e%3crect%20width='25.3151'%20height='24'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\",\n  _8 =\n    \"data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M7.98979%2010.231C5.41138%2010.231%203.20947%2010.6208%203.20947%2012.1821C3.20947%2013.7433%205.39741%2014.1471%207.98979%2014.1471C10.5682%2014.1471%2012.7695%2013.7567%2012.7695%2012.196C12.7695%2010.6354%2010.5822%2010.231%207.98979%2010.231Z'%20stroke='%23247EFE'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M7.9898%208.00408C9.68187%208.00408%2011.0533%206.63202%2011.0533%204.93996C11.0533%203.24789%209.68187%201.87646%207.9898%201.87646C6.29774%201.87646%204.92568%203.24789%204.92568%204.93996C4.91996%206.62631%206.2825%207.99837%207.96822%208.00408H7.9898Z'%20stroke='%23247EFE'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3c/svg%3e\",\n  A8 = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: 13,\n        height: 12,\n        viewBox: \"0 0 13 12\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\n        \"g\",\n        { id: \"fi_2058361\", clipPath: \"url(#clip0_21046_17118)\" },\n        /* @__PURE__ */ O.createElement(\"path\", {\n          id: \"Vector\",\n          d: \"M5.55584 12C5.50915 12 5.4619 11.9907 5.41676 11.9712C5.25877 11.9031 5.17332 11.7306 5.2148 11.5636L6.40364 6.77822H3.20045C3.0845 6.77822 2.97601 6.72105 2.91046 6.6254C2.8449 6.52976 2.83072 6.40795 2.87256 6.29981L5.22244 0.224741C5.27482 0.0892965 5.40509 0 5.55031 0H8.78375C8.90256 0 9.01332 0.0599998 9.07824 0.159515C9.14312 0.25903 9.15339 0.384584 9.10548 0.493311L7.71402 3.65174H10.466C10.5946 3.65174 10.7129 3.72193 10.7746 3.83478C10.8362 3.94761 10.8313 4.08509 10.7618 4.19328L5.8518 11.8384C5.78541 11.9418 5.67248 12 5.55584 12Z\",\n          fill: \"currentColor\",\n        }),\n      ),\n      /* @__PURE__ */ O.createElement(\n        \"defs\",\n        null,\n        /* @__PURE__ */ O.createElement(\n          \"clipPath\",\n          { id: \"clip0_21046_17118\" },\n          /* @__PURE__ */ O.createElement(\"rect\", {\n            width: 12,\n            height: 12,\n            fill: \"currentColor\",\n            transform: \"translate(0.833252)\",\n          }),\n        ),\n      ),\n    ),\n  F2 =\n    \"data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20id='object'%3e%3cpath%20id='Vector'%20d='M3.66596%2013.3332C3.38758%2013.2627%203.11555%2013.1563%202.85405%2013.0158C2.64481%2012.9063%202.45388%2012.747%202.29148%2012.5465C2.1424%2012.3622%202.02844%2012.1369%201.95834%2011.8878C1.88728%2011.6071%201.85329%2011.3134%201.85777%2011.0185L1.86615%209.9025C1.86615%209.48739%201.79561%209.17806%201.65453%208.9745C1.51275%208.76384%201.30951%208.6545%201.04482%208.6465H0.666626V7.35317H1.06367C1.32767%207.34517%201.52777%207.23939%201.66396%207.03584C1.79875%206.83317%201.86615%206.52028%201.86615%206.09717L1.85777%204.98117C1.85777%204.3385%201.9992%203.83717%202.28205%203.47717C2.5712%203.10917%203.0325%202.83895%203.66596%202.6665L3.93415%203.84117C3.74211%203.9205%203.55652%204.0232%203.37996%204.14784C3.25539%204.24259%203.15834%204.38623%203.10339%204.55717C3.0545%204.7225%203.03005%204.94961%203.03005%205.2385L3.04786%206.26117C3.04786%206.7145%202.94659%207.0945%202.74405%207.40117C2.5464%207.70606%202.2384%207.92517%201.82005%208.0585V7.92917C2.2391%208.0785%202.54675%208.30561%202.74301%208.6105C2.94625%208.91628%203.04786%209.29228%203.04786%209.7385L3.02901%2010.7598C3.02901%2011.0345%203.0538%2011.2501%203.10339%2011.4065C3.16029%2011.5735%203.25705%2011.7134%203.37996%2011.8065C3.51615%2011.9078%203.70088%2012.0096%203.93415%2012.1118L3.66596%2013.3332ZM4.91158%2013.1692V2.71317H7.53272V4.09984H6.09329L6.14882%204.0065V11.9238L6.05558%2011.7825H7.53272V13.1692H4.91158ZM8.45672%2013.1692V11.7825H9.89615L9.84063%2011.8758V3.95984L9.93282%204.10117H8.45567V2.7145H11.0779V13.1705L8.45672%2013.1692ZM12.334%2013.3332L12.0563%2012.1585C12.2903%2012.0572%2012.4719%2011.9549%2012.6011%2011.8518C12.7258%2011.7567%2012.8229%2011.6126%2012.8777%2011.4412C12.9398%2011.2776%2012.9706%2011.0509%2012.9699%2010.7612L12.9521%209.7385C12.9521%209.28517%2013.0505%208.90517%2013.2475%208.5985C13.45%208.29362%2013.7573%208.0745%2014.1694%207.94117L14.1799%208.0705C13.7608%207.92117%2013.45%207.69406%2013.2475%207.38917C13.0476%207.06926%2012.943%206.66974%2012.9521%206.26117L12.9709%205.2385C12.9709%204.95761%2012.943%204.7385%2012.8871%204.58117C12.8278%204.41959%2012.7314%204.28475%2012.6105%204.1945C12.4353%204.06644%2012.2494%203.96358%2012.0563%203.88784L12.334%202.6665C12.6482%202.74473%2012.9157%202.8505%2013.1364%202.98384C13.3641%203.10828%2013.552%203.26473%2013.7001%203.45317C13.8537%203.63362%2013.9644%203.85317%2014.0322%204.11184C14.1055%204.3625%2014.1425%204.65228%2014.1432%204.98117L14.1327%206.09717C14.1327%206.51139%2014.2036%206.82428%2014.3454%207.03584C14.4872%207.24028%2014.6904%207.34606%2014.9551%207.35317H15.3333V8.6465H14.9362C14.6722%208.65361%2014.4725%208.75895%2014.337%208.9625C14.2008%209.16695%2014.1331%209.48028%2014.1338%209.9025L14.1421%2011.0185C14.1421%2011.6612%2013.9976%2012.1625%2013.7084%2012.5225C13.4193%2012.8905%2012.9611%2013.1607%2012.334%2013.3332Z'%20fill='%23A074C4'/%3e%3c/g%3e%3c/svg%3e\",\n  R2 =\n    \"data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20id='Misc/color-mode'%3e%3cpath%20id='Vector'%20d='M8%201C6.61553%201%205.26216%201.41054%204.11101%202.17971C2.95987%202.94888%202.06266%204.04213%201.53285%205.32122C1.00303%206.6003%200.86441%208.00776%201.13451%209.36563C1.4046%2010.7235%202.07129%2011.9708%203.05026%2012.9497C4.02922%2013.9287%205.2765%2014.5954%206.63437%2014.8655C7.99224%2015.1356%209.3997%2014.997%2010.6788%2014.4672C11.9579%2013.9373%2013.0511%2013.0401%2013.8203%2011.889C14.5895%2010.7378%2015%209.38447%2015%208C15%206.14348%2014.2625%204.36301%2012.9497%203.05025C11.637%201.7375%209.85652%201%208%201ZM8%2014V2C9.5913%202%2011.1174%202.63214%2012.2426%203.75736C13.3679%204.88258%2014%206.4087%2014%208C14%209.5913%2013.3679%2011.1174%2012.2426%2012.2426C11.1174%2013.3679%209.5913%2014%208%2014Z'%20fill='white'/%3e%3c/g%3e%3c/svg%3e\",\n  I2 =\n    \"data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20id='Search/case-sensitive'%3e%3cpath%20id='Union'%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M7.495%209.052L8.386%2011.402H9.477L6.237%203H5.217L2%2011.402H3.095L3.933%209.052H7.495ZM5.811%204.453L5.855%204.588L7.173%208.162H4.255L5.562%204.588L5.606%204.453L5.644%204.297L5.676%204.145L5.697%204.019H5.72L5.744%204.145L5.773%204.297L5.811%204.453ZM13.795%2010.464V11.4H14.755V7.498C14.755%206.779%2014.575%206.226%2014.216%205.837C13.857%205.448%2013.327%205.254%2012.628%205.254C12.429%205.254%2012.227%205.273%2012.022%205.31C11.817%205.347%2011.622%205.394%2011.439%205.451C11.256%205.508%2011.091%205.569%2010.944%205.636C10.797%205.703%2010.683%205.765%2010.601%205.824V6.808C10.867%206.578%2011.167%206.397%2011.505%206.268C11.843%206.139%2012.194%206.075%2012.557%206.075C12.745%206.075%2012.915%206.103%2013.07%206.16C13.225%206.217%2013.357%206.306%2013.466%206.427C13.575%206.548%2013.659%206.706%2013.718%206.899C13.777%207.092%2013.806%207.326%2013.806%207.599L11.995%207.851C11.651%207.898%2011.355%207.977%2011.107%208.088C10.859%208.199%2010.654%208.339%2010.492%208.507C10.33%208.675%2010.21%208.868%2010.132%209.087C10.054%209.306%2010.015%209.546%2010.015%209.808C10.015%2010.054%2010.057%2010.283%2010.139%2010.496C10.221%2010.709%2010.342%2010.893%2010.502%2011.047C10.662%2011.201%2010.862%2011.323%2011.1%2011.413C11.338%2011.503%2011.613%2011.548%2011.926%2011.548C12.328%2011.548%2012.686%2011.456%2013.001%2011.27C13.316%2011.084%2013.573%2010.816%2013.772%2010.464H13.795ZM11.667%208.721C11.843%208.657%2012.068%208.607%2012.341%208.572L13.806%208.367V8.976C13.806%209.222%2013.765%209.451%2013.683%209.664C13.601%209.877%2013.486%2010.063%2013.34%2010.221C13.194%2010.379%2013.019%2010.503%2012.816%2010.593C12.613%2010.683%2012.39%2010.728%2012.148%2010.728C11.961%2010.728%2011.795%2010.703%2011.653%2010.652C11.511%2010.601%2011.392%2010.53%2011.296%2010.441C11.2%2010.352%2011.127%2010.247%2011.076%2010.125C11.025%2010.003%2011%209.873%2011%209.732C11%209.568%2011.018%209.421%2011.055%209.292C11.092%209.163%2011.16%209.051%2011.257%208.958C11.354%208.865%2011.491%208.785%2011.667%208.721Z'%20fill='%23247EFE'/%3e%3c/g%3e%3c/svg%3e\",\n  H2 =\n    \"data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20id='Common/split-horizontal'%3e%3cpath%20id='Vector'%20d='M14%201H3L2%202V13L3%2014H14L15%2013V2L14%201ZM8%2013H3V2H8V13ZM14%2013H9V2H14V13Z'%20fill='white'/%3e%3c/g%3e%3c/svg%3e\",\n  St = ({ icon: e, className: t = \"\", ...n }) =>\n    /* @__PURE__ */ f.jsx(\"i\", {\n      className: `${t} codicon codicon-${e}`,\n      ...n,\n    }),\n  Ld = (e) => /* @__PURE__ */ f.jsx(St, { icon: \"code\", ...e }),\n  Dd = (e) => /* @__PURE__ */ f.jsx(St, { icon: \"add\", ...e }),\n  Cc = (e) => /* @__PURE__ */ f.jsx(St, { icon: \"trash\", ...e }),\n  M8 = (e) => /* @__PURE__ */ f.jsx(St, { icon: \"comment-unresolved\", ...e }),\n  T8 = (e) => /* @__PURE__ */ f.jsx(St, { icon: \"check\", ...e }),\n  z2 = (e) => /* @__PURE__ */ f.jsx(St, { icon: \"pass-filled\", ...e }),\n  O8 = (e) => /* @__PURE__ */ f.jsx(St, { icon: \"debug-restart\", ...e }),\n  N8 = (e) => /* @__PURE__ */ f.jsx(St, { icon: \"gear\", ...e }),\n  ir = (e) => /* @__PURE__ */ f.jsx(St, { icon: \"chevron-up\", ...e }),\n  ar = (e) => /* @__PURE__ */ f.jsx(St, { icon: \"chevron-down\", ...e }),\n  L8 = (e) => /* @__PURE__ */ f.jsx(St, { icon: \"info\", ...e }),\n  D8 = (e) => /* @__PURE__ */ f.jsx(St, { icon: \"send\", ...e }),\n  jd = (e) => /* @__PURE__ */ f.jsx(St, { icon: \"pencil\", ...e }),\n  P2 = (e) => /* @__PURE__ */ f.jsx(St, { icon: \"share\", ...e }),\n  j8 = ({ pos: e, onAddComment: t }) =>\n    Hn(\n      /* @__PURE__ */ f.jsx(S8, {\n        children:\n          e &&\n          /* @__PURE__ */ f.jsx(Re, {\n            onClick: t,\n            id: `${ta}-highlight`,\n            style: {\n              position: \"absolute\",\n              top: e.y,\n              left: e.x,\n              // right: \"15px\",\n              zIndex: N6 + 5,\n              cursor: \"pointer\",\n              background: \"#007AFF\",\n              width: 26,\n              height: 26,\n              borderRadius: \"100%\",\n              boxShadow: \"none\",\n              border: \"none\",\n              display: \"flex\",\n              justifyContent: \"center\",\n              alignItems: \"center\",\n              fontSize: \"13px\",\n              fontWeight: \"bold\",\n              color: \"#fff\",\n              padding: 0,\n            },\n            children: /* @__PURE__ */ f.jsx(Dd, {}),\n          }),\n      }),\n      e.element.parentElement,\n    ),\n  F8 = () => {\n    const {\n        state: { isRightPanelOpen: e },\n      } = h8(),\n      t = Bt(),\n      n = () => {\n        t(mc(!e));\n      };\n    return /* @__PURE__ */ f.jsx(Re, {\n      onClick: n,\n      children: e ? \"Hide conversations\" : \"Show conversations\",\n    });\n  },\n  R8 = (e) => Te.get(`dbt/dbt_docs_share/${e}`),\n  I8 = (e, t, n) =>\n    Te.post(`dbt/dbt_docs_share/${e}/conversation_group`, {\n      ...t,\n      telemetry: {\n        eventName: \"dbtCollaboration:create\",\n        properties: { source: n },\n      },\n    }),\n  H8 = (e, t, n, o) =>\n    Te.post(`dbt/dbt_docs_share/${e}/conversation_group/${t}/conversation`, {\n      ...n,\n      telemetry: {\n        eventName: \"dbtCollaboration:reply\",\n        properties: { source: o },\n      },\n    }),\n  z8 = (e) => Te.get(`dbt/dbt_docs_share/${e}/conversations`),\n  P8 = (e) => Te.get(\"users/chat\", { company: e }),\n  B8 = (e, t, n) =>\n    Te.post(`dbt/dbt_docs_share/${e}/conversation_group/${t}/resolve`, {\n      resolved: !0,\n      telemetry: {\n        eventName: \"dbtCollaboration:resolve\",\n        properties: { source: n },\n      },\n    }),\n  V8 = () => {\n    const e = He((l) => l.shareId),\n      [t, n] = se(null),\n      [o, r] = se(!1),\n      i = Bt();\n    ue(() => {\n      t != null &&\n        t.manifest_presigned_url &&\n        fetch(t.manifest_presigned_url)\n          .then((l) => l.json())\n          .then((l) => {\n            i(d8(l));\n          })\n          .catch((l) =>\n            console.error(\n              \"error loading manifest\",\n              l,\n              t.manifest_presigned_url,\n            ),\n          );\n    }, [i, t == null ? void 0 : t.manifest_presigned_url]);\n    const a = Oe(async () => {\n      if (!e) return;\n      r(!0);\n      const l = await R8(e);\n      if (l) {\n        n(l);\n        const s = document.getElementById(\"collapse-sidebar\");\n        s == null || s.click();\n      }\n      r(!1);\n    }, [e]);\n    return (\n      ue(() => {\n        !e || t || o || a();\n      }, [e, t, a, o]),\n      { shareDetails: t, loading: o }\n    );\n  },\n  $8 = () => {\n    const e = He((c) =>\n        c.selectedConversationId\n          ? c.conversations[c.selectedConversationId]\n          : null,\n      ),\n      t = He((c) => c.docsAppRendered),\n      n = He((c) => c.newConversation),\n      o = Bt(),\n      [r, i] = se(null),\n      [a, l] = se(null);\n    ue(() => {\n      n && (i(null), l(null));\n    }, [n]);\n    const s = Oe(() => {\n      console.log(\"resetHighlights\"), r && D6(r), l(null), i(null);\n    }, [r]);\n    return (\n      ue(() => {\n        !e ||\n          !t ||\n          (e.meta.resource_type &&\n            e.meta.uniqueId &&\n            (window.location.hash = `#!/${e.meta.resource_type}/${e.meta.uniqueId}`));\n      }, [e, t, o]),\n      {\n        getHighlightedSelectionData: () => r,\n        pos: a,\n        onSelectionEnd: (c) => {\n          const d = c.target,\n            p = F6(d),\n            { end: h, start: m } = c.detail.selectionRange,\n            b = document.getSelection();\n          if (!b || !b.rangeCount) return s(), null;\n          const g = b.getRangeAt(0).toString(),\n            x = d == null ? void 0 : d.innerText;\n          if (!g || !x) return;\n          const { end: v, start: S, x: w, y: E } = R6(p, d, g, h, m);\n          console.log(\"selection range\", v, S, w, E);\n          const M = {\n            meta: {\n              filePath: \"\",\n              field: p,\n              highlight: g,\n              range: {\n                end: { line: v, character: 0 },\n                start: { line: S, character: 0 },\n              },\n            },\n          };\n          o(bc()),\n            l({\n              x: w,\n              y: E,\n              element: d,\n            }),\n            document.body.addEventListener(\"click\", s, { once: !0 }),\n            i(M);\n        },\n      }\n    );\n  },\n  W8 = ({ conversationGroup: e }) => {\n    const t = He((l) => l.selectedConversationId),\n      n = Bt(),\n      o = he(null),\n      r = ze(() => j6(e.meta), [e.meta]),\n      i = () => {\n        n(gc(e.conversation_group_id));\n      },\n      a = ze(() => {\n        if (!r) return;\n        if (e.meta.field === \"description\")\n          return { top: 0, bottom: r.offsetHeight };\n        let l = 0,\n          s = 0;\n        for (let u = e.meta.range.start.line; u <= e.meta.range.end.line; u++) {\n          const c = r.querySelector(\n            `.line-numbers-rows > span:nth-child(${u + 1})`,\n          );\n          c &&\n            (u === e.meta.range.start.line && (l = c.offsetTop + 15),\n            u === e.meta.range.end.line && (s = c.offsetTop + c.offsetHeight));\n        }\n        return { top: l, bottom: s };\n      }, [r, e.meta.field, e.meta.range.start.line, e.meta.range.end.line]);\n    return (\n      ue(() => {\n        var l;\n        t === e.conversation_group_id &&\n          ((l = o.current) == null ||\n            l.scrollIntoView({\n              behavior: \"smooth\",\n              block: \"center\",\n            }));\n      }, [e.conversation_group_id, t]),\n      !a || !(r != null && r.parentElement)\n        ? null\n        : Hn(\n            /* @__PURE__ */ f.jsx(\"div\", {\n              ref: o,\n              className: `altimate-highlighter ${t === e.conversation_group_id ? \"active\" : \"\"}`,\n              style: { top: a.top, height: a.bottom - a.top },\n              onClick: i,\n              children: /* @__PURE__ */ f.jsx(M8, {}),\n            }),\n            r.parentElement,\n          )\n    );\n  },\n  Z8 = () => {\n    const e = He((r) => Object.values(r.conversations || {})),\n      t = He((r) => r.codeblockLoaded),\n      n = He((r) => r.currentPage),\n      o =\n        e == null\n          ? void 0\n          : e.filter(\n              (r) =>\n                r.meta.resource_type === n.resourceType &&\n                r.meta.uniqueId === n.name,\n            );\n    return !(o != null && o.length) || !t\n      ? null\n      : /* @__PURE__ */ f.jsx(f.Fragment, {\n          children: o.map((r) =>\n            /* @__PURE__ */ f.jsx(\n              W8,\n              {\n                conversationGroup: r,\n              },\n              r.conversation_group_id,\n            ),\n          ),\n        });\n  },\n  U8 = \"_dbtDocs_14zop_9\",\n  q8 = \"_hotspotButton_14zop_46\",\n  Y8 = \"_pulse_14zop_1\",\n  G8 = \"_conversationRightPanelCloseButton_14zop_62\",\n  K8 = \"_conversationRightPanel_14zop_62\",\n  X8 = \"_newConversationForm_14zop_94\",\n  Q8 = \"_highlightText_14zop_108\",\n  J8 = \"_conversationInputForm_14zop_130\",\n  e7 = \"_conversationGroup_14zop_156\",\n  t7 = \"_replyForm_14zop_189\",\n  n7 = \"_resolveButton_14zop_237\",\n  xn = {\n    dbtDocs: U8,\n    hotspotButton: q8,\n    pulse: Y8,\n    conversationRightPanelCloseButton: G8,\n    conversationRightPanel: K8,\n    newConversationForm: X8,\n    highlightText: Q8,\n    conversationInputForm: J8,\n    conversationGroup: e7,\n    replyForm: t7,\n    resolveButton: n7,\n  },\n  o7 = \"_profileImage_11vaf_1\",\n  r7 = {\n    profileImage: o7,\n  },\n  Fd = ({ user: e }) => {\n    var t;\n    return /* @__PURE__ */ f.jsx(\"div\", {\n      className: r7.profileImage,\n      children:\n        ((t = e == null ? void 0 : e.first_name) == null ? void 0 : t[0]) || \"\",\n    });\n  };\nfunction i7(e) {\n  if (Array.isArray(e)) {\n    for (var t = 0, n = new Array(e.length); t < e.length; t++) n[t] = e[t];\n    return n;\n  }\n}\nfunction a7(e) {\n  if (\n    Symbol.iterator in Object(e) ||\n    Object.prototype.toString.call(e) === \"[object Arguments]\"\n  )\n    return Array.from(e);\n}\nfunction l7() {\n  throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n}\nfunction Di(e) {\n  return i7(e) || a7(e) || l7();\n}\nfunction zt() {\n  return (\n    (zt =\n      Object.assign ||\n      function (e) {\n        for (var t = 1; t < arguments.length; t++) {\n          var n = arguments[t];\n          for (var o in n)\n            Object.prototype.hasOwnProperty.call(n, o) && (e[o] = n[o]);\n        }\n        return e;\n      }),\n    zt.apply(this, arguments)\n  );\n}\nfunction s7(e, t) {\n  if (!(e instanceof t))\n    throw new TypeError(\"Cannot call a class as a function\");\n}\nfunction c7(e, t) {\n  for (var n = 0; n < t.length; n++) {\n    var o = t[n];\n    (o.enumerable = o.enumerable || !1),\n      (o.configurable = !0),\n      \"value\" in o && (o.writable = !0),\n      Object.defineProperty(e, o.key, o);\n  }\n}\nfunction u7(e, t, n) {\n  return t && c7(e.prototype, t), e;\n}\nfunction ve(e) {\n  if (e === void 0)\n    throw new ReferenceError(\n      \"this hasn't been initialised - super() hasn't been called\",\n    );\n  return e;\n}\nfunction ys(e, t) {\n  return (\n    (ys =\n      Object.setPrototypeOf ||\n      function (o, r) {\n        return (o.__proto__ = r), o;\n      }),\n    ys(e, t)\n  );\n}\nfunction d7(e, t) {\n  if (typeof t != \"function\" && t !== null)\n    throw new TypeError(\"Super expression must either be null or a function\");\n  (e.prototype = Object.create(t && t.prototype, {\n    constructor: {\n      value: e,\n      writable: !0,\n      configurable: !0,\n    },\n  })),\n    t && ys(e, t);\n}\nfunction bo(e) {\n  return (\n    typeof Symbol == \"function\" && typeof Symbol.iterator == \"symbol\"\n      ? (bo = function (n) {\n          return typeof n;\n        })\n      : (bo = function (n) {\n          return n &&\n            typeof Symbol == \"function\" &&\n            n.constructor === Symbol &&\n            n !== Symbol.prototype\n            ? \"symbol\"\n            : typeof n;\n        }),\n    bo(e)\n  );\n}\nfunction yi(e) {\n  return (\n    typeof Symbol == \"function\" && bo(Symbol.iterator) === \"symbol\"\n      ? (yi = function (n) {\n          return bo(n);\n        })\n      : (yi = function (n) {\n          return n &&\n            typeof Symbol == \"function\" &&\n            n.constructor === Symbol &&\n            n !== Symbol.prototype\n            ? \"symbol\"\n            : bo(n);\n        }),\n    yi(e)\n  );\n}\nfunction f7(e, t) {\n  return t && (yi(t) === \"object\" || typeof t == \"function\") ? t : ve(e);\n}\nfunction ji(e) {\n  return (\n    (ji = Object.setPrototypeOf\n      ? Object.getPrototypeOf\n      : function (n) {\n          return n.__proto__ || Object.getPrototypeOf(n);\n        }),\n    ji(e)\n  );\n}\nfunction be(e, t, n) {\n  return (\n    t in e\n      ? Object.defineProperty(e, t, {\n          value: n,\n          enumerable: !0,\n          configurable: !0,\n          writable: !0,\n        })\n      : (e[t] = n),\n    e\n  );\n}\nvar h7 = function (e, t, n, o, r, i, a, l) {\n    if (process.env.NODE_ENV !== \"production\" && t === void 0)\n      throw new Error(\"invariant requires an error message argument\");\n    if (!e) {\n      var s;\n      if (t === void 0)\n        s = new Error(\n          \"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\",\n        );\n      else {\n        var u = [n, o, r, i, a, l],\n          c = 0;\n        (s = new Error(\n          t.replace(/%s/g, function () {\n            return u[c++];\n          }),\n        )),\n          (s.name = \"Invariant Violation\");\n      }\n      throw ((s.framesToPop = 1), s);\n    }\n  },\n  p7 = h7;\nconst Ao = /* @__PURE__ */ fn(p7);\nfunction g7(e) {\n  if (Array.isArray(e)) return e;\n}\nfunction m7(e, t) {\n  var n = [],\n    o = !0,\n    r = !1,\n    i = void 0;\n  try {\n    for (\n      var a = e[Symbol.iterator](), l;\n      !(o = (l = a.next()).done) && (n.push(l.value), !(t && n.length === t));\n      o = !0\n    );\n  } catch (s) {\n    (r = !0), (i = s);\n  } finally {\n    try {\n      !o && a.return != null && a.return();\n    } finally {\n      if (r) throw i;\n    }\n  }\n  return n;\n}\nfunction b7() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\nfunction Fi(e, t) {\n  return g7(e) || m7(e, t) || b7();\n}\nfunction y7(e, t) {\n  if (e == null) return {};\n  var n = {},\n    o = Object.keys(e),\n    r,\n    i;\n  for (i = 0; i < o.length; i++)\n    (r = o[i]), !(t.indexOf(r) >= 0) && (n[r] = e[r]);\n  return n;\n}\nfunction C7(e, t) {\n  if (e == null) return {};\n  var n = y7(e, t),\n    o,\n    r;\n  if (Object.getOwnPropertySymbols) {\n    var i = Object.getOwnPropertySymbols(e);\n    for (r = 0; r < i.length; r++)\n      (o = i[r]),\n        !(t.indexOf(o) >= 0) &&\n          Object.prototype.propertyIsEnumerable.call(e, o) &&\n          (n[o] = e[o]);\n  }\n  return n;\n}\nfunction pr(e) {\n  \"@babel/helpers - typeof\";\n  return (\n    (pr =\n      typeof Symbol == \"function\" && typeof Symbol.iterator == \"symbol\"\n        ? function (t) {\n            return typeof t;\n          }\n        : function (t) {\n            return t &&\n              typeof Symbol == \"function\" &&\n              t.constructor === Symbol &&\n              t !== Symbol.prototype\n              ? \"symbol\"\n              : typeof t;\n          }),\n    pr(e)\n  );\n}\nfunction v7(e, t) {\n  if (pr(e) != \"object\" || !e) return e;\n  var n = e[Symbol.toPrimitive];\n  if (n !== void 0) {\n    var o = n.call(e, t || \"default\");\n    if (pr(o) != \"object\") return o;\n    throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n  }\n  return (t === \"string\" ? String : Number)(e);\n}\nfunction x7(e) {\n  var t = v7(e, \"string\");\n  return pr(t) == \"symbol\" ? t : t + \"\";\n}\nfunction gr(e, t, n) {\n  return (\n    (t = x7(t)) in e\n      ? Object.defineProperty(e, t, {\n          value: n,\n          enumerable: !0,\n          configurable: !0,\n          writable: !0,\n        })\n      : (e[t] = n),\n    e\n  );\n}\nfunction Cs(e, t) {\n  (t == null || t > e.length) && (t = e.length);\n  for (var n = 0, o = Array(t); n < t; n++) o[n] = e[n];\n  return o;\n}\nfunction w7(e) {\n  if (Array.isArray(e)) return Cs(e);\n}\nfunction E7(e) {\n  if (\n    (typeof Symbol < \"u\" && e[Symbol.iterator] != null) ||\n    e[\"@@iterator\"] != null\n  )\n    return Array.from(e);\n}\nfunction S7(e, t) {\n  if (e) {\n    if (typeof e == \"string\") return Cs(e, t);\n    var n = {}.toString.call(e).slice(8, -1);\n    return (\n      n === \"Object\" && e.constructor && (n = e.constructor.name),\n      n === \"Map\" || n === \"Set\"\n        ? Array.from(e)\n        : n === \"Arguments\" ||\n            /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)\n          ? Cs(e, t)\n          : void 0\n    );\n  }\n}\nfunction k7() {\n  throw new TypeError(`Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);\n}\nfunction bn(e) {\n  return w7(e) || E7(e) || S7(e) || k7();\n}\nvar Ho = function (t) {\n    return t === Object(t) ? Object.keys(t) : [];\n  },\n  Rd = function (t) {\n    return t === Object(t) ? Object.values(t) : [];\n  };\nfunction Id(e, t) {\n  var n = Object.assign({}, e);\n  return (\n    Ci(e) &&\n      Ci(t) &&\n      Ho(t).forEach(function (o) {\n        Ci(t[o])\n          ? o in e\n            ? (n[o] = Id(e[o], t[o]))\n            : Object.assign(n, gr({}, o, t[o]))\n          : Object.assign(n, gr({}, o, t[o]));\n      }),\n    n\n  );\n}\nvar vs = function (t) {\n    for (\n      var n = arguments.length, o = new Array(n > 1 ? n - 1 : 0), r = 1;\n      r < n;\n      r++\n    )\n      o[r - 1] = arguments[r];\n    return o.reduce(function (i, a) {\n      return Id(i, a);\n    }, t);\n  },\n  _7 = function (t, n) {\n    var o = Object.assign({}, t);\n    if (n) for (var r = 0; r < n.length; r++) delete o[n[r]];\n    return o;\n  },\n  Ci = function (t) {\n    return t === Object(t) && !(t instanceof Date) && !Array.isArray(t);\n  },\n  A7 = function (t) {\n    return (t || []).filter(Boolean);\n  },\n  vc = function (t) {\n    return t[0] === \"&\";\n  },\n  M7 = function (t) {\n    return !vc(t);\n  },\n  B2 = function (t) {\n    return t.replace(/-(\\w)/g, function (n, o) {\n      return o.toUpperCase();\n    });\n  },\n  T7 = function (t) {\n    for (\n      var n =\n          arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [],\n        o = Ho(t),\n        r = {},\n        i = 0,\n        a = o.length;\n      i < a;\n      i += 1\n    ) {\n      var l = o[i],\n        s =\n          Object.prototype.toString.call(t[l]) !== \"[object Object]\" || // style defs\n          l[0] === \":\" || // pseudo selectors\n          l[0] === \"@\" || // @media / @keyframes / @supports / @font-face\n          n.indexOf(l) >= 0;\n      s && (r[l] = t[l]);\n    }\n    return r;\n  },\n  Hd = function (t, n) {\n    for (\n      var o = n.map(B2), r = Ho(t), i = {}, a = 0, l = r.length;\n      a < l;\n      a += 1\n    ) {\n      var s = r[a];\n      (n.indexOf(s) >= 0 || o.indexOf(B2(s)) >= 0) && (i[s] = t[s]);\n    }\n    return i;\n  },\n  O7 = function e(t, n) {\n    for (\n      var o = vs.apply(void 0, [{}, _7(t, n)].concat(bn(Rd(Hd(t, n))))),\n        r = Ho(o).filter(vc),\n        i = 0,\n        a = r.length;\n      i < a;\n      i += 1\n    ) {\n      var l = r[i],\n        s = e(o[l], n);\n      n.indexOf(l) >= 0 ? (delete o[l], (o = vs({}, o, s))) : (o[l] = s);\n    }\n    return o;\n  };\nfunction V2(e, t) {\n  var n = Object.keys(e);\n  if (Object.getOwnPropertySymbols) {\n    var o = Object.getOwnPropertySymbols(e);\n    t &&\n      (o = o.filter(function (r) {\n        return Object.getOwnPropertyDescriptor(e, r).enumerable;\n      })),\n      n.push.apply(n, o);\n  }\n  return n;\n}\nfunction $2(e) {\n  for (var t = 1; t < arguments.length; t++) {\n    var n = arguments[t] != null ? arguments[t] : {};\n    t % 2\n      ? V2(Object(n), !0).forEach(function (o) {\n          gr(e, o, n[o]);\n        })\n      : Object.getOwnPropertyDescriptors\n        ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n))\n        : V2(Object(n)).forEach(function (o) {\n            Object.defineProperty(e, o, Object.getOwnPropertyDescriptor(n, o));\n          });\n  }\n  return e;\n}\nvar N7 = [\"animationName\"],\n  zd = function (t) {\n    var n = t.style,\n      o = t.className;\n    return $2(\n      $2(\n        {},\n        n\n          ? {\n              style: T7(n, N7),\n            }\n          : {},\n      ),\n      o\n        ? {\n            className: o,\n          }\n        : {},\n    );\n  },\n  Pd = /* @__PURE__ */ Pt(zd);\nPd.Provider;\nvar Bd = function (t) {\n    if (t) {\n      if (typeof t == \"string\") return [t];\n      if (!Array.isArray(t)) {\n        var n = t;\n        return Ho(t).reduce(function (o, r) {\n          return o.concat(n[r] ? [r] : []);\n        }, []);\n      }\n    } else return [];\n    return t;\n  },\n  L7 = {},\n  D7 = function (t) {\n    return function (n, o) {\n      var r = o || L7;\n      t.memoize = t.memoize || /* @__PURE__ */ new WeakMap();\n      var i;\n      t.memoize.has(r)\n        ? (i = t.memoize.get(r))\n        : ((i = {}), t.memoize.set(r, i));\n      var a = Bd(n).join(\" \");\n      return a in i ? i[a] : (i[a] = t(n || [], o));\n    };\n  };\nfunction W2(e, t) {\n  var n = Object.keys(e);\n  if (Object.getOwnPropertySymbols) {\n    var o = Object.getOwnPropertySymbols(e);\n    t &&\n      (o = o.filter(function (r) {\n        return Object.getOwnPropertyDescriptor(e, r).enumerable;\n      })),\n      n.push.apply(n, o);\n  }\n  return n;\n}\nfunction lo(e) {\n  for (var t = 1; t < arguments.length; t++) {\n    var n = arguments[t] != null ? arguments[t] : {};\n    t % 2\n      ? W2(Object(n), !0).forEach(function (o) {\n          gr(e, o, n[o]);\n        })\n      : Object.getOwnPropertyDescriptors\n        ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n))\n        : W2(Object(n)).forEach(function (o) {\n            Object.defineProperty(e, o, Object.getOwnPropertyDescriptor(n, o));\n          });\n  }\n  return e;\n}\nvar j7 = function (t) {\n    var n = t && Ho(t)[0];\n    return n && n.split(\"__\")[0].split(\"--\")[0];\n  },\n  F7 = function (t, n, o) {\n    if (t) {\n      var r = t.split(\" \")[0],\n        i = [].concat(\n          bn(\n            n.length === 0\n              ? o.map(function (a) {\n                  return \"\".concat(r, \"--\").concat(a.substring(1));\n                })\n              : [],\n          ),\n          bn(\n            n.map(function (a) {\n              return \"\".concat(r, \"__\").concat(a);\n            }),\n          ),\n        );\n      return n.length === 0 ? [t].concat(bn(i)) : i;\n    }\n  };\nfunction Vd(e) {\n  var t = e.style,\n    n = e.className,\n    o = e.classNames,\n    r = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : zd,\n    i = n || j7(o) || (t == null ? void 0 : t.className),\n    a =\n      typeof t == \"function\"\n        ? t\n        : D7(function (d, p) {\n            var h = Bd(d);\n            Ao(\n              Array.isArray(h),\n              \"First parameter must be a string, an array of strings, a plain object with boolean values, or a falsy value.\",\n            ),\n              Ao(\n                !p || Ci(p),\n                \"Optional second parameter must be a plain object.\",\n              );\n            var m = h.filter(vc),\n              b = h.filter(M7),\n              y =\n                b.length > 0\n                  ? function (v) {\n                      return Rd(Hd(v, b));\n                    }\n                  : function (v) {\n                      return [v];\n                    },\n              g = function () {\n                var S =\n                  arguments.length > 0 && arguments[0] !== void 0\n                    ? arguments[0]\n                    : {};\n                return y(O7(S, m));\n              },\n              x = F7(i, b, m);\n            return Vd(\n              lo(\n                lo(\n                  lo(\n                    {},\n                    (t || p) && {\n                      style: vs.apply(void 0, [{}].concat(bn(g(p)), bn(g(t)))),\n                    },\n                  ),\n                  x && {\n                    className: x.join(\" \"),\n                  },\n                ),\n                o && {\n                  classNames: o,\n                },\n              ),\n              r,\n            );\n          }),\n    l = lo(\n      {},\n      typeof t == \"function\"\n        ? t\n        : {\n            style: t,\n          },\n    ),\n    s = bn(\n      new Set(\n        [].concat(\n          bn(l.className ? l.className.split(\" \") : []),\n          bn(i ? i.split(\" \") : []),\n        ),\n      ),\n    ),\n    u = o\n      ? A7(\n          s.map(function (d) {\n            return o[d];\n          }),\n        )\n      : s,\n    c = r(\n      lo(\n        lo({}, l),\n        u.length > 0\n          ? {\n              className: u.join(\" \"),\n            }\n          : {},\n      ),\n    );\n  return Object.assign(a, c), a;\n}\nfunction Z2(e, t) {\n  var n = Object.keys(e);\n  if (Object.getOwnPropertySymbols) {\n    var o = Object.getOwnPropertySymbols(e);\n    t &&\n      (o = o.filter(function (r) {\n        return Object.getOwnPropertyDescriptor(e, r).enumerable;\n      })),\n      n.push.apply(n, o);\n  }\n  return n;\n}\nfunction Uo(e) {\n  for (var t = 1; t < arguments.length; t++) {\n    var n = arguments[t] != null ? arguments[t] : {};\n    t % 2\n      ? Z2(Object(n), !0).forEach(function (o) {\n          gr(e, o, n[o]);\n        })\n      : Object.getOwnPropertyDescriptors\n        ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n))\n        : Z2(Object(n)).forEach(function (o) {\n            Object.defineProperty(e, o, Object.getOwnPropertyDescriptor(n, o));\n          });\n  }\n  return e;\n}\nvar R7 = function () {\n    for (var t = arguments.length, n = new Array(t), o = 0; o < t; o++)\n      n[o] = arguments[o];\n    return n.reduce(function (r, i) {\n      return Uo(\n        Uo(Uo({}, r), typeof i == \"function\" ? i : {}),\n        {},\n        {\n          style: Uo(Uo({}, r.style), typeof i == \"function\" ? i.style : i),\n        },\n      );\n    }, {});\n  },\n  xc = function (t, n, o) {\n    var r = n.style,\n      i = n.className,\n      a = n.classNames,\n      l = Xe(Pd),\n      s = ze(\n        function () {\n          return Vd(\n            {\n              style: r,\n              className: i,\n              classNames: a,\n            },\n            l,\n          );\n        },\n        [r, i, a, l],\n      );\n    return s(o, t);\n  },\n  xs = { exports: {} },\n  Xr = { exports: {} },\n  Le = {};\n/** @license React v16.13.1\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar U2;\nfunction I7() {\n  if (U2) return Le;\n  U2 = 1;\n  var e = typeof Symbol == \"function\" && Symbol.for,\n    t = e ? Symbol.for(\"react.element\") : 60103,\n    n = e ? Symbol.for(\"react.portal\") : 60106,\n    o = e ? Symbol.for(\"react.fragment\") : 60107,\n    r = e ? Symbol.for(\"react.strict_mode\") : 60108,\n    i = e ? Symbol.for(\"react.profiler\") : 60114,\n    a = e ? Symbol.for(\"react.provider\") : 60109,\n    l = e ? Symbol.for(\"react.context\") : 60110,\n    s = e ? Symbol.for(\"react.async_mode\") : 60111,\n    u = e ? Symbol.for(\"react.concurrent_mode\") : 60111,\n    c = e ? Symbol.for(\"react.forward_ref\") : 60112,\n    d = e ? Symbol.for(\"react.suspense\") : 60113,\n    p = e ? Symbol.for(\"react.suspense_list\") : 60120,\n    h = e ? Symbol.for(\"react.memo\") : 60115,\n    m = e ? Symbol.for(\"react.lazy\") : 60116,\n    b = e ? Symbol.for(\"react.block\") : 60121,\n    y = e ? Symbol.for(\"react.fundamental\") : 60117,\n    g = e ? Symbol.for(\"react.responder\") : 60118,\n    x = e ? Symbol.for(\"react.scope\") : 60119;\n  function v(w) {\n    if (typeof w == \"object\" && w !== null) {\n      var E = w.$$typeof;\n      switch (E) {\n        case t:\n          switch (((w = w.type), w)) {\n            case s:\n            case u:\n            case o:\n            case i:\n            case r:\n            case d:\n              return w;\n            default:\n              switch (((w = w && w.$$typeof), w)) {\n                case l:\n                case c:\n                case m:\n                case h:\n                case a:\n                  return w;\n                default:\n                  return E;\n              }\n          }\n        case n:\n          return E;\n      }\n    }\n  }\n  function S(w) {\n    return v(w) === u;\n  }\n  return (\n    (Le.AsyncMode = s),\n    (Le.ConcurrentMode = u),\n    (Le.ContextConsumer = l),\n    (Le.ContextProvider = a),\n    (Le.Element = t),\n    (Le.ForwardRef = c),\n    (Le.Fragment = o),\n    (Le.Lazy = m),\n    (Le.Memo = h),\n    (Le.Portal = n),\n    (Le.Profiler = i),\n    (Le.StrictMode = r),\n    (Le.Suspense = d),\n    (Le.isAsyncMode = function (w) {\n      return S(w) || v(w) === s;\n    }),\n    (Le.isConcurrentMode = S),\n    (Le.isContextConsumer = function (w) {\n      return v(w) === l;\n    }),\n    (Le.isContextProvider = function (w) {\n      return v(w) === a;\n    }),\n    (Le.isElement = function (w) {\n      return typeof w == \"object\" && w !== null && w.$$typeof === t;\n    }),\n    (Le.isForwardRef = function (w) {\n      return v(w) === c;\n    }),\n    (Le.isFragment = function (w) {\n      return v(w) === o;\n    }),\n    (Le.isLazy = function (w) {\n      return v(w) === m;\n    }),\n    (Le.isMemo = function (w) {\n      return v(w) === h;\n    }),\n    (Le.isPortal = function (w) {\n      return v(w) === n;\n    }),\n    (Le.isProfiler = function (w) {\n      return v(w) === i;\n    }),\n    (Le.isStrictMode = function (w) {\n      return v(w) === r;\n    }),\n    (Le.isSuspense = function (w) {\n      return v(w) === d;\n    }),\n    (Le.isValidElementType = function (w) {\n      return (\n        typeof w == \"string\" ||\n        typeof w == \"function\" ||\n        w === o ||\n        w === u ||\n        w === i ||\n        w === r ||\n        w === d ||\n        w === p ||\n        (typeof w == \"object\" &&\n          w !== null &&\n          (w.$$typeof === m ||\n            w.$$typeof === h ||\n            w.$$typeof === a ||\n            w.$$typeof === l ||\n            w.$$typeof === c ||\n            w.$$typeof === y ||\n            w.$$typeof === g ||\n            w.$$typeof === x ||\n            w.$$typeof === b))\n      );\n    }),\n    (Le.typeOf = v),\n    Le\n  );\n}\nvar De = {};\n/** @license React v16.13.1\n * react-is.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar q2;\nfunction H7() {\n  return (\n    q2 ||\n      ((q2 = 1),\n      process.env.NODE_ENV !== \"production\" &&\n        (function () {\n          var e = typeof Symbol == \"function\" && Symbol.for,\n            t = e ? Symbol.for(\"react.element\") : 60103,\n            n = e ? Symbol.for(\"react.portal\") : 60106,\n            o = e ? Symbol.for(\"react.fragment\") : 60107,\n            r = e ? Symbol.for(\"react.strict_mode\") : 60108,\n            i = e ? Symbol.for(\"react.profiler\") : 60114,\n            a = e ? Symbol.for(\"react.provider\") : 60109,\n            l = e ? Symbol.for(\"react.context\") : 60110,\n            s = e ? Symbol.for(\"react.async_mode\") : 60111,\n            u = e ? Symbol.for(\"react.concurrent_mode\") : 60111,\n            c = e ? Symbol.for(\"react.forward_ref\") : 60112,\n            d = e ? Symbol.for(\"react.suspense\") : 60113,\n            p = e ? Symbol.for(\"react.suspense_list\") : 60120,\n            h = e ? Symbol.for(\"react.memo\") : 60115,\n            m = e ? Symbol.for(\"react.lazy\") : 60116,\n            b = e ? Symbol.for(\"react.block\") : 60121,\n            y = e ? Symbol.for(\"react.fundamental\") : 60117,\n            g = e ? Symbol.for(\"react.responder\") : 60118,\n            x = e ? Symbol.for(\"react.scope\") : 60119;\n          function v(J) {\n            return (\n              typeof J == \"string\" ||\n              typeof J == \"function\" || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.\n              J === o ||\n              J === u ||\n              J === i ||\n              J === r ||\n              J === d ||\n              J === p ||\n              (typeof J == \"object\" &&\n                J !== null &&\n                (J.$$typeof === m ||\n                  J.$$typeof === h ||\n                  J.$$typeof === a ||\n                  J.$$typeof === l ||\n                  J.$$typeof === c ||\n                  J.$$typeof === y ||\n                  J.$$typeof === g ||\n                  J.$$typeof === x ||\n                  J.$$typeof === b))\n            );\n          }\n          function S(J) {\n            if (typeof J == \"object\" && J !== null) {\n              var _e = J.$$typeof;\n              switch (_e) {\n                case t:\n                  var ie = J.type;\n                  switch (ie) {\n                    case s:\n                    case u:\n                    case o:\n                    case i:\n                    case r:\n                    case d:\n                      return ie;\n                    default:\n                      var Ae = ie && ie.$$typeof;\n                      switch (Ae) {\n                        case l:\n                        case c:\n                        case m:\n                        case h:\n                        case a:\n                          return Ae;\n                        default:\n                          return _e;\n                      }\n                  }\n                case n:\n                  return _e;\n              }\n            }\n          }\n          var w = s,\n            E = u,\n            M = l,\n            _ = a,\n            j = t,\n            R = c,\n            D = o,\n            P = m,\n            V = h,\n            k = n,\n            N = i,\n            T = r,\n            F = d,\n            I = !1;\n          function L(J) {\n            return (\n              I ||\n                ((I = !0),\n                console.warn(\n                  \"The ReactIs.isAsyncMode() alias has been deprecated, and will be removed in React 17+. Update your code to use ReactIs.isConcurrentMode() instead. It has the exact same API.\",\n                )),\n              C(J) || S(J) === s\n            );\n          }\n          function C(J) {\n            return S(J) === u;\n          }\n          function H(J) {\n            return S(J) === l;\n          }\n          function B(J) {\n            return S(J) === a;\n          }\n          function A(J) {\n            return typeof J == \"object\" && J !== null && J.$$typeof === t;\n          }\n          function W(J) {\n            return S(J) === c;\n          }\n          function G(J) {\n            return S(J) === o;\n          }\n          function K(J) {\n            return S(J) === m;\n          }\n          function Q(J) {\n            return S(J) === h;\n          }\n          function ne(J) {\n            return S(J) === n;\n          }\n          function oe(J) {\n            return S(J) === i;\n          }\n          function U(J) {\n            return S(J) === r;\n          }\n          function ge(J) {\n            return S(J) === d;\n          }\n          (De.AsyncMode = w),\n            (De.ConcurrentMode = E),\n            (De.ContextConsumer = M),\n            (De.ContextProvider = _),\n            (De.Element = j),\n            (De.ForwardRef = R),\n            (De.Fragment = D),\n            (De.Lazy = P),\n            (De.Memo = V),\n            (De.Portal = k),\n            (De.Profiler = N),\n            (De.StrictMode = T),\n            (De.Suspense = F),\n            (De.isAsyncMode = L),\n            (De.isConcurrentMode = C),\n            (De.isContextConsumer = H),\n            (De.isContextProvider = B),\n            (De.isElement = A),\n            (De.isForwardRef = W),\n            (De.isFragment = G),\n            (De.isLazy = K),\n            (De.isMemo = Q),\n            (De.isPortal = ne),\n            (De.isProfiler = oe),\n            (De.isStrictMode = U),\n            (De.isSuspense = ge),\n            (De.isValidElementType = v),\n            (De.typeOf = S);\n        })()),\n    De\n  );\n}\nvar Y2;\nfunction $d() {\n  return (\n    Y2 ||\n      ((Y2 = 1),\n      process.env.NODE_ENV === \"production\"\n        ? (Xr.exports = I7())\n        : (Xr.exports = H7())),\n    Xr.exports\n  );\n}\n/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\nvar kl, G2;\nfunction z7() {\n  if (G2) return kl;\n  G2 = 1;\n  var e = Object.getOwnPropertySymbols,\n    t = Object.prototype.hasOwnProperty,\n    n = Object.prototype.propertyIsEnumerable;\n  function o(i) {\n    if (i == null)\n      throw new TypeError(\n        \"Object.assign cannot be called with null or undefined\",\n      );\n    return Object(i);\n  }\n  function r() {\n    try {\n      if (!Object.assign) return !1;\n      var i = new String(\"abc\");\n      if (((i[5] = \"de\"), Object.getOwnPropertyNames(i)[0] === \"5\")) return !1;\n      for (var a = {}, l = 0; l < 10; l++) a[\"_\" + String.fromCharCode(l)] = l;\n      var s = Object.getOwnPropertyNames(a).map(function (c) {\n        return a[c];\n      });\n      if (s.join(\"\") !== \"0123456789\") return !1;\n      var u = {};\n      return (\n        \"abcdefghijklmnopqrst\".split(\"\").forEach(function (c) {\n          u[c] = c;\n        }),\n        Object.keys(Object.assign({}, u)).join(\"\") === \"abcdefghijklmnopqrst\"\n      );\n    } catch {\n      return !1;\n    }\n  }\n  return (\n    (kl = r()\n      ? Object.assign\n      : function (i, a) {\n          for (var l, s = o(i), u, c = 1; c < arguments.length; c++) {\n            l = Object(arguments[c]);\n            for (var d in l) t.call(l, d) && (s[d] = l[d]);\n            if (e) {\n              u = e(l);\n              for (var p = 0; p < u.length; p++)\n                n.call(l, u[p]) && (s[u[p]] = l[u[p]]);\n            }\n          }\n          return s;\n        }),\n    kl\n  );\n}\nvar _l, K2;\nfunction wc() {\n  if (K2) return _l;\n  K2 = 1;\n  var e = \"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\";\n  return (_l = e), _l;\n}\nvar Al, X2;\nfunction Wd() {\n  return (\n    X2 ||\n      ((X2 = 1), (Al = Function.call.bind(Object.prototype.hasOwnProperty))),\n    Al\n  );\n}\nvar Ml, Q2;\nfunction P7() {\n  if (Q2) return Ml;\n  Q2 = 1;\n  var e = function () {};\n  if (process.env.NODE_ENV !== \"production\") {\n    var t = wc(),\n      n = {},\n      o = Wd();\n    e = function (i) {\n      var a = \"Warning: \" + i;\n      typeof console < \"u\" && console.error(a);\n      try {\n        throw new Error(a);\n      } catch {}\n    };\n  }\n  function r(i, a, l, s, u) {\n    if (process.env.NODE_ENV !== \"production\") {\n      for (var c in i)\n        if (o(i, c)) {\n          var d;\n          try {\n            if (typeof i[c] != \"function\") {\n              var p = Error(\n                (s || \"React class\") +\n                  \": \" +\n                  l +\n                  \" type `\" +\n                  c +\n                  \"` is invalid; it must be a function, usually from the `prop-types` package, but received `\" +\n                  typeof i[c] +\n                  \"`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.\",\n              );\n              throw ((p.name = \"Invariant Violation\"), p);\n            }\n            d = i[c](a, c, s, l, null, t);\n          } catch (m) {\n            d = m;\n          }\n          if (\n            (d &&\n              !(d instanceof Error) &&\n              e(\n                (s || \"React class\") +\n                  \": type specification of \" +\n                  l +\n                  \" `\" +\n                  c +\n                  \"` is invalid; the type checker function must return `null` or an `Error` but returned a \" +\n                  typeof d +\n                  \". You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).\",\n              ),\n            d instanceof Error && !(d.message in n))\n          ) {\n            n[d.message] = !0;\n            var h = u ? u() : \"\";\n            e(\"Failed \" + l + \" type: \" + d.message + (h ?? \"\"));\n          }\n        }\n    }\n  }\n  return (\n    (r.resetWarningCache = function () {\n      process.env.NODE_ENV !== \"production\" && (n = {});\n    }),\n    (Ml = r),\n    Ml\n  );\n}\nvar Tl, J2;\nfunction B7() {\n  if (J2) return Tl;\n  J2 = 1;\n  var e = $d(),\n    t = z7(),\n    n = wc(),\n    o = Wd(),\n    r = P7(),\n    i = function () {};\n  process.env.NODE_ENV !== \"production\" &&\n    (i = function (l) {\n      var s = \"Warning: \" + l;\n      typeof console < \"u\" && console.error(s);\n      try {\n        throw new Error(s);\n      } catch {}\n    });\n  function a() {\n    return null;\n  }\n  return (\n    (Tl = function (l, s) {\n      var u = typeof Symbol == \"function\" && Symbol.iterator,\n        c = \"@@iterator\";\n      function d(C) {\n        var H = C && ((u && C[u]) || C[c]);\n        if (typeof H == \"function\") return H;\n      }\n      var p = \"<<anonymous>>\",\n        h = {\n          array: g(\"array\"),\n          bigint: g(\"bigint\"),\n          bool: g(\"boolean\"),\n          func: g(\"function\"),\n          number: g(\"number\"),\n          object: g(\"object\"),\n          string: g(\"string\"),\n          symbol: g(\"symbol\"),\n          any: x(),\n          arrayOf: v,\n          element: S(),\n          elementType: w(),\n          instanceOf: E,\n          node: R(),\n          objectOf: _,\n          oneOf: M,\n          oneOfType: j,\n          shape: P,\n          exact: V,\n        };\n      function m(C, H) {\n        return C === H ? C !== 0 || 1 / C === 1 / H : C !== C && H !== H;\n      }\n      function b(C, H) {\n        (this.message = C),\n          (this.data = H && typeof H == \"object\" ? H : {}),\n          (this.stack = \"\");\n      }\n      b.prototype = Error.prototype;\n      function y(C) {\n        if (process.env.NODE_ENV !== \"production\")\n          var H = {},\n            B = 0;\n        function A(G, K, Q, ne, oe, U, ge) {\n          if (((ne = ne || p), (U = U || Q), ge !== n)) {\n            if (s) {\n              var J = new Error(\n                \"Calling PropTypes validators directly is not supported by the `prop-types` package. Use `PropTypes.checkPropTypes()` to call them. Read more at http://fb.me/use-check-prop-types\",\n              );\n              throw ((J.name = \"Invariant Violation\"), J);\n            } else if (\n              process.env.NODE_ENV !== \"production\" &&\n              typeof console < \"u\"\n            ) {\n              var _e = ne + \":\" + Q;\n              !H[_e] && // Avoid spamming the console because they are often not actionable except for lib authors\n                B < 3 &&\n                (i(\n                  \"You are manually calling a React.PropTypes validation function for the `\" +\n                    U +\n                    \"` prop on `\" +\n                    ne +\n                    \"`. This is deprecated and will throw in the standalone `prop-types` package. You may be seeing this warning due to a third-party PropTypes library. See https://fb.me/react-warning-dont-call-proptypes for details.\",\n                ),\n                (H[_e] = !0),\n                B++);\n            }\n          }\n          return K[Q] == null\n            ? G\n              ? K[Q] === null\n                ? new b(\n                    \"The \" +\n                      oe +\n                      \" `\" +\n                      U +\n                      \"` is marked as required \" +\n                      (\"in `\" + ne + \"`, but its value is `null`.\"),\n                  )\n                : new b(\n                    \"The \" +\n                      oe +\n                      \" `\" +\n                      U +\n                      \"` is marked as required in \" +\n                      (\"`\" + ne + \"`, but its value is `undefined`.\"),\n                  )\n              : null\n            : C(K, Q, ne, oe, U);\n        }\n        var W = A.bind(null, !1);\n        return (W.isRequired = A.bind(null, !0)), W;\n      }\n      function g(C) {\n        function H(B, A, W, G, K, Q) {\n          var ne = B[A],\n            oe = T(ne);\n          if (oe !== C) {\n            var U = F(ne);\n            return new b(\n              \"Invalid \" +\n                G +\n                \" `\" +\n                K +\n                \"` of type \" +\n                (\"`\" + U + \"` supplied to `\" + W + \"`, expected \") +\n                (\"`\" + C + \"`.\"),\n              { expectedType: C },\n            );\n          }\n          return null;\n        }\n        return y(H);\n      }\n      function x() {\n        return y(a);\n      }\n      function v(C) {\n        function H(B, A, W, G, K) {\n          if (typeof C != \"function\")\n            return new b(\n              \"Property `\" +\n                K +\n                \"` of component `\" +\n                W +\n                \"` has invalid PropType notation inside arrayOf.\",\n            );\n          var Q = B[A];\n          if (!Array.isArray(Q)) {\n            var ne = T(Q);\n            return new b(\n              \"Invalid \" +\n                G +\n                \" `\" +\n                K +\n                \"` of type \" +\n                (\"`\" + ne + \"` supplied to `\" + W + \"`, expected an array.\"),\n            );\n          }\n          for (var oe = 0; oe < Q.length; oe++) {\n            var U = C(Q, oe, W, G, K + \"[\" + oe + \"]\", n);\n            if (U instanceof Error) return U;\n          }\n          return null;\n        }\n        return y(H);\n      }\n      function S() {\n        function C(H, B, A, W, G) {\n          var K = H[B];\n          if (!l(K)) {\n            var Q = T(K);\n            return new b(\n              \"Invalid \" +\n                W +\n                \" `\" +\n                G +\n                \"` of type \" +\n                (\"`\" +\n                  Q +\n                  \"` supplied to `\" +\n                  A +\n                  \"`, expected a single ReactElement.\"),\n            );\n          }\n          return null;\n        }\n        return y(C);\n      }\n      function w() {\n        function C(H, B, A, W, G) {\n          var K = H[B];\n          if (!e.isValidElementType(K)) {\n            var Q = T(K);\n            return new b(\n              \"Invalid \" +\n                W +\n                \" `\" +\n                G +\n                \"` of type \" +\n                (\"`\" +\n                  Q +\n                  \"` supplied to `\" +\n                  A +\n                  \"`, expected a single ReactElement type.\"),\n            );\n          }\n          return null;\n        }\n        return y(C);\n      }\n      function E(C) {\n        function H(B, A, W, G, K) {\n          if (!(B[A] instanceof C)) {\n            var Q = C.name || p,\n              ne = L(B[A]);\n            return new b(\n              \"Invalid \" +\n                G +\n                \" `\" +\n                K +\n                \"` of type \" +\n                (\"`\" + ne + \"` supplied to `\" + W + \"`, expected \") +\n                (\"instance of `\" + Q + \"`.\"),\n            );\n          }\n          return null;\n        }\n        return y(H);\n      }\n      function M(C) {\n        if (!Array.isArray(C))\n          return (\n            process.env.NODE_ENV !== \"production\" &&\n              (arguments.length > 1\n                ? i(\n                    \"Invalid arguments supplied to oneOf, expected an array, got \" +\n                      arguments.length +\n                      \" arguments. A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).\",\n                  )\n                : i(\"Invalid argument supplied to oneOf, expected an array.\")),\n            a\n          );\n        function H(B, A, W, G, K) {\n          for (var Q = B[A], ne = 0; ne < C.length; ne++)\n            if (m(Q, C[ne])) return null;\n          var oe = JSON.stringify(C, function (ge, J) {\n            var _e = F(J);\n            return _e === \"symbol\" ? String(J) : J;\n          });\n          return new b(\n            \"Invalid \" +\n              G +\n              \" `\" +\n              K +\n              \"` of value `\" +\n              String(Q) +\n              \"` \" +\n              (\"supplied to `\" + W + \"`, expected one of \" + oe + \".\"),\n          );\n        }\n        return y(H);\n      }\n      function _(C) {\n        function H(B, A, W, G, K) {\n          if (typeof C != \"function\")\n            return new b(\n              \"Property `\" +\n                K +\n                \"` of component `\" +\n                W +\n                \"` has invalid PropType notation inside objectOf.\",\n            );\n          var Q = B[A],\n            ne = T(Q);\n          if (ne !== \"object\")\n            return new b(\n              \"Invalid \" +\n                G +\n                \" `\" +\n                K +\n                \"` of type \" +\n                (\"`\" + ne + \"` supplied to `\" + W + \"`, expected an object.\"),\n            );\n          for (var oe in Q)\n            if (o(Q, oe)) {\n              var U = C(Q, oe, W, G, K + \".\" + oe, n);\n              if (U instanceof Error) return U;\n            }\n          return null;\n        }\n        return y(H);\n      }\n      function j(C) {\n        if (!Array.isArray(C))\n          return (\n            process.env.NODE_ENV !== \"production\" &&\n              i(\n                \"Invalid argument supplied to oneOfType, expected an instance of array.\",\n              ),\n            a\n          );\n        for (var H = 0; H < C.length; H++) {\n          var B = C[H];\n          if (typeof B != \"function\")\n            return (\n              i(\n                \"Invalid argument supplied to oneOfType. Expected an array of check functions, but received \" +\n                  I(B) +\n                  \" at index \" +\n                  H +\n                  \".\",\n              ),\n              a\n            );\n        }\n        function A(W, G, K, Q, ne) {\n          for (var oe = [], U = 0; U < C.length; U++) {\n            var ge = C[U],\n              J = ge(W, G, K, Q, ne, n);\n            if (J == null) return null;\n            J.data && o(J.data, \"expectedType\") && oe.push(J.data.expectedType);\n          }\n          var _e =\n            oe.length > 0\n              ? \", expected one of type [\" + oe.join(\", \") + \"]\"\n              : \"\";\n          return new b(\n            \"Invalid \" +\n              Q +\n              \" `\" +\n              ne +\n              \"` supplied to \" +\n              (\"`\" + K + \"`\" + _e + \".\"),\n          );\n        }\n        return y(A);\n      }\n      function R() {\n        function C(H, B, A, W, G) {\n          return k(H[B])\n            ? null\n            : new b(\n                \"Invalid \" +\n                  W +\n                  \" `\" +\n                  G +\n                  \"` supplied to \" +\n                  (\"`\" + A + \"`, expected a ReactNode.\"),\n              );\n        }\n        return y(C);\n      }\n      function D(C, H, B, A, W) {\n        return new b(\n          (C || \"React class\") +\n            \": \" +\n            H +\n            \" type `\" +\n            B +\n            \".\" +\n            A +\n            \"` is invalid; it must be a function, usually from the `prop-types` package, but received `\" +\n            W +\n            \"`.\",\n        );\n      }\n      function P(C) {\n        function H(B, A, W, G, K) {\n          var Q = B[A],\n            ne = T(Q);\n          if (ne !== \"object\")\n            return new b(\n              \"Invalid \" +\n                G +\n                \" `\" +\n                K +\n                \"` of type `\" +\n                ne +\n                \"` \" +\n                (\"supplied to `\" + W + \"`, expected `object`.\"),\n            );\n          for (var oe in C) {\n            var U = C[oe];\n            if (typeof U != \"function\") return D(W, G, K, oe, F(U));\n            var ge = U(Q, oe, W, G, K + \".\" + oe, n);\n            if (ge) return ge;\n          }\n          return null;\n        }\n        return y(H);\n      }\n      function V(C) {\n        function H(B, A, W, G, K) {\n          var Q = B[A],\n            ne = T(Q);\n          if (ne !== \"object\")\n            return new b(\n              \"Invalid \" +\n                G +\n                \" `\" +\n                K +\n                \"` of type `\" +\n                ne +\n                \"` \" +\n                (\"supplied to `\" + W + \"`, expected `object`.\"),\n            );\n          var oe = t({}, B[A], C);\n          for (var U in oe) {\n            var ge = C[U];\n            if (o(C, U) && typeof ge != \"function\") return D(W, G, K, U, F(ge));\n            if (!ge)\n              return new b(\n                \"Invalid \" +\n                  G +\n                  \" `\" +\n                  K +\n                  \"` key `\" +\n                  U +\n                  \"` supplied to `\" +\n                  W +\n                  \"`.\\nBad object: \" +\n                  JSON.stringify(B[A], null, \"  \") +\n                  `\nValid keys: ` +\n                  JSON.stringify(Object.keys(C), null, \"  \"),\n              );\n            var J = ge(Q, U, W, G, K + \".\" + U, n);\n            if (J) return J;\n          }\n          return null;\n        }\n        return y(H);\n      }\n      function k(C) {\n        switch (typeof C) {\n          case \"number\":\n          case \"string\":\n          case \"undefined\":\n            return !0;\n          case \"boolean\":\n            return !C;\n          case \"object\":\n            if (Array.isArray(C)) return C.every(k);\n            if (C === null || l(C)) return !0;\n            var H = d(C);\n            if (H) {\n              var B = H.call(C),\n                A;\n              if (H !== C.entries) {\n                for (; !(A = B.next()).done; ) if (!k(A.value)) return !1;\n              } else\n                for (; !(A = B.next()).done; ) {\n                  var W = A.value;\n                  if (W && !k(W[1])) return !1;\n                }\n            } else return !1;\n            return !0;\n          default:\n            return !1;\n        }\n      }\n      function N(C, H) {\n        return C === \"symbol\"\n          ? !0\n          : H\n            ? H[\"@@toStringTag\"] === \"Symbol\" ||\n              (typeof Symbol == \"function\" && H instanceof Symbol)\n            : !1;\n      }\n      function T(C) {\n        var H = typeof C;\n        return Array.isArray(C)\n          ? \"array\"\n          : C instanceof RegExp\n            ? \"object\"\n            : N(H, C)\n              ? \"symbol\"\n              : H;\n      }\n      function F(C) {\n        if (typeof C > \"u\" || C === null) return \"\" + C;\n        var H = T(C);\n        if (H === \"object\") {\n          if (C instanceof Date) return \"date\";\n          if (C instanceof RegExp) return \"regexp\";\n        }\n        return H;\n      }\n      function I(C) {\n        var H = F(C);\n        switch (H) {\n          case \"array\":\n          case \"object\":\n            return \"an \" + H;\n          case \"boolean\":\n          case \"date\":\n          case \"regexp\":\n            return \"a \" + H;\n          default:\n            return H;\n        }\n      }\n      function L(C) {\n        return !C.constructor || !C.constructor.name ? p : C.constructor.name;\n      }\n      return (\n        (h.checkPropTypes = r),\n        (h.resetWarningCache = r.resetWarningCache),\n        (h.PropTypes = h),\n        h\n      );\n    }),\n    Tl\n  );\n}\nvar Ol, eu;\nfunction V7() {\n  if (eu) return Ol;\n  eu = 1;\n  var e = wc();\n  function t() {}\n  function n() {}\n  return (\n    (n.resetWarningCache = t),\n    (Ol = function () {\n      function o(a, l, s, u, c, d) {\n        if (d !== e) {\n          var p = new Error(\n            \"Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types\",\n          );\n          throw ((p.name = \"Invariant Violation\"), p);\n        }\n      }\n      o.isRequired = o;\n      function r() {\n        return o;\n      }\n      var i = {\n        array: o,\n        bigint: o,\n        bool: o,\n        func: o,\n        number: o,\n        object: o,\n        string: o,\n        symbol: o,\n        any: o,\n        arrayOf: r,\n        element: o,\n        elementType: o,\n        instanceOf: r,\n        node: o,\n        objectOf: r,\n        oneOf: r,\n        oneOfType: r,\n        shape: r,\n        exact: r,\n        checkPropTypes: n,\n        resetWarningCache: t,\n      };\n      return (i.PropTypes = i), i;\n    }),\n    Ol\n  );\n}\nif (process.env.NODE_ENV !== \"production\") {\n  var $7 = $d(),\n    W7 = !0;\n  xs.exports = B7()($7.isElement, W7);\n} else xs.exports = V7()();\nvar Z7 = xs.exports;\nconst q = /* @__PURE__ */ fn(Z7);\nvar vi = function (t) {\n    return t.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, \"\\\\$&\");\n  },\n  sn = {\n    id: \"__id__\",\n    display: \"__display__\",\n  },\n  tu = function (t, n) {\n    Ao(\n      n === \"id\" || n === \"display\",\n      'Second arg must be either \"id\" or \"display\", got: \"'.concat(n, '\"'),\n    );\n    var o = t.indexOf(sn.display),\n      r = t.indexOf(sn.id);\n    return (\n      o < 0 && (o = null),\n      r < 0 && (r = null),\n      Ao(\n        o !== null || r !== null,\n        \"The markup '\".concat(\n          t,\n          \"' does not contain either of the placeholders '__id__' or '__display__'\",\n        ),\n      ),\n      o !== null && r !== null\n        ? (n === \"id\" && r <= o) || (n === \"display\" && o <= r)\n          ? 0\n          : 1\n        : 0\n    );\n  },\n  U7 = function (t) {\n    var n = /^\\/(.+)\\/(\\w+)?$/;\n    return new RegExp(\n      t\n        .map(function (o) {\n          var r = n.exec(o.toString()),\n            i = Fi(r, 3),\n            a = i[1],\n            l = i[2];\n          return (\n            Ao(\n              !l,\n              \"RegExp flags are not supported. Change /\"\n                .concat(a, \"/\")\n                .concat(l, \" into /\")\n                .concat(a, \"/\"),\n            ),\n            \"(\".concat(a, \")\")\n          );\n        })\n        .join(\"|\"),\n      \"g\",\n    );\n  },\n  Zd = function (t) {\n    var n = 0;\n    return (\n      t.indexOf(\"__id__\") >= 0 && n++, t.indexOf(\"__display__\") >= 0 && n++, n\n    );\n  },\n  q7 = function () {},\n  Dr = function (t, n, o) {\n    for (\n      var r =\n          arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : q7,\n        i = U7(\n          n.map(function (w) {\n            return w.regex;\n          }),\n        ),\n        a = 2,\n        l = n.map(function (w) {\n          var E = w.markup,\n            M = a;\n          return (a += Zd(E) + 1), M;\n        }),\n        s,\n        u = 0,\n        c = 0;\n      (s = i.exec(t)) !== null;\n\n    ) {\n      var d = l.find(function (w) {\n          return !!s[w];\n        }),\n        p = l.indexOf(d),\n        h = n[p],\n        m = h.markup,\n        b = h.displayTransform,\n        y = d + tu(m, \"id\"),\n        g = d + tu(m, \"display\"),\n        x = s[y],\n        v = b(x, s[g]),\n        S = t.substring(u, s.index);\n      r(S, u, c),\n        (c += S.length),\n        o(s[0], s.index, c, x, v, p, u),\n        (c += v.length),\n        (u = i.lastIndex);\n    }\n    u < t.length && r(t.substring(u), u, c);\n  },\n  $n = function (t, n) {\n    var o = \"\";\n    return (\n      Dr(\n        t,\n        n,\n        function (r, i, a, l, s) {\n          o += s;\n        },\n        function (r) {\n          o += r;\n        },\n      ),\n      o\n    );\n  },\n  mt = function (t, n, o) {\n    var r =\n      arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : \"START\";\n    if (typeof o != \"number\") return o;\n    var i,\n      a = function (u, c, d) {\n        i === void 0 && d + u.length >= o && (i = c + o - d);\n      },\n      l = function (u, c, d, p, h, m, b) {\n        i === void 0 &&\n          d + h.length > o &&\n          (r === \"NULL\" ? (i = null) : (i = c + (r === \"END\" ? u.length : 0)));\n      };\n    return Dr(t, n, l, a), i === void 0 ? t.length : i;\n  },\n  lr = function (t, n, o, r) {\n    return t.substring(0, n) + r + t.substring(o);\n  },\n  Y7 = function (t, n, o, r) {\n    var i = o.selectionStartBefore,\n      a = o.selectionEndBefore,\n      l = o.selectionEndAfter,\n      s = $n(t, r),\n      u = s.length - n.length;\n    i === \"undefined\" && (i = l + u),\n      a === \"undefined\" && (a = i),\n      i === a && a === l && s.length === n.length && (i = i - 1);\n    var c = n.slice(i, l),\n      d = Math.min(i, l),\n      p = a;\n    i === l && (p = Math.max(a, i + u));\n    var h = mt(t, r, d, \"START\"),\n      m = mt(t, r, p, \"END\"),\n      b = mt(t, r, d, \"NULL\"),\n      y = mt(t, r, p, \"NULL\"),\n      g = b === null || y === null,\n      x = lr(t, h, m, c);\n    if (!g) {\n      var v = $n(x, r);\n      if (v !== n) {\n        for (d = 0; n[d] === v[d]; ) d++;\n        (c = n.slice(d, l)),\n          (p = s.lastIndexOf(n.substring(l))),\n          (h = mt(t, r, d, \"START\")),\n          (m = mt(t, r, p, \"END\")),\n          (x = lr(t, h, m, c));\n      }\n    }\n    return x;\n  },\n  nu = function (t, n, o) {\n    var r = o,\n      i = !1,\n      a = function (s, u, c, d, p, h, m) {\n        c <= o && c + p.length > o && ((r = c), (i = !0));\n      };\n    if ((Dr(t, n, a), i)) return r;\n  },\n  er = function (t, n) {\n    var o = [];\n    return (\n      Dr(t, n, function (r, i, a, l, s, u, c) {\n        o.push({\n          id: l,\n          display: s,\n          childIndex: u,\n          index: i,\n          plainTextIndex: a,\n        });\n      }),\n      o\n    );\n  },\n  Ud = function (t, n) {\n    return \"\".concat(t, \"-\").concat(n);\n  },\n  Qr = function (t) {\n    return Object.values(t).reduce(function (n, o) {\n      var r = o.results;\n      return n + r.length;\n    }, 0);\n  },\n  G7 = function (t, n) {\n    var o = er(t, n),\n      r = o[o.length - 1];\n    return r ? r.plainTextIndex + r.display.length : 0;\n  },\n  K7 = function (t) {\n    var n = vi(t),\n      o = t[t.indexOf(sn.display) + sn.display.length],\n      r = t[t.indexOf(sn.id) + sn.id.length];\n    return new RegExp(\n      n\n        .replace(sn.display, \"([^\".concat(vi(o || \"\"), \"]+?)\"))\n        .replace(sn.id, \"([^\".concat(vi(r || \"\"), \"]+?)\")),\n    );\n  },\n  On = function (t) {\n    return ko.toArray(t).map(function (n) {\n      var o = n.props,\n        r = o.markup,\n        i = o.regex,\n        a = o.displayTransform;\n      return {\n        markup: r,\n        regex: i ? X7(i, r) : K7(r),\n        displayTransform:\n          a ||\n          function (l, s) {\n            return s || l;\n          },\n      };\n    });\n  },\n  X7 = function (t, n) {\n    var o = new RegExp(t.toString() + \"|\").exec(\"\").length - 1,\n      r = Zd(n);\n    return (\n      Ao(\n        o === r,\n        \"Number of capturing groups in RegExp \"\n          .concat(t.toString(), \" (\")\n          .concat(\n            o,\n            \") does not match the number of placeholders in the markup '\",\n          )\n          .concat(n, \"' (\")\n          .concat(r, \")\"),\n      ),\n      t\n    );\n  },\n  Q7 = function (t, n, o) {\n    return t.replace(sn.id, n).replace(sn.display, o);\n  },\n  J7 = [\n    {\n      base: \"A\",\n      letters:\n        /(&#65;|&#9398;|&#65313;|&#192;|&#193;|&#194;|&#7846;|&#7844;|&#7850;|&#7848;|&#195;|&#256;|&#258;|&#7856;|&#7854;|&#7860;|&#7858;|&#550;|&#480;|&#196;|&#478;|&#7842;|&#197;|&#506;|&#461;|&#512;|&#514;|&#7840;|&#7852;|&#7862;|&#7680;|&#260;|&#570;|&#11375;|[\\u0041\\u24B6\\uFF21\\u00C0\\u00C1\\u00C2\\u1EA6\\u1EA4\\u1EAA\\u1EA8\\u00C3\\u0100\\u0102\\u1EB0\\u1EAE\\u1EB4\\u1EB2\\u0226\\u01E0\\u00C4\\u01DE\\u1EA2\\u00C5\\u01FA\\u01CD\\u0200\\u0202\\u1EA0\\u1EAC\\u1EB6\\u1E00\\u0104\\u023A\\u2C6F])/g,\n    },\n    {\n      base: \"AA\",\n      letters: /(&#42802;|[\\uA732])/g,\n    },\n    {\n      base: \"AE\",\n      letters: /(&#198;|&#508;|&#482;|[\\u00C6\\u01FC\\u01E2])/g,\n    },\n    {\n      base: \"AO\",\n      letters: /(&#42804;|[\\uA734])/g,\n    },\n    {\n      base: \"AU\",\n      letters: /(&#42806;|[\\uA736])/g,\n    },\n    {\n      base: \"AV\",\n      letters: /(&#42808;|&#42810;|[\\uA738\\uA73A])/g,\n    },\n    {\n      base: \"AY\",\n      letters: /(&#42812;|[\\uA73C])/g,\n    },\n    {\n      base: \"B\",\n      letters:\n        /(&#66;|&#9399;|&#65314;|&#7682;|&#7684;|&#7686;|&#579;|&#386;|&#385;|[\\u0042\\u24B7\\uFF22\\u1E02\\u1E04\\u1E06\\u0243\\u0182\\u0181])/g,\n    },\n    {\n      base: \"C\",\n      letters:\n        /(&#67;|&#9400;|&#65315;|&#262;|&#264;|&#266;|&#268;|&#199;|&#7688;|&#391;|&#571;|&#42814;|[\\u0043\\u24B8\\uFF23\\u0106\\u0108\\u010A\\u010C\\u00C7\\u1E08\\u0187\\u023B\\uA73E])/g,\n    },\n    {\n      base: \"D\",\n      letters:\n        /(&#68;|&#9401;|&#65316;|&#7690;|&#270;|&#7692;|&#7696;|&#7698;|&#7694;|&#272;|&#395;|&#394;|&#393;|&#42873;|&#208;|[\\u0044\\u24B9\\uFF24\\u1E0A\\u010E\\u1E0C\\u1E10\\u1E12\\u1E0E\\u0110\\u018B\\u018A\\u0189\\uA779\\u00D0])/g,\n    },\n    {\n      base: \"DZ\",\n      letters: /(&#497;|&#452;|[\\u01F1\\u01C4])/g,\n    },\n    {\n      base: \"Dz\",\n      letters: /(&#498;|&#453;|[\\u01F2\\u01C5])/g,\n    },\n    {\n      base: \"E\",\n      letters:\n        /(&#69;|&#9402;|&#65317;|&#200;|&#201;|&#202;|&#7872;|&#7870;|&#7876;|&#7874;|&#7868;|&#274;|&#7700;|&#7702;|&#276;|&#278;|&#203;|&#7866;|&#282;|&#516;|&#518;|&#7864;|&#7878;|&#552;|&#7708;|&#280;|&#7704;|&#7706;|&#400;|&#398;|[\\u0045\\u24BA\\uFF25\\u00C8\\u00C9\\u00CA\\u1EC0\\u1EBE\\u1EC4\\u1EC2\\u1EBC\\u0112\\u1E14\\u1E16\\u0114\\u0116\\u00CB\\u1EBA\\u011A\\u0204\\u0206\\u1EB8\\u1EC6\\u0228\\u1E1C\\u0118\\u1E18\\u1E1A\\u0190\\u018E])/g,\n    },\n    {\n      base: \"F\",\n      letters:\n        /(&#70;|&#9403;|&#65318;|&#7710;|&#401;|&#42875;|[\\u0046\\u24BB\\uFF26\\u1E1E\\u0191\\uA77B])/g,\n    },\n    {\n      base: \"G\",\n      letters:\n        /(&#71;|&#9404;|&#65319;|&#500;|&#284;|&#7712;|&#286;|&#288;|&#486;|&#290;|&#484;|&#403;|&#42912;|&#42877;|&#42878;|[\\u0047\\u24BC\\uFF27\\u01F4\\u011C\\u1E20\\u011E\\u0120\\u01E6\\u0122\\u01E4\\u0193\\uA7A0\\uA77D\\uA77E])/g,\n    },\n    {\n      base: \"H\",\n      letters:\n        /(&#72;|&#9405;|&#65320;|&#292;|&#7714;|&#7718;|&#542;|&#7716;|&#7720;|&#7722;|&#294;|&#11367;|&#11381;|&#42893;|[\\u0048\\u24BD\\uFF28\\u0124\\u1E22\\u1E26\\u021E\\u1E24\\u1E28\\u1E2A\\u0126\\u2C67\\u2C75\\uA78D])/g,\n    },\n    {\n      base: \"I\",\n      letters:\n        /(&#73;|&#9406;|&#65321;|&#204;|&#205;|&#206;|&#296;|&#298;|&#300;|&#304;|&#207;|&#7726;|&#7880;|&#463;|&#520;|&#522;|&#7882;|&#302;|&#7724;|&#407;|[\\u0049\\u24BE\\uFF29\\u00CC\\u00CD\\u00CE\\u0128\\u012A\\u012C\\u0130\\u00CF\\u1E2E\\u1EC8\\u01CF\\u0208\\u020A\\u1ECA\\u012E\\u1E2C\\u0197])/g,\n    },\n    {\n      base: \"J\",\n      letters:\n        /(&#74;|&#9407;|&#65322;|&#308;|&#584;|[\\u004A\\u24BF\\uFF2A\\u0134\\u0248])/g,\n    },\n    {\n      base: \"K\",\n      letters:\n        /(&#75;|&#9408;|&#65323;|&#7728;|&#488;|&#7730;|&#310;|&#7732;|&#408;|&#11369;|&#42816;|&#42818;|&#42820;|&#42914;|[\\u004B\\u24C0\\uFF2B\\u1E30\\u01E8\\u1E32\\u0136\\u1E34\\u0198\\u2C69\\uA740\\uA742\\uA744\\uA7A2])/g,\n    },\n    {\n      base: \"L\",\n      letters:\n        /(&#76;|&#9409;|&#65324;|&#319;|&#313;|&#317;|&#7734;|&#7736;|&#315;|&#7740;|&#7738;|&#321;|&#573;|&#11362;|&#11360;|&#42824;|&#42822;|&#42880;|[\\u004C\\u24C1\\uFF2C\\u013F\\u0139\\u013D\\u1E36\\u1E38\\u013B\\u1E3C\\u1E3A\\u0141\\u023D\\u2C62\\u2C60\\uA748\\uA746\\uA780])/g,\n    },\n    {\n      base: \"LJ\",\n      letters: /(&#455;|[\\u01C7])/g,\n    },\n    {\n      base: \"Lj\",\n      letters: /(&#456;|[\\u01C8])/g,\n    },\n    {\n      base: \"M\",\n      letters:\n        /(&#77;|&#9410;|&#65325;|&#7742;|&#7744;|&#7746;|&#11374;|&#412;|[\\u004D\\u24C2\\uFF2D\\u1E3E\\u1E40\\u1E42\\u2C6E\\u019C])/g,\n    },\n    {\n      base: \"N\",\n      letters:\n        /(&#78;|&#9411;|&#65326;|&#504;|&#323;|&#209;|&#7748;|&#327;|&#7750;|&#325;|&#7754;|&#7752;|&#544;|&#413;|&#42896;|&#42916;|&#330;|[\\u004E\\u24C3\\uFF2E\\u01F8\\u0143\\u00D1\\u1E44\\u0147\\u1E46\\u0145\\u1E4A\\u1E48\\u0220\\u019D\\uA790\\uA7A4\\u014A])/g,\n    },\n    {\n      base: \"NJ\",\n      letters: /(&#458;|[\\u01CA])/g,\n    },\n    {\n      base: \"Nj\",\n      letters: /(&#459;|[\\u01CB])/g,\n    },\n    {\n      base: \"O\",\n      letters:\n        /(&#79;|&#9412;|&#65327;|&#210;|&#211;|&#212;|&#7890;|&#7888;|&#7894;|&#7892;|&#213;|&#7756;|&#556;|&#7758;|&#332;|&#7760;|&#7762;|&#334;|&#558;|&#560;|&#214;|&#554;|&#7886;|&#336;|&#465;|&#524;|&#526;|&#416;|&#7900;|&#7898;|&#7904;|&#7902;|&#7906;|&#7884;|&#7896;|&#490;|&#492;|&#216;|&#510;|&#390;|&#415;|&#42826;|&#42828;|[\\u004F\\u24C4\\uFF2F\\u00D2\\u00D3\\u00D4\\u1ED2\\u1ED0\\u1ED6\\u1ED4\\u00D5\\u1E4C\\u022C\\u1E4E\\u014C\\u1E50\\u1E52\\u014E\\u022E\\u0230\\u00D6\\u022A\\u1ECE\\u0150\\u01D1\\u020C\\u020E\\u01A0\\u1EDC\\u1EDA\\u1EE0\\u1EDE\\u1EE2\\u1ECC\\u1ED8\\u01EA\\u01EC\\u00D8\\u01FE\\u0186\\u019F\\uA74A\\uA74C])/g,\n    },\n    {\n      base: \"OE\",\n      letters: /(&#338;|[\\u0152])/g,\n    },\n    {\n      base: \"OI\",\n      letters: /(&#418;|[\\u01A2])/g,\n    },\n    {\n      base: \"OO\",\n      letters: /(&#42830;|[\\uA74E])/g,\n    },\n    {\n      base: \"OU\",\n      letters: /(&#546;|[\\u0222])/g,\n    },\n    {\n      base: \"P\",\n      letters:\n        /(&#80;|&#9413;|&#65328;|&#7764;|&#7766;|&#420;|&#11363;|&#42832;|&#42834;|&#42836;|[\\u0050\\u24C5\\uFF30\\u1E54\\u1E56\\u01A4\\u2C63\\uA750\\uA752\\uA754])/g,\n    },\n    {\n      base: \"Q\",\n      letters:\n        /(&#81;|&#9414;|&#65329;|&#42838;|&#42840;|&#586;|[\\u0051\\u24C6\\uFF31\\uA756\\uA758\\u024A])/g,\n    },\n    {\n      base: \"R\",\n      letters:\n        /(&#82;|&#9415;|&#65330;|&#340;|&#7768;|&#344;|&#528;|&#530;|&#7770;|&#7772;|&#342;|&#7774;|&#588;|&#11364;|&#42842;|&#42918;|&#42882;|[\\u0052\\u24C7\\uFF32\\u0154\\u1E58\\u0158\\u0210\\u0212\\u1E5A\\u1E5C\\u0156\\u1E5E\\u024C\\u2C64\\uA75A\\uA7A6\\uA782])/g,\n    },\n    {\n      base: \"S\",\n      letters:\n        /(&#83;|&#9416;|&#65331;|&#7838;|&#346;|&#7780;|&#348;|&#7776;|&#352;|&#7782;|&#7778;|&#7784;|&#536;|&#350;|&#11390;|&#42920;|&#42884;|[\\u0053\\u24C8\\uFF33\\u1E9E\\u015A\\u1E64\\u015C\\u1E60\\u0160\\u1E66\\u1E62\\u1E68\\u0218\\u015E\\u2C7E\\uA7A8\\uA784])/g,\n    },\n    {\n      base: \"T\",\n      letters:\n        /(&#84;|&#9417;|&#65332;|&#7786;|&#356;|&#7788;|&#538;|&#354;|&#7792;|&#7790;|&#358;|&#428;|&#430;|&#574;|&#42886;|[\\u0054\\u24C9\\uFF34\\u1E6A\\u0164\\u1E6C\\u021A\\u0162\\u1E70\\u1E6E\\u0166\\u01AC\\u01AE\\u023E\\uA786])/g,\n    },\n    {\n      base: \"TH\",\n      letters: /(&#222;|[\\u00DE])/g,\n    },\n    {\n      base: \"TZ\",\n      letters: /(&#42792;|[\\uA728])/g,\n    },\n    {\n      base: \"U\",\n      letters:\n        /(&#85;|&#9418;|&#65333;|&#217;|&#218;|&#219;|&#360;|&#7800;|&#362;|&#7802;|&#364;|&#220;|&#475;|&#471;|&#469;|&#473;|&#7910;|&#366;|&#368;|&#467;|&#532;|&#534;|&#431;|&#7914;|&#7912;|&#7918;|&#7916;|&#7920;|&#7908;|&#7794;|&#370;|&#7798;|&#7796;|&#580;|[\\u0055\\u24CA\\uFF35\\u00D9\\u00DA\\u00DB\\u0168\\u1E78\\u016A\\u1E7A\\u016C\\u00DC\\u01DB\\u01D7\\u01D5\\u01D9\\u1EE6\\u016E\\u0170\\u01D3\\u0214\\u0216\\u01AF\\u1EEA\\u1EE8\\u1EEE\\u1EEC\\u1EF0\\u1EE4\\u1E72\\u0172\\u1E76\\u1E74\\u0244])/g,\n    },\n    {\n      base: \"V\",\n      letters:\n        /(&#86;|&#9419;|&#65334;|&#7804;|&#7806;|&#434;|&#42846;|&#581;|[\\u0056\\u24CB\\uFF36\\u1E7C\\u1E7E\\u01B2\\uA75E\\u0245])/g,\n    },\n    {\n      base: \"VY\",\n      letters: /(&#42848;|[\\uA760])/g,\n    },\n    {\n      base: \"W\",\n      letters:\n        /(&#87;|&#9420;|&#65335;|&#7808;|&#7810;|&#372;|&#7814;|&#7812;|&#7816;|&#11378;|[\\u0057\\u24CC\\uFF37\\u1E80\\u1E82\\u0174\\u1E86\\u1E84\\u1E88\\u2C72])/g,\n    },\n    {\n      base: \"X\",\n      letters:\n        /(&#88;|&#9421;|&#65336;|&#7818;|&#7820;|[\\u0058\\u24CD\\uFF38\\u1E8A\\u1E8C])/g,\n    },\n    {\n      base: \"Y\",\n      letters:\n        /(&#89;|&#9422;|&#65337;|&#7922;|&#221;|&#374;|&#7928;|&#562;|&#7822;|&#376;|&#7926;|&#7924;|&#435;|&#590;|&#7934;|[\\u0059\\u24CE\\uFF39\\u1EF2\\u00DD\\u0176\\u1EF8\\u0232\\u1E8E\\u0178\\u1EF6\\u1EF4\\u01B3\\u024E\\u1EFE])/g,\n    },\n    {\n      base: \"Z\",\n      letters:\n        /(&#90;|&#9423;|&#65338;|&#377;|&#7824;|&#379;|&#381;|&#7826;|&#7828;|&#437;|&#548;|&#11391;|&#11371;|&#42850;|[\\u005A\\u24CF\\uFF3A\\u0179\\u1E90\\u017B\\u017D\\u1E92\\u1E94\\u01B5\\u0224\\u2C7F\\u2C6B\\uA762])/g,\n    },\n    {\n      base: \"a\",\n      letters:\n        /(&#97;|&#9424;|&#65345;|&#7834;|&#224;|&#225;|&#226;|&#7847;|&#7845;|&#7851;|&#7849;|&#227;|&#257;|&#259;|&#7857;|&#7855;|&#7861;|&#7859;|&#551;|&#481;|&#228;|&#479;|&#7843;|&#229;|&#507;|&#462;|&#513;|&#515;|&#7841;|&#7853;|&#7863;|&#7681;|&#261;|&#11365;|&#592;|[\\u0061\\u24D0\\uFF41\\u1E9A\\u00E0\\u00E1\\u00E2\\u1EA7\\u1EA5\\u1EAB\\u1EA9\\u00E3\\u0101\\u0103\\u1EB1\\u1EAF\\u1EB5\\u1EB3\\u0227\\u01E1\\u00E4\\u01DF\\u1EA3\\u00E5\\u01FB\\u01CE\\u0201\\u0203\\u1EA1\\u1EAD\\u1EB7\\u1E01\\u0105\\u2C65\\u0250])/g,\n    },\n    {\n      base: \"aa\",\n      letters: /(&#42803;|[\\uA733])/g,\n    },\n    {\n      base: \"ae\",\n      letters: /(&#230;|&#509;|&#483;|[\\u00E6\\u01FD\\u01E3])/g,\n    },\n    {\n      base: \"ao\",\n      letters: /(&#42805;|[\\uA735])/g,\n    },\n    {\n      base: \"au\",\n      letters: /(&#42807;|[\\uA737])/g,\n    },\n    {\n      base: \"av\",\n      letters: /(&#42809;|&#42811;|[\\uA739\\uA73B])/g,\n    },\n    {\n      base: \"ay\",\n      letters: /(&#42813;|[\\uA73D])/g,\n    },\n    {\n      base: \"b\",\n      letters:\n        /(&#98;|&#9425;|&#65346;|&#7683;|&#7685;|&#7687;|&#384;|&#387;|&#595;|[\\u0062\\u24D1\\uFF42\\u1E03\\u1E05\\u1E07\\u0180\\u0183\\u0253])/g,\n    },\n    {\n      base: \"c\",\n      letters:\n        /(&#99;|&#9426;|&#65347;|&#263;|&#265;|&#267;|&#269;|&#231;|&#7689;|&#392;|&#572;|&#42815;|&#8580;|[\\u0063\\u24D2\\uFF43\\u0107\\u0109\\u010B\\u010D\\u00E7\\u1E09\\u0188\\u023C\\uA73F\\u2184])/g,\n    },\n    {\n      base: \"d\",\n      letters:\n        /(&#100;|&#9427;|&#65348;|&#7691;|&#271;|&#7693;|&#7697;|&#7699;|&#7695;|&#273;|&#396;|&#598;|&#599;|&#42874;|&#240;|[\\u0064\\u24D3\\uFF44\\u1E0B\\u010F\\u1E0D\\u1E11\\u1E13\\u1E0F\\u0111\\u018C\\u0256\\u0257\\uA77A\\u00F0])/g,\n    },\n    {\n      base: \"dz\",\n      letters: /(&#499;|&#454;|[\\u01F3\\u01C6])/g,\n    },\n    {\n      base: \"e\",\n      letters:\n        /(&#101;|&#9428;|&#65349;|&#232;|&#233;|&#234;|&#7873;|&#7871;|&#7877;|&#7875;|&#7869;|&#275;|&#7701;|&#7703;|&#277;|&#279;|&#235;|&#7867;|&#283;|&#517;|&#519;|&#7865;|&#7879;|&#553;|&#7709;|&#281;|&#7705;|&#7707;|&#583;|&#603;|&#477;|[\\u0065\\u24D4\\uFF45\\u00E8\\u00E9\\u00EA\\u1EC1\\u1EBF\\u1EC5\\u1EC3\\u1EBD\\u0113\\u1E15\\u1E17\\u0115\\u0117\\u00EB\\u1EBB\\u011B\\u0205\\u0207\\u1EB9\\u1EC7\\u0229\\u1E1D\\u0119\\u1E19\\u1E1B\\u0247\\u025B\\u01DD])/g,\n    },\n    {\n      base: \"f\",\n      letters:\n        /(&#102;|&#9429;|&#65350;|&#7711;|&#402;|&#42876;|[\\u0066\\u24D5\\uFF46\\u1E1F\\u0192\\uA77C])/g,\n    },\n    {\n      base: \"g\",\n      letters:\n        /(&#103;|&#9430;|&#65351;|&#501;|&#285;|&#7713;|&#287;|&#289;|&#487;|&#291;|&#485;|&#608;|&#42913;|&#7545;|&#42879;|[\\u0067\\u24D6\\uFF47\\u01F5\\u011D\\u1E21\\u011F\\u0121\\u01E7\\u0123\\u01E5\\u0260\\uA7A1\\u1D79\\uA77F])/g,\n    },\n    {\n      base: \"h\",\n      letters:\n        /(&#104;|&#9431;|&#65352;|&#293;|&#7715;|&#7719;|&#543;|&#7717;|&#7721;|&#7723;|&#7830;|&#295;|&#11368;|&#11382;|&#613;|[\\u0068\\u24D7\\uFF48\\u0125\\u1E23\\u1E27\\u021F\\u1E25\\u1E29\\u1E2B\\u1E96\\u0127\\u2C68\\u2C76\\u0265])/g,\n    },\n    {\n      base: \"hv\",\n      letters: /(&#405;|[\\u0195])/g,\n    },\n    {\n      base: \"i\",\n      letters:\n        /(&#105;|&#9432;|&#65353;|&#236;|&#237;|&#238;|&#297;|&#299;|&#301;|&#239;|&#7727;|&#7881;|&#464;|&#521;|&#523;|&#7883;|&#303;|&#7725;|&#616;|&#305;|[\\u0069\\u24D8\\uFF49\\u00EC\\u00ED\\u00EE\\u0129\\u012B\\u012D\\u00EF\\u1E2F\\u1EC9\\u01D0\\u0209\\u020B\\u1ECB\\u012F\\u1E2D\\u0268\\u0131])/g,\n    },\n    {\n      base: \"ij\",\n      letters: /(&#307;|[\\u0133])/g,\n    },\n    {\n      base: \"j\",\n      letters:\n        /(&#106;|&#9433;|&#65354;|&#309;|&#496;|&#585;|[\\u006A\\u24D9\\uFF4A\\u0135\\u01F0\\u0249])/g,\n    },\n    {\n      base: \"k\",\n      letters:\n        /(&#107;|&#9434;|&#65355;|&#7729;|&#489;|&#7731;|&#311;|&#7733;|&#409;|&#11370;|&#42817;|&#42819;|&#42821;|&#42915;|[\\u006B\\u24DA\\uFF4B\\u1E31\\u01E9\\u1E33\\u0137\\u1E35\\u0199\\u2C6A\\uA741\\uA743\\uA745\\uA7A3])/g,\n    },\n    {\n      base: \"l\",\n      letters:\n        /(&#108;|&#9435;|&#65356;|&#320;|&#314;|&#318;|&#7735;|&#7737;|&#316;|&#7741;|&#7739;|&#322;|&#410;|&#619;|&#11361;|&#42825;|&#42881;|&#42823;|[\\u006C\\u24DB\\uFF4C\\u0140\\u013A\\u013E\\u1E37\\u1E39\\u013C\\u1E3D\\u1E3B\\u0142\\u019A\\u026B\\u2C61\\uA749\\uA781\\uA747])/g,\n    },\n    {\n      base: \"lj\",\n      letters: /(&#457;|[\\u01C9])/g,\n    },\n    {\n      base: \"m\",\n      letters:\n        /(&#109;|&#9436;|&#65357;|&#7743;|&#7745;|&#7747;|&#625;|&#623;|[\\u006D\\u24DC\\uFF4D\\u1E3F\\u1E41\\u1E43\\u0271\\u026F])/g,\n    },\n    {\n      base: \"n\",\n      letters:\n        /(&#110;|&#9437;|&#65358;|&#505;|&#324;|&#241;|&#7749;|&#328;|&#7751;|&#326;|&#7755;|&#7753;|&#414;|&#626;|&#329;|&#42897;|&#42917;|&#331;|[\\u006E\\u24DD\\uFF4E\\u01F9\\u0144\\u00F1\\u1E45\\u0148\\u1E47\\u0146\\u1E4B\\u1E49\\u019E\\u0272\\u0149\\uA791\\uA7A5\\u014B])/g,\n    },\n    {\n      base: \"nj\",\n      letters: /(&#460;|[\\u01CC])/g,\n    },\n    {\n      base: \"o\",\n      letters:\n        /(&#111;|&#9438;|&#65359;|&#242;|&#243;|&#244;|&#7891;|&#7889;|&#7895;|&#7893;|&#245;|&#7757;|&#557;|&#7759;|&#333;|&#7761;|&#7763;|&#335;|&#559;|&#561;|&#246;|&#555;|&#7887;|&#337;|&#466;|&#525;|&#527;|&#417;|&#7901;|&#7899;|&#7905;|&#7903;|&#7907;|&#7885;|&#7897;|&#491;|&#493;|&#248;|&#511;|&#596;|&#42827;|&#42829;|&#629;|[\\u006F\\u24DE\\uFF4F\\u00F2\\u00F3\\u00F4\\u1ED3\\u1ED1\\u1ED7\\u1ED5\\u00F5\\u1E4D\\u022D\\u1E4F\\u014D\\u1E51\\u1E53\\u014F\\u022F\\u0231\\u00F6\\u022B\\u1ECF\\u0151\\u01D2\\u020D\\u020F\\u01A1\\u1EDD\\u1EDB\\u1EE1\\u1EDF\\u1EE3\\u1ECD\\u1ED9\\u01EB\\u01ED\\u00F8\\u01FF\\u0254\\uA74B\\uA74D\\u0275])/g,\n    },\n    {\n      base: \"oe\",\n      letters: /(&#339;|[\\u0153])/g,\n    },\n    {\n      base: \"oi\",\n      letters: /(&#419;|[\\u01A3])/g,\n    },\n    {\n      base: \"ou\",\n      letters: /(&#547;|[\\u0223])/g,\n    },\n    {\n      base: \"oo\",\n      letters: /(&#42831;|[\\uA74F])/g,\n    },\n    {\n      base: \"p\",\n      letters:\n        /(&#112;|&#9439;|&#65360;|&#7765;|&#7767;|&#421;|&#7549;|&#42833;|&#42835;|&#42837;|[\\u0070\\u24DF\\uFF50\\u1E55\\u1E57\\u01A5\\u1D7D\\uA751\\uA753\\uA755])/g,\n    },\n    {\n      base: \"q\",\n      letters:\n        /(&#113;|&#9440;|&#65361;|&#587;|&#42839;|&#42841;|[\\u0071\\u24E0\\uFF51\\u024B\\uA757\\uA759])/g,\n    },\n    {\n      base: \"r\",\n      letters:\n        /(&#114;|&#9441;|&#65362;|&#341;|&#7769;|&#345;|&#529;|&#531;|&#7771;|&#7773;|&#343;|&#7775;|&#589;|&#637;|&#42843;|&#42919;|&#42883;|[\\u0072\\u24E1\\uFF52\\u0155\\u1E59\\u0159\\u0211\\u0213\\u1E5B\\u1E5D\\u0157\\u1E5F\\u024D\\u027D\\uA75B\\uA7A7\\uA783])/g,\n    },\n    {\n      base: \"s\",\n      letters:\n        /(&#115;|&#9442;|&#65363;|&#347;|&#7781;|&#349;|&#7777;|&#353;|&#7783;|&#7779;|&#7785;|&#537;|&#351;|&#575;|&#42921;|&#42885;|&#7835;|&#383;|[\\u0073\\u24E2\\uFF53\\u015B\\u1E65\\u015D\\u1E61\\u0161\\u1E67\\u1E63\\u1E69\\u0219\\u015F\\u023F\\uA7A9\\uA785\\u1E9B\\u017F])/g,\n    },\n    {\n      base: \"ss\",\n      letters: /(&#223;|[\\u00DF])/g,\n    },\n    {\n      base: \"t\",\n      letters:\n        /(&#116;|&#9443;|&#65364;|&#7787;|&#7831;|&#357;|&#7789;|&#539;|&#355;|&#7793;|&#7791;|&#359;|&#429;|&#648;|&#11366;|&#42887;|[\\u0074\\u24E3\\uFF54\\u1E6B\\u1E97\\u0165\\u1E6D\\u021B\\u0163\\u1E71\\u1E6F\\u0167\\u01AD\\u0288\\u2C66\\uA787])/g,\n    },\n    {\n      base: \"th\",\n      letters: /(&#254;|[\\u00FE])/g,\n    },\n    {\n      base: \"tz\",\n      letters: /(&#42793;|[\\uA729])/g,\n    },\n    {\n      base: \"u\",\n      letters:\n        /(&#117;|&#9444;|&#65365;|&#249;|&#250;|&#251;|&#361;|&#7801;|&#363;|&#7803;|&#365;|&#252;|&#476;|&#472;|&#470;|&#474;|&#7911;|&#367;|&#369;|&#468;|&#533;|&#535;|&#432;|&#7915;|&#7913;|&#7919;|&#7917;|&#7921;|&#7909;|&#7795;|&#371;|&#7799;|&#7797;|&#649;|[\\u0075\\u24E4\\uFF55\\u00F9\\u00FA\\u00FB\\u0169\\u1E79\\u016B\\u1E7B\\u016D\\u00FC\\u01DC\\u01D8\\u01D6\\u01DA\\u1EE7\\u016F\\u0171\\u01D4\\u0215\\u0217\\u01B0\\u1EEB\\u1EE9\\u1EEF\\u1EED\\u1EF1\\u1EE5\\u1E73\\u0173\\u1E77\\u1E75\\u0289])/g,\n    },\n    {\n      base: \"v\",\n      letters:\n        /(&#118;|&#9445;|&#65366;|&#7805;|&#7807;|&#651;|&#42847;|&#652;|[\\u0076\\u24E5\\uFF56\\u1E7D\\u1E7F\\u028B\\uA75F\\u028C])/g,\n    },\n    {\n      base: \"vy\",\n      letters: /(&#42849;|[\\uA761])/g,\n    },\n    {\n      base: \"w\",\n      letters:\n        /(&#119;|&#9446;|&#65367;|&#7809;|&#7811;|&#373;|&#7815;|&#7813;|&#7832;|&#7817;|&#11379;|[\\u0077\\u24E6\\uFF57\\u1E81\\u1E83\\u0175\\u1E87\\u1E85\\u1E98\\u1E89\\u2C73])/g,\n    },\n    {\n      base: \"x\",\n      letters:\n        /(&#120;|&#9447;|&#65368;|&#7819;|&#7821;|[\\u0078\\u24E7\\uFF58\\u1E8B\\u1E8D])/g,\n    },\n    {\n      base: \"y\",\n      letters:\n        /(&#121;|&#9448;|&#65369;|&#7923;|&#253;|&#375;|&#7929;|&#563;|&#7823;|&#255;|&#7927;|&#7833;|&#7925;|&#436;|&#591;|&#7935;|[\\u0079\\u24E8\\uFF59\\u1EF3\\u00FD\\u0177\\u1EF9\\u0233\\u1E8F\\u00FF\\u1EF7\\u1E99\\u1EF5\\u01B4\\u024F\\u1EFF])/g,\n    },\n    {\n      base: \"z\",\n      letters:\n        /(&#122;|&#9449;|&#65370;|&#378;|&#7825;|&#380;|&#382;|&#7827;|&#7829;|&#438;|&#549;|&#576;|&#11372;|&#42851;|[\\u007A\\u24E9\\uFF5A\\u017A\\u1E91\\u017C\\u017E\\u1E93\\u1E95\\u01B6\\u0225\\u0240\\u2C6C\\uA763])/g,\n    },\n  ],\n  e9 = function (t) {\n    var n = t;\n    return (\n      J7.forEach(function (o) {\n        n = n.replace(o.letters, o.base);\n      }),\n      n\n    );\n  },\n  ou = function (t) {\n    return e9(t).toLowerCase();\n  },\n  qd = function (t, n, o) {\n    return o ? ou(t).indexOf(ou(n)) : t.toLowerCase().indexOf(n.toLowerCase());\n  },\n  t9 = function () {\n    return !!document.documentMode;\n  },\n  ws = function (t) {\n    return typeof t == \"number\";\n  },\n  n9 = function (t) {\n    return t === Object(t) ? Object.keys(t) : [];\n  },\n  o9 = function (t) {\n    for (\n      var n, o = arguments.length, r = new Array(o > 1 ? o - 1 : 0), i = 1;\n      i < o;\n      i++\n    )\n      r[i - 1] = arguments[i];\n    var a = (n = []).concat.apply(n, r);\n    return Object.keys(t).reduce(function (l, s) {\n      return (\n        t.hasOwnProperty(s) &&\n          !a.includes(s) &&\n          t[s] !== void 0 &&\n          (l[s] = t[s]),\n        l\n      );\n    }, {});\n  },\n  r9 = [\"style\", \"className\", \"classNames\"];\nfunction ru(e, t) {\n  var n = Object.keys(e);\n  if (Object.getOwnPropertySymbols) {\n    var o = Object.getOwnPropertySymbols(e);\n    t &&\n      (o = o.filter(function (r) {\n        return Object.getOwnPropertyDescriptor(e, r).enumerable;\n      })),\n      n.push.apply(n, o);\n  }\n  return n;\n}\nfunction iu(e) {\n  for (var t = 1; t < arguments.length; t++) {\n    var n = arguments[t] != null ? arguments[t] : {};\n    t % 2\n      ? ru(Object(n), !0).forEach(function (o) {\n          be(e, o, n[o]);\n        })\n      : Object.getOwnPropertyDescriptors\n        ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n))\n        : ru(Object(n)).forEach(function (o) {\n            Object.defineProperty(e, o, Object.getOwnPropertyDescriptor(n, o));\n          });\n  }\n  return e;\n}\nfunction la(e, t) {\n  var n = function (r) {\n    var i = function (s) {\n        var u = s.style,\n          c = s.className,\n          d = s.classNames,\n          p = C7(s, r9),\n          h = t ? t(p) : void 0,\n          m = xc(\n            e,\n            {\n              style: u,\n              className: c,\n              classNames: d,\n            },\n            h,\n          );\n        return /* @__PURE__ */ $.createElement(\n          r,\n          zt({}, p, {\n            style: m,\n          }),\n        );\n      },\n      a = r.displayName || r.name || \"Component\";\n    return (\n      (i.displayName = \"defaultStyle(\".concat(a, \")\")),\n      /* @__PURE__ */ $.forwardRef(function (l, s) {\n        return i(\n          iu(\n            iu({}, l),\n            {},\n            {\n              ref: s,\n            },\n          ),\n        );\n      })\n    );\n  };\n  return n;\n}\nvar i9 = function (t, n) {\n  return t.hasOwnProperty(n) ? t[n]++ : (t[n] = 0), n + \"_\" + t[n];\n};\nfunction Yd(e) {\n  var t = e.selectionStart,\n    n = e.selectionEnd,\n    o = e.value,\n    r = o === void 0 ? \"\" : o,\n    i = e.onCaretPositionChange,\n    a = e.containerRef,\n    l = e.children;\n  e.singleLine;\n  var s = e.style,\n    u = se({\n      left: void 0,\n      top: void 0,\n    }),\n    c = Fi(u, 2),\n    d = c[0],\n    p = c[1],\n    h = se(),\n    m = Fi(h, 2),\n    b = m[0],\n    y = m[1];\n  ue(function () {\n    g();\n  });\n  var g = function () {\n      if (b) {\n        var k = b.offsetLeft,\n          N = b.offsetTop;\n        if (!(d.left === k && d.top === N)) {\n          var T = {\n            left: k,\n            top: N,\n          };\n          p(T), i(T);\n        }\n      }\n    },\n    x = On(l),\n    v;\n  n === t && (v = mt(r, x, t, \"START\"));\n  var S = [],\n    w = {},\n    E = S,\n    M = 0,\n    _ = function (k, N, T) {\n      if (ws(v) && v >= N && v <= N + k.length) {\n        var F = v - N;\n        E.push(R(k.substring(0, F), M)), (E = [R(k.substring(F), M)]);\n      } else E.push(R(k, M));\n      M++;\n    },\n    j = function (k, N, T, F, I, L, C) {\n      var H = i9(w, F);\n      E.push(D(F, I, L, H));\n    },\n    R = function (k, N) {\n      return /* @__PURE__ */ $.createElement(\n        \"span\",\n        zt({}, s(\"substring\"), {\n          key: N,\n        }),\n        k,\n      );\n    },\n    D = function (k, N, T, F) {\n      var I = {\n          id: k,\n          display: N,\n          key: F,\n        },\n        L = ko.toArray(l)[T];\n      return /* @__PURE__ */ $.cloneElement(L, I);\n    },\n    P = function (k) {\n      return /* @__PURE__ */ $.createElement(\n        \"span\",\n        zt({}, s(\"caret\"), {\n          ref: y,\n          key: \"caret\",\n        }),\n        k,\n      );\n    };\n  return (\n    Dr(r, x, j, _),\n    E.push(\" \"),\n    E !== S && S.push(P(E)),\n    /* @__PURE__ */ $.createElement(\n      \"div\",\n      zt({}, s, {\n        ref: a,\n      }),\n      S,\n    )\n  );\n}\nYd.propTypes = {\n  selectionStart: q.number,\n  selectionEnd: q.number,\n  value: q.string.isRequired,\n  onCaretPositionChange: q.func.isRequired,\n  containerRef: q.oneOfType([\n    q.func,\n    q.shape({\n      current: typeof Element > \"u\" ? q.any : q.instanceOf(Element),\n    }),\n  ]),\n  children: q.oneOfType([q.element, q.arrayOf(q.element)]).isRequired,\n};\nvar a9 = la(\n    {\n      position: \"relative\",\n      boxSizing: \"border-box\",\n      width: \"100%\",\n      color: \"transparent\",\n      overflow: \"hidden\",\n      whiteSpace: \"pre-wrap\",\n      wordWrap: \"break-word\",\n      border: \"1px solid transparent\",\n      textAlign: \"start\",\n      \"&singleLine\": {\n        whiteSpace: \"pre\",\n        wordWrap: null,\n      },\n      substring: {\n        visibility: \"hidden\",\n      },\n    },\n    function (e) {\n      return {\n        \"&singleLine\": e.singleLine,\n      };\n    },\n  ),\n  l9 = a9(Yd);\nfunction Gd(e) {\n  var t = e.id,\n    n = e.focused,\n    o = e.ignoreAccents,\n    r = e.index,\n    i = e.onClick,\n    a = e.onMouseEnter,\n    l = e.query,\n    s = e.renderSuggestion,\n    u = e.suggestion,\n    c = e.style;\n  e.className, e.classNames;\n  var d = {\n      onClick: i,\n      onMouseEnter: a,\n    },\n    p = function () {\n      var y = h(),\n        g = m(y);\n      return s ? s(u, l, g, r, n) : g;\n    },\n    h = function () {\n      if (typeof u == \"string\") return u;\n      var y = u.id,\n        g = u.display;\n      return y === void 0 || !g ? y : g;\n    },\n    m = function (y) {\n      var g = qd(y, l, o);\n      return g === -1\n        ? /* @__PURE__ */ $.createElement(\"span\", c(\"display\"), y)\n        : /* @__PURE__ */ $.createElement(\n            \"span\",\n            c(\"display\"),\n            y.substring(0, g),\n            /* @__PURE__ */ $.createElement(\n              \"b\",\n              c(\"highlight\"),\n              y.substring(g, g + l.length),\n            ),\n            y.substring(g + l.length),\n          );\n    };\n  return /* @__PURE__ */ $.createElement(\n    \"li\",\n    zt(\n      {\n        id: t,\n        role: \"option\",\n        \"aria-selected\": n,\n      },\n      d,\n      c,\n    ),\n    p(),\n  );\n}\nGd.propTypes = {\n  id: q.string.isRequired,\n  query: q.string.isRequired,\n  index: q.number.isRequired,\n  ignoreAccents: q.bool,\n  suggestion: q.oneOfType([\n    q.string,\n    q.shape({\n      id: q.oneOfType([q.string, q.number]).isRequired,\n      display: q.string,\n    }),\n  ]).isRequired,\n  renderSuggestion: q.func,\n  focused: q.bool,\n};\nvar s9 = la(\n    {\n      cursor: \"pointer\",\n    },\n    function (e) {\n      return {\n        \"&focused\": e.focused,\n      };\n    },\n  ),\n  c9 = s9(Gd);\nfunction u9(e) {\n  var t = e.style,\n    n = e.className,\n    o = e.classNames,\n    r = xc(d9, {\n      style: t,\n      className: n,\n      classNames: o,\n    }),\n    i = r(\"spinner\");\n  return /* @__PURE__ */ $.createElement(\n    \"div\",\n    r,\n    /* @__PURE__ */ $.createElement(\n      \"div\",\n      i,\n      /* @__PURE__ */ $.createElement(\"div\", i([\"element\", \"element1\"])),\n      /* @__PURE__ */ $.createElement(\"div\", i([\"element\", \"element2\"])),\n      /* @__PURE__ */ $.createElement(\"div\", i([\"element\", \"element3\"])),\n      /* @__PURE__ */ $.createElement(\"div\", i([\"element\", \"element4\"])),\n      /* @__PURE__ */ $.createElement(\"div\", i([\"element\", \"element5\"])),\n    ),\n  );\n}\nvar d9 = {};\nfunction Kd(e) {\n  var t = e.id,\n    n = e.suggestions,\n    o = n === void 0 ? {} : n,\n    r = e.a11ySuggestionsListLabel,\n    i = e.focusIndex,\n    a = e.position,\n    l = e.left,\n    s = e.right,\n    u = e.top,\n    c = e.scrollFocusedIntoView,\n    d = e.isLoading,\n    p = e.isOpened,\n    h = e.onSelect,\n    m =\n      h === void 0\n        ? function () {\n            return null;\n          }\n        : h,\n    b = e.ignoreAccents,\n    y = e.containerRef,\n    g = e.children,\n    x = e.style,\n    v = e.customSuggestionsContainer,\n    S = e.onMouseDown,\n    w = e.onMouseEnter,\n    E = se(void 0),\n    M = Fi(E, 2),\n    _ = M[0],\n    j = M[1];\n  ue(\n    function () {\n      if (!(!_ || _.offsetHeight >= _.scrollHeight || !c)) {\n        var T = _.scrollTop,\n          F = _.children[i].getBoundingClientRect(),\n          I = F.top,\n          L = F.bottom,\n          C = _.getBoundingClientRect(),\n          H = C.top;\n        (I = I - H + T),\n          (L = L - H + T),\n          I < T\n            ? (_.scrollTop = I)\n            : L > _.offsetHeight && (_.scrollTop = L - _.offsetHeight);\n      }\n    },\n    [i, c, _],\n  );\n  var R = function () {\n      var F = /* @__PURE__ */ $.createElement(\n        \"ul\",\n        zt(\n          {\n            ref: j,\n            id: t,\n            role: \"listbox\",\n            \"aria-label\": r,\n          },\n          x(\"list\"),\n        ),\n        Object.values(o).reduce(function (I, L) {\n          var C = L.results,\n            H = L.queryInfo;\n          return [].concat(\n            Di(I),\n            Di(\n              C.map(function (B, A) {\n                return D(B, H, I.length + A);\n              }),\n            ),\n          );\n        }, []),\n      );\n      return v ? v(F) : F;\n    },\n    D = function (F, I, L) {\n      var C = L === i,\n        H = I.childIndex,\n        B = I.query,\n        A = ko.toArray(g)[H].props.renderSuggestion;\n      return /* @__PURE__ */ $.createElement(c9, {\n        style: x(\"item\"),\n        key: \"\".concat(H, \"-\").concat(N(F)),\n        id: Ud(t, L),\n        query: B,\n        index: L,\n        ignoreAccents: b,\n        renderSuggestion: A,\n        suggestion: F,\n        focused: C,\n        onClick: function () {\n          return k(F, I);\n        },\n        onMouseEnter: function () {\n          return V(L);\n        },\n      });\n    },\n    P = function () {\n      if (d)\n        return /* @__PURE__ */ $.createElement(u9, {\n          style: x(\"loadingIndicator\"),\n        });\n    },\n    V = function (F, I) {\n      w && w(F);\n    },\n    k = function (F, I) {\n      m(F, I);\n    },\n    N = function (F) {\n      return typeof F == \"string\" ? F : F.id;\n    };\n  return p\n    ? /* @__PURE__ */ $.createElement(\n        \"div\",\n        zt(\n          {},\n          R7(\n            {\n              position: a || \"absolute\",\n              left: l,\n              right: s,\n              top: u,\n            },\n            x,\n          ),\n          {\n            onMouseDown: S,\n            ref: y,\n          },\n        ),\n        R(),\n        P(),\n      )\n    : null;\n}\nKd.propTypes = {\n  id: q.string.isRequired,\n  suggestions: q.object.isRequired,\n  a11ySuggestionsListLabel: q.string,\n  focusIndex: q.number,\n  position: q.string,\n  left: q.number,\n  right: q.number,\n  top: q.number,\n  scrollFocusedIntoView: q.bool,\n  isLoading: q.bool,\n  isOpened: q.bool.isRequired,\n  onSelect: q.func,\n  ignoreAccents: q.bool,\n  customSuggestionsContainer: q.func,\n  containerRef: q.oneOfType([\n    q.func,\n    q.shape({\n      current: typeof Element > \"u\" ? q.any : q.instanceOf(Element),\n    }),\n  ]),\n};\nvar f9 = la({\n    zIndex: 1,\n    backgroundColor: \"white\",\n    marginTop: 14,\n    minWidth: 100,\n    list: {\n      margin: 0,\n      padding: 0,\n      listStyleType: \"none\",\n    },\n  }),\n  h9 = f9(Kd);\nfunction au(e, t) {\n  var n = Object.keys(e);\n  if (Object.getOwnPropertySymbols) {\n    var o = Object.getOwnPropertySymbols(e);\n    t &&\n      (o = o.filter(function (r) {\n        return Object.getOwnPropertyDescriptor(e, r).enumerable;\n      })),\n      n.push.apply(n, o);\n  }\n  return n;\n}\nfunction qt(e) {\n  for (var t = 1; t < arguments.length; t++) {\n    var n = arguments[t] != null ? arguments[t] : {};\n    t % 2\n      ? au(Object(n), !0).forEach(function (o) {\n          be(e, o, n[o]);\n        })\n      : Object.getOwnPropertyDescriptors\n        ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n))\n        : au(Object(n)).forEach(function (o) {\n            Object.defineProperty(e, o, Object.getOwnPropertyDescriptor(n, o));\n          });\n  }\n  return e;\n}\nfunction p9(e) {\n  var t = g9();\n  return function () {\n    var o = ji(e),\n      r;\n    if (t) {\n      var i = ji(this).constructor;\n      r = Reflect.construct(o, arguments, i);\n    } else r = o.apply(this, arguments);\n    return f7(this, r);\n  };\n}\nfunction g9() {\n  if (typeof Reflect > \"u\" || !Reflect.construct || Reflect.construct.sham)\n    return !1;\n  if (typeof Proxy == \"function\") return !0;\n  try {\n    return (\n      Boolean.prototype.valueOf.call(\n        Reflect.construct(Boolean, [], function () {}),\n      ),\n      !0\n    );\n  } catch {\n    return !1;\n  }\n}\nvar m9 = function (t) {\n    var n = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n    if (t instanceof RegExp) return t;\n    var o = n.allowSpaceInQuery,\n      r = vi(t);\n    return new RegExp(\n      \"(?:^|\\\\s)(\"\n        .concat(r, \"([^\")\n        .concat(o ? \"\" : \"\\\\s\")\n        .concat(r, \"]*))$\"),\n    );\n  },\n  b9 = function (t, n) {\n    return t instanceof Array\n      ? function (o, r) {\n          for (var i = [], a = 0, l = t.length; a < l; ++a) {\n            var s = t[a].display || t[a].id;\n            qd(s, o, n) >= 0 && i.push(t[a]);\n          }\n          return i;\n        }\n      : t;\n  },\n  so = {\n    TAB: 9,\n    RETURN: 13,\n    ESC: 27,\n    UP: 38,\n    DOWN: 40,\n  },\n  Jr = !1,\n  Xd = {\n    /**\n     * If set to `true` a regular text input element will be rendered\n     * instead of a textarea\n     */\n    singleLine: q.bool,\n    allowSpaceInQuery: q.bool,\n    allowSuggestionsAboveCursor: q.bool,\n    forceSuggestionsAboveCursor: q.bool,\n    ignoreAccents: q.bool,\n    a11ySuggestionsListLabel: q.string,\n    value: q.string,\n    onKeyDown: q.func,\n    customSuggestionsContainer: q.func,\n    onSelect: q.func,\n    onBlur: q.func,\n    onChange: q.func,\n    suggestionsPortalHost:\n      typeof Element > \"u\" ? q.any : q.PropTypes.instanceOf(Element),\n    inputRef: q.oneOfType([\n      q.func,\n      q.shape({\n        current: typeof Element > \"u\" ? q.any : q.instanceOf(Element),\n      }),\n    ]),\n    children: q.oneOfType([q.element, q.arrayOf(q.element)]).isRequired,\n  },\n  Ec = /* @__PURE__ */ (function (e) {\n    d7(n, e);\n    var t = p9(n);\n    function n(o) {\n      var r;\n      return (\n        s7(this, n),\n        (r = t.call(this, o)),\n        be(ve(r), \"setContainerElement\", function (i) {\n          r.containerElement = i;\n        }),\n        be(ve(r), \"getInputProps\", function () {\n          var i = r.props,\n            a = i.readOnly,\n            l = i.disabled,\n            s = i.style,\n            u = o9(\n              r.props,\n              [\"style\", \"classNames\", \"className\"],\n              // substyle props\n              n9(Xd),\n            );\n          return qt(\n            qt(\n              qt(qt({}, u), s(\"input\")),\n              {},\n              {\n                value: r.getPlainText(),\n                onScroll: r.updateHighlighterScroll,\n              },\n              !a &&\n                !l && {\n                  onChange: r.handleChange,\n                  onSelect: r.handleSelect,\n                  onKeyDown: r.handleKeyDown,\n                  onBlur: r.handleBlur,\n                  onCompositionStart: r.handleCompositionStart,\n                  onCompositionEnd: r.handleCompositionEnd,\n                },\n            ),\n            r.isOpened() && {\n              role: \"combobox\",\n              \"aria-controls\": r.uuidSuggestionsOverlay,\n              \"aria-expanded\": !0,\n              \"aria-autocomplete\": \"list\",\n              \"aria-haspopup\": \"listbox\",\n              \"aria-activedescendant\": Ud(\n                r.uuidSuggestionsOverlay,\n                r.state.focusIndex,\n              ),\n            },\n          );\n        }),\n        be(ve(r), \"renderControl\", function () {\n          var i = r.props,\n            a = i.singleLine,\n            l = i.style,\n            s = r.getInputProps();\n          return /* @__PURE__ */ $.createElement(\n            \"div\",\n            l(\"control\"),\n            r.renderHighlighter(),\n            a ? r.renderInput(s) : r.renderTextarea(s),\n          );\n        }),\n        be(ve(r), \"renderInput\", function (i) {\n          return /* @__PURE__ */ $.createElement(\n            \"input\",\n            zt(\n              {\n                type: \"text\",\n                ref: r.setInputRef,\n              },\n              i,\n            ),\n          );\n        }),\n        be(ve(r), \"renderTextarea\", function (i) {\n          return /* @__PURE__ */ $.createElement(\n            \"textarea\",\n            zt(\n              {\n                ref: r.setInputRef,\n              },\n              i,\n            ),\n          );\n        }),\n        be(ve(r), \"setInputRef\", function (i) {\n          r.inputElement = i;\n          var a = r.props.inputRef;\n          typeof a == \"function\" ? a(i) : a && (a.current = i);\n        }),\n        be(ve(r), \"setSuggestionsElement\", function (i) {\n          r.suggestionsElement = i;\n        }),\n        be(ve(r), \"renderSuggestionsOverlay\", function () {\n          if (!ws(r.state.selectionStart)) return null;\n          var i = r.state.suggestionsPosition,\n            a = i.position,\n            l = i.left,\n            s = i.top,\n            u = i.right,\n            c = /* @__PURE__ */ $.createElement(\n              h9,\n              {\n                id: r.uuidSuggestionsOverlay,\n                style: r.props.style(\"suggestions\"),\n                position: a,\n                left: l,\n                top: s,\n                right: u,\n                focusIndex: r.state.focusIndex,\n                scrollFocusedIntoView: r.state.scrollFocusedIntoView,\n                containerRef: r.setSuggestionsElement,\n                suggestions: r.state.suggestions,\n                customSuggestionsContainer: r.props.customSuggestionsContainer,\n                onSelect: r.addMention,\n                onMouseDown: r.handleSuggestionsMouseDown,\n                onMouseEnter: r.handleSuggestionsMouseEnter,\n                isLoading: r.isLoading(),\n                isOpened: r.isOpened(),\n                ignoreAccents: r.props.ignoreAccents,\n                a11ySuggestionsListLabel: r.props.a11ySuggestionsListLabel,\n              },\n              r.props.children,\n            );\n          return r.props.suggestionsPortalHost\n            ? /* @__PURE__ */ y4.createPortal(c, r.props.suggestionsPortalHost)\n            : c;\n        }),\n        be(ve(r), \"renderHighlighter\", function () {\n          var i = r.state,\n            a = i.selectionStart,\n            l = i.selectionEnd,\n            s = r.props,\n            u = s.singleLine,\n            c = s.children,\n            d = s.value,\n            p = s.style;\n          return /* @__PURE__ */ $.createElement(\n            l9,\n            {\n              containerRef: r.setHighlighterElement,\n              style: p(\"highlighter\"),\n              value: d,\n              singleLine: u,\n              selectionStart: a,\n              selectionEnd: l,\n              onCaretPositionChange: r.handleCaretPositionChange,\n            },\n            c,\n          );\n        }),\n        be(ve(r), \"setHighlighterElement\", function (i) {\n          r.highlighterElement = i;\n        }),\n        be(ve(r), \"handleCaretPositionChange\", function (i) {\n          r.setState({\n            caretPosition: i,\n          });\n        }),\n        be(ve(r), \"getPlainText\", function () {\n          return $n(r.props.value || \"\", On(r.props.children));\n        }),\n        be(ve(r), \"executeOnChange\", function (i) {\n          for (\n            var a = arguments.length, l = new Array(a > 1 ? a - 1 : 0), s = 1;\n            s < a;\n            s++\n          )\n            l[s - 1] = arguments[s];\n          if (r.props.onChange) {\n            var u;\n            return (u = r.props).onChange.apply(u, [i].concat(l));\n          }\n          if (r.props.valueLink) {\n            var c;\n            return (c = r.props.valueLink).requestChange.apply(\n              c,\n              [i.target.value].concat(l),\n            );\n          }\n        }),\n        be(ve(r), \"handleChange\", function (i) {\n          if (((Jr = !1), t9())) {\n            var a =\n              (document.activeElement &&\n                document.activeElement.contentDocument) ||\n              document;\n            if (a.activeElement !== i.target) return;\n          }\n          var l = r.props.value || \"\",\n            s = On(r.props.children),\n            u = i.target.value,\n            c = r.state.selectionStart;\n          c == null && (c = i.target.selectionStart);\n          var d = r.state.selectionEnd;\n          d == null && (d = i.target.selectionEnd);\n          var p = Y7(\n            l,\n            u,\n            {\n              selectionStartBefore: c,\n              selectionEndBefore: d,\n              selectionEndAfter: i.target.selectionEnd,\n            },\n            s,\n          );\n          u = $n(p, s);\n          var h = i.target.selectionStart,\n            m = i.target.selectionEnd,\n            b = !1,\n            y = nu(l, s, h);\n          y !== void 0 &&\n            r.state.selectionEnd > y &&\n            ((h = y + (i.nativeEvent.data ? i.nativeEvent.data.length : 0)),\n            (m = h),\n            (b = !0)),\n            r.setState({\n              selectionStart: h,\n              selectionEnd: m,\n              setSelectionAfterMentionChange: b,\n            });\n          var g = er(p, s);\n          i.nativeEvent.isComposing &&\n            h === m &&\n            r.updateMentionsQueries(r.inputElement.value, h);\n          var x = {\n            target: {\n              value: p,\n            },\n          };\n          r.executeOnChange(x, p, u, g);\n        }),\n        be(ve(r), \"handleSelect\", function (i) {\n          if (\n            (r.setState({\n              selectionStart: i.target.selectionStart,\n              selectionEnd: i.target.selectionEnd,\n            }),\n            !Jr)\n          ) {\n            var a = r.inputElement;\n            i.target.selectionStart === i.target.selectionEnd\n              ? r.updateMentionsQueries(a.value, i.target.selectionStart)\n              : r.clearSuggestions(),\n              r.updateHighlighterScroll(),\n              r.props.onSelect(i);\n          }\n        }),\n        be(ve(r), \"handleKeyDown\", function (i) {\n          var a = Qr(r.state.suggestions);\n          if (a === 0 || !r.suggestionsElement) {\n            r.props.onKeyDown(i);\n            return;\n          }\n          switch (\n            (Object.values(so).indexOf(i.keyCode) >= 0 &&\n              (i.preventDefault(), i.stopPropagation()),\n            i.keyCode)\n          ) {\n            case so.ESC: {\n              r.clearSuggestions();\n              return;\n            }\n            case so.DOWN: {\n              r.shiftFocus(1);\n              return;\n            }\n            case so.UP: {\n              r.shiftFocus(-1);\n              return;\n            }\n            case so.RETURN: {\n              r.selectFocused();\n              return;\n            }\n            case so.TAB: {\n              r.selectFocused();\n              return;\n            }\n            default:\n              return;\n          }\n        }),\n        be(ve(r), \"shiftFocus\", function (i) {\n          var a = Qr(r.state.suggestions);\n          r.setState({\n            focusIndex: (a + r.state.focusIndex + i) % a,\n            scrollFocusedIntoView: !0,\n          });\n        }),\n        be(ve(r), \"selectFocused\", function () {\n          var i = r.state,\n            a = i.suggestions,\n            l = i.focusIndex,\n            s = Object.values(a).reduce(function (d, p) {\n              var h = p.results,\n                m = p.queryInfo;\n              return [].concat(\n                Di(d),\n                Di(\n                  h.map(function (b) {\n                    return {\n                      result: b,\n                      queryInfo: m,\n                    };\n                  }),\n                ),\n              );\n            }, [])[l],\n            u = s.result,\n            c = s.queryInfo;\n          r.addMention(u, c),\n            r.setState({\n              focusIndex: 0,\n            });\n        }),\n        be(ve(r), \"handleBlur\", function (i) {\n          var a = r._suggestionsMouseDown;\n          (r._suggestionsMouseDown = !1),\n            a ||\n              r.setState({\n                selectionStart: null,\n                selectionEnd: null,\n              }),\n            window.setTimeout(function () {\n              r.updateHighlighterScroll();\n            }, 1),\n            r.props.onBlur(i, a);\n        }),\n        be(ve(r), \"handleSuggestionsMouseDown\", function (i) {\n          r._suggestionsMouseDown = !0;\n        }),\n        be(ve(r), \"handleSuggestionsMouseEnter\", function (i) {\n          r.setState({\n            focusIndex: i,\n            scrollFocusedIntoView: !1,\n          });\n        }),\n        be(ve(r), \"updateSuggestionsPosition\", function () {\n          var i = r.state.caretPosition,\n            a = r.props,\n            l = a.suggestionsPortalHost,\n            s = a.allowSuggestionsAboveCursor,\n            u = a.forceSuggestionsAboveCursor;\n          if (!(!i || !r.suggestionsElement)) {\n            var c = r.suggestionsElement,\n              d = r.highlighterElement,\n              p = d.getBoundingClientRect(),\n              h = Nl(d, \"font-size\"),\n              m = {\n                left: p.left + i.left,\n                top: p.top + i.top + h,\n              },\n              b = Math.max(\n                document.documentElement.clientHeight,\n                window.innerHeight || 0,\n              );\n            if (c) {\n              var y = {};\n              if (l) {\n                y.position = \"fixed\";\n                var g = m.left,\n                  x = m.top;\n                (g -= Nl(c, \"margin-left\")),\n                  (x -= Nl(c, \"margin-top\")),\n                  (g -= d.scrollLeft),\n                  (x -= d.scrollTop);\n                var v = Math.max(\n                  document.documentElement.clientWidth,\n                  window.innerWidth || 0,\n                );\n                g + c.offsetWidth > v\n                  ? (y.left = Math.max(0, v - c.offsetWidth))\n                  : (y.left = g),\n                  (s && x + c.offsetHeight > b && c.offsetHeight < x - h) || u\n                    ? (y.top = Math.max(0, x - c.offsetHeight - h))\n                    : (y.top = x);\n              } else {\n                var S = i.left - d.scrollLeft,\n                  w = i.top - d.scrollTop;\n                S + c.offsetWidth > r.containerElement.offsetWidth\n                  ? (y.right = 0)\n                  : (y.left = S),\n                  (s &&\n                    m.top - d.scrollTop + c.offsetHeight > b &&\n                    c.offsetHeight < p.top - h - d.scrollTop) ||\n                  u\n                    ? (y.top = w - c.offsetHeight - h)\n                    : (y.top = w);\n              }\n              (y.left === r.state.suggestionsPosition.left &&\n                y.top === r.state.suggestionsPosition.top &&\n                y.position === r.state.suggestionsPosition.position) ||\n                r.setState({\n                  suggestionsPosition: y,\n                });\n            }\n          }\n        }),\n        be(ve(r), \"updateHighlighterScroll\", function () {\n          var i = r.inputElement,\n            a = r.highlighterElement;\n          !i ||\n            !a ||\n            ((a.scrollLeft = i.scrollLeft),\n            (a.scrollTop = i.scrollTop),\n            (a.height = i.height));\n        }),\n        be(ve(r), \"handleCompositionStart\", function () {\n          Jr = !0;\n        }),\n        be(ve(r), \"handleCompositionEnd\", function () {\n          Jr = !1;\n        }),\n        be(ve(r), \"setSelection\", function (i, a) {\n          if (!(i === null || a === null)) {\n            var l = r.inputElement;\n            if (l.setSelectionRange) l.setSelectionRange(i, a);\n            else if (l.createTextRange) {\n              var s = l.createTextRange();\n              s.collapse(!0),\n                s.moveEnd(\"character\", a),\n                s.moveStart(\"character\", i),\n                s.select();\n            }\n          }\n        }),\n        be(ve(r), \"updateMentionsQueries\", function (i, a) {\n          r._queryId++,\n            (r.suggestions = {}),\n            r.setState({\n              suggestions: {},\n            });\n          var l = r.props.value || \"\",\n            s = r.props.children,\n            u = On(s),\n            c = mt(l, u, a, \"NULL\");\n          if (c !== null) {\n            var d = G7(l.substring(0, c), u),\n              p = i.substring(d, a);\n            $.Children.forEach(s, function (h, m) {\n              if (h) {\n                var b = m9(h.props.trigger, r.props),\n                  y = p.match(b);\n                if (y) {\n                  var g = d + p.indexOf(y[1], y.index);\n                  r.queryData(y[2], m, g, g + y[1].length, i);\n                }\n              }\n            });\n          }\n        }),\n        be(ve(r), \"clearSuggestions\", function () {\n          r._queryId++,\n            (r.suggestions = {}),\n            r.setState({\n              suggestions: {},\n              focusIndex: 0,\n            });\n        }),\n        be(ve(r), \"queryData\", function (i, a, l, s, u) {\n          var c = r.props,\n            d = c.children,\n            p = c.ignoreAccents,\n            h = ko.toArray(d)[a],\n            m = b9(h.props.data, p),\n            b = m(i, r.updateSuggestions.bind(null, r._queryId, a, i, l, s, u));\n          b instanceof Array &&\n            r.updateSuggestions(r._queryId, a, i, l, s, u, b);\n        }),\n        be(ve(r), \"updateSuggestions\", function (i, a, l, s, u, c, d) {\n          if (i === r._queryId) {\n            r.suggestions = qt(\n              qt({}, r.suggestions),\n              {},\n              be({}, a, {\n                queryInfo: {\n                  childIndex: a,\n                  query: l,\n                  querySequenceStart: s,\n                  querySequenceEnd: u,\n                  plainTextValue: c,\n                },\n                results: d,\n              }),\n            );\n            var p = r.state.focusIndex,\n              h = Qr(r.suggestions);\n            r.setState({\n              suggestions: r.suggestions,\n              focusIndex: p >= h ? Math.max(h - 1, 0) : p,\n            });\n          }\n        }),\n        be(ve(r), \"addMention\", function (i, a) {\n          var l = i.id,\n            s = i.display,\n            u = a.childIndex,\n            c = a.querySequenceStart,\n            d = a.querySequenceEnd,\n            p = a.plainTextValue,\n            h = r.props.value || \"\",\n            m = On(r.props.children),\n            b = ko.toArray(r.props.children)[u],\n            y = b.props,\n            g = y.markup,\n            x = y.displayTransform,\n            v = y.appendSpaceOnAdd,\n            S = y.onAdd,\n            w = mt(h, m, c, \"START\"),\n            E = w + d - c,\n            M = Q7(g, l, s);\n          v && (M += \" \");\n          var _ = lr(h, w, E, M);\n          r.inputElement.focus();\n          var j = x(l, s);\n          v && (j += \" \");\n          var R = c + j.length;\n          r.setState({\n            selectionStart: R,\n            selectionEnd: R,\n            setSelectionAfterMentionChange: !0,\n          });\n          var D = {\n              target: {\n                value: _,\n              },\n            },\n            P = er(_, m),\n            V = lr(p, c, d, j);\n          r.executeOnChange(D, _, V, P),\n            S && S(l, s, w, E),\n            r.clearSuggestions();\n        }),\n        be(ve(r), \"isLoading\", function () {\n          var i = !1;\n          return (\n            $.Children.forEach(r.props.children, function (a) {\n              i = i || (a && a.props.isLoading);\n            }),\n            i\n          );\n        }),\n        be(ve(r), \"isOpened\", function () {\n          return (\n            ws(r.state.selectionStart) &&\n            (Qr(r.state.suggestions) !== 0 || r.isLoading())\n          );\n        }),\n        be(ve(r), \"_queryId\", 0),\n        (r.suggestions = {}),\n        (r.uuidSuggestionsOverlay = Math.random().toString(16).substring(2)),\n        (r.handleCopy = r.handleCopy.bind(ve(r))),\n        (r.handleCut = r.handleCut.bind(ve(r))),\n        (r.handlePaste = r.handlePaste.bind(ve(r))),\n        (r.state = {\n          focusIndex: 0,\n          selectionStart: null,\n          selectionEnd: null,\n          suggestions: {},\n          caretPosition: null,\n          suggestionsPosition: {},\n          setSelectionAfterHandlePaste: !1,\n        }),\n        r\n      );\n    }\n    return (\n      u7(n, [\n        {\n          key: \"componentDidMount\",\n          value: function () {\n            document.addEventListener(\"copy\", this.handleCopy),\n              document.addEventListener(\"cut\", this.handleCut),\n              document.addEventListener(\"paste\", this.handlePaste),\n              this.updateSuggestionsPosition();\n          },\n        },\n        {\n          key: \"componentDidUpdate\",\n          value: function (r, i) {\n            i.suggestionsPosition === this.state.suggestionsPosition &&\n              this.updateSuggestionsPosition(),\n              this.state.setSelectionAfterMentionChange &&\n                (this.setState({\n                  setSelectionAfterMentionChange: !1,\n                }),\n                this.setSelection(\n                  this.state.selectionStart,\n                  this.state.selectionEnd,\n                )),\n              this.state.setSelectionAfterHandlePaste &&\n                (this.setState({\n                  setSelectionAfterHandlePaste: !1,\n                }),\n                this.setSelection(\n                  this.state.selectionStart,\n                  this.state.selectionEnd,\n                ));\n          },\n        },\n        {\n          key: \"componentWillUnmount\",\n          value: function () {\n            document.removeEventListener(\"copy\", this.handleCopy),\n              document.removeEventListener(\"cut\", this.handleCut),\n              document.removeEventListener(\"paste\", this.handlePaste);\n          },\n        },\n        {\n          key: \"render\",\n          value: function () {\n            return /* @__PURE__ */ $.createElement(\n              \"div\",\n              zt(\n                {\n                  ref: this.setContainerElement,\n                },\n                this.props.style,\n              ),\n              this.renderControl(),\n              this.renderSuggestionsOverlay(),\n            );\n          },\n        },\n        {\n          key: \"handlePaste\",\n          value: function (r) {\n            if (\n              r.target === this.inputElement &&\n              this.supportsClipboardActions(r)\n            ) {\n              r.preventDefault();\n              var i = this.state,\n                a = i.selectionStart,\n                l = i.selectionEnd,\n                s = this.props,\n                u = s.value,\n                c = s.children,\n                d = On(c),\n                p = mt(u, d, a, \"START\"),\n                h = mt(u, d, l, \"END\"),\n                m = r.clipboardData.getData(\"text/react-mentions\"),\n                b = r.clipboardData.getData(\"text/plain\"),\n                y = lr(u, p, h, m || b).replace(/\\r/g, \"\"),\n                g = $n(y, d),\n                x = {\n                  target: qt(\n                    qt({}, r.target),\n                    {},\n                    {\n                      value: y,\n                    },\n                  ),\n                };\n              this.executeOnChange(x, y, g, er(y, d));\n              var v = nu(u, d, a),\n                S = (v || a) + $n(m || b, d).length;\n              this.setState({\n                selectionStart: S,\n                selectionEnd: S,\n                setSelectionAfterHandlePaste: !0,\n              });\n            }\n          },\n        },\n        {\n          key: \"saveSelectionToClipboard\",\n          value: function (r) {\n            var i = this.inputElement.selectionStart,\n              a = this.inputElement.selectionEnd,\n              l = this.props,\n              s = l.children,\n              u = l.value,\n              c = On(s),\n              d = mt(u, c, i, \"START\"),\n              p = mt(u, c, a, \"END\");\n            r.clipboardData.setData(\"text/plain\", r.target.value.slice(i, a)),\n              r.clipboardData.setData(\"text/react-mentions\", u.slice(d, p));\n          },\n        },\n        {\n          key: \"supportsClipboardActions\",\n          value: function (r) {\n            return !!r.clipboardData;\n          },\n        },\n        {\n          key: \"handleCopy\",\n          value: function (r) {\n            r.target === this.inputElement &&\n              this.supportsClipboardActions(r) &&\n              (r.preventDefault(), this.saveSelectionToClipboard(r));\n          },\n        },\n        {\n          key: \"handleCut\",\n          value: function (r) {\n            if (\n              r.target === this.inputElement &&\n              this.supportsClipboardActions(r)\n            ) {\n              r.preventDefault(), this.saveSelectionToClipboard(r);\n              var i = this.state,\n                a = i.selectionStart,\n                l = i.selectionEnd,\n                s = this.props,\n                u = s.children,\n                c = s.value,\n                d = On(u),\n                p = mt(c, d, a, \"START\"),\n                h = mt(c, d, l, \"END\"),\n                m = [c.slice(0, p), c.slice(h)].join(\"\"),\n                b = $n(m, d),\n                y = {\n                  target: qt(\n                    qt({}, r.target),\n                    {},\n                    {\n                      value: b,\n                    },\n                  ),\n                };\n              this.executeOnChange(y, m, b, er(c, d));\n            }\n          },\n          // Handle input element's change event\n        },\n      ]),\n      n\n    );\n  })($.Component);\nbe(Ec, \"propTypes\", Xd);\nbe(Ec, \"defaultProps\", {\n  ignoreAccents: !1,\n  singleLine: !1,\n  allowSuggestionsAboveCursor: !1,\n  onKeyDown: function () {\n    return null;\n  },\n  onSelect: function () {\n    return null;\n  },\n  onBlur: function () {\n    return null;\n  },\n});\nvar Nl = function (t, n) {\n    var o = parseFloat(window.getComputedStyle(t, null).getPropertyValue(n));\n    return isFinite(o) ? o : 0;\n  },\n  y9 = typeof navigator < \"u\" && /iPhone|iPad|iPod/i.test(navigator.userAgent),\n  C9 = la(\n    {\n      position: \"relative\",\n      overflowY: \"visible\",\n      input: {\n        display: \"block\",\n        width: \"100%\",\n        position: \"absolute\",\n        margin: 0,\n        top: 0,\n        left: 0,\n        boxSizing: \"border-box\",\n        backgroundColor: \"transparent\",\n        fontFamily: \"inherit\",\n        fontSize: \"inherit\",\n        letterSpacing: \"inherit\",\n      },\n      \"&multiLine\": {\n        input: qt(\n          {\n            height: \"100%\",\n            bottom: 0,\n            overflow: \"hidden\",\n            resize: \"none\",\n          },\n          y9\n            ? {\n                marginTop: 1,\n                marginLeft: -3,\n              }\n            : null,\n        ),\n      },\n    },\n    function (e) {\n      var t = e.singleLine;\n      return {\n        \"&singleLine\": t,\n        \"&multiLine\": !t,\n      };\n    },\n  ),\n  v9 = C9(Ec),\n  x9 = {\n    fontWeight: \"inherit\",\n  },\n  Sc = function (t) {\n    var n = t.display,\n      o = t.style,\n      r = t.className,\n      i = t.classNames,\n      a = xc(x9, {\n        style: o,\n        className: r,\n        classNames: i,\n      });\n    return /* @__PURE__ */ $.createElement(\"strong\", a, n);\n  };\nSc.propTypes = {\n  /**\n   * Called when a new mention is added in the input\n   *\n   * Example:\n   *\n   * ```js\n   * function(id, display) {\n   *   console.log(\"user \" + display + \" was mentioned!\");\n   * }\n   * ```\n   */\n  onAdd: q.func,\n  onRemove: q.func,\n  renderSuggestion: q.func,\n  trigger: q.oneOfType([q.string, q.instanceOf(RegExp)]),\n  markup: q.string,\n  displayTransform: q.func,\n  /**\n   * If set to `true` spaces will not interrupt matching suggestions\n   */\n  allowSpaceInQuery: q.bool,\n  isLoading: q.bool,\n};\nSc.defaultProps = {\n  trigger: \"@\",\n  markup: \"@[__display__](__id__)\",\n  displayTransform: function (t, n) {\n    return n || t;\n  },\n  onAdd: function () {\n    return null;\n  },\n  onRemove: function () {\n    return null;\n  },\n  renderSuggestion: null,\n  isLoading: !1,\n  appendSpaceOnAdd: !1,\n};\nconst w9 = {\n    \"&multiLine\": {\n      minHeight: \"40px\",\n    },\n    input: {\n      border: \"none\",\n      outline: \"none\",\n      fontWeight: \"500\",\n      fontSize: \"15px\",\n      color: \"rgba(0, 5, 15, 0.85)\",\n    },\n    suggestions: {\n      backgroundColor: \"var(--background--01)\",\n      border: \"1px solid rgba(0,0,0,0.1)\",\n      borderRadius: \"8px\",\n      padding: \"5px\",\n      boxShadow: \"0px 0px 10px rgba(0,0,0,0.1)\",\n      minWidth: \"150px\",\n      maxHeight: \"200px\",\n      overflowY: \"auto\",\n      item: {\n        fontSize: \"15px\",\n        padding: \"4px 11px 4px 11px\",\n        borderRadius: \"4px\",\n        fontWeight: \"500\",\n        \"&focused\": {\n          backgroundColor: \"var(--background--04)\",\n        },\n      },\n    },\n  },\n  E9 = ({\n    value: e,\n    setValue: t,\n    users: n,\n    placeholder: o = \"Type your reply here...\",\n    onEnterKeypress: r,\n  }) => {\n    const i = n.map((u) => ({\n        ...u,\n        display: u.display_name,\n      })),\n      a = (u) => {\n        u.stopPropagation(),\n          u.key === \"Enter\" &&\n            !u.shiftKey &&\n            (u.preventDefault(), r == null || r());\n      },\n      l = (u, c) => {\n        console.info(\"[MentionsInputComponent] on mention select\", {\n          id: u,\n          display: c,\n        });\n      },\n      s = (u) => {\n        t(u.target.value);\n      };\n    return /* @__PURE__ */ f.jsx(v9, {\n      autoFocus: !0,\n      value: e,\n      onChange: s,\n      style: {\n        ...w9,\n        minHeight: \"40px\",\n        marginBottom: \"10px\",\n      },\n      placeholder: o,\n      className: \"mentions-input\",\n      onKeyDown: a,\n      children: /* @__PURE__ */ f.jsx(Sc, {\n        displayTransform: (u, c) => `@${c}`,\n        trigger: \"@\",\n        markup: \"@[__id__](__display__)\",\n        data: i,\n        appendSpaceOnAdd: !0,\n        renderSuggestion: (u, c) =>\n          /* @__PURE__ */ f.jsx(\"div\", {\n            className: `user ${c ? \"focused\" : \"\"}`,\n            children: u.display,\n          }),\n        onAdd: l,\n      }),\n    });\n  },\n  Qd = ({\n    comment: e,\n    setComment: t,\n    loading: n,\n    users: o,\n    currentUser: r,\n    placeholder: i,\n    onEnterKeypress: a,\n  }) =>\n    /* @__PURE__ */ f.jsxs(\"div\", {\n      className: xn.conversationInputForm,\n      children: [\n        r ? /* @__PURE__ */ f.jsx(Fd, { user: r }) : null,\n        /* @__PURE__ */ f.jsx(E9, {\n          value: e,\n          setValue: t,\n          users: o,\n          placeholder: i,\n          onEnterKeypress: a,\n        }),\n        /* @__PURE__ */ f.jsx(In, {\n          loading: n,\n          color: \"primary\",\n          children: /* @__PURE__ */ f.jsx(D8, {}),\n        }),\n      ],\n    }),\n  Jd = ({ meta: { highlight: e, filePath: t, field: n, column: o } }) => {\n    if (!e) return null;\n    const r = o ? `${t} (${o})` : t;\n    return /* @__PURE__ */ f.jsx(\"div\", {\n      className: xn.highlightText,\n      children: /* @__PURE__ */ f.jsx(Lr, {\n        code: e,\n        language: n ? \"markdown\" : \"sql\",\n        showLineNumbers: !n,\n        fileName: r,\n        theme: \"light\",\n      }),\n    });\n  },\n  S9 = () => {\n    const e = He((c) => c.users),\n      t = He((c) => c.newConversation),\n      n = He((c) => (c.currentUserId ? c.users[c.currentUserId] : null)),\n      o = He((c) => c.shareId),\n      r = Bt(),\n      [i, a] = se(!1),\n      [l, s] = se(\"\"),\n      u = async (c) => {\n        if (\n          (c == null || c.stopPropagation(),\n          c == null || c.preventDefault(),\n          !(!t || !o))\n        ) {\n          a(!0);\n          try {\n            console.log(\"saving conversation\", t, l);\n            const d = await I8(\n              o,\n              {\n                ...t,\n                message: l,\n              },\n              \"dbt-docs\",\n              // this component is used only from dbt docs page\n            );\n            if (!d.conversation_group_id) {\n              console.error(\"Unable to create conversation group\", d);\n              return;\n            }\n            console.log(\"Successfully created conversation group\", d);\n          } catch (d) {\n            console.error(\"error while saving conversation\", t, d);\n          }\n          r(Td()), a(!1), r(mc(!0)), r(bc()), s(\"\");\n        }\n      };\n    return /* @__PURE__ */ f.jsx(bt, {\n      className: xn.newConversationForm,\n      children: /* @__PURE__ */ f.jsx(Mt, {\n        children: /* @__PURE__ */ f.jsxs(\"form\", {\n          onSubmit: u,\n          children: [\n            /* @__PURE__ */ f.jsx(\"h4\", { children: \"Add comment\" }),\n            /* @__PURE__ */ f.jsx(Jd, {\n              meta: (t == null ? void 0 : t.meta) || {},\n            }),\n            /* @__PURE__ */ f.jsx(Qd, {\n              comment: l,\n              setComment: s,\n              loading: i,\n              users: Object.values(e),\n              currentUser: n,\n              placeholder: \"Start a conversation or add others with @\",\n              onEnterKeypress: u,\n            }),\n          ],\n        }),\n      }),\n    });\n  };\nvar e3 = { exports: {} };\n(function (e, t) {\n  (function (n, o) {\n    e.exports = o();\n  })(Qn, function () {\n    var n = 1e3,\n      o = 6e4,\n      r = 36e5,\n      i = \"millisecond\",\n      a = \"second\",\n      l = \"minute\",\n      s = \"hour\",\n      u = \"day\",\n      c = \"week\",\n      d = \"month\",\n      p = \"quarter\",\n      h = \"year\",\n      m = \"date\",\n      b = \"Invalid Date\",\n      y =\n        /^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,\n      g =\n        /\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,\n      x = {\n        name: \"en\",\n        weekdays:\n          \"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),\n        months:\n          \"January_February_March_April_May_June_July_August_September_October_November_December\".split(\n            \"_\",\n          ),\n        ordinal: function (k) {\n          var N = [\"th\", \"st\", \"nd\", \"rd\"],\n            T = k % 100;\n          return \"[\" + k + (N[(T - 20) % 10] || N[T] || N[0]) + \"]\";\n        },\n      },\n      v = function (k, N, T) {\n        var F = String(k);\n        return !F || F.length >= N\n          ? k\n          : \"\" + Array(N + 1 - F.length).join(T) + k;\n      },\n      S = {\n        s: v,\n        z: function (k) {\n          var N = -k.utcOffset(),\n            T = Math.abs(N),\n            F = Math.floor(T / 60),\n            I = T % 60;\n          return (N <= 0 ? \"+\" : \"-\") + v(F, 2, \"0\") + \":\" + v(I, 2, \"0\");\n        },\n        m: function k(N, T) {\n          if (N.date() < T.date()) return -k(T, N);\n          var F = 12 * (T.year() - N.year()) + (T.month() - N.month()),\n            I = N.clone().add(F, d),\n            L = T - I < 0,\n            C = N.clone().add(F + (L ? -1 : 1), d);\n          return +(-(F + (T - I) / (L ? I - C : C - I)) || 0);\n        },\n        a: function (k) {\n          return k < 0 ? Math.ceil(k) || 0 : Math.floor(k);\n        },\n        p: function (k) {\n          return (\n            { M: d, y: h, w: c, d: u, D: m, h: s, m: l, s: a, ms: i, Q: p }[\n              k\n            ] ||\n            String(k || \"\")\n              .toLowerCase()\n              .replace(/s$/, \"\")\n          );\n        },\n        u: function (k) {\n          return k === void 0;\n        },\n      },\n      w = \"en\",\n      E = {};\n    E[w] = x;\n    var M = \"$isDayjsObject\",\n      _ = function (k) {\n        return k instanceof P || !(!k || !k[M]);\n      },\n      j = function k(N, T, F) {\n        var I;\n        if (!N) return w;\n        if (typeof N == \"string\") {\n          var L = N.toLowerCase();\n          E[L] && (I = L), T && ((E[L] = T), (I = L));\n          var C = N.split(\"-\");\n          if (!I && C.length > 1) return k(C[0]);\n        } else {\n          var H = N.name;\n          (E[H] = N), (I = H);\n        }\n        return !F && I && (w = I), I || (!F && w);\n      },\n      R = function (k, N) {\n        if (_(k)) return k.clone();\n        var T = typeof N == \"object\" ? N : {};\n        return (T.date = k), (T.args = arguments), new P(T);\n      },\n      D = S;\n    (D.l = j),\n      (D.i = _),\n      (D.w = function (k, N) {\n        return R(k, { locale: N.$L, utc: N.$u, x: N.$x, $offset: N.$offset });\n      });\n    var P = (function () {\n        function k(T) {\n          (this.$L = j(T.locale, null, !0)),\n            this.parse(T),\n            (this.$x = this.$x || T.x || {}),\n            (this[M] = !0);\n        }\n        var N = k.prototype;\n        return (\n          (N.parse = function (T) {\n            (this.$d = (function (F) {\n              var I = F.date,\n                L = F.utc;\n              if (I === null) return /* @__PURE__ */ new Date(NaN);\n              if (D.u(I)) return /* @__PURE__ */ new Date();\n              if (I instanceof Date) return new Date(I);\n              if (typeof I == \"string\" && !/Z$/i.test(I)) {\n                var C = I.match(y);\n                if (C) {\n                  var H = C[2] - 1 || 0,\n                    B = (C[7] || \"0\").substring(0, 3);\n                  return L\n                    ? new Date(\n                        Date.UTC(\n                          C[1],\n                          H,\n                          C[3] || 1,\n                          C[4] || 0,\n                          C[5] || 0,\n                          C[6] || 0,\n                          B,\n                        ),\n                      )\n                    : new Date(\n                        C[1],\n                        H,\n                        C[3] || 1,\n                        C[4] || 0,\n                        C[5] || 0,\n                        C[6] || 0,\n                        B,\n                      );\n                }\n              }\n              return new Date(I);\n            })(T)),\n              this.init();\n          }),\n          (N.init = function () {\n            var T = this.$d;\n            (this.$y = T.getFullYear()),\n              (this.$M = T.getMonth()),\n              (this.$D = T.getDate()),\n              (this.$W = T.getDay()),\n              (this.$H = T.getHours()),\n              (this.$m = T.getMinutes()),\n              (this.$s = T.getSeconds()),\n              (this.$ms = T.getMilliseconds());\n          }),\n          (N.$utils = function () {\n            return D;\n          }),\n          (N.isValid = function () {\n            return this.$d.toString() !== b;\n          }),\n          (N.isSame = function (T, F) {\n            var I = R(T);\n            return this.startOf(F) <= I && I <= this.endOf(F);\n          }),\n          (N.isAfter = function (T, F) {\n            return R(T) < this.startOf(F);\n          }),\n          (N.isBefore = function (T, F) {\n            return this.endOf(F) < R(T);\n          }),\n          (N.$g = function (T, F, I) {\n            return D.u(T) ? this[F] : this.set(I, T);\n          }),\n          (N.unix = function () {\n            return Math.floor(this.valueOf() / 1e3);\n          }),\n          (N.valueOf = function () {\n            return this.$d.getTime();\n          }),\n          (N.startOf = function (T, F) {\n            var I = this,\n              L = !!D.u(F) || F,\n              C = D.p(T),\n              H = function (oe, U) {\n                var ge = D.w(\n                  I.$u ? Date.UTC(I.$y, U, oe) : new Date(I.$y, U, oe),\n                  I,\n                );\n                return L ? ge : ge.endOf(u);\n              },\n              B = function (oe, U) {\n                return D.w(\n                  I.toDate()[oe].apply(\n                    I.toDate(\"s\"),\n                    (L ? [0, 0, 0, 0] : [23, 59, 59, 999]).slice(U),\n                  ),\n                  I,\n                );\n              },\n              A = this.$W,\n              W = this.$M,\n              G = this.$D,\n              K = \"set\" + (this.$u ? \"UTC\" : \"\");\n            switch (C) {\n              case h:\n                return L ? H(1, 0) : H(31, 11);\n              case d:\n                return L ? H(1, W) : H(0, W + 1);\n              case c:\n                var Q = this.$locale().weekStart || 0,\n                  ne = (A < Q ? A + 7 : A) - Q;\n                return H(L ? G - ne : G + (6 - ne), W);\n              case u:\n              case m:\n                return B(K + \"Hours\", 0);\n              case s:\n                return B(K + \"Minutes\", 1);\n              case l:\n                return B(K + \"Seconds\", 2);\n              case a:\n                return B(K + \"Milliseconds\", 3);\n              default:\n                return this.clone();\n            }\n          }),\n          (N.endOf = function (T) {\n            return this.startOf(T, !1);\n          }),\n          (N.$set = function (T, F) {\n            var I,\n              L = D.p(T),\n              C = \"set\" + (this.$u ? \"UTC\" : \"\"),\n              H = ((I = {}),\n              (I[u] = C + \"Date\"),\n              (I[m] = C + \"Date\"),\n              (I[d] = C + \"Month\"),\n              (I[h] = C + \"FullYear\"),\n              (I[s] = C + \"Hours\"),\n              (I[l] = C + \"Minutes\"),\n              (I[a] = C + \"Seconds\"),\n              (I[i] = C + \"Milliseconds\"),\n              I)[L],\n              B = L === u ? this.$D + (F - this.$W) : F;\n            if (L === d || L === h) {\n              var A = this.clone().set(m, 1);\n              A.$d[H](B),\n                A.init(),\n                (this.$d = A.set(m, Math.min(this.$D, A.daysInMonth())).$d);\n            } else H && this.$d[H](B);\n            return this.init(), this;\n          }),\n          (N.set = function (T, F) {\n            return this.clone().$set(T, F);\n          }),\n          (N.get = function (T) {\n            return this[D.p(T)]();\n          }),\n          (N.add = function (T, F) {\n            var I,\n              L = this;\n            T = Number(T);\n            var C = D.p(F),\n              H = function (W) {\n                var G = R(L);\n                return D.w(G.date(G.date() + Math.round(W * T)), L);\n              };\n            if (C === d) return this.set(d, this.$M + T);\n            if (C === h) return this.set(h, this.$y + T);\n            if (C === u) return H(1);\n            if (C === c) return H(7);\n            var B = ((I = {}), (I[l] = o), (I[s] = r), (I[a] = n), I)[C] || 1,\n              A = this.$d.getTime() + T * B;\n            return D.w(A, this);\n          }),\n          (N.subtract = function (T, F) {\n            return this.add(-1 * T, F);\n          }),\n          (N.format = function (T) {\n            var F = this,\n              I = this.$locale();\n            if (!this.isValid()) return I.invalidDate || b;\n            var L = T || \"YYYY-MM-DDTHH:mm:ssZ\",\n              C = D.z(this),\n              H = this.$H,\n              B = this.$m,\n              A = this.$M,\n              W = I.weekdays,\n              G = I.months,\n              K = I.meridiem,\n              Q = function (U, ge, J, _e) {\n                return (U && (U[ge] || U(F, L))) || J[ge].slice(0, _e);\n              },\n              ne = function (U) {\n                return D.s(H % 12 || 12, U, \"0\");\n              },\n              oe =\n                K ||\n                function (U, ge, J) {\n                  var _e = U < 12 ? \"AM\" : \"PM\";\n                  return J ? _e.toLowerCase() : _e;\n                };\n            return L.replace(g, function (U, ge) {\n              return (\n                ge ||\n                (function (J) {\n                  switch (J) {\n                    case \"YY\":\n                      return String(F.$y).slice(-2);\n                    case \"YYYY\":\n                      return D.s(F.$y, 4, \"0\");\n                    case \"M\":\n                      return A + 1;\n                    case \"MM\":\n                      return D.s(A + 1, 2, \"0\");\n                    case \"MMM\":\n                      return Q(I.monthsShort, A, G, 3);\n                    case \"MMMM\":\n                      return Q(G, A);\n                    case \"D\":\n                      return F.$D;\n                    case \"DD\":\n                      return D.s(F.$D, 2, \"0\");\n                    case \"d\":\n                      return String(F.$W);\n                    case \"dd\":\n                      return Q(I.weekdaysMin, F.$W, W, 2);\n                    case \"ddd\":\n                      return Q(I.weekdaysShort, F.$W, W, 3);\n                    case \"dddd\":\n                      return W[F.$W];\n                    case \"H\":\n                      return String(H);\n                    case \"HH\":\n                      return D.s(H, 2, \"0\");\n                    case \"h\":\n                      return ne(1);\n                    case \"hh\":\n                      return ne(2);\n                    case \"a\":\n                      return oe(H, B, !0);\n                    case \"A\":\n                      return oe(H, B, !1);\n                    case \"m\":\n                      return String(B);\n                    case \"mm\":\n                      return D.s(B, 2, \"0\");\n                    case \"s\":\n                      return String(F.$s);\n                    case \"ss\":\n                      return D.s(F.$s, 2, \"0\");\n                    case \"SSS\":\n                      return D.s(F.$ms, 3, \"0\");\n                    case \"Z\":\n                      return C;\n                  }\n                  return null;\n                })(U) ||\n                C.replace(\":\", \"\")\n              );\n            });\n          }),\n          (N.utcOffset = function () {\n            return 15 * -Math.round(this.$d.getTimezoneOffset() / 15);\n          }),\n          (N.diff = function (T, F, I) {\n            var L,\n              C = this,\n              H = D.p(F),\n              B = R(T),\n              A = (B.utcOffset() - this.utcOffset()) * o,\n              W = this - B,\n              G = function () {\n                return D.m(C, B);\n              };\n            switch (H) {\n              case h:\n                L = G() / 12;\n                break;\n              case d:\n                L = G();\n                break;\n              case p:\n                L = G() / 3;\n                break;\n              case c:\n                L = (W - A) / 6048e5;\n                break;\n              case u:\n                L = (W - A) / 864e5;\n                break;\n              case s:\n                L = W / r;\n                break;\n              case l:\n                L = W / o;\n                break;\n              case a:\n                L = W / n;\n                break;\n              default:\n                L = W;\n            }\n            return I ? L : D.a(L);\n          }),\n          (N.daysInMonth = function () {\n            return this.endOf(d).$D;\n          }),\n          (N.$locale = function () {\n            return E[this.$L];\n          }),\n          (N.locale = function (T, F) {\n            if (!T) return this.$L;\n            var I = this.clone(),\n              L = j(T, F, !0);\n            return L && (I.$L = L), I;\n          }),\n          (N.clone = function () {\n            return D.w(this.$d, this);\n          }),\n          (N.toDate = function () {\n            return new Date(this.valueOf());\n          }),\n          (N.toJSON = function () {\n            return this.isValid() ? this.toISOString() : null;\n          }),\n          (N.toISOString = function () {\n            return this.$d.toISOString();\n          }),\n          (N.toString = function () {\n            return this.$d.toUTCString();\n          }),\n          k\n        );\n      })(),\n      V = P.prototype;\n    return (\n      (R.prototype = V),\n      [\n        [\"$ms\", i],\n        [\"$s\", a],\n        [\"$m\", l],\n        [\"$H\", s],\n        [\"$W\", u],\n        [\"$M\", d],\n        [\"$y\", h],\n        [\"$D\", m],\n      ].forEach(function (k) {\n        V[k[1]] = function (N) {\n          return this.$g(N, k[0], k[1]);\n        };\n      }),\n      (R.extend = function (k, N) {\n        return k.$i || (k(N, P, R), (k.$i = !0)), R;\n      }),\n      (R.locale = j),\n      (R.isDayjs = _),\n      (R.unix = function (k) {\n        return R(1e3 * k);\n      }),\n      (R.en = E[w]),\n      (R.Ls = E),\n      (R.p = {}),\n      R\n    );\n  });\n})(e3);\nvar k9 = e3.exports;\nconst Es = /* @__PURE__ */ fn(k9),\n  _9 = ({ conversationGroupId: e, shareId: t }) => {\n    const { onResolve: n, source: o } = mr(),\n      [r, i] = se(!1),\n      a = async () => {\n        e && (i(!0), await B8(t, e, o), n(), i(!1));\n      };\n    return e\n      ? /* @__PURE__ */ f.jsx(jn, {\n          disabled: r,\n          className: xn.resolveButton,\n          title: \"Resolve conversation\",\n          onClick: a,\n          children: /* @__PURE__ */ f.jsx(T8, {}),\n        })\n      : null;\n  },\n  t3 = ({\n    user: e,\n    timestamp: t,\n    showResolveButton: n,\n    conversationGroupId: o,\n    shareId: r,\n  }) =>\n    /* @__PURE__ */ f.jsxs(Io, {\n      className: \"d-flex align-items-center justify-content-between mb-0\",\n      children: [\n        /* @__PURE__ */ f.jsxs(\"div\", {\n          className: \"d-flex align-items-center gap-1\",\n          children: [\n            /* @__PURE__ */ f.jsx(Fd, { user: e }),\n            /* @__PURE__ */ f.jsxs(\"h4\", {\n              children: [\n                e == null ? void 0 : e.first_name,\n                \" \",\n                e == null ? void 0 : e.last_name,\n              ],\n            }),\n            /* @__PURE__ */ f.jsx(\"span\", {\n              children: Es(t).format(\"HH:mm, DD MMM YY\"),\n            }),\n          ],\n        }),\n        n\n          ? /* @__PURE__ */ f.jsx(_9, {\n              conversationGroupId: o,\n              shareId: r,\n            })\n          : null,\n      ],\n    }),\n  A9 = ({ conversation: e, shareId: t }) => {\n    const { users: n } = mr(),\n      o = ze(() => {\n        if (e != null && e.user_id) return n[e.user_id];\n      }, [e.user_id, n]);\n    return /* @__PURE__ */ f.jsxs(bt, {\n      children: [\n        /* @__PURE__ */ f.jsx(t3, {\n          user: o,\n          timestamp: e.timestamp,\n          shareId: t,\n        }),\n        /* @__PURE__ */ f.jsx(Mt, {\n          children: /* @__PURE__ */ f.jsx(\"p\", {\n            children: e.message.replace(/@\\[(.*?)\\]\\((.*?)\\)/g, \"@$2\"),\n          }),\n        }),\n      ],\n    });\n  },\n  M9 = ({ conversationGroupId: e, shareId: t }) => {\n    const { currentUser: n, users: o, onReplyAdd: r, source: i } = mr(),\n      a = Object.values(o),\n      [l, s] = se(\"\"),\n      [u, c] = se(!1),\n      d = async (p) => {\n        if (\n          (p == null || p.stopPropagation(),\n          p == null || p.preventDefault(),\n          !(!t || !e))\n        ) {\n          c(!0),\n            console.log(\"saving reply\", t, e, {\n              message: l,\n            });\n          try {\n            await H8(\n              t,\n              e,\n              {\n                message: l,\n              },\n              i,\n            ),\n              r();\n          } catch (h) {\n            console.error(\"error while saving reply\", h);\n          }\n          c(!1), s(\"\");\n        }\n      };\n    return /* @__PURE__ */ f.jsx(\"div\", {\n      className: xn.replyForm,\n      children: /* @__PURE__ */ f.jsx(\"form\", {\n        onSubmit: d,\n        className: \"\",\n        children: /* @__PURE__ */ f.jsx(Qd, {\n          comment: l,\n          setComment: s,\n          loading: u,\n          users: Object.values(a),\n          currentUser: n || null,\n          onEnterKeypress: d,\n        }),\n      }),\n    });\n  },\n  T9 = ({ conversationGroup: e, shareId: t, onSelect: n }) => {\n    var p;\n    const { users: o } = mr(),\n      r = ze(() => {\n        if (e.owner) return o[e.owner];\n      }, [e.owner, o]),\n      { isSelected: i } = mr(),\n      [a, l] = se(!1),\n      s = Oe(\n        (h) => {\n          !i ||\n            !h ||\n            (console.log(\n              \"ConversationGroupComponent scrolling\",\n              e.conversation_group_id,\n            ),\n            setTimeout(() => {\n              h.scrollIntoView({\n                behavior: \"smooth\",\n                block: \"center\",\n              });\n            }, 1e3));\n        },\n        [e.conversation_group_id, i],\n      );\n    if (\n      !((p = e == null ? void 0 : e.conversations) != null && p.length) ||\n      (e == null ? void 0 : e.status) !== \"Pending\"\n    )\n      return null;\n    const [u, ...c] = e.conversations,\n      d = c.length\n        ? c.length > 1\n          ? `${c.length} replies`\n          : `${c.length} reply`\n        : \"Reply\";\n    return /* @__PURE__ */ f.jsx(\"div\", {\n      ref: s,\n      className: xn.conversationGroup,\n      children: /* @__PURE__ */ f.jsxs(bt, {\n        className: `${i ? \"active\" : \"\"}`,\n        onClick: n,\n        children: [\n          /* @__PURE__ */ f.jsx(t3, {\n            user: r,\n            timestamp: u.timestamp,\n            showResolveButton: !0,\n            conversationGroupId: e.conversation_group_id,\n            shareId: t,\n          }),\n          /* @__PURE__ */ f.jsxs(Mt, {\n            children: [\n              /* @__PURE__ */ f.jsx(Jd, { meta: e.meta }),\n              /* @__PURE__ */ f.jsx(\"p\", {\n                children: u.message.replace(/@\\[(.*?)\\]\\((.*?)\\)/g, \"@$2\"),\n              }),\n              /* @__PURE__ */ f.jsx(Re, {\n                onClick: () => l((h) => !h),\n                color: \"link\",\n                children: d,\n              }),\n              c.length\n                ? /* @__PURE__ */ f.jsx(f.Fragment, {\n                    children: a\n                      ? /* @__PURE__ */ f.jsx(f.Fragment, {\n                          children: c.map((h) =>\n                            /* @__PURE__ */ f.jsx(\n                              A9,\n                              {\n                                conversation: h,\n                                shareId: t,\n                              },\n                              h.conversation_id,\n                            ),\n                          ),\n                        })\n                      : null,\n                  })\n                : null,\n              a\n                ? /* @__PURE__ */ f.jsx(M9, {\n                    conversationGroupId: e.conversation_group_id,\n                    shareId: t,\n                  })\n                : null,\n            ],\n          }),\n        ],\n      }),\n    });\n  },\n  n3 = Pt({\n    users: {},\n    conversationGroup: void 0,\n    currentUser: void 0,\n    isSelected: !1,\n    shareId: void 0,\n    onSelect: () => null,\n    onResolve: () => null,\n    onReplyAdd: () => null,\n    source: lc.DBT_DOCS,\n  }),\n  O9 = ({\n    currentUser: e,\n    conversationGroup: t,\n    shareId: n,\n    onSelect: o,\n    isSelected: r,\n    users: i,\n    onResolve: a,\n    onReplyAdd: l,\n    source: s,\n  }) => {\n    const u = ze(\n      () => ({\n        currentUser: e,\n        conversationGroup: t,\n        shareId: n,\n        onSelect: o,\n        isSelected: r,\n        users: i,\n        onResolve: a,\n        onReplyAdd: l,\n        source: s,\n      }),\n      [e, t, n, o, r, i, a, l, s],\n    );\n    return !t || !n\n      ? null\n      : /* @__PURE__ */ f.jsx(n3.Provider, {\n          value: u,\n          children: /* @__PURE__ */ f.jsx(T9, {\n            conversationGroup: t,\n            shareId: n,\n            onSelect: o,\n          }),\n        });\n  },\n  mr = () => Xe(n3),\n  N9 = () => {\n    const e = He((d) => d.source),\n      t = He((d) => d.conversations),\n      n = He((d) => d.selectedConversationId),\n      o = He((d) => d.shareId),\n      r = He((d) => d.users),\n      i = He((d) => d.currentUserId),\n      a = Bt();\n    if (!i || !o) return null;\n    const l = r[i],\n      s = (d) => {\n        a(u8({ shareId: o, conversationGroupId: d }));\n      },\n      u = (d) => {\n        a(gc(d));\n      },\n      c = (d) => {\n        console.log(\"onReplyAdd\", d), a(Td());\n      };\n    return !t || !Object.keys(t).length\n      ? /* @__PURE__ */ f.jsx(\"div\", { children: \"No conversations yet!\" })\n      : /* @__PURE__ */ f.jsx(\"div\", {\n          children: Object.values(t).map((d) =>\n            /* @__PURE__ */ f.jsx(\n              O9,\n              {\n                conversationGroup: d,\n                shareId: o,\n                isSelected: n === d.conversation_group_id,\n                currentUser: l,\n                onResolve: () => s(d.conversation_group_id),\n                onSelect: () => u(d.conversation_group_id),\n                users: r,\n                onReplyAdd: () => c(d.conversation_group_id),\n                source: e,\n              },\n              d.conversation_group_id,\n            ),\n          ),\n        });\n  },\n  L9 = () => {\n    const e = He((a) => a.isRightPanelOpen),\n      t = He((a) => a.selectedConversationId),\n      n = He((a) => a.newConversation),\n      o = Bt(),\n      r = () => {\n        o(mc(!1)), o(gc(void 0)), o(bc());\n      };\n    return !!n || e || t\n      ? /* @__PURE__ */ f.jsxs(f.Fragment, {\n          children: [\n            /* @__PURE__ */ f.jsx(e4, {\n              onClick: r,\n              className: xn.conversationRightPanelCloseButton,\n            }),\n            /* @__PURE__ */ f.jsxs(\"div\", {\n              className: xn.conversationRightPanel,\n              children: [\n                /* @__PURE__ */ f.jsx(\"h3\", { children: \"Comments\" }),\n                n\n                  ? /* @__PURE__ */ f.jsx(S9, {})\n                  : /* @__PURE__ */ f.jsx(N9, {}),\n              ],\n            }),\n          ],\n        })\n      : null;\n  },\n  D9 = 10,\n  j9 = () => {\n    const e = he(),\n      t = He((a) => a.shareId),\n      n = He((a) => a.conversationsLoadingState),\n      o = Bt(),\n      r = He((a) => Object.keys(a.conversations || {})),\n      i = Oe(\n        (a) => {\n          clearTimeout(e.current),\n            z8(a)\n              .then((l) => {\n                console.log(\"useConversations\", l),\n                  o(c8(l == null ? void 0 : l.dbt_docs_share_conversations)),\n                  (e.current = setTimeout(() => {\n                    i(a);\n                  }, D9 * 1e3));\n              })\n              .catch((l) =>\n                console.error(\"error while fetching conversations list\", l),\n              )\n              .finally(() => {\n                o(D2(It.INITIALIZED));\n              });\n        },\n        [o],\n      );\n    return (\n      ue(() => {\n        n !== It.UNINITIALIZED || !t || (o(D2(It.LOADING)), i(t));\n      }, [o, n, r, t, i]),\n      { isLoading: n === It.LOADING }\n    );\n  },\n  F9 = () => {\n    const e = Bt(),\n      t = He((r) => Object.keys(r.users || {})),\n      [n, o] = se(It.UNINITIALIZED);\n    return (\n      ue(() => {\n        n !== It.UNINITIALIZED ||\n          Object.keys(t).length ||\n          (o(It.LOADING),\n          P8()\n            .then((r) => {\n              console.log(\"useConversationUsers\", r), e(s8(r));\n            })\n            .catch((r) => console.error(\"error while fetching users list\", r))\n            .finally(() => {\n              o(It.INITIALIZED);\n            }));\n      }, [e, n, t]),\n      { isLoading: n === It.LOADING }\n    );\n  },\n  R9 = () => (\n    F9(),\n    j9(),\n    /* @__PURE__ */ f.jsxs(\"div\", {\n      children: [/* @__PURE__ */ f.jsx(L9, {}), /* @__PURE__ */ f.jsx(Z8, {})],\n    })\n  ),\n  o3 = ({ target: e, ...t }) =>\n    Hn(\n      /* @__PURE__ */ f.jsx(jn, {\n        className: xn.hotspotButton,\n        title: \"Click to start conversation\",\n        ...t,\n        children: /* @__PURE__ */ f.jsx(Dd, {}),\n      }),\n      e,\n    ),\n  I9 = () => {\n    var s;\n    const e = Bt(),\n      t = He((u) => u.codeblockLoaded),\n      n = He((u) => u.manifest),\n      [o, r] = se(0),\n      i = (s = cc()) == null ? void 0 : s.parentElement,\n      a = () => {\n        var p;\n        if (!i || !n.nodes) return;\n        const u = uc();\n        if (!u || u.length < 3) {\n          console.error(\"Unable to find model parts\", u);\n          return;\n        }\n        const d = {\n          highlight: ((p = n.nodes[u[2]]) == null ? void 0 : p.raw_code).split(`\n`)[o],\n          range: {\n            end: { line: o, character: 0 },\n            start: { line: o, character: 0 },\n          },\n        };\n        e(yc({ meta: d }));\n      },\n      l = Oe(\n        (u) => {\n          if (!i) return;\n          const c = u.y,\n            d = i.querySelectorAll(\".line-numbers-rows > span\"),\n            p = Array.from(d).findIndex((h) => {\n              const { height: m, y: b } = h.getBoundingClientRect();\n              return c >= b && c <= b + m;\n            });\n          r(p);\n        },\n        [i],\n      );\n    return (\n      ue(() => {\n        if (!(!t || !i))\n          return (\n            i.addEventListener(\"mousemove\", l),\n            () => {\n              i.removeEventListener(\"mousemove\", l);\n            }\n          );\n      }, [t, i, l]),\n      !t || !i\n        ? null\n        : /* @__PURE__ */ f.jsx(o3, {\n            target: i,\n            onClick: a,\n            style: { top: o * 21.2 },\n          })\n    );\n  },\n  H9 = () => {\n    const e = Bt(),\n      t = He((r) => r.codeblockLoaded),\n      n = dc(),\n      o = () => {\n        const r = {\n          field: \"description\",\n          highlight: n == null ? void 0 : n.innerText,\n        };\n        e(yc({ meta: r }));\n      };\n    return !t || !n\n      ? null\n      : /* @__PURE__ */ f.jsx(o3, { target: n, onClick: o });\n  },\n  z9 = () =>\n    /* @__PURE__ */ f.jsxs(f.Fragment, {\n      children: [/* @__PURE__ */ f.jsx(H9, {}), /* @__PURE__ */ f.jsx(I9, {})],\n    }),\n  P9 = g4(() => import(\"./DbtDocsRenderer.js\")),\n  B9 = () => {\n    const { loading: e, shareDetails: t } = V8(),\n      n = Bt(),\n      { getHighlightedSelectionData: o, pos: r, onSelectionEnd: i } = $8(),\n      a = (l) => {\n        l.stopPropagation();\n        const s = o();\n        s && n(yc(s));\n      };\n    return e\n      ? /* @__PURE__ */ f.jsx(\"div\", { children: \"Loading...\" })\n      : !(t != null && t.catalog_presigned_url) ||\n          !(t != null && t.manifest_presigned_url)\n        ? /* @__PURE__ */ f.jsx(\"div\", {\n            children: \"Unable to load required artifacts. Please try again.\",\n          })\n        : /* @__PURE__ */ f.jsxs(\"div\", {\n            children: [\n              /* @__PURE__ */ f.jsxs(\"div\", {\n                className: \"d-flex justify-content-end mb-2\",\n                children: [\n                  /* @__PURE__ */ f.jsx(z9, {}),\n                  /* @__PURE__ */ f.jsx(F8, {}),\n                ],\n              }),\n              /* @__PURE__ */ f.jsx(R9, {}),\n              /* @__PURE__ */ f.jsx(P9, {\n                shareDetails: t,\n                onSelectionEnd: i,\n              }),\n              r ? /* @__PURE__ */ f.jsx(j8, { pos: r, onAddComment: a }) : null,\n            ],\n          });\n  },\n  TA = ({ shareId: e, userId: t, conversationGroupId: n, source: o }) =>\n    /* @__PURE__ */ f.jsx(\"div\", {\n      className: \"altimate-component\",\n      children: /* @__PURE__ */ f.jsx(f8, {\n        shareId: e,\n        userId: t,\n        conversationGroupId: n,\n        source: o,\n        children: /* @__PURE__ */ f.jsx(B9, {}),\n      }),\n    }),\n  V9 = {\n    selectedTable: \"\",\n    moreTables: {},\n    sidebarScreen: \"\",\n    selectedColumn: void 0,\n    collectColumns: {},\n    confidence: { confidence: \"high\" },\n    leftExpansion: 0,\n    rightExpansion: 0,\n    minRange: [0, 0],\n    nodeCount: 0,\n    selectCheck: !0,\n    nonSelectCheck: !0,\n    defaultExpansion: 1,\n    aiEnabled: !1,\n    modalArgs: null,\n    theme: \"dark\",\n    lineageType: \"dynamic\",\n    highlightedNodes: [],\n    externalSidePanel: !1,\n    selectedNode: \"\",\n    nodeSavingsPerformance: {},\n    nodesCost: {},\n    errors: {},\n  },\n  Ri = pc({\n    name: \"lineageState\",\n    initialState: V9,\n    reducers: {\n      setAllowSyncColumnsWithDB: (e, t) => {\n        e.allowSyncColumnsWithDB = t.payload;\n      },\n      setStaticLineage: (e, t) => {\n        e.sqlLineage = t.payload;\n      },\n      setLineageType: (e, t) => {\n        e.lineageType = t.payload;\n      },\n      setTheme: (e, t) => {\n        e.theme = t.payload;\n      },\n      setSelectedTable: (e, t) => {\n        e.selectedTable = t.payload;\n      },\n      setModalArgs: (e, t) => {\n        e.modalArgs = t.payload;\n      },\n      setAiEnabled: (e, t) => {\n        e.aiEnabled = t.payload;\n      },\n      setMoreTables: (e, t) => {\n        e.moreTables = t.payload;\n      },\n      mergeSeeMoreTables: (e, t) => {\n        e.moreTables = {\n          ...e.moreTables,\n          lineage: [...(e.moreTables.lineage || []), ...t.payload],\n        };\n      },\n      setSidebarScreen: (e, t) => {\n        e.sidebarScreen = t.payload;\n      },\n      setSelectedColumn: (e, t) => {\n        e.selectedColumn = t.payload;\n      },\n      setCollectColumns: (e, t) => {\n        e.collectColumns = t.payload;\n      },\n      mergeCollectColumns: (e, t) => {\n        const n = t.payload,\n          o = {\n            ...e.collectColumns,\n          };\n        for (const r in n) {\n          const i = n[r];\n          if (!(r in o)) {\n            o[r] = i;\n            continue;\n          }\n          const a = i\n            .map((l) => {\n              const s = o[r].findIndex((u) => u.column === l.column);\n              return s === -1\n                ? l\n                : (l.viewsType && (o[r][s].viewsType = l.viewsType), null);\n            })\n            .filter((l) => l !== null);\n          o[r].push(...a);\n        }\n        e.collectColumns = o;\n      },\n      setConfidence: (e, t) => {\n        e.confidence = t.payload;\n      },\n      updateConfidenceWithOperatorList: (e, t) => {\n        const n = { ...e.confidence, confidence: \"low\" };\n        (n.operator_list = n.operator_list || []),\n          n.operator_list.push(...(t.payload.operatorList || [])),\n          (e.confidence = n);\n      },\n      setLeftExpansion: (e, t) => {\n        e.leftExpansion = t.payload;\n      },\n      setRightExpansion: (e, t) => {\n        e.rightExpansion = t.payload;\n      },\n      setMinRange: (e, t) => {\n        e.minRange = t.payload;\n      },\n      setNodeCount: (e, t) => {\n        e.nodeCount = t.payload;\n      },\n      setSelectCheck: (e, t) => {\n        e.selectCheck = t.payload;\n      },\n      setNonSelectCheck: (e, t) => {\n        e.nonSelectCheck = t.payload;\n      },\n      setDefaultExpansion: (e, t) => {\n        e.defaultExpansion = t.payload;\n      },\n      setSqlLineageDetails: (e, t) => {\n        e.sqlLineage = t.payload;\n      },\n      setHighlightedNodes: (e, t) => {\n        e.highlightedNodes = t.payload;\n      },\n      setSelectedNode: (e, t) => {\n        e.selectedNode = t.payload;\n      },\n      setNodesSavingsPerformance: (e, t) => {\n        e.nodeSavingsPerformance = t.payload;\n      },\n      setNodesCost: (e, t) => {\n        e.nodesCost = t.payload;\n      },\n      setErrors: (e, t) => {\n        e.errors = t.payload;\n      },\n    },\n  }),\n  {\n    setSelectedTable: to,\n    setMoreTables: kc,\n    mergeSeeMoreTables: _c,\n    setSidebarScreen: Kt,\n    setSelectedColumn: Un,\n    setCollectColumns: br,\n    mergeCollectColumns: Ac,\n    setConfidence: $9,\n    updateConfidenceWithOperatorList: Mc,\n    setLeftExpansion: Ll,\n    setRightExpansion: Dl,\n    setMinRange: yr,\n    setNodeCount: Mo,\n    setSelectCheck: r3,\n    setNonSelectCheck: i3,\n    setDefaultExpansion: a3,\n    setAiEnabled: W9,\n    setModalArgs: To,\n    setTheme: Z9,\n    setLineageType: OA,\n    setStaticLineage: NA,\n    setAllowSyncColumnsWithDB: LA,\n    setSqlLineageDetails: U9,\n    setHighlightedNodes: q9,\n    setSelectedNode: Y9,\n    setNodesSavingsPerformance: G9,\n    setNodesCost: K9,\n    setErrors: Tc,\n  } = Ri.actions;\nfunction yt(e) {\n  if (typeof e == \"string\" || typeof e == \"number\") return \"\" + e;\n  let t = \"\";\n  if (Array.isArray(e))\n    for (let n = 0, o; n < e.length; n++)\n      (o = yt(e[n])) !== \"\" && (t += (t && \" \") + o);\n  else for (let n in e) e[n] && (t += (t && \" \") + n);\n  return t;\n}\nvar Ss = { exports: {} },\n  jl = {},\n  ei = { exports: {} },\n  Fl = {};\n/**\n * @license React\n * use-sync-external-store-shim.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar lu;\nfunction X9() {\n  if (lu) return Fl;\n  lu = 1;\n  var e = $;\n  function t(d, p) {\n    return (d === p && (d !== 0 || 1 / d === 1 / p)) || (d !== d && p !== p);\n  }\n  var n = typeof Object.is == \"function\" ? Object.is : t,\n    o = e.useState,\n    r = e.useEffect,\n    i = e.useLayoutEffect,\n    a = e.useDebugValue;\n  function l(d, p) {\n    var h = p(),\n      m = o({ inst: { value: h, getSnapshot: p } }),\n      b = m[0].inst,\n      y = m[1];\n    return (\n      i(\n        function () {\n          (b.value = h), (b.getSnapshot = p), s(b) && y({ inst: b });\n        },\n        [d, h, p],\n      ),\n      r(\n        function () {\n          return (\n            s(b) && y({ inst: b }),\n            d(function () {\n              s(b) && y({ inst: b });\n            })\n          );\n        },\n        [d],\n      ),\n      a(h),\n      h\n    );\n  }\n  function s(d) {\n    var p = d.getSnapshot;\n    d = d.value;\n    try {\n      var h = p();\n      return !n(d, h);\n    } catch {\n      return !0;\n    }\n  }\n  function u(d, p) {\n    return p();\n  }\n  var c =\n    typeof window > \"u\" ||\n    typeof window.document > \"u\" ||\n    typeof window.document.createElement > \"u\"\n      ? u\n      : l;\n  return (\n    (Fl.useSyncExternalStore =\n      e.useSyncExternalStore !== void 0 ? e.useSyncExternalStore : c),\n    Fl\n  );\n}\nvar Rl = {};\n/**\n * @license React\n * use-sync-external-store-shim.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar su;\nfunction Q9() {\n  return (\n    su ||\n      ((su = 1),\n      process.env.NODE_ENV !== \"production\" &&\n        (function () {\n          typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ < \"u\" &&\n            typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart ==\n              \"function\" &&\n            __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(\n              new Error(),\n            );\n          var e = $,\n            t = e.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n          function n(v) {\n            {\n              for (\n                var S = arguments.length,\n                  w = new Array(S > 1 ? S - 1 : 0),\n                  E = 1;\n                E < S;\n                E++\n              )\n                w[E - 1] = arguments[E];\n              o(\"error\", v, w);\n            }\n          }\n          function o(v, S, w) {\n            {\n              var E = t.ReactDebugCurrentFrame,\n                M = E.getStackAddendum();\n              M !== \"\" && ((S += \"%s\"), (w = w.concat([M])));\n              var _ = w.map(function (j) {\n                return String(j);\n              });\n              _.unshift(\"Warning: \" + S),\n                Function.prototype.apply.call(console[v], console, _);\n            }\n          }\n          function r(v, S) {\n            return (\n              (v === S && (v !== 0 || 1 / v === 1 / S)) || (v !== v && S !== S)\n            );\n          }\n          var i = typeof Object.is == \"function\" ? Object.is : r,\n            a = e.useState,\n            l = e.useEffect,\n            s = e.useLayoutEffect,\n            u = e.useDebugValue,\n            c = !1,\n            d = !1;\n          function p(v, S, w) {\n            c ||\n              (e.startTransition !== void 0 &&\n                ((c = !0),\n                n(\n                  \"You are using an outdated, pre-release alpha of React 18 that does not support useSyncExternalStore. The use-sync-external-store shim will not work correctly. Upgrade to a newer pre-release.\",\n                )));\n            var E = S();\n            if (!d) {\n              var M = S();\n              i(E, M) ||\n                (n(\n                  \"The result of getSnapshot should be cached to avoid an infinite loop\",\n                ),\n                (d = !0));\n            }\n            var _ = a({\n                inst: {\n                  value: E,\n                  getSnapshot: S,\n                },\n              }),\n              j = _[0].inst,\n              R = _[1];\n            return (\n              s(\n                function () {\n                  (j.value = E),\n                    (j.getSnapshot = S),\n                    h(j) &&\n                      R({\n                        inst: j,\n                      });\n                },\n                [v, E, S],\n              ),\n              l(\n                function () {\n                  h(j) &&\n                    R({\n                      inst: j,\n                    });\n                  var D = function () {\n                    h(j) &&\n                      R({\n                        inst: j,\n                      });\n                  };\n                  return v(D);\n                },\n                [v],\n              ),\n              u(E),\n              E\n            );\n          }\n          function h(v) {\n            var S = v.getSnapshot,\n              w = v.value;\n            try {\n              var E = S();\n              return !i(w, E);\n            } catch {\n              return !0;\n            }\n          }\n          function m(v, S, w) {\n            return S();\n          }\n          var b =\n              typeof window < \"u\" &&\n              typeof window.document < \"u\" &&\n              typeof window.document.createElement < \"u\",\n            y = !b,\n            g = y ? m : p,\n            x = e.useSyncExternalStore !== void 0 ? e.useSyncExternalStore : g;\n          (Rl.useSyncExternalStore = x),\n            typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ < \"u\" &&\n              typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop ==\n                \"function\" &&\n              __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(\n                new Error(),\n              );\n        })()),\n    Rl\n  );\n}\nvar cu;\nfunction l3() {\n  return (\n    cu ||\n      ((cu = 1),\n      process.env.NODE_ENV === \"production\"\n        ? (ei.exports = X9())\n        : (ei.exports = Q9())),\n    ei.exports\n  );\n}\n/**\n * @license React\n * use-sync-external-store-shim/with-selector.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar uu;\nfunction J9() {\n  if (uu) return jl;\n  uu = 1;\n  var e = $,\n    t = l3();\n  function n(u, c) {\n    return (u === c && (u !== 0 || 1 / u === 1 / c)) || (u !== u && c !== c);\n  }\n  var o = typeof Object.is == \"function\" ? Object.is : n,\n    r = t.useSyncExternalStore,\n    i = e.useRef,\n    a = e.useEffect,\n    l = e.useMemo,\n    s = e.useDebugValue;\n  return (\n    (jl.useSyncExternalStoreWithSelector = function (u, c, d, p, h) {\n      var m = i(null);\n      if (m.current === null) {\n        var b = { hasValue: !1, value: null };\n        m.current = b;\n      } else b = m.current;\n      m = l(\n        function () {\n          function g(E) {\n            if (!x) {\n              if (((x = !0), (v = E), (E = p(E)), h !== void 0 && b.hasValue)) {\n                var M = b.value;\n                if (h(M, E)) return (S = M);\n              }\n              return (S = E);\n            }\n            if (((M = S), o(v, E))) return M;\n            var _ = p(E);\n            return h !== void 0 && h(M, _) ? M : ((v = E), (S = _));\n          }\n          var x = !1,\n            v,\n            S,\n            w = d === void 0 ? null : d;\n          return [\n            function () {\n              return g(c());\n            },\n            w === null\n              ? void 0\n              : function () {\n                  return g(w());\n                },\n          ];\n        },\n        [c, d, p, h],\n      );\n      var y = r(u, m[0], m[1]);\n      return (\n        a(\n          function () {\n            (b.hasValue = !0), (b.value = y);\n          },\n          [y],\n        ),\n        s(y),\n        y\n      );\n    }),\n    jl\n  );\n}\nvar Il = {};\n/**\n * @license React\n * use-sync-external-store-shim/with-selector.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar du;\nfunction eh() {\n  return (\n    du ||\n      ((du = 1),\n      process.env.NODE_ENV !== \"production\" &&\n        (function () {\n          typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ < \"u\" &&\n            typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart ==\n              \"function\" &&\n            __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(\n              new Error(),\n            );\n          var e = $,\n            t = l3();\n          function n(c, d) {\n            return (\n              (c === d && (c !== 0 || 1 / c === 1 / d)) || (c !== c && d !== d)\n            );\n          }\n          var o = typeof Object.is == \"function\" ? Object.is : n,\n            r = t.useSyncExternalStore,\n            i = e.useRef,\n            a = e.useEffect,\n            l = e.useMemo,\n            s = e.useDebugValue;\n          function u(c, d, p, h, m) {\n            var b = i(null),\n              y;\n            b.current === null\n              ? ((y = {\n                  hasValue: !1,\n                  value: null,\n                }),\n                (b.current = y))\n              : (y = b.current);\n            var g = l(\n                function () {\n                  var w = !1,\n                    E,\n                    M,\n                    _ = function (P) {\n                      if (!w) {\n                        (w = !0), (E = P);\n                        var V = h(P);\n                        if (m !== void 0 && y.hasValue) {\n                          var k = y.value;\n                          if (m(k, V)) return (M = k), k;\n                        }\n                        return (M = V), V;\n                      }\n                      var N = E,\n                        T = M;\n                      if (o(N, P)) return T;\n                      var F = h(P);\n                      return m !== void 0 && m(T, F)\n                        ? T\n                        : ((E = P), (M = F), F);\n                    },\n                    j = p === void 0 ? null : p,\n                    R = function () {\n                      return _(d());\n                    },\n                    D =\n                      j === null\n                        ? void 0\n                        : function () {\n                            return _(j());\n                          };\n                  return [R, D];\n                },\n                [d, p, h, m],\n              ),\n              x = g[0],\n              v = g[1],\n              S = r(c, x, v);\n            return (\n              a(\n                function () {\n                  (y.hasValue = !0), (y.value = S);\n                },\n                [S],\n              ),\n              s(S),\n              S\n            );\n          }\n          (Il.useSyncExternalStoreWithSelector = u),\n            typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ < \"u\" &&\n              typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop ==\n                \"function\" &&\n              __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(\n                new Error(),\n              );\n        })()),\n    Il\n  );\n}\nprocess.env.NODE_ENV === \"production\"\n  ? (Ss.exports = J9())\n  : (Ss.exports = eh());\nvar th = Ss.exports;\nconst nh = /* @__PURE__ */ fn(th),\n  oh = { BASE_URL: \"/\", DEV: !1, MODE: \"production\", PROD: !0, SSR: !1 },\n  fu = (e) => {\n    let t;\n    const n = /* @__PURE__ */ new Set(),\n      o = (c, d) => {\n        const p = typeof c == \"function\" ? c(t) : c;\n        if (!Object.is(p, t)) {\n          const h = t;\n          (t =\n            (d ?? (typeof p != \"object\" || p === null))\n              ? p\n              : Object.assign({}, t, p)),\n            n.forEach((m) => m(t, h));\n        }\n      },\n      r = () => t,\n      s = {\n        setState: o,\n        getState: r,\n        getInitialState: () => u,\n        subscribe: (c) => (n.add(c), () => n.delete(c)),\n        destroy: () => {\n          (oh ? \"production\" : void 0) !== \"production\" &&\n            console.warn(\n              \"[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected.\",\n            ),\n            n.clear();\n        },\n      },\n      u = (t = e(o, r, s));\n    return s;\n  },\n  rh = (e) => (e ? fu(e) : fu),\n  { useDebugValue: ih } = $,\n  { useSyncExternalStoreWithSelector: ah } = nh,\n  lh = (e) => e;\nfunction s3(e, t = lh, n) {\n  const o = ah(\n    e.subscribe,\n    e.getState,\n    e.getServerState || e.getInitialState,\n    t,\n    n,\n  );\n  return ih(o), o;\n}\nconst hu = (e, t) => {\n    const n = rh(e),\n      o = (r, i = t) => s3(n, r, i);\n    return Object.assign(o, n), o;\n  },\n  sh = (e, t) => (e ? hu(e, t) : hu);\nfunction ut(e, t) {\n  if (Object.is(e, t)) return !0;\n  if (typeof e != \"object\" || e === null || typeof t != \"object\" || t === null)\n    return !1;\n  if (e instanceof Map && t instanceof Map) {\n    if (e.size !== t.size) return !1;\n    for (const [o, r] of e) if (!Object.is(r, t.get(o))) return !1;\n    return !0;\n  }\n  if (e instanceof Set && t instanceof Set) {\n    if (e.size !== t.size) return !1;\n    for (const o of e) if (!t.has(o)) return !1;\n    return !0;\n  }\n  const n = Object.keys(e);\n  if (n.length !== Object.keys(t).length) return !1;\n  for (const o of n)\n    if (!Object.prototype.hasOwnProperty.call(t, o) || !Object.is(e[o], t[o]))\n      return !1;\n  return !0;\n}\nvar ch = { value: () => {} };\nfunction sa() {\n  for (var e = 0, t = arguments.length, n = {}, o; e < t; ++e) {\n    if (!(o = arguments[e] + \"\") || o in n || /[\\s.]/.test(o))\n      throw new Error(\"illegal type: \" + o);\n    n[o] = [];\n  }\n  return new xi(n);\n}\nfunction xi(e) {\n  this._ = e;\n}\nfunction uh(e, t) {\n  return e\n    .trim()\n    .split(/^|\\s+/)\n    .map(function (n) {\n      var o = \"\",\n        r = n.indexOf(\".\");\n      if (\n        (r >= 0 && ((o = n.slice(r + 1)), (n = n.slice(0, r))),\n        n && !t.hasOwnProperty(n))\n      )\n        throw new Error(\"unknown type: \" + n);\n      return { type: n, name: o };\n    });\n}\nxi.prototype = sa.prototype = {\n  constructor: xi,\n  on: function (e, t) {\n    var n = this._,\n      o = uh(e + \"\", n),\n      r,\n      i = -1,\n      a = o.length;\n    if (arguments.length < 2) {\n      for (; ++i < a; )\n        if ((r = (e = o[i]).type) && (r = dh(n[r], e.name))) return r;\n      return;\n    }\n    if (t != null && typeof t != \"function\")\n      throw new Error(\"invalid callback: \" + t);\n    for (; ++i < a; )\n      if ((r = (e = o[i]).type)) n[r] = pu(n[r], e.name, t);\n      else if (t == null) for (r in n) n[r] = pu(n[r], e.name, null);\n    return this;\n  },\n  copy: function () {\n    var e = {},\n      t = this._;\n    for (var n in t) e[n] = t[n].slice();\n    return new xi(e);\n  },\n  call: function (e, t) {\n    if ((r = arguments.length - 2) > 0)\n      for (var n = new Array(r), o = 0, r, i; o < r; ++o)\n        n[o] = arguments[o + 2];\n    if (!this._.hasOwnProperty(e)) throw new Error(\"unknown type: \" + e);\n    for (i = this._[e], o = 0, r = i.length; o < r; ++o) i[o].value.apply(t, n);\n  },\n  apply: function (e, t, n) {\n    if (!this._.hasOwnProperty(e)) throw new Error(\"unknown type: \" + e);\n    for (var o = this._[e], r = 0, i = o.length; r < i; ++r)\n      o[r].value.apply(t, n);\n  },\n};\nfunction dh(e, t) {\n  for (var n = 0, o = e.length, r; n < o; ++n)\n    if ((r = e[n]).name === t) return r.value;\n}\nfunction pu(e, t, n) {\n  for (var o = 0, r = e.length; o < r; ++o)\n    if (e[o].name === t) {\n      (e[o] = ch), (e = e.slice(0, o).concat(e.slice(o + 1)));\n      break;\n    }\n  return n != null && e.push({ name: t, value: n }), e;\n}\nvar ks = \"http://www.w3.org/1999/xhtml\";\nconst gu = {\n  svg: \"http://www.w3.org/2000/svg\",\n  xhtml: ks,\n  xlink: \"http://www.w3.org/1999/xlink\",\n  xml: \"http://www.w3.org/XML/1998/namespace\",\n  xmlns: \"http://www.w3.org/2000/xmlns/\",\n};\nfunction ca(e) {\n  var t = (e += \"\"),\n    n = t.indexOf(\":\");\n  return (\n    n >= 0 && (t = e.slice(0, n)) !== \"xmlns\" && (e = e.slice(n + 1)),\n    gu.hasOwnProperty(t) ? { space: gu[t], local: e } : e\n  );\n}\nfunction fh(e) {\n  return function () {\n    var t = this.ownerDocument,\n      n = this.namespaceURI;\n    return n === ks && t.documentElement.namespaceURI === ks\n      ? t.createElement(e)\n      : t.createElementNS(n, e);\n  };\n}\nfunction hh(e) {\n  return function () {\n    return this.ownerDocument.createElementNS(e.space, e.local);\n  };\n}\nfunction c3(e) {\n  var t = ca(e);\n  return (t.local ? hh : fh)(t);\n}\nfunction ph() {}\nfunction Oc(e) {\n  return e == null\n    ? ph\n    : function () {\n        return this.querySelector(e);\n      };\n}\nfunction gh(e) {\n  typeof e != \"function\" && (e = Oc(e));\n  for (var t = this._groups, n = t.length, o = new Array(n), r = 0; r < n; ++r)\n    for (\n      var i = t[r], a = i.length, l = (o[r] = new Array(a)), s, u, c = 0;\n      c < a;\n      ++c\n    )\n      (s = i[c]) &&\n        (u = e.call(s, s.__data__, c, i)) &&\n        (\"__data__\" in s && (u.__data__ = s.__data__), (l[c] = u));\n  return new Nt(o, this._parents);\n}\nfunction mh(e) {\n  return e == null ? [] : Array.isArray(e) ? e : Array.from(e);\n}\nfunction bh() {\n  return [];\n}\nfunction u3(e) {\n  return e == null\n    ? bh\n    : function () {\n        return this.querySelectorAll(e);\n      };\n}\nfunction yh(e) {\n  return function () {\n    return mh(e.apply(this, arguments));\n  };\n}\nfunction Ch(e) {\n  typeof e == \"function\" ? (e = yh(e)) : (e = u3(e));\n  for (var t = this._groups, n = t.length, o = [], r = [], i = 0; i < n; ++i)\n    for (var a = t[i], l = a.length, s, u = 0; u < l; ++u)\n      (s = a[u]) && (o.push(e.call(s, s.__data__, u, a)), r.push(s));\n  return new Nt(o, r);\n}\nfunction d3(e) {\n  return function () {\n    return this.matches(e);\n  };\n}\nfunction f3(e) {\n  return function (t) {\n    return t.matches(e);\n  };\n}\nvar vh = Array.prototype.find;\nfunction xh(e) {\n  return function () {\n    return vh.call(this.children, e);\n  };\n}\nfunction wh() {\n  return this.firstElementChild;\n}\nfunction Eh(e) {\n  return this.select(e == null ? wh : xh(typeof e == \"function\" ? e : f3(e)));\n}\nvar Sh = Array.prototype.filter;\nfunction kh() {\n  return Array.from(this.children);\n}\nfunction _h(e) {\n  return function () {\n    return Sh.call(this.children, e);\n  };\n}\nfunction Ah(e) {\n  return this.selectAll(\n    e == null ? kh : _h(typeof e == \"function\" ? e : f3(e)),\n  );\n}\nfunction Mh(e) {\n  typeof e != \"function\" && (e = d3(e));\n  for (var t = this._groups, n = t.length, o = new Array(n), r = 0; r < n; ++r)\n    for (var i = t[r], a = i.length, l = (o[r] = []), s, u = 0; u < a; ++u)\n      (s = i[u]) && e.call(s, s.__data__, u, i) && l.push(s);\n  return new Nt(o, this._parents);\n}\nfunction h3(e) {\n  return new Array(e.length);\n}\nfunction Th() {\n  return new Nt(this._enter || this._groups.map(h3), this._parents);\n}\nfunction Ii(e, t) {\n  (this.ownerDocument = e.ownerDocument),\n    (this.namespaceURI = e.namespaceURI),\n    (this._next = null),\n    (this._parent = e),\n    (this.__data__ = t);\n}\nIi.prototype = {\n  constructor: Ii,\n  appendChild: function (e) {\n    return this._parent.insertBefore(e, this._next);\n  },\n  insertBefore: function (e, t) {\n    return this._parent.insertBefore(e, t);\n  },\n  querySelector: function (e) {\n    return this._parent.querySelector(e);\n  },\n  querySelectorAll: function (e) {\n    return this._parent.querySelectorAll(e);\n  },\n};\nfunction Oh(e) {\n  return function () {\n    return e;\n  };\n}\nfunction Nh(e, t, n, o, r, i) {\n  for (var a = 0, l, s = t.length, u = i.length; a < u; ++a)\n    (l = t[a]) ? ((l.__data__ = i[a]), (o[a] = l)) : (n[a] = new Ii(e, i[a]));\n  for (; a < s; ++a) (l = t[a]) && (r[a] = l);\n}\nfunction Lh(e, t, n, o, r, i, a) {\n  var l,\n    s,\n    u = /* @__PURE__ */ new Map(),\n    c = t.length,\n    d = i.length,\n    p = new Array(c),\n    h;\n  for (l = 0; l < c; ++l)\n    (s = t[l]) &&\n      ((p[l] = h = a.call(s, s.__data__, l, t) + \"\"),\n      u.has(h) ? (r[l] = s) : u.set(h, s));\n  for (l = 0; l < d; ++l)\n    (h = a.call(e, i[l], l, i) + \"\"),\n      (s = u.get(h))\n        ? ((o[l] = s), (s.__data__ = i[l]), u.delete(h))\n        : (n[l] = new Ii(e, i[l]));\n  for (l = 0; l < c; ++l) (s = t[l]) && u.get(p[l]) === s && (r[l] = s);\n}\nfunction Dh(e) {\n  return e.__data__;\n}\nfunction jh(e, t) {\n  if (!arguments.length) return Array.from(this, Dh);\n  var n = t ? Lh : Nh,\n    o = this._parents,\n    r = this._groups;\n  typeof e != \"function\" && (e = Oh(e));\n  for (\n    var i = r.length,\n      a = new Array(i),\n      l = new Array(i),\n      s = new Array(i),\n      u = 0;\n    u < i;\n    ++u\n  ) {\n    var c = o[u],\n      d = r[u],\n      p = d.length,\n      h = Fh(e.call(c, c && c.__data__, u, o)),\n      m = h.length,\n      b = (l[u] = new Array(m)),\n      y = (a[u] = new Array(m)),\n      g = (s[u] = new Array(p));\n    n(c, d, b, y, g, h, t);\n    for (var x = 0, v = 0, S, w; x < m; ++x)\n      if ((S = b[x])) {\n        for (x >= v && (v = x + 1); !(w = y[v]) && ++v < m; );\n        S._next = w || null;\n      }\n  }\n  return (a = new Nt(a, o)), (a._enter = l), (a._exit = s), a;\n}\nfunction Fh(e) {\n  return typeof e == \"object\" && \"length\" in e ? e : Array.from(e);\n}\nfunction Rh() {\n  return new Nt(this._exit || this._groups.map(h3), this._parents);\n}\nfunction Ih(e, t, n) {\n  var o = this.enter(),\n    r = this,\n    i = this.exit();\n  return (\n    typeof e == \"function\"\n      ? ((o = e(o)), o && (o = o.selection()))\n      : (o = o.append(e + \"\")),\n    t != null && ((r = t(r)), r && (r = r.selection())),\n    n == null ? i.remove() : n(i),\n    o && r ? o.merge(r).order() : r\n  );\n}\nfunction Hh(e) {\n  for (\n    var t = e.selection ? e.selection() : e,\n      n = this._groups,\n      o = t._groups,\n      r = n.length,\n      i = o.length,\n      a = Math.min(r, i),\n      l = new Array(r),\n      s = 0;\n    s < a;\n    ++s\n  )\n    for (\n      var u = n[s], c = o[s], d = u.length, p = (l[s] = new Array(d)), h, m = 0;\n      m < d;\n      ++m\n    )\n      (h = u[m] || c[m]) && (p[m] = h);\n  for (; s < r; ++s) l[s] = n[s];\n  return new Nt(l, this._parents);\n}\nfunction zh() {\n  for (var e = this._groups, t = -1, n = e.length; ++t < n; )\n    for (var o = e[t], r = o.length - 1, i = o[r], a; --r >= 0; )\n      (a = o[r]) &&\n        (i &&\n          a.compareDocumentPosition(i) ^ 4 &&\n          i.parentNode.insertBefore(a, i),\n        (i = a));\n  return this;\n}\nfunction Ph(e) {\n  e || (e = Bh);\n  function t(d, p) {\n    return d && p ? e(d.__data__, p.__data__) : !d - !p;\n  }\n  for (\n    var n = this._groups, o = n.length, r = new Array(o), i = 0;\n    i < o;\n    ++i\n  ) {\n    for (\n      var a = n[i], l = a.length, s = (r[i] = new Array(l)), u, c = 0;\n      c < l;\n      ++c\n    )\n      (u = a[c]) && (s[c] = u);\n    s.sort(t);\n  }\n  return new Nt(r, this._parents).order();\n}\nfunction Bh(e, t) {\n  return e < t ? -1 : e > t ? 1 : e >= t ? 0 : NaN;\n}\nfunction Vh() {\n  var e = arguments[0];\n  return (arguments[0] = this), e.apply(null, arguments), this;\n}\nfunction $h() {\n  return Array.from(this);\n}\nfunction Wh() {\n  for (var e = this._groups, t = 0, n = e.length; t < n; ++t)\n    for (var o = e[t], r = 0, i = o.length; r < i; ++r) {\n      var a = o[r];\n      if (a) return a;\n    }\n  return null;\n}\nfunction Zh() {\n  let e = 0;\n  for (const t of this) ++e;\n  return e;\n}\nfunction Uh() {\n  return !this.node();\n}\nfunction qh(e) {\n  for (var t = this._groups, n = 0, o = t.length; n < o; ++n)\n    for (var r = t[n], i = 0, a = r.length, l; i < a; ++i)\n      (l = r[i]) && e.call(l, l.__data__, i, r);\n  return this;\n}\nfunction Yh(e) {\n  return function () {\n    this.removeAttribute(e);\n  };\n}\nfunction Gh(e) {\n  return function () {\n    this.removeAttributeNS(e.space, e.local);\n  };\n}\nfunction Kh(e, t) {\n  return function () {\n    this.setAttribute(e, t);\n  };\n}\nfunction Xh(e, t) {\n  return function () {\n    this.setAttributeNS(e.space, e.local, t);\n  };\n}\nfunction Qh(e, t) {\n  return function () {\n    var n = t.apply(this, arguments);\n    n == null ? this.removeAttribute(e) : this.setAttribute(e, n);\n  };\n}\nfunction Jh(e, t) {\n  return function () {\n    var n = t.apply(this, arguments);\n    n == null\n      ? this.removeAttributeNS(e.space, e.local)\n      : this.setAttributeNS(e.space, e.local, n);\n  };\n}\nfunction ep(e, t) {\n  var n = ca(e);\n  if (arguments.length < 2) {\n    var o = this.node();\n    return n.local ? o.getAttributeNS(n.space, n.local) : o.getAttribute(n);\n  }\n  return this.each(\n    (t == null\n      ? n.local\n        ? Gh\n        : Yh\n      : typeof t == \"function\"\n        ? n.local\n          ? Jh\n          : Qh\n        : n.local\n          ? Xh\n          : Kh)(n, t),\n  );\n}\nfunction p3(e) {\n  return (\n    (e.ownerDocument && e.ownerDocument.defaultView) ||\n    (e.document && e) ||\n    e.defaultView\n  );\n}\nfunction tp(e) {\n  return function () {\n    this.style.removeProperty(e);\n  };\n}\nfunction np(e, t, n) {\n  return function () {\n    this.style.setProperty(e, t, n);\n  };\n}\nfunction op(e, t, n) {\n  return function () {\n    var o = t.apply(this, arguments);\n    o == null ? this.style.removeProperty(e) : this.style.setProperty(e, o, n);\n  };\n}\nfunction rp(e, t, n) {\n  return arguments.length > 1\n    ? this.each(\n        (t == null ? tp : typeof t == \"function\" ? op : np)(e, t, n ?? \"\"),\n      )\n    : Oo(this.node(), e);\n}\nfunction Oo(e, t) {\n  return (\n    e.style.getPropertyValue(t) ||\n    p3(e).getComputedStyle(e, null).getPropertyValue(t)\n  );\n}\nfunction ip(e) {\n  return function () {\n    delete this[e];\n  };\n}\nfunction ap(e, t) {\n  return function () {\n    this[e] = t;\n  };\n}\nfunction lp(e, t) {\n  return function () {\n    var n = t.apply(this, arguments);\n    n == null ? delete this[e] : (this[e] = n);\n  };\n}\nfunction sp(e, t) {\n  return arguments.length > 1\n    ? this.each((t == null ? ip : typeof t == \"function\" ? lp : ap)(e, t))\n    : this.node()[e];\n}\nfunction g3(e) {\n  return e.trim().split(/^|\\s+/);\n}\nfunction Nc(e) {\n  return e.classList || new m3(e);\n}\nfunction m3(e) {\n  (this._node = e), (this._names = g3(e.getAttribute(\"class\") || \"\"));\n}\nm3.prototype = {\n  add: function (e) {\n    var t = this._names.indexOf(e);\n    t < 0 &&\n      (this._names.push(e),\n      this._node.setAttribute(\"class\", this._names.join(\" \")));\n  },\n  remove: function (e) {\n    var t = this._names.indexOf(e);\n    t >= 0 &&\n      (this._names.splice(t, 1),\n      this._node.setAttribute(\"class\", this._names.join(\" \")));\n  },\n  contains: function (e) {\n    return this._names.indexOf(e) >= 0;\n  },\n};\nfunction b3(e, t) {\n  for (var n = Nc(e), o = -1, r = t.length; ++o < r; ) n.add(t[o]);\n}\nfunction y3(e, t) {\n  for (var n = Nc(e), o = -1, r = t.length; ++o < r; ) n.remove(t[o]);\n}\nfunction cp(e) {\n  return function () {\n    b3(this, e);\n  };\n}\nfunction up(e) {\n  return function () {\n    y3(this, e);\n  };\n}\nfunction dp(e, t) {\n  return function () {\n    (t.apply(this, arguments) ? b3 : y3)(this, e);\n  };\n}\nfunction fp(e, t) {\n  var n = g3(e + \"\");\n  if (arguments.length < 2) {\n    for (var o = Nc(this.node()), r = -1, i = n.length; ++r < i; )\n      if (!o.contains(n[r])) return !1;\n    return !0;\n  }\n  return this.each((typeof t == \"function\" ? dp : t ? cp : up)(n, t));\n}\nfunction hp() {\n  this.textContent = \"\";\n}\nfunction pp(e) {\n  return function () {\n    this.textContent = e;\n  };\n}\nfunction gp(e) {\n  return function () {\n    var t = e.apply(this, arguments);\n    this.textContent = t ?? \"\";\n  };\n}\nfunction mp(e) {\n  return arguments.length\n    ? this.each(e == null ? hp : (typeof e == \"function\" ? gp : pp)(e))\n    : this.node().textContent;\n}\nfunction bp() {\n  this.innerHTML = \"\";\n}\nfunction yp(e) {\n  return function () {\n    this.innerHTML = e;\n  };\n}\nfunction Cp(e) {\n  return function () {\n    var t = e.apply(this, arguments);\n    this.innerHTML = t ?? \"\";\n  };\n}\nfunction vp(e) {\n  return arguments.length\n    ? this.each(e == null ? bp : (typeof e == \"function\" ? Cp : yp)(e))\n    : this.node().innerHTML;\n}\nfunction xp() {\n  this.nextSibling && this.parentNode.appendChild(this);\n}\nfunction wp() {\n  return this.each(xp);\n}\nfunction Ep() {\n  this.previousSibling &&\n    this.parentNode.insertBefore(this, this.parentNode.firstChild);\n}\nfunction Sp() {\n  return this.each(Ep);\n}\nfunction kp(e) {\n  var t = typeof e == \"function\" ? e : c3(e);\n  return this.select(function () {\n    return this.appendChild(t.apply(this, arguments));\n  });\n}\nfunction _p() {\n  return null;\n}\nfunction Ap(e, t) {\n  var n = typeof e == \"function\" ? e : c3(e),\n    o = t == null ? _p : typeof t == \"function\" ? t : Oc(t);\n  return this.select(function () {\n    return this.insertBefore(\n      n.apply(this, arguments),\n      o.apply(this, arguments) || null,\n    );\n  });\n}\nfunction Mp() {\n  var e = this.parentNode;\n  e && e.removeChild(this);\n}\nfunction Tp() {\n  return this.each(Mp);\n}\nfunction Op() {\n  var e = this.cloneNode(!1),\n    t = this.parentNode;\n  return t ? t.insertBefore(e, this.nextSibling) : e;\n}\nfunction Np() {\n  var e = this.cloneNode(!0),\n    t = this.parentNode;\n  return t ? t.insertBefore(e, this.nextSibling) : e;\n}\nfunction Lp(e) {\n  return this.select(e ? Np : Op);\n}\nfunction Dp(e) {\n  return arguments.length ? this.property(\"__data__\", e) : this.node().__data__;\n}\nfunction jp(e) {\n  return function (t) {\n    e.call(this, t, this.__data__);\n  };\n}\nfunction Fp(e) {\n  return e\n    .trim()\n    .split(/^|\\s+/)\n    .map(function (t) {\n      var n = \"\",\n        o = t.indexOf(\".\");\n      return (\n        o >= 0 && ((n = t.slice(o + 1)), (t = t.slice(0, o))),\n        { type: t, name: n }\n      );\n    });\n}\nfunction Rp(e) {\n  return function () {\n    var t = this.__on;\n    if (t) {\n      for (var n = 0, o = -1, r = t.length, i; n < r; ++n)\n        (i = t[n]),\n          (!e.type || i.type === e.type) && i.name === e.name\n            ? this.removeEventListener(i.type, i.listener, i.options)\n            : (t[++o] = i);\n      ++o ? (t.length = o) : delete this.__on;\n    }\n  };\n}\nfunction Ip(e, t, n) {\n  return function () {\n    var o = this.__on,\n      r,\n      i = jp(t);\n    if (o) {\n      for (var a = 0, l = o.length; a < l; ++a)\n        if ((r = o[a]).type === e.type && r.name === e.name) {\n          this.removeEventListener(r.type, r.listener, r.options),\n            this.addEventListener(r.type, (r.listener = i), (r.options = n)),\n            (r.value = t);\n          return;\n        }\n    }\n    this.addEventListener(e.type, i, n),\n      (r = { type: e.type, name: e.name, value: t, listener: i, options: n }),\n      o ? o.push(r) : (this.__on = [r]);\n  };\n}\nfunction Hp(e, t, n) {\n  var o = Fp(e + \"\"),\n    r,\n    i = o.length,\n    a;\n  if (arguments.length < 2) {\n    var l = this.node().__on;\n    if (l) {\n      for (var s = 0, u = l.length, c; s < u; ++s)\n        for (r = 0, c = l[s]; r < i; ++r)\n          if ((a = o[r]).type === c.type && a.name === c.name) return c.value;\n    }\n    return;\n  }\n  for (l = t ? Ip : Rp, r = 0; r < i; ++r) this.each(l(o[r], t, n));\n  return this;\n}\nfunction C3(e, t, n) {\n  var o = p3(e),\n    r = o.CustomEvent;\n  typeof r == \"function\"\n    ? (r = new r(t, n))\n    : ((r = o.document.createEvent(\"Event\")),\n      n\n        ? (r.initEvent(t, n.bubbles, n.cancelable), (r.detail = n.detail))\n        : r.initEvent(t, !1, !1)),\n    e.dispatchEvent(r);\n}\nfunction zp(e, t) {\n  return function () {\n    return C3(this, e, t);\n  };\n}\nfunction Pp(e, t) {\n  return function () {\n    return C3(this, e, t.apply(this, arguments));\n  };\n}\nfunction Bp(e, t) {\n  return this.each((typeof t == \"function\" ? Pp : zp)(e, t));\n}\nfunction* Vp() {\n  for (var e = this._groups, t = 0, n = e.length; t < n; ++t)\n    for (var o = e[t], r = 0, i = o.length, a; r < i; ++r)\n      (a = o[r]) && (yield a);\n}\nvar v3 = [null];\nfunction Nt(e, t) {\n  (this._groups = e), (this._parents = t);\n}\nfunction jr() {\n  return new Nt([[document.documentElement]], v3);\n}\nfunction $p() {\n  return this;\n}\nNt.prototype = jr.prototype = {\n  constructor: Nt,\n  select: gh,\n  selectAll: Ch,\n  selectChild: Eh,\n  selectChildren: Ah,\n  filter: Mh,\n  data: jh,\n  enter: Th,\n  exit: Rh,\n  join: Ih,\n  merge: Hh,\n  selection: $p,\n  order: zh,\n  sort: Ph,\n  call: Vh,\n  nodes: $h,\n  node: Wh,\n  size: Zh,\n  empty: Uh,\n  each: qh,\n  attr: ep,\n  style: rp,\n  property: sp,\n  classed: fp,\n  text: mp,\n  html: vp,\n  raise: wp,\n  lower: Sp,\n  append: kp,\n  insert: Ap,\n  remove: Tp,\n  clone: Lp,\n  datum: Dp,\n  on: Hp,\n  dispatch: Bp,\n  [Symbol.iterator]: Vp,\n};\nfunction Yt(e) {\n  return typeof e == \"string\"\n    ? new Nt([[document.querySelector(e)]], [document.documentElement])\n    : new Nt([[e]], v3);\n}\nfunction Wp(e) {\n  let t;\n  for (; (t = e.sourceEvent); ) e = t;\n  return e;\n}\nfunction ln(e, t) {\n  if (((e = Wp(e)), t === void 0 && (t = e.currentTarget), t)) {\n    var n = t.ownerSVGElement || t;\n    if (n.createSVGPoint) {\n      var o = n.createSVGPoint();\n      return (\n        (o.x = e.clientX),\n        (o.y = e.clientY),\n        (o = o.matrixTransform(t.getScreenCTM().inverse())),\n        [o.x, o.y]\n      );\n    }\n    if (t.getBoundingClientRect) {\n      var r = t.getBoundingClientRect();\n      return [\n        e.clientX - r.left - t.clientLeft,\n        e.clientY - r.top - t.clientTop,\n      ];\n    }\n  }\n  return [e.pageX, e.pageY];\n}\nconst Zp = { passive: !1 },\n  Cr = { capture: !0, passive: !1 };\nfunction Hl(e) {\n  e.stopImmediatePropagation();\n}\nfunction yo(e) {\n  e.preventDefault(), e.stopImmediatePropagation();\n}\nfunction x3(e) {\n  var t = e.document.documentElement,\n    n = Yt(e).on(\"dragstart.drag\", yo, Cr);\n  \"onselectstart\" in t\n    ? n.on(\"selectstart.drag\", yo, Cr)\n    : ((t.__noselect = t.style.MozUserSelect),\n      (t.style.MozUserSelect = \"none\"));\n}\nfunction w3(e, t) {\n  var n = e.document.documentElement,\n    o = Yt(e).on(\"dragstart.drag\", null);\n  t &&\n    (o.on(\"click.drag\", yo, Cr),\n    setTimeout(function () {\n      o.on(\"click.drag\", null);\n    }, 0)),\n    \"onselectstart\" in n\n      ? o.on(\"selectstart.drag\", null)\n      : ((n.style.MozUserSelect = n.__noselect), delete n.__noselect);\n}\nconst ti = (e) => () => e;\nfunction _s(\n  e,\n  {\n    sourceEvent: t,\n    subject: n,\n    target: o,\n    identifier: r,\n    active: i,\n    x: a,\n    y: l,\n    dx: s,\n    dy: u,\n    dispatch: c,\n  },\n) {\n  Object.defineProperties(this, {\n    type: { value: e, enumerable: !0, configurable: !0 },\n    sourceEvent: { value: t, enumerable: !0, configurable: !0 },\n    subject: { value: n, enumerable: !0, configurable: !0 },\n    target: { value: o, enumerable: !0, configurable: !0 },\n    identifier: { value: r, enumerable: !0, configurable: !0 },\n    active: { value: i, enumerable: !0, configurable: !0 },\n    x: { value: a, enumerable: !0, configurable: !0 },\n    y: { value: l, enumerable: !0, configurable: !0 },\n    dx: { value: s, enumerable: !0, configurable: !0 },\n    dy: { value: u, enumerable: !0, configurable: !0 },\n    _: { value: c },\n  });\n}\n_s.prototype.on = function () {\n  var e = this._.on.apply(this._, arguments);\n  return e === this._ ? this : e;\n};\nfunction Up(e) {\n  return !e.ctrlKey && !e.button;\n}\nfunction qp() {\n  return this.parentNode;\n}\nfunction Yp(e, t) {\n  return t ?? { x: e.x, y: e.y };\n}\nfunction Gp() {\n  return navigator.maxTouchPoints || \"ontouchstart\" in this;\n}\nfunction Kp() {\n  var e = Up,\n    t = qp,\n    n = Yp,\n    o = Gp,\n    r = {},\n    i = sa(\"start\", \"drag\", \"end\"),\n    a = 0,\n    l,\n    s,\n    u,\n    c,\n    d = 0;\n  function p(S) {\n    S.on(\"mousedown.drag\", h)\n      .filter(o)\n      .on(\"touchstart.drag\", y)\n      .on(\"touchmove.drag\", g, Zp)\n      .on(\"touchend.drag touchcancel.drag\", x)\n      .style(\"touch-action\", \"none\")\n      .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n  }\n  function h(S, w) {\n    if (!(c || !e.call(this, S, w))) {\n      var E = v(this, t.call(this, S, w), S, w, \"mouse\");\n      E &&\n        (Yt(S.view).on(\"mousemove.drag\", m, Cr).on(\"mouseup.drag\", b, Cr),\n        x3(S.view),\n        Hl(S),\n        (u = !1),\n        (l = S.clientX),\n        (s = S.clientY),\n        E(\"start\", S));\n    }\n  }\n  function m(S) {\n    if ((yo(S), !u)) {\n      var w = S.clientX - l,\n        E = S.clientY - s;\n      u = w * w + E * E > d;\n    }\n    r.mouse(\"drag\", S);\n  }\n  function b(S) {\n    Yt(S.view).on(\"mousemove.drag mouseup.drag\", null),\n      w3(S.view, u),\n      yo(S),\n      r.mouse(\"end\", S);\n  }\n  function y(S, w) {\n    if (e.call(this, S, w)) {\n      var E = S.changedTouches,\n        M = t.call(this, S, w),\n        _ = E.length,\n        j,\n        R;\n      for (j = 0; j < _; ++j)\n        (R = v(this, M, S, w, E[j].identifier, E[j])) &&\n          (Hl(S), R(\"start\", S, E[j]));\n    }\n  }\n  function g(S) {\n    var w = S.changedTouches,\n      E = w.length,\n      M,\n      _;\n    for (M = 0; M < E; ++M)\n      (_ = r[w[M].identifier]) && (yo(S), _(\"drag\", S, w[M]));\n  }\n  function x(S) {\n    var w = S.changedTouches,\n      E = w.length,\n      M,\n      _;\n    for (\n      c && clearTimeout(c),\n        c = setTimeout(function () {\n          c = null;\n        }, 500),\n        M = 0;\n      M < E;\n      ++M\n    )\n      (_ = r[w[M].identifier]) && (Hl(S), _(\"end\", S, w[M]));\n  }\n  function v(S, w, E, M, _, j) {\n    var R = i.copy(),\n      D = ln(j || E, w),\n      P,\n      V,\n      k;\n    if (\n      (k = n.call(\n        S,\n        new _s(\"beforestart\", {\n          sourceEvent: E,\n          target: p,\n          identifier: _,\n          active: a,\n          x: D[0],\n          y: D[1],\n          dx: 0,\n          dy: 0,\n          dispatch: R,\n        }),\n        M,\n      )) != null\n    )\n      return (\n        (P = k.x - D[0] || 0),\n        (V = k.y - D[1] || 0),\n        function N(T, F, I) {\n          var L = D,\n            C;\n          switch (T) {\n            case \"start\":\n              (r[_] = N), (C = a++);\n              break;\n            case \"end\":\n              delete r[_], --a;\n            case \"drag\":\n              (D = ln(I || F, w)), (C = a);\n              break;\n          }\n          R.call(\n            T,\n            S,\n            new _s(T, {\n              sourceEvent: F,\n              subject: k,\n              target: p,\n              identifier: _,\n              active: C,\n              x: D[0] + P,\n              y: D[1] + V,\n              dx: D[0] - L[0],\n              dy: D[1] - L[1],\n              dispatch: R,\n            }),\n            M,\n          );\n        }\n      );\n  }\n  return (\n    (p.filter = function (S) {\n      return arguments.length\n        ? ((e = typeof S == \"function\" ? S : ti(!!S)), p)\n        : e;\n    }),\n    (p.container = function (S) {\n      return arguments.length\n        ? ((t = typeof S == \"function\" ? S : ti(S)), p)\n        : t;\n    }),\n    (p.subject = function (S) {\n      return arguments.length\n        ? ((n = typeof S == \"function\" ? S : ti(S)), p)\n        : n;\n    }),\n    (p.touchable = function (S) {\n      return arguments.length\n        ? ((o = typeof S == \"function\" ? S : ti(!!S)), p)\n        : o;\n    }),\n    (p.on = function () {\n      var S = i.on.apply(i, arguments);\n      return S === i ? p : S;\n    }),\n    (p.clickDistance = function (S) {\n      return arguments.length ? ((d = (S = +S) * S), p) : Math.sqrt(d);\n    }),\n    p\n  );\n}\nfunction Lc(e, t, n) {\n  (e.prototype = t.prototype = n), (n.constructor = e);\n}\nfunction E3(e, t) {\n  var n = Object.create(e.prototype);\n  for (var o in t) n[o] = t[o];\n  return n;\n}\nfunction Fr() {}\nvar vr = 0.7,\n  Hi = 1 / vr,\n  Co = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n  xr = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n  un = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n  Xp = /^#([0-9a-f]{3,8})$/,\n  Qp = new RegExp(`^rgb\\\\(${Co},${Co},${Co}\\\\)$`),\n  Jp = new RegExp(`^rgb\\\\(${un},${un},${un}\\\\)$`),\n  eg = new RegExp(`^rgba\\\\(${Co},${Co},${Co},${xr}\\\\)$`),\n  tg = new RegExp(`^rgba\\\\(${un},${un},${un},${xr}\\\\)$`),\n  ng = new RegExp(`^hsl\\\\(${xr},${un},${un}\\\\)$`),\n  og = new RegExp(`^hsla\\\\(${xr},${un},${un},${xr}\\\\)$`),\n  mu = {\n    aliceblue: 15792383,\n    antiquewhite: 16444375,\n    aqua: 65535,\n    aquamarine: 8388564,\n    azure: 15794175,\n    beige: 16119260,\n    bisque: 16770244,\n    black: 0,\n    blanchedalmond: 16772045,\n    blue: 255,\n    blueviolet: 9055202,\n    brown: 10824234,\n    burlywood: 14596231,\n    cadetblue: 6266528,\n    chartreuse: 8388352,\n    chocolate: 13789470,\n    coral: 16744272,\n    cornflowerblue: 6591981,\n    cornsilk: 16775388,\n    crimson: 14423100,\n    cyan: 65535,\n    darkblue: 139,\n    darkcyan: 35723,\n    darkgoldenrod: 12092939,\n    darkgray: 11119017,\n    darkgreen: 25600,\n    darkgrey: 11119017,\n    darkkhaki: 12433259,\n    darkmagenta: 9109643,\n    darkolivegreen: 5597999,\n    darkorange: 16747520,\n    darkorchid: 10040012,\n    darkred: 9109504,\n    darksalmon: 15308410,\n    darkseagreen: 9419919,\n    darkslateblue: 4734347,\n    darkslategray: 3100495,\n    darkslategrey: 3100495,\n    darkturquoise: 52945,\n    darkviolet: 9699539,\n    deeppink: 16716947,\n    deepskyblue: 49151,\n    dimgray: 6908265,\n    dimgrey: 6908265,\n    dodgerblue: 2003199,\n    firebrick: 11674146,\n    floralwhite: 16775920,\n    forestgreen: 2263842,\n    fuchsia: 16711935,\n    gainsboro: 14474460,\n    ghostwhite: 16316671,\n    gold: 16766720,\n    goldenrod: 14329120,\n    gray: 8421504,\n    green: 32768,\n    greenyellow: 11403055,\n    grey: 8421504,\n    honeydew: 15794160,\n    hotpink: 16738740,\n    indianred: 13458524,\n    indigo: 4915330,\n    ivory: 16777200,\n    khaki: 15787660,\n    lavender: 15132410,\n    lavenderblush: 16773365,\n    lawngreen: 8190976,\n    lemonchiffon: 16775885,\n    lightblue: 11393254,\n    lightcoral: 15761536,\n    lightcyan: 14745599,\n    lightgoldenrodyellow: 16448210,\n    lightgray: 13882323,\n    lightgreen: 9498256,\n    lightgrey: 13882323,\n    lightpink: 16758465,\n    lightsalmon: 16752762,\n    lightseagreen: 2142890,\n    lightskyblue: 8900346,\n    lightslategray: 7833753,\n    lightslategrey: 7833753,\n    lightsteelblue: 11584734,\n    lightyellow: 16777184,\n    lime: 65280,\n    limegreen: 3329330,\n    linen: 16445670,\n    magenta: 16711935,\n    maroon: 8388608,\n    mediumaquamarine: 6737322,\n    mediumblue: 205,\n    mediumorchid: 12211667,\n    mediumpurple: 9662683,\n    mediumseagreen: 3978097,\n    mediumslateblue: 8087790,\n    mediumspringgreen: 64154,\n    mediumturquoise: 4772300,\n    mediumvioletred: 13047173,\n    midnightblue: 1644912,\n    mintcream: 16121850,\n    mistyrose: 16770273,\n    moccasin: 16770229,\n    navajowhite: 16768685,\n    navy: 128,\n    oldlace: 16643558,\n    olive: 8421376,\n    olivedrab: 7048739,\n    orange: 16753920,\n    orangered: 16729344,\n    orchid: 14315734,\n    palegoldenrod: 15657130,\n    palegreen: 10025880,\n    paleturquoise: 11529966,\n    palevioletred: 14381203,\n    papayawhip: 16773077,\n    peachpuff: 16767673,\n    peru: 13468991,\n    pink: 16761035,\n    plum: 14524637,\n    powderblue: 11591910,\n    purple: 8388736,\n    rebeccapurple: 6697881,\n    red: 16711680,\n    rosybrown: 12357519,\n    royalblue: 4286945,\n    saddlebrown: 9127187,\n    salmon: 16416882,\n    sandybrown: 16032864,\n    seagreen: 3050327,\n    seashell: 16774638,\n    sienna: 10506797,\n    silver: 12632256,\n    skyblue: 8900331,\n    slateblue: 6970061,\n    slategray: 7372944,\n    slategrey: 7372944,\n    snow: 16775930,\n    springgreen: 65407,\n    steelblue: 4620980,\n    tan: 13808780,\n    teal: 32896,\n    thistle: 14204888,\n    tomato: 16737095,\n    turquoise: 4251856,\n    violet: 15631086,\n    wheat: 16113331,\n    white: 16777215,\n    whitesmoke: 16119285,\n    yellow: 16776960,\n    yellowgreen: 10145074,\n  };\nLc(Fr, wr, {\n  copy(e) {\n    return Object.assign(new this.constructor(), this, e);\n  },\n  displayable() {\n    return this.rgb().displayable();\n  },\n  hex: bu,\n  // Deprecated! Use color.formatHex.\n  formatHex: bu,\n  formatHex8: rg,\n  formatHsl: ig,\n  formatRgb: yu,\n  toString: yu,\n});\nfunction bu() {\n  return this.rgb().formatHex();\n}\nfunction rg() {\n  return this.rgb().formatHex8();\n}\nfunction ig() {\n  return S3(this).formatHsl();\n}\nfunction yu() {\n  return this.rgb().formatRgb();\n}\nfunction wr(e) {\n  var t, n;\n  return (\n    (e = (e + \"\").trim().toLowerCase()),\n    (t = Xp.exec(e))\n      ? ((n = t[1].length),\n        (t = parseInt(t[1], 16)),\n        n === 6\n          ? Cu(t)\n          : n === 3\n            ? new wt(\n                ((t >> 8) & 15) | ((t >> 4) & 240),\n                ((t >> 4) & 15) | (t & 240),\n                ((t & 15) << 4) | (t & 15),\n                1,\n              )\n            : n === 8\n              ? ni(\n                  (t >> 24) & 255,\n                  (t >> 16) & 255,\n                  (t >> 8) & 255,\n                  (t & 255) / 255,\n                )\n              : n === 4\n                ? ni(\n                    ((t >> 12) & 15) | ((t >> 8) & 240),\n                    ((t >> 8) & 15) | ((t >> 4) & 240),\n                    ((t >> 4) & 15) | (t & 240),\n                    (((t & 15) << 4) | (t & 15)) / 255,\n                  )\n                : null)\n      : (t = Qp.exec(e))\n        ? new wt(t[1], t[2], t[3], 1)\n        : (t = Jp.exec(e))\n          ? new wt(\n              (t[1] * 255) / 100,\n              (t[2] * 255) / 100,\n              (t[3] * 255) / 100,\n              1,\n            )\n          : (t = eg.exec(e))\n            ? ni(t[1], t[2], t[3], t[4])\n            : (t = tg.exec(e))\n              ? ni(\n                  (t[1] * 255) / 100,\n                  (t[2] * 255) / 100,\n                  (t[3] * 255) / 100,\n                  t[4],\n                )\n              : (t = ng.exec(e))\n                ? wu(t[1], t[2] / 100, t[3] / 100, 1)\n                : (t = og.exec(e))\n                  ? wu(t[1], t[2] / 100, t[3] / 100, t[4])\n                  : mu.hasOwnProperty(e)\n                    ? Cu(mu[e])\n                    : e === \"transparent\"\n                      ? new wt(NaN, NaN, NaN, 0)\n                      : null\n  );\n}\nfunction Cu(e) {\n  return new wt((e >> 16) & 255, (e >> 8) & 255, e & 255, 1);\n}\nfunction ni(e, t, n, o) {\n  return o <= 0 && (e = t = n = NaN), new wt(e, t, n, o);\n}\nfunction ag(e) {\n  return (\n    e instanceof Fr || (e = wr(e)),\n    e ? ((e = e.rgb()), new wt(e.r, e.g, e.b, e.opacity)) : new wt()\n  );\n}\nfunction As(e, t, n, o) {\n  return arguments.length === 1 ? ag(e) : new wt(e, t, n, o ?? 1);\n}\nfunction wt(e, t, n, o) {\n  (this.r = +e), (this.g = +t), (this.b = +n), (this.opacity = +o);\n}\nLc(\n  wt,\n  As,\n  E3(Fr, {\n    brighter(e) {\n      return (\n        (e = e == null ? Hi : Math.pow(Hi, e)),\n        new wt(this.r * e, this.g * e, this.b * e, this.opacity)\n      );\n    },\n    darker(e) {\n      return (\n        (e = e == null ? vr : Math.pow(vr, e)),\n        new wt(this.r * e, this.g * e, this.b * e, this.opacity)\n      );\n    },\n    rgb() {\n      return this;\n    },\n    clamp() {\n      return new wt(Gn(this.r), Gn(this.g), Gn(this.b), zi(this.opacity));\n    },\n    displayable() {\n      return (\n        -0.5 <= this.r &&\n        this.r < 255.5 &&\n        -0.5 <= this.g &&\n        this.g < 255.5 &&\n        -0.5 <= this.b &&\n        this.b < 255.5 &&\n        0 <= this.opacity &&\n        this.opacity <= 1\n      );\n    },\n    hex: vu,\n    // Deprecated! Use color.formatHex.\n    formatHex: vu,\n    formatHex8: lg,\n    formatRgb: xu,\n    toString: xu,\n  }),\n);\nfunction vu() {\n  return `#${qn(this.r)}${qn(this.g)}${qn(this.b)}`;\n}\nfunction lg() {\n  return `#${qn(this.r)}${qn(this.g)}${qn(this.b)}${qn((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n}\nfunction xu() {\n  const e = zi(this.opacity);\n  return `${e === 1 ? \"rgb(\" : \"rgba(\"}${Gn(this.r)}, ${Gn(this.g)}, ${Gn(this.b)}${e === 1 ? \")\" : `, ${e})`}`;\n}\nfunction zi(e) {\n  return isNaN(e) ? 1 : Math.max(0, Math.min(1, e));\n}\nfunction Gn(e) {\n  return Math.max(0, Math.min(255, Math.round(e) || 0));\n}\nfunction qn(e) {\n  return (e = Gn(e)), (e < 16 ? \"0\" : \"\") + e.toString(16);\n}\nfunction wu(e, t, n, o) {\n  return (\n    o <= 0\n      ? (e = t = n = NaN)\n      : n <= 0 || n >= 1\n        ? (e = t = NaN)\n        : t <= 0 && (e = NaN),\n    new Gt(e, t, n, o)\n  );\n}\nfunction S3(e) {\n  if (e instanceof Gt) return new Gt(e.h, e.s, e.l, e.opacity);\n  if ((e instanceof Fr || (e = wr(e)), !e)) return new Gt();\n  if (e instanceof Gt) return e;\n  e = e.rgb();\n  var t = e.r / 255,\n    n = e.g / 255,\n    o = e.b / 255,\n    r = Math.min(t, n, o),\n    i = Math.max(t, n, o),\n    a = NaN,\n    l = i - r,\n    s = (i + r) / 2;\n  return (\n    l\n      ? (t === i\n          ? (a = (n - o) / l + (n < o) * 6)\n          : n === i\n            ? (a = (o - t) / l + 2)\n            : (a = (t - n) / l + 4),\n        (l /= s < 0.5 ? i + r : 2 - i - r),\n        (a *= 60))\n      : (l = s > 0 && s < 1 ? 0 : a),\n    new Gt(a, l, s, e.opacity)\n  );\n}\nfunction sg(e, t, n, o) {\n  return arguments.length === 1 ? S3(e) : new Gt(e, t, n, o ?? 1);\n}\nfunction Gt(e, t, n, o) {\n  (this.h = +e), (this.s = +t), (this.l = +n), (this.opacity = +o);\n}\nLc(\n  Gt,\n  sg,\n  E3(Fr, {\n    brighter(e) {\n      return (\n        (e = e == null ? Hi : Math.pow(Hi, e)),\n        new Gt(this.h, this.s, this.l * e, this.opacity)\n      );\n    },\n    darker(e) {\n      return (\n        (e = e == null ? vr : Math.pow(vr, e)),\n        new Gt(this.h, this.s, this.l * e, this.opacity)\n      );\n    },\n    rgb() {\n      var e = (this.h % 360) + (this.h < 0) * 360,\n        t = isNaN(e) || isNaN(this.s) ? 0 : this.s,\n        n = this.l,\n        o = n + (n < 0.5 ? n : 1 - n) * t,\n        r = 2 * n - o;\n      return new wt(\n        zl(e >= 240 ? e - 240 : e + 120, r, o),\n        zl(e, r, o),\n        zl(e < 120 ? e + 240 : e - 120, r, o),\n        this.opacity,\n      );\n    },\n    clamp() {\n      return new Gt(Eu(this.h), oi(this.s), oi(this.l), zi(this.opacity));\n    },\n    displayable() {\n      return (\n        ((0 <= this.s && this.s <= 1) || isNaN(this.s)) &&\n        0 <= this.l &&\n        this.l <= 1 &&\n        0 <= this.opacity &&\n        this.opacity <= 1\n      );\n    },\n    formatHsl() {\n      const e = zi(this.opacity);\n      return `${e === 1 ? \"hsl(\" : \"hsla(\"}${Eu(this.h)}, ${oi(this.s) * 100}%, ${oi(this.l) * 100}%${e === 1 ? \")\" : `, ${e})`}`;\n    },\n  }),\n);\nfunction Eu(e) {\n  return (e = (e || 0) % 360), e < 0 ? e + 360 : e;\n}\nfunction oi(e) {\n  return Math.max(0, Math.min(1, e || 0));\n}\nfunction zl(e, t, n) {\n  return (\n    (e < 60\n      ? t + ((n - t) * e) / 60\n      : e < 180\n        ? n\n        : e < 240\n          ? t + ((n - t) * (240 - e)) / 60\n          : t) * 255\n  );\n}\nconst k3 = (e) => () => e;\nfunction cg(e, t) {\n  return function (n) {\n    return e + n * t;\n  };\n}\nfunction ug(e, t, n) {\n  return (\n    (e = Math.pow(e, n)),\n    (t = Math.pow(t, n) - e),\n    (n = 1 / n),\n    function (o) {\n      return Math.pow(e + o * t, n);\n    }\n  );\n}\nfunction dg(e) {\n  return (e = +e) == 1\n    ? _3\n    : function (t, n) {\n        return n - t ? ug(t, n, e) : k3(isNaN(t) ? n : t);\n      };\n}\nfunction _3(e, t) {\n  var n = t - e;\n  return n ? cg(e, n) : k3(isNaN(e) ? t : e);\n}\nconst Su = (function e(t) {\n  var n = dg(t);\n  function o(r, i) {\n    var a = n((r = As(r)).r, (i = As(i)).r),\n      l = n(r.g, i.g),\n      s = n(r.b, i.b),\n      u = _3(r.opacity, i.opacity);\n    return function (c) {\n      return (\n        (r.r = a(c)), (r.g = l(c)), (r.b = s(c)), (r.opacity = u(c)), r + \"\"\n      );\n    };\n  }\n  return (o.gamma = e), o;\n})(1);\nfunction Nn(e, t) {\n  return (\n    (e = +e),\n    (t = +t),\n    function (n) {\n      return e * (1 - n) + t * n;\n    }\n  );\n}\nvar Ms = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n  Pl = new RegExp(Ms.source, \"g\");\nfunction fg(e) {\n  return function () {\n    return e;\n  };\n}\nfunction hg(e) {\n  return function (t) {\n    return e(t) + \"\";\n  };\n}\nfunction pg(e, t) {\n  var n = (Ms.lastIndex = Pl.lastIndex = 0),\n    o,\n    r,\n    i,\n    a = -1,\n    l = [],\n    s = [];\n  for (e = e + \"\", t = t + \"\"; (o = Ms.exec(e)) && (r = Pl.exec(t)); )\n    (i = r.index) > n &&\n      ((i = t.slice(n, i)), l[a] ? (l[a] += i) : (l[++a] = i)),\n      (o = o[0]) === (r = r[0])\n        ? l[a]\n          ? (l[a] += r)\n          : (l[++a] = r)\n        : ((l[++a] = null), s.push({ i: a, x: Nn(o, r) })),\n      (n = Pl.lastIndex);\n  return (\n    n < t.length && ((i = t.slice(n)), l[a] ? (l[a] += i) : (l[++a] = i)),\n    l.length < 2\n      ? s[0]\n        ? hg(s[0].x)\n        : fg(t)\n      : ((t = s.length),\n        function (u) {\n          for (var c = 0, d; c < t; ++c) l[(d = s[c]).i] = d.x(u);\n          return l.join(\"\");\n        })\n  );\n}\nvar ku = 180 / Math.PI,\n  Ts = {\n    translateX: 0,\n    translateY: 0,\n    rotate: 0,\n    skewX: 0,\n    scaleX: 1,\n    scaleY: 1,\n  };\nfunction A3(e, t, n, o, r, i) {\n  var a, l, s;\n  return (\n    (a = Math.sqrt(e * e + t * t)) && ((e /= a), (t /= a)),\n    (s = e * n + t * o) && ((n -= e * s), (o -= t * s)),\n    (l = Math.sqrt(n * n + o * o)) && ((n /= l), (o /= l), (s /= l)),\n    e * o < t * n && ((e = -e), (t = -t), (s = -s), (a = -a)),\n    {\n      translateX: r,\n      translateY: i,\n      rotate: Math.atan2(t, e) * ku,\n      skewX: Math.atan(s) * ku,\n      scaleX: a,\n      scaleY: l,\n    }\n  );\n}\nvar ri;\nfunction gg(e) {\n  const t = new (typeof DOMMatrix == \"function\" ? DOMMatrix : WebKitCSSMatrix)(\n    e + \"\",\n  );\n  return t.isIdentity ? Ts : A3(t.a, t.b, t.c, t.d, t.e, t.f);\n}\nfunction mg(e) {\n  return e == null ||\n    (ri || (ri = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\")),\n    ri.setAttribute(\"transform\", e),\n    !(e = ri.transform.baseVal.consolidate()))\n    ? Ts\n    : ((e = e.matrix), A3(e.a, e.b, e.c, e.d, e.e, e.f));\n}\nfunction M3(e, t, n, o) {\n  function r(u) {\n    return u.length ? u.pop() + \" \" : \"\";\n  }\n  function i(u, c, d, p, h, m) {\n    if (u !== d || c !== p) {\n      var b = h.push(\"translate(\", null, t, null, n);\n      m.push({ i: b - 4, x: Nn(u, d) }, { i: b - 2, x: Nn(c, p) });\n    } else (d || p) && h.push(\"translate(\" + d + t + p + n);\n  }\n  function a(u, c, d, p) {\n    u !== c\n      ? (u - c > 180 ? (c += 360) : c - u > 180 && (u += 360),\n        p.push({ i: d.push(r(d) + \"rotate(\", null, o) - 2, x: Nn(u, c) }))\n      : c && d.push(r(d) + \"rotate(\" + c + o);\n  }\n  function l(u, c, d, p) {\n    u !== c\n      ? p.push({ i: d.push(r(d) + \"skewX(\", null, o) - 2, x: Nn(u, c) })\n      : c && d.push(r(d) + \"skewX(\" + c + o);\n  }\n  function s(u, c, d, p, h, m) {\n    if (u !== d || c !== p) {\n      var b = h.push(r(h) + \"scale(\", null, \",\", null, \")\");\n      m.push({ i: b - 4, x: Nn(u, d) }, { i: b - 2, x: Nn(c, p) });\n    } else (d !== 1 || p !== 1) && h.push(r(h) + \"scale(\" + d + \",\" + p + \")\");\n  }\n  return function (u, c) {\n    var d = [],\n      p = [];\n    return (\n      (u = e(u)),\n      (c = e(c)),\n      i(u.translateX, u.translateY, c.translateX, c.translateY, d, p),\n      a(u.rotate, c.rotate, d, p),\n      l(u.skewX, c.skewX, d, p),\n      s(u.scaleX, u.scaleY, c.scaleX, c.scaleY, d, p),\n      (u = c = null),\n      function (h) {\n        for (var m = -1, b = p.length, y; ++m < b; ) d[(y = p[m]).i] = y.x(h);\n        return d.join(\"\");\n      }\n    );\n  };\n}\nvar bg = M3(gg, \"px, \", \"px)\", \"deg)\"),\n  yg = M3(mg, \", \", \")\", \")\"),\n  Cg = 1e-12;\nfunction _u(e) {\n  return ((e = Math.exp(e)) + 1 / e) / 2;\n}\nfunction vg(e) {\n  return ((e = Math.exp(e)) - 1 / e) / 2;\n}\nfunction xg(e) {\n  return ((e = Math.exp(2 * e)) - 1) / (e + 1);\n}\nconst wg = (function e(t, n, o) {\n  function r(i, a) {\n    var l = i[0],\n      s = i[1],\n      u = i[2],\n      c = a[0],\n      d = a[1],\n      p = a[2],\n      h = c - l,\n      m = d - s,\n      b = h * h + m * m,\n      y,\n      g;\n    if (b < Cg)\n      (g = Math.log(p / u) / t),\n        (y = function (M) {\n          return [l + M * h, s + M * m, u * Math.exp(t * M * g)];\n        });\n    else {\n      var x = Math.sqrt(b),\n        v = (p * p - u * u + o * b) / (2 * u * n * x),\n        S = (p * p - u * u - o * b) / (2 * p * n * x),\n        w = Math.log(Math.sqrt(v * v + 1) - v),\n        E = Math.log(Math.sqrt(S * S + 1) - S);\n      (g = (E - w) / t),\n        (y = function (M) {\n          var _ = M * g,\n            j = _u(w),\n            R = (u / (n * x)) * (j * xg(t * _ + w) - vg(w));\n          return [l + R * h, s + R * m, (u * j) / _u(t * _ + w)];\n        });\n    }\n    return (y.duration = (g * 1e3 * t) / Math.SQRT2), y;\n  }\n  return (\n    (r.rho = function (i) {\n      var a = Math.max(1e-3, +i),\n        l = a * a,\n        s = l * l;\n      return e(a, l, s);\n    }),\n    r\n  );\n})(Math.SQRT2, 2, 4);\nvar No = 0,\n  tr = 0,\n  qo = 0,\n  T3 = 1e3,\n  Pi,\n  nr,\n  Bi = 0,\n  no = 0,\n  ua = 0,\n  Er = typeof performance == \"object\" && performance.now ? performance : Date,\n  O3 =\n    typeof window == \"object\" && window.requestAnimationFrame\n      ? window.requestAnimationFrame.bind(window)\n      : function (e) {\n          setTimeout(e, 17);\n        };\nfunction Dc() {\n  return no || (O3(Eg), (no = Er.now() + ua));\n}\nfunction Eg() {\n  no = 0;\n}\nfunction Vi() {\n  this._call = this._time = this._next = null;\n}\nVi.prototype = N3.prototype = {\n  constructor: Vi,\n  restart: function (e, t, n) {\n    if (typeof e != \"function\")\n      throw new TypeError(\"callback is not a function\");\n    (n = (n == null ? Dc() : +n) + (t == null ? 0 : +t)),\n      !this._next &&\n        nr !== this &&\n        (nr ? (nr._next = this) : (Pi = this), (nr = this)),\n      (this._call = e),\n      (this._time = n),\n      Os();\n  },\n  stop: function () {\n    this._call && ((this._call = null), (this._time = 1 / 0), Os());\n  },\n};\nfunction N3(e, t, n) {\n  var o = new Vi();\n  return o.restart(e, t, n), o;\n}\nfunction Sg() {\n  Dc(), ++No;\n  for (var e = Pi, t; e; )\n    (t = no - e._time) >= 0 && e._call.call(void 0, t), (e = e._next);\n  --No;\n}\nfunction Au() {\n  (no = (Bi = Er.now()) + ua), (No = tr = 0);\n  try {\n    Sg();\n  } finally {\n    (No = 0), _g(), (no = 0);\n  }\n}\nfunction kg() {\n  var e = Er.now(),\n    t = e - Bi;\n  t > T3 && ((ua -= t), (Bi = e));\n}\nfunction _g() {\n  for (var e, t = Pi, n, o = 1 / 0; t; )\n    t._call\n      ? (o > t._time && (o = t._time), (e = t), (t = t._next))\n      : ((n = t._next), (t._next = null), (t = e ? (e._next = n) : (Pi = n)));\n  (nr = e), Os(o);\n}\nfunction Os(e) {\n  if (!No) {\n    tr && (tr = clearTimeout(tr));\n    var t = e - no;\n    t > 24\n      ? (e < 1 / 0 && (tr = setTimeout(Au, e - Er.now() - ua)),\n        qo && (qo = clearInterval(qo)))\n      : (qo || ((Bi = Er.now()), (qo = setInterval(kg, T3))), (No = 1), O3(Au));\n  }\n}\nfunction Mu(e, t, n) {\n  var o = new Vi();\n  return (\n    (t = t == null ? 0 : +t),\n    o.restart(\n      (r) => {\n        o.stop(), e(r + t);\n      },\n      t,\n      n,\n    ),\n    o\n  );\n}\nvar Ag = sa(\"start\", \"end\", \"cancel\", \"interrupt\"),\n  Mg = [],\n  L3 = 0,\n  Tu = 1,\n  Ns = 2,\n  wi = 3,\n  Ou = 4,\n  Ls = 5,\n  Ei = 6;\nfunction da(e, t, n, o, r, i) {\n  var a = e.__transition;\n  if (!a) e.__transition = {};\n  else if (n in a) return;\n  Tg(e, n, {\n    name: t,\n    index: o,\n    // For context during callback.\n    group: r,\n    // For context during callback.\n    on: Ag,\n    tween: Mg,\n    time: i.time,\n    delay: i.delay,\n    duration: i.duration,\n    ease: i.ease,\n    timer: null,\n    state: L3,\n  });\n}\nfunction jc(e, t) {\n  var n = en(e, t);\n  if (n.state > L3) throw new Error(\"too late; already scheduled\");\n  return n;\n}\nfunction hn(e, t) {\n  var n = en(e, t);\n  if (n.state > wi) throw new Error(\"too late; already running\");\n  return n;\n}\nfunction en(e, t) {\n  var n = e.__transition;\n  if (!n || !(n = n[t])) throw new Error(\"transition not found\");\n  return n;\n}\nfunction Tg(e, t, n) {\n  var o = e.__transition,\n    r;\n  (o[t] = n), (n.timer = N3(i, 0, n.time));\n  function i(u) {\n    (n.state = Tu),\n      n.timer.restart(a, n.delay, n.time),\n      n.delay <= u && a(u - n.delay);\n  }\n  function a(u) {\n    var c, d, p, h;\n    if (n.state !== Tu) return s();\n    for (c in o)\n      if (((h = o[c]), h.name === n.name)) {\n        if (h.state === wi) return Mu(a);\n        h.state === Ou\n          ? ((h.state = Ei),\n            h.timer.stop(),\n            h.on.call(\"interrupt\", e, e.__data__, h.index, h.group),\n            delete o[c])\n          : +c < t &&\n            ((h.state = Ei),\n            h.timer.stop(),\n            h.on.call(\"cancel\", e, e.__data__, h.index, h.group),\n            delete o[c]);\n      }\n    if (\n      (Mu(function () {\n        n.state === wi &&\n          ((n.state = Ou), n.timer.restart(l, n.delay, n.time), l(u));\n      }),\n      (n.state = Ns),\n      n.on.call(\"start\", e, e.__data__, n.index, n.group),\n      n.state === Ns)\n    ) {\n      for (\n        n.state = wi, r = new Array((p = n.tween.length)), c = 0, d = -1;\n        c < p;\n        ++c\n      )\n        (h = n.tween[c].value.call(e, e.__data__, n.index, n.group)) &&\n          (r[++d] = h);\n      r.length = d + 1;\n    }\n  }\n  function l(u) {\n    for (\n      var c =\n          u < n.duration\n            ? n.ease.call(null, u / n.duration)\n            : (n.timer.restart(s), (n.state = Ls), 1),\n        d = -1,\n        p = r.length;\n      ++d < p;\n\n    )\n      r[d].call(e, c);\n    n.state === Ls && (n.on.call(\"end\", e, e.__data__, n.index, n.group), s());\n  }\n  function s() {\n    (n.state = Ei), n.timer.stop(), delete o[t];\n    for (var u in o) return;\n    delete e.__transition;\n  }\n}\nfunction Si(e, t) {\n  var n = e.__transition,\n    o,\n    r,\n    i = !0,\n    a;\n  if (n) {\n    t = t == null ? null : t + \"\";\n    for (a in n) {\n      if ((o = n[a]).name !== t) {\n        i = !1;\n        continue;\n      }\n      (r = o.state > Ns && o.state < Ls),\n        (o.state = Ei),\n        o.timer.stop(),\n        o.on.call(r ? \"interrupt\" : \"cancel\", e, e.__data__, o.index, o.group),\n        delete n[a];\n    }\n    i && delete e.__transition;\n  }\n}\nfunction Og(e) {\n  return this.each(function () {\n    Si(this, e);\n  });\n}\nfunction Ng(e, t) {\n  var n, o;\n  return function () {\n    var r = hn(this, e),\n      i = r.tween;\n    if (i !== n) {\n      o = n = i;\n      for (var a = 0, l = o.length; a < l; ++a)\n        if (o[a].name === t) {\n          (o = o.slice()), o.splice(a, 1);\n          break;\n        }\n    }\n    r.tween = o;\n  };\n}\nfunction Lg(e, t, n) {\n  var o, r;\n  if (typeof n != \"function\") throw new Error();\n  return function () {\n    var i = hn(this, e),\n      a = i.tween;\n    if (a !== o) {\n      r = (o = a).slice();\n      for (var l = { name: t, value: n }, s = 0, u = r.length; s < u; ++s)\n        if (r[s].name === t) {\n          r[s] = l;\n          break;\n        }\n      s === u && r.push(l);\n    }\n    i.tween = r;\n  };\n}\nfunction Dg(e, t) {\n  var n = this._id;\n  if (((e += \"\"), arguments.length < 2)) {\n    for (var o = en(this.node(), n).tween, r = 0, i = o.length, a; r < i; ++r)\n      if ((a = o[r]).name === e) return a.value;\n    return null;\n  }\n  return this.each((t == null ? Ng : Lg)(n, e, t));\n}\nfunction Fc(e, t, n) {\n  var o = e._id;\n  return (\n    e.each(function () {\n      var r = hn(this, o);\n      (r.value || (r.value = {}))[t] = n.apply(this, arguments);\n    }),\n    function (r) {\n      return en(r, o).value[t];\n    }\n  );\n}\nfunction D3(e, t) {\n  var n;\n  return (\n    typeof t == \"number\"\n      ? Nn\n      : t instanceof wr\n        ? Su\n        : (n = wr(t))\n          ? ((t = n), Su)\n          : pg\n  )(e, t);\n}\nfunction jg(e) {\n  return function () {\n    this.removeAttribute(e);\n  };\n}\nfunction Fg(e) {\n  return function () {\n    this.removeAttributeNS(e.space, e.local);\n  };\n}\nfunction Rg(e, t, n) {\n  var o,\n    r = n + \"\",\n    i;\n  return function () {\n    var a = this.getAttribute(e);\n    return a === r ? null : a === o ? i : (i = t((o = a), n));\n  };\n}\nfunction Ig(e, t, n) {\n  var o,\n    r = n + \"\",\n    i;\n  return function () {\n    var a = this.getAttributeNS(e.space, e.local);\n    return a === r ? null : a === o ? i : (i = t((o = a), n));\n  };\n}\nfunction Hg(e, t, n) {\n  var o, r, i;\n  return function () {\n    var a,\n      l = n(this),\n      s;\n    return l == null\n      ? void this.removeAttribute(e)\n      : ((a = this.getAttribute(e)),\n        (s = l + \"\"),\n        a === s\n          ? null\n          : a === o && s === r\n            ? i\n            : ((r = s), (i = t((o = a), l))));\n  };\n}\nfunction zg(e, t, n) {\n  var o, r, i;\n  return function () {\n    var a,\n      l = n(this),\n      s;\n    return l == null\n      ? void this.removeAttributeNS(e.space, e.local)\n      : ((a = this.getAttributeNS(e.space, e.local)),\n        (s = l + \"\"),\n        a === s\n          ? null\n          : a === o && s === r\n            ? i\n            : ((r = s), (i = t((o = a), l))));\n  };\n}\nfunction Pg(e, t) {\n  var n = ca(e),\n    o = n === \"transform\" ? yg : D3;\n  return this.attrTween(\n    e,\n    typeof t == \"function\"\n      ? (n.local ? zg : Hg)(n, o, Fc(this, \"attr.\" + e, t))\n      : t == null\n        ? (n.local ? Fg : jg)(n)\n        : (n.local ? Ig : Rg)(n, o, t),\n  );\n}\nfunction Bg(e, t) {\n  return function (n) {\n    this.setAttribute(e, t.call(this, n));\n  };\n}\nfunction Vg(e, t) {\n  return function (n) {\n    this.setAttributeNS(e.space, e.local, t.call(this, n));\n  };\n}\nfunction $g(e, t) {\n  var n, o;\n  function r() {\n    var i = t.apply(this, arguments);\n    return i !== o && (n = (o = i) && Vg(e, i)), n;\n  }\n  return (r._value = t), r;\n}\nfunction Wg(e, t) {\n  var n, o;\n  function r() {\n    var i = t.apply(this, arguments);\n    return i !== o && (n = (o = i) && Bg(e, i)), n;\n  }\n  return (r._value = t), r;\n}\nfunction Zg(e, t) {\n  var n = \"attr.\" + e;\n  if (arguments.length < 2) return (n = this.tween(n)) && n._value;\n  if (t == null) return this.tween(n, null);\n  if (typeof t != \"function\") throw new Error();\n  var o = ca(e);\n  return this.tween(n, (o.local ? $g : Wg)(o, t));\n}\nfunction Ug(e, t) {\n  return function () {\n    jc(this, e).delay = +t.apply(this, arguments);\n  };\n}\nfunction qg(e, t) {\n  return (\n    (t = +t),\n    function () {\n      jc(this, e).delay = t;\n    }\n  );\n}\nfunction Yg(e) {\n  var t = this._id;\n  return arguments.length\n    ? this.each((typeof e == \"function\" ? Ug : qg)(t, e))\n    : en(this.node(), t).delay;\n}\nfunction Gg(e, t) {\n  return function () {\n    hn(this, e).duration = +t.apply(this, arguments);\n  };\n}\nfunction Kg(e, t) {\n  return (\n    (t = +t),\n    function () {\n      hn(this, e).duration = t;\n    }\n  );\n}\nfunction Xg(e) {\n  var t = this._id;\n  return arguments.length\n    ? this.each((typeof e == \"function\" ? Gg : Kg)(t, e))\n    : en(this.node(), t).duration;\n}\nfunction Qg(e, t) {\n  if (typeof t != \"function\") throw new Error();\n  return function () {\n    hn(this, e).ease = t;\n  };\n}\nfunction Jg(e) {\n  var t = this._id;\n  return arguments.length ? this.each(Qg(t, e)) : en(this.node(), t).ease;\n}\nfunction em(e, t) {\n  return function () {\n    var n = t.apply(this, arguments);\n    if (typeof n != \"function\") throw new Error();\n    hn(this, e).ease = n;\n  };\n}\nfunction tm(e) {\n  if (typeof e != \"function\") throw new Error();\n  return this.each(em(this._id, e));\n}\nfunction nm(e) {\n  typeof e != \"function\" && (e = d3(e));\n  for (var t = this._groups, n = t.length, o = new Array(n), r = 0; r < n; ++r)\n    for (var i = t[r], a = i.length, l = (o[r] = []), s, u = 0; u < a; ++u)\n      (s = i[u]) && e.call(s, s.__data__, u, i) && l.push(s);\n  return new wn(o, this._parents, this._name, this._id);\n}\nfunction om(e) {\n  if (e._id !== this._id) throw new Error();\n  for (\n    var t = this._groups,\n      n = e._groups,\n      o = t.length,\n      r = n.length,\n      i = Math.min(o, r),\n      a = new Array(o),\n      l = 0;\n    l < i;\n    ++l\n  )\n    for (\n      var s = t[l], u = n[l], c = s.length, d = (a[l] = new Array(c)), p, h = 0;\n      h < c;\n      ++h\n    )\n      (p = s[h] || u[h]) && (d[h] = p);\n  for (; l < o; ++l) a[l] = t[l];\n  return new wn(a, this._parents, this._name, this._id);\n}\nfunction rm(e) {\n  return (e + \"\")\n    .trim()\n    .split(/^|\\s+/)\n    .every(function (t) {\n      var n = t.indexOf(\".\");\n      return n >= 0 && (t = t.slice(0, n)), !t || t === \"start\";\n    });\n}\nfunction im(e, t, n) {\n  var o,\n    r,\n    i = rm(t) ? jc : hn;\n  return function () {\n    var a = i(this, e),\n      l = a.on;\n    l !== o && (r = (o = l).copy()).on(t, n), (a.on = r);\n  };\n}\nfunction am(e, t) {\n  var n = this._id;\n  return arguments.length < 2\n    ? en(this.node(), n).on.on(e)\n    : this.each(im(n, e, t));\n}\nfunction lm(e) {\n  return function () {\n    var t = this.parentNode;\n    for (var n in this.__transition) if (+n !== e) return;\n    t && t.removeChild(this);\n  };\n}\nfunction sm() {\n  return this.on(\"end.remove\", lm(this._id));\n}\nfunction cm(e) {\n  var t = this._name,\n    n = this._id;\n  typeof e != \"function\" && (e = Oc(e));\n  for (var o = this._groups, r = o.length, i = new Array(r), a = 0; a < r; ++a)\n    for (\n      var l = o[a], s = l.length, u = (i[a] = new Array(s)), c, d, p = 0;\n      p < s;\n      ++p\n    )\n      (c = l[p]) &&\n        (d = e.call(c, c.__data__, p, l)) &&\n        (\"__data__\" in c && (d.__data__ = c.__data__),\n        (u[p] = d),\n        da(u[p], t, n, p, u, en(c, n)));\n  return new wn(i, this._parents, t, n);\n}\nfunction um(e) {\n  var t = this._name,\n    n = this._id;\n  typeof e != \"function\" && (e = u3(e));\n  for (var o = this._groups, r = o.length, i = [], a = [], l = 0; l < r; ++l)\n    for (var s = o[l], u = s.length, c, d = 0; d < u; ++d)\n      if ((c = s[d])) {\n        for (\n          var p = e.call(c, c.__data__, d, s),\n            h,\n            m = en(c, n),\n            b = 0,\n            y = p.length;\n          b < y;\n          ++b\n        )\n          (h = p[b]) && da(h, t, n, b, p, m);\n        i.push(p), a.push(c);\n      }\n  return new wn(i, a, t, n);\n}\nvar dm = jr.prototype.constructor;\nfunction fm() {\n  return new dm(this._groups, this._parents);\n}\nfunction hm(e, t) {\n  var n, o, r;\n  return function () {\n    var i = Oo(this, e),\n      a = (this.style.removeProperty(e), Oo(this, e));\n    return i === a ? null : i === n && a === o ? r : (r = t((n = i), (o = a)));\n  };\n}\nfunction j3(e) {\n  return function () {\n    this.style.removeProperty(e);\n  };\n}\nfunction pm(e, t, n) {\n  var o,\n    r = n + \"\",\n    i;\n  return function () {\n    var a = Oo(this, e);\n    return a === r ? null : a === o ? i : (i = t((o = a), n));\n  };\n}\nfunction gm(e, t, n) {\n  var o, r, i;\n  return function () {\n    var a = Oo(this, e),\n      l = n(this),\n      s = l + \"\";\n    return (\n      l == null && (s = l = (this.style.removeProperty(e), Oo(this, e))),\n      a === s ? null : a === o && s === r ? i : ((r = s), (i = t((o = a), l)))\n    );\n  };\n}\nfunction mm(e, t) {\n  var n,\n    o,\n    r,\n    i = \"style.\" + t,\n    a = \"end.\" + i,\n    l;\n  return function () {\n    var s = hn(this, e),\n      u = s.on,\n      c = s.value[i] == null ? l || (l = j3(t)) : void 0;\n    (u !== n || r !== c) && (o = (n = u).copy()).on(a, (r = c)), (s.on = o);\n  };\n}\nfunction bm(e, t, n) {\n  var o = (e += \"\") == \"transform\" ? bg : D3;\n  return t == null\n    ? this.styleTween(e, hm(e, o)).on(\"end.style.\" + e, j3(e))\n    : typeof t == \"function\"\n      ? this.styleTween(e, gm(e, o, Fc(this, \"style.\" + e, t))).each(\n          mm(this._id, e),\n        )\n      : this.styleTween(e, pm(e, o, t), n).on(\"end.style.\" + e, null);\n}\nfunction ym(e, t, n) {\n  return function (o) {\n    this.style.setProperty(e, t.call(this, o), n);\n  };\n}\nfunction Cm(e, t, n) {\n  var o, r;\n  function i() {\n    var a = t.apply(this, arguments);\n    return a !== r && (o = (r = a) && ym(e, a, n)), o;\n  }\n  return (i._value = t), i;\n}\nfunction vm(e, t, n) {\n  var o = \"style.\" + (e += \"\");\n  if (arguments.length < 2) return (o = this.tween(o)) && o._value;\n  if (t == null) return this.tween(o, null);\n  if (typeof t != \"function\") throw new Error();\n  return this.tween(o, Cm(e, t, n ?? \"\"));\n}\nfunction xm(e) {\n  return function () {\n    this.textContent = e;\n  };\n}\nfunction wm(e) {\n  return function () {\n    var t = e(this);\n    this.textContent = t ?? \"\";\n  };\n}\nfunction Em(e) {\n  return this.tween(\n    \"text\",\n    typeof e == \"function\"\n      ? wm(Fc(this, \"text\", e))\n      : xm(e == null ? \"\" : e + \"\"),\n  );\n}\nfunction Sm(e) {\n  return function (t) {\n    this.textContent = e.call(this, t);\n  };\n}\nfunction km(e) {\n  var t, n;\n  function o() {\n    var r = e.apply(this, arguments);\n    return r !== n && (t = (n = r) && Sm(r)), t;\n  }\n  return (o._value = e), o;\n}\nfunction _m(e) {\n  var t = \"text\";\n  if (arguments.length < 1) return (t = this.tween(t)) && t._value;\n  if (e == null) return this.tween(t, null);\n  if (typeof e != \"function\") throw new Error();\n  return this.tween(t, km(e));\n}\nfunction Am() {\n  for (\n    var e = this._name,\n      t = this._id,\n      n = F3(),\n      o = this._groups,\n      r = o.length,\n      i = 0;\n    i < r;\n    ++i\n  )\n    for (var a = o[i], l = a.length, s, u = 0; u < l; ++u)\n      if ((s = a[u])) {\n        var c = en(s, t);\n        da(s, e, n, u, a, {\n          time: c.time + c.delay + c.duration,\n          delay: 0,\n          duration: c.duration,\n          ease: c.ease,\n        });\n      }\n  return new wn(o, this._parents, e, n);\n}\nfunction Mm() {\n  var e,\n    t,\n    n = this,\n    o = n._id,\n    r = n.size();\n  return new Promise(function (i, a) {\n    var l = { value: a },\n      s = {\n        value: function () {\n          --r === 0 && i();\n        },\n      };\n    n.each(function () {\n      var u = hn(this, o),\n        c = u.on;\n      c !== e &&\n        ((t = (e = c).copy()),\n        t._.cancel.push(l),\n        t._.interrupt.push(l),\n        t._.end.push(s)),\n        (u.on = t);\n    }),\n      r === 0 && i();\n  });\n}\nvar Tm = 0;\nfunction wn(e, t, n, o) {\n  (this._groups = e), (this._parents = t), (this._name = n), (this._id = o);\n}\nfunction F3() {\n  return ++Tm;\n}\nvar mn = jr.prototype;\nwn.prototype = {\n  constructor: wn,\n  select: cm,\n  selectAll: um,\n  selectChild: mn.selectChild,\n  selectChildren: mn.selectChildren,\n  filter: nm,\n  merge: om,\n  selection: fm,\n  transition: Am,\n  call: mn.call,\n  nodes: mn.nodes,\n  node: mn.node,\n  size: mn.size,\n  empty: mn.empty,\n  each: mn.each,\n  on: am,\n  attr: Pg,\n  attrTween: Zg,\n  style: bm,\n  styleTween: vm,\n  text: Em,\n  textTween: _m,\n  remove: sm,\n  tween: Dg,\n  delay: Yg,\n  duration: Xg,\n  ease: Jg,\n  easeVarying: tm,\n  end: Mm,\n  [Symbol.iterator]: mn[Symbol.iterator],\n};\nfunction Om(e) {\n  return ((e *= 2) <= 1 ? e * e * e : (e -= 2) * e * e + 2) / 2;\n}\nvar Nm = {\n  time: null,\n  // Set on use.\n  delay: 0,\n  duration: 250,\n  ease: Om,\n};\nfunction Lm(e, t) {\n  for (var n; !(n = e.__transition) || !(n = n[t]); )\n    if (!(e = e.parentNode)) throw new Error(`transition ${t} not found`);\n  return n;\n}\nfunction Dm(e) {\n  var t, n;\n  e instanceof wn\n    ? ((t = e._id), (e = e._name))\n    : ((t = F3()), ((n = Nm).time = Dc()), (e = e == null ? null : e + \"\"));\n  for (var o = this._groups, r = o.length, i = 0; i < r; ++i)\n    for (var a = o[i], l = a.length, s, u = 0; u < l; ++u)\n      (s = a[u]) && da(s, e, t, u, a, n || Lm(s, t));\n  return new wn(o, this._parents, e, t);\n}\njr.prototype.interrupt = Og;\njr.prototype.transition = Dm;\nconst ii = (e) => () => e;\nfunction jm(e, { sourceEvent: t, target: n, transform: o, dispatch: r }) {\n  Object.defineProperties(this, {\n    type: { value: e, enumerable: !0, configurable: !0 },\n    sourceEvent: { value: t, enumerable: !0, configurable: !0 },\n    target: { value: n, enumerable: !0, configurable: !0 },\n    transform: { value: o, enumerable: !0, configurable: !0 },\n    _: { value: r },\n  });\n}\nfunction yn(e, t, n) {\n  (this.k = e), (this.x = t), (this.y = n);\n}\nyn.prototype = {\n  constructor: yn,\n  scale: function (e) {\n    return e === 1 ? this : new yn(this.k * e, this.x, this.y);\n  },\n  translate: function (e, t) {\n    return (e === 0) & (t === 0)\n      ? this\n      : new yn(this.k, this.x + this.k * e, this.y + this.k * t);\n  },\n  apply: function (e) {\n    return [e[0] * this.k + this.x, e[1] * this.k + this.y];\n  },\n  applyX: function (e) {\n    return e * this.k + this.x;\n  },\n  applyY: function (e) {\n    return e * this.k + this.y;\n  },\n  invert: function (e) {\n    return [(e[0] - this.x) / this.k, (e[1] - this.y) / this.k];\n  },\n  invertX: function (e) {\n    return (e - this.x) / this.k;\n  },\n  invertY: function (e) {\n    return (e - this.y) / this.k;\n  },\n  rescaleX: function (e) {\n    return e.copy().domain(e.range().map(this.invertX, this).map(e.invert, e));\n  },\n  rescaleY: function (e) {\n    return e.copy().domain(e.range().map(this.invertY, this).map(e.invert, e));\n  },\n  toString: function () {\n    return \"translate(\" + this.x + \",\" + this.y + \") scale(\" + this.k + \")\";\n  },\n};\nvar Fn = new yn(1, 0, 0);\nyn.prototype;\nfunction Bl(e) {\n  e.stopImmediatePropagation();\n}\nfunction Yo(e) {\n  e.preventDefault(), e.stopImmediatePropagation();\n}\nfunction Fm(e) {\n  return (!e.ctrlKey || e.type === \"wheel\") && !e.button;\n}\nfunction Rm() {\n  var e = this;\n  return e instanceof SVGElement\n    ? ((e = e.ownerSVGElement || e),\n      e.hasAttribute(\"viewBox\")\n        ? ((e = e.viewBox.baseVal),\n          [\n            [e.x, e.y],\n            [e.x + e.width, e.y + e.height],\n          ])\n        : [\n            [0, 0],\n            [e.width.baseVal.value, e.height.baseVal.value],\n          ])\n    : [\n        [0, 0],\n        [e.clientWidth, e.clientHeight],\n      ];\n}\nfunction Nu() {\n  return this.__zoom || Fn;\n}\nfunction Im(e) {\n  return (\n    -e.deltaY *\n    (e.deltaMode === 1 ? 0.05 : e.deltaMode ? 1 : 2e-3) *\n    (e.ctrlKey ? 10 : 1)\n  );\n}\nfunction Hm() {\n  return navigator.maxTouchPoints || \"ontouchstart\" in this;\n}\nfunction zm(e, t, n) {\n  var o = e.invertX(t[0][0]) - n[0][0],\n    r = e.invertX(t[1][0]) - n[1][0],\n    i = e.invertY(t[0][1]) - n[0][1],\n    a = e.invertY(t[1][1]) - n[1][1];\n  return e.translate(\n    r > o ? (o + r) / 2 : Math.min(0, o) || Math.max(0, r),\n    a > i ? (i + a) / 2 : Math.min(0, i) || Math.max(0, a),\n  );\n}\nfunction Pm() {\n  var e = Fm,\n    t = Rm,\n    n = zm,\n    o = Im,\n    r = Hm,\n    i = [0, 1 / 0],\n    a = [\n      [-1 / 0, -1 / 0],\n      [1 / 0, 1 / 0],\n    ],\n    l = 250,\n    s = wg,\n    u = sa(\"start\", \"zoom\", \"end\"),\n    c,\n    d,\n    p,\n    h = 500,\n    m = 150,\n    b = 0,\n    y = 10;\n  function g(k) {\n    k.property(\"__zoom\", Nu)\n      .on(\"wheel.zoom\", _, { passive: !1 })\n      .on(\"mousedown.zoom\", j)\n      .on(\"dblclick.zoom\", R)\n      .filter(r)\n      .on(\"touchstart.zoom\", D)\n      .on(\"touchmove.zoom\", P)\n      .on(\"touchend.zoom touchcancel.zoom\", V)\n      .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n  }\n  (g.transform = function (k, N, T, F) {\n    var I = k.selection ? k.selection() : k;\n    I.property(\"__zoom\", Nu),\n      k !== I\n        ? w(k, N, T, F)\n        : I.interrupt().each(function () {\n            E(this, arguments)\n              .event(F)\n              .start()\n              .zoom(null, typeof N == \"function\" ? N.apply(this, arguments) : N)\n              .end();\n          });\n  }),\n    (g.scaleBy = function (k, N, T, F) {\n      g.scaleTo(\n        k,\n        function () {\n          var I = this.__zoom.k,\n            L = typeof N == \"function\" ? N.apply(this, arguments) : N;\n          return I * L;\n        },\n        T,\n        F,\n      );\n    }),\n    (g.scaleTo = function (k, N, T, F) {\n      g.transform(\n        k,\n        function () {\n          var I = t.apply(this, arguments),\n            L = this.__zoom,\n            C =\n              T == null\n                ? S(I)\n                : typeof T == \"function\"\n                  ? T.apply(this, arguments)\n                  : T,\n            H = L.invert(C),\n            B = typeof N == \"function\" ? N.apply(this, arguments) : N;\n          return n(v(x(L, B), C, H), I, a);\n        },\n        T,\n        F,\n      );\n    }),\n    (g.translateBy = function (k, N, T, F) {\n      g.transform(\n        k,\n        function () {\n          return n(\n            this.__zoom.translate(\n              typeof N == \"function\" ? N.apply(this, arguments) : N,\n              typeof T == \"function\" ? T.apply(this, arguments) : T,\n            ),\n            t.apply(this, arguments),\n            a,\n          );\n        },\n        null,\n        F,\n      );\n    }),\n    (g.translateTo = function (k, N, T, F, I) {\n      g.transform(\n        k,\n        function () {\n          var L = t.apply(this, arguments),\n            C = this.__zoom,\n            H =\n              F == null\n                ? S(L)\n                : typeof F == \"function\"\n                  ? F.apply(this, arguments)\n                  : F;\n          return n(\n            Fn.translate(H[0], H[1])\n              .scale(C.k)\n              .translate(\n                typeof N == \"function\" ? -N.apply(this, arguments) : -N,\n                typeof T == \"function\" ? -T.apply(this, arguments) : -T,\n              ),\n            L,\n            a,\n          );\n        },\n        F,\n        I,\n      );\n    });\n  function x(k, N) {\n    return (\n      (N = Math.max(i[0], Math.min(i[1], N))),\n      N === k.k ? k : new yn(N, k.x, k.y)\n    );\n  }\n  function v(k, N, T) {\n    var F = N[0] - T[0] * k.k,\n      I = N[1] - T[1] * k.k;\n    return F === k.x && I === k.y ? k : new yn(k.k, F, I);\n  }\n  function S(k) {\n    return [(+k[0][0] + +k[1][0]) / 2, (+k[0][1] + +k[1][1]) / 2];\n  }\n  function w(k, N, T, F) {\n    k.on(\"start.zoom\", function () {\n      E(this, arguments).event(F).start();\n    })\n      .on(\"interrupt.zoom end.zoom\", function () {\n        E(this, arguments).event(F).end();\n      })\n      .tween(\"zoom\", function () {\n        var I = this,\n          L = arguments,\n          C = E(I, L).event(F),\n          H = t.apply(I, L),\n          B = T == null ? S(H) : typeof T == \"function\" ? T.apply(I, L) : T,\n          A = Math.max(H[1][0] - H[0][0], H[1][1] - H[0][1]),\n          W = I.__zoom,\n          G = typeof N == \"function\" ? N.apply(I, L) : N,\n          K = s(W.invert(B).concat(A / W.k), G.invert(B).concat(A / G.k));\n        return function (Q) {\n          if (Q === 1) Q = G;\n          else {\n            var ne = K(Q),\n              oe = A / ne[2];\n            Q = new yn(oe, B[0] - ne[0] * oe, B[1] - ne[1] * oe);\n          }\n          C.zoom(null, Q);\n        };\n      });\n  }\n  function E(k, N, T) {\n    return (!T && k.__zooming) || new M(k, N);\n  }\n  function M(k, N) {\n    (this.that = k),\n      (this.args = N),\n      (this.active = 0),\n      (this.sourceEvent = null),\n      (this.extent = t.apply(k, N)),\n      (this.taps = 0);\n  }\n  M.prototype = {\n    event: function (k) {\n      return k && (this.sourceEvent = k), this;\n    },\n    start: function () {\n      return (\n        ++this.active === 1 &&\n          ((this.that.__zooming = this), this.emit(\"start\")),\n        this\n      );\n    },\n    zoom: function (k, N) {\n      return (\n        this.mouse &&\n          k !== \"mouse\" &&\n          (this.mouse[1] = N.invert(this.mouse[0])),\n        this.touch0 &&\n          k !== \"touch\" &&\n          (this.touch0[1] = N.invert(this.touch0[0])),\n        this.touch1 &&\n          k !== \"touch\" &&\n          (this.touch1[1] = N.invert(this.touch1[0])),\n        (this.that.__zoom = N),\n        this.emit(\"zoom\"),\n        this\n      );\n    },\n    end: function () {\n      return (\n        --this.active === 0 && (delete this.that.__zooming, this.emit(\"end\")),\n        this\n      );\n    },\n    emit: function (k) {\n      var N = Yt(this.that).datum();\n      u.call(\n        k,\n        this.that,\n        new jm(k, {\n          sourceEvent: this.sourceEvent,\n          target: g,\n          type: k,\n          transform: this.that.__zoom,\n          dispatch: u,\n        }),\n        N,\n      );\n    },\n  };\n  function _(k, ...N) {\n    if (!e.apply(this, arguments)) return;\n    var T = E(this, N).event(k),\n      F = this.__zoom,\n      I = Math.max(\n        i[0],\n        Math.min(i[1], F.k * Math.pow(2, o.apply(this, arguments))),\n      ),\n      L = ln(k);\n    if (T.wheel)\n      (T.mouse[0][0] !== L[0] || T.mouse[0][1] !== L[1]) &&\n        (T.mouse[1] = F.invert((T.mouse[0] = L))),\n        clearTimeout(T.wheel);\n    else {\n      if (F.k === I) return;\n      (T.mouse = [L, F.invert(L)]), Si(this), T.start();\n    }\n    Yo(k),\n      (T.wheel = setTimeout(C, m)),\n      T.zoom(\"mouse\", n(v(x(F, I), T.mouse[0], T.mouse[1]), T.extent, a));\n    function C() {\n      (T.wheel = null), T.end();\n    }\n  }\n  function j(k, ...N) {\n    if (p || !e.apply(this, arguments)) return;\n    var T = k.currentTarget,\n      F = E(this, N, !0).event(k),\n      I = Yt(k.view).on(\"mousemove.zoom\", B, !0).on(\"mouseup.zoom\", A, !0),\n      L = ln(k, T),\n      C = k.clientX,\n      H = k.clientY;\n    x3(k.view),\n      Bl(k),\n      (F.mouse = [L, this.__zoom.invert(L)]),\n      Si(this),\n      F.start();\n    function B(W) {\n      if ((Yo(W), !F.moved)) {\n        var G = W.clientX - C,\n          K = W.clientY - H;\n        F.moved = G * G + K * K > b;\n      }\n      F.event(W).zoom(\n        \"mouse\",\n        n(v(F.that.__zoom, (F.mouse[0] = ln(W, T)), F.mouse[1]), F.extent, a),\n      );\n    }\n    function A(W) {\n      I.on(\"mousemove.zoom mouseup.zoom\", null),\n        w3(W.view, F.moved),\n        Yo(W),\n        F.event(W).end();\n    }\n  }\n  function R(k, ...N) {\n    if (e.apply(this, arguments)) {\n      var T = this.__zoom,\n        F = ln(k.changedTouches ? k.changedTouches[0] : k, this),\n        I = T.invert(F),\n        L = T.k * (k.shiftKey ? 0.5 : 2),\n        C = n(v(x(T, L), F, I), t.apply(this, N), a);\n      Yo(k),\n        l > 0\n          ? Yt(this).transition().duration(l).call(w, C, F, k)\n          : Yt(this).call(g.transform, C, F, k);\n    }\n  }\n  function D(k, ...N) {\n    if (e.apply(this, arguments)) {\n      var T = k.touches,\n        F = T.length,\n        I = E(this, N, k.changedTouches.length === F).event(k),\n        L,\n        C,\n        H,\n        B;\n      for (Bl(k), C = 0; C < F; ++C)\n        (H = T[C]),\n          (B = ln(H, this)),\n          (B = [B, this.__zoom.invert(B), H.identifier]),\n          I.touch0\n            ? !I.touch1 &&\n              I.touch0[2] !== B[2] &&\n              ((I.touch1 = B), (I.taps = 0))\n            : ((I.touch0 = B), (L = !0), (I.taps = 1 + !!c));\n      c && (c = clearTimeout(c)),\n        L &&\n          (I.taps < 2 &&\n            ((d = B[0]),\n            (c = setTimeout(function () {\n              c = null;\n            }, h))),\n          Si(this),\n          I.start());\n    }\n  }\n  function P(k, ...N) {\n    if (this.__zooming) {\n      var T = E(this, N).event(k),\n        F = k.changedTouches,\n        I = F.length,\n        L,\n        C,\n        H,\n        B;\n      for (Yo(k), L = 0; L < I; ++L)\n        (C = F[L]),\n          (H = ln(C, this)),\n          T.touch0 && T.touch0[2] === C.identifier\n            ? (T.touch0[0] = H)\n            : T.touch1 && T.touch1[2] === C.identifier && (T.touch1[0] = H);\n      if (((C = T.that.__zoom), T.touch1)) {\n        var A = T.touch0[0],\n          W = T.touch0[1],\n          G = T.touch1[0],\n          K = T.touch1[1],\n          Q = (Q = G[0] - A[0]) * Q + (Q = G[1] - A[1]) * Q,\n          ne = (ne = K[0] - W[0]) * ne + (ne = K[1] - W[1]) * ne;\n        (C = x(C, Math.sqrt(Q / ne))),\n          (H = [(A[0] + G[0]) / 2, (A[1] + G[1]) / 2]),\n          (B = [(W[0] + K[0]) / 2, (W[1] + K[1]) / 2]);\n      } else if (T.touch0) (H = T.touch0[0]), (B = T.touch0[1]);\n      else return;\n      T.zoom(\"touch\", n(v(C, H, B), T.extent, a));\n    }\n  }\n  function V(k, ...N) {\n    if (this.__zooming) {\n      var T = E(this, N).event(k),\n        F = k.changedTouches,\n        I = F.length,\n        L,\n        C;\n      for (\n        Bl(k),\n          p && clearTimeout(p),\n          p = setTimeout(function () {\n            p = null;\n          }, h),\n          L = 0;\n        L < I;\n        ++L\n      )\n        (C = F[L]),\n          T.touch0 && T.touch0[2] === C.identifier\n            ? delete T.touch0\n            : T.touch1 && T.touch1[2] === C.identifier && delete T.touch1;\n      if (\n        (T.touch1 && !T.touch0 && ((T.touch0 = T.touch1), delete T.touch1),\n        T.touch0)\n      )\n        T.touch0[1] = this.__zoom.invert(T.touch0[0]);\n      else if (\n        (T.end(),\n        T.taps === 2 &&\n          ((C = ln(C, this)), Math.hypot(d[0] - C[0], d[1] - C[1]) < y))\n      ) {\n        var H = Yt(this).on(\"dblclick.zoom\");\n        H && H.apply(this, arguments);\n      }\n    }\n  }\n  return (\n    (g.wheelDelta = function (k) {\n      return arguments.length\n        ? ((o = typeof k == \"function\" ? k : ii(+k)), g)\n        : o;\n    }),\n    (g.filter = function (k) {\n      return arguments.length\n        ? ((e = typeof k == \"function\" ? k : ii(!!k)), g)\n        : e;\n    }),\n    (g.touchable = function (k) {\n      return arguments.length\n        ? ((r = typeof k == \"function\" ? k : ii(!!k)), g)\n        : r;\n    }),\n    (g.extent = function (k) {\n      return arguments.length\n        ? ((t =\n            typeof k == \"function\"\n              ? k\n              : ii([\n                  [+k[0][0], +k[0][1]],\n                  [+k[1][0], +k[1][1]],\n                ])),\n          g)\n        : t;\n    }),\n    (g.scaleExtent = function (k) {\n      return arguments.length\n        ? ((i[0] = +k[0]), (i[1] = +k[1]), g)\n        : [i[0], i[1]];\n    }),\n    (g.translateExtent = function (k) {\n      return arguments.length\n        ? ((a[0][0] = +k[0][0]),\n          (a[1][0] = +k[1][0]),\n          (a[0][1] = +k[0][1]),\n          (a[1][1] = +k[1][1]),\n          g)\n        : [\n            [a[0][0], a[0][1]],\n            [a[1][0], a[1][1]],\n          ];\n    }),\n    (g.constrain = function (k) {\n      return arguments.length ? ((n = k), g) : n;\n    }),\n    (g.duration = function (k) {\n      return arguments.length ? ((l = +k), g) : l;\n    }),\n    (g.interpolate = function (k) {\n      return arguments.length ? ((s = k), g) : s;\n    }),\n    (g.on = function () {\n      var k = u.on.apply(u, arguments);\n      return k === u ? g : k;\n    }),\n    (g.clickDistance = function (k) {\n      return arguments.length ? ((b = (k = +k) * k), g) : Math.sqrt(b);\n    }),\n    (g.tapDistance = function (k) {\n      return arguments.length ? ((y = +k), g) : y;\n    }),\n    g\n  );\n}\nconst fa = Pt(null),\n  Bm = fa.Provider,\n  Jt = {\n    error001: () =>\n      \"[React Flow]: Seems like you have not used zustand provider as an ancestor. Help: https://reactflow.dev/error#001\",\n    error002: () =>\n      \"It looks like you've created a new nodeTypes or edgeTypes object. If this wasn't on purpose please define the nodeTypes/edgeTypes outside of the component or memoize them.\",\n    error003: (e) =>\n      `Node type \"${e}\" not found. Using fallback type \"default\".`,\n    error004: () =>\n      \"The React Flow parent container needs a width and a height to render the graph.\",\n    error005: () => \"Only child nodes can use a parent extent.\",\n    error006: () => \"Can't create edge. An edge needs a source and a target.\",\n    error007: (e) => `The old edge with id=${e} does not exist.`,\n    error009: (e) => `Marker type \"${e}\" doesn't exist.`,\n    error008: (e, t) =>\n      `Couldn't create edge for ${e ? \"target\" : \"source\"} handle id: \"${e ? t.targetHandle : t.sourceHandle}\", edge id: ${t.id}.`,\n    error010: () =>\n      \"Handle: No node id found. Make sure to only use a Handle inside a custom Node.\",\n    error011: (e) =>\n      `Edge type \"${e}\" not found. Using fallback type \"default\".`,\n    error012: (e) =>\n      `Node with id \"${e}\" does not exist, it may have been removed. This can happen when a node is deleted before the \"onNodeClick\" handler is called.`,\n  },\n  R3 = Jt.error001();\nfunction qe(e, t) {\n  const n = Xe(fa);\n  if (n === null) throw new Error(R3);\n  return s3(n, e, t);\n}\nconst rt = () => {\n    const e = Xe(fa);\n    if (e === null) throw new Error(R3);\n    return ze(\n      () => ({\n        getState: e.getState,\n        setState: e.setState,\n        subscribe: e.subscribe,\n        destroy: e.destroy,\n      }),\n      [e],\n    );\n  },\n  Vm = (e) => (e.userSelectionActive ? \"none\" : \"all\");\nfunction I3({ position: e, children: t, className: n, style: o, ...r }) {\n  const i = qe(Vm),\n    a = `${e}`.split(\"-\");\n  return $.createElement(\n    \"div\",\n    {\n      className: yt([\"react-flow__panel\", n, ...a]),\n      style: { ...o, pointerEvents: i },\n      ...r,\n    },\n    t,\n  );\n}\nfunction $m({ proOptions: e, position: t = \"bottom-right\" }) {\n  return e != null && e.hideAttribution\n    ? null\n    : $.createElement(\n        I3,\n        {\n          position: t,\n          className: \"react-flow__attribution\",\n          \"data-message\":\n            \"Please only hide this attribution when you are subscribed to React Flow Pro: https://reactflow.dev/pro\",\n        },\n        $.createElement(\n          \"a\",\n          {\n            href: \"https://reactflow.dev\",\n            target: \"_blank\",\n            rel: \"noopener noreferrer\",\n            \"aria-label\": \"React Flow attribution\",\n          },\n          \"React Flow\",\n        ),\n      );\n}\nconst Wm = ({\n  x: e,\n  y: t,\n  label: n,\n  labelStyle: o = {},\n  labelShowBg: r = !0,\n  labelBgStyle: i = {},\n  labelBgPadding: a = [2, 4],\n  labelBgBorderRadius: l = 2,\n  children: s,\n  className: u,\n  ...c\n}) => {\n  const d = he(null),\n    [p, h] = se({ x: 0, y: 0, width: 0, height: 0 }),\n    m = yt([\"react-flow__edge-textwrapper\", u]);\n  return (\n    ue(() => {\n      if (d.current) {\n        const b = d.current.getBBox();\n        h({\n          x: b.x,\n          y: b.y,\n          width: b.width,\n          height: b.height,\n        });\n      }\n    }, [n]),\n    typeof n > \"u\" || !n\n      ? null\n      : $.createElement(\n          \"g\",\n          {\n            transform: `translate(${e - p.width / 2} ${t - p.height / 2})`,\n            className: m,\n            visibility: p.width ? \"visible\" : \"hidden\",\n            ...c,\n          },\n          r &&\n            $.createElement(\"rect\", {\n              width: p.width + 2 * a[0],\n              x: -a[0],\n              y: -a[1],\n              height: p.height + 2 * a[1],\n              className: \"react-flow__edge-textbg\",\n              style: i,\n              rx: l,\n              ry: l,\n            }),\n          $.createElement(\n            \"text\",\n            {\n              className: \"react-flow__edge-text\",\n              y: p.height / 2,\n              dy: \"0.3em\",\n              ref: d,\n              style: o,\n            },\n            n,\n          ),\n          s,\n        )\n  );\n};\nvar Zm = Ke(Wm);\nconst Rc = (e) => ({\n    width: e.offsetWidth,\n    height: e.offsetHeight,\n  }),\n  Lo = (e, t = 0, n = 1) => Math.min(Math.max(e, t), n),\n  Ic = (e = { x: 0, y: 0 }, t) => ({\n    x: Lo(e.x, t[0][0], t[1][0]),\n    y: Lo(e.y, t[0][1], t[1][1]),\n  }),\n  Lu = (e, t, n) =>\n    e < t\n      ? Lo(Math.abs(e - t), 1, 50) / 50\n      : e > n\n        ? -Lo(Math.abs(e - n), 1, 50) / 50\n        : 0,\n  H3 = (e, t) => {\n    const n = Lu(e.x, 35, t.width - 35) * 20,\n      o = Lu(e.y, 35, t.height - 35) * 20;\n    return [n, o];\n  },\n  z3 = (e) => {\n    var t;\n    return (\n      ((t = e.getRootNode) == null ? void 0 : t.call(e)) ||\n      (window == null ? void 0 : window.document)\n    );\n  },\n  Um = (e, t) => ({\n    x: Math.min(e.x, t.x),\n    y: Math.min(e.y, t.y),\n    x2: Math.max(e.x2, t.x2),\n    y2: Math.max(e.y2, t.y2),\n  }),\n  Hc = ({ x: e, y: t, width: n, height: o }) => ({\n    x: e,\n    y: t,\n    x2: e + n,\n    y2: t + o,\n  }),\n  qm = ({ x: e, y: t, x2: n, y2: o }) => ({\n    x: e,\n    y: t,\n    width: n - e,\n    height: o - t,\n  }),\n  Du = (e) => ({\n    ...(e.positionAbsolute || { x: 0, y: 0 }),\n    width: e.width || 0,\n    height: e.height || 0,\n  }),\n  Ds = (e, t) => {\n    const n = Math.max(\n        0,\n        Math.min(e.x + e.width, t.x + t.width) - Math.max(e.x, t.x),\n      ),\n      o = Math.max(\n        0,\n        Math.min(e.y + e.height, t.y + t.height) - Math.max(e.y, t.y),\n      );\n    return Math.ceil(n * o);\n  },\n  Ym = (e) => Ht(e.width) && Ht(e.height) && Ht(e.x) && Ht(e.y),\n  Ht = (e) => !isNaN(e) && isFinite(e),\n  Ge = Symbol.for(\"internals\"),\n  P3 = [\"Enter\", \" \", \"Escape\"],\n  B3 = (e, t) => {\n    process.env.NODE_ENV === \"development\" &&\n      console.warn(`[React Flow]: ${t} Help: https://reactflow.dev/error#${e}`);\n  },\n  Gm = (e) => \"nativeEvent\" in e;\nfunction js(e) {\n  var r, i;\n  const t = Gm(e) ? e.nativeEvent : e,\n    n =\n      ((i = (r = t.composedPath) == null ? void 0 : r.call(t)) == null\n        ? void 0\n        : i[0]) || e.target;\n  return (\n    [\"INPUT\", \"SELECT\", \"TEXTAREA\"].includes(n == null ? void 0 : n.nodeName) ||\n    (n == null ? void 0 : n.hasAttribute(\"contenteditable\")) ||\n    !!(n != null && n.closest(\".nokey\"))\n  );\n}\nconst V3 = (e) => \"clientX\" in e,\n  Rn = (e, t) => {\n    var i, a;\n    const n = V3(e),\n      o = n ? e.clientX : (i = e.touches) == null ? void 0 : i[0].clientX,\n      r = n ? e.clientY : (a = e.touches) == null ? void 0 : a[0].clientY;\n    return {\n      x: o - ((t == null ? void 0 : t.left) ?? 0),\n      y: r - ((t == null ? void 0 : t.top) ?? 0),\n    };\n  },\n  $i = () => {\n    var e;\n    return (\n      typeof navigator < \"u\" &&\n      ((e = navigator == null ? void 0 : navigator.userAgent) == null\n        ? void 0\n        : e.indexOf(\"Mac\")) >= 0\n    );\n  },\n  zo = ({\n    id: e,\n    path: t,\n    labelX: n,\n    labelY: o,\n    label: r,\n    labelStyle: i,\n    labelShowBg: a,\n    labelBgStyle: l,\n    labelBgPadding: s,\n    labelBgBorderRadius: u,\n    style: c,\n    markerEnd: d,\n    markerStart: p,\n    interactionWidth: h = 20,\n  }) =>\n    $.createElement(\n      $.Fragment,\n      null,\n      $.createElement(\"path\", {\n        id: e,\n        style: c,\n        d: t,\n        fill: \"none\",\n        className: \"react-flow__edge-path\",\n        markerEnd: d,\n        markerStart: p,\n      }),\n      h &&\n        $.createElement(\"path\", {\n          d: t,\n          fill: \"none\",\n          strokeOpacity: 0,\n          strokeWidth: h,\n          className: \"react-flow__edge-interaction\",\n        }),\n      r && Ht(n) && Ht(o)\n        ? $.createElement(Zm, {\n            x: n,\n            y: o,\n            label: r,\n            labelStyle: i,\n            labelShowBg: a,\n            labelBgStyle: l,\n            labelBgPadding: s,\n            labelBgBorderRadius: u,\n          })\n        : null,\n    );\nzo.displayName = \"BaseEdge\";\nfunction Go(e, t, n) {\n  return n === void 0\n    ? n\n    : (o) => {\n        const r = t().edges.find((i) => i.id === e);\n        r && n(o, { ...r });\n      };\n}\nfunction $3({ sourceX: e, sourceY: t, targetX: n, targetY: o }) {\n  const r = Math.abs(n - e) / 2,\n    i = n < e ? n + r : n - r,\n    a = Math.abs(o - t) / 2,\n    l = o < t ? o + a : o - a;\n  return [i, l, r, a];\n}\nfunction W3({\n  sourceX: e,\n  sourceY: t,\n  targetX: n,\n  targetY: o,\n  sourceControlX: r,\n  sourceControlY: i,\n  targetControlX: a,\n  targetControlY: l,\n}) {\n  const s = e * 0.125 + r * 0.375 + a * 0.375 + n * 0.125,\n    u = t * 0.125 + i * 0.375 + l * 0.375 + o * 0.125,\n    c = Math.abs(s - e),\n    d = Math.abs(u - t);\n  return [s, u, c, d];\n}\nvar oo;\n(function (e) {\n  (e.Strict = \"strict\"), (e.Loose = \"loose\");\n})(oo || (oo = {}));\nvar Yn;\n(function (e) {\n  (e.Free = \"free\"), (e.Vertical = \"vertical\"), (e.Horizontal = \"horizontal\");\n})(Yn || (Yn = {}));\nvar Sr;\n(function (e) {\n  (e.Partial = \"partial\"), (e.Full = \"full\");\n})(Sr || (Sr = {}));\nvar Dn;\n(function (e) {\n  (e.Bezier = \"default\"),\n    (e.Straight = \"straight\"),\n    (e.Step = \"step\"),\n    (e.SmoothStep = \"smoothstep\"),\n    (e.SimpleBezier = \"simplebezier\");\n})(Dn || (Dn = {}));\nvar Wi;\n(function (e) {\n  (e.Arrow = \"arrow\"), (e.ArrowClosed = \"arrowclosed\");\n})(Wi || (Wi = {}));\nvar ae;\n(function (e) {\n  (e.Left = \"left\"),\n    (e.Top = \"top\"),\n    (e.Right = \"right\"),\n    (e.Bottom = \"bottom\");\n})(ae || (ae = {}));\nfunction ju({ pos: e, x1: t, y1: n, x2: o, y2: r }) {\n  return e === ae.Left || e === ae.Right\n    ? [0.5 * (t + o), n]\n    : [t, 0.5 * (n + r)];\n}\nfunction Z3({\n  sourceX: e,\n  sourceY: t,\n  sourcePosition: n = ae.Bottom,\n  targetX: o,\n  targetY: r,\n  targetPosition: i = ae.Top,\n}) {\n  const [a, l] = ju({\n      pos: n,\n      x1: e,\n      y1: t,\n      x2: o,\n      y2: r,\n    }),\n    [s, u] = ju({\n      pos: i,\n      x1: o,\n      y1: r,\n      x2: e,\n      y2: t,\n    }),\n    [c, d, p, h] = W3({\n      sourceX: e,\n      sourceY: t,\n      targetX: o,\n      targetY: r,\n      sourceControlX: a,\n      sourceControlY: l,\n      targetControlX: s,\n      targetControlY: u,\n    });\n  return [`M${e},${t} C${a},${l} ${s},${u} ${o},${r}`, c, d, p, h];\n}\nconst zc = Ke(\n  ({\n    sourceX: e,\n    sourceY: t,\n    targetX: n,\n    targetY: o,\n    sourcePosition: r = ae.Bottom,\n    targetPosition: i = ae.Top,\n    label: a,\n    labelStyle: l,\n    labelShowBg: s,\n    labelBgStyle: u,\n    labelBgPadding: c,\n    labelBgBorderRadius: d,\n    style: p,\n    markerEnd: h,\n    markerStart: m,\n    interactionWidth: b,\n  }) => {\n    const [y, g, x] = Z3({\n      sourceX: e,\n      sourceY: t,\n      sourcePosition: r,\n      targetX: n,\n      targetY: o,\n      targetPosition: i,\n    });\n    return $.createElement(zo, {\n      path: y,\n      labelX: g,\n      labelY: x,\n      label: a,\n      labelStyle: l,\n      labelShowBg: s,\n      labelBgStyle: u,\n      labelBgPadding: c,\n      labelBgBorderRadius: d,\n      style: p,\n      markerEnd: h,\n      markerStart: m,\n      interactionWidth: b,\n    });\n  },\n);\nzc.displayName = \"SimpleBezierEdge\";\nconst Fu = {\n    [ae.Left]: { x: -1, y: 0 },\n    [ae.Right]: { x: 1, y: 0 },\n    [ae.Top]: { x: 0, y: -1 },\n    [ae.Bottom]: { x: 0, y: 1 },\n  },\n  Km = ({ source: e, sourcePosition: t = ae.Bottom, target: n }) =>\n    t === ae.Left || t === ae.Right\n      ? e.x < n.x\n        ? { x: 1, y: 0 }\n        : { x: -1, y: 0 }\n      : e.y < n.y\n        ? { x: 0, y: 1 }\n        : { x: 0, y: -1 },\n  Ru = (e, t) => Math.sqrt(Math.pow(t.x - e.x, 2) + Math.pow(t.y - e.y, 2));\nfunction Xm({\n  source: e,\n  sourcePosition: t = ae.Bottom,\n  target: n,\n  targetPosition: o = ae.Top,\n  center: r,\n  offset: i,\n}) {\n  const a = Fu[t],\n    l = Fu[o],\n    s = { x: e.x + a.x * i, y: e.y + a.y * i },\n    u = { x: n.x + l.x * i, y: n.y + l.y * i },\n    c = Km({\n      source: s,\n      sourcePosition: t,\n      target: u,\n    }),\n    d = c.x !== 0 ? \"x\" : \"y\",\n    p = c[d];\n  let h = [],\n    m,\n    b;\n  const y = { x: 0, y: 0 },\n    g = { x: 0, y: 0 },\n    [x, v, S, w] = $3({\n      sourceX: e.x,\n      sourceY: e.y,\n      targetX: n.x,\n      targetY: n.y,\n    });\n  if (a[d] * l[d] === -1) {\n    (m = r.x ?? x), (b = r.y ?? v);\n    const M = [\n        { x: m, y: s.y },\n        { x: m, y: u.y },\n      ],\n      _ = [\n        { x: s.x, y: b },\n        { x: u.x, y: b },\n      ];\n    a[d] === p ? (h = d === \"x\" ? M : _) : (h = d === \"x\" ? _ : M);\n  } else {\n    const M = [{ x: s.x, y: u.y }],\n      _ = [{ x: u.x, y: s.y }];\n    if (\n      (d === \"x\" ? (h = a.x === p ? _ : M) : (h = a.y === p ? M : _), t === o)\n    ) {\n      const V = Math.abs(e[d] - n[d]);\n      if (V <= i) {\n        const k = Math.min(i - 1, i - V);\n        a[d] === p\n          ? (y[d] = (s[d] > e[d] ? -1 : 1) * k)\n          : (g[d] = (u[d] > n[d] ? -1 : 1) * k);\n      }\n    }\n    if (t !== o) {\n      const V = d === \"x\" ? \"y\" : \"x\",\n        k = a[d] === l[V],\n        N = s[V] > u[V],\n        T = s[V] < u[V];\n      ((a[d] === 1 && ((!k && N) || (k && T))) ||\n        (a[d] !== 1 && ((!k && T) || (k && N)))) &&\n        (h = d === \"x\" ? M : _);\n    }\n    const j = { x: s.x + y.x, y: s.y + y.y },\n      R = { x: u.x + g.x, y: u.y + g.y },\n      D = Math.max(Math.abs(j.x - h[0].x), Math.abs(R.x - h[0].x)),\n      P = Math.max(Math.abs(j.y - h[0].y), Math.abs(R.y - h[0].y));\n    D >= P\n      ? ((m = (j.x + R.x) / 2), (b = h[0].y))\n      : ((m = h[0].x), (b = (j.y + R.y) / 2));\n  }\n  return [\n    [\n      e,\n      { x: s.x + y.x, y: s.y + y.y },\n      ...h,\n      { x: u.x + g.x, y: u.y + g.y },\n      n,\n    ],\n    m,\n    b,\n    S,\n    w,\n  ];\n}\nfunction Qm(e, t, n, o) {\n  const r = Math.min(Ru(e, t) / 2, Ru(t, n) / 2, o),\n    { x: i, y: a } = t;\n  if ((e.x === i && i === n.x) || (e.y === a && a === n.y)) return `L${i} ${a}`;\n  if (e.y === a) {\n    const u = e.x < n.x ? -1 : 1,\n      c = e.y < n.y ? 1 : -1;\n    return `L ${i + r * u},${a}Q ${i},${a} ${i},${a + r * c}`;\n  }\n  const l = e.x < n.x ? 1 : -1,\n    s = e.y < n.y ? -1 : 1;\n  return `L ${i},${a + r * s}Q ${i},${a} ${i + r * l},${a}`;\n}\nfunction Fs({\n  sourceX: e,\n  sourceY: t,\n  sourcePosition: n = ae.Bottom,\n  targetX: o,\n  targetY: r,\n  targetPosition: i = ae.Top,\n  borderRadius: a = 5,\n  centerX: l,\n  centerY: s,\n  offset: u = 20,\n}) {\n  const [c, d, p, h, m] = Xm({\n    source: { x: e, y: t },\n    sourcePosition: n,\n    target: { x: o, y: r },\n    targetPosition: i,\n    center: { x: l, y: s },\n    offset: u,\n  });\n  return [\n    c.reduce((y, g, x) => {\n      let v = \"\";\n      return (\n        x > 0 && x < c.length - 1\n          ? (v = Qm(c[x - 1], g, c[x + 1], a))\n          : (v = `${x === 0 ? \"M\" : \"L\"}${g.x} ${g.y}`),\n        (y += v),\n        y\n      );\n    }, \"\"),\n    d,\n    p,\n    h,\n    m,\n  ];\n}\nconst ha = Ke(\n  ({\n    sourceX: e,\n    sourceY: t,\n    targetX: n,\n    targetY: o,\n    label: r,\n    labelStyle: i,\n    labelShowBg: a,\n    labelBgStyle: l,\n    labelBgPadding: s,\n    labelBgBorderRadius: u,\n    style: c,\n    sourcePosition: d = ae.Bottom,\n    targetPosition: p = ae.Top,\n    markerEnd: h,\n    markerStart: m,\n    pathOptions: b,\n    interactionWidth: y,\n  }) => {\n    const [g, x, v] = Fs({\n      sourceX: e,\n      sourceY: t,\n      sourcePosition: d,\n      targetX: n,\n      targetY: o,\n      targetPosition: p,\n      borderRadius: b == null ? void 0 : b.borderRadius,\n      offset: b == null ? void 0 : b.offset,\n    });\n    return $.createElement(zo, {\n      path: g,\n      labelX: x,\n      labelY: v,\n      label: r,\n      labelStyle: i,\n      labelShowBg: a,\n      labelBgStyle: l,\n      labelBgPadding: s,\n      labelBgBorderRadius: u,\n      style: c,\n      markerEnd: h,\n      markerStart: m,\n      interactionWidth: y,\n    });\n  },\n);\nha.displayName = \"SmoothStepEdge\";\nconst Pc = Ke((e) => {\n  var t;\n  return $.createElement(ha, {\n    ...e,\n    pathOptions: ze(() => {\n      var n;\n      return {\n        borderRadius: 0,\n        offset: (n = e.pathOptions) == null ? void 0 : n.offset,\n      };\n    }, [(t = e.pathOptions) == null ? void 0 : t.offset]),\n  });\n});\nPc.displayName = \"StepEdge\";\nfunction Jm({ sourceX: e, sourceY: t, targetX: n, targetY: o }) {\n  const [r, i, a, l] = $3({\n    sourceX: e,\n    sourceY: t,\n    targetX: n,\n    targetY: o,\n  });\n  return [`M ${e},${t}L ${n},${o}`, r, i, a, l];\n}\nconst Bc = Ke(\n  ({\n    sourceX: e,\n    sourceY: t,\n    targetX: n,\n    targetY: o,\n    label: r,\n    labelStyle: i,\n    labelShowBg: a,\n    labelBgStyle: l,\n    labelBgPadding: s,\n    labelBgBorderRadius: u,\n    style: c,\n    markerEnd: d,\n    markerStart: p,\n    interactionWidth: h,\n  }) => {\n    const [m, b, y] = Jm({ sourceX: e, sourceY: t, targetX: n, targetY: o });\n    return $.createElement(zo, {\n      path: m,\n      labelX: b,\n      labelY: y,\n      label: r,\n      labelStyle: i,\n      labelShowBg: a,\n      labelBgStyle: l,\n      labelBgPadding: s,\n      labelBgBorderRadius: u,\n      style: c,\n      markerEnd: d,\n      markerStart: p,\n      interactionWidth: h,\n    });\n  },\n);\nBc.displayName = \"StraightEdge\";\nfunction ai(e, t) {\n  return e >= 0 ? 0.5 * e : t * 25 * Math.sqrt(-e);\n}\nfunction Iu({ pos: e, x1: t, y1: n, x2: o, y2: r, c: i }) {\n  switch (e) {\n    case ae.Left:\n      return [t - ai(t - o, i), n];\n    case ae.Right:\n      return [t + ai(o - t, i), n];\n    case ae.Top:\n      return [t, n - ai(n - r, i)];\n    case ae.Bottom:\n      return [t, n + ai(r - n, i)];\n  }\n}\nfunction U3({\n  sourceX: e,\n  sourceY: t,\n  sourcePosition: n = ae.Bottom,\n  targetX: o,\n  targetY: r,\n  targetPosition: i = ae.Top,\n  curvature: a = 0.25,\n}) {\n  const [l, s] = Iu({\n      pos: n,\n      x1: e,\n      y1: t,\n      x2: o,\n      y2: r,\n      c: a,\n    }),\n    [u, c] = Iu({\n      pos: i,\n      x1: o,\n      y1: r,\n      x2: e,\n      y2: t,\n      c: a,\n    }),\n    [d, p, h, m] = W3({\n      sourceX: e,\n      sourceY: t,\n      targetX: o,\n      targetY: r,\n      sourceControlX: l,\n      sourceControlY: s,\n      targetControlX: u,\n      targetControlY: c,\n    });\n  return [`M${e},${t} C${l},${s} ${u},${c} ${o},${r}`, d, p, h, m];\n}\nconst Zi = Ke(\n  ({\n    sourceX: e,\n    sourceY: t,\n    targetX: n,\n    targetY: o,\n    sourcePosition: r = ae.Bottom,\n    targetPosition: i = ae.Top,\n    label: a,\n    labelStyle: l,\n    labelShowBg: s,\n    labelBgStyle: u,\n    labelBgPadding: c,\n    labelBgBorderRadius: d,\n    style: p,\n    markerEnd: h,\n    markerStart: m,\n    pathOptions: b,\n    interactionWidth: y,\n  }) => {\n    const [g, x, v] = U3({\n      sourceX: e,\n      sourceY: t,\n      sourcePosition: r,\n      targetX: n,\n      targetY: o,\n      targetPosition: i,\n      curvature: b == null ? void 0 : b.curvature,\n    });\n    return $.createElement(zo, {\n      path: g,\n      labelX: x,\n      labelY: v,\n      label: a,\n      labelStyle: l,\n      labelShowBg: s,\n      labelBgStyle: u,\n      labelBgPadding: c,\n      labelBgBorderRadius: d,\n      style: p,\n      markerEnd: h,\n      markerStart: m,\n      interactionWidth: y,\n    });\n  },\n);\nZi.displayName = \"BezierEdge\";\nconst Vc = Pt(null),\n  eb = Vc.Provider;\nVc.Consumer;\nconst tb = () => Xe(Vc),\n  nb = (e) => \"id\" in e && \"source\" in e && \"target\" in e,\n  ob = (e) => \"id\" in e && !(\"source\" in e) && !(\"target\" in e),\n  rb = ({ source: e, sourceHandle: t, target: n, targetHandle: o }) =>\n    `reactflow__edge-${e}${t || \"\"}-${n}${o || \"\"}`,\n  Rs = (e, t) =>\n    typeof e > \"u\"\n      ? \"\"\n      : typeof e == \"string\"\n        ? e\n        : `${t ? `${t}__` : \"\"}${Object.keys(e)\n            .sort()\n            .map((o) => `${o}=${e[o]}`)\n            .join(\"&\")}`,\n  ib = (e, t) =>\n    t.some(\n      (n) =>\n        n.source === e.source &&\n        n.target === e.target &&\n        (n.sourceHandle === e.sourceHandle ||\n          (!n.sourceHandle && !e.sourceHandle)) &&\n        (n.targetHandle === e.targetHandle ||\n          (!n.targetHandle && !e.targetHandle)),\n    ),\n  ab = (e, t) => {\n    if (!e.source || !e.target) return B3(\"006\", Jt.error006()), t;\n    let n;\n    return (\n      nb(e)\n        ? (n = { ...e })\n        : (n = {\n            ...e,\n            id: rb(e),\n          }),\n      ib(n, t) ? t : t.concat(n)\n    );\n  },\n  Is = ({ x: e, y: t }, [n, o, r], i, [a, l]) => {\n    const s = {\n      x: (e - n) / r,\n      y: (t - o) / r,\n    };\n    return i\n      ? {\n          x: a * Math.round(s.x / a),\n          y: l * Math.round(s.y / l),\n        }\n      : s;\n  },\n  q3 = ({ x: e, y: t }, [n, o, r]) => ({\n    x: e * r + n,\n    y: t * r + o,\n  }),\n  vo = (e, t = [0, 0]) => {\n    if (!e)\n      return {\n        x: 0,\n        y: 0,\n        positionAbsolute: {\n          x: 0,\n          y: 0,\n        },\n      };\n    const n = (e.width ?? 0) * t[0],\n      o = (e.height ?? 0) * t[1],\n      r = {\n        x: e.position.x - n,\n        y: e.position.y - o,\n      };\n    return {\n      ...r,\n      positionAbsolute: e.positionAbsolute\n        ? {\n            x: e.positionAbsolute.x - n,\n            y: e.positionAbsolute.y - o,\n          }\n        : r,\n    };\n  },\n  $c = (e, t = [0, 0]) => {\n    if (e.length === 0) return { x: 0, y: 0, width: 0, height: 0 };\n    const n = e.reduce(\n      (o, r) => {\n        const { x: i, y: a } = vo(r, t).positionAbsolute;\n        return Um(\n          o,\n          Hc({\n            x: i,\n            y: a,\n            width: r.width || 0,\n            height: r.height || 0,\n          }),\n        );\n      },\n      { x: 1 / 0, y: 1 / 0, x2: -1 / 0, y2: -1 / 0 },\n    );\n    return qm(n);\n  },\n  Y3 = (e, t, [n, o, r] = [0, 0, 1], i = !1, a = !1, l = [0, 0]) => {\n    const s = {\n        x: (t.x - n) / r,\n        y: (t.y - o) / r,\n        width: t.width / r,\n        height: t.height / r,\n      },\n      u = [];\n    return (\n      e.forEach((c) => {\n        const { width: d, height: p, selectable: h = !0, hidden: m = !1 } = c;\n        if ((a && !h) || m) return !1;\n        const { positionAbsolute: b } = vo(c, l),\n          y = {\n            x: b.x,\n            y: b.y,\n            width: d || 0,\n            height: p || 0,\n          },\n          g = Ds(s, y),\n          x = typeof d > \"u\" || typeof p > \"u\" || d === null || p === null,\n          v = i && g > 0,\n          S = (d || 0) * (p || 0);\n        (x || v || g >= S || c.dragging) && u.push(c);\n      }),\n      u\n    );\n  },\n  G3 = (e, t) => {\n    const n = e.map((o) => o.id);\n    return t.filter((o) => n.includes(o.source) || n.includes(o.target));\n  },\n  K3 = (e, t, n, o, r, i = 0.1) => {\n    const a = t / (e.width * (1 + i)),\n      l = n / (e.height * (1 + i)),\n      s = Math.min(a, l),\n      u = Lo(s, o, r),\n      c = e.x + e.width / 2,\n      d = e.y + e.height / 2,\n      p = t / 2 - c * u,\n      h = n / 2 - d * u;\n    return { x: p, y: h, zoom: u };\n  },\n  Vn = (e, t = 0) => e.transition().duration(t);\nfunction Hu(e, t, n, o) {\n  return (t[n] || []).reduce((r, i) => {\n    var a, l;\n    return (\n      `${e.id}-${i.id}-${n}` !== o &&\n        r.push({\n          id: i.id || null,\n          type: n,\n          nodeId: e.id,\n          x:\n            (((a = e.positionAbsolute) == null ? void 0 : a.x) ?? 0) +\n            i.x +\n            i.width / 2,\n          y:\n            (((l = e.positionAbsolute) == null ? void 0 : l.y) ?? 0) +\n            i.y +\n            i.height / 2,\n        }),\n      r\n    );\n  }, []);\n}\nfunction lb(e, t, n, o, r, i) {\n  const { x: a, y: l } = Rn(e),\n    u = t\n      .elementsFromPoint(a, l)\n      .find((m) => m.classList.contains(\"react-flow__handle\"));\n  if (u) {\n    const m = u.getAttribute(\"data-nodeid\");\n    if (m) {\n      const b = Wc(void 0, u),\n        y = u.getAttribute(\"data-handleid\"),\n        g = i({ nodeId: m, id: y, type: b });\n      if (g) {\n        const x = r.find((v) => v.nodeId === m && v.type === b && v.id === y);\n        return {\n          handle: {\n            id: y,\n            type: b,\n            nodeId: m,\n            x: (x == null ? void 0 : x.x) || n.x,\n            y: (x == null ? void 0 : x.y) || n.y,\n          },\n          validHandleResult: g,\n        };\n      }\n    }\n  }\n  let c = [],\n    d = 1 / 0;\n  if (\n    (r.forEach((m) => {\n      const b = Math.sqrt((m.x - n.x) ** 2 + (m.y - n.y) ** 2);\n      if (b <= o) {\n        const y = i(m);\n        b <= d &&\n          (b < d\n            ? (c = [{ handle: m, validHandleResult: y }])\n            : b === d &&\n              c.push({\n                handle: m,\n                validHandleResult: y,\n              }),\n          (d = b));\n      }\n    }),\n    !c.length)\n  )\n    return { handle: null, validHandleResult: X3() };\n  if (c.length === 1) return c[0];\n  const p = c.some(({ validHandleResult: m }) => m.isValid),\n    h = c.some(({ handle: m }) => m.type === \"target\");\n  return (\n    c.find(({ handle: m, validHandleResult: b }) =>\n      h ? m.type === \"target\" : p ? b.isValid : !0,\n    ) || c[0]\n  );\n}\nconst sb = {\n    source: null,\n    target: null,\n    sourceHandle: null,\n    targetHandle: null,\n  },\n  X3 = () => ({\n    handleDomNode: null,\n    isValid: !1,\n    connection: sb,\n    endHandle: null,\n  });\nfunction Q3(e, t, n, o, r, i, a) {\n  const l = r === \"target\",\n    s = a.querySelector(\n      `.react-flow__handle[data-id=\"${e == null ? void 0 : e.nodeId}-${e == null ? void 0 : e.id}-${e == null ? void 0 : e.type}\"]`,\n    ),\n    u = {\n      ...X3(),\n      handleDomNode: s,\n    };\n  if (s) {\n    const c = Wc(void 0, s),\n      d = s.getAttribute(\"data-nodeid\"),\n      p = s.getAttribute(\"data-handleid\"),\n      h = s.classList.contains(\"connectable\"),\n      m = s.classList.contains(\"connectableend\"),\n      b = {\n        source: l ? d : n,\n        sourceHandle: l ? p : o,\n        target: l ? n : d,\n        targetHandle: l ? o : p,\n      };\n    (u.connection = b),\n      h &&\n        m &&\n        (t === oo.Strict\n          ? (l && c === \"source\") || (!l && c === \"target\")\n          : d !== n || p !== o) &&\n        ((u.endHandle = {\n          nodeId: d,\n          handleId: p,\n          type: c,\n        }),\n        (u.isValid = i(b)));\n  }\n  return u;\n}\nfunction cb({ nodes: e, nodeId: t, handleId: n, handleType: o }) {\n  return e.reduce((r, i) => {\n    if (i[Ge]) {\n      const { handleBounds: a } = i[Ge];\n      let l = [],\n        s = [];\n      a &&\n        ((l = Hu(i, a, \"source\", `${t}-${n}-${o}`)),\n        (s = Hu(i, a, \"target\", `${t}-${n}-${o}`))),\n        r.push(...l, ...s);\n    }\n    return r;\n  }, []);\n}\nfunction Wc(e, t) {\n  return (\n    e ||\n    (t != null && t.classList.contains(\"target\")\n      ? \"target\"\n      : t != null && t.classList.contains(\"source\")\n        ? \"source\"\n        : null)\n  );\n}\nfunction Vl(e) {\n  e == null ||\n    e.classList.remove(\n      \"valid\",\n      \"connecting\",\n      \"react-flow__handle-valid\",\n      \"react-flow__handle-connecting\",\n    );\n}\nfunction ub(e, t) {\n  let n = null;\n  return t ? (n = \"valid\") : e && !t && (n = \"invalid\"), n;\n}\nfunction J3({\n  event: e,\n  handleId: t,\n  nodeId: n,\n  onConnect: o,\n  isTarget: r,\n  getState: i,\n  setState: a,\n  isValidConnection: l,\n  edgeUpdaterType: s,\n  onReconnectEnd: u,\n}) {\n  const c = z3(e.target),\n    {\n      connectionMode: d,\n      domNode: p,\n      autoPanOnConnect: h,\n      connectionRadius: m,\n      onConnectStart: b,\n      panBy: y,\n      getNodes: g,\n      cancelConnection: x,\n    } = i();\n  let v = 0,\n    S;\n  const { x: w, y: E } = Rn(e),\n    M = c == null ? void 0 : c.elementFromPoint(w, E),\n    _ = Wc(s, M),\n    j = p == null ? void 0 : p.getBoundingClientRect();\n  if (!j || !_) return;\n  let R,\n    D = Rn(e, j),\n    P = !1,\n    V = null,\n    k = !1,\n    N = null;\n  const T = cb({\n      nodes: g(),\n      nodeId: n,\n      handleId: t,\n      handleType: _,\n    }),\n    F = () => {\n      if (!h) return;\n      const [C, H] = H3(D, j);\n      y({ x: C, y: H }), (v = requestAnimationFrame(F));\n    };\n  a({\n    connectionPosition: D,\n    connectionStatus: null,\n    // connectionNodeId etc will be removed in the next major in favor of connectionStartHandle\n    connectionNodeId: n,\n    connectionHandleId: t,\n    connectionHandleType: _,\n    connectionStartHandle: {\n      nodeId: n,\n      handleId: t,\n      type: _,\n    },\n    connectionEndHandle: null,\n  }),\n    b == null || b(e, { nodeId: n, handleId: t, handleType: _ });\n  function I(C) {\n    const { transform: H } = i();\n    D = Rn(C, j);\n    const { handle: B, validHandleResult: A } = lb(\n      C,\n      c,\n      Is(D, H, !1, [1, 1]),\n      m,\n      T,\n      (W) => Q3(W, d, n, t, r ? \"target\" : \"source\", l, c),\n    );\n    if (\n      ((S = B),\n      P || (F(), (P = !0)),\n      (N = A.handleDomNode),\n      (V = A.connection),\n      (k = A.isValid),\n      a({\n        connectionPosition:\n          S && k\n            ? q3(\n                {\n                  x: S.x,\n                  y: S.y,\n                },\n                H,\n              )\n            : D,\n        connectionStatus: ub(!!S, k),\n        connectionEndHandle: A.endHandle,\n      }),\n      !S && !k && !N)\n    )\n      return Vl(R);\n    V.source !== V.target &&\n      N &&\n      (Vl(R),\n      (R = N),\n      N.classList.add(\"connecting\", \"react-flow__handle-connecting\"),\n      N.classList.toggle(\"valid\", k),\n      N.classList.toggle(\"react-flow__handle-valid\", k));\n  }\n  function L(C) {\n    var H, B;\n    (S || N) && V && k && (o == null || o(V)),\n      (B = (H = i()).onConnectEnd) == null || B.call(H, C),\n      s && (u == null || u(C)),\n      Vl(R),\n      x(),\n      cancelAnimationFrame(v),\n      (P = !1),\n      (k = !1),\n      (V = null),\n      (N = null),\n      c.removeEventListener(\"mousemove\", I),\n      c.removeEventListener(\"mouseup\", L),\n      c.removeEventListener(\"touchmove\", I),\n      c.removeEventListener(\"touchend\", L);\n  }\n  c.addEventListener(\"mousemove\", I),\n    c.addEventListener(\"mouseup\", L),\n    c.addEventListener(\"touchmove\", I),\n    c.addEventListener(\"touchend\", L);\n}\nconst zu = () => !0,\n  db = (e) => ({\n    connectionStartHandle: e.connectionStartHandle,\n    connectOnClick: e.connectOnClick,\n    noPanClassName: e.noPanClassName,\n  }),\n  fb = (e, t, n) => (o) => {\n    const {\n      connectionStartHandle: r,\n      connectionEndHandle: i,\n      connectionClickStartHandle: a,\n    } = o;\n    return {\n      connecting:\n        ((r == null ? void 0 : r.nodeId) === e &&\n          (r == null ? void 0 : r.handleId) === t &&\n          (r == null ? void 0 : r.type) === n) ||\n        ((i == null ? void 0 : i.nodeId) === e &&\n          (i == null ? void 0 : i.handleId) === t &&\n          (i == null ? void 0 : i.type) === n),\n      clickConnecting:\n        (a == null ? void 0 : a.nodeId) === e &&\n        (a == null ? void 0 : a.handleId) === t &&\n        (a == null ? void 0 : a.type) === n,\n    };\n  },\n  e5 = ea(\n    (\n      {\n        type: e = \"source\",\n        position: t = ae.Top,\n        isValidConnection: n,\n        isConnectable: o = !0,\n        isConnectableStart: r = !0,\n        isConnectableEnd: i = !0,\n        id: a,\n        onConnect: l,\n        children: s,\n        className: u,\n        onMouseDown: c,\n        onTouchStart: d,\n        ...p\n      },\n      h,\n    ) => {\n      var j, R;\n      const m = a || null,\n        b = e === \"target\",\n        y = rt(),\n        g = tb(),\n        { connectOnClick: x, noPanClassName: v } = qe(db, ut),\n        { connecting: S, clickConnecting: w } = qe(fb(g, m, e), ut);\n      g ||\n        (R = (j = y.getState()).onError) == null ||\n        R.call(j, \"010\", Jt.error010());\n      const E = (D) => {\n          const {\n              defaultEdgeOptions: P,\n              onConnect: V,\n              hasDefaultEdges: k,\n            } = y.getState(),\n            N = {\n              ...P,\n              ...D,\n            };\n          if (k) {\n            const { edges: T, setEdges: F } = y.getState();\n            F(ab(N, T));\n          }\n          V == null || V(N), l == null || l(N);\n        },\n        M = (D) => {\n          if (!g) return;\n          const P = V3(D);\n          r &&\n            ((P && D.button === 0) || !P) &&\n            J3({\n              event: D,\n              handleId: m,\n              nodeId: g,\n              onConnect: E,\n              isTarget: b,\n              getState: y.getState,\n              setState: y.setState,\n              isValidConnection: n || y.getState().isValidConnection || zu,\n            }),\n            P ? c == null || c(D) : d == null || d(D);\n        },\n        _ = (D) => {\n          const {\n            onClickConnectStart: P,\n            onClickConnectEnd: V,\n            connectionClickStartHandle: k,\n            connectionMode: N,\n            isValidConnection: T,\n          } = y.getState();\n          if (!g || (!k && !r)) return;\n          if (!k) {\n            P == null || P(D, { nodeId: g, handleId: m, handleType: e }),\n              y.setState({\n                connectionClickStartHandle: { nodeId: g, type: e, handleId: m },\n              });\n            return;\n          }\n          const F = z3(D.target),\n            I = n || T || zu,\n            { connection: L, isValid: C } = Q3(\n              {\n                nodeId: g,\n                id: m,\n                type: e,\n              },\n              N,\n              k.nodeId,\n              k.handleId || null,\n              k.type,\n              I,\n              F,\n            );\n          C && E(L),\n            V == null || V(D),\n            y.setState({ connectionClickStartHandle: null });\n        };\n      return $.createElement(\n        \"div\",\n        {\n          \"data-handleid\": m,\n          \"data-nodeid\": g,\n          \"data-handlepos\": t,\n          \"data-id\": `${g}-${m}-${e}`,\n          className: yt([\n            \"react-flow__handle\",\n            `react-flow__handle-${t}`,\n            \"nodrag\",\n            v,\n            u,\n            {\n              source: !b,\n              target: b,\n              connectable: o,\n              connectablestart: r,\n              connectableend: i,\n              connecting: w,\n              // this class is used to style the handle when the user is connecting\n              connectionindicator: o && ((r && !S) || (i && S)),\n            },\n          ]),\n          onMouseDown: M,\n          onTouchStart: M,\n          onClick: x ? _ : void 0,\n          ref: h,\n          ...p,\n        },\n        s,\n      );\n    },\n  );\ne5.displayName = \"Handle\";\nvar Ft = Ke(e5);\nconst t5 = ({\n  data: e,\n  isConnectable: t,\n  targetPosition: n = ae.Top,\n  sourcePosition: o = ae.Bottom,\n}) =>\n  $.createElement(\n    $.Fragment,\n    null,\n    $.createElement(Ft, { type: \"target\", position: n, isConnectable: t }),\n    e == null ? void 0 : e.label,\n    $.createElement(Ft, { type: \"source\", position: o, isConnectable: t }),\n  );\nt5.displayName = \"DefaultNode\";\nvar Hs = Ke(t5);\nconst n5 = ({ data: e, isConnectable: t, sourcePosition: n = ae.Bottom }) =>\n  $.createElement(\n    $.Fragment,\n    null,\n    e == null ? void 0 : e.label,\n    $.createElement(Ft, { type: \"source\", position: n, isConnectable: t }),\n  );\nn5.displayName = \"InputNode\";\nvar o5 = Ke(n5);\nconst r5 = ({ data: e, isConnectable: t, targetPosition: n = ae.Top }) =>\n  $.createElement(\n    $.Fragment,\n    null,\n    $.createElement(Ft, { type: \"target\", position: n, isConnectable: t }),\n    e == null ? void 0 : e.label,\n  );\nr5.displayName = \"OutputNode\";\nvar i5 = Ke(r5);\nconst Zc = () => null;\nZc.displayName = \"GroupNode\";\nconst hb = (e) => ({\n    selectedNodes: e.getNodes().filter((t) => t.selected),\n    selectedEdges: e.edges.filter((t) => t.selected).map((t) => ({ ...t })),\n  }),\n  li = (e) => e.id;\nfunction pb(e, t) {\n  return (\n    ut(e.selectedNodes.map(li), t.selectedNodes.map(li)) &&\n    ut(e.selectedEdges.map(li), t.selectedEdges.map(li))\n  );\n}\nconst a5 = Ke(({ onSelectionChange: e }) => {\n  const t = rt(),\n    { selectedNodes: n, selectedEdges: o } = qe(hb, pb);\n  return (\n    ue(() => {\n      const r = { nodes: n, edges: o };\n      e == null || e(r), t.getState().onSelectionChange.forEach((i) => i(r));\n    }, [n, o, e]),\n    null\n  );\n});\na5.displayName = \"SelectionListener\";\nconst gb = (e) => !!e.onSelectionChange;\nfunction mb({ onSelectionChange: e }) {\n  const t = qe(gb);\n  return e || t ? $.createElement(a5, { onSelectionChange: e }) : null;\n}\nconst bb = (e) => ({\n  setNodes: e.setNodes,\n  setEdges: e.setEdges,\n  setDefaultNodesAndEdges: e.setDefaultNodesAndEdges,\n  setMinZoom: e.setMinZoom,\n  setMaxZoom: e.setMaxZoom,\n  setTranslateExtent: e.setTranslateExtent,\n  setNodeExtent: e.setNodeExtent,\n  reset: e.reset,\n});\nfunction co(e, t) {\n  ue(() => {\n    typeof e < \"u\" && t(e);\n  }, [e]);\n}\nfunction Ce(e, t, n) {\n  ue(() => {\n    typeof t < \"u\" && n({ [e]: t });\n  }, [t]);\n}\nconst yb = ({\n    nodes: e,\n    edges: t,\n    defaultNodes: n,\n    defaultEdges: o,\n    onConnect: r,\n    onConnectStart: i,\n    onConnectEnd: a,\n    onClickConnectStart: l,\n    onClickConnectEnd: s,\n    nodesDraggable: u,\n    nodesConnectable: c,\n    nodesFocusable: d,\n    edgesFocusable: p,\n    edgesUpdatable: h,\n    elevateNodesOnSelect: m,\n    minZoom: b,\n    maxZoom: y,\n    nodeExtent: g,\n    onNodesChange: x,\n    onEdgesChange: v,\n    elementsSelectable: S,\n    connectionMode: w,\n    snapGrid: E,\n    snapToGrid: M,\n    translateExtent: _,\n    connectOnClick: j,\n    defaultEdgeOptions: R,\n    fitView: D,\n    fitViewOptions: P,\n    onNodesDelete: V,\n    onEdgesDelete: k,\n    onNodeDrag: N,\n    onNodeDragStart: T,\n    onNodeDragStop: F,\n    onSelectionDrag: I,\n    onSelectionDragStart: L,\n    onSelectionDragStop: C,\n    noPanClassName: H,\n    nodeOrigin: B,\n    rfId: A,\n    autoPanOnConnect: W,\n    autoPanOnNodeDrag: G,\n    onError: K,\n    connectionRadius: Q,\n    isValidConnection: ne,\n    nodeDragThreshold: oe,\n  }) => {\n    const {\n        setNodes: U,\n        setEdges: ge,\n        setDefaultNodesAndEdges: J,\n        setMinZoom: _e,\n        setMaxZoom: ie,\n        setTranslateExtent: Ae,\n        setNodeExtent: We,\n        reset: Ee,\n      } = qe(bb, ut),\n      le = rt();\n    return (\n      ue(() => {\n        const Qe = o == null ? void 0 : o.map((Lt) => ({ ...Lt, ...R }));\n        return (\n          J(n, Qe),\n          () => {\n            Ee();\n          }\n        );\n      }, []),\n      Ce(\"defaultEdgeOptions\", R, le.setState),\n      Ce(\"connectionMode\", w, le.setState),\n      Ce(\"onConnect\", r, le.setState),\n      Ce(\"onConnectStart\", i, le.setState),\n      Ce(\"onConnectEnd\", a, le.setState),\n      Ce(\"onClickConnectStart\", l, le.setState),\n      Ce(\"onClickConnectEnd\", s, le.setState),\n      Ce(\"nodesDraggable\", u, le.setState),\n      Ce(\"nodesConnectable\", c, le.setState),\n      Ce(\"nodesFocusable\", d, le.setState),\n      Ce(\"edgesFocusable\", p, le.setState),\n      Ce(\"edgesUpdatable\", h, le.setState),\n      Ce(\"elementsSelectable\", S, le.setState),\n      Ce(\"elevateNodesOnSelect\", m, le.setState),\n      Ce(\"snapToGrid\", M, le.setState),\n      Ce(\"snapGrid\", E, le.setState),\n      Ce(\"onNodesChange\", x, le.setState),\n      Ce(\"onEdgesChange\", v, le.setState),\n      Ce(\"connectOnClick\", j, le.setState),\n      Ce(\"fitViewOnInit\", D, le.setState),\n      Ce(\"fitViewOnInitOptions\", P, le.setState),\n      Ce(\"onNodesDelete\", V, le.setState),\n      Ce(\"onEdgesDelete\", k, le.setState),\n      Ce(\"onNodeDrag\", N, le.setState),\n      Ce(\"onNodeDragStart\", T, le.setState),\n      Ce(\"onNodeDragStop\", F, le.setState),\n      Ce(\"onSelectionDrag\", I, le.setState),\n      Ce(\"onSelectionDragStart\", L, le.setState),\n      Ce(\"onSelectionDragStop\", C, le.setState),\n      Ce(\"noPanClassName\", H, le.setState),\n      Ce(\"nodeOrigin\", B, le.setState),\n      Ce(\"rfId\", A, le.setState),\n      Ce(\"autoPanOnConnect\", W, le.setState),\n      Ce(\"autoPanOnNodeDrag\", G, le.setState),\n      Ce(\"onError\", K, le.setState),\n      Ce(\"connectionRadius\", Q, le.setState),\n      Ce(\"isValidConnection\", ne, le.setState),\n      Ce(\"nodeDragThreshold\", oe, le.setState),\n      co(e, U),\n      co(t, ge),\n      co(b, _e),\n      co(y, ie),\n      co(_, Ae),\n      co(g, We),\n      null\n    );\n  },\n  Pu = { display: \"none\" },\n  Cb = {\n    position: \"absolute\",\n    width: 1,\n    height: 1,\n    margin: -1,\n    border: 0,\n    padding: 0,\n    overflow: \"hidden\",\n    clip: \"rect(0px, 0px, 0px, 0px)\",\n    clipPath: \"inset(100%)\",\n  },\n  l5 = \"react-flow__node-desc\",\n  s5 = \"react-flow__edge-desc\",\n  vb = \"react-flow__aria-live\",\n  xb = (e) => e.ariaLiveMessage;\nfunction wb({ rfId: e }) {\n  const t = qe(xb);\n  return $.createElement(\n    \"div\",\n    {\n      id: `${vb}-${e}`,\n      \"aria-live\": \"assertive\",\n      \"aria-atomic\": \"true\",\n      style: Cb,\n    },\n    t,\n  );\n}\nfunction Eb({ rfId: e, disableKeyboardA11y: t }) {\n  return $.createElement(\n    $.Fragment,\n    null,\n    $.createElement(\n      \"div\",\n      { id: `${l5}-${e}`, style: Pu },\n      \"Press enter or space to select a node.\",\n      !t && \"You can then use the arrow keys to move the node around.\",\n      \" Press delete to remove it and escape to cancel.\",\n      \" \",\n    ),\n    $.createElement(\n      \"div\",\n      { id: `${s5}-${e}`, style: Pu },\n      \"Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.\",\n    ),\n    !t && $.createElement(wb, { rfId: e }),\n  );\n}\nvar kr = (e = null, t = { actInsideInputWithModifier: !0 }) => {\n  const [n, o] = se(!1),\n    r = he(!1),\n    i = he(/* @__PURE__ */ new Set([])),\n    [a, l] = ze(() => {\n      if (e !== null) {\n        const u = (Array.isArray(e) ? e : [e])\n            .filter((d) => typeof d == \"string\")\n            .map((d) => d.split(\"+\")),\n          c = u.reduce((d, p) => d.concat(...p), []);\n        return [u, c];\n      }\n      return [[], []];\n    }, [e]);\n  return (\n    ue(() => {\n      const s = typeof document < \"u\" ? document : null,\n        u = (t == null ? void 0 : t.target) || s;\n      if (e !== null) {\n        const c = (h) => {\n            if (\n              ((r.current = h.ctrlKey || h.metaKey || h.shiftKey),\n              (!r.current || (r.current && !t.actInsideInputWithModifier)) &&\n                js(h))\n            )\n              return !1;\n            const b = Vu(h.code, l);\n            i.current.add(h[b]),\n              Bu(a, i.current, !1) && (h.preventDefault(), o(!0));\n          },\n          d = (h) => {\n            if (\n              (!r.current || (r.current && !t.actInsideInputWithModifier)) &&\n              js(h)\n            )\n              return !1;\n            const b = Vu(h.code, l);\n            Bu(a, i.current, !0)\n              ? (o(!1), i.current.clear())\n              : i.current.delete(h[b]),\n              h.key === \"Meta\" && i.current.clear(),\n              (r.current = !1);\n          },\n          p = () => {\n            i.current.clear(), o(!1);\n          };\n        return (\n          u == null || u.addEventListener(\"keydown\", c),\n          u == null || u.addEventListener(\"keyup\", d),\n          window.addEventListener(\"blur\", p),\n          () => {\n            u == null || u.removeEventListener(\"keydown\", c),\n              u == null || u.removeEventListener(\"keyup\", d),\n              window.removeEventListener(\"blur\", p);\n          }\n        );\n      }\n    }, [e, o]),\n    n\n  );\n};\nfunction Bu(e, t, n) {\n  return e\n    .filter((o) => n || o.length === t.size)\n    .some((o) => o.every((r) => t.has(r)));\n}\nfunction Vu(e, t) {\n  return t.includes(e) ? \"code\" : \"key\";\n}\nfunction c5(e, t, n, o) {\n  var l, s;\n  const r = e.parentNode || e.parentId;\n  if (!r) return n;\n  const i = t.get(r),\n    a = vo(i, o);\n  return c5(\n    i,\n    t,\n    {\n      x: (n.x ?? 0) + a.x,\n      y: (n.y ?? 0) + a.y,\n      z:\n        (((l = i[Ge]) == null ? void 0 : l.z) ?? 0) > (n.z ?? 0)\n          ? (((s = i[Ge]) == null ? void 0 : s.z) ?? 0)\n          : (n.z ?? 0),\n    },\n    o,\n  );\n}\nfunction u5(e, t, n) {\n  e.forEach((o) => {\n    var i;\n    const r = o.parentNode || o.parentId;\n    if (r && !e.has(r)) throw new Error(`Parent node ${r} not found`);\n    if (r || (n != null && n[o.id])) {\n      const {\n        x: a,\n        y: l,\n        z: s,\n      } = c5(\n        o,\n        e,\n        {\n          ...o.position,\n          z: ((i = o[Ge]) == null ? void 0 : i.z) ?? 0,\n        },\n        t,\n      );\n      (o.positionAbsolute = {\n        x: a,\n        y: l,\n      }),\n        (o[Ge].z = s),\n        n != null && n[o.id] && (o[Ge].isParent = !0);\n    }\n  });\n}\nfunction $l(e, t, n, o) {\n  const r = /* @__PURE__ */ new Map(),\n    i = {},\n    a = o ? 1e3 : 0;\n  return (\n    e.forEach((l) => {\n      var h;\n      const s = (Ht(l.zIndex) ? l.zIndex : 0) + (l.selected ? a : 0),\n        u = t.get(l.id),\n        c = {\n          ...l,\n          positionAbsolute: {\n            x: l.position.x,\n            y: l.position.y,\n          },\n        },\n        d = l.parentNode || l.parentId;\n      d && (i[d] = !0);\n      const p =\n        (u == null ? void 0 : u.type) &&\n        (u == null ? void 0 : u.type) !== l.type;\n      Object.defineProperty(c, Ge, {\n        enumerable: !1,\n        value: {\n          handleBounds:\n            p || (h = u == null ? void 0 : u[Ge]) == null\n              ? void 0\n              : h.handleBounds,\n          z: s,\n        },\n      }),\n        r.set(l.id, c);\n    }),\n    u5(r, n, i),\n    r\n  );\n}\nfunction d5(e, t = {}) {\n  const {\n      getNodes: n,\n      width: o,\n      height: r,\n      minZoom: i,\n      maxZoom: a,\n      d3Zoom: l,\n      d3Selection: s,\n      fitViewOnInitDone: u,\n      fitViewOnInit: c,\n      nodeOrigin: d,\n    } = e(),\n    p = t.initial && !u && c;\n  if (l && s && (p || !t.initial)) {\n    const m = n().filter((y) => {\n        var x;\n        const g = t.includeHiddenNodes ? y.width && y.height : !y.hidden;\n        return (x = t.nodes) != null && x.length\n          ? g && t.nodes.some((v) => v.id === y.id)\n          : g;\n      }),\n      b = m.every((y) => y.width && y.height);\n    if (m.length > 0 && b) {\n      const y = $c(m, d),\n        {\n          x: g,\n          y: x,\n          zoom: v,\n        } = K3(y, o, r, t.minZoom ?? i, t.maxZoom ?? a, t.padding ?? 0.1),\n        S = Fn.translate(g, x).scale(v);\n      return (\n        typeof t.duration == \"number\" && t.duration > 0\n          ? l.transform(Vn(s, t.duration), S)\n          : l.transform(s, S),\n        !0\n      );\n    }\n  }\n  return !1;\n}\nfunction Sb(e, t) {\n  return (\n    e.forEach((n) => {\n      const o = t.get(n.id);\n      o &&\n        t.set(o.id, {\n          ...o,\n          [Ge]: o[Ge],\n          selected: n.selected,\n        });\n    }),\n    new Map(t)\n  );\n}\nfunction kb(e, t) {\n  return t.map((n) => {\n    const o = e.find((r) => r.id === n.id);\n    return o && (n.selected = o.selected), n;\n  });\n}\nfunction si({ changedNodes: e, changedEdges: t, get: n, set: o }) {\n  const {\n    nodeInternals: r,\n    edges: i,\n    onNodesChange: a,\n    onEdgesChange: l,\n    hasDefaultNodes: s,\n    hasDefaultEdges: u,\n  } = n();\n  e != null &&\n    e.length &&\n    (s && o({ nodeInternals: Sb(e, r) }), a == null || a(e)),\n    t != null && t.length && (u && o({ edges: kb(t, i) }), l == null || l(t));\n}\nconst uo = () => {},\n  _b = {\n    zoomIn: uo,\n    zoomOut: uo,\n    zoomTo: uo,\n    getZoom: () => 1,\n    setViewport: uo,\n    getViewport: () => ({ x: 0, y: 0, zoom: 1 }),\n    fitView: () => !1,\n    setCenter: uo,\n    fitBounds: uo,\n    project: (e) => e,\n    screenToFlowPosition: (e) => e,\n    flowToScreenPosition: (e) => e,\n    viewportInitialized: !1,\n  },\n  Ab = (e) => ({\n    d3Zoom: e.d3Zoom,\n    d3Selection: e.d3Selection,\n  }),\n  Mb = () => {\n    const e = rt(),\n      { d3Zoom: t, d3Selection: n } = qe(Ab, ut);\n    return ze(\n      () =>\n        n && t\n          ? {\n              zoomIn: (r) =>\n                t.scaleBy(Vn(n, r == null ? void 0 : r.duration), 1.2),\n              zoomOut: (r) =>\n                t.scaleBy(Vn(n, r == null ? void 0 : r.duration), 1 / 1.2),\n              zoomTo: (r, i) =>\n                t.scaleTo(Vn(n, i == null ? void 0 : i.duration), r),\n              getZoom: () => e.getState().transform[2],\n              setViewport: (r, i) => {\n                const [a, l, s] = e.getState().transform,\n                  u = Fn.translate(r.x ?? a, r.y ?? l).scale(r.zoom ?? s);\n                t.transform(Vn(n, i == null ? void 0 : i.duration), u);\n              },\n              getViewport: () => {\n                const [r, i, a] = e.getState().transform;\n                return { x: r, y: i, zoom: a };\n              },\n              fitView: (r) => d5(e.getState, r),\n              setCenter: (r, i, a) => {\n                const { width: l, height: s, maxZoom: u } = e.getState(),\n                  c = typeof (a == null ? void 0 : a.zoom) < \"u\" ? a.zoom : u,\n                  d = l / 2 - r * c,\n                  p = s / 2 - i * c,\n                  h = Fn.translate(d, p).scale(c);\n                t.transform(Vn(n, a == null ? void 0 : a.duration), h);\n              },\n              fitBounds: (r, i) => {\n                const {\n                    width: a,\n                    height: l,\n                    minZoom: s,\n                    maxZoom: u,\n                  } = e.getState(),\n                  {\n                    x: c,\n                    y: d,\n                    zoom: p,\n                  } = K3(\n                    r,\n                    a,\n                    l,\n                    s,\n                    u,\n                    (i == null ? void 0 : i.padding) ?? 0.1,\n                  ),\n                  h = Fn.translate(c, d).scale(p);\n                t.transform(Vn(n, i == null ? void 0 : i.duration), h);\n              },\n              // @deprecated Use `screenToFlowPosition`.\n              project: (r) => {\n                const {\n                  transform: i,\n                  snapToGrid: a,\n                  snapGrid: l,\n                } = e.getState();\n                return (\n                  console.warn(\n                    \"[DEPRECATED] `project` is deprecated. Instead use `screenToFlowPosition`. There is no need to subtract the react flow bounds anymore! https://reactflow.dev/api-reference/types/react-flow-instance#screen-to-flow-position\",\n                  ),\n                  Is(r, i, a, l)\n                );\n              },\n              screenToFlowPosition: (r) => {\n                const {\n                  transform: i,\n                  snapToGrid: a,\n                  snapGrid: l,\n                  domNode: s,\n                } = e.getState();\n                if (!s) return r;\n                const { x: u, y: c } = s.getBoundingClientRect(),\n                  d = {\n                    x: r.x - u,\n                    y: r.y - c,\n                  };\n                return Is(d, i, a, l);\n              },\n              flowToScreenPosition: (r) => {\n                const { transform: i, domNode: a } = e.getState();\n                if (!a) return r;\n                const { x: l, y: s } = a.getBoundingClientRect(),\n                  u = q3(r, i);\n                return {\n                  x: u.x + l,\n                  y: u.y + s,\n                };\n              },\n              viewportInitialized: !0,\n            }\n          : _b,\n      [t, n],\n    );\n  };\nfunction tn() {\n  const e = Mb(),\n    t = rt(),\n    n = Oe(\n      () =>\n        t\n          .getState()\n          .getNodes()\n          .map((b) => ({ ...b })),\n      [],\n    ),\n    o = Oe((b) => t.getState().nodeInternals.get(b), []),\n    r = Oe(() => {\n      const { edges: b = [] } = t.getState();\n      return b.map((y) => ({ ...y }));\n    }, []),\n    i = Oe((b) => {\n      const { edges: y = [] } = t.getState();\n      return y.find((g) => g.id === b);\n    }, []),\n    a = Oe((b) => {\n      const {\n          getNodes: y,\n          setNodes: g,\n          hasDefaultNodes: x,\n          onNodesChange: v,\n        } = t.getState(),\n        S = y(),\n        w = typeof b == \"function\" ? b(S) : b;\n      if (x) g(w);\n      else if (v) {\n        const E =\n          w.length === 0\n            ? S.map((M) => ({ type: \"remove\", id: M.id }))\n            : w.map((M) => ({ item: M, type: \"reset\" }));\n        v(E);\n      }\n    }, []),\n    l = Oe((b) => {\n      const {\n          edges: y = [],\n          setEdges: g,\n          hasDefaultEdges: x,\n          onEdgesChange: v,\n        } = t.getState(),\n        S = typeof b == \"function\" ? b(y) : b;\n      if (x) g(S);\n      else if (v) {\n        const w =\n          S.length === 0\n            ? y.map((E) => ({ type: \"remove\", id: E.id }))\n            : S.map((E) => ({ item: E, type: \"reset\" }));\n        v(w);\n      }\n    }, []),\n    s = Oe((b) => {\n      const y = Array.isArray(b) ? b : [b],\n        {\n          getNodes: g,\n          setNodes: x,\n          hasDefaultNodes: v,\n          onNodesChange: S,\n        } = t.getState();\n      if (v) {\n        const E = [...g(), ...y];\n        x(E);\n      } else if (S) {\n        const w = y.map((E) => ({ item: E, type: \"add\" }));\n        S(w);\n      }\n    }, []),\n    u = Oe((b) => {\n      const y = Array.isArray(b) ? b : [b],\n        {\n          edges: g = [],\n          setEdges: x,\n          hasDefaultEdges: v,\n          onEdgesChange: S,\n        } = t.getState();\n      if (v) x([...g, ...y]);\n      else if (S) {\n        const w = y.map((E) => ({ item: E, type: \"add\" }));\n        S(w);\n      }\n    }, []),\n    c = Oe(() => {\n      const { getNodes: b, edges: y = [], transform: g } = t.getState(),\n        [x, v, S] = g;\n      return {\n        nodes: b().map((w) => ({ ...w })),\n        edges: y.map((w) => ({ ...w })),\n        viewport: {\n          x,\n          y: v,\n          zoom: S,\n        },\n      };\n    }, []),\n    d = Oe(({ nodes: b, edges: y }) => {\n      const {\n          nodeInternals: g,\n          getNodes: x,\n          edges: v,\n          hasDefaultNodes: S,\n          hasDefaultEdges: w,\n          onNodesDelete: E,\n          onEdgesDelete: M,\n          onNodesChange: _,\n          onEdgesChange: j,\n        } = t.getState(),\n        R = (b || []).map((N) => N.id),\n        D = (y || []).map((N) => N.id),\n        P = x().reduce((N, T) => {\n          const F = T.parentNode || T.parentId,\n            I = !R.includes(T.id) && F && N.find((C) => C.id === F);\n          return (\n            (typeof T.deletable == \"boolean\" ? T.deletable : !0) &&\n              (R.includes(T.id) || I) &&\n              N.push(T),\n            N\n          );\n        }, []),\n        V = v.filter((N) =>\n          typeof N.deletable == \"boolean\" ? N.deletable : !0,\n        ),\n        k = V.filter((N) => D.includes(N.id));\n      if (P || k) {\n        const N = G3(P, V),\n          T = [...k, ...N],\n          F = T.reduce((I, L) => (I.includes(L.id) || I.push(L.id), I), []);\n        if (\n          ((w || S) &&\n            (w &&\n              t.setState({\n                edges: v.filter((I) => !F.includes(I.id)),\n              }),\n            S &&\n              (P.forEach((I) => {\n                g.delete(I.id);\n              }),\n              t.setState({\n                nodeInternals: new Map(g),\n              }))),\n          F.length > 0 &&\n            (M == null || M(T),\n            j &&\n              j(\n                F.map((I) => ({\n                  id: I,\n                  type: \"remove\",\n                })),\n              )),\n          P.length > 0 && (E == null || E(P), _))\n        ) {\n          const I = P.map((L) => ({ id: L.id, type: \"remove\" }));\n          _(I);\n        }\n      }\n    }, []),\n    p = Oe((b) => {\n      const y = Ym(b),\n        g = y ? null : t.getState().nodeInternals.get(b.id);\n      return !y && !g ? [null, null, y] : [y ? b : Du(g), g, y];\n    }, []),\n    h = Oe((b, y = !0, g) => {\n      const [x, v, S] = p(b);\n      return x\n        ? (g || t.getState().getNodes()).filter((w) => {\n            if (!S && (w.id === v.id || !w.positionAbsolute)) return !1;\n            const E = Du(w),\n              M = Ds(E, x);\n            return (y && M > 0) || M >= x.width * x.height;\n          })\n        : [];\n    }, []),\n    m = Oe((b, y, g = !0) => {\n      const [x] = p(b);\n      if (!x) return !1;\n      const v = Ds(x, y);\n      return (g && v > 0) || v >= x.width * x.height;\n    }, []);\n  return ze(\n    () => ({\n      ...e,\n      getNodes: n,\n      getNode: o,\n      getEdges: r,\n      getEdge: i,\n      setNodes: a,\n      setEdges: l,\n      addNodes: s,\n      addEdges: u,\n      toObject: c,\n      deleteElements: d,\n      getIntersectingNodes: h,\n      isNodeIntersecting: m,\n    }),\n    [e, n, o, r, i, a, l, s, u, c, d, h, m],\n  );\n}\nconst Tb = { actInsideInputWithModifier: !1 };\nvar Ob = ({ deleteKeyCode: e, multiSelectionKeyCode: t }) => {\n  const n = rt(),\n    { deleteElements: o } = tn(),\n    r = kr(e, Tb),\n    i = kr(t);\n  ue(() => {\n    if (r) {\n      const { edges: a, getNodes: l } = n.getState(),\n        s = l().filter((c) => c.selected),\n        u = a.filter((c) => c.selected);\n      o({ nodes: s, edges: u }), n.setState({ nodesSelectionActive: !1 });\n    }\n  }, [r]),\n    ue(() => {\n      n.setState({ multiSelectionActive: i });\n    }, [i]);\n};\nfunction Nb(e) {\n  const t = rt();\n  ue(() => {\n    let n;\n    const o = () => {\n      var i, a;\n      if (!e.current) return;\n      const r = Rc(e.current);\n      (r.height === 0 || r.width === 0) &&\n        ((a = (i = t.getState()).onError) == null ||\n          a.call(i, \"004\", Jt.error004())),\n        t.setState({ width: r.width || 500, height: r.height || 500 });\n    };\n    return (\n      o(),\n      window.addEventListener(\"resize\", o),\n      e.current && ((n = new ResizeObserver(() => o())), n.observe(e.current)),\n      () => {\n        window.removeEventListener(\"resize\", o),\n          n && e.current && n.unobserve(e.current);\n      }\n    );\n  }, []);\n}\nconst Uc = {\n    position: \"absolute\",\n    width: \"100%\",\n    height: \"100%\",\n    top: 0,\n    left: 0,\n  },\n  Lb = (e, t) => e.x !== t.x || e.y !== t.y || e.zoom !== t.k,\n  ci = (e) => ({\n    x: e.x,\n    y: e.y,\n    zoom: e.k,\n  }),\n  fo = (e, t) => e.target.closest(`.${t}`),\n  $u = (e, t) => t === 2 && Array.isArray(e) && e.includes(2),\n  Wu = (e) => {\n    const t = e.ctrlKey && $i() ? 10 : 1;\n    return -e.deltaY * (e.deltaMode === 1 ? 0.05 : e.deltaMode ? 1 : 2e-3) * t;\n  },\n  Db = (e) => ({\n    d3Zoom: e.d3Zoom,\n    d3Selection: e.d3Selection,\n    d3ZoomHandler: e.d3ZoomHandler,\n    userSelectionActive: e.userSelectionActive,\n  }),\n  jb = ({\n    onMove: e,\n    onMoveStart: t,\n    onMoveEnd: n,\n    onPaneContextMenu: o,\n    zoomOnScroll: r = !0,\n    zoomOnPinch: i = !0,\n    panOnScroll: a = !1,\n    panOnScrollSpeed: l = 0.5,\n    panOnScrollMode: s = Yn.Free,\n    zoomOnDoubleClick: u = !0,\n    elementsSelectable: c,\n    panOnDrag: d = !0,\n    defaultViewport: p,\n    translateExtent: h,\n    minZoom: m,\n    maxZoom: b,\n    zoomActivationKeyCode: y,\n    preventScrolling: g = !0,\n    children: x,\n    noWheelClassName: v,\n    noPanClassName: S,\n  }) => {\n    const w = he(),\n      E = rt(),\n      M = he(!1),\n      _ = he(!1),\n      j = he(null),\n      R = he({ x: 0, y: 0, zoom: 0 }),\n      {\n        d3Zoom: D,\n        d3Selection: P,\n        d3ZoomHandler: V,\n        userSelectionActive: k,\n      } = qe(Db, ut),\n      N = kr(y),\n      T = he(0),\n      F = he(!1),\n      I = he();\n    return (\n      Nb(j),\n      ue(() => {\n        if (j.current) {\n          const L = j.current.getBoundingClientRect(),\n            C = Pm().scaleExtent([m, b]).translateExtent(h),\n            H = Yt(j.current).call(C),\n            B = Fn.translate(p.x, p.y).scale(Lo(p.zoom, m, b)),\n            A = [\n              [0, 0],\n              [L.width, L.height],\n            ],\n            W = C.constrain()(B, A, h);\n          C.transform(H, W),\n            C.wheelDelta(Wu),\n            E.setState({\n              d3Zoom: C,\n              d3Selection: H,\n              d3ZoomHandler: H.on(\"wheel.zoom\"),\n              // we need to pass transform because zoom handler is not registered when we set the initial transform\n              transform: [W.x, W.y, W.k],\n              domNode: j.current.closest(\".react-flow\"),\n            });\n        }\n      }, []),\n      ue(() => {\n        P &&\n          D &&\n          (a && !N && !k\n            ? P.on(\n                \"wheel.zoom\",\n                (L) => {\n                  if (fo(L, v)) return !1;\n                  L.preventDefault(), L.stopImmediatePropagation();\n                  const C = P.property(\"__zoom\").k || 1;\n                  if (L.ctrlKey && i) {\n                    const ne = ln(L),\n                      oe = Wu(L),\n                      U = C * Math.pow(2, oe);\n                    D.scaleTo(P, U, ne, L);\n                    return;\n                  }\n                  const H = L.deltaMode === 1 ? 20 : 1;\n                  let B = s === Yn.Vertical ? 0 : L.deltaX * H,\n                    A = s === Yn.Horizontal ? 0 : L.deltaY * H;\n                  !$i() &&\n                    L.shiftKey &&\n                    s !== Yn.Vertical &&\n                    ((B = L.deltaY * H), (A = 0)),\n                    D.translateBy(\n                      P,\n                      -(B / C) * l,\n                      -(A / C) * l,\n                      // @ts-ignore\n                      { internal: !0 },\n                    );\n                  const W = ci(P.property(\"__zoom\")),\n                    {\n                      onViewportChangeStart: G,\n                      onViewportChange: K,\n                      onViewportChangeEnd: Q,\n                    } = E.getState();\n                  clearTimeout(I.current),\n                    F.current ||\n                      ((F.current = !0),\n                      t == null || t(L, W),\n                      G == null || G(W)),\n                    F.current &&\n                      (e == null || e(L, W),\n                      K == null || K(W),\n                      (I.current = setTimeout(() => {\n                        n == null || n(L, W),\n                          Q == null || Q(W),\n                          (F.current = !1);\n                      }, 150)));\n                },\n                { passive: !1 },\n              )\n            : typeof V < \"u\" &&\n              P.on(\n                \"wheel.zoom\",\n                function (L, C) {\n                  if ((!g && L.type === \"wheel\" && !L.ctrlKey) || fo(L, v))\n                    return null;\n                  L.preventDefault(), V.call(this, L, C);\n                },\n                { passive: !1 },\n              ));\n      }, [k, a, s, P, D, V, N, i, g, v, t, e, n]),\n      ue(() => {\n        D &&\n          D.on(\"start\", (L) => {\n            var B, A;\n            if (!L.sourceEvent || L.sourceEvent.internal) return null;\n            T.current = (B = L.sourceEvent) == null ? void 0 : B.button;\n            const { onViewportChangeStart: C } = E.getState(),\n              H = ci(L.transform);\n            (M.current = !0),\n              (R.current = H),\n              ((A = L.sourceEvent) == null ? void 0 : A.type) === \"mousedown\" &&\n                E.setState({ paneDragging: !0 }),\n              C == null || C(H),\n              t == null || t(L.sourceEvent, H);\n          });\n      }, [D, t]),\n      ue(() => {\n        D &&\n          (k && !M.current\n            ? D.on(\"zoom\", null)\n            : k ||\n              D.on(\"zoom\", (L) => {\n                var H;\n                const { onViewportChange: C } = E.getState();\n                if (\n                  (E.setState({\n                    transform: [L.transform.x, L.transform.y, L.transform.k],\n                  }),\n                  (_.current = !!(o && $u(d, T.current ?? 0))),\n                  (e || C) && !((H = L.sourceEvent) != null && H.internal))\n                ) {\n                  const B = ci(L.transform);\n                  C == null || C(B), e == null || e(L.sourceEvent, B);\n                }\n              }));\n      }, [k, D, e, d, o]),\n      ue(() => {\n        D &&\n          D.on(\"end\", (L) => {\n            if (!L.sourceEvent || L.sourceEvent.internal) return null;\n            const { onViewportChangeEnd: C } = E.getState();\n            if (\n              ((M.current = !1),\n              E.setState({ paneDragging: !1 }),\n              o && $u(d, T.current ?? 0) && !_.current && o(L.sourceEvent),\n              (_.current = !1),\n              (n || C) && Lb(R.current, L.transform))\n            ) {\n              const H = ci(L.transform);\n              (R.current = H),\n                clearTimeout(w.current),\n                (w.current = setTimeout(\n                  () => {\n                    C == null || C(H), n == null || n(L.sourceEvent, H);\n                  },\n                  a ? 150 : 0,\n                ));\n            }\n          });\n      }, [D, a, d, n, o]),\n      ue(() => {\n        D &&\n          D.filter((L) => {\n            const C = N || r,\n              H = i && L.ctrlKey;\n            if (\n              (d === !0 || (Array.isArray(d) && d.includes(1))) &&\n              L.button === 1 &&\n              L.type === \"mousedown\" &&\n              (fo(L, \"react-flow__node\") || fo(L, \"react-flow__edge\"))\n            )\n              return !0;\n            if (\n              (!d && !C && !a && !u && !i) ||\n              k ||\n              (!u && L.type === \"dblclick\") ||\n              (fo(L, v) && L.type === \"wheel\") ||\n              (fo(L, S) &&\n                (L.type !== \"wheel\" || (a && L.type === \"wheel\" && !N))) ||\n              (!i && L.ctrlKey && L.type === \"wheel\") ||\n              (!C && !a && !H && L.type === \"wheel\") ||\n              (!d && (L.type === \"mousedown\" || L.type === \"touchstart\")) ||\n              (Array.isArray(d) &&\n                !d.includes(L.button) &&\n                L.type === \"mousedown\")\n            )\n              return !1;\n            const B =\n              (Array.isArray(d) && d.includes(L.button)) ||\n              !L.button ||\n              L.button <= 1;\n            return (!L.ctrlKey || L.type === \"wheel\") && B;\n          });\n      }, [k, D, r, i, a, u, d, c, N]),\n      $.createElement(\n        \"div\",\n        { className: \"react-flow__renderer\", ref: j, style: Uc },\n        x,\n      )\n    );\n  },\n  Fb = (e) => ({\n    userSelectionActive: e.userSelectionActive,\n    userSelectionRect: e.userSelectionRect,\n  });\nfunction Rb() {\n  const { userSelectionActive: e, userSelectionRect: t } = qe(Fb, ut);\n  return e && t\n    ? $.createElement(\"div\", {\n        className: \"react-flow__selection react-flow__container\",\n        style: {\n          width: t.width,\n          height: t.height,\n          transform: `translate(${t.x}px, ${t.y}px)`,\n        },\n      })\n    : null;\n}\nfunction Zu(e, t) {\n  const n = t.parentNode || t.parentId,\n    o = e.find((r) => r.id === n);\n  if (o) {\n    const r = t.position.x + t.width - o.width,\n      i = t.position.y + t.height - o.height;\n    if (r > 0 || i > 0 || t.position.x < 0 || t.position.y < 0) {\n      if (\n        ((o.style = { ...o.style }),\n        (o.style.width = o.style.width ?? o.width),\n        (o.style.height = o.style.height ?? o.height),\n        r > 0 && (o.style.width += r),\n        i > 0 && (o.style.height += i),\n        t.position.x < 0)\n      ) {\n        const a = Math.abs(t.position.x);\n        (o.position.x = o.position.x - a),\n          (o.style.width += a),\n          (t.position.x = 0);\n      }\n      if (t.position.y < 0) {\n        const a = Math.abs(t.position.y);\n        (o.position.y = o.position.y - a),\n          (o.style.height += a),\n          (t.position.y = 0);\n      }\n      (o.width = o.style.width), (o.height = o.style.height);\n    }\n  }\n}\nfunction Ib(e, t) {\n  if (e.some((o) => o.type === \"reset\"))\n    return e.filter((o) => o.type === \"reset\").map((o) => o.item);\n  const n = e.filter((o) => o.type === \"add\").map((o) => o.item);\n  return t.reduce((o, r) => {\n    const i = e.filter((l) => l.id === r.id);\n    if (i.length === 0) return o.push(r), o;\n    const a = { ...r };\n    for (const l of i)\n      if (l)\n        switch (l.type) {\n          case \"select\": {\n            a.selected = l.selected;\n            break;\n          }\n          case \"position\": {\n            typeof l.position < \"u\" && (a.position = l.position),\n              typeof l.positionAbsolute < \"u\" &&\n                (a.positionAbsolute = l.positionAbsolute),\n              typeof l.dragging < \"u\" && (a.dragging = l.dragging),\n              a.expandParent && Zu(o, a);\n            break;\n          }\n          case \"dimensions\": {\n            typeof l.dimensions < \"u\" &&\n              ((a.width = l.dimensions.width),\n              (a.height = l.dimensions.height)),\n              typeof l.updateStyle < \"u\" &&\n                (a.style = { ...(a.style || {}), ...l.dimensions }),\n              typeof l.resizing == \"boolean\" && (a.resizing = l.resizing),\n              a.expandParent && Zu(o, a);\n            break;\n          }\n          case \"remove\":\n            return o;\n        }\n    return o.push(a), o;\n  }, n);\n}\nfunction Hb(e, t) {\n  return Ib(e, t);\n}\nconst Ln = (e, t) => ({\n  id: e,\n  type: \"select\",\n  selected: t,\n});\nfunction go(e, t) {\n  return e.reduce((n, o) => {\n    const r = t.includes(o.id);\n    return (\n      !o.selected && r\n        ? ((o.selected = !0), n.push(Ln(o.id, !0)))\n        : o.selected && !r && ((o.selected = !1), n.push(Ln(o.id, !1))),\n      n\n    );\n  }, []);\n}\nconst Wl = (e, t) => (n) => {\n    n.target === t.current && (e == null || e(n));\n  },\n  zb = (e) => ({\n    userSelectionActive: e.userSelectionActive,\n    elementsSelectable: e.elementsSelectable,\n    dragging: e.paneDragging,\n  }),\n  f5 = Ke(\n    ({\n      isSelecting: e,\n      selectionMode: t = Sr.Full,\n      panOnDrag: n,\n      onSelectionStart: o,\n      onSelectionEnd: r,\n      onPaneClick: i,\n      onPaneContextMenu: a,\n      onPaneScroll: l,\n      onPaneMouseEnter: s,\n      onPaneMouseMove: u,\n      onPaneMouseLeave: c,\n      children: d,\n    }) => {\n      const p = he(null),\n        h = rt(),\n        m = he(0),\n        b = he(0),\n        y = he(),\n        {\n          userSelectionActive: g,\n          elementsSelectable: x,\n          dragging: v,\n        } = qe(zb, ut),\n        S = () => {\n          h.setState({ userSelectionActive: !1, userSelectionRect: null }),\n            (m.current = 0),\n            (b.current = 0);\n        },\n        w = (V) => {\n          i == null || i(V),\n            h.getState().resetSelectedElements(),\n            h.setState({ nodesSelectionActive: !1 });\n        },\n        E = (V) => {\n          if (Array.isArray(n) && n != null && n.includes(2)) {\n            V.preventDefault();\n            return;\n          }\n          a == null || a(V);\n        },\n        M = l ? (V) => l(V) : void 0,\n        _ = (V) => {\n          const { resetSelectedElements: k, domNode: N } = h.getState();\n          if (\n            ((y.current = N == null ? void 0 : N.getBoundingClientRect()),\n            !x || !e || V.button !== 0 || V.target !== p.current || !y.current)\n          )\n            return;\n          const { x: T, y: F } = Rn(V, y.current);\n          k(),\n            h.setState({\n              userSelectionRect: {\n                width: 0,\n                height: 0,\n                startX: T,\n                startY: F,\n                x: T,\n                y: F,\n              },\n            }),\n            o == null || o(V);\n        },\n        j = (V) => {\n          const {\n            userSelectionRect: k,\n            nodeInternals: N,\n            edges: T,\n            transform: F,\n            onNodesChange: I,\n            onEdgesChange: L,\n            nodeOrigin: C,\n            getNodes: H,\n          } = h.getState();\n          if (!e || !y.current || !k) return;\n          h.setState({ userSelectionActive: !0, nodesSelectionActive: !1 });\n          const B = Rn(V, y.current),\n            A = k.startX ?? 0,\n            W = k.startY ?? 0,\n            G = {\n              ...k,\n              x: B.x < A ? B.x : A,\n              y: B.y < W ? B.y : W,\n              width: Math.abs(B.x - A),\n              height: Math.abs(B.y - W),\n            },\n            K = H(),\n            Q = Y3(N, G, F, t === Sr.Partial, !0, C),\n            ne = G3(Q, T).map((U) => U.id),\n            oe = Q.map((U) => U.id);\n          if (m.current !== oe.length) {\n            m.current = oe.length;\n            const U = go(K, oe);\n            U.length && (I == null || I(U));\n          }\n          if (b.current !== ne.length) {\n            b.current = ne.length;\n            const U = go(T, ne);\n            U.length && (L == null || L(U));\n          }\n          h.setState({\n            userSelectionRect: G,\n          });\n        },\n        R = (V) => {\n          if (V.button !== 0) return;\n          const { userSelectionRect: k } = h.getState();\n          !g && k && V.target === p.current && (w == null || w(V)),\n            h.setState({ nodesSelectionActive: m.current > 0 }),\n            S(),\n            r == null || r(V);\n        },\n        D = (V) => {\n          g &&\n            (h.setState({ nodesSelectionActive: m.current > 0 }),\n            r == null || r(V)),\n            S();\n        },\n        P = x && (e || g);\n      return $.createElement(\n        \"div\",\n        {\n          className: yt([\"react-flow__pane\", { dragging: v, selection: e }]),\n          onClick: P ? void 0 : Wl(w, p),\n          onContextMenu: Wl(E, p),\n          onWheel: Wl(M, p),\n          onMouseEnter: P ? void 0 : s,\n          onMouseDown: P ? _ : void 0,\n          onMouseMove: P ? j : u,\n          onMouseUp: P ? R : void 0,\n          onMouseLeave: P ? D : c,\n          ref: p,\n          style: Uc,\n        },\n        d,\n        $.createElement(Rb, null),\n      );\n    },\n  );\nf5.displayName = \"Pane\";\nfunction h5(e, t) {\n  const n = e.parentNode || e.parentId;\n  if (!n) return !1;\n  const o = t.get(n);\n  return o ? (o.selected ? !0 : h5(o, t)) : !1;\n}\nfunction Uu(e, t, n) {\n  let o = e;\n  do {\n    if (o != null && o.matches(t)) return !0;\n    if (o === n.current) return !1;\n    o = o.parentElement;\n  } while (o);\n  return !1;\n}\nfunction Pb(e, t, n, o) {\n  return Array.from(e.values())\n    .filter(\n      (r) =>\n        (r.selected || r.id === o) &&\n        (!r.parentNode || r.parentId || !h5(r, e)) &&\n        (r.draggable || (t && typeof r.draggable > \"u\")),\n    )\n    .map((r) => {\n      var i, a;\n      return {\n        id: r.id,\n        position: r.position || { x: 0, y: 0 },\n        positionAbsolute: r.positionAbsolute || { x: 0, y: 0 },\n        distance: {\n          x: n.x - (((i = r.positionAbsolute) == null ? void 0 : i.x) ?? 0),\n          y: n.y - (((a = r.positionAbsolute) == null ? void 0 : a.y) ?? 0),\n        },\n        delta: {\n          x: 0,\n          y: 0,\n        },\n        extent: r.extent,\n        parentNode: r.parentNode || r.parentId,\n        parentId: r.parentNode || r.parentId,\n        width: r.width,\n        height: r.height,\n        expandParent: r.expandParent,\n      };\n    });\n}\nfunction Bb(e, t) {\n  return !t || t === \"parent\"\n    ? t\n    : [t[0], [t[1][0] - (e.width || 0), t[1][1] - (e.height || 0)]];\n}\nfunction p5(e, t, n, o, r = [0, 0], i) {\n  const a = Bb(e, e.extent || o);\n  let l = a;\n  const s = e.parentNode || e.parentId;\n  if (e.extent === \"parent\" && !e.expandParent)\n    if (s && e.width && e.height) {\n      const d = n.get(s),\n        { x: p, y: h } = vo(d, r).positionAbsolute;\n      l =\n        d && Ht(p) && Ht(h) && Ht(d.width) && Ht(d.height)\n          ? [\n              [p + e.width * r[0], h + e.height * r[1]],\n              [\n                p + d.width - e.width + e.width * r[0],\n                h + d.height - e.height + e.height * r[1],\n              ],\n            ]\n          : l;\n    } else i == null || i(\"005\", Jt.error005()), (l = a);\n  else if (e.extent && s && e.extent !== \"parent\") {\n    const d = n.get(s),\n      { x: p, y: h } = vo(d, r).positionAbsolute;\n    l = [\n      [e.extent[0][0] + p, e.extent[0][1] + h],\n      [e.extent[1][0] + p, e.extent[1][1] + h],\n    ];\n  }\n  let u = { x: 0, y: 0 };\n  if (s) {\n    const d = n.get(s);\n    u = vo(d, r).positionAbsolute;\n  }\n  const c = l && l !== \"parent\" ? Ic(t, l) : t;\n  return {\n    position: {\n      x: c.x - u.x,\n      y: c.y - u.y,\n    },\n    positionAbsolute: c,\n  };\n}\nfunction Zl({ nodeId: e, dragItems: t, nodeInternals: n }) {\n  const o = t.map((r) => ({\n    ...n.get(r.id),\n    position: r.position,\n    positionAbsolute: r.positionAbsolute,\n  }));\n  return [e ? o.find((r) => r.id === e) : o[0], o];\n}\nconst qu = (e, t, n, o) => {\n  const r = t.querySelectorAll(e);\n  if (!r || !r.length) return null;\n  const i = Array.from(r),\n    a = t.getBoundingClientRect(),\n    l = {\n      x: a.width * o[0],\n      y: a.height * o[1],\n    };\n  return i.map((s) => {\n    const u = s.getBoundingClientRect();\n    return {\n      id: s.getAttribute(\"data-handleid\"),\n      position: s.getAttribute(\"data-handlepos\"),\n      x: (u.left - a.left - l.x) / n,\n      y: (u.top - a.top - l.y) / n,\n      ...Rc(s),\n    };\n  });\n};\nfunction Ko(e, t, n) {\n  return n === void 0\n    ? n\n    : (o) => {\n        const r = t().nodeInternals.get(e);\n        r && n(o, { ...r });\n      };\n}\nfunction zs({ id: e, store: t, unselect: n = !1, nodeRef: o }) {\n  const {\n      addSelectedNodes: r,\n      unselectNodesAndEdges: i,\n      multiSelectionActive: a,\n      nodeInternals: l,\n      onError: s,\n    } = t.getState(),\n    u = l.get(e);\n  if (!u) {\n    s == null || s(\"012\", Jt.error012(e));\n    return;\n  }\n  t.setState({ nodesSelectionActive: !1 }),\n    u.selected\n      ? (n || (u.selected && a)) &&\n        (i({ nodes: [u], edges: [] }),\n        requestAnimationFrame(() => {\n          var c;\n          return (c = o == null ? void 0 : o.current) == null\n            ? void 0\n            : c.blur();\n        }))\n      : r([e]);\n}\nfunction Vb() {\n  const e = rt();\n  return Oe(({ sourceEvent: n }) => {\n    const { transform: o, snapGrid: r, snapToGrid: i } = e.getState(),\n      a = n.touches ? n.touches[0].clientX : n.clientX,\n      l = n.touches ? n.touches[0].clientY : n.clientY,\n      s = {\n        x: (a - o[0]) / o[2],\n        y: (l - o[1]) / o[2],\n      };\n    return {\n      xSnapped: i ? r[0] * Math.round(s.x / r[0]) : s.x,\n      ySnapped: i ? r[1] * Math.round(s.y / r[1]) : s.y,\n      ...s,\n    };\n  }, []);\n}\nfunction Ul(e) {\n  return (t, n, o) => (e == null ? void 0 : e(t, o));\n}\nfunction g5({\n  nodeRef: e,\n  disabled: t = !1,\n  noDragClassName: n,\n  handleSelector: o,\n  nodeId: r,\n  isSelectable: i,\n  selectNodesOnDrag: a,\n}) {\n  const l = rt(),\n    [s, u] = se(!1),\n    c = he([]),\n    d = he({ x: null, y: null }),\n    p = he(0),\n    h = he(null),\n    m = he({ x: 0, y: 0 }),\n    b = he(null),\n    y = he(!1),\n    g = he(!1),\n    x = he(!1),\n    v = Vb();\n  return (\n    ue(() => {\n      if (e != null && e.current) {\n        const S = Yt(e.current),\n          w = ({ x: _, y: j }) => {\n            const {\n              nodeInternals: R,\n              onNodeDrag: D,\n              onSelectionDrag: P,\n              updateNodePositions: V,\n              nodeExtent: k,\n              snapGrid: N,\n              snapToGrid: T,\n              nodeOrigin: F,\n              onError: I,\n            } = l.getState();\n            d.current = { x: _, y: j };\n            let L = !1,\n              C = { x: 0, y: 0, x2: 0, y2: 0 };\n            if (c.current.length > 1 && k) {\n              const B = $c(c.current, F);\n              C = Hc(B);\n            }\n            if (\n              ((c.current = c.current.map((B) => {\n                const A = { x: _ - B.distance.x, y: j - B.distance.y };\n                T &&\n                  ((A.x = N[0] * Math.round(A.x / N[0])),\n                  (A.y = N[1] * Math.round(A.y / N[1])));\n                const W = [\n                  [k[0][0], k[0][1]],\n                  [k[1][0], k[1][1]],\n                ];\n                c.current.length > 1 &&\n                  k &&\n                  !B.extent &&\n                  ((W[0][0] = B.positionAbsolute.x - C.x + k[0][0]),\n                  (W[1][0] =\n                    B.positionAbsolute.x + (B.width ?? 0) - C.x2 + k[1][0]),\n                  (W[0][1] = B.positionAbsolute.y - C.y + k[0][1]),\n                  (W[1][1] =\n                    B.positionAbsolute.y + (B.height ?? 0) - C.y2 + k[1][1]));\n                const G = p5(B, A, R, W, F, I);\n                return (\n                  (L =\n                    L ||\n                    B.position.x !== G.position.x ||\n                    B.position.y !== G.position.y),\n                  (B.position = G.position),\n                  (B.positionAbsolute = G.positionAbsolute),\n                  B\n                );\n              })),\n              !L)\n            )\n              return;\n            V(c.current, !0, !0), u(!0);\n            const H = r ? D : Ul(P);\n            if (H && b.current) {\n              const [B, A] = Zl({\n                nodeId: r,\n                dragItems: c.current,\n                nodeInternals: R,\n              });\n              H(b.current, B, A);\n            }\n          },\n          E = () => {\n            if (!h.current) return;\n            const [_, j] = H3(m.current, h.current);\n            if (_ !== 0 || j !== 0) {\n              const { transform: R, panBy: D } = l.getState();\n              (d.current.x = (d.current.x ?? 0) - _ / R[2]),\n                (d.current.y = (d.current.y ?? 0) - j / R[2]),\n                D({ x: _, y: j }) && w(d.current);\n            }\n            p.current = requestAnimationFrame(E);\n          },\n          M = (_) => {\n            var F;\n            const {\n              nodeInternals: j,\n              multiSelectionActive: R,\n              nodesDraggable: D,\n              unselectNodesAndEdges: P,\n              onNodeDragStart: V,\n              onSelectionDragStart: k,\n            } = l.getState();\n            g.current = !0;\n            const N = r ? V : Ul(k);\n            (!a || !i) &&\n              !R &&\n              r &&\n              (((F = j.get(r)) != null && F.selected) || P()),\n              r &&\n                i &&\n                a &&\n                zs({\n                  id: r,\n                  store: l,\n                  nodeRef: e,\n                });\n            const T = v(_);\n            if (\n              ((d.current = T), (c.current = Pb(j, D, T, r)), N && c.current)\n            ) {\n              const [I, L] = Zl({\n                nodeId: r,\n                dragItems: c.current,\n                nodeInternals: j,\n              });\n              N(_.sourceEvent, I, L);\n            }\n          };\n        if (t) S.on(\".drag\", null);\n        else {\n          const _ = Kp()\n            .on(\"start\", (j) => {\n              const { domNode: R, nodeDragThreshold: D } = l.getState();\n              D === 0 && M(j), (x.current = !1);\n              const P = v(j);\n              (d.current = P),\n                (h.current =\n                  (R == null ? void 0 : R.getBoundingClientRect()) || null),\n                (m.current = Rn(j.sourceEvent, h.current));\n            })\n            .on(\"drag\", (j) => {\n              var V, k;\n              const R = v(j),\n                { autoPanOnNodeDrag: D, nodeDragThreshold: P } = l.getState();\n              if (\n                (j.sourceEvent.type === \"touchmove\" &&\n                  j.sourceEvent.touches.length > 1 &&\n                  (x.current = !0),\n                !x.current)\n              ) {\n                if (\n                  (!y.current && g.current && D && ((y.current = !0), E()),\n                  !g.current)\n                ) {\n                  const N =\n                      R.xSnapped -\n                      (((V = d == null ? void 0 : d.current) == null\n                        ? void 0\n                        : V.x) ?? 0),\n                    T =\n                      R.ySnapped -\n                      (((k = d == null ? void 0 : d.current) == null\n                        ? void 0\n                        : k.y) ?? 0);\n                  Math.sqrt(N * N + T * T) > P && M(j);\n                }\n                (d.current.x !== R.xSnapped || d.current.y !== R.ySnapped) &&\n                  c.current &&\n                  g.current &&\n                  ((b.current = j.sourceEvent),\n                  (m.current = Rn(j.sourceEvent, h.current)),\n                  w(R));\n              }\n            })\n            .on(\"end\", (j) => {\n              if (\n                !(!g.current || x.current) &&\n                (u(!1),\n                (y.current = !1),\n                (g.current = !1),\n                cancelAnimationFrame(p.current),\n                c.current)\n              ) {\n                const {\n                    updateNodePositions: R,\n                    nodeInternals: D,\n                    onNodeDragStop: P,\n                    onSelectionDragStop: V,\n                  } = l.getState(),\n                  k = r ? P : Ul(V);\n                if ((R(c.current, !1, !1), k)) {\n                  const [N, T] = Zl({\n                    nodeId: r,\n                    dragItems: c.current,\n                    nodeInternals: D,\n                  });\n                  k(j.sourceEvent, N, T);\n                }\n              }\n            })\n            .filter((j) => {\n              const R = j.target;\n              return (\n                !j.button && (!n || !Uu(R, `.${n}`, e)) && (!o || Uu(R, o, e))\n              );\n            });\n          return (\n            S.call(_),\n            () => {\n              S.on(\".drag\", null);\n            }\n          );\n        }\n      }\n    }, [e, t, n, o, i, l, r, a, v]),\n    s\n  );\n}\nfunction m5() {\n  const e = rt();\n  return Oe((n) => {\n    const {\n        nodeInternals: o,\n        nodeExtent: r,\n        updateNodePositions: i,\n        getNodes: a,\n        snapToGrid: l,\n        snapGrid: s,\n        onError: u,\n        nodesDraggable: c,\n      } = e.getState(),\n      d = a().filter(\n        (x) => x.selected && (x.draggable || (c && typeof x.draggable > \"u\")),\n      ),\n      p = l ? s[0] : 5,\n      h = l ? s[1] : 5,\n      m = n.isShiftPressed ? 4 : 1,\n      b = n.x * p * m,\n      y = n.y * h * m,\n      g = d.map((x) => {\n        if (x.positionAbsolute) {\n          const v = {\n            x: x.positionAbsolute.x + b,\n            y: x.positionAbsolute.y + y,\n          };\n          l &&\n            ((v.x = s[0] * Math.round(v.x / s[0])),\n            (v.y = s[1] * Math.round(v.y / s[1])));\n          const { positionAbsolute: S, position: w } = p5(\n            x,\n            v,\n            o,\n            r,\n            void 0,\n            u,\n          );\n          (x.position = w), (x.positionAbsolute = S);\n        }\n        return x;\n      });\n    i(g, !0, !1);\n  }, []);\n}\nconst xo = {\n  ArrowUp: { x: 0, y: -1 },\n  ArrowDown: { x: 0, y: 1 },\n  ArrowLeft: { x: -1, y: 0 },\n  ArrowRight: { x: 1, y: 0 },\n};\nvar Xo = (e) => {\n  const t = ({\n    id: n,\n    type: o,\n    data: r,\n    xPos: i,\n    yPos: a,\n    xPosOrigin: l,\n    yPosOrigin: s,\n    selected: u,\n    onClick: c,\n    onMouseEnter: d,\n    onMouseMove: p,\n    onMouseLeave: h,\n    onContextMenu: m,\n    onDoubleClick: b,\n    style: y,\n    className: g,\n    isDraggable: x,\n    isSelectable: v,\n    isConnectable: S,\n    isFocusable: w,\n    selectNodesOnDrag: E,\n    sourcePosition: M,\n    targetPosition: _,\n    hidden: j,\n    resizeObserver: R,\n    dragHandle: D,\n    zIndex: P,\n    isParent: V,\n    noDragClassName: k,\n    noPanClassName: N,\n    initialized: T,\n    disableKeyboardA11y: F,\n    ariaLabel: I,\n    rfId: L,\n    hasHandleBounds: C,\n  }) => {\n    const H = rt(),\n      B = he(null),\n      A = he(null),\n      W = he(M),\n      G = he(_),\n      K = he(o),\n      Q = v || x || c || d || p || h,\n      ne = m5(),\n      oe = Ko(n, H.getState, d),\n      U = Ko(n, H.getState, p),\n      ge = Ko(n, H.getState, h),\n      J = Ko(n, H.getState, m),\n      _e = Ko(n, H.getState, b),\n      ie = (Ee) => {\n        const { nodeDragThreshold: le } = H.getState();\n        if (\n          (v &&\n            (!E || !x || le > 0) &&\n            zs({\n              id: n,\n              store: H,\n              nodeRef: B,\n            }),\n          c)\n        ) {\n          const Qe = H.getState().nodeInternals.get(n);\n          Qe && c(Ee, { ...Qe });\n        }\n      },\n      Ae = (Ee) => {\n        if (!js(Ee) && !F)\n          if (P3.includes(Ee.key) && v) {\n            const le = Ee.key === \"Escape\";\n            zs({\n              id: n,\n              store: H,\n              unselect: le,\n              nodeRef: B,\n            });\n          } else\n            x &&\n              u &&\n              Object.prototype.hasOwnProperty.call(xo, Ee.key) &&\n              (H.setState({\n                ariaLiveMessage: `Moved selected node ${Ee.key.replace(\"Arrow\", \"\").toLowerCase()}. New position, x: ${~~i}, y: ${~~a}`,\n              }),\n              ne({\n                x: xo[Ee.key].x,\n                y: xo[Ee.key].y,\n                isShiftPressed: Ee.shiftKey,\n              }));\n      };\n    ue(\n      () => () => {\n        A.current && (R == null || R.unobserve(A.current), (A.current = null));\n      },\n      [],\n    ),\n      ue(() => {\n        if (B.current && !j) {\n          const Ee = B.current;\n          (!T || !C || A.current !== Ee) &&\n            (A.current && (R == null || R.unobserve(A.current)),\n            R == null || R.observe(Ee),\n            (A.current = Ee));\n        }\n      }, [j, T, C]),\n      ue(() => {\n        const Ee = K.current !== o,\n          le = W.current !== M,\n          Qe = G.current !== _;\n        B.current &&\n          (Ee || le || Qe) &&\n          (Ee && (K.current = o),\n          le && (W.current = M),\n          Qe && (G.current = _),\n          H.getState().updateNodeDimensions([\n            { id: n, nodeElement: B.current, forceUpdate: !0 },\n          ]));\n      }, [n, o, M, _]);\n    const We = g5({\n      nodeRef: B,\n      disabled: j || !x,\n      noDragClassName: k,\n      handleSelector: D,\n      nodeId: n,\n      isSelectable: v,\n      selectNodesOnDrag: E,\n    });\n    return j\n      ? null\n      : $.createElement(\n          \"div\",\n          {\n            className: yt([\n              \"react-flow__node\",\n              `react-flow__node-${o}`,\n              {\n                // this is overwritable by passing `nopan` as a class name\n                [N]: x,\n              },\n              g,\n              {\n                selected: u,\n                selectable: v,\n                parent: V,\n                dragging: We,\n              },\n            ]),\n            ref: B,\n            style: {\n              zIndex: P,\n              transform: `translate(${l}px,${s}px)`,\n              pointerEvents: Q ? \"all\" : \"none\",\n              visibility: T ? \"visible\" : \"hidden\",\n              ...y,\n            },\n            \"data-id\": n,\n            \"data-testid\": `rf__node-${n}`,\n            onMouseEnter: oe,\n            onMouseMove: U,\n            onMouseLeave: ge,\n            onContextMenu: J,\n            onClick: ie,\n            onDoubleClick: _e,\n            onKeyDown: w ? Ae : void 0,\n            tabIndex: w ? 0 : void 0,\n            role: w ? \"button\" : void 0,\n            \"aria-describedby\": F ? void 0 : `${l5}-${L}`,\n            \"aria-label\": I,\n          },\n          $.createElement(\n            eb,\n            { value: n },\n            $.createElement(e, {\n              id: n,\n              data: r,\n              type: o,\n              xPos: i,\n              yPos: a,\n              selected: u,\n              isConnectable: S,\n              sourcePosition: M,\n              targetPosition: _,\n              dragging: We,\n              dragHandle: D,\n              zIndex: P,\n            }),\n          ),\n        );\n  };\n  return (t.displayName = \"NodeWrapper\"), Ke(t);\n};\nconst $b = (e) => {\n  const t = e.getNodes().filter((n) => n.selected);\n  return {\n    ...$c(t, e.nodeOrigin),\n    transformString: `translate(${e.transform[0]}px,${e.transform[1]}px) scale(${e.transform[2]})`,\n    userSelectionActive: e.userSelectionActive,\n  };\n};\nfunction Wb({\n  onSelectionContextMenu: e,\n  noPanClassName: t,\n  disableKeyboardA11y: n,\n}) {\n  const o = rt(),\n    {\n      width: r,\n      height: i,\n      x: a,\n      y: l,\n      transformString: s,\n      userSelectionActive: u,\n    } = qe($b, ut),\n    c = m5(),\n    d = he(null);\n  if (\n    (ue(() => {\n      var m;\n      n ||\n        (m = d.current) == null ||\n        m.focus({\n          preventScroll: !0,\n        });\n    }, [n]),\n    g5({\n      nodeRef: d,\n    }),\n    u || !r || !i)\n  )\n    return null;\n  const p = e\n      ? (m) => {\n          const b = o\n            .getState()\n            .getNodes()\n            .filter((y) => y.selected);\n          e(m, b);\n        }\n      : void 0,\n    h = (m) => {\n      Object.prototype.hasOwnProperty.call(xo, m.key) &&\n        c({\n          x: xo[m.key].x,\n          y: xo[m.key].y,\n          isShiftPressed: m.shiftKey,\n        });\n    };\n  return $.createElement(\n    \"div\",\n    {\n      className: yt([\"react-flow__nodesselection\", \"react-flow__container\", t]),\n      style: {\n        transform: s,\n      },\n    },\n    $.createElement(\"div\", {\n      ref: d,\n      className: \"react-flow__nodesselection-rect\",\n      onContextMenu: p,\n      tabIndex: n ? void 0 : -1,\n      onKeyDown: n ? void 0 : h,\n      style: {\n        width: r,\n        height: i,\n        top: l,\n        left: a,\n      },\n    }),\n  );\n}\nvar Zb = Ke(Wb);\nconst Ub = (e) => e.nodesSelectionActive,\n  b5 = ({\n    children: e,\n    onPaneClick: t,\n    onPaneMouseEnter: n,\n    onPaneMouseMove: o,\n    onPaneMouseLeave: r,\n    onPaneContextMenu: i,\n    onPaneScroll: a,\n    deleteKeyCode: l,\n    onMove: s,\n    onMoveStart: u,\n    onMoveEnd: c,\n    selectionKeyCode: d,\n    selectionOnDrag: p,\n    selectionMode: h,\n    onSelectionStart: m,\n    onSelectionEnd: b,\n    multiSelectionKeyCode: y,\n    panActivationKeyCode: g,\n    zoomActivationKeyCode: x,\n    elementsSelectable: v,\n    zoomOnScroll: S,\n    zoomOnPinch: w,\n    panOnScroll: E,\n    panOnScrollSpeed: M,\n    panOnScrollMode: _,\n    zoomOnDoubleClick: j,\n    panOnDrag: R,\n    defaultViewport: D,\n    translateExtent: P,\n    minZoom: V,\n    maxZoom: k,\n    preventScrolling: N,\n    onSelectionContextMenu: T,\n    noWheelClassName: F,\n    noPanClassName: I,\n    disableKeyboardA11y: L,\n  }) => {\n    const C = qe(Ub),\n      H = kr(d),\n      B = kr(g),\n      A = B || R,\n      W = B || E,\n      G = H || (p && A !== !0);\n    return (\n      Ob({ deleteKeyCode: l, multiSelectionKeyCode: y }),\n      $.createElement(\n        jb,\n        {\n          onMove: s,\n          onMoveStart: u,\n          onMoveEnd: c,\n          onPaneContextMenu: i,\n          elementsSelectable: v,\n          zoomOnScroll: S,\n          zoomOnPinch: w,\n          panOnScroll: W,\n          panOnScrollSpeed: M,\n          panOnScrollMode: _,\n          zoomOnDoubleClick: j,\n          panOnDrag: !H && A,\n          defaultViewport: D,\n          translateExtent: P,\n          minZoom: V,\n          maxZoom: k,\n          zoomActivationKeyCode: x,\n          preventScrolling: N,\n          noWheelClassName: F,\n          noPanClassName: I,\n        },\n        $.createElement(\n          f5,\n          {\n            onSelectionStart: m,\n            onSelectionEnd: b,\n            onPaneClick: t,\n            onPaneMouseEnter: n,\n            onPaneMouseMove: o,\n            onPaneMouseLeave: r,\n            onPaneContextMenu: i,\n            onPaneScroll: a,\n            panOnDrag: A,\n            isSelecting: !!G,\n            selectionMode: h,\n          },\n          e,\n          C &&\n            $.createElement(Zb, {\n              onSelectionContextMenu: T,\n              noPanClassName: I,\n              disableKeyboardA11y: L,\n            }),\n        ),\n      )\n    );\n  };\nb5.displayName = \"FlowRenderer\";\nvar qb = Ke(b5);\nfunction Yb(e) {\n  return qe(\n    Oe(\n      (n) =>\n        e\n          ? Y3(\n              n.nodeInternals,\n              { x: 0, y: 0, width: n.width, height: n.height },\n              n.transform,\n              !0,\n            )\n          : n.getNodes(),\n      [e],\n    ),\n  );\n}\nfunction Gb(e) {\n  const t = {\n      input: Xo(e.input || o5),\n      default: Xo(e.default || Hs),\n      output: Xo(e.output || i5),\n      group: Xo(e.group || Zc),\n    },\n    n = {},\n    o = Object.keys(e)\n      .filter((r) => ![\"input\", \"default\", \"output\", \"group\"].includes(r))\n      .reduce((r, i) => ((r[i] = Xo(e[i] || Hs)), r), n);\n  return {\n    ...t,\n    ...o,\n  };\n}\nconst Kb = ({ x: e, y: t, width: n, height: o, origin: r }) =>\n    !n || !o\n      ? { x: e, y: t }\n      : r[0] < 0 || r[1] < 0 || r[0] > 1 || r[1] > 1\n        ? { x: e, y: t }\n        : {\n            x: e - n * r[0],\n            y: t - o * r[1],\n          },\n  Xb = (e) => ({\n    nodesDraggable: e.nodesDraggable,\n    nodesConnectable: e.nodesConnectable,\n    nodesFocusable: e.nodesFocusable,\n    elementsSelectable: e.elementsSelectable,\n    updateNodeDimensions: e.updateNodeDimensions,\n    onError: e.onError,\n  }),\n  y5 = (e) => {\n    const {\n        nodesDraggable: t,\n        nodesConnectable: n,\n        nodesFocusable: o,\n        elementsSelectable: r,\n        updateNodeDimensions: i,\n        onError: a,\n      } = qe(Xb, ut),\n      l = Yb(e.onlyRenderVisibleElements),\n      s = he(),\n      u = ze(() => {\n        if (typeof ResizeObserver > \"u\") return null;\n        const c = new ResizeObserver((d) => {\n          const p = d.map((h) => ({\n            id: h.target.getAttribute(\"data-id\"),\n            nodeElement: h.target,\n            forceUpdate: !0,\n          }));\n          i(p);\n        });\n        return (s.current = c), c;\n      }, []);\n    return (\n      ue(\n        () => () => {\n          var c;\n          (c = s == null ? void 0 : s.current) == null || c.disconnect();\n        },\n        [],\n      ),\n      $.createElement(\n        \"div\",\n        { className: \"react-flow__nodes\", style: Uc },\n        l.map((c) => {\n          var w, E, M;\n          let d = c.type || \"default\";\n          e.nodeTypes[d] ||\n            (a == null || a(\"003\", Jt.error003(d)), (d = \"default\"));\n          const p = e.nodeTypes[d] || e.nodeTypes.default,\n            h = !!(c.draggable || (t && typeof c.draggable > \"u\")),\n            m = !!(c.selectable || (r && typeof c.selectable > \"u\")),\n            b = !!(c.connectable || (n && typeof c.connectable > \"u\")),\n            y = !!(c.focusable || (o && typeof c.focusable > \"u\")),\n            g = e.nodeExtent\n              ? Ic(c.positionAbsolute, e.nodeExtent)\n              : c.positionAbsolute,\n            x = (g == null ? void 0 : g.x) ?? 0,\n            v = (g == null ? void 0 : g.y) ?? 0,\n            S = Kb({\n              x,\n              y: v,\n              width: c.width ?? 0,\n              height: c.height ?? 0,\n              origin: e.nodeOrigin,\n            });\n          return $.createElement(p, {\n            key: c.id,\n            id: c.id,\n            className: c.className,\n            style: c.style,\n            type: d,\n            data: c.data,\n            sourcePosition: c.sourcePosition || ae.Bottom,\n            targetPosition: c.targetPosition || ae.Top,\n            hidden: c.hidden,\n            xPos: x,\n            yPos: v,\n            xPosOrigin: S.x,\n            yPosOrigin: S.y,\n            selectNodesOnDrag: e.selectNodesOnDrag,\n            onClick: e.onNodeClick,\n            onMouseEnter: e.onNodeMouseEnter,\n            onMouseMove: e.onNodeMouseMove,\n            onMouseLeave: e.onNodeMouseLeave,\n            onContextMenu: e.onNodeContextMenu,\n            onDoubleClick: e.onNodeDoubleClick,\n            selected: !!c.selected,\n            isDraggable: h,\n            isSelectable: m,\n            isConnectable: b,\n            isFocusable: y,\n            resizeObserver: u,\n            dragHandle: c.dragHandle,\n            zIndex: ((w = c[Ge]) == null ? void 0 : w.z) ?? 0,\n            isParent: !!((E = c[Ge]) != null && E.isParent),\n            noDragClassName: e.noDragClassName,\n            noPanClassName: e.noPanClassName,\n            initialized: !!c.width && !!c.height,\n            rfId: e.rfId,\n            disableKeyboardA11y: e.disableKeyboardA11y,\n            ariaLabel: c.ariaLabel,\n            hasHandleBounds: !!((M = c[Ge]) != null && M.handleBounds),\n          });\n        }),\n      )\n    );\n  };\ny5.displayName = \"NodeRenderer\";\nvar Qb = Ke(y5);\nconst Jb = (e, t, n) => (n === ae.Left ? e - t : n === ae.Right ? e + t : e),\n  ey = (e, t, n) => (n === ae.Top ? e - t : n === ae.Bottom ? e + t : e),\n  Yu = \"react-flow__edgeupdater\",\n  Gu = ({\n    position: e,\n    centerX: t,\n    centerY: n,\n    radius: o = 10,\n    onMouseDown: r,\n    onMouseEnter: i,\n    onMouseOut: a,\n    type: l,\n  }) =>\n    $.createElement(\"circle\", {\n      onMouseDown: r,\n      onMouseEnter: i,\n      onMouseOut: a,\n      className: yt([Yu, `${Yu}-${l}`]),\n      cx: Jb(t, o, e),\n      cy: ey(n, o, e),\n      r: o,\n      stroke: \"transparent\",\n      fill: \"transparent\",\n    }),\n  ty = () => !0;\nvar ho = (e) => {\n  const t = ({\n    id: n,\n    className: o,\n    type: r,\n    data: i,\n    onClick: a,\n    onEdgeDoubleClick: l,\n    selected: s,\n    animated: u,\n    label: c,\n    labelStyle: d,\n    labelShowBg: p,\n    labelBgStyle: h,\n    labelBgPadding: m,\n    labelBgBorderRadius: b,\n    style: y,\n    source: g,\n    target: x,\n    sourceX: v,\n    sourceY: S,\n    targetX: w,\n    targetY: E,\n    sourcePosition: M,\n    targetPosition: _,\n    elementsSelectable: j,\n    hidden: R,\n    sourceHandleId: D,\n    targetHandleId: P,\n    onContextMenu: V,\n    onMouseEnter: k,\n    onMouseMove: N,\n    onMouseLeave: T,\n    reconnectRadius: F,\n    onReconnect: I,\n    onReconnectStart: L,\n    onReconnectEnd: C,\n    markerEnd: H,\n    markerStart: B,\n    rfId: A,\n    ariaLabel: W,\n    isFocusable: G,\n    isReconnectable: K,\n    pathOptions: Q,\n    interactionWidth: ne,\n    disableKeyboardA11y: oe,\n  }) => {\n    const U = he(null),\n      [ge, J] = se(!1),\n      [_e, ie] = se(!1),\n      Ae = rt(),\n      We = ze(() => `url('#${Rs(B, A)}')`, [B, A]),\n      Ee = ze(() => `url('#${Rs(H, A)}')`, [H, A]);\n    if (R) return null;\n    const le = (de) => {\n        var Se;\n        const {\n            edges: $e,\n            addSelectedEdges: nt,\n            unselectNodesAndEdges: tt,\n            multiSelectionActive: ht,\n          } = Ae.getState(),\n          at = $e.find((Zt) => Zt.id === n);\n        at &&\n          (j &&\n            (Ae.setState({ nodesSelectionActive: !1 }),\n            at.selected && ht\n              ? (tt({ nodes: [], edges: [at] }),\n                (Se = U.current) == null || Se.blur())\n              : nt([n])),\n          a && a(de, at));\n      },\n      Qe = Go(n, Ae.getState, l),\n      Lt = Go(n, Ae.getState, V),\n      nn = Go(n, Ae.getState, k),\n      Dt = Go(n, Ae.getState, N),\n      on = Go(n, Ae.getState, T),\n      kt = (de, $e) => {\n        if (de.button !== 0) return;\n        const { edges: nt, isValidConnection: tt } = Ae.getState(),\n          ht = $e ? x : g,\n          at = ($e ? P : D) || null,\n          Se = $e ? \"target\" : \"source\",\n          Zt = tt || ty,\n          lt = $e,\n          kn = nt.find((Ut) => Ut.id === n);\n        ie(!0), L == null || L(de, kn, Se);\n        const rn = (Ut) => {\n          ie(!1), C == null || C(Ut, kn, Se);\n        };\n        J3({\n          event: de,\n          handleId: at,\n          nodeId: ht,\n          onConnect: (Ut) => (I == null ? void 0 : I(kn, Ut)),\n          isTarget: lt,\n          getState: Ae.getState,\n          setState: Ae.setState,\n          isValidConnection: Zt,\n          edgeUpdaterType: Se,\n          onReconnectEnd: rn,\n        });\n      },\n      Wt = (de) => kt(de, !0),\n      jt = (de) => kt(de, !1),\n      Z = () => J(!0),\n      ee = () => J(!1),\n      ce = !j && !a,\n      xe = (de) => {\n        var $e;\n        if (!oe && P3.includes(de.key) && j) {\n          const {\n            unselectNodesAndEdges: nt,\n            addSelectedEdges: tt,\n            edges: ht,\n          } = Ae.getState();\n          de.key === \"Escape\"\n            ? (($e = U.current) == null || $e.blur(),\n              nt({ edges: [ht.find((Se) => Se.id === n)] }))\n            : tt([n]);\n        }\n      };\n    return $.createElement(\n      \"g\",\n      {\n        className: yt([\n          \"react-flow__edge\",\n          `react-flow__edge-${r}`,\n          o,\n          { selected: s, animated: u, inactive: ce, updating: ge },\n        ]),\n        onClick: le,\n        onDoubleClick: Qe,\n        onContextMenu: Lt,\n        onMouseEnter: nn,\n        onMouseMove: Dt,\n        onMouseLeave: on,\n        onKeyDown: G ? xe : void 0,\n        tabIndex: G ? 0 : void 0,\n        role: G ? \"button\" : \"img\",\n        \"data-testid\": `rf__edge-${n}`,\n        \"aria-label\": W === null ? void 0 : W || `Edge from ${g} to ${x}`,\n        \"aria-describedby\": G ? `${s5}-${A}` : void 0,\n        ref: U,\n      },\n      !_e &&\n        $.createElement(e, {\n          id: n,\n          source: g,\n          target: x,\n          selected: s,\n          animated: u,\n          label: c,\n          labelStyle: d,\n          labelShowBg: p,\n          labelBgStyle: h,\n          labelBgPadding: m,\n          labelBgBorderRadius: b,\n          data: i,\n          style: y,\n          sourceX: v,\n          sourceY: S,\n          targetX: w,\n          targetY: E,\n          sourcePosition: M,\n          targetPosition: _,\n          sourceHandleId: D,\n          targetHandleId: P,\n          markerStart: We,\n          markerEnd: Ee,\n          pathOptions: Q,\n          interactionWidth: ne,\n        }),\n      K &&\n        $.createElement(\n          $.Fragment,\n          null,\n          (K === \"source\" || K === !0) &&\n            $.createElement(Gu, {\n              position: M,\n              centerX: v,\n              centerY: S,\n              radius: F,\n              onMouseDown: Wt,\n              onMouseEnter: Z,\n              onMouseOut: ee,\n              type: \"source\",\n            }),\n          (K === \"target\" || K === !0) &&\n            $.createElement(Gu, {\n              position: _,\n              centerX: w,\n              centerY: E,\n              radius: F,\n              onMouseDown: jt,\n              onMouseEnter: Z,\n              onMouseOut: ee,\n              type: \"target\",\n            }),\n        ),\n    );\n  };\n  return (t.displayName = \"EdgeWrapper\"), Ke(t);\n};\nfunction ny(e) {\n  const t = {\n      default: ho(e.default || Zi),\n      straight: ho(e.bezier || Bc),\n      step: ho(e.step || Pc),\n      smoothstep: ho(e.step || ha),\n      simplebezier: ho(e.simplebezier || zc),\n    },\n    n = {},\n    o = Object.keys(e)\n      .filter((r) => ![\"default\", \"bezier\"].includes(r))\n      .reduce((r, i) => ((r[i] = ho(e[i] || Zi)), r), n);\n  return {\n    ...t,\n    ...o,\n  };\n}\nfunction Ku(e, t, n = null) {\n  const o = ((n == null ? void 0 : n.x) || 0) + t.x,\n    r = ((n == null ? void 0 : n.y) || 0) + t.y,\n    i = (n == null ? void 0 : n.width) || t.width,\n    a = (n == null ? void 0 : n.height) || t.height;\n  switch (e) {\n    case ae.Top:\n      return {\n        x: o + i / 2,\n        y: r,\n      };\n    case ae.Right:\n      return {\n        x: o + i,\n        y: r + a / 2,\n      };\n    case ae.Bottom:\n      return {\n        x: o + i / 2,\n        y: r + a,\n      };\n    case ae.Left:\n      return {\n        x: o,\n        y: r + a / 2,\n      };\n  }\n}\nfunction Xu(e, t) {\n  return e\n    ? e.length === 1 || !t\n      ? e[0]\n      : (t && e.find((n) => n.id === t)) || null\n    : null;\n}\nconst oy = (e, t, n, o, r, i) => {\n  const a = Ku(n, e, t),\n    l = Ku(i, o, r);\n  return {\n    sourceX: a.x,\n    sourceY: a.y,\n    targetX: l.x,\n    targetY: l.y,\n  };\n};\nfunction ry({\n  sourcePos: e,\n  targetPos: t,\n  sourceWidth: n,\n  sourceHeight: o,\n  targetWidth: r,\n  targetHeight: i,\n  width: a,\n  height: l,\n  transform: s,\n}) {\n  const u = {\n    x: Math.min(e.x, t.x),\n    y: Math.min(e.y, t.y),\n    x2: Math.max(e.x + n, t.x + r),\n    y2: Math.max(e.y + o, t.y + i),\n  };\n  u.x === u.x2 && (u.x2 += 1), u.y === u.y2 && (u.y2 += 1);\n  const c = Hc({\n      x: (0 - s[0]) / s[2],\n      y: (0 - s[1]) / s[2],\n      width: a / s[2],\n      height: l / s[2],\n    }),\n    d = Math.max(0, Math.min(c.x2, u.x2) - Math.max(c.x, u.x)),\n    p = Math.max(0, Math.min(c.y2, u.y2) - Math.max(c.y, u.y));\n  return Math.ceil(d * p) > 0;\n}\nfunction Qu(e) {\n  var o, r, i, a, l;\n  const t =\n      ((o = e == null ? void 0 : e[Ge]) == null ? void 0 : o.handleBounds) ||\n      null,\n    n =\n      t &&\n      (e == null ? void 0 : e.width) &&\n      (e == null ? void 0 : e.height) &&\n      typeof ((r = e == null ? void 0 : e.positionAbsolute) == null\n        ? void 0\n        : r.x) < \"u\" &&\n      typeof ((i = e == null ? void 0 : e.positionAbsolute) == null\n        ? void 0\n        : i.y) < \"u\";\n  return [\n    {\n      x:\n        ((a = e == null ? void 0 : e.positionAbsolute) == null\n          ? void 0\n          : a.x) || 0,\n      y:\n        ((l = e == null ? void 0 : e.positionAbsolute) == null\n          ? void 0\n          : l.y) || 0,\n      width: (e == null ? void 0 : e.width) || 0,\n      height: (e == null ? void 0 : e.height) || 0,\n    },\n    t,\n    !!n,\n  ];\n}\nconst iy = [{ level: 0, isMaxLevel: !0, edges: [] }];\nfunction ay(e, t, n = !1) {\n  let o = -1;\n  const r = e.reduce((a, l) => {\n      var c, d;\n      const s = Ht(l.zIndex);\n      let u = s ? l.zIndex : 0;\n      if (n) {\n        const p = t.get(l.target),\n          h = t.get(l.source),\n          m =\n            l.selected ||\n            (p == null ? void 0 : p.selected) ||\n            (h == null ? void 0 : h.selected),\n          b = Math.max(\n            ((c = h == null ? void 0 : h[Ge]) == null ? void 0 : c.z) || 0,\n            ((d = p == null ? void 0 : p[Ge]) == null ? void 0 : d.z) || 0,\n            1e3,\n          );\n        u = (s ? l.zIndex : 0) + (m ? b : 0);\n      }\n      return a[u] ? a[u].push(l) : (a[u] = [l]), (o = u > o ? u : o), a;\n    }, {}),\n    i = Object.entries(r).map(([a, l]) => {\n      const s = +a;\n      return {\n        edges: l,\n        level: s,\n        isMaxLevel: s === o,\n      };\n    });\n  return i.length === 0 ? iy : i;\n}\nfunction ly(e, t, n) {\n  const o = qe(\n    Oe(\n      (r) =>\n        e\n          ? r.edges.filter((i) => {\n              const a = t.get(i.source),\n                l = t.get(i.target);\n              return (\n                (a == null ? void 0 : a.width) &&\n                (a == null ? void 0 : a.height) &&\n                (l == null ? void 0 : l.width) &&\n                (l == null ? void 0 : l.height) &&\n                ry({\n                  sourcePos: a.positionAbsolute || { x: 0, y: 0 },\n                  targetPos: l.positionAbsolute || { x: 0, y: 0 },\n                  sourceWidth: a.width,\n                  sourceHeight: a.height,\n                  targetWidth: l.width,\n                  targetHeight: l.height,\n                  width: r.width,\n                  height: r.height,\n                  transform: r.transform,\n                })\n              );\n            })\n          : r.edges,\n      [e, t],\n    ),\n  );\n  return ay(o, t, n);\n}\nconst sy = ({ color: e = \"none\", strokeWidth: t = 1 }) =>\n    $.createElement(\"polyline\", {\n      style: {\n        stroke: e,\n        strokeWidth: t,\n      },\n      strokeLinecap: \"round\",\n      strokeLinejoin: \"round\",\n      fill: \"none\",\n      points: \"-5,-4 0,0 -5,4\",\n    }),\n  cy = ({ color: e = \"none\", strokeWidth: t = 1 }) =>\n    $.createElement(\"polyline\", {\n      style: {\n        stroke: e,\n        fill: e,\n        strokeWidth: t,\n      },\n      strokeLinecap: \"round\",\n      strokeLinejoin: \"round\",\n      points: \"-5,-4 0,0 -5,4 -5,-4\",\n    }),\n  Ju = {\n    [Wi.Arrow]: sy,\n    [Wi.ArrowClosed]: cy,\n  };\nfunction uy(e) {\n  const t = rt();\n  return ze(() => {\n    var r, i;\n    return Object.prototype.hasOwnProperty.call(Ju, e)\n      ? Ju[e]\n      : ((i = (r = t.getState()).onError) == null ||\n          i.call(r, \"009\", Jt.error009(e)),\n        null);\n  }, [e]);\n}\nconst dy = ({\n    id: e,\n    type: t,\n    color: n,\n    width: o = 12.5,\n    height: r = 12.5,\n    markerUnits: i = \"strokeWidth\",\n    strokeWidth: a,\n    orient: l = \"auto-start-reverse\",\n  }) => {\n    const s = uy(t);\n    return s\n      ? $.createElement(\n          \"marker\",\n          {\n            className: \"react-flow__arrowhead\",\n            id: e,\n            markerWidth: `${o}`,\n            markerHeight: `${r}`,\n            viewBox: \"-10 -10 20 20\",\n            markerUnits: i,\n            orient: l,\n            refX: \"0\",\n            refY: \"0\",\n          },\n          $.createElement(s, { color: n, strokeWidth: a }),\n        )\n      : null;\n  },\n  fy =\n    ({ defaultColor: e, rfId: t }) =>\n    (n) => {\n      const o = [];\n      return n.edges\n        .reduce(\n          (r, i) => (\n            [i.markerStart, i.markerEnd].forEach((a) => {\n              if (a && typeof a == \"object\") {\n                const l = Rs(a, t);\n                o.includes(l) ||\n                  (r.push({ id: l, color: a.color || e, ...a }), o.push(l));\n              }\n            }),\n            r\n          ),\n          [],\n        )\n        .sort((r, i) => r.id.localeCompare(i.id));\n    },\n  C5 = ({ defaultColor: e, rfId: t }) => {\n    const n = qe(\n      Oe(fy({ defaultColor: e, rfId: t }), [e, t]),\n      // the id includes all marker options, so we just need to look at that part of the marker\n      (o, r) => !(o.length !== r.length || o.some((i, a) => i.id !== r[a].id)),\n    );\n    return $.createElement(\n      \"defs\",\n      null,\n      n.map((o) =>\n        $.createElement(dy, {\n          id: o.id,\n          key: o.id,\n          type: o.type,\n          color: o.color,\n          width: o.width,\n          height: o.height,\n          markerUnits: o.markerUnits,\n          strokeWidth: o.strokeWidth,\n          orient: o.orient,\n        }),\n      ),\n    );\n  };\nC5.displayName = \"MarkerDefinitions\";\nvar hy = Ke(C5);\nconst py = (e) => ({\n    nodesConnectable: e.nodesConnectable,\n    edgesFocusable: e.edgesFocusable,\n    edgesUpdatable: e.edgesUpdatable,\n    elementsSelectable: e.elementsSelectable,\n    width: e.width,\n    height: e.height,\n    connectionMode: e.connectionMode,\n    nodeInternals: e.nodeInternals,\n    onError: e.onError,\n  }),\n  v5 = ({\n    defaultMarkerColor: e,\n    onlyRenderVisibleElements: t,\n    elevateEdgesOnSelect: n,\n    rfId: o,\n    edgeTypes: r,\n    noPanClassName: i,\n    onEdgeContextMenu: a,\n    onEdgeMouseEnter: l,\n    onEdgeMouseMove: s,\n    onEdgeMouseLeave: u,\n    onEdgeClick: c,\n    onEdgeDoubleClick: d,\n    onReconnect: p,\n    onReconnectStart: h,\n    onReconnectEnd: m,\n    reconnectRadius: b,\n    children: y,\n    disableKeyboardA11y: g,\n  }) => {\n    const {\n        edgesFocusable: x,\n        edgesUpdatable: v,\n        elementsSelectable: S,\n        width: w,\n        height: E,\n        connectionMode: M,\n        nodeInternals: _,\n        onError: j,\n      } = qe(py, ut),\n      R = ly(t, _, n);\n    return w\n      ? $.createElement(\n          $.Fragment,\n          null,\n          R.map(({ level: D, edges: P, isMaxLevel: V }) =>\n            $.createElement(\n              \"svg\",\n              {\n                key: D,\n                style: { zIndex: D },\n                width: w,\n                height: E,\n                className: \"react-flow__edges react-flow__container\",\n              },\n              V && $.createElement(hy, { defaultColor: e, rfId: o }),\n              $.createElement(\n                \"g\",\n                null,\n                P.map((k) => {\n                  const [N, T, F] = Qu(_.get(k.source)),\n                    [I, L, C] = Qu(_.get(k.target));\n                  if (!F || !C) return null;\n                  let H = k.type || \"default\";\n                  r[H] ||\n                    (j == null || j(\"011\", Jt.error011(H)), (H = \"default\"));\n                  const B = r[H] || r.default,\n                    A =\n                      M === oo.Strict\n                        ? L.target\n                        : (L.target ?? []).concat(L.source ?? []),\n                    W = Xu(T.source, k.sourceHandle),\n                    G = Xu(A, k.targetHandle),\n                    K = (W == null ? void 0 : W.position) || ae.Bottom,\n                    Q = (G == null ? void 0 : G.position) || ae.Top,\n                    ne = !!(k.focusable || (x && typeof k.focusable > \"u\")),\n                    oe = k.reconnectable || k.updatable,\n                    U = typeof p < \"u\" && (oe || (v && typeof oe > \"u\"));\n                  if (!W || !G)\n                    return j == null || j(\"008\", Jt.error008(W, k)), null;\n                  const {\n                    sourceX: ge,\n                    sourceY: J,\n                    targetX: _e,\n                    targetY: ie,\n                  } = oy(N, W, K, I, G, Q);\n                  return $.createElement(B, {\n                    key: k.id,\n                    id: k.id,\n                    className: yt([k.className, i]),\n                    type: H,\n                    data: k.data,\n                    selected: !!k.selected,\n                    animated: !!k.animated,\n                    hidden: !!k.hidden,\n                    label: k.label,\n                    labelStyle: k.labelStyle,\n                    labelShowBg: k.labelShowBg,\n                    labelBgStyle: k.labelBgStyle,\n                    labelBgPadding: k.labelBgPadding,\n                    labelBgBorderRadius: k.labelBgBorderRadius,\n                    style: k.style,\n                    source: k.source,\n                    target: k.target,\n                    sourceHandleId: k.sourceHandle,\n                    targetHandleId: k.targetHandle,\n                    markerEnd: k.markerEnd,\n                    markerStart: k.markerStart,\n                    sourceX: ge,\n                    sourceY: J,\n                    targetX: _e,\n                    targetY: ie,\n                    sourcePosition: K,\n                    targetPosition: Q,\n                    elementsSelectable: S,\n                    onContextMenu: a,\n                    onMouseEnter: l,\n                    onMouseMove: s,\n                    onMouseLeave: u,\n                    onClick: c,\n                    onEdgeDoubleClick: d,\n                    onReconnect: p,\n                    onReconnectStart: h,\n                    onReconnectEnd: m,\n                    reconnectRadius: b,\n                    rfId: o,\n                    ariaLabel: k.ariaLabel,\n                    isFocusable: ne,\n                    isReconnectable: U,\n                    pathOptions: \"pathOptions\" in k ? k.pathOptions : void 0,\n                    interactionWidth: k.interactionWidth,\n                    disableKeyboardA11y: g,\n                  });\n                }),\n              ),\n            ),\n          ),\n          y,\n        )\n      : null;\n  };\nv5.displayName = \"EdgeRenderer\";\nvar gy = Ke(v5);\nconst my = (e) =>\n  `translate(${e.transform[0]}px,${e.transform[1]}px) scale(${e.transform[2]})`;\nfunction by({ children: e }) {\n  const t = qe(my);\n  return $.createElement(\n    \"div\",\n    {\n      className: \"react-flow__viewport react-flow__container\",\n      style: { transform: t },\n    },\n    e,\n  );\n}\nfunction yy(e) {\n  const t = tn(),\n    n = he(!1);\n  ue(() => {\n    !n.current &&\n      t.viewportInitialized &&\n      e &&\n      (setTimeout(() => e(t), 1), (n.current = !0));\n  }, [e, t.viewportInitialized]);\n}\nconst Cy = {\n    [ae.Left]: ae.Right,\n    [ae.Right]: ae.Left,\n    [ae.Top]: ae.Bottom,\n    [ae.Bottom]: ae.Top,\n  },\n  x5 = ({\n    nodeId: e,\n    handleType: t,\n    style: n,\n    type: o = Dn.Bezier,\n    CustomComponent: r,\n    connectionStatus: i,\n  }) => {\n    var E, M, _;\n    const {\n        fromNode: a,\n        handleId: l,\n        toX: s,\n        toY: u,\n        connectionMode: c,\n      } = qe(\n        Oe(\n          (j) => ({\n            fromNode: j.nodeInternals.get(e),\n            handleId: j.connectionHandleId,\n            toX: (j.connectionPosition.x - j.transform[0]) / j.transform[2],\n            toY: (j.connectionPosition.y - j.transform[1]) / j.transform[2],\n            connectionMode: j.connectionMode,\n          }),\n          [e],\n        ),\n        ut,\n      ),\n      d = (E = a == null ? void 0 : a[Ge]) == null ? void 0 : E.handleBounds;\n    let p = d == null ? void 0 : d[t];\n    if (\n      (c === oo.Loose &&\n        (p =\n          p || (d == null ? void 0 : d[t === \"source\" ? \"target\" : \"source\"])),\n      !a || !p)\n    )\n      return null;\n    const h = l ? p.find((j) => j.id === l) : p[0],\n      m = h ? h.x + h.width / 2 : (a.width ?? 0) / 2,\n      b = h ? h.y + h.height / 2 : (a.height ?? 0),\n      y = (((M = a.positionAbsolute) == null ? void 0 : M.x) ?? 0) + m,\n      g = (((_ = a.positionAbsolute) == null ? void 0 : _.y) ?? 0) + b,\n      x = h == null ? void 0 : h.position,\n      v = x ? Cy[x] : null;\n    if (!x || !v) return null;\n    if (r)\n      return $.createElement(r, {\n        connectionLineType: o,\n        connectionLineStyle: n,\n        fromNode: a,\n        fromHandle: h,\n        fromX: y,\n        fromY: g,\n        toX: s,\n        toY: u,\n        fromPosition: x,\n        toPosition: v,\n        connectionStatus: i,\n      });\n    let S = \"\";\n    const w = {\n      sourceX: y,\n      sourceY: g,\n      sourcePosition: x,\n      targetX: s,\n      targetY: u,\n      targetPosition: v,\n    };\n    return (\n      o === Dn.Bezier\n        ? ([S] = U3(w))\n        : o === Dn.Step\n          ? ([S] = Fs({\n              ...w,\n              borderRadius: 0,\n            }))\n          : o === Dn.SmoothStep\n            ? ([S] = Fs(w))\n            : o === Dn.SimpleBezier\n              ? ([S] = Z3(w))\n              : (S = `M${y},${g} ${s},${u}`),\n      $.createElement(\"path\", {\n        d: S,\n        fill: \"none\",\n        className: \"react-flow__connection-path\",\n        style: n,\n      })\n    );\n  };\nx5.displayName = \"ConnectionLine\";\nconst vy = (e) => ({\n  nodeId: e.connectionNodeId,\n  handleType: e.connectionHandleType,\n  nodesConnectable: e.nodesConnectable,\n  connectionStatus: e.connectionStatus,\n  width: e.width,\n  height: e.height,\n});\nfunction xy({ containerStyle: e, style: t, type: n, component: o }) {\n  const {\n    nodeId: r,\n    handleType: i,\n    nodesConnectable: a,\n    width: l,\n    height: s,\n    connectionStatus: u,\n  } = qe(vy, ut);\n  return !(r && i && l && a)\n    ? null\n    : $.createElement(\n        \"svg\",\n        {\n          style: e,\n          width: l,\n          height: s,\n          className:\n            \"react-flow__edges react-flow__connectionline react-flow__container\",\n        },\n        $.createElement(\n          \"g\",\n          { className: yt([\"react-flow__connection\", u]) },\n          $.createElement(x5, {\n            nodeId: r,\n            handleType: i,\n            style: t,\n            type: n,\n            CustomComponent: o,\n            connectionStatus: u,\n          }),\n        ),\n      );\n}\nfunction e0(e, t) {\n  const n = he(null),\n    o = rt();\n  return ze(() => {\n    var i, a;\n    if (process.env.NODE_ENV === \"development\") {\n      const l = Object.keys(e);\n      ut(n.current, l) &&\n        ((a = (i = o.getState()).onError) == null ||\n          a.call(i, \"002\", Jt.error002())),\n        (n.current = l);\n    }\n    return t(e);\n  }, [e]);\n}\nconst w5 = ({\n  nodeTypes: e,\n  edgeTypes: t,\n  onMove: n,\n  onMoveStart: o,\n  onMoveEnd: r,\n  onInit: i,\n  onNodeClick: a,\n  onEdgeClick: l,\n  onNodeDoubleClick: s,\n  onEdgeDoubleClick: u,\n  onNodeMouseEnter: c,\n  onNodeMouseMove: d,\n  onNodeMouseLeave: p,\n  onNodeContextMenu: h,\n  onSelectionContextMenu: m,\n  onSelectionStart: b,\n  onSelectionEnd: y,\n  connectionLineType: g,\n  connectionLineStyle: x,\n  connectionLineComponent: v,\n  connectionLineContainerStyle: S,\n  selectionKeyCode: w,\n  selectionOnDrag: E,\n  selectionMode: M,\n  multiSelectionKeyCode: _,\n  panActivationKeyCode: j,\n  zoomActivationKeyCode: R,\n  deleteKeyCode: D,\n  onlyRenderVisibleElements: P,\n  elementsSelectable: V,\n  selectNodesOnDrag: k,\n  defaultViewport: N,\n  translateExtent: T,\n  minZoom: F,\n  maxZoom: I,\n  preventScrolling: L,\n  defaultMarkerColor: C,\n  zoomOnScroll: H,\n  zoomOnPinch: B,\n  panOnScroll: A,\n  panOnScrollSpeed: W,\n  panOnScrollMode: G,\n  zoomOnDoubleClick: K,\n  panOnDrag: Q,\n  onPaneClick: ne,\n  onPaneMouseEnter: oe,\n  onPaneMouseMove: U,\n  onPaneMouseLeave: ge,\n  onPaneScroll: J,\n  onPaneContextMenu: _e,\n  onEdgeContextMenu: ie,\n  onEdgeMouseEnter: Ae,\n  onEdgeMouseMove: We,\n  onEdgeMouseLeave: Ee,\n  onReconnect: le,\n  onReconnectStart: Qe,\n  onReconnectEnd: Lt,\n  reconnectRadius: nn,\n  noDragClassName: Dt,\n  noWheelClassName: on,\n  noPanClassName: kt,\n  elevateEdgesOnSelect: Wt,\n  disableKeyboardA11y: jt,\n  nodeOrigin: Z,\n  nodeExtent: ee,\n  rfId: ce,\n}) => {\n  const xe = e0(e, Gb),\n    de = e0(t, ny);\n  return (\n    yy(i),\n    $.createElement(\n      qb,\n      {\n        onPaneClick: ne,\n        onPaneMouseEnter: oe,\n        onPaneMouseMove: U,\n        onPaneMouseLeave: ge,\n        onPaneContextMenu: _e,\n        onPaneScroll: J,\n        deleteKeyCode: D,\n        selectionKeyCode: w,\n        selectionOnDrag: E,\n        selectionMode: M,\n        onSelectionStart: b,\n        onSelectionEnd: y,\n        multiSelectionKeyCode: _,\n        panActivationKeyCode: j,\n        zoomActivationKeyCode: R,\n        elementsSelectable: V,\n        onMove: n,\n        onMoveStart: o,\n        onMoveEnd: r,\n        zoomOnScroll: H,\n        zoomOnPinch: B,\n        zoomOnDoubleClick: K,\n        panOnScroll: A,\n        panOnScrollSpeed: W,\n        panOnScrollMode: G,\n        panOnDrag: Q,\n        defaultViewport: N,\n        translateExtent: T,\n        minZoom: F,\n        maxZoom: I,\n        onSelectionContextMenu: m,\n        preventScrolling: L,\n        noDragClassName: Dt,\n        noWheelClassName: on,\n        noPanClassName: kt,\n        disableKeyboardA11y: jt,\n      },\n      $.createElement(\n        by,\n        null,\n        $.createElement(\n          gy,\n          {\n            edgeTypes: de,\n            onEdgeClick: l,\n            onEdgeDoubleClick: u,\n            onlyRenderVisibleElements: P,\n            onEdgeContextMenu: ie,\n            onEdgeMouseEnter: Ae,\n            onEdgeMouseMove: We,\n            onEdgeMouseLeave: Ee,\n            onReconnect: le,\n            onReconnectStart: Qe,\n            onReconnectEnd: Lt,\n            reconnectRadius: nn,\n            defaultMarkerColor: C,\n            noPanClassName: kt,\n            elevateEdgesOnSelect: !!Wt,\n            disableKeyboardA11y: jt,\n            rfId: ce,\n          },\n          $.createElement(xy, {\n            style: x,\n            type: g,\n            component: v,\n            containerStyle: S,\n          }),\n        ),\n        $.createElement(\"div\", { className: \"react-flow__edgelabel-renderer\" }),\n        $.createElement(Qb, {\n          nodeTypes: xe,\n          onNodeClick: a,\n          onNodeDoubleClick: s,\n          onNodeMouseEnter: c,\n          onNodeMouseMove: d,\n          onNodeMouseLeave: p,\n          onNodeContextMenu: h,\n          selectNodesOnDrag: k,\n          onlyRenderVisibleElements: P,\n          noPanClassName: kt,\n          noDragClassName: Dt,\n          disableKeyboardA11y: jt,\n          nodeOrigin: Z,\n          nodeExtent: ee,\n          rfId: ce,\n        }),\n      ),\n    )\n  );\n};\nw5.displayName = \"GraphView\";\nvar wy = Ke(w5);\nconst Ps = [\n    [Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY],\n    [Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY],\n  ],\n  An = {\n    rfId: \"1\",\n    width: 0,\n    height: 0,\n    transform: [0, 0, 1],\n    nodeInternals: /* @__PURE__ */ new Map(),\n    edges: [],\n    onNodesChange: null,\n    onEdgesChange: null,\n    hasDefaultNodes: !1,\n    hasDefaultEdges: !1,\n    d3Zoom: null,\n    d3Selection: null,\n    d3ZoomHandler: void 0,\n    minZoom: 0.5,\n    maxZoom: 2,\n    translateExtent: Ps,\n    nodeExtent: Ps,\n    nodesSelectionActive: !1,\n    userSelectionActive: !1,\n    userSelectionRect: null,\n    connectionNodeId: null,\n    connectionHandleId: null,\n    connectionHandleType: \"source\",\n    connectionPosition: { x: 0, y: 0 },\n    connectionStatus: null,\n    connectionMode: oo.Strict,\n    domNode: null,\n    paneDragging: !1,\n    noPanClassName: \"nopan\",\n    nodeOrigin: [0, 0],\n    nodeDragThreshold: 0,\n    snapGrid: [15, 15],\n    snapToGrid: !1,\n    nodesDraggable: !0,\n    nodesConnectable: !0,\n    nodesFocusable: !0,\n    edgesFocusable: !0,\n    edgesUpdatable: !0,\n    elementsSelectable: !0,\n    elevateNodesOnSelect: !0,\n    fitViewOnInit: !1,\n    fitViewOnInitDone: !1,\n    fitViewOnInitOptions: void 0,\n    onSelectionChange: [],\n    multiSelectionActive: !1,\n    connectionStartHandle: null,\n    connectionEndHandle: null,\n    connectionClickStartHandle: null,\n    connectOnClick: !0,\n    ariaLiveMessage: \"\",\n    autoPanOnConnect: !0,\n    autoPanOnNodeDrag: !0,\n    connectionRadius: 20,\n    onError: B3,\n    isValidConnection: void 0,\n  },\n  Ey = () =>\n    sh(\n      (e, t) => ({\n        ...An,\n        setNodes: (n) => {\n          const {\n            nodeInternals: o,\n            nodeOrigin: r,\n            elevateNodesOnSelect: i,\n          } = t();\n          e({ nodeInternals: $l(n, o, r, i) });\n        },\n        getNodes: () => Array.from(t().nodeInternals.values()),\n        setEdges: (n) => {\n          const { defaultEdgeOptions: o = {} } = t();\n          e({ edges: n.map((r) => ({ ...o, ...r })) });\n        },\n        setDefaultNodesAndEdges: (n, o) => {\n          const r = typeof n < \"u\",\n            i = typeof o < \"u\",\n            a = r\n              ? $l(\n                  n,\n                  /* @__PURE__ */ new Map(),\n                  t().nodeOrigin,\n                  t().elevateNodesOnSelect,\n                )\n              : /* @__PURE__ */ new Map();\n          e({\n            nodeInternals: a,\n            edges: i ? o : [],\n            hasDefaultNodes: r,\n            hasDefaultEdges: i,\n          });\n        },\n        updateNodeDimensions: (n) => {\n          const {\n              onNodesChange: o,\n              nodeInternals: r,\n              fitViewOnInit: i,\n              fitViewOnInitDone: a,\n              fitViewOnInitOptions: l,\n              domNode: s,\n              nodeOrigin: u,\n            } = t(),\n            c = s == null ? void 0 : s.querySelector(\".react-flow__viewport\");\n          if (!c) return;\n          const d = window.getComputedStyle(c),\n            { m22: p } = new window.DOMMatrixReadOnly(d.transform),\n            h = n.reduce((b, y) => {\n              const g = r.get(y.id);\n              if (g != null && g.hidden)\n                r.set(g.id, {\n                  ...g,\n                  [Ge]: {\n                    ...g[Ge],\n                    // we need to reset the handle bounds when the node is hidden\n                    // in order to force a new observation when the node is shown again\n                    handleBounds: void 0,\n                  },\n                });\n              else if (g) {\n                const x = Rc(y.nodeElement);\n                !!(\n                  x.width &&\n                  x.height &&\n                  (g.width !== x.width ||\n                    g.height !== x.height ||\n                    y.forceUpdate)\n                ) &&\n                  (r.set(g.id, {\n                    ...g,\n                    [Ge]: {\n                      ...g[Ge],\n                      handleBounds: {\n                        source: qu(\".source\", y.nodeElement, p, u),\n                        target: qu(\".target\", y.nodeElement, p, u),\n                      },\n                    },\n                    ...x,\n                  }),\n                  b.push({\n                    id: g.id,\n                    type: \"dimensions\",\n                    dimensions: x,\n                  }));\n              }\n              return b;\n            }, []);\n          u5(r, u);\n          const m = a || (i && !a && d5(t, { initial: !0, ...l }));\n          e({ nodeInternals: new Map(r), fitViewOnInitDone: m }),\n            (h == null ? void 0 : h.length) > 0 && (o == null || o(h));\n        },\n        updateNodePositions: (n, o = !0, r = !1) => {\n          const { triggerNodeChanges: i } = t(),\n            a = n.map((l) => {\n              const s = {\n                id: l.id,\n                type: \"position\",\n                dragging: r,\n              };\n              return (\n                o &&\n                  ((s.positionAbsolute = l.positionAbsolute),\n                  (s.position = l.position)),\n                s\n              );\n            });\n          i(a);\n        },\n        triggerNodeChanges: (n) => {\n          const {\n            onNodesChange: o,\n            nodeInternals: r,\n            hasDefaultNodes: i,\n            nodeOrigin: a,\n            getNodes: l,\n            elevateNodesOnSelect: s,\n          } = t();\n          if (n != null && n.length) {\n            if (i) {\n              const u = Hb(n, l()),\n                c = $l(u, r, a, s);\n              e({ nodeInternals: c });\n            }\n            o == null || o(n);\n          }\n        },\n        addSelectedNodes: (n) => {\n          const { multiSelectionActive: o, edges: r, getNodes: i } = t();\n          let a,\n            l = null;\n          o\n            ? (a = n.map((s) => Ln(s, !0)))\n            : ((a = go(i(), n)), (l = go(r, []))),\n            si({\n              changedNodes: a,\n              changedEdges: l,\n              get: t,\n              set: e,\n            });\n        },\n        addSelectedEdges: (n) => {\n          const { multiSelectionActive: o, edges: r, getNodes: i } = t();\n          let a,\n            l = null;\n          o\n            ? (a = n.map((s) => Ln(s, !0)))\n            : ((a = go(r, n)), (l = go(i(), []))),\n            si({\n              changedNodes: l,\n              changedEdges: a,\n              get: t,\n              set: e,\n            });\n        },\n        unselectNodesAndEdges: ({ nodes: n, edges: o } = {}) => {\n          const { edges: r, getNodes: i } = t(),\n            a = n || i(),\n            l = o || r,\n            s = a.map((c) => ((c.selected = !1), Ln(c.id, !1))),\n            u = l.map((c) => Ln(c.id, !1));\n          si({\n            changedNodes: s,\n            changedEdges: u,\n            get: t,\n            set: e,\n          });\n        },\n        setMinZoom: (n) => {\n          const { d3Zoom: o, maxZoom: r } = t();\n          o == null || o.scaleExtent([n, r]), e({ minZoom: n });\n        },\n        setMaxZoom: (n) => {\n          const { d3Zoom: o, minZoom: r } = t();\n          o == null || o.scaleExtent([r, n]), e({ maxZoom: n });\n        },\n        setTranslateExtent: (n) => {\n          var o;\n          (o = t().d3Zoom) == null || o.translateExtent(n),\n            e({ translateExtent: n });\n        },\n        resetSelectedElements: () => {\n          const { edges: n, getNodes: o } = t(),\n            i = o()\n              .filter((l) => l.selected)\n              .map((l) => Ln(l.id, !1)),\n            a = n.filter((l) => l.selected).map((l) => Ln(l.id, !1));\n          si({\n            changedNodes: i,\n            changedEdges: a,\n            get: t,\n            set: e,\n          });\n        },\n        setNodeExtent: (n) => {\n          const { nodeInternals: o } = t();\n          o.forEach((r) => {\n            r.positionAbsolute = Ic(r.position, n);\n          }),\n            e({\n              nodeExtent: n,\n              nodeInternals: new Map(o),\n            });\n        },\n        panBy: (n) => {\n          const {\n            transform: o,\n            width: r,\n            height: i,\n            d3Zoom: a,\n            d3Selection: l,\n            translateExtent: s,\n          } = t();\n          if (!a || !l || (!n.x && !n.y)) return !1;\n          const u = Fn.translate(o[0] + n.x, o[1] + n.y).scale(o[2]),\n            c = [\n              [0, 0],\n              [r, i],\n            ],\n            d = a == null ? void 0 : a.constrain()(u, c, s);\n          return (\n            a.transform(l, d), o[0] !== d.x || o[1] !== d.y || o[2] !== d.k\n          );\n        },\n        cancelConnection: () =>\n          e({\n            connectionNodeId: An.connectionNodeId,\n            connectionHandleId: An.connectionHandleId,\n            connectionHandleType: An.connectionHandleType,\n            connectionStatus: An.connectionStatus,\n            connectionStartHandle: An.connectionStartHandle,\n            connectionEndHandle: An.connectionEndHandle,\n          }),\n        reset: () => e({ ...An }),\n      }),\n      Object.is,\n    ),\n  Rr = ({ children: e }) => {\n    const t = he(null);\n    return (\n      t.current || (t.current = Ey()),\n      $.createElement(Bm, { value: t.current }, e)\n    );\n  };\nRr.displayName = \"ReactFlowProvider\";\nconst E5 = ({ children: e }) =>\n  Xe(fa) ? $.createElement($.Fragment, null, e) : $.createElement(Rr, null, e);\nE5.displayName = \"ReactFlowWrapper\";\nconst Sy = {\n    input: o5,\n    default: Hs,\n    output: i5,\n    group: Zc,\n  },\n  ky = {\n    default: Zi,\n    straight: Bc,\n    step: Pc,\n    smoothstep: ha,\n    simplebezier: zc,\n  },\n  _y = [0, 0],\n  Ay = [15, 15],\n  My = { x: 0, y: 0, zoom: 1 },\n  Ty = {\n    width: \"100%\",\n    height: \"100%\",\n    overflow: \"hidden\",\n    position: \"relative\",\n    zIndex: 0,\n  },\n  pa = ea(\n    (\n      {\n        nodes: e,\n        edges: t,\n        defaultNodes: n,\n        defaultEdges: o,\n        className: r,\n        nodeTypes: i = Sy,\n        edgeTypes: a = ky,\n        onNodeClick: l,\n        onEdgeClick: s,\n        onInit: u,\n        onMove: c,\n        onMoveStart: d,\n        onMoveEnd: p,\n        onConnect: h,\n        onConnectStart: m,\n        onConnectEnd: b,\n        onClickConnectStart: y,\n        onClickConnectEnd: g,\n        onNodeMouseEnter: x,\n        onNodeMouseMove: v,\n        onNodeMouseLeave: S,\n        onNodeContextMenu: w,\n        onNodeDoubleClick: E,\n        onNodeDragStart: M,\n        onNodeDrag: _,\n        onNodeDragStop: j,\n        onNodesDelete: R,\n        onEdgesDelete: D,\n        onSelectionChange: P,\n        onSelectionDragStart: V,\n        onSelectionDrag: k,\n        onSelectionDragStop: N,\n        onSelectionContextMenu: T,\n        onSelectionStart: F,\n        onSelectionEnd: I,\n        connectionMode: L = oo.Strict,\n        connectionLineType: C = Dn.Bezier,\n        connectionLineStyle: H,\n        connectionLineComponent: B,\n        connectionLineContainerStyle: A,\n        deleteKeyCode: W = \"Backspace\",\n        selectionKeyCode: G = \"Shift\",\n        selectionOnDrag: K = !1,\n        selectionMode: Q = Sr.Full,\n        panActivationKeyCode: ne = \"Space\",\n        multiSelectionKeyCode: oe = $i() ? \"Meta\" : \"Control\",\n        zoomActivationKeyCode: U = $i() ? \"Meta\" : \"Control\",\n        snapToGrid: ge = !1,\n        snapGrid: J = Ay,\n        onlyRenderVisibleElements: _e = !1,\n        selectNodesOnDrag: ie = !0,\n        nodesDraggable: Ae,\n        nodesConnectable: We,\n        nodesFocusable: Ee,\n        nodeOrigin: le = _y,\n        edgesFocusable: Qe,\n        edgesUpdatable: Lt,\n        elementsSelectable: nn,\n        defaultViewport: Dt = My,\n        minZoom: on = 0.5,\n        maxZoom: kt = 2,\n        translateExtent: Wt = Ps,\n        preventScrolling: jt = !0,\n        nodeExtent: Z,\n        defaultMarkerColor: ee = \"#b1b1b7\",\n        zoomOnScroll: ce = !0,\n        zoomOnPinch: xe = !0,\n        panOnScroll: de = !1,\n        panOnScrollSpeed: $e = 0.5,\n        panOnScrollMode: nt = Yn.Free,\n        zoomOnDoubleClick: tt = !0,\n        panOnDrag: ht = !0,\n        onPaneClick: at,\n        onPaneMouseEnter: Se,\n        onPaneMouseMove: Zt,\n        onPaneMouseLeave: lt,\n        onPaneScroll: kn,\n        onPaneContextMenu: rn,\n        children: ao,\n        onEdgeContextMenu: Ut,\n        onEdgeDoubleClick: Vr,\n        onEdgeMouseEnter: xa,\n        onEdgeMouseMove: $r,\n        onEdgeMouseLeave: wa,\n        onEdgeUpdate: Wr,\n        onEdgeUpdateStart: Zr,\n        onEdgeUpdateEnd: Ea,\n        onReconnect: Sa,\n        onReconnectStart: Ur,\n        onReconnectEnd: qr,\n        reconnectRadius: ka = 10,\n        edgeUpdaterRadius: _a = 10,\n        onNodesChange: Aa,\n        onEdgesChange: Ma,\n        noDragClassName: z = \"nodrag\",\n        noWheelClassName: X = \"nowheel\",\n        noPanClassName: re = \"nopan\",\n        fitView: fe = !1,\n        fitViewOptions: Me,\n        connectOnClick: Ie = !0,\n        attributionPosition: we,\n        proOptions: ye,\n        defaultEdgeOptions: st,\n        elevateNodesOnSelect: Ue = !0,\n        elevateEdgesOnSelect: Ye = !1,\n        disableKeyboardA11y: pt = !1,\n        autoPanOnConnect: _n = !0,\n        autoPanOnNodeDrag: gn = !0,\n        connectionRadius: dt = 20,\n        isValidConnection: $o,\n        onError: Ta,\n        style: Oa,\n        id: T1,\n        nodeDragThreshold: qf,\n        ...Yf\n      },\n      Gf,\n    ) => {\n      const Na = T1 || \"1\";\n      return $.createElement(\n        \"div\",\n        {\n          ...Yf,\n          style: { ...Oa, ...Ty },\n          ref: Gf,\n          className: yt([\"react-flow\", r]),\n          \"data-testid\": \"rf__wrapper\",\n          id: T1,\n        },\n        $.createElement(\n          E5,\n          null,\n          $.createElement(wy, {\n            onInit: u,\n            onMove: c,\n            onMoveStart: d,\n            onMoveEnd: p,\n            onNodeClick: l,\n            onEdgeClick: s,\n            onNodeMouseEnter: x,\n            onNodeMouseMove: v,\n            onNodeMouseLeave: S,\n            onNodeContextMenu: w,\n            onNodeDoubleClick: E,\n            nodeTypes: i,\n            edgeTypes: a,\n            connectionLineType: C,\n            connectionLineStyle: H,\n            connectionLineComponent: B,\n            connectionLineContainerStyle: A,\n            selectionKeyCode: G,\n            selectionOnDrag: K,\n            selectionMode: Q,\n            deleteKeyCode: W,\n            multiSelectionKeyCode: oe,\n            panActivationKeyCode: ne,\n            zoomActivationKeyCode: U,\n            onlyRenderVisibleElements: _e,\n            selectNodesOnDrag: ie,\n            defaultViewport: Dt,\n            translateExtent: Wt,\n            minZoom: on,\n            maxZoom: kt,\n            preventScrolling: jt,\n            zoomOnScroll: ce,\n            zoomOnPinch: xe,\n            zoomOnDoubleClick: tt,\n            panOnScroll: de,\n            panOnScrollSpeed: $e,\n            panOnScrollMode: nt,\n            panOnDrag: ht,\n            onPaneClick: at,\n            onPaneMouseEnter: Se,\n            onPaneMouseMove: Zt,\n            onPaneMouseLeave: lt,\n            onPaneScroll: kn,\n            onPaneContextMenu: rn,\n            onSelectionContextMenu: T,\n            onSelectionStart: F,\n            onSelectionEnd: I,\n            onEdgeContextMenu: Ut,\n            onEdgeDoubleClick: Vr,\n            onEdgeMouseEnter: xa,\n            onEdgeMouseMove: $r,\n            onEdgeMouseLeave: wa,\n            onReconnect: Sa ?? Wr,\n            onReconnectStart: Ur ?? Zr,\n            onReconnectEnd: qr ?? Ea,\n            reconnectRadius: ka ?? _a,\n            defaultMarkerColor: ee,\n            noDragClassName: z,\n            noWheelClassName: X,\n            noPanClassName: re,\n            elevateEdgesOnSelect: Ye,\n            rfId: Na,\n            disableKeyboardA11y: pt,\n            nodeOrigin: le,\n            nodeExtent: Z,\n          }),\n          $.createElement(yb, {\n            nodes: e,\n            edges: t,\n            defaultNodes: n,\n            defaultEdges: o,\n            onConnect: h,\n            onConnectStart: m,\n            onConnectEnd: b,\n            onClickConnectStart: y,\n            onClickConnectEnd: g,\n            nodesDraggable: Ae,\n            nodesConnectable: We,\n            nodesFocusable: Ee,\n            edgesFocusable: Qe,\n            edgesUpdatable: Lt,\n            elementsSelectable: nn,\n            elevateNodesOnSelect: Ue,\n            minZoom: on,\n            maxZoom: kt,\n            nodeExtent: Z,\n            onNodesChange: Aa,\n            onEdgesChange: Ma,\n            snapToGrid: ge,\n            snapGrid: J,\n            connectionMode: L,\n            translateExtent: Wt,\n            connectOnClick: Ie,\n            defaultEdgeOptions: st,\n            fitView: fe,\n            fitViewOptions: Me,\n            onNodesDelete: R,\n            onEdgesDelete: D,\n            onNodeDragStart: M,\n            onNodeDrag: _,\n            onNodeDragStop: j,\n            onSelectionDrag: k,\n            onSelectionDragStart: V,\n            onSelectionDragStop: N,\n            noPanClassName: re,\n            nodeOrigin: le,\n            rfId: Na,\n            autoPanOnConnect: _n,\n            autoPanOnNodeDrag: gn,\n            onError: Ta,\n            connectionRadius: dt,\n            isValidConnection: $o,\n            nodeDragThreshold: qf,\n          }),\n          $.createElement(mb, { onSelectionChange: P }),\n          ao,\n          $.createElement($m, { proOptions: ye, position: we }),\n          $.createElement(Eb, { rfId: Na, disableKeyboardA11y: pt }),\n        ),\n      );\n    },\n  );\npa.displayName = \"ReactFlow\";\nfunction Oy() {\n  return $.createElement(\n    \"svg\",\n    { xmlns: \"http://www.w3.org/2000/svg\", viewBox: \"0 0 32 32\" },\n    $.createElement(\"path\", {\n      d: \"M32 18.133H18.133V32h-4.266V18.133H0v-4.266h13.867V0h4.266v13.867H32z\",\n    }),\n  );\n}\nfunction Ny() {\n  return $.createElement(\n    \"svg\",\n    { xmlns: \"http://www.w3.org/2000/svg\", viewBox: \"0 0 32 5\" },\n    $.createElement(\"path\", { d: \"M0 0h32v4.2H0z\" }),\n  );\n}\nfunction Ly() {\n  return $.createElement(\n    \"svg\",\n    { xmlns: \"http://www.w3.org/2000/svg\", viewBox: \"0 0 32 30\" },\n    $.createElement(\"path\", {\n      d: \"M3.692 4.63c0-.53.4-.938.939-.938h5.215V0H4.708C2.13 0 0 2.054 0 4.63v5.216h3.692V4.631zM27.354 0h-5.2v3.692h5.17c.53 0 .984.4.984.939v5.215H32V4.631A4.624 4.624 0 0027.354 0zm.954 24.83c0 .532-.4.94-.939.94h-5.215v3.768h5.215c2.577 0 4.631-2.13 4.631-4.707v-5.139h-3.692v5.139zm-23.677.94c-.531 0-.939-.4-.939-.94v-5.138H0v5.139c0 2.577 2.13 4.707 4.708 4.707h5.138V25.77H4.631z\",\n    }),\n  );\n}\nfunction Dy() {\n  return $.createElement(\n    \"svg\",\n    { xmlns: \"http://www.w3.org/2000/svg\", viewBox: \"0 0 25 32\" },\n    $.createElement(\"path\", {\n      d: \"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0 8 0 4.571 3.429 4.571 7.619v3.048H3.048A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047zm4.724-13.866H7.467V7.619c0-2.59 2.133-4.724 4.723-4.724 2.591 0 4.724 2.133 4.724 4.724v3.048z\",\n    }),\n  );\n}\nfunction jy() {\n  return $.createElement(\n    \"svg\",\n    { xmlns: \"http://www.w3.org/2000/svg\", viewBox: \"0 0 25 32\" },\n    $.createElement(\"path\", {\n      d: \"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0c-4.114 1.828-1.37 2.133.305 2.438 1.676.305 4.42 2.59 4.42 5.181v3.048H3.047A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047z\",\n    }),\n  );\n}\nconst or = ({ children: e, className: t, ...n }) =>\n  $.createElement(\n    \"button\",\n    { type: \"button\", className: yt([\"react-flow__controls-button\", t]), ...n },\n    e,\n  );\nor.displayName = \"ControlButton\";\nconst Fy = (e) => ({\n    isInteractive:\n      e.nodesDraggable || e.nodesConnectable || e.elementsSelectable,\n    minZoomReached: e.transform[2] <= e.minZoom,\n    maxZoomReached: e.transform[2] >= e.maxZoom,\n  }),\n  S5 = ({\n    style: e,\n    showZoom: t = !0,\n    showFitView: n = !0,\n    showInteractive: o = !0,\n    fitViewOptions: r,\n    onZoomIn: i,\n    onZoomOut: a,\n    onFitView: l,\n    onInteractiveChange: s,\n    className: u,\n    children: c,\n    position: d = \"bottom-left\",\n  }) => {\n    const p = rt(),\n      [h, m] = se(!1),\n      { isInteractive: b, minZoomReached: y, maxZoomReached: g } = qe(Fy, ut),\n      { zoomIn: x, zoomOut: v, fitView: S } = tn();\n    if (\n      (ue(() => {\n        m(!0);\n      }, []),\n      !h)\n    )\n      return null;\n    const w = () => {\n        x(), i == null || i();\n      },\n      E = () => {\n        v(), a == null || a();\n      },\n      M = () => {\n        S(r), l == null || l();\n      },\n      _ = () => {\n        p.setState({\n          nodesDraggable: !b,\n          nodesConnectable: !b,\n          elementsSelectable: !b,\n        }),\n          s == null || s(!b);\n      };\n    return $.createElement(\n      I3,\n      {\n        className: yt([\"react-flow__controls\", u]),\n        position: d,\n        style: e,\n        \"data-testid\": \"rf__controls\",\n      },\n      t &&\n        $.createElement(\n          $.Fragment,\n          null,\n          $.createElement(\n            or,\n            {\n              onClick: w,\n              className: \"react-flow__controls-zoomin\",\n              title: \"zoom in\",\n              \"aria-label\": \"zoom in\",\n              disabled: g,\n            },\n            $.createElement(Oy, null),\n          ),\n          $.createElement(\n            or,\n            {\n              onClick: E,\n              className: \"react-flow__controls-zoomout\",\n              title: \"zoom out\",\n              \"aria-label\": \"zoom out\",\n              disabled: y,\n            },\n            $.createElement(Ny, null),\n          ),\n        ),\n      n &&\n        $.createElement(\n          or,\n          {\n            className: \"react-flow__controls-fitview\",\n            onClick: M,\n            title: \"fit view\",\n            \"aria-label\": \"fit view\",\n          },\n          $.createElement(Ly, null),\n        ),\n      o &&\n        $.createElement(\n          or,\n          {\n            className: \"react-flow__controls-interactive\",\n            onClick: _,\n            title: \"toggle interactivity\",\n            \"aria-label\": \"toggle interactivity\",\n          },\n          b ? $.createElement(jy, null) : $.createElement(Dy, null),\n        ),\n      c,\n    );\n  };\nS5.displayName = \"Controls\";\nvar qc = Ke(S5),\n  Xt;\n(function (e) {\n  (e.Lines = \"lines\"), (e.Dots = \"dots\"), (e.Cross = \"cross\");\n})(Xt || (Xt = {}));\nfunction Ry({ color: e, dimensions: t, lineWidth: n }) {\n  return $.createElement(\"path\", {\n    stroke: e,\n    strokeWidth: n,\n    d: `M${t[0] / 2} 0 V${t[1]} M0 ${t[1] / 2} H${t[0]}`,\n  });\n}\nfunction Iy({ color: e, radius: t }) {\n  return $.createElement(\"circle\", { cx: t, cy: t, r: t, fill: e });\n}\nconst Hy = {\n    [Xt.Dots]: \"#91919a\",\n    [Xt.Lines]: \"#eee\",\n    [Xt.Cross]: \"#e2e2e2\",\n  },\n  zy = {\n    [Xt.Dots]: 1,\n    [Xt.Lines]: 1,\n    [Xt.Cross]: 6,\n  },\n  Py = (e) => ({ transform: e.transform, patternId: `pattern-${e.rfId}` });\nfunction k5({\n  id: e,\n  variant: t = Xt.Dots,\n  // only used for dots and cross\n  gap: n = 20,\n  // only used for lines and cross\n  size: o,\n  lineWidth: r = 1,\n  offset: i = 2,\n  color: a,\n  style: l,\n  className: s,\n}) {\n  const u = he(null),\n    { transform: c, patternId: d } = qe(Py, ut),\n    p = a || Hy[t],\n    h = o || zy[t],\n    m = t === Xt.Dots,\n    b = t === Xt.Cross,\n    y = Array.isArray(n) ? n : [n, n],\n    g = [y[0] * c[2] || 1, y[1] * c[2] || 1],\n    x = h * c[2],\n    v = b ? [x, x] : g,\n    S = m ? [x / i, x / i] : [v[0] / i, v[1] / i];\n  return $.createElement(\n    \"svg\",\n    {\n      className: yt([\"react-flow__background\", s]),\n      style: {\n        ...l,\n        position: \"absolute\",\n        width: \"100%\",\n        height: \"100%\",\n        top: 0,\n        left: 0,\n      },\n      ref: u,\n      \"data-testid\": \"rf__background\",\n    },\n    $.createElement(\n      \"pattern\",\n      {\n        id: d + e,\n        x: c[0] % g[0],\n        y: c[1] % g[1],\n        width: g[0],\n        height: g[1],\n        patternUnits: \"userSpaceOnUse\",\n        patternTransform: `translate(-${S[0]},-${S[1]})`,\n      },\n      m\n        ? $.createElement(Iy, { color: p, radius: x / i })\n        : $.createElement(Ry, { dimensions: v, color: p, lineWidth: r }),\n    ),\n    $.createElement(\"rect\", {\n      x: \"0\",\n      y: \"0\",\n      width: \"100%\",\n      height: \"100%\",\n      fill: `url(#${d + e})`,\n    }),\n  );\n}\nk5.displayName = \"Background\";\nvar Yc = Ke(k5);\nconst Gc = \"columns\",\n  Kc = \"exposure\",\n  Xc = \"tables\",\n  By = \"feedback\",\n  _5 = \"settings\",\n  Cn = \"column-\",\n  A5 = \"see-more-\",\n  M5 = 5,\n  Vy = 100,\n  ql = 100,\n  Ir = 300,\n  wo = 80,\n  $y = 12,\n  Wy = wo,\n  T5 = 30,\n  t0 = 4,\n  Zy = 280,\n  Uy = 80,\n  qy = 80,\n  Yy = 250,\n  Bs = 0.05,\n  O5 = \"#7A899E\",\n  Qc = \"#E38E00\",\n  Jc = {\n    Original: \"#FDD835\",\n    Alias: \"#40C8AE\",\n    Transformation: \"#FF754C\",\n    Unchanged: \"#BC3FBC\",\n    \"Not sure\": \"#247efe\",\n    \"Non select\": \"#BC3FBC\",\n  },\n  ga = {\n    stroke: O5,\n    strokeWidth: 1,\n  },\n  e1 = {\n    stroke: Qc,\n    strokeWidth: 2,\n  },\n  t1 = {\n    stroke: Qc,\n    strokeWidth: 1,\n    strokeDasharray: 10,\n  },\n  N5 = {\n    type: \"arrow\",\n    strokeWidth: 1,\n    width: 24,\n    height: 24,\n    color: O5,\n  },\n  L5 = {\n    type: \"arrow\",\n    strokeWidth: 1,\n    width: 16,\n    height: 16,\n    color: Qc,\n  },\n  xt = (e) => e.id.startsWith(Cn),\n  ui = (e) => e.id.startsWith(A5),\n  En = (e) => !e.id.startsWith(Cn),\n  n1 = (e, t, n, o, r, i = !1) => {\n    const [a, l] = r ? [n, o] : [o, n],\n      [s, u] = r ? Vs(e, t, i) : Vs(t, e, i);\n    return {\n      id: `${a}-${l}`,\n      source: a,\n      target: l,\n      sourceHandle: s,\n      targetHandle: u,\n      style: ga,\n      markerEnd: N5,\n      type: n === o ? \"selfConnecting\" : e === t ? \"smoothstep\" : \"default\",\n    };\n  },\n  Do = (e, t, n) => ({\n    id: e.table,\n    data: { ...e, level: t, parent: n },\n    position: { x: 100, y: 100 },\n    type: \"table\",\n    width: Ir,\n    height: wo,\n  }),\n  D5 = (e, t, n, o) => ({\n    id: e,\n    data: { ...o, level: t, parent: n, id: e },\n    position: { x: 100, y: 100 },\n    type: \"operator\",\n    width: Ir,\n    height: wo,\n  }),\n  Ui = (e, t, n, o, r) => ({\n    id: _r(e, t),\n    data: { column: t, table: e, viewsType: n, viewsCode: o, nodeType: r },\n    parentNode: e,\n    extent: \"parent\",\n    draggable: !1,\n    type: \"column\",\n    position: { x: 100, y: 100 },\n    height: T5,\n  }),\n  qi = (e, t, n, o, r, i) => {\n    const a = ma(e, t),\n      [l, s] = Vs(n, o, !1);\n    return {\n      id: a,\n      data: { type: r },\n      source: e,\n      target: t,\n      sourceHandle: l,\n      targetHandle: s,\n      style: r === \"direct\" ? e1 : t1,\n      zIndex: 1e3,\n      markerEnd: L5,\n      type: n === o ? \"smoothstep\" : \"default\",\n      hidden: !i[r],\n    };\n  },\n  ma = (e, t) => Cn + `${e}-${t}`,\n  Yi = (e, t) => {\n    e.style = { opacity: t ? 1 : 0.5 };\n  },\n  jo = (e, t) => {\n    var n;\n    (e.style = t\n      ? ((n = e.data) == null ? void 0 : n.type) === \"indirect\"\n        ? t1\n        : e1\n      : ga),\n      (e.markerEnd = t ? L5 : N5);\n  },\n  Vs = (e, t, n) =>\n    n\n      ? e < t\n        ? [\"bottom\", \"top\"]\n        : e > t\n          ? [\"top\", \"bottom\"]\n          : e < 0\n            ? [\"top\", \"top\"]\n            : [\"bottom\", \"bottom\"]\n      : e < t\n        ? [\"right\", \"left\"]\n        : e > t\n          ? [\"left\", \"right\"]\n          : e < 0\n            ? [\"left\", \"left\"]\n            : [\"right\", \"right\"],\n  Gy = (e, t) => {\n    const n = {};\n    e.forEach((i) => {\n      En(i) && (n[i.id] = i.data.level);\n    });\n    const o = {};\n    e.filter((i) => i.type === \"table\").forEach((i) => (o[i.id] = !0));\n    const r = {};\n    for (const i of t) {\n      if (xt(i)) continue;\n      const a = o[i.source],\n        l = o[i.target];\n      if (!(a && l)) {\n        if (a) {\n          e.find((u) => u.id === i.target).data.tables.forEach((u) => {\n            r[u.table] = i.target;\n          });\n          continue;\n        }\n        l &&\n          e\n            .find((u) => u.id === i.source)\n            .data.tables.forEach((u) => {\n              r[u.table] = i.source;\n            });\n      }\n    }\n    return { levelMap: n, tableNodes: o, seeMoreIdTableReverseMap: r };\n  },\n  _r = (e, t) => Cn + `${e}/${t}`,\n  Gi = (e, t) => A5 + e + \"-\" + (t ? \"1\" : \"0\"),\n  n0 = (e, t) => {\n    for (const n of e) if (n[0] === t[0] && n[1] === t[1]) return !0;\n    return !1;\n  },\n  o0 = (e, t, n) => {\n    (e[t] = e[t] || []), e[t].push(...n);\n  },\n  ki = (e, t = 1) => e * (T5 + t0) + t * t0,\n  r0 = (e, t) => (n) => e <= n && n <= t,\n  Ky = (e, t) => (n) => e < n && n < t,\n  i0 = (e, t) => {\n    const n = e.findIndex((o) => o.id === t);\n    n !== -1 && e.splice(n, 1);\n  },\n  a0 = (e, t, n) => (e === -1 || n >= t ? t : n >= e ? n : e),\n  Ar = (e, t, n = !0) => {\n    e.forEach((o) => {\n      xt(o) || ((o.hidden = !t), n && jo(o, t));\n    });\n  },\n  Mr = (e, t, n = !0) => {\n    e.forEach((o) => {\n      xt(o) && ((o.hidden = !t), n && jo(o, t));\n    });\n  };\nfunction j5(e) {\n  const t = /* @__PURE__ */ new Map(),\n    n = /* @__PURE__ */ new Map();\n  for (const [i, a] of e)\n    t.has(i) || t.set(i, 0),\n      t.has(a) || t.set(a, 0),\n      t.set(a, t.get(a) + 1),\n      n.has(i) || n.set(i, 0),\n      n.has(a) || n.set(a, 0),\n      n.set(i, n.get(i) + 1);\n  const o = [],\n    r = [];\n  for (const [i, a] of t) a === 0 && o.push(i);\n  for (const [i, a] of n) a === 0 && r.push(i);\n  return { sources: o, sinks: r };\n}\nconst Xy = \"_table_node_1h0by_1\",\n  Qy = \"_header_1h0by_8\",\n  Jy = \"_collapse_1h0by_16\",\n  eC = \"_selected_1h0by_21\",\n  tC = \"_content_1h0by_24\",\n  nC = \"_table_header_1h0by_37\",\n  oC = \"_seed_1h0by_48\",\n  rC = \"_model_1h0by_53\",\n  iC = \"_source_1h0by_58\",\n  aC = \"_exposure_1h0by_63\",\n  lC = \"_snapshot_1h0by_68\",\n  sC = \"_metrics_1h0by_73\",\n  cC = \"_macros_1h0by_78\",\n  uC = \"_analysis_1h0by_83\",\n  dC = \"_node_icon_1h0by_88\",\n  fC = \"_dialect_icon_1h0by_100\",\n  hC = \"_table_handle_1h0by_109\",\n  pC = \"_see_more_node_1h0by_123\",\n  gC = \"_table_card_1h0by_134\",\n  mC = \"_disabled_1h0by_146\",\n  bC = \"_column_card_1h0by_151\",\n  yC = \"_edit_icon_1h0by_164\",\n  CC = \"_active_1h0by_172\",\n  vC = \"_expand_lineage_icon_1h0by_176\",\n  xC = \"_processing_div_1h0by_189\",\n  wC = \"_gif_img_1h0by_192\",\n  EC = \"_card_1h0by_197\",\n  SC = \"_column_node_1h0by_212\",\n  kC = \"_column_name_1h0by_223\",\n  _C = \"_column_top_right_1h0by_228\",\n  AC = \"_divider_1h0by_236\",\n  MC = \"_table_details_header_1h0by_242\",\n  TC = \"_verticle_divider_1h0by_250\",\n  OC = \"_low_confidence_1h0by_255\",\n  NC = \"_high_confidence_1h0by_262\",\n  LC = \"_alert_icon_1h0by_269\",\n  DC = \"_menu_card_1h0by_275\",\n  jC = \"_menu_card_container_1h0by_280\",\n  FC = \"_table_details_tabs_1h0by_287\",\n  RC = \"_tab_1h0by_1\",\n  IC = \"_table_node_pill_1h0by_307\",\n  HC = \"_icon_1h0by_317\",\n  zC = \"_node-checkbox_1h0by_324\",\n  PC = \"_non_select_node_checkbox_1h0by_324\",\n  BC = \"_select_node_checkbox_1h0by_324\",\n  VC = \"_node_extra_info_1h0by_340\",\n  $C = \"_help_body_1h0by_344\",\n  WC = \"_feedback_body_1h0by_348\",\n  ZC = \"_cancel_btn_1h0by_351\",\n  UC = \"_expand_nav_1h0by_356\",\n  qC = \"_expand_nav_btn_1h0by_364\",\n  YC = \"_lineage_legend_1h0by_391\",\n  GC = \"_column_legend_1h0by_408\",\n  KC = \"_dot_1h0by_424\",\n  XC = \"_model_views_type_1h0by_436\",\n  QC = \"_close_button_1h0by_445\",\n  JC = \"_op_node_1h0by_458\",\n  ev = \"_light_mode_1h0by_477\",\n  tv = \"_dark_mode_1h0by_480\",\n  nv = \"_highlighted_1h0by_483\",\n  ov = \"_cost_data_1h0by_489\",\n  rv = \"_op_type_text_1h0by_504\",\n  iv = \"_node_stats_1h0by_507\",\n  av = \"_savings-performance_1h0by_523\",\n  lv = \"_performance_1h0by_523\",\n  sv = \"_savings_1h0by_523\",\n  cv = \"_value_1h0by_538\",\n  uv = \"_percent_1h0by_541\",\n  dv = \"_static_table_node_1h0by_556\",\n  fv = \"_details_btn_1h0by_620\",\n  hv = \"_enable_1h0by_629\",\n  pv = \"_disable_1h0by_146\",\n  gv = \"_code_editor_container_1h0by_640\",\n  mv = \"_code_editor_1h0by_640\",\n  bv = \"_tooltip_container_1h0by_654\",\n  yv = \"_tooltip_text_1h0by_660\",\n  Cv = \"_views_type_badge_1h0by_677\",\n  vv = \"_column_code_icon_1h0by_708\",\n  xv = \"_edge_select_1h0by_724\",\n  wv = \"_edge_non_select_1h0by_734\",\n  Ev = \"_modal_views_code_container_1h0by_744\",\n  Sv = \"_custom_node_code_block_1h0by_749\",\n  kv = \"_reset_btn_1h0by_761\",\n  _v = \"_error_tooltip_1h0by_767\",\n  Av = \"_tableWrapper_1h0by_778\",\n  Mv = \"_dataTable_1h0by_784\",\n  Y = {\n    table_node: Xy,\n    header: Qy,\n    collapse: Jy,\n    selected: eC,\n    content: tC,\n    table_header: nC,\n    seed: oC,\n    model: rC,\n    source: iC,\n    exposure: aC,\n    snapshot: lC,\n    metrics: sC,\n    macros: cC,\n    analysis: uC,\n    node_icon: dC,\n    dialect_icon: fC,\n    table_handle: hC,\n    see_more_node: pC,\n    table_card: gC,\n    disabled: mC,\n    column_card: bC,\n    edit_icon: yC,\n    active: CC,\n    expand_lineage_icon: vC,\n    processing_div: xC,\n    gif_img: wC,\n    card: EC,\n    column_node: SC,\n    default: \"_default_1h0by_220\",\n    column_name: kC,\n    column_top_right: _C,\n    divider: AC,\n    table_details_header: MC,\n    verticle_divider: TC,\n    low_confidence: OC,\n    high_confidence: NC,\n    alert_icon: LC,\n    menu_card: DC,\n    menu_card_container: jC,\n    table_details_tabs: FC,\n    tab: RC,\n    table_node_pill: IC,\n    icon: HC,\n    \"node-checkbox\": \"_node-checkbox_1h0by_324\",\n    nodeCheckbox: zC,\n    non_select_node_checkbox: PC,\n    select_node_checkbox: BC,\n    node_extra_info: VC,\n    help_body: $C,\n    feedback_body: WC,\n    cancel_btn: ZC,\n    expand_nav: UC,\n    expand_nav_btn: qC,\n    lineage_legend: YC,\n    column_legend: GC,\n    dot: KC,\n    model_views_type: XC,\n    close_button: QC,\n    op_node: JC,\n    light_mode: ev,\n    dark_mode: tv,\n    highlighted: nv,\n    cost_data: ov,\n    op_type_text: rv,\n    node_stats: iv,\n    \"savings-performance\": \"_savings-performance_1h0by_523\",\n    savingsPerformance: av,\n    performance: lv,\n    savings: sv,\n    value: cv,\n    percent: uv,\n    static_table_node: dv,\n    details_btn: fv,\n    enable: hv,\n    disable: pv,\n    code_editor_container: gv,\n    code_editor: mv,\n    tooltip_container: bv,\n    tooltip_text: yv,\n    views_type_badge: Cv,\n    column_code_icon: vv,\n    edge_select: xv,\n    edge_non_select: wv,\n    modal_views_code_container: Ev,\n    custom_node_code_block: Sv,\n    reset_btn: kv,\n    error_tooltip: _v,\n    tableWrapper: Av,\n    dataTable: Mv,\n  },\n  F5 = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 16 16\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M14.4138 13.7953L11.7681 11.9423C11.5927 11.8194 11.4733 11.6319 11.4361 11.421C11.399 11.2101 11.4471 10.9931 11.57 10.8177C11.6928 10.6422 11.8803 10.5228 12.0912 10.4857C12.3022 10.4485 12.5192 10.4966 12.6946 10.6195L15.3402 12.4725C15.5157 12.5953 15.6351 12.7828 15.6722 12.9937C15.7094 13.2047 15.6613 13.4217 15.5384 13.5971C15.4155 13.7725 15.228 13.8919 15.0171 13.9291C14.8062 13.9663 14.5892 13.9181 14.4138 13.7953Z\",\n        fill: \"currentColor\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M6.23472 10.7666C6.66662 10.7666 7.07057 10.5991 7.37216 10.2948L10.0514 7.59139C10.6629 6.97429 10.6502 5.98265 10.0231 5.38078C9.39602 4.77904 8.38821 4.79152 7.77672 5.40855L6.205 6.99435L5.92965 6.73088C5.30167 6.13015 4.29393 6.1439 3.6832 6.76187C3.07266 7.37983 3.08677 8.37148 3.71475 8.97241L5.12733 10.3241C5.42551 10.6095 5.81883 10.7666 6.23472 10.7666ZM4.41777 7.46468C4.63478 7.24508 4.9928 7.24052 5.21559 7.45375L5.85755 8.0681C6.0601 8.26201 6.38398 8.25765 6.58135 8.05864L8.51014 6.11251C8.72742 5.89323 9.0853 5.88901 9.3079 6.10258C9.53063 6.31635 9.53505 6.6685 9.31798 6.88763L6.63874 9.59098C6.43168 9.80891 6.05451 9.81354 5.84153 9.60145L4.42895 8.24974C4.20602 8.0363 4.2009 7.68409 4.41777 7.46468Z\",\n        fill: \"currentColor\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M1.2696 8.46259C1.23524 8.18365 0.981431 7.98549 0.702382 8.01991C0.423451 8.05439 0.225306 8.3085 0.259604 8.58741C0.29722 8.89279 0.35694 9.19928 0.43695 9.49824C0.894474 11.2074 1.99015 12.6358 3.52208 13.5203C5.05401 14.4047 6.83878 14.6394 8.54776 14.181C10.2568 13.7227 11.6852 12.6262 12.5701 11.0936C13.455 9.56087 13.6903 7.77555 13.2327 6.06641C12.2882 2.53813 8.64974 0.437554 5.12192 1.38363C2.71678 2.02867 0.892688 3.9422 0.361517 6.37751C0.301593 6.65214 0.475849 6.92324 0.750129 6.98306C1.02465 7.04286 1.29584 6.86868 1.35567 6.59407C1.80529 4.53259 3.34929 2.91276 5.38514 2.36679C8.37085 1.56596 11.4504 3.34395 12.2497 6.33007C12.637 7.77666 12.4378 9.28772 11.6889 10.5849C10.94 11.8821 9.73094 12.8101 8.28453 13.198C6.83821 13.5859 5.32757 13.3873 4.031 12.6388C2.73449 11.8902 1.80712 10.6813 1.41988 9.23469C1.35207 8.98094 1.30145 8.72123 1.2696 8.46259Z\",\n        fill: \"currentColor\",\n      }),\n    ),\n  R5 = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 15 15\",\n        fill: \"none\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"circle\", {\n        cx: 7.5,\n        cy: 7.5,\n        r: 6.9,\n        stroke: \"currentColor\",\n        strokeWidth: 1.2,\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M7.05 7.5V7.95H7.5H11C11.1548 7.95 11.2873 8.01395 11.3684 8.10088C11.4447 8.18264 11.4755 8.28138 11.4504 8.39262C11.3415 8.87457 11.1448 9.33503 10.8675 9.75006C10.4224 10.4161 9.78991 10.9352 9.04987 11.2417C8.30983 11.5482 7.49551 11.6285 6.70988 11.4722C5.92426 11.3159 5.20262 10.9302 4.63622 10.3638C4.06981 9.79738 3.68409 9.07574 3.52782 8.29012C3.37155 7.50449 3.45175 6.69017 3.75829 5.95013C4.06482 5.21009 4.58392 4.57757 5.24994 4.13255C5.66497 3.85524 6.12543 3.65849 6.60738 3.54959C6.71862 3.52445 6.81736 3.55531 6.89912 3.6316C6.98605 3.71271 7.05 3.84521 7.05 4V7.5Z\",\n        stroke: \"currentColor\",\n        strokeWidth: 0.9,\n      }),\n    ),\n  Tv = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: 15,\n        height: 15,\n        viewBox: \"0 0 11 10\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\n        \"g\",\n        { clipPath: \"url(#clip0_19334_15206)\" },\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M8.87489 5.27405C8.77129 5.27405 8.67194 5.3152 8.59868 5.38846C8.52543 5.46171 8.48428 5.56106 8.48428 5.66466V7.23702C8.48393 7.5407 8.36314 7.83185 8.1484 8.0466C7.93366 8.26133 7.64251 8.38213 7.33882 8.38247H2.86441C2.56073 8.38213 2.26958 8.26133 2.05484 8.0466C1.8401 7.83185 1.7193 7.5407 1.71896 7.23702V2.76261C1.7193 2.45892 1.8401 2.16777 2.05484 1.95303C2.26958 1.73829 2.56073 1.6175 2.86441 1.61715H4.43677C4.54037 1.61715 4.63972 1.576 4.71297 1.50275C4.78623 1.42949 4.82738 1.33014 4.82738 1.22654C4.82738 1.12295 4.78623 1.0236 4.71297 0.950344C4.63972 0.877091 4.54037 0.835938 4.43677 0.835938H2.86441C2.35362 0.836541 1.86391 1.03972 1.50272 1.40091C1.14153 1.7621 0.938347 2.25181 0.937744 2.76261V7.23702C0.938347 7.74782 1.14153 8.23752 1.50272 8.59871C1.86391 8.9599 2.35362 9.16308 2.86441 9.16369H7.33882C7.84962 9.16308 8.33933 8.9599 8.70052 8.59871C9.06171 8.23752 9.26489 7.74782 9.26549 7.23702V5.66466C9.26549 5.56106 9.22434 5.46171 9.15109 5.38846C9.07783 5.3152 8.97848 5.27405 8.87489 5.27405Z\",\n          fill: \"#FFCE73\",\n        }),\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M8.86633 0.832031H6.43805C6.33577 0.832012 6.23756 0.872113 6.16452 0.94372C6.09149 1.01533 6.04945 1.11273 6.04745 1.21499C6.04338 1.43422 6.22778 1.61325 6.44684 1.61325H7.93327L4.8224 4.72508C4.74916 4.79834 4.70801 4.89769 4.70801 5.00128C4.70801 5.10487 4.74916 5.20422 4.8224 5.27747C4.89566 5.35072 4.99501 5.39187 5.0986 5.39187C5.20219 5.39187 5.30154 5.35072 5.37479 5.27747L8.48663 2.16661V3.6584C8.48663 3.762 8.52778 3.86135 8.60103 3.9346C8.67429 4.00786 8.77364 4.04901 8.87724 4.04901C8.98083 4.04901 9.08018 4.00786 9.15344 3.9346C9.22669 3.86135 9.26784 3.762 9.26784 3.6584V1.23338C9.26784 1.18066 9.25746 1.12846 9.23728 1.07975C9.2171 1.03105 9.18752 0.986797 9.15023 0.949526C9.11295 0.912255 9.06868 0.882696 9.01997 0.862535C8.97126 0.842375 8.91905 0.83201 8.86633 0.832031Z\",\n          fill: \"#FFCE73\",\n        }),\n      ),\n      /* @__PURE__ */ O.createElement(\n        \"defs\",\n        null,\n        /* @__PURE__ */ O.createElement(\n          \"clipPath\",\n          { id: \"clip0_19334_15206\" },\n          /* @__PURE__ */ O.createElement(\"rect\", {\n            width: 10,\n            height: 10,\n            fill: \"white\",\n            transform: \"translate(0.101318)\",\n          }),\n        ),\n      ),\n    ),\n  Ov = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 16 17\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M4.96894 9.82478V7.14121H4V6.5H6.67883V7.14121H5.68139V9.82478H4.96894Z\",\n        fill: \"currentColor\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M6.60431 10.485L8.57544 6.5H9.24039L7.27402 10.485H6.60431Z\",\n        fill: \"currentColor\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M9.7534 9.82478V6.5H10.4659V9.82478H9.7534ZM10.0811 8.50437V7.89166H11.8005V8.50437H10.0811ZM10.0811 7.14121V6.5H12V7.14121H10.0811Z\",\n        fill: \"currentColor\",\n      }),\n      /* @__PURE__ */ O.createElement(\"circle\", {\n        cx: 8,\n        cy: 8.5,\n        r: 6.5,\n        stroke: \"currentColor\",\n      }),\n    ),\n  Nv = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 16 17\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M3 13.3L6.794 3.5H8.334L12.1 13.3H10.49L8.25 7.392C8.222 7.32667 8.166 7.168 8.082 6.916C8.00733 6.664 7.91867 6.384 7.816 6.076C7.71333 5.768 7.62 5.488 7.536 5.236C7.452 4.97467 7.396 4.80667 7.368 4.732L7.69 4.718C7.634 4.87667 7.564 5.07733 7.48 5.32C7.40533 5.56267 7.32133 5.81933 7.228 6.09C7.144 6.36067 7.06 6.61733 6.976 6.86C6.892 7.09333 6.822 7.28933 6.766 7.448L4.54 13.3H3ZM4.68 10.864L5.24 9.408H9.692L10.336 10.864H4.68Z\",\n        fill: \"currentColor\",\n      }),\n    ),\n  Lv = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 16 17\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M8.13796 13.5L9.81796 3.70001H11.078L9.39796 13.5H8.13796ZM3.43396 11.078V9.91601H11.54V11.078H3.43396ZM4.41396 13.5L6.09396 3.70001H7.35396L5.67396 13.5H4.41396ZM3.96596 7.15801V5.99601H12.058V7.15801H3.96596Z\",\n        fill: \"currentColor\",\n      }),\n    ),\n  Dv = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 16 17\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M3.86339 12.4999C3.56384 12.4353 3.3054 12.356 3.08808 12.262C2.87075 12.168 2.69161 12.0506 2.55064 11.9096C2.40967 11.7745 2.30395 11.61 2.23346 11.4162C2.16885 11.2282 2.13655 11.0109 2.13655 10.7642L2.14536 9.92723C2.14536 9.61593 2.07781 9.38392 1.94272 9.23121C1.80762 9.07262 1.61379 8.99039 1.36123 8.98452H1V8.01537H1.37885C1.63142 8.00949 1.82231 7.9302 1.95153 7.77749C2.08075 7.62477 2.14536 7.38983 2.14536 7.07265L2.13655 6.23566C2.13655 5.75402 2.27164 5.37811 2.54183 5.10792C2.81789 4.83186 3.25841 4.62922 3.86339 4.5L4.1189 5.38104C3.8957 5.4574 3.71949 5.53376 3.59027 5.61012C3.46692 5.68647 3.37882 5.78926 3.32596 5.91848C3.27897 6.04183 3.25547 6.21216 3.25547 6.42949L3.27309 7.196C3.27309 7.53667 3.17618 7.82154 2.98235 8.05061C2.79439 8.27968 2.50071 8.44414 2.10131 8.54399V8.44708C2.50071 8.55868 2.79439 8.72901 2.98235 8.95808C3.17618 9.18716 3.27309 9.46909 3.27309 9.80389L3.25547 10.5704C3.25547 10.776 3.27897 10.9375 3.32596 11.055C3.37882 11.1783 3.46692 11.2782 3.59027 11.3545C3.71949 11.4309 3.8957 11.5072 4.1189 11.5836L3.86339 12.4999Z\",\n        fill: \"currentColor\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M5.05191 12.3765V4.53524H7.55408V5.57487H6.17965L6.23251 5.50439V11.4426L6.1444 11.3369H7.55408V12.3765H5.05191Z\",\n        fill: \"currentColor\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M8.43567 12.3765V11.3369H9.8101L9.75724 11.4074V5.46915L9.84534 5.57487H8.43567V4.53524H10.9378V12.3765H8.43567Z\",\n        fill: \"currentColor\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M12.1366 12.4999L11.8723 11.6188C12.0955 11.5425 12.2688 11.4661 12.3921 11.3898C12.5155 11.3134 12.6036 11.2106 12.6564 11.0814C12.7152 10.9581 12.7445 10.7877 12.7445 10.5704L12.7269 9.80389C12.7269 9.46322 12.8209 9.17835 13.0088 8.94927C13.2027 8.7202 13.4964 8.55574 13.8899 8.45589L13.8987 8.5528C13.4993 8.44121 13.2027 8.27087 13.0088 8.0418C12.8209 7.81273 12.7269 7.53079 12.7269 7.196L12.7445 6.42949C12.7445 6.21804 12.7181 6.05358 12.6652 5.9361C12.6124 5.81863 12.5243 5.72171 12.4009 5.64536C12.2776 5.569 12.1014 5.49264 11.8723 5.41629L12.1366 4.5C12.4362 4.55874 12.6917 4.63803 12.9031 4.73788C13.1204 4.83186 13.2996 4.94933 13.4406 5.0903C13.5874 5.22539 13.6931 5.38986 13.7577 5.58368C13.8282 5.77164 13.8635 5.98897 13.8635 6.23566L13.8546 7.07265C13.8546 7.38395 13.9222 7.6189 14.0573 7.77749C14.1924 7.9302 14.3862 8.00949 14.6388 8.01537H15V8.98452H14.6212C14.3686 8.99039 14.1777 9.06968 14.0485 9.2224C13.9193 9.37511 13.8546 9.61006 13.8546 9.92723L13.8635 10.7642C13.8635 11.2459 13.7254 11.6218 13.4494 11.892C13.1733 12.168 12.7357 12.3707 12.1366 12.4999Z\",\n        fill: \"currentColor\",\n      }),\n    ),\n  jv = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 16 17\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M5.33325 1.83398V3.83398\",\n        stroke: \"currentColor\",\n        strokeMiterlimit: 10,\n        strokeLinecap: \"round\",\n        strokeLinejoin: \"round\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M10.6667 1.83398V3.83398\",\n        stroke: \"currentColor\",\n        strokeMiterlimit: 10,\n        strokeLinecap: \"round\",\n        strokeLinejoin: \"round\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M2.33325 6.56055H13.6666\",\n        stroke: \"currentColor\",\n        strokeMiterlimit: 10,\n        strokeLinecap: \"round\",\n        strokeLinejoin: \"round\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M14 11.4073V6.16732C14 4.16732 13 2.83398 10.6667 2.83398H5.33333C3 2.83398 2 4.16732 2 6.16732V11.834C2 13.834 3 15.1673 5.33333 15.1673H10.2467\",\n        stroke: \"currentColor\",\n        strokeMiterlimit: 10,\n        strokeLinecap: \"round\",\n        strokeLinejoin: \"round\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M2 6.59464L2 11.8346C2 13.8346 3 15.168 5.33333 15.168L10.6667 15.168C13 15.168 14 13.8346 14 11.8346L14 6.16797C14 4.16797 13 2.83464 10.6667 2.83464L5.75333 2.83464\",\n        stroke: \"currentColor\",\n        strokeMiterlimit: 10,\n        strokeLinecap: \"round\",\n        strokeLinejoin: \"round\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M10.4955 9H10.5045\",\n        stroke: \"currentColor\",\n        strokeWidth: 1.5,\n        strokeLinecap: \"round\",\n        strokeLinejoin: \"round\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M10.4955 12H10.5045\",\n        stroke: \"currentColor\",\n        strokeWidth: 1.5,\n        strokeLinecap: \"round\",\n        strokeLinejoin: \"round\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M5.4955 9H5.5045\",\n        stroke: \"currentColor\",\n        strokeWidth: 1.5,\n        strokeLinecap: \"round\",\n        strokeLinejoin: \"round\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M5.4955 12H5.5045\",\n        stroke: \"currentColor\",\n        strokeWidth: 1.5,\n        strokeLinecap: \"round\",\n        strokeLinejoin: \"round\",\n      }),\n    ),\n  Fv = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 16 17\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M13 7.40909C13 11.2273 8 14.5 8 14.5C8 14.5 3 11.2273 3 7.40909C3 6.10712 3.52678 4.85847 4.46447 3.93784C5.40215 3.01721 6.67392 2.5 8 2.5C9.32608 2.5 10.5979 3.01721 11.5355 3.93784C12.4732 4.85847 13 6.10712 13 7.40909Z\",\n        stroke: \"currentColor\",\n        strokeLinecap: \"round\",\n        strokeLinejoin: \"round\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M8 9.5C9.10457 9.5 10 8.60457 10 7.5C10 6.39543 9.10457 5.5 8 5.5C6.89543 5.5 6 6.39543 6 7.5C6 8.60457 6.89543 9.5 8 9.5Z\",\n        stroke: \"currentColor\",\n        strokeLinecap: \"round\",\n        strokeLinejoin: \"round\",\n      }),\n    ),\n  di = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 16 16\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        fillRule: \"evenodd\",\n        clipRule: \"evenodd\",\n        d: \"M2.21021 4.09393C2.32237 3.84159 2.61785 3.72794 2.87019 3.84009L8.00046 6.12021L13.1307 3.84009C13.3831 3.72794 13.6785 3.84159 13.7907 4.09393C13.9029 4.34627 13.7892 4.64175 13.5369 4.7539L8.20353 7.12425C8.07426 7.18172 7.92666 7.18172 7.79739 7.12425L2.46405 4.7539C2.21171 4.64175 2.09806 4.34627 2.21021 4.09393Z\",\n        fill: \"currentColor\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        fillRule: \"evenodd\",\n        clipRule: \"evenodd\",\n        d: \"M6.71387 1.35887C7.53267 0.994961 8.46733 0.994961 9.28613 1.35887L12.6195 2.84035C13.763 3.3486 14.5 4.48265 14.5 5.73408V10.2681C14.5 11.5195 13.763 12.6536 12.6195 13.1618L9.28613 14.6433C8.46733 15.0072 7.53267 15.0072 6.71387 14.6433L3.38056 13.1618C2.23699 12.6536 1.5 11.5195 1.5 10.2681V5.73408C1.5 4.48265 2.23699 3.3486 3.38056 2.84035L6.71387 1.35887ZM8.88 2.27268C8.31973 2.02369 7.68027 2.02369 7.12 2.27268L3.7867 3.75416C3.00425 4.10191 2.5 4.87784 2.5 5.73408V10.2681C2.5 11.1244 3.00426 11.9002 3.7867 12.248L7.12 13.7295C7.68027 13.9785 8.31973 13.9785 8.88 13.7295L12.2133 12.248C12.9957 11.9002 13.5 11.1244 13.5 10.2681V5.73408C13.5 4.87784 12.9957 4.10191 12.2133 3.75416L8.88 2.27268Z\",\n        fill: \"currentColor\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        fillRule: \"evenodd\",\n        clipRule: \"evenodd\",\n        d: \"M8 6.16406C8.27613 6.16406 8.5 6.38792 8.5 6.66406V13.9974C8.5 14.2735 8.27613 14.4974 8 14.4974C7.72387 14.4974 7.5 14.2735 7.5 13.9974V6.66406C7.5 6.38792 7.72387 6.16406 8 6.16406Z\",\n        fill: \"currentColor\",\n      }),\n    ),\n  Rv = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 16 16\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M13.5445 3.32188L10.532 0.46875C10.2102 0.165625 9.79141 0 9.35078 0H3.61328C2.66641 0 1.89453 0.771875 1.89453 1.71875V14.2812C1.89453 15.2281 2.66641 16 3.61328 16H12.3633C13.3102 16 14.082 15.2281 14.082 14.2812V4.56875C14.082 4.1 13.8852 3.64375 13.5445 3.32188ZM12.6352 3.75H10.3008C10.2133 3.75 10.1445 3.68125 10.1445 3.59375V1.39375L12.6352 3.75ZM12.3633 15.0625H3.61328C3.18203 15.0625 2.83203 14.7125 2.83203 14.2812V1.71875C2.83203 1.2875 3.18203 0.9375 3.61328 0.9375H9.20703V3.59375C9.20703 4.19688 9.69766 4.6875 10.3008 4.6875H13.1445V14.2812C13.1445 14.7125 12.7945 15.0625 12.3633 15.0625Z\",\n        fill: \"currentColor\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M11.332 6.25H4.45703C4.19766 6.25 3.98828 6.45937 3.98828 6.71875C3.98828 6.97812 4.19766 7.1875 4.45703 7.1875H11.332C11.5914 7.1875 11.8008 6.97812 11.8008 6.71875C11.8008 6.45937 11.5914 6.25 11.332 6.25Z\",\n        fill: \"currentColor\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M11.332 8.75H4.45703C4.19766 8.75 3.98828 8.95937 3.98828 9.21875C3.98828 9.47812 4.19766 9.6875 4.45703 9.6875H11.332C11.5914 9.6875 11.8008 9.47812 11.8008 9.21875C11.8008 8.95937 11.5914 8.75 11.332 8.75Z\",\n        fill: \"currentColor\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M6.72891 11.25H4.45703C4.19766 11.25 3.98828 11.4594 3.98828 11.7188C3.98828 11.9781 4.19766 12.1875 4.45703 12.1875H6.72891C6.98828 12.1875 7.19766 11.9781 7.19766 11.7188C7.19766 11.4594 6.98828 11.25 6.72891 11.25Z\",\n        fill: \"currentColor\",\n      }),\n    ),\n  Iv = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 16 16\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M14.9459 3.20159C14.9296 2.34608 14.1459 1.58527 12.732 1.05955C11.4651 0.589349 9.7867 0.328125 8.01364 0.328125C6.23731 0.328125 4.56221 0.589349 3.292 1.05955C1.87813 1.58527 1.09119 2.34935 1.07812 3.20486C1.07812 3.21139 1.07812 3.22119 1.07812 3.22772V13.0889C1.07812 13.9575 1.86506 14.7249 3.292 15.2571C4.56221 15.7306 6.23731 15.9885 8.01364 15.9885C9.78996 15.9885 11.4651 15.7273 12.7353 15.2571C14.1622 14.7281 14.9491 13.9575 14.9491 13.0889V3.22772C14.9459 3.22119 14.9459 3.21139 14.9459 3.20159ZM13.9271 13.0889C13.9271 13.8563 11.6218 14.9698 8.01037 14.9698C4.39894 14.9698 2.09364 13.8563 2.09364 13.0889V11.3747C2.42017 11.5967 2.81853 11.7959 3.28874 11.9722C4.56221 12.4424 6.23731 12.7036 8.01364 12.7036C9.78996 12.7036 11.4683 12.4424 12.7353 11.9722C13.2055 11.7959 13.6038 11.5967 13.9304 11.3747V13.0889H13.9271ZM13.9271 9.78772C13.9271 9.79098 13.9271 9.79751 13.9271 9.80078C13.9271 10.5681 11.6218 11.6816 8.01037 11.6816C4.39894 11.6816 2.09364 10.5681 2.09364 9.80078V8.08649C2.42017 8.30853 2.81853 8.50772 3.28874 8.68404C4.55894 9.15751 6.23404 9.41547 8.01037 9.41547C9.7867 9.41547 11.4618 9.15425 12.732 8.68404C13.2022 8.51098 13.6006 8.30853 13.9271 8.08649V9.78772ZM13.9271 6.50282C13.9271 6.50608 13.9271 6.51261 13.9271 6.51588C13.9271 7.28323 11.6218 8.3967 8.01037 8.3967C4.39894 8.3967 2.09364 7.28323 2.09364 6.51588V4.80159C2.42017 5.02363 2.81853 5.22282 3.28874 5.39588C4.55894 5.86935 6.23404 6.12731 8.01037 6.12731C9.7867 6.12731 11.4618 5.86608 12.732 5.39588C13.1989 5.22282 13.6006 5.02037 13.9271 4.80159V6.50282ZM8.01364 5.10853C4.40221 5.10853 2.0969 3.99506 2.0969 3.22772C2.0969 2.46037 4.40221 1.3469 8.01364 1.3469C11.6251 1.3469 13.9304 2.46037 13.9304 3.22772C13.9271 3.99506 11.6251 5.10853 8.01364 5.10853Z\",\n        fill: \"currentColor\",\n      }),\n    ),\n  Hv = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 16 16\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M14.4866 5.36855C15.0957 6.86998 15.165 8.53621 14.6829 10.0831C14.2007 11.6299 13.1969 12.9616 11.8425 13.8511C10.4882 14.7405 8.86727 15.1325 7.25618 14.9604C5.64508 14.7882 4.1436 14.0624 3.00781 12.9069C1.87202 11.7514 1.17225 10.2376 1.02786 8.62381C0.883469 7.00999 1.30339 5.39605 2.21601 4.05724C3.12863 2.71844 4.47742 1.73768 6.03236 1.28224C7.58731 0.826792 9.25209 0.924866 10.7428 1.55973C10.7925 1.58093 10.8376 1.61172 10.8755 1.65034C10.9133 1.68896 10.9432 1.73466 10.9634 1.78482C10.9836 1.83499 10.9937 1.88864 10.9931 1.94271C10.9926 1.99678 10.9814 2.05022 10.9602 2.09997C10.939 2.14972 10.9082 2.1948 10.8696 2.23265C10.831 2.2705 10.7853 2.30037 10.7351 2.32056C10.685 2.34075 10.6313 2.35086 10.5772 2.35031C10.5232 2.34977 10.4697 2.33858 10.42 2.31738C9.78137 2.05018 9.10237 1.89233 8.41139 1.85044V2.23914C8.41139 2.34835 8.36801 2.45308 8.29079 2.53031C8.21357 2.60753 8.10883 2.65091 7.99963 2.65091C7.89042 2.65091 7.78569 2.60753 7.70846 2.53031C7.63124 2.45308 7.58786 2.34835 7.58786 2.23914V1.84962C6.23566 1.92718 4.94927 2.45909 3.93716 3.35914L4.21139 3.63914C4.27086 3.71844 4.29974 3.81652 4.29271 3.91539C4.28568 4.01426 4.24323 4.10728 4.17314 4.17736C4.10306 4.24745 4.01004 4.2899 3.91117 4.29693C3.8123 4.30396 3.71422 4.27508 3.63492 4.21561L3.35492 3.94138C2.45563 4.95419 1.92309 6.24001 1.84293 7.59208H2.23492C2.34413 7.59208 2.44887 7.63546 2.52609 7.71268C2.60331 7.7899 2.64669 7.89464 2.64669 8.00384C2.64669 8.11305 2.60331 8.21779 2.52609 8.29501C2.44887 8.37223 2.34413 8.41561 2.23492 8.41561H1.84293C1.92277 9.76775 2.45536 11.0537 3.35492 12.0663L3.63492 11.7921C3.71422 11.7326 3.8123 11.7037 3.91117 11.7108C4.01004 11.7178 4.10306 11.7602 4.17314 11.8303C4.24323 11.9004 4.28568 11.9934 4.29271 12.0923C4.29974 12.1912 4.27086 12.2893 4.21139 12.3685L3.93386 12.6461C4.94651 13.5477 6.23421 14.0805 7.58786 14.1581V13.7685C7.58786 13.6593 7.63124 13.5546 7.70846 13.4774C7.78569 13.4002 7.89042 13.3568 7.99963 13.3568C8.10883 13.3568 8.21357 13.4002 8.29079 13.4774C8.36801 13.5546 8.41139 13.6593 8.41139 13.7685V14.1581C9.76359 14.0805 11.05 13.5486 12.0621 12.6485L11.7879 12.3685C11.7284 12.2893 11.6995 12.1912 11.7065 12.0923C11.7136 11.9934 11.756 11.9004 11.8261 11.8303C11.8962 11.7602 11.9892 11.7178 12.0881 11.7108C12.1869 11.7037 12.285 11.7326 12.3643 11.7921L12.6419 12.0696C13.5435 11.0568 14.0768 9.76931 14.1555 8.41561H13.7643C13.6551 8.41561 13.5504 8.37223 13.4732 8.29501C13.3959 8.21779 13.3526 8.11305 13.3526 8.00384C13.3526 7.89464 13.3959 7.7899 13.4732 7.71268C13.5504 7.63546 13.6551 7.59208 13.7643 7.59208H14.1563C14.116 6.93556 13.97 6.28984 13.724 5.67985C13.7015 5.62939 13.6893 5.57492 13.6883 5.51968C13.6873 5.46444 13.6974 5.40957 13.7181 5.35832C13.7387 5.30707 13.7694 5.26049 13.8084 5.22137C13.8474 5.18224 13.8939 5.15137 13.9451 5.13058C13.9963 5.1098 14.0511 5.09953 14.1064 5.10038C14.1616 5.10124 14.2161 5.1132 14.2667 5.13556C14.3172 5.15791 14.3627 5.19021 14.4005 5.23052C14.4382 5.27083 14.4675 5.31834 14.4866 5.3702V5.36855ZM9.13363 6.28679L12.6501 2.7695C12.7274 2.69218 12.8323 2.64874 12.9416 2.64874C13.051 2.64874 13.1558 2.69218 13.2332 2.7695C13.3105 2.84682 13.3539 2.95168 13.3539 3.06103C13.3539 3.17037 13.3105 3.27524 13.2332 3.35256L9.71586 6.86902C9.94005 7.20496 10.0593 7.59997 10.0584 8.00384C10.0584 8.41104 9.9377 8.80909 9.71147 9.14766C9.48525 9.48624 9.1637 9.75012 8.7875 9.90595C8.4113 10.0618 7.99734 10.1025 7.59797 10.0231C7.1986 9.94367 6.83175 9.74758 6.54382 9.45965C6.25589 9.17172 6.0598 8.80487 5.98036 8.4055C5.90092 8.00613 5.9417 7.59217 6.09752 7.21597C6.25335 6.83977 6.51723 6.51822 6.85581 6.292C7.19438 6.06577 7.59243 5.94502 7.99963 5.94502C8.40303 5.94474 8.79742 6.06426 9.1328 6.28843L9.13363 6.28679ZM9.23492 8.00384C9.23492 7.75953 9.16247 7.5207 9.02674 7.31755C8.891 7.11441 8.69807 6.95608 8.47235 6.86258C8.24663 6.76909 7.99826 6.74462 7.75863 6.79229C7.51901 6.83995 7.2989 6.9576 7.12614 7.13036C6.95338 7.30312 6.83573 7.52323 6.78807 7.76285C6.7404 8.00247 6.76487 8.25085 6.85836 8.47657C6.95186 8.70229 7.11019 8.89522 7.31333 9.03095C7.51648 9.16669 7.75531 9.23914 7.99963 9.23914C8.32725 9.23914 8.64145 9.10899 8.87311 8.87733C9.10477 8.64567 9.23492 8.33146 9.23492 8.00384Z\",\n        fill: \"currentColor\",\n      }),\n    ),\n  $s = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 28 28\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        fillRule: \"evenodd\",\n        clipRule: \"evenodd\",\n        d: \"M3.66065 10.0305L7.83899 6.409C7.78126 6.25246 7.74974 6.08317 7.74974 5.90684C7.74974 5.09996 8.41001 4.4461 9.22481 4.4461C10.0396 4.4461 10.6746 5.07534 10.6994 5.86067L14.0017 7.0057C14.2721 6.6913 14.6753 6.49167 15.1251 6.49167C15.3791 6.49167 15.618 6.55499 15.8262 6.66711L19.6333 3.44619C19.5792 3.29448 19.5499 3.13091 19.5499 2.96074C19.5499 2.15386 20.2101 1.5 21.0249 1.5C21.8397 1.5 22.5 2.15386 22.5 2.96074C22.5 3.76762 21.8397 4.42148 21.0249 4.42148C20.7709 4.42148 20.5321 4.35816 20.3238 4.24603L16.5167 7.46696C16.5709 7.61866 16.6002 7.78224 16.6002 7.95241C16.6002 8.75929 15.9399 9.41315 15.1251 9.41315C14.3103 9.41315 13.6753 8.78391 13.6509 7.99858L10.3486 6.85355C10.0782 7.16795 9.6755 7.36758 9.22525 7.36758C8.97748 7.36758 8.74392 7.3069 8.53922 7.20005L4.36089 10.8216C4.41862 10.9781 4.45014 11.1474 4.45014 11.3237C4.45014 12.1306 3.78987 12.7845 2.97507 12.7845C2.16027 12.7845 1.5 12.1306 1.5 11.3237C1.5 10.5168 2.16027 9.86298 2.97507 9.86298C3.22284 9.86298 3.45596 9.92366 3.66065 10.0305ZM19.9024 7.30646C19.5356 7.30646 19.2364 7.60283 19.2364 7.96604V21.4267C19.2364 21.7899 19.5356 22.0862 19.9024 22.0862H20.8149C21.1817 22.0862 21.4809 21.7899 21.4809 21.4267V7.9656C21.4809 7.60239 21.1817 7.30602 20.8149 7.30602L19.9024 7.30646ZM14.0021 12.6855C13.6354 12.6855 13.3361 12.9819 13.3361 13.3451V21.5647C13.3361 21.9279 13.6354 22.2243 14.0021 22.2243H14.9146C15.2814 22.2243 15.5807 21.9279 15.5807 21.5647V13.3451C15.5807 12.9819 15.2814 12.6855 14.9146 12.6855H14.0021ZM8.1023 10.7543C7.73553 10.7543 7.43625 11.0507 7.43625 11.4139V21.7028C7.43625 22.066 7.73553 22.3624 8.1023 22.3624H9.01478C9.38155 22.3624 9.68083 22.066 9.68083 21.7028V11.4134C9.68083 11.0502 9.38155 10.7538 9.01478 10.7538L8.1023 10.7543ZM2.20246 16.4315H3.11494C3.48171 16.4315 3.78099 16.7278 3.78099 17.091V21.8404C3.78099 22.2036 3.48171 22.5 3.11494 22.5H2.20246C1.83569 22.5 1.53641 22.2036 1.53641 21.8404V17.091C1.53641 16.7278 1.83569 16.4315 2.20246 16.4315Z\",\n        fill: \"currentColor\",\n      }),\n    ),\n  zv = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 16 16\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M13.674 3.5H11.527L11.277 2.75C11.1565 2.38583 10.9242 2.06897 10.6131 1.84453C10.302 1.62009 9.92808 1.49953 9.5445 1.5H6.4555C6.07202 1.49971 5.69821 1.62035 5.38726 1.84477C5.0763 2.06919 4.84403 2.38596 4.7235 2.75L4.473 3.5H2.326C1.84188 3.50053 1.37773 3.69308 1.03541 4.03541C0.693081 4.37774 0.500529 4.84188 0.5 5.326V12.676C0.501058 13.1598 0.693843 13.6234 1.03611 13.9653C1.37838 14.3072 1.84222 14.4995 2.326 14.5H13.676C14.1598 14.4989 14.6234 14.3062 14.9653 13.9639C15.3072 13.6216 15.4995 13.1578 15.5 12.674V5.324C15.4989 4.84023 15.3062 4.3766 14.9639 4.0347C14.6216 3.69281 14.1578 3.50053 13.674 3.5ZM14.5 12.674C14.4997 12.893 14.4126 13.1029 14.2578 13.2578C14.1029 13.4126 13.893 13.4997 13.674 13.5H2.326C2.10701 13.4997 1.89707 13.4126 1.74222 13.2578C1.58737 13.1029 1.50026 12.893 1.5 12.674V5.324C1.50079 5.10536 1.58814 4.89593 1.74293 4.74152C1.89772 4.5871 2.10736 4.50026 2.326 4.5H4.8335C4.9384 4.49992 5.04061 4.46685 5.12568 4.40548C5.21074 4.3441 5.27435 4.25752 5.3075 4.158L5.672 3.0645C5.72673 2.90003 5.83189 2.75697 5.97253 2.65564C6.11317 2.55431 6.28216 2.49985 6.4555 2.5H9.5445C9.71792 2.49981 9.88699 2.55431 10.0277 2.65575C10.1683 2.75718 10.2734 2.90039 10.328 3.065L10.6925 4.158C10.7256 4.25752 10.7893 4.3441 10.8743 4.40548C10.9594 4.46685 11.0616 4.49992 11.1665 4.5H13.674C13.893 4.50027 14.1029 4.58738 14.2578 4.74222C14.4126 4.89707 14.4997 5.10701 14.5 5.326V12.674Z\",\n        fill: \"currentColor\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M8 5C7.25832 5 6.5333 5.21993 5.91661 5.63199C5.29993 6.04404 4.81928 6.62971 4.53545 7.31494C4.25162 8.00016 4.17736 8.75416 4.32206 9.48159C4.46675 10.209 4.8239 10.8772 5.34835 11.4017C5.8728 11.9261 6.54098 12.2833 7.26841 12.4279C7.99584 12.5726 8.74984 12.4984 9.43506 12.2145C10.1203 11.9307 10.706 11.4501 11.118 10.8334C11.5301 10.2167 11.75 9.49168 11.75 8.75C11.7489 7.75576 11.3535 6.80255 10.6505 6.09952C9.94745 5.39649 8.99424 5.00106 8 5ZM8 11.5C7.4561 11.5 6.92442 11.3387 6.47218 11.0365C6.01995 10.7344 5.66747 10.3049 5.45933 9.80238C5.25119 9.29988 5.19673 8.74695 5.30284 8.2135C5.40895 7.68005 5.67086 7.19005 6.05546 6.80546C6.44005 6.42086 6.93006 6.15895 7.4635 6.05284C7.99695 5.94673 8.54988 6.00119 9.05238 6.20933C9.55488 6.41747 9.98437 6.76995 10.2865 7.22218C10.5887 7.67442 10.75 8.2061 10.75 8.75C10.7492 9.4791 10.4592 10.1781 9.94367 10.6937C9.42811 11.2092 8.7291 11.4992 8 11.5Z\",\n        fill: \"currentColor\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M13 6.5C13.2761 6.5 13.5 6.27614 13.5 6C13.5 5.72386 13.2761 5.5 13 5.5C12.7239 5.5 12.5 5.72386 12.5 6C12.5 6.27614 12.7239 6.5 13 6.5Z\",\n        fill: \"currentColor\",\n      }),\n    ),\n  Pv = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 16 16\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\n        \"g\",\n        { clipPath: \"url(#clip0_13119_16577)\" },\n        /* @__PURE__ */ O.createElement(\n          \"mask\",\n          {\n            id: \"mask0_13119_16577\",\n            style: {\n              maskType: \"luminance\",\n            },\n            maskUnits: \"userSpaceOnUse\",\n            x: 0,\n            y: 0,\n            width: 16,\n            height: 16,\n          },\n          /* @__PURE__ */ O.createElement(\"path\", {\n            d: \"M0 9.53674e-07H16V16H0V9.53674e-07Z\",\n            fill: \"white\",\n          }),\n        ),\n        /* @__PURE__ */ O.createElement(\n          \"g\",\n          { mask: \"url(#mask0_13119_16577)\" },\n          /* @__PURE__ */ O.createElement(\"path\", {\n            d: \"M0.46875 15.5312H15.5312\",\n            stroke: \"currentColor\",\n            strokeWidth: 0.8,\n            strokeMiterlimit: 10,\n            strokeLinecap: \"round\",\n            strokeLinejoin: \"round\",\n          }),\n          /* @__PURE__ */ O.createElement(\"path\", {\n            d: \"M3 11.7812H1.75C1.57741 11.7812 1.4375 11.9212 1.4375 12.0938V15.5312H3.3125V12.0938C3.3125 11.9212 3.17259 11.7812 3 11.7812Z\",\n            stroke: \"currentColor\",\n            strokeWidth: 0.8,\n            strokeMiterlimit: 10,\n            strokeLinecap: \"round\",\n            strokeLinejoin: \"round\",\n          }),\n          /* @__PURE__ */ O.createElement(\"path\", {\n            d: \"M6.75 10.6562H5.5C5.32741 10.6562 5.1875 10.7962 5.1875 10.9688V15.5312H7.0625V10.9688C7.0625 10.7962 6.92259 10.6562 6.75 10.6562Z\",\n            stroke: \"currentColor\",\n            strokeWidth: 0.8,\n            strokeMiterlimit: 10,\n            strokeLinecap: \"round\",\n            strokeLinejoin: \"round\",\n          }),\n          /* @__PURE__ */ O.createElement(\"path\", {\n            d: \"M10.5 8.9375H9.25C9.07741 8.9375 8.9375 9.07741 8.9375 9.25V15.5312H10.8125V9.25C10.8125 9.07741 10.6726 8.9375 10.5 8.9375Z\",\n            stroke: \"currentColor\",\n            strokeWidth: 0.8,\n            strokeMiterlimit: 10,\n            strokeLinecap: \"round\",\n            strokeLinejoin: \"round\",\n          }),\n          /* @__PURE__ */ O.createElement(\"path\", {\n            d: \"M14.25 5.8125H13C12.8274 5.8125 12.6875 5.95241 12.6875 6.125V15.5312H14.5625V6.125C14.5625 5.95241 14.4226 5.8125 14.25 5.8125Z\",\n            stroke: \"currentColor\",\n            strokeWidth: 0.8,\n            strokeMiterlimit: 10,\n            strokeLinecap: \"round\",\n            strokeLinejoin: \"round\",\n          }),\n          /* @__PURE__ */ O.createElement(\"path\", {\n            d: \"M0.46875 9.60156C6.62566 9.60156 12.7826 4.89466 14.7636 0.467189\",\n            stroke: \"currentColor\",\n            strokeWidth: 0.8,\n            strokeMiterlimit: 10,\n            strokeLinecap: \"round\",\n            strokeLinejoin: \"round\",\n          }),\n          /* @__PURE__ */ O.createElement(\"path\", {\n            d: \"M11.8994 1.23884L14.7641 0.47125L15.5317 3.33594\",\n            stroke: \"currentColor\",\n            strokeWidth: 0.8,\n            strokeMiterlimit: 10,\n            strokeLinecap: \"round\",\n            strokeLinejoin: \"round\",\n          }),\n        ),\n      ),\n      /* @__PURE__ */ O.createElement(\n        \"defs\",\n        null,\n        /* @__PURE__ */ O.createElement(\n          \"clipPath\",\n          { id: \"clip0_13119_16577\" },\n          /* @__PURE__ */ O.createElement(\"rect\", {\n            width: 16,\n            height: 16,\n            fill: \"white\",\n          }),\n        ),\n      ),\n    ),\n  Ws = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 16 16\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\n        \"g\",\n        { clipPath: \"url(#clip0_13132_13629)\" },\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M14.9389 11.3569L12.3125 9.88281L14.9389 8.40875C15.2577 8.22978 15.2573 7.76997 14.9389 7.59122L12.3126 6.11709L14.9388 4.64313C15.2577 4.46416 15.2573 4.00434 14.9388 3.82559L8.2295 0.06C8.08697 -0.02 7.91315 -0.02 7.77062 0.06L1.06128 3.82562C0.742402 4.00462 0.742871 4.46444 1.06128 4.64316L3.68762 6.11719L1.06125 7.59122C0.742371 7.77022 0.74284 8.23003 1.06125 8.40875L3.68762 9.88281L1.06125 11.3569C0.742371 11.5359 0.74284 11.9957 1.06125 12.1744L7.77062 15.94C7.91309 16.02 8.08697 16.02 8.2295 15.94L14.9389 12.1744C15.2577 11.9954 15.2573 11.5356 14.9389 11.3569ZM8.00006 1.00628L13.7517 4.23438L8.00006 7.46247L2.24843 4.23438L8.00006 1.00628ZM4.6454 6.65472L7.77065 8.40875C7.91312 8.48872 8.087 8.48875 8.22953 8.40875L11.3549 6.65462L13.7518 7.99997L8.00006 11.2281L2.24843 8L4.6454 6.65472ZM8.00006 14.9937L2.2484 11.7656L4.64537 10.4203L7.77062 12.1744C7.91309 12.2543 8.08697 12.2544 8.2295 12.1744L11.3547 10.4203L13.7517 11.7656L8.00006 14.9937Z\",\n          fill: \"currentColor\",\n        }),\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M8 10.1484C8.25888 10.1484 8.46875 9.93857 8.46875 9.67969C8.46875 9.4208 8.25888 9.21094 8 9.21094C7.74112 9.21094 7.53125 9.4208 7.53125 9.67969C7.53125 9.93857 7.74112 10.1484 8 10.1484Z\",\n          fill: \"currentColor\",\n        }),\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M6.2832 9.25C6.54209 9.25 6.75195 9.04013 6.75195 8.78125C6.75195 8.52237 6.54209 8.3125 6.2832 8.3125C6.02432 8.3125 5.81445 8.52237 5.81445 8.78125C5.81445 9.04013 6.02432 9.25 6.2832 9.25Z\",\n          fill: \"currentColor\",\n        }),\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M4.56738 8.39062C4.82627 8.39062 5.03613 8.18076 5.03613 7.92188C5.03613 7.66299 4.82627 7.45312 4.56738 7.45312C4.3085 7.45312 4.09863 7.66299 4.09863 7.92188C4.09863 8.18076 4.3085 8.39062 4.56738 8.39062Z\",\n          fill: \"currentColor\",\n        }),\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M9.7168 9.25C9.97568 9.25 10.1855 9.04013 10.1855 8.78125C10.1855 8.52237 9.97568 8.3125 9.7168 8.3125C9.45791 8.3125 9.24805 8.52237 9.24805 8.78125C9.24805 9.04013 9.45791 9.25 9.7168 9.25Z\",\n          fill: \"currentColor\",\n        }),\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M11.4326 8.39062C11.6915 8.39062 11.9014 8.18076 11.9014 7.92188C11.9014 7.66299 11.6915 7.45312 11.4326 7.45312C11.1737 7.45312 10.9639 7.66299 10.9639 7.92188C10.9639 8.18076 11.1737 8.39062 11.4326 8.39062Z\",\n          fill: \"currentColor\",\n        }),\n      ),\n      /* @__PURE__ */ O.createElement(\n        \"defs\",\n        null,\n        /* @__PURE__ */ O.createElement(\n          \"clipPath\",\n          { id: \"clip0_13132_13629\" },\n          /* @__PURE__ */ O.createElement(\"rect\", {\n            width: 16,\n            height: 16,\n            fill: \"white\",\n          }),\n        ),\n      ),\n    ),\n  Bv = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: 11,\n        height: 6,\n        viewBox: \"0 0 11 6\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M0.812951 5.52021C0.990462 5.69772 1.26824 5.71386 1.46398 5.56862L1.52006 5.52021L5.83317 1.20732L10.1463 5.52021C10.3238 5.69772 10.6016 5.71386 10.7973 5.56862L10.8534 5.52021C11.0309 5.3427 11.047 5.06492 10.9018 4.86918L10.8534 4.8131L6.18672 0.146439C6.00921 -0.031072 5.73144 -0.047207 5.5357 0.0980275L5.47962 0.146439L0.812951 4.8131C0.617688 5.00836 0.617688 5.32495 0.812951 5.52021Z\",\n        fill: \"currentColor\",\n      }),\n    ),\n  Vv = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: 11,\n        height: 6,\n        viewBox: \"0 0 11 6\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M0.812951 0.47979C0.990462 0.302279 1.26824 0.286142 1.46398 0.431378L1.52006 0.47979L5.83317 4.79268L10.1463 0.47979C10.3238 0.302279 10.6016 0.286142 10.7973 0.431378L10.8534 0.47979C11.0309 0.657301 11.047 0.935077 10.9018 1.13082L10.8534 1.1869L6.18672 5.85356C6.00921 6.03107 5.73144 6.04721 5.5357 5.90198L5.47962 5.85356L0.812951 1.1869C0.617688 0.991635 0.617688 0.675052 0.812951 0.47979Z\",\n        fill: \"currentColor\",\n      }),\n    ),\n  o1 = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: 16,\n        height: 16,\n        viewBox: \"0 0 16 16\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\n        \"g\",\n        { id: \"x-close\" },\n        /* @__PURE__ */ O.createElement(\"path\", {\n          id: \"Icon\",\n          d: \"M12 4L4 12M4 4L12 12\",\n          stroke: \"currentColor\",\n          strokeWidth: 1.5,\n          strokeLinecap: \"round\",\n          strokeLinejoin: \"round\",\n        }),\n      ),\n    ),\n  $v = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 10 10\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\n        \"g\",\n        { clipPath: \"url(#clip0_8292_48040)\" },\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M6.46776 1.25L6.46776 1.66667L4.16929 1.66667C4.11388 1.66667 4.06073 1.68862 4.02154 1.72769C3.98236 1.76676 3.96034 1.81975 3.96034 1.875L3.96034 4.79167L2.49768 4.79167L2.49768 4.375C2.49768 4.20924 2.43164 4.05027 2.31408 3.93306C2.19652 3.81585 2.03708 3.75 1.87083 3.75L0.826073 3.75C0.65982 3.75 0.500378 3.81585 0.38282 3.93306C0.265262 4.05027 0.199219 4.20924 0.199219 4.375L0.199219 5.625C0.199219 5.79076 0.265262 5.94973 0.38282 6.06694C0.500378 6.18415 0.659821 6.25 0.826073 6.25L1.87083 6.25C2.03708 6.25 2.19652 6.18415 2.31408 6.06694C2.43164 5.94973 2.49768 5.79076 2.49768 5.625L2.49768 5.20833L3.96034 5.20833L3.96034 8.125C3.96034 8.18025 3.98236 8.23324 4.02154 8.27231C4.06073 8.31138 4.11388 8.33333 4.16929 8.33333L6.46776 8.33333L6.46776 8.75C6.46776 8.91576 6.5338 9.07473 6.65136 9.19194C6.76892 9.30915 6.92836 9.375 7.09461 9.375L8.13937 9.375C8.30562 9.375 8.46506 9.30915 8.58262 9.19194C8.70018 9.07473 8.76622 8.91576 8.76622 8.75L8.76622 7.5C8.76622 7.33424 8.70018 7.17527 8.58262 7.05806C8.46506 6.94085 8.30562 6.875 8.13937 6.875L7.09461 6.875C6.92836 6.875 6.76892 6.94085 6.65136 7.05806C6.5338 7.17527 6.46776 7.33424 6.46776 7.5L6.46776 7.91667L4.37825 7.91667L4.37825 5.20833L6.46776 5.20833L6.46776 5.625C6.46776 5.79076 6.5338 5.94973 6.65136 6.06694C6.76892 6.18415 6.92836 6.25 7.09461 6.25L8.13937 6.25C8.30562 6.25 8.46506 6.18415 8.58262 6.06694C8.70018 5.94973 8.76622 5.79076 8.76622 5.625L8.76622 4.375C8.76622 4.20924 8.70018 4.05027 8.58262 3.93306C8.46506 3.81585 8.30562 3.75 8.13937 3.75L7.09461 3.75C6.92836 3.75 6.76892 3.81585 6.65136 3.93306C6.5338 4.05027 6.46776 4.20924 6.46776 4.375L6.46776 4.79167L4.37825 4.79167L4.37825 2.08333L6.46776 2.08333L6.46776 2.5C6.46776 2.66576 6.5338 2.82473 6.65136 2.94194C6.76892 3.05915 6.92836 3.125 7.09461 3.125L8.13937 3.125C8.30562 3.125 8.46506 3.05915 8.58262 2.94194C8.70018 2.82473 8.76622 2.66576 8.76622 2.5L8.76622 1.25C8.76622 1.08424 8.70018 0.925271 8.58262 0.80806C8.46506 0.69085 8.30562 0.625002 8.13937 0.625002L7.09461 0.625002C6.92836 0.625002 6.76892 0.69085 6.65136 0.80806C6.5338 0.925271 6.46776 1.08424 6.46776 1.25ZM1.87083 5.83333L0.826073 5.83333C0.770655 5.83333 0.717508 5.81138 0.678322 5.77232C0.639136 5.73324 0.617121 5.68025 0.617121 5.625L0.617121 4.375C0.617121 4.31975 0.639136 4.26676 0.678322 4.22769C0.717508 4.18862 0.770655 4.16667 0.826073 4.16667L1.87083 4.16667C1.92625 4.16667 1.97939 4.18862 2.01858 4.22769C2.05777 4.26676 2.07978 4.31975 2.07978 4.375L2.07978 5.625C2.07978 5.68025 2.05777 5.73324 2.01858 5.77231C1.97939 5.81138 1.92625 5.83333 1.87083 5.83333ZM7.09461 7.29167L8.13937 7.29167C8.19479 7.29167 8.24793 7.31362 8.28712 7.35269C8.32631 7.39176 8.34832 7.44475 8.34832 7.5L8.34832 8.75C8.34832 8.80525 8.32631 8.85824 8.28712 8.89731C8.24793 8.93638 8.19479 8.95833 8.13937 8.95833L7.09461 8.95833C7.0392 8.95833 6.98605 8.93638 6.94686 8.89731C6.90768 8.85824 6.88566 8.80525 6.88566 8.75L6.88566 7.5C6.88566 7.44475 6.90768 7.39176 6.94686 7.35269C6.98605 7.31362 7.0392 7.29167 7.09461 7.29167ZM7.09461 4.16667L8.13937 4.16667C8.19479 4.16667 8.24793 4.18862 8.28712 4.22769C8.32631 4.26676 8.34832 4.31975 8.34832 4.375L8.34832 5.625C8.34832 5.68025 8.32631 5.73324 8.28712 5.77231C8.24793 5.81138 8.19479 5.83333 8.13937 5.83333L7.09461 5.83333C7.0392 5.83333 6.98605 5.81138 6.94686 5.77231C6.90768 5.73324 6.88566 5.68025 6.88566 5.625L6.88566 4.375C6.88566 4.31975 6.90768 4.26676 6.94686 4.22769C6.98605 4.18862 7.0392 4.16667 7.09461 4.16667ZM8.13937 1.04167C8.19479 1.04167 8.24793 1.06362 8.28712 1.10269C8.32631 1.14176 8.34832 1.19475 8.34832 1.25L8.34832 2.5C8.34832 2.55525 8.32631 2.60825 8.28712 2.64732C8.24793 2.68639 8.19479 2.70833 8.13937 2.70833L7.09461 2.70833C7.0392 2.70833 6.98605 2.68639 6.94686 2.64732C6.90768 2.60825 6.88566 2.55525 6.88566 2.5L6.88566 1.25C6.88566 1.19475 6.90768 1.14176 6.94686 1.10269C6.98605 1.06362 7.0392 1.04167 7.09461 1.04167L8.13937 1.04167Z\",\n          fill: \"white\",\n        }),\n      ),\n      /* @__PURE__ */ O.createElement(\n        \"defs\",\n        null,\n        /* @__PURE__ */ O.createElement(\n          \"clipPath\",\n          { id: \"clip0_8292_48040\" },\n          /* @__PURE__ */ O.createElement(\"rect\", {\n            width: 10,\n            height: 10,\n            fill: \"white\",\n            transform: \"translate(0 10) rotate(-90)\",\n          }),\n        ),\n      ),\n    ),\n  Wv = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: 32,\n        height: 32,\n        viewBox: \"0 0 32 32\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"rect\", {\n        x: -0.5,\n        y: 0.5,\n        width: 31,\n        height: 31,\n        rx: 4.5,\n        transform: \"matrix(-1 0 0 1 31 0)\",\n        stroke: \"#8390A3\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M16.0379 8.91337L16.0378 8.91338L16.0358 8.91024C15.9266 8.74528 15.7106 8.57407 15.432 8.47559C15.1577 8.37865 14.8682 8.36814 14.6194 8.46108L14.6118 8.46395L14.604 8.46656C14.0151 8.66487 13.6311 9.34149 13.75 9.89628L13.7528 9.90933L13.7549 9.92252L14.1882 12.6475L14.1884 12.6475L14.1901 12.66C14.2411 13.0429 14.1382 13.4063 13.9081 13.6906L13.9003 13.7002L13.8921 13.7094C13.6598 13.9691 13.3179 14.1344 12.9444 14.1344H9.51945C8.99591 14.1344 8.59378 14.3433 8.36901 14.6569C8.16112 14.9534 8.10247 15.362 8.26606 15.8266L8.26617 15.8266L8.26948 15.8367L10.3195 22.0784L10.3251 22.0955L10.3295 22.1131C10.5282 22.9078 11.4403 23.6094 12.3444 23.6094H15.5944C15.8229 23.6094 16.1102 23.5692 16.3764 23.4897C16.6529 23.4071 16.8467 23.3 16.9409 23.2058L16.9634 23.1833L16.9885 23.1639L18.0547 22.3393C18.0548 22.3392 18.0548 22.3392 18.0549 22.3391C18.3435 22.1152 18.5111 21.7765 18.5111 21.4177V12.951C18.5111 12.7179 18.4412 12.4895 18.3123 12.2958C18.3121 12.2956 18.3119 12.2953 18.3118 12.2951L16.0379 8.91337Z\",\n        stroke: \"#8390A3\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M22.5187 11.8263H21.6604C21.0609 11.8263 20.7659 11.9458 20.6121 12.0919C20.4646 12.232 20.3438 12.4961 20.3438 13.0513V21.4346C20.3438 21.9949 20.465 22.2611 20.6128 22.402C20.7664 22.5485 21.0608 22.668 21.6604 22.668H22.5187C23.1184 22.668 23.4128 22.5485 23.5664 22.402C23.7141 22.2611 23.8354 21.9949 23.8354 21.4346V13.0596C23.8354 12.4994 23.7141 12.2332 23.5664 12.0923C23.4128 11.9458 23.1184 11.8263 22.5187 11.8263Z\",\n        stroke: \"#8390A3\",\n      }),\n    ),\n  Zv = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: 32,\n        height: 32,\n        viewBox: \"0 0 32 32\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"rect\", {\n        x: 0.5,\n        y: -0.5,\n        width: 31,\n        height: 31,\n        rx: 4.5,\n        transform: \"matrix(1 0 0 -1 0 31)\",\n        stroke: \"#8390A3\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M12.2334 10.7084L14.8167 8.70844C15.1501 8.37511 15.9001 8.20844 16.4001 8.20844H19.5667C20.5667 8.20844 21.6501 8.95844 21.9001 9.95844L23.9001 16.0418C24.3167 17.2084 23.5667 18.2084 22.3167 18.2084H18.9834C18.4834 18.2084 18.0667 18.6251 18.1501 19.2084L18.5667 21.8751C18.7334 22.6251 18.2334 23.4584 17.4834 23.7084C16.8167 23.9584 15.9834 23.6251 15.6501 23.1251L12.2334 18.0418\",\n        stroke: \"#8390A3\",\n        strokeWidth: 1.2,\n        strokeMiterlimit: 10,\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M7.9834 10.7083V18.8749C7.9834 20.0416 8.4834 20.4583 9.65007 20.4583H10.4834C11.6501 20.4583 12.1501 20.0416 12.1501 18.8749V10.7083C12.1501 9.54158 11.6501 9.12492 10.4834 9.12492H9.65007C8.4834 9.12492 7.9834 9.54158 7.9834 10.7083Z\",\n        stroke: \"#8390A3\",\n        strokeWidth: 1.2,\n        strokeLinecap: \"round\",\n        strokeLinejoin: \"round\",\n      }),\n    ),\n  Uv = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: 32,\n        height: 32,\n        viewBox: \"0 0 32 32\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"rect\", {\n        width: 32,\n        height: 32,\n        rx: 5,\n        transform: \"matrix(-1 0 0 1 32 0)\",\n        fill: \"#3F8CFF\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M19.0111 21.4177V12.951C19.0111 12.6177 18.9111 12.2927 18.7278 12.0177L16.4528 8.63437C16.0944 8.09271 15.2028 7.70937 14.4444 7.99271C13.6278 8.26771 13.0861 9.18437 13.2611 10.001L13.6944 12.726C13.7278 12.976 13.6611 13.201 13.5194 13.376C13.3778 13.5344 13.1694 13.6344 12.9444 13.6344H9.51945C8.86111 13.6344 8.29445 13.901 7.96111 14.3677C7.64445 14.8177 7.58611 15.401 7.79445 15.9927L9.84445 22.2344C10.1028 23.2677 11.2278 24.1094 12.3444 24.1094H15.5944C16.1528 24.1094 16.9361 23.9177 17.2944 23.5594L18.3611 22.7344C18.7694 22.4177 19.0111 21.9344 19.0111 21.4177Z\",\n        fill: \"white\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M21.6604 11.3263H22.5187C23.8104 11.3263 24.3354 11.8263 24.3354 13.0596V21.4346C24.3354 22.668 23.8104 23.168 22.5187 23.168H21.6604C20.3688 23.168 19.8438 22.668 19.8438 21.4346V13.0513C19.8438 11.8263 20.3688 11.3263 21.6604 11.3263Z\",\n        fill: \"white\",\n      }),\n    ),\n  qv = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: 32,\n        height: 32,\n        viewBox: \"0 0 32 32\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"rect\", {\n        x: 0.5,\n        y: -0.5,\n        width: 31,\n        height: 31,\n        rx: 4.5,\n        transform: \"matrix(1 0 0 -1 0 31)\",\n        fill: \"#247EFE\",\n        stroke: \"#247EFE\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M12.2334 10.7084L14.8167 8.70844C15.1501 8.37511 15.9001 8.20844 16.4001 8.20844H19.5667C20.5667 8.20844 21.6501 8.95844 21.9001 9.95844L23.9001 16.0418C24.3167 17.2084 23.5667 18.2084 22.3167 18.2084H18.9834C18.4834 18.2084 18.0667 18.6251 18.1501 19.2084L18.5667 21.8751C18.7334 22.6251 18.2334 23.4584 17.4834 23.7084C16.8167 23.9584 15.9834 23.6251 15.6501 23.1251L12.2334 18.0418\",\n        fill: \"white\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M7.9834 10.7083V18.8749C7.9834 20.0416 8.4834 20.4583 9.65007 20.4583H10.4834C11.6501 20.4583 12.1501 20.0416 12.1501 18.8749V10.7083C12.1501 9.54158 11.6501 9.12492 10.4834 9.12492H9.65007C8.4834 9.12492 7.9834 9.54158 7.9834 10.7083Z\",\n        fill: \"white\",\n        stroke: \"#247EFE\",\n        strokeWidth: 1.2,\n        strokeLinecap: \"round\",\n        strokeLinejoin: \"round\",\n      }),\n    ),\n  Yv = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: 16,\n        height: 16,\n        viewBox: \"0 0 16 16\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\n        \"g\",\n        { clipPath: \"url(#clip0_17179_3800)\" },\n        /* @__PURE__ */ O.createElement(\n          \"mask\",\n          {\n            id: \"mask0_17179_3800\",\n            style: {\n              maskType: \"luminance\",\n            },\n            maskUnits: \"userSpaceOnUse\",\n            x: 0,\n            y: 0,\n            width: 16,\n            height: 16,\n          },\n          /* @__PURE__ */ O.createElement(\"path\", {\n            d: \"M16 0H0V16H16V0Z\",\n            fill: \"white\",\n          }),\n        ),\n        /* @__PURE__ */ O.createElement(\n          \"g\",\n          { mask: \"url(#mask0_17179_3800)\" },\n          /* @__PURE__ */ O.createElement(\"path\", {\n            d: \"M13.581 0C12.2681 0 11.2 1.0681 11.2 2.38095C11.2 3.69381 12.2681 4.7619 13.581 4.7619C14.8939 4.7619 15.9619 3.69381 15.9619 2.38095C15.9619 1.0681 14.8939 0 13.581 0ZM13.581 3.96826C12.7057 3.96826 11.9937 3.25619 11.9937 2.38095C11.9937 1.50571 12.7057 0.793651 13.581 0.793651C14.4562 0.793651 15.1683 1.50571 15.1683 2.38095C15.1683 3.25619 14.4562 3.96826 13.581 3.96826Z\",\n            fill: \"currentColor\",\n          }),\n          /* @__PURE__ */ O.createElement(\"path\", {\n            d: \"M13.581 11.1992C12.2681 11.1992 11.2 12.2673 11.2 13.5802C11.2 14.8931 12.2681 15.9611 13.581 15.9611C14.8939 15.9611 15.9619 14.8931 15.9619 13.5802C15.9619 12.2673 14.8939 11.1992 13.581 11.1992ZM13.581 15.1675C12.7057 15.1675 11.9937 14.4554 11.9937 13.5802C11.9937 12.7049 12.7057 11.9929 13.581 11.9929C14.4562 11.9929 15.1683 12.7049 15.1683 13.5802C15.1683 14.4554 14.4562 15.1675 13.581 15.1675Z\",\n            fill: \"currentColor\",\n          }),\n          /* @__PURE__ */ O.createElement(\"path\", {\n            d: \"M2.38095 0C1.0681 0 0 1.0681 0 2.38095C0 3.69381 1.0681 4.7619 2.38095 4.7619C3.69381 4.7619 4.7619 3.69381 4.7619 2.38095C4.7619 1.0681 3.69381 0 2.38095 0ZM2.38095 3.96826C1.50571 3.96826 0.793651 3.25619 0.793651 2.38095C0.793651 1.50571 1.50571 0.793651 2.38095 0.793651C3.25619 0.793651 3.96826 1.50571 3.96826 2.38095C3.96826 3.25619 3.25619 3.96826 2.38095 3.96826Z\",\n            fill: \"currentColor\",\n          }),\n          /* @__PURE__ */ O.createElement(\"path\", {\n            d: \"M2.38095 11.1992C1.0681 11.1992 0 12.2673 0 13.5802C0 14.8931 1.0681 15.9611 2.38095 15.9611C3.69381 15.9611 4.7619 14.8931 4.7619 13.5802C4.7619 12.2673 3.69381 11.1992 2.38095 11.1992ZM2.38095 15.1675C1.50571 15.1675 0.793651 14.4554 0.793651 13.5802C0.793651 12.7049 1.50571 11.9929 2.38095 11.9929C3.25619 11.9929 3.96826 12.7049 3.96826 13.5802C3.96826 14.4554 3.25619 15.1675 2.38095 15.1675Z\",\n            fill: \"currentColor\",\n          }),\n          /* @__PURE__ */ O.createElement(\"path\", {\n            d: \"M4.15473 12.6454L12.64 4.16016L11.7349 3.25506L3.24964 11.7403L4.15473 12.6454Z\",\n            fill: \"currentColor\",\n          }),\n          /* @__PURE__ */ O.createElement(\"path\", {\n            d: \"M3.24958 4.15925L11.7349 12.6445L12.64 11.7394L4.15468 3.25415L3.24958 4.15925Z\",\n            fill: \"currentColor\",\n          }),\n          /* @__PURE__ */ O.createElement(\"path\", {\n            d: \"M7.97714 10.8334C9.5551 10.8334 10.8343 9.55424 10.8343 7.97628C10.8343 6.39833 9.5551 5.11914 7.97714 5.11914C6.39918 5.11914 5.12 6.39833 5.12 7.97628C5.12 9.55424 6.39918 10.8334 7.97714 10.8334Z\",\n            fill: \"currentColor\",\n          }),\n        ),\n      ),\n      /* @__PURE__ */ O.createElement(\n        \"defs\",\n        null,\n        /* @__PURE__ */ O.createElement(\n          \"clipPath\",\n          { id: \"clip0_17179_3800\" },\n          /* @__PURE__ */ O.createElement(\"rect\", {\n            width: 16,\n            height: 16,\n            fill: \"white\",\n          }),\n        ),\n      ),\n    ),\n  Gv = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: 16,\n        height: 16,\n        viewBox: \"0 0 16 16\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M7.95106 12.3437C8.12161 12.1731 8.13712 11.9062 7.99757 11.7182L7.95106 11.6643L3.80722 7.52022L7.95106 3.37616C8.12161 3.20561 8.13712 2.93872 7.99757 2.75065L7.95106 2.69677C7.78051 2.52622 7.51362 2.51071 7.32555 2.65026L7.27167 2.69677L2.78792 7.18052C2.61736 7.35108 2.60186 7.61797 2.7414 7.80603L2.78792 7.85992L7.27167 12.3437C7.45928 12.5313 7.76345 12.5313 7.95106 12.3437Z\",\n        fill: \"currentColor\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M12.3433 12.3437C12.5139 12.1731 12.5294 11.9062 12.3898 11.7182L12.3433 11.6643L8.19946 7.52022L12.3433 3.37616C12.5139 3.20561 12.5294 2.93872 12.3898 2.75065L12.3433 2.69677C12.1727 2.52622 11.9059 2.51071 11.7178 2.65026L11.6639 2.69677L7.18016 7.18052C7.0096 7.35108 6.9941 7.61797 7.13364 7.80603L7.18016 7.85991L11.6639 12.3437C11.8515 12.5313 12.1557 12.5313 12.3433 12.3437Z\",\n        fill: \"currentColor\",\n      }),\n    ),\n  I5 = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: 16,\n        height: 16,\n        viewBox: \"0 0 16 16\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M8.04891 12.3437C7.87836 12.1731 7.86285 11.9062 8.0024 11.7182L8.04891 11.6643L12.1928 7.52022L8.04891 3.37616C7.87836 3.20561 7.86285 2.93872 8.0024 2.75065L8.04891 2.69677C8.21946 2.52622 8.48635 2.51071 8.67442 2.65026L8.7283 2.69677L13.2121 7.18052C13.3826 7.35108 13.3981 7.61797 13.2586 7.80603L13.2121 7.85992L8.7283 12.3437C8.54069 12.5313 8.23652 12.5313 8.04891 12.3437Z\",\n        fill: \"currentColor\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M3.65667 12.3437C3.48611 12.1731 3.47061 11.9062 3.61015 11.7182L3.65667 11.6643L7.80051 7.52022L3.65667 3.37616C3.48611 3.20561 3.47061 2.93872 3.61015 2.75065L3.65667 2.69677C3.82722 2.52622 4.09411 2.51071 4.28218 2.65026L4.33606 2.69677L8.81981 7.18052C8.99037 7.35108 9.00587 7.61797 8.86633 7.80603L8.81981 7.85991L4.33606 12.3437C4.14845 12.5313 3.84428 12.5313 3.65667 12.3437Z\",\n        fill: \"currentColor\",\n      }),\n    ),\n  Kv = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: 17,\n        height: 16,\n        viewBox: \"0 0 17 16\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M10.8335 3.10946C11.004 3.28001 11.0195 3.5469 10.88 3.73497L10.8335 3.78885L6.68964 7.93291L10.8335 12.077C11.004 12.2475 11.0195 12.5144 10.88 12.7025L10.8335 12.7564C10.6629 12.9269 10.396 12.9424 10.208 12.8029L10.1541 12.7564L5.67033 8.2726C5.49978 8.10205 5.48427 7.83516 5.62382 7.64709L5.67033 7.59321L10.1541 3.10946C10.3417 2.92185 10.6459 2.92185 10.8335 3.10946Z\",\n        fill: \"currentColor\",\n      }),\n    ),\n  Xv = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: 17,\n        height: 16,\n        viewBox: \"0 0 17 16\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M6.16648 3.10946C5.99593 3.28001 5.98042 3.5469 6.11996 3.73497L6.16648 3.78885L10.3103 7.93291L6.16648 12.077C5.99593 12.2475 5.98042 12.5144 6.11996 12.7025L6.16648 12.7564C6.33703 12.9269 6.60392 12.9424 6.79199 12.8029L6.84587 12.7564L11.3296 8.2726C11.5002 8.10205 11.5157 7.83516 11.3761 7.64709L11.3296 7.59321L6.84587 3.10946C6.65826 2.92185 6.35409 2.92185 6.16648 3.10946Z\",\n        fill: \"currentColor\",\n      }),\n    ),\n  Qv = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 36 36\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"rect\", {\n        width: 36,\n        height: 36,\n        rx: 5,\n        fill: \"#4D4F3B\",\n      }),\n      /* @__PURE__ */ O.createElement(\n        \"mask\",\n        {\n          id: \"mask0_20572_494912\",\n          style: {\n            maskType: \"luminance\",\n          },\n          maskUnits: \"userSpaceOnUse\",\n          x: 11,\n          y: 7,\n          width: 14,\n          height: 14,\n        },\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M11 7H25V21H11V7Z\",\n          fill: \"white\",\n        }),\n      ),\n      /* @__PURE__ */ O.createElement(\n        \"g\",\n        { mask: \"url(#mask0_20572_494912)\" },\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M11.4102 20.5898H24.5898\",\n          stroke: \"#FFF200\",\n          strokeWidth: 0.8,\n          strokeMiterlimit: 10,\n          strokeLinecap: \"round\",\n          strokeLinejoin: \"round\",\n        }),\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M13.625 17.3086H12.5313C12.3802 17.3086 12.2578 17.431 12.2578 17.582V20.5898H13.8984V17.582C13.8984 17.431 13.776 17.3086 13.625 17.3086Z\",\n          stroke: \"#FFF200\",\n          strokeWidth: 0.8,\n          strokeMiterlimit: 10,\n          strokeLinecap: \"round\",\n          strokeLinejoin: \"round\",\n        }),\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M16.9063 16.3242H15.8125C15.6615 16.3242 15.5391 16.4466 15.5391 16.5977V20.5898H17.1797V16.5977C17.1797 16.4466 17.0573 16.3242 16.9063 16.3242Z\",\n          stroke: \"#FFF200\",\n          strokeWidth: 0.8,\n          strokeMiterlimit: 10,\n          strokeLinecap: \"round\",\n          strokeLinejoin: \"round\",\n        }),\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M20.1875 14.8203H19.0938C18.9427 14.8203 18.8203 14.9427 18.8203 15.0937V20.5898H20.4609V15.0937C20.4609 14.9427 20.3385 14.8203 20.1875 14.8203Z\",\n          stroke: \"#FFF200\",\n          strokeWidth: 0.8,\n          strokeMiterlimit: 10,\n          strokeLinecap: \"round\",\n          strokeLinejoin: \"round\",\n        }),\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M23.4688 12.0859H22.375C22.224 12.0859 22.1016 12.2084 22.1016 12.3594V20.5898H23.7422V12.3594C23.7422 12.2084 23.6198 12.0859 23.4688 12.0859Z\",\n          stroke: \"#FFF200\",\n          strokeWidth: 0.8,\n          strokeMiterlimit: 10,\n          strokeLinecap: \"round\",\n          strokeLinejoin: \"round\",\n        }),\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M11.4102 15.4023C16.7974 15.4023 22.1847 11.2838 23.9182 7.40977\",\n          stroke: \"#FFF200\",\n          strokeWidth: 0.8,\n          strokeMiterlimit: 10,\n          strokeLinecap: \"round\",\n          strokeLinejoin: \"round\",\n        }),\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M21.4121 8.08301L23.9187 7.41137L24.5904 9.91797\",\n          stroke: \"#FFF200\",\n          strokeWidth: 0.8,\n          strokeMiterlimit: 10,\n          strokeLinecap: \"round\",\n          strokeLinejoin: \"round\",\n        }),\n      ),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M12.771 28V23.8H13.509L15.039 26.29L14.607 26.284L16.155 23.8H16.857V28H16.083V26.422C16.083 26.062 16.091 25.738 16.107 25.45C16.127 25.162 16.159 24.876 16.203 24.592L16.299 24.85L14.997 26.86H14.601L13.341 24.868L13.425 24.592C13.469 24.86 13.499 25.136 13.515 25.42C13.535 25.7 13.545 26.034 13.545 26.422V28H12.771ZM17.9859 28V23.8H20.7339V24.508H18.7539V27.292H20.7579V28H17.9859ZM18.3459 26.2V25.504H20.4279V26.2H18.3459ZM22.5759 28V24.52H21.3759V23.8H24.5919V24.52H23.3559V28H22.5759Z\",\n        fill: \"#FFF200\",\n      }),\n    ),\n  l0 = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 36 36\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"rect\", {\n        width: 36,\n        height: 36,\n        rx: 5,\n        fill: \"currentColor\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M24.1666 22H11.8334C10.822 22 10 21.1594 10 20.1251V8.87505C10 7.84071 10.822 7 11.8334 7H24.1666C25.178 7 26 7.84071 26 8.87505V20.1251C26 21.1594 25.178 22 24.1666 22ZM11.8334 8.02273C11.374 8.02273 11 8.40526 11 8.87505V20.1251C11 20.5949 11.374 20.9773 11.8334 20.9773H24.1666C24.626 20.9773 25 20.5949 25 20.1251V8.87505C25 8.40526 24.626 8.02273 24.1666 8.02273H11.8334Z\",\n        fill: \"#E7A427\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M25.5 12H10.5C10.224 12 10 11.776 10 11.5C10 11.224 10.224 11 10.5 11H25.5C25.776 11 26 11.224 26 11.5C26 11.776 25.776 12 25.5 12Z\",\n        fill: \"#E7A427\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M25.5 15.5H10.5C10.224 15.5 10 15.276 10 15C10 14.724 10.224 14.5 10.5 14.5H25.5C25.776 14.5 26 14.724 26 15C26 15.276 25.776 15.5 25.5 15.5Z\",\n        fill: \"#E7A427\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M25.5 19H10.5C10.224 19 10 18.776 10 18.5C10 18.224 10.224 18 10.5 18H25.5C25.776 18 26 18.224 26 18.5C26 18.776 25.776 19 25.5 19Z\",\n        fill: \"#E7A427\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M14 22C13.724 22 13.5 21.769 13.5 21.4844V11.5156C13.5 11.231 13.724 11 14 11C14.276 11 14.5 11.231 14.5 11.5156V21.4844C14.5 21.769 14.276 22 14 22Z\",\n        fill: \"#E7A427\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M18 22C17.724 22 17.5 21.769 17.5 21.4844V11.5156C17.5 11.231 17.724 11 18 11C18.276 11 18.5 11.231 18.5 11.5156V21.4844C18.5 21.769 18.276 22 18 22Z\",\n        fill: \"#E7A427\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M22 22C21.724 22 21.5 21.769 21.5 21.4844V11.5156C21.5 11.231 21.724 11 22 11C22.276 11 22.5 11.231 22.5 11.5156V21.4844C22.5 21.769 22.276 22 22 22Z\",\n        fill: \"#E7A427\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M20.5503 29.0008V24.8008H23.2983V25.5088H21.3183V28.2928H23.3223V29.0008H20.5503ZM20.9103 27.2008V26.5048H22.9923V27.2008H20.9103Z\",\n        fill: \"#E7A427\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M17.7691 29.0008V25.5208H16.5691V24.8008H19.7851V25.5208H18.5491V29.0008H17.7691Z\",\n        fill: \"#E7A427\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M14.6096 29.0601C14.3056 29.0601 14.0276 29.0081 13.7756 28.9041C13.5236 28.8001 13.3056 28.6521 13.1216 28.4601C12.9376 28.2641 12.7936 28.0341 12.6896 27.7701C12.5896 27.5021 12.5396 27.2101 12.5396 26.8941C12.5396 26.5901 12.5936 26.3081 12.7016 26.0481C12.8096 25.7881 12.9596 25.5601 13.1516 25.3641C13.3436 25.1681 13.5676 25.0161 13.8236 24.9081C14.0796 24.8001 14.3576 24.7461 14.6576 24.7461C14.8616 24.7461 15.0596 24.7761 15.2516 24.8361C15.4436 24.8961 15.6196 24.9801 15.7796 25.0881C15.9396 25.1921 16.0736 25.3141 16.1816 25.4541L15.6836 26.0001C15.5796 25.8921 15.4716 25.8021 15.3596 25.7301C15.2516 25.6541 15.1376 25.5981 15.0176 25.5621C14.9016 25.5221 14.7816 25.5021 14.6576 25.5021C14.4736 25.5021 14.2996 25.5361 14.1356 25.6041C13.9756 25.6721 13.8356 25.7681 13.7156 25.8921C13.5996 26.0161 13.5076 26.1641 13.4396 26.3361C13.3716 26.5041 13.3376 26.6921 13.3376 26.9001C13.3376 27.1121 13.3696 27.3041 13.4336 27.4761C13.5016 27.6481 13.5956 27.7961 13.7156 27.9201C13.8396 28.0441 13.9856 28.1401 14.1536 28.2081C14.3256 28.2721 14.5136 28.3041 14.7176 28.3041C14.8496 28.3041 14.9776 28.2861 15.1016 28.2501C15.2256 28.2141 15.3396 28.1641 15.4436 28.1001C15.5516 28.0321 15.6496 27.9541 15.7376 27.8661L16.1216 28.4841C16.0256 28.5921 15.8976 28.6901 15.7376 28.7781C15.5776 28.8661 15.3976 28.9361 15.1976 28.9881C15.0016 29.0361 14.8056 29.0601 14.6096 29.0601Z\",\n        fill: \"#E7A427\",\n      }),\n    ),\n  Jv = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 36 36\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"rect\", {\n        width: 36,\n        height: 36,\n        rx: 5,\n        fill: \"#FDF6EA\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M24.1666 22H11.8334C10.822 22 10 21.1594 10 20.1251V8.87505C10 7.84071 10.822 7 11.8334 7H24.1666C25.178 7 26 7.84071 26 8.87505V20.1251C26 21.1594 25.178 22 24.1666 22ZM11.8334 8.02273C11.374 8.02273 11 8.40526 11 8.87505V20.1251C11 20.5949 11.374 20.9773 11.8334 20.9773H24.1666C24.626 20.9773 25 20.5949 25 20.1251V8.87505C25 8.40526 24.626 8.02273 24.1666 8.02273H11.8334Z\",\n        fill: \"#E7A427\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M25.5 12H10.5C10.224 12 10 11.776 10 11.5C10 11.224 10.224 11 10.5 11H25.5C25.776 11 26 11.224 26 11.5C26 11.776 25.776 12 25.5 12Z\",\n        fill: \"#E7A427\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M25.5 15.5H10.5C10.224 15.5 10 15.276 10 15C10 14.724 10.224 14.5 10.5 14.5H25.5C25.776 14.5 26 14.724 26 15C26 15.276 25.776 15.5 25.5 15.5Z\",\n        fill: \"#E7A427\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M25.5 19H10.5C10.224 19 10 18.776 10 18.5C10 18.224 10.224 18 10.5 18H25.5C25.776 18 26 18.224 26 18.5C26 18.776 25.776 19 25.5 19Z\",\n        fill: \"#E7A427\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M14 22C13.724 22 13.5 21.769 13.5 21.4844V11.5156C13.5 11.231 13.724 11 14 11C14.276 11 14.5 11.231 14.5 11.5156V21.4844C14.5 21.769 14.276 22 14 22Z\",\n        fill: \"#E7A427\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M18 22C17.724 22 17.5 21.769 17.5 21.4844V11.5156C17.5 11.231 17.724 11 18 11C18.276 11 18.5 11.231 18.5 11.5156V21.4844C18.5 21.769 18.276 22 18 22Z\",\n        fill: \"#E7A427\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M22 22C21.724 22 21.5 21.769 21.5 21.4844V11.5156C21.5 11.231 21.724 11 22 11C22.276 11 22.5 11.231 22.5 11.5156V21.4844C22.5 21.769 22.276 22 22 22Z\",\n        fill: \"#E7A427\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M13.4913 29C13.2767 29 13.0771 28.9722 12.8925 28.9167C12.7118 28.8611 12.5461 28.7778 12.3954 28.6667C12.2486 28.5519 12.1167 28.4111 12 28.2444L12.418 27.7722C12.6026 28.0315 12.7796 28.2111 12.949 28.3111C13.1185 28.4111 13.32 28.4611 13.5535 28.4611C13.6966 28.4611 13.8265 28.4389 13.9432 28.3944C14.06 28.35 14.1523 28.2889 14.22 28.2111C14.2878 28.1333 14.3217 28.0444 14.3217 27.9444C14.3217 27.8778 14.3104 27.8148 14.2878 27.7556C14.2652 27.6963 14.2295 27.6426 14.1805 27.5944C14.1353 27.5463 14.0751 27.5019 13.9997 27.4611C13.9282 27.4204 13.8434 27.3852 13.7455 27.3556C13.6476 27.3222 13.5346 27.2944 13.4066 27.2722C13.2032 27.2315 13.0262 27.1778 12.8756 27.1111C12.725 27.0444 12.5988 26.9611 12.4971 26.8611C12.3954 26.7611 12.3201 26.6481 12.2712 26.5222C12.2222 26.3926 12.1977 26.2481 12.1977 26.0889C12.1977 25.9333 12.2316 25.7889 12.2994 25.6556C12.3709 25.5222 12.467 25.4074 12.5875 25.3111C12.7118 25.2111 12.8568 25.1352 13.0225 25.0833C13.1882 25.0278 13.3671 25 13.5591 25C13.7625 25 13.9489 25.0259 14.1184 25.0778C14.2878 25.1296 14.4385 25.2074 14.5703 25.3111C14.7021 25.4111 14.8113 25.5352 14.8979 25.6833L14.4686 26.1C14.3933 25.9778 14.3085 25.8759 14.2144 25.7944C14.1202 25.7093 14.0167 25.6463 13.9037 25.6056C13.7907 25.5611 13.6702 25.5389 13.5422 25.5389C13.3953 25.5389 13.2673 25.5611 13.158 25.6056C13.0488 25.65 12.9622 25.713 12.8982 25.7944C12.8379 25.8722 12.8078 25.9648 12.8078 26.0722C12.8078 26.15 12.8229 26.2222 12.853 26.2889C12.8831 26.3519 12.9283 26.4093 12.9886 26.4611C13.0526 26.5093 13.1373 26.5537 13.2428 26.5944C13.3482 26.6315 13.4744 26.6648 13.6213 26.6944C13.8284 26.7389 14.0129 26.7963 14.1749 26.8667C14.3368 26.9333 14.4742 27.013 14.5872 27.1056C14.7002 27.1981 14.7849 27.3019 14.8414 27.4167C14.9017 27.5315 14.9318 27.6556 14.9318 27.7889C14.9318 28.037 14.8734 28.2519 14.7567 28.4333C14.64 28.6148 14.4742 28.7556 14.2596 28.8556C14.0449 28.9519 13.7888 29 13.4913 29Z\",\n        fill: \"#E7A427\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M17.3328 28.9778C17.0277 28.9778 16.7547 28.913 16.5137 28.7833C16.2726 28.65 16.0825 28.4685 15.9431 28.2389C15.8075 28.0056 15.7397 27.7426 15.7397 27.45V25.05H16.3498V27.4C16.3498 27.5889 16.395 27.7593 16.4854 27.9111C16.5758 28.0593 16.6944 28.1778 16.8413 28.2667C16.9919 28.3556 17.1558 28.4 17.3328 28.4C17.5211 28.4 17.6905 28.3556 17.8412 28.2667C17.9956 28.1778 18.118 28.0593 18.2084 27.9111C18.2987 27.7593 18.3439 27.5889 18.3439 27.4V25.05H18.9258V27.45C18.9258 27.7426 18.8561 28.0056 18.7168 28.2389C18.5812 28.4685 18.3929 28.65 18.1519 28.7833C17.9108 28.913 17.6378 28.9778 17.3328 28.9778Z\",\n        fill: \"#E7A427\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M19.9778 28.9444V25.0556H21.6273C21.8796 25.0556 22.0924 25.0926 22.2656 25.1667C22.4389 25.2407 22.5688 25.3519 22.6554 25.5C22.7458 25.6444 22.791 25.8222 22.791 26.0333C22.791 26.2444 22.7307 26.4241 22.6102 26.5722C22.4935 26.7204 22.3297 26.8222 22.1188 26.8778V26.7667C22.2958 26.8037 22.4502 26.8704 22.582 26.9667C22.7138 27.0593 22.8155 27.1759 22.887 27.3167C22.9623 27.4574 23 27.6185 23 27.8C23 27.9852 22.9699 28.15 22.9096 28.2944C22.8531 28.4352 22.7665 28.5537 22.6498 28.65C22.5368 28.7463 22.3993 28.8204 22.2374 28.8722C22.0755 28.9204 21.8909 28.9444 21.6838 28.9444H19.9778ZM20.5879 28.3667H21.6499C21.8043 28.3667 21.9342 28.3444 22.0397 28.3C22.1489 28.2556 22.2317 28.1907 22.2882 28.1056C22.3485 28.0167 22.3786 27.9111 22.3786 27.7889C22.3786 27.6741 22.3466 27.5759 22.2826 27.4944C22.2223 27.413 22.1357 27.3519 22.0227 27.3111C21.9097 27.2667 21.7761 27.2444 21.6217 27.2444H20.5879V28.3667ZM20.5879 26.6667H21.5934C21.7064 26.6667 21.8062 26.6444 21.8928 26.6C21.9832 26.5556 22.0529 26.4944 22.1018 26.4167C22.1545 26.3389 22.1809 26.25 22.1809 26.15C22.1809 25.9833 22.1244 25.8556 22.0114 25.7667C21.8985 25.6778 21.7365 25.6333 21.5256 25.6333H20.5879V26.6667Z\",\n        fill: \"#E7A427\",\n      }),\n    ),\n  ex = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 36 36\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"rect\", {\n        width: 36,\n        height: 36,\n        rx: 5,\n        fill: \"#4B473F\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M24.1666 22H11.8334C10.822 22 10 21.1594 10 20.1251V8.87505C10 7.84071 10.822 7 11.8334 7H24.1666C25.178 7 26 7.84071 26 8.87505V20.1251C26 21.1594 25.178 22 24.1666 22ZM11.8334 8.02273C11.374 8.02273 11 8.40526 11 8.87505V20.1251C11 20.5949 11.374 20.9773 11.8334 20.9773H24.1666C24.626 20.9773 25 20.5949 25 20.1251V8.87505C25 8.40526 24.626 8.02273 24.1666 8.02273H11.8334Z\",\n        fill: \"#E7A427\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M25.5 12H10.5C10.224 12 10 11.776 10 11.5C10 11.224 10.224 11 10.5 11H25.5C25.776 11 26 11.224 26 11.5C26 11.776 25.776 12 25.5 12Z\",\n        fill: \"#E7A427\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M25.5 15.5H10.5C10.224 15.5 10 15.276 10 15C10 14.724 10.224 14.5 10.5 14.5H25.5C25.776 14.5 26 14.724 26 15C26 15.276 25.776 15.5 25.5 15.5Z\",\n        fill: \"#E7A427\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M25.5 19H10.5C10.224 19 10 18.776 10 18.5C10 18.224 10.224 18 10.5 18H25.5C25.776 18 26 18.224 26 18.5C26 18.776 25.776 19 25.5 19Z\",\n        fill: \"#E7A427\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M14 22C13.724 22 13.5 21.769 13.5 21.4844V11.5156C13.5 11.231 13.724 11 14 11C14.276 11 14.5 11.231 14.5 11.5156V21.4844C14.5 21.769 14.276 22 14 22Z\",\n        fill: \"#E7A427\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M18 22C17.724 22 17.5 21.769 17.5 21.4844V11.5156C17.5 11.231 17.724 11 18 11C18.276 11 18.5 11.231 18.5 11.5156V21.4844C18.5 21.769 18.276 22 18 22Z\",\n        fill: \"#E7A427\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M22 22C21.724 22 21.5 21.769 21.5 21.4844V11.5156C21.5 11.231 21.724 11 22 11C22.276 11 22.5 11.231 22.5 11.5156V21.4844C22.5 21.769 22.276 22 22 22Z\",\n        fill: \"#E7A427\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M13.4913 29C13.2767 29 13.0771 28.9722 12.8925 28.9167C12.7118 28.8611 12.5461 28.7778 12.3954 28.6667C12.2486 28.5519 12.1167 28.4111 12 28.2444L12.418 27.7722C12.6026 28.0315 12.7796 28.2111 12.949 28.3111C13.1185 28.4111 13.32 28.4611 13.5535 28.4611C13.6966 28.4611 13.8265 28.4389 13.9432 28.3944C14.06 28.35 14.1523 28.2889 14.22 28.2111C14.2878 28.1333 14.3217 28.0444 14.3217 27.9444C14.3217 27.8778 14.3104 27.8148 14.2878 27.7556C14.2652 27.6963 14.2295 27.6426 14.1805 27.5944C14.1353 27.5463 14.0751 27.5019 13.9997 27.4611C13.9282 27.4204 13.8434 27.3852 13.7455 27.3556C13.6476 27.3222 13.5346 27.2944 13.4066 27.2722C13.2032 27.2315 13.0262 27.1778 12.8756 27.1111C12.725 27.0444 12.5988 26.9611 12.4971 26.8611C12.3954 26.7611 12.3201 26.6481 12.2712 26.5222C12.2222 26.3926 12.1977 26.2481 12.1977 26.0889C12.1977 25.9333 12.2316 25.7889 12.2994 25.6556C12.3709 25.5222 12.467 25.4074 12.5875 25.3111C12.7118 25.2111 12.8568 25.1352 13.0225 25.0833C13.1882 25.0278 13.3671 25 13.5591 25C13.7625 25 13.9489 25.0259 14.1184 25.0778C14.2878 25.1296 14.4385 25.2074 14.5703 25.3111C14.7021 25.4111 14.8113 25.5352 14.8979 25.6833L14.4686 26.1C14.3933 25.9778 14.3085 25.8759 14.2144 25.7944C14.1202 25.7093 14.0167 25.6463 13.9037 25.6056C13.7907 25.5611 13.6702 25.5389 13.5422 25.5389C13.3953 25.5389 13.2673 25.5611 13.158 25.6056C13.0488 25.65 12.9622 25.713 12.8982 25.7944C12.8379 25.8722 12.8078 25.9648 12.8078 26.0722C12.8078 26.15 12.8229 26.2222 12.853 26.2889C12.8831 26.3519 12.9283 26.4093 12.9886 26.4611C13.0526 26.5093 13.1373 26.5537 13.2428 26.5944C13.3482 26.6315 13.4744 26.6648 13.6213 26.6944C13.8284 26.7389 14.0129 26.7963 14.1749 26.8667C14.3368 26.9333 14.4742 27.013 14.5872 27.1056C14.7002 27.1981 14.7849 27.3019 14.8414 27.4167C14.9017 27.5315 14.9318 27.6556 14.9318 27.7889C14.9318 28.037 14.8734 28.2519 14.7567 28.4333C14.64 28.6148 14.4742 28.7556 14.2596 28.8556C14.0449 28.9519 13.7888 29 13.4913 29Z\",\n        fill: \"#E7A427\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M17.3328 28.9778C17.0277 28.9778 16.7547 28.913 16.5137 28.7833C16.2726 28.65 16.0825 28.4685 15.9431 28.2389C15.8075 28.0056 15.7397 27.7426 15.7397 27.45V25.05H16.3498V27.4C16.3498 27.5889 16.395 27.7593 16.4854 27.9111C16.5758 28.0593 16.6944 28.1778 16.8413 28.2667C16.9919 28.3556 17.1558 28.4 17.3328 28.4C17.5211 28.4 17.6905 28.3556 17.8412 28.2667C17.9956 28.1778 18.118 28.0593 18.2084 27.9111C18.2987 27.7593 18.3439 27.5889 18.3439 27.4V25.05H18.9258V27.45C18.9258 27.7426 18.8561 28.0056 18.7168 28.2389C18.5812 28.4685 18.3929 28.65 18.1519 28.7833C17.9108 28.913 17.6378 28.9778 17.3328 28.9778Z\",\n        fill: \"#E7A427\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M19.9778 28.9444V25.0556H21.6273C21.8796 25.0556 22.0924 25.0926 22.2656 25.1667C22.4389 25.2407 22.5688 25.3519 22.6554 25.5C22.7458 25.6444 22.791 25.8222 22.791 26.0333C22.791 26.2444 22.7307 26.4241 22.6102 26.5722C22.4935 26.7204 22.3297 26.8222 22.1188 26.8778V26.7667C22.2958 26.8037 22.4502 26.8704 22.582 26.9667C22.7138 27.0593 22.8155 27.1759 22.887 27.3167C22.9623 27.4574 23 27.6185 23 27.8C23 27.9852 22.9699 28.15 22.9096 28.2944C22.8531 28.4352 22.7665 28.5537 22.6498 28.65C22.5368 28.7463 22.3993 28.8204 22.2374 28.8722C22.0755 28.9204 21.8909 28.9444 21.6838 28.9444H19.9778ZM20.5879 28.3667H21.6499C21.8043 28.3667 21.9342 28.3444 22.0397 28.3C22.1489 28.2556 22.2317 28.1907 22.2882 28.1056C22.3485 28.0167 22.3786 27.9111 22.3786 27.7889C22.3786 27.6741 22.3466 27.5759 22.2826 27.4944C22.2223 27.413 22.1357 27.3519 22.0227 27.3111C21.9097 27.2667 21.7761 27.2444 21.6217 27.2444H20.5879V28.3667ZM20.5879 26.6667H21.5934C21.7064 26.6667 21.8062 26.6444 21.8928 26.6C21.9832 26.5556 22.0529 26.4944 22.1018 26.4167C22.1545 26.3389 22.1809 26.25 22.1809 26.15C22.1809 25.9833 22.1244 25.8556 22.0114 25.7667C21.8985 25.6778 21.7365 25.6333 21.5256 25.6333H20.5879V26.6667Z\",\n        fill: \"#E7A427\",\n      }),\n    ),\n  fi = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 36 36\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"rect\", {\n        width: 36,\n        height: 36,\n        rx: 5,\n        fill: \"currentColor\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        fillRule: \"evenodd\",\n        clipRule: \"evenodd\",\n        d: \"M11.8212 9.371C11.951 9.07907 12.2928 8.9476 12.5847 9.07734L18.5199 11.7152L24.455 9.07734C24.7469 8.9476 25.0887 9.07907 25.2184 9.371C25.3482 9.66293 25.2167 10.0048 24.9248 10.1345L18.7548 12.8767C18.6052 12.9432 18.4345 12.9432 18.2849 12.8767L12.1149 10.1345C11.823 10.0048 11.6915 9.66293 11.8212 9.371Z\",\n        fill: \"#FF754C\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        fillRule: \"evenodd\",\n        clipRule: \"evenodd\",\n        d: \"M17.0318 6.21028C17.9791 5.78928 19.0604 5.78928 20.0076 6.21028L23.8639 7.92417C25.1868 8.51216 26.0394 9.82412 26.0394 11.2719V16.5172C26.0394 17.9649 25.1868 19.2769 23.8639 19.8649L20.0076 21.5788C19.0604 21.9998 17.9791 21.9998 17.0318 21.5788L13.1756 19.8649C11.8526 19.2769 11 17.9649 11 16.5172V11.2719C11 9.82412 11.8526 8.51216 13.1756 7.92417L17.0318 6.21028ZM19.5378 7.26745C18.8896 6.97939 18.1498 6.97939 17.5017 7.26745L13.6454 8.98134C12.7402 9.38365 12.1569 10.2813 12.1569 11.2719V16.5172C12.1569 17.5078 12.7402 18.4054 13.6454 18.8077L17.5017 20.5216C18.1498 20.8097 18.8896 20.8097 19.5378 20.5216L23.394 18.8077C24.2992 18.4054 24.8825 17.5078 24.8825 16.5172V11.2719C24.8825 10.2813 24.2992 9.38365 23.394 8.98134L19.5378 7.26745Z\",\n        fill: \"#FF754C\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        fillRule: \"evenodd\",\n        clipRule: \"evenodd\",\n        d: \"M18.5196 11.7695C18.8391 11.7695 19.098 12.0285 19.098 12.348V20.8318C19.098 21.1512 18.8391 21.4102 18.5196 21.4102C18.2001 21.4102 17.9412 21.1512 17.9412 20.8318V12.348C17.9412 12.0285 18.2001 11.7695 18.5196 11.7695Z\",\n        fill: \"#FF754C\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M21.6372 29.0008V24.8008H22.4172V28.2808H24.3552V29.0008H21.6372Z\",\n        fill: \"#FF754C\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M17.0962 29.0008V24.8008H18.7822C19.0862 24.8008 19.3602 24.8508 19.6042 24.9508C19.8522 25.0508 20.0642 25.1948 20.2402 25.3828C20.4202 25.5708 20.5562 25.7928 20.6482 26.0488C20.7442 26.3048 20.7922 26.5888 20.7922 26.9008C20.7922 27.2128 20.7442 27.4988 20.6482 27.7588C20.5562 28.0148 20.4222 28.2368 20.2462 28.4248C20.0702 28.6088 19.8582 28.7508 19.6102 28.8508C19.3622 28.9508 19.0862 29.0008 18.7822 29.0008H17.0962ZM17.8762 28.3948L17.8162 28.2808H18.7522C18.9482 28.2808 19.1222 28.2488 19.2742 28.1848C19.4302 28.1208 19.5622 28.0288 19.6702 27.9088C19.7782 27.7888 19.8602 27.6448 19.9162 27.4768C19.9722 27.3048 20.0002 27.1128 20.0002 26.9008C20.0002 26.6888 19.9722 26.4988 19.9162 26.3308C19.8602 26.1588 19.7762 26.0128 19.6642 25.8928C19.5562 25.7728 19.4262 25.6808 19.2742 25.6168C19.1222 25.5528 18.9482 25.5208 18.7522 25.5208H17.7982L17.8762 25.4188V28.3948Z\",\n        fill: \"#FF754C\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M11.8813 29.0008V24.8008H12.6193L14.1493 27.2908L13.7173 27.2848L15.2653 24.8008H15.9673V29.0008H15.1933V27.4228C15.1933 27.0628 15.2013 26.7388 15.2173 26.4508C15.2373 26.1628 15.2693 25.8768 15.3133 25.5928L15.4093 25.8508L14.1073 27.8608H13.7113L12.4513 25.8688L12.5353 25.5928C12.5793 25.8608 12.6093 26.1368 12.6253 26.4208C12.6453 26.7008 12.6553 27.0348 12.6553 27.4228V29.0008H11.8813Z\",\n        fill: \"#FF754C\",\n      }),\n    ),\n  s0 = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 36 36\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"rect\", {\n        width: 36,\n        height: 36,\n        rx: 5,\n        fill: \"currentColor\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M22.85 10.9066L20.2141 8.41016C19.9324 8.14492 19.566 8 19.1805 8H14.1602C13.3316 8 12.6562 8.67539 12.6562 9.50391V20.4961C12.6562 21.3246 13.3316 22 14.1602 22H21.8164C22.6449 22 23.3203 21.3246 23.3203 20.4961V11.9977C23.3203 11.5875 23.148 11.1883 22.85 10.9066ZM22.0543 11.2812H20.0117C19.9352 11.2812 19.875 11.2211 19.875 11.1445V9.21953L22.0543 11.2812ZM21.8164 21.1797H14.1602C13.7828 21.1797 13.4766 20.8734 13.4766 20.4961V9.50391C13.4766 9.12656 13.7828 8.82031 14.1602 8.82031H19.0547V11.1445C19.0547 11.6723 19.484 12.1016 20.0117 12.1016H22.5V20.4961C22.5 20.8734 22.1938 21.1797 21.8164 21.1797Z\",\n        fill: \"#01CD8C\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M20.9146 13.4688H14.8989C14.672 13.4688 14.4888 13.652 14.4888 13.8789C14.4888 14.1059 14.672 14.2891 14.8989 14.2891H20.9146C21.1415 14.2891 21.3247 14.1059 21.3247 13.8789C21.3247 13.652 21.1415 13.4688 20.9146 13.4688Z\",\n        fill: \"#01CD8C\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M20.9146 15.6562H14.8989C14.672 15.6562 14.4888 15.8395 14.4888 16.0664C14.4888 16.2934 14.672 16.4766 14.8989 16.4766H20.9146C21.1415 16.4766 21.3247 16.2934 21.3247 16.0664C21.3247 15.8395 21.1415 15.6562 20.9146 15.6562Z\",\n        fill: \"#01CD8C\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M16.8868 17.8438H14.8989C14.672 17.8438 14.4888 18.027 14.4888 18.2539C14.4888 18.4809 14.672 18.6641 14.8989 18.6641H16.8868C17.1138 18.6641 17.297 18.4809 17.297 18.2539C17.297 18.027 17.1138 17.8438 16.8868 17.8438Z\",\n        fill: \"#01CD8C\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M21.719 27.9419V23.8555H23.3594C23.6552 23.8555 23.9218 23.9041 24.1592 24.0014C24.4005 24.0987 24.6067 24.2388 24.778 24.4217C24.9531 24.6047 25.0854 24.8206 25.175 25.0697C25.2684 25.3188 25.3151 25.5951 25.3151 25.8987C25.3151 26.2023 25.2684 26.4805 25.175 26.7335C25.0854 26.9826 24.9551 27.1986 24.7838 27.3815C24.6126 27.5605 24.4063 27.6987 24.165 27.796C23.9237 27.8933 23.6552 27.9419 23.3594 27.9419H21.719ZM22.4779 27.3523L22.4195 27.2414H23.3302C23.5209 27.2414 23.6902 27.2102 23.8381 27.148C23.9899 27.0857 24.1183 26.9962 24.2234 26.8794C24.3285 26.7627 24.4083 26.6226 24.4627 26.4591C24.5172 26.2918 24.5445 26.105 24.5445 25.8987C24.5445 25.6924 24.5172 25.5076 24.4627 25.3441C24.4083 25.1768 24.3265 25.0347 24.2176 24.9179C24.1125 24.8012 23.986 24.7117 23.8381 24.6494C23.6902 24.5871 23.5209 24.556 23.3302 24.556H22.402L22.4779 24.4568V27.3523Z\",\n        fill: \"#01CD8C\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M18.0706 27.9419V23.8555H20.7443V24.5443H18.8178V27.2531H20.7676V27.9419H18.0706ZM18.4208 26.1906V25.5134H20.4465V26.1906H18.4208Z\",\n        fill: \"#01CD8C\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M14.4219 27.9419V23.8555H17.0956V24.5443H15.1691V27.2531H17.1189V27.9419H14.4219ZM14.7721 26.1906V25.5134H16.7979V26.1906H14.7721Z\",\n        fill: \"#01CD8C\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M12.0577 28C11.8203 28 11.6024 27.9708 11.4039 27.9125C11.2054 27.8502 11.0264 27.7587 10.8668 27.6381C10.7073 27.5174 10.5652 27.3715 10.4407 27.2003L10.9369 26.6398C11.1276 26.9045 11.3144 27.0874 11.4973 27.1886C11.6802 27.2898 11.8865 27.3404 12.1161 27.3404C12.2484 27.3404 12.3691 27.3209 12.4781 27.282C12.587 27.2392 12.6727 27.1827 12.7349 27.1127C12.7972 27.0387 12.8283 26.9551 12.8283 26.8617C12.8283 26.7955 12.8147 26.7352 12.7875 26.6807C12.7641 26.6223 12.7271 26.5717 12.6765 26.5289C12.6259 26.4822 12.5637 26.4394 12.4897 26.4005C12.4158 26.3616 12.3321 26.3285 12.2387 26.3012C12.1453 26.274 12.0422 26.2487 11.9293 26.2253C11.7153 26.1825 11.5284 26.1261 11.3689 26.0561C11.2093 25.9821 11.075 25.8926 10.9661 25.7875C10.8571 25.6785 10.7773 25.5579 10.7267 25.4256C10.6761 25.2894 10.6508 25.1356 10.6508 24.9644C10.6508 24.7931 10.6878 24.6355 10.7618 24.4915C10.8396 24.3475 10.9447 24.223 11.077 24.1179C11.2093 24.0128 11.363 23.9311 11.5382 23.8727C11.7133 23.8143 11.9021 23.7852 12.1044 23.7852C12.3341 23.7852 12.5384 23.8124 12.7174 23.8669C12.9003 23.9214 13.0599 24.0031 13.1961 24.1121C13.3362 24.2172 13.451 24.3456 13.5405 24.4974L13.0385 24.9936C12.9606 24.8729 12.8731 24.7737 12.7758 24.6958C12.6785 24.6141 12.5734 24.5538 12.4605 24.5149C12.3477 24.4721 12.229 24.4507 12.1044 24.4507C11.9643 24.4507 11.8417 24.4701 11.7367 24.509C11.6355 24.548 11.5557 24.6044 11.4973 24.6783C11.4389 24.7484 11.4097 24.834 11.4097 24.9352C11.4097 25.013 11.4273 25.0831 11.4623 25.1454C11.4973 25.2037 11.546 25.2563 11.6082 25.303C11.6744 25.3497 11.7581 25.3905 11.8593 25.4256C11.9604 25.4606 12.0753 25.4917 12.2037 25.519C12.4177 25.5618 12.6104 25.6202 12.7816 25.6941C12.9529 25.7642 13.0988 25.8498 13.2195 25.951C13.3401 26.0483 13.4316 26.1611 13.4938 26.2896C13.5561 26.4141 13.5872 26.5542 13.5872 26.7099C13.5872 26.9784 13.523 27.21 13.3946 27.4046C13.2701 27.5953 13.093 27.7432 12.8634 27.8482C12.6337 27.9494 12.3652 28 12.0577 28Z\",\n        fill: \"#01CD8C\",\n      }),\n    ),\n  c0 = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 36 36\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"rect\", {\n        width: 36,\n        height: 36,\n        rx: 5,\n        fill: \"currentColor\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M24.3974 10.5688C24.3828 9.804 23.6822 9.12385 22.4183 8.65388C21.2857 8.23353 19.7852 8 18.2002 8C16.6122 8 15.1147 8.23353 13.9791 8.65388C12.7152 9.12385 12.0117 9.80692 12 10.5717C12 10.5776 12 10.5863 12 10.5922V19.4078C12 20.1843 12.7035 20.8703 13.9791 21.3461C15.1147 21.7694 16.6122 22 18.2002 22C19.7882 22 21.2857 21.7665 22.4212 21.3461C23.6968 20.8732 24.4003 20.1843 24.4003 19.4078V10.5922C24.3974 10.5863 24.3974 10.5776 24.3974 10.5688ZM23.4867 19.4078C23.4867 20.0938 21.4258 21.0892 18.1972 21.0892C14.9687 21.0892 12.9078 20.0938 12.9078 19.4078V17.8753C13.1997 18.0738 13.5559 18.2519 13.9762 18.4095C15.1147 18.8299 16.6122 19.0634 18.2002 19.0634C19.7882 19.0634 21.2886 18.8299 22.4212 18.4095C22.8415 18.2519 23.1977 18.0738 23.4896 17.8753V19.4078H23.4867ZM23.4867 16.4566C23.4867 16.4595 23.4867 16.4654 23.4867 16.4683C23.4867 17.1543 21.4258 18.1497 18.1972 18.1497C14.9687 18.1497 12.9078 17.1543 12.9078 16.4683V14.9358C13.1997 15.1343 13.5559 15.3123 13.9762 15.47C15.1118 15.8932 16.6093 16.1239 18.1972 16.1239C19.7852 16.1239 21.2827 15.8903 22.4183 15.47C22.8386 15.3153 23.1947 15.1343 23.4867 14.9358V16.4566ZM23.4867 13.52C23.4867 13.5229 23.4867 13.5288 23.4867 13.5317C23.4867 14.2177 21.4258 15.2131 18.1972 15.2131C14.9687 15.2131 12.9078 14.2177 12.9078 13.5317V11.9992C13.1997 12.1977 13.5559 12.3757 13.9762 12.5304C15.1118 12.9537 16.6093 13.1843 18.1972 13.1843C19.7852 13.1843 21.2827 12.9508 22.4183 12.5304C22.8357 12.3757 23.1947 12.1947 23.4867 11.9992V13.52ZM18.2002 12.2736C14.9716 12.2736 12.9108 11.2781 12.9108 10.5922C12.9108 9.90617 14.9716 8.91076 18.2002 8.91076C21.4287 8.91076 23.4896 9.90617 23.4896 10.5922C23.4867 11.2781 21.4287 12.2736 18.2002 12.2736Z\",\n        fill: \"#247EFE\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M21.9987 28.3335C21.6947 28.3335 21.4167 28.2815 21.1647 28.1775C20.9127 28.0735 20.6947 27.9255 20.5107 27.7335C20.3267 27.5375 20.1827 27.3075 20.0787 27.0435C19.9787 26.7755 19.9287 26.4835 19.9287 26.1675C19.9287 25.8635 19.9827 25.5815 20.0907 25.3215C20.1987 25.0615 20.3487 24.8335 20.5407 24.6375C20.7327 24.4415 20.9567 24.2895 21.2127 24.1815C21.4687 24.0735 21.7467 24.0195 22.0467 24.0195C22.2507 24.0195 22.4487 24.0495 22.6407 24.1095C22.8327 24.1695 23.0087 24.2535 23.1687 24.3615C23.3287 24.4655 23.4627 24.5875 23.5707 24.7275L23.0727 25.2735C22.9687 25.1655 22.8607 25.0755 22.7487 25.0035C22.6407 24.9275 22.5267 24.8715 22.4067 24.8355C22.2907 24.7955 22.1707 24.7755 22.0467 24.7755C21.8627 24.7755 21.6887 24.8095 21.5247 24.8775C21.3647 24.9455 21.2247 25.0415 21.1047 25.1655C20.9887 25.2895 20.8967 25.4375 20.8287 25.6095C20.7607 25.7775 20.7267 25.9655 20.7267 26.1735C20.7267 26.3855 20.7587 26.5775 20.8227 26.7495C20.8907 26.9215 20.9847 27.0695 21.1047 27.1935C21.2287 27.3175 21.3747 27.4135 21.5427 27.4815C21.7147 27.5455 21.9027 27.5775 22.1067 27.5775C22.2387 27.5775 22.3667 27.5595 22.4907 27.5235C22.6147 27.4875 22.7287 27.4375 22.8327 27.3735C22.9407 27.3055 23.0387 27.2275 23.1267 27.1395L23.5107 27.7575C23.4147 27.8655 23.2867 27.9635 23.1267 28.0515C22.9667 28.1395 22.7867 28.2095 22.5867 28.2615C22.3907 28.3095 22.1947 28.3335 21.9987 28.3335Z\",\n        fill: \"#247EFE\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M16.0918 28.2703V24.0703H17.9158C18.1678 24.0703 18.3978 24.1303 18.6058 24.2503C18.8138 24.3663 18.9778 24.5263 19.0978 24.7303C19.2218 24.9303 19.2838 25.1563 19.2838 25.4083C19.2838 25.6483 19.2218 25.8703 19.0978 26.0743C18.9778 26.2743 18.8138 26.4343 18.6058 26.5543C18.4018 26.6703 18.1718 26.7283 17.9158 26.7283H16.8538V28.2703H16.0918ZM18.5278 28.2703L17.4598 26.3743L18.2638 26.2243L19.4518 28.2763L18.5278 28.2703ZM16.8538 26.0503H17.9218C18.0378 26.0503 18.1378 26.0243 18.2218 25.9723C18.3098 25.9163 18.3778 25.8403 18.4258 25.7443C18.4738 25.6483 18.4978 25.5423 18.4978 25.4263C18.4978 25.2943 18.4678 25.1803 18.4078 25.0843C18.3478 24.9883 18.2638 24.9123 18.1558 24.8563C18.0478 24.8003 17.9238 24.7723 17.7838 24.7723H16.8538V26.0503Z\",\n        fill: \"#247EFE\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M13.662 28.332C13.418 28.332 13.194 28.302 12.99 28.242C12.786 28.178 12.602 28.084 12.438 27.96C12.274 27.836 12.128 27.686 12 27.51L12.51 26.934C12.706 27.206 12.898 27.394 13.086 27.498C13.274 27.602 13.486 27.654 13.722 27.654C13.858 27.654 13.982 27.634 14.094 27.594C14.206 27.55 14.294 27.492 14.358 27.42C14.422 27.344 14.454 27.258 14.454 27.162C14.454 27.094 14.44 27.032 14.412 26.976C14.388 26.916 14.35 26.864 14.298 26.82C14.246 26.772 14.182 26.728 14.106 26.688C14.03 26.648 13.944 26.614 13.848 26.586C13.752 26.558 13.646 26.532 13.53 26.508C13.31 26.464 13.118 26.406 12.954 26.334C12.79 26.258 12.652 26.166 12.54 26.058C12.428 25.946 12.346 25.822 12.294 25.686C12.242 25.546 12.216 25.388 12.216 25.212C12.216 25.036 12.254 24.874 12.33 24.726C12.41 24.578 12.518 24.45 12.654 24.342C12.79 24.234 12.948 24.15 13.128 24.09C13.308 24.03 13.502 24 13.71 24C13.946 24 14.156 24.028 14.34 24.084C14.528 24.14 14.692 24.224 14.832 24.336C14.976 24.444 15.094 24.576 15.186 24.732L14.67 25.242C14.59 25.118 14.5 25.016 14.4 24.936C14.3 24.852 14.192 24.79 14.076 24.75C13.96 24.706 13.838 24.684 13.71 24.684C13.566 24.684 13.44 24.704 13.332 24.744C13.228 24.784 13.146 24.842 13.086 24.918C13.026 24.99 12.996 25.078 12.996 25.182C12.996 25.262 13.014 25.334 13.05 25.398C13.086 25.458 13.136 25.512 13.2 25.56C13.268 25.608 13.354 25.65 13.458 25.686C13.562 25.722 13.68 25.754 13.812 25.782C14.032 25.826 14.23 25.886 14.406 25.962C14.582 26.034 14.732 26.122 14.856 26.226C14.98 26.326 15.074 26.442 15.138 26.574C15.202 26.702 15.234 26.846 15.234 27.006C15.234 27.282 15.168 27.52 15.036 27.72C14.908 27.916 14.726 28.068 14.49 28.176C14.254 28.28 13.978 28.332 13.662 28.332Z\",\n        fill: \"#247EFE\",\n      }),\n    ),\n  u0 = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 36 36\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"rect\", {\n        width: 36,\n        height: 36,\n        rx: 5,\n        fill: \"currentColor\",\n      }),\n      /* @__PURE__ */ O.createElement(\n        \"g\",\n        { clipPath: \"url(#clip0_20572_494884)\" },\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M23.0406 9.14436C22.9197 9.01752 22.7469 9.03712 22.6495 9.1293C22.5522 9.22153 22.5234 9.39311 22.6436 9.52061C22.6442 9.52135 22.6449 9.52206 22.6456 9.52275C22.7053 9.58479 22.7774 9.61137 22.8468 9.61137C22.9186 9.61137 22.9875 9.58287 23.0367 9.53571C23.1335 9.44296 23.1615 9.27124 23.0406 9.14436Z\",\n          fill: \"#EF5DA8\",\n        }),\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M21.4736 8.67965L21.4735 8.67962C20.441 8.00403 19.24 7.64688 18 7.64688C14.497 7.64688 11.6469 10.497 11.6469 14C11.6469 17.503 14.497 20.3531 18 20.3531C21.503 20.3531 24.3531 17.503 24.3531 14C24.3531 12.8057 24.02 11.6422 23.3899 10.6351C23.3899 10.6351 23.3899 10.6351 23.3899 10.6351L23.4747 10.5821L21.4736 8.67965ZM21.4736 8.67965C21.6462 8.7925 21.8776 8.74421 21.9905 8.57159L21.9905 8.57158M21.4736 8.67965L21.9905 8.57158M21.9905 8.57158C22.1034 8.39899 22.0551 8.16758 21.8825 8.05462L21.8825 8.05461M21.9905 8.57158L21.8825 8.05461M21.8825 8.05461C20.728 7.29926 19.3853 6.9 18 6.9C16.1037 6.9 14.3204 7.63867 12.9795 8.97952L12.9795 8.97953M21.8825 8.05461L12.9795 8.97953M12.9795 8.97953C11.6387 10.3204 10.9 12.1037 10.9 14C10.9 15.8963 11.6387 17.6796 12.9795 19.0205L13.0502 18.9498M12.9795 8.97953L13.0502 18.9498M13.0502 18.9498L12.9795 19.0205C14.3204 20.3613 16.1037 21.1 18 21.1C19.8963 21.1 21.6796 20.3613 23.0205 19.0205L22.9498 18.9498L23.0205 19.0205C24.3613 17.6796 25.1 15.8963 25.1 14C25.1 12.6656 24.7276 11.365 24.0231 10.239L13.0502 18.9498Z\",\n          fill: \"#EF5DA8\",\n          stroke: \"#EF5DA8\",\n          strokeWidth: 0.2,\n        }),\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M21.4199 10.5806C21.2497 10.4106 20.9741 10.4106 20.8039 10.5806L18.166 13.2186C17.9763 13.1217 17.7618 13.0667 17.5346 13.0667C16.7661 13.0667 16.1409 13.6919 16.1409 14.4604C16.1409 14.6876 16.1959 14.9021 16.2928 15.0918L16.1276 15.257C15.9575 15.4271 15.9575 15.7028 16.1276 15.8729C16.2126 15.958 16.3241 16.0005 16.4355 16.0005C16.5469 16.0005 16.6584 15.958 16.7435 15.8729L16.9105 15.7059C17.0984 15.8005 17.3103 15.854 17.5346 15.854C18.303 15.854 18.9282 15.2289 18.9282 14.4604C18.9282 14.2361 18.8746 14.0242 18.7801 13.8363L21.4198 11.1966C21.5899 11.0265 21.5899 10.7507 21.4199 10.5806ZM17.5346 14.983C17.3935 14.983 17.2654 14.9265 17.1713 14.8352C17.1703 14.8342 17.1694 14.8331 17.1684 14.8321C17.1665 14.8302 17.1644 14.8285 17.1625 14.8267C17.0695 14.7323 17.012 14.6029 17.012 14.4603C17.012 14.1721 17.2464 13.9377 17.5346 13.9377C17.8228 13.9377 18.0572 14.1721 18.0572 14.4603C18.0572 14.7485 17.8228 14.983 17.5346 14.983Z\",\n          fill: \"#EF5DA8\",\n        }),\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M17.0175 17.8536C16.9667 17.8027 16.8961 17.7734 16.8242 17.7734C16.7523 17.7734 16.6818 17.8027 16.6309 17.8536C16.58 17.9044 16.5508 17.9747 16.5508 18.0469C16.5508 18.1188 16.58 18.1893 16.6309 18.2402C16.6818 18.2911 16.7523 18.3203 16.8242 18.3203C16.8961 18.3203 16.9667 18.2911 17.0175 18.2402C17.0684 18.1893 17.0977 18.1188 17.0977 18.0469C17.0977 17.9747 17.0684 17.9044 17.0175 17.8536Z\",\n          fill: \"#EF5DA8\",\n        }),\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M19.1758 17.7734H17.8906C17.7396 17.7734 17.6172 17.8959 17.6172 18.0469C17.6172 18.1979 17.7396 18.3203 17.8906 18.3203H19.1758C19.3268 18.3203 19.4492 18.1979 19.4492 18.0469C19.4492 17.8959 19.3268 17.7734 19.1758 17.7734Z\",\n          fill: \"#EF5DA8\",\n        }),\n      ),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M12.6812 28V23.8H15.4292V24.508H13.4492V27.292H15.4532V28H12.6812ZM13.0412 26.2V25.504H15.1232V26.2H13.0412ZM18.9572 28L17.6552 26.116L15.9872 23.8H16.9592L18.2312 25.66L19.9292 28H18.9572ZM15.9572 28L17.5592 25.714L18.1112 26.188L16.8692 28H15.9572ZM18.3272 26.05L17.7812 25.594L18.9572 23.8H19.8692L18.3272 26.05ZM20.5855 28V23.8H22.3315C22.5715 23.8 22.7875 23.858 22.9795 23.974C23.1755 24.09 23.3315 24.248 23.4475 24.448C23.5635 24.648 23.6215 24.872 23.6215 25.12C23.6215 25.372 23.5635 25.6 23.4475 25.804C23.3315 26.004 23.1755 26.164 22.9795 26.284C22.7875 26.404 22.5715 26.464 22.3315 26.464H21.3655V28H20.5855ZM21.3655 25.744H22.2775C22.3775 25.744 22.4675 25.716 22.5475 25.66C22.6315 25.604 22.6975 25.53 22.7455 25.438C22.7975 25.346 22.8235 25.242 22.8235 25.126C22.8235 25.01 22.7975 24.908 22.7455 24.82C22.6975 24.728 22.6315 24.656 22.5475 24.604C22.4675 24.548 22.3775 24.52 22.2775 24.52H21.3655V25.744Z\",\n        fill: \"#EF5DA8\",\n      }),\n      /* @__PURE__ */ O.createElement(\n        \"defs\",\n        null,\n        /* @__PURE__ */ O.createElement(\n          \"clipPath\",\n          { id: \"clip0_20572_494884\" },\n          /* @__PURE__ */ O.createElement(\"rect\", {\n            width: 16,\n            height: 16,\n            fill: \"white\",\n            transform: \"translate(10 6)\",\n          }),\n        ),\n      ),\n    ),\n  d0 = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 36 36\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"rect\", {\n        width: 36,\n        height: 36,\n        rx: 5,\n        fill: \"currentColor\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M22.6364 20H20.8636C20.5091 20 20.2727 19.7636 20.2727 19.4091C20.2727 19.0545 20.5091 18.8182 20.8636 18.8182H22.6364C23.2864 18.8182 23.8182 18.2864 23.8182 17.6364V15.8636C23.8182 15.5091 24.0545 15.2727 24.4091 15.2727C24.7636 15.2727 25 15.5091 25 15.8636V17.6364C25 18.9364 23.9364 20 22.6364 20ZM16.1364 20H14.3636C13.0636 20 12 18.9364 12 17.6364V15.8636C12 15.5091 12.2364 15.2727 12.5909 15.2727C12.9455 15.2727 13.1818 15.5091 13.1818 15.8636V17.6364C13.1818 18.2864 13.7136 18.8182 14.3636 18.8182H16.1364C16.4909 18.8182 16.7273 19.0545 16.7273 19.4091C16.7273 19.7636 16.4909 20 16.1364 20ZM18.5 15.8636C17.2 15.8636 16.1364 14.8 16.1364 13.5C16.1364 12.2 17.2 11.1364 18.5 11.1364C19.8 11.1364 20.8636 12.2 20.8636 13.5C20.8636 14.8 19.8 15.8636 18.5 15.8636ZM18.5 12.3182C17.85 12.3182 17.3182 12.85 17.3182 13.5C17.3182 14.15 17.85 14.6818 18.5 14.6818C19.15 14.6818 19.6818 14.15 19.6818 13.5C19.6818 12.85 19.15 12.3182 18.5 12.3182ZM24.4091 11.7273C24.0545 11.7273 23.8182 11.4909 23.8182 11.1364V9.36364C23.8182 8.71364 23.2864 8.18182 22.6364 8.18182H20.8636C20.5091 8.18182 20.2727 7.94545 20.2727 7.59091C20.2727 7.23636 20.5091 7 20.8636 7H22.6364C23.9364 7 25 8.06364 25 9.36364V11.1364C25 11.4909 24.7636 11.7273 24.4091 11.7273ZM12.5909 11.7273C12.2364 11.7273 12 11.4909 12 11.1364V9.36364C12 8.06364 13.0636 7 14.3636 7H16.1364C16.4909 7 16.7273 7.23636 16.7273 7.59091C16.7273 7.94545 16.4909 8.18182 16.1364 8.18182H14.3636C13.7136 8.18182 13.1818 8.71364 13.1818 9.36364V11.1364C13.1818 11.4909 12.9455 11.7273 12.5909 11.7273Z\",\n        fill: \"#9B8AFF\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M14.1909 28.06C13.9469 28.06 13.7229 28.03 13.5189 27.97C13.3149 27.906 13.1309 27.812 12.9669 27.688C12.8029 27.564 12.6569 27.414 12.5289 27.238L13.0389 26.662C13.2349 26.934 13.4269 27.122 13.6149 27.226C13.8029 27.33 14.0149 27.382 14.2509 27.382C14.3869 27.382 14.5109 27.362 14.6229 27.322C14.7349 27.278 14.8229 27.22 14.8869 27.148C14.9509 27.072 14.9829 26.986 14.9829 26.89C14.9829 26.822 14.9689 26.76 14.9409 26.704C14.9169 26.644 14.8789 26.592 14.8269 26.548C14.7749 26.5 14.7109 26.456 14.6349 26.416C14.5589 26.376 14.4729 26.342 14.3769 26.314C14.2809 26.286 14.1749 26.26 14.0589 26.236C13.8389 26.192 13.6469 26.134 13.4829 26.062C13.3189 25.986 13.1809 25.894 13.0689 25.786C12.9569 25.674 12.8749 25.55 12.8229 25.414C12.7709 25.274 12.7449 25.116 12.7449 24.94C12.7449 24.764 12.7829 24.602 12.8589 24.454C12.9389 24.306 13.0469 24.178 13.1829 24.07C13.3189 23.962 13.4769 23.878 13.6569 23.818C13.8369 23.758 14.0309 23.728 14.2389 23.728C14.4749 23.728 14.6849 23.756 14.8689 23.812C15.0569 23.868 15.2209 23.952 15.3609 24.064C15.5049 24.172 15.6229 24.304 15.7149 24.46L15.1989 24.97C15.1189 24.846 15.0289 24.744 14.9289 24.664C14.8289 24.58 14.7209 24.518 14.6049 24.478C14.4889 24.434 14.3669 24.412 14.2389 24.412C14.0949 24.412 13.9689 24.432 13.8609 24.472C13.7569 24.512 13.6749 24.57 13.6149 24.646C13.5549 24.718 13.5249 24.806 13.5249 24.91C13.5249 24.99 13.5429 25.062 13.5789 25.126C13.6149 25.186 13.6649 25.24 13.7289 25.288C13.7969 25.336 13.8829 25.378 13.9869 25.414C14.0909 25.45 14.2089 25.482 14.3409 25.51C14.5609 25.554 14.7589 25.614 14.9349 25.69C15.1109 25.762 15.2609 25.85 15.3849 25.954C15.5089 26.054 15.6029 26.17 15.6669 26.302C15.7309 26.43 15.7629 26.574 15.7629 26.734C15.7629 27.01 15.6969 27.248 15.5649 27.448C15.4369 27.644 15.2549 27.796 15.0189 27.904C14.7829 28.008 14.5069 28.06 14.1909 28.06ZM16.6206 28V23.8H17.3226L19.7586 27.082L19.6266 27.106C19.6106 26.994 19.5966 26.88 19.5846 26.764C19.5726 26.644 19.5606 26.52 19.5486 26.392C19.5406 26.264 19.5326 26.13 19.5246 25.99C19.5206 25.85 19.5166 25.704 19.5126 25.552C19.5086 25.396 19.5066 25.232 19.5066 25.06V23.8H20.2806V28H19.5666L17.1186 24.766L17.2746 24.724C17.2946 24.948 17.3106 25.14 17.3226 25.3C17.3386 25.456 17.3506 25.592 17.3586 25.708C17.3666 25.82 17.3726 25.914 17.3766 25.99C17.3846 26.066 17.3886 26.136 17.3886 26.2C17.3926 26.26 17.3946 26.318 17.3946 26.374V28H16.6206ZM21.4078 28V23.8H23.1538C23.3938 23.8 23.6098 23.858 23.8018 23.974C23.9978 24.09 24.1538 24.248 24.2698 24.448C24.3858 24.648 24.4438 24.872 24.4438 25.12C24.4438 25.372 24.3858 25.6 24.2698 25.804C24.1538 26.004 23.9978 26.164 23.8018 26.284C23.6098 26.404 23.3938 26.464 23.1538 26.464H22.1878V28H21.4078ZM22.1878 25.744H23.0998C23.1998 25.744 23.2898 25.716 23.3698 25.66C23.4538 25.604 23.5198 25.53 23.5678 25.438C23.6198 25.346 23.6458 25.242 23.6458 25.126C23.6458 25.01 23.6198 24.908 23.5678 24.82C23.5198 24.728 23.4538 24.656 23.3698 24.604C23.2898 24.548 23.1998 24.52 23.0998 24.52H22.1878V25.744Z\",\n        fill: \"#9B8AFF\",\n      }),\n    ),\n  tx = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 36 36\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"rect\", {\n        width: 36,\n        height: 36,\n        rx: 5,\n        fill: \"#E6EEF9\",\n      }),\n      /* @__PURE__ */ O.createElement(\n        \"mask\",\n        {\n          id: \"mask0_20565_492827\",\n          style: {\n            maskType: \"luminance\",\n          },\n          maskUnits: \"userSpaceOnUse\",\n          x: 11,\n          y: 7,\n          width: 14,\n          height: 14,\n        },\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M11 7H25V21H11V7Z\",\n          fill: \"white\",\n        }),\n      ),\n      /* @__PURE__ */ O.createElement(\n        \"g\",\n        { mask: \"url(#mask0_20565_492827)\" },\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M11.4102 20.5898H24.5898\",\n          stroke: \"#004FBF\",\n          strokeWidth: 0.8,\n          strokeMiterlimit: 10,\n          strokeLinecap: \"round\",\n          strokeLinejoin: \"round\",\n        }),\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M13.625 17.3086H12.5313C12.3802 17.3086 12.2578 17.431 12.2578 17.582V20.5898H13.8984V17.582C13.8984 17.431 13.776 17.3086 13.625 17.3086Z\",\n          stroke: \"#004FBF\",\n          strokeWidth: 0.8,\n          strokeMiterlimit: 10,\n          strokeLinecap: \"round\",\n          strokeLinejoin: \"round\",\n        }),\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M16.9063 16.3242H15.8125C15.6615 16.3242 15.5391 16.4466 15.5391 16.5977V20.5898H17.1797V16.5977C17.1797 16.4466 17.0573 16.3242 16.9063 16.3242Z\",\n          stroke: \"#004FBF\",\n          strokeWidth: 0.8,\n          strokeMiterlimit: 10,\n          strokeLinecap: \"round\",\n          strokeLinejoin: \"round\",\n        }),\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M20.1875 14.8203H19.0938C18.9427 14.8203 18.8203 14.9427 18.8203 15.0937V20.5898H20.4609V15.0937C20.4609 14.9427 20.3385 14.8203 20.1875 14.8203Z\",\n          stroke: \"#004FBF\",\n          strokeWidth: 0.8,\n          strokeMiterlimit: 10,\n          strokeLinecap: \"round\",\n          strokeLinejoin: \"round\",\n        }),\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M23.4688 12.0859H22.375C22.224 12.0859 22.1016 12.2084 22.1016 12.3594V20.5898H23.7422V12.3594C23.7422 12.2084 23.6198 12.0859 23.4688 12.0859Z\",\n          stroke: \"#004FBF\",\n          strokeWidth: 0.8,\n          strokeMiterlimit: 10,\n          strokeLinecap: \"round\",\n          strokeLinejoin: \"round\",\n        }),\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M11.4102 15.4023C16.7974 15.4023 22.1847 11.2838 23.9182 7.40977\",\n          stroke: \"#004FBF\",\n          strokeWidth: 0.8,\n          strokeMiterlimit: 10,\n          strokeLinecap: \"round\",\n          strokeLinejoin: \"round\",\n        }),\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M21.4121 8.08301L23.9187 7.41137L24.5904 9.91797\",\n          stroke: \"#004FBF\",\n          strokeWidth: 0.8,\n          strokeMiterlimit: 10,\n          strokeLinecap: \"round\",\n          strokeLinejoin: \"round\",\n        }),\n      ),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M12.771 28V23.8H13.509L15.039 26.29L14.607 26.284L16.155 23.8H16.857V28H16.083V26.422C16.083 26.062 16.091 25.738 16.107 25.45C16.127 25.162 16.159 24.876 16.203 24.592L16.299 24.85L14.997 26.86H14.601L13.341 24.868L13.425 24.592C13.469 24.86 13.499 25.136 13.515 25.42C13.535 25.7 13.545 26.034 13.545 26.422V28H12.771ZM17.9859 28V23.8H20.7339V24.508H18.7539V27.292H20.7579V28H17.9859ZM18.3459 26.2V25.504H20.4279V26.2H18.3459ZM22.5759 28V24.52H21.3759V23.8H24.5919V24.52H23.3559V28H22.5759Z\",\n        fill: \"#004FBF\",\n      }),\n    ),\n  nx = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 24 24\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M18.54 3.24828H5.46C4.24 3.24828 3.25 4.23828 3.25 5.45828C3.25 5.98828 3.44 6.49828 3.78 6.89828L8.95 12.9283C9.14 13.1583 9.25 13.4483 9.25 13.7383V19.3783C9.25 19.9883 9.56 20.5483 10.08 20.8683C10.36 21.0383 10.68 21.1283 11 21.1283C11.27 21.1283 11.53 21.0683 11.78 20.9383L13.78 19.9383C14.38 19.6383 14.75 19.0383 14.75 18.3683V13.7283C14.75 13.4283 14.86 13.1383 15.05 12.9183L20.22 6.88828C20.56 6.48828 20.75 5.97828 20.75 5.44828C20.75 4.22828 19.76 3.23828 18.54 3.23828V3.24828ZM19.08 5.91828L13.91 11.9483C13.48 12.4483 13.25 13.0783 13.25 13.7383V18.3783C13.25 18.4783 13.2 18.5583 13.11 18.5983L11.11 19.5983C11 19.6583 10.91 19.6183 10.87 19.5883C10.83 19.5583 10.75 19.4983 10.75 19.3783V13.7383C10.75 13.0783 10.52 12.4483 10.09 11.9483L4.92 5.91828C4.81 5.78828 4.75 5.62828 4.75 5.45828C4.75 5.06828 5.07 4.74828 5.46 4.74828H18.54C18.93 4.74828 19.25 5.06828 19.25 5.45828C19.25 5.62828 19.19 5.78828 19.08 5.91828Z\",\n        fill: \"#247EFE\",\n      }),\n    ),\n  ox = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 24 24\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M18.9296 14.4993C18.6563 14.5005 18.384 14.5337 18.1184 14.5982L14.5404 8.39545C15.0097 7.89859 15.3231 7.27512 15.442 6.60208C15.5608 5.92904 15.4799 5.23592 15.2092 4.60837C14.9385 3.98081 14.4899 3.44632 13.9187 3.07092C13.3476 2.69553 12.679 2.49569 11.9955 2.49609C11.3121 2.4965 10.6437 2.69713 10.073 3.07319C9.50234 3.44926 9.05434 3.98428 8.78437 4.61216C8.51439 5.24003 8.43429 5.93325 8.55395 6.60615C8.67361 7.27905 8.98779 7.90214 9.45767 8.39845L5.8812 14.5986C5.21597 14.4366 4.51782 14.4732 3.8732 14.704C3.22858 14.9347 2.66579 15.3495 2.25452 15.8969C1.84325 16.4443 1.60157 17.1003 1.55938 17.7837C1.5172 18.467 1.67638 19.1478 2.01721 19.7416C2.35804 20.3354 2.86554 20.8162 3.47689 21.1245C4.08824 21.4328 4.77659 21.555 5.45669 21.476C6.1368 21.397 6.7788 21.1203 7.3032 20.68C7.82761 20.2398 8.21138 19.6555 8.40701 18.9993H15.5928C15.7796 19.6194 16.1351 20.1754 16.6197 20.6051C17.1042 21.0348 17.6987 21.3213 18.3367 21.4326C18.9747 21.5439 19.6311 21.4756 20.2325 21.2354C20.8339 20.9952 21.3567 20.5925 21.7425 20.0722C22.1282 19.552 22.3617 18.9348 22.4169 18.2895C22.4721 17.6442 22.3468 16.9963 22.0549 16.4182C21.7631 15.84 21.3163 15.3544 20.7644 15.0155C20.2125 14.6767 19.5772 14.498 18.9296 14.4993ZM11.9999 4.49933C12.2128 4.49996 12.423 4.54591 12.6167 4.63412C12.8104 4.72233 12.9831 4.85078 13.1233 5.01093C13.2635 5.17107 13.368 5.35924 13.4299 5.56291C13.4917 5.76658 13.5094 5.98108 13.4819 6.19214C13.4544 6.4032 13.3822 6.60598 13.2703 6.78699C13.1583 6.96799 13.009 7.12308 12.8324 7.24192C12.6559 7.36076 12.456 7.44063 12.2462 7.47622C12.0363 7.51181 11.8213 7.50231 11.6154 7.44833C11.4858 7.41393 11.3617 7.36124 11.247 7.29184C10.9617 7.12672 10.7388 6.87203 10.6131 6.5673C10.4873 6.26257 10.4657 5.92485 10.5515 5.60656C10.6373 5.28827 10.8258 5.00721 11.0877 4.807C11.3496 4.6068 11.6703 4.49865 11.9999 4.49933ZM11.1864 9.40509C11.209 9.4104 11.2335 9.4082 11.2563 9.41309C11.7482 9.52841 12.26 9.52806 12.7517 9.41209C12.7717 9.40776 12.7935 9.40977 12.8134 9.40509L16.3866 15.5989C16.3737 15.6126 16.3658 15.6299 16.3532 15.6437C16.1806 15.8293 16.0286 16.0329 15.8999 16.2512L15.8992 16.2526C15.7761 16.4702 15.6765 16.7003 15.6022 16.939C15.5955 16.96 15.5824 16.9782 15.5761 16.9993H8.42374C8.41774 16.9795 8.40549 16.9623 8.3992 16.9426C8.24348 16.4521 7.98155 16.002 7.63205 15.6242C7.62485 15.6165 7.62045 15.6066 7.61319 15.5989L11.1864 9.40509ZM5.07022 19.4993C4.67239 19.4993 4.29086 19.3413 4.00956 19.06C3.72825 18.7787 3.57022 18.3972 3.57022 17.9993C3.57022 17.6015 3.72825 17.22 4.00956 16.9387C4.29086 16.6574 4.67239 16.4993 5.07022 16.4993C5.33569 16.4971 5.59649 16.5691 5.82315 16.7073C6.10846 16.8724 6.33128 17.1271 6.45704 17.4318C6.58279 17.7365 6.60443 18.0741 6.51861 18.3924C6.43278 18.7107 6.24429 18.9917 5.98239 19.1918C5.72049 19.392 5.39984 19.5001 5.07022 19.4993ZM18.9296 19.4993C18.5986 19.5001 18.2767 19.3911 18.0143 19.1894C17.7519 18.9878 17.5637 18.7048 17.4792 18.3848C17.3947 18.0648 17.4186 17.7258 17.5473 17.4209C17.676 17.1159 17.9021 16.8623 18.1903 16.6995C18.4135 16.5656 18.6694 16.4963 18.9296 16.4993C19.3274 16.4993 19.709 16.6574 19.9903 16.9387C20.2716 17.22 20.4296 17.6015 20.4296 17.9993C20.4296 18.3972 20.2716 18.7787 19.9903 19.06C19.709 19.3413 19.3274 19.4993 18.9296 19.4993Z\",\n        fill: \"#247EFE\",\n      }),\n    ),\n  rx = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 24 24\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M13.75 12C13.75 14.8995 11.3995 17.25 8.5 17.25C5.60051 17.25 3.25 14.8995 3.25 12C3.25 9.10051 5.60051 6.75 8.5 6.75C11.3995 6.75 13.75 9.10051 13.75 12Z\",\n        stroke: \"#247EFE\",\n        strokeWidth: 1.5,\n        strokeLinecap: \"round\",\n        strokeLinejoin: \"round\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M20.75 12C20.75 14.8995 18.3995 17.25 15.5 17.25C12.6005 17.25 10.25 14.8995 10.25 12C10.25 9.10051 12.6005 6.75 15.5 6.75C18.3995 6.75 20.75 9.10051 20.75 12Z\",\n        stroke: \"#247EFE\",\n        strokeWidth: 1.5,\n        strokeLinecap: \"round\",\n        strokeLinejoin: \"round\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M14.4001 11.9992C14.4001 10.0181 13.4497 8.27355 12.0001 7.19922C10.5505 8.27355 9.6001 10.0181 9.6001 11.9992C9.6001 13.9803 10.5505 15.7249 12.0001 16.7992C13.4497 15.7249 14.4001 13.9803 14.4001 11.9992Z\",\n        fill: \"#247EFE\",\n      }),\n    ),\n  ix = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 24 24\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M11.9999 16.24C12.1299 16.35 12.2699 16.45 12.4099 16.55C12.5499 16.64 12.6999 16.73 12.8499 16.81C13.6299 17.25 14.5399 17.5 15.4999 17.5C18.5299 17.5 20.9999 15.03 20.9999 12C20.9999 8.97 18.5299 6.5 15.4999 6.5C14.5399 6.5 13.6299 6.75 12.8499 7.19C12.6999 7.27 12.5499 7.36 12.4099 7.45C12.2699 7.55 12.1299 7.65 11.9999 7.76C11.8699 7.65 11.7299 7.55 11.5899 7.45C11.4499 7.36 11.2999 7.27 11.1499 7.19C11.2799 7.06 11.4199 6.95 11.5599 6.84C11.6999 6.73 11.8499 6.63 11.9999 6.53C13.0099 5.88 14.2099 5.5 15.4999 5.5C19.0799 5.5 21.9999 8.42 21.9999 12C21.9999 15.58 19.0799 18.5 15.4999 18.5C14.2099 18.5 13.0099 18.12 11.9999 17.47C11.8499 17.37 11.6999 17.27 11.5599 17.16C11.4199 17.05 11.2799 16.94 11.1499 16.81C11.2999 16.73 11.4499 16.64 11.5899 16.55C11.7299 16.45 11.8699 16.35 11.9999 16.24Z\",\n        fill: \"#247EFE\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M8.5 5.5C9.79 5.5 10.99 5.88 12 6.53C12.15 6.63 12.3 6.73 12.44 6.84C12.58 6.95 12.72 7.06 12.85 7.19C14.17 8.37 15 10.09 15 12C15 13.91 14.17 15.63 12.85 16.81C12.72 16.94 12.58 17.05 12.44 17.16C12.3 17.27 12.15 17.37 12 17.47C10.99 18.12 9.79 18.5 8.5 18.5C4.92 18.5 2 15.58 2 12C2 8.42 4.92 5.5 8.5 5.5ZM12 16.24C10.78 15.23 10 13.7 10 12C10 10.3 10.78 8.77 12 7.76C11.87 7.65 11.73 7.55 11.59 7.45C11.45 7.36 11.3 7.27 11.15 7.19C9.83 8.37 9 10.09 9 12C9 13.91 9.83 15.63 11.15 16.81C11.3 16.73 11.45 16.64 11.59 16.55C11.73 16.45 11.87 16.35 12 16.24Z\",\n        fill: \"#247EFE\",\n      }),\n    ),\n  ax = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 24 24\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M22 13.7945C22 15.9444 21.3018 17.985 19.9808 19.6963C19.7202 20.0341 19.2301 20.0996 18.8864 19.8449C18.5424 19.5898 18.4745 19.1097 18.7346 18.7726C19.8487 17.3295 20.4375 15.6081 20.4375 13.7945C20.4375 9.22487 16.6608 5.5311 12 5.5311C7.336 5.5311 3.5625 9.22772 3.5625 13.7945C3.5625 15.6081 4.15134 17.3295 5.26523 18.7726C5.52554 19.1097 5.45764 19.5898 5.11356 19.8449C4.76932 20.1 4.27951 20.0335 4.01904 19.6963C2.69824 17.985 2 15.9444 2 13.7945C2 8.37828 6.47571 4 12 4C17.5273 4 22 8.38127 22 13.7945ZM16.9501 9.18405C17.2551 9.48295 17.2551 9.9677 16.9501 10.2666L14.4036 12.762C14.6132 13.1407 14.7325 13.5743 14.7325 14.0345C14.7325 15.5111 13.5067 16.7122 12 16.7122C10.4932 16.7122 9.26746 15.5111 9.26746 14.0345C9.26746 12.5582 10.4932 11.3569 12 11.3569C12.4698 11.3569 12.9122 11.4738 13.2987 11.6793L15.8452 9.18391C16.1504 8.88501 16.6449 8.88501 16.9501 9.18405ZM13.17 14.0347C13.17 13.4025 12.6451 12.8881 12 12.8881C11.3549 12.8881 10.83 13.4025 10.83 14.0347C10.83 14.6669 11.3549 15.1812 12 15.1812C12.6451 15.1812 13.17 14.6669 13.17 14.0347Z\",\n        fill: \"#247EFE\",\n      }),\n    ),\n  lx = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 24 24\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M6.99991 6.25064C6.83589 6.25129 6.67342 6.21886 6.52222 6.15528C6.37101 6.09171 6.23418 5.9983 6.11991 5.88064L4.99991 4.77064L3.87991 5.88064C3.76534 5.99796 3.62847 6.09119 3.47734 6.15484C3.32622 6.21849 3.16389 6.25128 2.99991 6.25128C2.83593 6.25128 2.6736 6.21849 2.52247 6.15484C2.37135 6.09119 2.23448 5.99796 2.11991 5.88064C2.00259 5.76607 1.90936 5.6292 1.84571 5.47807C1.78206 5.32695 1.74927 5.16462 1.74927 5.00064C1.74927 4.83666 1.78206 4.67433 1.84571 4.52321C1.90936 4.37208 2.00259 4.23521 2.11991 4.12064L4.11991 2.12064C4.23448 2.00332 4.37135 1.91009 4.52247 1.84644C4.6736 1.78279 4.83593 1.75 4.99991 1.75C5.16389 1.75 5.32622 1.78279 5.47734 1.84644C5.62847 1.91009 5.76534 2.00332 5.87991 2.12064L7.87991 4.12064C8.05317 4.29542 8.17098 4.51745 8.21858 4.75891C8.26618 5.00037 8.24144 5.25051 8.14747 5.47796C8.05349 5.70542 7.89447 5.90008 7.69033 6.03753C7.48618 6.17498 7.24601 6.24912 6.99991 6.25064Z\",\n        fill: \"#247EFE\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M4.99984 22.25C4.83582 22.2507 4.67335 22.2182 4.52215 22.1547C4.37095 22.0911 4.23412 21.9977 4.11984 21.88L2.11984 19.88C1.94658 19.7052 1.82877 19.4832 1.78117 19.2417C1.73357 19.0003 1.75831 18.7501 1.85228 18.5227C1.94626 18.2952 2.10528 18.1006 2.30942 17.9631C2.51357 17.8257 2.75374 17.7515 2.99984 17.75C3.16386 17.7494 3.32633 17.7818 3.47753 17.8454C3.62874 17.9089 3.76557 18.0023 3.87984 18.12L4.99984 19.23L6.11984 18.12C6.23541 18.0044 6.3726 17.9128 6.52359 17.8502C6.67458 17.7877 6.83641 17.7555 6.99984 17.7555C7.16327 17.7555 7.32511 17.7877 7.4761 17.8502C7.62709 17.9128 7.76428 18.0044 7.87984 18.12C7.99541 18.2356 8.08708 18.3728 8.14962 18.5238C8.21216 18.6747 8.24435 18.8366 8.24435 19C8.24435 19.1634 8.21216 19.3253 8.14962 19.4763C8.08708 19.6273 7.99541 19.7644 7.87984 19.88L5.87984 21.88C5.76557 21.9977 5.62874 22.0911 5.47753 22.1547C5.32633 22.2182 5.16386 22.2507 4.99984 22.25Z\",\n        fill: \"#247EFE\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M5 22.25C4.66848 22.25 4.35054 22.1183 4.11612 21.8839C3.8817 21.6495 3.75 21.3315 3.75 21V3C3.75 2.66848 3.8817 2.35054 4.11612 2.11612C4.35054 1.8817 4.66848 1.75 5 1.75C5.33152 1.75 5.64946 1.8817 5.88388 2.11612C6.1183 2.35054 6.25 2.66848 6.25 3V21C6.25 21.3315 6.1183 21.6495 5.88388 21.8839C5.64946 22.1183 5.33152 22.25 5 22.25Z\",\n        fill: \"#247EFE\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M11 6.25C10.6685 6.25 10.3505 6.1183 10.1161 5.88388C9.8817 5.64946 9.75 5.33152 9.75 5C9.75 4.66848 9.8817 4.35054 10.1161 4.11612C10.3505 3.8817 10.6685 3.75 11 3.75H21C21.3315 3.75 21.6495 3.8817 21.8839 4.11612C22.1183 4.35054 22.25 4.66848 22.25 5C22.25 5.33152 22.1183 5.64946 21.8839 5.88388C21.6495 6.1183 21.3315 6.25 21 6.25H11Z\",\n        fill: \"#247EFE\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M11 11.25C10.6685 11.25 10.3505 11.1183 10.1161 10.8839C9.8817 10.6495 9.75 10.3315 9.75 10C9.75 9.66848 9.8817 9.35054 10.1161 9.11612C10.3505 8.8817 10.6685 8.75 11 8.75H19C19.3315 8.75 19.6495 8.8817 19.8839 9.11612C20.1183 9.35054 20.25 9.66848 20.25 10C20.25 10.3315 20.1183 10.6495 19.8839 10.8839C19.6495 11.1183 19.3315 11.25 19 11.25H11Z\",\n        fill: \"#247EFE\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M11 16.25C10.6685 16.25 10.3505 16.1183 10.1161 15.8839C9.8817 15.6495 9.75 15.3315 9.75 15C9.75 14.6685 9.8817 14.3505 10.1161 14.1161C10.3505 13.8817 10.6685 13.75 11 13.75H17C17.3315 13.75 17.6495 13.8817 17.8839 14.1161C18.1183 14.3505 18.25 14.6685 18.25 15C18.25 15.3315 18.1183 15.6495 17.8839 15.8839C17.6495 16.1183 17.3315 16.25 17 16.25H11Z\",\n        fill: \"#247EFE\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M11 21.25C10.6685 21.25 10.3505 21.1183 10.1161 20.8839C9.8817 20.6495 9.75 20.3315 9.75 20C9.75 19.6685 9.8817 19.3505 10.1161 19.1161C10.3505 18.8817 10.6685 18.75 11 18.75H15C15.3315 18.75 15.6495 18.8817 15.8839 19.1161C16.1183 19.3505 16.25 19.6685 16.25 20C16.25 20.3315 16.1183 20.6495 15.8839 20.8839C15.6495 21.1183 15.3315 21.25 15 21.25H11Z\",\n        fill: \"#247EFE\",\n      }),\n    ),\n  sx = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 24 24\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M15.5 6C14.19 6 12.99 6.42 12 7.13C11.01 6.42 9.81 6 8.5 6C5.19 6 2.5 8.69 2.5 12C2.5 15.31 5.19 18 8.5 18C9.81 18 11.01 17.58 12 16.87C12.99 17.58 14.19 18 15.5 18C18.81 18 21.5 15.31 21.5 12C21.5 8.69 18.81 6 15.5 6Z\",\n        fill: \"#247EFE\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M14.4001 11.9992C14.4001 10.0248 13.4521 8.27856 12.0001 7.19922C10.5481 8.26979 9.6001 10.016 9.6001 11.9992C9.6001 13.9824 10.5481 15.7199 12.0001 16.7992C13.4521 15.7287 14.4001 13.9824 14.4001 11.9992Z\",\n        fill: \"white\",\n      }),\n    ),\n  cx = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 24 24\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M12 16.24C11.87 16.35 11.73 16.45 11.59 16.55C11.45 16.64 11.3 16.73 11.15 16.81C10.37 17.25 9.46 17.5 8.5 17.5C5.47 17.5 3 15.03 3 12C3 8.97 5.47 6.5 8.5 6.5C9.46 6.5 10.37 6.75 11.15 7.19C11.3 7.27 11.45 7.36 11.59 7.45C11.73 7.55 11.87 7.65 12 7.76C12.13 7.65 12.27 7.55 12.41 7.45C12.55 7.36 12.7 7.27 12.85 7.19C12.72 7.06 12.58 6.95 12.44 6.84C12.3 6.73 12.15 6.63 12 6.53C10.99 5.88 9.79 5.5 8.5 5.5C4.92 5.5 2 8.42 2 12C2 15.58 4.92 18.5 8.5 18.5C9.79 18.5 10.99 18.12 12 17.47C12.15 17.37 12.3 17.27 12.44 17.16C12.58 17.05 12.72 16.94 12.85 16.81C12.7 16.73 12.55 16.64 12.41 16.55C12.27 16.45 12.13 16.35 12 16.24Z\",\n        fill: \"#247EFE\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M15.5 5.5C14.21 5.5 13.01 5.88 12 6.53C11.85 6.63 11.7 6.73 11.56 6.84C11.42 6.95 11.28 7.06 11.15 7.19C9.83 8.37 9 10.09 9 12C9 13.91 9.83 15.63 11.15 16.81C11.28 16.94 11.42 17.05 11.56 17.16C11.7 17.27 11.85 17.37 12 17.47C13.01 18.12 14.21 18.5 15.5 18.5C19.08 18.5 22 15.58 22 12C22 8.42 19.08 5.5 15.5 5.5ZM12 16.24C13.22 15.23 14 13.7 14 12C14 10.3 13.22 8.77 12 7.76C12.13 7.65 12.27 7.55 12.41 7.45C12.55 7.36 12.7 7.27 12.85 7.19C14.17 8.37 15 10.09 15 12C15 13.91 14.17 15.63 12.85 16.81C12.7 16.73 12.55 16.64 12.41 16.55C12.27 16.45 12.13 16.35 12 16.24Z\",\n        fill: \"#247EFE\",\n      }),\n    ),\n  ux = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 24 24\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M14.7167 12C14.7167 15.7555 11.6723 18.8 7.91675 18.8C4.16121 18.8 1.11675 15.7555 1.11675 12C1.11675 8.24446 4.16121 5.2 7.91675 5.2C11.6723 5.2 14.7167 8.24446 14.7167 12Z\",\n        fill: \"#247EFE\",\n        stroke: \"white\",\n        strokeWidth: 0.4,\n        strokeLinecap: \"round\",\n        strokeLinejoin: \"round\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M22.8835 12C22.8835 15.7555 19.839 18.8 16.0835 18.8C12.328 18.8 9.2835 15.7555 9.2835 12C9.2835 8.24446 12.328 5.2 16.0835 5.2C19.839 5.2 22.8835 8.24446 22.8835 12Z\",\n        fill: \"#247EFE\",\n        stroke: \"white\",\n        strokeWidth: 0.4,\n        strokeLinecap: \"round\",\n        strokeLinejoin: \"round\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M9.5002 11.9984C9.5002 9.86769 10.4839 7.98368 12.0002 6.77668C13.5165 7.98368 14.5002 9.86769 14.5002 11.9984C14.5002 14.1292 13.5165 16.0132 12.0002 17.2202C10.4839 16.0132 9.5002 14.1292 9.5002 11.9984Z\",\n        fill: \"#247EFE\",\n        stroke: \"white\",\n        strokeWidth: 0.6,\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M18.1372 15.5742L5.90025 8.50921\",\n        stroke: \"white\",\n        strokeWidth: 0.6,\n        strokeLinecap: \"round\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M5.90015 15.5703L18.1371 8.5053\",\n        stroke: \"white\",\n        strokeWidth: 0.6,\n        strokeLinecap: \"round\",\n      }),\n    ),\n  dx = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 24 24\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M12 15.7265C10.5461 15.7265 9.36326 16.9094 9.36326 18.3633C9.36326 18.5438 9.38158 18.7202 9.41631 18.8906H6.16405V17.4918L6.4943 17.8221C6.70025 18.028 7.03413 18.028 7.24007 17.8221C7.44602 17.6162 7.44602 17.2823 7.24007 17.0763L6.0096 15.8459C5.80366 15.6399 5.46978 15.6399 5.26383 15.8459L4.03337 17.0763C3.82742 17.2823 3.82742 17.6162 4.03337 17.8221C4.23931 18.028 4.57319 18.028 4.77913 17.8221L5.10936 17.4918V19.418C5.10936 19.7092 5.34547 19.9453 5.6367 19.9453H9.89205C10.3736 20.5853 11.1392 21 12 21C13.4539 21 14.6367 19.8172 14.6367 18.3633C14.6367 16.9094 13.4539 15.7265 12 15.7265ZM12 19.9453C11.1277 19.9453 10.418 19.2356 10.418 18.3633C10.418 17.4909 11.1277 16.7812 12 16.7812C12.8723 16.7812 13.582 17.4909 13.582 18.3633C13.582 19.2356 12.8723 19.9453 12 19.9453Z\",\n        fill: \"#247EFE\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M8.27344 12C8.27344 10.5461 7.09061 9.36326 5.63672 9.36326C5.45616 9.36326 5.27981 9.38158 5.10938 9.41631V6.16405H6.50814L6.17788 6.4943C5.97193 6.70025 5.97193 7.03413 6.17788 7.24007C6.38382 7.44602 6.7177 7.44602 6.92365 7.24007L8.15412 6.0096C8.36006 5.80366 8.36006 5.46978 8.15412 5.26383L6.92365 4.03337C6.7177 3.82742 6.38382 3.82742 6.17788 4.03337C5.97193 4.23931 5.97193 4.57319 6.17788 4.77913L6.50814 5.10936H4.58203C4.2908 5.10936 4.05469 5.34547 4.05469 5.6367V9.89205C3.4147 10.3736 3 11.1392 3 12C3 13.4539 4.18283 14.6367 5.63672 14.6367C7.09061 14.6367 8.27344 13.4539 8.27344 12ZM4.05469 12C4.05469 11.1277 4.76439 10.418 5.63672 10.418C6.50905 10.418 7.21875 11.1277 7.21875 12C7.21875 12.8723 6.50905 13.582 5.63672 13.582C4.76439 13.582 4.05469 12.8723 4.05469 12Z\",\n        fill: \"#247EFE\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M21 12C21 10.5461 19.8172 9.36328 18.3633 9.36328C16.9094 9.36328 15.7265 10.5461 15.7265 12C15.7265 13.4539 16.9094 14.6367 18.3633 14.6367C18.5438 14.6367 18.7202 14.6184 18.8906 14.5837V17.8359H17.4918L17.8221 17.5057C18.028 17.2997 18.028 16.9659 17.8221 16.7599C17.6162 16.554 17.2823 16.554 17.0763 16.7599L15.8459 17.9904C15.6399 18.1963 15.6399 18.5302 15.8459 18.7361L17.0763 19.9666C17.2823 20.1726 17.6162 20.1726 17.8221 19.9666C18.028 19.7607 18.028 19.4268 17.8221 19.2208L17.4918 18.8906H19.418C19.7092 18.8906 19.9453 18.6545 19.9453 18.3633V14.1079C20.5853 13.6264 21 12.8608 21 12ZM18.3633 13.582C17.4909 13.582 16.7812 12.8723 16.7812 12C16.7812 11.1277 17.4909 10.418 18.3633 10.418C19.2356 10.418 19.9453 11.1277 19.9453 12C19.9453 12.8723 19.2356 13.582 18.3633 13.582Z\",\n        fill: \"#247EFE\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M17.8359 5.10938V6.50814L17.5057 6.17788C17.2997 5.97193 16.9659 5.97193 16.7599 6.17788C16.554 6.38382 16.554 6.7177 16.7599 6.92365L17.9904 8.15412C18.1963 8.36006 18.5302 8.36006 18.7361 8.15412L19.9666 6.92365C20.1726 6.7177 20.1726 6.38382 19.9666 6.17788C19.7607 5.97193 19.4268 5.97193 19.2208 6.17788L18.8906 6.50814V4.58203C18.8906 4.2908 18.6545 4.05469 18.3633 4.05469H14.1079C13.6264 3.4147 12.8608 3 12 3C10.5461 3 9.36328 4.18283 9.36328 5.63672C9.36328 7.09061 10.5461 8.27344 12 8.27344C13.4539 8.27344 14.6367 7.09061 14.6367 5.63672C14.6367 5.45616 14.6184 5.27981 14.5837 5.10938H17.8359ZM12 7.21875C11.1277 7.21875 10.418 6.50905 10.418 5.63672C10.418 4.76439 11.1277 4.05469 12 4.05469C12.8723 4.05469 13.582 4.76439 13.582 5.63672C13.582 6.50905 12.8723 7.21875 12 7.21875Z\",\n        fill: \"#247EFE\",\n      }),\n    ),\n  fx = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 40 40\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M24.3834 19.9996C24.3834 16.483 22.65 13.3663 20 11.4663C17.35 13.383 15.6167 16.483 15.6167 19.9996C15.6167 23.5163 17.35 26.633 20 28.533C22.65 26.6163 24.3834 23.5163 24.3834 19.9996Z\",\n        fill: \"#247EFE\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M15.6166 19.9996C15.6166 16.4829 17.3499 13.3662 19.9999 11.4662C18.2666 10.2162 16.1499 9.48291 13.8666 9.48291C8.04992 9.48291 3.33325 14.1996 3.33325 20.0162C3.33325 25.8329 8.04992 30.5496 13.8666 30.5496C16.1666 30.5496 18.2833 29.7996 19.9999 28.5662C17.3499 26.6496 15.6166 23.5496 15.6166 20.0329V19.9996Z\",\n        fill: \"#247EFE\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M26.1333 9.46644C23.8333 9.46644 21.7167 10.2164 20 11.4498C22.65 13.3664 24.3833 16.4664 24.3833 19.9831C24.3833 23.4998 22.65 26.6164 20 28.5164C21.7333 29.7664 23.85 30.4998 26.1333 30.4998C31.95 30.4998 36.6667 25.7831 36.6667 19.9664C36.6667 14.1498 31.95 9.43311 26.1333 9.43311V9.46644Z\",\n        fill: \"#247EFE\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M20 13.633C21.7167 15.2996 22.7167 17.5996 22.7167 19.9996C22.7167 22.3996 21.7167 24.7163 20 26.3663C18.2834 24.6996 17.2834 22.3996 17.2834 19.9996C17.2834 17.5996 18.2834 15.283 20 13.633ZM20 11.4663C17.35 13.383 15.6167 16.483 15.6167 19.9996C15.6167 23.5163 17.35 26.633 20 28.533C22.65 26.6163 24.3834 23.5163 24.3834 19.9996C24.3834 16.483 22.65 13.3663 20 11.4663Z\",\n        fill: \"white\",\n      }),\n    ),\n  hx = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 24 24\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M19 8H16V5C16 4.20435 15.6839 3.44129 15.1213 2.87868C14.5587 2.31607 13.7956 2 13 2H5C4.20435 2 3.44129 2.31607 2.87868 2.87868C2.31607 3.44129 2 4.20435 2 5V13C2 13.7956 2.31607 14.5587 2.87868 15.1213C3.44129 15.6839 4.20435 16 5 16H8V19C8 19.7956 8.31607 20.5587 8.87868 21.1213C9.44129 21.6839 10.2044 22 11 22H19C19.7956 22 20.5587 21.6839 21.1213 21.1213C21.6839 20.5587 22 19.7956 22 19V11C22 10.2044 21.6839 9.44129 21.1213 8.87868C20.5587 8.31607 19.7956 8 19 8ZM20 19C20 19.2652 19.8946 19.5196 19.7071 19.7071C19.5196 19.8946 19.2652 20 19 20H11C10.7348 20 10.4804 19.8946 10.2929 19.7071C10.1054 19.5196 10 19.2652 10 19V15C10 14.7348 9.89464 14.4804 9.70711 14.2929C9.51957 14.1054 9.26522 14 9 14H5C4.73478 14 4.48043 13.8946 4.29289 13.7071C4.10536 13.5196 4 13.2652 4 13V5C4 4.73478 4.10536 4.48043 4.29289 4.29289C4.48043 4.10536 4.73478 4 5 4H13C13.2652 4 13.5196 4.10536 13.7071 4.29289C13.8946 4.48043 14 4.73478 14 5V9C14 9.26522 14.1054 9.51957 14.2929 9.70711C14.4804 9.89464 14.7348 10 15 10H19C19.2652 10 19.5196 10.1054 19.7071 10.2929C19.8946 10.4804 20 10.7348 20 11V19Z\",\n        fill: \"#247EFE\",\n      }),\n    ),\n  px = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 16 15\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M14.1666 15H1.83337C0.822021 15 0 14.1594 0 13.1251V1.87505C0 0.840706 0.822021 0 1.83337 0H14.1666C15.178 0 16 0.840706 16 1.87505V13.1251C16 14.1594 15.178 15 14.1666 15ZM1.83337 1.02273C1.37402 1.02273 1 1.40526 1 1.87505V13.1251C1 13.5949 1.37402 13.9773 1.83337 13.9773H14.1666C14.626 13.9773 15 13.5949 15 13.1251V1.87505C15 1.40526 14.626 1.02273 14.1666 1.02273H1.83337Z\",\n        fill: \"#247EFE\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M15.5 5H0.5C0.223999 5 0 4.776 0 4.5C0 4.224 0.223999 4 0.5 4H15.5C15.776 4 16 4.224 16 4.5C16 4.776 15.776 5 15.5 5Z\",\n        fill: \"#247EFE\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M8 15C7.724 15 7.5 14.769 7.5 14.4844V4.51563C7.5 4.231 7.724 4 8 4C8.276 4 8.5 4.231 8.5 4.51563V14.4844C8.5 14.769 8.276 15 8 15Z\",\n        fill: \"#247EFE\",\n      }),\n    ),\n  gx =\n    \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAN5SURBVHgBrVVLTxNRFP7uzLRAQW2tEDHBVI3PjZDoAkkQA5i4QhcmGFFBf4BgdOUCunMnuNK4gAUoxA2sjAGlC0iUDSZqCGCkCAEhFsqrUOZxPXd42MdMQwJf0s7tvXNe33fuKUMKVPfOuzXNqAVjlxmDj3PuE/uMsTDn+CrJrFMCulqueIJ2PpiNY5+m82aAl2AHoOAtsiT5rQJJiRu3u0O1usEHd+pcgKqp1nRjUNgmBY/9UdUdaqCdeuwGHP7Wcm9DUgARnUp9jj0AVVTXVu5tFGuTIsG5JDHbzA+lS7h10gWXwuBJk1BzJtNc24ESrRc+twPohlFPHeK2M8jNklGal448eua4ZBQdScNpjwMp4N5oEgogIgmREt8QGb4o9uD+2Uxkp8tJHrIcDA/OZeFZodumGl4i2lwh9SusUjDo8y2k4lJuGgoPJ5/fI5oEhuZURDRu5QKaYTxUiLHrQvpYZGfIOOlW8PrHMvqmHKg+44I3Y6OKiGqYz4llHW9HVjAS1nAxx4lfixpCa0ZCEayEVfWE5mkZx/9dyq6YeP5LBi+/LyNIxkeJfzcJbBCfSyrH+JJu6nDzhAu+/TJ6JtbQPhqJ9w8ERYCk+mSitOJYBq4eTYciMXwYX8PQvIpK6iSBjp8RnDvoQDkJL+jp+b2K7skoVi2oSrrJAk6KIN5d36yYYojW27g1zOzz7QvENr9WbXRgdz6GxsjAF7spMi2j7IJLGt5R2cPEc16WggNpzMxofp1jgs7Oev7r82lyDW9GIon+w0TRXG/i3BEX6/gBGQMzKk65Hag85TI18A8swOWQ8KRgn6nPK9JnjPQpOuzE6IKG2dUEkcEDChgPkBpxAYSx+DzK32dyvYXYfhdJPL2wH/3TUbQNR4hOK4ponCuS1GRxgky6SEcyZXyZiaJ5aCXpvIOo+/wnioJsJzUCLKGp610KzfAw0RRIpGmFWvFxf9hcnz+UPBZmIzq6qTXpTUvnVE9L+7XcoLQRKVpDjzBsMEoi901FTY6FuKLnJ1d0pEBYV9f9YhEzrmdpXMt7Mq4Jta1lXpP6bfbaynMaKVwDdgvyseU8LoBAa6nXz7lehxR0pYCwqRU+4uNZoPL9tE92OOvpsBo7Ag9oqlojRE08YanMRCDF4aRxzmnisnxsDkUaG0H6gwrSIrC8uNjUeeOYbcX/ANJIbge2tX2aAAAAAElFTkSuQmCC\",\n  mx =\n    \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAYAAACohjseAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAYoSURBVHgB3ZpfTFtVHMd/57bAWICwjUXpWFJnwmQvq2PqtsRBnMYRIdvLljAfNh8ETYwE2YPJHigPJpoIkxgjwRjBRNEtKgldgnMuRWKQhT/dy5A+IHMbjRnThi7jj2vPzvfAbdpyb9nu7br1fhJCe8+97fmd3//TwygJrhOnC5VspYExXsmJnIyYkx4DOOdBxsgXjrBeFrH1jn/5zlW9e5nWRSGY05bDvhLDlZQBcOJd/K7drSWoLfFC+ZvtDcxO3zHGnqEMQViWS1jZCceuqoXAWP9w7FicgLvq2puZQh8K4dZRpsFonfg7WFxeRYHR/gH1clRAqTkhHGU4wjcrhSaDqialD8LnlGw2LjRXSFaAUzAStrngkwreKzms2TLCAUaFiv1ul3y5HDGVv8iChBcjGxRblnKILApyuEIKP0wWBQWKQpy5yKJwYk4FDkkWRaQIp0IWx06PmPz1OZSXm02OTQU0c2uOArdClEpSImB56Raq3ltG27dulu9DdxbJf32WJq/dpFH/dcrPzaGafTvkfXgdml+kmdm56P0j/hvyP4R0bMqXz/Vc9Ilnb5BZWHl9OyeDYELNx1+WK+8Z+lMIdVMKVywnWiAFqn3JRYF/56j1zGB0HJSWbKZK1zZ5T9/QhHh+Ivq5GDt2wCXuXaDOc5eiz6RdQPfxV6KrrUWN0GrFzm3U8vUF3UliIWqFMKLJo9azg3FjddUvyAWob/uRjGI4yOCLRR+mKxx8C2bbeva3pBqA9lvPiHvml6jpyItxY52eYWnqlWKRjGJCwBIa8E3pjmNSfqHd+w0aEAamDbONBT5cuuKrRjAsIL50Jsnkob0+4ZcPAkwZZhmLGf8DhgXMF6E9NL+gOw5tIKjIe4W5rvl54p7ijfkyusL8VRBwzAhpOE0kMz1VIETY3cKUoeliEf7r237QfA6RFlET6QLPwvzVFOEoKiBvEldYC8MaRC7bXqLtG8h1AKmj5lSXDPdIA8cOPKt5f82+MumDqB4hTKzGoE3VEoxgWED/tVlphlpAeGgKAQK0ifAPASt0omGeWBDkwpbuC1JjiJwAKSR0Z8mUiRoWEJOHKWmROCGkAvzdnteeaECMqWatah8sFwFXyAyGBcSES7cWaY7pBZX8XO3NOvgb/BBA+whgAAWAagVGMdVNwJRiI55KsTSt1dpCYaAFigWkFSwMomieDDRbZJVktvg2JeDoZBIzTUgh8Ce9yWIx4KPQ4m1R0YCavTtkkDKLKQE9f0xoahA+lSg4Engyf1K1WLHzKemHsAKz5glMCaiaIXJc4nVoJLa2xD2xHYPWZ0FILAxyorv7PKUC0x098hbMKRHktWpx/dtTtbLrAIkLkQgWAJF2RGgO5gyfLC0pWvO5ZJhqlwAm8Y0Q4vUPeuICi1v2iSE5aVQ0GEOOa/rco+uLWAhEUZRnjpUci8A0cHlKdhxGsDl2V7nJBEv/h+XuDrqHoSt/y2t11c/L/1f/+U90B0+T88kNdLLjnJx0dpY9msgTaTpaQZ/+9DudH/HL6iUnC5Ukk9fU4POgpGTLoudXn1z9pqPLPod8B7NCx9HpubRsrnvKZJR0d/+i+znQVu1KOQdTRXVjNtCkbNMJE0cHj7Kr5+Kg1NZ7R/YLoffLqIgIqtccA5g6TLclyQIYIaW7an0xURKVzskOT9x4Yq8Xi15xYJa07osmEwC7aWa6Bj3SKiACRWwxHUvxRgtoEOgV4tgj1YuuZkirgJPCBJG4tTDb2OqRVgGxy6ZWJyp4j/TivTz1UEw07b9NoGv/+O3XZFsEYJqIvstbFqnHdKlmlHK5GTUnO4+HySP7dSkVrdD9YPnfBxVhn9NkVTgFFUZ8mqwKYz6Fc+YlqxLhvUpkKdJOFiWSbetVfF2NQWGsXrIcvGv8s5WzamHG34BDklXAYTy73Y2XUkBfR+O02Blwk1Xg5Ib28DJ6XjQw2j+Mw6Q4b0kZjPip3z32RcNH6vu4E784KSs2oYJiBfbIE7SZBFyM0/uxwoFVZ7ahySeee/V7YbuFOG1JGQHzRrJsB8c63v151Uiyx1xvnXbawsohUthhoXvX43KuDdUXIzbNOfdG1kfafZ806gbIe6tPtetqwQZ3AAAAAElFTkSuQmCC\",\n  bx =\n    \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAYAAACohjseAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAT6SURBVHgB7ZrNbxtFGId/s+t1nIQkdg+J4yi10yIOCNRKIA4olSICXEAiCE6c0gvXVPwBNIg7ImcORBx6QDTygQuHFNMLQiDhIlKkKGlsErVppdhOih1/rYd5J1nLX0m96Y7btfxIk12PN4kfzcw7846H4RS25mb8GrQFztgMGCKiKoLngww44kxD1OA8Glq5lTzpQdaqUohFGNO/Fe/OwAUw8GUDWGwlqjVWJOdmF5im/+kWOYKDzRfB4vTZG9+rE0zOvXWda/ha3PrhPvz02cmhtrLaRcn+WM71sAquhaOrS/KefsgxR93SnS3XiowX/DKNSdlFNU2jZu0WOcJf5GyZbthx621BMaXzU8hOv42xYBClH39AZf0fqIZXzIBH0/UPOIcyLLHi+QvytR6JQP/sc5jrd5WLip65wBIfzv6sYkpoFLOICMFalIpyxDQhdxkOU3jpZaQ/+bRJrhW6eNYnWlS/9Doch/EIBRnHgwvv64dd2MAAnIdFNHQ5XS/ogU0oePiuzGIgk0J+7Q5KiU2oxBwLoRS+CGN0DMb6mu1g1LagORLA4/c+loEjFArh3MSErK9k/0Nxa1PKUilubeBpKAuZspCS18hFcN/RePYMDcH3/kcy6ha//w58J9nW32tbsCTEWkVFbfAF+F65JIvFg7t/4yB7CDvkrryL3PQ7VaGToKirT4ZRblNQyRg0RoNNdaVSCel0Gtvb28jlck3v88C5J8qdBdtjsF1M08TBwQHy+Tz29/elILGzsyOvIyMjGB4eRlAs3eiqCiWCA2JOGx8fR19fH/b29lCpVJBKpeqeOTw86sJcrBPpmUAgABUoEwyHw7JYFAoFKbmxsYH+/n54PPX/mitaEHdsHqTWpFYdEtGwUU4lHftP1IIUXEiOxidXmcLUoESQRHZ3d6UIjTWSs7CyCRqX5XJZihaLRfk79NpplAlS4DgNkavB6/XKe+q+JKdCsLfYdjs9QbfTE3Q7vYz+LNBadHR0VE7yNNnTRE/XRqy5jyZ9muxVoHSxXQuJkATlg5Q6qZjUW9GxtSitQalYaVKn6NgYpDUndUVKlWiZ1imUtCB1P8ZYVao2e5icnJRXyvTpOSvLUNVtlQhmMhm5NTE4OFgthmHUPUMLbF3XZT21KiXDrhEkqEVIlArh8/mkKG1NUGu2iqoqcFywks2i/OhhUz11SSqU0bdC20+DmVzsrPngJG0L6o/uw/j3ntwfrYWE8mtxUf5CSWz6yg3gV18DxCaxHfp/+QnGr7flLrYZnBAbvxdEebFJuCI2fk0bu9ttCxoPHyBw45ujzd833kQqLzJ1IUa72k5iJDdlwW+35etyMCRFWXgKhfjvcmfbDra7qFe0YlmUx+gMnt37spDwWUZtb7HtdkgwAYdhBfvLMd7i+woHyGjii/oEHKZPBAK/CEgUdZ8ERcXCV1/CvPMHHIch7mGMxzjYDByGgpH3xj0ZdbPTs83TizxdcdN2VLQDA6J0EMjPND0NxVii4/IgkFoxCy94RJ5VU3VW5lkixJbDK6tXZRTl3LwKOkXbPWQM8EW6kYJT0VhCZDeL6BLIxTr9W50HwzdXl9ixtZshB3KxXtdN9OGVW18I+2twZ3fN0Gcnh9rKEw+la5p+XeTg83ADDDEv5/OtDqWz035PitJxS2BOLAjo0N7zcmg2IT55gnEeE1siSyKGnNjj/gfyHlDD/70S3wAAAABJRU5ErkJggg==\",\n  yx = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 12 12\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"circle\", {\n        cx: 6,\n        cy: 6,\n        r: 6,\n        fill: \"#CC3E44\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M9.07567 6.93747L6.79616 2.98918C6.42383 2.33694 5.4823 2.33694 5.11131 2.98918L2.83046 6.93747C2.45813 7.58972 2.92153 8.4 3.67289 8.4H8.22521C8.97656 8.4 9.448 7.58168 9.07567 6.93747ZM5.9524 7.52409C5.75418 7.52409 5.58944 7.35936 5.58944 7.16114C5.58944 6.96292 5.75418 6.79818 5.9524 6.79818C6.15061 6.79818 6.31535 6.96292 6.30731 7.17051C6.31669 7.35936 6.14258 7.52409 5.9524 7.52409ZM6.28321 5.17762C6.26713 5.45887 6.24972 5.73879 6.23365 6.02004C6.22562 6.11112 6.22562 6.19415 6.22562 6.28389C6.21758 6.43255 6.10106 6.54773 5.9524 6.54773C5.80373 6.54773 5.68855 6.44059 5.67918 6.29192C5.65507 5.85397 5.62962 5.42405 5.60551 4.9861C5.59748 4.87092 5.58944 4.7544 5.58007 4.63921C5.58007 4.44903 5.68721 4.29233 5.86132 4.24278C6.03543 4.20126 6.2082 4.2843 6.28321 4.44903C6.30865 4.50662 6.31669 4.56421 6.31669 4.63118C6.30865 4.81466 6.29124 4.99681 6.28321 5.17762Z\",\n        fill: \"white\",\n      }),\n    ),\n  r1 = ({ viewsType: e }) =>\n    /* @__PURE__ */ f.jsx(Sn, {\n      title: e,\n      children: /* @__PURE__ */ f.jsx(\"div\", {\n        style: {\n          // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n          // @ts-ignore\n          \"--views-color\": Jc[e],\n        },\n        className: Y.views_type_badge,\n        children: e[0],\n      }),\n    }),\n  H5 = () => {\n    const [e, t] = se(!1);\n    ue(() => {\n      setTimeout(() => {\n        t(!0);\n      }, 500);\n      const o = setTimeout(() => {\n        t(!1);\n      }, 3500);\n      return () => clearTimeout(o);\n    }, []);\n    const n = () => {\n      t((o) => !o);\n    };\n    return /* @__PURE__ */ f.jsxs(f.Fragment, {\n      children: [\n        /* @__PURE__ */ f.jsxs(Re, {\n          id: \"lineageLegend\",\n          className: Y.lineage_legend,\n          type: \"button\",\n          onClick: n,\n          children: [\n            \"Legend\",\n            e ? /* @__PURE__ */ f.jsx(Vv, {}) : /* @__PURE__ */ f.jsx(Bv, {}),\n          ],\n        }),\n        /* @__PURE__ */ f.jsx(od, {\n          flip: !0,\n          target: \"lineageLegend\",\n          isOpen: e,\n          className: Y.column_legend,\n          placement: \"top\",\n          children: /* @__PURE__ */ f.jsxs(rd, {\n            children: [\n              Object.keys(Jc).map((o) =>\n                /* @__PURE__ */ f.jsxs(\n                  \"div\",\n                  {\n                    className: \"d-flex gap-sm mb-1 align-items-center\",\n                    children: [\n                      /* @__PURE__ */ f.jsx(r1, { viewsType: o }),\n                      /* @__PURE__ */ f.jsx(\"div\", { children: o }),\n                    ],\n                  },\n                  o,\n                ),\n              ),\n              /* @__PURE__ */ f.jsxs(\"div\", {\n                className: \"d-flex gap-sm mb-1 align-items-center\",\n                children: [\n                  /* @__PURE__ */ f.jsx(\"div\", {\n                    className: Y.column_code_icon,\n                    children: /* @__PURE__ */ f.jsx(Ld, {}),\n                  }),\n                  /* @__PURE__ */ f.jsx(\"div\", { children: \"Code\" }),\n                ],\n              }),\n              /* @__PURE__ */ f.jsxs(\"div\", {\n                className: \"d-flex gap-sm mb-1 align-items-center\",\n                children: [\n                  /* @__PURE__ */ f.jsx(\"div\", {\n                    className: Y.edge_select,\n                    children: /* @__PURE__ */ f.jsx(\"div\", {}),\n                  }),\n                  /* @__PURE__ */ f.jsx(\"div\", { children: \"Select\" }),\n                ],\n              }),\n              /* @__PURE__ */ f.jsxs(\"div\", {\n                className: \"d-flex gap-sm mb-1 align-items-center\",\n                children: [\n                  /* @__PURE__ */ f.jsx(\"div\", {\n                    className: Y.edge_non_select,\n                    children: /* @__PURE__ */ f.jsx(\"div\", {}),\n                  }),\n                  /* @__PURE__ */ f.jsx(\"div\", { children: \"Non select\" }),\n                ],\n              }),\n            ],\n          }),\n        }),\n      ],\n    });\n  };\nvar z5 = { exports: {} };\n/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n(function (e) {\n  (function () {\n    var t = {}.hasOwnProperty;\n    function n() {\n      for (var i = \"\", a = 0; a < arguments.length; a++) {\n        var l = arguments[a];\n        l && (i = r(i, o(l)));\n      }\n      return i;\n    }\n    function o(i) {\n      if (typeof i == \"string\" || typeof i == \"number\") return i;\n      if (typeof i != \"object\") return \"\";\n      if (Array.isArray(i)) return n.apply(null, i);\n      if (\n        i.toString !== Object.prototype.toString &&\n        !i.toString.toString().includes(\"[native code]\")\n      )\n        return i.toString();\n      var a = \"\";\n      for (var l in i) t.call(i, l) && i[l] && (a = r(a, l));\n      return a;\n    }\n    function r(i, a) {\n      return a ? (i ? i + \" \" + a : i + a) : i;\n    }\n    e.exports ? ((n.default = n), (e.exports = n)) : (window.classNames = n);\n  })();\n})(z5);\nvar Cx = z5.exports;\nconst ke = /* @__PURE__ */ fn(Cx),\n  vx = (e) => Te.get(\"upstreamTables\", { table: e }),\n  xx = (e) => Te.get(\"downstreamTables\", { table: e }),\n  wx = (e) =>\n    Te.get(\"getExposureDetails\", {\n      name: e,\n    }),\n  ba = (e, t) =>\n    Te.get(\"getColumns\", {\n      table: e,\n      refresh: t,\n    }),\n  Ex = (e) => Te.get(\"getConnectedColumns\", e),\n  Sx = (e) => Te.get(\"sendFeedback\", e),\n  kx = () => Te.get(\"getLineageSettings\", {}),\n  Yl = (e) => Te.get(\"persistLineageSettings\", e),\n  P5 = () => Te.get(\"init\", {}),\n  _x = (e) => Te.get(\"openFile\", { url: e }),\n  Ax = () => Te.get(\"openChat\", {}),\n  i1 = (e) => Te.get(\"showInfoNotification\", { message: e }),\n  Mx = () => Te.get(\"previewFeature\", {}),\n  Gl = (e) => Te.get(\"columnLineage\", { event: e }),\n  Tx = (e) => Te.get(\"telemetryEvents\", e),\n  Ox = (e) => Te.post(\"dbt/v4/export-lineage\", e);\nvar Nx = /* @__PURE__ */ ((e) => (\n  (e.CANCEL = \"cancel\"), (e.END = \"end\"), (e.START = \"start\"), e\n))(Nx || {});\nconst gt = class gt {\n  static onCancel() {\n    (gt.isCancelled = !0), (gt.inProgress = !1);\n  }\n  static cancel() {\n    gt.onCancel(),\n      Gl(\n        \"cancel\",\n        /* CANCEL */\n      );\n    const t = new CustomEvent(\"cll_cancelled\", { detail: void 0 });\n    document.dispatchEvent(t);\n  }\n  static start() {\n    (gt.inProgress = !0),\n      (gt.isCancelled = !1),\n      (gt.linkCount = 0),\n      Gl(\n        \"start\",\n        /* START */\n      );\n  }\n  static end() {\n    (gt.inProgress = !1),\n      Gl(\n        \"end\",\n        /* END */\n      ),\n      Tx({\n        id: \"columnLineageNumLinks\",\n        params: { num: gt.linkCount },\n      }),\n      (gt.linkCount = 0);\n  }\n  static addLinks(t) {\n    gt.linkCount += t;\n  }\n  static showCllInProgressMsg() {\n    i1(\n      \"Column lineage is in progress. Either wait for it to complete or cancel the current one.\",\n    );\n  }\n};\nYr(gt, \"isCancelled\", !1), Yr(gt, \"inProgress\", !1), Yr(gt, \"linkCount\", 0);\nlet et = gt;\nconst Lx = ({ datatype: e, color: t, size: n = \"1rem\" }) => {\n    const [o, r] = ze(() => {\n      switch (e.toLowerCase()) {\n        case \"integer\":\n        case \"float\":\n        case \"double precision\":\n        case \"double\":\n        case \"bigint\":\n          return [Lv, \"#FF754C\"];\n        case \"bool\":\n        case \"boolean\":\n          return [Ov, \"#00A5DB\"];\n        case \"text\":\n        case \"character\":\n        case \"character varying\":\n        case \"varchar\":\n          return [Nv, \"#3F8CFF\"];\n        case \"geospatial\":\n          return [Fv, \"#01CD8C\"];\n        case \"date\":\n        case \"timestamp\":\n        case \"timestamp with time zone\":\n          return [jv, \"#247EFE\"];\n        default:\n          return [Dv, \"#6A24FE\"];\n      }\n    }, [e]);\n    return /* @__PURE__ */ f.jsx(\"div\", {\n      style: { color: t || r },\n      className: \"d-flex align-items-center\",\n      children: /* @__PURE__ */ f.jsx(o, { width: n, height: n }),\n    });\n  },\n  Dx = {\n    seed: {\n      light: /* @__PURE__ */ f.jsx(s0, { style: { color: \"#E6FAF4\" } }),\n      dark: /* @__PURE__ */ f.jsx(s0, { style: { color: \"#344B49\" } }),\n    },\n    model: {\n      light: /* @__PURE__ */ f.jsx(fi, { style: { color: \"#FFECE6\" } }),\n      dark: /* @__PURE__ */ f.jsx(fi, { style: { color: \"#4D4343\" } }),\n    },\n    cte: {\n      light: /* @__PURE__ */ f.jsx(l0, { style: { color: \"#FDF6EA\" } }),\n      dark: /* @__PURE__ */ f.jsx(l0, { style: { color: \"#4B473F\" } }),\n    },\n    subquery: {\n      light: /* @__PURE__ */ f.jsx(Jv, { style: { color: \"#FDF6EA\" } }),\n      dark: /* @__PURE__ */ f.jsx(ex, { style: { color: \"#4B473F\" } }),\n    },\n    source: {\n      light: /* @__PURE__ */ f.jsx(c0, { style: { color: \"#EAF3FF\" } }),\n      dark: /* @__PURE__ */ f.jsx(c0, { style: { color: \"#384454\" } }),\n    },\n    exposure: {\n      light: /* @__PURE__ */ f.jsx(u0, { style: { color: \"#FEEFF7\" } }),\n      dark: /* @__PURE__ */ f.jsx(u0, { style: { color: \"#4C404C\" } }),\n    },\n    analysis: {\n      light: /* @__PURE__ */ f.jsx($s, {}),\n      dark: /* @__PURE__ */ f.jsx($s, {}),\n    },\n    snapshot: {\n      light: /* @__PURE__ */ f.jsx(d0, { style: { color: \"#F6F4FF\" } }),\n      dark: /* @__PURE__ */ f.jsx(d0, { style: { color: \"#444554\" } }),\n    },\n    semantic_model: {\n      light: /* @__PURE__ */ f.jsx(tx, {}),\n      dark: /* @__PURE__ */ f.jsx(Qv, {}),\n    },\n    macros: {\n      light: /* @__PURE__ */ f.jsx(Ws, {}),\n      dark: /* @__PURE__ */ f.jsx(Ws, {}),\n    },\n    unknown: {\n      light: /* @__PURE__ */ f.jsx(fi, { style: { color: \"#FFECE6\" } }),\n      dark: /* @__PURE__ */ f.jsx(fi, { style: { color: \"#4D4343\" } }),\n    },\n  },\n  a1 = ({ nodeType: e }) =>\n    /* @__PURE__ */ f.jsxs(\"div\", {\n      children: [\n        e === \"seed\" && /* @__PURE__ */ f.jsx(Rv, {}),\n        e === \"model\" && /* @__PURE__ */ f.jsx(di, {}),\n        e === \"cte\" && /* @__PURE__ */ f.jsx(di, {}),\n        e === \"subquery\" && /* @__PURE__ */ f.jsx(di, {}),\n        e === \"source\" && /* @__PURE__ */ f.jsx(Iv, {}),\n        e === \"exposure\" && /* @__PURE__ */ f.jsx(Hv, {}),\n        e === \"analysis\" && /* @__PURE__ */ f.jsx($s, {}),\n        e === \"snapshot\" && /* @__PURE__ */ f.jsx(zv, {}),\n        e === \"semantic_model\" && /* @__PURE__ */ f.jsx(Pv, {}),\n        e === \"macros\" && /* @__PURE__ */ f.jsx(Ws, {}),\n        e === \"unknown\" && /* @__PURE__ */ f.jsx(di, {}),\n      ],\n    }),\n  B5 = ({ nodeType: e }) =>\n    e in Fo\n      ? /* @__PURE__ */ f.jsx(a1, { nodeType: e })\n      : e in Qi\n        ? /* @__PURE__ */ f.jsx(\"img\", {\n            src: Qi[e],\n            className: Y.dialect_icon,\n          })\n        : /* @__PURE__ */ f.jsx(\"div\", {}),\n  jx = ({ nodeType: e }) => {\n    const {\n      state: { theme: t },\n    } = it();\n    return /* @__PURE__ */ f.jsx(f.Fragment, { children: Dx[e][t] });\n  },\n  sr = ({ id: e, icon: t, text: n, label: o }) =>\n    /* @__PURE__ */ f.jsxs(f.Fragment, {\n      children: [\n        /* @__PURE__ */ f.jsxs(\"div\", {\n          className: Y.table_node_pill,\n          id: e,\n          children: [\n            /* @__PURE__ */ f.jsx(\"div\", { className: Y.icon, children: t }),\n            /* @__PURE__ */ f.jsx(\"div\", { children: n }),\n          ],\n        }),\n        /* @__PURE__ */ f.jsx(t4, { target: e, children: o }),\n      ],\n    }),\n  l1 = {\n    seed: Y.seed,\n    model: Y.model,\n    source: Y.source,\n    exposure: Y.exposure,\n    snapshot: Y.snapshot,\n    semantic_model: Y.metrics,\n    macros: Y.macros,\n    analysis: Y.analysis,\n    cte: Y.model,\n    subquery: Y.model,\n    unknown: Y.exposure,\n  },\n  Fo = {\n    seed: \"SED\",\n    model: \"MDL\",\n    source: \"SRC\",\n    exposure: \"EXP\",\n    snapshot: \"SNP\",\n    semantic_model: \"MET\",\n    macros: \"SEM\",\n    analysis: \"ANY\",\n    cte: \"CTE\",\n    subquery: \"SUB\",\n    unknown: \"UNK\",\n  },\n  V5 = (e, t) => (e ? vx(t) : xx(t)),\n  $5 = (e, t) => (e ? t + 1 : t - 1),\n  ya = (e, t, n, o, r, i, a = M5, l = !1, s) => {\n    const u = $5(r, i),\n      c = (p) => {\n        var y, g;\n        const h =\n            ((g = (y = e.find((x) => x.id === p)) == null ? void 0 : y.data) ==\n            null\n              ? void 0\n              : g.level) || 0,\n          m = n1(i, h, o, p, r, l);\n        t.find((x) => x.id === m.id) || t.push(m);\n      };\n    let d = 0;\n    for (const p of n) {\n      if (d >= a) {\n        const m = Gi(o, r);\n        e.push({\n          id: m,\n          data: { tables: n, prevTable: o, right: r, level: u },\n          position: { x: 100, y: 100 },\n          type: \"seeMore\",\n          width: Ir,\n          height: 100,\n        }),\n          c(m);\n        break;\n      }\n      e.find((m) => m.id === p.table) ||\n        (d++,\n        s\n          ? s[p.table].type in Fo\n            ? e.push(Do(p, u, o))\n            : e.push(D5(p.table, u, o, s[p.table]))\n          : e.push(Do(p, u, o))),\n        c(p.table);\n    }\n  },\n  pn = (e, t, n = !1) => {\n    let o = 1 / 0;\n    const r = {};\n    for (const g of e)\n      if (xt(g) && g.parentNode)\n        g.parentNode in r || (r[g.parentNode] = 0),\n          (g.position = {\n            x: $y,\n            y: Wy + ki(r[g.parentNode]),\n          }),\n          r[g.parentNode]++;\n      else {\n        const { level: x } = g.data;\n        o = Math.min(o, x);\n      }\n    const i = {},\n      a = {},\n      l = {},\n      s = {},\n      u = {},\n      c = {};\n    for (const g of t)\n      xt(g) ||\n        ui(e.find((x) => x.id === g.source)) ||\n        ui(e.find((x) => x.id === g.target)) ||\n        ((u[g.source] = u[g.source] || []),\n        u[g.source].push(g.target),\n        (c[g.target] = c[g.target] || []),\n        c[g.target].push(g.source));\n    const d = (g) => {\n        const { level: x } = g.data;\n        if (((a[x] = a[x] || []), !a[x].includes(g.id))) {\n          (l[g.id] = a[x].length), (i[g.id] = 0);\n          for (const v of a[x]) i[g.id] += r[v] || 0;\n          a[x].push(g.id);\n        }\n      },\n      p = (g, x) => {\n        if (!s[g]) {\n          (s[g] = !0), d(e.find((v) => v.id === g));\n          for (const v of x[g] || []) p(v, x);\n        }\n      };\n    for (const g of e)\n      xt(g) || ui(g) || s[g.id] || (p(g.id, u), (s[g.id] = !1), p(g.id, c));\n    for (const g of e) xt(g) || (ui(g) && d(g));\n    const h = (g) => {\n        const x = l[g.id] || 0,\n          v = i[g.id] || 0;\n        return ql + x * (wo + qy) + ki(v, x);\n      },\n      m = (g) => (g - o) * (Ir + Zy) + Vy,\n      b = (g) => (g - o) * (wo + Uy) + ql,\n      y = (g) => {\n        const x = l[g.id] || 0,\n          v = i[g.id] || 0;\n        return ql + x * (wo + Yy) + ki(v, x);\n      };\n    for (const g of e) {\n      if (xt(g)) continue;\n      const { level: x } = g.data;\n      g.position = n ? { x: y(g), y: b(x) } : { x: m(x), y: h(g) };\n    }\n  },\n  W5 = (e, t) => (\n    e.forEach((n) => Yi(n, !0)), t.forEach((n) => jo(n, !1)), [e, t]\n  ),\n  Tr = (e, t, n) => {\n    Ar(t, !0), Mr(t, !1);\n    const o = {},\n      r = {},\n      i = (s, u) => {\n        const c = [n],\n          d = {};\n        for (; c.length > 0; ) {\n          const p = c.shift();\n          (d[p] = !0),\n            (o[p] = !0),\n            t.forEach((h) => {\n              h[s] === p && ((r[h.id] = !0), d[h[u]] || c.push(h[u]));\n            });\n        }\n      };\n    i(\"source\", \"target\"), i(\"target\", \"source\");\n    const a = [...t];\n    a.forEach((s) => jo(s, r[s.id]));\n    const l = [...e];\n    return l.forEach((s) => Yi(s, !!o[s.id])), [l, a];\n  },\n  Zs = (e, t) => {\n    const n = e.getNodes(),\n      o = e.getEdges(),\n      [r, i] = Tr(n, o, t);\n    e.setNodes(r), e.setEdges(i);\n  },\n  Fx = async (e, t, n, o, r, i, a, l, s, u) => {\n    var w, E;\n    const c = [],\n      d = [],\n      {\n        column_lineage: p,\n        confidence: h,\n        errors: m,\n      } = await Ex({\n        targets: r,\n        upstreamExpansion: i,\n        currAnd1HopTables: a,\n        selectedColumn: l,\n        showIndirectEdges: s.indirect,\n      });\n    u((M) => ({ ...M, ...m })), et.addLinks(p.length);\n    const b = p.filter((M) => (i ? n0(r, M.source) : n0(r, M.target))),\n      y = b.map((M) => (i ? M.target : M.source)),\n      g = {},\n      x = ([M, _], j) => {\n        (g[M] = g[M] || []),\n          g[M].find((R) => R.column === _) ||\n            g[M].push({ column: _, viewsType: j });\n      },\n      v = (M, _, j, R, D) => {\n        const P = ma(j, R);\n        d.find((V) => V.id === P) || d.push(qi(j, R, t[M], t[_], D, s));\n      },\n      S = [];\n    for (const M of b) {\n      x(M.source), x(M.target, M.viewsType);\n      const [_] = M.source,\n        [j] = M.target,\n        R = o[_],\n        D = o[j],\n        P = M.source.join(\"/\"),\n        V = M.target.join(\"/\"),\n        k = Cn + P,\n        N = Cn + V,\n        T = M.type;\n      if (R && D) v(_, j, k, N, T);\n      else if (R) {\n        const F = n[j];\n        v(_, F, k, F, T), S.push(M);\n      } else if (D) {\n        const F = n[_];\n        v(F, j, F, N, T), S.push(M);\n      } else S.push(M);\n    }\n    for (const M in g) {\n      if (!o[M]) continue;\n      const _ = [...g[M]];\n      _.sort((j, R) => j.column.localeCompare(R.column));\n      for (const j of _) {\n        const R = {};\n        b\n          .filter((D) => D.target.join(\"/\") === `${M}/${j.column}`)\n          .forEach((D) => {\n            D.type !== \"indirect\" &&\n              (R[D.source.join(\"/\")] = D.viewsCode || []);\n          }),\n          c.push(\n            Ui(\n              M,\n              j.column,\n              j.viewsType,\n              R,\n              (E = (w = e.find((D) => (D.id = M))) == null ? void 0 : w.data) ==\n                null\n                ? void 0\n                : E.nodeType,\n            ),\n          );\n      }\n    }\n    return {\n      nodes: c,\n      edges: d,\n      collectColumns: g,\n      newCurr: y,\n      confidence: h,\n      seeMoreLineage: S,\n    };\n  },\n  Rx = async (e, t, n, o) => {\n    var h, m, b, y;\n    let r = e.filter(En),\n      i = t.filter(En);\n    [r, i] = W5(r, i);\n    const a = {};\n    r.forEach((g) => (a[g.id] = g.data.level));\n    const l = {};\n    e.filter((g) => g.type === \"table\").forEach((g) => (l[g.id] = !0));\n    const s = {},\n      u = [];\n    for (const g of t) {\n      if (g.id.startsWith(Cn)) continue;\n      const x = l[g.source],\n        v = l[g.target];\n      x && v\n        ? u.push({ src: g.source, dst: g.target })\n        : x\n          ? (h = e.find((w) => w.id === g.target).data.tables) == null ||\n            h.forEach((w) => {\n              u.push({ src: g.source, dst: w.table }), (s[w.table] = g.target);\n            })\n          : v &&\n            ((m = e.find((w) => w.id === g.source).data.tables) == null ||\n              m.forEach((w) => {\n                u.push({ src: w.table, dst: g.target }),\n                  (s[w.table] = g.source);\n              }));\n    }\n    const { collect_columns: c, highlight_edges: d } = await o({\n      column_fqn: n,\n      edges: u,\n    });\n    for (const g in c) {\n      if (!l[g]) continue;\n      const x = [...c[g]];\n      x.sort((v, S) => v.column.localeCompare(S.column));\n      for (const v of x) {\n        const S =\n          (y = (b = e.find((w) => w.id === g)) == null ? void 0 : b.data) ==\n          null\n            ? void 0\n            : y.nodeType;\n        r.push(Ui(g, v.column, v.viewsType, {}, S));\n      }\n    }\n    i.forEach((g) => (g.style = ga));\n    const p = (g, x, v, S, w) => {\n      const E = ma(v, S);\n      i.find((M) => M.id === E) ||\n        i.push(\n          qi(v, S, a[g], a[x], w, {\n            direct: w === \"direct\",\n            indirect: w === \"indirect\",\n          }),\n        );\n    };\n    for (const g of d) {\n      const [x] = g[0].split(\"/\"),\n        [v] = g[1].split(\"/\"),\n        S = l[x],\n        w = l[v],\n        E = Cn + g[0],\n        M = Cn + g[1],\n        _ = g[2] || \"direct\";\n      if (S && w) p(x, v, E, M, _);\n      else if (S) {\n        const j = s[v];\n        p(x, j, E, j, _);\n      } else if (w) {\n        const j = s[x];\n        p(j, v, j, M, _);\n      }\n    }\n    return pn(r, i), { nodes: r, edges: i, collect_columns: c };\n  },\n  Ix = (e, t, n, o) => {\n    const r = [...e.nodes],\n      i = [...e.edges];\n    if (\n      (t.nodes.forEach((a) => {\n        const l = r.find((s) => s.id === a.id);\n        if (!l) r.push(a);\n        else {\n          const s =\n            a.data.viewsCode && Object.keys(a.data.viewsCode).length\n              ? a.data.viewsCode\n              : l.data.viewsCode;\n          l.data = {\n            ...l.data,\n            ...a.data,\n            viewsCode: s,\n            viewsType: l.data.viewsType || a.data.viewsType,\n          };\n        }\n      }),\n      t.edges.forEach((a) => {\n        i.find((l) => l.id === a.id) || i.push(a);\n      }),\n      n.name)\n    ) {\n      const a = {},\n        l = _r(n.table, n.name),\n        s = { [l]: \"direct\" },\n        u = [l],\n        c = {},\n        d = o ? \"source\" : \"target\",\n        p = o ? \"target\" : \"source\";\n      for (; u.length > 0; ) {\n        const h = u.shift();\n        if (!c[h]) {\n          c[h] = !0;\n          for (const m of i)\n            m[d] === h &&\n              (u.push(m[p]),\n              s[m[p]] !== \"direct\" &&\n                (s[m[p]] = s[m[d]] === \"direct\" ? m.data.type : \"indirect\"));\n          for (const m of i) m[d] === h && (a[m.id] = s[m[p]]);\n        }\n      }\n      for (const h of i)\n        En(h) ||\n          ((h.data.type = a[h.id] || h.data.type),\n          (h.style = h.data.type === \"direct\" ? e1 : t1));\n    }\n    return pn(r, i), [r, i];\n  },\n  Hx = (e, t) => {\n    const n = e.filter((r) => En(r)),\n      o = t.filter((r) => En(r));\n    return [n, o];\n  },\n  Z5 = async (e, t, n, o) => {\n    const r = [...e],\n      i = [...t],\n      a = [{ table: n, level: r.find((s) => s.id === n).data.level }],\n      l = {};\n    for (; a.length > 0; ) {\n      const { table: s, level: u } = a.shift();\n      if (l[s]) continue;\n      l[s] = !0;\n      const { tables: c } = await V5(o, s);\n      ya(r, i, c, s, o, u),\n        c.forEach((d) => {\n          const p = r.find((h) => h.id === d.table);\n          (p == null ? void 0 : p.data.materialization) === \"ephemeral\" &&\n            a.push({ table: d.table, level: p.data.level });\n        });\n    }\n    return [r, i];\n  },\n  Ki = async (e, t, n, o, r, i = M5) => {\n    const a = [...e],\n      l = [...t];\n    if (o >= r) return [a, l];\n    const s = Ky(o, r),\n      u = a.find((d) => d.id === n).data.level,\n      c = async (d) => {\n        const p = [{ table: n, level: u }],\n          h = {};\n        for (; p.length > 0; ) {\n          const m = p.shift();\n          if (h[m.table]) continue;\n          h[m.table] = !0;\n          const { tables: b = [] } = await V5(d, m.table);\n          ya(a, l, b, m.table, d, m.level, i);\n          const y = $5(d, m.level);\n          s(y)\n            ? p.push(...b.map((g) => ({ table: g.table, level: y })))\n            : p.push(\n                ...b\n                  .filter((g) => g.materialization === \"ephemeral\")\n                  .map((g) => ({ table: g.table, level: y })),\n              );\n        }\n      };\n    return r > u && (await c(!0)), o < u && (await c(!1)), [a, l];\n  },\n  f0 = (e, t, n, o) => {\n    if (!n) return -1;\n    const r = o ? \"source\" : \"target\",\n      i = o ? \"target\" : \"source\",\n      a = o ? \"upstreamCount\" : \"downstreamCount\",\n      l = {},\n      s = {};\n    for (const h of e) xt(h) || ((l[h.id] = h), (s[h.id] = []));\n    for (const h of t) xt(h) || s[h[r]].push(h[i]);\n    const c = (() => {\n      const h = [n],\n        m = {};\n      for (; h.length > 0; ) {\n        const b = h.shift();\n        if (m[b]) continue;\n        m[b] = !0;\n        const y = l[b].data;\n        if (y[a] !== 0) {\n          if (s[b].length < y[a]) return b;\n          for (const g of s[b]) h.push(g);\n        }\n      }\n    })();\n    if (!c) return -1;\n    const { level: d } = l[n].data,\n      { level: p } = l[c].data;\n    return o ? p - d : d - p;\n  },\n  Or = (e, t, n) => [f0(e, t, n, !1), f0(e, t, n, !0)],\n  s1 = async (e, t, n, o, r, i, a, l, s, u, c, d) => {\n    var w, E, M, _, j, R;\n    let p = !1;\n    const {\n        levelMap: h,\n        tableNodes: m,\n        seeMoreIdTableReverseMap: b,\n      } = Gy(e, t),\n      y = (D) => e.find((P) => P.id === D),\n      g = {},\n      x = {};\n    let v = o.map((D) => [D.table, D.name]),\n      S = [];\n    for (\n      d(() => ({}));\n      !(\n        et.isCancelled ||\n        ((v = v.filter((W) => !g[W.join(\"/\")])),\n        v.length === 0 && S.length === 0)\n      );\n\n    ) {\n      const D = {};\n      v.forEach((W) => {\n        (g[W.join(\"/\")] = !0), (D[W[0]] = !0);\n      });\n      const [P, V] = n ? [\"source\", \"target\"] : [\"target\", \"source\"],\n        k = [],\n        N = [],\n        T = [];\n      let F = !1;\n      for (const W of t) {\n        if (xt(W)) continue;\n        const G = W[P],\n          K = W[V],\n          Q = m[K]\n            ? [(w = y(K)) == null ? void 0 : w.data]\n            : (_ =\n                  (M = (E = y(K)) == null ? void 0 : E.data) == null\n                    ? void 0\n                    : M.tables) == null\n              ? void 0\n              : _.filter((ne) => !m[ne.table]);\n        Q == null ||\n          Q.forEach((ne) => {\n            if (!ne) return;\n            const { table: oe, materialization: U } = ne;\n            D[G]\n              ? ((F = !0),\n                U === \"ephemeral\"\n                  ? (o0(\n                      x,\n                      oe,\n                      v.filter((ge) => ge[0] === G),\n                    ),\n                    N.push(oe))\n                  : k.push(oe))\n              : S.includes(G) &&\n                ((F = !0),\n                U === \"ephemeral\"\n                  ? (o0(x, oe, x[G]), N.push(oe))\n                  : (T.push(G), k.push(oe)));\n          });\n      }\n      if (!F) break;\n      S = N;\n      const I = Object.keys(D).concat(k);\n      T.forEach((W) => {\n        v.push(...x[W]), I.push(...x[W].map((G) => G[0]));\n      });\n      const L = await Fx(e, h, b, m, v, n, Array.from(new Set(I)), u, c, d);\n      ((j = L.confidence) == null ? void 0 : j.confidence) === \"low\" &&\n        r(((R = L.confidence) == null ? void 0 : R.operator_list) || []),\n        (v = L.newCurr),\n        !p && v.length > 0 && (p = !0),\n        (v = v.filter(\n          (W) => t.filter((G) => (n ? G.source : G.target) === W[0]).length > 0,\n        ));\n      const [C, H] = l(),\n        [B, A] = Ix({ nodes: C, edges: H }, L, u, n);\n      i(L.seeMoreLineage), pn(B, A), s(B, A), a(L.collectColumns);\n    }\n    return p;\n  },\n  zx = (\n    e,\n    t,\n    n,\n    { prevTable: o, tables: r, right: i, level: a, lineage: l },\n    s,\n  ) => {\n    var p;\n    const { table: u } = n;\n    if (e.find((h) => h.id === u)) return !1;\n    e.push(Do(n, a, o));\n    const d = (p = e.find((h) => h.id === o)) == null ? void 0 : p.data.level;\n    if (\n      (t.push(n1(d, a, o, u, i)),\n      l == null ||\n        l.forEach((h) => {\n          const m = _r(h.source[0], h.source[1]),\n            b = _r(h.target[0], h.target[1]),\n            y = {};\n          if (\n            (i &&\n              l\n                .filter((g) => g.target.join(\"/\") === h.target.join(\"/\"))\n                .forEach((g) => {\n                  y[g.source.join(\"/\")] = g.viewsCode || [];\n                }),\n            i)\n          ) {\n            if (h.target[0] !== u) return;\n            e.push(Ui(h.target[0], h.target[1], h.viewsType, y, n.nodeType)),\n              t.push(qi(m, b, a - 1, a, h.type, s));\n          } else {\n            if (h.source[0] !== u) return;\n            e.push(Ui(h.source[0], h.source[1], h.viewsType, y, n.nodeType)),\n              t.push(qi(m, b, a, a + 1, h.type, s));\n          }\n        }),\n      r.every((h) => !!e.find((m) => m.id === h.table)))\n    ) {\n      const h = Gi(o, i),\n        m = i ? `${o}-${h}` : `${h}-${o}`;\n      return i0(e, h), i0(t, m), !0;\n    }\n    return !1;\n  },\n  Ro = async (e, t, n, o, r) => {\n    var u;\n    if (!n) return 0;\n    const i = (u = e.find((c) => c.id === n)) == null ? void 0 : u.data;\n    if (!i) return 0;\n    const { level: a } = i,\n      l = e.length,\n      [s] = await Ki(e, t, n, a - o, a + r, 1 / 0);\n    return s.length - l;\n  },\n  Px = (e, t, n, o) => {\n    if (!ob(e)) return { nodes: [], edgeIds: [] };\n    const r = n.filter((i) => (o ? i.target : i.source) === e.id);\n    return {\n      nodes: t.filter((i) =>\n        r.find((a) => a.source === i.id || a.target === i.id),\n      ),\n      edgeIds: r.map((i) => ma(i.source, i.target)),\n    };\n  },\n  Us = (e, t, n, o = [], r) => {\n    const { nodes: i, edgeIds: a } = Px(e, t, n, r);\n    return i.reduce(\n      (l, s) => {\n        if (\n          (l.nodes.push(s),\n          (l.edges = Array.from(/* @__PURE__ */ new Set([...l.edges, ...a]))),\n          o.findIndex((u) => u.id == s.id) === -1)\n        ) {\n          o.push(s);\n          const { nodes: u, edges: c } = Us(s, t, n, o, r);\n          u.forEach((d) => {\n            l.nodes.push(d),\n              o.findIndex((p) => p.id == d.id) === -1 && o.push(d);\n          }),\n            (l.edges = Array.from(/* @__PURE__ */ new Set([...l.edges, ...c])));\n        }\n        return l;\n      },\n      { nodes: [], edges: [] },\n    );\n  },\n  Bx = (e, t) => {\n    const n = t.getNodes().filter((a) => xt(a)),\n      o = t.getEdges();\n    n.forEach((a) => {\n      const l = t.getNode(a.id);\n      l && Yi(l, !1);\n    }),\n      o.forEach((a) => {\n        const l = t.getEdge(a.id);\n        l && ((l.hidden = !0), jo(l, !1));\n      });\n    const r = Us(e, n, o, [], !0),\n      i = Us(e, n, o, [], !1);\n    [r, i].forEach(({ nodes: a, edges: l }) => {\n      a.forEach((s) => {\n        const u = t.getNode(s.id);\n        u && Yi(u, !0);\n      }),\n        l.forEach((s) => {\n          const u = t.getEdge(s);\n          u && ((u.hidden = !1), jo(u, !0));\n        });\n    });\n  },\n  Mn = \"-1px\",\n  Hr = () =>\n    /* @__PURE__ */ f.jsxs(f.Fragment, {\n      children: [\n        /* @__PURE__ */ f.jsx(Ft, {\n          id: \"left\",\n          type: \"source\",\n          className: \"invisible\",\n          isConnectable: !1,\n          position: ae.Left,\n          style: { left: Mn },\n        }),\n        /* @__PURE__ */ f.jsx(Ft, {\n          id: \"right\",\n          type: \"source\",\n          className: \"invisible\",\n          isConnectable: !1,\n          position: ae.Right,\n          style: { right: Mn },\n        }),\n        /* @__PURE__ */ f.jsx(Ft, {\n          id: \"left\",\n          type: \"target\",\n          className: \"invisible\",\n          isConnectable: !1,\n          position: ae.Left,\n          style: { left: Mn },\n        }),\n        /* @__PURE__ */ f.jsx(Ft, {\n          id: \"right\",\n          type: \"target\",\n          className: \"invisible\",\n          isConnectable: !1,\n          position: ae.Right,\n          style: { right: Mn },\n        }),\n        /* @__PURE__ */ f.jsx(Ft, {\n          id: \"top\",\n          type: \"source\",\n          className: \"invisible\",\n          isConnectable: !1,\n          position: ae.Top,\n          style: { top: Mn },\n        }),\n        /* @__PURE__ */ f.jsx(Ft, {\n          id: \"bottom\",\n          type: \"source\",\n          className: \"invisible\",\n          isConnectable: !1,\n          position: ae.Bottom,\n          style: { bottom: Mn },\n        }),\n        /* @__PURE__ */ f.jsx(Ft, {\n          id: \"top\",\n          type: \"target\",\n          className: \"invisible\",\n          isConnectable: !1,\n          position: ae.Top,\n          style: { top: Mn },\n        }),\n        /* @__PURE__ */ f.jsx(Ft, {\n          id: \"bottom\",\n          type: \"target\",\n          className: \"invisible\",\n          isConnectable: !1,\n          position: ae.Bottom,\n          style: { bottom: Mn },\n        }),\n      ],\n    }),\n  U5 = ({ data: e }) => {\n    var N;\n    const {\n        label: t,\n        table: n,\n        url: o,\n        upstreamCount: r,\n        downstreamCount: i,\n        nodeType: a,\n        tests: l,\n        materialization: s,\n        isExternalProject: u,\n        schema: c,\n      } = e,\n      d = tn(),\n      {\n        state: {\n          selectedTable: p,\n          collectColumns: h,\n          selectedColumn: m,\n          leftExpansion: b,\n          rightExpansion: y,\n          selectCheck: g,\n          nonSelectCheck: x,\n          errors: v,\n        },\n        rerender: S,\n      } = it(),\n      w = ft(),\n      E = Object.keys(h[n] || {}).length,\n      M = E > 0,\n      _ = p === n,\n      j = async (T) => {\n        if (et.inProgress) {\n          et.showCllInProgressMsg();\n          return;\n        }\n        let [F, I] = await Z5(d.getNodes(), d.getEdges(), n, T);\n        if (\n          (([F, I] = Tr(F, I, p)),\n          pn(F, I),\n          d.setNodes(F),\n          d.setEdges(I),\n          w(yr(Or(F, I, p))),\n          w(Mo(await Ro(F, I, p, b, y))),\n          S(),\n          !!(m != null && m.name))\n        )\n          try {\n            et.start();\n            const L = d.getEdges();\n            Ar(L, !1),\n              Mr(L, !0),\n              d.setEdges(L),\n              await s1(\n                F,\n                I,\n                T,\n                h[n].map((C) => ({ table: n, name: C.column })),\n                (C) => {\n                  w(Mc({ operatorList: C }));\n                },\n                (C) => {\n                  w(_c(C));\n                },\n                (C) => {\n                  w(Ac(C));\n                },\n                () => [d.getNodes(), d.getEdges()],\n                (C, H) => {\n                  d.setNodes(C), d.setEdges(H);\n                },\n                m,\n                { direct: g, indirect: x },\n                (C) => w(Tc(C(v))),\n              ),\n              S();\n          } catch (L) {\n            console.log(\"cll:error:\", L);\n          } finally {\n            et.end();\n          }\n      },\n      R = () => j(!0),\n      D = () => j(!1),\n      P = (T) => {\n        T.stopPropagation(),\n          a !== \"semantic_model\" &&\n            (w(to(n)), w(Kt(a === \"exposure\" ? Kc : Gc)));\n      },\n      V = d.getEdges(),\n      k = n.replace(/[^a-zA-Z0-9]/g, \"-\");\n    return /* @__PURE__ */ f.jsxs(\"div\", {\n      className: \"position-relative\",\n      style: {\n        opacity: m != null && m.name ? (M ? 1 : 0.5) : 1,\n      },\n      children: [\n        /* @__PURE__ */ f.jsxs(\"div\", {\n          className: Y.table_node,\n          onClick: async () => {\n            const T = d.getNodes(),\n              F = d.getEdges();\n            w(yr(Or(T, F, n))),\n              w(Mo(await Ro(T, F, n, b, y))),\n              Zs(d, n),\n              w(to(n)),\n              o && _x(o);\n          },\n          children: [\n            /* @__PURE__ */ f.jsx(\"div\", {\n              className: ke(\n                Y.header,\n                \"d-flex flex-column align-items-start gap-xs\",\n                {\n                  [Y.selected]: _,\n                  [Y.collapse]: !M,\n                },\n              ),\n              children: /* @__PURE__ */ f.jsxs(\"div\", {\n                className: \"d-flex flex-column align-items-start gap-xs w-100\",\n                children: [\n                  /* @__PURE__ */ f.jsxs(\"div\", {\n                    className: Y.table_header,\n                    children: [\n                      a in Fo &&\n                        /* @__PURE__ */ f.jsx(f.Fragment, {\n                          children: /* @__PURE__ */ f.jsxs(\"div\", {\n                            className: ke(Y.node_icon, l1[a]),\n                            children: [\n                              /* @__PURE__ */ f.jsx(a1, { nodeType: a }),\n                              /* @__PURE__ */ f.jsx(\"div\", { children: Fo[a] }),\n                            ],\n                          }),\n                        }),\n                      a in Qi &&\n                        /* @__PURE__ */ f.jsx(\"img\", {\n                          src: Qi[a],\n                          className: Y.dialect_icon,\n                        }),\n                      /* @__PURE__ */ f.jsxs(\"div\", {\n                        className: \"overflow-x\",\n                        children: [\n                          /* @__PURE__ */ f.jsx(\"div\", {\n                            className: c ? \"text-overflow\" : \"lines-2\",\n                            children: t,\n                          }),\n                          c &&\n                            /* @__PURE__ */ f.jsx(\"div\", {\n                              className: \"text-muted\",\n                              style: { fontSize: \"0.75em\" },\n                              children: c,\n                            }),\n                        ],\n                      }),\n                      ((N = v == null ? void 0 : v[n]) == null\n                        ? void 0\n                        : N.length) &&\n                        /* @__PURE__ */ f.jsx(Sn, {\n                          title: /* @__PURE__ */ f.jsx(\"div\", {\n                            className: Y.error_tooltip,\n                            children: v[n].map((T, F) =>\n                              /* @__PURE__ */ f.jsxs(\n                                \"div\",\n                                {\n                                  className: \"mb-1\",\n                                  children: [F + 1, \". \", T],\n                                },\n                                F,\n                              ),\n                            ),\n                          }),\n                          children: /* @__PURE__ */ f.jsx(yx, {}),\n                        }),\n                    ],\n                  }),\n                  /* @__PURE__ */ f.jsxs(\"div\", {\n                    className: ke(\n                      \"w-100 d-flex align-items-center gap-xs\",\n                      Y.node_extra_info,\n                    ),\n                    children: [\n                      /* @__PURE__ */ f.jsx(\"div\", {\n                        className: ke(\"nodrag\", Y.table_handle, {\n                          invisible:\n                            i === 0 ||\n                            i === V.filter((T) => T.target === n).length ||\n                            d.getNode(Gi(n, !1)),\n                        }),\n                        onClick: (T) => {\n                          T.stopPropagation(), D();\n                        },\n                        \"data-testid\": \"expand-left-btn-\" + n,\n                        children: \"+\",\n                      }),\n                      (l == null ? void 0 : l.length) > 0 &&\n                        /* @__PURE__ */ f.jsx(sr, {\n                          id: \"table-node-tests-\" + k,\n                          icon: /* @__PURE__ */ f.jsx(F5, {}),\n                          text: l.length.toString(),\n                          label: \"Tests\",\n                        }),\n                      s &&\n                        /* @__PURE__ */ f.jsx(sr, {\n                          id: \"table-node-materilization-\" + k,\n                          icon: /* @__PURE__ */ f.jsx(R5, {}),\n                          text: s,\n                          label: \"Materialization\",\n                        }),\n                      u\n                        ? /* @__PURE__ */ f.jsx(sr, {\n                            id: \"table-node-is-external-\" + k,\n                            icon: /* @__PURE__ */ f.jsx(Tv, {}),\n                            text: \"ext\",\n                            label: `External Project: ${n}`,\n                          })\n                        : null,\n                      /* @__PURE__ */ f.jsx(\"div\", { className: \"spacer\" }),\n                      /* @__PURE__ */ f.jsx(\"div\", {\n                        className: ke(\n                          \"nodrag\",\n                          _ && a !== \"semantic_model\"\n                            ? \"text-blue\"\n                            : \"text-grey\",\n                        ),\n                        onClick: P,\n                        \"data-testid\": \"view-details-btn-\" + n,\n                        children: \"Details\",\n                      }),\n                      /* @__PURE__ */ f.jsx(\"div\", {\n                        className: ke(\"nodrag\", Y.table_handle, {\n                          invisible:\n                            r === 0 ||\n                            r === V.filter((T) => T.source === n).length ||\n                            d.getNode(Gi(n, !0)),\n                        }),\n                        onClick: (T) => {\n                          T.stopPropagation(), R();\n                        },\n                        \"data-testid\": \"expand-right-btn-\" + n,\n                        children: \"+\",\n                      }),\n                    ],\n                  }),\n                ],\n              }),\n            }),\n            M &&\n              /* @__PURE__ */ f.jsxs(f.Fragment, {\n                children: [\n                  /* @__PURE__ */ f.jsx(\"div\", { className: Y.divider }),\n                  /* @__PURE__ */ f.jsx(\"div\", {\n                    className: ke(Y.content, {\n                      [Y.selected]: _,\n                    }),\n                    style: { height: ki(E) },\n                  }),\n                ],\n              }),\n          ],\n        }),\n        /* @__PURE__ */ f.jsx(Hr, {}),\n      ],\n    });\n  },\n  Xi = ({ percentValue: e, className: t }) =>\n    e\n      ? /* @__PURE__ */ f.jsx(Sn, {\n          title: e.tooltip,\n          children: /* @__PURE__ */ f.jsxs(\"div\", {\n            className: t,\n            children: [\n              /* @__PURE__ */ f.jsx(\"div\", {\n                className: Y.value,\n                children: e.value,\n              }),\n              /* @__PURE__ */ f.jsx(\"div\", {\n                className: Y.percent,\n                children: e.percent,\n              }),\n            ],\n          }),\n        })\n      : null,\n  Vx = ({ data: e }) => {\n    var p, h;\n    const { table: t, nodeType: n, label: o } = e,\n      {\n        state: {\n          sqlLineage: r,\n          highlightedNodes: i,\n          externalSidePanel: a,\n          selectedNode: l,\n          nodeSavingsPerformance: s,\n          nodesCost: u,\n        },\n      } = it(),\n      c = ft(),\n      d = n || \"unknown\";\n    return /* @__PURE__ */ f.jsxs(\"div\", {\n      className: \"position-relative\",\n      children: [\n        /* @__PURE__ */ f.jsxs(\"div\", {\n          className: Y.node_stats,\n          children: [\n            /* @__PURE__ */ f.jsx(Xi, {\n              percentValue: (p = s[t]) == null ? void 0 : p.savings,\n              className: Y.savings,\n            }),\n            /* @__PURE__ */ f.jsx(Xi, {\n              percentValue: (h = s[t]) == null ? void 0 : h.performance,\n              className: Y.performance,\n            }),\n          ],\n        }),\n        /* @__PURE__ */ f.jsx(\"div\", {\n          className: Y.static_table_node,\n          onClick: () => {\n            document.dispatchEvent(\n              new CustomEvent(\"selectedNode\", { detail: t }),\n            );\n          },\n          children: /* @__PURE__ */ f.jsx(\"div\", {\n            className: ke(Y.header, \"d-flex flex-column align-items-start\", {\n              [Y.collapse]: !0,\n              [Y.highlighted]: i.includes(t),\n              [Y.selected]: l === t,\n            }),\n            children: /* @__PURE__ */ f.jsxs(\"div\", {\n              className: \"d-flex align-items-center w-100 ps-2 pe-2 gap-xxs\",\n              children: [\n                u[t] &&\n                  /* @__PURE__ */ f.jsx(Sn, {\n                    title: u[t].tooltip,\n                    children: /* @__PURE__ */ f.jsxs(\"div\", {\n                      className: ke(Y.cost_data),\n                      children: [\n                        /* @__PURE__ */ f.jsx(\"div\", { children: u[t].value }),\n                        /* @__PURE__ */ f.jsx(\"div\", {\n                          children: u[t].percent,\n                        }),\n                      ],\n                    }),\n                  }),\n                /* @__PURE__ */ f.jsx(\"div\", {\n                  className: ke(Y.node_icon, l1[d]),\n                  children: /* @__PURE__ */ f.jsx(jx, { nodeType: d }),\n                }),\n                /* @__PURE__ */ f.jsx(\"div\", {}),\n                /* @__PURE__ */ f.jsx(\"div\", {\n                  className: \"lines-2\",\n                  children: o,\n                }),\n                /* @__PURE__ */ f.jsx(\"div\", { className: \"spacer\" }),\n                /* @__PURE__ */ f.jsx(\"div\", {}),\n                /* @__PURE__ */ f.jsx(\"div\", {\n                  className: ke(\n                    Y.details_btn,\n                    !r || d === \"unknown\" ? Y.disable : Y.enable,\n                  ),\n                  onClick: (m) => {\n                    m.stopPropagation(), d !== \"unknown\" && (a || c(to(t)));\n                  },\n                  children: /* @__PURE__ */ f.jsx(I5, {}),\n                }),\n              ],\n            }),\n          }),\n        }),\n        /* @__PURE__ */ f.jsx(Hr, {}),\n      ],\n    });\n  },\n  c1 = ({ data: e }) => {\n    const { tables: t = [], prevTable: n, right: o, level: r } = e,\n      {\n        state: { moreTables: i },\n      } = it(),\n      a = ft(),\n      l = tn(),\n      s = Oe(\n        (u) => {\n          u.stopPropagation(),\n            a(Kt(Xc)),\n            a(kc({ ...i, tables: t, prevTable: n, right: o, level: r }));\n        },\n        [r, a, i, n, o, t],\n      );\n    return /* @__PURE__ */ f.jsxs(\"div\", {\n      className: Y.see_more_node,\n      onClick: s,\n      children: [\n        /* @__PURE__ */ f.jsx(\"div\", {\n          className: \"fw-semibold\",\n          children: \"See more\",\n        }),\n        /* @__PURE__ */ f.jsx(\"div\", { className: \"spacer\" }),\n        /* @__PURE__ */ f.jsx(\"div\", {\n          children: t.filter((u) => !l.getNode(u.table)).length || \"\",\n        }),\n        /* @__PURE__ */ f.jsx(Hr, {}),\n      ],\n    });\n  },\n  u1 = (e) => {\n    const { sourceX: t, sourceY: n, targetX: o, targetY: r, markerEnd: i } = e,\n      a = (t - o) * 0.6,\n      s = `M ${t - 5} ${n} A ${a} 50 0 1 0 ${o + 2} ${r}`;\n    return /* @__PURE__ */ f.jsx(zo, { path: s, markerEnd: i });\n  },\n  d1 = ({ data: e }) => {\n    const { column: t, table: n, viewsType: o, viewsCode: r, nodeType: i } = e,\n      {\n        state: { selectedColumn: a },\n      } = it(),\n      l = ft(),\n      s =\n        (a == null ? void 0 : a.table) === n &&\n        (a == null ? void 0 : a.name) === t,\n      u = o && Jc[o],\n      c = u ? { borderColor: u } : {},\n      d = tn(),\n      p = () => {\n        const m = d.getNode(_r(n, t));\n        m && (l(to(\"\")), l(Un({ name: t, table: n })), Bx(m, d));\n      },\n      h = ze(() => {\n        const m = Object.values(r || {})\n            .flat()\n            .filter(([, y]) => y === \"Transformation\")\n            .map(([y]) => y),\n          b = [];\n        for (const y of m) b.includes(y) || b.push(y);\n        return b;\n      }, [r]);\n    return /* @__PURE__ */ f.jsxs(\"div\", {\n      className: ke(Y.column_node, s ? Y.selected : Y.default),\n      style: c,\n      onClick: p,\n      children: [\n        /* @__PURE__ */ f.jsx(\"div\", { className: Y.column_name, children: t }),\n        /* @__PURE__ */ f.jsx(Hr, {}),\n        /* @__PURE__ */ f.jsxs(\"div\", {\n          className: Y.column_top_right,\n          children: [\n            h.length > 0 &&\n              /* @__PURE__ */ f.jsx(Sn, {\n                title: \"Click to view code\",\n                children: /* @__PURE__ */ f.jsx(\"div\", {\n                  className: Y.column_code_icon,\n                  onClick: (m) => {\n                    m.stopPropagation(),\n                      l(\n                        To({\n                          type: \"views_code\",\n                          args: {\n                            table: n,\n                            viewsType: o,\n                            viewsCode: r,\n                            nodeType: i,\n                            column: t,\n                          },\n                        }),\n                      );\n                  },\n                  children: /* @__PURE__ */ f.jsx(Ld, {}),\n                }),\n              }),\n            o &&\n              o !== \"Non select\" &&\n              /* @__PURE__ */ f.jsx(r1, { viewsType: o }),\n          ],\n        }),\n      ],\n    });\n  },\n  q5 = {\n    INNER_JOIN: /* @__PURE__ */ f.jsx(rx, {}),\n    OUTER_JOIN: /* @__PURE__ */ f.jsx(sx, {}),\n    LEFT_JOIN: /* @__PURE__ */ f.jsx(ix, {}),\n    FULL_JOIN: /* @__PURE__ */ f.jsx(fx, {}),\n    RIGHT_JOIN: /* @__PURE__ */ f.jsx(cx, {}),\n    CROSS_JOIN: /* @__PURE__ */ f.jsx(ux, {}),\n    LATERAL_JOIN: /* @__PURE__ */ f.jsx(dx, {}),\n    FILTER: /* @__PURE__ */ f.jsx(nx, {}),\n    GROUP: /* @__PURE__ */ f.jsx(ox, {}),\n    LIMIT: /* @__PURE__ */ f.jsx(ax, {}),\n    SORT: /* @__PURE__ */ f.jsx(lx, {}),\n    UNION: /* @__PURE__ */ f.jsx(hx, {}),\n    SELECT: /* @__PURE__ */ f.jsx(px, {}),\n  },\n  Qi = {\n    postgres: mx,\n    snowflake: gx,\n    s3: bx,\n  },\n  $x = ({ data: e }) => {\n    var p, h;\n    const { type: t, expression: n, id: o } = e,\n      {\n        state: {\n          theme: r,\n          highlightedNodes: i,\n          externalSidePanel: a,\n          selectedNode: l,\n          nodeSavingsPerformance: s,\n          nodesCost: u,\n        },\n      } = it(),\n      c = r === \"dark\",\n      d = ft();\n    return /* @__PURE__ */ f.jsxs(\"div\", {\n      style: { width: Ir, display: \"flex\", justifyContent: \"center\" },\n      children: [\n        /* @__PURE__ */ f.jsx(Hr, {}),\n        /* @__PURE__ */ f.jsx(\"div\", {\n          className: \"d-flex flex-column\",\n          children: /* @__PURE__ */ f.jsxs(\"div\", {\n            className: ke(Y.op_node, {\n              [Y.highlighted]: i.includes(o),\n              [Y.selected]: l === o,\n            }),\n            onClick: () => {\n              a\n                ? document.dispatchEvent(\n                    new CustomEvent(\"selectedNode\", { detail: o }),\n                  )\n                : d(\n                    To({\n                      type: \"op_node\",\n                      args: { op_code: n, op_type: t },\n                    }),\n                  );\n            },\n            children: [\n              u[o] &&\n                /* @__PURE__ */ f.jsx(Sn, {\n                  title: u[o].tooltip,\n                  children: /* @__PURE__ */ f.jsxs(\"div\", {\n                    className: ke(Y.cost_data),\n                    children: [\n                      /* @__PURE__ */ f.jsx(\"div\", { children: u[o].value }),\n                      /* @__PURE__ */ f.jsx(\"div\", { children: u[o].percent }),\n                    ],\n                  }),\n                }),\n              /* @__PURE__ */ f.jsx(\"div\", {\n                className: ke(Y.node_icon, c ? Y.dark_mode : Y.light_mode),\n                children: q5[t],\n              }),\n              /* @__PURE__ */ f.jsx(\"div\", {}),\n              /* @__PURE__ */ f.jsxs(\"div\", {\n                className: Y.op_type_text,\n                children: [\n                  /* @__PURE__ */ f.jsx(\"span\", { children: t }),\n                  /* @__PURE__ */ f.jsxs(\"div\", {\n                    className: Y.node_stats,\n                    children: [\n                      /* @__PURE__ */ f.jsx(Xi, {\n                        percentValue: (p = s[o]) == null ? void 0 : p.savings,\n                        className: Y.savings,\n                      }),\n                      /* @__PURE__ */ f.jsx(Xi, {\n                        percentValue:\n                          (h = s[o]) == null ? void 0 : h.performance,\n                        className: Y.performance,\n                      }),\n                    ],\n                  }),\n                ],\n              }),\n              /* @__PURE__ */ f.jsx(\"div\", {}),\n            ],\n          }),\n        }),\n      ],\n    });\n  };\nfunction f1({ isOpen: e, closeModal: t, width: n = 350, children: o }) {\n  const r = document.getElementById(\"lineage-sidebar\");\n  if (!r) return null;\n  const i = typeof n == \"number\" ? `${n}px` : n;\n  return Hn(\n    /* @__PURE__ */ f.jsx(\"div\", {\n      className: `sidebar-modal ${e ? \"\" : \"d-none\"}`,\n      children:\n        e &&\n        /* @__PURE__ */ f.jsxs(f.Fragment, {\n          children: [\n            /* @__PURE__ */ f.jsx(\"div\", {\n              className: \"sidebar-background-screen\",\n              onClick: t,\n            }),\n            /* @__PURE__ */ f.jsxs(\"div\", {\n              className: \"sidebar-modal-content\",\n              style: { width: i },\n              children: [\n                /* @__PURE__ */ f.jsx(\"div\", {\n                  className: \"sidebar-close-button\",\n                  onClick: t,\n                  children: /* @__PURE__ */ f.jsx(o1, {}),\n                }),\n                o,\n              ],\n            }),\n          ],\n        }),\n    }),\n    r,\n  );\n}\nfunction Po(e) {\n  return /* @__PURE__ */ f.jsx(Qt, { className: \"custom-input\", ...e });\n}\nfunction Wx(e) {\n  return /* @__PURE__ */ f.jsx(Qt, {\n    className: \"custom-input\",\n    ...e,\n    type: \"textarea\",\n    rows: 4,\n  });\n}\nfunction Zx({ nodeType: e, label: t, table: n, tests: o, materialization: r }) {\n  const i = e,\n    a = n.replace(/[^a-zA-Z0-9]/g, \"-\");\n  return /* @__PURE__ */ f.jsxs(\"div\", {\n    className: \"d-flex flex-column align-items-start gap-xs w-100\",\n    children: [\n      /* @__PURE__ */ f.jsxs(\"div\", {\n        className: Y.table_header,\n        children: [\n          /* @__PURE__ */ f.jsxs(\"div\", {\n            className: ke(Y.node_icon, l1[i]),\n            children: [\n              /* @__PURE__ */ f.jsx(B5, { nodeType: e }),\n              /* @__PURE__ */ f.jsx(\"div\", { children: Fo[i] }),\n            ],\n          }),\n          /* @__PURE__ */ f.jsx(\"div\", { className: \"lines-2\", children: t }),\n        ],\n      }),\n      ((o == null ? void 0 : o.length) > 0 || r) &&\n        /* @__PURE__ */ f.jsxs(\"div\", {\n          className: ke(\"d-flex gap-xs\", Y.node_extra_info),\n          children: [\n            (o == null ? void 0 : o.length) > 0 &&\n              /* @__PURE__ */ f.jsx(sr, {\n                id: \"table-node-tests-\" + a,\n                icon: /* @__PURE__ */ f.jsx(F5, {}),\n                text: o.length.toString(),\n                label: \"Tests\",\n              }),\n            r &&\n              /* @__PURE__ */ f.jsx(sr, {\n                id: \"table-node-materilization-\" + a,\n                icon: /* @__PURE__ */ f.jsx(R5, {}),\n                text: r,\n                label: \"Materialization\",\n              }),\n          ],\n        }),\n    ],\n  });\n}\nfunction Y5() {\n  const {\n      state: { moreTables: e, selectCheck: t, nonSelectCheck: n },\n      rerender: o,\n    } = it(),\n    r = ft(),\n    { tables: i, level: a } = e,\n    l = tn(),\n    s = async (d) => {\n      const p = [...l.getNodes()],\n        h = [...l.getEdges()];\n      zx(p, h, d, e, { direct: t, indirect: n }) && r(Kt(\"\")),\n        pn(p, h),\n        l.setNodes(p),\n        l.setEdges(h),\n        o();\n    },\n    [u, c] = se(i);\n  return /* @__PURE__ */ f.jsxs(\"div\", {\n    className: \"p-2 h-100 d-flex flex-column\",\n    children: [\n      /* @__PURE__ */ f.jsx(\"div\", {\n        className: \"mb-2 fw-semibold fs-5\",\n        children: \"Tables\",\n      }),\n      /* @__PURE__ */ f.jsx(Po, {\n        bsSize: \"sm\",\n        placeholder: \"Search by table name\",\n        onChange: (d) => {\n          const p = d.target.value.toLowerCase();\n          c(i.filter((h) => h.table.toLowerCase().includes(p)));\n        },\n      }),\n      /* @__PURE__ */ f.jsx(\"div\", { className: \"mb-3\" }),\n      /* @__PURE__ */ f.jsx(\"div\", {\n        className: \"h-100 overflow-y\",\n        children: /* @__PURE__ */ f.jsx(\"div\", {\n          className: \"d-flex flex-column gap-sm\",\n          children: u.map((d) => {\n            const p = l.getNode(d.table),\n              h = p && p.data.level !== a;\n            return /* @__PURE__ */ f.jsx(\n              \"div\",\n              {\n                className: ke(Y.table_card, {\n                  [Y.selected]: p,\n                  // [styles.disabled]: isNodeOnOtherLevel,\n                }),\n                onClick: (m) => {\n                  m.stopPropagation(), !h && s(d);\n                },\n                children: /* @__PURE__ */ f.jsx(Zx, {\n                  nodeType: d.nodeType,\n                  label: d.label,\n                  table: d.table,\n                  tests: d.tests,\n                  materialization: d.materialization,\n                }),\n              },\n              d.table,\n            );\n          }),\n        }),\n      }),\n    ],\n  });\n}\nconst Ux = \"_component_13r39_1\",\n  qx = \"_spin_13r39_1\",\n  Yx = {\n    component: Ux,\n    spin: qx,\n  },\n  G5 = ({ top: e = 50, left: t = 50, label: n }) =>\n    /* @__PURE__ */ f.jsx(\"div\", {\n      className: Yx.component,\n      style: { top: `${e}%`, left: `${t}%` },\n      children: /* @__PURE__ */ f.jsx(\"div\", {\n        style: { marginTop: \"-70px\" },\n        children: n,\n      }),\n    }),\n  Gx = \"_level_tag_x6wwh_1\",\n  Kx = {\n    level_tag: Gx,\n  },\n  Xx = ({ label: e }) =>\n    /* @__PURE__ */ f.jsx(\"div\", { className: ke(Kx.level_tag), children: e }),\n  K5 = ({ purpose: e }) =>\n    /* @__PURE__ */ f.jsx(\"div\", {\n      className: ke(Y.card, \"purpose-section\"),\n      children: /* @__PURE__ */ f.jsx(\"div\", {\n        className: \"d-flex flex-column gap-sm\",\n        children: /* @__PURE__ */ f.jsxs(\"div\", {\n          className: \"d-flex gap-xs flex-column\",\n          children: [\n            /* @__PURE__ */ f.jsx(\"div\", {\n              className: \"fs-5 fw-semibold\",\n              children: \"Description\",\n            }),\n            /* @__PURE__ */ f.jsx(\"div\", {\n              className: ke(Y.column_card),\n              children: /* @__PURE__ */ f.jsx(\"div\", {\n                className: \"font-normal fs-xxs\",\n                children: e,\n              }),\n            }),\n          ],\n        }),\n      }),\n    }),\n  X5 = ({ column: e, handleClick: t, selected: n, isSelectable: o }) => {\n    const {\n      state: { theme: r },\n    } = Xe(zn);\n    return /* @__PURE__ */ f.jsxs(\"div\", {\n      className: ke(Y.column_card, {\n        [Y.selected]: n,\n        \"cursor-pointer\": o,\n      }),\n      onClick: t,\n      \"data-testid\": \"table-details-\" + e.name,\n      children: [\n        /* @__PURE__ */ f.jsxs(\"div\", {\n          className: \"d-flex align-items-center gap-xs\",\n          children: [\n            /* @__PURE__ */ f.jsx(Lx, { datatype: e.datatype || \"\" }),\n            /* @__PURE__ */ f.jsx(\"div\", {\n              className: \"lines-2\",\n              children: e.name,\n            }),\n            /* @__PURE__ */ f.jsx(\"div\", { className: \"spacer\" }),\n            e.can_lineage_expand &&\n              /* @__PURE__ */ f.jsx(\"div\", {\n                className: Y.expand_lineage_icon,\n                children: /* @__PURE__ */ f.jsx($v, {}),\n              }),\n            e.datatype && /* @__PURE__ */ f.jsx(Xx, { label: e.datatype }),\n          ],\n        }),\n        e.description &&\n          /* @__PURE__ */ f.jsx(\"div\", {\n            className: \"d-flex flex-column\",\n            children: /* @__PURE__ */ f.jsx(\"div\", {\n              className: \"font-normal fs-xxs text-grey\",\n              children: e.description,\n            }),\n          }),\n        e.code &&\n          /* @__PURE__ */ f.jsx(Lr, {\n            code: e.code,\n            language: \"sql\",\n            editorTheme: \"tomorrow\",\n            theme: r,\n          }),\n      ],\n    });\n  },\n  Qx = ({\n    columns: e,\n    filteredColumn: t,\n    setFilteredColumn: n,\n    handleColumnClick: o,\n    selectedTable: r,\n    selectedColumn: i,\n    setData: a,\n    allowSyncColumnsWithDB: l,\n    lineageType: s,\n  }) => {\n    const u = (r == null ? void 0 : r.materialization) === \"ephemeral\",\n      c = (r == null ? void 0 : r.nodeType) === \"analysis\";\n    return /* @__PURE__ */ f.jsx(\"div\", {\n      className: ke(Y.card, \"flex-grow column-section\"),\n      children: /* @__PURE__ */ f.jsxs(\"div\", {\n        className: \"d-flex flex-column gap-sm h-100 p-2\",\n        children: [\n          /* @__PURE__ */ f.jsxs(\"div\", {\n            className: \"d-flex align-items-center gap-xs\",\n            children: [\n              /* @__PURE__ */ f.jsx(\"div\", {\n                className: \"fs-5 fw-semibold\",\n                children: \"Columns\",\n              }),\n              /* @__PURE__ */ f.jsx(\"div\", { className: \"spacer\" }),\n              l &&\n                !u &&\n                !c &&\n                /* @__PURE__ */ f.jsx(Re, {\n                  size: \"sm\",\n                  color: \"primary\",\n                  onClick: () => {\n                    r &&\n                      ba(r.table, !0).then((d) => {\n                        d && (a(d), n(d.columns));\n                      });\n                  },\n                  children: \"Sync with DB\",\n                }),\n            ],\n          }),\n          /* @__PURE__ */ f.jsx(Po, {\n            bsSize: \"sm\",\n            type: \"text\",\n            placeholder: \"Search by column name\",\n            onChange: (d) => {\n              const p = d.target.value.toLowerCase();\n              n(e.filter((h) => h.name.toLowerCase().includes(p)));\n            },\n          }),\n          /* @__PURE__ */ f.jsxs(\"div\", {\n            className: \"d-flex align-items-center gap-xs\",\n            children: [\n              !u &&\n                /* @__PURE__ */ f.jsx(\"div\", {\n                  className: \"fs-xxs\",\n                  children: \"Select column for lineage\",\n                }),\n              /* @__PURE__ */ f.jsx(\"div\", { className: \"spacer\" }),\n              /* @__PURE__ */ f.jsxs(\"div\", {\n                className: \"fs-xxs text-grey\",\n                children: [t.length, \" columns\"],\n              }),\n            ],\n          }),\n          /* @__PURE__ */ f.jsx(\"div\", {\n            className: \"d-flex flex-column gap-sm\",\n            children: t.map((d) =>\n              /* @__PURE__ */ f.jsx(\n                X5,\n                {\n                  column: d,\n                  handleClick: () => {\n                    u || o(d);\n                  },\n                  selected:\n                    d.name === (i == null ? void 0 : i.name) &&\n                    d.table === (i == null ? void 0 : i.table),\n                  isSelectable: !u && s === \"dynamic\",\n                },\n                d.name,\n              ),\n            ),\n          }),\n        ],\n      }),\n    });\n  },\n  Jx = ({ tests: e }) => {\n    const [t, n] = se(e);\n    return /* @__PURE__ */ f.jsx(\"div\", {\n      className: ke(Y.card, \"flex-grow column-section\"),\n      children: /* @__PURE__ */ f.jsxs(\"div\", {\n        className: \"d-flex flex-column gap-sm h-100 p-2\",\n        children: [\n          /* @__PURE__ */ f.jsx(\"div\", {\n            className: \"fs-5 fw-semibold\",\n            children: \"Tests\",\n          }),\n          /* @__PURE__ */ f.jsx(Po, {\n            bsSize: \"sm\",\n            type: \"text\",\n            placeholder: \"Search by test\",\n            onChange: (o) => {\n              const r = o.target.value.toLowerCase();\n              n(e.filter((i) => i.key.toLowerCase().includes(r)));\n            },\n          }),\n          /* @__PURE__ */ f.jsx(\"div\", {\n            className: \"d-flex align-items-center gap-xs\",\n            children: /* @__PURE__ */ f.jsxs(\"div\", {\n              className: \"fs-xxs text-grey\",\n              children: [t.length, \" tests\"],\n            }),\n          }),\n          /* @__PURE__ */ f.jsx(\"div\", {\n            className: \"d-flex flex-column gap-sm\",\n            children: t.map((o) =>\n              /* @__PURE__ */ f.jsx(\n                \"div\",\n                {\n                  className: Y.column_card,\n                  children: /* @__PURE__ */ f.jsx(\"div\", {\n                    className: \"d-flex align-items-center gap-xs\",\n                    children: /* @__PURE__ */ f.jsx(\"div\", {\n                      className: \"lines-2\",\n                      children: o.key,\n                    }),\n                  }),\n                },\n                o.key,\n              ),\n            ),\n          }),\n        ],\n      }),\n    });\n  },\n  Kl = (e) => {\n    switch (e) {\n      case \"dimension\":\n        return F2;\n      case \"Order Type\":\n        return R2;\n      case \"metrics\":\n        return I2;\n      case \"table\":\n        return H2;\n      default:\n        const t = [F2, R2, I2, H2];\n        return t[Math.floor(Math.random() * t.length)];\n    }\n  },\n  ew = [\n    \"label\",\n    \"type\",\n    \"description\",\n    \"sql\",\n    \"time_intervals\",\n    \"hidden\",\n    \"round\",\n    \"format\",\n    \"compact\",\n    \"groups\",\n    \"urls\",\n    \"required_attributes\",\n    \"colors\",\n    \"joins\",\n  ],\n  tw = [\"metrics\", \"dimension\", \"additional_dimensions\"],\n  Xl = ({ data: e }) => {\n    const {\n      state: { theme: t },\n    } = Xe(zn);\n    return /* @__PURE__ */ f.jsx(\"div\", {\n      className: `${Y.tableWrapper}`,\n      children: /* @__PURE__ */ f.jsxs(n4, {\n        dark: t === \"dark\",\n        bordered: !0,\n        responsive: !0,\n        className: Y.dataTable,\n        children: [\n          /* @__PURE__ */ f.jsx(\"thead\", {\n            children: /* @__PURE__ */ f.jsxs(\"tr\", {\n              children: [\n                /* @__PURE__ */ f.jsx(\"th\", { children: \"Property\" }),\n                /* @__PURE__ */ f.jsx(\"th\", { children: \"Value\" }),\n              ],\n            }),\n          }),\n          /* @__PURE__ */ f.jsx(\"tbody\", {\n            children: Object.entries(e).map(([n, o]) =>\n              /* @__PURE__ */ f.jsxs(\n                \"tr\",\n                {\n                  children: [\n                    /* @__PURE__ */ f.jsx(\"td\", { children: n }),\n                    /* @__PURE__ */ f.jsx(\"td\", {\n                      children: JSON.stringify(o),\n                    }),\n                  ],\n                },\n                n,\n              ),\n            ),\n          }),\n        ],\n      }),\n    });\n  },\n  nw = ({ node: e }) => {\n    const t = ze(() => {\n        if (!e.meta) return {};\n        const l = {};\n        for (const s in e.meta) ew.includes(s) && (l[s] = e.meta[s]);\n        return l;\n      }, [e.meta]),\n      { metrics: n, dimensions: o } = ze(() => {\n        const l = [],\n          s = [];\n        if (!e.columns) return { metrics: l, dimensions: s };\n        for (const u in e.columns) {\n          const c = e.columns[u];\n          if (c.meta)\n            for (const d in c.meta) {\n              if (!tw.includes(d)) continue;\n              const p = c.meta[d];\n              switch (d) {\n                case \"metrics\":\n                  for (const h in p)\n                    l.push({ label: h, type: \"metrics\", data: p[h] });\n                  break;\n                case \"dimension\":\n                  s.push({\n                    label: c.name,\n                    type: \"dimension\",\n                    data: p,\n                  });\n                  break;\n                case \"additional_dimensions\":\n                  for (const h in p)\n                    s.push({ label: h, type: \"dimension\", data: p[h] });\n                  break;\n                default:\n                  console.warn(`Unsupported key found in column meta: ${d}`);\n              }\n            }\n        }\n        return { metrics: l, dimensions: s };\n      }, [e.columns]),\n      [r, i] = se({}),\n      a = (l) => {\n        i((s) => ({\n          ...s,\n          [l]: !s[l],\n        }));\n      };\n    return (\n      console.log(\"thisisit->\", t, n, o, e),\n      /* @__PURE__ */ f.jsxs(\"div\", {\n        children: [\n          /* @__PURE__ */ f.jsx(bt, {\n            className: ke(Y.card, \"column-section flex-grow mb-3\"),\n            children: /* @__PURE__ */ f.jsxs(Mt, {\n              children: [\n                /* @__PURE__ */ f.jsx(\"div\", {\n                  className: \"fs-6 fw-semibold\",\n                  children: \"Dimensions\",\n                }),\n                /* @__PURE__ */ f.jsx(\"hr\", { className: \"p-0 m-0\" }),\n                /* @__PURE__ */ f.jsx(Ze, {\n                  direction: \"column\",\n                  className: \"gap-xs mt-2\",\n                  children: o.map((l) =>\n                    /* @__PURE__ */ f.jsxs(\n                      \"div\",\n                      {\n                        children: [\n                          /* @__PURE__ */ f.jsxs(\"div\", {\n                            className:\n                              \"d-flex align-items-center w-100 cursor-pointer\",\n                            onClick: () => a(l.label),\n                            children: [\n                              /* @__PURE__ */ f.jsx(\"img\", {\n                                src: Kl(l.type),\n                                alt: \"icon\",\n                                className: \"me-2\",\n                                style: { width: 16, height: 16 },\n                              }),\n                              /* @__PURE__ */ f.jsx(\"div\", {\n                                children: l.label,\n                              }),\n                              /* @__PURE__ */ f.jsx(\"div\", {\n                                className: \"spacer\",\n                              }),\n                              r[l.label]\n                                ? /* @__PURE__ */ f.jsx(ir, {})\n                                : /* @__PURE__ */ f.jsx(ar, {}),\n                            ],\n                          }),\n                          /* @__PURE__ */ f.jsx(rr, {\n                            isOpen: !!r[l.label],\n                            children: /* @__PURE__ */ f.jsx(Xl, {\n                              data: l.data,\n                            }),\n                          }),\n                        ],\n                      },\n                      l.label,\n                    ),\n                  ),\n                }),\n              ],\n            }),\n          }),\n          /* @__PURE__ */ f.jsx(bt, {\n            className: ke(Y.card, \"column-section flex-grow mb-3\"),\n            children: /* @__PURE__ */ f.jsxs(Mt, {\n              children: [\n                /* @__PURE__ */ f.jsx(\"div\", {\n                  className: \"fs-6 fw-semibold\",\n                  children: \"Metrics\",\n                }),\n                /* @__PURE__ */ f.jsx(\"hr\", { className: \"p-0 m-0\" }),\n                /* @__PURE__ */ f.jsx(Ze, {\n                  direction: \"column\",\n                  className: \"gap-xs mt-2\",\n                  children: n.map((l) =>\n                    /* @__PURE__ */ f.jsxs(\n                      \"div\",\n                      {\n                        children: [\n                          /* @__PURE__ */ f.jsxs(\"div\", {\n                            className:\n                              \"d-flex align-items-center w-100 cursor-pointer\",\n                            onClick: () => a(l.label),\n                            children: [\n                              /* @__PURE__ */ f.jsx(\"img\", {\n                                src: Kl(l.type),\n                                alt: \"icon\",\n                                className: \"me-2\",\n                                style: { width: 16, height: 16 },\n                              }),\n                              /* @__PURE__ */ f.jsx(\"div\", {\n                                children: l.label,\n                              }),\n                              /* @__PURE__ */ f.jsx(\"div\", {\n                                className: \"spacer\",\n                              }),\n                              r[l.label]\n                                ? /* @__PURE__ */ f.jsx(ir, {})\n                                : /* @__PURE__ */ f.jsx(ar, {}),\n                            ],\n                          }),\n                          /* @__PURE__ */ f.jsx(rr, {\n                            isOpen: !!r[l.label],\n                            children: /* @__PURE__ */ f.jsx(Xl, {\n                              data: l.data,\n                            }),\n                          }),\n                        ],\n                      },\n                      l.label,\n                    ),\n                  ),\n                }),\n              ],\n            }),\n          }),\n          /* @__PURE__ */ f.jsx(bt, {\n            className: ke(Y.card, \"column-section flex-grow\"),\n            children: /* @__PURE__ */ f.jsxs(Mt, {\n              children: [\n                /* @__PURE__ */ f.jsx(\"div\", {\n                  className: \"fs-6 fw-semibold mx-2 mt-2\",\n                  children: \"Table\",\n                }),\n                /* @__PURE__ */ f.jsx(\"hr\", { className: \"p-0 m-0\" }),\n                /* @__PURE__ */ f.jsxs(Ze, {\n                  direction: \"column\",\n                  className: \"gap-xs mt-2\",\n                  children: [\n                    /* @__PURE__ */ f.jsxs(\"div\", {\n                      className:\n                        \"d-flex align-items-center w-100 cursor-pointer\",\n                      onClick: () => a(\"table\"),\n                      children: [\n                        /* @__PURE__ */ f.jsx(\"img\", {\n                          src: Kl(\"table\"),\n                          alt: \"icon\",\n                          className: \"me-2\",\n                          style: { width: 16, height: 16 },\n                        }),\n                        /* @__PURE__ */ f.jsx(\"div\", { children: e.label }),\n                        /* @__PURE__ */ f.jsx(\"div\", { className: \"spacer\" }),\n                        r.table\n                          ? /* @__PURE__ */ f.jsx(ir, {})\n                          : /* @__PURE__ */ f.jsx(ar, {}),\n                      ],\n                    }),\n                    /* @__PURE__ */ f.jsx(rr, {\n                      isOpen: !!r.table,\n                      children: /* @__PURE__ */ f.jsx(Xl, { data: t }),\n                    }),\n                  ],\n                }),\n              ],\n            }),\n          }),\n        ],\n      })\n    );\n  },\n  h1 = ({ nodeType: e, table: t }) =>\n    /* @__PURE__ */ f.jsxs(\"div\", {\n      className: Y.table_details_header,\n      children: [\n        /* @__PURE__ */ f.jsx(B5, { nodeType: e }),\n        /* @__PURE__ */ f.jsx(\"div\", {\n          className: \"d-flex align-items-center\",\n          children: /* @__PURE__ */ f.jsx(\"div\", {\n            className: \"fw-semibold fs-5 lines-2\",\n            children: t,\n          }),\n        }),\n      ],\n    }),\n  Q5 = ({ lineageType: e }) => {\n    var M;\n    const {\n        rerender: t,\n        state: {\n          selectedTable: n,\n          selectedColumn: o,\n          selectCheck: r,\n          nonSelectCheck: i,\n          aiEnabled: a,\n          allowSyncColumnsWithDB: l,\n          errors: s,\n          theme: u,\n        },\n      } = it(),\n      c = ft(),\n      d = tn(),\n      [p, h] = se([]),\n      [m, b] = se(null),\n      [y, g] = se(0),\n      [x, v] = se(!0);\n    ue(() => {\n      n &&\n        (v(!0),\n        ba(n, !1)\n          .then((_) => {\n            b(_), h(_.columns), v(!1);\n          })\n          .catch(() => {\n            v(!1);\n          }));\n    }, [n]);\n    const S = async (_) => {\n        var I;\n        if (!a) {\n          Mx();\n          return;\n        }\n        if (et.inProgress) {\n          et.showCllInProgressMsg();\n          return;\n        }\n        if (\n          (o == null ? void 0 : o.table) === _.table &&\n          (o == null ? void 0 : o.name) === _.name\n        ) {\n          const [L, C] = Hx(d.getNodes(), d.getEdges());\n          Ar(C, !0),\n            Mr(C, !0),\n            d.setNodes(L),\n            d.setEdges(C),\n            c(Un({ table: \"\", name: \"\" })),\n            c(br({})),\n            c(Kt(\"\"));\n          return;\n        }\n        const j = (I = d.getNode(_.table)) == null ? void 0 : I.data;\n        if (!j) throw new Error(`table node ${_.table} isn't visible`);\n        let R = d.getNodes(),\n          D = d.getEdges();\n        Ar(D, !1), Mr(D, !0);\n        const P = async (L) => {\n            ([R, D] = await Z5(R, D, _.table, L)), pn(R, D);\n          },\n          { upstreamCount: V, downstreamCount: k } = j;\n        V > 0 &&\n          D.filter((L) => L.source === _.table).length < V &&\n          (await P(!0)),\n          k > 0 &&\n            D.filter((L) => L.target === _.table).length < k &&\n            (await P(!1)),\n          c(Un({ ..._ })),\n          c(Kt(\"\")),\n          c(br({})),\n          c($9({ confidence: \"high\" }));\n        const [N, T] = W5(R.filter(En), D.filter(En));\n        T.forEach((L) => (L.style = ga)), d.setNodes(N), d.setEdges(T), t();\n        const F = (L) =>\n          s1(\n            N,\n            T,\n            L,\n            [_],\n            (C) => {\n              c(Mc({ operatorList: C }));\n            },\n            (C) => {\n              c(_c(C));\n            },\n            (C) => {\n              c(Ac(C));\n            },\n            () => [d.getNodes(), d.getEdges()],\n            (C, H) => {\n              d.setNodes(C), d.setEdges(H);\n            },\n            _,\n            { direct: r, indirect: i },\n            (C) => c(Tc(C(s))),\n          );\n        try {\n          et.start(),\n            (await Promise.all([F(!0), F(!1)])).every((C) => !C) &&\n              (c(Un({ table: \"\", name: \"\" })),\n              Zs(d, _.table),\n              et.isCancelled ||\n                i1(\n                  `No lineage found for model ${_.table} and column ${_.name}`,\n                ));\n        } catch (L) {\n          console.error(\n            \"Error while performing cll for \",\n            _.table,\n            _.name,\n            \", error:\",\n            L,\n          ),\n            c(Un({ table: \"\", name: \"\" })),\n            Zs(d, _.table);\n        } finally {\n          et.end();\n        }\n      },\n      w = (M = d.getNode(n)) == null ? void 0 : M.data;\n    if (x || !m || !n) return /* @__PURE__ */ f.jsx(G5, {});\n    const E = [\"Column\"];\n    return (\n      w.tests.length && E.push(\"Tests\"),\n      E.push(\"Lightdash\"),\n      /* @__PURE__ */ f.jsxs(\"div\", {\n        className: \"p-2 h-100 d-flex flex-column gap-md overflow-y\",\n        children: [\n          /* @__PURE__ */ f.jsx(h1, {\n            nodeType: w.nodeType,\n            table: w.label,\n          }),\n          m.purpose && /* @__PURE__ */ f.jsx(K5, { purpose: m.purpose }),\n          E.length > 1 &&\n            /* @__PURE__ */ f.jsx(\"div\", {\n              className: Y.table_details_tabs,\n              children: E.map((_, j) =>\n                /* @__PURE__ */ f.jsxs(\n                  \"div\",\n                  {\n                    className: ke(Y.tab, \"d-flex align-items-center gap-sm\", {\n                      [Y.selected]: y === j,\n                    }),\n                    onClick: () => g(j),\n                    children: [\n                      /* @__PURE__ */ f.jsx(\"div\", {\n                        className:\n                          u === \"light\" && y !== j\n                            ? \"text-primary\"\n                            : \"text-white\",\n                        children:\n                          _ === \"Lightdash\"\n                            ? /* @__PURE__ */ f.jsx(A8, {})\n                            : null,\n                      }),\n                      _,\n                    ],\n                  },\n                  _,\n                ),\n              ),\n            }),\n          E[y] === \"Column\" &&\n            /* @__PURE__ */ f.jsx(Qx, {\n              selectedTable: w,\n              selectedColumn: o,\n              filteredColumn: p,\n              setFilteredColumn: h,\n              columns: m.columns,\n              handleColumnClick: S,\n              setData: b,\n              allowSyncColumnsWithDB: l,\n              lineageType: e,\n            }),\n          E[y] === \"Tests\" && /* @__PURE__ */ f.jsx(Jx, { tests: w.tests }),\n          E[y] === \"Lightdash\" && /* @__PURE__ */ f.jsx(nw, { node: w }),\n        ],\n      })\n    );\n  },\n  ow = () => {\n    var h, m, b, y;\n    const {\n        state: { theme: e },\n      } = Xe(zn),\n      {\n        state: { sqlLineage: t, selectedTable: n, allowSyncColumnsWithDB: o },\n      } = it(),\n      r =\n        (b =\n          (m = (h = t == null ? void 0 : t.details) == null ? void 0 : h[n]) ==\n          null\n            ? void 0\n            : m.columns) == null\n          ? void 0\n          : b.map((g) => ({\n              ...g,\n              description: g.expression,\n            })),\n      [i, a] = se(r),\n      [l, s] = se(r),\n      u = (y = t == null ? void 0 : t.details) == null ? void 0 : y[n];\n    if (!u) return null;\n    const { sql: c, type: d, nodeId: p } = u;\n    return /* @__PURE__ */ f.jsxs(\"div\", {\n      className: \"p-2 h-100 d-flex flex-column gap-md overflow-y\",\n      children: [\n        /* @__PURE__ */ f.jsx(h1, { nodeType: d || \"cte\", table: n }),\n        c &&\n          /* @__PURE__ */ f.jsx(\"div\", {\n            className: ke(Y.card, \"mb-0 purpose-section\"),\n            children: /* @__PURE__ */ f.jsxs(\"div\", {\n              className: \"d-flex flex-column gap-sm\",\n              children: [\n                /* @__PURE__ */ f.jsx(\"div\", {\n                  className: \"fs-5 fw-semibold\",\n                  children: \"SQL\",\n                }),\n                /* @__PURE__ */ f.jsx(Lr, {\n                  code: c,\n                  language: \"sql\",\n                  editorTheme: \"tomorrow\",\n                  showLineNumbers: !0,\n                  theme: e,\n                }),\n              ],\n            }),\n          }),\n        /* @__PURE__ */ f.jsx(\"div\", {\n          className: ke(Y.card, \"mb-0 flex-grow column-section\"),\n          children: /* @__PURE__ */ f.jsxs(\"div\", {\n            className: \"d-flex flex-column gap-sm h-100\",\n            children: [\n              /* @__PURE__ */ f.jsxs(\"div\", {\n                className: \"d-flex align-items-center gap-xs\",\n                children: [\n                  /* @__PURE__ */ f.jsx(\"div\", {\n                    className: \"fs-5 fw-semibold\",\n                    children: \"Column\",\n                  }),\n                  /* @__PURE__ */ f.jsx(\"div\", { className: \"spacer\" }),\n                  o &&\n                    p &&\n                    [\"table\", \"final\"].includes(d || \"\") &&\n                    /* @__PURE__ */ f.jsx(Re, {\n                      size: \"sm\",\n                      color: \"primary\",\n                      onClick: () => {\n                        ba(p, !0).then((g) => {\n                          a(g.columns), s(g.columns);\n                        });\n                      },\n                      children: \"Sync with DB\",\n                    }),\n                ],\n              }),\n              /* @__PURE__ */ f.jsx(Po, {\n                bsSize: \"sm\",\n                placeholder: \"Search by column name\",\n                type: \"text\",\n                onChange: (g) => {\n                  const x = g.target.value.toLowerCase();\n                  s(\n                    i == null\n                      ? void 0\n                      : i.filter((v) => v.name.toLowerCase().includes(x)),\n                  );\n                },\n              }),\n              /* @__PURE__ */ f.jsx(\"div\", {\n                className: \"d-flex align-items-center gap-xs\",\n                children: /* @__PURE__ */ f.jsxs(\"div\", {\n                  children: [l == null ? void 0 : l.length, \" columns\"],\n                }),\n              }),\n              /* @__PURE__ */ f.jsx(\"div\", {\n                className: \"d-flex flex-column gap-sm overflow-y\",\n                children:\n                  l == null\n                    ? void 0\n                    : l.map((g) =>\n                        /* @__PURE__ */ f.jsx(\n                          X5,\n                          {\n                            column: {\n                              name: g.name,\n                              table: n,\n                              can_lineage_expand: !1,\n                              description: \"\",\n                              code: g.expression,\n                            },\n                            handleClick: () => {},\n                            selected: !1,\n                            isSelectable: !1,\n                          },\n                          g.name,\n                        ),\n                      ),\n              }),\n            ],\n          }),\n        }),\n      ],\n    });\n  },\n  hi = ({ title: e, value: t }) =>\n    /* @__PURE__ */ f.jsxs(\"div\", {\n      className: ke(Y.column_card, {}),\n      children: [\n        /* @__PURE__ */ f.jsxs(\"div\", {\n          className: \"d-flex align-items-center gap-xs\",\n          children: [\n            /* @__PURE__ */ f.jsx(\"div\", { className: \"lines-2\", children: e }),\n            /* @__PURE__ */ f.jsx(\"div\", { className: \"spacer\" }),\n          ],\n        }),\n        /* @__PURE__ */ f.jsx(\"div\", {\n          className: \"d-flex flex-column\",\n          children: /* @__PURE__ */ f.jsx(\"div\", {\n            className: \"font-normal fs-xxs text-grey\",\n            children: t,\n          }),\n        }),\n      ],\n    }),\n  rw = ({ label: e }) => /* @__PURE__ */ f.jsx(\"div\", { children: e }),\n  J5 = () => {\n    var l;\n    const e = tn(),\n      {\n        state: { selectedTable: t },\n      } = it(),\n      [n, o] = se(null),\n      r = (l = e.getNode(t)) == null ? void 0 : l.data,\n      [i, a] = se(!0);\n    return (\n      ue(() => {\n        t &&\n          wx(t).then((s) => {\n            o(s), a(!1);\n          });\n      }, [t]),\n      i || !n || !t\n        ? /* @__PURE__ */ f.jsx(G5, {})\n        : /* @__PURE__ */ f.jsxs(\"div\", {\n            className: \"p-2 h-100 d-flex flex-column gap-md overflow-y\",\n            children: [\n              /* @__PURE__ */ f.jsxs(\"div\", {\n                className: Y.table_details_header,\n                children: [\n                  /* @__PURE__ */ f.jsx(a1, { nodeType: r.nodeType }),\n                  /* @__PURE__ */ f.jsx(\"div\", {\n                    className: \"d-flex align-items-center\",\n                    children: /* @__PURE__ */ f.jsx(\"div\", {\n                      className: \"fw-semibold fs-5 lines-2\",\n                      children: r.label,\n                    }),\n                  }),\n                ],\n              }),\n              n.description\n                ? /* @__PURE__ */ f.jsx(K5, { purpose: n.description })\n                : null,\n              /* @__PURE__ */ f.jsxs(\"div\", {\n                className: ke(Y.card, \"flex-grow column-section\"),\n                children: [\n                  /* @__PURE__ */ f.jsx(hi, {\n                    title: \"Owner\",\n                    value: `${n.owner.name} - ${n.owner.email}`,\n                  }),\n                  /* @__PURE__ */ f.jsx(hi, { title: \"Url\", value: n.url }),\n                  /* @__PURE__ */ f.jsx(hi, {\n                    title: \"Tags\",\n                    value: n.tags.map((s) =>\n                      /* @__PURE__ */ f.jsx(rw, { label: s }),\n                    ),\n                  }),\n                  /* @__PURE__ */ f.jsx(hi, {\n                    title: \"Maturity\",\n                    value: n.maturity,\n                  }),\n                ],\n              }),\n            ],\n          })\n    );\n  };\nfunction iw({ close: e }) {\n  const [t, n] = se(\n      \"\",\n      /* None */\n    ),\n    [o, r] = se(\"\"),\n    [i, a] = se(!1);\n  return /* @__PURE__ */ f.jsxs(\"div\", {\n    className: \"p-2 h-100 d-flex flex-column\",\n    children: [\n      /* @__PURE__ */ f.jsxs(\"div\", {\n        className: \"mb-2 d-flex\",\n        children: [\n          /* @__PURE__ */ f.jsx(\"div\", {\n            className: \"fw-semibold fs-5\",\n            children: \"Feedback\",\n          }),\n          /* @__PURE__ */ f.jsx(\"div\", { className: \"spacer\" }),\n          /* @__PURE__ */ f.jsx(Re, {\n            size: \"sm\",\n            color: \"primary\",\n            onClick: (l) => {\n              l.stopPropagation(), Ax();\n            },\n            children: \"Chat with us\",\n          }),\n        ],\n      }),\n      /* @__PURE__ */ f.jsxs(\"div\", {\n        className: Y.feedback_body,\n        children: [\n          !i &&\n            /* @__PURE__ */ f.jsxs(f.Fragment, {\n              children: [\n                /* @__PURE__ */ f.jsxs(\"div\", {\n                  className: \"d-flex gap-sm m-2\",\n                  children: [\n                    t === \"good\"\n                      ? /* @__PURE__ */ f.jsx(Uv, {\n                          className: \"cursor-pointer\",\n                          onClick: () =>\n                            n(\n                              \"\",\n                              /* None */\n                            ),\n                        })\n                      : /* @__PURE__ */ f.jsx(Wv, {\n                          className: \"cursor-pointer\",\n                          onClick: () =>\n                            n(\n                              \"good\",\n                              /* Postive */\n                            ),\n                        }),\n                    t === \"bad\"\n                      ? /* @__PURE__ */ f.jsx(qv, {\n                          className: \"cursor-pointer\",\n                          onClick: () =>\n                            n(\n                              \"\",\n                              /* None */\n                            ),\n                        })\n                      : /* @__PURE__ */ f.jsx(Zv, {\n                          className: \"cursor-pointer\",\n                          onClick: () =>\n                            n(\n                              \"bad\",\n                              /* Negative */\n                            ),\n                        }),\n                  ],\n                }),\n                /* @__PURE__ */ f.jsx(\"p\", {\n                  children:\n                    \"AI still needs humans sometimes, please help it out 🙂\",\n                }),\n                /* @__PURE__ */ f.jsx(Wx, {\n                  value: o,\n                  onChange: (l) => r(l.target.value),\n                  placeholder:\n                    \"What did AI do wrong? What it should have done?\",\n                }),\n                /* @__PURE__ */ f.jsxs(\"div\", {\n                  className: \"mt-3 d-flex gap-sm\",\n                  children: [\n                    /* @__PURE__ */ f.jsx(Re, {\n                      size: \"sm\",\n                      color: \"primary\",\n                      onClick: async (l) => {\n                        l.stopPropagation(),\n                          t !== \"\" &&\n                            (await Sx({\n                              feedback_value: t,\n                              feedback_text: o,\n                            }),\n                            a(!0));\n                      },\n                      children: \"Submit\",\n                    }),\n                    /* @__PURE__ */ f.jsx(Re, {\n                      size: \"sm\",\n                      color: \"link\",\n                      className: Y.cancel_btn,\n                      onClick: (l) => {\n                        l.stopPropagation(), e();\n                      },\n                      children: \"Cancel\",\n                    }),\n                  ],\n                }),\n              ],\n            }),\n          i &&\n            /* @__PURE__ */ f.jsxs(f.Fragment, {\n              children: [\n                /* @__PURE__ */ f.jsx(\"p\", {\n                  children: \"Many thanks for your feedback!\",\n                }),\n                /* @__PURE__ */ f.jsx(Re, {\n                  size: \"sm\",\n                  color: \"primary\",\n                  onClick: (l) => {\n                    l.stopPropagation(), e();\n                  },\n                  children: \"Close\",\n                }),\n              ],\n            }),\n        ],\n      }),\n    ],\n  });\n}\nfunction aw({ applyDefault: e }) {\n  const {\n      state: {\n        selectCheck: t,\n        nonSelectCheck: n,\n        defaultExpansion: o,\n        aiEnabled: r,\n      },\n    } = it(),\n    i = ft();\n  return /* @__PURE__ */ f.jsxs(\"div\", {\n    className: \"p-2 h-100 d-flex flex-column\",\n    children: [\n      /* @__PURE__ */ f.jsx(\"div\", {\n        className: \"mb-2 fw-semibold fs-5\",\n        children: \"Settings\",\n      }),\n      /* @__PURE__ */ f.jsxs(\"div\", {\n        className: \"d-flex flex-column gap-sm\",\n        children: [\n          /* @__PURE__ */ f.jsxs(\"div\", {\n            children: [\n              /* @__PURE__ */ f.jsx(bi, {\n                check: !0,\n                for: \"default-expansion\",\n                className: \"fs-6 mb-1\",\n                children: \"Default Expansion\",\n              }),\n              /* @__PURE__ */ f.jsx(Po, {\n                id: \"default-expansion\",\n                value: o,\n                type: \"number\",\n                onChange: (a) => {\n                  const l = Math.max(parseInt(a.target.value), 0);\n                  i(a3(l)), Yl({ defaultExpansion: l }), e(l);\n                },\n              }),\n            ],\n          }),\n          r &&\n            /* @__PURE__ */ f.jsxs(f.Fragment, {\n              children: [\n                /* @__PURE__ */ f.jsx(\"div\", {\n                  className: \"fs-6\",\n                  children: \"Edges visibility\",\n                }),\n                /* @__PURE__ */ f.jsxs(\"div\", {\n                  className: Y.select_node_checkbox,\n                  children: [\n                    /* @__PURE__ */ f.jsx(Qt, {\n                      type: \"checkbox\",\n                      id: \"select-check\",\n                      className: \"mt-2\",\n                      checked: t,\n                      onChange: (a) => {\n                        if (et.inProgress) {\n                          et.showCllInProgressMsg();\n                          return;\n                        }\n                        i(r3(a.target.checked)),\n                          Yl({\n                            showSelectEdges: a.target.checked,\n                          });\n                      },\n                    }),\n                    /* @__PURE__ */ f.jsxs(\"div\", {\n                      className: \"d-flex flex-column\",\n                      children: [\n                        /* @__PURE__ */ f.jsx(bi, {\n                          check: !0,\n                          for: \"select-check\",\n                          className: \"fs-6\",\n                          children: \"Select\",\n                        }),\n                        /* @__PURE__ */ f.jsx(\"div\", {\n                          className: \"text-grey\",\n                          children:\n                            \"Select linkages are shown if there is direct flow of data between columns through select statements.\",\n                        }),\n                      ],\n                    }),\n                  ],\n                }),\n                /* @__PURE__ */ f.jsxs(\"div\", {\n                  className: Y.non_select_node_checkbox,\n                  children: [\n                    /* @__PURE__ */ f.jsx(Qt, {\n                      type: \"checkbox\",\n                      id: \"non-select-check\",\n                      className: \"mt-2\",\n                      checked: n,\n                      onChange: (a) => {\n                        if (et.inProgress) {\n                          et.showCllInProgressMsg();\n                          return;\n                        }\n                        i(i3(a.target.checked)),\n                          Yl({\n                            showNonSelectEdges: a.target.checked,\n                          });\n                      },\n                    }),\n                    /* @__PURE__ */ f.jsxs(\"div\", {\n                      className: \"d-flex flex-column\",\n                      children: [\n                        /* @__PURE__ */ f.jsx(bi, {\n                          check: !0,\n                          for: \"non-select-check\",\n                          className: \"fs-6\",\n                          children: \"Non-Select\",\n                        }),\n                        /* @__PURE__ */ f.jsx(\"div\", {\n                          className: \"text-grey\",\n                          children:\n                            \"Non-Select linkages are shown if columns appear in condition/clauses like where, join, having, etc.\",\n                        }),\n                      ],\n                    }),\n                  ],\n                }),\n              ],\n            }),\n        ],\n      }),\n    ],\n  });\n}\nconst p1 = Pt({ openedPopover: \"\", setOpenedPopover: () => {} });\nfunction ef({ id: e, trigger: t, render: n }) {\n  const o = he(null),\n    { openedPopover: r, setOpenedPopover: i } = Xe(p1);\n  return (\n    ue(() => {\n      const a = (l) => {\n        if (!o.current) return;\n        const {\n          x: s,\n          y: u,\n          width: c,\n          height: d,\n        } = o.current.getBoundingClientRect();\n        i(r0(s - 10, s + c + 10)(l.x) && r0(u - 10, u + d + 10)(l.y) ? e : \"\");\n      };\n      return (\n        document.body.addEventListener(\"click\", a),\n        () => {\n          document.body.removeEventListener(\"click\", a);\n        }\n      );\n    }, [r]),\n    /* @__PURE__ */ f.jsxs(f.Fragment, {\n      children: [\n        /* @__PURE__ */ f.jsx(\"div\", {\n          id: e,\n          onClick: (a) => {\n            a.stopPropagation(), i(e);\n          },\n          children: t,\n        }),\n        /* @__PURE__ */ f.jsx(od, {\n          placement: \"bottom\",\n          target: e,\n          className: Y.popover,\n          isOpen: r === e,\n          toggle: () => i(\"\"),\n          children: /* @__PURE__ */ f.jsx(rd, {\n            children: /* @__PURE__ */ f.jsx(\"div\", {\n              ref: o,\n              children: n({ close: () => i(\"\") }),\n            }),\n          }),\n        }),\n      ],\n    })\n  );\n}\nconst lw = () => {\n    const e = tn(),\n      {\n        state: {\n          selectedTable: t,\n          leftExpansion: n,\n          rightExpansion: o,\n          minRange: r,\n          nodeCount: i,\n          defaultExpansion: a,\n        },\n        rerender: l,\n      } = it(),\n      [s, u] = se([0, 0]),\n      c = ft(),\n      { openedPopover: d } = Xe(p1),\n      p = \"auto-expansion-popover\",\n      h = d === p;\n    ue(() => {\n      c(Ll(a0(r[0], s[0], a))), c(Dl(a0(r[1], s[1], a)));\n    }, [a, c, s, r]),\n      ue(() => {\n        (async () => c(Mo(await Ro(e.getNodes(), e.getEdges(), t, n, o))))();\n      }, [e, n, c, o, t]),\n      ue(() => {\n        (async () => {\n          var M;\n          if (!h || !t) return;\n          const y = (M = e.getNode(t)) == null ? void 0 : M.data;\n          if (!y) return;\n          const { level: g } = y,\n            x = e.getNodes(),\n            v = e.getEdges(),\n            [S] = await Ki(x, v, t, -1 / 0, 1 / 0, 1 / 0);\n          let w = 1 / 0,\n            E = -1 / 0;\n          for (const _ of S)\n            (w = Math.min(w, _.data.level)), (E = Math.max(E, _.data.level));\n          u([g - w, E - g]);\n        })();\n      }, [e, t, h]);\n    const m = Oe(() => {\n        c(Ll(n + 1 <= s[0] ? n + 1 : n));\n      }, [n, c, s]),\n      b = Oe(() => {\n        c(Dl(o + 1 <= s[0] ? o + 1 : o));\n      }, [o, c, s]);\n    return /* @__PURE__ */ f.jsx(ef, {\n      id: p,\n      trigger: /* @__PURE__ */ f.jsxs(Re, {\n        size: \"sm\",\n        color: \"primary\",\n        className: \"d-flex gap-sm align-items-center\",\n        type: \"button\",\n        children: [/* @__PURE__ */ f.jsx(Yv, {}), \"Expand\"],\n      }),\n      render: ({ close: y }) =>\n        /* @__PURE__ */ f.jsxs(\"div\", {\n          className: \"d-flex flex-column gap-xs\",\n          children: [\n            /* @__PURE__ */ f.jsxs(\"div\", {\n              className:\n                \"w-100 d-flex gap-xl justify-content-between align-items-center\",\n              children: [\n                /* @__PURE__ */ f.jsxs(\"div\", {\n                  className: ke(Y.expand_nav, {\n                    [Y.disabled]: r[0] === -1,\n                  }),\n                  children: [\n                    /* @__PURE__ */ f.jsxs(\"div\", {\n                      className: Y.expand_nav_btn,\n                      children: [\n                        /* @__PURE__ */ f.jsx(\"div\", {\n                          className: Y.icon,\n                          onClick: (g) => {\n                            g.stopPropagation(), t && c(Ll(s[0]));\n                          },\n                          children: /* @__PURE__ */ f.jsx(Gv, {}),\n                        }),\n                        /* @__PURE__ */ f.jsx(\"div\", { className: Y.divider }),\n                        /* @__PURE__ */ f.jsx(\"div\", {\n                          className: Y.icon,\n                          onClick: (g) => {\n                            g.stopPropagation(), t && m();\n                          },\n                          children: /* @__PURE__ */ f.jsx(Kv, {}),\n                        }),\n                      ],\n                    }),\n                    /* @__PURE__ */ f.jsx(\"div\", {\n                      className: \"text-blue px-2 py-1\",\n                      children: n,\n                    }),\n                  ],\n                }),\n                /* @__PURE__ */ f.jsxs(\"div\", {\n                  className: ke(Y.expand_nav, {\n                    [Y.disabled]: r[1] === -1,\n                  }),\n                  children: [\n                    /* @__PURE__ */ f.jsx(\"div\", {\n                      className: \"text-blue px-2 py-1\",\n                      children: o,\n                    }),\n                    /* @__PURE__ */ f.jsxs(\"div\", {\n                      className: Y.expand_nav_btn,\n                      children: [\n                        /* @__PURE__ */ f.jsx(\"div\", {\n                          className: Y.icon,\n                          onClick: (g) => {\n                            g.stopPropagation(), t && b();\n                          },\n                          children: /* @__PURE__ */ f.jsx(Xv, {}),\n                        }),\n                        /* @__PURE__ */ f.jsx(\"div\", { className: Y.divider }),\n                        /* @__PURE__ */ f.jsx(\"div\", {\n                          className: Y.icon,\n                          onClick: (g) => {\n                            g.stopPropagation(), t && c(Dl(s[1]));\n                          },\n                          children: /* @__PURE__ */ f.jsx(I5, {}),\n                        }),\n                      ],\n                    }),\n                  ],\n                }),\n              ],\n            }),\n            /* @__PURE__ */ f.jsxs(\"div\", {\n              className:\n                \"w-100 d-flex gap-xl justify-content-between align-items-center\",\n              children: [\n                /* @__PURE__ */ f.jsx(\"div\", {\n                  className: \"normal-text\",\n                  children: \"Parents\",\n                }),\n                /* @__PURE__ */ f.jsx(\"div\", {\n                  className: \"normal-text\",\n                  children: \"Children\",\n                }),\n              ],\n            }),\n            /* @__PURE__ */ f.jsxs(Re, {\n              color: i === 0 ? \"secondary\" : \"primary\",\n              size: \"sm\",\n              disabled: i === 0,\n              onClick: async (g) => {\n                var w;\n                if ((g.stopPropagation(), !t)) return;\n                const x = (w = e.getNode(t)) == null ? void 0 : w.data;\n                if (!x) return;\n                const [v, S] = await Ki(\n                  e.getNodes(),\n                  e.getEdges(),\n                  t,\n                  x.level - n,\n                  x.level + o,\n                  1 / 0,\n                );\n                Tr(v, S, t),\n                  pn(v, S),\n                  e.setNodes(v),\n                  e.setEdges(S),\n                  e.fitView({ minZoom: Bs }),\n                  c(yr(Or(v, S, t))),\n                  c(Mo(await Ro(v, S, t, n, o))),\n                  l(),\n                  y();\n              },\n              children: [\"Add \", i, \" tables\"],\n            }),\n          ],\n        }),\n    });\n  },\n  sw = () => {\n    const {\n        state: { selectedColumn: e, confidence: t, aiEnabled: n },\n      } = it(),\n      o = document.getElementById(\"expand-container\");\n    return o\n      ? Hn(\n          /* @__PURE__ */ f.jsx(bt, {\n            className: Y.menu_card_container,\n            children: /* @__PURE__ */ f.jsx(Mt, {\n              className: Y.menu_card,\n              children: /* @__PURE__ */ f.jsxs(\"div\", {\n                className: \"d-flex gap-sm\",\n                children: [\n                  /* @__PURE__ */ f.jsx(lw, {}),\n                  n &&\n                    (e == null ? void 0 : e.name) &&\n                    t.confidence === \"low\" &&\n                    /* @__PURE__ */ f.jsxs(f.Fragment, {\n                      children: [\n                        /* @__PURE__ */ f.jsx(\"div\", {\n                          className: Y.verticle_divider,\n                        }),\n                        /* @__PURE__ */ f.jsxs(\"div\", {\n                          className: \"d-flex gap-xxs align-items-center\",\n                          children: [\n                            /* @__PURE__ */ f.jsx(\"div\", {\n                              children: \"Confidence\",\n                            }),\n                            /* @__PURE__ */ f.jsx(jn, {\n                              title:\n                                \"Depending on the SQL dialect and complexity of queries, there may be situations where we are not completely confident about the lineage shown in this view\",\n                              id: \"confidence\",\n                              children: /* @__PURE__ */ f.jsx(L8, {}),\n                            }),\n                            /* @__PURE__ */ f.jsx(\"div\", {\n                              className: Y.low_confidence,\n                              children: \"Low\",\n                            }),\n                          ],\n                        }),\n                      ],\n                    }),\n                ],\n              }),\n            }),\n          }),\n          o,\n        )\n      : null;\n  },\n  cw = () => {\n    const e = document.getElementById(\"settings-container\"),\n      t = ft();\n    return e\n      ? Hn(\n          /* @__PURE__ */ f.jsxs(Re, {\n            outline: !0,\n            onClick: () => t(Kt(_5)),\n            children: [/* @__PURE__ */ f.jsx(N8, {}), \"Settings\"],\n          }),\n          e,\n        )\n      : null;\n  },\n  uw = ({ flow: e }) => {\n    const t = document.getElementById(\"reset-container\"),\n      n = ft();\n    return t\n      ? Hn(\n          /* @__PURE__ */ f.jsxs(Re, {\n            outline: !0,\n            onClick: () => {\n              e.setNodes([]),\n                e.setEdges([]),\n                n(Un({ table: \"\", name: \"\" })),\n                n(br({})),\n                n(kc({})),\n                P5(),\n                et.cancel();\n            },\n            \"data-testid\": \"reset-btn\",\n            className: Y.reset_btn,\n            children: [\n              /* @__PURE__ */ f.jsx(O8, {}),\n              /* @__PURE__ */ f.jsx(\"span\", { children: \"Reset\" }),\n            ],\n          }),\n          t,\n        )\n      : null;\n  },\n  dw = ({ viewsCodeArgs: e }) => {\n    const {\n        state: { theme: t },\n      } = Xe(zn),\n      n = ft(),\n      o = tn(),\n      r = ze(() => {\n        var a, l;\n        return e\n          ? (l = (a = o.getNode(e.table)) == null ? void 0 : a.data) == null\n            ? void 0\n            : l.label\n          : \"\";\n      }, [o, e]),\n      i = ze(() => {\n        const a = Object.values((e == null ? void 0 : e.viewsCode) || [])\n            .flat()\n            .filter(([, s]) => s === \"Transformation\")\n            .map(([s]) => s),\n          l = [];\n        for (const s of a) l.includes(s) || l.push(s);\n        return l;\n      }, [e == null ? void 0 : e.viewsCode]);\n    return /* @__PURE__ */ f.jsx(id, {\n      size: \"lg\",\n      isOpen: !!e,\n      toggle: () => n(To(null)),\n      centered: !0,\n      unmountOnClose: !0,\n      scrollable: !0,\n      className: \"bs-modal\",\n      children: /* @__PURE__ */ f.jsxs(ad, {\n        children: [\n          /* @__PURE__ */ f.jsx(\"div\", {\n            className: Y.close_button,\n            onClick: () => n(To(null)),\n            children: /* @__PURE__ */ f.jsx(o1, {}),\n          }),\n          /* @__PURE__ */ f.jsxs(\"div\", {\n            className: \"d-flex flex-column gap-sm\",\n            children: [\n              r &&\n                /* @__PURE__ */ f.jsx(h1, { nodeType: e.nodeType, table: r }),\n              /* @__PURE__ */ f.jsxs(\"div\", {\n                className: \"d-flex flex-column gap-xs\",\n                children: [\n                  /* @__PURE__ */ f.jsx(\"div\", {\n                    className: \"text-dark-grey fs-xs\",\n                    children: \"Column\",\n                  }),\n                  /* @__PURE__ */ f.jsx(\"div\", {\n                    className: Y.model_views_type,\n                    children: e.column,\n                  }),\n                ],\n              }),\n              /* @__PURE__ */ f.jsxs(\"div\", {\n                className: \"d-flex flex-column gap-xs\",\n                children: [\n                  /* @__PURE__ */ f.jsx(\"div\", {\n                    className: \"text-dark-grey fs-xs\",\n                    children: \"Type\",\n                  }),\n                  /* @__PURE__ */ f.jsxs(\"div\", {\n                    className: Y.model_views_type,\n                    children: [\n                      /* @__PURE__ */ f.jsx(r1, { viewsType: e.viewsType }),\n                      e.viewsType,\n                    ],\n                  }),\n                ],\n              }),\n              i.length > 0 &&\n                /* @__PURE__ */ f.jsxs(\"div\", {\n                  className: \"d-flex flex-column gap-xs\",\n                  children: [\n                    /* @__PURE__ */ f.jsx(\"div\", {\n                      className: \"text-dark-grey fs-xs\",\n                      children: \"List of transformations\",\n                    }),\n                    i.map((a) =>\n                      /* @__PURE__ */ f.jsx(\n                        Lr,\n                        {\n                          code: a,\n                          language: \"sql\",\n                          editorTheme: \"tomorrow\",\n                          theme: t,\n                        },\n                        a,\n                      ),\n                    ),\n                  ],\n                }),\n            ],\n          }),\n        ],\n      }),\n    });\n  };\nfunction fw({ opNodeArgs: e }) {\n  const {\n    state: { theme: t },\n  } = Xe(zn);\n  return /* @__PURE__ */ f.jsxs(\"div\", {\n    className: \"d-flex flex-column gap-sm\",\n    children: [\n      /* @__PURE__ */ f.jsxs(\"div\", {\n        className: Y.table_details_header,\n        children: [\n          q5[e.op_type],\n          /* @__PURE__ */ f.jsx(\"div\", {\n            className: \"d-flex align-items-center\",\n            children: /* @__PURE__ */ f.jsx(\"div\", {\n              className: \"fw-semibold fs-5 lines-2\",\n              children: e.op_type,\n            }),\n          }),\n        ],\n      }),\n      /* @__PURE__ */ f.jsxs(\"div\", {\n        className: \"d-flex flex-column gap-xs\",\n        children: [\n          /* @__PURE__ */ f.jsx(\"div\", {\n            className: \"text-dark-grey fs-xs\",\n            children: \"Code\",\n          }),\n          /* @__PURE__ */ f.jsx(Lr, {\n            code: e.op_code,\n            language: \"sql\",\n            editorTheme: \"tomorrow\",\n            theme: t,\n          }),\n        ],\n      }),\n    ],\n  });\n}\nconst g1 = () => {\n    const {\n        state: { modalArgs: e },\n      } = it(),\n      t = ft();\n    return e\n      ? /* @__PURE__ */ f.jsx(id, {\n          size: \"lg\",\n          isOpen: e.type !== \"none\",\n          close: () => t(To({ type: \"none\" })),\n          centered: !0,\n          unmountOnClose: !0,\n          scrollable: !0,\n          className: \"bs-modal\",\n          children: /* @__PURE__ */ f.jsxs(ad, {\n            children: [\n              /* @__PURE__ */ f.jsx(\"div\", {\n                className: Y.close_button,\n                onClick: () => t(To({ type: \"none\" })),\n                children: /* @__PURE__ */ f.jsx(o1, {}),\n              }),\n              e.type === \"views_code\" &&\n                /* @__PURE__ */ f.jsx(dw, {\n                  viewsCodeArgs: e.args,\n                }),\n              e.type === \"op_node\" &&\n                /* @__PURE__ */ f.jsx(fw, { opNodeArgs: e.args }),\n            ],\n          }),\n        })\n      : null;\n  },\n  hw = ({ flow: e }) => {\n    const t = document.getElementById(\"export-container\"),\n      {\n        state: { selectedColumn: n, collectColumns: o },\n      } = it(),\n      [r, i] = se(\"\"),\n      a = async (l) => {\n        const s = e.getEdges(),\n          u = s.filter((m) => En(m)).map((m) => [m.source, m.target]),\n          c = s\n            .filter((m) => xt(m))\n            .map((m) => {\n              var b;\n              return (\n                // remove column prefix for edge\n                [\n                  m.source.slice(7),\n                  m.target.slice(7),\n                  (b = m.data) == null ? void 0 : b.type,\n                ]\n              );\n            }),\n          d = {};\n        await Promise.all(\n          e.getNodes().map(async (m) => {\n            if (xt(m)) return;\n            const b = await ba(m.id, !1);\n            d[m.id] = {\n              type: m.data.nodeType,\n              nodeId: m.id,\n              name: m.data.label,\n              ...b,\n            };\n          }),\n        );\n        const h = await Ox({\n          name: r,\n          lineage_data: {\n            selectedColumn: n,\n            collectColumns: o,\n            tableEdges: u,\n            columnEdges: c,\n            details: d,\n          },\n        });\n        h != null && h.url && i1(`Lineage is exported at [link](${h.url})`),\n          l(),\n          i(\"\");\n      };\n    return t\n      ? Hn(\n          /* @__PURE__ */ f.jsx(ef, {\n            id: \"export-popover\",\n            trigger: /* @__PURE__ */ f.jsxs(Re, {\n              outline: !0,\n              children: [/* @__PURE__ */ f.jsx(P2, {}), \"Export\"],\n            }),\n            render: ({ close: l }) =>\n              /* @__PURE__ */ f.jsxs(\"div\", {\n                children: [\n                  /* @__PURE__ */ f.jsx(Po, {\n                    id: \"export-name\",\n                    value: r,\n                    type: \"text\",\n                    onChange: (s) => i(s.target.value),\n                    className: \"mb-2 text-white\",\n                    placeholder: \"Enter name\",\n                  }),\n                  /* @__PURE__ */ f.jsxs(Re, {\n                    outline: !0,\n                    onClick: () => a(l),\n                    disabled: r === \"\",\n                    children: [/* @__PURE__ */ f.jsx(P2, {}), \"Export\"],\n                  }),\n                ],\n              }),\n          }),\n          t,\n        )\n      : null;\n  },\n  pw = {\n    table: U5,\n    seeMore: c1,\n    column: d1,\n  },\n  gw = { selfConnecting: u1 },\n  mw = ({ flow: e, theme: t }) => {\n    const [n, o] = se(\"\"),\n      {\n        state: {\n          selectCheck: r,\n          nonSelectCheck: i,\n          sidebarScreen: a,\n          leftExpansion: l,\n          rightExpansion: s,\n          selectedColumn: u,\n          defaultExpansion: c,\n          errors: d,\n        },\n        rerender: p,\n      } = it(),\n      h = ft(),\n      m = he(c),\n      b = () => {\n        if (e.current) {\n          const v = e.current.getEdges();\n          Ar(v, !0), Mr(v, !1), e.current.setEdges(v);\n        }\n      },\n      y = Oe(\n        async (v) => {\n          if ((h(Kt(\"\")), !v)) return;\n          h(W9(v.aiEnabled));\n          const { node: S } = v,\n            w = e.current;\n          if (!w || !S) return;\n          if (w.getNode(S.table)) {\n            h(to(S.table));\n            let j = w.getNodes(),\n              R = w.getEdges();\n            (u != null && u.name) ||\n              (([j, R] = Tr(j, R, S.table)), w.setNodes(j), w.setEdges(R)),\n              h(yr(Or(j, R, S.table))),\n              h(Mo(await Ro(j, R, S.table, l, s)));\n            return;\n          }\n          let M = [],\n            _ = [];\n          (M = [Do(S, 0, \"\")]),\n            ([M, _] = await Ki(M, _, S.table, -m.current, m.current, 1 / 0)),\n            h(to(S.table)),\n            h(Un({ table: \"\", name: \"\" })),\n            h(br({})),\n            h(kc({})),\n            ([M, _] = Tr(M, _, S.table)),\n            pn(M, _),\n            w.setNodes(M),\n            w.setEdges(_),\n            w.fitView({ minZoom: Bs, duration: 500 }),\n            h(yr(Or(M, _, S.table))),\n            h(Mo(await Ro(M, _, S.table, l, s))),\n            p();\n        },\n        [p, l, s, u == null ? void 0 : u.name],\n      );\n    ue(() => {\n      document.addEventListener(\"cll_cancelled\", b);\n      const v = (S) => {\n        console.log(\"renderStartNode\", S.detail), y(S.detail);\n      };\n      return (\n        document.addEventListener(\"renderStartNode\", v),\n        () => {\n          document.removeEventListener(\"cll_cancelled\", b),\n            document.removeEventListener(\"renderStartNode\", v);\n        }\n      );\n    }, []);\n    const g = Oe(async () => {\n      const v = await kx();\n      h(r3(v.showSelectEdges)),\n        h(i3(v.showNonSelectEdges)),\n        h(a3(v.defaultExpansion)),\n        (m.current = v.defaultExpansion);\n    }, [h]);\n    ue(() => {\n      g();\n    }, [g]),\n      ue(() => {\n        const v = e.current;\n        if (!v) return;\n        (async () => {\n          var M;\n          const w = u;\n          if (!w) return;\n          if (i) {\n            const _ = (j) =>\n              s1(\n                v.getNodes(),\n                v.getEdges(),\n                j,\n                w ? [w] : [],\n                (R) => {\n                  h(Mc({ operatorList: R }));\n                },\n                (R) => {\n                  h(_c(R));\n                },\n                (R) => {\n                  h(Ac(R));\n                },\n                () => [v.getNodes(), v.getEdges()],\n                (R, D) => {\n                  v.setNodes(R), v.setEdges(D);\n                },\n                w || { table: \"\", name: \"\" },\n                { direct: r, indirect: i },\n                (R) => h(Tc(R(d))),\n              );\n            try {\n              et.start(), await Promise.all([_(!0), _(!1)]);\n            } catch (j) {\n              console.error(\n                \"Error while performing cll for \",\n                w == null ? void 0 : w.table,\n                w == null ? void 0 : w.name,\n                \", error:\",\n                j,\n              );\n            } finally {\n              et.end();\n            }\n          }\n          const E = v.getEdges();\n          if ((r && i) || (!r && !i)) {\n            for (const _ of E) _.hidden = !1;\n            v.setEdges(E);\n            return;\n          }\n          for (const _ of E) {\n            _.hidden = !1;\n            const j = (M = _.data) == null ? void 0 : M.type;\n            j &&\n              (j === \"direct\" && (_.hidden = !r),\n              j === \"indirect\" && (_.hidden = !i));\n          }\n          v.setEdges(E);\n        })();\n      }, [r, i]);\n    const x = (v) => {\n      (e.current = v), P5();\n    };\n    return /* @__PURE__ */ f.jsx(\"div\", {\n      className: \"lineage_flow_component\",\n      style: { width: \"100%\", height: \"100%\" },\n      \"data-theme\": t,\n      children: /* @__PURE__ */ f.jsx(p1.Provider, {\n        value: { openedPopover: n, setOpenedPopover: o },\n        children: /* @__PURE__ */ f.jsxs(Rr, {\n          children: [\n            /* @__PURE__ */ f.jsxs(pa, {\n              defaultNodes: [],\n              defaultEdges: [],\n              onInit: (v) => x(v),\n              nodeTypes: pw,\n              edgeTypes: gw,\n              style: { background: \"var(--bg-color)\" },\n              proOptions: { hideAttribution: !0 },\n              minZoom: Bs,\n              children: [\n                /* @__PURE__ */ f.jsx(Yc, {}),\n                /* @__PURE__ */ f.jsx(qc, {}),\n              ],\n            }),\n            /* @__PURE__ */ f.jsx(H5, {}),\n            /* @__PURE__ */ f.jsxs(f1, {\n              isOpen: a !== \"\",\n              closeModal: () => h(Kt(\"\")),\n              width: \"30vw\",\n              children: [\n                a === Xc && /* @__PURE__ */ f.jsx(Y5, {}),\n                a === Gc &&\n                  /* @__PURE__ */ f.jsx(Q5, { lineageType: \"dynamic\" }),\n                a === Kc && /* @__PURE__ */ f.jsx(J5, {}),\n                a === By && /* @__PURE__ */ f.jsx(iw, { close: () => Kt(\"\") }),\n                a === _5 &&\n                  /* @__PURE__ */ f.jsx(aw, {\n                    applyDefault: (v) => (m.current = v),\n                  }),\n              ],\n            }),\n            e.current ? /* @__PURE__ */ f.jsx(hw, { flow: e.current }) : null,\n            /* @__PURE__ */ f.jsx(sw, {}),\n            /* @__PURE__ */ f.jsx(cw, {}),\n            e.current ? /* @__PURE__ */ f.jsx(uw, { flow: e.current }) : null,\n            /* @__PURE__ */ f.jsx(g1, {}),\n          ],\n        }),\n      }),\n    });\n  },\n  bw = {\n    table: U5,\n    seeMore: c1,\n    column: d1,\n  },\n  yw = {\n    selfConnecting: u1,\n  },\n  Cw = ({\n    flow: e,\n    selectedColumn: t,\n    collectColumns: n,\n    columnEdges: o = [],\n    tableEdges: r,\n    details: i,\n  }) => {\n    const {\n        state: { sidebarScreen: a },\n      } = it(),\n      l = ft();\n    return (\n      ue(() => {\n        l(br(n)),\n          setTimeout(async () => {\n            var b, y;\n            const s = (g) => ({\n                table: g,\n                label: i[g].name,\n                upstreamCount: 0,\n                downstreamCount: 0,\n                nodeType: i[g].type || \"cte\",\n                isExternalProject: !1,\n                tests: [],\n              }),\n              { sources: u } = j5(r);\n            let c = [],\n              d = [];\n            const p = [...u],\n              h = {},\n              m = (g, x) => {\n                var w, E;\n                const v = g\n                    ? r.filter(([M]) => M === x).map(([, M]) => M)\n                    : r.filter(([, M]) => M === x).map(([M]) => M),\n                  S =\n                    ((E =\n                      (w = c.find((M) => M.id === x)) == null\n                        ? void 0\n                        : w.data) == null\n                      ? void 0\n                      : E.level) || 0;\n                return ya(c, d, v.map(s), x, g, S, 1e4, !1, i), v;\n              };\n            for (; p.length > 0; ) {\n              const g = p.pop();\n              h[g] || ((h[g] = !0), p.push(...m(!0, g), ...m(!1, g)));\n            }\n            if (t) {\n              const g = `${t.table}/${t.name}`,\n                { nodes: x, edges: v } = await Rx(c, d, g, async () => ({\n                  collect_columns: n,\n                  highlight_edges: o,\n                }));\n              (c = x), (d = v);\n            }\n            pn(c, d, !1),\n              (b = e.current) == null || b.setNodes(c),\n              (y = e.current) == null || y.setEdges(d);\n          }, 500);\n      }, [n, o, i, e, t, r]),\n      ue(() => {\n        const s = setTimeout(() => {\n          var u;\n          (u = e.current) == null || u.fitView({ duration: 500 });\n        }, 1e3);\n        return () => clearInterval(s);\n      }, []),\n      /* @__PURE__ */ f.jsxs(\"div\", {\n        style: { width: \"100%\", height: \"100%\" },\n        children: [\n          /* @__PURE__ */ f.jsx(\"div\", {\n            style: { width: \"100%\", height: \"100%\" },\n            children: /* @__PURE__ */ f.jsxs(Rr, {\n              children: [\n                /* @__PURE__ */ f.jsxs(pa, {\n                  defaultNodes: [],\n                  defaultEdges: [],\n                  onInit: (s) => (e.current = s),\n                  nodeTypes: bw,\n                  edgeTypes: yw,\n                  style: { background: \"var(--bg-color)\" },\n                  proOptions: { hideAttribution: !0 },\n                  minZoom: 0.05,\n                  children: [\n                    /* @__PURE__ */ f.jsx(Yc, {}),\n                    /* @__PURE__ */ f.jsx(qc, {}),\n                  ],\n                }),\n                /* @__PURE__ */ f.jsx(H5, {}),\n                /* @__PURE__ */ f.jsxs(f1, {\n                  isOpen: a !== \"\",\n                  closeModal: () => l(Kt(\"\")),\n                  width: \"30vw\",\n                  children: [\n                    a === Xc && /* @__PURE__ */ f.jsx(Y5, {}),\n                    a === Gc &&\n                      /* @__PURE__ */ f.jsx(Q5, { lineageType: \"static\" }),\n                    a === Kc && /* @__PURE__ */ f.jsx(J5, {}),\n                  ],\n                }),\n              ],\n            }),\n          }),\n          /* @__PURE__ */ f.jsx(g1, {}),\n        ],\n      })\n    );\n  },\n  vw = {\n    table: Vx,\n    seeMore: c1,\n    column: d1,\n    operator: $x,\n  },\n  xw = {\n    selfConnecting: u1,\n  },\n  ww = ({ flow: e, tableEdges: t, details: n, nodePositions: o }) => {\n    const {\n        state: { selectedTable: r },\n      } = it(),\n      i = ft();\n    return (\n      ue(() => {\n        i(U9({ details: n, tableEdges: t }));\n      }, [n]),\n      ue(() => {\n        setTimeout(async () => {\n          var h, m, b, y;\n          const a = (g) => ({\n            table: g,\n            label: n[g].name || g,\n            upstreamCount: 0,\n            downstreamCount: 0,\n            nodeType: n[g].type || \"cte\",\n            isExternalProject: !1,\n            tests: [],\n          });\n          if (o) {\n            const g = Object.keys(o).map((v) =>\n                n[v].type in Fo ? Do(a(v), 0, \"\") : D5(v, 0, \"\", n[v]),\n              ),\n              x = t.map(([v, S]) => n1(o[v][1], o[S][1], v, S, !0, !0));\n            for (const v of g) {\n              if (!o[v.id]) continue;\n              const [S, w] = o[v.id];\n              v.position = { x: S, y: w };\n            }\n            (h = e.current) == null || h.setNodes(g),\n              (m = e.current) == null || m.setEdges(x);\n            return;\n          }\n          const { sinks: l } = j5(t);\n          let s = l.map((g) => Do(a(g), 0, \"\")),\n            u = [];\n          const c = [...l],\n            d = {},\n            p = (g, x) => {\n              var w, E;\n              const v = g\n                  ? t.filter(([M]) => M === x).map(([, M]) => M)\n                  : t.filter(([, M]) => M === x).map(([M]) => M),\n                S =\n                  ((E =\n                    (w = s.find((M) => M.id === x)) == null\n                      ? void 0\n                      : w.data) == null\n                    ? void 0\n                    : E.level) || 0;\n              return ya(s, u, v.map(a), x, g, S, 1e4, !0, n), v;\n            };\n          for (; c.length > 0; ) {\n            const g = c.pop();\n            d[g] || ((d[g] = !0), c.push(...p(!1, g)));\n          }\n          pn(s, u, !0),\n            (b = e.current) == null || b.setNodes(s),\n            (y = e.current) == null || y.setEdges(u);\n        }, 500);\n      }, [n, e, t, o]),\n      ue(() => {\n        const a = setTimeout(() => {\n          var l;\n          (l = e.current) == null || l.fitView({ duration: 500 });\n        }, 1e3);\n        return () => clearInterval(a);\n      }, []),\n      ue(() => {\n        const a = (d) => {\n            i(q9(d.detail));\n          },\n          l = (d) => {\n            i(Y9(d.detail));\n          },\n          s = () => {\n            setTimeout(() => {\n              var d;\n              (d = e.current) == null || d.fitView({ duration: 500 });\n            }, 500);\n          },\n          u = (d) => {\n            i(G9(d.detail));\n          },\n          c = (d) => {\n            i(K9(d.detail));\n          };\n        return (\n          document.addEventListener(\"onHighlightedNodes\", a),\n          document.addEventListener(\"onSelectedNodes\", l),\n          document.addEventListener(\"onNodesSavingsPerformance\", u),\n          document.addEventListener(\"onNodesCost\", c),\n          document.addEventListener(\"fitView\", s),\n          () => {\n            document.removeEventListener(\"highlightedNodes\", a),\n              document.removeEventListener(\"onSelectedNodes\", l),\n              document.removeEventListener(\"onNodesSavingsPerformance\", u),\n              document.removeEventListener(\"onNodesCost\", c),\n              document.removeEventListener(\"fitView\", s);\n          }\n        );\n      }, []),\n      /* @__PURE__ */ f.jsxs(\"div\", {\n        style: { width: \"100%\", height: \"100%\" },\n        children: [\n          /* @__PURE__ */ f.jsx(\"div\", {\n            style: { width: \"100%\", height: \"100%\" },\n            children: /* @__PURE__ */ f.jsx(Rr, {\n              children: /* @__PURE__ */ f.jsxs(pa, {\n                defaultNodes: [],\n                defaultEdges: [],\n                onInit: (a) => (e.current = a),\n                nodeTypes: vw,\n                edgeTypes: xw,\n                style: { background: \"var(--bg-color)\" },\n                proOptions: { hideAttribution: !0 },\n                minZoom: 0.05,\n                children: [\n                  /* @__PURE__ */ f.jsx(Yc, {}),\n                  /* @__PURE__ */ f.jsx(qc, {}),\n                ],\n              }),\n            }),\n          }),\n          /* @__PURE__ */ f.jsx(g1, {}),\n          /* @__PURE__ */ f.jsx(f1, {\n            isOpen: !!r,\n            closeModal: () => i(to(\"\")),\n            width: \"30vw\",\n            children: !!r && /* @__PURE__ */ f.jsx(ow, {}),\n          }),\n        ],\n      })\n    );\n  },\n  zn = Pt({\n    state: Ri.getInitialState(),\n    dispatch: () => null,\n    rerender: () => null,\n  }),\n  Ew = (\n    {\n      theme: e = \"dark\",\n      lineageType: t,\n      sqlLineage: n,\n      dynamicLineage: o,\n      staticLineage: r,\n      allowSyncColumnsWithDB: i,\n      externalSidePanel: a = !1,\n    },\n    l,\n  ) => {\n    const [s, u] = ic(Ri.reducer, {\n        ...Ri.getInitialState(),\n        theme: e,\n        lineageType: t,\n        sqlLineage: n,\n        allowSyncColumnsWithDB: i,\n        externalSidePanel: a,\n      }),\n      c = he(),\n      [d, p] = se(0),\n      h = Oe(() => p((b) => (b + 1) % 100), []);\n    ue(() => {\n      var b;\n      (b = c.current) == null || b.fitView({});\n    }, [d]),\n      m4(l, () => ({\n        rerender: h,\n      })),\n      ue(() => {\n        u(Z9(e));\n      }, [e]);\n    const m = ze(\n      () => ({\n        state: s,\n        dispatch: u,\n        rerender: h,\n      }),\n      [s, u, h],\n    );\n    return /* @__PURE__ */ f.jsx(zn.Provider, {\n      value: m,\n      children: /* @__PURE__ */ f.jsxs(\"div\", {\n        className: \"lineage-component\",\n        children: [\n          t === \"sql\" &&\n            n &&\n            /* @__PURE__ */ f.jsx(ww, {\n              flow: c,\n              details: n.details,\n              tableEdges: n.tableEdges,\n              nodePositions: n.nodePositions,\n            }),\n          t === \"dynamic\" &&\n            o &&\n            /* @__PURE__ */ f.jsx(mw, { flow: c, theme: e }),\n          t === \"static\" && r && /* @__PURE__ */ f.jsx(Cw, { flow: c, ...r }),\n          /* @__PURE__ */ f.jsx(\"div\", { id: \"lineage-sidebar\" }),\n        ],\n      }),\n    });\n  },\n  DA = ea(Ew),\n  it = () => Xe(zn),\n  ft = () => {\n    const { dispatch: e } = Xe(zn);\n    return e;\n  },\n  tf = {\n    showCoachingForm: !1,\n  },\n  qs = pc({\n    name: \"teamMate\",\n    initialState: tf,\n    reducers: {\n      setShowCoachingForm: (e, t) => {\n        e.showCoachingForm = t.payload;\n      },\n    },\n  }),\n  Sw = qs.actions,\n  nf = Pt({\n    state: tf,\n    dispatch: () => null,\n  }),\n  jA = ({ children: e }) => {\n    const [t, n] = ic(qs.reducer, qs.getInitialState()),\n      o = ze(\n        () => ({\n          state: t,\n          dispatch: n,\n        }),\n        [t, n],\n      );\n    return /* @__PURE__ */ f.jsx(nf.Provider, { value: o, children: e });\n  },\n  kw = ({\n    errors: e,\n    isSubmitting: t,\n    taskLabel: n,\n    onSuccess: o,\n    onCancel: r,\n  }) => {\n    const { setFieldError: i, values: a, setSubmitting: l } = ud(),\n      s = async () =>\n        await Te.post(\"coach/training\", {\n          ...a,\n          taskLabel: n,\n        }),\n      { mutate: u, error: c } = ro({\n        // @ts-ignore\n        queryFn: s,\n        onSuccess: (d) => {\n          o(d), l(!1);\n        },\n      });\n    return (\n      ue(() => {\n        c != null && c.message && (i(\"content\", c.message), l(!1));\n      }, [c, i]),\n      /* @__PURE__ */ f.jsxs(dd, {\n        children: [\n          /* @__PURE__ */ f.jsx(cs, {\n            name: \"content\",\n            render: ({ field: d }) =>\n              /* @__PURE__ */ f.jsxs(Xn, {\n                children: [\n                  /* @__PURE__ */ f.jsx(Qt, {\n                    type: \"textarea\",\n                    ...d,\n                    placeholder: \"Greet with nice poem\",\n                    invalid: !!e.content,\n                  }),\n                  e.content\n                    ? /* @__PURE__ */ f.jsx(dr, { children: e.content })\n                    : null,\n                ],\n              }),\n          }),\n          /* @__PURE__ */ f.jsxs(Ze, {\n            className: \"justify-content-end\",\n            children: [\n              /* @__PURE__ */ f.jsx(Re, { onClick: r, children: \"Cancel\" }),\n              /* @__PURE__ */ f.jsx(In, {\n                color: \"primary\",\n                loading: t,\n                type: \"submit\",\n                onClick: u,\n                children: \"Coach AI\",\n              }),\n            ],\n          }),\n        ],\n      })\n    );\n  },\n  of = (e, t) => (n) => {\n    const o = e.safeParse(n, t);\n    return o.success\n      ? {}\n      : o.error.issues.reduce((r, i) => {\n          const a = i.path.join(\".\");\n          return Object.assign(Object.assign({}, r), { [a]: i.message });\n        }, {});\n  },\n  _w = Pe.object({\n    content: Pe.string()\n      .min(10, { message: \"Feedback must be at least 10 characters\" })\n      .max(500, { message: \"Feedback must not exceed 500 characters\" })\n      .min(1, { message: \"Feedback is required\" }),\n  }),\n  Aw = ({ taskLabel: e, context: t, onClose: n, extra: o = {} }) => {\n    const [r, i] = se(),\n      [a, l] = se(!1),\n      s = (y) => {\n        i(y);\n      },\n      u = () => {\n        l(!0);\n      },\n      c = () => {\n        l(!1);\n      },\n      d = async () => {\n        if (r)\n          return (\n            c(),\n            await Te.post(\"coach/training/confirm\", {\n              content: r.ai_response,\n              category: r.category,\n              taskLabel: e,\n              personalizationScope: r.personalizationScope,\n              metadata: t,\n              ...o,\n            })\n          );\n      },\n      {\n        mutate: p,\n        error: h,\n        loading: m,\n        data: b,\n      } = ro({\n        // @ts-ignore\n        queryFn: d,\n        onSuccess: () => {\n          l(!1);\n        },\n      });\n    return b != null && b.frontend_url\n      ? /* @__PURE__ */ f.jsxs(Nr, {\n          children: [\n            \"Thank you for coaching Datapilot. Click the link to\",\n            \" \",\n            /* @__PURE__ */ f.jsx(\"a\", {\n              className: \"alert-link\",\n              href: `${b.frontend_url}/teammates/${e}?learning=${b.train_doc_uid}`,\n              children: \"View learnings\",\n            }),\n          ],\n        })\n      : /* @__PURE__ */ f.jsxs(Ze, {\n          direction: \"column\",\n          children: [\n            /* @__PURE__ */ f.jsx(\"p\", {\n              className: \"m-0\",\n              children:\n                \"Here, you can provide instructions in natural language including your terminology, rules or conventions to generate better documentation\",\n            }),\n            /* @__PURE__ */ f.jsx(fd, {\n              initialValues: { content: \"\" },\n              onSubmit: () => {},\n              validate: of(_w),\n              children: (y) =>\n                /* @__PURE__ */ f.jsx(kw, {\n                  ...y,\n                  taskLabel: e,\n                  onSuccess: s,\n                  onCancel: n,\n                }),\n            }),\n            r &&\n              /* @__PURE__ */ f.jsxs(bt, {\n                className: \"mt-4\",\n                children: [\n                  /* @__PURE__ */ f.jsxs(Mt, {\n                    children: [\n                      /* @__PURE__ */ f.jsx(\"p\", {\n                        children:\n                          \"Below are the learnings by AI based on the entered instructions:\",\n                      }),\n                      /* @__PURE__ */ f.jsx(\"div\", {\n                        children: a\n                          ? /* @__PURE__ */ f.jsx(Qt, {\n                              type: \"textarea\",\n                              value: r.ai_response,\n                              onChange: (y) => {\n                                i({\n                                  ...r,\n                                  ai_response: y.target.value,\n                                });\n                              },\n                              style: { fieldSizing: \"content\" },\n                            })\n                          : r.ai_response,\n                      }),\n                      h &&\n                        /* @__PURE__ */ f.jsx(\"div\", {\n                          className: \"text-danger\",\n                          children: h.message,\n                        }),\n                    ],\n                  }),\n                  /* @__PURE__ */ f.jsxs(ld, {\n                    className: \"d-flex justify-content-end mt-2 gap-2 border-0\",\n                    children: [\n                      a\n                        ? /* @__PURE__ */ f.jsx(Re, {\n                            variant: \"secondary\",\n                            onClick: c,\n                            children: \"Cancel\",\n                          })\n                        : /* @__PURE__ */ f.jsx(Re, {\n                            variant: \"secondary\",\n                            onClick: u,\n                            children: \"Edit\",\n                          }),\n                      /* @__PURE__ */ f.jsx(In, {\n                        loading: m,\n                        onClick: p,\n                        color: \"primary\",\n                        children: \"Save\",\n                      }),\n                    ],\n                  }),\n                ],\n              }),\n          ],\n        });\n  },\n  Mw =\n    \"data:image/svg+xml,%3csvg%20width='60'%20height='60'%20viewBox='0%200%2060%2060'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_3491_2633)'%3e%3crect%20width='60'%20height='60'%20rx='30'%20fill='%2317C8BD'/%3e%3cpath%20d='M34.4609%2042.5897H24.9293V49.0222H34.4609V42.5897Z'%20fill='%23D2F8F6'/%3e%3cpath%20d='M28.9742%2017.7254V13.3694C28.1403%2013.0716%2031.2476%2013.0735%2030.4119%2013.3719V17.7254C32.0937%2017.7254%2034.6797%2020.4627%2034.6797%2023.4275H24.7097C24.7097%2020.4627%2026.8583%2017.7254%2028.9742%2017.7254Z'%20fill='%23DCEFFF'/%3e%3cpath%20d='M47.5595%2035.9226C47.5595%2042.2267%2045.0803%2044.7184%2038.8126%2044.7184H20.5772C14.3095%2044.7184%2011.834%2042.2267%2011.834%2035.9226V27.3128C11.834%2021.0087%2014.3095%2018.5173%2020.5772%2018.5173H38.8126C45.0803%2018.5173%2047.5595%2021.0087%2047.5595%2027.3128V35.9226Z'%20fill='white'/%3e%3cpath%20d='M38.8126%2018.5173H36.9574C43.2251%2018.5173%2045.7039%2021.0087%2045.7039%2027.3128V35.9226C45.7039%2042.2267%2043.2251%2044.7184%2036.9574%2044.7184H38.8126C45.0804%2044.7184%2047.5595%2042.2267%2047.5595%2035.9226V27.3128C47.5595%2021.0087%2045.0804%2018.5173%2038.8126%2018.5173Z'%20fill='%23D2F8F6'/%3e%3cpath%20d='M45.733%2026.396C48.0253%2026.7113%2049.6943%2026.766%2049.6943%2031.3074C49.6943%2035.7629%2048.177%2035.7795%2046.0489%2036.1664L45.733%2026.396Z'%20fill='%23D2F8F6'/%3e%3cpath%20d='M13.6556%2026.396C11.3627%2026.7113%209.69427%2026.766%209.69427%2031.3074C9.69427%2035.7629%2011.2116%2035.7795%2013.3394%2036.1664L13.6556%2026.396Z'%20fill='white'/%3e%3cpath%20d='M38.8095%2047.7854H20.5741C14.3064%2047.7854%2011.8312%2050.2758%2011.8312%2056.5797V60.0486H47.557V56.5797C47.557%2050.2758%2045.0779%2047.7854%2038.8095%2047.7854Z'%20fill='white'/%3e%3cpath%20d='M38.8098%2047.7854H36.6893C42.2315%2047.7854%2044.8113%2049.7327%2045.3351%2054.5403C46.5328%2053.7567%2047.2495%2053.2474%2047.2495%2053.2474C46.415%2049.3802%2043.8254%2047.7854%2038.8098%2047.7854Z'%20fill='%23D2F8F6'/%3e%3cpath%20d='M21.3422%2038.6945C17.4867%2038.6945%2016.206%2037.4049%2016.206%2033.5269V29.7949C16.206%2025.9172%2017.4867%2024.6289%2021.3422%2024.6289H37.9879C41.8153%2024.6289%2043.0768%2025.8703%2043.1229%2029.708C43.1229%2029.7369%2043.1232%2033.5269%2043.1232%2033.5269C43.1232%2037.4049%2041.8443%2038.6945%2037.9879%2038.6945H21.3422Z'%20fill='%23D2F8F6'/%3e%3cpath%20d='M31.8467%2011.3337C31.8467%2010.1384%2030.8843%209.17032%2029.6966%209.17032C28.5092%209.17032%2027.5465%2010.1384%2027.5465%2011.3337C27.5465%2012.5284%2028.5092%2013.4969%2029.6966%2013.4969C30.8843%2013.4969%2031.8467%2012.5284%2031.8467%2011.3337Z'%20fill='white'/%3e%3cpath%20d='M34.6804%2021.6058C34.3584%2019.2376%2034.3032%2017.5154%2029.6685%2017.5154C25.1211%2017.5154%2025.1046%2019.0816%2024.7096%2021.2794L34.6804%2021.6058Z'%20fill='white'/%3e%3cpath%20d='M26%2032C26%2030.8937%2025.1025%2030%2023.9993%2030C22.8942%2030%2022%2030.8937%2022%2032C22%2033.1053%2022.8942%2034%2023.9993%2034C25.1025%2034%2026%2033.1053%2026%2032Z'%20fill='%2317C8BD'/%3e%3cpath%20d='M39%2032C39%2030.8937%2038.1025%2030%2036.9993%2030C35.8942%2030%2035%2030.8937%2035%2032C35%2033.1053%2035.8942%2034%2036.9993%2034C38.1025%2034%2039%2033.1053%2039%2032Z'%20fill='%2317C8BD'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_3491_2633'%3e%3crect%20width='60'%20height='60'%20rx='30'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\",\n  Tw =\n    \"data:image/svg+xml,%3csvg%20width='61'%20height='60'%20viewBox='0%200%2061%2060'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_3491_1655)'%3e%3crect%20x='0.666626'%20width='60'%20height='60'%20rx='30'%20fill='%235B41C6'/%3e%3cpath%20d='M33.8213%2046.1095H27.1435V52.8819H33.8213V46.1095Z'%20fill='%23E4D8FF'/%3e%3cpath%20d='M48.1175%2019.1401H46.8699V27.1459H48.1175V19.1401Z'%20fill='%23E4D8FF'/%3e%3cpath%20d='M49.7231%2018.0581C49.7231%2016.8318%2048.7257%2015.8376%2047.4932%2015.8376C46.2613%2015.8376%2045.2629%2016.8318%2045.2629%2018.0581C45.2629%2019.285%2046.2613%2020.2786%2047.4932%2020.2786C48.7257%2020.2786%2049.7231%2019.285%2049.7231%2018.0581Z'%20fill='white'/%3e%3cpath%20d='M14.0958%2019.1401H12.8488V27.1459H14.0958V19.1401Z'%20fill='%23E4D8FF'/%3e%3cpath%20d='M15.702%2018.0582C15.702%2016.8318%2014.7046%2015.8376%2013.4724%2015.8376C12.2405%2015.8376%2011.2418%2016.8318%2011.2418%2018.0582C11.2418%2019.2851%2012.2405%2020.2787%2013.4724%2020.2787C14.7046%2020.2787%2015.702%2019.2851%2015.702%2018.0582Z'%20fill='white'/%3e%3cpath%20d='M50.4827%2031.4187C50.4827%2031.3291%2050.4802%2030.2722%2050.475%2030.1838C50.3359%2027.6526%2048.2302%2026.6111%2045.653%2026.6111C43.0763%2026.6111%2040.9707%2028.096%2040.8313%2030.6269C40.8267%2030.7153%2040.8242%2031.3291%2040.8242%2031.4187C40.8242%2031.5047%2040.826%2032.5585%2040.8307%2032.6438C40.9649%2035.1797%2043.073%2036.6698%2045.653%2036.6698C48.2339%2036.6698%2050.3414%2035.6228%2050.4756%2033.0872C50.4802%2033.0012%2050.4827%2031.5047%2050.4827%2031.4187Z'%20fill='%23E4D8FF'/%3e%3cpath%20d='M46.627%2031.9094C46.627%2031.6098%2046.6181%2029.5587%2046.6023%2029.2634C46.1372%2020.8013%2039.0976%2015.8376%2030.4828%2015.8376C21.8675%2015.8376%2014.8291%2020.8013%2014.3637%2029.2634C14.3467%2029.5587%2014.3384%2031.6098%2014.3384%2031.9094C14.3384%2032.1983%2014.3461%2034.2383%2014.3615%2034.523C14.8106%2042.9992%2021.8564%2047.9809%2030.4828%2047.9809C39.109%2047.9809%2046.1548%2042.9992%2046.6042%2034.523C46.6193%2034.2383%2046.627%2032.1983%2046.627%2031.9094Z'%20fill='white'/%3e%3cpath%20d='M46.7532%2029.2634C46.2878%2020.8013%2039.2491%2015.8376%2030.6335%2015.8376C30.3296%2015.8376%2030.0295%2015.8456%2029.7291%2015.8579C37.9278%2016.1938%2044.4955%2021.0997%2044.9443%2029.2634C44.9606%2029.5587%2044.969%2031.6098%2044.969%2031.9094C44.969%2032.1983%2044.9619%2034.2383%2044.9464%2034.523C44.5131%2042.7007%2037.9383%2047.6244%2029.7291%2047.9612C30.0295%2047.9735%2030.3296%2047.9809%2030.6335%2047.9809C39.2596%2047.9809%2046.3057%2042.9992%2046.7554%2034.523C46.7708%2034.2383%2046.7779%2032.1983%2046.7779%2031.9094C46.7779%2031.6098%2046.7696%2029.5587%2046.7532%2029.2634Z'%20fill='%23E4D8FF'/%3e%3cpath%20d='M20.1412%2031.4187C20.1412%2031.3291%2020.139%2030.7153%2020.1341%2030.6269C19.9947%2028.096%2017.8891%2026.6111%2015.3118%2026.6111C12.7349%2026.6111%2010.6295%2027.8743%2010.4901%2030.4055C10.4852%2030.4939%2010.4827%2031.3291%2010.4827%2031.4187C10.4827%2031.5047%2010.4846%2032.7799%2010.4895%2032.8655C10.6234%2035.4011%2012.7315%2036.6698%2015.3118%2036.6698C17.8924%2036.6698%2020%2035.1797%2020.1341%2032.6438C20.139%2032.5585%2020.1412%2031.5047%2020.1412%2031.4187Z'%20fill='white'/%3e%3cpath%20d='M30.5584%2043.314C25.2513%2043.314%2018.922%2040.807%2018.5374%2033.7453C18.5275%2033.4291%2018.5195%2032.3197%2018.5195%2031.8736C18.5195%2031.4404%2018.5287%2029.7529%2018.5392%2029.4314C18.939%2022.3882%2025.2611%2020.6506%2030.5584%2020.6506C35.856%2020.6506%2042.1785%2022.3882%2042.5773%2029.4311C42.5878%2029.7538%2042.5974%2031.441%2042.5974%2031.8736C42.5974%2032.3044%2042.5884%2033.4303%2042.5792%2033.7472C42.1927%2040.8085%2035.864%2043.314%2030.5584%2043.314Z'%20fill='%23E4D8FF'/%3e%3cpath%20d='M26.6666%2032C26.6666%2030.8937%2025.7691%2030%2024.6659%2030C23.5608%2030%2022.6666%2030.8937%2022.6666%2032C22.6666%2033.1053%2023.5608%2034%2024.6659%2034C25.7691%2034%2026.6666%2033.1053%2026.6666%2032Z'%20fill='%235B41C6'/%3e%3cpath%20d='M37.6666%2032C37.6666%2030.8937%2036.7691%2030%2035.6659%2030C34.5608%2030%2033.6666%2030.8937%2033.6666%2032C33.6666%2033.1053%2034.5608%2034%2035.6659%2034C36.7691%2034%2037.6666%2033.1053%2037.6666%2032Z'%20fill='%235B41C6'/%3e%3cpath%20d='M30.4829%2050.1974C35.7897%2050.1974%2042.119%2052.7038%2042.5036%2059.7655C42.5135%2060.0814%2042.5218%2061.1917%2042.5218%2061.6372C42.5218%2062.0701%2042.5123%2063.7585%2042.5024%2064.0791C42.1021%2071.1223%2035.7799%2072.2596%2030.4829%2072.2596C25.185%2072.2596%2018.8622%2071.123%2018.4636%2064.0803C18.4532%2063.7567%2018.4439%2062.0695%2018.4439%2061.6372C18.4439%2061.2061%2018.4526%2060.0802%2018.4624%2059.7642C18.8486%2052.702%2025.1769%2050.1974%2030.4829%2050.1974Z'%20fill='white'/%3e%3cpath%20d='M49.0578%2018.4398C49.0578%2017.2457%2048.0856%2016.2792%2046.8892%2016.2792C46.5882%2016.2792%2046.3007%2016.3406%2046.0407%2016.4505C46.4315%2016.0716%2046.965%2015.8376%2047.5545%2015.8376C48.7509%2015.8376%2049.723%2016.8042%2049.723%2017.998C49.723%2018.8933%2049.1771%2019.6603%2048.3992%2019.9888C48.8058%2019.5965%2049.0578%2019.0481%2049.0578%2018.4398Z'%20fill='%23E4D8FF'/%3e%3cpath%20d='M15.0371%2018.4398C15.0371%2017.2457%2014.0649%2016.2792%2012.8682%2016.2792C12.5672%2016.2792%2012.28%2016.3406%2012.0197%2016.4505C12.4105%2016.0716%2012.9441%2015.8376%2013.5338%2015.8376C14.7299%2015.8376%2015.7021%2016.8042%2015.7021%2017.998C15.7021%2018.8933%2015.1565%2019.6603%2014.3786%2019.9888C14.7848%2019.5965%2015.0371%2019.0481%2015.0371%2018.4398Z'%20fill='%23E4D8FF'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_3491_1655'%3e%3crect%20x='0.666626'%20width='60'%20height='60'%20rx='30'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\",\n  Ow =\n    \"data:image/svg+xml,%3csvg%20width='61'%20height='60'%20viewBox='0%200%2061%2060'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_3491_1707)'%3e%3crect%20x='0.333374'%20width='60'%20height='60'%20rx='30'%20fill='%2341C676'/%3e%3cpath%20d='M34.7918%2043.7001H25.262V50.1142H34.7918V43.7001Z'%20fill='%23DBFFE9'/%3e%3cpath%20d='M44.3289%2035.8214C47.4632%2035.8214%2050.0268%2035.0784%2050.0268%2030.8222C50.0268%2026.5976%2047.4632%2025.8232%2044.3289%2025.8232V35.8214Z'%20fill='%23DBFFE9'/%3e%3cpath%20d='M12.1643%2033.3777C12.1643%2039.6628%2017.2916%2044.8045%2023.5578%2044.8045H36.4957C42.7625%2044.8045%2047.8898%2039.6628%2047.8898%2033.3777V30.1092C47.8898%2023.8238%2042.7625%2018.6824%2036.4957%2018.6824H23.5578C17.2916%2018.6824%2012.1643%2023.8238%2012.1643%2030.1092V33.3777Z'%20fill='%23FFFCFD'/%3e%3cpath%20d='M36.2625%2038.6511C40.1176%2038.6511%2043.2541%2035.5057%2043.2541%2031.6401C43.2541%2027.7735%2040.1176%2024.6288%2036.2625%2024.6288H23.3247C19.4705%2024.6288%2016.3334%2027.7735%2016.3334%2031.6401C16.3334%2035.5057%2019.4705%2038.6511%2023.3247%2038.6511H36.2625Z'%20fill='%23DBFFE9'/%3e%3cpath%20d='M35.0116%2022.9674C35.0116%2019.8248%2034.271%2017.254%2030.0264%2017.254C25.8144%2017.254%2025.0416%2019.8248%2025.0416%2022.9674H35.0116Z'%20fill='%23FFFCFD'/%3e%3cpath%20d='M27.8734%2010.9127C27.8734%209.71947%2028.8385%208.75259%2030.0265%208.75259C31.2175%208.75259%2032.1826%209.71947%2032.1826%2010.9127C32.1826%2012.1074%2031.2175%2013.0739%2030.0265%2013.0739C28.8385%2013.0739%2027.8734%2012.1074%2027.8734%2010.9127Z'%20fill='%23FFFCFD'/%3e%3cpath%20d='M31.5221%2011.3548C31.5221%2010.1607%2030.5571%209.19412%2029.3694%209.19412C29.0706%209.19412%2028.7855%209.25556%2028.5271%209.36516C28.915%208.98658%2029.4447%208.75259%2030.0298%208.75259C31.2175%208.75259%2032.1826%209.71947%2032.1826%2010.9127C32.1826%2011.8086%2031.6409%2012.5759%2030.8687%2012.9041C31.272%2012.5114%2031.5221%2011.9634%2031.5221%2011.3548Z'%20fill='%23D8FFF2'/%3e%3cpath%20d='M30.7466%2012.4755H29.3079V17.8941H30.7466V12.4755Z'%20fill='%23FFFCFD'/%3e%3cpath%20d='M36.4963%2018.6824H33.9094C39.1512%2018.6824%2045.4817%2023.8238%2045.4817%2030.1092V33.3777C45.4817%2039.6628%2039.9154%2044.8045%2033.6473%2044.8045H36.4963C42.7631%2044.8045%2047.8898%2039.6628%2047.8898%2033.3777V30.1092C47.8898%2023.8238%2042.7631%2018.6824%2036.4963%2018.6824Z'%20fill='%23DBFFE9'/%3e%3cpath%20d='M13.9897%2025.9258C11.6977%2026.2399%2010.0269%2027.3867%2010.0269%2030.8222C10.0269%2034.074%2011.5455%2035.2816%2013.6737%2035.6657C14.0613%2035.7355%2014.3498%2025.8766%2013.9897%2025.9258Z'%20fill='%23FFFCFD'/%3e%3cpath%20d='M26.3334%2032C26.3334%2030.8937%2025.4359%2030%2024.3328%2030C23.2276%2030%2022.3334%2030.8937%2022.3334%2032C22.3334%2033.1053%2023.2276%2034%2024.3328%2034C25.4359%2034%2026.3334%2033.1053%2026.3334%2032Z'%20fill='%2341C676'/%3e%3cpath%20d='M38.3334%2032C38.3334%2030.8937%2037.4359%2030%2036.3328%2030C35.2276%2030%2034.3334%2030.8937%2034.3334%2032C34.3334%2033.1053%2035.2276%2034%2036.3328%2034C37.4359%2034%2038.3334%2033.1053%2038.3334%2032Z'%20fill='%2341C676'/%3e%3cpath%20d='M41.0027%2056.5086C41.0027%2051.3979%2037.1179%2048.2255%2030.0274%2048.2255C22.9933%2048.2255%2019.0515%2051.3979%2019.0515%2056.5086C19.0515%2061.6178%2024.9304%2060.5907%2030.0274%2060.5907C35.1234%2060.5907%2041.0027%2061.6178%2041.0027%2056.5086Z'%20fill='%23FFFCFD'/%3e%3cpath%20d='M38.808%2056.5087C38.808%2056.8363%2038.7839%2057.1386%2038.7373%2057.4175C40.2603%2056.9425%2041.0018%2056.6238%2041.0018%2056.6238C41.0024%2056.5857%2041.0027%2056.5473%2041.0027%2056.5087C41.0027%2052.6943%2038.8388%2049.9598%2034.7933%2048.8179C34.7933%2048.8179%2038.808%2050.1729%2038.808%2056.5087Z'%20fill='%23DBFFE9'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_3491_1707'%3e%3crect%20x='0.333374'%20width='60'%20height='60'%20rx='30'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\",\n  h0 =\n    \"data:image/svg+xml,%3csvg%20width='60'%20height='60'%20viewBox='0%200%2060%2060'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_3536_7181)'%3e%3crect%20width='60'%20height='60'%20rx='30'%20fill='%23FFC125'/%3e%3cpath%20d='M33.3384%2045.6643H26.6606V52.4674H33.3384V45.6643Z'%20fill='%23FFF5DD'/%3e%3cpath%20d='M47.6346%2018.573H46.387V26.615H47.6346V18.573Z'%20fill='%23FFF5DD'/%3e%3cpath%20d='M49.2402%2017.4861C49.2402%2016.2542%2048.2428%2015.2556%2047.0103%2015.2556C45.7784%2015.2556%2044.7801%2016.2542%2044.7801%2017.4861C44.7801%2018.7186%2045.7784%2019.7167%2047.0103%2019.7167C48.2428%2019.7167%2049.2402%2018.7186%2049.2402%2017.4861Z'%20fill='white'/%3e%3cpath%20d='M13.613%2018.573H12.366V26.615H13.613V18.573Z'%20fill='%23FFF5DD'/%3e%3cpath%20d='M15.2193%2017.4861C15.2193%2016.2542%2014.2218%2015.2556%2012.9896%2015.2556C11.7577%2015.2556%2010.759%2016.2542%2010.759%2017.4861C10.759%2018.7186%2011.7577%2019.7167%2012.9896%2019.7167C14.2218%2019.7167%2015.2193%2018.7186%2015.2193%2017.4861Z'%20fill='white'/%3e%3cpath%20d='M50%2030.9072C50%2030.8171%2049.9975%2029.7555%2049.9923%2029.6667C49.8532%2027.124%2047.7475%2026.0778%2045.1703%2026.0778C42.5937%2026.0778%2040.488%2027.5693%2040.3486%2030.1117C40.344%2030.2005%2040.3415%2030.8171%2040.3415%2030.9072C40.3415%2030.9935%2040.3434%2032.052%2040.348%2032.1378C40.4822%2034.6851%2042.5903%2036.1819%2045.1703%2036.1819C47.7512%2036.1819%2049.8588%2035.1302%2049.9929%2032.5832C49.9975%2032.4968%2050%2030.9935%2050%2030.9072Z'%20fill='%23FFF5DD'/%3e%3cpath%20d='M46.1442%2031.4C46.1442%2031.099%2046.1353%2029.0387%2046.1196%2028.742C45.6544%2020.2416%2038.6148%2015.2556%2030.0001%2015.2556C21.3847%2015.2556%2014.3463%2020.2416%2013.8809%2028.742C13.8639%2029.0387%2013.8556%2031.099%2013.8556%2031.4C13.8556%2031.6902%2013.8633%2033.7395%2013.8788%2034.0254C14.3278%2042.5399%2021.3736%2047.5442%2030.0001%2047.5442C38.6262%2047.5442%2045.672%2042.5399%2046.1214%2034.0254C46.1365%2033.7395%2046.1442%2031.6902%2046.1442%2031.4Z'%20fill='white'/%3e%3cpath%20d='M46.2704%2028.742C45.805%2020.2416%2038.7663%2015.2556%2030.1506%2015.2556C29.8468%2015.2556%2029.5467%2015.2636%2029.2463%2015.2759C37.445%2015.6133%2044.0127%2020.5414%2044.4615%2028.742C44.4778%2029.0387%2044.4861%2031.099%2044.4861%2031.4C44.4861%2031.6902%2044.479%2033.7395%2044.4636%2034.0254C44.0303%2042.2401%2037.4555%2047.1861%2029.2463%2047.5244C29.5467%2047.5368%2029.8468%2047.5442%2030.1506%2047.5442C38.7768%2047.5442%2045.8229%2042.5399%2046.2726%2034.0254C46.288%2033.7395%2046.2951%2031.6902%2046.2951%2031.4C46.2951%2031.099%2046.2868%2029.0387%2046.2704%2028.742Z'%20fill='%23FFF5DD'/%3e%3cpath%20d='M19.6585%2030.9072C19.6585%2030.8171%2019.6563%2030.2005%2019.6514%2030.1117C19.512%2027.5693%2017.4063%2026.0778%2014.8291%2026.0778C12.2522%2026.0778%2010.1468%2027.3466%2010.0074%2029.8894C10.0025%2029.9782%2010%2030.8171%2010%2030.9072C10%2030.9935%2010.0019%2032.2744%2010.0068%2032.3605C10.1406%2034.9075%2012.2488%2036.1819%2014.8291%2036.1819C17.4097%2036.1819%2019.5172%2034.6851%2019.6514%2032.1378C19.6563%2032.052%2019.6585%2030.9935%2019.6585%2030.9072Z'%20fill='white'/%3e%3cpath%20d='M30%2042.8922C24.6929%2042.8922%2018.3636%2040.3739%2017.979%2033.2803C17.9691%2032.9626%2017.9611%2031.8482%2017.9611%2031.4001C17.9611%2030.9649%2017.9703%2029.2698%2017.9808%2028.9468C18.3806%2021.8717%2024.7027%2020.1263%2030%2020.1263C35.2976%2020.1263%2041.6201%2021.8717%2042.019%2028.9465C42.0294%2029.2707%2042.039%2030.9655%2042.039%2031.4001C42.039%2031.8328%2042.03%2032.9638%2042.0208%2033.2821C41.6343%2040.3754%2035.3056%2042.8922%2030%2042.8922Z'%20fill='%23FFF5DD'/%3e%3cpath%20d='M25.7771%2031.8109C25.7771%2030.7644%2024.928%2029.919%2023.8843%2029.919C22.8387%2029.919%2021.9927%2030.7644%2021.9927%2031.8109C21.9927%2032.8565%2022.8387%2033.7028%2023.8843%2033.7028C24.928%2033.7028%2025.7771%2032.8565%2025.7771%2031.8109Z'%20fill='%23FFC125'/%3e%3cpath%20d='M38.0072%2031.8109C38.0072%2030.7644%2037.1618%2029.919%2036.1153%2029.919C35.0697%2029.919%2034.2234%2030.7644%2034.2234%2031.8109C34.2234%2032.8565%2035.0697%2033.7028%2036.1153%2033.7028C37.1618%2033.7028%2038.0072%2032.8565%2038.0072%2031.8109Z'%20fill='%23FFC125'/%3e%3cpath%20d='M30%2049.7708C35.3069%2049.7708%2041.6362%2052.2885%2042.0208%2059.3821C42.0307%2059.6995%2042.039%2060.8148%2042.039%2061.2623C42.039%2061.6972%2042.0294%2063.3932%2042.0195%2063.7153C41.6192%2070.7903%2035.297%2071.9328%2030%2071.9328C24.7021%2071.9328%2018.3793%2070.791%2017.9808%2063.7165C17.9703%2063.3914%2017.9611%2061.6966%2017.9611%2061.2623C17.9611%2060.8293%2017.9697%2059.6982%2017.9796%2059.3809C18.3657%2052.2867%2024.6941%2049.7708%2030%2049.7708Z'%20fill='white'/%3e%3cpath%20d='M48.575%2017.8695C48.575%2016.67%2047.6028%2015.6991%2046.4064%2015.6991C46.1054%2015.6991%2045.8179%2015.7608%2045.558%2015.8712C45.9487%2015.4906%2046.4823%2015.2556%2047.0717%2015.2556C48.2681%2015.2556%2049.2403%2016.2265%2049.2403%2017.4257C49.2403%2018.325%2048.6944%2019.0955%2047.9165%2019.4255C48.323%2019.0314%2048.575%2018.4805%2048.575%2017.8695Z'%20fill='%23FFF5DD'/%3e%3cpath%20d='M14.5541%2017.8695C14.5541%2016.67%2013.5819%2015.6991%2012.3852%2015.6991C12.0842%2015.6991%2011.797%2015.7608%2011.5367%2015.8712C11.9275%2015.4906%2012.4611%2015.2556%2013.0508%2015.2556C14.2469%2015.2556%2015.2191%2016.2265%2015.2191%2017.4257C15.2191%2018.325%2014.6735%2019.0955%2013.8956%2019.4255C14.3018%2019.0314%2014.5541%2018.4805%2014.5541%2017.8695Z'%20fill='%23FFF5DD'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_3536_7181'%3e%3crect%20width='60'%20height='60'%20rx='30'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\",\n  Nw = (e) =>\n    /* @__PURE__ */ O.createElement(\n      \"svg\",\n      {\n        width: 131,\n        height: 131,\n        viewBox: \"0 0 131 131\",\n        fill: \"none\",\n        xmlns: \"http://www.w3.org/2000/svg\",\n        ...e,\n      },\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M65 130C100.899 130 130 100.899 130 65C130 29.1015 100.899 0 65 0C29.1015 0 0 29.1015 0 65C0 100.899 29.1015 130 65 130Z\",\n        fill: \"#EAEEF9\",\n      }),\n      /* @__PURE__ */ O.createElement(\n        \"mask\",\n        {\n          id: \"mask0_3506_13710\",\n          style: {\n            maskType: \"alpha\",\n          },\n          maskUnits: \"userSpaceOnUse\",\n          x: -1,\n          y: -1,\n          width: 132,\n          height: 132,\n        },\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M65 130C100.899 130 130 100.899 130 65C130 29.1015 100.899 0 65 0C29.1015 0 0 29.1015 0 65C0 100.899 29.1015 130 65 130Z\",\n          fill: \"#F1F3F9\",\n          stroke: \"#D6DCE8\",\n          strokeWidth: 2,\n          strokeMiterlimit: 10,\n        }),\n      ),\n      /* @__PURE__ */ O.createElement(\n        \"g\",\n        { mask: \"url(#mask0_3506_13710)\" },\n        /* @__PURE__ */ O.createElement(\n          \"g\",\n          { filter: \"url(#filter0_d_3506_13710)\" },\n          /* @__PURE__ */ O.createElement(\"path\", {\n            d: \"M110.116 47.3781L111.286 125.57C111.286 128.145 109.179 130.252 106.37 130.252H30.051C27.4758 130.252 25.1348 128.145 25.1348 125.57V25.138C25.1348 22.5628 27.2417 20.4559 30.051 20.4559H85.3002L110.116 47.3781Z\",\n            fill: \"url(#paint0_linear_3506_13710)\",\n          }),\n        ),\n        /* @__PURE__ */ O.createElement(\"path\", {\n          d: \"M85.3008 20.4559V41.9937C85.3008 45.0371 87.876 47.3782 90.9193 47.3782H110.116\",\n          fill: \"#D5DDEA\",\n        }),\n      ),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M119.221 27.592L120.664 26.951C121.144 26.7908 121.144 26.1498 120.664 25.9896L119.221 25.3486C117.459 24.5475 116.017 23.1053 115.215 21.3427L114.575 19.9006C114.414 19.4199 113.773 19.4199 113.613 19.9006L112.972 21.3427C112.171 23.1053 110.729 24.5475 108.966 25.3486L107.524 25.9896C107.043 26.1498 107.043 26.7908 107.524 26.951L108.966 27.592C110.729 28.3931 112.171 29.8353 112.972 31.5979L113.613 33.04C113.773 33.5207 114.414 33.5207 114.575 33.04L115.215 31.5979C115.856 29.8353 117.299 28.3931 119.221 27.592Z\",\n        fill: \"#989FB0\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M103.678 18.4585L104.64 17.9777C104.96 17.8175 104.96 17.497 104.64 17.3368L103.678 17.0163C102.397 16.5356 101.435 15.5742 100.954 14.2923L100.474 13.3309C100.313 13.0104 99.993 13.0104 99.8327 13.3309L99.5123 14.2923C98.8713 15.5742 97.9099 16.5356 96.7882 17.0163L95.6666 17.497C95.5063 17.497 95.5063 17.9777 95.6666 17.9777L96.628 18.4585C97.9099 18.9392 98.8713 19.9006 99.5123 21.1825L99.993 22.1439C100.153 22.4644 100.474 22.4644 100.634 22.1439L100.954 21.1825C101.435 19.9006 102.397 18.9392 103.678 18.4585Z\",\n        fill: \"#989FB0\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M116.016 9.16483L116.817 8.84435C116.978 8.68412 116.978 8.52388 116.817 8.36364L116.016 8.04317C115.055 7.7227 114.414 6.92151 113.933 5.96009L113.613 5.1589C113.452 4.99867 113.292 4.99867 113.132 5.1589L112.811 5.96009C112.491 6.92151 111.69 7.56246 110.728 8.04317L110.248 8.36364C109.927 8.52388 109.927 8.84435 110.248 8.84435L111.049 9.16483C112.01 9.4853 112.651 10.2865 113.132 11.2479L113.452 12.0491C113.613 12.2093 113.773 12.2093 113.933 12.0491L114.254 11.2479C114.414 10.2865 115.215 9.4853 116.016 9.16483Z\",\n        fill: \"#989FB0\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M53.7864 71.8552C50.2113 71.8552 47.2082 69.5695 46.0642 66.2838C45.7782 65.5695 46.2072 64.8552 46.9222 64.5695C47.6372 64.2838 48.3523 64.7124 48.6383 65.4266C49.3533 67.5695 51.4983 69.1409 53.7864 69.1409C56.0744 69.1409 58.2195 67.7124 58.9345 65.4266C59.2205 64.7124 59.9355 64.2838 60.6506 64.5695C61.3656 64.8552 61.7946 65.5695 61.5086 66.2838C60.3646 69.7124 57.3615 71.8552 53.7864 71.8552Z\",\n        fill: \"#ADB6C8\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M75.3801 71.8552C71.805 71.8552 68.802 69.5695 67.6579 66.2838C67.3719 65.5695 67.8009 64.8552 68.516 64.5695C69.231 64.2838 69.946 64.7124 70.232 65.4266C70.947 67.5695 73.0921 69.1409 75.3801 69.1409C77.6682 69.1409 79.8133 67.7124 80.5283 65.4266C80.8143 64.7124 81.5293 64.2838 82.2443 64.5695C82.9593 64.8552 83.3883 65.5695 83.1023 66.2838C81.9583 69.7124 78.9552 71.8552 75.3801 71.8552Z\",\n        fill: \"#ADB6C8\",\n      }),\n      /* @__PURE__ */ O.createElement(\"path\", {\n        d: \"M64.6548 89.3467C66.4713 89.3467 67.9439 87.8756 67.9439 86.061C67.9439 84.2463 66.4713 82.7752 64.6548 82.7752C62.8383 82.7752 61.3657 84.2463 61.3657 86.061C61.3657 87.8756 62.8383 89.3467 64.6548 89.3467Z\",\n        fill: \"#ADB6C8\",\n      }),\n      /* @__PURE__ */ O.createElement(\n        \"defs\",\n        null,\n        /* @__PURE__ */ O.createElement(\n          \"filter\",\n          {\n            id: \"filter0_d_3506_13710\",\n            x: 3.13477,\n            y: 9.45586,\n            width: 130.151,\n            height: 153.796,\n            filterUnits: \"userSpaceOnUse\",\n            colorInterpolationFilters: \"sRGB\",\n          },\n          /* @__PURE__ */ O.createElement(\"feFlood\", {\n            floodOpacity: 0,\n            result: \"BackgroundImageFix\",\n          }),\n          /* @__PURE__ */ O.createElement(\"feColorMatrix\", {\n            in: \"SourceAlpha\",\n            type: \"matrix\",\n            values: \"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\",\n            result: \"hardAlpha\",\n          }),\n          /* @__PURE__ */ O.createElement(\"feOffset\", { dy: 11 }),\n          /* @__PURE__ */ O.createElement(\"feGaussianBlur\", {\n            stdDeviation: 11,\n          }),\n          /* @__PURE__ */ O.createElement(\"feColorMatrix\", {\n            type: \"matrix\",\n            values:\n              \"0 0 0 0 0.397708 0 0 0 0 0.47749 0 0 0 0 0.575 0 0 0 0.27 0\",\n          }),\n          /* @__PURE__ */ O.createElement(\"feBlend\", {\n            mode: \"normal\",\n            in2: \"BackgroundImageFix\",\n            result: \"effect1_dropShadow_3506_13710\",\n          }),\n          /* @__PURE__ */ O.createElement(\"feBlend\", {\n            mode: \"normal\",\n            in: \"SourceGraphic\",\n            in2: \"effect1_dropShadow_3506_13710\",\n            result: \"shape\",\n          }),\n        ),\n        /* @__PURE__ */ O.createElement(\n          \"linearGradient\",\n          {\n            id: \"paint0_linear_3506_13710\",\n            x1: 68.1823,\n            y1: 17.9162,\n            x2: 68.1823,\n            y2: 131.436,\n            gradientUnits: \"userSpaceOnUse\",\n          },\n          /* @__PURE__ */ O.createElement(\"stop\", { stopColor: \"#FDFEFF\" }),\n          /* @__PURE__ */ O.createElement(\"stop\", {\n            offset: 0.9964,\n            stopColor: \"#ECF0F5\",\n          }),\n        ),\n      ),\n    );\nvar zr = /* @__PURE__ */ ((e) => (\n    (e.DOCUMENTATION = \"documentation\"),\n    (e.TESTS = \"tests\"),\n    (e.MODEL = \"model\"),\n    (e.FILE_STRUCTURE = \"file_structure\"),\n    e\n  ))(zr || {}),\n  rf = /* @__PURE__ */ ((e) => (\n    (e.Manifest = \"Manifest\"), (e.Catalog = \"Catalog\"), e\n  ))(rf || {});\nconst Lw = Pe.object({\n    name: Pe.string(),\n    alias: Pe.string(),\n    type: Pe.enum(Object.values(zr)),\n    description: Pe.string(),\n    files_required: Pe.array(Pe.enum(Object.values(rf))),\n    config: Pe.record(Pe.unknown()),\n  }),\n  Dw = ({ errors: e, isSubmitting: t, onSuccess: n, onCancel: o }) => {\n    var p;\n    const { setFieldError: r, setSubmitting: i, values: a, isValid: l } = ud(),\n      s = async () =>\n        await Te.post(\"project_governance/check/validate\", {\n          ...a,\n        }),\n      { mutate: u, error: c } = ro({\n        // @ts-ignore\n        queryFn: s,\n        onSuccess: (h) => {\n          n(h, a.type), i(!1);\n        },\n      });\n    ue(() => {\n      c != null && c.message && (r(\"content\", c.message), i(!1));\n    }, [c, r]);\n    const d = (h) => {\n      const m = h.target;\n      (m.style.height = \"inherit\"),\n        (m.style.height = `${Math.min(m.scrollHeight + 5, 200)}px`);\n    };\n    return /* @__PURE__ */ f.jsxs(dd, {\n      children: [\n        /* @__PURE__ */ f.jsx(cs, {\n          name: \"description\",\n          render: ({ field: h }) =>\n            /* @__PURE__ */ f.jsxs(Xn, {\n              children: [\n                /* @__PURE__ */ f.jsx(Qt, {\n                  type: \"textarea\",\n                  ...h,\n                  onKeyDown: d,\n                  placeholder: \"Describe the check in natural language\",\n                  invalid: !!e.description,\n                }),\n                e.description\n                  ? /* @__PURE__ */ f.jsx(dr, { children: e.description })\n                  : null,\n              ],\n            }),\n        }),\n        /* @__PURE__ */ f.jsx(cs, {\n          name: \"type\",\n          render: ({ field: h }) =>\n            /* @__PURE__ */ f.jsxs(Xn, {\n              children: [\n                /* @__PURE__ */ f.jsx(bi, { children: \"Type: \" }),\n                /* @__PURE__ */ f.jsx(us, {\n                  style: { width: 200 },\n                  onChange: (m) =>\n                    h.onChange({ target: { value: m, name: h.name } }),\n                  options: Object.entries(zr).map(([, m]) => ({\n                    value: m,\n                    label: m,\n                  })),\n                }),\n              ],\n            }),\n        }),\n        /* @__PURE__ */ f.jsxs(Ze, {\n          className: \"justify-content-end\",\n          children: [\n            /* @__PURE__ */ f.jsx(Re, { onClick: o, children: \"Cancel\" }),\n            /* @__PURE__ */ f.jsx(In, {\n              color: \"primary\",\n              loading: t,\n              type: \"submit\",\n              onClick: u,\n              disabled:\n                !l ||\n                ((p = a == null ? void 0 : a.description) == null\n                  ? void 0\n                  : p.length) === 0,\n              children: \"Submit\",\n            }),\n          ],\n        }),\n      ],\n    });\n  },\n  jw = Pe.object({\n    description: Pe.string()\n      .min(10, { message: \"Description must be at least 10 characters\" })\n      .max(500, { message: \"Description must not exceed 500 characters\" })\n      .min(1, { message: \"Description is required\" }),\n    type: Pe.enum(Object.values(zr)),\n  }),\n  af = ({ onClose: e }) => {\n    const [t, n] = se(),\n      o = (s, u) => {\n        n({ ...s, type: u });\n      },\n      {\n        mutate: r,\n        error: i,\n        loading: a,\n        data: l,\n      } = ro({\n        // @ts-ignore\n        queryFn: () => Te.post(\"project_governance/check\", { ...t }),\n      });\n    return l\n      ? /* @__PURE__ */ f.jsxs(Nr, {\n          children: [\n            \"Project governance check saved successfully\",\n            \" \",\n            /* @__PURE__ */ f.jsx(Re, {\n              onClick: () => e(l),\n              children: \"View\",\n            }),\n          ],\n        })\n      : /* @__PURE__ */ f.jsxs(Ze, {\n          direction: \"column\",\n          children: [\n            /* @__PURE__ */ f.jsx(\"p\", {\n              className: \"m-0\",\n              children:\n                \"Here, you can provide instructions in natural language to create project governance checks\",\n            }),\n            /* @__PURE__ */ f.jsx(fd, {\n              initialValues: {\n                description: \"\",\n                type: zr.MODEL,\n              },\n              onSubmit: () => {},\n              validate: of(jw),\n              children: (s) =>\n                /* @__PURE__ */ f.jsx(Dw, { ...s, onSuccess: o, onCancel: e }),\n            }),\n            t\n              ? /* @__PURE__ */ f.jsxs(bt, {\n                  className: \"mt-4\",\n                  children: [\n                    /* @__PURE__ */ f.jsxs(Mt, {\n                      children: [\n                        /* @__PURE__ */ f.jsx(\"p\", {\n                          children: \"Please validate the following check: \",\n                        }),\n                        /* @__PURE__ */ f.jsx(\"p\", { children: t.name }),\n                        /* @__PURE__ */ f.jsx(\"p\", { children: t.description }),\n                        /* @__PURE__ */ f.jsxs(\"p\", {\n                          children: [\"Type: \", t.type],\n                        }),\n                        i &&\n                          /* @__PURE__ */ f.jsx(\"div\", {\n                            className: \"text-danger\",\n                            children: i.message,\n                          }),\n                      ],\n                    }),\n                    /* @__PURE__ */ f.jsx(ld, {\n                      className:\n                        \"d-flex justify-content-end mt-2 gap-2 border-0\",\n                      children: /* @__PURE__ */ f.jsx(In, {\n                        loading: a,\n                        onClick: r,\n                        color: \"primary\",\n                        children: \"Save\",\n                      }),\n                    }),\n                  ],\n                })\n              : null,\n          ],\n        });\n  };\nvar Kn = {},\n  Fw =\n    (Qn && Qn.__extends) ||\n    /* @__PURE__ */ (function () {\n      var e = function (t, n) {\n        return (\n          (e =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (o, r) {\n                o.__proto__ = r;\n              }) ||\n            function (o, r) {\n              for (var i in r)\n                Object.prototype.hasOwnProperty.call(r, i) && (o[i] = r[i]);\n            }),\n          e(t, n)\n        );\n      };\n      return function (t, n) {\n        if (typeof n != \"function\" && n !== null)\n          throw new TypeError(\n            \"Class extends value \" +\n              String(n) +\n              \" is not a constructor or null\",\n          );\n        e(t, n);\n        function o() {\n          this.constructor = t;\n        }\n        t.prototype =\n          n === null\n            ? Object.create(n)\n            : ((o.prototype = n.prototype), new o());\n      };\n    })(),\n  lf =\n    (Qn && Qn.__awaiter) ||\n    function (e, t, n, o) {\n      function r(i) {\n        return i instanceof n\n          ? i\n          : new n(function (a) {\n              a(i);\n            });\n      }\n      return new (n || (n = Promise))(function (i, a) {\n        function l(c) {\n          try {\n            u(o.next(c));\n          } catch (d) {\n            a(d);\n          }\n        }\n        function s(c) {\n          try {\n            u(o.throw(c));\n          } catch (d) {\n            a(d);\n          }\n        }\n        function u(c) {\n          c.done ? i(c.value) : r(c.value).then(l, s);\n        }\n        u((o = o.apply(e, t || [])).next());\n      });\n    },\n  sf =\n    (Qn && Qn.__generator) ||\n    function (e, t) {\n      var n = {\n          label: 0,\n          sent: function () {\n            if (i[0] & 1) throw i[1];\n            return i[1];\n          },\n          trys: [],\n          ops: [],\n        },\n        o,\n        r,\n        i,\n        a;\n      return (\n        (a = { next: l(0), throw: l(1), return: l(2) }),\n        typeof Symbol == \"function\" &&\n          (a[Symbol.iterator] = function () {\n            return this;\n          }),\n        a\n      );\n      function l(u) {\n        return function (c) {\n          return s([u, c]);\n        };\n      }\n      function s(u) {\n        if (o) throw new TypeError(\"Generator is already executing.\");\n        for (; n; )\n          try {\n            if (\n              ((o = 1),\n              r &&\n                (i =\n                  u[0] & 2\n                    ? r.return\n                    : u[0]\n                      ? r.throw || ((i = r.return) && i.call(r), 0)\n                      : r.next) &&\n                !(i = i.call(r, u[1])).done)\n            )\n              return i;\n            switch (((r = 0), i && (u = [u[0] & 2, i.value]), u[0])) {\n              case 0:\n              case 1:\n                i = u;\n                break;\n              case 4:\n                return n.label++, { value: u[1], done: !1 };\n              case 5:\n                n.label++, (r = u[1]), (u = [0]);\n                continue;\n              case 7:\n                (u = n.ops.pop()), n.trys.pop();\n                continue;\n              default:\n                if (\n                  ((i = n.trys),\n                  !(i = i.length > 0 && i[i.length - 1]) &&\n                    (u[0] === 6 || u[0] === 2))\n                ) {\n                  n = 0;\n                  continue;\n                }\n                if (u[0] === 3 && (!i || (u[1] > i[0] && u[1] < i[3]))) {\n                  n.label = u[1];\n                  break;\n                }\n                if (u[0] === 6 && n.label < i[1]) {\n                  (n.label = i[1]), (i = u);\n                  break;\n                }\n                if (i && n.label < i[2]) {\n                  (n.label = i[2]), n.ops.push(u);\n                  break;\n                }\n                i[2] && n.ops.pop(), n.trys.pop();\n                continue;\n            }\n            u = t.call(e, n);\n          } catch (c) {\n            (u = [6, c]), (r = 0);\n          } finally {\n            o = i = 0;\n          }\n        if (u[0] & 5) throw u[1];\n        return { value: u[0] ? u[1] : void 0, done: !0 };\n      }\n    };\nObject.defineProperty(Kn, \"__esModule\", { value: !0 });\nKn.toFormikValidate =\n  m1 =\n  Kn.toFormikValidationSchema =\n  Kn.ValidationError =\n    void 0;\nvar cf =\n  /** @class */\n  (function (e) {\n    Fw(t, e);\n    function t(n) {\n      var o = e.call(this, n) || this;\n      return (o.name = \"ValidationError\"), (o.inner = []), o;\n    }\n    return t;\n  })(Error);\nKn.ValidationError = cf;\nfunction Rw(e) {\n  var t = new cf(e.message);\n  return (\n    (t.inner = e.errors.map(function (n) {\n      return {\n        message: n.message,\n        path: n.path.join(\".\"),\n      };\n    })),\n    t\n  );\n}\nfunction Iw(e, t) {\n  return {\n    validate: function (n) {\n      return lf(this, void 0, void 0, function () {\n        var o;\n        return sf(this, function (r) {\n          switch (r.label) {\n            case 0:\n              return r.trys.push([0, 2, , 3]), [4, e.parseAsync(n, t)];\n            case 1:\n              return r.sent(), [3, 3];\n            case 2:\n              throw ((o = r.sent()), Rw(o));\n            case 3:\n              return [\n                2,\n                /*return*/\n              ];\n          }\n        });\n      });\n    },\n  };\n}\nvar m1 = (Kn.toFormikValidationSchema = Iw);\nfunction Hw(e) {\n  for (var t = {}, n = 0, o = e.errors; n < o.length; n++) {\n    var r = o[n];\n    t[r.path.filter(Boolean).join(\".\")] = r.message;\n  }\n  return t;\n}\nfunction zw(e, t) {\n  var n = this;\n  return function (o) {\n    return lf(n, void 0, void 0, function () {\n      var r;\n      return sf(this, function (i) {\n        switch (i.label) {\n          case 0:\n            return [4, e.safeParseAsync(o, t)];\n          case 1:\n            return (\n              (r = i.sent()),\n              r.success\n                ? [\n                    2,\n                    /*return*/\n                  ]\n                : [2, Hw(r.error)]\n            );\n        }\n      });\n    });\n  };\n}\nKn.toFormikValidate = zw;\nconst Pw = ({ check: e, refetch: t }) => {\n    const [n, o] = se(!1),\n      [r, i] = x4.useNotification(),\n      a = new URLSearchParams(window.location.search).get(\"id\") === `${e.id}`,\n      {\n        errors: l,\n        isValid: s,\n        isSubmitting: u,\n        handleSubmit: c,\n        values: d,\n        handleChange: p,\n        setSubmitting: h,\n        resetForm: m,\n      } = hd({\n        initialValues: e,\n        validationSchema: m1(Lw),\n        onSubmit: async (v) => {\n          const { id: S, ...w } = v;\n          try {\n            await Te.post(`project_governance/check/${e.id}`, w, {\n              method: \"PUT\",\n            }),\n              o(!1),\n              h(!1),\n              t();\n          } catch (E) {\n            r.error({\n              message: \"Failed to update project governance check\",\n              description: E.message || E,\n            });\n          }\n        },\n      }),\n      { mutate: b, loading: y } = ro({\n        queryFn: (v) =>\n          Te.post(\n            `project_governance/check/${e.id}`,\n            { data: { check_name: v } },\n            { method: \"DELETE\" },\n          ),\n        onSuccess: () => {\n          t();\n        },\n      }),\n      g = () => {\n        o(!0);\n      },\n      x = () => {\n        o(!1), m();\n      };\n    return /* @__PURE__ */ f.jsxs(bt, {\n      color: a ? \"primary\" : \"\",\n      style: { borderWidth: 1 },\n      outline: !0,\n      children: [\n        i,\n        /* @__PURE__ */ f.jsxs(\"form\", {\n          onSubmit: c,\n          children: [\n            /* @__PURE__ */ f.jsxs(Io, {\n              className: \"px-3 pt-3 mb-0 d-flex justify-content-between\",\n              children: [\n                n\n                  ? /* @__PURE__ */ f.jsxs(Xn, {\n                      children: [\n                        /* @__PURE__ */ f.jsx(Qt, {\n                          name: \"name\",\n                          value: d.name,\n                          placeholder: \"Project governance check name...\",\n                          invalid: !!l.name,\n                          onChange: p,\n                        }),\n                        l.name\n                          ? /* @__PURE__ */ f.jsx(dr, { children: l.name })\n                          : null,\n                      ],\n                    })\n                  : e.name,\n                /* @__PURE__ */ f.jsx(Ze, {\n                  className: \"gap-0 align-items-center\",\n                  children: n\n                    ? /* @__PURE__ */ f.jsxs(Ze, {\n                        children: [\n                          /* @__PURE__ */ f.jsx(Re, {\n                            onClick: x,\n                            outline: !0,\n                            size: \"sm\",\n                            children: \"Cancel\",\n                          }),\n                          /* @__PURE__ */ f.jsx(In, {\n                            size: \"sm\",\n                            color: \"primary\",\n                            loading: u,\n                            disabled: u || !s,\n                            type: \"submit\",\n                            children: \"Save\",\n                          }),\n                        ],\n                      })\n                    : /* @__PURE__ */ f.jsxs(f.Fragment, {\n                        children: [\n                          /* @__PURE__ */ f.jsx(jn, {\n                            title: \"Edit this learning\",\n                            onClick: g,\n                            children: /* @__PURE__ */ f.jsx(jd, {}),\n                          }),\n                          /* @__PURE__ */ f.jsx(pd, {\n                            title: \"Delete the check\",\n                            description: \"Are you sure to delete this check?\",\n                            onConfirm: () => b(e.name),\n                            okText: \"Yes\",\n                            cancelText: \"No\",\n                            children: /* @__PURE__ */ f.jsx(In, {\n                              title: \"Delete check\",\n                              color: \"link\",\n                              className: \"py-0 px-1\",\n                              loading: y,\n                              children: /* @__PURE__ */ f.jsx(Cc, {}),\n                            }),\n                          }),\n                        ],\n                      }),\n                }),\n              ],\n            }),\n            /* @__PURE__ */ f.jsxs(Mt, {\n              children: [\n                /* @__PURE__ */ f.jsx(\"p\", {\n                  children: n\n                    ? /* @__PURE__ */ f.jsxs(Xn, {\n                        children: [\n                          /* @__PURE__ */ f.jsx(Qt, {\n                            name: \"description\",\n                            value: d.description,\n                            type: \"textarea\",\n                            placeholder:\n                              \"Describe the project governance check...\",\n                            invalid: !!l.description,\n                            onChange: p,\n                            style: { fieldSizing: \"content\" },\n                          }),\n                          l.description\n                            ? /* @__PURE__ */ f.jsx(dr, {\n                                children: l.description,\n                              })\n                            : null,\n                        ],\n                      })\n                    : e.description,\n                }),\n                /* @__PURE__ */ f.jsxs(\"p\", { children: [\"Type: \", e.type] }),\n                /* @__PURE__ */ f.jsxs(\"p\", {\n                  children: [\"Files required: \", e.files_required.join(\", \")],\n                }),\n              ],\n            }),\n          ],\n        }),\n      ],\n    });\n  },\n  Bw = ({}) => {\n    const [e, t] = se(!1),\n      {\n        data: n,\n        error: o,\n        loading: r,\n        refetch: i,\n      } = ac({\n        queryFn: () =>\n          // @ts-expect-error valid\n          Te.get(\"project_governance/checks\"),\n      }),\n      a = () => {\n        t((l) => !l);\n      };\n    return r\n      ? /* @__PURE__ */ f.jsx(rc, {})\n      : o\n        ? /* @__PURE__ */ f.jsxs(Nr, {\n            color: \"danger\",\n            children: [\"Error loading checks: \", o.message],\n          })\n        : /* @__PURE__ */ f.jsxs(f.Fragment, {\n            children: [\n              /* @__PURE__ */ f.jsxs(\"div\", {\n                children: [\n                  /* @__PURE__ */ f.jsx(Ze, {\n                    className: \"justify-content-end\",\n                    children: /* @__PURE__ */ f.jsx(Re, {\n                      onClick: a,\n                      children: \"+ Add new check\",\n                    }),\n                  }),\n                  /* @__PURE__ */ f.jsx(\"div\", {\n                    className: \"mt-2\",\n                    children:\n                      n != null && n.length\n                        ? n.map((l) =>\n                            /* @__PURE__ */ f.jsx(Pw, { check: l, refetch: i }),\n                          )\n                        : /* @__PURE__ */ f.jsx(\"div\", {\n                            children: \"No checks added yet!\",\n                          }),\n                  }),\n                ],\n              }),\n              e &&\n                /* @__PURE__ */ f.jsxs(o4, {\n                  isOpen: !0,\n                  direction: \"end\",\n                  children: [\n                    /* @__PURE__ */ f.jsx(r4, {\n                      toggle: a,\n                      children: \"Add new check\",\n                    }),\n                    /* @__PURE__ */ f.jsx(i4, {\n                      children: /* @__PURE__ */ f.jsx(af, {\n                        onClose: () => {\n                          a(), i();\n                        },\n                      }),\n                    }),\n                  ],\n                }),\n            ],\n          });\n  };\nvar b1 = /* @__PURE__ */ ((e) => (\n    (e.TERM_CLARIFICATION = \"TermClarification\"),\n    (e.GENERAL_GUIDELINES = \"GeneralGuidelines\"),\n    (e.BUSINESS_EXPLANATION = \"BusinessExplanation\"),\n    e\n  ))(b1 || {}),\n  po = /* @__PURE__ */ ((e) => (\n    (e.DocGen = \"DocGen\"),\n    (e.ChartBot = \"ChartBot\"),\n    (e.SqlBot = \"SqlExpert\"),\n    (e.OpportunitiesBot = \"OpportunitiesBot\"),\n    (e.ProjectGovernor = \"ProjectGovernor\"),\n    e\n  ))(po || {}),\n  y1 = /* @__PURE__ */ ((e) => (\n    (e.USER_SPECIFIC = \"UserSpecific\"), (e.ALL_USERS = \"AllUsers\"), e\n  ))(y1 || {});\nconst Vw = Pe.object({\n  train_doc_uid: Pe.string(),\n  userId: Pe.string(),\n  display_name: Pe.string(),\n  taskLabel: Pe.string(),\n  category: Pe.enum(Object.values(b1)),\n  personalizationScope: Pe.enum(Object.values(y1)).default(\n    \"UserSpecific\",\n    /* USER_SPECIFIC */\n  ),\n  createdDate: Pe.string(),\n  updatedDate: Pe.string(),\n  content: Pe.string()\n    .min(10, { message: \"Learning must be at least 10 characters\" })\n    .max(500, { message: \"Learning must not exceed 500 characters\" })\n    .min(1, { message: \"Learning is required\" }),\n  metadata: Pe.record(Pe.unknown()).optional(),\n  isActive: Pe.boolean().default(!0),\n});\nvar Wn = /* @__PURE__ */ ((e) => (\n    (e.EXTENSION = \"VSCode Extension\"), (e.SAAS = \"SaaS\"), e\n  ))(Wn || {}),\n  _i = /* @__PURE__ */ ((e) => (\n    (e.SEE_IN_ACTION = \"SEE_IN_ACTION\"),\n    (e.REQUEST_ACCESS = \"REQUEST_ACCESS\"),\n    (e.VIEW_DETAILS = \"VIEW_DETAILS\"),\n    e\n  ))(_i || {});\nconst uf = [\n    {\n      name: \"Documentation Writer\",\n      avatar: Mw,\n      description:\n        \"AI teammate to write your dbt model, table and column descriptions for you\",\n      availability: [Wn.EXTENSION],\n      key: po.DocGen,\n    },\n    {\n      name: \"Chart Analyzer\",\n      avatar: Tw,\n      description:\n        \"AI teammate to analyze charts, find insights and answer your specific questions\",\n      availability: [Wn.SAAS],\n      key: po.ChartBot,\n      seeInAction: !1,\n    },\n    {\n      name: \"SQL Guru\",\n      avatar: Ow,\n      description:\n        \"AI teammate who is one of the best in the world to explain SQL queries or translate in other dialects\",\n      availability: [Wn.SAAS],\n      key: po.SqlBot,\n    },\n    {\n      name: \"Project Governor\",\n      avatar: h0,\n      description:\n        \"AI teammate to help you create checks or rules for project governance config\",\n      availability: [Wn.SAAS],\n      key: po.ProjectGovernor,\n      displayComponent: Bw,\n      formComponent: af,\n    },\n    {\n      name: \"Opportunities Expert\",\n      avatar: h0,\n      description:\n        \"AI teammate to analyze your spends, costs and find opportunities to save money\",\n      availability: [Wn.SAAS],\n      key: po.OpportunitiesBot,\n      comingSoon: !0,\n    },\n  ],\n  FA = (e) => {\n    const t = uf.find((n) => n.key === e.taskLabel);\n    return t != null && t.formComponent\n      ? /* @__PURE__ */ f.jsx(t.formComponent, { ...e })\n      : /* @__PURE__ */ f.jsx(Aw, { ...e });\n  },\n  $w = () => {\n    const e = Xe(nf);\n    if (e === void 0)\n      throw new Error(\n        \"useTeamMateContext must be used within a TeamMateProvider\",\n      );\n    return e;\n  },\n  RA = ({}) => {\n    const { dispatch: e } = $w(),\n      t = () => {\n        e(Sw.setShowCoachingForm(!0));\n      };\n    return /* @__PURE__ */ f.jsx(jn, {\n      onClick: t,\n      children: \"Show Coaching Form\",\n    });\n  },\n  Ww = ({ learning: e, afterDelete: t, toggle: n, openId: o }) => {\n    const [r, i] = se(!1),\n      {\n        errors: a,\n        isValid: l,\n        isSubmitting: s,\n        handleSubmit: u,\n        values: c,\n        handleChange: d,\n        setSubmitting: p,\n      } = hd({\n        initialValues: e,\n        validationSchema: m1(Vw),\n        onSubmit: async (E) => {\n          await Te.post(`coach/training/${e.train_doc_uid}`, E, {\n            method: \"PUT\",\n          }),\n            i(!1),\n            p(!1);\n        },\n      }),\n      h = async () =>\n        await Te.post(\n          `coach/training/${e.train_doc_uid}`,\n          {},\n          { method: \"DELETE\" },\n        ),\n      {\n        loading: m,\n        error: b,\n        mutate: y,\n      } = ro({\n        // @ts-ignore\n        queryFn: h,\n        onSuccess: t,\n      }),\n      g = (E) => {\n        E == null || E.stopPropagation();\n      },\n      x = () => {\n        g(), y();\n      },\n      v = (E) => {\n        g(E), i(!1);\n      },\n      S = (E) => {\n        g(E), n(e.train_doc_uid), i(!0);\n      },\n      w = o === e.train_doc_uid;\n    return /* @__PURE__ */ f.jsx(bt, {\n      className: w ? \"active\" : \"\",\n      children: /* @__PURE__ */ f.jsxs(\"form\", {\n        onSubmit: u,\n        children: [\n          /* @__PURE__ */ f.jsx(Io, {\n            children: /* @__PURE__ */ f.jsxs(Ze, {\n              className: \"align-items-start\",\n              children: [\n                /* @__PURE__ */ f.jsxs(\"div\", {\n                  style: { flex: 1 },\n                  children: [\n                    /* @__PURE__ */ f.jsx(\"div\", {\n                      children: r\n                        ? /* @__PURE__ */ f.jsxs(Xn, {\n                            children: [\n                              /* @__PURE__ */ f.jsx(Qt, {\n                                name: \"content\",\n                                value: c.content,\n                                type: \"textarea\",\n                                placeholder:\n                                  \"Enter your coaching feedback here...\",\n                                invalid: !!a.content,\n                                onClick: g,\n                                onChange: d,\n                                style: { fieldSizing: \"content\" },\n                              }),\n                              a.content\n                                ? /* @__PURE__ */ f.jsx(dr, {\n                                    children: a.content,\n                                  })\n                                : null,\n                            ],\n                          })\n                        : /* @__PURE__ */ f.jsx(\"h6\", {\n                            className: w ? \"\" : \"lines-2\",\n                            children: c.content,\n                          }),\n                    }),\n                    /* @__PURE__ */ f.jsx(Ze, {\n                      children: /* @__PURE__ */ f.jsxs(\"dl\", {\n                        children: [\n                          /* @__PURE__ */ f.jsxs(Ze, {\n                            children: [\n                              /* @__PURE__ */ f.jsx(\"dt\", {\n                                children: \"Created on:\",\n                              }),\n                              /* @__PURE__ */ f.jsx(\"dd\", {\n                                children: Es(e.createdDate).format(\n                                  \"MMMM D, YYYY h:mm A\",\n                                ),\n                              }),\n                            ],\n                          }),\n                          /* @__PURE__ */ f.jsxs(Ze, {\n                            children: [\n                              /* @__PURE__ */ f.jsx(\"dt\", {\n                                children: \"Updated on:\",\n                              }),\n                              /* @__PURE__ */ f.jsxs(\"dd\", {\n                                children: [\n                                  Es(e.updatedDate).format(\n                                    \"MMMM D, YYYY h:mm A\",\n                                  ),\n                                  \" \",\n                                ],\n                              }),\n                            ],\n                          }),\n                          /* @__PURE__ */ f.jsxs(Ze, {\n                            children: [\n                              /* @__PURE__ */ f.jsx(\"dt\", {\n                                children: \"Created by:\",\n                              }),\n                              \" \",\n                              /* @__PURE__ */ f.jsx(\"dd\", {\n                                children: e.display_name,\n                              }),\n                            ],\n                          }),\n                        ],\n                      }),\n                    }),\n                  ],\n                }),\n                /* @__PURE__ */ f.jsxs(Ze, {\n                  className: \"align-items-top gap-0\",\n                  children: [\n                    /* @__PURE__ */ f.jsx(Xn, {\n                      switch: !0,\n                      children: /* @__PURE__ */ f.jsx(Sn, {\n                        title: c.isActive\n                          ? \"Disable this learning\"\n                          : \"Enable this learning\",\n                        children: /* @__PURE__ */ f.jsx(Qt, {\n                          type: \"switch\",\n                          role: \"switch\",\n                          id: `toggle-${e.train_doc_uid}`,\n                          checked: c.isActive,\n                          onChange: (E) => {\n                            d({\n                              target: {\n                                name: \"isActive\",\n                                value: E.target.checked,\n                              },\n                            }),\n                              u();\n                          },\n                        }),\n                      }),\n                    }),\n                    /* @__PURE__ */ f.jsx(pd, {\n                      title: \"Delete the task\",\n                      description: \"Are you sure to delete this task?\",\n                      onConfirm: x,\n                      onCancel: g,\n                      okText: \"Yes\",\n                      cancelText: \"No\",\n                      children: /* @__PURE__ */ f.jsx(jn, {\n                        title: \"Delete this learning\",\n                        className: \"pt-1 pb-0\",\n                        disabled: m,\n                        onClick: g,\n                        children: /* @__PURE__ */ f.jsx(Cc, {}),\n                      }),\n                    }),\n                    r\n                      ? /* @__PURE__ */ f.jsxs(Ze, {\n                          className: \"align-items-baseline\",\n                          children: [\n                            /* @__PURE__ */ f.jsx(Re, {\n                              onClick: v,\n                              outline: !0,\n                              size: \"sm\",\n                              children: \"Cancel\",\n                            }),\n                            /* @__PURE__ */ f.jsx(Re, {\n                              size: \"sm\",\n                              color: \"primary\",\n                              disabled: s || !l,\n                              type: \"submit\",\n                              children: \"Save\",\n                            }),\n                          ],\n                        })\n                      : /* @__PURE__ */ f.jsx(jn, {\n                          title: \"Edit this learning\",\n                          onClick: S,\n                          children: /* @__PURE__ */ f.jsx(jd, {}),\n                        }),\n                    /* @__PURE__ */ f.jsx(jn, {\n                      onClick: () => n(e.train_doc_uid),\n                      children: w\n                        ? /* @__PURE__ */ f.jsx(ir, {})\n                        : /* @__PURE__ */ f.jsx(ar, {}),\n                    }),\n                  ],\n                }),\n              ],\n            }),\n          }),\n          /* @__PURE__ */ f.jsxs(rr, {\n            isOpen: w,\n            children: [\n              b &&\n                /* @__PURE__ */ f.jsx(Nr, {\n                  color: \"danger\",\n                  children: b.message,\n                }),\n              /* @__PURE__ */ f.jsxs(Ze, {\n                className: \"gap-4\",\n                children: [\n                  /* @__PURE__ */ f.jsxs(\"div\", {\n                    children: [\n                      /* @__PURE__ */ f.jsx(\"strong\", {\n                        children: \"Category:\",\n                      }),\n                      \" \",\n                      r\n                        ? /* @__PURE__ */ f.jsx(us, {\n                            style: { minWidth: 160 },\n                            options: Object.values(b1).map((E) => ({\n                              value: E,\n                              label: E,\n                            })),\n                            value: c.category,\n                            onChange: (E) => {\n                              d({\n                                target: { name: \"category\", value: E },\n                              });\n                            },\n                          })\n                        : e.category,\n                    ],\n                  }),\n                  /* @__PURE__ */ f.jsxs(\"div\", {\n                    children: [\n                      /* @__PURE__ */ f.jsx(\"strong\", {\n                        children: \"Task Label:\",\n                      }),\n                      \" \",\n                      e.taskLabel,\n                    ],\n                  }),\n                  /* @__PURE__ */ f.jsxs(\"div\", {\n                    children: [\n                      /* @__PURE__ */ f.jsx(\"strong\", {\n                        children: \"Personalization Scope:\",\n                      }),\n                      \" \",\n                      r\n                        ? /* @__PURE__ */ f.jsx(us, {\n                            style: { minWidth: 100 },\n                            options: Object.values(y1).map((E) => ({\n                              value: E,\n                              label: E,\n                            })),\n                            value: c.personalizationScope,\n                            onChange: (E) => {\n                              d({\n                                target: {\n                                  name: \"personalizationScope\",\n                                  value: E,\n                                },\n                              });\n                            },\n                          })\n                        : e.personalizationScope,\n                    ],\n                  }),\n                  e.metadata &&\n                    Object.keys(e.metadata).map((E) => {\n                      var M;\n                      return /* @__PURE__ */ f.jsxs(\n                        \"div\",\n                        {\n                          children: [\n                            /* @__PURE__ */ f.jsxs(\"strong\", {\n                              children: [E, \":\"],\n                            }),\n                            \" \",\n                            /* @__PURE__ */ f.jsx(f.Fragment, {\n                              children:\n                                ((M = e.metadata) == null ? void 0 : M[E]) ||\n                                \"\",\n                            }),\n                          ],\n                        },\n                        E,\n                      );\n                    }),\n                ],\n              }),\n            ],\n          }),\n        ],\n      }),\n    });\n  },\n  IA = ({ filters: e, learning: t }) => {\n    var u;\n    const [n, o] = se(t),\n      {\n        error: r,\n        data: i,\n        loading: a,\n        refetch: l,\n      } = ac({\n        queryFn: () => Te.get(\"coach/training\", e),\n      }),\n      s = (c) => {\n        o((d) => (d === c ? void 0 : c));\n      };\n    return /* @__PURE__ */ f.jsx(Ze, {\n      direction: \"column\",\n      className: \"learnings\",\n      children: a\n        ? /* @__PURE__ */ f.jsx(\"p\", { children: \"Loading learnings...\" })\n        : r\n          ? /* @__PURE__ */ f.jsxs(Nr, {\n              color: \"danger\",\n              children: [\"Error loading learnings: \", r.message],\n            })\n          : (u = i == null ? void 0 : i.train_docs) != null && u.length\n            ? /* @__PURE__ */ f.jsx(\"div\", {\n                children: i.train_docs.map((c) =>\n                  /* @__PURE__ */ f.jsx(\n                    Ww,\n                    {\n                      learning: c,\n                      afterDelete: l,\n                      toggle: s,\n                      openId: n,\n                    },\n                    c.train_doc_uid,\n                  ),\n                ),\n              })\n            : /* @__PURE__ */ f.jsxs(Ze, {\n                direction: \"column\",\n                className: \"align-items-center\",\n                children: [\n                  /* @__PURE__ */ f.jsx(Nw, {}),\n                  /* @__PURE__ */ f.jsx(\"h4\", {\n                    children: \"No learnings added yet!\",\n                  }),\n                ],\n              }),\n    });\n  },\n  Zw = ({ config: e, client: t, onSelect: n }) => {\n    const o = async () => await n(e, _i.REQUEST_ACCESS),\n      {\n        loading: r,\n        mutate: i,\n        data: a,\n      } = ro({\n        // @ts-ignore\n        queryFn: o,\n      });\n    return /* @__PURE__ */ f.jsx(a4, {\n      children: /* @__PURE__ */ f.jsxs(bt, {\n        children: [\n          /* @__PURE__ */ f.jsxs(Ze, {\n            className: \"justify-content-between\",\n            children: [\n              /* @__PURE__ */ f.jsx(l4, {\n                alt: \"Teammate image\",\n                src: e.avatar,\n              }),\n              /* @__PURE__ */ f.jsx(\"div\", {\n                children: e.availability.map((l) =>\n                  /* @__PURE__ */ f.jsxs(\n                    md,\n                    {\n                      color: \"success\",\n                      tooltip: \"\",\n                      className: l,\n                      children: [\n                        e.comingSoon ? \"Coming soon\" : \"Available\",\n                        \" in\",\n                        \" \",\n                        l,\n                      ],\n                    },\n                    l,\n                  ),\n                ),\n              }),\n            ],\n          }),\n          /* @__PURE__ */ f.jsxs(Mt, {\n            children: [\n              /* @__PURE__ */ f.jsx(Io, { tag: \"h5\", children: e.name }),\n              /* @__PURE__ */ f.jsx(s4, { tag: \"h6\" }),\n              /* @__PURE__ */ f.jsx(c4, { children: e.description }),\n              /* @__PURE__ */ f.jsxs(Ze, {\n                className: \"justify-content-start align-items-center\",\n                children: [\n                  e.comingSoon\n                    ? /* @__PURE__ */ f.jsxs(f.Fragment, {\n                        children: [\n                          /* @__PURE__ */ f.jsx(In, {\n                            size: \"sm\",\n                            className: \"cursor-pointer\",\n                            onClick: i,\n                            color: \"primary\",\n                            loading: r,\n                            disabled: !!a,\n                            children: \"Request Access\",\n                          }),\n                          a\n                            ? /* @__PURE__ */ f.jsx(\"p\", {\n                                className: \"m-0\",\n                                children: \"Our team will reach out soon\",\n                              })\n                            : null,\n                        ],\n                      })\n                    : /* @__PURE__ */ f.jsx(Re, {\n                        size: \"sm\",\n                        className: \"cursor-pointer\",\n                        onClick: () => n(e, _i.VIEW_DETAILS),\n                        tooltip: \"\",\n                        color: \"primary\",\n                        children: \"View details\",\n                      }),\n                  e.seeInAction &&\n                    e.availability.includes(Wn[t]) &&\n                    /* @__PURE__ */ f.jsx(Re, {\n                      color: \"primary\",\n                      outline: !0,\n                      size: \"sm\",\n                      className: \"cursor-pointer\",\n                      onClick: () => n(e, _i.SEE_IN_ACTION),\n                      tooltip: \"\",\n                      children: \"See in action\",\n                    }),\n                ],\n              }),\n            ],\n          }),\n        ],\n      }),\n    });\n  },\n  HA = ({ onSelect: e, client: t }) =>\n    /* @__PURE__ */ f.jsx(\"div\", {\n      className: \"teammates\",\n      children: /* @__PURE__ */ f.jsx(u4, {\n        children: uf.map((n) =>\n          /* @__PURE__ */ f.jsx(\n            Zw,\n            {\n              config: n,\n              client: t,\n              onSelect: e,\n            },\n            n.name,\n          ),\n        ),\n      }),\n    }),\n  Uw = \"_chatbot_1ti7a_1\",\n  qw = \"_chatTriggerLink_1ti7a_1\",\n  Yw = \"_statusUpdates_1ti7a_51\",\n  C1 = {\n    chatbot: Uw,\n    chatTriggerLink: qw,\n    statusUpdates: Yw,\n  },\n  Gw = ({ text: e }) => {\n    const { sendMessage: t } = C4();\n    return /* @__PURE__ */ f.jsx(\n      Re,\n      {\n        onClick: () => t(e),\n        color: \"link\",\n        className: C1.chatTriggerLink,\n        children: e,\n      },\n      e,\n    );\n  },\n  Kw = ({ onFollowupRequest: e, sessionId: t }) => {\n    const { data: n } = ac({\n      // @ts-expect-error valid\n      queryFn: () => e(t),\n    });\n    return n != null && n.length\n      ? /* @__PURE__ */ f.jsx(Ze, {\n          direction: \"column\",\n          children: n.map((o) => /* @__PURE__ */ f.jsx(Gw, { text: o }, o)),\n        })\n      : null;\n  },\n  p0 = [\"http\", \"https\", \"mailto\", \"tel\"];\nfunction Xw(e) {\n  const t = (e || \"\").trim(),\n    n = t.charAt(0);\n  if (n === \"#\" || n === \"/\") return t;\n  const o = t.indexOf(\":\");\n  if (o === -1) return t;\n  let r = -1;\n  for (; ++r < p0.length; ) {\n    const i = p0[r];\n    if (o === i.length && t.slice(0, i.length).toLowerCase() === i) return t;\n  }\n  return (\n    (r = t.indexOf(\"?\")),\n    (r !== -1 && o > r) || ((r = t.indexOf(\"#\")), r !== -1 && o > r)\n      ? t\n      : \"javascript:void(0)\"\n  );\n}\n/*!\n * Determine if an object is a Buffer\n *\n * @author   Feross Aboukhadijeh <https://feross.org>\n * @license  MIT\n */\nvar Qw = function (t) {\n  return (\n    t != null &&\n    t.constructor != null &&\n    typeof t.constructor.isBuffer == \"function\" &&\n    t.constructor.isBuffer(t)\n  );\n};\nconst df = /* @__PURE__ */ fn(Qw);\nfunction cr(e) {\n  return !e || typeof e != \"object\"\n    ? \"\"\n    : \"position\" in e || \"type\" in e\n      ? g0(e.position)\n      : \"start\" in e || \"end\" in e\n        ? g0(e)\n        : \"line\" in e || \"column\" in e\n          ? Ys(e)\n          : \"\";\n}\nfunction Ys(e) {\n  return m0(e && e.line) + \":\" + m0(e && e.column);\n}\nfunction g0(e) {\n  return Ys(e && e.start) + \"-\" + Ys(e && e.end);\n}\nfunction m0(e) {\n  return e && typeof e == \"number\" ? e : 1;\n}\nclass Vt extends Error {\n  /**\n   * Create a message for `reason` at `place` from `origin`.\n   *\n   * When an error is passed in as `reason`, the `stack` is copied.\n   *\n   * @param {string | Error | VFileMessage} reason\n   *   Reason for message, uses the stack and message of the error if given.\n   *\n   *   > 👉 **Note**: you should use markdown.\n   * @param {Node | NodeLike | Position | Point | null | undefined} [place]\n   *   Place in file where the message occurred.\n   * @param {string | null | undefined} [origin]\n   *   Place in code where the message originates (example:\n   *   `'my-package:my-rule'` or `'my-rule'`).\n   * @returns\n   *   Instance of `VFileMessage`.\n   */\n  // To do: next major: expose `undefined` everywhere instead of `null`.\n  constructor(t, n, o) {\n    const r = [null, null];\n    let i = {\n      // @ts-expect-error: we always follows the structure of `position`.\n      start: { line: null, column: null },\n      // @ts-expect-error: \"\n      end: { line: null, column: null },\n    };\n    if (\n      (super(),\n      typeof n == \"string\" && ((o = n), (n = void 0)),\n      typeof o == \"string\")\n    ) {\n      const a = o.indexOf(\":\");\n      a === -1 ? (r[1] = o) : ((r[0] = o.slice(0, a)), (r[1] = o.slice(a + 1)));\n    }\n    n &&\n      (\"type\" in n || \"position\" in n\n        ? n.position && (i = n.position)\n        : \"start\" in n || \"end\" in n\n          ? (i = n)\n          : (\"line\" in n || \"column\" in n) && (i.start = n)),\n      (this.name = cr(n) || \"1:1\"),\n      (this.message = typeof t == \"object\" ? t.message : t),\n      (this.stack = \"\"),\n      typeof t == \"object\" && t.stack && (this.stack = t.stack),\n      (this.reason = this.message),\n      this.fatal,\n      (this.line = i.start.line),\n      (this.column = i.start.column),\n      (this.position = i),\n      (this.source = r[0]),\n      (this.ruleId = r[1]),\n      this.file,\n      this.actual,\n      this.expected,\n      this.url,\n      this.note;\n  }\n}\nVt.prototype.file = \"\";\nVt.prototype.name = \"\";\nVt.prototype.reason = \"\";\nVt.prototype.message = \"\";\nVt.prototype.stack = \"\";\nVt.prototype.fatal = null;\nVt.prototype.column = null;\nVt.prototype.line = null;\nVt.prototype.source = null;\nVt.prototype.ruleId = null;\nVt.prototype.position = null;\nconst an = { basename: Jw, dirname: eE, extname: tE, join: nE, sep: \"/\" };\nfunction Jw(e, t) {\n  if (t !== void 0 && typeof t != \"string\")\n    throw new TypeError('\"ext\" argument must be a string');\n  Pr(e);\n  let n = 0,\n    o = -1,\n    r = e.length,\n    i;\n  if (t === void 0 || t.length === 0 || t.length > e.length) {\n    for (; r--; )\n      if (e.charCodeAt(r) === 47) {\n        if (i) {\n          n = r + 1;\n          break;\n        }\n      } else o < 0 && ((i = !0), (o = r + 1));\n    return o < 0 ? \"\" : e.slice(n, o);\n  }\n  if (t === e) return \"\";\n  let a = -1,\n    l = t.length - 1;\n  for (; r--; )\n    if (e.charCodeAt(r) === 47) {\n      if (i) {\n        n = r + 1;\n        break;\n      }\n    } else\n      a < 0 && ((i = !0), (a = r + 1)),\n        l > -1 &&\n          (e.charCodeAt(r) === t.charCodeAt(l--)\n            ? l < 0 && (o = r)\n            : ((l = -1), (o = a)));\n  return n === o ? (o = a) : o < 0 && (o = e.length), e.slice(n, o);\n}\nfunction eE(e) {\n  if ((Pr(e), e.length === 0)) return \".\";\n  let t = -1,\n    n = e.length,\n    o;\n  for (; --n; )\n    if (e.charCodeAt(n) === 47) {\n      if (o) {\n        t = n;\n        break;\n      }\n    } else o || (o = !0);\n  return t < 0\n    ? e.charCodeAt(0) === 47\n      ? \"/\"\n      : \".\"\n    : t === 1 && e.charCodeAt(0) === 47\n      ? \"//\"\n      : e.slice(0, t);\n}\nfunction tE(e) {\n  Pr(e);\n  let t = e.length,\n    n = -1,\n    o = 0,\n    r = -1,\n    i = 0,\n    a;\n  for (; t--; ) {\n    const l = e.charCodeAt(t);\n    if (l === 47) {\n      if (a) {\n        o = t + 1;\n        break;\n      }\n      continue;\n    }\n    n < 0 && ((a = !0), (n = t + 1)),\n      l === 46 ? (r < 0 ? (r = t) : i !== 1 && (i = 1)) : r > -1 && (i = -1);\n  }\n  return r < 0 ||\n    n < 0 || // We saw a non-dot character immediately before the dot.\n    i === 0 || // The (right-most) trimmed path component is exactly `..`.\n    (i === 1 && r === n - 1 && r === o + 1)\n    ? \"\"\n    : e.slice(r, n);\n}\nfunction nE(...e) {\n  let t = -1,\n    n;\n  for (; ++t < e.length; )\n    Pr(e[t]), e[t] && (n = n === void 0 ? e[t] : n + \"/\" + e[t]);\n  return n === void 0 ? \".\" : oE(n);\n}\nfunction oE(e) {\n  Pr(e);\n  const t = e.charCodeAt(0) === 47;\n  let n = rE(e, !t);\n  return (\n    n.length === 0 && !t && (n = \".\"),\n    n.length > 0 && e.charCodeAt(e.length - 1) === 47 && (n += \"/\"),\n    t ? \"/\" + n : n\n  );\n}\nfunction rE(e, t) {\n  let n = \"\",\n    o = 0,\n    r = -1,\n    i = 0,\n    a = -1,\n    l,\n    s;\n  for (; ++a <= e.length; ) {\n    if (a < e.length) l = e.charCodeAt(a);\n    else {\n      if (l === 47) break;\n      l = 47;\n    }\n    if (l === 47) {\n      if (!(r === a - 1 || i === 1))\n        if (r !== a - 1 && i === 2) {\n          if (\n            n.length < 2 ||\n            o !== 2 ||\n            n.charCodeAt(n.length - 1) !== 46 ||\n            n.charCodeAt(n.length - 2) !== 46\n          ) {\n            if (n.length > 2) {\n              if (((s = n.lastIndexOf(\"/\")), s !== n.length - 1)) {\n                s < 0\n                  ? ((n = \"\"), (o = 0))\n                  : ((n = n.slice(0, s)),\n                    (o = n.length - 1 - n.lastIndexOf(\"/\"))),\n                  (r = a),\n                  (i = 0);\n                continue;\n              }\n            } else if (n.length > 0) {\n              (n = \"\"), (o = 0), (r = a), (i = 0);\n              continue;\n            }\n          }\n          t && ((n = n.length > 0 ? n + \"/..\" : \"..\"), (o = 2));\n        } else\n          n.length > 0\n            ? (n += \"/\" + e.slice(r + 1, a))\n            : (n = e.slice(r + 1, a)),\n            (o = a - r - 1);\n      (r = a), (i = 0);\n    } else l === 46 && i > -1 ? i++ : (i = -1);\n  }\n  return n;\n}\nfunction Pr(e) {\n  if (typeof e != \"string\")\n    throw new TypeError(\"Path must be a string. Received \" + JSON.stringify(e));\n}\nconst iE = { cwd: aE };\nfunction aE() {\n  return \"/\";\n}\nfunction Gs(e) {\n  return (\n    e !== null &&\n    typeof e == \"object\" && // @ts-expect-error: indexable.\n    e.href && // @ts-expect-error: indexable.\n    e.origin\n  );\n}\nfunction lE(e) {\n  if (typeof e == \"string\") e = new URL(e);\n  else if (!Gs(e)) {\n    const t = new TypeError(\n      'The \"path\" argument must be of type string or an instance of URL. Received `' +\n        e +\n        \"`\",\n    );\n    throw ((t.code = \"ERR_INVALID_ARG_TYPE\"), t);\n  }\n  if (e.protocol !== \"file:\") {\n    const t = new TypeError(\"The URL must be of scheme file\");\n    throw ((t.code = \"ERR_INVALID_URL_SCHEME\"), t);\n  }\n  return sE(e);\n}\nfunction sE(e) {\n  if (e.hostname !== \"\") {\n    const o = new TypeError(\n      'File URL host must be \"localhost\" or empty on darwin',\n    );\n    throw ((o.code = \"ERR_INVALID_FILE_URL_HOST\"), o);\n  }\n  const t = e.pathname;\n  let n = -1;\n  for (; ++n < t.length; )\n    if (t.charCodeAt(n) === 37 && t.charCodeAt(n + 1) === 50) {\n      const o = t.charCodeAt(n + 2);\n      if (o === 70 || o === 102) {\n        const r = new TypeError(\n          \"File URL path must not include encoded / characters\",\n        );\n        throw ((r.code = \"ERR_INVALID_FILE_URL_PATH\"), r);\n      }\n    }\n  return decodeURIComponent(t);\n}\nconst Ql = [\"history\", \"path\", \"basename\", \"stem\", \"extname\", \"dirname\"];\nclass ff {\n  /**\n   * Create a new virtual file.\n   *\n   * `options` is treated as:\n   *\n   * *   `string` or `Buffer` — `{value: options}`\n   * *   `URL` — `{path: options}`\n   * *   `VFile` — shallow copies its data over to the new file\n   * *   `object` — all fields are shallow copied over to the new file\n   *\n   * Path related fields are set in the following order (least specific to\n   * most specific): `history`, `path`, `basename`, `stem`, `extname`,\n   * `dirname`.\n   *\n   * You cannot set `dirname` or `extname` without setting either `history`,\n   * `path`, `basename`, or `stem` too.\n   *\n   * @param {Compatible | null | undefined} [value]\n   *   File value.\n   * @returns\n   *   New instance.\n   */\n  constructor(t) {\n    let n;\n    t\n      ? typeof t == \"string\" || cE(t)\n        ? (n = { value: t })\n        : Gs(t)\n          ? (n = { path: t })\n          : (n = t)\n      : (n = {}),\n      (this.data = {}),\n      (this.messages = []),\n      (this.history = []),\n      (this.cwd = iE.cwd()),\n      this.value,\n      this.stored,\n      this.result,\n      this.map;\n    let o = -1;\n    for (; ++o < Ql.length; ) {\n      const i = Ql[o];\n      i in n &&\n        n[i] !== void 0 &&\n        n[i] !== null &&\n        (this[i] = i === \"history\" ? [...n[i]] : n[i]);\n    }\n    let r;\n    for (r in n) Ql.includes(r) || (this[r] = n[r]);\n  }\n  /**\n   * Get the full path (example: `'~/index.min.js'`).\n   *\n   * @returns {string}\n   */\n  get path() {\n    return this.history[this.history.length - 1];\n  }\n  /**\n   * Set the full path (example: `'~/index.min.js'`).\n   *\n   * Cannot be nullified.\n   * You can set a file URL (a `URL` object with a `file:` protocol) which will\n   * be turned into a path with `url.fileURLToPath`.\n   *\n   * @param {string | URL} path\n   */\n  set path(t) {\n    Gs(t) && (t = lE(t)),\n      es(t, \"path\"),\n      this.path !== t && this.history.push(t);\n  }\n  /**\n   * Get the parent path (example: `'~'`).\n   */\n  get dirname() {\n    return typeof this.path == \"string\" ? an.dirname(this.path) : void 0;\n  }\n  /**\n   * Set the parent path (example: `'~'`).\n   *\n   * Cannot be set if there’s no `path` yet.\n   */\n  set dirname(t) {\n    b0(this.basename, \"dirname\"), (this.path = an.join(t || \"\", this.basename));\n  }\n  /**\n   * Get the basename (including extname) (example: `'index.min.js'`).\n   */\n  get basename() {\n    return typeof this.path == \"string\" ? an.basename(this.path) : void 0;\n  }\n  /**\n   * Set basename (including extname) (`'index.min.js'`).\n   *\n   * Cannot contain path separators (`'/'` on unix, macOS, and browsers, `'\\'`\n   * on windows).\n   * Cannot be nullified (use `file.path = file.dirname` instead).\n   */\n  set basename(t) {\n    es(t, \"basename\"),\n      Jl(t, \"basename\"),\n      (this.path = an.join(this.dirname || \"\", t));\n  }\n  /**\n   * Get the extname (including dot) (example: `'.js'`).\n   */\n  get extname() {\n    return typeof this.path == \"string\" ? an.extname(this.path) : void 0;\n  }\n  /**\n   * Set the extname (including dot) (example: `'.js'`).\n   *\n   * Cannot contain path separators (`'/'` on unix, macOS, and browsers, `'\\'`\n   * on windows).\n   * Cannot be set if there’s no `path` yet.\n   */\n  set extname(t) {\n    if ((Jl(t, \"extname\"), b0(this.dirname, \"extname\"), t)) {\n      if (t.charCodeAt(0) !== 46)\n        throw new Error(\"`extname` must start with `.`\");\n      if (t.includes(\".\", 1))\n        throw new Error(\"`extname` cannot contain multiple dots\");\n    }\n    this.path = an.join(this.dirname, this.stem + (t || \"\"));\n  }\n  /**\n   * Get the stem (basename w/o extname) (example: `'index.min'`).\n   */\n  get stem() {\n    return typeof this.path == \"string\"\n      ? an.basename(this.path, this.extname)\n      : void 0;\n  }\n  /**\n   * Set the stem (basename w/o extname) (example: `'index.min'`).\n   *\n   * Cannot contain path separators (`'/'` on unix, macOS, and browsers, `'\\'`\n   * on windows).\n   * Cannot be nullified (use `file.path = file.dirname` instead).\n   */\n  set stem(t) {\n    es(t, \"stem\"),\n      Jl(t, \"stem\"),\n      (this.path = an.join(this.dirname || \"\", t + (this.extname || \"\")));\n  }\n  /**\n   * Serialize the file.\n   *\n   * @param {BufferEncoding | null | undefined} [encoding='utf8']\n   *   Character encoding to understand `value` as when it’s a `Buffer`\n   *   (default: `'utf8'`).\n   * @returns {string}\n   *   Serialized file.\n   */\n  toString(t) {\n    return (this.value || \"\").toString(t || void 0);\n  }\n  /**\n   * Create a warning message associated with the file.\n   *\n   * Its `fatal` is set to `false` and `file` is set to the current file path.\n   * Its added to `file.messages`.\n   *\n   * @param {string | Error | VFileMessage} reason\n   *   Reason for message, uses the stack and message of the error if given.\n   * @param {Node | NodeLike | Position | Point | null | undefined} [place]\n   *   Place in file where the message occurred.\n   * @param {string | null | undefined} [origin]\n   *   Place in code where the message originates (example:\n   *   `'my-package:my-rule'` or `'my-rule'`).\n   * @returns {VFileMessage}\n   *   Message.\n   */\n  message(t, n, o) {\n    const r = new Vt(t, n, o);\n    return (\n      this.path && ((r.name = this.path + \":\" + r.name), (r.file = this.path)),\n      (r.fatal = !1),\n      this.messages.push(r),\n      r\n    );\n  }\n  /**\n   * Create an info message associated with the file.\n   *\n   * Its `fatal` is set to `null` and `file` is set to the current file path.\n   * Its added to `file.messages`.\n   *\n   * @param {string | Error | VFileMessage} reason\n   *   Reason for message, uses the stack and message of the error if given.\n   * @param {Node | NodeLike | Position | Point | null | undefined} [place]\n   *   Place in file where the message occurred.\n   * @param {string | null | undefined} [origin]\n   *   Place in code where the message originates (example:\n   *   `'my-package:my-rule'` or `'my-rule'`).\n   * @returns {VFileMessage}\n   *   Message.\n   */\n  info(t, n, o) {\n    const r = this.message(t, n, o);\n    return (r.fatal = null), r;\n  }\n  /**\n   * Create a fatal error associated with the file.\n   *\n   * Its `fatal` is set to `true` and `file` is set to the current file path.\n   * Its added to `file.messages`.\n   *\n   * > 👉 **Note**: a fatal error means that a file is no longer processable.\n   *\n   * @param {string | Error | VFileMessage} reason\n   *   Reason for message, uses the stack and message of the error if given.\n   * @param {Node | NodeLike | Position | Point | null | undefined} [place]\n   *   Place in file where the message occurred.\n   * @param {string | null | undefined} [origin]\n   *   Place in code where the message originates (example:\n   *   `'my-package:my-rule'` or `'my-rule'`).\n   * @returns {never}\n   *   Message.\n   * @throws {VFileMessage}\n   *   Message.\n   */\n  fail(t, n, o) {\n    const r = this.message(t, n, o);\n    throw ((r.fatal = !0), r);\n  }\n}\nfunction Jl(e, t) {\n  if (e && e.includes(an.sep))\n    throw new Error(\n      \"`\" + t + \"` cannot be a path: did not expect `\" + an.sep + \"`\",\n    );\n}\nfunction es(e, t) {\n  if (!e) throw new Error(\"`\" + t + \"` cannot be empty\");\n}\nfunction b0(e, t) {\n  if (!e) throw new Error(\"Setting `\" + t + \"` requires `path` to be set too\");\n}\nfunction cE(e) {\n  return df(e);\n}\nfunction y0(e) {\n  if (e) throw e;\n}\nvar Ai = Object.prototype.hasOwnProperty,\n  hf = Object.prototype.toString,\n  C0 = Object.defineProperty,\n  v0 = Object.getOwnPropertyDescriptor,\n  x0 = function (t) {\n    return typeof Array.isArray == \"function\"\n      ? Array.isArray(t)\n      : hf.call(t) === \"[object Array]\";\n  },\n  w0 = function (t) {\n    if (!t || hf.call(t) !== \"[object Object]\") return !1;\n    var n = Ai.call(t, \"constructor\"),\n      o =\n        t.constructor &&\n        t.constructor.prototype &&\n        Ai.call(t.constructor.prototype, \"isPrototypeOf\");\n    if (t.constructor && !n && !o) return !1;\n    var r;\n    for (r in t);\n    return typeof r > \"u\" || Ai.call(t, r);\n  },\n  E0 = function (t, n) {\n    C0 && n.name === \"__proto__\"\n      ? C0(t, n.name, {\n          enumerable: !0,\n          configurable: !0,\n          value: n.newValue,\n          writable: !0,\n        })\n      : (t[n.name] = n.newValue);\n  },\n  S0 = function (t, n) {\n    if (n === \"__proto__\")\n      if (Ai.call(t, n)) {\n        if (v0) return v0(t, n).value;\n      } else return;\n    return t[n];\n  },\n  uE = function e() {\n    var t,\n      n,\n      o,\n      r,\n      i,\n      a,\n      l = arguments[0],\n      s = 1,\n      u = arguments.length,\n      c = !1;\n    for (\n      typeof l == \"boolean\" && ((c = l), (l = arguments[1] || {}), (s = 2)),\n        (l == null || (typeof l != \"object\" && typeof l != \"function\")) &&\n          (l = {});\n      s < u;\n      ++s\n    )\n      if (((t = arguments[s]), t != null))\n        for (n in t)\n          (o = S0(l, n)),\n            (r = S0(t, n)),\n            l !== r &&\n              (c && r && (w0(r) || (i = x0(r)))\n                ? (i\n                    ? ((i = !1), (a = o && x0(o) ? o : []))\n                    : (a = o && w0(o) ? o : {}),\n                  E0(l, { name: n, newValue: e(c, a, r) }))\n                : typeof r < \"u\" && E0(l, { name: n, newValue: r }));\n    return l;\n  };\nconst k0 = /* @__PURE__ */ fn(uE);\nfunction Ks(e) {\n  if (typeof e != \"object\" || e === null) return !1;\n  const t = Object.getPrototypeOf(e);\n  return (\n    (t === null ||\n      t === Object.prototype ||\n      Object.getPrototypeOf(t) === null) &&\n    !(Symbol.toStringTag in e) &&\n    !(Symbol.iterator in e)\n  );\n}\nfunction dE() {\n  const e = [],\n    t = { run: n, use: o };\n  return t;\n  function n(...r) {\n    let i = -1;\n    const a = r.pop();\n    if (typeof a != \"function\")\n      throw new TypeError(\"Expected function as last argument, not \" + a);\n    l(null, ...r);\n    function l(s, ...u) {\n      const c = e[++i];\n      let d = -1;\n      if (s) {\n        a(s);\n        return;\n      }\n      for (; ++d < r.length; )\n        (u[d] === null || u[d] === void 0) && (u[d] = r[d]);\n      (r = u), c ? fE(c, l)(...u) : a(null, ...u);\n    }\n  }\n  function o(r) {\n    if (typeof r != \"function\")\n      throw new TypeError(\"Expected `middelware` to be a function, not \" + r);\n    return e.push(r), t;\n  }\n}\nfunction fE(e, t) {\n  let n;\n  return o;\n  function o(...a) {\n    const l = e.length > a.length;\n    let s;\n    l && a.push(r);\n    try {\n      s = e.apply(this, a);\n    } catch (u) {\n      const c =\n        /** @type {Error} */\n        u;\n      if (l && n) throw c;\n      return r(c);\n    }\n    l ||\n      (s && s.then && typeof s.then == \"function\"\n        ? s.then(i, r)\n        : s instanceof Error\n          ? r(s)\n          : i(s));\n  }\n  function r(a, ...l) {\n    n || ((n = !0), t(a, ...l));\n  }\n  function i(a) {\n    r(null, a);\n  }\n}\nconst hE = gf().freeze(),\n  pf = {}.hasOwnProperty;\nfunction gf() {\n  const e = dE(),\n    t = [];\n  let n = {},\n    o,\n    r = -1;\n  return (\n    (i.data = a),\n    (i.Parser = void 0),\n    (i.Compiler = void 0),\n    (i.freeze = l),\n    (i.attachers = t),\n    (i.use = s),\n    (i.parse = u),\n    (i.stringify = c),\n    (i.run = d),\n    (i.runSync = p),\n    (i.process = h),\n    (i.processSync = m),\n    i\n  );\n  function i() {\n    const b = gf();\n    let y = -1;\n    for (; ++y < t.length; ) b.use(...t[y]);\n    return b.data(k0(!0, {}, n)), b;\n  }\n  function a(b, y) {\n    return typeof b == \"string\"\n      ? arguments.length === 2\n        ? (os(\"data\", o), (n[b] = y), i)\n        : (pf.call(n, b) && n[b]) || null\n      : b\n        ? (os(\"data\", o), (n = b), i)\n        : n;\n  }\n  function l() {\n    if (o) return i;\n    for (; ++r < t.length; ) {\n      const [b, ...y] = t[r];\n      if (y[0] === !1) continue;\n      y[0] === !0 && (y[0] = void 0);\n      const g = b.call(i, ...y);\n      typeof g == \"function\" && e.use(g);\n    }\n    return (o = !0), (r = Number.POSITIVE_INFINITY), i;\n  }\n  function s(b, ...y) {\n    let g;\n    if ((os(\"use\", o), b != null))\n      if (typeof b == \"function\") w(b, ...y);\n      else if (typeof b == \"object\") Array.isArray(b) ? S(b) : v(b);\n      else throw new TypeError(\"Expected usable value, not `\" + b + \"`\");\n    return g && (n.settings = Object.assign(n.settings || {}, g)), i;\n    function x(E) {\n      if (typeof E == \"function\") w(E);\n      else if (typeof E == \"object\")\n        if (Array.isArray(E)) {\n          const [M, ..._] = E;\n          w(M, ..._);\n        } else v(E);\n      else throw new TypeError(\"Expected usable value, not `\" + E + \"`\");\n    }\n    function v(E) {\n      S(E.plugins), E.settings && (g = Object.assign(g || {}, E.settings));\n    }\n    function S(E) {\n      let M = -1;\n      if (E != null)\n        if (Array.isArray(E))\n          for (; ++M < E.length; ) {\n            const _ = E[M];\n            x(_);\n          }\n        else throw new TypeError(\"Expected a list of plugins, not `\" + E + \"`\");\n    }\n    function w(E, M) {\n      let _ = -1,\n        j;\n      for (; ++_ < t.length; )\n        if (t[_][0] === E) {\n          j = t[_];\n          break;\n        }\n      j\n        ? (Ks(j[1]) && Ks(M) && (M = k0(!0, j[1], M)), (j[1] = M))\n        : t.push([...arguments]);\n    }\n  }\n  function u(b) {\n    i.freeze();\n    const y = Qo(b),\n      g = i.Parser;\n    return (\n      ts(\"parse\", g),\n      _0(g, \"parse\") ? new g(String(y), y).parse() : g(String(y), y)\n    );\n  }\n  function c(b, y) {\n    i.freeze();\n    const g = Qo(y),\n      x = i.Compiler;\n    return (\n      ns(\"stringify\", x),\n      A0(b),\n      _0(x, \"compile\") ? new x(b, g).compile() : x(b, g)\n    );\n  }\n  function d(b, y, g) {\n    if (\n      (A0(b),\n      i.freeze(),\n      !g && typeof y == \"function\" && ((g = y), (y = void 0)),\n      !g)\n    )\n      return new Promise(x);\n    x(null, g);\n    function x(v, S) {\n      e.run(b, Qo(y), w);\n      function w(E, M, _) {\n        (M = M || b), E ? S(E) : v ? v(M) : g(null, M, _);\n      }\n    }\n  }\n  function p(b, y) {\n    let g, x;\n    return i.run(b, y, v), M0(\"runSync\", \"run\", x), g;\n    function v(S, w) {\n      y0(S), (g = w), (x = !0);\n    }\n  }\n  function h(b, y) {\n    if ((i.freeze(), ts(\"process\", i.Parser), ns(\"process\", i.Compiler), !y))\n      return new Promise(g);\n    g(null, y);\n    function g(x, v) {\n      const S = Qo(b);\n      i.run(i.parse(S), S, (E, M, _) => {\n        if (E || !M || !_) w(E);\n        else {\n          const j = i.stringify(M, _);\n          j == null || (mE(j) ? (_.value = j) : (_.result = j)), w(E, _);\n        }\n      });\n      function w(E, M) {\n        E || !M ? v(E) : x ? x(M) : y(null, M);\n      }\n    }\n  }\n  function m(b) {\n    let y;\n    i.freeze(), ts(\"processSync\", i.Parser), ns(\"processSync\", i.Compiler);\n    const g = Qo(b);\n    return i.process(g, x), M0(\"processSync\", \"process\", y), g;\n    function x(v) {\n      (y = !0), y0(v);\n    }\n  }\n}\nfunction _0(e, t) {\n  return (\n    typeof e == \"function\" && // Prototypes do exist.\n    // type-coverage:ignore-next-line\n    e.prototype && // A function with keys in its prototype is probably a constructor.\n    // Classes’ prototype methods are not enumerable, so we check if some value\n    // exists in the prototype.\n    // type-coverage:ignore-next-line\n    (pE(e.prototype) || t in e.prototype)\n  );\n}\nfunction pE(e) {\n  let t;\n  for (t in e) if (pf.call(e, t)) return !0;\n  return !1;\n}\nfunction ts(e, t) {\n  if (typeof t != \"function\")\n    throw new TypeError(\"Cannot `\" + e + \"` without `Parser`\");\n}\nfunction ns(e, t) {\n  if (typeof t != \"function\")\n    throw new TypeError(\"Cannot `\" + e + \"` without `Compiler`\");\n}\nfunction os(e, t) {\n  if (t)\n    throw new Error(\n      \"Cannot call `\" +\n        e +\n        \"` on a frozen processor.\\nCreate a new processor first, by calling it: use `processor()` instead of `processor`.\",\n    );\n}\nfunction A0(e) {\n  if (!Ks(e) || typeof e.type != \"string\")\n    throw new TypeError(\"Expected node, got `\" + e + \"`\");\n}\nfunction M0(e, t, n) {\n  if (!n)\n    throw new Error(\"`\" + e + \"` finished async. Use `\" + t + \"` instead\");\n}\nfunction Qo(e) {\n  return gE(e) ? e : new ff(e);\n}\nfunction gE(e) {\n  return !!(e && typeof e == \"object\" && \"message\" in e && \"messages\" in e);\n}\nfunction mE(e) {\n  return typeof e == \"string\" || df(e);\n}\nconst bE = {};\nfunction yE(e, t) {\n  const n = bE,\n    o = typeof n.includeImageAlt == \"boolean\" ? n.includeImageAlt : !0,\n    r = typeof n.includeHtml == \"boolean\" ? n.includeHtml : !0;\n  return mf(e, o, r);\n}\nfunction mf(e, t, n) {\n  if (CE(e)) {\n    if (\"value\" in e) return e.type === \"html\" && !n ? \"\" : e.value;\n    if (t && \"alt\" in e && e.alt) return e.alt;\n    if (\"children\" in e) return T0(e.children, t, n);\n  }\n  return Array.isArray(e) ? T0(e, t, n) : \"\";\n}\nfunction T0(e, t, n) {\n  const o = [];\n  let r = -1;\n  for (; ++r < e.length; ) o[r] = mf(e[r], t, n);\n  return o.join(\"\");\n}\nfunction CE(e) {\n  return !!(e && typeof e == \"object\");\n}\nfunction dn(e, t, n, o) {\n  const r = e.length;\n  let i = 0,\n    a;\n  if (\n    (t < 0 ? (t = -t > r ? 0 : r + t) : (t = t > r ? r : t),\n    (n = n > 0 ? n : 0),\n    o.length < 1e4)\n  )\n    (a = Array.from(o)), a.unshift(t, n), e.splice(...a);\n  else\n    for (n && e.splice(t, n); i < o.length; )\n      (a = o.slice(i, i + 1e4)),\n        a.unshift(t, 0),\n        e.splice(...a),\n        (i += 1e4),\n        (t += 1e4);\n}\nfunction Rt(e, t) {\n  return e.length > 0 ? (dn(e, e.length, 0, t), e) : t;\n}\nconst O0 = {}.hasOwnProperty;\nfunction vE(e) {\n  const t = {};\n  let n = -1;\n  for (; ++n < e.length; ) xE(t, e[n]);\n  return t;\n}\nfunction xE(e, t) {\n  let n;\n  for (n in t) {\n    const r = (O0.call(e, n) ? e[n] : void 0) || (e[n] = {}),\n      i = t[n];\n    let a;\n    if (i)\n      for (a in i) {\n        O0.call(r, a) || (r[a] = []);\n        const l = i[a];\n        wE(\n          // @ts-expect-error Looks like a list.\n          r[a],\n          Array.isArray(l) ? l : l ? [l] : [],\n        );\n      }\n  }\n}\nfunction wE(e, t) {\n  let n = -1;\n  const o = [];\n  for (; ++n < t.length; ) (t[n].add === \"after\" ? e : o).push(t[n]);\n  dn(e, 0, 0, o);\n}\nconst EE =\n    /[!-\\/:-@\\[-`\\{-~\\xA1\\xA7\\xAB\\xB6\\xB7\\xBB\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061D-\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u09FD\\u0A76\\u0AF0\\u0C77\\u0C84\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1B7D\\u1B7E\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E4F\\u2E52-\\u2E5D\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65]/,\n  cn = Pn(/[A-Za-z]/),\n  At = Pn(/[\\dA-Za-z]/),\n  SE = Pn(/[#-'*+\\--9=?A-Z^-~]/);\nfunction Xs(e) {\n  return (\n    // Special whitespace codes (which have negative values), C0 and Control\n    // character DEL\n    e !== null && (e < 32 || e === 127)\n  );\n}\nconst Qs = Pn(/\\d/),\n  kE = Pn(/[\\dA-Fa-f]/),\n  _E = Pn(/[!-/:-@[-`{-~]/);\nfunction pe(e) {\n  return e !== null && e < -2;\n}\nfunction Et(e) {\n  return e !== null && (e < 0 || e === 32);\n}\nfunction Ne(e) {\n  return e === -2 || e === -1 || e === 32;\n}\nconst AE = Pn(EE),\n  ME = Pn(/\\s/);\nfunction Pn(e) {\n  return t;\n  function t(n) {\n    return n !== null && e.test(String.fromCharCode(n));\n  }\n}\nfunction Ve(e, t, n, o) {\n  const r = o ? o - 1 : Number.POSITIVE_INFINITY;\n  let i = 0;\n  return a;\n  function a(s) {\n    return Ne(s) ? (e.enter(n), l(s)) : t(s);\n  }\n  function l(s) {\n    return Ne(s) && i++ < r ? (e.consume(s), l) : (e.exit(n), t(s));\n  }\n}\nconst TE = {\n  tokenize: OE,\n};\nfunction OE(e) {\n  const t = e.attempt(this.parser.constructs.contentInitial, o, r);\n  let n;\n  return t;\n  function o(l) {\n    if (l === null) {\n      e.consume(l);\n      return;\n    }\n    return (\n      e.enter(\"lineEnding\"),\n      e.consume(l),\n      e.exit(\"lineEnding\"),\n      Ve(e, t, \"linePrefix\")\n    );\n  }\n  function r(l) {\n    return e.enter(\"paragraph\"), i(l);\n  }\n  function i(l) {\n    const s = e.enter(\"chunkText\", {\n      contentType: \"text\",\n      previous: n,\n    });\n    return n && (n.next = s), (n = s), a(l);\n  }\n  function a(l) {\n    if (l === null) {\n      e.exit(\"chunkText\"), e.exit(\"paragraph\"), e.consume(l);\n      return;\n    }\n    return pe(l) ? (e.consume(l), e.exit(\"chunkText\"), i) : (e.consume(l), a);\n  }\n}\nconst NE = {\n    tokenize: LE,\n  },\n  N0 = {\n    tokenize: DE,\n  };\nfunction LE(e) {\n  const t = this,\n    n = [];\n  let o = 0,\n    r,\n    i,\n    a;\n  return l;\n  function l(v) {\n    if (o < n.length) {\n      const S = n[o];\n      return (t.containerState = S[1]), e.attempt(S[0].continuation, s, u)(v);\n    }\n    return u(v);\n  }\n  function s(v) {\n    if ((o++, t.containerState._closeFlow)) {\n      (t.containerState._closeFlow = void 0), r && x();\n      const S = t.events.length;\n      let w = S,\n        E;\n      for (; w--; )\n        if (t.events[w][0] === \"exit\" && t.events[w][1].type === \"chunkFlow\") {\n          E = t.events[w][1].end;\n          break;\n        }\n      g(o);\n      let M = S;\n      for (; M < t.events.length; )\n        (t.events[M][1].end = Object.assign({}, E)), M++;\n      return (\n        dn(t.events, w + 1, 0, t.events.slice(S)), (t.events.length = M), u(v)\n      );\n    }\n    return l(v);\n  }\n  function u(v) {\n    if (o === n.length) {\n      if (!r) return p(v);\n      if (r.currentConstruct && r.currentConstruct.concrete) return m(v);\n      t.interrupt = !!(r.currentConstruct && !r._gfmTableDynamicInterruptHack);\n    }\n    return (t.containerState = {}), e.check(N0, c, d)(v);\n  }\n  function c(v) {\n    return r && x(), g(o), p(v);\n  }\n  function d(v) {\n    return (\n      (t.parser.lazy[t.now().line] = o !== n.length), (a = t.now().offset), m(v)\n    );\n  }\n  function p(v) {\n    return (t.containerState = {}), e.attempt(N0, h, m)(v);\n  }\n  function h(v) {\n    return o++, n.push([t.currentConstruct, t.containerState]), p(v);\n  }\n  function m(v) {\n    if (v === null) {\n      r && x(), g(0), e.consume(v);\n      return;\n    }\n    return (\n      (r = r || t.parser.flow(t.now())),\n      e.enter(\"chunkFlow\", {\n        contentType: \"flow\",\n        previous: i,\n        _tokenizer: r,\n      }),\n      b(v)\n    );\n  }\n  function b(v) {\n    if (v === null) {\n      y(e.exit(\"chunkFlow\"), !0), g(0), e.consume(v);\n      return;\n    }\n    return pe(v)\n      ? (e.consume(v),\n        y(e.exit(\"chunkFlow\")),\n        (o = 0),\n        (t.interrupt = void 0),\n        l)\n      : (e.consume(v), b);\n  }\n  function y(v, S) {\n    const w = t.sliceStream(v);\n    if (\n      (S && w.push(null),\n      (v.previous = i),\n      i && (i.next = v),\n      (i = v),\n      r.defineSkip(v.start),\n      r.write(w),\n      t.parser.lazy[v.start.line])\n    ) {\n      let E = r.events.length;\n      for (; E--; )\n        if (\n          // The token starts before the line ending…\n          r.events[E][1].start.offset < a && // …and either is not ended yet…\n          (!r.events[E][1].end || // …or ends after it.\n            r.events[E][1].end.offset > a)\n        )\n          return;\n      const M = t.events.length;\n      let _ = M,\n        j,\n        R;\n      for (; _--; )\n        if (t.events[_][0] === \"exit\" && t.events[_][1].type === \"chunkFlow\") {\n          if (j) {\n            R = t.events[_][1].end;\n            break;\n          }\n          j = !0;\n        }\n      for (g(o), E = M; E < t.events.length; )\n        (t.events[E][1].end = Object.assign({}, R)), E++;\n      dn(t.events, _ + 1, 0, t.events.slice(M)), (t.events.length = E);\n    }\n  }\n  function g(v) {\n    let S = n.length;\n    for (; S-- > v; ) {\n      const w = n[S];\n      (t.containerState = w[1]), w[0].exit.call(t, e);\n    }\n    n.length = v;\n  }\n  function x() {\n    r.write([null]),\n      (i = void 0),\n      (r = void 0),\n      (t.containerState._closeFlow = void 0);\n  }\n}\nfunction DE(e, t, n) {\n  return Ve(\n    e,\n    e.attempt(this.parser.constructs.document, t, n),\n    \"linePrefix\",\n    this.parser.constructs.disable.null.includes(\"codeIndented\") ? void 0 : 4,\n  );\n}\nfunction L0(e) {\n  if (e === null || Et(e) || ME(e)) return 1;\n  if (AE(e)) return 2;\n}\nfunction v1(e, t, n) {\n  const o = [];\n  let r = -1;\n  for (; ++r < e.length; ) {\n    const i = e[r].resolveAll;\n    i && !o.includes(i) && ((t = i(t, n)), o.push(i));\n  }\n  return t;\n}\nconst Js = {\n  name: \"attention\",\n  tokenize: FE,\n  resolveAll: jE,\n};\nfunction jE(e, t) {\n  let n = -1,\n    o,\n    r,\n    i,\n    a,\n    l,\n    s,\n    u,\n    c;\n  for (; ++n < e.length; )\n    if (\n      e[n][0] === \"enter\" &&\n      e[n][1].type === \"attentionSequence\" &&\n      e[n][1]._close\n    ) {\n      for (o = n; o--; )\n        if (\n          e[o][0] === \"exit\" &&\n          e[o][1].type === \"attentionSequence\" &&\n          e[o][1]._open && // If the markers are the same:\n          t.sliceSerialize(e[o][1]).charCodeAt(0) ===\n            t.sliceSerialize(e[n][1]).charCodeAt(0)\n        ) {\n          if (\n            (e[o][1]._close || e[n][1]._open) &&\n            (e[n][1].end.offset - e[n][1].start.offset) % 3 &&\n            !(\n              (e[o][1].end.offset -\n                e[o][1].start.offset +\n                e[n][1].end.offset -\n                e[n][1].start.offset) %\n              3\n            )\n          )\n            continue;\n          s =\n            e[o][1].end.offset - e[o][1].start.offset > 1 &&\n            e[n][1].end.offset - e[n][1].start.offset > 1\n              ? 2\n              : 1;\n          const d = Object.assign({}, e[o][1].end),\n            p = Object.assign({}, e[n][1].start);\n          D0(d, -s),\n            D0(p, s),\n            (a = {\n              type: s > 1 ? \"strongSequence\" : \"emphasisSequence\",\n              start: d,\n              end: Object.assign({}, e[o][1].end),\n            }),\n            (l = {\n              type: s > 1 ? \"strongSequence\" : \"emphasisSequence\",\n              start: Object.assign({}, e[n][1].start),\n              end: p,\n            }),\n            (i = {\n              type: s > 1 ? \"strongText\" : \"emphasisText\",\n              start: Object.assign({}, e[o][1].end),\n              end: Object.assign({}, e[n][1].start),\n            }),\n            (r = {\n              type: s > 1 ? \"strong\" : \"emphasis\",\n              start: Object.assign({}, a.start),\n              end: Object.assign({}, l.end),\n            }),\n            (e[o][1].end = Object.assign({}, a.start)),\n            (e[n][1].start = Object.assign({}, l.end)),\n            (u = []),\n            e[o][1].end.offset - e[o][1].start.offset &&\n              (u = Rt(u, [\n                [\"enter\", e[o][1], t],\n                [\"exit\", e[o][1], t],\n              ])),\n            (u = Rt(u, [\n              [\"enter\", r, t],\n              [\"enter\", a, t],\n              [\"exit\", a, t],\n              [\"enter\", i, t],\n            ])),\n            (u = Rt(\n              u,\n              v1(t.parser.constructs.insideSpan.null, e.slice(o + 1, n), t),\n            )),\n            (u = Rt(u, [\n              [\"exit\", i, t],\n              [\"enter\", l, t],\n              [\"exit\", l, t],\n              [\"exit\", r, t],\n            ])),\n            e[n][1].end.offset - e[n][1].start.offset\n              ? ((c = 2),\n                (u = Rt(u, [\n                  [\"enter\", e[n][1], t],\n                  [\"exit\", e[n][1], t],\n                ])))\n              : (c = 0),\n            dn(e, o - 1, n - o + 3, u),\n            (n = o + u.length - c - 2);\n          break;\n        }\n    }\n  for (n = -1; ++n < e.length; )\n    e[n][1].type === \"attentionSequence\" && (e[n][1].type = \"data\");\n  return e;\n}\nfunction FE(e, t) {\n  const n = this.parser.constructs.attentionMarkers.null,\n    o = this.previous,\n    r = L0(o);\n  let i;\n  return a;\n  function a(s) {\n    return (i = s), e.enter(\"attentionSequence\"), l(s);\n  }\n  function l(s) {\n    if (s === i) return e.consume(s), l;\n    const u = e.exit(\"attentionSequence\"),\n      c = L0(s),\n      d = !c || (c === 2 && r) || n.includes(s),\n      p = !r || (r === 2 && c) || n.includes(o);\n    return (\n      (u._open = !!(i === 42 ? d : d && (r || !p))),\n      (u._close = !!(i === 42 ? p : p && (c || !d))),\n      t(s)\n    );\n  }\n}\nfunction D0(e, t) {\n  (e.column += t), (e.offset += t), (e._bufferIndex += t);\n}\nconst RE = {\n  name: \"autolink\",\n  tokenize: IE,\n};\nfunction IE(e, t, n) {\n  let o = 0;\n  return r;\n  function r(h) {\n    return (\n      e.enter(\"autolink\"),\n      e.enter(\"autolinkMarker\"),\n      e.consume(h),\n      e.exit(\"autolinkMarker\"),\n      e.enter(\"autolinkProtocol\"),\n      i\n    );\n  }\n  function i(h) {\n    return cn(h) ? (e.consume(h), a) : u(h);\n  }\n  function a(h) {\n    return h === 43 || h === 45 || h === 46 || At(h) ? ((o = 1), l(h)) : u(h);\n  }\n  function l(h) {\n    return h === 58\n      ? (e.consume(h), (o = 0), s)\n      : (h === 43 || h === 45 || h === 46 || At(h)) && o++ < 32\n        ? (e.consume(h), l)\n        : ((o = 0), u(h));\n  }\n  function s(h) {\n    return h === 62\n      ? (e.exit(\"autolinkProtocol\"),\n        e.enter(\"autolinkMarker\"),\n        e.consume(h),\n        e.exit(\"autolinkMarker\"),\n        e.exit(\"autolink\"),\n        t)\n      : h === null || h === 32 || h === 60 || Xs(h)\n        ? n(h)\n        : (e.consume(h), s);\n  }\n  function u(h) {\n    return h === 64 ? (e.consume(h), c) : SE(h) ? (e.consume(h), u) : n(h);\n  }\n  function c(h) {\n    return At(h) ? d(h) : n(h);\n  }\n  function d(h) {\n    return h === 46\n      ? (e.consume(h), (o = 0), c)\n      : h === 62\n        ? ((e.exit(\"autolinkProtocol\").type = \"autolinkEmail\"),\n          e.enter(\"autolinkMarker\"),\n          e.consume(h),\n          e.exit(\"autolinkMarker\"),\n          e.exit(\"autolink\"),\n          t)\n        : p(h);\n  }\n  function p(h) {\n    if ((h === 45 || At(h)) && o++ < 63) {\n      const m = h === 45 ? p : d;\n      return e.consume(h), m;\n    }\n    return n(h);\n  }\n}\nconst Ca = {\n  tokenize: HE,\n  partial: !0,\n};\nfunction HE(e, t, n) {\n  return o;\n  function o(i) {\n    return Ne(i) ? Ve(e, r, \"linePrefix\")(i) : r(i);\n  }\n  function r(i) {\n    return i === null || pe(i) ? t(i) : n(i);\n  }\n}\nconst bf = {\n  name: \"blockQuote\",\n  tokenize: zE,\n  continuation: {\n    tokenize: PE,\n  },\n  exit: BE,\n};\nfunction zE(e, t, n) {\n  const o = this;\n  return r;\n  function r(a) {\n    if (a === 62) {\n      const l = o.containerState;\n      return (\n        l.open ||\n          (e.enter(\"blockQuote\", {\n            _container: !0,\n          }),\n          (l.open = !0)),\n        e.enter(\"blockQuotePrefix\"),\n        e.enter(\"blockQuoteMarker\"),\n        e.consume(a),\n        e.exit(\"blockQuoteMarker\"),\n        i\n      );\n    }\n    return n(a);\n  }\n  function i(a) {\n    return Ne(a)\n      ? (e.enter(\"blockQuotePrefixWhitespace\"),\n        e.consume(a),\n        e.exit(\"blockQuotePrefixWhitespace\"),\n        e.exit(\"blockQuotePrefix\"),\n        t)\n      : (e.exit(\"blockQuotePrefix\"), t(a));\n  }\n}\nfunction PE(e, t, n) {\n  const o = this;\n  return r;\n  function r(a) {\n    return Ne(a)\n      ? Ve(\n          e,\n          i,\n          \"linePrefix\",\n          o.parser.constructs.disable.null.includes(\"codeIndented\")\n            ? void 0\n            : 4,\n        )(a)\n      : i(a);\n  }\n  function i(a) {\n    return e.attempt(bf, t, n)(a);\n  }\n}\nfunction BE(e) {\n  e.exit(\"blockQuote\");\n}\nconst yf = {\n  name: \"characterEscape\",\n  tokenize: VE,\n};\nfunction VE(e, t, n) {\n  return o;\n  function o(i) {\n    return (\n      e.enter(\"characterEscape\"),\n      e.enter(\"escapeMarker\"),\n      e.consume(i),\n      e.exit(\"escapeMarker\"),\n      r\n    );\n  }\n  function r(i) {\n    return _E(i)\n      ? (e.enter(\"characterEscapeValue\"),\n        e.consume(i),\n        e.exit(\"characterEscapeValue\"),\n        e.exit(\"characterEscape\"),\n        t)\n      : n(i);\n  }\n}\nconst j0 = document.createElement(\"i\");\nfunction x1(e) {\n  const t = \"&\" + e + \";\";\n  j0.innerHTML = t;\n  const n = j0.textContent;\n  return (n.charCodeAt(n.length - 1) === 59 && e !== \"semi\") || n === t\n    ? !1\n    : n;\n}\nconst Cf = {\n  name: \"characterReference\",\n  tokenize: $E,\n};\nfunction $E(e, t, n) {\n  const o = this;\n  let r = 0,\n    i,\n    a;\n  return l;\n  function l(d) {\n    return (\n      e.enter(\"characterReference\"),\n      e.enter(\"characterReferenceMarker\"),\n      e.consume(d),\n      e.exit(\"characterReferenceMarker\"),\n      s\n    );\n  }\n  function s(d) {\n    return d === 35\n      ? (e.enter(\"characterReferenceMarkerNumeric\"),\n        e.consume(d),\n        e.exit(\"characterReferenceMarkerNumeric\"),\n        u)\n      : (e.enter(\"characterReferenceValue\"), (i = 31), (a = At), c(d));\n  }\n  function u(d) {\n    return d === 88 || d === 120\n      ? (e.enter(\"characterReferenceMarkerHexadecimal\"),\n        e.consume(d),\n        e.exit(\"characterReferenceMarkerHexadecimal\"),\n        e.enter(\"characterReferenceValue\"),\n        (i = 6),\n        (a = kE),\n        c)\n      : (e.enter(\"characterReferenceValue\"), (i = 7), (a = Qs), c(d));\n  }\n  function c(d) {\n    if (d === 59 && r) {\n      const p = e.exit(\"characterReferenceValue\");\n      return a === At && !x1(o.sliceSerialize(p))\n        ? n(d)\n        : (e.enter(\"characterReferenceMarker\"),\n          e.consume(d),\n          e.exit(\"characterReferenceMarker\"),\n          e.exit(\"characterReference\"),\n          t);\n    }\n    return a(d) && r++ < i ? (e.consume(d), c) : n(d);\n  }\n}\nconst F0 = {\n    tokenize: ZE,\n    partial: !0,\n  },\n  R0 = {\n    name: \"codeFenced\",\n    tokenize: WE,\n    concrete: !0,\n  };\nfunction WE(e, t, n) {\n  const o = this,\n    r = {\n      tokenize: w,\n      partial: !0,\n    };\n  let i = 0,\n    a = 0,\n    l;\n  return s;\n  function s(E) {\n    return u(E);\n  }\n  function u(E) {\n    const M = o.events[o.events.length - 1];\n    return (\n      (i =\n        M && M[1].type === \"linePrefix\"\n          ? M[2].sliceSerialize(M[1], !0).length\n          : 0),\n      (l = E),\n      e.enter(\"codeFenced\"),\n      e.enter(\"codeFencedFence\"),\n      e.enter(\"codeFencedFenceSequence\"),\n      c(E)\n    );\n  }\n  function c(E) {\n    return E === l\n      ? (a++, e.consume(E), c)\n      : a < 3\n        ? n(E)\n        : (e.exit(\"codeFencedFenceSequence\"),\n          Ne(E) ? Ve(e, d, \"whitespace\")(E) : d(E));\n  }\n  function d(E) {\n    return E === null || pe(E)\n      ? (e.exit(\"codeFencedFence\"), o.interrupt ? t(E) : e.check(F0, b, S)(E))\n      : (e.enter(\"codeFencedFenceInfo\"),\n        e.enter(\"chunkString\", {\n          contentType: \"string\",\n        }),\n        p(E));\n  }\n  function p(E) {\n    return E === null || pe(E)\n      ? (e.exit(\"chunkString\"), e.exit(\"codeFencedFenceInfo\"), d(E))\n      : Ne(E)\n        ? (e.exit(\"chunkString\"),\n          e.exit(\"codeFencedFenceInfo\"),\n          Ve(e, h, \"whitespace\")(E))\n        : E === 96 && E === l\n          ? n(E)\n          : (e.consume(E), p);\n  }\n  function h(E) {\n    return E === null || pe(E)\n      ? d(E)\n      : (e.enter(\"codeFencedFenceMeta\"),\n        e.enter(\"chunkString\", {\n          contentType: \"string\",\n        }),\n        m(E));\n  }\n  function m(E) {\n    return E === null || pe(E)\n      ? (e.exit(\"chunkString\"), e.exit(\"codeFencedFenceMeta\"), d(E))\n      : E === 96 && E === l\n        ? n(E)\n        : (e.consume(E), m);\n  }\n  function b(E) {\n    return e.attempt(r, S, y)(E);\n  }\n  function y(E) {\n    return e.enter(\"lineEnding\"), e.consume(E), e.exit(\"lineEnding\"), g;\n  }\n  function g(E) {\n    return i > 0 && Ne(E) ? Ve(e, x, \"linePrefix\", i + 1)(E) : x(E);\n  }\n  function x(E) {\n    return E === null || pe(E)\n      ? e.check(F0, b, S)(E)\n      : (e.enter(\"codeFlowValue\"), v(E));\n  }\n  function v(E) {\n    return E === null || pe(E)\n      ? (e.exit(\"codeFlowValue\"), x(E))\n      : (e.consume(E), v);\n  }\n  function S(E) {\n    return e.exit(\"codeFenced\"), t(E);\n  }\n  function w(E, M, _) {\n    let j = 0;\n    return R;\n    function R(N) {\n      return E.enter(\"lineEnding\"), E.consume(N), E.exit(\"lineEnding\"), D;\n    }\n    function D(N) {\n      return (\n        E.enter(\"codeFencedFence\"),\n        Ne(N)\n          ? Ve(\n              E,\n              P,\n              \"linePrefix\",\n              o.parser.constructs.disable.null.includes(\"codeIndented\")\n                ? void 0\n                : 4,\n            )(N)\n          : P(N)\n      );\n    }\n    function P(N) {\n      return N === l ? (E.enter(\"codeFencedFenceSequence\"), V(N)) : _(N);\n    }\n    function V(N) {\n      return N === l\n        ? (j++, E.consume(N), V)\n        : j >= a\n          ? (E.exit(\"codeFencedFenceSequence\"),\n            Ne(N) ? Ve(E, k, \"whitespace\")(N) : k(N))\n          : _(N);\n    }\n    function k(N) {\n      return N === null || pe(N) ? (E.exit(\"codeFencedFence\"), M(N)) : _(N);\n    }\n  }\n}\nfunction ZE(e, t, n) {\n  const o = this;\n  return r;\n  function r(a) {\n    return a === null\n      ? n(a)\n      : (e.enter(\"lineEnding\"), e.consume(a), e.exit(\"lineEnding\"), i);\n  }\n  function i(a) {\n    return o.parser.lazy[o.now().line] ? n(a) : t(a);\n  }\n}\nconst rs = {\n    name: \"codeIndented\",\n    tokenize: qE,\n  },\n  UE = {\n    tokenize: YE,\n    partial: !0,\n  };\nfunction qE(e, t, n) {\n  const o = this;\n  return r;\n  function r(u) {\n    return e.enter(\"codeIndented\"), Ve(e, i, \"linePrefix\", 5)(u);\n  }\n  function i(u) {\n    const c = o.events[o.events.length - 1];\n    return c &&\n      c[1].type === \"linePrefix\" &&\n      c[2].sliceSerialize(c[1], !0).length >= 4\n      ? a(u)\n      : n(u);\n  }\n  function a(u) {\n    return u === null\n      ? s(u)\n      : pe(u)\n        ? e.attempt(UE, a, s)(u)\n        : (e.enter(\"codeFlowValue\"), l(u));\n  }\n  function l(u) {\n    return u === null || pe(u)\n      ? (e.exit(\"codeFlowValue\"), a(u))\n      : (e.consume(u), l);\n  }\n  function s(u) {\n    return e.exit(\"codeIndented\"), t(u);\n  }\n}\nfunction YE(e, t, n) {\n  const o = this;\n  return r;\n  function r(a) {\n    return o.parser.lazy[o.now().line]\n      ? n(a)\n      : pe(a)\n        ? (e.enter(\"lineEnding\"), e.consume(a), e.exit(\"lineEnding\"), r)\n        : Ve(e, i, \"linePrefix\", 5)(a);\n  }\n  function i(a) {\n    const l = o.events[o.events.length - 1];\n    return l &&\n      l[1].type === \"linePrefix\" &&\n      l[2].sliceSerialize(l[1], !0).length >= 4\n      ? t(a)\n      : pe(a)\n        ? r(a)\n        : n(a);\n  }\n}\nconst GE = {\n  name: \"codeText\",\n  tokenize: QE,\n  resolve: KE,\n  previous: XE,\n};\nfunction KE(e) {\n  let t = e.length - 4,\n    n = 3,\n    o,\n    r;\n  if (\n    (e[n][1].type === \"lineEnding\" || e[n][1].type === \"space\") &&\n    (e[t][1].type === \"lineEnding\" || e[t][1].type === \"space\")\n  ) {\n    for (o = n; ++o < t; )\n      if (e[o][1].type === \"codeTextData\") {\n        (e[n][1].type = \"codeTextPadding\"),\n          (e[t][1].type = \"codeTextPadding\"),\n          (n += 2),\n          (t -= 2);\n        break;\n      }\n  }\n  for (o = n - 1, t++; ++o <= t; )\n    r === void 0\n      ? o !== t && e[o][1].type !== \"lineEnding\" && (r = o)\n      : (o === t || e[o][1].type === \"lineEnding\") &&\n        ((e[r][1].type = \"codeTextData\"),\n        o !== r + 2 &&\n          ((e[r][1].end = e[o - 1][1].end),\n          e.splice(r + 2, o - r - 2),\n          (t -= o - r - 2),\n          (o = r + 2)),\n        (r = void 0));\n  return e;\n}\nfunction XE(e) {\n  return (\n    e !== 96 ||\n    this.events[this.events.length - 1][1].type === \"characterEscape\"\n  );\n}\nfunction QE(e, t, n) {\n  let o = 0,\n    r,\n    i;\n  return a;\n  function a(d) {\n    return e.enter(\"codeText\"), e.enter(\"codeTextSequence\"), l(d);\n  }\n  function l(d) {\n    return d === 96\n      ? (e.consume(d), o++, l)\n      : (e.exit(\"codeTextSequence\"), s(d));\n  }\n  function s(d) {\n    return d === null\n      ? n(d)\n      : d === 32\n        ? (e.enter(\"space\"), e.consume(d), e.exit(\"space\"), s)\n        : d === 96\n          ? ((i = e.enter(\"codeTextSequence\")), (r = 0), c(d))\n          : pe(d)\n            ? (e.enter(\"lineEnding\"), e.consume(d), e.exit(\"lineEnding\"), s)\n            : (e.enter(\"codeTextData\"), u(d));\n  }\n  function u(d) {\n    return d === null || d === 32 || d === 96 || pe(d)\n      ? (e.exit(\"codeTextData\"), s(d))\n      : (e.consume(d), u);\n  }\n  function c(d) {\n    return d === 96\n      ? (e.consume(d), r++, c)\n      : r === o\n        ? (e.exit(\"codeTextSequence\"), e.exit(\"codeText\"), t(d))\n        : ((i.type = \"codeTextData\"), u(d));\n  }\n}\nfunction vf(e) {\n  const t = {};\n  let n = -1,\n    o,\n    r,\n    i,\n    a,\n    l,\n    s,\n    u;\n  for (; ++n < e.length; ) {\n    for (; n in t; ) n = t[n];\n    if (\n      ((o = e[n]),\n      n &&\n        o[1].type === \"chunkFlow\" &&\n        e[n - 1][1].type === \"listItemPrefix\" &&\n        ((s = o[1]._tokenizer.events),\n        (i = 0),\n        i < s.length && s[i][1].type === \"lineEndingBlank\" && (i += 2),\n        i < s.length && s[i][1].type === \"content\"))\n    )\n      for (; ++i < s.length && s[i][1].type !== \"content\"; )\n        s[i][1].type === \"chunkText\" &&\n          ((s[i][1]._isInFirstContentOfListItem = !0), i++);\n    if (o[0] === \"enter\")\n      o[1].contentType && (Object.assign(t, JE(e, n)), (n = t[n]), (u = !0));\n    else if (o[1]._container) {\n      for (\n        i = n, r = void 0;\n        i-- &&\n        ((a = e[i]),\n        a[1].type === \"lineEnding\" || a[1].type === \"lineEndingBlank\");\n\n      )\n        a[0] === \"enter\" &&\n          (r && (e[r][1].type = \"lineEndingBlank\"),\n          (a[1].type = \"lineEnding\"),\n          (r = i));\n      r &&\n        ((o[1].end = Object.assign({}, e[r][1].start)),\n        (l = e.slice(r, n)),\n        l.unshift(o),\n        dn(e, r, n - r + 1, l));\n    }\n  }\n  return !u;\n}\nfunction JE(e, t) {\n  const n = e[t][1],\n    o = e[t][2];\n  let r = t - 1;\n  const i = [],\n    a = n._tokenizer || o.parser[n.contentType](n.start),\n    l = a.events,\n    s = [],\n    u = {};\n  let c,\n    d,\n    p = -1,\n    h = n,\n    m = 0,\n    b = 0;\n  const y = [b];\n  for (; h; ) {\n    for (; e[++r][1] !== h; );\n    i.push(r),\n      h._tokenizer ||\n        ((c = o.sliceStream(h)),\n        h.next || c.push(null),\n        d && a.defineSkip(h.start),\n        h._isInFirstContentOfListItem &&\n          (a._gfmTasklistFirstContentOfListItem = !0),\n        a.write(c),\n        h._isInFirstContentOfListItem &&\n          (a._gfmTasklistFirstContentOfListItem = void 0)),\n      (d = h),\n      (h = h.next);\n  }\n  for (h = n; ++p < l.length; )\n    // Find a void token that includes a break.\n    l[p][0] === \"exit\" &&\n      l[p - 1][0] === \"enter\" &&\n      l[p][1].type === l[p - 1][1].type &&\n      l[p][1].start.line !== l[p][1].end.line &&\n      ((b = p + 1),\n      y.push(b),\n      (h._tokenizer = void 0),\n      (h.previous = void 0),\n      (h = h.next));\n  for (\n    a.events = [],\n      h ? ((h._tokenizer = void 0), (h.previous = void 0)) : y.pop(),\n      p = y.length;\n    p--;\n\n  ) {\n    const g = l.slice(y[p], y[p + 1]),\n      x = i.pop();\n    s.unshift([x, x + g.length - 1]), dn(e, x, 2, g);\n  }\n  for (p = -1; ++p < s.length; )\n    (u[m + s[p][0]] = m + s[p][1]), (m += s[p][1] - s[p][0] - 1);\n  return u;\n}\nconst eS = {\n    tokenize: oS,\n    resolve: nS,\n  },\n  tS = {\n    tokenize: rS,\n    partial: !0,\n  };\nfunction nS(e) {\n  return vf(e), e;\n}\nfunction oS(e, t) {\n  let n;\n  return o;\n  function o(l) {\n    return (\n      e.enter(\"content\"),\n      (n = e.enter(\"chunkContent\", {\n        contentType: \"content\",\n      })),\n      r(l)\n    );\n  }\n  function r(l) {\n    return l === null ? i(l) : pe(l) ? e.check(tS, a, i)(l) : (e.consume(l), r);\n  }\n  function i(l) {\n    return e.exit(\"chunkContent\"), e.exit(\"content\"), t(l);\n  }\n  function a(l) {\n    return (\n      e.consume(l),\n      e.exit(\"chunkContent\"),\n      (n.next = e.enter(\"chunkContent\", {\n        contentType: \"content\",\n        previous: n,\n      })),\n      (n = n.next),\n      r\n    );\n  }\n}\nfunction rS(e, t, n) {\n  const o = this;\n  return r;\n  function r(a) {\n    return (\n      e.exit(\"chunkContent\"),\n      e.enter(\"lineEnding\"),\n      e.consume(a),\n      e.exit(\"lineEnding\"),\n      Ve(e, i, \"linePrefix\")\n    );\n  }\n  function i(a) {\n    if (a === null || pe(a)) return n(a);\n    const l = o.events[o.events.length - 1];\n    return !o.parser.constructs.disable.null.includes(\"codeIndented\") &&\n      l &&\n      l[1].type === \"linePrefix\" &&\n      l[2].sliceSerialize(l[1], !0).length >= 4\n      ? t(a)\n      : e.interrupt(o.parser.constructs.flow, n, t)(a);\n  }\n}\nfunction xf(e, t, n, o, r, i, a, l, s) {\n  const u = s || Number.POSITIVE_INFINITY;\n  let c = 0;\n  return d;\n  function d(g) {\n    return g === 60\n      ? (e.enter(o), e.enter(r), e.enter(i), e.consume(g), e.exit(i), p)\n      : g === null || g === 32 || g === 41 || Xs(g)\n        ? n(g)\n        : (e.enter(o),\n          e.enter(a),\n          e.enter(l),\n          e.enter(\"chunkString\", {\n            contentType: \"string\",\n          }),\n          b(g));\n  }\n  function p(g) {\n    return g === 62\n      ? (e.enter(i), e.consume(g), e.exit(i), e.exit(r), e.exit(o), t)\n      : (e.enter(l),\n        e.enter(\"chunkString\", {\n          contentType: \"string\",\n        }),\n        h(g));\n  }\n  function h(g) {\n    return g === 62\n      ? (e.exit(\"chunkString\"), e.exit(l), p(g))\n      : g === null || g === 60 || pe(g)\n        ? n(g)\n        : (e.consume(g), g === 92 ? m : h);\n  }\n  function m(g) {\n    return g === 60 || g === 62 || g === 92 ? (e.consume(g), h) : h(g);\n  }\n  function b(g) {\n    return !c && (g === null || g === 41 || Et(g))\n      ? (e.exit(\"chunkString\"), e.exit(l), e.exit(a), e.exit(o), t(g))\n      : c < u && g === 40\n        ? (e.consume(g), c++, b)\n        : g === 41\n          ? (e.consume(g), c--, b)\n          : g === null || g === 32 || g === 40 || Xs(g)\n            ? n(g)\n            : (e.consume(g), g === 92 ? y : b);\n  }\n  function y(g) {\n    return g === 40 || g === 41 || g === 92 ? (e.consume(g), b) : b(g);\n  }\n}\nfunction wf(e, t, n, o, r, i) {\n  const a = this;\n  let l = 0,\n    s;\n  return u;\n  function u(h) {\n    return e.enter(o), e.enter(r), e.consume(h), e.exit(r), e.enter(i), c;\n  }\n  function c(h) {\n    return l > 999 ||\n      h === null ||\n      h === 91 ||\n      (h === 93 && !s) || // To do: remove in the future once we’ve switched from\n      // `micromark-extension-footnote` to `micromark-extension-gfm-footnote`,\n      // which doesn’t need this.\n      // Hidden footnotes hook.\n      /* c8 ignore next 3 */\n      (h === 94 && !l && \"_hiddenFootnoteSupport\" in a.parser.constructs)\n      ? n(h)\n      : h === 93\n        ? (e.exit(i), e.enter(r), e.consume(h), e.exit(r), e.exit(o), t)\n        : pe(h)\n          ? (e.enter(\"lineEnding\"), e.consume(h), e.exit(\"lineEnding\"), c)\n          : (e.enter(\"chunkString\", {\n              contentType: \"string\",\n            }),\n            d(h));\n  }\n  function d(h) {\n    return h === null || h === 91 || h === 93 || pe(h) || l++ > 999\n      ? (e.exit(\"chunkString\"), c(h))\n      : (e.consume(h), s || (s = !Ne(h)), h === 92 ? p : d);\n  }\n  function p(h) {\n    return h === 91 || h === 92 || h === 93 ? (e.consume(h), l++, d) : d(h);\n  }\n}\nfunction Ef(e, t, n, o, r, i) {\n  let a;\n  return l;\n  function l(p) {\n    return p === 34 || p === 39 || p === 40\n      ? (e.enter(o),\n        e.enter(r),\n        e.consume(p),\n        e.exit(r),\n        (a = p === 40 ? 41 : p),\n        s)\n      : n(p);\n  }\n  function s(p) {\n    return p === a\n      ? (e.enter(r), e.consume(p), e.exit(r), e.exit(o), t)\n      : (e.enter(i), u(p));\n  }\n  function u(p) {\n    return p === a\n      ? (e.exit(i), s(a))\n      : p === null\n        ? n(p)\n        : pe(p)\n          ? (e.enter(\"lineEnding\"),\n            e.consume(p),\n            e.exit(\"lineEnding\"),\n            Ve(e, u, \"linePrefix\"))\n          : (e.enter(\"chunkString\", {\n              contentType: \"string\",\n            }),\n            c(p));\n  }\n  function c(p) {\n    return p === a || p === null || pe(p)\n      ? (e.exit(\"chunkString\"), u(p))\n      : (e.consume(p), p === 92 ? d : c);\n  }\n  function d(p) {\n    return p === a || p === 92 ? (e.consume(p), c) : c(p);\n  }\n}\nfunction ur(e, t) {\n  let n;\n  return o;\n  function o(r) {\n    return pe(r)\n      ? (e.enter(\"lineEnding\"), e.consume(r), e.exit(\"lineEnding\"), (n = !0), o)\n      : Ne(r)\n        ? Ve(e, o, n ? \"linePrefix\" : \"lineSuffix\")(r)\n        : t(r);\n  }\n}\nfunction Eo(e) {\n  return e\n    .replace(/[\\t\\n\\r ]+/g, \" \")\n    .replace(/^ | $/g, \"\")\n    .toLowerCase()\n    .toUpperCase();\n}\nconst iS = {\n    name: \"definition\",\n    tokenize: lS,\n  },\n  aS = {\n    tokenize: sS,\n    partial: !0,\n  };\nfunction lS(e, t, n) {\n  const o = this;\n  let r;\n  return i;\n  function i(h) {\n    return e.enter(\"definition\"), a(h);\n  }\n  function a(h) {\n    return wf.call(\n      o,\n      e,\n      l,\n      // Note: we don’t need to reset the way `markdown-rs` does.\n      n,\n      \"definitionLabel\",\n      \"definitionLabelMarker\",\n      \"definitionLabelString\",\n    )(h);\n  }\n  function l(h) {\n    return (\n      (r = Eo(o.sliceSerialize(o.events[o.events.length - 1][1]).slice(1, -1))),\n      h === 58\n        ? (e.enter(\"definitionMarker\"),\n          e.consume(h),\n          e.exit(\"definitionMarker\"),\n          s)\n        : n(h)\n    );\n  }\n  function s(h) {\n    return Et(h) ? ur(e, u)(h) : u(h);\n  }\n  function u(h) {\n    return xf(\n      e,\n      c,\n      // Note: we don’t need to reset the way `markdown-rs` does.\n      n,\n      \"definitionDestination\",\n      \"definitionDestinationLiteral\",\n      \"definitionDestinationLiteralMarker\",\n      \"definitionDestinationRaw\",\n      \"definitionDestinationString\",\n    )(h);\n  }\n  function c(h) {\n    return e.attempt(aS, d, d)(h);\n  }\n  function d(h) {\n    return Ne(h) ? Ve(e, p, \"whitespace\")(h) : p(h);\n  }\n  function p(h) {\n    return h === null || pe(h)\n      ? (e.exit(\"definition\"), o.parser.defined.push(r), t(h))\n      : n(h);\n  }\n}\nfunction sS(e, t, n) {\n  return o;\n  function o(l) {\n    return Et(l) ? ur(e, r)(l) : n(l);\n  }\n  function r(l) {\n    return Ef(\n      e,\n      i,\n      n,\n      \"definitionTitle\",\n      \"definitionTitleMarker\",\n      \"definitionTitleString\",\n    )(l);\n  }\n  function i(l) {\n    return Ne(l) ? Ve(e, a, \"whitespace\")(l) : a(l);\n  }\n  function a(l) {\n    return l === null || pe(l) ? t(l) : n(l);\n  }\n}\nconst cS = {\n  name: \"hardBreakEscape\",\n  tokenize: uS,\n};\nfunction uS(e, t, n) {\n  return o;\n  function o(i) {\n    return e.enter(\"hardBreakEscape\"), e.consume(i), r;\n  }\n  function r(i) {\n    return pe(i) ? (e.exit(\"hardBreakEscape\"), t(i)) : n(i);\n  }\n}\nconst dS = {\n  name: \"headingAtx\",\n  tokenize: hS,\n  resolve: fS,\n};\nfunction fS(e, t) {\n  let n = e.length - 2,\n    o = 3,\n    r,\n    i;\n  return (\n    e[o][1].type === \"whitespace\" && (o += 2),\n    n - 2 > o && e[n][1].type === \"whitespace\" && (n -= 2),\n    e[n][1].type === \"atxHeadingSequence\" &&\n      (o === n - 1 || (n - 4 > o && e[n - 2][1].type === \"whitespace\")) &&\n      (n -= o + 1 === n ? 2 : 4),\n    n > o &&\n      ((r = {\n        type: \"atxHeadingText\",\n        start: e[o][1].start,\n        end: e[n][1].end,\n      }),\n      (i = {\n        type: \"chunkText\",\n        start: e[o][1].start,\n        end: e[n][1].end,\n        contentType: \"text\",\n      }),\n      dn(e, o, n - o + 1, [\n        [\"enter\", r, t],\n        [\"enter\", i, t],\n        [\"exit\", i, t],\n        [\"exit\", r, t],\n      ])),\n    e\n  );\n}\nfunction hS(e, t, n) {\n  let o = 0;\n  return r;\n  function r(c) {\n    return e.enter(\"atxHeading\"), i(c);\n  }\n  function i(c) {\n    return e.enter(\"atxHeadingSequence\"), a(c);\n  }\n  function a(c) {\n    return c === 35 && o++ < 6\n      ? (e.consume(c), a)\n      : c === null || Et(c)\n        ? (e.exit(\"atxHeadingSequence\"), l(c))\n        : n(c);\n  }\n  function l(c) {\n    return c === 35\n      ? (e.enter(\"atxHeadingSequence\"), s(c))\n      : c === null || pe(c)\n        ? (e.exit(\"atxHeading\"), t(c))\n        : Ne(c)\n          ? Ve(e, l, \"whitespace\")(c)\n          : (e.enter(\"atxHeadingText\"), u(c));\n  }\n  function s(c) {\n    return c === 35 ? (e.consume(c), s) : (e.exit(\"atxHeadingSequence\"), l(c));\n  }\n  function u(c) {\n    return c === null || c === 35 || Et(c)\n      ? (e.exit(\"atxHeadingText\"), l(c))\n      : (e.consume(c), u);\n  }\n}\nconst pS = [\n    \"address\",\n    \"article\",\n    \"aside\",\n    \"base\",\n    \"basefont\",\n    \"blockquote\",\n    \"body\",\n    \"caption\",\n    \"center\",\n    \"col\",\n    \"colgroup\",\n    \"dd\",\n    \"details\",\n    \"dialog\",\n    \"dir\",\n    \"div\",\n    \"dl\",\n    \"dt\",\n    \"fieldset\",\n    \"figcaption\",\n    \"figure\",\n    \"footer\",\n    \"form\",\n    \"frame\",\n    \"frameset\",\n    \"h1\",\n    \"h2\",\n    \"h3\",\n    \"h4\",\n    \"h5\",\n    \"h6\",\n    \"head\",\n    \"header\",\n    \"hr\",\n    \"html\",\n    \"iframe\",\n    \"legend\",\n    \"li\",\n    \"link\",\n    \"main\",\n    \"menu\",\n    \"menuitem\",\n    \"nav\",\n    \"noframes\",\n    \"ol\",\n    \"optgroup\",\n    \"option\",\n    \"p\",\n    \"param\",\n    \"search\",\n    \"section\",\n    \"summary\",\n    \"table\",\n    \"tbody\",\n    \"td\",\n    \"tfoot\",\n    \"th\",\n    \"thead\",\n    \"title\",\n    \"tr\",\n    \"track\",\n    \"ul\",\n  ],\n  I0 = [\"pre\", \"script\", \"style\", \"textarea\"],\n  gS = {\n    name: \"htmlFlow\",\n    tokenize: CS,\n    resolveTo: yS,\n    concrete: !0,\n  },\n  mS = {\n    tokenize: xS,\n    partial: !0,\n  },\n  bS = {\n    tokenize: vS,\n    partial: !0,\n  };\nfunction yS(e) {\n  let t = e.length;\n  for (; t-- && !(e[t][0] === \"enter\" && e[t][1].type === \"htmlFlow\"); );\n  return (\n    t > 1 &&\n      e[t - 2][1].type === \"linePrefix\" &&\n      ((e[t][1].start = e[t - 2][1].start),\n      (e[t + 1][1].start = e[t - 2][1].start),\n      e.splice(t - 2, 2)),\n    e\n  );\n}\nfunction CS(e, t, n) {\n  const o = this;\n  let r, i, a, l, s;\n  return u;\n  function u(A) {\n    return c(A);\n  }\n  function c(A) {\n    return e.enter(\"htmlFlow\"), e.enter(\"htmlFlowData\"), e.consume(A), d;\n  }\n  function d(A) {\n    return A === 33\n      ? (e.consume(A), p)\n      : A === 47\n        ? (e.consume(A), (i = !0), b)\n        : A === 63\n          ? (e.consume(A), (r = 3), o.interrupt ? t : C)\n          : cn(A)\n            ? (e.consume(A), (a = String.fromCharCode(A)), y)\n            : n(A);\n  }\n  function p(A) {\n    return A === 45\n      ? (e.consume(A), (r = 2), h)\n      : A === 91\n        ? (e.consume(A), (r = 5), (l = 0), m)\n        : cn(A)\n          ? (e.consume(A), (r = 4), o.interrupt ? t : C)\n          : n(A);\n  }\n  function h(A) {\n    return A === 45 ? (e.consume(A), o.interrupt ? t : C) : n(A);\n  }\n  function m(A) {\n    const W = \"CDATA[\";\n    return A === W.charCodeAt(l++)\n      ? (e.consume(A), l === W.length ? (o.interrupt ? t : P) : m)\n      : n(A);\n  }\n  function b(A) {\n    return cn(A) ? (e.consume(A), (a = String.fromCharCode(A)), y) : n(A);\n  }\n  function y(A) {\n    if (A === null || A === 47 || A === 62 || Et(A)) {\n      const W = A === 47,\n        G = a.toLowerCase();\n      return !W && !i && I0.includes(G)\n        ? ((r = 1), o.interrupt ? t(A) : P(A))\n        : pS.includes(a.toLowerCase())\n          ? ((r = 6), W ? (e.consume(A), g) : o.interrupt ? t(A) : P(A))\n          : ((r = 7),\n            o.interrupt && !o.parser.lazy[o.now().line]\n              ? n(A)\n              : i\n                ? x(A)\n                : v(A));\n    }\n    return A === 45 || At(A)\n      ? (e.consume(A), (a += String.fromCharCode(A)), y)\n      : n(A);\n  }\n  function g(A) {\n    return A === 62 ? (e.consume(A), o.interrupt ? t : P) : n(A);\n  }\n  function x(A) {\n    return Ne(A) ? (e.consume(A), x) : R(A);\n  }\n  function v(A) {\n    return A === 47\n      ? (e.consume(A), R)\n      : A === 58 || A === 95 || cn(A)\n        ? (e.consume(A), S)\n        : Ne(A)\n          ? (e.consume(A), v)\n          : R(A);\n  }\n  function S(A) {\n    return A === 45 || A === 46 || A === 58 || A === 95 || At(A)\n      ? (e.consume(A), S)\n      : w(A);\n  }\n  function w(A) {\n    return A === 61 ? (e.consume(A), E) : Ne(A) ? (e.consume(A), w) : v(A);\n  }\n  function E(A) {\n    return A === null || A === 60 || A === 61 || A === 62 || A === 96\n      ? n(A)\n      : A === 34 || A === 39\n        ? (e.consume(A), (s = A), M)\n        : Ne(A)\n          ? (e.consume(A), E)\n          : _(A);\n  }\n  function M(A) {\n    return A === s\n      ? (e.consume(A), (s = null), j)\n      : A === null || pe(A)\n        ? n(A)\n        : (e.consume(A), M);\n  }\n  function _(A) {\n    return A === null ||\n      A === 34 ||\n      A === 39 ||\n      A === 47 ||\n      A === 60 ||\n      A === 61 ||\n      A === 62 ||\n      A === 96 ||\n      Et(A)\n      ? w(A)\n      : (e.consume(A), _);\n  }\n  function j(A) {\n    return A === 47 || A === 62 || Ne(A) ? v(A) : n(A);\n  }\n  function R(A) {\n    return A === 62 ? (e.consume(A), D) : n(A);\n  }\n  function D(A) {\n    return A === null || pe(A) ? P(A) : Ne(A) ? (e.consume(A), D) : n(A);\n  }\n  function P(A) {\n    return A === 45 && r === 2\n      ? (e.consume(A), T)\n      : A === 60 && r === 1\n        ? (e.consume(A), F)\n        : A === 62 && r === 4\n          ? (e.consume(A), H)\n          : A === 63 && r === 3\n            ? (e.consume(A), C)\n            : A === 93 && r === 5\n              ? (e.consume(A), L)\n              : pe(A) && (r === 6 || r === 7)\n                ? (e.exit(\"htmlFlowData\"), e.check(mS, B, V)(A))\n                : A === null || pe(A)\n                  ? (e.exit(\"htmlFlowData\"), V(A))\n                  : (e.consume(A), P);\n  }\n  function V(A) {\n    return e.check(bS, k, B)(A);\n  }\n  function k(A) {\n    return e.enter(\"lineEnding\"), e.consume(A), e.exit(\"lineEnding\"), N;\n  }\n  function N(A) {\n    return A === null || pe(A) ? V(A) : (e.enter(\"htmlFlowData\"), P(A));\n  }\n  function T(A) {\n    return A === 45 ? (e.consume(A), C) : P(A);\n  }\n  function F(A) {\n    return A === 47 ? (e.consume(A), (a = \"\"), I) : P(A);\n  }\n  function I(A) {\n    if (A === 62) {\n      const W = a.toLowerCase();\n      return I0.includes(W) ? (e.consume(A), H) : P(A);\n    }\n    return cn(A) && a.length < 8\n      ? (e.consume(A), (a += String.fromCharCode(A)), I)\n      : P(A);\n  }\n  function L(A) {\n    return A === 93 ? (e.consume(A), C) : P(A);\n  }\n  function C(A) {\n    return A === 62\n      ? (e.consume(A), H)\n      : A === 45 && r === 2\n        ? (e.consume(A), C)\n        : P(A);\n  }\n  function H(A) {\n    return A === null || pe(A)\n      ? (e.exit(\"htmlFlowData\"), B(A))\n      : (e.consume(A), H);\n  }\n  function B(A) {\n    return e.exit(\"htmlFlow\"), t(A);\n  }\n}\nfunction vS(e, t, n) {\n  const o = this;\n  return r;\n  function r(a) {\n    return pe(a)\n      ? (e.enter(\"lineEnding\"), e.consume(a), e.exit(\"lineEnding\"), i)\n      : n(a);\n  }\n  function i(a) {\n    return o.parser.lazy[o.now().line] ? n(a) : t(a);\n  }\n}\nfunction xS(e, t, n) {\n  return o;\n  function o(r) {\n    return (\n      e.enter(\"lineEnding\"),\n      e.consume(r),\n      e.exit(\"lineEnding\"),\n      e.attempt(Ca, t, n)\n    );\n  }\n}\nconst wS = {\n  name: \"htmlText\",\n  tokenize: ES,\n};\nfunction ES(e, t, n) {\n  const o = this;\n  let r, i, a;\n  return l;\n  function l(C) {\n    return e.enter(\"htmlText\"), e.enter(\"htmlTextData\"), e.consume(C), s;\n  }\n  function s(C) {\n    return C === 33\n      ? (e.consume(C), u)\n      : C === 47\n        ? (e.consume(C), w)\n        : C === 63\n          ? (e.consume(C), v)\n          : cn(C)\n            ? (e.consume(C), _)\n            : n(C);\n  }\n  function u(C) {\n    return C === 45\n      ? (e.consume(C), c)\n      : C === 91\n        ? (e.consume(C), (i = 0), m)\n        : cn(C)\n          ? (e.consume(C), x)\n          : n(C);\n  }\n  function c(C) {\n    return C === 45 ? (e.consume(C), h) : n(C);\n  }\n  function d(C) {\n    return C === null\n      ? n(C)\n      : C === 45\n        ? (e.consume(C), p)\n        : pe(C)\n          ? ((a = d), F(C))\n          : (e.consume(C), d);\n  }\n  function p(C) {\n    return C === 45 ? (e.consume(C), h) : d(C);\n  }\n  function h(C) {\n    return C === 62 ? T(C) : C === 45 ? p(C) : d(C);\n  }\n  function m(C) {\n    const H = \"CDATA[\";\n    return C === H.charCodeAt(i++)\n      ? (e.consume(C), i === H.length ? b : m)\n      : n(C);\n  }\n  function b(C) {\n    return C === null\n      ? n(C)\n      : C === 93\n        ? (e.consume(C), y)\n        : pe(C)\n          ? ((a = b), F(C))\n          : (e.consume(C), b);\n  }\n  function y(C) {\n    return C === 93 ? (e.consume(C), g) : b(C);\n  }\n  function g(C) {\n    return C === 62 ? T(C) : C === 93 ? (e.consume(C), g) : b(C);\n  }\n  function x(C) {\n    return C === null || C === 62\n      ? T(C)\n      : pe(C)\n        ? ((a = x), F(C))\n        : (e.consume(C), x);\n  }\n  function v(C) {\n    return C === null\n      ? n(C)\n      : C === 63\n        ? (e.consume(C), S)\n        : pe(C)\n          ? ((a = v), F(C))\n          : (e.consume(C), v);\n  }\n  function S(C) {\n    return C === 62 ? T(C) : v(C);\n  }\n  function w(C) {\n    return cn(C) ? (e.consume(C), E) : n(C);\n  }\n  function E(C) {\n    return C === 45 || At(C) ? (e.consume(C), E) : M(C);\n  }\n  function M(C) {\n    return pe(C) ? ((a = M), F(C)) : Ne(C) ? (e.consume(C), M) : T(C);\n  }\n  function _(C) {\n    return C === 45 || At(C)\n      ? (e.consume(C), _)\n      : C === 47 || C === 62 || Et(C)\n        ? j(C)\n        : n(C);\n  }\n  function j(C) {\n    return C === 47\n      ? (e.consume(C), T)\n      : C === 58 || C === 95 || cn(C)\n        ? (e.consume(C), R)\n        : pe(C)\n          ? ((a = j), F(C))\n          : Ne(C)\n            ? (e.consume(C), j)\n            : T(C);\n  }\n  function R(C) {\n    return C === 45 || C === 46 || C === 58 || C === 95 || At(C)\n      ? (e.consume(C), R)\n      : D(C);\n  }\n  function D(C) {\n    return C === 61\n      ? (e.consume(C), P)\n      : pe(C)\n        ? ((a = D), F(C))\n        : Ne(C)\n          ? (e.consume(C), D)\n          : j(C);\n  }\n  function P(C) {\n    return C === null || C === 60 || C === 61 || C === 62 || C === 96\n      ? n(C)\n      : C === 34 || C === 39\n        ? (e.consume(C), (r = C), V)\n        : pe(C)\n          ? ((a = P), F(C))\n          : Ne(C)\n            ? (e.consume(C), P)\n            : (e.consume(C), k);\n  }\n  function V(C) {\n    return C === r\n      ? (e.consume(C), (r = void 0), N)\n      : C === null\n        ? n(C)\n        : pe(C)\n          ? ((a = V), F(C))\n          : (e.consume(C), V);\n  }\n  function k(C) {\n    return C === null ||\n      C === 34 ||\n      C === 39 ||\n      C === 60 ||\n      C === 61 ||\n      C === 96\n      ? n(C)\n      : C === 47 || C === 62 || Et(C)\n        ? j(C)\n        : (e.consume(C), k);\n  }\n  function N(C) {\n    return C === 47 || C === 62 || Et(C) ? j(C) : n(C);\n  }\n  function T(C) {\n    return C === 62\n      ? (e.consume(C), e.exit(\"htmlTextData\"), e.exit(\"htmlText\"), t)\n      : n(C);\n  }\n  function F(C) {\n    return (\n      e.exit(\"htmlTextData\"),\n      e.enter(\"lineEnding\"),\n      e.consume(C),\n      e.exit(\"lineEnding\"),\n      I\n    );\n  }\n  function I(C) {\n    return Ne(C)\n      ? Ve(\n          e,\n          L,\n          \"linePrefix\",\n          o.parser.constructs.disable.null.includes(\"codeIndented\")\n            ? void 0\n            : 4,\n        )(C)\n      : L(C);\n  }\n  function L(C) {\n    return e.enter(\"htmlTextData\"), a(C);\n  }\n}\nconst w1 = {\n    name: \"labelEnd\",\n    tokenize: TS,\n    resolveTo: MS,\n    resolveAll: AS,\n  },\n  SS = {\n    tokenize: OS,\n  },\n  kS = {\n    tokenize: NS,\n  },\n  _S = {\n    tokenize: LS,\n  };\nfunction AS(e) {\n  let t = -1;\n  for (; ++t < e.length; ) {\n    const n = e[t][1];\n    (n.type === \"labelImage\" ||\n      n.type === \"labelLink\" ||\n      n.type === \"labelEnd\") &&\n      (e.splice(t + 1, n.type === \"labelImage\" ? 4 : 2),\n      (n.type = \"data\"),\n      t++);\n  }\n  return e;\n}\nfunction MS(e, t) {\n  let n = e.length,\n    o = 0,\n    r,\n    i,\n    a,\n    l;\n  for (; n--; )\n    if (((r = e[n][1]), i)) {\n      if (r.type === \"link\" || (r.type === \"labelLink\" && r._inactive)) break;\n      e[n][0] === \"enter\" && r.type === \"labelLink\" && (r._inactive = !0);\n    } else if (a) {\n      if (\n        e[n][0] === \"enter\" &&\n        (r.type === \"labelImage\" || r.type === \"labelLink\") &&\n        !r._balanced &&\n        ((i = n), r.type !== \"labelLink\")\n      ) {\n        o = 2;\n        break;\n      }\n    } else r.type === \"labelEnd\" && (a = n);\n  const s = {\n      type: e[i][1].type === \"labelLink\" ? \"link\" : \"image\",\n      start: Object.assign({}, e[i][1].start),\n      end: Object.assign({}, e[e.length - 1][1].end),\n    },\n    u = {\n      type: \"label\",\n      start: Object.assign({}, e[i][1].start),\n      end: Object.assign({}, e[a][1].end),\n    },\n    c = {\n      type: \"labelText\",\n      start: Object.assign({}, e[i + o + 2][1].end),\n      end: Object.assign({}, e[a - 2][1].start),\n    };\n  return (\n    (l = [\n      [\"enter\", s, t],\n      [\"enter\", u, t],\n    ]),\n    (l = Rt(l, e.slice(i + 1, i + o + 3))),\n    (l = Rt(l, [[\"enter\", c, t]])),\n    (l = Rt(\n      l,\n      v1(t.parser.constructs.insideSpan.null, e.slice(i + o + 4, a - 3), t),\n    )),\n    (l = Rt(l, [[\"exit\", c, t], e[a - 2], e[a - 1], [\"exit\", u, t]])),\n    (l = Rt(l, e.slice(a + 1))),\n    (l = Rt(l, [[\"exit\", s, t]])),\n    dn(e, i, e.length, l),\n    e\n  );\n}\nfunction TS(e, t, n) {\n  const o = this;\n  let r = o.events.length,\n    i,\n    a;\n  for (; r--; )\n    if (\n      (o.events[r][1].type === \"labelImage\" ||\n        o.events[r][1].type === \"labelLink\") &&\n      !o.events[r][1]._balanced\n    ) {\n      i = o.events[r][1];\n      break;\n    }\n  return l;\n  function l(p) {\n    return i\n      ? i._inactive\n        ? d(p)\n        : ((a = o.parser.defined.includes(\n            Eo(\n              o.sliceSerialize({\n                start: i.end,\n                end: o.now(),\n              }),\n            ),\n          )),\n          e.enter(\"labelEnd\"),\n          e.enter(\"labelMarker\"),\n          e.consume(p),\n          e.exit(\"labelMarker\"),\n          e.exit(\"labelEnd\"),\n          s)\n      : n(p);\n  }\n  function s(p) {\n    return p === 40\n      ? e.attempt(SS, c, a ? c : d)(p)\n      : p === 91\n        ? e.attempt(kS, c, a ? u : d)(p)\n        : a\n          ? c(p)\n          : d(p);\n  }\n  function u(p) {\n    return e.attempt(_S, c, d)(p);\n  }\n  function c(p) {\n    return t(p);\n  }\n  function d(p) {\n    return (i._balanced = !0), n(p);\n  }\n}\nfunction OS(e, t, n) {\n  return o;\n  function o(d) {\n    return (\n      e.enter(\"resource\"),\n      e.enter(\"resourceMarker\"),\n      e.consume(d),\n      e.exit(\"resourceMarker\"),\n      r\n    );\n  }\n  function r(d) {\n    return Et(d) ? ur(e, i)(d) : i(d);\n  }\n  function i(d) {\n    return d === 41\n      ? c(d)\n      : xf(\n          e,\n          a,\n          l,\n          \"resourceDestination\",\n          \"resourceDestinationLiteral\",\n          \"resourceDestinationLiteralMarker\",\n          \"resourceDestinationRaw\",\n          \"resourceDestinationString\",\n          32,\n        )(d);\n  }\n  function a(d) {\n    return Et(d) ? ur(e, s)(d) : c(d);\n  }\n  function l(d) {\n    return n(d);\n  }\n  function s(d) {\n    return d === 34 || d === 39 || d === 40\n      ? Ef(\n          e,\n          u,\n          n,\n          \"resourceTitle\",\n          \"resourceTitleMarker\",\n          \"resourceTitleString\",\n        )(d)\n      : c(d);\n  }\n  function u(d) {\n    return Et(d) ? ur(e, c)(d) : c(d);\n  }\n  function c(d) {\n    return d === 41\n      ? (e.enter(\"resourceMarker\"),\n        e.consume(d),\n        e.exit(\"resourceMarker\"),\n        e.exit(\"resource\"),\n        t)\n      : n(d);\n  }\n}\nfunction NS(e, t, n) {\n  const o = this;\n  return r;\n  function r(l) {\n    return wf.call(\n      o,\n      e,\n      i,\n      a,\n      \"reference\",\n      \"referenceMarker\",\n      \"referenceString\",\n    )(l);\n  }\n  function i(l) {\n    return o.parser.defined.includes(\n      Eo(o.sliceSerialize(o.events[o.events.length - 1][1]).slice(1, -1)),\n    )\n      ? t(l)\n      : n(l);\n  }\n  function a(l) {\n    return n(l);\n  }\n}\nfunction LS(e, t, n) {\n  return o;\n  function o(i) {\n    return (\n      e.enter(\"reference\"),\n      e.enter(\"referenceMarker\"),\n      e.consume(i),\n      e.exit(\"referenceMarker\"),\n      r\n    );\n  }\n  function r(i) {\n    return i === 93\n      ? (e.enter(\"referenceMarker\"),\n        e.consume(i),\n        e.exit(\"referenceMarker\"),\n        e.exit(\"reference\"),\n        t)\n      : n(i);\n  }\n}\nconst DS = {\n  name: \"labelStartImage\",\n  tokenize: jS,\n  resolveAll: w1.resolveAll,\n};\nfunction jS(e, t, n) {\n  const o = this;\n  return r;\n  function r(l) {\n    return (\n      e.enter(\"labelImage\"),\n      e.enter(\"labelImageMarker\"),\n      e.consume(l),\n      e.exit(\"labelImageMarker\"),\n      i\n    );\n  }\n  function i(l) {\n    return l === 91\n      ? (e.enter(\"labelMarker\"),\n        e.consume(l),\n        e.exit(\"labelMarker\"),\n        e.exit(\"labelImage\"),\n        a)\n      : n(l);\n  }\n  function a(l) {\n    return l === 94 && \"_hiddenFootnoteSupport\" in o.parser.constructs\n      ? n(l)\n      : t(l);\n  }\n}\nconst FS = {\n  name: \"labelStartLink\",\n  tokenize: RS,\n  resolveAll: w1.resolveAll,\n};\nfunction RS(e, t, n) {\n  const o = this;\n  return r;\n  function r(a) {\n    return (\n      e.enter(\"labelLink\"),\n      e.enter(\"labelMarker\"),\n      e.consume(a),\n      e.exit(\"labelMarker\"),\n      e.exit(\"labelLink\"),\n      i\n    );\n  }\n  function i(a) {\n    return a === 94 && \"_hiddenFootnoteSupport\" in o.parser.constructs\n      ? n(a)\n      : t(a);\n  }\n}\nconst is = {\n  name: \"lineEnding\",\n  tokenize: IS,\n};\nfunction IS(e, t) {\n  return n;\n  function n(o) {\n    return (\n      e.enter(\"lineEnding\"),\n      e.consume(o),\n      e.exit(\"lineEnding\"),\n      Ve(e, t, \"linePrefix\")\n    );\n  }\n}\nconst Mi = {\n  name: \"thematicBreak\",\n  tokenize: HS,\n};\nfunction HS(e, t, n) {\n  let o = 0,\n    r;\n  return i;\n  function i(u) {\n    return e.enter(\"thematicBreak\"), a(u);\n  }\n  function a(u) {\n    return (r = u), l(u);\n  }\n  function l(u) {\n    return u === r\n      ? (e.enter(\"thematicBreakSequence\"), s(u))\n      : o >= 3 && (u === null || pe(u))\n        ? (e.exit(\"thematicBreak\"), t(u))\n        : n(u);\n  }\n  function s(u) {\n    return u === r\n      ? (e.consume(u), o++, s)\n      : (e.exit(\"thematicBreakSequence\"),\n        Ne(u) ? Ve(e, l, \"whitespace\")(u) : l(u));\n  }\n}\nconst Ct = {\n    name: \"list\",\n    tokenize: BS,\n    continuation: {\n      tokenize: VS,\n    },\n    exit: WS,\n  },\n  zS = {\n    tokenize: ZS,\n    partial: !0,\n  },\n  PS = {\n    tokenize: $S,\n    partial: !0,\n  };\nfunction BS(e, t, n) {\n  const o = this,\n    r = o.events[o.events.length - 1];\n  let i =\n      r && r[1].type === \"linePrefix\"\n        ? r[2].sliceSerialize(r[1], !0).length\n        : 0,\n    a = 0;\n  return l;\n  function l(h) {\n    const m =\n      o.containerState.type ||\n      (h === 42 || h === 43 || h === 45 ? \"listUnordered\" : \"listOrdered\");\n    if (\n      m === \"listUnordered\"\n        ? !o.containerState.marker || h === o.containerState.marker\n        : Qs(h)\n    ) {\n      if (\n        (o.containerState.type ||\n          ((o.containerState.type = m),\n          e.enter(m, {\n            _container: !0,\n          })),\n        m === \"listUnordered\")\n      )\n        return (\n          e.enter(\"listItemPrefix\"),\n          h === 42 || h === 45 ? e.check(Mi, n, u)(h) : u(h)\n        );\n      if (!o.interrupt || h === 49)\n        return e.enter(\"listItemPrefix\"), e.enter(\"listItemValue\"), s(h);\n    }\n    return n(h);\n  }\n  function s(h) {\n    return Qs(h) && ++a < 10\n      ? (e.consume(h), s)\n      : (!o.interrupt || a < 2) &&\n          (o.containerState.marker\n            ? h === o.containerState.marker\n            : h === 41 || h === 46)\n        ? (e.exit(\"listItemValue\"), u(h))\n        : n(h);\n  }\n  function u(h) {\n    return (\n      e.enter(\"listItemMarker\"),\n      e.consume(h),\n      e.exit(\"listItemMarker\"),\n      (o.containerState.marker = o.containerState.marker || h),\n      e.check(\n        Ca,\n        // Can’t be empty when interrupting.\n        o.interrupt ? n : c,\n        e.attempt(zS, p, d),\n      )\n    );\n  }\n  function c(h) {\n    return (o.containerState.initialBlankLine = !0), i++, p(h);\n  }\n  function d(h) {\n    return Ne(h)\n      ? (e.enter(\"listItemPrefixWhitespace\"),\n        e.consume(h),\n        e.exit(\"listItemPrefixWhitespace\"),\n        p)\n      : n(h);\n  }\n  function p(h) {\n    return (\n      (o.containerState.size =\n        i + o.sliceSerialize(e.exit(\"listItemPrefix\"), !0).length),\n      t(h)\n    );\n  }\n}\nfunction VS(e, t, n) {\n  const o = this;\n  return (o.containerState._closeFlow = void 0), e.check(Ca, r, i);\n  function r(l) {\n    return (\n      (o.containerState.furtherBlankLines =\n        o.containerState.furtherBlankLines ||\n        o.containerState.initialBlankLine),\n      Ve(e, t, \"listItemIndent\", o.containerState.size + 1)(l)\n    );\n  }\n  function i(l) {\n    return o.containerState.furtherBlankLines || !Ne(l)\n      ? ((o.containerState.furtherBlankLines = void 0),\n        (o.containerState.initialBlankLine = void 0),\n        a(l))\n      : ((o.containerState.furtherBlankLines = void 0),\n        (o.containerState.initialBlankLine = void 0),\n        e.attempt(PS, t, a)(l));\n  }\n  function a(l) {\n    return (\n      (o.containerState._closeFlow = !0),\n      (o.interrupt = void 0),\n      Ve(\n        e,\n        e.attempt(Ct, t, n),\n        \"linePrefix\",\n        o.parser.constructs.disable.null.includes(\"codeIndented\") ? void 0 : 4,\n      )(l)\n    );\n  }\n}\nfunction $S(e, t, n) {\n  const o = this;\n  return Ve(e, r, \"listItemIndent\", o.containerState.size + 1);\n  function r(i) {\n    const a = o.events[o.events.length - 1];\n    return a &&\n      a[1].type === \"listItemIndent\" &&\n      a[2].sliceSerialize(a[1], !0).length === o.containerState.size\n      ? t(i)\n      : n(i);\n  }\n}\nfunction WS(e) {\n  e.exit(this.containerState.type);\n}\nfunction ZS(e, t, n) {\n  const o = this;\n  return Ve(\n    e,\n    r,\n    \"listItemPrefixWhitespace\",\n    o.parser.constructs.disable.null.includes(\"codeIndented\") ? void 0 : 5,\n  );\n  function r(i) {\n    const a = o.events[o.events.length - 1];\n    return !Ne(i) && a && a[1].type === \"listItemPrefixWhitespace\"\n      ? t(i)\n      : n(i);\n  }\n}\nconst H0 = {\n  name: \"setextUnderline\",\n  tokenize: qS,\n  resolveTo: US,\n};\nfunction US(e, t) {\n  let n = e.length,\n    o,\n    r,\n    i;\n  for (; n--; )\n    if (e[n][0] === \"enter\") {\n      if (e[n][1].type === \"content\") {\n        o = n;\n        break;\n      }\n      e[n][1].type === \"paragraph\" && (r = n);\n    } else\n      e[n][1].type === \"content\" && e.splice(n, 1),\n        !i && e[n][1].type === \"definition\" && (i = n);\n  const a = {\n    type: \"setextHeading\",\n    start: Object.assign({}, e[r][1].start),\n    end: Object.assign({}, e[e.length - 1][1].end),\n  };\n  return (\n    (e[r][1].type = \"setextHeadingText\"),\n    i\n      ? (e.splice(r, 0, [\"enter\", a, t]),\n        e.splice(i + 1, 0, [\"exit\", e[o][1], t]),\n        (e[o][1].end = Object.assign({}, e[i][1].end)))\n      : (e[o][1] = a),\n    e.push([\"exit\", a, t]),\n    e\n  );\n}\nfunction qS(e, t, n) {\n  const o = this;\n  let r;\n  return i;\n  function i(u) {\n    let c = o.events.length,\n      d;\n    for (; c--; )\n      if (\n        o.events[c][1].type !== \"lineEnding\" &&\n        o.events[c][1].type !== \"linePrefix\" &&\n        o.events[c][1].type !== \"content\"\n      ) {\n        d = o.events[c][1].type === \"paragraph\";\n        break;\n      }\n    return !o.parser.lazy[o.now().line] && (o.interrupt || d)\n      ? (e.enter(\"setextHeadingLine\"), (r = u), a(u))\n      : n(u);\n  }\n  function a(u) {\n    return e.enter(\"setextHeadingLineSequence\"), l(u);\n  }\n  function l(u) {\n    return u === r\n      ? (e.consume(u), l)\n      : (e.exit(\"setextHeadingLineSequence\"),\n        Ne(u) ? Ve(e, s, \"lineSuffix\")(u) : s(u));\n  }\n  function s(u) {\n    return u === null || pe(u) ? (e.exit(\"setextHeadingLine\"), t(u)) : n(u);\n  }\n}\nconst YS = {\n  tokenize: GS,\n};\nfunction GS(e) {\n  const t = this,\n    n = e.attempt(\n      // Try to parse a blank line.\n      Ca,\n      o,\n      // Try to parse initial flow (essentially, only code).\n      e.attempt(\n        this.parser.constructs.flowInitial,\n        r,\n        Ve(\n          e,\n          e.attempt(this.parser.constructs.flow, r, e.attempt(eS, r)),\n          \"linePrefix\",\n        ),\n      ),\n    );\n  return n;\n  function o(i) {\n    if (i === null) {\n      e.consume(i);\n      return;\n    }\n    return (\n      e.enter(\"lineEndingBlank\"),\n      e.consume(i),\n      e.exit(\"lineEndingBlank\"),\n      (t.currentConstruct = void 0),\n      n\n    );\n  }\n  function r(i) {\n    if (i === null) {\n      e.consume(i);\n      return;\n    }\n    return (\n      e.enter(\"lineEnding\"),\n      e.consume(i),\n      e.exit(\"lineEnding\"),\n      (t.currentConstruct = void 0),\n      n\n    );\n  }\n}\nconst KS = {\n    resolveAll: kf(),\n  },\n  XS = Sf(\"string\"),\n  QS = Sf(\"text\");\nfunction Sf(e) {\n  return {\n    tokenize: t,\n    resolveAll: kf(e === \"text\" ? JS : void 0),\n  };\n  function t(n) {\n    const o = this,\n      r = this.parser.constructs[e],\n      i = n.attempt(r, a, l);\n    return a;\n    function a(c) {\n      return u(c) ? i(c) : l(c);\n    }\n    function l(c) {\n      if (c === null) {\n        n.consume(c);\n        return;\n      }\n      return n.enter(\"data\"), n.consume(c), s;\n    }\n    function s(c) {\n      return u(c) ? (n.exit(\"data\"), i(c)) : (n.consume(c), s);\n    }\n    function u(c) {\n      if (c === null) return !0;\n      const d = r[c];\n      let p = -1;\n      if (d)\n        for (; ++p < d.length; ) {\n          const h = d[p];\n          if (!h.previous || h.previous.call(o, o.previous)) return !0;\n        }\n      return !1;\n    }\n  }\n}\nfunction kf(e) {\n  return t;\n  function t(n, o) {\n    let r = -1,\n      i;\n    for (; ++r <= n.length; )\n      i === void 0\n        ? n[r] && n[r][1].type === \"data\" && ((i = r), r++)\n        : (!n[r] || n[r][1].type !== \"data\") &&\n          (r !== i + 2 &&\n            ((n[i][1].end = n[r - 1][1].end),\n            n.splice(i + 2, r - i - 2),\n            (r = i + 2)),\n          (i = void 0));\n    return e ? e(n, o) : n;\n  }\n}\nfunction JS(e, t) {\n  let n = 0;\n  for (; ++n <= e.length; )\n    if (\n      (n === e.length || e[n][1].type === \"lineEnding\") &&\n      e[n - 1][1].type === \"data\"\n    ) {\n      const o = e[n - 1][1],\n        r = t.sliceStream(o);\n      let i = r.length,\n        a = -1,\n        l = 0,\n        s;\n      for (; i--; ) {\n        const u = r[i];\n        if (typeof u == \"string\") {\n          for (a = u.length; u.charCodeAt(a - 1) === 32; ) l++, a--;\n          if (a) break;\n          a = -1;\n        } else if (u === -2) (s = !0), l++;\n        else if (u !== -1) {\n          i++;\n          break;\n        }\n      }\n      if (l) {\n        const u = {\n          type:\n            n === e.length || s || l < 2 ? \"lineSuffix\" : \"hardBreakTrailing\",\n          start: {\n            line: o.end.line,\n            column: o.end.column - l,\n            offset: o.end.offset - l,\n            _index: o.start._index + i,\n            _bufferIndex: i ? a : o.start._bufferIndex + a,\n          },\n          end: Object.assign({}, o.end),\n        };\n        (o.end = Object.assign({}, u.start)),\n          o.start.offset === o.end.offset\n            ? Object.assign(o, u)\n            : (e.splice(n, 0, [\"enter\", u, t], [\"exit\", u, t]), (n += 2));\n      }\n      n++;\n    }\n  return e;\n}\nfunction ek(e, t, n) {\n  let o = Object.assign(\n    n\n      ? Object.assign({}, n)\n      : {\n          line: 1,\n          column: 1,\n          offset: 0,\n        },\n    {\n      _index: 0,\n      _bufferIndex: -1,\n    },\n  );\n  const r = {},\n    i = [];\n  let a = [],\n    l = [];\n  const s = {\n      consume: x,\n      enter: v,\n      exit: S,\n      attempt: M(w),\n      check: M(E),\n      interrupt: M(E, {\n        interrupt: !0,\n      }),\n    },\n    u = {\n      previous: null,\n      code: null,\n      containerState: {},\n      events: [],\n      parser: e,\n      sliceStream: h,\n      sliceSerialize: p,\n      now: m,\n      defineSkip: b,\n      write: d,\n    };\n  let c = t.tokenize.call(u, s);\n  return t.resolveAll && i.push(t), u;\n  function d(D) {\n    return (\n      (a = Rt(a, D)),\n      y(),\n      a[a.length - 1] !== null\n        ? []\n        : (_(t, 0), (u.events = v1(i, u.events, u)), u.events)\n    );\n  }\n  function p(D, P) {\n    return nk(h(D), P);\n  }\n  function h(D) {\n    return tk(a, D);\n  }\n  function m() {\n    const { line: D, column: P, offset: V, _index: k, _bufferIndex: N } = o;\n    return {\n      line: D,\n      column: P,\n      offset: V,\n      _index: k,\n      _bufferIndex: N,\n    };\n  }\n  function b(D) {\n    (r[D.line] = D.column), R();\n  }\n  function y() {\n    let D;\n    for (; o._index < a.length; ) {\n      const P = a[o._index];\n      if (typeof P == \"string\")\n        for (\n          D = o._index, o._bufferIndex < 0 && (o._bufferIndex = 0);\n          o._index === D && o._bufferIndex < P.length;\n\n        )\n          g(P.charCodeAt(o._bufferIndex));\n      else g(P);\n    }\n  }\n  function g(D) {\n    c = c(D);\n  }\n  function x(D) {\n    pe(D)\n      ? (o.line++, (o.column = 1), (o.offset += D === -3 ? 2 : 1), R())\n      : D !== -1 && (o.column++, o.offset++),\n      o._bufferIndex < 0\n        ? o._index++\n        : (o._bufferIndex++,\n          o._bufferIndex === a[o._index].length &&\n            ((o._bufferIndex = -1), o._index++)),\n      (u.previous = D);\n  }\n  function v(D, P) {\n    const V = P || {};\n    return (\n      (V.type = D),\n      (V.start = m()),\n      u.events.push([\"enter\", V, u]),\n      l.push(V),\n      V\n    );\n  }\n  function S(D) {\n    const P = l.pop();\n    return (P.end = m()), u.events.push([\"exit\", P, u]), P;\n  }\n  function w(D, P) {\n    _(D, P.from);\n  }\n  function E(D, P) {\n    P.restore();\n  }\n  function M(D, P) {\n    return V;\n    function V(k, N, T) {\n      let F, I, L, C;\n      return Array.isArray(k)\n        ? B(k)\n        : \"tokenize\" in k\n          ? // @ts-expect-error Looks like a construct.\n            B([k])\n          : H(k);\n      function H(K) {\n        return Q;\n        function Q(ne) {\n          const oe = ne !== null && K[ne],\n            U = ne !== null && K.null,\n            ge = [\n              // To do: add more extension tests.\n              /* c8 ignore next 2 */\n              ...(Array.isArray(oe) ? oe : oe ? [oe] : []),\n              ...(Array.isArray(U) ? U : U ? [U] : []),\n            ];\n          return B(ge)(ne);\n        }\n      }\n      function B(K) {\n        return (F = K), (I = 0), K.length === 0 ? T : A(K[I]);\n      }\n      function A(K) {\n        return Q;\n        function Q(ne) {\n          return (\n            (C = j()),\n            (L = K),\n            K.partial || (u.currentConstruct = K),\n            K.name && u.parser.constructs.disable.null.includes(K.name)\n              ? G()\n              : K.tokenize.call(\n                  // If we do have fields, create an object w/ `context` as its\n                  // prototype.\n                  // This allows a “live binding”, which is needed for `interrupt`.\n                  P ? Object.assign(Object.create(u), P) : u,\n                  s,\n                  W,\n                  G,\n                )(ne)\n          );\n        }\n      }\n      function W(K) {\n        return D(L, C), N;\n      }\n      function G(K) {\n        return C.restore(), ++I < F.length ? A(F[I]) : T;\n      }\n    }\n  }\n  function _(D, P) {\n    D.resolveAll && !i.includes(D) && i.push(D),\n      D.resolve &&\n        dn(u.events, P, u.events.length - P, D.resolve(u.events.slice(P), u)),\n      D.resolveTo && (u.events = D.resolveTo(u.events, u));\n  }\n  function j() {\n    const D = m(),\n      P = u.previous,\n      V = u.currentConstruct,\n      k = u.events.length,\n      N = Array.from(l);\n    return {\n      restore: T,\n      from: k,\n    };\n    function T() {\n      (o = D),\n        (u.previous = P),\n        (u.currentConstruct = V),\n        (u.events.length = k),\n        (l = N),\n        R();\n    }\n  }\n  function R() {\n    o.line in r &&\n      o.column < 2 &&\n      ((o.column = r[o.line]), (o.offset += r[o.line] - 1));\n  }\n}\nfunction tk(e, t) {\n  const n = t.start._index,\n    o = t.start._bufferIndex,\n    r = t.end._index,\n    i = t.end._bufferIndex;\n  let a;\n  if (n === r) a = [e[n].slice(o, i)];\n  else {\n    if (((a = e.slice(n, r)), o > -1)) {\n      const l = a[0];\n      typeof l == \"string\" ? (a[0] = l.slice(o)) : a.shift();\n    }\n    i > 0 && a.push(e[r].slice(0, i));\n  }\n  return a;\n}\nfunction nk(e, t) {\n  let n = -1;\n  const o = [];\n  let r;\n  for (; ++n < e.length; ) {\n    const i = e[n];\n    let a;\n    if (typeof i == \"string\") a = i;\n    else\n      switch (i) {\n        case -5: {\n          a = \"\\r\";\n          break;\n        }\n        case -4: {\n          a = `\n`;\n          break;\n        }\n        case -3: {\n          a = `\\r\n`;\n          break;\n        }\n        case -2: {\n          a = t ? \" \" : \"\t\";\n          break;\n        }\n        case -1: {\n          if (!t && r) continue;\n          a = \" \";\n          break;\n        }\n        default:\n          a = String.fromCharCode(i);\n      }\n    (r = i === -2), o.push(a);\n  }\n  return o.join(\"\");\n}\nconst ok = {\n    42: Ct,\n    43: Ct,\n    45: Ct,\n    48: Ct,\n    49: Ct,\n    50: Ct,\n    51: Ct,\n    52: Ct,\n    53: Ct,\n    54: Ct,\n    55: Ct,\n    56: Ct,\n    57: Ct,\n    62: bf,\n  },\n  rk = {\n    91: iS,\n  },\n  ik = {\n    [-2]: rs,\n    [-1]: rs,\n    32: rs,\n  },\n  ak = {\n    35: dS,\n    42: Mi,\n    45: [H0, Mi],\n    60: gS,\n    61: H0,\n    95: Mi,\n    96: R0,\n    126: R0,\n  },\n  lk = {\n    38: Cf,\n    92: yf,\n  },\n  sk = {\n    [-5]: is,\n    [-4]: is,\n    [-3]: is,\n    33: DS,\n    38: Cf,\n    42: Js,\n    60: [RE, wS],\n    91: FS,\n    92: [cS, yf],\n    93: w1,\n    95: Js,\n    96: GE,\n  },\n  ck = {\n    null: [Js, KS],\n  },\n  uk = {\n    null: [42, 95],\n  },\n  dk = {\n    null: [],\n  },\n  fk = /* @__PURE__ */ Object.freeze(\n    /* @__PURE__ */ Object.defineProperty(\n      {\n        __proto__: null,\n        attentionMarkers: uk,\n        contentInitial: rk,\n        disable: dk,\n        document: ok,\n        flow: ak,\n        flowInitial: ik,\n        insideSpan: ck,\n        string: lk,\n        text: sk,\n      },\n      Symbol.toStringTag,\n      { value: \"Module\" },\n    ),\n  );\nfunction hk(e) {\n  const n =\n      /** @type {FullNormalizedExtension} */\n      vE([fk, ...((e || {}).extensions || [])]),\n    o = {\n      defined: [],\n      lazy: {},\n      constructs: n,\n      content: r(TE),\n      document: r(NE),\n      flow: r(YS),\n      string: r(XS),\n      text: r(QS),\n    };\n  return o;\n  function r(i) {\n    return a;\n    function a(l) {\n      return ek(o, i, l);\n    }\n  }\n}\nconst z0 = /[\\0\\t\\n\\r]/g;\nfunction pk() {\n  let e = 1,\n    t = \"\",\n    n = !0,\n    o;\n  return r;\n  function r(i, a, l) {\n    const s = [];\n    let u, c, d, p, h;\n    for (\n      i = t + i.toString(a),\n        d = 0,\n        t = \"\",\n        n && (i.charCodeAt(0) === 65279 && d++, (n = void 0));\n      d < i.length;\n\n    ) {\n      if (\n        ((z0.lastIndex = d),\n        (u = z0.exec(i)),\n        (p = u && u.index !== void 0 ? u.index : i.length),\n        (h = i.charCodeAt(p)),\n        !u)\n      ) {\n        t = i.slice(d);\n        break;\n      }\n      if (h === 10 && d === p && o) s.push(-3), (o = void 0);\n      else\n        switch (\n          (o && (s.push(-5), (o = void 0)),\n          d < p && (s.push(i.slice(d, p)), (e += p - d)),\n          h)\n        ) {\n          case 0: {\n            s.push(65533), e++;\n            break;\n          }\n          case 9: {\n            for (c = Math.ceil(e / 4) * 4, s.push(-2); e++ < c; ) s.push(-1);\n            break;\n          }\n          case 10: {\n            s.push(-4), (e = 1);\n            break;\n          }\n          default:\n            (o = !0), (e = 1);\n        }\n      d = p + 1;\n    }\n    return l && (o && s.push(-5), t && s.push(t), s.push(null)), s;\n  }\n}\nfunction gk(e) {\n  for (; !vf(e); );\n  return e;\n}\nfunction _f(e, t) {\n  const n = Number.parseInt(e, t);\n  return (\n    // C0 except for HT, LF, FF, CR, space.\n    n < 9 ||\n      n === 11 ||\n      (n > 13 && n < 32) || // Control character (DEL) of C0, and C1 controls.\n      (n > 126 && n < 160) || // Lone high surrogates and low surrogates.\n      (n > 55295 && n < 57344) || // Noncharacters.\n      (n > 64975 && n < 65008) ||\n      (n & 65535) === 65535 ||\n      (n & 65535) === 65534 || // Out of range\n      n > 1114111\n      ? \"�\"\n      : String.fromCharCode(n)\n  );\n}\nconst mk = /\\\\([!-/:-@[-`{-~])|&(#(?:\\d{1,7}|x[\\da-f]{1,6})|[\\da-z]{1,31});/gi;\nfunction bk(e) {\n  return e.replace(mk, yk);\n}\nfunction yk(e, t, n) {\n  if (t) return t;\n  if (n.charCodeAt(0) === 35) {\n    const r = n.charCodeAt(1),\n      i = r === 120 || r === 88;\n    return _f(n.slice(i ? 2 : 1), i ? 16 : 10);\n  }\n  return x1(n) || e;\n}\nconst Af = {}.hasOwnProperty,\n  Ck =\n    /**\n     * @type {(\n     *   ((value: Value, encoding: Encoding, options?: Options | null | undefined) => Root) &\n     *   ((value: Value, options?: Options | null | undefined) => Root)\n     * )}\n     */\n    /**\n     * @param {Value} value\n     * @param {Encoding | Options | null | undefined} [encoding]\n     * @param {Options | null | undefined} [options]\n     * @returns {Root}\n     */\n    function (e, t, n) {\n      return (\n        typeof t != \"string\" && ((n = t), (t = void 0)),\n        vk(n)(\n          gk(\n            hk(n)\n              .document()\n              .write(pk()(e, t, !0)),\n          ),\n        )\n      );\n    };\nfunction vk(e) {\n  const t = {\n    transforms: [],\n    canContainEols: [\"emphasis\", \"fragment\", \"heading\", \"paragraph\", \"strong\"],\n    enter: {\n      autolink: l(Lt),\n      autolinkProtocol: D,\n      autolinkEmail: D,\n      atxHeading: l(We),\n      blockQuote: l(ge),\n      characterEscape: D,\n      characterReference: D,\n      codeFenced: l(J),\n      codeFencedFenceInfo: s,\n      codeFencedFenceMeta: s,\n      codeIndented: l(J, s),\n      codeText: l(_e, s),\n      codeTextData: D,\n      data: D,\n      codeFlowValue: D,\n      definition: l(ie),\n      definitionDestinationString: s,\n      definitionLabelString: s,\n      definitionTitleString: s,\n      emphasis: l(Ae),\n      hardBreakEscape: l(Ee),\n      hardBreakTrailing: l(Ee),\n      htmlFlow: l(le, s),\n      htmlFlowData: D,\n      htmlText: l(le, s),\n      htmlTextData: D,\n      image: l(Qe),\n      label: s,\n      link: l(Lt),\n      listItem: l(Dt),\n      listItemValue: m,\n      listOrdered: l(nn, h),\n      listUnordered: l(nn),\n      paragraph: l(on),\n      reference: G,\n      referenceString: s,\n      resourceDestinationString: s,\n      resourceTitleString: s,\n      setextHeading: l(We),\n      strong: l(kt),\n      thematicBreak: l(jt),\n    },\n    exit: {\n      atxHeading: c(),\n      atxHeadingSequence: M,\n      autolink: c(),\n      autolinkEmail: U,\n      autolinkProtocol: oe,\n      blockQuote: c(),\n      characterEscapeValue: P,\n      characterReferenceMarkerHexadecimal: Q,\n      characterReferenceMarkerNumeric: Q,\n      characterReferenceValue: ne,\n      codeFenced: c(x),\n      codeFencedFence: g,\n      codeFencedFenceInfo: b,\n      codeFencedFenceMeta: y,\n      codeFlowValue: P,\n      codeIndented: c(v),\n      codeText: c(F),\n      codeTextData: P,\n      data: P,\n      definition: c(),\n      definitionDestinationString: E,\n      definitionLabelString: S,\n      definitionTitleString: w,\n      emphasis: c(),\n      hardBreakEscape: c(k),\n      hardBreakTrailing: c(k),\n      htmlFlow: c(N),\n      htmlFlowData: P,\n      htmlText: c(T),\n      htmlTextData: P,\n      image: c(L),\n      label: H,\n      labelText: C,\n      lineEnding: V,\n      link: c(I),\n      listItem: c(),\n      listOrdered: c(),\n      listUnordered: c(),\n      paragraph: c(),\n      referenceString: K,\n      resourceDestinationString: B,\n      resourceTitleString: A,\n      resource: W,\n      setextHeading: c(R),\n      setextHeadingLineSequence: j,\n      setextHeadingText: _,\n      strong: c(),\n      thematicBreak: c(),\n    },\n  };\n  Mf(t, (e || {}).mdastExtensions || []);\n  const n = {};\n  return o;\n  function o(Z) {\n    let ee = {\n      type: \"root\",\n      children: [],\n    };\n    const ce = {\n        stack: [ee],\n        tokenStack: [],\n        config: t,\n        enter: u,\n        exit: d,\n        buffer: s,\n        resume: p,\n        setData: i,\n        getData: a,\n      },\n      xe = [];\n    let de = -1;\n    for (; ++de < Z.length; )\n      if (Z[de][1].type === \"listOrdered\" || Z[de][1].type === \"listUnordered\")\n        if (Z[de][0] === \"enter\") xe.push(de);\n        else {\n          const $e = xe.pop();\n          de = r(Z, $e, de);\n        }\n    for (de = -1; ++de < Z.length; ) {\n      const $e = t[Z[de][0]];\n      Af.call($e, Z[de][1].type) &&\n        $e[Z[de][1].type].call(\n          Object.assign(\n            {\n              sliceSerialize: Z[de][2].sliceSerialize,\n            },\n            ce,\n          ),\n          Z[de][1],\n        );\n    }\n    if (ce.tokenStack.length > 0) {\n      const $e = ce.tokenStack[ce.tokenStack.length - 1];\n      ($e[1] || P0).call(ce, void 0, $e[0]);\n    }\n    for (\n      ee.position = {\n        start: Tn(\n          Z.length > 0\n            ? Z[0][1].start\n            : {\n                line: 1,\n                column: 1,\n                offset: 0,\n              },\n        ),\n        end: Tn(\n          Z.length > 0\n            ? Z[Z.length - 2][1].end\n            : {\n                line: 1,\n                column: 1,\n                offset: 0,\n              },\n        ),\n      },\n        de = -1;\n      ++de < t.transforms.length;\n\n    )\n      ee = t.transforms[de](ee) || ee;\n    return ee;\n  }\n  function r(Z, ee, ce) {\n    let xe = ee - 1,\n      de = -1,\n      $e = !1,\n      nt,\n      tt,\n      ht,\n      at;\n    for (; ++xe <= ce; ) {\n      const Se = Z[xe];\n      if (\n        (Se[1].type === \"listUnordered\" ||\n        Se[1].type === \"listOrdered\" ||\n        Se[1].type === \"blockQuote\"\n          ? (Se[0] === \"enter\" ? de++ : de--, (at = void 0))\n          : Se[1].type === \"lineEndingBlank\"\n            ? Se[0] === \"enter\" &&\n              (nt && !at && !de && !ht && (ht = xe), (at = void 0))\n            : Se[1].type === \"linePrefix\" ||\n              Se[1].type === \"listItemValue\" ||\n              Se[1].type === \"listItemMarker\" ||\n              Se[1].type === \"listItemPrefix\" ||\n              Se[1].type === \"listItemPrefixWhitespace\" ||\n              (at = void 0),\n        (!de && Se[0] === \"enter\" && Se[1].type === \"listItemPrefix\") ||\n          (de === -1 &&\n            Se[0] === \"exit\" &&\n            (Se[1].type === \"listUnordered\" || Se[1].type === \"listOrdered\")))\n      ) {\n        if (nt) {\n          let Zt = xe;\n          for (tt = void 0; Zt--; ) {\n            const lt = Z[Zt];\n            if (\n              lt[1].type === \"lineEnding\" ||\n              lt[1].type === \"lineEndingBlank\"\n            ) {\n              if (lt[0] === \"exit\") continue;\n              tt && ((Z[tt][1].type = \"lineEndingBlank\"), ($e = !0)),\n                (lt[1].type = \"lineEnding\"),\n                (tt = Zt);\n            } else if (\n              !(\n                lt[1].type === \"linePrefix\" ||\n                lt[1].type === \"blockQuotePrefix\" ||\n                lt[1].type === \"blockQuotePrefixWhitespace\" ||\n                lt[1].type === \"blockQuoteMarker\" ||\n                lt[1].type === \"listItemIndent\"\n              )\n            )\n              break;\n          }\n          ht && (!tt || ht < tt) && (nt._spread = !0),\n            (nt.end = Object.assign({}, tt ? Z[tt][1].start : Se[1].end)),\n            Z.splice(tt || xe, 0, [\"exit\", nt, Se[2]]),\n            xe++,\n            ce++;\n        }\n        Se[1].type === \"listItemPrefix\" &&\n          ((nt = {\n            type: \"listItem\",\n            _spread: !1,\n            start: Object.assign({}, Se[1].start),\n            // @ts-expect-error: we’ll add `end` in a second.\n            end: void 0,\n          }),\n          Z.splice(xe, 0, [\"enter\", nt, Se[2]]),\n          xe++,\n          ce++,\n          (ht = void 0),\n          (at = !0));\n      }\n    }\n    return (Z[ee][1]._spread = $e), ce;\n  }\n  function i(Z, ee) {\n    n[Z] = ee;\n  }\n  function a(Z) {\n    return n[Z];\n  }\n  function l(Z, ee) {\n    return ce;\n    function ce(xe) {\n      u.call(this, Z(xe), xe), ee && ee.call(this, xe);\n    }\n  }\n  function s() {\n    this.stack.push({\n      type: \"fragment\",\n      children: [],\n    });\n  }\n  function u(Z, ee, ce) {\n    return (\n      this.stack[this.stack.length - 1].children.push(Z),\n      this.stack.push(Z),\n      this.tokenStack.push([ee, ce]),\n      (Z.position = {\n        start: Tn(ee.start),\n      }),\n      Z\n    );\n  }\n  function c(Z) {\n    return ee;\n    function ee(ce) {\n      Z && Z.call(this, ce), d.call(this, ce);\n    }\n  }\n  function d(Z, ee) {\n    const ce = this.stack.pop(),\n      xe = this.tokenStack.pop();\n    if (xe)\n      xe[0].type !== Z.type &&\n        (ee ? ee.call(this, Z, xe[0]) : (xe[1] || P0).call(this, Z, xe[0]));\n    else\n      throw new Error(\n        \"Cannot close `\" +\n          Z.type +\n          \"` (\" +\n          cr({\n            start: Z.start,\n            end: Z.end,\n          }) +\n          \"): it’s not open\",\n      );\n    return (ce.position.end = Tn(Z.end)), ce;\n  }\n  function p() {\n    return yE(this.stack.pop());\n  }\n  function h() {\n    i(\"expectingFirstListItemValue\", !0);\n  }\n  function m(Z) {\n    if (a(\"expectingFirstListItemValue\")) {\n      const ee = this.stack[this.stack.length - 2];\n      (ee.start = Number.parseInt(this.sliceSerialize(Z), 10)),\n        i(\"expectingFirstListItemValue\");\n    }\n  }\n  function b() {\n    const Z = this.resume(),\n      ee = this.stack[this.stack.length - 1];\n    ee.lang = Z;\n  }\n  function y() {\n    const Z = this.resume(),\n      ee = this.stack[this.stack.length - 1];\n    ee.meta = Z;\n  }\n  function g() {\n    a(\"flowCodeInside\") || (this.buffer(), i(\"flowCodeInside\", !0));\n  }\n  function x() {\n    const Z = this.resume(),\n      ee = this.stack[this.stack.length - 1];\n    (ee.value = Z.replace(/^(\\r?\\n|\\r)|(\\r?\\n|\\r)$/g, \"\")), i(\"flowCodeInside\");\n  }\n  function v() {\n    const Z = this.resume(),\n      ee = this.stack[this.stack.length - 1];\n    ee.value = Z.replace(/(\\r?\\n|\\r)$/g, \"\");\n  }\n  function S(Z) {\n    const ee = this.resume(),\n      ce = this.stack[this.stack.length - 1];\n    (ce.label = ee), (ce.identifier = Eo(this.sliceSerialize(Z)).toLowerCase());\n  }\n  function w() {\n    const Z = this.resume(),\n      ee = this.stack[this.stack.length - 1];\n    ee.title = Z;\n  }\n  function E() {\n    const Z = this.resume(),\n      ee = this.stack[this.stack.length - 1];\n    ee.url = Z;\n  }\n  function M(Z) {\n    const ee = this.stack[this.stack.length - 1];\n    if (!ee.depth) {\n      const ce = this.sliceSerialize(Z).length;\n      ee.depth = ce;\n    }\n  }\n  function _() {\n    i(\"setextHeadingSlurpLineEnding\", !0);\n  }\n  function j(Z) {\n    const ee = this.stack[this.stack.length - 1];\n    ee.depth = this.sliceSerialize(Z).charCodeAt(0) === 61 ? 1 : 2;\n  }\n  function R() {\n    i(\"setextHeadingSlurpLineEnding\");\n  }\n  function D(Z) {\n    const ee = this.stack[this.stack.length - 1];\n    let ce = ee.children[ee.children.length - 1];\n    (!ce || ce.type !== \"text\") &&\n      ((ce = Wt()),\n      (ce.position = {\n        start: Tn(Z.start),\n      }),\n      ee.children.push(ce)),\n      this.stack.push(ce);\n  }\n  function P(Z) {\n    const ee = this.stack.pop();\n    (ee.value += this.sliceSerialize(Z)), (ee.position.end = Tn(Z.end));\n  }\n  function V(Z) {\n    const ee = this.stack[this.stack.length - 1];\n    if (a(\"atHardBreak\")) {\n      const ce = ee.children[ee.children.length - 1];\n      (ce.position.end = Tn(Z.end)), i(\"atHardBreak\");\n      return;\n    }\n    !a(\"setextHeadingSlurpLineEnding\") &&\n      t.canContainEols.includes(ee.type) &&\n      (D.call(this, Z), P.call(this, Z));\n  }\n  function k() {\n    i(\"atHardBreak\", !0);\n  }\n  function N() {\n    const Z = this.resume(),\n      ee = this.stack[this.stack.length - 1];\n    ee.value = Z;\n  }\n  function T() {\n    const Z = this.resume(),\n      ee = this.stack[this.stack.length - 1];\n    ee.value = Z;\n  }\n  function F() {\n    const Z = this.resume(),\n      ee = this.stack[this.stack.length - 1];\n    ee.value = Z;\n  }\n  function I() {\n    const Z = this.stack[this.stack.length - 1];\n    if (a(\"inReference\")) {\n      const ee = a(\"referenceType\") || \"shortcut\";\n      (Z.type += \"Reference\"),\n        (Z.referenceType = ee),\n        delete Z.url,\n        delete Z.title;\n    } else delete Z.identifier, delete Z.label;\n    i(\"referenceType\");\n  }\n  function L() {\n    const Z = this.stack[this.stack.length - 1];\n    if (a(\"inReference\")) {\n      const ee = a(\"referenceType\") || \"shortcut\";\n      (Z.type += \"Reference\"),\n        (Z.referenceType = ee),\n        delete Z.url,\n        delete Z.title;\n    } else delete Z.identifier, delete Z.label;\n    i(\"referenceType\");\n  }\n  function C(Z) {\n    const ee = this.sliceSerialize(Z),\n      ce = this.stack[this.stack.length - 2];\n    (ce.label = bk(ee)), (ce.identifier = Eo(ee).toLowerCase());\n  }\n  function H() {\n    const Z = this.stack[this.stack.length - 1],\n      ee = this.resume(),\n      ce = this.stack[this.stack.length - 1];\n    if ((i(\"inReference\", !0), ce.type === \"link\")) {\n      const xe = Z.children;\n      ce.children = xe;\n    } else ce.alt = ee;\n  }\n  function B() {\n    const Z = this.resume(),\n      ee = this.stack[this.stack.length - 1];\n    ee.url = Z;\n  }\n  function A() {\n    const Z = this.resume(),\n      ee = this.stack[this.stack.length - 1];\n    ee.title = Z;\n  }\n  function W() {\n    i(\"inReference\");\n  }\n  function G() {\n    i(\"referenceType\", \"collapsed\");\n  }\n  function K(Z) {\n    const ee = this.resume(),\n      ce = this.stack[this.stack.length - 1];\n    (ce.label = ee),\n      (ce.identifier = Eo(this.sliceSerialize(Z)).toLowerCase()),\n      i(\"referenceType\", \"full\");\n  }\n  function Q(Z) {\n    i(\"characterReferenceType\", Z.type);\n  }\n  function ne(Z) {\n    const ee = this.sliceSerialize(Z),\n      ce = a(\"characterReferenceType\");\n    let xe;\n    ce\n      ? ((xe = _f(ee, ce === \"characterReferenceMarkerNumeric\" ? 10 : 16)),\n        i(\"characterReferenceType\"))\n      : (xe = x1(ee));\n    const de = this.stack.pop();\n    (de.value += xe), (de.position.end = Tn(Z.end));\n  }\n  function oe(Z) {\n    P.call(this, Z);\n    const ee = this.stack[this.stack.length - 1];\n    ee.url = this.sliceSerialize(Z);\n  }\n  function U(Z) {\n    P.call(this, Z);\n    const ee = this.stack[this.stack.length - 1];\n    ee.url = \"mailto:\" + this.sliceSerialize(Z);\n  }\n  function ge() {\n    return {\n      type: \"blockquote\",\n      children: [],\n    };\n  }\n  function J() {\n    return {\n      type: \"code\",\n      lang: null,\n      meta: null,\n      value: \"\",\n    };\n  }\n  function _e() {\n    return {\n      type: \"inlineCode\",\n      value: \"\",\n    };\n  }\n  function ie() {\n    return {\n      type: \"definition\",\n      identifier: \"\",\n      label: null,\n      title: null,\n      url: \"\",\n    };\n  }\n  function Ae() {\n    return {\n      type: \"emphasis\",\n      children: [],\n    };\n  }\n  function We() {\n    return {\n      type: \"heading\",\n      depth: void 0,\n      children: [],\n    };\n  }\n  function Ee() {\n    return {\n      type: \"break\",\n    };\n  }\n  function le() {\n    return {\n      type: \"html\",\n      value: \"\",\n    };\n  }\n  function Qe() {\n    return {\n      type: \"image\",\n      title: null,\n      url: \"\",\n      alt: null,\n    };\n  }\n  function Lt() {\n    return {\n      type: \"link\",\n      title: null,\n      url: \"\",\n      children: [],\n    };\n  }\n  function nn(Z) {\n    return {\n      type: \"list\",\n      ordered: Z.type === \"listOrdered\",\n      start: null,\n      spread: Z._spread,\n      children: [],\n    };\n  }\n  function Dt(Z) {\n    return {\n      type: \"listItem\",\n      spread: Z._spread,\n      checked: null,\n      children: [],\n    };\n  }\n  function on() {\n    return {\n      type: \"paragraph\",\n      children: [],\n    };\n  }\n  function kt() {\n    return {\n      type: \"strong\",\n      children: [],\n    };\n  }\n  function Wt() {\n    return {\n      type: \"text\",\n      value: \"\",\n    };\n  }\n  function jt() {\n    return {\n      type: \"thematicBreak\",\n    };\n  }\n}\nfunction Tn(e) {\n  return {\n    line: e.line,\n    column: e.column,\n    offset: e.offset,\n  };\n}\nfunction Mf(e, t) {\n  let n = -1;\n  for (; ++n < t.length; ) {\n    const o = t[n];\n    Array.isArray(o) ? Mf(e, o) : xk(e, o);\n  }\n}\nfunction xk(e, t) {\n  let n;\n  for (n in t)\n    if (Af.call(t, n)) {\n      if (n === \"canContainEols\") {\n        const o = t[n];\n        o && e[n].push(...o);\n      } else if (n === \"transforms\") {\n        const o = t[n];\n        o && e[n].push(...o);\n      } else if (n === \"enter\" || n === \"exit\") {\n        const o = t[n];\n        o && Object.assign(e[n], o);\n      }\n    }\n}\nfunction P0(e, t) {\n  throw e\n    ? new Error(\n        \"Cannot close `\" +\n          e.type +\n          \"` (\" +\n          cr({\n            start: e.start,\n            end: e.end,\n          }) +\n          \"): a different token (`\" +\n          t.type +\n          \"`, \" +\n          cr({\n            start: t.start,\n            end: t.end,\n          }) +\n          \") is open\",\n      )\n    : new Error(\n        \"Cannot close document, a token (`\" +\n          t.type +\n          \"`, \" +\n          cr({\n            start: t.start,\n            end: t.end,\n          }) +\n          \") is still open\",\n      );\n}\nfunction wk(e) {\n  Object.assign(this, {\n    Parser: (n) => {\n      const o =\n        /** @type {Options} */\n        this.data(\"settings\");\n      return Ck(\n        n,\n        Object.assign({}, o, e, {\n          // Note: these options are not in the readme.\n          // The goal is for them to be set by plugins on `data` instead of being\n          // passed by users.\n          extensions: this.data(\"micromarkExtensions\") || [],\n          mdastExtensions: this.data(\"fromMarkdownExtensions\") || [],\n        }),\n      );\n    },\n  });\n}\nfunction Ek(e, t) {\n  const n = {\n    type: \"element\",\n    tagName: \"blockquote\",\n    properties: {},\n    children: e.wrap(e.all(t), !0),\n  };\n  return e.patch(t, n), e.applyData(t, n);\n}\nfunction Sk(e, t) {\n  const n = { type: \"element\", tagName: \"br\", properties: {}, children: [] };\n  return (\n    e.patch(t, n),\n    [\n      e.applyData(t, n),\n      {\n        type: \"text\",\n        value: `\n`,\n      },\n    ]\n  );\n}\nfunction kk(e, t) {\n  const n = t.value\n      ? t.value +\n        `\n`\n      : \"\",\n    o = t.lang ? t.lang.match(/^[^ \\t]+(?=[ \\t]|$)/) : null,\n    r = {};\n  o && (r.className = [\"language-\" + o]);\n  let i = {\n    type: \"element\",\n    tagName: \"code\",\n    properties: r,\n    children: [{ type: \"text\", value: n }],\n  };\n  return (\n    t.meta && (i.data = { meta: t.meta }),\n    e.patch(t, i),\n    (i = e.applyData(t, i)),\n    (i = { type: \"element\", tagName: \"pre\", properties: {}, children: [i] }),\n    e.patch(t, i),\n    i\n  );\n}\nfunction _k(e, t) {\n  const n = {\n    type: \"element\",\n    tagName: \"del\",\n    properties: {},\n    children: e.all(t),\n  };\n  return e.patch(t, n), e.applyData(t, n);\n}\nfunction Ak(e, t) {\n  const n = {\n    type: \"element\",\n    tagName: \"em\",\n    properties: {},\n    children: e.all(t),\n  };\n  return e.patch(t, n), e.applyData(t, n);\n}\nfunction Bo(e) {\n  const t = [];\n  let n = -1,\n    o = 0,\n    r = 0;\n  for (; ++n < e.length; ) {\n    const i = e.charCodeAt(n);\n    let a = \"\";\n    if (i === 37 && At(e.charCodeAt(n + 1)) && At(e.charCodeAt(n + 2))) r = 2;\n    else if (i < 128)\n      /[!#$&-;=?-Z_a-z~]/.test(String.fromCharCode(i)) ||\n        (a = String.fromCharCode(i));\n    else if (i > 55295 && i < 57344) {\n      const l = e.charCodeAt(n + 1);\n      i < 56320 && l > 56319 && l < 57344\n        ? ((a = String.fromCharCode(i, l)), (r = 1))\n        : (a = \"�\");\n    } else a = String.fromCharCode(i);\n    a &&\n      (t.push(e.slice(o, n), encodeURIComponent(a)), (o = n + r + 1), (a = \"\")),\n      r && ((n += r), (r = 0));\n  }\n  return t.join(\"\") + e.slice(o);\n}\nfunction Tf(e, t) {\n  const n = String(t.identifier).toUpperCase(),\n    o = Bo(n.toLowerCase()),\n    r = e.footnoteOrder.indexOf(n);\n  let i;\n  r === -1\n    ? (e.footnoteOrder.push(n),\n      (e.footnoteCounts[n] = 1),\n      (i = e.footnoteOrder.length))\n    : (e.footnoteCounts[n]++, (i = r + 1));\n  const a = e.footnoteCounts[n],\n    l = {\n      type: \"element\",\n      tagName: \"a\",\n      properties: {\n        href: \"#\" + e.clobberPrefix + \"fn-\" + o,\n        id: e.clobberPrefix + \"fnref-\" + o + (a > 1 ? \"-\" + a : \"\"),\n        dataFootnoteRef: !0,\n        ariaDescribedBy: [\"footnote-label\"],\n      },\n      children: [{ type: \"text\", value: String(i) }],\n    };\n  e.patch(t, l);\n  const s = {\n    type: \"element\",\n    tagName: \"sup\",\n    properties: {},\n    children: [l],\n  };\n  return e.patch(t, s), e.applyData(t, s);\n}\nfunction Mk(e, t) {\n  const n = e.footnoteById;\n  let o = 1;\n  for (; o in n; ) o++;\n  const r = String(o);\n  return (\n    (n[r] = {\n      type: \"footnoteDefinition\",\n      identifier: r,\n      children: [{ type: \"paragraph\", children: t.children }],\n      position: t.position,\n    }),\n    Tf(e, {\n      type: \"footnoteReference\",\n      identifier: r,\n      position: t.position,\n    })\n  );\n}\nfunction Tk(e, t) {\n  const n = {\n    type: \"element\",\n    tagName: \"h\" + t.depth,\n    properties: {},\n    children: e.all(t),\n  };\n  return e.patch(t, n), e.applyData(t, n);\n}\nfunction Ok(e, t) {\n  if (e.dangerous) {\n    const n = { type: \"raw\", value: t.value };\n    return e.patch(t, n), e.applyData(t, n);\n  }\n  return null;\n}\nfunction Of(e, t) {\n  const n = t.referenceType;\n  let o = \"]\";\n  if (\n    (n === \"collapsed\"\n      ? (o += \"[]\")\n      : n === \"full\" && (o += \"[\" + (t.label || t.identifier) + \"]\"),\n    t.type === \"imageReference\")\n  )\n    return { type: \"text\", value: \"![\" + t.alt + o };\n  const r = e.all(t),\n    i = r[0];\n  i && i.type === \"text\"\n    ? (i.value = \"[\" + i.value)\n    : r.unshift({ type: \"text\", value: \"[\" });\n  const a = r[r.length - 1];\n  return (\n    a && a.type === \"text\"\n      ? (a.value += o)\n      : r.push({ type: \"text\", value: o }),\n    r\n  );\n}\nfunction Nk(e, t) {\n  const n = e.definition(t.identifier);\n  if (!n) return Of(e, t);\n  const o = { src: Bo(n.url || \"\"), alt: t.alt };\n  n.title !== null && n.title !== void 0 && (o.title = n.title);\n  const r = { type: \"element\", tagName: \"img\", properties: o, children: [] };\n  return e.patch(t, r), e.applyData(t, r);\n}\nfunction Lk(e, t) {\n  const n = { src: Bo(t.url) };\n  t.alt !== null && t.alt !== void 0 && (n.alt = t.alt),\n    t.title !== null && t.title !== void 0 && (n.title = t.title);\n  const o = { type: \"element\", tagName: \"img\", properties: n, children: [] };\n  return e.patch(t, o), e.applyData(t, o);\n}\nfunction Dk(e, t) {\n  const n = { type: \"text\", value: t.value.replace(/\\r?\\n|\\r/g, \" \") };\n  e.patch(t, n);\n  const o = {\n    type: \"element\",\n    tagName: \"code\",\n    properties: {},\n    children: [n],\n  };\n  return e.patch(t, o), e.applyData(t, o);\n}\nfunction jk(e, t) {\n  const n = e.definition(t.identifier);\n  if (!n) return Of(e, t);\n  const o = { href: Bo(n.url || \"\") };\n  n.title !== null && n.title !== void 0 && (o.title = n.title);\n  const r = {\n    type: \"element\",\n    tagName: \"a\",\n    properties: o,\n    children: e.all(t),\n  };\n  return e.patch(t, r), e.applyData(t, r);\n}\nfunction Fk(e, t) {\n  const n = { href: Bo(t.url) };\n  t.title !== null && t.title !== void 0 && (n.title = t.title);\n  const o = {\n    type: \"element\",\n    tagName: \"a\",\n    properties: n,\n    children: e.all(t),\n  };\n  return e.patch(t, o), e.applyData(t, o);\n}\nfunction Rk(e, t, n) {\n  const o = e.all(t),\n    r = n ? Ik(n) : Nf(t),\n    i = {},\n    a = [];\n  if (typeof t.checked == \"boolean\") {\n    const c = o[0];\n    let d;\n    c && c.type === \"element\" && c.tagName === \"p\"\n      ? (d = c)\n      : ((d = { type: \"element\", tagName: \"p\", properties: {}, children: [] }),\n        o.unshift(d)),\n      d.children.length > 0 && d.children.unshift({ type: \"text\", value: \" \" }),\n      d.children.unshift({\n        type: \"element\",\n        tagName: \"input\",\n        properties: { type: \"checkbox\", checked: t.checked, disabled: !0 },\n        children: [],\n      }),\n      (i.className = [\"task-list-item\"]);\n  }\n  let l = -1;\n  for (; ++l < o.length; ) {\n    const c = o[l];\n    (r || l !== 0 || c.type !== \"element\" || c.tagName !== \"p\") &&\n      a.push({\n        type: \"text\",\n        value: `\n`,\n      }),\n      c.type === \"element\" && c.tagName === \"p\" && !r\n        ? a.push(...c.children)\n        : a.push(c);\n  }\n  const s = o[o.length - 1];\n  s &&\n    (r || s.type !== \"element\" || s.tagName !== \"p\") &&\n    a.push({\n      type: \"text\",\n      value: `\n`,\n    });\n  const u = { type: \"element\", tagName: \"li\", properties: i, children: a };\n  return e.patch(t, u), e.applyData(t, u);\n}\nfunction Ik(e) {\n  let t = !1;\n  if (e.type === \"list\") {\n    t = e.spread || !1;\n    const n = e.children;\n    let o = -1;\n    for (; !t && ++o < n.length; ) t = Nf(n[o]);\n  }\n  return t;\n}\nfunction Nf(e) {\n  const t = e.spread;\n  return t ?? e.children.length > 1;\n}\nfunction Hk(e, t) {\n  const n = {},\n    o = e.all(t);\n  let r = -1;\n  for (\n    typeof t.start == \"number\" && t.start !== 1 && (n.start = t.start);\n    ++r < o.length;\n\n  ) {\n    const a = o[r];\n    if (\n      a.type === \"element\" &&\n      a.tagName === \"li\" &&\n      a.properties &&\n      Array.isArray(a.properties.className) &&\n      a.properties.className.includes(\"task-list-item\")\n    ) {\n      n.className = [\"contains-task-list\"];\n      break;\n    }\n  }\n  const i = {\n    type: \"element\",\n    tagName: t.ordered ? \"ol\" : \"ul\",\n    properties: n,\n    children: e.wrap(o, !0),\n  };\n  return e.patch(t, i), e.applyData(t, i);\n}\nfunction zk(e, t) {\n  const n = {\n    type: \"element\",\n    tagName: \"p\",\n    properties: {},\n    children: e.all(t),\n  };\n  return e.patch(t, n), e.applyData(t, n);\n}\nfunction Pk(e, t) {\n  const n = { type: \"root\", children: e.wrap(e.all(t)) };\n  return e.patch(t, n), e.applyData(t, n);\n}\nfunction Bk(e, t) {\n  const n = {\n    type: \"element\",\n    tagName: \"strong\",\n    properties: {},\n    children: e.all(t),\n  };\n  return e.patch(t, n), e.applyData(t, n);\n}\nconst E1 = Lf(\"start\"),\n  S1 = Lf(\"end\");\nfunction Vk(e) {\n  return { start: E1(e), end: S1(e) };\n}\nfunction Lf(e) {\n  return t;\n  function t(n) {\n    const o = (n && n.position && n.position[e]) || {};\n    return {\n      // @ts-expect-error: in practice, null is allowed.\n      line: o.line || null,\n      // @ts-expect-error: in practice, null is allowed.\n      column: o.column || null,\n      // @ts-expect-error: in practice, null is allowed.\n      offset: o.offset > -1 ? o.offset : null,\n    };\n  }\n}\nfunction $k(e, t) {\n  const n = e.all(t),\n    o = n.shift(),\n    r = [];\n  if (o) {\n    const a = {\n      type: \"element\",\n      tagName: \"thead\",\n      properties: {},\n      children: e.wrap([o], !0),\n    };\n    e.patch(t.children[0], a), r.push(a);\n  }\n  if (n.length > 0) {\n    const a = {\n        type: \"element\",\n        tagName: \"tbody\",\n        properties: {},\n        children: e.wrap(n, !0),\n      },\n      l = E1(t.children[1]),\n      s = S1(t.children[t.children.length - 1]);\n    l.line && s.line && (a.position = { start: l, end: s }), r.push(a);\n  }\n  const i = {\n    type: \"element\",\n    tagName: \"table\",\n    properties: {},\n    children: e.wrap(r, !0),\n  };\n  return e.patch(t, i), e.applyData(t, i);\n}\nfunction Wk(e, t, n) {\n  const o = n ? n.children : void 0,\n    i = (o ? o.indexOf(t) : 1) === 0 ? \"th\" : \"td\",\n    a = n && n.type === \"table\" ? n.align : void 0,\n    l = a ? a.length : t.children.length;\n  let s = -1;\n  const u = [];\n  for (; ++s < l; ) {\n    const d = t.children[s],\n      p = {},\n      h = a ? a[s] : void 0;\n    h && (p.align = h);\n    let m = { type: \"element\", tagName: i, properties: p, children: [] };\n    d && ((m.children = e.all(d)), e.patch(d, m), (m = e.applyData(t, m))),\n      u.push(m);\n  }\n  const c = {\n    type: \"element\",\n    tagName: \"tr\",\n    properties: {},\n    children: e.wrap(u, !0),\n  };\n  return e.patch(t, c), e.applyData(t, c);\n}\nfunction Zk(e, t) {\n  const n = {\n    type: \"element\",\n    tagName: \"td\",\n    // Assume body cell.\n    properties: {},\n    children: e.all(t),\n  };\n  return e.patch(t, n), e.applyData(t, n);\n}\nconst B0 = 9,\n  V0 = 32;\nfunction Uk(e) {\n  const t = String(e),\n    n = /\\r?\\n|\\r/g;\n  let o = n.exec(t),\n    r = 0;\n  const i = [];\n  for (; o; )\n    i.push($0(t.slice(r, o.index), r > 0, !0), o[0]),\n      (r = o.index + o[0].length),\n      (o = n.exec(t));\n  return i.push($0(t.slice(r), r > 0, !1)), i.join(\"\");\n}\nfunction $0(e, t, n) {\n  let o = 0,\n    r = e.length;\n  if (t) {\n    let i = e.codePointAt(o);\n    for (; i === B0 || i === V0; ) o++, (i = e.codePointAt(o));\n  }\n  if (n) {\n    let i = e.codePointAt(r - 1);\n    for (; i === B0 || i === V0; ) r--, (i = e.codePointAt(r - 1));\n  }\n  return r > o ? e.slice(o, r) : \"\";\n}\nfunction qk(e, t) {\n  const n = { type: \"text\", value: Uk(String(t.value)) };\n  return e.patch(t, n), e.applyData(t, n);\n}\nfunction Yk(e, t) {\n  const n = {\n    type: \"element\",\n    tagName: \"hr\",\n    properties: {},\n    children: [],\n  };\n  return e.patch(t, n), e.applyData(t, n);\n}\nconst Gk = {\n  blockquote: Ek,\n  break: Sk,\n  code: kk,\n  delete: _k,\n  emphasis: Ak,\n  footnoteReference: Tf,\n  footnote: Mk,\n  heading: Tk,\n  html: Ok,\n  imageReference: Nk,\n  image: Lk,\n  inlineCode: Dk,\n  linkReference: jk,\n  link: Fk,\n  listItem: Rk,\n  list: Hk,\n  paragraph: zk,\n  root: Pk,\n  strong: Bk,\n  table: $k,\n  tableCell: Zk,\n  tableRow: Wk,\n  text: qk,\n  thematicBreak: Yk,\n  toml: pi,\n  yaml: pi,\n  definition: pi,\n  footnoteDefinition: pi,\n};\nfunction pi() {\n  return null;\n}\nconst Df =\n  /**\n   * @type {(\n   *   (<Kind extends Node>(test: PredicateTest<Kind>) => AssertPredicate<Kind>) &\n   *   ((test?: Test) => AssertAnything)\n   * )}\n   */\n  /**\n   * @param {Test} [test]\n   * @returns {AssertAnything}\n   */\n  function (e) {\n    if (e == null) return Jk;\n    if (typeof e == \"string\") return Qk(e);\n    if (typeof e == \"object\") return Array.isArray(e) ? Kk(e) : Xk(e);\n    if (typeof e == \"function\") return va(e);\n    throw new Error(\"Expected function, string, or object as test\");\n  };\nfunction Kk(e) {\n  const t = [];\n  let n = -1;\n  for (; ++n < e.length; ) t[n] = Df(e[n]);\n  return va(o);\n  function o(...r) {\n    let i = -1;\n    for (; ++i < t.length; ) if (t[i].call(this, ...r)) return !0;\n    return !1;\n  }\n}\nfunction Xk(e) {\n  return va(t);\n  function t(n) {\n    let o;\n    for (o in e) if (n[o] !== e[o]) return !1;\n    return !0;\n  }\n}\nfunction Qk(e) {\n  return va(t);\n  function t(n) {\n    return n && n.type === e;\n  }\n}\nfunction va(e) {\n  return t;\n  function t(n, ...o) {\n    return !!(\n      n &&\n      typeof n == \"object\" &&\n      \"type\" in n &&\n      e.call(this, n, ...o)\n    );\n  }\n}\nfunction Jk() {\n  return !0;\n}\nconst e_ = !0,\n  W0 = !1,\n  t_ = \"skip\",\n  n_ =\n    /**\n     * @type {(\n     *   (<Tree extends Node, Check extends Test>(tree: Tree, test: Check, visitor: BuildVisitor<Tree, Check>, reverse?: boolean | null | undefined) => void) &\n     *   (<Tree extends Node>(tree: Tree, visitor: BuildVisitor<Tree>, reverse?: boolean | null | undefined) => void)\n     * )}\n     */\n    /**\n     * @param {Node} tree\n     * @param {Test} test\n     * @param {Visitor<Node>} visitor\n     * @param {boolean | null | undefined} [reverse]\n     * @returns {void}\n     */\n    function (e, t, n, o) {\n      typeof t == \"function\" &&\n        typeof n != \"function\" &&\n        ((o = n), (n = t), (t = null));\n      const r = Df(t),\n        i = o ? -1 : 1;\n      a(e, void 0, [])();\n      function a(l, s, u) {\n        const c = l && typeof l == \"object\" ? l : {};\n        if (typeof c.type == \"string\") {\n          const p =\n            // `hast`\n            typeof c.tagName == \"string\"\n              ? c.tagName\n              : // `xast`\n                typeof c.name == \"string\"\n                ? c.name\n                : void 0;\n          Object.defineProperty(d, \"name\", {\n            value: \"node (\" + (l.type + (p ? \"<\" + p + \">\" : \"\")) + \")\",\n          });\n        }\n        return d;\n        function d() {\n          let p = [],\n            h,\n            m,\n            b;\n          if (\n            (!t || r(l, s, u[u.length - 1] || null)) &&\n            ((p = o_(n(l, u))), p[0] === W0)\n          )\n            return p;\n          if (l.children && p[0] !== t_)\n            for (\n              m = (o ? l.children.length : -1) + i, b = u.concat(l);\n              m > -1 && m < l.children.length;\n\n            ) {\n              if (((h = a(l.children[m], m, b)()), h[0] === W0)) return h;\n              m = typeof h[1] == \"number\" ? h[1] : m + i;\n            }\n          return p;\n        }\n      }\n    };\nfunction o_(e) {\n  return Array.isArray(e) ? e : typeof e == \"number\" ? [e_, e] : [e];\n}\nconst k1 =\n  /**\n   * @type {(\n   *   (<Tree extends Node, Check extends Test>(tree: Tree, test: Check, visitor: BuildVisitor<Tree, Check>, reverse?: boolean | null | undefined) => void) &\n   *   (<Tree extends Node>(tree: Tree, visitor: BuildVisitor<Tree>, reverse?: boolean | null | undefined) => void)\n   * )}\n   */\n  /**\n   * @param {Node} tree\n   * @param {Test} test\n   * @param {Visitor} visitor\n   * @param {boolean | null | undefined} [reverse]\n   * @returns {void}\n   */\n  function (e, t, n, o) {\n    typeof t == \"function\" &&\n      typeof n != \"function\" &&\n      ((o = n), (n = t), (t = null)),\n      n_(e, t, r, o);\n    function r(i, a) {\n      const l = a[a.length - 1];\n      return n(i, l ? l.children.indexOf(i) : null, l);\n    }\n  };\nfunction r_(e) {\n  return (\n    !e ||\n    !e.position ||\n    !e.position.start ||\n    !e.position.start.line ||\n    !e.position.start.column ||\n    !e.position.end ||\n    !e.position.end.line ||\n    !e.position.end.column\n  );\n}\nconst Z0 = {}.hasOwnProperty;\nfunction i_(e) {\n  const t = /* @__PURE__ */ Object.create(null);\n  if (!e || !e.type) throw new Error(\"mdast-util-definitions expected node\");\n  return (\n    k1(e, \"definition\", (o) => {\n      const r = U0(o.identifier);\n      r && !Z0.call(t, r) && (t[r] = o);\n    }),\n    n\n  );\n  function n(o) {\n    const r = U0(o);\n    return r && Z0.call(t, r) ? t[r] : null;\n  }\n}\nfunction U0(e) {\n  return String(e || \"\").toUpperCase();\n}\nconst Ji = {}.hasOwnProperty;\nfunction a_(e, t) {\n  const n = t || {},\n    o = n.allowDangerousHtml || !1,\n    r = {};\n  return (\n    (a.dangerous = o),\n    (a.clobberPrefix =\n      n.clobberPrefix === void 0 || n.clobberPrefix === null\n        ? \"user-content-\"\n        : n.clobberPrefix),\n    (a.footnoteLabel = n.footnoteLabel || \"Footnotes\"),\n    (a.footnoteLabelTagName = n.footnoteLabelTagName || \"h2\"),\n    (a.footnoteLabelProperties = n.footnoteLabelProperties || {\n      className: [\"sr-only\"],\n    }),\n    (a.footnoteBackLabel = n.footnoteBackLabel || \"Back to content\"),\n    (a.unknownHandler = n.unknownHandler),\n    (a.passThrough = n.passThrough),\n    (a.handlers = { ...Gk, ...n.handlers }),\n    (a.definition = i_(e)),\n    (a.footnoteById = r),\n    (a.footnoteOrder = []),\n    (a.footnoteCounts = {}),\n    (a.patch = l_),\n    (a.applyData = s_),\n    (a.one = l),\n    (a.all = s),\n    (a.wrap = u_),\n    (a.augment = i),\n    k1(e, \"footnoteDefinition\", (u) => {\n      const c = String(u.identifier).toUpperCase();\n      Ji.call(r, c) || (r[c] = u);\n    }),\n    a\n  );\n  function i(u, c) {\n    if (u && \"data\" in u && u.data) {\n      const d = u.data;\n      d.hName &&\n        (c.type !== \"element\" &&\n          (c = {\n            type: \"element\",\n            tagName: \"\",\n            properties: {},\n            children: [],\n          }),\n        (c.tagName = d.hName)),\n        c.type === \"element\" &&\n          d.hProperties &&\n          (c.properties = { ...c.properties, ...d.hProperties }),\n        \"children\" in c &&\n          c.children &&\n          d.hChildren &&\n          (c.children = d.hChildren);\n    }\n    if (u) {\n      const d = \"type\" in u ? u : { position: u };\n      r_(d) || (c.position = { start: E1(d), end: S1(d) });\n    }\n    return c;\n  }\n  function a(u, c, d, p) {\n    return (\n      Array.isArray(d) && ((p = d), (d = {})),\n      i(u, {\n        type: \"element\",\n        tagName: c,\n        properties: d || {},\n        children: p || [],\n      })\n    );\n  }\n  function l(u, c) {\n    return jf(a, u, c);\n  }\n  function s(u) {\n    return _1(a, u);\n  }\n}\nfunction l_(e, t) {\n  e.position && (t.position = Vk(e));\n}\nfunction s_(e, t) {\n  let n = t;\n  if (e && e.data) {\n    const o = e.data.hName,\n      r = e.data.hChildren,\n      i = e.data.hProperties;\n    typeof o == \"string\" &&\n      (n.type === \"element\"\n        ? (n.tagName = o)\n        : (n = {\n            type: \"element\",\n            tagName: o,\n            properties: {},\n            children: [],\n          })),\n      n.type === \"element\" && i && (n.properties = { ...n.properties, ...i }),\n      \"children\" in n &&\n        n.children &&\n        r !== null &&\n        r !== void 0 &&\n        (n.children = r);\n  }\n  return n;\n}\nfunction jf(e, t, n) {\n  const o = t && t.type;\n  if (!o) throw new Error(\"Expected node, got `\" + t + \"`\");\n  return Ji.call(e.handlers, o)\n    ? e.handlers[o](e, t, n)\n    : e.passThrough && e.passThrough.includes(o)\n      ? \"children\" in t\n        ? { ...t, children: _1(e, t) }\n        : t\n      : e.unknownHandler\n        ? e.unknownHandler(e, t, n)\n        : c_(e, t);\n}\nfunction _1(e, t) {\n  const n = [];\n  if (\"children\" in t) {\n    const o = t.children;\n    let r = -1;\n    for (; ++r < o.length; ) {\n      const i = jf(e, o[r], t);\n      if (i) {\n        if (\n          r &&\n          o[r - 1].type === \"break\" &&\n          (!Array.isArray(i) &&\n            i.type === \"text\" &&\n            (i.value = i.value.replace(/^\\s+/, \"\")),\n          !Array.isArray(i) && i.type === \"element\")\n        ) {\n          const a = i.children[0];\n          a && a.type === \"text\" && (a.value = a.value.replace(/^\\s+/, \"\"));\n        }\n        Array.isArray(i) ? n.push(...i) : n.push(i);\n      }\n    }\n  }\n  return n;\n}\nfunction c_(e, t) {\n  const n = t.data || {},\n    o =\n      \"value\" in t && !(Ji.call(n, \"hProperties\") || Ji.call(n, \"hChildren\"))\n        ? { type: \"text\", value: t.value }\n        : {\n            type: \"element\",\n            tagName: \"div\",\n            properties: {},\n            children: _1(e, t),\n          };\n  return e.patch(t, o), e.applyData(t, o);\n}\nfunction u_(e, t) {\n  const n = [];\n  let o = -1;\n  for (\n    t &&\n    n.push({\n      type: \"text\",\n      value: `\n`,\n    });\n    ++o < e.length;\n\n  )\n    o &&\n      n.push({\n        type: \"text\",\n        value: `\n`,\n      }),\n      n.push(e[o]);\n  return (\n    t &&\n      e.length > 0 &&\n      n.push({\n        type: \"text\",\n        value: `\n`,\n      }),\n    n\n  );\n}\nfunction d_(e) {\n  const t = [];\n  let n = -1;\n  for (; ++n < e.footnoteOrder.length; ) {\n    const o = e.footnoteById[e.footnoteOrder[n]];\n    if (!o) continue;\n    const r = e.all(o),\n      i = String(o.identifier).toUpperCase(),\n      a = Bo(i.toLowerCase());\n    let l = 0;\n    const s = [];\n    for (; ++l <= e.footnoteCounts[i]; ) {\n      const d = {\n        type: \"element\",\n        tagName: \"a\",\n        properties: {\n          href: \"#\" + e.clobberPrefix + \"fnref-\" + a + (l > 1 ? \"-\" + l : \"\"),\n          dataFootnoteBackref: !0,\n          className: [\"data-footnote-backref\"],\n          ariaLabel: e.footnoteBackLabel,\n        },\n        children: [{ type: \"text\", value: \"↩\" }],\n      };\n      l > 1 &&\n        d.children.push({\n          type: \"element\",\n          tagName: \"sup\",\n          children: [{ type: \"text\", value: String(l) }],\n        }),\n        s.length > 0 && s.push({ type: \"text\", value: \" \" }),\n        s.push(d);\n    }\n    const u = r[r.length - 1];\n    if (u && u.type === \"element\" && u.tagName === \"p\") {\n      const d = u.children[u.children.length - 1];\n      d && d.type === \"text\"\n        ? (d.value += \" \")\n        : u.children.push({ type: \"text\", value: \" \" }),\n        u.children.push(...s);\n    } else r.push(...s);\n    const c = {\n      type: \"element\",\n      tagName: \"li\",\n      properties: { id: e.clobberPrefix + \"fn-\" + a },\n      children: e.wrap(r, !0),\n    };\n    e.patch(o, c), t.push(c);\n  }\n  if (t.length !== 0)\n    return {\n      type: \"element\",\n      tagName: \"section\",\n      properties: { dataFootnotes: !0, className: [\"footnotes\"] },\n      children: [\n        {\n          type: \"element\",\n          tagName: e.footnoteLabelTagName,\n          properties: {\n            // To do: use structured clone.\n            ...JSON.parse(JSON.stringify(e.footnoteLabelProperties)),\n            id: \"footnote-label\",\n          },\n          children: [{ type: \"text\", value: e.footnoteLabel }],\n        },\n        {\n          type: \"text\",\n          value: `\n`,\n        },\n        {\n          type: \"element\",\n          tagName: \"ol\",\n          properties: {},\n          children: e.wrap(t, !0),\n        },\n        {\n          type: \"text\",\n          value: `\n`,\n        },\n      ],\n    };\n}\nfunction Ff(e, t) {\n  const n = a_(e, t),\n    o = n.one(e, null),\n    r = d_(n);\n  return (\n    r &&\n      o.children.push(\n        {\n          type: \"text\",\n          value: `\n`,\n        },\n        r,\n      ),\n    Array.isArray(o) ? { type: \"root\", children: o } : o\n  );\n}\nconst f_ =\n  /** @type {(import('unified').Plugin<[Processor, Options?]|[null|undefined, Options?]|[Options]|[], MdastRoot>)} */\n  function (e, t) {\n    return e && \"run\" in e ? h_(e, t) : p_(e || t);\n  };\nfunction h_(e, t) {\n  return (n, o, r) => {\n    e.run(Ff(n, t), o, (i) => {\n      r(i);\n    });\n  };\n}\nfunction p_(e) {\n  return (t) => Ff(t, e);\n}\nclass Br {\n  /**\n   * @constructor\n   * @param {Properties} property\n   * @param {Normal} normal\n   * @param {string} [space]\n   */\n  constructor(t, n, o) {\n    (this.property = t), (this.normal = n), o && (this.space = o);\n  }\n}\nBr.prototype.property = {};\nBr.prototype.normal = {};\nBr.prototype.space = null;\nfunction Rf(e, t) {\n  const n = {},\n    o = {};\n  let r = -1;\n  for (; ++r < e.length; )\n    Object.assign(n, e[r].property), Object.assign(o, e[r].normal);\n  return new Br(n, o, t);\n}\nfunction ec(e) {\n  return e.toLowerCase();\n}\nclass $t {\n  /**\n   * @constructor\n   * @param {string} property\n   * @param {string} attribute\n   */\n  constructor(t, n) {\n    (this.property = t), (this.attribute = n);\n  }\n}\n$t.prototype.space = null;\n$t.prototype.boolean = !1;\n$t.prototype.booleanish = !1;\n$t.prototype.overloadedBoolean = !1;\n$t.prototype.number = !1;\n$t.prototype.commaSeparated = !1;\n$t.prototype.spaceSeparated = !1;\n$t.prototype.commaOrSpaceSeparated = !1;\n$t.prototype.mustUseProperty = !1;\n$t.prototype.defined = !1;\nlet g_ = 0;\nconst me = io(),\n  Je = io(),\n  If = io(),\n  te = io(),\n  Be = io(),\n  So = io(),\n  _t = io();\nfunction io() {\n  return 2 ** ++g_;\n}\nconst tc = /* @__PURE__ */ Object.freeze(\n    /* @__PURE__ */ Object.defineProperty(\n      {\n        __proto__: null,\n        boolean: me,\n        booleanish: Je,\n        commaOrSpaceSeparated: _t,\n        commaSeparated: So,\n        number: te,\n        overloadedBoolean: If,\n        spaceSeparated: Be,\n      },\n      Symbol.toStringTag,\n      { value: \"Module\" },\n    ),\n  ),\n  as = Object.keys(tc);\nclass A1 extends $t {\n  /**\n   * @constructor\n   * @param {string} property\n   * @param {string} attribute\n   * @param {number|null} [mask]\n   * @param {string} [space]\n   */\n  constructor(t, n, o, r) {\n    let i = -1;\n    if ((super(t, n), q0(this, \"space\", r), typeof o == \"number\"))\n      for (; ++i < as.length; ) {\n        const a = as[i];\n        q0(this, as[i], (o & tc[a]) === tc[a]);\n      }\n  }\n}\nA1.prototype.defined = !0;\nfunction q0(e, t, n) {\n  n && (e[t] = n);\n}\nconst m_ = {}.hasOwnProperty;\nfunction Vo(e) {\n  const t = {},\n    n = {};\n  let o;\n  for (o in e.properties)\n    if (m_.call(e.properties, o)) {\n      const r = e.properties[o],\n        i = new A1(o, e.transform(e.attributes || {}, o), r, e.space);\n      e.mustUseProperty &&\n        e.mustUseProperty.includes(o) &&\n        (i.mustUseProperty = !0),\n        (t[o] = i),\n        (n[ec(o)] = o),\n        (n[ec(i.attribute)] = o);\n    }\n  return new Br(t, n, e.space);\n}\nconst Hf = Vo({\n    space: \"xlink\",\n    transform(e, t) {\n      return \"xlink:\" + t.slice(5).toLowerCase();\n    },\n    properties: {\n      xLinkActuate: null,\n      xLinkArcRole: null,\n      xLinkHref: null,\n      xLinkRole: null,\n      xLinkShow: null,\n      xLinkTitle: null,\n      xLinkType: null,\n    },\n  }),\n  zf = Vo({\n    space: \"xml\",\n    transform(e, t) {\n      return \"xml:\" + t.slice(3).toLowerCase();\n    },\n    properties: { xmlLang: null, xmlBase: null, xmlSpace: null },\n  });\nfunction Pf(e, t) {\n  return t in e ? e[t] : t;\n}\nfunction Bf(e, t) {\n  return Pf(e, t.toLowerCase());\n}\nconst Vf = Vo({\n    space: \"xmlns\",\n    attributes: { xmlnsxlink: \"xmlns:xlink\" },\n    transform: Bf,\n    properties: { xmlns: null, xmlnsXLink: null },\n  }),\n  $f = Vo({\n    transform(e, t) {\n      return t === \"role\" ? t : \"aria-\" + t.slice(4).toLowerCase();\n    },\n    properties: {\n      ariaActiveDescendant: null,\n      ariaAtomic: Je,\n      ariaAutoComplete: null,\n      ariaBusy: Je,\n      ariaChecked: Je,\n      ariaColCount: te,\n      ariaColIndex: te,\n      ariaColSpan: te,\n      ariaControls: Be,\n      ariaCurrent: null,\n      ariaDescribedBy: Be,\n      ariaDetails: null,\n      ariaDisabled: Je,\n      ariaDropEffect: Be,\n      ariaErrorMessage: null,\n      ariaExpanded: Je,\n      ariaFlowTo: Be,\n      ariaGrabbed: Je,\n      ariaHasPopup: null,\n      ariaHidden: Je,\n      ariaInvalid: null,\n      ariaKeyShortcuts: null,\n      ariaLabel: null,\n      ariaLabelledBy: Be,\n      ariaLevel: te,\n      ariaLive: null,\n      ariaModal: Je,\n      ariaMultiLine: Je,\n      ariaMultiSelectable: Je,\n      ariaOrientation: null,\n      ariaOwns: Be,\n      ariaPlaceholder: null,\n      ariaPosInSet: te,\n      ariaPressed: Je,\n      ariaReadOnly: Je,\n      ariaRelevant: null,\n      ariaRequired: Je,\n      ariaRoleDescription: Be,\n      ariaRowCount: te,\n      ariaRowIndex: te,\n      ariaRowSpan: te,\n      ariaSelected: Je,\n      ariaSetSize: te,\n      ariaSort: null,\n      ariaValueMax: te,\n      ariaValueMin: te,\n      ariaValueNow: te,\n      ariaValueText: null,\n      role: null,\n    },\n  }),\n  b_ = Vo({\n    space: \"html\",\n    attributes: {\n      acceptcharset: \"accept-charset\",\n      classname: \"class\",\n      htmlfor: \"for\",\n      httpequiv: \"http-equiv\",\n    },\n    transform: Bf,\n    mustUseProperty: [\"checked\", \"multiple\", \"muted\", \"selected\"],\n    properties: {\n      // Standard Properties.\n      abbr: null,\n      accept: So,\n      acceptCharset: Be,\n      accessKey: Be,\n      action: null,\n      allow: null,\n      allowFullScreen: me,\n      allowPaymentRequest: me,\n      allowUserMedia: me,\n      alt: null,\n      as: null,\n      async: me,\n      autoCapitalize: null,\n      autoComplete: Be,\n      autoFocus: me,\n      autoPlay: me,\n      blocking: Be,\n      capture: null,\n      charSet: null,\n      checked: me,\n      cite: null,\n      className: Be,\n      cols: te,\n      colSpan: null,\n      content: null,\n      contentEditable: Je,\n      controls: me,\n      controlsList: Be,\n      coords: te | So,\n      crossOrigin: null,\n      data: null,\n      dateTime: null,\n      decoding: null,\n      default: me,\n      defer: me,\n      dir: null,\n      dirName: null,\n      disabled: me,\n      download: If,\n      draggable: Je,\n      encType: null,\n      enterKeyHint: null,\n      fetchPriority: null,\n      form: null,\n      formAction: null,\n      formEncType: null,\n      formMethod: null,\n      formNoValidate: me,\n      formTarget: null,\n      headers: Be,\n      height: te,\n      hidden: me,\n      high: te,\n      href: null,\n      hrefLang: null,\n      htmlFor: Be,\n      httpEquiv: Be,\n      id: null,\n      imageSizes: null,\n      imageSrcSet: null,\n      inert: me,\n      inputMode: null,\n      integrity: null,\n      is: null,\n      isMap: me,\n      itemId: null,\n      itemProp: Be,\n      itemRef: Be,\n      itemScope: me,\n      itemType: Be,\n      kind: null,\n      label: null,\n      lang: null,\n      language: null,\n      list: null,\n      loading: null,\n      loop: me,\n      low: te,\n      manifest: null,\n      max: null,\n      maxLength: te,\n      media: null,\n      method: null,\n      min: null,\n      minLength: te,\n      multiple: me,\n      muted: me,\n      name: null,\n      nonce: null,\n      noModule: me,\n      noValidate: me,\n      onAbort: null,\n      onAfterPrint: null,\n      onAuxClick: null,\n      onBeforeMatch: null,\n      onBeforePrint: null,\n      onBeforeToggle: null,\n      onBeforeUnload: null,\n      onBlur: null,\n      onCancel: null,\n      onCanPlay: null,\n      onCanPlayThrough: null,\n      onChange: null,\n      onClick: null,\n      onClose: null,\n      onContextLost: null,\n      onContextMenu: null,\n      onContextRestored: null,\n      onCopy: null,\n      onCueChange: null,\n      onCut: null,\n      onDblClick: null,\n      onDrag: null,\n      onDragEnd: null,\n      onDragEnter: null,\n      onDragExit: null,\n      onDragLeave: null,\n      onDragOver: null,\n      onDragStart: null,\n      onDrop: null,\n      onDurationChange: null,\n      onEmptied: null,\n      onEnded: null,\n      onError: null,\n      onFocus: null,\n      onFormData: null,\n      onHashChange: null,\n      onInput: null,\n      onInvalid: null,\n      onKeyDown: null,\n      onKeyPress: null,\n      onKeyUp: null,\n      onLanguageChange: null,\n      onLoad: null,\n      onLoadedData: null,\n      onLoadedMetadata: null,\n      onLoadEnd: null,\n      onLoadStart: null,\n      onMessage: null,\n      onMessageError: null,\n      onMouseDown: null,\n      onMouseEnter: null,\n      onMouseLeave: null,\n      onMouseMove: null,\n      onMouseOut: null,\n      onMouseOver: null,\n      onMouseUp: null,\n      onOffline: null,\n      onOnline: null,\n      onPageHide: null,\n      onPageShow: null,\n      onPaste: null,\n      onPause: null,\n      onPlay: null,\n      onPlaying: null,\n      onPopState: null,\n      onProgress: null,\n      onRateChange: null,\n      onRejectionHandled: null,\n      onReset: null,\n      onResize: null,\n      onScroll: null,\n      onScrollEnd: null,\n      onSecurityPolicyViolation: null,\n      onSeeked: null,\n      onSeeking: null,\n      onSelect: null,\n      onSlotChange: null,\n      onStalled: null,\n      onStorage: null,\n      onSubmit: null,\n      onSuspend: null,\n      onTimeUpdate: null,\n      onToggle: null,\n      onUnhandledRejection: null,\n      onUnload: null,\n      onVolumeChange: null,\n      onWaiting: null,\n      onWheel: null,\n      open: me,\n      optimum: te,\n      pattern: null,\n      ping: Be,\n      placeholder: null,\n      playsInline: me,\n      popover: null,\n      popoverTarget: null,\n      popoverTargetAction: null,\n      poster: null,\n      preload: null,\n      readOnly: me,\n      referrerPolicy: null,\n      rel: Be,\n      required: me,\n      reversed: me,\n      rows: te,\n      rowSpan: te,\n      sandbox: Be,\n      scope: null,\n      scoped: me,\n      seamless: me,\n      selected: me,\n      shadowRootClonable: me,\n      shadowRootDelegatesFocus: me,\n      shadowRootMode: null,\n      shape: null,\n      size: te,\n      sizes: null,\n      slot: null,\n      span: te,\n      spellCheck: Je,\n      src: null,\n      srcDoc: null,\n      srcLang: null,\n      srcSet: null,\n      start: te,\n      step: null,\n      style: null,\n      tabIndex: te,\n      target: null,\n      title: null,\n      translate: null,\n      type: null,\n      typeMustMatch: me,\n      useMap: null,\n      value: Je,\n      width: te,\n      wrap: null,\n      writingSuggestions: null,\n      // Legacy.\n      // See: https://html.spec.whatwg.org/#other-elements,-attributes-and-apis\n      align: null,\n      // Several. Use CSS `text-align` instead,\n      aLink: null,\n      // `<body>`. Use CSS `a:active {color}` instead\n      archive: Be,\n      // `<object>`. List of URIs to archives\n      axis: null,\n      // `<td>` and `<th>`. Use `scope` on `<th>`\n      background: null,\n      // `<body>`. Use CSS `background-image` instead\n      bgColor: null,\n      // `<body>` and table elements. Use CSS `background-color` instead\n      border: te,\n      // `<table>`. Use CSS `border-width` instead,\n      borderColor: null,\n      // `<table>`. Use CSS `border-color` instead,\n      bottomMargin: te,\n      // `<body>`\n      cellPadding: null,\n      // `<table>`\n      cellSpacing: null,\n      // `<table>`\n      char: null,\n      // Several table elements. When `align=char`, sets the character to align on\n      charOff: null,\n      // Several table elements. When `char`, offsets the alignment\n      classId: null,\n      // `<object>`\n      clear: null,\n      // `<br>`. Use CSS `clear` instead\n      code: null,\n      // `<object>`\n      codeBase: null,\n      // `<object>`\n      codeType: null,\n      // `<object>`\n      color: null,\n      // `<font>` and `<hr>`. Use CSS instead\n      compact: me,\n      // Lists. Use CSS to reduce space between items instead\n      declare: me,\n      // `<object>`\n      event: null,\n      // `<script>`\n      face: null,\n      // `<font>`. Use CSS instead\n      frame: null,\n      // `<table>`\n      frameBorder: null,\n      // `<iframe>`. Use CSS `border` instead\n      hSpace: te,\n      // `<img>` and `<object>`\n      leftMargin: te,\n      // `<body>`\n      link: null,\n      // `<body>`. Use CSS `a:link {color: *}` instead\n      longDesc: null,\n      // `<frame>`, `<iframe>`, and `<img>`. Use an `<a>`\n      lowSrc: null,\n      // `<img>`. Use a `<picture>`\n      marginHeight: te,\n      // `<body>`\n      marginWidth: te,\n      // `<body>`\n      noResize: me,\n      // `<frame>`\n      noHref: me,\n      // `<area>`. Use no href instead of an explicit `nohref`\n      noShade: me,\n      // `<hr>`. Use background-color and height instead of borders\n      noWrap: me,\n      // `<td>` and `<th>`\n      object: null,\n      // `<applet>`\n      profile: null,\n      // `<head>`\n      prompt: null,\n      // `<isindex>`\n      rev: null,\n      // `<link>`\n      rightMargin: te,\n      // `<body>`\n      rules: null,\n      // `<table>`\n      scheme: null,\n      // `<meta>`\n      scrolling: Je,\n      // `<frame>`. Use overflow in the child context\n      standby: null,\n      // `<object>`\n      summary: null,\n      // `<table>`\n      text: null,\n      // `<body>`. Use CSS `color` instead\n      topMargin: te,\n      // `<body>`\n      valueType: null,\n      // `<param>`\n      version: null,\n      // `<html>`. Use a doctype.\n      vAlign: null,\n      // Several. Use CSS `vertical-align` instead\n      vLink: null,\n      // `<body>`. Use CSS `a:visited {color}` instead\n      vSpace: te,\n      // `<img>` and `<object>`\n      // Non-standard Properties.\n      allowTransparency: null,\n      autoCorrect: null,\n      autoSave: null,\n      disablePictureInPicture: me,\n      disableRemotePlayback: me,\n      prefix: null,\n      property: null,\n      results: te,\n      security: null,\n      unselectable: null,\n    },\n  }),\n  y_ = Vo({\n    space: \"svg\",\n    attributes: {\n      accentHeight: \"accent-height\",\n      alignmentBaseline: \"alignment-baseline\",\n      arabicForm: \"arabic-form\",\n      baselineShift: \"baseline-shift\",\n      capHeight: \"cap-height\",\n      className: \"class\",\n      clipPath: \"clip-path\",\n      clipRule: \"clip-rule\",\n      colorInterpolation: \"color-interpolation\",\n      colorInterpolationFilters: \"color-interpolation-filters\",\n      colorProfile: \"color-profile\",\n      colorRendering: \"color-rendering\",\n      crossOrigin: \"crossorigin\",\n      dataType: \"datatype\",\n      dominantBaseline: \"dominant-baseline\",\n      enableBackground: \"enable-background\",\n      fillOpacity: \"fill-opacity\",\n      fillRule: \"fill-rule\",\n      floodColor: \"flood-color\",\n      floodOpacity: \"flood-opacity\",\n      fontFamily: \"font-family\",\n      fontSize: \"font-size\",\n      fontSizeAdjust: \"font-size-adjust\",\n      fontStretch: \"font-stretch\",\n      fontStyle: \"font-style\",\n      fontVariant: \"font-variant\",\n      fontWeight: \"font-weight\",\n      glyphName: \"glyph-name\",\n      glyphOrientationHorizontal: \"glyph-orientation-horizontal\",\n      glyphOrientationVertical: \"glyph-orientation-vertical\",\n      hrefLang: \"hreflang\",\n      horizAdvX: \"horiz-adv-x\",\n      horizOriginX: \"horiz-origin-x\",\n      horizOriginY: \"horiz-origin-y\",\n      imageRendering: \"image-rendering\",\n      letterSpacing: \"letter-spacing\",\n      lightingColor: \"lighting-color\",\n      markerEnd: \"marker-end\",\n      markerMid: \"marker-mid\",\n      markerStart: \"marker-start\",\n      navDown: \"nav-down\",\n      navDownLeft: \"nav-down-left\",\n      navDownRight: \"nav-down-right\",\n      navLeft: \"nav-left\",\n      navNext: \"nav-next\",\n      navPrev: \"nav-prev\",\n      navRight: \"nav-right\",\n      navUp: \"nav-up\",\n      navUpLeft: \"nav-up-left\",\n      navUpRight: \"nav-up-right\",\n      onAbort: \"onabort\",\n      onActivate: \"onactivate\",\n      onAfterPrint: \"onafterprint\",\n      onBeforePrint: \"onbeforeprint\",\n      onBegin: \"onbegin\",\n      onCancel: \"oncancel\",\n      onCanPlay: \"oncanplay\",\n      onCanPlayThrough: \"oncanplaythrough\",\n      onChange: \"onchange\",\n      onClick: \"onclick\",\n      onClose: \"onclose\",\n      onCopy: \"oncopy\",\n      onCueChange: \"oncuechange\",\n      onCut: \"oncut\",\n      onDblClick: \"ondblclick\",\n      onDrag: \"ondrag\",\n      onDragEnd: \"ondragend\",\n      onDragEnter: \"ondragenter\",\n      onDragExit: \"ondragexit\",\n      onDragLeave: \"ondragleave\",\n      onDragOver: \"ondragover\",\n      onDragStart: \"ondragstart\",\n      onDrop: \"ondrop\",\n      onDurationChange: \"ondurationchange\",\n      onEmptied: \"onemptied\",\n      onEnd: \"onend\",\n      onEnded: \"onended\",\n      onError: \"onerror\",\n      onFocus: \"onfocus\",\n      onFocusIn: \"onfocusin\",\n      onFocusOut: \"onfocusout\",\n      onHashChange: \"onhashchange\",\n      onInput: \"oninput\",\n      onInvalid: \"oninvalid\",\n      onKeyDown: \"onkeydown\",\n      onKeyPress: \"onkeypress\",\n      onKeyUp: \"onkeyup\",\n      onLoad: \"onload\",\n      onLoadedData: \"onloadeddata\",\n      onLoadedMetadata: \"onloadedmetadata\",\n      onLoadStart: \"onloadstart\",\n      onMessage: \"onmessage\",\n      onMouseDown: \"onmousedown\",\n      onMouseEnter: \"onmouseenter\",\n      onMouseLeave: \"onmouseleave\",\n      onMouseMove: \"onmousemove\",\n      onMouseOut: \"onmouseout\",\n      onMouseOver: \"onmouseover\",\n      onMouseUp: \"onmouseup\",\n      onMouseWheel: \"onmousewheel\",\n      onOffline: \"onoffline\",\n      onOnline: \"ononline\",\n      onPageHide: \"onpagehide\",\n      onPageShow: \"onpageshow\",\n      onPaste: \"onpaste\",\n      onPause: \"onpause\",\n      onPlay: \"onplay\",\n      onPlaying: \"onplaying\",\n      onPopState: \"onpopstate\",\n      onProgress: \"onprogress\",\n      onRateChange: \"onratechange\",\n      onRepeat: \"onrepeat\",\n      onReset: \"onreset\",\n      onResize: \"onresize\",\n      onScroll: \"onscroll\",\n      onSeeked: \"onseeked\",\n      onSeeking: \"onseeking\",\n      onSelect: \"onselect\",\n      onShow: \"onshow\",\n      onStalled: \"onstalled\",\n      onStorage: \"onstorage\",\n      onSubmit: \"onsubmit\",\n      onSuspend: \"onsuspend\",\n      onTimeUpdate: \"ontimeupdate\",\n      onToggle: \"ontoggle\",\n      onUnload: \"onunload\",\n      onVolumeChange: \"onvolumechange\",\n      onWaiting: \"onwaiting\",\n      onZoom: \"onzoom\",\n      overlinePosition: \"overline-position\",\n      overlineThickness: \"overline-thickness\",\n      paintOrder: \"paint-order\",\n      panose1: \"panose-1\",\n      pointerEvents: \"pointer-events\",\n      referrerPolicy: \"referrerpolicy\",\n      renderingIntent: \"rendering-intent\",\n      shapeRendering: \"shape-rendering\",\n      stopColor: \"stop-color\",\n      stopOpacity: \"stop-opacity\",\n      strikethroughPosition: \"strikethrough-position\",\n      strikethroughThickness: \"strikethrough-thickness\",\n      strokeDashArray: \"stroke-dasharray\",\n      strokeDashOffset: \"stroke-dashoffset\",\n      strokeLineCap: \"stroke-linecap\",\n      strokeLineJoin: \"stroke-linejoin\",\n      strokeMiterLimit: \"stroke-miterlimit\",\n      strokeOpacity: \"stroke-opacity\",\n      strokeWidth: \"stroke-width\",\n      tabIndex: \"tabindex\",\n      textAnchor: \"text-anchor\",\n      textDecoration: \"text-decoration\",\n      textRendering: \"text-rendering\",\n      transformOrigin: \"transform-origin\",\n      typeOf: \"typeof\",\n      underlinePosition: \"underline-position\",\n      underlineThickness: \"underline-thickness\",\n      unicodeBidi: \"unicode-bidi\",\n      unicodeRange: \"unicode-range\",\n      unitsPerEm: \"units-per-em\",\n      vAlphabetic: \"v-alphabetic\",\n      vHanging: \"v-hanging\",\n      vIdeographic: \"v-ideographic\",\n      vMathematical: \"v-mathematical\",\n      vectorEffect: \"vector-effect\",\n      vertAdvY: \"vert-adv-y\",\n      vertOriginX: \"vert-origin-x\",\n      vertOriginY: \"vert-origin-y\",\n      wordSpacing: \"word-spacing\",\n      writingMode: \"writing-mode\",\n      xHeight: \"x-height\",\n      // These were camelcased in Tiny. Now lowercased in SVG 2\n      playbackOrder: \"playbackorder\",\n      timelineBegin: \"timelinebegin\",\n    },\n    transform: Pf,\n    properties: {\n      about: _t,\n      accentHeight: te,\n      accumulate: null,\n      additive: null,\n      alignmentBaseline: null,\n      alphabetic: te,\n      amplitude: te,\n      arabicForm: null,\n      ascent: te,\n      attributeName: null,\n      attributeType: null,\n      azimuth: te,\n      bandwidth: null,\n      baselineShift: null,\n      baseFrequency: null,\n      baseProfile: null,\n      bbox: null,\n      begin: null,\n      bias: te,\n      by: null,\n      calcMode: null,\n      capHeight: te,\n      className: Be,\n      clip: null,\n      clipPath: null,\n      clipPathUnits: null,\n      clipRule: null,\n      color: null,\n      colorInterpolation: null,\n      colorInterpolationFilters: null,\n      colorProfile: null,\n      colorRendering: null,\n      content: null,\n      contentScriptType: null,\n      contentStyleType: null,\n      crossOrigin: null,\n      cursor: null,\n      cx: null,\n      cy: null,\n      d: null,\n      dataType: null,\n      defaultAction: null,\n      descent: te,\n      diffuseConstant: te,\n      direction: null,\n      display: null,\n      dur: null,\n      divisor: te,\n      dominantBaseline: null,\n      download: me,\n      dx: null,\n      dy: null,\n      edgeMode: null,\n      editable: null,\n      elevation: te,\n      enableBackground: null,\n      end: null,\n      event: null,\n      exponent: te,\n      externalResourcesRequired: null,\n      fill: null,\n      fillOpacity: te,\n      fillRule: null,\n      filter: null,\n      filterRes: null,\n      filterUnits: null,\n      floodColor: null,\n      floodOpacity: null,\n      focusable: null,\n      focusHighlight: null,\n      fontFamily: null,\n      fontSize: null,\n      fontSizeAdjust: null,\n      fontStretch: null,\n      fontStyle: null,\n      fontVariant: null,\n      fontWeight: null,\n      format: null,\n      fr: null,\n      from: null,\n      fx: null,\n      fy: null,\n      g1: So,\n      g2: So,\n      glyphName: So,\n      glyphOrientationHorizontal: null,\n      glyphOrientationVertical: null,\n      glyphRef: null,\n      gradientTransform: null,\n      gradientUnits: null,\n      handler: null,\n      hanging: te,\n      hatchContentUnits: null,\n      hatchUnits: null,\n      height: null,\n      href: null,\n      hrefLang: null,\n      horizAdvX: te,\n      horizOriginX: te,\n      horizOriginY: te,\n      id: null,\n      ideographic: te,\n      imageRendering: null,\n      initialVisibility: null,\n      in: null,\n      in2: null,\n      intercept: te,\n      k: te,\n      k1: te,\n      k2: te,\n      k3: te,\n      k4: te,\n      kernelMatrix: _t,\n      kernelUnitLength: null,\n      keyPoints: null,\n      // SEMI_COLON_SEPARATED\n      keySplines: null,\n      // SEMI_COLON_SEPARATED\n      keyTimes: null,\n      // SEMI_COLON_SEPARATED\n      kerning: null,\n      lang: null,\n      lengthAdjust: null,\n      letterSpacing: null,\n      lightingColor: null,\n      limitingConeAngle: te,\n      local: null,\n      markerEnd: null,\n      markerMid: null,\n      markerStart: null,\n      markerHeight: null,\n      markerUnits: null,\n      markerWidth: null,\n      mask: null,\n      maskContentUnits: null,\n      maskUnits: null,\n      mathematical: null,\n      max: null,\n      media: null,\n      mediaCharacterEncoding: null,\n      mediaContentEncodings: null,\n      mediaSize: te,\n      mediaTime: null,\n      method: null,\n      min: null,\n      mode: null,\n      name: null,\n      navDown: null,\n      navDownLeft: null,\n      navDownRight: null,\n      navLeft: null,\n      navNext: null,\n      navPrev: null,\n      navRight: null,\n      navUp: null,\n      navUpLeft: null,\n      navUpRight: null,\n      numOctaves: null,\n      observer: null,\n      offset: null,\n      onAbort: null,\n      onActivate: null,\n      onAfterPrint: null,\n      onBeforePrint: null,\n      onBegin: null,\n      onCancel: null,\n      onCanPlay: null,\n      onCanPlayThrough: null,\n      onChange: null,\n      onClick: null,\n      onClose: null,\n      onCopy: null,\n      onCueChange: null,\n      onCut: null,\n      onDblClick: null,\n      onDrag: null,\n      onDragEnd: null,\n      onDragEnter: null,\n      onDragExit: null,\n      onDragLeave: null,\n      onDragOver: null,\n      onDragStart: null,\n      onDrop: null,\n      onDurationChange: null,\n      onEmptied: null,\n      onEnd: null,\n      onEnded: null,\n      onError: null,\n      onFocus: null,\n      onFocusIn: null,\n      onFocusOut: null,\n      onHashChange: null,\n      onInput: null,\n      onInvalid: null,\n      onKeyDown: null,\n      onKeyPress: null,\n      onKeyUp: null,\n      onLoad: null,\n      onLoadedData: null,\n      onLoadedMetadata: null,\n      onLoadStart: null,\n      onMessage: null,\n      onMouseDown: null,\n      onMouseEnter: null,\n      onMouseLeave: null,\n      onMouseMove: null,\n      onMouseOut: null,\n      onMouseOver: null,\n      onMouseUp: null,\n      onMouseWheel: null,\n      onOffline: null,\n      onOnline: null,\n      onPageHide: null,\n      onPageShow: null,\n      onPaste: null,\n      onPause: null,\n      onPlay: null,\n      onPlaying: null,\n      onPopState: null,\n      onProgress: null,\n      onRateChange: null,\n      onRepeat: null,\n      onReset: null,\n      onResize: null,\n      onScroll: null,\n      onSeeked: null,\n      onSeeking: null,\n      onSelect: null,\n      onShow: null,\n      onStalled: null,\n      onStorage: null,\n      onSubmit: null,\n      onSuspend: null,\n      onTimeUpdate: null,\n      onToggle: null,\n      onUnload: null,\n      onVolumeChange: null,\n      onWaiting: null,\n      onZoom: null,\n      opacity: null,\n      operator: null,\n      order: null,\n      orient: null,\n      orientation: null,\n      origin: null,\n      overflow: null,\n      overlay: null,\n      overlinePosition: te,\n      overlineThickness: te,\n      paintOrder: null,\n      panose1: null,\n      path: null,\n      pathLength: te,\n      patternContentUnits: null,\n      patternTransform: null,\n      patternUnits: null,\n      phase: null,\n      ping: Be,\n      pitch: null,\n      playbackOrder: null,\n      pointerEvents: null,\n      points: null,\n      pointsAtX: te,\n      pointsAtY: te,\n      pointsAtZ: te,\n      preserveAlpha: null,\n      preserveAspectRatio: null,\n      primitiveUnits: null,\n      propagate: null,\n      property: _t,\n      r: null,\n      radius: null,\n      referrerPolicy: null,\n      refX: null,\n      refY: null,\n      rel: _t,\n      rev: _t,\n      renderingIntent: null,\n      repeatCount: null,\n      repeatDur: null,\n      requiredExtensions: _t,\n      requiredFeatures: _t,\n      requiredFonts: _t,\n      requiredFormats: _t,\n      resource: null,\n      restart: null,\n      result: null,\n      rotate: null,\n      rx: null,\n      ry: null,\n      scale: null,\n      seed: null,\n      shapeRendering: null,\n      side: null,\n      slope: null,\n      snapshotTime: null,\n      specularConstant: te,\n      specularExponent: te,\n      spreadMethod: null,\n      spacing: null,\n      startOffset: null,\n      stdDeviation: null,\n      stemh: null,\n      stemv: null,\n      stitchTiles: null,\n      stopColor: null,\n      stopOpacity: null,\n      strikethroughPosition: te,\n      strikethroughThickness: te,\n      string: null,\n      stroke: null,\n      strokeDashArray: _t,\n      strokeDashOffset: null,\n      strokeLineCap: null,\n      strokeLineJoin: null,\n      strokeMiterLimit: te,\n      strokeOpacity: te,\n      strokeWidth: null,\n      style: null,\n      surfaceScale: te,\n      syncBehavior: null,\n      syncBehaviorDefault: null,\n      syncMaster: null,\n      syncTolerance: null,\n      syncToleranceDefault: null,\n      systemLanguage: _t,\n      tabIndex: te,\n      tableValues: null,\n      target: null,\n      targetX: te,\n      targetY: te,\n      textAnchor: null,\n      textDecoration: null,\n      textRendering: null,\n      textLength: null,\n      timelineBegin: null,\n      title: null,\n      transformBehavior: null,\n      type: null,\n      typeOf: _t,\n      to: null,\n      transform: null,\n      transformOrigin: null,\n      u1: null,\n      u2: null,\n      underlinePosition: te,\n      underlineThickness: te,\n      unicode: null,\n      unicodeBidi: null,\n      unicodeRange: null,\n      unitsPerEm: te,\n      values: null,\n      vAlphabetic: te,\n      vMathematical: te,\n      vectorEffect: null,\n      vHanging: te,\n      vIdeographic: te,\n      version: null,\n      vertAdvY: te,\n      vertOriginX: te,\n      vertOriginY: te,\n      viewBox: null,\n      viewTarget: null,\n      visibility: null,\n      width: null,\n      widths: null,\n      wordSpacing: null,\n      writingMode: null,\n      x: null,\n      x1: null,\n      x2: null,\n      xChannelSelector: null,\n      xHeight: te,\n      y: null,\n      y1: null,\n      y2: null,\n      yChannelSelector: null,\n      z: null,\n      zoomAndPan: null,\n    },\n  }),\n  C_ = /^data[-\\w.:]+$/i,\n  Y0 = /-[a-z]/g,\n  v_ = /[A-Z]/g;\nfunction x_(e, t) {\n  const n = ec(t);\n  let o = t,\n    r = $t;\n  if (n in e.normal) return e.property[e.normal[n]];\n  if (n.length > 4 && n.slice(0, 4) === \"data\" && C_.test(t)) {\n    if (t.charAt(4) === \"-\") {\n      const i = t.slice(5).replace(Y0, E_);\n      o = \"data\" + i.charAt(0).toUpperCase() + i.slice(1);\n    } else {\n      const i = t.slice(4);\n      if (!Y0.test(i)) {\n        let a = i.replace(v_, w_);\n        a.charAt(0) !== \"-\" && (a = \"-\" + a), (t = \"data\" + a);\n      }\n    }\n    r = A1;\n  }\n  return new r(o, t);\n}\nfunction w_(e) {\n  return \"-\" + e.toLowerCase();\n}\nfunction E_(e) {\n  return e.charAt(1).toUpperCase();\n}\nconst G0 = {\n    classId: \"classID\",\n    dataType: \"datatype\",\n    itemId: \"itemID\",\n    strokeDashArray: \"strokeDasharray\",\n    strokeDashOffset: \"strokeDashoffset\",\n    strokeLineCap: \"strokeLinecap\",\n    strokeLineJoin: \"strokeLinejoin\",\n    strokeMiterLimit: \"strokeMiterlimit\",\n    typeOf: \"typeof\",\n    xLinkActuate: \"xlinkActuate\",\n    xLinkArcRole: \"xlinkArcrole\",\n    xLinkHref: \"xlinkHref\",\n    xLinkRole: \"xlinkRole\",\n    xLinkShow: \"xlinkShow\",\n    xLinkTitle: \"xlinkTitle\",\n    xLinkType: \"xlinkType\",\n    xmlnsXLink: \"xmlnsXlink\",\n  },\n  S_ = Rf([zf, Hf, Vf, $f, b_], \"html\"),\n  k_ = Rf([zf, Hf, Vf, $f, y_], \"svg\");\nfunction __(e) {\n  if (e.allowedElements && e.disallowedElements)\n    throw new TypeError(\n      \"Only one of `allowedElements` and `disallowedElements` should be defined\",\n    );\n  if (e.allowedElements || e.disallowedElements || e.allowElement)\n    return (t) => {\n      k1(t, \"element\", (n, o, r) => {\n        const i =\n          /** @type {Element|Root} */\n          r;\n        let a;\n        if (\n          (e.allowedElements\n            ? (a = !e.allowedElements.includes(n.tagName))\n            : e.disallowedElements &&\n              (a = e.disallowedElements.includes(n.tagName)),\n          !a &&\n            e.allowElement &&\n            typeof o == \"number\" &&\n            (a = !e.allowElement(n, o, i)),\n          a && typeof o == \"number\")\n        )\n          return (\n            e.unwrapDisallowed && n.children\n              ? i.children.splice(o, 1, ...n.children)\n              : i.children.splice(o, 1),\n            o\n          );\n      });\n    };\n}\nvar nc = { exports: {} },\n  je = {};\n/**\n * @license React\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar K0;\nfunction A_() {\n  if (K0) return je;\n  K0 = 1;\n  var e = Symbol.for(\"react.element\"),\n    t = Symbol.for(\"react.portal\"),\n    n = Symbol.for(\"react.fragment\"),\n    o = Symbol.for(\"react.strict_mode\"),\n    r = Symbol.for(\"react.profiler\"),\n    i = Symbol.for(\"react.provider\"),\n    a = Symbol.for(\"react.context\"),\n    l = Symbol.for(\"react.server_context\"),\n    s = Symbol.for(\"react.forward_ref\"),\n    u = Symbol.for(\"react.suspense\"),\n    c = Symbol.for(\"react.suspense_list\"),\n    d = Symbol.for(\"react.memo\"),\n    p = Symbol.for(\"react.lazy\"),\n    h = Symbol.for(\"react.offscreen\"),\n    m;\n  m = Symbol.for(\"react.module.reference\");\n  function b(y) {\n    if (typeof y == \"object\" && y !== null) {\n      var g = y.$$typeof;\n      switch (g) {\n        case e:\n          switch (((y = y.type), y)) {\n            case n:\n            case r:\n            case o:\n            case u:\n            case c:\n              return y;\n            default:\n              switch (((y = y && y.$$typeof), y)) {\n                case l:\n                case a:\n                case s:\n                case p:\n                case d:\n                case i:\n                  return y;\n                default:\n                  return g;\n              }\n          }\n        case t:\n          return g;\n      }\n    }\n  }\n  return (\n    (je.ContextConsumer = a),\n    (je.ContextProvider = i),\n    (je.Element = e),\n    (je.ForwardRef = s),\n    (je.Fragment = n),\n    (je.Lazy = p),\n    (je.Memo = d),\n    (je.Portal = t),\n    (je.Profiler = r),\n    (je.StrictMode = o),\n    (je.Suspense = u),\n    (je.SuspenseList = c),\n    (je.isAsyncMode = function () {\n      return !1;\n    }),\n    (je.isConcurrentMode = function () {\n      return !1;\n    }),\n    (je.isContextConsumer = function (y) {\n      return b(y) === a;\n    }),\n    (je.isContextProvider = function (y) {\n      return b(y) === i;\n    }),\n    (je.isElement = function (y) {\n      return typeof y == \"object\" && y !== null && y.$$typeof === e;\n    }),\n    (je.isForwardRef = function (y) {\n      return b(y) === s;\n    }),\n    (je.isFragment = function (y) {\n      return b(y) === n;\n    }),\n    (je.isLazy = function (y) {\n      return b(y) === p;\n    }),\n    (je.isMemo = function (y) {\n      return b(y) === d;\n    }),\n    (je.isPortal = function (y) {\n      return b(y) === t;\n    }),\n    (je.isProfiler = function (y) {\n      return b(y) === r;\n    }),\n    (je.isStrictMode = function (y) {\n      return b(y) === o;\n    }),\n    (je.isSuspense = function (y) {\n      return b(y) === u;\n    }),\n    (je.isSuspenseList = function (y) {\n      return b(y) === c;\n    }),\n    (je.isValidElementType = function (y) {\n      return (\n        typeof y == \"string\" ||\n        typeof y == \"function\" ||\n        y === n ||\n        y === r ||\n        y === o ||\n        y === u ||\n        y === c ||\n        y === h ||\n        (typeof y == \"object\" &&\n          y !== null &&\n          (y.$$typeof === p ||\n            y.$$typeof === d ||\n            y.$$typeof === i ||\n            y.$$typeof === a ||\n            y.$$typeof === s ||\n            y.$$typeof === m ||\n            y.getModuleId !== void 0))\n      );\n    }),\n    (je.typeOf = b),\n    je\n  );\n}\nvar Fe = {};\n/**\n * @license React\n * react-is.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar X0;\nfunction M_() {\n  return (\n    X0 ||\n      ((X0 = 1),\n      process.env.NODE_ENV !== \"production\" &&\n        (function () {\n          var e = Symbol.for(\"react.element\"),\n            t = Symbol.for(\"react.portal\"),\n            n = Symbol.for(\"react.fragment\"),\n            o = Symbol.for(\"react.strict_mode\"),\n            r = Symbol.for(\"react.profiler\"),\n            i = Symbol.for(\"react.provider\"),\n            a = Symbol.for(\"react.context\"),\n            l = Symbol.for(\"react.server_context\"),\n            s = Symbol.for(\"react.forward_ref\"),\n            u = Symbol.for(\"react.suspense\"),\n            c = Symbol.for(\"react.suspense_list\"),\n            d = Symbol.for(\"react.memo\"),\n            p = Symbol.for(\"react.lazy\"),\n            h = Symbol.for(\"react.offscreen\"),\n            m = !1,\n            b = !1,\n            y = !1,\n            g = !1,\n            x = !1,\n            v;\n          v = Symbol.for(\"react.module.reference\");\n          function S(ie) {\n            return !!(\n              typeof ie == \"string\" ||\n              typeof ie == \"function\" ||\n              ie === n ||\n              ie === r ||\n              x ||\n              ie === o ||\n              ie === u ||\n              ie === c ||\n              g ||\n              ie === h ||\n              m ||\n              b ||\n              y ||\n              (typeof ie == \"object\" &&\n                ie !== null &&\n                (ie.$$typeof === p ||\n                  ie.$$typeof === d ||\n                  ie.$$typeof === i ||\n                  ie.$$typeof === a ||\n                  ie.$$typeof === s || // This needs to include all possible module reference object\n                  // types supported by any Flight configuration anywhere since\n                  // we don't know which Flight build this will end up being used\n                  // with.\n                  ie.$$typeof === v ||\n                  ie.getModuleId !== void 0))\n            );\n          }\n          function w(ie) {\n            if (typeof ie == \"object\" && ie !== null) {\n              var Ae = ie.$$typeof;\n              switch (Ae) {\n                case e:\n                  var We = ie.type;\n                  switch (We) {\n                    case n:\n                    case r:\n                    case o:\n                    case u:\n                    case c:\n                      return We;\n                    default:\n                      var Ee = We && We.$$typeof;\n                      switch (Ee) {\n                        case l:\n                        case a:\n                        case s:\n                        case p:\n                        case d:\n                        case i:\n                          return Ee;\n                        default:\n                          return Ae;\n                      }\n                  }\n                case t:\n                  return Ae;\n              }\n            }\n          }\n          var E = a,\n            M = i,\n            _ = e,\n            j = s,\n            R = n,\n            D = p,\n            P = d,\n            V = t,\n            k = r,\n            N = o,\n            T = u,\n            F = c,\n            I = !1,\n            L = !1;\n          function C(ie) {\n            return (\n              I ||\n                ((I = !0),\n                console.warn(\n                  \"The ReactIs.isAsyncMode() alias has been deprecated, and will be removed in React 18+.\",\n                )),\n              !1\n            );\n          }\n          function H(ie) {\n            return (\n              L ||\n                ((L = !0),\n                console.warn(\n                  \"The ReactIs.isConcurrentMode() alias has been deprecated, and will be removed in React 18+.\",\n                )),\n              !1\n            );\n          }\n          function B(ie) {\n            return w(ie) === a;\n          }\n          function A(ie) {\n            return w(ie) === i;\n          }\n          function W(ie) {\n            return typeof ie == \"object\" && ie !== null && ie.$$typeof === e;\n          }\n          function G(ie) {\n            return w(ie) === s;\n          }\n          function K(ie) {\n            return w(ie) === n;\n          }\n          function Q(ie) {\n            return w(ie) === p;\n          }\n          function ne(ie) {\n            return w(ie) === d;\n          }\n          function oe(ie) {\n            return w(ie) === t;\n          }\n          function U(ie) {\n            return w(ie) === r;\n          }\n          function ge(ie) {\n            return w(ie) === o;\n          }\n          function J(ie) {\n            return w(ie) === u;\n          }\n          function _e(ie) {\n            return w(ie) === c;\n          }\n          (Fe.ContextConsumer = E),\n            (Fe.ContextProvider = M),\n            (Fe.Element = _),\n            (Fe.ForwardRef = j),\n            (Fe.Fragment = R),\n            (Fe.Lazy = D),\n            (Fe.Memo = P),\n            (Fe.Portal = V),\n            (Fe.Profiler = k),\n            (Fe.StrictMode = N),\n            (Fe.Suspense = T),\n            (Fe.SuspenseList = F),\n            (Fe.isAsyncMode = C),\n            (Fe.isConcurrentMode = H),\n            (Fe.isContextConsumer = B),\n            (Fe.isContextProvider = A),\n            (Fe.isElement = W),\n            (Fe.isForwardRef = G),\n            (Fe.isFragment = K),\n            (Fe.isLazy = Q),\n            (Fe.isMemo = ne),\n            (Fe.isPortal = oe),\n            (Fe.isProfiler = U),\n            (Fe.isStrictMode = ge),\n            (Fe.isSuspense = J),\n            (Fe.isSuspenseList = _e),\n            (Fe.isValidElementType = S),\n            (Fe.typeOf = w);\n        })()),\n    Fe\n  );\n}\nprocess.env.NODE_ENV === \"production\"\n  ? (nc.exports = A_())\n  : (nc.exports = M_());\nvar T_ = nc.exports;\nconst O_ = /* @__PURE__ */ fn(T_);\nfunction N_(e) {\n  const t =\n    // @ts-expect-error looks like a node.\n    e && typeof e == \"object\" && e.type === \"text\"\n      ? // @ts-expect-error looks like a text.\n        e.value || \"\"\n      : e;\n  return typeof t == \"string\" && t.replace(/[ \\t\\n\\f\\r]/g, \"\") === \"\";\n}\nfunction L_(e) {\n  return e.join(\" \").trim();\n}\nfunction D_(e, t) {\n  const n = {};\n  return (e[e.length - 1] === \"\" ? [...e, \"\"] : e)\n    .join((n.padRight ? \" \" : \"\") + \",\" + (n.padLeft === !1 ? \"\" : \" \"))\n    .trim();\n}\nvar M1 = { exports: {} },\n  Q0 = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//g,\n  j_ = /\\n/g,\n  F_ = /^\\s*/,\n  R_ = /^(\\*?[-#/*\\\\\\w]+(\\[[0-9a-z_-]+\\])?)\\s*/,\n  I_ = /^:\\s*/,\n  H_ = /^((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^)]*?\\)|[^};])+)/,\n  z_ = /^[;\\s]*/,\n  P_ = /^\\s+|\\s+$/g,\n  B_ = `\n`,\n  J0 = \"/\",\n  ed = \"*\",\n  Zn = \"\",\n  V_ = \"comment\",\n  $_ = \"declaration\",\n  W_ = function (e, t) {\n    if (typeof e != \"string\")\n      throw new TypeError(\"First argument must be a string\");\n    if (!e) return [];\n    t = t || {};\n    var n = 1,\n      o = 1;\n    function r(m) {\n      var b = m.match(j_);\n      b && (n += b.length);\n      var y = m.lastIndexOf(B_);\n      o = ~y ? m.length - y : o + m.length;\n    }\n    function i() {\n      var m = { line: n, column: o };\n      return function (b) {\n        return (b.position = new a(m)), u(), b;\n      };\n    }\n    function a(m) {\n      (this.start = m),\n        (this.end = { line: n, column: o }),\n        (this.source = t.source);\n    }\n    a.prototype.content = e;\n    function l(m) {\n      var b = new Error(t.source + \":\" + n + \":\" + o + \": \" + m);\n      if (\n        ((b.reason = m),\n        (b.filename = t.source),\n        (b.line = n),\n        (b.column = o),\n        (b.source = e),\n        !t.silent)\n      )\n        throw b;\n    }\n    function s(m) {\n      var b = m.exec(e);\n      if (b) {\n        var y = b[0];\n        return r(y), (e = e.slice(y.length)), b;\n      }\n    }\n    function u() {\n      s(F_);\n    }\n    function c(m) {\n      var b;\n      for (m = m || []; (b = d()); ) b !== !1 && m.push(b);\n      return m;\n    }\n    function d() {\n      var m = i();\n      if (!(J0 != e.charAt(0) || ed != e.charAt(1))) {\n        for (\n          var b = 2;\n          Zn != e.charAt(b) && (ed != e.charAt(b) || J0 != e.charAt(b + 1));\n\n        )\n          ++b;\n        if (((b += 2), Zn === e.charAt(b - 1)))\n          return l(\"End of comment missing\");\n        var y = e.slice(2, b - 2);\n        return (\n          (o += 2),\n          r(y),\n          (e = e.slice(b)),\n          (o += 2),\n          m({\n            type: V_,\n            comment: y,\n          })\n        );\n      }\n    }\n    function p() {\n      var m = i(),\n        b = s(R_);\n      if (b) {\n        if ((d(), !s(I_))) return l(\"property missing ':'\");\n        var y = s(H_),\n          g = m({\n            type: $_,\n            property: td(b[0].replace(Q0, Zn)),\n            value: y ? td(y[0].replace(Q0, Zn)) : Zn,\n          });\n        return s(z_), g;\n      }\n    }\n    function h() {\n      var m = [];\n      c(m);\n      for (var b; (b = p()); ) b !== !1 && (m.push(b), c(m));\n      return m;\n    }\n    return u(), h();\n  };\nfunction td(e) {\n  return e ? e.replace(P_, Zn) : Zn;\n}\nvar Z_ = W_;\nfunction Wf(e, t) {\n  var n = null;\n  if (!e || typeof e != \"string\") return n;\n  for (\n    var o, r = Z_(e), i = typeof t == \"function\", a, l, s = 0, u = r.length;\n    s < u;\n    s++\n  )\n    (o = r[s]),\n      (a = o.property),\n      (l = o.value),\n      i ? t(a, l, o) : l && (n || (n = {}), (n[a] = l));\n  return n;\n}\nM1.exports = Wf;\nM1.exports.default = Wf;\nvar U_ = M1.exports;\nconst q_ = /* @__PURE__ */ fn(U_),\n  oc = {}.hasOwnProperty,\n  Y_ = /* @__PURE__ */ new Set([\"table\", \"thead\", \"tbody\", \"tfoot\", \"tr\"]);\nfunction Zf(e, t) {\n  const n = [];\n  let o = -1,\n    r;\n  for (; ++o < t.children.length; )\n    (r = t.children[o]),\n      r.type === \"element\"\n        ? n.push(G_(e, r, o, t))\n        : r.type === \"text\"\n          ? (t.type !== \"element\" || !Y_.has(t.tagName) || !N_(r)) &&\n            n.push(r.value)\n          : r.type === \"raw\" && !e.options.skipHtml && n.push(r.value);\n  return n;\n}\nfunction G_(e, t, n, o) {\n  const r = e.options,\n    i = r.transformLinkUri === void 0 ? Xw : r.transformLinkUri,\n    a = e.schema,\n    l = t.tagName,\n    s = {};\n  let u = a,\n    c;\n  if (\n    (a.space === \"html\" && l === \"svg\" && ((u = k_), (e.schema = u)),\n    t.properties)\n  )\n    for (c in t.properties)\n      oc.call(t.properties, c) && X_(s, c, t.properties[c], e);\n  (l === \"ol\" || l === \"ul\") && e.listDepth++;\n  const d = Zf(e, t);\n  (l === \"ol\" || l === \"ul\") && e.listDepth--, (e.schema = a);\n  const p = t.position || {\n      start: { line: null, column: null, offset: null },\n      end: { line: null, column: null, offset: null },\n    },\n    h = r.components && oc.call(r.components, l) ? r.components[l] : l,\n    m = typeof h == \"string\" || h === $.Fragment;\n  if (!O_.isValidElementType(h))\n    throw new TypeError(\n      `Component for name \\`${l}\\` not defined or is not renderable`,\n    );\n  if (\n    ((s.key = n),\n    l === \"a\" &&\n      r.linkTarget &&\n      (s.target =\n        typeof r.linkTarget == \"function\"\n          ? r.linkTarget(\n              String(s.href || \"\"),\n              t.children,\n              typeof s.title == \"string\" ? s.title : null,\n            )\n          : r.linkTarget),\n    l === \"a\" &&\n      i &&\n      (s.href = i(\n        String(s.href || \"\"),\n        t.children,\n        typeof s.title == \"string\" ? s.title : null,\n      )),\n    !m &&\n      l === \"code\" &&\n      o.type === \"element\" &&\n      o.tagName !== \"pre\" &&\n      (s.inline = !0),\n    !m &&\n      (l === \"h1\" ||\n        l === \"h2\" ||\n        l === \"h3\" ||\n        l === \"h4\" ||\n        l === \"h5\" ||\n        l === \"h6\") &&\n      (s.level = Number.parseInt(l.charAt(1), 10)),\n    l === \"img\" &&\n      r.transformImageUri &&\n      (s.src = r.transformImageUri(\n        String(s.src || \"\"),\n        String(s.alt || \"\"),\n        typeof s.title == \"string\" ? s.title : null,\n      )),\n    !m && l === \"li\" && o.type === \"element\")\n  ) {\n    const b = K_(t);\n    (s.checked = b && b.properties ? !!b.properties.checked : null),\n      (s.index = ls(o, t)),\n      (s.ordered = o.tagName === \"ol\");\n  }\n  return (\n    !m &&\n      (l === \"ol\" || l === \"ul\") &&\n      ((s.ordered = l === \"ol\"), (s.depth = e.listDepth)),\n    (l === \"td\" || l === \"th\") &&\n      (s.align &&\n        (s.style || (s.style = {}),\n        (s.style.textAlign = s.align),\n        delete s.align),\n      m || (s.isHeader = l === \"th\")),\n    !m &&\n      l === \"tr\" &&\n      o.type === \"element\" &&\n      (s.isHeader = o.tagName === \"thead\"),\n    r.sourcePos && (s[\"data-sourcepos\"] = eA(p)),\n    !m && r.rawSourcePos && (s.sourcePosition = t.position),\n    !m &&\n      r.includeElementIndex &&\n      ((s.index = ls(o, t)), (s.siblingCount = ls(o))),\n    m || (s.node = t),\n    d.length > 0 ? $.createElement(h, s, d) : $.createElement(h, s)\n  );\n}\nfunction K_(e) {\n  let t = -1;\n  for (; ++t < e.children.length; ) {\n    const n = e.children[t];\n    if (n.type === \"element\" && n.tagName === \"input\") return n;\n  }\n  return null;\n}\nfunction ls(e, t) {\n  let n = -1,\n    o = 0;\n  for (; ++n < e.children.length && e.children[n] !== t; )\n    e.children[n].type === \"element\" && o++;\n  return o;\n}\nfunction X_(e, t, n, o) {\n  const r = x_(o.schema, t);\n  let i = n;\n  i == null ||\n    i !== i ||\n    (Array.isArray(i) && (i = r.commaSeparated ? D_(i) : L_(i)),\n    r.property === \"style\" && typeof i == \"string\" && (i = Q_(i)),\n    r.space && r.property\n      ? (e[oc.call(G0, r.property) ? G0[r.property] : r.property] = i)\n      : r.attribute && (e[r.attribute] = i));\n}\nfunction Q_(e) {\n  const t = {};\n  try {\n    q_(e, n);\n  } catch {}\n  return t;\n  function n(o, r) {\n    const i = o.slice(0, 4) === \"-ms-\" ? `ms-${o.slice(4)}` : o;\n    t[i.replace(/-([a-z])/g, J_)] = r;\n  }\n}\nfunction J_(e, t) {\n  return t.toUpperCase();\n}\nfunction eA(e) {\n  return [e.start.line, \":\", e.start.column, \"-\", e.end.line, \":\", e.end.column]\n    .map(String)\n    .join(\"\");\n}\nconst nd = {}.hasOwnProperty,\n  tA = \"https://github.com/remarkjs/react-markdown/blob/main/changelog.md\",\n  gi = {\n    plugins: { to: \"remarkPlugins\", id: \"change-plugins-to-remarkplugins\" },\n    renderers: { to: \"components\", id: \"change-renderers-to-components\" },\n    astPlugins: { id: \"remove-buggy-html-in-markdown-parser\" },\n    allowDangerousHtml: { id: \"remove-buggy-html-in-markdown-parser\" },\n    escapeHtml: { id: \"remove-buggy-html-in-markdown-parser\" },\n    source: { to: \"children\", id: \"change-source-to-children\" },\n    allowNode: {\n      to: \"allowElement\",\n      id: \"replace-allownode-allowedtypes-and-disallowedtypes\",\n    },\n    allowedTypes: {\n      to: \"allowedElements\",\n      id: \"replace-allownode-allowedtypes-and-disallowedtypes\",\n    },\n    disallowedTypes: {\n      to: \"disallowedElements\",\n      id: \"replace-allownode-allowedtypes-and-disallowedtypes\",\n    },\n    includeNodeIndex: {\n      to: \"includeElementIndex\",\n      id: \"change-includenodeindex-to-includeelementindex\",\n    },\n  };\nfunction Uf(e) {\n  for (const i in gi)\n    if (nd.call(gi, i) && nd.call(e, i)) {\n      const a = gi[i];\n      console.warn(\n        `[react-markdown] Warning: please ${a.to ? `use \\`${a.to}\\` instead of` : \"remove\"} \\`${i}\\` (see <${tA}#${a.id}> for more info)`,\n      ),\n        delete gi[i];\n    }\n  const t = hE()\n      .use(wk)\n      .use(e.remarkPlugins || [])\n      .use(f_, {\n        ...e.remarkRehypeOptions,\n        allowDangerousHtml: !0,\n      })\n      .use(e.rehypePlugins || [])\n      .use(__, e),\n    n = new ff();\n  typeof e.children == \"string\"\n    ? (n.value = e.children)\n    : e.children !== void 0 &&\n      e.children !== null &&\n      console.warn(\n        `[react-markdown] Warning: please pass a string as \\`children\\` (not: \\`${e.children}\\`)`,\n      );\n  const o = t.runSync(t.parse(n), n);\n  if (o.type !== \"root\") throw new TypeError(\"Expected a `root` node\");\n  let r = $.createElement(\n    $.Fragment,\n    {},\n    Zf({ options: e, schema: S_, listDepth: 0 }, o),\n  );\n  return (\n    e.className && (r = $.createElement(\"div\", { className: e.className }, r)),\n    r\n  );\n}\nUf.propTypes = {\n  // Core options:\n  children: q.string,\n  // Layout options:\n  className: q.string,\n  // Filter options:\n  allowElement: q.func,\n  allowedElements: q.arrayOf(q.string),\n  disallowedElements: q.arrayOf(q.string),\n  unwrapDisallowed: q.bool,\n  // Plugin options:\n  remarkPlugins: q.arrayOf(\n    q.oneOfType([\n      q.object,\n      q.func,\n      q.arrayOf(\n        q.oneOfType([\n          q.bool,\n          q.string,\n          q.object,\n          q.func,\n          q.arrayOf(\n            // prettier-ignore\n            // type-coverage:ignore-next-line\n            q.any,\n          ),\n        ]),\n      ),\n    ]),\n  ),\n  rehypePlugins: q.arrayOf(\n    q.oneOfType([\n      q.object,\n      q.func,\n      q.arrayOf(\n        q.oneOfType([\n          q.bool,\n          q.string,\n          q.object,\n          q.func,\n          q.arrayOf(\n            // prettier-ignore\n            // type-coverage:ignore-next-line\n            q.any,\n          ),\n        ]),\n      ),\n    ]),\n  ),\n  // Transform options:\n  sourcePos: q.bool,\n  rawSourcePos: q.bool,\n  skipHtml: q.bool,\n  includeElementIndex: q.bool,\n  transformLinkUri: q.oneOfType([q.func, q.bool]),\n  linkTarget: q.oneOfType([q.func, q.string]),\n  transformImageUri: q.func,\n  components: q.object,\n};\nconst nA = ({ chat: e }) => {\n  var s;\n  const [t, n] = se(!0),\n    {\n      originData: { extra: o },\n    } = e;\n  if (!((s = o == null ? void 0 : o.statusUpdates) != null && s.length))\n    return null;\n  const r = () => n((u) => !u),\n    [i, ...a] = o.statusUpdates.filter((u) => u.type === \"info\"),\n    l = e.loading\n      ? /* @__PURE__ */ f.jsx(rc, { size: \"sm\" })\n      : /* @__PURE__ */ f.jsx(z2, {});\n  return /* @__PURE__ */ f.jsxs(bt, {\n    className: C1.statusUpdates,\n    children: [\n      /* @__PURE__ */ f.jsxs(Io, {\n        color: \"primary\",\n        onClick: r,\n        children: [\n          /* @__PURE__ */ f.jsxs(\"span\", { children: [l, \" \", i.message] }),\n          t ? /* @__PURE__ */ f.jsx(ir, {}) : /* @__PURE__ */ f.jsx(ar, {}),\n        ],\n      }),\n      a.length\n        ? /* @__PURE__ */ f.jsx(rr, {\n            isOpen: t,\n            children: /* @__PURE__ */ f.jsx(bt, {\n              children: /* @__PURE__ */ f.jsx(Mt, {\n                children: /* @__PURE__ */ f.jsx(d4, {\n                  className: \"list-unstyled m-0\",\n                  style: { lineHeight: 1.5 },\n                  children: a.map((u) =>\n                    /* @__PURE__ */ f.jsxs(\n                      \"li\",\n                      {\n                        children: [\n                          /* @__PURE__ */ f.jsx(z2, {}),\n                          \" \",\n                          /* @__PURE__ */ f.jsx(\"div\", {\n                            children: /* @__PURE__ */ f.jsx(Uf, {\n                              children: u.message\n                                .trim()\n                                .replace(/```/g, \"\\n```\"),\n                            }),\n                          }),\n                        ],\n                      },\n                      u.id,\n                    ),\n                  ),\n                }),\n              }),\n            }),\n          })\n        : null,\n    ],\n  });\n};\nvar mi,\n  oA = new Uint8Array(16);\nfunction rA() {\n  if (\n    !mi &&\n    ((mi =\n      (typeof crypto < \"u\" &&\n        crypto.getRandomValues &&\n        crypto.getRandomValues.bind(crypto)) ||\n      (typeof msCrypto < \"u\" &&\n        typeof msCrypto.getRandomValues == \"function\" &&\n        msCrypto.getRandomValues.bind(msCrypto))),\n    !mi)\n  )\n    throw new Error(\n      \"crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported\",\n    );\n  return mi(oA);\n}\nconst iA =\n  /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;\nfunction aA(e) {\n  return typeof e == \"string\" && iA.test(e);\n}\nvar ct = [];\nfor (var ss = 0; ss < 256; ++ss) ct.push((ss + 256).toString(16).substr(1));\nfunction lA(e) {\n  var t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 0,\n    n = (\n      ct[e[t + 0]] +\n      ct[e[t + 1]] +\n      ct[e[t + 2]] +\n      ct[e[t + 3]] +\n      \"-\" +\n      ct[e[t + 4]] +\n      ct[e[t + 5]] +\n      \"-\" +\n      ct[e[t + 6]] +\n      ct[e[t + 7]] +\n      \"-\" +\n      ct[e[t + 8]] +\n      ct[e[t + 9]] +\n      \"-\" +\n      ct[e[t + 10]] +\n      ct[e[t + 11]] +\n      ct[e[t + 12]] +\n      ct[e[t + 13]] +\n      ct[e[t + 14]] +\n      ct[e[t + 15]]\n    ).toLowerCase();\n  if (!aA(n)) throw TypeError(\"Stringified UUID is invalid\");\n  return n;\n}\nfunction sA(e, t, n) {\n  e = e || {};\n  var o = e.random || (e.rng || rA)();\n  return (o[6] = (o[6] & 15) | 64), (o[8] = (o[8] & 63) | 128), lA(o);\n}\nconst cA = \"_citations_18435_1\",\n  uA = {\n    citations: cA,\n  },\n  dA = ({ citations: e, frontendUrl: t }) =>\n    e != null && e.length\n      ? /* @__PURE__ */ f.jsxs(Ze, {\n          className: uA.citations,\n          children: [\n            \"Learnings applied:\",\n            /* @__PURE__ */ f.jsx(\"ul\", {\n              style: { padding: 0, display: \"flex\", gap: 8, marginTop: -2 },\n              children: e.map((n, o) =>\n                /* @__PURE__ */ f.jsx(\n                  \"li\",\n                  {\n                    style: { listStyle: \"none\" },\n                    children: /* @__PURE__ */ f.jsx(md, {\n                      tag: \"a\",\n                      href: `${t}/teammates/${n.taskLabel}?learning=${n.id}`,\n                      tooltip: n.content,\n                      children: o + 1,\n                    }),\n                  },\n                  n.id,\n                ),\n              ),\n            }),\n          ],\n        })\n      : null,\n  zA = ({\n    loading: e,\n    onRequest: t,\n    sessionId: n,\n    onFollowupRequest: o,\n    frontendUrl: r,\n    ...i\n  }) => {\n    const a = he(),\n      l = (m = 16) => {\n        const b =\n          \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n        return Array.from({ length: m }, () =>\n          b.charAt(Math.floor(Math.random() * b.length)),\n        ).join(\"\");\n      },\n      [s, u] = se(l());\n    ue(() => {\n      n && u(n);\n    }, [n]);\n    const c = (m) => {\n        var y, g, x, v;\n        const b = (y = a.current) == null ? void 0 : y.getChatLoadingId();\n        if ((console.log(\"onStatusUpdate\", m, b), b)) {\n          const S = (g = a.current) == null ? void 0 : g.getChatById(b),\n            w = S != null && S.extra ? { ...S.extra } : {},\n            E = m.id || sA();\n          (w.statusUpdates = w.statusUpdates\n            ? [{ ...m, id: E }, ...w.statusUpdates]\n            : [{ ...m, id: E }]),\n            (x = a.current) == null || x.setMessageValue(b, \"extra\", w),\n            (v = a.current) == null ||\n              v.setMessageValue(\n                b,\n                \"content\",\n                (S == null ? void 0 : S.content) + \" \",\n              );\n        }\n      },\n      d = async (m) => {\n        try {\n          return await t(m, s, c);\n        } catch (b) {\n          return typeof b == \"string\" ? b : b.message;\n        }\n      },\n      p = () => {\n        setTimeout(() => {\n          var y, g, x;\n          const m = (y = a.current) == null ? void 0 : y.getChats();\n          if (!(m != null && m.length)) return;\n          const b = m[m.length - 1];\n          (x = a.current) == null ||\n            x.setChat(b.id, {\n              ...b,\n              content:\n                (g = b.content) == null\n                  ? void 0\n                  : g.replace(/\\\\\\$/g, \"$\").replace(/\\$/g, \"\\\\$\"),\n            });\n        }, 100);\n      },\n      h = () => {\n        var b;\n        const m = (b = a.current) == null ? void 0 : b.getChats();\n        m == null ||\n          m.forEach((y) => {\n            var g;\n            return (g = a.current) == null ? void 0 : g.deleteMessage(y.id);\n          });\n      };\n    return /* @__PURE__ */ f.jsx(v4, {\n      actions: {\n        render: () => [\n          /* @__PURE__ */ f.jsxs(Re, {\n            onClick: h,\n            outline: !0,\n            color: \"primary\",\n            size: \"sm\",\n            children: [\n              \"Clear chat \",\n              /* @__PURE__ */ f.jsx(Cc, { className: \"align-middle\" }),\n            ],\n          }),\n        ],\n      },\n      locale: \"en-US\",\n      request: d,\n      appStyle: { height: \"100%\", width: \"100%\" },\n      assistantMeta: {\n        avatar: k8,\n        name: \"Altimate\",\n      },\n      helloMessage: \"Hello, how are you??\",\n      userMeta: {\n        avatar: _8,\n        name: \"User\",\n      },\n      loading: e,\n      className: C1.chatbot,\n      chatRef: a,\n      onChatEnd: p,\n      chatItemRenderConfig: {\n        contentRender: (m, b) => {\n          var g, x, v;\n          const y =\n            (v =\n              (x = (g = m.originData) == null ? void 0 : g.extra) == null\n                ? void 0\n                : x.statusUpdates) == null\n              ? void 0\n              : v.find((S) => S.type === \"citations\");\n          return /* @__PURE__ */ f.jsxs(\"div\", {\n            children: [\n              /* @__PURE__ */ f.jsx(nA, { chat: m }),\n              b,\n              /* @__PURE__ */ f.jsx(dA, {\n                citations: y == null ? void 0 : y.citations,\n                frontendUrl: r,\n              }),\n            ],\n          });\n        },\n        render: (m, b, y) => {\n          var x;\n          const g =\n            m.loading ||\n            !o ||\n            ((x = m.originData) == null ? void 0 : x.role) !== \"assistant\";\n          return /* @__PURE__ */ f.jsxs(f.Fragment, {\n            children: [\n              y,\n              g\n                ? null\n                : /* @__PURE__ */ f.jsx(Kw, {\n                    onFollowupRequest: o,\n                    sessionId: s,\n                  }),\n            ],\n          });\n        },\n      },\n      markdownProps: {\n        components: {\n          pre: ({ node: m, className: b, children: y, ...g }) =>\n            /* @__PURE__ */ f.jsx(\"pre\", { ...g, className: b, children: y }),\n        },\n      },\n      ...i,\n    });\n  };\nexport {\n  Te as A,\n  md as B,\n  Lr as C,\n  TA as D,\n  uf as E,\n  b1 as F,\n  po as G,\n  Vw as H,\n  jn as I,\n  Wn as J,\n  _i as K,\n  In as L,\n  zr as M,\n  rf as N,\n  Lw as O,\n  y1 as P,\n  Sn as T,\n  He as a,\n  _A as b,\n  AA as c,\n  xA as d,\n  cc as e,\n  xn as f,\n  A6 as g,\n  lc as h,\n  Qd as i,\n  f as j,\n  O9 as k,\n  DA as l,\n  et as m,\n  Nx as n,\n  zA as o,\n  Gw as p,\n  dA as q,\n  jA as r,\n  kA as s,\n  FA as t,\n  Bt as u,\n  RA as v,\n  $w as w,\n  Sw as x,\n  IA as y,\n  HA as z,\n};\n"
  },
  {
    "path": "webview_panels/src/lib/index.ts",
    "content": "export * from \"./altimate/altimate-components\";"
  },
  {
    "path": "webview_panels/src/main.scss",
    "content": "@use \"variables\";\n\n:root {\n  --bs-body-font-family: \"Lexend\", var(--bs-font-sans-serif);\n}\nhtml {\n  font-size: var(--vscode-font-size, 13px);\n}\n\nbody,\nbody.vscode-high-contrast-light {\n  --primary-color: #{variables.$primaryColor};\n  --text-color--title: #171717;\n  --text-color--paragraph: #4a4d51;\n  --text-color--caption: #808080;\n  --text-color--white: #ffffff;\n  --text-color--brand: #247efe;\n  --background--base: #ffffff;\n  --background--01: #f6f5f8;\n  --background--02: #f5f6f7;\n  --background--03: #eaf3ff;\n  --background--04: #d3e5ff;\n  --background: #171717;\n  --background--blue: #247efe;\n  --action--active: #247efe;\n  --action--secondary: #eaf3ff;\n  --action--disable: #8390a3;\n  --action--brand: #004fbf;\n  --action-yellow: #ffce73;\n  --action-red: #ee140f;\n  --action-beta: #ff754c;\n  --action-brand-dark: #004fbf;\n  --icon--active: #535456;\n  --icon--default: #8390a3;\n  --icon--deactive: #c4cad2;\n  --icon--blue: #247efe;\n  --stroke--active: #424750;\n  --stroke--default: #8390a3;\n  --stroke--disable: #c4cad2;\n  --stroke--orange: #e38e00;\n  --stroke--blue: #247efe;\n  --gray--gray-01: #484e55;\n  --gray--gray-02: #3a3d41;\n  --gray--blue--gray-01: #082247;\n  --gray--blue--gray-02: #374c6a;\n  --background-orange: #32240c;\n}\n\nbody.vscode-dark,\nbody.vscode-high-contrast:not(.vscode-high-contrast-light) {\n  --primary-color: #247efe;\n  --text-color--title: #e8e8e8;\n  --text-color--paragraph: #c4cad2;\n  --text-color--caption: #808080;\n  --text-color--white: #ffffff;\n  --text-color--brand: #247efe;\n  --background--base: #1e1e1e;\n  --background--01: #171717;\n  --background--02: #28292c;\n  --background--03: #3c3c3c;\n  --background--04: #4a4d51;\n  --background: #ffffff;\n  --background--blue: #247efe;\n  --action--active: #247efe;\n  --action--brand: #004fbf;\n  --action--secondary: #8390a3;\n  --action--disable: #424750;\n  --action-red: #ee140f;\n  --action-yellow: #ffce73;\n  --action-brand-dark: #004fbf;\n  --stroke--active: #e8e8e8;\n  --stroke--default: #8390a3;\n  --stroke--disable: #424750;\n  --stroke--orange: #e38e00;\n  --stroke--blue: #247efe;\n  --icon--active: #e8e8e8;\n  --icon--default: #8390a3;\n  --icon--deactive: #424750;\n  --icon--blue: #247efe;\n  --gray--gray-01: #484e55;\n  --gray--gray-02: #3a3d41;\n  --gray--blue--gray-01: #082247;\n  --gray--blue--gray-02: #374c6a;\n  --background-orange: #32240c;\n}\n\nbody {\n  color: var(--text-color--title);\n  background: var(--vscode-panel-background);\n  padding: var(--spacing-3xl) var(--spacing-2xl) !important;\n  line-height: 160%;\n}\n\nb,\nstrong {\n  font-weight: 600;\n}\n\n.App > .container {\n  max-width: 100%;\n  padding-left: 0;\n}\n\n.gap-sm {\n  gap: 0.5rem;\n}\n\n.gap-md {\n  gap: 0.75rem;\n}\n\n.gap-lg {\n  gap: 1rem;\n}\n\n.gap-xl {\n  gap: 1.5rem;\n}\n\n.cursor-pointer {\n  cursor: pointer;\n}\n\n.codicon {\n  vertical-align: sub;\n  color: inherit;\n}\n\ncode {\n  color: inherit;\n}\n\n.spacer {\n  flex-grow: 1;\n}\n\n.text-para {\n  color: var(--text-color--paragraph);\n}\n\n.gap-0 {\n  gap: 0;\n}\n\n@mixin lines($n) {\n  display: -webkit-box;\n  text-overflow: ellipsis;\n  overflow: hidden;\n  -webkit-box-orient: vertical;\n  word-break: break-all;\n  -webkit-line-clamp: $n;\n}\n\n.lines-1 {\n  @include lines(1);\n}\n\n.lines-2 {\n  @include lines(2);\n}\n\n.lines-3 {\n  @include lines(3);\n}\n\n.text-overflow {\n  text-overflow: ellipsis;\n  overflow-x: hidden;\n  white-space: nowrap;\n}\n\n.new-feature{\n  background: rgb(255, 105, 74);\n  width: 12px;\n  height: 12px;\n  border-radius: 50%;\n  position: absolute;\n  top: -4px;\n  right: -4px;\n}"
  },
  {
    "path": "webview_panels/src/main.tsx",
    "content": "import React from \"react\";\nimport ReactDOM from \"react-dom/client\";\nimport { MemoryRouter } from \"react-router-dom\";\nimport App from \"./App\";\nimport { AvailableRoutes } from \"./AppConstants\";\nimport \"./main.scss\";\n\ndeclare global {\n  interface Window {\n    viewPath: string;\n  }\n}\n\nconst availableRoutes = Object.keys(AvailableRoutes);\n\n/**\n * This method selects the route to be loaded\n * if triggered from extension, it will use the viewPath set from extension\n * if triggered from web page, it will use the viewPath set as query param\n */\nconst getInitialIndex = (): number => {\n  const viewPath =\n    window.viewPath ?? // This will be set from extension\n    new URL(window.location.href).searchParams.get(\"viewPath\") ?? // this will be set as query param in web page\n    \"/\";\n  const index = availableRoutes.indexOf(viewPath);\n  if (index === -1) {\n    return 0;\n  }\n  return index;\n};\n\nReactDOM.createRoot(document.getElementById(\"root\")!).render(\n  <React.StrictMode>\n    <MemoryRouter\n      initialIndex={getInitialIndex()}\n      initialEntries={availableRoutes}\n    >\n      <App />\n    </MemoryRouter>\n  </React.StrictMode>,\n);\n"
  },
  {
    "path": "webview_panels/src/modules/AutoCollapsingNotification/AutoCollapsingNotification.tsx",
    "content": "import { useEffect, useState } from \"react\";\nimport { Alert } from \"@uicore\";\nimport { InfoCircleIcon } from \"@assets/icons\";\n\nconst AutoCollapsingNotification = ({\n  text,\n  delay,\n}: {\n  text: string;\n  delay: number;\n}): JSX.Element => {\n  const [showInfo, setShowInfo] = useState(true);\n  useEffect(() => {\n    const timer = setTimeout(() => setShowInfo(false), delay);\n    return () => clearTimeout(timer);\n  }, [delay]);\n\n  return (\n    <Alert\n      color=\"warning\"\n      onClick={() => setShowInfo((prevSetinfo) => !prevSetinfo)}\n      className=\"d-flex align-items-center cursor-pointer gap-sm m-0 p-2\"\n    >\n      <InfoCircleIcon />\n      {showInfo && text}\n    </Alert>\n  );\n};\n\nexport default AutoCollapsingNotification;\n"
  },
  {
    "path": "webview_panels/src/modules/app/AppProvider.tsx",
    "content": "import DataPilotProvider from \"@modules/dataPilot/DataPilotProvider\";\nimport { DataPilotChat } from \"@modules/dataPilot/types\";\nimport {\n  createContext,\n  ReactNode,\n  useEffect,\n  useMemo,\n  useReducer,\n} from \"react\";\nimport appSlice, {\n  initialState,\n  updateIsComponentsApiInitialized,\n} from \"./appSlice\";\nimport { executeRequestInAsync, executeRequestInSync } from \"./requestExecutor\";\nimport { ContextProps } from \"./types\";\nimport useListeners from \"./useListeners\";\nimport { ApiHelper } from \"@lib\";\nimport { panelLogger } from \"@modules/logger\";\n\nexport const AppContext = createContext<ContextProps>({\n  state: initialState,\n  dispatch: () => null,\n  postMessageToDataPilot: (_data) => null,\n  toggleDataPilot: (_open) => null,\n});\n\nconst AppProvider = ({ children }: { children: ReactNode }): JSX.Element => {\n  const [state, dispatch] = useReducer(\n    appSlice.reducer,\n    appSlice.getInitialState(),\n  );\n\n  useEffect(() => {\n    panelLogger.info(\"updating components api helper\");\n    // This overrides the components library api methods\n    // @ts-expect-error TODO: add type generic for executeRequestInSync\n    ApiHelper.get = async (\n      url: string,\n      data?: Record<string, unknown>,\n      request?: RequestInit,\n    ) => {\n      if (data?.telemetry) {\n        executeRequestInAsync(\"sendTelemetryEvent\", {\n          ...data.telemetry,\n        });\n      }\n      return executeRequestInSync(\"fetch\", {\n        endpoint: url,\n        fetchArgs: { ...data, ...request, method: \"GET\" },\n      });\n    };\n    // @ts-expect-error TODO: add type generic for executeRequestInSync\n    ApiHelper.post = async (\n      url: string,\n      data?: Record<string, unknown>,\n      request?: RequestInit,\n    ) => {\n      if (data?.telemetry) {\n        executeRequestInAsync(\"sendTelemetryEvent\", {\n          ...data.telemetry,\n        });\n      }\n\n      return executeRequestInSync(\"fetch\", {\n        endpoint: url,\n        fetchArgs: {\n          ...request,\n          body: JSON.stringify(data ?? {}),\n          method: \"POST\",\n        },\n      });\n    };\n    dispatch(updateIsComponentsApiInitialized(true));\n  }, []);\n\n  const postMessageToDataPilot = (\n    data: Partial<DataPilotChat> & { id: DataPilotChat[\"id\"] },\n  ) => {\n    executeRequestInAsync(\"datapilot:message\", data);\n  };\n\n  const toggleDataPilot = (open: boolean) => {\n    executeRequestInAsync(\"datapilot:toggle\", { open });\n  };\n\n  useListeners(dispatch);\n\n  const values = useMemo(\n    () => ({\n      state,\n      dispatch,\n      postMessageToDataPilot,\n      toggleDataPilot,\n    }),\n    [state, dispatch],\n  );\n\n  return (\n    <AppContext.Provider value={values}>\n      <DataPilotProvider>\n        <div className=\"App\">{children}</div>\n      </DataPilotProvider>\n    </AppContext.Provider>\n  );\n};\n\nexport default AppProvider;\n"
  },
  {
    "path": "webview_panels/src/modules/app/appSlice.ts",
    "content": "import { createSlice, PayloadAction } from \"@reduxjs/toolkit\";\nimport { AppStateProps, Themes, User } from \"./types\";\n\nexport const initialState = {\n  theme: Themes.Dark,\n  isComponentsApiInitialized: false,\n  users: {},\n  currentUser: null,\n  tenantInfo: {\n    frontendUrl: null,\n    currency: \"USD\",\n    // This is tenant level global setting\n    teammatesEnabled: false,\n  },\n} as AppStateProps;\n\nconst appSlice = createSlice({\n  name: \"appState\",\n  initialState,\n  reducers: {\n    setTenantInfo: (\n      state,\n      action: PayloadAction<AppStateProps[\"tenantInfo\"]>,\n    ) => {\n      state.tenantInfo = action.payload;\n    },\n    updateTheme: (state, action: PayloadAction<Themes>) => {\n      state.theme = action.payload;\n    },\n    updateIsComponentsApiInitialized: (\n      state,\n      action: PayloadAction<boolean>,\n    ) => {\n      state.isComponentsApiInitialized = action.payload;\n    },\n    setUsers: (state, action: PayloadAction<User[]>) => {\n      if (!action.payload?.length) {\n        return state;\n      }\n      return {\n        ...state,\n        users: action.payload.reduce((acc: Record<number, User>, user) => {\n          acc[user.id] = user;\n          return acc;\n        }, {}),\n      };\n    },\n    setCurrentUser: (\n      state,\n      action: PayloadAction<AppStateProps[\"currentUser\"]>,\n    ) => {\n      state.currentUser = action.payload;\n    },\n  },\n});\n\nexport const {\n  updateTheme,\n  updateIsComponentsApiInitialized,\n  setUsers,\n  setCurrentUser,\n  setTenantInfo,\n} = appSlice.actions;\nexport default appSlice;\n"
  },
  {
    "path": "webview_panels/src/modules/app/indexedDb.ts",
    "content": "/* eslint-disable no-underscore-dangle */\nimport { GenerationDBDataProps } from \"@modules/documentationEditor/types\";\nimport { DBSchema, IDBPDatabase, openDB } from \"idb\";\n\nexport interface AltimateDB extends DBSchema {\n  generations: {\n    value: GenerationDBDataProps;\n    key: string;\n    indexes: { modelIndex: string; projectIndex: string };\n  };\n}\n\ninterface IndexedDBHelperProps {\n  _db: IDBPDatabase<AltimateDB> | undefined;\n  getDb: () => Promise<IDBPDatabase<AltimateDB>>;\n  initialize: () => Promise<IDBPDatabase<AltimateDB>>;\n}\n\nconst dbName = \"altimate\";\nconst IndexedDBHelper: IndexedDBHelperProps = {\n  _db: undefined,\n  getDb: async () => {\n    if (!IndexedDBHelper._db) {\n      return IndexedDBHelper.initialize();\n    }\n\n    return IndexedDBHelper._db;\n  },\n  initialize: async () => {\n    const dbInstance = await openDB<AltimateDB>(dbName, 1, {\n      upgrade(db) {\n        const generationsStore = db.createObjectStore(\"generations\", {\n          autoIncrement: true,\n        });\n\n        // Create indexes to link models and projects\n        generationsStore.createIndex(\"projectIndex\", \"project\");\n        generationsStore.createIndex(\"modelIndex\", \"model\");\n      },\n    });\n    IndexedDBHelper._db = dbInstance;\n    return dbInstance;\n  },\n};\n\nexport default IndexedDBHelper;\n"
  },
  {
    "path": "webview_panels/src/modules/app/requestExecutor.ts",
    "content": "import { vscode } from \"@vscodeApi\";\nimport { IncomingSyncResponse } from \"./types\";\n\nconst requestMap: Record<\n  string,\n  {\n    resolve: (k: unknown) => void;\n    reject: (error?: Error) => void;\n    progress?: (chunk: string) => void;\n  }\n> = {};\n\nconst streamMap: Record<string, string> = {};\n\nexport const executeStreamRequest = (\n  url: string,\n  params: Record<string, unknown>,\n  progress: (chunk: string) => void,\n): Promise<unknown> =>\n  new Promise((resolve, reject) => {\n    const id = crypto.randomUUID();\n    requestMap[id] = { resolve, reject, progress };\n    streamMap[id] = \"\";\n    vscode.postMessage({ command: url, ...params, syncRequestId: id });\n  });\n\nexport const executeRequestInSync = (\n  url: string,\n  params: Record<string, unknown>,\n): Promise<unknown> =>\n  new Promise((resolve, reject) => {\n    const id = crypto.randomUUID();\n    requestMap[id] = { resolve, reject };\n    vscode.postMessage({ command: url, ...params, syncRequestId: id });\n  });\n\nexport const executeRequestInAsync = (\n  url: string,\n  params: Record<string, unknown>,\n): void => {\n  vscode.postMessage({ command: url, ...params });\n};\n\nconst updateProgress = (\n  body: unknown,\n  syncRequestId: string,\n  progress?: (chunk: string) => void,\n) => {\n  if (progress && body && \"chunk\" in (body as Record<string, unknown>)) {\n    streamMap[syncRequestId] += (body as Record<string, unknown>)\n      .chunk as string;\n    progress(streamMap[syncRequestId]);\n    return true;\n  }\n  return false;\n};\n\nexport const handleIncomingResponse = (args: IncomingSyncResponse): void => {\n  if (!requestMap[args.syncRequestId]) {\n    return;\n  }\n  const { resolve, reject, progress } = requestMap[args.syncRequestId];\n  if (args.status) {\n    if (updateProgress(args.body, args.syncRequestId, progress)) {\n      return;\n    }\n    resolve(args.body);\n  } else {\n    reject(new Error(args.error));\n  }\n  delete streamMap[args.syncRequestId];\n  delete requestMap[args.syncRequestId];\n};\n"
  },
  {
    "path": "webview_panels/src/modules/app/types.ts",
    "content": "import { DataPilotChat } from \"@modules/dataPilot/types\";\nimport { UnknownAction } from \"@reduxjs/toolkit\";\n\nexport enum Themes {\n  Dark = \"dark\",\n  Light = \"light\",\n}\nexport interface AppStateProps {\n  theme: Themes;\n  isComponentsApiInitialized: boolean;\n  users: Record<number, User>;\n  currentUser: User | null;\n  tenantInfo: {\n    frontendUrl: string | null;\n    currency: string;\n    teammatesEnabled: boolean;\n  };\n}\n\nexport interface ContextProps {\n  state: AppStateProps;\n  dispatch: React.Dispatch<UnknownAction>;\n  toggleDataPilot: (open: boolean) => void;\n  postMessageToDataPilot: (\n    message: Partial<DataPilotChat> & { id: DataPilotChat[\"id\"] },\n  ) => void;\n}\n\nexport interface IncomingMessageProps {\n  command: string;\n  args: Record<string, unknown>;\n}\n\nexport interface IncomingSyncResponse {\n  syncRequestId: string;\n  body: unknown;\n  status: boolean;\n  error: string;\n}\n\nexport interface User {\n  display_name: string;\n  first_name: string;\n  last_name: string;\n  id: number;\n}\n"
  },
  {
    "path": "webview_panels/src/modules/app/useAppContext.ts",
    "content": "import { useContext } from \"react\";\nimport { AppContext } from \"./AppProvider\";\nimport { ContextProps } from \"./types\";\n\nconst useAppContext = (): ContextProps => {\n  return useContext(AppContext);\n};\n\nexport default useAppContext;\n"
  },
  {
    "path": "webview_panels/src/modules/app/useListeners.ts",
    "content": "import { Dispatch, useCallback, useEffect } from \"react\";\nimport {\n  executeRequestInAsync,\n  executeRequestInSync,\n  handleIncomingResponse,\n} from \"./requestExecutor\";\nimport {\n  AppStateProps,\n  IncomingMessageProps,\n  IncomingSyncResponse,\n  Themes,\n  User,\n} from \"./types\";\nimport { panelLogger } from \"@modules/logger\";\nimport { UnknownAction } from \"@reduxjs/toolkit\";\nimport {\n  setCurrentUser,\n  setTenantInfo,\n  setUsers,\n  updateTheme,\n} from \"./appSlice\";\n\nconst useListeners = (dispatch: Dispatch<UnknownAction>): void => {\n  const onMesssage = useCallback(\n    (event: MessageEvent<IncomingMessageProps>) => {\n      const { command, args } = event.data;\n      switch (command) {\n        case \"response\":\n          handleIncomingResponse(args as unknown as IncomingSyncResponse);\n          break;\n        default:\n          break;\n      }\n    },\n    [],\n  );\n\n  const isDark = (element: HTMLElement) => {\n    const classList = element.classList;\n    if (classList.contains(\"vscode-dark\")) {\n      return true;\n    }\n\n    if (classList.contains(\"vscode-high-contrast-light\")) {\n      return false;\n    }\n\n    if (classList.contains(\"vscode-high-contrast\")) {\n      return true;\n    }\n\n    return false;\n  };\n  const setTheme = (element: HTMLElement) => {\n    dispatch(updateTheme(isDark(element) ? Themes.Dark : Themes.Light));\n  };\n\n  const loadUsersDetails = () => {\n    executeRequestInSync(\"getUsers\", {})\n      .then((data) => {\n        panelLogger.log(\"getUsers\", data);\n        dispatch(setUsers(data as User[]));\n      })\n      .catch((err) =>\n        panelLogger.error(\"error while fetching users list\", err),\n      );\n  };\n\n  const loadCurrentUser = () => {\n    executeRequestInSync(\"getCurrentUser\", {})\n      .then((data) => {\n        panelLogger.log(\"getCurrentUser\", data);\n        dispatch(setCurrentUser(data as User));\n      })\n      .catch((err) =>\n        panelLogger.error(\"error while fetching current user\", err),\n      );\n  };\n\n  const loadTenantInfo = () => {\n    executeRequestInSync(\"fetch\", {\n      endpoint: \"auth/tenant-info\",\n      fetchArgs: { method: \"GET\" },\n    })\n      .then((data) => {\n        panelLogger.log(\"loadTenantInfo\", data);\n        dispatch(setTenantInfo(data as AppStateProps[\"tenantInfo\"]));\n      })\n      .catch((err) =>\n        panelLogger.error(\"error while fetching tenant info\", err),\n      );\n  };\n\n  useEffect(() => {\n    window.addEventListener(\"message\", onMesssage);\n\n    executeRequestInAsync(\"webview:ready\", {});\n    const themeObserver = new MutationObserver((mutations) => {\n      mutations.forEach((mu) => {\n        panelLogger.debug(\"body classname modified!\", mu);\n        setTheme(mu.target as HTMLElement);\n      });\n    });\n\n    loadUsersDetails();\n    loadCurrentUser();\n    loadTenantInfo();\n\n    themeObserver.observe(document.body, {\n      attributes: true,\n      attributeFilter: [\"class\"],\n    });\n    setTheme(document.body);\n\n    return () => {\n      window.removeEventListener(\"message\", onMesssage);\n      themeObserver.disconnect();\n    };\n  }, [onMesssage]);\n};\n\nexport default useListeners;\n"
  },
  {
    "path": "webview_panels/src/modules/bigQuery/CostEstimator.tsx",
    "content": "import { useState } from \"react\";\nimport { Col, Card, CardTitle, CardBody, CardText, Button, Tag } from \"@uicore\";\nimport { executeRequestInSync } from \"../app/requestExecutor\";\n\ninterface BigQueryCostEstimateResponse {\n  modelName: string;\n  result: {\n    bytes_processed: string;\n  };\n}\nconst BigQueryCostEstimator = (): JSX.Element => {\n  const [isEstimating, setIsEstimating] = useState(false);\n  const [estimatedCost, setEstimatedCost] =\n    useState<BigQueryCostEstimateResponse | null>(null);\n\n  const triggerCostEstimate = async () => {\n    setIsEstimating(true);\n    setEstimatedCost(null);\n    const result = await executeRequestInSync(\"bigqueryCostEstimate\", {});\n    setIsEstimating(false);\n    setEstimatedCost(result as BigQueryCostEstimateResponse);\n  };\n  return (\n    <>\n      <Col lg={7}>\n        <Card>\n          <CardTitle tag=\"h6\">\n            BigQuery Cost Estimator\n            <Tag>Performance</Tag>\n          </CardTitle>\n          <CardBody>\n            <CardText>Estimate the cost of a BigQuery query</CardText>\n            <Button\n              disabled={isEstimating}\n              onClick={triggerCostEstimate}\n              color=\"primary\"\n            >\n              Estimate cost\n            </Button>\n          </CardBody>\n        </Card>\n      </Col>\n      <Col>\n        {estimatedCost ?? isEstimating ? (\n          <Card>\n            <CardTitle tag=\"h5\">Estimated BigQuery Cost</CardTitle>\n            <CardBody>\n              <CardText>\n                {isEstimating\n                  ? \"Estimating...\"\n                  : `The query for ${estimatedCost?.modelName} will process ${estimatedCost?.result.bytes_processed}`}\n              </CardText>\n            </CardBody>\n          </Card>\n        ) : null}\n      </Col>\n    </>\n  );\n};\n\nexport default BigQueryCostEstimator;\n"
  },
  {
    "path": "webview_panels/src/modules/commonActionButtons/CommonActionButtons.tsx",
    "content": "import DocGeneratorSettings from \"@modules/documentationEditor/components/settings/DocGeneratorSettings\";\nimport { Button, PopoverWithButton, Stack } from \"@uicore\";\nimport FeedbackButton from \"./FeedbackButton\";\nimport HelpButton from \"./HelpButton\";\nimport ShowConversationsButton from \"@modules/documentationEditor/components/conversation/ShowConversationsButton\";\nimport { HelpIcon, MoreIcon, SettingsIcon } from \"@assets/icons\";\nimport { useState } from \"react\";\n\nenum SelectedAction {\n  SETTINGS,\n  HELP,\n}\nconst CommonActionButtons = (): JSX.Element => {\n  const [action, setAction] = useState<SelectedAction | undefined>();\n\n  return (\n    <Stack className=\"align-items-center text-nowrap\">\n      <PopoverWithButton\n        width=\"auto\"\n        button={<Button outline title=\"More actions\" icon={<MoreIcon />} />}\n        popoverProps={{\n          placement: \"bottom\",\n          hideArrow: true,\n        }}\n      >\n        {({ close }) => (\n          <Stack direction=\"column\">\n            <ShowConversationsButton onClose={close} />\n            <Button\n              outline\n              onClick={() => {\n                close();\n                setAction(SelectedAction.SETTINGS);\n              }}\n              className=\"w-100 text-start\"\n            >\n              <SettingsIcon style={{ height: 16 }} /> Settings\n            </Button>\n            <Button\n              outline\n              className=\"w-100 text-start\"\n              onClick={() => {\n                close();\n                setAction(SelectedAction.HELP);\n              }}\n            >\n              <HelpIcon style={{ height: 16 }} /> Help\n            </Button>\n            <FeedbackButton\n              onClose={close}\n              url=\"https://form.jotform.com/251106030591141\"\n              buttonProps={{\n                outline: true,\n                className: \"w-100 text-start\",\n                showTextAlways: true,\n              }}\n            />\n          </Stack>\n        )}\n      </PopoverWithButton>\n\n      {action === SelectedAction.SETTINGS ? <DocGeneratorSettings /> : null}\n      {action === SelectedAction.HELP ? <HelpButton /> : null}\n    </Stack>\n  );\n};\n\nexport default CommonActionButtons;\n"
  },
  {
    "path": "webview_panels/src/modules/commonActionButtons/FeedbackButton.tsx",
    "content": "import { FeedbackIcon } from \"@assets/icons\";\nimport { sendTelemetryEvent } from \"@modules/documentationEditor/components/telemetry\";\nimport { vscode } from \"@modules/vscode\";\nimport { Button } from \"@uicore\";\nimport { TelemetryEvents } from \"@telemetryEvents\";\n\nconst FeedbackButton = ({\n  url,\n  onClose,\n  buttonProps,\n}: {\n  url: string;\n  onClose?: () => void;\n  buttonProps?: Parameters<typeof Button>[0];\n}): JSX.Element => {\n  const handleFeedbackClick = () => {\n    onClose?.();\n    sendTelemetryEvent(TelemetryEvents[\"DocumentationEditor/FeedbackClick\"]);\n    vscode.postMessage({\n      command: \"openURL\",\n      url,\n    });\n  };\n  return (\n    <Button\n      outline\n      onClick={handleFeedbackClick}\n      icon={<FeedbackIcon />}\n      {...buttonProps}\n    >\n      Feedback\n    </Button>\n  );\n};\n\nexport default FeedbackButton;\n"
  },
  {
    "path": "webview_panels/src/modules/commonActionButtons/HelpButton.tsx",
    "content": "import DocumentationHelpContent from \"@modules/documentationEditor/components/help/DocumentationHelpContent\";\nimport TestsHelpContent from \"@modules/documentationEditor/components/help/TestsHelpContent\";\nimport { sendTelemetryEvent } from \"@modules/documentationEditor/components/telemetry\";\nimport { Button, ButtonGroup, Drawer, DrawerRef } from \"@uicore\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { TelemetryEvents } from \"@telemetryEvents\";\n\nenum Pages {\n  DOCUMENTATION,\n  TESTS,\n}\n\nconst HelpButton = (): JSX.Element => {\n  const [selectedPage, setSelectedPage] = useState(Pages.DOCUMENTATION);\n  const drawerRef = useRef<DrawerRef | null>(null);\n\n  useEffect(() => {\n    drawerRef.current?.open();\n  }, []);\n\n  const handleClick = (page: Pages) => {\n    setSelectedPage(page);\n  };\n  const onOpen = () => {\n    sendTelemetryEvent(TelemetryEvents[\"DocumentationEditor/HelpOpen\"]);\n  };\n\n  const openTest = () => {\n    handleClick(Pages.TESTS);\n    sendTelemetryEvent(TelemetryEvents[\"DocumentationEditor/HelpTestsOpen\"]);\n  };\n  return (\n    <Drawer title=\"Help\" onOpen={onOpen} ref={drawerRef}>\n      <ButtonGroup className=\"mb-2\">\n        <Button\n          color={selectedPage === Pages.DOCUMENTATION ? \"primary\" : \"secondary\"}\n          onClick={() => handleClick(Pages.DOCUMENTATION)}\n        >\n          Documentation\n        </Button>\n        <Button\n          color={selectedPage === Pages.TESTS ? \"primary\" : \"secondary\"}\n          onClick={openTest}\n        >\n          Tests\n        </Button>\n      </ButtonGroup>\n      {selectedPage === Pages.DOCUMENTATION ? (\n        <DocumentationHelpContent />\n      ) : null}\n      {selectedPage === Pages.TESTS ? <TestsHelpContent /> : null}\n    </Drawer>\n  );\n};\n\nexport default HelpButton;\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/DataPilotHelp.tsx",
    "content": "import {\n  BlogIcon,\n  ChevronLeftIcon,\n  ContactUsIcon,\n  DocsIcon,\n  GithubIcon,\n  GlobeIcon,\n  SlackIcon,\n} from \"@assets/icons\";\nimport { List, Stack } from \"@uicore\";\nimport classes from \"./datapilot.module.scss\";\nimport { setShowHelp } from \"./dataPilotSlice\";\nimport useDataPilotContext from \"./useDataPilotContext\";\n\nconst HelpSections = [\n  {\n    icon: <ContactUsIcon />,\n    label: \"Contact us\",\n    url: \"https://www.altimate.ai/support\",\n  },\n  {\n    icon: <DocsIcon />,\n    label: \"Documentation\",\n    url: \"https://docs.myaltimate.com/\",\n  },\n  {\n    icon: <SlackIcon />,\n    label: \"Slack Channel\",\n    url: \"https://getdbt.slack.com/archives/C05KPDGRMDW\",\n  },\n  {\n    icon: <GlobeIcon />,\n    label: \"Website\",\n    url: \"https://www.altimate.ai/\",\n  },\n  { icon: <BlogIcon />, label: \"Blog\", url: \"https://blog.altimate.ai/\" },\n  {\n    icon: <GithubIcon />,\n    label: \"Github\",\n    url: \"https://github.com/AltimateAI/vscode-dbt-power-user\",\n  },\n];\n\nconst DataPilotHelp = (): JSX.Element => {\n  const { dispatch } = useDataPilotContext();\n  return (\n    <Stack direction=\"column\" className={classes.help}>\n      <Stack direction=\"column\">\n        <h3>\n          <a\n            className={classes.back}\n            onClick={() => dispatch(setShowHelp(false))}\n          >\n            <ChevronLeftIcon />\n          </a>\n          Help\n        </h3>\n        <h6>Here are some resources to utilize DataPilot more effectively</h6>\n      </Stack>\n      <List className={classes.links}>\n        {HelpSections.map(({ icon, label, url }) => (\n          <li key={label} className={classes.link}>\n            <a href={url}>\n              {icon}\n              <p className=\"p2\">{label}</p>\n            </a>\n          </li>\n        ))}\n      </List>\n    </Stack>\n  );\n};\n\nexport default DataPilotHelp;\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/DataPilotProvider.tsx",
    "content": "import { IncomingMessageProps } from \"@modules/app/types\";\nimport {\n  createContext,\n  ReactNode,\n  useCallback,\n  useEffect,\n  useMemo,\n  useReducer,\n} from \"react\";\nimport dataPilotSlice, {\n  initialState,\n  reset,\n  setCurrentSessionId,\n  setShowHelp,\n  upsertItem,\n} from \"./dataPilotSlice\";\nimport { ContextProps, DataPilotChat } from \"./types\";\nimport { panelLogger } from \"@modules/logger\";\n\nexport const DataPilotContext = createContext<ContextProps>({\n  state: initialState,\n  dispatch: () => null,\n});\n\nconst DataPilotProvider = ({\n  children,\n}: {\n  children: ReactNode;\n}): JSX.Element => {\n  const [state, dispatch] = useReducer(\n    dataPilotSlice.reducer,\n    dataPilotSlice.getInitialState(),\n  );\n\n  const handleIncomingDatapilotMessage = (request: Partial<DataPilotChat>) => {\n    panelLogger.info(\"datapilot incoming message\", request);\n    const id = request.id ?? crypto.randomUUID();\n\n    dispatch(upsertItem({ ...request, id }));\n    dispatch(setCurrentSessionId(id));\n  };\n\n  const onMesssage = useCallback(\n    (event: MessageEvent<IncomingMessageProps>) => {\n      const { command, args } = event.data;\n      switch (command) {\n        case \"datapilot:message\":\n          handleIncomingDatapilotMessage(args as Partial<DataPilotChat>);\n\n          break;\n        case \"datapilot:reset\":\n          dispatch(reset());\n          break;\n        case \"datapilot:showHelp\":\n          dispatch(setShowHelp(true));\n          break;\n        default:\n          break;\n      }\n    },\n    [],\n  );\n\n  useEffect(() => {\n    window.addEventListener(\"message\", onMesssage);\n    return () => {\n      window.removeEventListener(\"message\", onMesssage);\n    };\n  }, []);\n\n  const values = useMemo(\n    () => ({\n      state,\n      dispatch,\n    }),\n    [state, dispatch],\n  );\n\n  return (\n    <DataPilotContext.Provider value={values}>\n      {children}\n    </DataPilotContext.Provider>\n  );\n};\n\nexport default DataPilotProvider;\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/Datapilot.stories.tsx",
    "content": "import { withReactContext } from \"storybook-react-context\";\nimport type { Meta, StoryObj } from \"@storybook/react\";\nimport DataPilotPanel from \".\";\nimport { DataPilotContext } from \"./DataPilotProvider\";\n\nexport default {\n  title: \"Datapilot\",\n  parameters: {\n    layout: \"left\",\n  },\n  tags: [\"autodocs\"],\n  argTypes: {\n    backgroundColor: { control: \"color\" },\n  },\n} satisfies Meta;\n\nexport const Help: StoryObj = {\n  render: (): JSX.Element => {\n    return <DataPilotPanel />;\n  },\n  decorators: [\n    withReactContext({\n      Context: DataPilotContext,\n      initialState: {\n        state: {\n          items: {},\n          currentSessionId: undefined,\n          showHelp: true,\n        },\n      },\n    }),\n  ],\n};\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/DefaultDatapilotView.tsx",
    "content": "import { Stack } from \"@uicore\";\nimport classes from \"./datapilot.module.scss\";\nimport DatapilotHeader from \"./components/common/Header\";\n\nconst DefaultDatapilotView = (): JSX.Element => {\n  return (\n    <Stack direction=\"column\" className={classes.defaultView}>\n      <DatapilotHeader />\n      <section>\n        <h6>Accelerate Your Work</h6>\n        <p>\n          Hi there, I am your DataPilot and I’m here to help you get things done\n          faster. I can help with documentation, query explanation / debugging,\n          and dbt model generations. Please check{\" \"}\n          <a href=\"https://docs.myaltimate.com/document/generatedoc/\">\n            documentation\n          </a>{\" \"}\n          to know more.\n        </p>\n        <br />\n        <p>\n          I am still learning, and not perfect. Please share your feedback, so I\n          can help you even better.{\" \"}\n        </p>\n      </section>\n\n      <section>\n        <p>\n          To get started, please select code in a file, right click and choose\n          DataPilot submenu. For documentation, start from Documentation Editor\n          panel.\n        </p>\n      </section>\n    </Stack>\n  );\n};\n\nexport default DefaultDatapilotView;\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/components/common/AskDatapilotInput.tsx",
    "content": "import { AskIcon } from \"@assets/icons\";\nimport { IconButton, Stack } from \"@uicore\";\nimport TextareaAutosize from \"react-textarea-autosize\";\nimport classes from \"../../datapilot.module.scss\";\nimport { ChangeEvent, FormEvent, KeyboardEvent, useState } from \"react\";\nimport { panelLogger } from \"@modules/logger\";\n\ninterface Props {\n  handleSubmit: (test: string) => void;\n  disabled?: boolean;\n  loading?: boolean;\n}\nconst AskDatapilotInput = ({\n  handleSubmit,\n  disabled,\n  loading,\n}: Props): JSX.Element => {\n  const [userRequest, setUserRequest] = useState(\"\");\n  const handleOnChange = (e: ChangeEvent<HTMLTextAreaElement>) => {\n    setUserRequest(e.target.value);\n  };\n\n  const onSubmit = (e: FormEvent) => {\n    e.preventDefault();\n    panelLogger.info(\"submitting user request\", userRequest);\n\n    if (!userRequest) {\n      return;\n    }\n\n    handleSubmit(userRequest);\n  };\n\n  const onKeyDown = (e: KeyboardEvent) => {\n    if (e.key === \"Enter\" && !e.shiftKey) {\n      e.preventDefault();\n      e.stopPropagation();\n      onSubmit(e);\n    }\n  };\n\n  return (\n    <Stack className={classes.askInput}>\n      <form onSubmit={onSubmit}>\n        <TextareaAutosize\n          disabled={loading}\n          placeholder=\"Ask a followup\"\n          value={userRequest}\n          onChange={handleOnChange}\n          rows={1}\n          maxRows={3}\n          className=\"form-control\"\n          onKeyDown={onKeyDown}\n        />\n\n        <IconButton type=\"submit\" disabled={disabled}>\n          <AskIcon style={{ color: \"var(--icon--default)\" }} />\n        </IconButton>\n      </form>\n    </Stack>\n  );\n};\n\nexport default AskDatapilotInput;\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/components/common/DatapilotChatFollowup.tsx",
    "content": "import { parse } from \"yaml\";\nimport { AltimateIcon } from \"@assets/icons\";\nimport ResultFeedbackButtons from \"@modules/feedback/ResultFeedbackButtons\";\nimport { Button, Card, CardBody, CardTitle, Stack } from \"@uicore\";\nimport classes from \"../../datapilot.module.scss\";\nimport {\n  Feedback,\n  FeedbackRequest,\n  FeedbackType,\n} from \"../../../feedback/types\";\nimport { panelLogger } from \"@modules/logger\";\nimport UserQuery from \"./UserQuery\";\nimport QueryAnalysisActionButton from \"../queryAnalysis/QueryAnalysisActionButton\";\nimport {\n  DataPilotChatAction,\n  DataPilotChatFollowup,\n  RequestState,\n  RequestTypes,\n} from \"@modules/dataPilot/types\";\nimport useQueryAnalysisAction from \"../queryAnalysis/useQueryAnalysisAction\";\nimport useQueryAnalysisContext from \"../queryAnalysis/provider/useQueryAnalysisContext\";\nimport useAiGenerationUtils from \"./useAiGenerationUtils\";\nimport MarkdownRenderer from \"@modules/markdown/Renderer\";\nimport AskDatapilotInput from \"./AskDatapilotInput\";\nimport { useCallback, useMemo } from \"react\";\nimport { executeRequestInAsync } from \"@modules/app/requestExecutor\";\nimport { DatapilotResponseComponents } from \"@modules/dataPilot/constants\";\n\ninterface Props {\n  response: DataPilotChatFollowup;\n  command: DataPilotChatAction[\"command\"];\n  showFollowup: boolean;\n  hideFeedback?: boolean;\n  skipFollowupQuestions?: boolean;\n}\nconst DatapilotChatFollowupComponent = ({\n  response: followup,\n  command,\n  showFollowup,\n  hideFeedback,\n  skipFollowupQuestions,\n}: Props): JSX.Element => {\n  const {\n    datapilotTitle,\n    response,\n    userPrompt,\n    actions,\n    state,\n    id,\n    component,\n    codeBlockActions,\n  } = followup;\n  const { chat, onNewGeneration, history, isMaxFollowupReached } =\n    useQueryAnalysisContext();\n  const results = chat?.followups ?? [];\n  const { onAiGenerationRender } = useAiGenerationUtils();\n\n  const { executeQueryAnalysis, isLoading } = useQueryAnalysisAction();\n\n  const onFeedbackSubmit = (feedbackData: Feedback) => {\n    if (!chat) {\n      return null;\n    }\n\n    const data = {\n      requestDetails: chat.meta,\n      messageSequence: [\n        {\n          query: chat.query,\n          response: chat.response,\n          type: FeedbackType.USER_REQUEST,\n        },\n        ...results.map((r) => {\n          const baseData = {\n            response: r.response,\n            type: FeedbackType.RESPONSE,\n          };\n          if (id === r.id) {\n            return { ...feedbackData, ...baseData };\n          }\n          return baseData;\n        }),\n      ],\n    } as FeedbackRequest;\n    return data;\n  };\n\n  const handleSubmit = (userRequest: string) => {\n    executeQueryAnalysis({\n      command,\n      onNewGeneration,\n      sessionId: chat?.id,\n      history,\n      user_request: userRequest,\n      skipFollowupQuestions,\n    }).catch((err) =>\n      panelLogger.error(\"error while querying by user input\", err),\n    );\n  };\n\n  const getCodeblock = useCallback(() => {\n    const regex = /```(.*?)```/gs;\n    const matches = response?.match(regex);\n    const match = matches?.[0];\n    if (!match) {\n      return;\n    }\n    const [type, ...rest] = match.replace(/`/g, \"\").split(\"\\n\");\n    return { type, code: rest.join(\"\\n\") };\n  }, [response]);\n\n  const handleCodeblockAction = async () => {\n    const codeblock = getCodeblock();\n    if (!codeblock) {\n      return;\n    }\n\n    if (codeblock.type === \"yaml\") {\n      try {\n        const modelData = parse(codeblock.code) as {\n          models: [\n            { name: string; columns: [{ name: string; tests: unknown[] }] },\n          ];\n        };\n\n        if (!modelData.models) {\n          panelLogger.info(\"Unable to find right model\", codeblock);\n          return;\n        }\n        const tests = modelData.models.find(\n          (m) => m.name === chat?.meta?.model,\n        );\n        panelLogger.log(\"sending tests data to test panel\", tests, chat?.meta);\n        executeRequestInAsync(\"testgen:insert\", { tests, ...chat?.meta });\n\n        return;\n      } catch (err) {\n        panelLogger.error(\"error while sending test yaml\", err);\n      }\n    }\n    await navigator.clipboard.writeText(codeblock.code);\n  };\n\n  const codeActions = useMemo(() => {\n    if (chat?.requestType === RequestTypes.ADD_CUSTOM_TEST) {\n      const codeblockResponse = getCodeblock();\n      if (!codeblockResponse) {\n        return [];\n      }\n      return [\n        {\n          title: codeblockResponse.type === \"yaml\" ? \"Insert\" : \"Copy\",\n          onClick: handleCodeblockAction,\n        },\n      ];\n    }\n    return codeBlockActions ?? [];\n  }, [getCodeblock, chat?.requestType, codeBlockActions]);\n\n  return (\n    <>\n      <UserQuery query={userPrompt} />\n\n      {state === RequestState.COMPLETED && !response && !component ? null : (\n        <li ref={onAiGenerationRender}>\n          <Card>\n            <CardTitle>\n              {\" \"}\n              <AltimateIcon /> {datapilotTitle}\n            </CardTitle>\n            <CardBody>\n              <div className={classes.response} title=\"Datapilot response\">\n                {response ? <MarkdownRenderer response={response} /> : null}\n                {component ? (\n                  <>{DatapilotResponseComponents[component]}</>\n                ) : null}\n              </div>\n              {state === RequestState.LOADING ? (\n                <Stack>\n                  <Button color=\"warning\">Loading...</Button>\n                </Stack>\n              ) : null}\n              {!hideFeedback && state === RequestState.COMPLETED ? (\n                <Stack className={classes.actionButtons}>\n                  <Stack>\n                    {codeActions.map((button) => (\n                      <Button\n                        color=\"primary\"\n                        key={button.title}\n                        onClick={() => button.onClick(followup, button.title)}\n                      >\n                        {button.title}\n                      </Button>\n                    ))}\n                  </Stack>\n                  <ResultFeedbackButtons\n                    getFeedbackData={(data) => onFeedbackSubmit(data)}\n                  />\n                </Stack>\n              ) : null}\n            </CardBody>\n          </Card>\n        </li>\n      )}\n      {showFollowup && actions?.length ? (\n        <Stack direction=\"column\">\n          <p className=\"p4 mb-0\">Followup Suggestions</p>\n          <Stack className=\"flex-wrap\">\n            {actions.map((action) => (\n              <QueryAnalysisActionButton key={action.command} action={action} />\n            ))}\n          </Stack>\n        </Stack>\n      ) : null}\n      {showFollowup && state === RequestState.COMPLETED ? (\n        <AskDatapilotInput\n          handleSubmit={handleSubmit}\n          disabled={isLoading || isMaxFollowupReached}\n          loading={isLoading}\n        />\n      ) : null}\n    </>\n  );\n};\n\nexport default DatapilotChatFollowupComponent;\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/components/common/Header.tsx",
    "content": "import { AltimateIcon } from \"@assets/icons\";\nimport PreviewFeatureIcon from \"@modules/previewFeature/PreviewFeatureIcon\";\nimport { Stack } from \"@uicore\";\n\nconst DatapilotHeader = (): JSX.Element => {\n  return (\n    <Stack style={{ alignItems: \"end\" }}>\n      <AltimateIcon />\n      <div>\n        <h3>Hello, there!</h3>\n        <h6>\n          How can I help you today? <PreviewFeatureIcon />\n        </h6>\n      </div>\n    </Stack>\n  );\n};\n\nexport default DatapilotHeader;\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/components/common/UserQuery.tsx",
    "content": "import { UserIcon } from \"@assets/icons\";\nimport { Stack, Card, CardBody } from \"@uicore\";\nimport classes from \"../../datapilot.module.scss\";\n\ninterface Props {\n  query: string;\n}\nconst UserQuery = ({ query }: Props): JSX.Element | null => {\n  if (!query) {\n    return null;\n  }\n  return (\n    <Card className={classes.promptCard}>\n      <CardBody>\n        <Stack>\n          <UserIcon />\n          {query}\n        </Stack>\n      </CardBody>\n    </Card>\n  );\n};\n\nexport default UserQuery;\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/components/common/useAiGenerationUtils.ts",
    "content": "import { useCallback } from \"react\";\n\nconst useAiGenerationUtils = (): {\n  onAiGenerationRender: (node: HTMLLIElement) => void;\n} => {\n  const onAiGenerationRender = useCallback((node: HTMLLIElement) => {\n    if (node) {\n      node.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n    }\n  }, []);\n\n  return { onAiGenerationRender };\n};\n\nexport default useAiGenerationUtils;\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/components/docGen/AiDocActionButton.tsx",
    "content": "import { executeRequestInSync } from \"@modules/app/requestExecutor\";\nimport useDataPilotContext from \"@modules/dataPilot/useDataPilotContext\";\nimport { DBTDocumentationColumn } from \"@modules/documentationEditor/state/types\";\nimport { panelLogger } from \"@modules/logger\";\nimport { Button } from \"@uicore\";\nimport { useState } from \"react\";\nimport { DataPilotChatAction } from \"../../types\";\nimport { DocGenFollowup } from \"./types\";\nimport { Citation } from \"@lib\";\n\ninterface Props {\n  action: DataPilotChatAction;\n  onNewGeneration: (column: DocGenFollowup) => void;\n}\nconst AiDocActionButton = ({ action, onNewGeneration }: Props): JSX.Element => {\n  const {\n    state: { items, currentSessionId },\n  } = useDataPilotContext();\n  const chat = currentSessionId ? items[currentSessionId] : undefined;\n  const getFollowupInstruction = () => {\n    switch (action.title) {\n      case \"Regenerate\":\n        return \"Regenerate the description\";\n\n      default:\n        return action.title;\n    }\n  };\n  const [isLoading, setIsLoading] = useState(false);\n  const handleBtnClick = async () => {\n    panelLogger.info(action, \"chat\", isLoading);\n    setIsLoading(true);\n\n    const result = (await executeRequestInSync(action.command, {\n      ...action.data,\n      follow_up_instructions: { instruction: getFollowupInstruction() },\n    })) as\n      | { columns: Partial<DBTDocumentationColumn>[] }\n      | { model_description: string; model_citations?: Citation[] };\n\n    setIsLoading(false);\n\n    let generatedResult = {\n      userPrompt: getFollowupInstruction()?.toString(),\n    } as DocGenFollowup;\n\n    if (\"columns\" in result) {\n      generatedResult = {\n        ...generatedResult,\n        ...result.columns[0],\n      };\n    }\n    if (\"model_description\" in result) {\n      generatedResult = {\n        ...generatedResult,\n        description: result.model_description,\n        citations: result.model_citations,\n        model: (chat?.meta?.name as string | undefined) ?? \"\",\n      };\n    }\n\n    panelLogger.info(\"generated result\", generatedResult);\n    onNewGeneration(generatedResult);\n  };\n  return (\n    <>\n      <Button\n        key={action.title?.toString()}\n        onClick={handleBtnClick}\n        disabled={isLoading}\n      >\n        {action.title}\n      </Button>\n    </>\n  );\n};\n\nexport default AiDocActionButton;\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/components/docGen/AiDocChat.tsx",
    "content": "import { upsertFollowup } from \"@modules/dataPilot/dataPilotSlice\";\nimport useDataPilotContext from \"@modules/dataPilot/useDataPilotContext\";\nimport { Card, CardBody, Stack } from \"@uicore\";\nimport { useCallback } from \"react\";\nimport { DataPilotChat, DataPilotChatAction, RequestState } from \"../../types\";\nimport AiDocActionButton from \"./AiDocActionButton\";\nimport NewGenerationResults from \"./NewGenerationResults\";\nimport { EntityType, DocGenFollowup } from \"./types\";\n\ninterface Props {\n  chat: DataPilotChat;\n}\nconst AiDocChat = ({ chat }: Props): JSX.Element => {\n  const { dispatch } = useDataPilotContext();\n  const generatedResults = chat.followups;\n\n  const onNewGeneration = (\n    result: DocGenFollowup,\n    action: DataPilotChatAction,\n  ) => {\n    const entityType = chat.meta?.columnName\n      ? EntityType.COLUMN\n      : EntityType.MODEL;\n\n    const entityName = chat.meta?.columnName ?? action.data.modelName;\n    dispatch(\n      upsertFollowup({\n        sessionId: chat.id,\n        followup: {\n          ...result,\n          datapilotTitle: action.datapilotTitle,\n          userPrompt: action.userPrompt\n            .replace(\"{name}\", entityName as string)\n            .replace(\"{type}\", entityType),\n        },\n      }),\n    );\n  };\n\n  const onAiChatRender = useCallback((node: HTMLDivElement) => {\n    if (node) {\n      node.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n    }\n  }, []);\n\n  return (\n    <Stack direction=\"column\" ref={onAiChatRender}>\n      <h5>{chat.query}</h5>\n      {chat.response ? (\n        <Card>\n          <CardBody>{chat.response}</CardBody>\n        </Card>\n      ) : null}\n      {chat.state === RequestState.LOADING ? <div>Loading...</div> : null}\n      {generatedResults?.length ? (\n        <NewGenerationResults generatedResults={generatedResults} chat={chat} />\n      ) : null}\n      <Stack style={{ flexWrap: \"wrap\" }}>\n        {chat.actions?.map((action) => (\n          <AiDocActionButton\n            onNewGeneration={(result) => onNewGeneration(result, action)}\n            key={action.title?.toString()}\n            action={action}\n          />\n        ))}\n      </Stack>\n    </Stack>\n  );\n};\n\nexport default AiDocChat;\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/components/docGen/DataPilotDocGen.stories.tsx",
    "content": "import { withReactContext } from \"storybook-react-context\";\nimport type { Meta } from \"@storybook/react\";\nimport DataPilotPanel from \"../..\";\nimport DataPilotProvider, { DataPilotContext } from \"../../DataPilotProvider\";\nimport {\n  DatapilotDocGenActionButtonFactory,\n  DatapilotDocGenFactory,\n  DatapilotDocGenWithErrorFactory,\n  DatapilotDocGenWithLoadingFactory,\n} from \"../../../../testUtils\";\n\nconst docGenCompleted = DatapilotDocGenFactory.build({\n  actions: [\n    DatapilotDocGenActionButtonFactory.build(),\n    DatapilotDocGenActionButtonFactory.build({\n      title: \"Make it shorter\",\n      data: { modelName: \"customers\" },\n      userPrompt: \"Make documentation shorter for {type} {name}\",\n      datapilotTitle: \"Improving documentation based on the user suggestion\",\n    }),\n  ],\n});\nconst docGenError = DatapilotDocGenWithErrorFactory.build();\nconst docGenLoading = DatapilotDocGenWithLoadingFactory.build({\n  meta: {\n    description: \"Customer's first name. PII.\",\n    user_instructions: {},\n    columnName: \"first_name\",\n    columns: [],\n  },\n});\n\nconst SAMPLE_DOCGEN_DATA = {\n  DATA: {\n    [docGenCompleted.id]: docGenCompleted,\n  },\n  ERROR: {\n    [docGenError.id]: docGenError,\n  },\n  LOADING: {\n    [docGenLoading.id]: docGenLoading,\n  },\n};\n\nconst meta = {\n  title: \"Datapilot/DocGen\",\n  parameters: {\n    layout: \"centered\",\n  },\n  tags: [\"autodocs\"],\n  argTypes: {\n    backgroundColor: { control: \"color\" },\n  },\n} satisfies Meta;\n\nexport default meta;\n\nexport const DefaultView = {\n  render: (): JSX.Element => {\n    return (\n      <DataPilotProvider>\n        <DataPilotPanel />\n      </DataPilotProvider>\n    );\n  },\n};\n\nexport const DocGenLoading = {\n  render: (): JSX.Element => {\n    return <DataPilotPanel />;\n  },\n  decorators: [\n    withReactContext({\n      Context: DataPilotContext,\n      initialState: { state: { items: SAMPLE_DOCGEN_DATA.LOADING } },\n    }),\n  ],\n};\n\nexport const DocGenError = {\n  render: (): JSX.Element => {\n    return <DataPilotPanel />;\n  },\n  decorators: [\n    withReactContext({\n      Context: DataPilotContext,\n      initialState: { state: { items: SAMPLE_DOCGEN_DATA.ERROR } },\n    }),\n  ],\n};\n\nexport const DocGenData = {\n  render: (): JSX.Element => {\n    return <DataPilotPanel />;\n  },\n  decorators: [\n    withReactContext({\n      Context: DataPilotContext,\n      initialState: { state: { items: SAMPLE_DOCGEN_DATA.DATA } },\n    }),\n  ],\n};\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/components/docGen/NewGenerationResults.tsx",
    "content": "import { AltimateIcon } from \"@assets/icons\";\nimport ResultFeedbackButtons from \"@modules/feedback/ResultFeedbackButtons\";\nimport { Button, Card, CardBody, CardTitle, List, Stack } from \"@uicore\";\nimport {\n  Feedback,\n  FeedbackRequest,\n  FeedbackType,\n} from \"../../../feedback/types\";\nimport classes from \"../../datapilot.module.scss\";\nimport { executeRequestInAsync } from \"@modules/app/requestExecutor\";\nimport { DataPilotChat } from \"../../types\";\nimport UserQuery from \"../common/UserQuery\";\nimport useAiGenerationUtils from \"../common/useAiGenerationUtils\";\nimport { useCallback } from \"react\";\nimport { DocGenFollowup, EntityType } from \"./types\";\nimport Citations from \"@modules/documentationEditor/components/docGenerator/Citations\";\n\ninterface Props {\n  generatedResults: DocGenFollowup[];\n  chat: DataPilotChat;\n}\nconst NewGenerationResults = ({\n  generatedResults,\n  chat,\n}: Props): JSX.Element | null => {\n  const handleDocInsert = (result: DocGenFollowup) =>\n    executeRequestInAsync(\"docgen:insert\", { ...result });\n  const { onAiGenerationRender } = useAiGenerationUtils();\n\n  const getFeedbackData = useCallback(\n    (result: DocGenFollowup, feedbackData: Feedback) => {\n      const data = {\n        requestDetails: chat.meta,\n        messageSequence: [\n          {\n            content: chat.response,\n            type: FeedbackType.RESPONSE,\n          },\n          ...generatedResults.map((r) => {\n            const baseData = {\n              content: r.description,\n              type: FeedbackType.RESPONSE,\n            };\n            if (result.id === r.id) {\n              return { ...feedbackData, ...baseData };\n            }\n            return baseData;\n          }),\n        ],\n        name: result.name,\n        type: chat.meta?.columnName ? EntityType.COLUMN : EntityType.MODEL,\n      } as FeedbackRequest;\n      return data;\n    },\n    [chat.meta, chat.response, generatedResults],\n  );\n\n  if (!generatedResults.length) {\n    return null;\n  }\n  return (\n    <List className={classes.chatList}>\n      {generatedResults.map((result) => (\n        <>\n          <li ref={onAiGenerationRender}>\n            <UserQuery query={result.userPrompt} />\n          </li>\n          <li key={result.name}>\n            <Card>\n              <CardTitle>\n                {\" \"}\n                <AltimateIcon /> {result.datapilotTitle}\n              </CardTitle>\n              <CardBody>\n                <span title=\"Datapilot response\">{result.description}</span>\n                <Stack className=\"align-items-center my-4\">\n                  <Citations citations={result.citations} />\n                </Stack>\n                <Stack className={classes.actionButtons}>\n                  <Stack>\n                    <Button\n                      color=\"primary\"\n                      onClick={() => handleDocInsert(result)}\n                    >\n                      Insert\n                    </Button>\n                  </Stack>\n                  <ResultFeedbackButtons\n                    getFeedbackData={(data: Feedback) =>\n                      getFeedbackData(result, data)\n                    }\n                  />\n                </Stack>\n              </CardBody>\n            </Card>\n          </li>\n        </>\n      ))}\n    </List>\n  );\n};\n\nexport default NewGenerationResults;\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/components/docGen/types.ts",
    "content": "import { DataPilotChatFollowup } from \"@modules/dataPilot/types\";\nimport { DBTDocumentationColumn } from \"@modules/documentationEditor/state/types\";\n\nexport interface DocGenFollowup\n  extends Partial<DBTDocumentationColumn>,\n    DataPilotChatFollowup {\n  model?: string;\n}\n\nexport enum EntityType {\n  COLUMN = \"column\",\n  MODEL = \"model\",\n}\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/components/queryAnalysis/QueryAnalysis.stories.tsx",
    "content": "import { withReactContext } from \"storybook-react-context\";\nimport type { Meta, StoryObj } from \"@storybook/react\";\nimport DataPilotPanel from \"../..\";\nimport { DataPilotContext } from \"../../DataPilotProvider\";\nimport {\n  DatapilotQueryAnalysisFactory,\n  DatapilotQueryExplainResultFactory,\n} from \"@testUtils\";\nimport { RequestState } from \"@modules/dataPilot/types\";\nimport { userEvent, within } from \"@storybook/testing-library\";\nimport { faker } from \"@faker-js/faker\";\nimport { panelLogger } from \"@modules/logger\";\nimport { QueryAnalysisCommands } from \"./commands\";\nimport { QueryAnalysisType } from \"./types\";\nimport MarkdownRenderer from \"@modules/markdown/Renderer\";\n\nconst SAMPLE_TABLE =\n  \"Let's consider the following sample data for the `dim_listings_cleansed` and `dim_hosts_cleansed` tables:\\n\\n`dim_listings_cleansed`:\\n\\n| listing_id | listing_name | room_type | minimum_nights | price | host_id | created_at | updated_at |\\n|------------|--------------|-----------|----------------|-------|---------|------------|------------|\\n| 1          | Cozy Cottage | Private   | 2              | 100   | 10      | 2020-01-01 | 2020-02-01 |\\n| 2          | Urban Loft   | Shared    | 1              | 80    | 20      | 2020-02-01 | 2020-03-01 |\\n| 3          | Beach House  | Entire    | 3              | 200   | 30      | 2020-03-01 | 2020-04-01 |\\n\\n`dim_hosts_cleansed`:\\n\\n| host_id | host_name | is_superhost | created_at | updated_at |\\n|---------|-----------|--------------|------------|------------|\\n| 10      | Alice     | True         | 2019-12-01 | 2020-01-15 |\\n| 20      | Bob       | False        | 2020-01-01 | 2020-02-15 |\\n| 40      | Charlie   | True         | 2020-02-01 | 2020-03-15 |\\n\\nThe SQL query you provided will join these two tables on the `host_id` field, and select the most recent `updated_at` value between the two tables for each record. \\n\\nHere's what the result would look like:\\n\\n| listing_id | listing_name | room_type | minimum_nights | price | host_id | host_name | host_is_superhost | created_at | updated_at |\\n|------------|--------------|-----------|----------------|-------|---------|-----------|-------------------|------------|------------|\\n| 1          | Cozy Cottage | Private   | 2              | 100   | 10      | Alice     | True              | 2020-01-01 | 2020-02-01 |\\n| 2          | Urban Loft   | Shared    | 1              | 80    | 20      | Bob       | False             | 2020-02-01 | 2020-03-01 |\\n| 3          | Beach House  | Entire    | 3              | 200   | 30      | NULL      | NULL              | 2020-03-01 | 2020-04-01 |\\n\\nNote that for the third record, the `host_name` and `host_is_superhost` fields are NULL because there is no host with `host_id` 30 in the `dim_hosts_cleansed` table. The `updated_at` field for each record is the later of the `updated_at` values in the `dim_listings_cleansed` and `dim_hosts_cleansed` tables.\";\nconst queryAnalysisLoadingState = DatapilotQueryAnalysisFactory.build({\n  state: RequestState.LOADING,\n});\n\nconst queryAnalysisDefaultState = DatapilotQueryAnalysisFactory.build({\n  state: RequestState.COMPLETED,\n});\n\nexport default {\n  title: \"Datapilot/Query Analysis\",\n  parameters: {\n    layout: \"left\",\n  },\n  tags: [\"autodocs\"],\n  argTypes: {\n    backgroundColor: { control: \"color\" },\n  },\n} satisfies Meta;\n\nexport const WithSelectedQuery: StoryObj = {\n  render: (): JSX.Element => {\n    return <DataPilotPanel />;\n  },\n  decorators: [\n    withReactContext({\n      Context: DataPilotContext,\n      initialState: {\n        state: {\n          items: {\n            [queryAnalysisLoadingState.id]: {\n              ...queryAnalysisLoadingState,\n              analysisType: undefined,\n            },\n          },\n          currentSessionId: queryAnalysisLoadingState.id,\n        },\n      },\n    }),\n  ],\n};\n\nexport const ExplainLoading: StoryObj = {\n  render: (): JSX.Element => {\n    return <DataPilotPanel />;\n  },\n  play: async ({ canvasElement }) => {\n    const canvas = within(canvasElement);\n    await userEvent.click(\n      canvas.getByRole(\"button\", { name: \"Query explanation\" }),\n    );\n  },\n  parameters: {\n    vscode: {\n      data: { chunk: faker.lorem.sentence() },\n      timer: 2000,\n    },\n  },\n  decorators: [\n    withReactContext({\n      Context: DataPilotContext,\n      initialState: {\n        state: {\n          items: { [queryAnalysisLoadingState.id]: queryAnalysisLoadingState },\n          currentSessionId: queryAnalysisLoadingState.id,\n        },\n      },\n    }),\n  ],\n};\n\nexport const ModifyFlow = {\n  render: (): JSX.Element => {\n    return <DataPilotPanel />;\n  },\n  parameters: {\n    vscode: {\n      func: (request: Record<string, unknown>): unknown => {\n        if (request.command === QueryAnalysisCommands.modify) {\n          return DatapilotQueryExplainResultFactory.build({\n            datapilotTitle: \"Query change\",\n          });\n        }\n\n        if (request.command === \"sendFeedback\") {\n          return true;\n        }\n      },\n      timer: 500,\n    },\n  },\n  decorators: [\n    withReactContext({\n      Context: DataPilotContext,\n      initialState: {\n        state: {\n          items: {\n            [queryAnalysisDefaultState.id]: {\n              ...queryAnalysisDefaultState,\n              analysisType: QueryAnalysisType.MODIFY,\n              actions: [\n                {\n                  title: \"Query change\",\n                  command: QueryAnalysisCommands.modify,\n                },\n              ],\n            },\n          },\n          currentSessionId: queryAnalysisDefaultState.id,\n        },\n      },\n    }),\n  ],\n};\n\nexport const ExplainFlow = {\n  render: (): JSX.Element => {\n    return <DataPilotPanel />;\n  },\n  parameters: {\n    vscode: {\n      func: (request: Record<string, unknown>): unknown => {\n        if (\n          request.command === \"regenerate\" ||\n          request.command === QueryAnalysisCommands.explain\n        ) {\n          return DatapilotQueryExplainResultFactory.build();\n        }\n        if (request.command === \"queryanalysis:followup\") {\n          return faker.helpers.multiple(() => faker.lorem.sentence(), {\n            count: 4,\n          });\n        }\n        panelLogger.log(request);\n      },\n      timer: 500,\n    },\n  },\n  decorators: [\n    withReactContext({\n      Context: DataPilotContext,\n      initialState: {\n        state: {\n          items: {\n            [queryAnalysisDefaultState.id]: {\n              ...queryAnalysisDefaultState,\n              analysisType: QueryAnalysisType.EXPLAIN,\n              actions: [\n                {\n                  title: \"Query explain\",\n                  command: QueryAnalysisCommands.explain,\n                },\n              ],\n            },\n          },\n          currentSessionId: queryAnalysisDefaultState.id,\n        },\n      },\n    }),\n  ],\n};\n\nexport const TranslateFlow = {\n  render: (): JSX.Element => {\n    return <DataPilotPanel />;\n  },\n  parameters: {\n    vscode: {\n      func: (request: Record<string, unknown>): unknown => {\n        if (request.command === QueryAnalysisCommands.translate) {\n          return DatapilotQueryExplainResultFactory.build({\n            datapilotTitle: \"Query translate\",\n          });\n        }\n\n        if (request.command === \"sendFeedback\") {\n          return true;\n        }\n      },\n      timer: 500,\n    },\n  },\n  decorators: [\n    withReactContext({\n      Context: DataPilotContext,\n      initialState: {\n        state: {\n          items: {\n            [queryAnalysisDefaultState.id]: {\n              ...queryAnalysisDefaultState,\n              analysisType: QueryAnalysisType.TRANSLATE,\n              actions: [\n                {\n                  title: \"Translate\",\n                  command: QueryAnalysisCommands.translate,\n                },\n              ],\n            },\n          },\n          currentSessionId: queryAnalysisDefaultState.id,\n        },\n      },\n    }),\n  ],\n};\n\nexport const MarkdownWithTable = {\n  render: (): JSX.Element => {\n    return <MarkdownRenderer response={SAMPLE_TABLE} />;\n  },\n};\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/components/queryAnalysis/QueryAnalysis.tsx",
    "content": "import { Alert, Card, CardBody, CardTitle, CodeBlock, Stack } from \"@uicore\";\nimport QueryAnalysisActionButton from \"./QueryAnalysisActionButton\";\nimport DatapilotChatFollowupComponent from \"../common/DatapilotChatFollowup\";\nimport useQueryAnalysisContext, {\n  MAX_ALLOWED_FOLLOWUP_QUESTIONS,\n} from \"./provider/useQueryAnalysisContext\";\nimport DatapilotHeader from \"../common/Header\";\nimport { DataPilotChatAction } from \"@modules/dataPilot/types\";\nimport { QueryAnalysisCommands } from \"./commands\";\nimport { AltimateIcon } from \"@assets/icons\";\nimport { QueryAnalysisType } from \"./types\";\nimport { useMemo } from \"react\";\nimport classes from \"../../datapilot.module.scss\";\n\nconst QUERY_HAPPY_LIMIT = 10;\nconst DefaultActions = [\n  {\n    title: \"Explain\",\n    command: QueryAnalysisCommands.explain,\n  },\n  {\n    title: \"Change\",\n    command: QueryAnalysisCommands.modify,\n  },\n  {\n    title: \"Translate\",\n    command: QueryAnalysisCommands.translate,\n  },\n] as DataPilotChatAction[];\n\nconst QueryAnalysis = (): JSX.Element | null => {\n  const { chat, isMaxFollowupReached } = useQueryAnalysisContext();\n  const followups = chat?.followups;\n\n  const alertText = useMemo(() => {\n    if (chat?.analysisType === QueryAnalysisType.TRANSLATE) {\n      return \"Note: Query Translate (SQL Dialect) functionality works on the whole file, and not selected code snippet. DataPilot will proceed with assumption that the whole file needs to be translated.\";\n    }\n\n    return null;\n  }, [chat?.analysisType]);\n\n  if (!chat) {\n    return null;\n  }\n\n  const actions = chat.actions?.length ? chat.actions : DefaultActions;\n  const showLineLimitWarning =\n    chat.query.split(\"\\n\").length > QUERY_HAPPY_LIMIT &&\n    chat.analysisType === QueryAnalysisType.MODIFY;\n\n  return (\n    <Stack direction=\"column\">\n      <DatapilotHeader />\n\n      <CodeBlock code={chat.query} language=\"sql\" fileName={chat.fileName} classname={classes.codeblock}/>\n      {showLineLimitWarning ? (\n        <Card>\n          <CardTitle>\n            <AltimateIcon /> Datapilot\n          </CardTitle>\n          <CardBody>\n            Warning: this functionality works better for small code blocks, as\n            DataPilot may end up rewriting the entire code that is displayed\n            above.\n          </CardBody>\n        </Card>\n      ) : null}\n\n      {alertText ? <Alert color=\"warning\">{alertText}</Alert> : null}\n\n      {/* show actions only if this is start of chat */}\n      {followups?.length ? null : (\n        <Stack style={{ flexWrap: \"wrap\" }}>\n          {actions.map((action) => (\n            <QueryAnalysisActionButton\n              key={action.title?.toString()}\n              action={action}\n            />\n          ))}\n        </Stack>\n      )}\n      {followups?.map((result, i) => (\n        <DatapilotChatFollowupComponent\n          key={result.id}\n          response={result}\n          command={`queryAnalysis:${chat.analysisType ?? \"\"}`}\n          // show followup and ask textbox for last result only\n          showFollowup={\n            result.hideFollowup !== undefined\n              ? !result.hideFollowup\n              : i === followups.length - 1\n          }\n          hideFeedback={result.hideFeedback}\n          skipFollowupQuestions={\n            chat?.analysisType === QueryAnalysisType.MODIFY\n          }\n        />\n      ))}\n      {isMaxFollowupReached ? (\n        <Alert color=\"warning\">\n          Note: Maximum {MAX_ALLOWED_FOLLOWUP_QUESTIONS} followup operations are\n          allowed. You have reached the limit, so there are no more followup\n          options available.\n        </Alert>\n      ) : null}\n    </Stack>\n  );\n};\n\nexport default QueryAnalysis;\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/components/queryAnalysis/QueryAnalysisActionButton.tsx",
    "content": "import { DataPilotChatAction, RequestState } from \"@modules/dataPilot/types\";\nimport { Button } from \"@uicore\";\nimport useQueryAnalysisAction from \"./useQueryAnalysisAction\";\nimport useQueryAnalysisContext from \"./provider/useQueryAnalysisContext\";\nimport { panelLogger } from \"@modules/logger\";\nimport useDataPilotContext from \"@modules/dataPilot/useDataPilotContext\";\nimport { upsertItem } from \"@modules/dataPilot/dataPilotSlice\";\nimport { DatapilotQueryAnalysisChat, QueryAnalysisType } from \"./types\";\nimport { QueryAnalysisCommands } from \"./commands\";\nimport classes from \"../../datapilot.module.scss\";\n\ninterface Props {\n  action: DataPilotChatAction;\n}\n\nconst QueryAnalysisActionButton = ({ action }: Props): JSX.Element => {\n  const { executeQueryAnalysis, isLoading } = useQueryAnalysisAction();\n  const { chat, onNewGeneration, isMaxFollowupReached } =\n    useQueryAnalysisContext();\n  const { dispatch } = useDataPilotContext();\n  const results = chat?.followups;\n\n  const isDefaultButton = results?.length === 0;\n\n  const getAnalysisType = () => {\n    switch (action.command) {\n      case QueryAnalysisCommands.explain:\n        return QueryAnalysisType.EXPLAIN;\n      case QueryAnalysisCommands.modify:\n        return QueryAnalysisType.MODIFY;\n      case QueryAnalysisCommands.translate:\n        return QueryAnalysisType.TRANSLATE;\n      default:\n        break;\n    }\n  };\n\n  const handleClick = () => {\n    const analysisType = getAnalysisType();\n    // If analysis type is not set for chat yet, set the current analysis type and state as completed to avoid multiple requests\n    if (!chat?.analysisType) {\n      dispatch(\n        upsertItem({\n          ...chat,\n          analysisType,\n          state: RequestState.COMPLETED,\n        } as DatapilotQueryAnalysisChat),\n      );\n    }\n\n    if (analysisType === QueryAnalysisType.MODIFY) {\n      onNewGeneration({\n        state: RequestState.COMPLETED,\n      });\n      return;\n    }\n\n    if (analysisType === QueryAnalysisType.TRANSLATE) {\n      onNewGeneration({\n        datapilotTitle: \"Datapilot Response\",\n        hideFeedback: true,\n        response: \"\",\n        component: \"queryTranslate\",\n        state: RequestState.COMPLETED,\n        hideFollowup: true,\n      });\n      return;\n    }\n\n    executeQueryAnalysis({\n      command: action.command,\n      onNewGeneration,\n      sessionId: chat?.id,\n      user_request: action.title,\n    }).catch((err) =>\n      panelLogger.error(\"error handle action button click\", err),\n    );\n  };\n\n  return (\n    <>\n      <Button\n        key={action.title?.toString()}\n        onClick={handleClick}\n        disabled={isLoading || isMaxFollowupReached}\n        className={`${classes.actionButton} ${\n          isDefaultButton ? classes.default : \"\"\n        }`}\n      >\n        {action.title}\n      </Button>\n    </>\n  );\n};\n\nexport default QueryAnalysisActionButton;\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/components/queryAnalysis/commands.ts",
    "content": "import { QueryAnalysisType } from \"./types\";\n\nexport const QueryAnalysisCommands = {\n  [QueryAnalysisType.EXPLAIN]: \"queryAnalysis:explain\",\n  [QueryAnalysisType.MODIFY]: \"queryAnalysis:modify\",\n  [QueryAnalysisType.TRANSLATE]: \"queryAnalysis:translate\",\n};\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/components/queryAnalysis/components/QueryTranslateDialectSelects.tsx",
    "content": "import { yupResolver } from \"@hookform/resolvers/yup\";\nimport * as Yup from \"yup\";\nimport { Controller, useForm } from \"react-hook-form\";\nimport { LoadingButton, Label, OptionType, Select, Stack } from \"@uicore\";\nimport { panelLogger } from \"@modules/logger\";\nimport { SqlDialects } from \"./constants\";\nimport { useEffect, useState } from \"react\";\nimport {\n  executeRequestInAsync,\n  executeRequestInSync,\n} from \"@modules/app/requestExecutor\";\nimport useQueryAnalysisAction from \"../useQueryAnalysisAction\";\nimport useQueryAnalysisContext from \"../provider/useQueryAnalysisContext\";\nimport { DataPilotChatFollowup, RequestState } from \"@modules/dataPilot/types\";\nimport useDataPilotContext from \"@modules/dataPilot/useDataPilotContext\";\nimport { deleteFollowup } from \"@modules/dataPilot/dataPilotSlice\";\n\nconst schema = Yup.object({\n  source: Yup.string().required(),\n  target: Yup.string().required(),\n}).required();\n\ninterface QueryTranslateRequest extends Record<string, unknown> {\n  source: string;\n  target: string;\n}\n\nconst QueryTranslateDialectSelects = (): JSX.Element => {\n  const {\n    control,\n    handleSubmit,\n    setValue,\n    getValues,\n    formState: { isValid },\n    trigger,\n  } = useForm<QueryTranslateRequest>({\n    resolver: yupResolver(schema),\n    mode: \"onChange\",\n  });\n\n  const [translateCompleted, setTranslateCompleted] = useState(false);\n  const { executeQueryAnalysis, isLoading } = useQueryAnalysisAction();\n  const { chat, onNewGeneration, history } = useQueryAnalysisContext();\n  const { dispatch } = useDataPilotContext();\n\n  const dialectOptions: OptionType[] = SqlDialects.sort().map((d) => ({\n    label: d,\n    value: d,\n  }));\n\n  const handleReplace = (\n    translatedSql: string | undefined,\n    followup: DataPilotChatFollowup,\n    buttonTitle: string,\n  ) => {\n    panelLogger.info(followup, buttonTitle, chat?.meta, translatedSql);\n\n    executeRequestInAsync(\"file:replace-contents\", {\n      sql: translatedSql,\n      filePath: chat?.filePath,\n    });\n  };\n\n  const onSubmit = async (data: QueryTranslateRequest) => {\n    try {\n      panelLogger.info(\"requesting translate\", data);\n      const result = (await executeQueryAnalysis({\n        command: \"querytranslate\",\n        onNewGeneration: (followup) => {\n          if (followup.state === RequestState.ERROR) {\n            dispatch(\n              deleteFollowup({ sessionId: chat?.id, followupId: followup.id }),\n            );\n            return;\n          }\n          const translateResponse = followup.response as unknown as\n            | { translatedSql: string; userSql: string }\n            | undefined;\n          const translatedSql = translateResponse?.translatedSql;\n          return onNewGeneration({\n            ...followup,\n            codeBlockActions: translatedSql\n              ? [\n                  {\n                    title: \"Replace\",\n                    onClick: (...args) => handleReplace(translatedSql, ...args),\n                  },\n                ]\n              : undefined,\n            response: translatedSql\n              ? [\n                  `The translated query in \\`${data.target}\\` is`,\n                  \" ```\",\n                  translatedSql,\n                  \" ```\",\n                ].join(\"\\n\")\n              : followup.response,\n          });\n        },\n        sessionId: chat?.id,\n        history,\n        user_request: `Translate from: ${getValues(\"source\")} to: ${getValues(\n          \"target\",\n        )}`,\n        skipFollowupQuestions: true,\n        request: { ...data, filePath: chat?.filePath },\n      })) as unknown as { translatedSql: string; userSql: string };\n\n      if (result.translatedSql) {\n        setTranslateCompleted(true);\n        await executeQueryAnalysis({\n          command: \"querytranslate:explanation\",\n          onNewGeneration: (followup) =>\n            onNewGeneration({ ...followup, hideFollowup: true }),\n          sessionId: chat?.id,\n          history,\n          user_request: \"\",\n          skipFollowupQuestions: true,\n          request: { ...data, ...result },\n        });\n      }\n    } catch (err) {\n      panelLogger.error(\"error while querying by user input\", err);\n    }\n  };\n\n  useEffect(() => {\n    executeRequestInSync(\"getProjectAdapterType\", {})\n      .then((result) => {\n        if (!result) {\n          return;\n        }\n        setValue(\"target\", result as string, { shouldValidate: true });\n      })\n      .catch((err) => panelLogger.info(\"error in getProjectAdapterType\", err));\n    trigger().catch((err) => panelLogger.info(\"error in trigger\", err));\n  }, []);\n\n  return (\n    <div>\n      <form onSubmit={handleSubmit(onSubmit)}>\n        <Stack direction=\"column\">\n          <div>\n            <Label htmlFor=\"source-dialect\">Source SQL dialect</Label>\n            <Controller\n              control={control}\n              name=\"source\"\n              render={({ field: { onChange, ref, value } }) => (\n                <Select\n                  inputId=\"source-dialect\"\n                  ref={ref}\n                  isDisabled={translateCompleted || isLoading}\n                  openMenuOnFocus\n                  options={dialectOptions}\n                  value={dialectOptions.find((c) => c.value === value)}\n                  onChange={(val: unknown) => {\n                    return onChange((val as OptionType).value);\n                  }}\n                />\n              )}\n            />\n          </div>\n          <div>\n            <Label htmlFor=\"destination-dialect\">Destination SQL dialect</Label>\n            <Controller\n              control={control}\n              name=\"target\"\n              render={({ field: { onChange, ref, value } }) => (\n                <Select\n                  inputId=\"destination-dialect\"\n                  ref={ref}\n                  isDisabled={translateCompleted || isLoading}\n                  openMenuOnFocus\n                  options={dialectOptions}\n                  value={dialectOptions.find((c) => c.value === value)}\n                  onChange={(val: unknown) => {\n                    return onChange((val as OptionType).value);\n                  }}\n                />\n              )}\n            />\n          </div>\n\n          {!translateCompleted ? (\n            <Stack className=\"justify-content-end\">\n              <LoadingButton\n                loading={isLoading}\n                type=\"submit\"\n                color=\"primary\"\n                disabled={!isValid}\n              >\n                Translate\n              </LoadingButton>\n            </Stack>\n          ) : null}\n        </Stack>\n      </form>\n    </div>\n  );\n};\n\nexport default QueryTranslateDialectSelects;\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/components/queryAnalysis/components/constants.ts",
    "content": "// reference: altimate_packages/altimate/utils.py\nexport const SqlDialects = [\n  \"bigquery\",\n  \"clickhouse\",\n  \"databricks\",\n  \"duckdb\",\n  \"hive\",\n  \"mysql\",\n  \"oracle\",\n  \"postgres\",\n  \"redshift\",\n  \"snowflake\",\n  \"spark\",\n  \"starrocks\",\n  \"teradata\",\n  \"trino\",\n  \"synapse\",\n  \"sqlserver\",\n  \"doris\",\n];\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/components/queryAnalysis/provider/QueryAnalysisProvider.tsx",
    "content": "import {\n  createContext,\n  ReactNode,\n  useEffect,\n  useMemo,\n  useReducer,\n} from \"react\";\nimport { QueryAnalysisContextProps } from \"./types\";\nimport queryAnalysisSlice, { initialState } from \"./queryAnalysisSlice\";\nimport {\n  DatapilotQueryAnalysisChat,\n  QueryAnalysisType,\n  QueryExplainUpdate,\n} from \"../types\";\nimport {\n  DataPilotChatFollowup,\n  RequestState,\n  RequestTypes,\n} from \"@modules/dataPilot/types\";\nimport useQueryAnalysisAction from \"../useQueryAnalysisAction\";\nimport { panelLogger } from \"@modules/logger\";\nimport useDataPilotContext from \"@modules/dataPilot/useDataPilotContext\";\nimport { upsertFollowup, upsertItem } from \"@modules/dataPilot/dataPilotSlice\";\nimport { QueryAnalysisCommands } from \"../commands\";\n\nexport const QueryAnalysisContext = createContext<QueryAnalysisContextProps>({\n  state: initialState,\n  dispatch: () => null,\n  onNewGeneration: (_result: QueryExplainUpdate) => null,\n});\n\ninterface Props {\n  children: ReactNode;\n}\n\nconst QueryAnalysisProvider = ({ children }: Props): JSX.Element => {\n  const [state, dispatch] = useReducer(\n    queryAnalysisSlice.reducer,\n    queryAnalysisSlice.getInitialState(),\n  );\n\n  const {\n    state: { items, currentSessionId },\n    dispatch: datapilotDispatch,\n  } = useDataPilotContext();\n  const chat = currentSessionId\n    ? (items[currentSessionId] as DatapilotQueryAnalysisChat | undefined)\n    : undefined;\n\n  const { executeQueryAnalysis } = useQueryAnalysisAction();\n\n  const onNewGeneration = (result: QueryExplainUpdate) => {\n    if (!chat) {\n      return;\n    }\n    datapilotDispatch(\n      upsertFollowup({\n        sessionId: chat?.id,\n        followup: result as DataPilotChatFollowup,\n      }),\n    );\n  };\n\n  const handleQueryExplainOnload = () => {\n    if (!chat) {\n      return;\n    }\n    panelLogger.info(\"handleQueryExplainOnload\");\n    datapilotDispatch(upsertItem({ ...chat, state: RequestState.LOADING }));\n    executeQueryAnalysis({\n      sessionId: chat.id,\n      command: QueryAnalysisCommands.explain,\n      onNewGeneration,\n    }).catch((err) =>\n      panelLogger.error(\"error while executing analysis onload\", err),\n    );\n  };\n\n  const handleQueryModifyOnload = () => {\n    if (!chat) {\n      return;\n    }\n    panelLogger.info(\"handleQueryModifyOnload\");\n    datapilotDispatch(upsertItem({ ...chat, state: RequestState.LOADING }));\n    onNewGeneration({\n      state: RequestState.COMPLETED,\n    });\n  };\n\n  const handleQueryTranslateOnload = () => {\n    if (!chat) {\n      return;\n    }\n    panelLogger.info(\"handleQueryTranslateOnload\");\n    datapilotDispatch(upsertItem({ ...chat, state: RequestState.LOADING }));\n    onNewGeneration({\n      datapilotTitle: \"Datapilot Response\",\n      hideFeedback: true,\n      response: \"\",\n      component: \"queryTranslate\",\n      state: RequestState.COMPLETED,\n      hideFollowup: true,\n    });\n  };\n\n  // Trigger explain query api if analysis type is set in chat request\n  useEffect(() => {\n    if (\n      !chat ||\n      chat.requestType !== RequestTypes.QUERY_ANALYSIS ||\n      chat.state !== RequestState.UNINITIALIZED ||\n      !chat.analysisType\n    ) {\n      return;\n    }\n\n    // Api request not sent for this chat yet\n    switch (chat.analysisType) {\n      case QueryAnalysisType.EXPLAIN:\n        handleQueryExplainOnload();\n\n        break;\n      case QueryAnalysisType.MODIFY:\n        handleQueryModifyOnload();\n\n        break;\n\n      case QueryAnalysisType.TRANSLATE:\n        handleQueryTranslateOnload();\n\n        break;\n      default:\n        break;\n    }\n  }, [chat?.state, chat?.requestType, chat?.analysisType]);\n\n  const values = useMemo(\n    () => ({\n      state,\n      dispatch,\n      onNewGeneration,\n    }),\n    [state, dispatch],\n  );\n\n  return (\n    <QueryAnalysisContext.Provider value={values}>\n      {children}\n    </QueryAnalysisContext.Provider>\n  );\n};\n\nexport default QueryAnalysisProvider;\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/components/queryAnalysis/provider/queryAnalysisSlice.ts",
    "content": "import { createSlice, PayloadAction } from \"@reduxjs/toolkit\";\nimport { QueryAnalysisStateProps } from \"./types\";\n\nexport const initialState = {\n  sessionId: null,\n} as QueryAnalysisStateProps;\n\nconst queryAnalysisSlice = createSlice({\n  name: \"queryAnalysisState\",\n  initialState,\n  reducers: {\n    setSessionId: (state, action: PayloadAction<string | null>) => {\n      state.sessionId = action.payload;\n    },\n    reset: () => initialState,\n  },\n});\n\nexport const { setSessionId } = queryAnalysisSlice.actions;\nexport default queryAnalysisSlice;\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/components/queryAnalysis/provider/types.ts",
    "content": "import { UnknownAction } from \"@reduxjs/toolkit\";\nimport { QueryExplainUpdate } from \"../types\";\n\nexport interface QueryAnalysisStateProps {\n  sessionId: string | null;\n}\nexport interface QueryAnalysisContextProps {\n  state: QueryAnalysisStateProps;\n  dispatch: React.Dispatch<UnknownAction>;\n  onNewGeneration: (result: QueryExplainUpdate) => void;\n}\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/components/queryAnalysis/provider/useQueryAnalysisContext.ts",
    "content": "import useDataPilotContext from \"@modules/dataPilot/useDataPilotContext\";\nimport {\n  DatapilotQueryAnalysisChat,\n  QueryAnalysisHistory as DatapilotChatThreadHistory,\n  QueryAnalysisHistoryType,\n} from \"../types\";\nimport { useContext, useMemo } from \"react\";\nimport { QueryAnalysisContext } from \"./QueryAnalysisProvider\";\nimport { QueryAnalysisContextProps } from \"./types\";\n\nexport const MAX_ALLOWED_FOLLOWUP_QUESTIONS = 15;\n\nconst useQueryAnalysisContext = (): {\n  chat?: DatapilotQueryAnalysisChat;\n  history: DatapilotChatThreadHistory[];\n  isMaxFollowupReached: boolean;\n  packageVersions: Record<string, string>;\n} & QueryAnalysisContextProps => {\n  const {\n    state: { items, currentSessionId, packageVersions },\n  } = useDataPilotContext();\n\n  const chat = currentSessionId\n    ? (items[currentSessionId] as DatapilotQueryAnalysisChat | undefined)\n    : undefined;\n  const context = useContext(QueryAnalysisContext);\n  const followups = chat?.followups;\n\n  const history = useMemo(() => {\n    const intialMessage = [] as DatapilotChatThreadHistory[];\n    if (!followups?.length) {\n      return intialMessage;\n    }\n\n    return [\n      ...intialMessage,\n      ...followups\n        .map((result) => [\n          { content: result.userPrompt, type: QueryAnalysisHistoryType.HUMAN },\n          { content: result.response, type: QueryAnalysisHistoryType.SYSTEM },\n        ])\n        .flat()\n        .filter((r) => !!r.content),\n    ] as DatapilotChatThreadHistory[];\n  }, [chat, followups]);\n\n  return {\n    chat,\n    ...context,\n    history,\n    packageVersions,\n    isMaxFollowupReached:\n      MAX_ALLOWED_FOLLOWUP_QUESTIONS <= (followups?.length ?? 0),\n  };\n};\n\nexport default useQueryAnalysisContext;\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/components/queryAnalysis/types.ts",
    "content": "import { DataPilotChat, DataPilotChatFollowup } from \"@modules/dataPilot/types\";\n\nexport enum QueryAnalysisType {\n  EXPLAIN = \"explain\",\n  FIX = \"fix\",\n  MODIFY = \"modify\",\n  TRANSLATE = \"translate\",\n}\nexport interface DatapilotQueryAnalysisChat extends DataPilotChat {\n  query: string;\n  fileName: string;\n  analysisType?: QueryAnalysisType;\n}\n\nexport type QueryExplainUpdate = Partial<DataPilotChatFollowup>;\n\nexport enum QueryAnalysisHistoryType {\n  HUMAN = \"HumanMessage\",\n  SYSTEM = \"SystemMessage\",\n}\n\nexport interface QueryAnalysisHistory {\n  type: QueryAnalysisHistoryType;\n  content: string;\n  additional_kwargs?: Record<string, unknown>;\n}\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/components/queryAnalysis/useQueryAnalysisAction.ts",
    "content": "import {\n  executeRequestInSync,\n  executeStreamRequest,\n} from \"@modules/app/requestExecutor\";\nimport { DataPilotChatAction, RequestState } from \"@modules/dataPilot/types\";\nimport { panelLogger } from \"@modules/logger\";\nimport { useState } from \"react\";\nimport { QueryAnalysisHistory, QueryExplainUpdate } from \"./types\";\nimport useQueryAnalysisContext from \"./provider/useQueryAnalysisContext\";\nimport { QueryAnalysisCommands } from \"./commands\";\n\ninterface QueryAnalysisRequest {\n  command: DataPilotChatAction[\"command\"];\n  onNewGeneration: (result: QueryExplainUpdate) => void;\n  sessionId?: string;\n  user_request?: string;\n  history?: QueryAnalysisHistory[];\n  skipFollowupQuestions?: boolean;\n  request?: Record<string, unknown>;\n}\nconst useQueryAnalysisAction = (): {\n  isLoading: boolean;\n  executeQueryAnalysis: (\n    args: QueryAnalysisRequest,\n  ) => Promise<string | undefined>;\n} => {\n  const { chat, isMaxFollowupReached, packageVersions } =\n    useQueryAnalysisContext();\n  const [isLoading, setIsLoading] = useState(false);\n\n  // No need for followup questions for query modify\n  // const skipFollowupQuestions = chat?.analysisType === QueryAnalysisType.MODIFY;\n\n  const onProgress = (\n    id: string,\n    chunk: string,\n    cb: (result: QueryExplainUpdate) => void,\n  ) => {\n    cb({ id, response: chunk });\n  };\n\n  const getRequestText = (command: string) => {\n    switch (command) {\n      case QueryAnalysisCommands.modify:\n        return \"Query change\";\n\n      case QueryAnalysisCommands.explain:\n        return \"Query explanation\";\n      default:\n        break;\n    }\n  };\n  const executeQueryAnalysis = async ({\n    command,\n    onNewGeneration,\n    history,\n    sessionId,\n    user_request,\n    skipFollowupQuestions,\n    request,\n  }: QueryAnalysisRequest) => {\n    if (isMaxFollowupReached) {\n      return;\n    }\n    const id = crypto.randomUUID();\n    try {\n      panelLogger.info(\n        \"executeQueryAnalysis\",\n        command,\n        sessionId,\n        id,\n        chat?.meta,\n      );\n      setIsLoading(true);\n\n      onNewGeneration({\n        id,\n\n        userPrompt: user_request ?? getRequestText(command),\n        datapilotTitle: \"Datapilot Response\",\n        state: RequestState.LOADING,\n      });\n      const [result, followupQuestions] = await Promise.all([\n        executeStreamRequest(\n          command,\n          // use the original chat session id to track the whole conversation\n          {\n            session_id: sessionId,\n            history,\n            user_request,\n            dbt_expectations: Boolean(packageVersions.dbt_expectations),\n            dbt_utils: Boolean(packageVersions.dbt_utils),\n            filePath: chat?.filePath,\n            ...chat?.meta,\n            ...request,\n          },\n          (chunk: string) => {\n            onProgress(id, chunk, onNewGeneration);\n          },\n        ) as Promise<{ response: string }>,\n        skipFollowupQuestions\n          ? undefined\n          : (executeRequestInSync(\"queryanalysis:followup\", {\n              user_request,\n              filePath: chat?.filePath,\n              query: chat?.query,\n            }) as Promise<string[] | null>),\n      ]);\n\n      panelLogger.info(\n        \"executeQueryAnalysis result\",\n        result,\n        followupQuestions,\n      );\n      onNewGeneration({\n        id,\n        response: result?.response,\n        state: RequestState.COMPLETED,\n        actions: Array.isArray(followupQuestions)\n          ? followupQuestions.map((question) => ({\n              title: question,\n              data: {},\n              command,\n              userPrompt: question,\n              datapilotTitle: question,\n            }))\n          : [],\n      });\n      return result?.response;\n    } catch (err) {\n      panelLogger.error(\"Error while fetching explanation\", err);\n      onNewGeneration({\n        id,\n        response: (err as Error).message,\n        state: RequestState.ERROR,\n      });\n    }\n    setIsLoading(false);\n    return;\n  };\n\n  return { executeQueryAnalysis, isLoading };\n};\n\nexport default useQueryAnalysisAction;\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/components/test/AddCustomTest.tsx",
    "content": "import { Stack } from \"@uicore\";\nimport useDataPilotContext from \"@modules/dataPilot/useDataPilotContext\";\nimport { useEffect } from \"react\";\nimport { RequestState } from \"@modules/dataPilot/types\";\nimport DatapilotChatFollowupComponent from \"../common/DatapilotChatFollowup\";\nimport {\n  updatePackageVersions,\n  upsertFollowup,\n} from \"@modules/dataPilot/dataPilotSlice\";\nimport {\n  executeRequestInAsync,\n  executeRequestInSync,\n} from \"@modules/app/requestExecutor\";\nimport { panelLogger } from \"@modules/logger\";\n\nconst DependentPackages = [\"dbt_expectations\", \"dbt_utils\"];\n\nconst AddCustomTest = (): JSX.Element | null => {\n  const {\n    state: { items, currentSessionId },\n    dispatch,\n  } = useDataPilotContext();\n\n  const chat = currentSessionId ? items[currentSessionId] : undefined;\n  const results = chat?.followups ?? [];\n\n  const loadDependentPackageVersions = () => {\n    Promise.all(\n      DependentPackages.map((packageName) =>\n        executeRequestInSync(\"findPackageVersion\", { packageName }),\n      ),\n    )\n      .then(([dbt_expectations_version, dbt_utils_version]) =>\n        dispatch(\n          updatePackageVersions({\n            dbt_utils: dbt_utils_version as string,\n            dbt_expectations: dbt_expectations_version as string,\n          }),\n        ),\n      )\n      .catch((err) =>\n        panelLogger.error(\"error while loading package version\", err),\n      );\n  };\n\n  useEffect(() => {\n    loadDependentPackageVersions();\n  }, []);\n\n  useEffect(() => {\n    if (!chat?.id || results.length) {\n      return;\n    }\n\n    const { meta } = chat;\n    if (!meta?.column && !meta?.model) {\n      executeRequestInAsync(\"showErrorMessage\", {\n        infoMessage:\n          \"Missing column and model information. Please try again after reloading vscode.\",\n      });\n      return;\n    }\n\n    const userPrompt = meta.column\n      ? `Add Custom Test for column: ${meta.column as string}`\n      : `Add Custom Test for model: ${meta.model as string}`;\n    const response = meta.column\n      ? `Generate Tests for column “${meta?.column as string}” in model “${\n          meta?.model as string\n        }“`\n      : `Generate Tests for model “${meta?.model as string}“`;\n\n    dispatch(\n      upsertFollowup({\n        sessionId: chat?.id,\n        followup: {\n          id: crypto.randomUUID(),\n          datapilotTitle: \" Datapilot response\",\n          actions: [],\n          state: RequestState.COMPLETED,\n          userPrompt,\n          response: `${response} \\n\\r Please provide more information about which tests you need`,\n          hideFeedback: true,\n        },\n      }),\n    );\n  }, [chat?.id, results.length]);\n\n  if (!chat) {\n    return null;\n  }\n\n  return (\n    <Stack direction=\"column\">\n      {results.map((result, i) => (\n        <DatapilotChatFollowupComponent\n          key={result.id}\n          response={result}\n          command=\"dbttest:create\"\n          // show followup and ask textbox for last result only\n          showFollowup={i === results.length - 1}\n          hideFeedback={result.hideFeedback}\n          skipFollowupQuestions\n        />\n      ))}\n    </Stack>\n  );\n};\n\nexport default AddCustomTest;\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/components/test/Tests.stories.tsx",
    "content": "import { withReactContext } from \"storybook-react-context\";\nimport type { Meta, StoryObj } from \"@storybook/react\";\nimport DataPilotPanel from \"../..\";\nimport { DataPilotContext } from \"../../DataPilotProvider\";\nimport { DatapilotCustomChatFactory } from \"@testUtils\";\nimport { RequestState } from \"@modules/dataPilot/types\";\n\nconst customChatLoadingState = DatapilotCustomChatFactory.build({\n  state: RequestState.LOADING,\n});\n\nexport default {\n  title: \"Datapilot/Tests\",\n  parameters: {\n    layout: \"left\",\n  },\n  tags: [\"autodocs\"],\n  argTypes: {\n    backgroundColor: { control: \"color\" },\n  },\n} satisfies Meta;\n\nexport const AddCustomTest: StoryObj = {\n  render: (): JSX.Element => {\n    return <DataPilotPanel />;\n  },\n  decorators: [\n    withReactContext({\n      Context: DataPilotContext,\n      initialState: {\n        state: {\n          items: {\n            [customChatLoadingState.id]: {\n              ...customChatLoadingState,\n            },\n          },\n          currentSessionId: customChatLoadingState.id,\n        },\n      },\n    }),\n  ],\n};\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/constants.tsx",
    "content": "import QueryTranslateDialectSelects from \"./components/queryAnalysis/components/QueryTranslateDialectSelects\";\n\nexport const DatapilotResponseComponents = {\n  queryTranslate: <QueryTranslateDialectSelects />,\n};\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/dataPilotSlice.ts",
    "content": "import { createSlice, PayloadAction } from \"@reduxjs/toolkit\";\nimport {\n  DataPilotChat,\n  DataPilotChatFollowup,\n  DataPilotStateProps,\n} from \"./types\";\n\nexport const initialState = {\n  items: {},\n  currentSessionId: undefined,\n  showHelp: false,\n  packageVersions: {},\n} as DataPilotStateProps;\n\nconst dataPilotSlice = createSlice({\n  name: \"dataPilotState\",\n  initialState,\n  reducers: {\n    updatePackageVersions: (\n      state,\n      action: PayloadAction<DataPilotStateProps[\"packageVersions\"]>,\n    ) => {\n      state.packageVersions = { ...state.packageVersions, ...action.payload };\n    },\n    setCurrentSessionId: (\n      state,\n      action: PayloadAction<DataPilotStateProps[\"currentSessionId\"]>,\n    ) => {\n      state.currentSessionId = action.payload;\n    },\n    setShowHelp: (\n      state,\n      action: PayloadAction<DataPilotStateProps[\"showHelp\"]>,\n    ) => {\n      state.showHelp = action.payload;\n    },\n    deleteFollowup: (\n      state,\n      {\n        payload: { followupId, sessionId },\n      }: PayloadAction<{\n        sessionId?: DataPilotChat[\"id\"];\n        followupId?: DataPilotChatFollowup[\"id\"];\n      }>,\n    ) => {\n      if (!sessionId || !followupId || !state.items[sessionId]) {\n        return;\n      }\n\n      const { followups } = state.items[sessionId];\n\n      if (!followups?.length) {\n        return;\n      }\n\n      state.items[sessionId].followups = state.items[\n        sessionId\n      ].followups?.filter((followup) => followup.id !== followupId);\n    },\n    upsertFollowup: (\n      state,\n      {\n        payload: { followup, sessionId },\n      }: PayloadAction<{\n        sessionId: DataPilotChat[\"id\"];\n        followup: DataPilotChatFollowup;\n      }>,\n    ) => {\n      if (!state.items[sessionId]) {\n        return;\n      }\n\n      const { followups } = state.items[sessionId];\n\n      if (!followups?.length) {\n        state.items[sessionId].followups = [followup];\n        return;\n      }\n      const currentIndex = followups.findIndex((r) => r.id === followup.id);\n      if (currentIndex === -1) {\n        state.items[sessionId].followups = [...followups, followup];\n        return;\n      }\n\n      const clone = [...followups];\n      clone[currentIndex] = {\n        ...clone[currentIndex],\n        ...followup,\n      };\n      state.items[sessionId].followups = clone;\n    },\n    upsertItem: (\n      state,\n      action: PayloadAction<\n        Partial<DataPilotChat> & { id: DataPilotChat[\"id\"] }\n      >,\n    ) => {\n      state.items[action.payload.id] = {\n        ...state.items[action.payload.id],\n        ...action.payload,\n        updatedAt: new Date(),\n      };\n    },\n    reset: () => initialState,\n  },\n});\n\nexport const {\n  updatePackageVersions,\n  upsertItem,\n  reset,\n  setCurrentSessionId,\n  setShowHelp,\n  upsertFollowup,\n  deleteFollowup,\n} = dataPilotSlice.actions;\nexport default dataPilotSlice;\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/datapilot.module.scss",
    "content": "body {\n  padding: var(--spacing-3xl) !important;\n}\n.chat-list {\n  padding: 0;\n  li {\n    margin-bottom: 1rem;\n    list-style: none;\n\n    > :global.stack-column {\n      gap: var(--spacing-xl);\n    }\n  }\n\n  :global .card {\n    padding: 20px;\n    background: var(--background-base);\n\n    [class^=\"_coachAi\"]{\n      margin-top: 1rem;\n      margin-bottom: 1rem;\n\n      li{\n        margin: 0;\n      }\n    }\n  }\n  :global .card-title {\n    font-size: 14px;\n    svg {\n      width: 24px;\n      height: 24px;\n      margin-right: 6px;\n    }\n  }\n  .response {\n    padding-bottom: var(--spacing-3xl);\n  }\n  .action-buttons {\n    flex-wrap: wrap;\n    justify-content: space-between;\n\n    & > div {\n      display: flex;\n    }\n    & :global .btn.active {\n      border-color: var(--primary-color);\n    }\n    & > form {\n      margin-top: 24px;\n      padding-top: 24px;\n      border-top: 1px solid #424750;\n      flex: 100%;\n    }\n  }\n\n  .action-button{\n    font-family: \"SF Mono\",Monaco,Menlo,Courier,monospace;\n    font-size: 10px;\n    text-align: left;\n\n    &.default{\n      font-size: 12px;\n      font-family: var(--bs-body-font-family);\n    }\n  }\n\n  .prompt-card {\n    border-radius: 8px;\n    border: 1px solid var(--stroke--disable);\n    background: var(--background--03);\n  }\n\n  .ask-input {\n    form {\n      width: 100%;\n      position: relative;\n\n      textarea {\n        padding: 1rem 1.5rem;\n        min-height: 48px;\n      }\n      button {\n        position: absolute;\n        top: 8px;\n        right: 8px;\n      }\n    }\n  }\n}\n\n.default-view {\n  h1 {\n    margin-bottom: 0;\n  }\n  > section {\n    border-radius: 8px;\n    border: 1px solid var(--background--04, #4a4d51);\n    padding: var(--spacing-xl) var(--spacing-2xl);\n    text-align: left;\n    margin-top: var(--spacing-xl);\n    h3 {\n      margin-bottom: var(--spacing-lg);\n    }\n\n    p {\n      color: var(--text-color--paragraph);\n      margin-bottom: 0;\n    }\n  }\n}\n\n.help {\n  .back{\n    cursor: pointer;\n    svg path{\n      stroke: var(--text-color--title);\n    } \n  }\n  .links {\n    gap: 1rem;\n    display: flex;\n    flex-wrap: wrap;\n    padding: 0; \n    .link {\n      text-align: center;\n      list-style: none;\n      width: 31%;\n    a{\n      background: var(--background--04);\n    border-radius: 10px;\n    padding: 40px 0px;\n      display: block;\n      height: 100%;\n      color: var(--text-color--title);\n      text-decoration: none;\n      svg{\n        margin-bottom: var(--spacing-2xl);\n        width: 50%;\n        path{\n          fill: var(--text-color--title);\n        }\n      }\n      \n      :global .codicon{\n        font-size: 80px;\n        margin-bottom: var(--spacing-2xl);\n      }\n      \n      &:hover {\n        background: var(--background--blue);\n      }\n    }}\n  }\n}\n\n.codeblock{\n  --code-bg: transparent;\n}"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/index.tsx",
    "content": "import { List } from \"@uicore\";\nimport useDataPilotContext from \"./useDataPilotContext\";\nimport { DataPilotChat, RequestTypes } from \"./types\";\nimport AiDocChat from \"./components/docGen/AiDocChat\";\nimport classes from \"./datapilot.module.scss\";\nimport DefaultDatapilotView from \"./DefaultDatapilotView\";\nimport QueryAnalysis from \"./components/queryAnalysis/QueryAnalysis\";\nimport QueryAnalysisProvider from \"./components/queryAnalysis/provider/QueryAnalysisProvider\";\nimport DataPilotHelp from \"./DataPilotHelp\";\nimport AddCustomTest from \"./components/test/AddCustomTest\";\n\nconst DataPilotPanel = (): JSX.Element => {\n  const {\n    state: { items, showHelp, currentSessionId },\n  } = useDataPilotContext();\n\n  const dpChat = currentSessionId ? items[currentSessionId] : undefined;\n\n  const renderChat = (chat: DataPilotChat) => {\n    switch (chat.requestType) {\n      case RequestTypes.AI_DOC_GENERATION:\n        return <AiDocChat chat={chat} />;\n      case RequestTypes.QUERY_ANALYSIS:\n        return (\n          <QueryAnalysisProvider>\n            <QueryAnalysis />\n          </QueryAnalysisProvider>\n        );\n      case RequestTypes.ADD_CUSTOM_TEST:\n        return (\n          <QueryAnalysisProvider>\n            <AddCustomTest />\n          </QueryAnalysisProvider>\n        );\n      default:\n        break;\n    }\n    return null;\n  };\n\n  if (showHelp) {\n    return <DataPilotHelp />;\n  }\n\n  if (!dpChat) {\n    return <DefaultDatapilotView />;\n  }\n\n  return (\n    <List className={classes.chatList}>\n      <li key={dpChat.id}>{renderChat(dpChat)}</li>\n    </List>\n  );\n};\n\nexport default DataPilotPanel;\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/types.ts",
    "content": "import { UnknownAction } from \"@reduxjs/toolkit\";\nimport { DatapilotResponseComponents } from \"./constants\";\n\nexport enum RequestTypes {\n  ADD_CUSTOM_TEST = \"ADD_CUSTOM_TEST\",\n  AI_DOC_GENERATION = \"AI_DOC_GENERATION\",\n  AI_DOC_REGENERATION = \"AI_DOC_REGENERATION\",\n  QUERY_ANALYSIS = \"QUERY_ANALYSIS\",\n}\n\nexport enum RequestState {\n  COMPLETED = \"COMPLETED\",\n  ERROR = \"ERROR\",\n  LOADING = \"LOADING\",\n  UNINITIALIZED = \"UNINITIALIZED\",\n}\n\nexport interface DataPilotChatAction {\n  title: string;\n  data: Record<string, unknown>;\n  command: string;\n  userPrompt: string;\n  datapilotTitle: string;\n}\n\nexport interface DataPilotChat {\n  id: string;\n  query: string; // query text that triggered this chat\n  state: RequestState; // state of current request\n  requestType: RequestTypes; // What type of request is this? ex: AI doc generation\n  response?: string; // Response from backend\n  actions?: DataPilotChatAction[]; // follow up actions\n  updatedAt?: Date;\n  meta?: Record<string, unknown>; // any extra data to be stored\n  followups?: DataPilotChatFollowup[];\n  filePath?: string;\n}\n\nexport interface DataPilotChatFollowup {\n  id: string;\n  userPrompt: string;\n  datapilotTitle: string;\n  response?: string;\n  component?: keyof typeof DatapilotResponseComponents;\n  actions?: DataPilotChatAction[];\n  codeBlockActions?: {\n    title: string;\n    onClick: (\n      followup: DataPilotChatFollowup,\n      buttonTitle: string,\n    ) => void | Promise<void>;\n  }[];\n  state: RequestState;\n  hideFeedback?: boolean;\n  hideFollowup?: boolean;\n}\n\nexport interface DataPilotStateProps {\n  items: Record<DataPilotChat[\"id\"], DataPilotChat>;\n  currentSessionId?: DataPilotChat[\"id\"];\n  showHelp: boolean;\n  packageVersions: Record<string, string>;\n}\n\nexport interface ContextProps {\n  state: DataPilotStateProps;\n  dispatch: React.Dispatch<UnknownAction>;\n}\n"
  },
  {
    "path": "webview_panels/src/modules/dataPilot/useDataPilotContext.ts",
    "content": "import { useContext } from \"react\";\nimport { DataPilotContext } from \"./DataPilotProvider\";\nimport { ContextProps } from \"./types\";\n\nconst useDataPilotContext = (): ContextProps => useContext(DataPilotContext);\n\nexport default useDataPilotContext;\n"
  },
  {
    "path": "webview_panels/src/modules/dbtDocs/DbtDocsView.tsx",
    "content": "import { ConversationSources, DbtDocs } from \"@lib\";\nimport { IncomingMessageProps } from \"@modules/app/types\";\nimport useAppContext from \"@modules/app/useAppContext\";\nimport { useCallback, useEffect, useState } from \"react\";\n\nconst DbtDocsView = (): JSX.Element => {\n  const {\n    state: { isComponentsApiInitialized },\n  } = useAppContext();\n\n  const [shareId, setShareId] = useState<number>();\n  const [conversationGroupId, setConversationGroupId] = useState<number>();\n  const [userId, setUserId] = useState<number>();\n\n  const onMesssage = useCallback(\n    (event: MessageEvent<IncomingMessageProps>) => {\n      const { command, args } = event.data;\n      switch (command) {\n        case \"dbtDocsShareDetails\":\n          setShareId(args.shareId as number);\n          setConversationGroupId(\n            args.conversationGroupId as number | undefined,\n          );\n          setUserId(args.userId as number);\n          break;\n        default:\n          break;\n      }\n    },\n    [],\n  );\n\n  useEffect(() => {\n    window.addEventListener(\"message\", onMesssage);\n\n    return () => {\n      window.removeEventListener(\"message\", onMesssage);\n    };\n  }, [onMesssage]);\n\n  if (!isComponentsApiInitialized || !shareId) {\n    return <div>Loading...</div>;\n  }\n  return (\n    <div>\n      <DbtDocs\n        shareId={shareId}\n        userId={userId}\n        conversationGroupId={conversationGroupId}\n        source={ConversationSources.DBT_DOCS}\n      />\n    </div>\n  );\n};\n\nexport default DbtDocsView;\n"
  },
  {
    "path": "webview_panels/src/modules/dbtDocs/ShareDbtDocsButton.tsx",
    "content": "import { yupResolver } from \"@hookform/resolvers/yup\";\nimport * as Yup from \"yup\";\nimport { Controller, useForm } from \"react-hook-form\";\nimport {\n  executeRequestInAsync,\n  executeRequestInSync,\n} from \"@modules/app/requestExecutor\";\nimport { Input, Drawer, LoadingButton, Stack, Button } from \"@uicore\";\nimport { useState } from \"react\";\nimport CopyToClipboard from \"react-copy-to-clipboard\";\nimport { panelLogger } from \"@modules/logger\";\n\nconst schema = Yup.object({\n  name: Yup.string().optional(),\n  description: Yup.string().optional(),\n}).required();\n\ninterface ShareRequest {\n  description?: string;\n  name?: string;\n}\n\nconst ShareDbtDocsButton = (): JSX.Element => {\n  const [sharedUrl, setSharedUrl] = useState(\"\");\n  const [isCopied, setIsCopied] = useState(false);\n  const {\n    control,\n    handleSubmit,\n    formState: { isSubmitting },\n  } = useForm<ShareRequest>({\n    resolver: yupResolver(schema),\n  });\n\n  const handleViewClick = () => {\n    // TODO handle this properly\n    const parts = sharedUrl.split(\"/\");\n    executeRequestInAsync(\"dbtdocsview:render\", {\n      shareId: parts[parts.length - 1],\n    });\n  };\n\n  const handleShare = async (data: ShareRequest) => {\n    try {\n      const result = (await executeRequestInSync(\"share:dbtdocs\", {\n        ...data,\n      })) as { shareUrl: string; shareId: string };\n      setSharedUrl(result.shareUrl);\n    } catch (err) {\n      panelLogger.error(\"error while creating dbt share url\", err);\n    }\n  };\n  return (\n    <Drawer buttonProps={{ outline: true }} buttonText=\"Share\" title=\"Share\">\n      {sharedUrl ? (\n        <div>\n          <h4>Share this url:</h4>\n          <p>{sharedUrl}</p>\n          <Stack>\n            <Button onClick={handleViewClick}>View</Button>\n            <CopyToClipboard text={sharedUrl}>\n              <Button\n                title={`${\n                  !isCopied ? \"Copy to clipboard\" : \"Copied to clipboard\"\n                }`}\n                onClick={() => setIsCopied(true)}\n              >\n                {isCopied ? \"Copied\" : \"Copy\"}\n              </Button>\n            </CopyToClipboard>\n          </Stack>\n        </div>\n      ) : (\n        <form onSubmit={handleSubmit(handleShare)}>\n          <Controller\n            control={control}\n            name=\"name\"\n            render={({ field: { onChange } }) => (\n              <Input\n                type=\"textarea\"\n                onChange={onChange}\n                placeholder=\"Enter a title\"\n              />\n            )}\n          />\n\n          <Controller\n            control={control}\n            name=\"description\"\n            render={({ field: { onChange } }) => (\n              <Input\n                type=\"textarea\"\n                onChange={onChange}\n                placeholder=\"@john Please check this out!\"\n              />\n            )}\n          />\n\n          <LoadingButton loading={isSubmitting} color=\"primary\" type=\"submit\">\n            Discuss\n          </LoadingButton>\n        </form>\n      )}\n    </Drawer>\n  );\n};\n\nexport default ShareDbtDocsButton;\n"
  },
  {
    "path": "webview_panels/src/modules/defer/DeferToProduction.tsx",
    "content": "import {\n  Card,\n  CardBody,\n  CardText,\n  CardTitle,\n  Form,\n  FormGroup,\n  Input,\n  Label,\n  Select,\n} from \"@uicore\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { executeRequestInSync } from \"../app/requestExecutor\";\nimport classes from \"./defer.module.scss\";\nimport { IncomingMessageProps } from \"@modules/app/types\";\nimport {\n  DbtIntegrationMode,\n  DbtProject,\n  DeferToProductionProps,\n} from \"./types\";\nimport { ManifestPathType } from \"./constants\";\nimport { ManifestSelection } from \"./ManifestSelection\";\nimport { panelLogger } from \"@modules/logger\";\nimport PreviewFeatureIcon from \"@modules/previewFeature/PreviewFeatureIcon\";\n\nconst DefaultDeferState = {\n  deferToProduction: false,\n  favorState: false,\n  manifestPathForDeferral: undefined,\n  manifestPathType: undefined,\n  projectIntegrations: [],\n  dbtCoreIntegrationId: undefined,\n};\n\nconst DeferToProduction = (): JSX.Element => {\n  const [\n    {\n      deferToProduction,\n      favorState,\n      manifestPathForDeferral,\n      manifestPathType,\n      projectIntegrations,\n      dbtCoreIntegrationId,\n    },\n    setDeferState,\n  ] = useState<DeferToProductionProps>(DefaultDeferState);\n  const [fetchingProjectIntegrations, setFetchingProjectIntegrations] =\n    useState(false);\n  const [dbtProjects, setDbtProjects] = useState<DbtProject[]>([]);\n  const [dbtProjectRoot, setDbtProjectRoot] = useState(\"\");\n  const [dbtIntegrationMode, setDbtIntegrationMode] = useState(\n    DbtIntegrationMode.CORE,\n  );\n  const [showProjectDropdown, setShowProjectDropdown] = useState(true);\n\n  const updateDeferState = (args: {\n    config: DeferToProductionProps;\n    projectPath: string;\n    dbtIntegrationMode: DbtIntegrationMode;\n  }) => {\n    setDeferState(args.config || DefaultDeferState);\n    setDbtProjectRoot(args.projectPath);\n    setDbtIntegrationMode(args.dbtIntegrationMode);\n  };\n\n  const onMesssage = useCallback(\n    (event: MessageEvent<IncomingMessageProps>) => {\n      const { command, args } = event.data;\n      switch (command) {\n        case \"renderDeferConfig\":\n          updateDeferState(\n            args as {\n              config: DeferToProductionProps;\n              projectPath: string;\n              dbtIntegrationMode: DbtIntegrationMode;\n            },\n          );\n          break;\n        default:\n          break;\n      }\n    },\n    [],\n  );\n\n  useEffect(() => {\n    window.addEventListener(\"message\", onMesssage);\n    return () => {\n      window.removeEventListener(\"message\", onMesssage);\n    };\n  }, [onMesssage]);\n\n  const handleRemoteManifestIntegration = async (\n    config: DeferToProductionProps,\n  ) => {\n    if (config.manifestPathType === ManifestPathType.REMOTE) {\n      await setProjectIntegrations();\n    }\n  };\n\n  const loadProjects = async () => {\n    const projects = await executeRequestInSync(\"getProjects\", {});\n    const localProjects = projects as DbtProject[];\n    if (localProjects.length === 1) {\n      setDbtProjectRoot(localProjects[0].projectRoot);\n      setShowProjectDropdown(false);\n    } else {\n      setDbtProjects(localProjects);\n    }\n  };\n\n  const loadDeferConfig = async () => {\n    const response = (await executeRequestInSync(\"getDeferToProductionConfig\", {\n      projectRoot: dbtProjectRoot,\n    })) as {\n      config: DeferToProductionProps;\n      projectPath: string;\n      dbtIntegrationMode: DbtIntegrationMode;\n    };\n    updateDeferState(response);\n    if (response.config) {\n      await handleRemoteManifestIntegration(response.config);\n    }\n  };\n\n  useEffect(() => {\n    loadProjects().catch(() => {\n      return;\n    });\n  }, []);\n\n  useEffect(() => {\n    loadDeferConfig().catch(() => {\n      return;\n    });\n  }, [dbtProjectRoot]);\n\n  const updateDeferAndFavorState = ({\n    key,\n    value,\n  }: {\n    key: string;\n    value: boolean;\n  }) => {\n    setDeferState((prevState) => ({ ...prevState, [key]: value }));\n  };\n\n  const handleStateChange = async (\n    event: React.ChangeEvent<HTMLInputElement>,\n  ) => {\n    const { checked, name } = event.target;\n    panelLogger.log(\"dbtProjectRoot\", dbtProjectRoot);\n    const response = await executeRequestInSync(\"updateDeferConfig\", {\n      config: [\n        {\n          key: name,\n          value: checked,\n          isPreviewFeature: true,\n        },\n      ],\n      projectRoot: dbtProjectRoot,\n    });\n    if ((response as { updated: boolean }).updated) {\n      updateDeferAndFavorState({ key: name, value: checked });\n    }\n  };\n\n  const setProjectIntegrations = async (clearCache?: boolean) => {\n    setFetchingProjectIntegrations(true);\n    const response = await executeRequestInSync(\"fetchProjectIntegrations\", {\n      clearCache,\n    });\n    if (Array.isArray(response)) {\n      setDeferState((prevState) => ({\n        ...prevState,\n        projectIntegrations: response.map(\n          (item: { name: string; id: number }) => ({\n            label: item.name,\n            value: item.id,\n          }),\n        ),\n        manifestPathType: ManifestPathType.REMOTE,\n      }));\n    }\n    setFetchingProjectIntegrations(false);\n  };\n\n  const handleProjectSelect = (selectedOption: {\n    label: string;\n    value: string;\n  }) => {\n    setDbtProjectRoot(selectedOption.value);\n    setDeferState(DefaultDeferState);\n  };\n\n  const selectedProject = useMemo(() => {\n    const project = dbtProjects.find((p) => p.projectRoot === dbtProjectRoot);\n    if (!project) {\n      return;\n    }\n\n    return {\n      label: `${project.projectName} (${project.projectRoot})`,\n      value: project.projectRoot,\n    };\n  }, [dbtProjects, dbtProjectRoot]);\n\n  return (\n    <Card className={classes.insightsCard}>\n      <CardTitle className={classes.cardTitle} tag=\"h5\">\n        Defer to production <PreviewFeatureIcon />\n      </CardTitle>\n      <CardBody>\n        <CardText>\n          Save costs and time by only running a subset of models without\n          building upstream models (\n          <a\n            href=\"https://docs.getdbt.com/reference/node-selection/defer\"\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n          >\n            more info\n          </a>\n          ).\n        </CardText>\n        <Form>\n          {showProjectDropdown && (\n            <Label className={classes.projectSelect}>\n              Select dbt project\n              <Select\n                options={dbtProjects.map((d) => {\n                  return {\n                    label: `${d.projectName} (${d.projectRoot})`,\n                    value: d.projectRoot,\n                  };\n                })}\n                defaultValue={selectedProject}\n                value={selectedProject}\n                onChange={(newValue) =>\n                  handleProjectSelect(\n                    newValue as { label: string; value: string },\n                  )\n                }\n                placeholder=\"Select Project\"\n              />\n            </Label>\n          )}\n          {dbtProjectRoot && (\n            <>\n              <FormGroup switch className={classes.formSwitch}>\n                <Label>\n                  Enable defer to production\n                  <Input\n                    type=\"switch\"\n                    onChange={handleStateChange}\n                    name=\"deferToProduction\"\n                    checked={deferToProduction}\n                  />\n                </Label>\n              </FormGroup>\n              {dbtIntegrationMode !== DbtIntegrationMode.CLOUD ? (\n                <>\n                  <ManifestSelection\n                      fetchingProjectIntegrations={fetchingProjectIntegrations}\n                      dbtProjectRoot={dbtProjectRoot}\n                      manifestPathForDeferral={manifestPathForDeferral}\n                      manifestPathType={manifestPathType}\n                      projectIntegrations={projectIntegrations}\n                      dbtCoreIntegrationId={dbtCoreIntegrationId}\n                      setDeferState={setDeferState}\n                      setProjectIntegrations={setProjectIntegrations}\n                    />\n                </>\n              ) : null}\n              <FormGroup switch className={classes.formSwitch}>\n                <Label>\n                  Favor-state\n                  <Input\n                    type=\"switch\"\n                    onChange={handleStateChange}\n                    checked={favorState}\n                    name=\"favorState\"\n                  />\n                </Label>\n              </FormGroup>\n            </>\n          )}\n        </Form>\n      </CardBody>\n    </Card>\n  );\n};\n\nexport default DeferToProduction;\n"
  },
  {
    "path": "webview_panels/src/modules/defer/ManifestSelection.tsx",
    "content": "import { RefreshIcon } from \"@assets/icons\";\nimport { panelLogger } from \"@modules/logger\";\nimport {\n  FormGroup,\n  IconButton,\n  Input,\n  Label,\n  Select,\n  Spinner,\n  Stack,\n} from \"@uicore\";\nimport {\n  executeRequestInAsync,\n  executeRequestInSync,\n} from \"../app/requestExecutor\";\nimport { ManifestPathType } from \"./constants\";\nimport classes from \"./defer.module.scss\";\nimport { ManifestSelectionProps } from \"./types\";\n\nexport const ManifestSelection = ({\n  dbtProjectRoot,\n  manifestPathType,\n  manifestPathForDeferral,\n  projectIntegrations,\n  dbtCoreIntegrationId,\n  setDeferState,\n  setProjectIntegrations,\n  fetchingProjectIntegrations,\n}: ManifestSelectionProps): JSX.Element => {\n  const updateConfigWithManifestPath = async (path: string) => {\n    panelLogger.info(\"updating defer config for manifest path\", path);\n    const response = await executeRequestInSync(\"updateDeferConfig\", {\n      config: [\n        {\n          key: \"manifestPathForDeferral\",\n          value: path,\n          isPreviewFeature: true,\n        },\n        {\n          key: \"manifestPathType\",\n          value: manifestPathType,\n        },\n      ],\n      projectRoot: dbtProjectRoot,\n    });\n    if (!(response as { updated: boolean }).updated) {\n      setDeferState((prevState) => ({\n        ...prevState,\n        manifestPathForDeferral,\n        manifestPathType,\n      }));\n    }\n  };\n\n  const handleManifestPathTypeChange = async (option: ManifestPathType) => {\n    if (option === ManifestPathType.REMOTE) {\n      await setProjectIntegrations();\n      if (dbtCoreIntegrationId) {\n        await executeRequestInSync(\"updateDeferConfig\", {\n          config: [\n            {\n              key: \"manifestPathType\",\n              value: option,\n            },\n          ],\n          projectRoot: dbtProjectRoot,\n        });\n      }\n    }\n    if (option === ManifestPathType.LOCAL) {\n      if (manifestPathForDeferral) {\n        await executeRequestInSync(\"updateDeferConfig\", {\n          config: [\n            {\n              key: \"manifestPathType\",\n              value: option,\n            },\n          ],\n          projectRoot: dbtProjectRoot,\n        });\n      }\n    }\n    setDeferState((prevState) => ({\n      ...prevState,\n      manifestPathType: option,\n    }));\n  };\n\n  const handleIntegrationSelect = async (selectedOption: {\n    label: string;\n    value: number;\n  }) => {\n    await executeRequestInSync(\"testRemoteManifest\", {\n      dbtCoreIntegrationId: selectedOption.value,\n    });\n    executeRequestInAsync(\"showInformationMessage\", {\n      infoMessage: `Project integration connected successfully!`,\n    });\n    await executeRequestInSync(\"updateDeferConfig\", {\n      config: [\n        {\n          key: \"manifestPathType\",\n          value: manifestPathType,\n        },\n        {\n          key: \"dbtCoreIntegrationId\",\n          value: selectedOption.value,\n        },\n      ],\n      projectRoot: dbtProjectRoot,\n    });\n    setDeferState((prevState) => ({\n      ...prevState,\n      dbtCoreIntegrationId: selectedOption.value,\n    }));\n  };\n\n  const selectDirectoryForManifest = async () => {\n    panelLogger.info(\"selecting directory for manifest\");\n    const result = await executeRequestInSync(\"selectDirectoryForManifest\", {});\n    panelLogger.info(\"selected directory for manifest\", result);\n    const { path } = result as { path: string };\n    setDeferState((prevState) => ({\n      ...prevState,\n      manifestPathForDeferral: path,\n    }));\n\n    await updateConfigWithManifestPath(path);\n  };\n\n  const handleRefresh = () => setProjectIntegrations(true);\n\n  return (\n    <FormGroup check className={classes.pathSelection}>\n      <div className={classes.pathSelectionRow}>\n        <Label\n          check\n          for=\"localManifestPathRadio\"\n          className={classes.title}\n          style={{ whiteSpace: \"nowrap\" }}\n        >\n          <Input\n            type=\"radio\"\n            id=\"localManifestPathRadio\"\n            checked={manifestPathType === ManifestPathType.LOCAL}\n            onClick={() => handleManifestPathTypeChange(ManifestPathType.LOCAL)}\n          />\n          Local Path to manifest folder\n        </Label>\n        {manifestPathType === ManifestPathType.LOCAL && (\n          <Input\n            id=\"localManifestPath\"\n            name=\"manifestPathForDeferral\"\n            placeholder=\"\"\n            type=\"text\"\n            readOnly\n            className={classes.pathInput}\n            value={manifestPathForDeferral}\n            onClick={selectDirectoryForManifest}\n            title=\"Click to select folder\"\n          />\n        )}\n      </div>\n      <div className={classes.pathSelectionRow}>\n        <Label\n          check\n          for=\"manifestPathRadio\"\n          className={classes.title}\n          style={{ whiteSpace: \"nowrap\" }}\n          onClick={() => handleManifestPathTypeChange(ManifestPathType.REMOTE)}\n        >\n          <Input\n            type=\"radio\"\n            id=\"manifestPathRadio\"\n            checked={manifestPathType === ManifestPathType.REMOTE}\n          />\n          DataPilot dbt Integration\n        </Label>\n        {manifestPathType === ManifestPathType.REMOTE &&\n          projectIntegrations && (\n            <Stack className=\"justify-between\" style={{ width: \"60%\" }}>\n              <Select\n                options={projectIntegrations}\n                className={classes.pathInput}\n                value={projectIntegrations.find(\n                  (i) => i.value === dbtCoreIntegrationId,\n                )}\n                onChange={(newValue) =>\n                  handleIntegrationSelect(\n                    newValue as { label: string; value: number },\n                  )\n                }\n              />\n              <IconButton\n                title=\"Refetch Project Integrations\"\n                onClick={handleRefresh}\n                className={classes.refreshBtn}\n                color=\"outline\"\n                disabled={fetchingProjectIntegrations}\n              >\n                {!fetchingProjectIntegrations ? <RefreshIcon /> : <Spinner />}\n              </IconButton>\n            </Stack>\n          )}\n      </div>\n    </FormGroup>\n  );\n};\n"
  },
  {
    "path": "webview_panels/src/modules/defer/constants.ts",
    "content": "export enum ManifestPathType {\n  EMPTY = \"\",\n  LOCAL = \"local\",\n  REMOTE = \"remote\",\n}\n"
  },
  {
    "path": "webview_panels/src/modules/defer/defer.module.scss",
    "content": ".insights-card {\n  & :global .form-label {\n    white-space: nowrap;\n  }\n  .card-title {\n    & button {\n      float: right;\n      padding: 0;\n      border: none;\n      margin-top: -6px;\n    }\n  }\n\n  .form-switch {\n    padding-left: 0;\n    & :global .form-label {\n      display: flex;\n      width: 100%;\n      justify-content: space-between;\n\n      & input {\n        float: none;\n      }\n    }\n  }\n\n  .path-selection {\n    padding: 16px;\n    border-radius: 10px;\n    background: var(--background--01);\n    gap: 8px;\n    margin-bottom: 20px;\n\n    .title {\n      margin-left: 10px;\n    }\n\n    .path-selection-row {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      gap: 10px;\n    }\n\n    .path-input {\n      max-width: 90%;\n      flex: 1;\n      cursor: pointer;\n    }\n\n    .refresh-btn {\n      :global .codicon {\n        font-size: 1.1rem;\n      }\n      :global .spinner-border {\n        width: 1rem;\n        height: 1rem;\n        margin-top: 0.15rem;\n        border-width: 2px;\n      }\n    }\n  }\n}\n\n.projectSelect {\n  margin-bottom: 20px;\n  min-width: 50vw;\n  :global .altimate-select {\n    margin-top: 6px;\n  }\n}\n"
  },
  {
    "path": "webview_panels/src/modules/defer/types.ts",
    "content": "import { ManifestPathType } from \"./constants\";\n\nexport enum DbtIntegrationMode {\n  CLOUD = \"cloud\",\n  CORE = \"core\",\n}\n\nexport interface DropdownOptions {\n  label: string;\n  value: number;\n}\n\nexport interface DeferToProductionProps {\n  deferToProduction: boolean;\n  favorState: boolean;\n  manifestPathForDeferral?: string;\n  manifestPathType?: ManifestPathType;\n  projectIntegrations: DropdownOptions[];\n  dbtCoreIntegrationId?: number;\n}\n\nexport interface ManifestSelectionProps {\n  fetchingProjectIntegrations: boolean;\n  dbtProjectRoot: string;\n  manifestPathForDeferral?: string;\n  manifestPathType?: ManifestPathType;\n  projectIntegrations: DropdownOptions[];\n  dbtCoreIntegrationId?: number;\n  setDeferState: React.Dispatch<React.SetStateAction<DeferToProductionProps>>;\n  setProjectIntegrations: (clearCache?: boolean) => Promise<void>;\n}\n\nexport interface DbtProject {\n  projectRoot: string;\n  projectName: string;\n}\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/DocumentationEditor.stories.tsx",
    "content": "import { withReactContext } from \"storybook-react-context\";\nimport type { Meta } from \"@storybook/react\";\nimport DocumentationProvider, {\n  DocumentationContext,\n} from \"./DocumentationProvider\";\nimport {\n  DBTDocumentationFactory,\n  DBTDocumentationTestsFactory,\n  TenantUserFactory,\n} from \"@testUtils\";\nimport { faker } from \"@faker-js/faker\";\nimport DocumentationEditor from \"./DocumentationEditor\";\nimport { TeamMateProvider } from \"@lib\";\n// import {\n//   aiLearningsFactory,\n//   coachAiResponseFactory,\n//   delay,\n//   getRandomDelay,\n// } from \"@lib-testUtils\";\nimport { useEffect } from \"react\";\n\nconst meta = {\n  title: \"Documentation Editor\",\n  parameters: {\n    layout: \"padded\",\n  },\n  tags: [\"autodocs\"],\n  argTypes: {\n    backgroundColor: { control: \"color\" },\n  },\n} satisfies Meta;\n\nexport default meta;\n\nexport const DefaultHelpView = {\n  render: (): JSX.Element => {\n    return <DocumentationEditor />;\n  },\n  decorators: [\n    withReactContext({\n      Context: DocumentationContext,\n      initialState: { state: {} },\n    }),\n  ],\n};\n\nconst docsDataForTests = DBTDocumentationFactory.build();\nconst testsDataForTests = docsDataForTests.columns\n  .map((c, i) =>\n    DBTDocumentationTestsFactory.build({\n      column_name: i % 3 === 0 ? undefined : c.name,\n    })\n  )\n  .map((test) => {\n    if (test.test_metadata) {\n      return {\n        ...test,\n        test_metadata: {\n          ...test.test_metadata,\n          kwargs: {\n            ...test.test_metadata.kwargs,\n            column_name: test.column_name,\n          },\n        },\n      };\n    }\n    return test;\n  });\nexport const ModelDocGenView = {\n  render: (): JSX.Element => {\n    useEffect(() => {\n      setTimeout(() => {\n        window.postMessage(\n          {\n            command: \"renderDocumentation\",\n            docs: docsDataForTests,\n            missingDocumentationMessage: \"\",\n            tests: testsDataForTests,\n            project: faker.system.fileName(),\n            collaborationEnabled: true,\n          },\n          \"*\"\n        );\n      }, 100);\n    }, []);\n    return (\n      <TeamMateProvider>\n        <DocumentationProvider />\n      </TeamMateProvider>\n    );\n  },\n  decorators: [],\n  parameters: {\n    vscode: {\n      func: (request: Record<string, unknown>): unknown => {\n        switch (request.command) {\n          case `getTestCode`:\n            return { code: `select * from users` };\n          case `getUsers`:\n            return TenantUserFactory.buildList(5);\n          case \"fetch\":\n            return {};\n            // switch (request.endpoint) {\n              // case `/coach/training`:\n              //   await delay(getRandomDelay());\n              //   if (\n              //     (request.fetchArgs as RequestInit | undefined)?.method ===\n              //     \"POST\"\n              //   ) {\n              //   return coachAiResponseFactory.build();\n              //   }\n              //   return { train_docs: aiLearningsFactory.buildList(5) };\n              // case `/coach/training/confirm`:\n              //   await delay(getRandomDelay());\n              //   return coachAiResponseFactory.build();\n            // }\n        }\n      },\n      timer: 500,\n    },\n  },\n};\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/DocumentationEditor.tsx",
    "content": "import { executeRequestInSync } from \"@modules/app/requestExecutor\";\nimport useAppContext from \"@modules/app/useAppContext\";\nimport CommonActionButtons from \"@modules/commonActionButtons/CommonActionButtons\";\nimport { EntityType } from \"@modules/dataPilot/components/docGen/types\";\nimport { RequestState, RequestTypes } from \"@modules/dataPilot/types\";\nimport { panelLogger } from \"@modules/logger\";\nimport { Stack } from \"@uicore\";\nimport { useMemo } from \"react\";\nimport DocGeneratorColumnsList from \"./components/docGenerator/DocGeneratorColumnsList\";\nimport DocGeneratorInput from \"./components/docGenerator/DocGeneratorInput\";\nimport DocumentationHelpContent from \"./components/help/DocumentationHelpContent\";\nimport SaveDocumentation from \"./components/saveDocumentation/SaveDocumentation\";\nimport EntityWithTests from \"./components/tests/EntityWithTests\";\nimport { updateCurrentDocsData } from \"./state/documentationSlice\";\nimport { DocsGenerateModelRequestV2 } from \"./state/types\";\nimport useDocumentationContext from \"./state/useDocumentationContext\";\nimport classes from \"./styles.module.scss\";\nimport { addDefaultActions } from \"./utils\";\nimport ConversationsRightPanel from \"./components/conversation/ConversationsRightPanel\";\nimport CoachAiIfModified from \"./components/docGenerator/CoachAiIfModified\";\nimport Citations from \"./components/docGenerator/Citations\";\nimport { Citation } from \"@lib\";\nimport BulkGenerateButton from \"./components/docGenerator/BulkGenerateButton\";\nimport { BulkDocumentationPropagationPanel } from \"./components/documentationPropagation/DocumentationPropagation\";\n\nconst DocumentationEditor = (): JSX.Element => {\n  const {\n    state: { currentDocsData, currentDocsTests },\n    dispatch,\n  } = useDocumentationContext();\n  const { postMessageToDataPilot } = useAppContext();\n\n  const modelTests = useMemo(() => {\n    return currentDocsTests?.filter((test) => !test.column_name);\n  }, [currentDocsTests]);\n\n  const onModelDocSubmit = async (data: DocsGenerateModelRequestV2) => {\n    if (!currentDocsData) {\n      return;\n    }\n    const showInDataPilot = !!currentDocsData.description;\n    const id = crypto.randomUUID();\n\n    try {\n      const requestData = {\n        description: data.description,\n        user_instructions: data.user_instructions,\n        columns: currentDocsData.columns,\n        name: currentDocsData.name,\n      };\n      if (showInDataPilot) {\n        postMessageToDataPilot({\n          id,\n          query: `Generate Documentation for “${currentDocsData.name}”`,\n          requestType: RequestTypes.AI_DOC_GENERATION,\n          meta: requestData,\n          response: currentDocsData.description,\n          actions: addDefaultActions(\n            {\n              ...requestData,\n              modelName: currentDocsData.name,\n            },\n            \"generateDocsForModel\",\n          ),\n          state: RequestState.COMPLETED,\n        });\n        return;\n      }\n\n      const result = (await executeRequestInSync(\"generateDocsForModel\", {\n        description: data.description,\n        user_instructions: data.user_instructions,\n        columns: currentDocsData.columns,\n      })) as {\n        column_descriptions?: {\n          column_name: string;\n          column_description: string;\n          column_citations?: { id: string; content: string }[];\n        }[];\n        model_description?: string;\n        model_citations?: Citation[];\n      };\n\n      dispatch(\n        updateCurrentDocsData({\n          name: currentDocsData.name,\n          description: result.model_description,\n          isNewGeneration: true,\n          citations: result.model_citations,\n        }),\n      );\n    } catch (error) {\n      panelLogger.error(\"error while generating doc for model\", error);\n      postMessageToDataPilot({\n        id,\n        response: (error as Error).message,\n        state: RequestState.ERROR,\n      });\n    }\n  };\n\n  if (!currentDocsData) {\n    return (\n      <div className={classes.docGenerator}>\n        <h2>Documentation Help</h2>\n        <DocumentationHelpContent showMissingDocumentationMessage />\n      </div>\n    );\n  }\n\n  return (\n    <div className={`${classes.documentationWrapper} ${classes.limitWidth}`}>\n      <Stack className=\"mb-2 justify-content-between\">\n        <h2>Documentation Editor</h2>\n        <Stack>\n          <SaveDocumentation />\n          <BulkGenerateButton />\n          <CommonActionButtons />\n        </Stack>\n      </Stack>\n      <div className={classes.docGenerator}>\n        <Stack className={classes.bodyWrap}>\n          <Stack direction=\"column\" className={classes.body}>\n            <Stack direction=\"column\">\n              <Stack direction=\"column\" style={{ margin: \"1rem 0 10px 0\" }}>\n                <DocGeneratorInput\n                  entity={currentDocsData}\n                  type={EntityType.MODEL}\n                  onSubmit={onModelDocSubmit}\n                  placeholder=\"Describe your model\"\n                  title={`Model: ${currentDocsData.name}`}\n                  tests={modelTests}\n                />\n                <EntityWithTests\n                  title={currentDocsData.name}\n                  tests={modelTests}\n                  type={EntityType.MODEL}\n                />\n                <Stack>\n                  <Citations citations={currentDocsData.citations} />\n                  <CoachAiIfModified\n                    model={currentDocsData.name}\n                    extra={{ isModelDoc: true }}\n                  />\n                </Stack>\n              </Stack>\n              <DocGeneratorColumnsList />\n            </Stack>\n          </Stack>\n        </Stack>\n      </div>\n      <ConversationsRightPanel />\n      <BulkDocumentationPropagationPanel />\n    </div>\n  );\n};\n\nexport default DocumentationEditor;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/DocumentationProvider.tsx",
    "content": "import {\n  executeRequestInAsync,\n  executeRequestInSync,\n} from \"@modules/app/requestExecutor\";\nimport { IncomingMessageProps } from \"@modules/app/types\";\nimport { panelLogger } from \"@modules/logger\";\nimport {\n  createContext,\n  useCallback,\n  useEffect,\n  useMemo,\n  useReducer,\n  useRef,\n} from \"react\";\nimport documentationSlice, {\n  initialState,\n  setGenerationsHistory,\n  setIncomingDocsData,\n  setInsertedEntityName,\n  setMissingDocumentationMessage,\n  setProject,\n  updatConversations,\n  updateBulkDocsPropRightPanel,\n  updateCollaborationEnabled,\n  updateColumnsAfterSync,\n  updateColumnsInCurrentDocsData,\n  updateConversationsRightPanelState,\n  updateCurrentDocsData,\n  updateCurrentDocsTests,\n  updateSelectedConversationGroup,\n  updateSingleDocsPropRightPanel,\n  updateUserInstructions,\n  setDocBlocks,\n} from \"./state/documentationSlice\";\nimport {\n  DBTDocumentation,\n  DBTModelTest,\n  DocsGenerateUserInstructions,\n  MetadataColumn,\n  DocBlock,\n} from \"./state/types\";\nimport { ContextProps } from \"./types\";\nimport { getGenerationsInModel, isStateDirty } from \"./utils\";\nimport DocumentationEditor from \"./DocumentationEditor\";\nimport { ConversationGroup, DbtDocsShareDetails } from \"@lib\";\nimport { TelemetryEvents } from \"@telemetryEvents\";\nimport { sendTelemetryEvent } from \"./components/telemetry\";\nimport useAppContext from \"@modules/app/useAppContext\";\n\nexport const DocumentationContext = createContext<ContextProps>({\n  state: initialState,\n  dispatch: () => null,\n});\n\ntype IncomingMessageEvent = MessageEvent<\n  IncomingMessageProps & {\n    docs?: DBTDocumentation;\n    tests?: DBTModelTest[];\n    project?: string;\n    columns?: DBTDocumentation[\"columns\"];\n    model?: string;\n    docBlocks?: DocBlock[];\n    name?: string;\n    description?: string;\n    collaborationEnabled?: boolean;\n    missingDocumentationMessage?: {\n      message: string;\n      type: \"error\" | \"warning\";\n    };\n  }\n>;\n\nenum ActionState {\n  CANCEL_STAY = \"Stay\",\n  DISCARD_PROCEED = \"Discard\",\n}\n\nconst DocumentationProvider = (): JSX.Element => {\n  const {\n    state: { isComponentsApiInitialized },\n  } = useAppContext();\n  const [state, dispatch] = useReducer(\n    documentationSlice.reducer,\n    documentationSlice.getInitialState(),\n  );\n  const stateRef = useRef(state);\n\n  const updateFocus = (name?: string) => {\n    dispatch(setInsertedEntityName(name));\n    // reset the name, so re insert will still focus\n    setTimeout(() => {\n      dispatch(setInsertedEntityName(undefined));\n    }, 1000);\n  };\n\n  const handleConversationUpdates = ({\n    shareId,\n    conversationGroups,\n  }: {\n    shareId: DbtDocsShareDetails[\"share_id\"];\n    conversationGroups: ConversationGroup[];\n  }) => {\n    panelLogger.info(\"handleConversationUpdates\", shareId, conversationGroups);\n    dispatch(updatConversations({ [shareId]: conversationGroups }));\n  };\n\n  const handleViewConversation = ({\n    shareId,\n    conversation_group_id,\n  }: {\n    shareId: DbtDocsShareDetails[\"share_id\"];\n    conversation_group_id: ConversationGroup[\"conversation_group_id\"];\n  }) => {\n    panelLogger.info(\"handleViewConversation\", shareId, conversation_group_id);\n    dispatch(updateConversationsRightPanelState(true));\n    dispatch(\n      updateSelectedConversationGroup({\n        shareId,\n        conversationGroupId: conversation_group_id,\n      }),\n    );\n  };\n\n  const renderDocumentation = (event: IncomingMessageEvent) => {\n    dispatch(\n      setIncomingDocsData({\n        docs: event.data.docs,\n        tests: event.data.tests,\n      }),\n    );\n    dispatch(setProject(event.data.project));\n    dispatch(\n      updateCollaborationEnabled(Boolean(event.data.collaborationEnabled)),\n    );\n    dispatch(\n      setMissingDocumentationMessage(event.data.missingDocumentationMessage),\n    );\n    dispatch(setDocBlocks(event.data.docBlocks ?? []));\n  };\n\n  const onMessage = useCallback((event: IncomingMessageEvent) => {\n    const { command, ...params } = event.data;\n    switch (command) {\n      case \"viewConversation\":\n        handleViewConversation(\n          params as unknown as Parameters<typeof handleViewConversation>[\"0\"],\n        );\n        break;\n      case \"conversations:updates\":\n        handleConversationUpdates(\n          params as unknown as Parameters<\n            typeof handleConversationUpdates\n          >[\"0\"],\n        );\n        break;\n      case \"renderDocumentation\": {\n        const {\n          currentDocsData,\n          showBulkDocsPropRightPanel,\n          showSingleDocsPropRightPanel,\n        } = stateRef.current;\n        if (\n          !(\n            isStateDirty(stateRef.current) ||\n            showBulkDocsPropRightPanel ||\n            showSingleDocsPropRightPanel\n          )\n        ) {\n          renderDocumentation(event);\n          break;\n        }\n        executeRequestInSync(\"showWarningMessage\", {\n          infoMessage: `You have unsaved changes in model: ‘${currentDocsData?.name}’. Would you\n          like to discard the changes or remain in the current state?`,\n          items: [ActionState.DISCARD_PROCEED, ActionState.CANCEL_STAY],\n        })\n          .then((action) => {\n            switch (action) {\n              case ActionState.DISCARD_PROCEED: {\n                dispatch(updateCurrentDocsData(event.data.docs));\n                dispatch(updateCurrentDocsTests(event.data.tests));\n                if (showBulkDocsPropRightPanel) {\n                  dispatch(updateBulkDocsPropRightPanel(false));\n                }\n                if (showSingleDocsPropRightPanel) {\n                  dispatch(updateSingleDocsPropRightPanel(false));\n                }\n                renderDocumentation(event);\n                break;\n              }\n              case ActionState.CANCEL_STAY: {\n                break;\n              }\n              default:\n                break;\n            }\n          })\n          .catch((err) => {\n            panelLogger.error(\n              \"error while showing unsaved changes dialog\",\n              err,\n            );\n          });\n        break;\n      }\n      case \"renderColumnsFromMetadataFetch\":\n        if (event.data.columns) {\n          dispatch(\n            updateColumnsAfterSync({\n              columns: event.data.columns,\n            }),\n          );\n        }\n        break;\n      case \"docgen:insert\":\n        panelLogger.info(\"received new doc gen\", event.data);\n        // insert model desc\n        if (params.model) {\n          dispatch(\n            updateCurrentDocsData({\n              description: params.description,\n              name: params.model,\n              isNewGeneration: true,\n            }),\n          );\n          updateFocus(params.model);\n          return;\n        }\n        // insert column desc\n        dispatch(\n          updateColumnsInCurrentDocsData({\n            columns: [params as Partial<MetadataColumn>],\n            isNewGeneration: true,\n          }),\n        );\n        updateFocus((params as Partial<MetadataColumn>).name);\n\n        break;\n      default:\n        break;\n    }\n  }, []);\n\n  const loadGenerationsHistory = (project: string, model: string) => {\n    getGenerationsInModel(project, model)\n      .then((data) => {\n        dispatch(setGenerationsHistory(data));\n      })\n      .catch((err) =>\n        panelLogger.error(\"error while loading generations history\", err),\n      );\n  };\n\n  useEffect(() => {\n    if (!state.project || !state.currentDocsData?.name) {\n      return;\n    }\n\n    const userInstructions = localStorage.getItem(\"userInstructions\");\n    if (userInstructions) {\n      dispatch(\n        updateUserInstructions(\n          JSON.parse(userInstructions) as DocsGenerateUserInstructions,\n        ),\n      );\n    }\n    loadGenerationsHistory(state.project, state.currentDocsData.name);\n  }, [state.project, state.currentDocsData?.name]);\n\n  useEffect(() => {\n    sendTelemetryEvent(TelemetryEvents[\"DocumentationEditor/Load\"]);\n    window.addEventListener(\"message\", onMessage);\n    // Load current editor documentation\n    executeRequestInAsync(\"getCurrentModelDocumentation\", {});\n\n    return () => {\n      window.removeEventListener(\"message\", onMessage);\n    };\n  }, []);\n\n  const values = useMemo(\n    () => ({\n      state,\n      dispatch,\n    }),\n    [state, dispatch],\n  );\n\n  // hack to get latest state in onMessage\n  useEffect(() => {\n    stateRef.current = state;\n  }, [state]);\n\n  if (!isComponentsApiInitialized) {\n    return <div>Loading...</div>;\n  }\n\n  return (\n    <DocumentationContext.Provider value={values}>\n      <DocumentationEditor />\n    </DocumentationContext.Provider>\n  );\n};\n\nexport default DocumentationProvider;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/conversation/AddCoversationButton.tsx",
    "content": "import { CommentIcon } from \"@assets/icons\";\nimport {\n  ConversationGroup,\n  ConversationInputForm,\n  DbtDocsShareDetails,\n} from \"@lib\";\nimport { executeRequestInSync } from \"@modules/app/requestExecutor\";\nimport useAppContext from \"@modules/app/useAppContext\";\nimport { panelLogger } from \"@modules/logger\";\nimport { Drawer, Card, CardBody, Label, Stack, DrawerRef } from \"@uicore\";\nimport { FormEvent, useRef, useState } from \"react\";\nimport classes from \"../../styles.module.scss\";\nimport { EntityType } from \"@modules/dataPilot/components/docGen/types\";\nimport useDocumentationContext from \"@modules/documentationEditor/state/useDocumentationContext\";\nimport {\n  updatConversations,\n  updateConversationsRightPanelState,\n  updateSelectedConversationGroup,\n} from \"@modules/documentationEditor/state/documentationSlice\";\n\ninterface Props {\n  field: \"description\";\n  value: string;\n  name: string;\n  model?: string;\n  type: EntityType;\n}\nconst AddCoversationButton = ({\n  model,\n  value,\n  field,\n  name,\n  type,\n}: Props): JSX.Element | null => {\n  const [comment, setComment] = useState(\"\");\n  const drawerRef = useRef<DrawerRef | null>(null);\n  const [isLoading, setIsLoading] = useState(false);\n  const {\n    state: { users, currentUser },\n  } = useAppContext();\n  const {\n    dispatch,\n    state: { collaborationEnabled },\n  } = useDocumentationContext();\n\n  const handleSubmit = async (e: FormEvent) => {\n    e.preventDefault();\n    setIsLoading(true);\n    panelLogger.info(\"adding conversation\", comment);\n    const result = (await executeRequestInSync(\"createConversation\", {\n      comment: comment.replace(/@\\[(.*?)\\]\\((.*?)\\)/g, \"@$2\"),\n      meta: { field, column: type === EntityType.COLUMN ? name : \"\", value },\n    })) as null | Record<DbtDocsShareDetails[\"share_id\"], ConversationGroup[]>;\n\n    if (drawerRef.current) {\n      drawerRef.current.close();\n    }\n\n    if (result) {\n      dispatch(updatConversations(result));\n      const shareId = Object.keys(result)[0] as unknown as number;\n      dispatch(\n        updateSelectedConversationGroup({\n          shareId,\n          conversationGroupId: result[shareId][0].conversation_group_id,\n        }),\n      );\n      dispatch(updateConversationsRightPanelState(true));\n    }\n    setIsLoading(false);\n    setComment(\"\");\n  };\n\n  if (!collaborationEnabled) {\n    return null;\n  }\n\n  return (\n    <Drawer\n      buttonProps={{ color: \"primary\", title: \"Start conversation\" }}\n      buttonText={<CommentIcon />}\n      title=\"Start conversation\"\n      ref={drawerRef}\n    >\n      <Card className=\"mb-4\">\n        <CardBody>\n          <Stack direction=\"column\">\n            <Stack>\n              <Label className=\"mb-0\">Model:</Label>\n              <div>{model}</div>\n            </Stack>\n            {type === EntityType.COLUMN ? (\n              <Stack>\n                <Label className=\"mb-0\">Column:</Label>\n                <div>{name}</div>\n              </Stack>\n            ) : null}\n            <Stack>\n              <Label className=\"mb-0\">Field:</Label>\n              <div>{field}</div>\n            </Stack>\n          </Stack>\n        </CardBody>\n      </Card>\n      <form onSubmit={handleSubmit} className={classes.conversationInputForm}>\n        <ConversationInputForm\n          comment={comment}\n          setComment={setComment}\n          loading={isLoading}\n          users={Object.values(users)}\n          currentUser={currentUser}\n          placeholder=\"Start a conversation or add others with @\"\n        />\n      </form>\n    </Drawer>\n  );\n};\n\nexport default AddCoversationButton;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/conversation/ConversationsRightPanel.tsx",
    "content": "import useDocumentationContext from \"@modules/documentationEditor/state/useDocumentationContext\";\nimport { Drawer, DrawerRef } from \"@uicore\";\nimport { useEffect, useMemo, useRef } from \"react\";\nimport classes from \"../../styles.module.scss\";\nimport {\n  ConversationGroup,\n  ConversationGroupProvider,\n  ConversationSources,\n  DbtDocsShareDetails,\n} from \"@lib\";\nimport { panelLogger } from \"@modules/logger\";\nimport { executeRequestInAsync } from \"@modules/app/requestExecutor\";\nimport {\n  updateConversationsRightPanelState,\n  updateSelectedConversationGroup,\n} from \"@modules/documentationEditor/state/documentationSlice\";\nimport useAppContext from \"@modules/app/useAppContext\";\n\nconst ConversationsRightPanel = (): JSX.Element => {\n  const {\n    state: {\n      showConversationsRightPanel,\n      conversations: allConversations,\n      selectedConversationGroup,\n      currentDocsData,\n    },\n    dispatch,\n  } = useDocumentationContext();\n  const {\n    state: { currentUser, users },\n  } = useAppContext();\n\n  // Get only conversation groups specific to this model\n  const conversations = useMemo(() => {\n    if (!currentDocsData?.uniqueId) {\n      return {};\n    }\n\n    return Object.entries(allConversations).reduce(\n      (\n        acc: Record<DbtDocsShareDetails[\"share_id\"], ConversationGroup[]>,\n        [shareId, conversationGroups],\n      ) => {\n        // Find conversation groups which are added for this model and has field column\n        const conversationGroupsInCurrentModel = conversationGroups.filter(\n          (conversationGroup) =>\n            conversationGroup.meta.uniqueId === currentDocsData.uniqueId &&\n            conversationGroup.meta.field,\n        );\n\n        // show the share doc only if atleast one conv group is in this model\n        if (conversationGroupsInCurrentModel.length) {\n          acc[shareId as unknown as number] = conversationGroupsInCurrentModel;\n        }\n        return acc;\n      },\n      {},\n    );\n  }, [\n    allConversations,\n    currentDocsData?.uniqueId,\n  ]);\n\n  const drawerRef = useRef<DrawerRef | null>(null);\n\n  const onClose = () => {\n    dispatch(updateConversationsRightPanelState(false));\n  };\n\n  const onResolve = (\n    conversationGroupId: ConversationGroup[\"conversation_group_id\"],\n  ) => {\n    panelLogger.log(\"onResolve\", conversationGroupId);\n    executeRequestInAsync(\"refetchConversations\", {});\n  };\n  const onSelect = (\n    shareId: DbtDocsShareDetails[\"share_id\"],\n    conversationGroupId: ConversationGroup[\"conversation_group_id\"],\n  ) => {\n    dispatch(updateSelectedConversationGroup({ conversationGroupId, shareId }));\n  };\n\n  const onReplyAdd = (\n    conversationGroupId: ConversationGroup[\"conversation_group_id\"],\n  ) => {\n    panelLogger.log(\"onReplyAdd\", conversationGroupId);\n    executeRequestInAsync(\"refetchConversations\", {});\n  };\n\n  useEffect(() => {\n    if (!drawerRef.current) {\n      return;\n    }\n\n    if (showConversationsRightPanel) {\n      drawerRef.current.open();\n      return;\n    }\n    drawerRef.current.close();\n  }, [showConversationsRightPanel]);\n\n  return (\n    <Drawer ref={drawerRef} onClose={onClose}>\n      <div className={classes.conversationsList}>\n        {Object.keys(conversations).length ? (\n          Object.entries(conversations).map(([shareId, conversationGroups]) =>\n            conversationGroups.map((conversationGroup) => (\n              <ConversationGroupProvider\n                key={conversationGroup.conversation_group_id}\n                conversationGroup={conversationGroup}\n                shareId={shareId as unknown as number}\n                isSelected={\n                  selectedConversationGroup?.conversationGroupId ===\n                  conversationGroup.conversation_group_id\n                }\n                currentUser={currentUser ?? undefined}\n                onResolve={() =>\n                  onResolve(conversationGroup.conversation_group_id)\n                }\n                onSelect={() =>\n                  onSelect(\n                    shareId as unknown as number,\n                    conversationGroup.conversation_group_id,\n                  )\n                }\n                users={users}\n                onReplyAdd={() =>\n                  onReplyAdd(conversationGroup.conversation_group_id)\n                }\n                source={ConversationSources.DOCUMENTATION_EDITOR}\n              />\n            )),\n          )\n        ) : (\n          <div>No conversations yet!</div>\n        )}\n      </div>\n    </Drawer>\n  );\n};\n\nexport default ConversationsRightPanel;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/conversation/ShowConversationsButton.tsx",
    "content": "import { CommentIcon } from \"@assets/icons\";\nimport { updateConversationsRightPanelState } from \"@modules/documentationEditor/state/documentationSlice\";\nimport useDocumentationContext from \"@modules/documentationEditor/state/useDocumentationContext\";\nimport { Button } from \"@uicore\";\n\nconst ShowConversationsButton = ({\n  onClose,\n}: {\n  onClose: () => void;\n}): JSX.Element => {\n  const { dispatch } = useDocumentationContext();\n  const handleClick = () => {\n    onClose();\n    dispatch(updateConversationsRightPanelState(true));\n  };\n  return (\n    <Button outline onClick={handleClick}>\n      <CommentIcon /> Show Conversations\n    </Button>\n  );\n};\n\nexport default ShowConversationsButton;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/docGenerator/BulkGenerateButton.tsx",
    "content": "import { ShinesIcon } from \"@assets/icons\";\nimport {\n  executeRequestInAsync,\n  executeRequestInSync,\n} from \"@modules/app/requestExecutor\";\nimport {\n  updateBulkDocsPropRightPanel,\n  updateColumnsInCurrentDocsData,\n} from \"@modules/documentationEditor/state/documentationSlice\";\nimport { DBTDocumentationColumn } from \"@modules/documentationEditor/state/types\";\nimport useDocumentationContext from \"@modules/documentationEditor/state/useDocumentationContext\";\nimport { panelLogger } from \"@modules/logger\";\nimport { Button, DropdownButton, List, PopoverWithButton } from \"@uicore\";\nimport { useRef, useState } from \"react\";\nimport classes from \"../../styles.module.scss\";\nimport {\n  isStateDirty,\n  mergeCurrentAndIncomingDocumentationColumns,\n} from \"@modules/documentationEditor/utils\";\nimport DocGenSelectedColumns from \"./DocGenSelectedColumns\";\nimport { noop } from \"antd/es/_util/warning\";\n\nenum SidePanelState {\n  DOCUMENTATION_SELECTED = \"documentationSelected\",\n}\n\nconst BulkGenerateButton = (): JSX.Element => {\n  const [sidePanelState, setSidePanelState] = useState<\n    SidePanelState | undefined\n  >();\n  const ref = useRef<HTMLDivElement | null>(null);\n  const { state, dispatch } = useDocumentationContext();\n  const { currentDocsData, userInstructions } = state;\n\n  const resetSidepanelState = () => {\n    setSidePanelState(undefined);\n  };\n\n  const options = {\n    Documentation: [\n      { label: \"Generate all columns\", value: \"all\" },\n      { label: \"Generate only missing columns\", value: \"missing\" },\n      { label: \"Select columns\", value: \"selected\" },\n      { label: \"Propagate to downstream models\", value: \"docs-prop\" },\n    ],\n    Tests: [{ label: \"Generate all\", value: \"all-tests\" }],\n  };\n\n  const bulkGenerateDocs = async (\n    columns: DBTDocumentationColumn[],\n    isAll: boolean,\n  ) => {\n    const result = (await executeRequestInSync(\"generateDocsForColumn\", {\n      description: \"\",\n      user_instructions: userInstructions,\n      columnNames: columns.map((c) => c.name),\n      columns: currentDocsData?.columns,\n      isAll,\n      isBulkGen: true,\n    })) as { columns: Partial<DBTDocumentationColumn>[] };\n\n    dispatch(\n      updateColumnsInCurrentDocsData({\n        columns: result.columns,\n        isNewGeneration: true,\n      }),\n    );\n\n    return columns;\n  };\n  const generateDocsForMissingColumns = async () => {\n    try {\n      const { columns: columnsFromDB } = (await executeRequestInSync(\n        \"fetchMetadataFromDatabase\",\n        {},\n      )) as { columns: DBTDocumentationColumn[] };\n\n      const mergedColumns = mergeCurrentAndIncomingDocumentationColumns(\n        currentDocsData?.columns,\n        columnsFromDB,\n      );\n\n      const columnsWithoutDescription = mergedColumns.filter(\n        (column) => !column.description,\n      );\n      return await bulkGenerateDocs(columnsWithoutDescription, false);\n    } catch (err) {\n      panelLogger.error(\"Unable to generate docs for missing columns\");\n    }\n  };\n  const generateTestsForAllColumns = async () => {\n    try {\n      const { columns } = (await executeRequestInSync(\n        \"fetchMetadataFromDatabase\",\n        {},\n      )) as { columns: DBTDocumentationColumn[] };\n\n      executeRequestInAsync(\"generateTestsForColumns\", {\n        columns,\n      });\n    } catch (err) {\n      panelLogger.error(\"Unable to generate tests for all columns\");\n    }\n  };\n\n  const generateForAll = async () => {\n    try {\n      const { columns } = (await executeRequestInSync(\n        \"fetchMetadataFromDatabase\",\n        {},\n      )) as { columns: DBTDocumentationColumn[] };\n\n      return await bulkGenerateDocs(columns, true);\n    } catch (err) {\n      panelLogger.error(\"Unable to generate docs for all columns\");\n    }\n  };\n\n  const sendTelemetryEvent = (\n    type: string,\n    columns?: DBTDocumentationColumn[],\n    startTime?: number,\n  ) => {\n    const timeTaken = startTime ? Date.now() - startTime : undefined;\n    executeRequestInAsync(\"sendTelemetryEvent\", {\n      eventName: `generate-${type}-columns`,\n      properties: {\n        model: currentDocsData?.name,\n        columns: columns?.map((c) => c.name),\n      },\n      measurements: { timeTaken },\n    });\n  };\n\n  const onOptionSelect = async (value: string) => {\n    const startTime = Date.now();\n    sendTelemetryEvent(value);\n\n    try {\n      switch (value) {\n        case \"selected\":\n          setSidePanelState(SidePanelState.DOCUMENTATION_SELECTED);\n          return;\n        case \"all\": {\n          const columns = await generateForAll();\n          if (columns) {\n            sendTelemetryEvent(value, columns, startTime);\n          }\n          break;\n        }\n        case \"all-tests\": {\n          await generateTestsForAllColumns();\n          break;\n        }\n        case \"missing\": {\n          const columns = await generateDocsForMissingColumns();\n          if (columns) {\n            sendTelemetryEvent(value, columns, startTime);\n          }\n          break;\n        }\n        case \"docs-prop\": {\n          dispatch(updateBulkDocsPropRightPanel(true));\n          break;\n        }\n        default:\n          return;\n      }\n    } catch (err) {\n      panelLogger.error(\"error generating for columns\", value, err);\n    }\n  };\n\n  const isDirty = isStateDirty(state);\n  const color = isDirty ? \"secondary\" : \"primary\";\n\n  return (\n    <>\n      <div ref={ref}>\n        <PopoverWithButton\n          width=\"auto\"\n          button={\n            <DropdownButton\n              onToggleClick={noop}\n              onClick={noop}\n              color={color}\n              outline={isDirty}\n            >\n              <ShinesIcon /> Bulk actions\n            </DropdownButton>\n          }\n          popoverProps={{\n            placement: \"bottom\",\n            hideArrow: true,\n            className: classes.bulkGenPopover,\n          }}\n        >\n          {({ styles, close }) => (\n            <div className={classes.popover}>\n              <div className={styles.popoverActions}>\n                <List>\n                  {Object.entries(options).map(([key, actions]) => (\n                    <>\n                      <li className={classes.sectionTitle}>{key}</li>\n                      {actions.map((option) => (\n                        <li key={option.label}>\n                          <Button\n                            color=\"secondary\"\n                            onClick={() => {\n                              close();\n                              void onOptionSelect(option.value);\n                            }}\n                          >\n                            {option.label}\n                          </Button>\n                        </li>\n                      ))}\n                    </>\n                  ))}\n                </List>\n              </div>\n            </div>\n          )}\n        </PopoverWithButton>\n      </div>\n      {sidePanelState === SidePanelState.DOCUMENTATION_SELECTED ? (\n        <DocGenSelectedColumns\n          onClose={resetSidepanelState}\n          generateForColumns={bulkGenerateDocs}\n        />\n      ) : null}\n    </>\n  );\n};\n\nexport default BulkGenerateButton;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/docGenerator/Citations.tsx",
    "content": "import { Citation, Citations } from \"@lib\";\nimport useAppContext from \"@modules/app/useAppContext\";\nimport { Stack } from \"@uicore\";\nimport classes from \"./coachAi.module.scss\";\n\nconst CitationsList = ({\n  citations,\n}: {\n  citations?: Citation[];\n}): JSX.Element | null => {\n  const {\n    state: {\n      tenantInfo: { frontendUrl, teammatesEnabled: isEnabledInTenant },\n    },\n  } = useAppContext();\n\n  if (!isEnabledInTenant) {\n    return null;\n  }\n  return (\n    <Stack className={classes.citations}>\n      <Citations citations={citations} frontendUrl={frontendUrl ?? \"\"} />\n    </Stack>\n  );\n};\n\nexport default CitationsList;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/docGenerator/CoachAi.tsx",
    "content": "import { CoachAIIcon } from \"@assets/icons\";\nimport { CoachForm, TeammateActions, useTeamMateContext } from \"@lib\";\nimport useAppContext from \"@modules/app/useAppContext\";\nimport { Drawer, DrawerRef } from \"@uicore\";\nimport { useRef } from \"react\";\nimport classes from \"./coachAi.module.scss\";\n\nconst CoachAi = ({\n  context,\n  extra,\n}: {\n  context?: Record<string, unknown>;\n  extra?: Record<string, unknown>;\n}): JSX.Element | null => {\n  const drawerRef = useRef<DrawerRef>(null);\n  const { dispatch } = useTeamMateContext();\n  const {\n    state: { tenantInfo },\n  } = useAppContext();\n\n  const onOpen = () => {\n    dispatch(TeammateActions.setShowCoachingForm(true));\n  };\n\n  if (!tenantInfo.teammatesEnabled) {\n    return null;\n  }\n\n  return (\n    <Drawer\n      buttonProps={{ outline: true }}\n      buttonText=\" \"\n      icon={<CoachAIIcon style={{ height: 16, width: 16 }} />}\n      title={\n        <>\n          <CoachAIIcon className={classes.coachAiIcon} /> Coach AI\n        </>\n      }\n      onOpen={onOpen}\n      ref={drawerRef}\n    >\n      <CoachForm\n        taskLabel=\"DocGen\"\n        context={context}\n        onClose={() => drawerRef.current?.close()}\n        extra={extra}\n      />\n    </Drawer>\n  );\n};\n\nexport default CoachAi;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/docGenerator/CoachAiIfModified.tsx",
    "content": "import useDocumentationContext from \"@modules/documentationEditor/state/useDocumentationContext\";\nimport CoachAi from \"@modules/documentationEditor/components/docGenerator/CoachAi\";\nimport useAppContext from \"@modules/app/useAppContext\";\nimport classes from \"./coachAi.module.scss\";\n\nconst CoachAiIfModified = ({\n  column,\n  model,\n  extra,\n}: {\n  column?: string;\n  model?: string;\n  extra?: Record<string, unknown>;\n}): JSX.Element | null => {\n  const {\n    state: {\n      docUpdatedForColumns,\n      currentDocsData,\n      docUpdatedForModel,\n      project,\n    },\n  } = useDocumentationContext();\n  const {\n    state: { tenantInfo },\n  } = useAppContext();\n\n  if (!tenantInfo.teammatesEnabled) {\n    return null;\n  }\n\n  if (column && !docUpdatedForColumns.includes(column)) {\n    return null;\n  }\n\n  if (model && docUpdatedForModel !== model) {\n    return null;\n  }\n\n  return (\n    <div className={classes.coachAi}>\n      Do you want to coach datapilot? Click here{\" \"}\n      <CoachAi\n        context={{ column, model: model ?? currentDocsData?.name, project }}\n        extra={extra}\n      />\n    </div>\n  );\n};\n\nexport default CoachAiIfModified;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/docGenerator/DocBlockInserter.module.scss",
    "content": ".docBlockItem {\n  padding: 8px 12px;\n  cursor: pointer;\n  border-radius: 4px;\n  margin-bottom: 4px;\n  border: 1px solid transparent;\n  transition: background-color 0.15s ease, border-color 0.15s ease;\n\n  &:hover {\n    background-color: var(--background--01);\n    border-color: var(--background--02);\n  }\n}\n\n.popoverContent {\n  min-width: 320px;\n  padding: 8px;\n}\n\n.searchContainer {\n  margin-bottom: 12px;\n}\n\n.itemsList {\n  max-height: 240px;\n  overflow-y: auto;\n}\n\n.itemContent {\n  gap: 2px;\n}\n\n.itemName {\n  font-size: 14px;\n}\n\n.emptyState {\n  padding: 16px;\n}"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/docGenerator/DocBlockInserter.tsx",
    "content": "import { PopoverWithButton, Stack, Button, Input } from \"@uicore\";\nimport { RefObject, useState, useMemo } from \"react\";\nimport useDocumentationContext from \"@modules/documentationEditor/state/useDocumentationContext\";\nimport { DocBlock } from \"@modules/documentationEditor/state/types\";\nimport { HTMLAttributes } from \"react\";\nimport { SearchIcon } from \"@assets/icons\";\nimport documentationStyles from \"../../styles.module.scss\";\nimport styles from \"./DocBlockInserter.module.scss\";\nimport NewFeatureIndicator from \"@modules/newFeature/NewFeatureIndicator\";\n\nconst DocBlockIcon = (props: HTMLAttributes<HTMLElement>): JSX.Element => (\n  <i className={`codicon codicon-book`} {...props} />\n);\n\ninterface Props {\n  inputRef: RefObject<HTMLInputElement | HTMLTextAreaElement>;\n  onInsert: (docRef: string) => void;\n}\n\nconst DocBlockInserter = ({\n  inputRef,\n  onInsert,\n}: Props): JSX.Element | null => {\n  const {\n    state: { docBlocks },\n  } = useDocumentationContext();\n  const [searchTerm, setSearchTerm] = useState(\"\");\n\n  const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n    setSearchTerm(e.target.value);\n  };\n\n  const filteredDocBlocks = useMemo(() => {\n    if (!searchTerm.trim()) {\n      return docBlocks;\n    }\n    return docBlocks.filter(\n      (docBlock) =>\n        docBlock.name.toLowerCase().includes(searchTerm.toLowerCase()) ||\n        docBlock.path.toLowerCase().includes(searchTerm.toLowerCase())\n    );\n  }, [docBlocks, searchTerm]);\n\n  if (!docBlocks.length) {\n    return null;\n  }\n\n  const handleInsertDocBlock = (docBlock: DocBlock, close: () => void) => {\n    const docRef = `{{ doc('${docBlock.name}') }}`;\n    onInsert(docRef);\n    close();\n\n    // Focus back to the input after insertion\n    setTimeout(() => {\n      inputRef.current?.focus();\n    }, 100);\n  };\n\n  return (\n    <NewFeatureIndicator featureKey=\"docBlockInserter\">\n      <PopoverWithButton\n        button={\n          <Button \n            color=\"primary\" \n            title=\"Insert doc block reference\"\n            data-testid=\"doc-block-inserter\"\n          >\n            <DocBlockIcon />\n          </Button>\n        }\n        title=\"Insert Doc Block Reference\"\n      >\n      {({ close }) => (\n        <Stack direction=\"column\" className={styles.popoverContent}>\n          <Stack className={`${documentationStyles.search} ${styles.searchContainer}`}>\n            <SearchIcon />\n            <Input\n              placeholder=\"Search doc blocks...\"\n              value={searchTerm}\n              onChange={handleSearchChange}\n              type=\"search\"\n            />\n          </Stack>\n          <div className={styles.itemsList}>\n            {filteredDocBlocks.length > 0 ? (\n              filteredDocBlocks.map((docBlock) => (\n                <div\n                  key={docBlock.name}\n                  className={styles.docBlockItem}\n                  onClick={() => handleInsertDocBlock(docBlock, close)}\n                >\n                  <Stack direction=\"column\" className={`align-items-start ${styles.itemContent}`}>\n                    <strong className={styles.itemName}>{docBlock.name}</strong>\n                  </Stack>\n                </div>\n              ))\n            ) : (\n              <div className={`text-muted text-center ${styles.emptyState}`}>\n                No doc blocks found matching &quot;{searchTerm}&quot;\n              </div>\n            )}\n          </div>\n        </Stack>\n      )}\n      </PopoverWithButton>\n    </NewFeatureIndicator>\n  );\n};\n\nexport default DocBlockInserter;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/docGenerator/DocGenSelectedColumns.tsx",
    "content": "import { DocsIcon, SearchIcon } from \"@assets/icons\";\nimport { DBTDocumentationColumn } from \"@modules/documentationEditor/state/types\";\nimport useDocumentationContext from \"@modules/documentationEditor/state/useDocumentationContext\";\nimport {\n  Button,\n  Drawer,\n  DrawerRef,\n  Input,\n  List,\n  ListGroupItem,\n  LoadingButton,\n  Stack,\n  Tooltip,\n} from \"@uicore\";\nimport { ChangeEvent, useEffect, useMemo, useRef, useState } from \"react\";\nimport classes from \"../../styles.module.scss\";\nimport { panelLogger } from \"@modules/logger\";\n\ninterface Props {\n  onClose: () => void;\n  generateForColumns: (\n    columns: DBTDocumentationColumn[],\n    isAll: boolean,\n  ) => Promise<DBTDocumentationColumn[]>;\n}\n\n/**\n * Component to handle multiple column selections for bulk documentation generation\n * User can select all columns, documented columns or missing columns\n */\nconst DocGenSelectedColumns = ({\n  onClose,\n  generateForColumns,\n}: Props): JSX.Element => {\n  const drawerRef = useRef<DrawerRef | null>(null);\n  const [isGenerating, setIsGenerating] = useState(false);\n  const [searchQuery, setsearchQuery] = useState(\"\");\n  const [selectedColumns, setSelectedColumns] = useState<string[]>([]);\n  const {\n    state: { currentDocsData },\n  } = useDocumentationContext();\n\n  useEffect(() => {\n    drawerRef.current?.open();\n  }, []);\n\n  const filteredColumns = useMemo(() => {\n    if (!currentDocsData?.columns) return [];\n    if (!searchQuery) return currentDocsData.columns;\n    return currentDocsData.columns.filter((column) =>\n      column.name.toLowerCase().includes(searchQuery.toLowerCase()),\n    );\n  }, [searchQuery, currentDocsData?.columns]);\n\n  const handleGenerate = async () => {\n    const columns = currentDocsData?.columns.filter((column) =>\n      selectedColumns.includes(column.name),\n    );\n    if (!columns) return;\n    setIsGenerating(true);\n    try {\n      await generateForColumns(columns, false);\n      drawerRef.current?.close();\n      onClose();\n    } catch (error) {\n      panelLogger.error(\"error while generating documentation\", error);\n    } finally {\n      setIsGenerating(false);\n    }\n  };\n\n  const handleFilterChange = (e: ChangeEvent<HTMLInputElement>) => {\n    setsearchQuery(e.target.value);\n  };\n\n  const handleSelectColumns = (type: \"all\" | \"documented\" | \"missing\") => {\n    switch (type) {\n      case \"all\":\n        setSelectedColumns(filteredColumns.map((column) => column.name));\n        break;\n      case \"documented\":\n        setSelectedColumns(\n          filteredColumns\n            .filter((column) => Boolean(column.description))\n            .map((column) => column.name),\n        );\n        break;\n      case \"missing\":\n        setSelectedColumns(\n          filteredColumns\n            .filter((column) => !column.description)\n            .map((column) => column.name),\n        );\n        break;\n      default:\n        break;\n    }\n  };\n\n  const handleSelectedColumns = (e: ChangeEvent<HTMLInputElement>) => {\n    const { value } = e.target;\n    if (selectedColumns.includes(value)) {\n      setSelectedColumns(selectedColumns.filter((column) => column !== value));\n    } else {\n      setSelectedColumns([...selectedColumns, value]);\n    }\n  };\n\n  return (\n    <Drawer ref={drawerRef} onClose={onClose}>\n      <Stack direction=\"column\" className=\"h-100\">\n        <Stack className=\"justify-content-between\">\n          Generate documentation{\" \"}\n          <LoadingButton\n            disabled={selectedColumns.length === 0}\n            loading={isGenerating}\n            color=\"primary\"\n            onClick={handleGenerate}\n          >\n            Generate{\" \"}\n            {selectedColumns.length ? `(${selectedColumns.length})` : \"\"}\n          </LoadingButton>\n        </Stack>\n        <Stack className={classes.search}>\n          <SearchIcon />\n          <Input placeholder=\"Search columns\" onChange={handleFilterChange} />\n        </Stack>\n        <div></div>\n        <Stack>\n          <Button onClick={() => handleSelectColumns(\"all\")}>Select All</Button>\n          <Button\n            color=\"success\"\n            onClick={() => handleSelectColumns(\"documented\")}\n          >\n            <DocsIcon className={classes.docsIconInBtn} /> Documented\n          </Button>\n          <Button\n            color=\"warning\"\n            onClick={() => handleSelectColumns(\"missing\")}\n          >\n            Missing\n          </Button>\n        </Stack>\n        <Stack className=\"overflow-auto\">\n          <List className=\"m-0 p-0\">\n            {filteredColumns.map((column) => (\n              <ListGroupItem\n                key={`${column.name}-${column.type}`}\n                tag={\"label\"}\n                className=\"mb-1\"\n              >\n                <Stack>\n                  <Input\n                    type=\"checkbox\"\n                    value={column.name}\n                    checked={selectedColumns.includes(column.name)}\n                    onChange={handleSelectedColumns}\n                  />\n                  {column.name}\n                  {column.description ? (\n                    <Tooltip title=\"Documented\" placement=\"top\">\n                      <DocsIcon className={classes.docsIcon} />\n                    </Tooltip>\n                  ) : null}\n                </Stack>\n              </ListGroupItem>\n            ))}\n          </List>\n        </Stack>{\" \"}\n      </Stack>\n    </Drawer>\n  );\n};\n\nexport default DocGenSelectedColumns;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/docGenerator/DocGeneratorColumn.tsx",
    "content": "import { executeRequestInSync } from \"@modules/app/requestExecutor\";\nimport { updateColumnsInCurrentDocsData } from \"@modules/documentationEditor/state/documentationSlice\";\nimport {\n  DocsGenerateModelRequestV2,\n  DBTDocumentationColumn,\n  DBTModelTest,\n} from \"@modules/documentationEditor/state/types\";\nimport useDocumentationContext from \"@modules/documentationEditor/state/useDocumentationContext\";\nimport {\n  addDefaultActions,\n  addDocGeneration,\n} from \"@modules/documentationEditor/utils\";\nimport DocGeneratorInput from \"./DocGeneratorInput\";\nimport useAppContext from \"@modules/app/useAppContext\";\nimport { RequestState, RequestTypes } from \"@modules/dataPilot/types\";\nimport { panelLogger } from \"@modules/logger\";\nimport { EntityType } from \"@modules/dataPilot/components/docGen/types\";\nimport EntityWithTests from \"../tests/EntityWithTests\";\nimport CoachAiIfModified from \"./CoachAiIfModified\";\nimport Citations from \"./Citations\";\nimport { Stack } from \"@uicore\";\n\ninterface Props {\n  column: DBTDocumentationColumn;\n  tests: DBTModelTest[];\n}\nconst DocGeneratorColumn = ({ column, tests }: Props): JSX.Element => {\n  const {\n    state: { currentDocsData, project },\n    dispatch,\n  } = useDocumentationContext();\n\n  const { postMessageToDataPilot } = useAppContext();\n  const handleColumnSubmit = async (data: DocsGenerateModelRequestV2) => {\n    if (!currentDocsData || !project) {\n      return;\n    }\n\n    const showInDataPilot = !!column.description;\n    const id = crypto.randomUUID();\n\n    try {\n      const requestData = {\n        description: data.description,\n        user_instructions: data.user_instructions,\n        columnName: column.name,\n        columns: currentDocsData?.columns,\n      };\n      // Show only in datapilot\n      if (showInDataPilot) {\n        postMessageToDataPilot({\n          id,\n          query: `Generate Documentation for “${column.name}” using settings`,\n          requestType: RequestTypes.AI_DOC_GENERATION,\n          state: RequestState.COMPLETED,\n          meta: requestData,\n          response: column.description,\n          actions: addDefaultActions(\n            {\n              ...requestData,\n              modelName: currentDocsData.name,\n            },\n            \"generateDocsForColumn\",\n          ),\n        });\n        return;\n      }\n      const result = (await executeRequestInSync(\n        \"generateDocsForColumn\",\n        requestData,\n      )) as { columns: Partial<DBTDocumentationColumn>[] };\n      dispatch(\n        updateColumnsInCurrentDocsData({ ...result, isNewGeneration: true }),\n      );\n\n      await addDocGeneration(\n        project,\n        currentDocsData.name,\n        (result as { columns: Partial<DBTDocumentationColumn>[] }).columns[0],\n      );\n    } catch (error) {\n      panelLogger.error(\"error while generating doc for column\", error);\n      postMessageToDataPilot({\n        id,\n        response: (error as Error).message,\n        state: RequestState.ERROR,\n      });\n    }\n  };\n  return (\n    <div>\n      <DocGeneratorInput\n        onSubmit={handleColumnSubmit}\n        placeholder={`Describe ${column.name}`}\n        type={EntityType.COLUMN}\n        entity={column}\n        title={column.name}\n        tests={tests}\n      />\n      <EntityWithTests\n        title={column.name}\n        tests={tests}\n        type={EntityType.COLUMN}\n      />\n      <Stack className=\"mt-2\">\n        <Citations citations={column.citations} />\n        <CoachAiIfModified column={column.name} />\n      </Stack>\n    </div>\n  );\n};\n\nexport default DocGeneratorColumn;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/docGenerator/DocGeneratorColumnsList.tsx",
    "content": "import useDocumentationContext from \"@modules/documentationEditor/state/useDocumentationContext\";\nimport { Alert, Stack } from \"@uicore\";\nimport DocGeneratorColumn from \"./DocGeneratorColumn\";\nimport classes from \"../../styles.module.scss\";\nimport SyncWithDatabase from \"./SyncWithDatabase\";\nimport { useMemo } from \"react\";\nimport { DBTModelTest } from \"@modules/documentationEditor/state/types\";\nimport SearchColumnsInput from \"../search/SearchColumnsInput\";\n\nconst DocGeneratorColumnsList = (): JSX.Element => {\n  const {\n    state: { currentDocsData, currentDocsTests, searchQuery },\n  } = useDocumentationContext();\n\n  const testsPerColumns = useMemo(() => {\n    return (\n      currentDocsTests?.reduce(\n        (acc: Record<string, DBTModelTest[]>, columnTest) => {\n          if (!columnTest.column_name) {\n            return acc;\n          }\n          acc[columnTest.column_name] = acc[columnTest.column_name] ?? [];\n          return {\n            ...acc,\n            [columnTest.column_name]: [\n              ...acc[columnTest.column_name],\n              columnTest,\n            ],\n          };\n        },\n        {},\n      ) ?? {}\n    );\n  }, [currentDocsTests]);\n\n  const filteredColumns = useMemo(() => {\n    if (!currentDocsData?.columns) return [];\n    if (!searchQuery) return currentDocsData.columns;\n    return currentDocsData.columns.filter((column) =>\n      column.name.toLowerCase().includes(searchQuery.toLowerCase()),\n    );\n  }, [currentDocsData?.columns, searchQuery]);\n\n  return (\n    <div>\n      <div style={{ marginBottom: 40 }}>\n        <Stack className={classes.columnHeader}>\n          <Stack>\n            <h3>Columns</h3>\n            <SyncWithDatabase />\n          </Stack>\n          <SearchColumnsInput />\n        </Stack>\n        <Alert color=\"warning\">\n          Note: If you don’t want to override existing documentation, please\n          (re)generate documentation at the individual column level below\n        </Alert>\n      </div>\n      {!currentDocsData?.columns ? (\n        <Stack>\n          No columns found in the dbt manifest for {currentDocsData?.name}.\n        </Stack>\n      ) : null}\n      <Stack direction=\"column\" className={classes.columns}>\n        {filteredColumns.map((column) => (\n          <DocGeneratorColumn\n            key={`${column.name}-${column.type}`}\n            column={column}\n            tests={testsPerColumns[column.name]}\n          />\n        ))}\n      </Stack>\n    </div>\n  );\n};\n\nexport default DocGeneratorColumnsList;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/docGenerator/DocGeneratorInput.tsx",
    "content": "import {\n  DBTDocumentation,\n  DBTDocumentationColumn,\n  DBTModelTest,\n  DocsGenerateModelRequestV2,\n} from \"@modules/documentationEditor/state/types\";\nimport useDocumentationContext from \"@modules/documentationEditor/state/useDocumentationContext\";\nimport { Input, InputGroup, Stack, Tag } from \"@uicore\";\nimport {\n  ChangeEvent,\n  useCallback,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from \"react\";\nimport GenerateButton, { Variants } from \"./GenerateButton\";\nimport classes from \"./docGenInput.module.scss\";\nimport {\n  updateColumnsInCurrentDocsData,\n  updateCurrentDocsData,\n} from \"@modules/documentationEditor/state/documentationSlice\";\nimport { EntityType } from \"@modules/dataPilot/components/docGen/types\";\nimport { executeRequestInSync } from \"@modules/app/requestExecutor\";\nimport AddCoversationButton from \"../conversation/AddCoversationButton\";\nimport { panelLogger } from \"@modules/logger\";\nimport { DocumentationPropagationButton } from \"../documentationPropagation/DocumentationPropagation\";\nimport { isArrayEqual } from \"@modules/documentationEditor/utils\";\nimport DocBlockInserter from \"./DocBlockInserter\";\n\ninterface Props {\n  entity: DBTDocumentationColumn | DBTDocumentation;\n  onSubmit: (data: DocsGenerateModelRequestV2) => void;\n  placeholder?: string;\n  type: EntityType;\n  title: string;\n  tests?: DBTModelTest[];\n}\nconst DocGeneratorInput = ({\n  onSubmit,\n  entity,\n  placeholder,\n  type,\n  title,\n  tests,\n}: Props): JSX.Element => {\n  const stackRef = useRef<HTMLDivElement | null>(null);\n  const {\n    state: {\n      userInstructions,\n      incomingDocsData,\n      currentDocsData,\n      insertedEntityName,\n      selectedConversationGroup,\n      conversations,\n    },\n    dispatch,\n  } = useDocumentationContext();\n  const [description, setDescription] = useState(\"\");\n  const inputRef = useRef<HTMLInputElement | HTMLTextAreaElement | null>(null);\n  const [inputRows, setInputRows] = useState(1);\n\n  useEffect(() => {\n    if (!inputRef.current) {\n      return;\n    }\n    let fontSize = 13; // default font size\n    try {\n      fontSize = parseFloat(window.getComputedStyle(inputRef.current).fontSize);\n    } catch (e) {\n      panelLogger.error(\"Error parsing font size\", e);\n    }\n    // generally character width is 0.5 of font size\n    const charWidth = fontSize * 0.5;\n    const newLines = (description.match(/\\n/g) ?? []).length;\n    const rows =\n      Math.ceil(\n        ((description.length - newLines) * charWidth) /\n          inputRef.current.clientWidth,\n      ) + newLines;\n    setInputRows(rows);\n  }, [description]);\n\n  const selectedConversationGroupData = useMemo(() => {\n    if (!selectedConversationGroup) {\n      return undefined;\n    }\n\n    return conversations[selectedConversationGroup.shareId]?.find(\n      (c) =>\n        c.conversation_group_id ===\n        selectedConversationGroup.conversationGroupId,\n    );\n  }, [conversations, selectedConversationGroup]);\n\n  useEffect(() => {\n    if (!selectedConversationGroupData || !stackRef.current) {\n      return;\n    }\n    const {\n      meta: { field, column },\n    } = selectedConversationGroupData;\n\n    if (field === \"description\") {\n      const isMatchingEntity = column\n        ? entity.name === column\n        : type === EntityType.MODEL;\n      if (isMatchingEntity) {\n        panelLogger.log(\"scrolling\");\n        setTimeout(() => {\n          stackRef.current?.scrollIntoView({\n            behavior: \"smooth\",\n            block: \"center\",\n          });\n        }, 500);\n      }\n    }\n  }, [selectedConversationGroup]);\n\n  useEffect(() => {\n    setDescription(entity.description ?? \"\");\n  }, [entity.description]);\n\n  useEffect(() => {\n    if (!insertedEntityName || !inputRef.current) {\n      return;\n    }\n\n    if (insertedEntityName === entity.name) {\n      setTimeout(() => {\n        inputRef.current?.focus();\n      }, 100);\n    }\n  }, [insertedEntityName, entity.name]);\n\n  const handleSubmit = useCallback(async () => {\n    const result = (await executeRequestInSync(\"validateCredentials\", {})) as {\n      isValid: boolean;\n    };\n    if (!result.isValid) {\n      return;\n    }\n    const columns = currentDocsData?.columns.map((c) => c.name) ?? [];\n    onSubmit({ user_instructions: userInstructions, description, columns });\n  }, [description, userInstructions, currentDocsData?.columns]);\n\n  const onChange = (e: ChangeEvent<HTMLInputElement>) => {\n    setDescription(e.target.value);\n    if (type === EntityType.COLUMN) {\n      dispatch(\n        updateColumnsInCurrentDocsData({\n          columns: [{ name: entity.name, description: e.target.value }],\n          isNewGeneration: true,\n        }),\n      );\n    }\n\n    if (type === EntityType.MODEL) {\n      dispatch(\n        updateCurrentDocsData({\n          name: entity.name,\n          description: e.target.value,\n          isNewGeneration: true,\n        }),\n      );\n    }\n  };\n\n  const handleInsertDocBlock = (docRef: string) => {\n    if (!inputRef.current) {\n      return;\n    }\n\n    const input = inputRef.current as HTMLTextAreaElement;\n    const start = input.selectionStart;\n    const end = input.selectionEnd;\n    const currentValue = description;\n    \n    const newValue = \n      currentValue.substring(0, start) + \n      docRef + \n      currentValue.substring(end);\n    \n    setDescription(newValue);\n    \n    // Update Redux state\n    if (type === EntityType.COLUMN) {\n      dispatch(\n        updateColumnsInCurrentDocsData({\n          columns: [{ name: entity.name, description: newValue }],\n          isNewGeneration: true,\n        }),\n      );\n    }\n\n    if (type === EntityType.MODEL) {\n      dispatch(\n        updateCurrentDocsData({\n          name: entity.name,\n          description: newValue,\n          isNewGeneration: true,\n        }),\n      );\n    }\n\n    // Set cursor position after the inserted text\n    setTimeout(() => {\n      if (input) {\n        const newCursorPosition = start + docRef.length;\n        input.setSelectionRange(newCursorPosition, newCursorPosition);\n        input.focus();\n      }\n    }, 10);\n  };\n\n  const variant = entity.description ? Variants.ICON : Variants.ICON_WITH_TEXT;\n  const entityColumn = incomingDocsData?.docs?.columns?.find(\n    (c) => c.name === entity.name,\n  );\n  const incomingTestKeys = incomingDocsData?.tests\n    ?.filter((t) =>\n      type === EntityType.MODEL\n        ? !t.column_name\n        : t.column_name === entity.name,\n    )\n    .map((t) => t.key);\n  const currTestKeys = tests?.map((t) => t.key);\n  const isTestsDirty = !isArrayEqual(\n    incomingTestKeys ?? [],\n    currTestKeys ?? [],\n  );\n  const isDescriptionDirty =\n    type === EntityType.MODEL\n      ? currentDocsData?.description !== incomingDocsData?.docs?.description\n      : entity.description !== entityColumn?.description;\n  const isDirty = isDescriptionDirty || isTestsDirty;\n\n  return (\n    <>\n      <Stack className=\"align-items-center mb-2\">\n        <h4 className=\"mb-0\">{title}</h4>\n        {type === EntityType.COLUMN &&\n        (entity as DBTDocumentationColumn).type ? (\n          <Tag type=\"rounded\">{(entity as DBTDocumentationColumn).type}</Tag>\n        ) : null}\n        {isDirty ? (\n          <Tag color=\"orange\" type=\"rounded\">\n            modified\n          </Tag>\n        ) : null}\n        <div className=\"spacer\" />\n        <Stack className={classes.actionButtons}>\n          <DocBlockInserter \n            inputRef={inputRef} \n            onInsert={handleInsertDocBlock} \n          />\n          <DocumentationPropagationButton type={type} name={entity.name} />\n          <AddCoversationButton\n            field=\"description\"\n            value={description}\n            name={entity.name}\n            type={type}\n            model={currentDocsData?.name}\n          />\n          <GenerateButton\n            onSubmit={handleSubmit}\n            variant={variant}\n            entityName={entity.name}\n          />\n        </Stack>\n      </Stack>\n      <Stack ref={stackRef}>\n        <InputGroup className={classes.inputGroup}>\n          <Input\n            innerRef={inputRef}\n            value={description}\n            onChange={onChange}\n            type=\"textarea\"\n            rows={inputRows}\n            placeholder={placeholder}\n            className={isDescriptionDirty ? \"border-orange\" : \"\"}\n          />\n        </InputGroup>\n      </Stack>\n    </>\n  );\n};\n\nexport default DocGeneratorInput;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/docGenerator/GenerateButton.tsx",
    "content": "import { ShinesIcon } from \"@assets/icons\";\nimport PreviewFeatureIcon from \"@modules/previewFeature/PreviewFeatureIcon\";\nimport { Button } from \"@uicore\";\n\nexport enum Variants {\n  ICON,\n  TEXT,\n  ICON_WITH_TEXT,\n}\ninterface Props {\n  variant?: Variants;\n  buttonText?: string;\n  onSubmit: () => void;\n  entityName: string;\n}\n\nconst GenerateButton = ({\n  variant = Variants.ICON,\n  buttonText = \"Generate\",\n  onSubmit,\n  entityName,\n}: Props): JSX.Element => {\n  const getButtonText = () => {\n    switch (variant) {\n      case Variants.ICON:\n        return <ShinesIcon />;\n      case Variants.TEXT:\n        return (\n          <>\n            {buttonText} <PreviewFeatureIcon />\n          </>\n        );\n      case Variants.ICON_WITH_TEXT:\n        return (\n          <>\n            <ShinesIcon /> {buttonText} <PreviewFeatureIcon />\n          </>\n        );\n    }\n  };\n  return (\n    <Button\n      color=\"primary\"\n      onClick={onSubmit}\n      title={`Generate description for ${entityName}`}\n    >\n      {getButtonText()}\n    </Button>\n  );\n};\n\nexport default GenerateButton;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/docGenerator/SyncWithDatabase.tsx",
    "content": "import { Button } from \"@uicore\";\nimport { RefreshIcon } from \"@assets/icons\";\nimport classes from \"../../styles.module.scss\";\nimport { executeRequestInSync } from \"@modules/app/requestExecutor\";\nimport { panelLogger } from \"@modules/logger\";\n\nconst SyncWithDatabase = (): JSX.Element => {\n  const onSyncBtnClick = () => {\n    executeRequestInSync(\"fetchMetadataFromDatabase\", {}).catch((err) =>\n      panelLogger.error(\"error while syncing with db\", err),\n    );\n  };\n\n  return (\n    <Button\n      color=\"warning\"\n      onClick={onSyncBtnClick}\n      className={classes.syncBtn}\n      icon={<RefreshIcon />}\n    >\n      Sync with the Database\n    </Button>\n  );\n};\n\nexport default SyncWithDatabase;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/docGenerator/coachAi.module.scss",
    "content": ".citations{\n  li {\n    margin: 0 !important;\n  }\n\n}\n\n.coachAi {\n  background: rgba(23, 178, 106, 0.1);\n  color: rgba(23, 178, 106, 1);\n  padding: 0.5rem 1rem;\n  border-radius: 2rem;\n  align-items: center;\n\n  ul{\n    margin: 0;\n  }\n  button, a {\n    text-decoration: none;\n    border-radius: 50%;\n    background: rgba(23, 178, 106, 1) !important;\n    border: none;\n    padding: 4px 5px;\n\n    margin-top: -1px;\n    &:hover {\n      background: rgb(7, 160, 88) !important;\n    }\n  }\n}\n\n.coachAiIcon{\n    width: 28px;\n    height: 28px;\n    background: var(--primary-color);\n    border-radius: 50%;\n    padding: 4px;\n}"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/docGenerator/constants.ts",
    "content": "export const Languages = [\"English\", \"German\", \"French\", \"Dutch\"];\nexport const Persona = [\n  // \"Data Analyst\",\n  // \"Data Engineer\",\n  // \"Data Scientist\",\n  \"Technical User\",\n  \"General User\",\n  \"Business User\",\n];\n\nexport const DefaultPersona = \"General User\";\nexport const DefaultLanguage = \"English\";\nexport const Options = [\"short\", \"long\", \"funny\"];\n\nexport const AI_GENERATE_COLUMN_LIMIT = 2;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/docGenerator/docGenInput.module.scss",
    "content": ".input-group {\n  textarea {\n    padding: 10px;\n    width: 100%;\n    min-height: 48px;\n    font-size: 13px;\n  }\n  :global .btn {\n    border-radius: 2px !important;\n  }\n\n  .actionButtons {\n    position: absolute;\n    right: 10px;\n    top: 10px;\n  }\n}\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/docGenerator/generateAll.module.scss",
    "content": ".options-card {\n  width: 70%;\n  margin-top: 1rem;\n  & :global .form-label {\n    width: 100%;\n  }\n}\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/documentationPropagation/DocumentationPropagation.tsx",
    "content": "import type { ColumnLineage } from \"@altimateai/ui-components/lineage\";\nimport { ArrowDownIcon, ArrowUpIcon, PropagateIcon } from \"@assets/icons\";\nimport { executeRequestInSync } from \"@modules/app/requestExecutor\";\nimport { EntityType } from \"@modules/dataPilot/components/docGen/types\";\nimport {\n  updateBulkDocsPropRightPanel,\n  updateSingleDocsPropRightPanel,\n} from \"@modules/documentationEditor/state/documentationSlice\";\nimport useDocumentationContext from \"@modules/documentationEditor/state/useDocumentationContext\";\nimport {\n  Button,\n  Card,\n  CardBody,\n  Drawer,\n  DrawerRef,\n  Input,\n  Loader,\n  Stack,\n} from \"@uicore\";\nimport { useEffect, useRef, useState } from \"react\";\nimport styles from \"./styles.module.scss\";\n\ninterface Props {\n  name: string;\n  type: EntityType;\n}\n\ninterface DocsItem {\n  model: string;\n  column: string;\n  description: string;\n  root?: string;\n}\n\ninterface TableMetadata {\n  table: string;\n  description: string;\n  patchPath?: string;\n  packageName: string;\n  url: string;\n  columns: Record<\n    string,\n    { name: string; description: string; data_type: string }\n  >;\n}\ninterface DownstreamColumns {\n  column_lineage: ColumnLineage[];\n  tables: TableMetadata[];\n  tests: Record<string, unknown>;\n}\n\nconst mergeDocItems = (a: DocsItem[], b: DocsItem[]): DocsItem[] => {\n  const result = [...a];\n  for (const item of b) {\n    if (\n      !result.find((i) => i.model === item.model && i.column === item.column)\n    ) {\n      result.push(item);\n    }\n  }\n  return result;\n};\n\nconst SingleColumnCard = ({\n  isLoading,\n  columnName,\n  columnDescription,\n  selectedColumns,\n  setSelectedColumns,\n  downstreamColumns,\n}: {\n  isLoading: boolean;\n  columnName: string;\n  columnDescription: string;\n  selectedColumns: Record<string, boolean>;\n  setSelectedColumns: React.Dispatch<\n    React.SetStateAction<Record<string, boolean>>\n  >;\n  downstreamColumns: DocsItem[];\n}) => {\n  const [isExpanded, setIsExpanded] = useState(true);\n  const setAllColumnsValue = (value: boolean) => {\n    setSelectedColumns((prev) => ({\n      ...prev,\n      ...Object.fromEntries(\n        downstreamColumns.map((curr) => [\n          curr.model + \"/\" + curr.column,\n          value,\n        ]),\n      ),\n    }));\n  };\n  if (!isExpanded) {\n    return (\n      <Card>\n        <CardBody>\n          <div\n            className={styles.singleColumnAccordion}\n            onClick={() => setIsExpanded(true)}\n          >\n            <ArrowDownIcon />\n          </div>\n          <Stack direction=\"column\">\n            <div className={styles.itemRow}>\n              <div>Column:</div>\n              <div>{columnName}</div>\n            </div>\n            {isLoading ? (\n              <Stack className=\"align-items-center\">\n                <Loader size=\"xsmall\" />\n                <div className={styles.captionText}>Loading...</div>\n              </Stack>\n            ) : (\n              <div className={styles.captionText}>\n                Downstream columns: {downstreamColumns.length}\n              </div>\n            )}\n          </Stack>\n        </CardBody>\n      </Card>\n    );\n  }\n  return (\n    <Card data-testid={`docs_prop_column_card_${columnName}`}>\n      <CardBody>\n        <div\n          className={styles.singleColumnAccordion}\n          onClick={() => setIsExpanded(false)}\n        >\n          <ArrowUpIcon />\n        </div>\n        <Stack direction=\"column\" className=\"gap-0 mb-2\">\n          <div className={styles.itemRow}>\n            <div>Column:</div>\n            <div>{columnName}</div>\n          </div>\n          {columnDescription && (\n            <div className={styles.itemRow}>\n              <div>Description:</div>\n              <div>{columnDescription}</div>\n            </div>\n          )}\n        </Stack>\n        {!isLoading && downstreamColumns.length === 0 ? (\n          <div className=\"mt-4\">\n            No downstream column level lineage detected to propagate the\n            documentation\n          </div>\n        ) : null}\n        {!isLoading && downstreamColumns.length > 0 ? (\n          <Stack className=\"mb-2\">\n            <Button\n              color=\"primary\"\n              outline\n              onClick={() => setAllColumnsValue(true)}\n            >\n              Select All\n            </Button>\n            <Button\n              color=\"primary\"\n              outline\n              onClick={() => setAllColumnsValue(false)}\n            >\n              Unselect All\n            </Button>\n          </Stack>\n        ) : null}\n        <Stack\n          direction=\"column\"\n          className=\"gap-sm\"\n          data-testid={`docs_prop_downstream_columns_${columnName}`}\n        >\n          {downstreamColumns.map((item) => {\n            const key = item.model + \"/\" + item.column;\n            return (\n              <Stack key={key} className={styles.itemCard}>\n                <Input\n                  type=\"checkbox\"\n                  checked={selectedColumns[key]}\n                  onChange={() =>\n                    setSelectedColumns((prev) => ({\n                      ...prev,\n                      [key]: !prev[key],\n                    }))\n                  }\n                />\n                <Stack direction=\"column\" className=\"gap-0 w-100\">\n                  <div className={styles.itemRow}>\n                    <div>Model:</div>\n                    <div>{item.model.split(\".\").pop()}</div>\n                  </div>\n                  <div className={styles.itemRow}>\n                    <div>Column:</div>\n                    <div>{item.column}</div>\n                  </div>\n                  {item.description && (\n                    <div className={styles.itemRow}>\n                      <div>Description:</div>\n                      <div>{item.description}</div>\n                    </div>\n                  )}\n                </Stack>\n              </Stack>\n            );\n          })}\n        </Stack>\n        {isLoading && (\n          <Stack className=\"align-items-center mt-2\">\n            <Loader size=\"xsmall\" />\n            <div className={styles.captionText}>Loading...</div>\n          </Stack>\n        )}\n      </CardBody>\n    </Card>\n  );\n};\n\nconst useDocumentationPropagation = ({\n  startColumns,\n}: {\n  startColumns: DocsItem[];\n}) => {\n  const {\n    state: { currentDocsData },\n  } = useDocumentationContext();\n  const [allColumns, setAllColumns] = useState<DocsItem[]>([]);\n  const [currColumns, setCurrColumns] = useState<DocsItem[]>([]);\n  const [isLoading, setIsLoading] = useState(false);\n  const [isColumnLineageLoading, setIsColumnLineageLoading] = useState<\n    Record<string, boolean>\n  >({});\n  const [tableMetadata, setTableMetadata] = useState<TableMetadata[]>([]);\n  const isCancelled = useRef(false);\n  const [testsMetadata, setTestsMetadata] = useState<Record<string, unknown>>(\n    {},\n  );\n  const [selectedColumns, setSelectedColumns] = useState<\n    Record<string, boolean>\n  >({});\n\n  const loadMoreDownstreamModels = async () => {\n    isCancelled.current = false;\n    setIsLoading(true);\n    setIsColumnLineageLoading(\n      Object.fromEntries(currColumns.map((curr) => [curr.column, true])),\n    );\n    let iCurrColumns = startColumns;\n    while (iCurrColumns.length > 0 && !isCancelled.current) {\n      const result = (await executeRequestInSync(\"getDownstreamColumns\", {\n        targets: iCurrColumns.map((c) => [c.model, c.column]),\n        model: currentDocsData?.uniqueId,\n        column: iCurrColumns[0].column,\n      })) as DownstreamColumns;\n      if (!result.column_lineage) {\n        break;\n      }\n      setTableMetadata((prev) => [...prev, ...result.tables]);\n      setTestsMetadata((prev) => ({ ...prev, ...result.tests }));\n      if (result.column_lineage.length === 0) {\n        iCurrColumns = [];\n        break;\n      }\n      const tempColumnLoadingState = Object.fromEntries(\n        currColumns.map((curr) => [curr.column, false]),\n      );\n      const newColumns: DocsItem[] = [];\n      for (const item of result.column_lineage) {\n        if (item.type === \"indirect\") continue;\n        if (item.viewsType === \"Transformation\") continue;\n        const [model, column] = item.source;\n        const sourceColumn = iCurrColumns.find(\n          (c) => c.model === model && c.column === column,\n        );\n        if (!sourceColumn) continue;\n        newColumns.push({\n          model: item.target[0],\n          column: item.target[1],\n          description:\n            result.tables.find((t) => t.table === item.target[0])?.columns[\n              item.target[1]\n            ]?.description ?? \"\",\n          root: sourceColumn.root,\n        });\n        if (sourceColumn.root) tempColumnLoadingState[sourceColumn.root] = true;\n      }\n      iCurrColumns = newColumns;\n      setAllColumns((prev) => mergeDocItems(prev, newColumns));\n      setIsColumnLineageLoading(tempColumnLoadingState);\n    }\n    setIsLoading(false);\n    setCurrColumns(iCurrColumns);\n  };\n\n  const cancelColumnLineage = async () => {\n    isCancelled.current = true;\n    await executeRequestInSync(\"cancelColumnLineage\", {});\n  };\n\n  const propagateDocumentation = async () => {\n    await executeRequestInSync(\"saveDocumentationBulk\", {\n      allColumns,\n      selectedColumns,\n      tableMetadata,\n      testsMetadata,\n      currentDocsData,\n      startColumns,\n    });\n  };\n\n  const reset = () => {\n    setAllColumns([]);\n    setCurrColumns(startColumns);\n    setTableMetadata([]);\n    setTestsMetadata({});\n    setSelectedColumns({});\n    isCancelled.current = false;\n  };\n  return {\n    isLoading,\n    allColumns,\n    selectedColumns,\n    setSelectedColumns,\n    loadMoreDownstreamModels,\n    propagateDocumentation,\n    cancelColumnLineage,\n    reset,\n    isColumnLineageLoading,\n  };\n};\n\nexport const BulkDocumentationPropagationPanel = (): JSX.Element | null => {\n  const {\n    state: { showBulkDocsPropRightPanel, currentDocsData },\n    dispatch,\n  } = useDocumentationContext();\n  const drawerRef = useRef<DrawerRef | null>(null);\n\n  const startColumns =\n    currentDocsData?.columns\n      .filter((c) => Boolean(c.description))\n      .map((c) => ({\n        model: currentDocsData.uniqueId,\n        column: c.name,\n        description: c.description ?? \"\",\n        root: c.name,\n      })) ?? [];\n\n  const {\n    isLoading,\n    allColumns,\n    selectedColumns,\n    setSelectedColumns,\n    loadMoreDownstreamModels,\n    propagateDocumentation,\n    cancelColumnLineage,\n    reset,\n  } = useDocumentationPropagation({ startColumns });\n\n  useEffect(() => {\n    reset();\n  }, [currentDocsData?.uniqueId]);\n\n  useEffect(() => {\n    if (!drawerRef.current) return;\n    if (showBulkDocsPropRightPanel) {\n      void loadMoreDownstreamModels();\n      drawerRef.current.open();\n    } else {\n      void cancelColumnLineage();\n      reset();\n      drawerRef.current.close();\n    }\n  }, [showBulkDocsPropRightPanel]);\n\n  const setAllColumnsValue = (value: boolean) => {\n    setSelectedColumns(\n      Object.fromEntries(\n        allColumns.map((curr) => [curr.model + \"/\" + curr.column, value]),\n      ),\n    );\n  };\n\n  return (\n    <Drawer\n      ref={drawerRef}\n      onOpen={() => dispatch(updateBulkDocsPropRightPanel(true))}\n      onClose={() => dispatch(updateBulkDocsPropRightPanel(false))}\n    >\n      <Stack direction=\"column\" className=\"h-100\">\n        <div className={styles.itemRow}>\n          <div>Model:</div>\n          <div>{currentDocsData?.name}</div>\n        </div>\n        <Stack direction=\"column\" className=\"mb-1 overflow-y\">\n          {currentDocsData?.columns\n            .filter((c) => Boolean(c.description))\n            .sort(\n              (a, b) =>\n                allColumns.filter((item) => item.root === b.name).length -\n                allColumns.filter((item) => item.root === a.name).length,\n            )\n            .map((c) => (\n              <SingleColumnCard\n                key={c.name}\n                setSelectedColumns={setSelectedColumns}\n                selectedColumns={selectedColumns}\n                columnDescription={c.description ?? \"\"}\n                columnName={c.name}\n                isLoading={isLoading}\n                downstreamColumns={allColumns.filter(\n                  (item) => item.root === c.name,\n                )}\n              />\n            ))}\n        </Stack>\n        <Stack direction=\"column\" className={styles.propagateContainer}>\n          <Stack className=\"align-items-center\">\n            <div>Downstream columns:</div>\n            <div>{Object.values(allColumns).flat().length}</div>\n            {isLoading && <Loader size=\"small\" />}\n            <div className=\"spacer\" />\n            {isLoading ? (\n              <Button\n                color=\"primary\"\n                outline\n                onClick={() => cancelColumnLineage()}\n              >\n                Cancel\n              </Button>\n            ) : allColumns.length > 0 ? (\n              <Stack>\n                <Button\n                  color=\"primary\"\n                  outline\n                  onClick={() => setAllColumnsValue(true)}\n                >\n                  Select All\n                </Button>\n                <Button\n                  color=\"primary\"\n                  outline\n                  onClick={() => setAllColumnsValue(false)}\n                >\n                  Unselect All\n                </Button>\n              </Stack>\n            ) : null}\n          </Stack>\n          <Button\n            color=\"primary\"\n            disabled={\n              Object.values(selectedColumns).filter((v) => Boolean(v))\n                .length === 0 || isLoading\n            }\n            onClick={async () => {\n              await propagateDocumentation();\n              dispatch(updateBulkDocsPropRightPanel(false));\n            }}\n            className=\"w-100\"\n          >\n            Propagate documentation (\n            {Object.values(selectedColumns).filter((v) => Boolean(v)).length})\n          </Button>\n        </Stack>\n      </Stack>\n    </Drawer>\n  );\n};\n\nexport const DocumentationPropagationButton = ({\n  name,\n  type,\n}: Props): JSX.Element | null => {\n  const {\n    state: { showSingleDocsPropRightPanel, currentDocsData },\n    dispatch,\n  } = useDocumentationContext();\n  const drawerRef = useRef<DrawerRef | null>(null);\n  const currColumnDescription =\n    currentDocsData?.columns.find((c) => c.name === name)?.description ?? \"\";\n  const startColumns = currentDocsData\n    ? [\n        {\n          model: currentDocsData.uniqueId,\n          column: name,\n          description: currColumnDescription,\n          root: name,\n        },\n      ]\n    : [];\n  const {\n    isLoading,\n    allColumns,\n    selectedColumns,\n    setSelectedColumns,\n    loadMoreDownstreamModels,\n    propagateDocumentation,\n    cancelColumnLineage,\n    reset,\n  } = useDocumentationPropagation({ startColumns });\n\n  useEffect(() => {\n    reset();\n  }, [currentDocsData?.uniqueId, name]);\n\n  useEffect(() => {\n    if (!drawerRef.current) return;\n    if (showSingleDocsPropRightPanel) {\n      void loadMoreDownstreamModels();\n      drawerRef.current.open();\n    } else {\n      void cancelColumnLineage();\n      drawerRef.current.close();\n    }\n  }, [showSingleDocsPropRightPanel]);\n\n  if (type !== EntityType.COLUMN) {\n    return null;\n  }\n\n  if (!currColumnDescription) {\n    return null;\n  }\n\n  return (\n    <Drawer\n      buttonProps={{\n        color: \"primary\",\n        title: \"Propagate documentation\",\n        \"data-testid\": `doc_prop_${name}`,\n      }}\n      buttonText={<PropagateIcon />}\n      title=\"Propagate documentation\"\n      ref={drawerRef}\n      onOpen={() => void loadMoreDownstreamModels()}\n      onClose={() => dispatch(updateSingleDocsPropRightPanel(false))}\n    >\n      <Stack direction=\"column\" className=\"h-100\">\n        <div className={styles.itemRow}>\n          <div>Model:</div>\n          <div>{currentDocsData?.name}</div>\n        </div>\n        <SingleColumnCard\n          setSelectedColumns={setSelectedColumns}\n          selectedColumns={selectedColumns}\n          columnDescription={currColumnDescription}\n          columnName={name}\n          isLoading={isLoading}\n          downstreamColumns={allColumns}\n        />\n        <div className=\"spacer\" />\n        <Stack direction=\"column\">\n          <Stack className=\"align-items-center\">\n            <div>Downstream columns:</div>\n            <div>{allColumns.length}</div>\n            {isLoading && (\n              <Loader size=\"small\" data-testid=\"docs_prop_loader\" />\n            )}\n            <div className=\"spacer\" />\n            {isLoading && (\n              <Button\n                color=\"primary\"\n                outline\n                onClick={() => cancelColumnLineage()}\n              >\n                Cancel\n              </Button>\n            )}\n          </Stack>\n          <Button\n            color=\"primary\"\n            disabled={\n              Object.values(selectedColumns).filter((v) => Boolean(v))\n                .length === 0 || isLoading\n            }\n            onClick={async () => {\n              await propagateDocumentation();\n              dispatch(updateSingleDocsPropRightPanel(false));\n            }}\n            className=\"w-100\"\n          >\n            Propagate documentation\n          </Button>\n        </Stack>\n      </Stack>\n    </Drawer>\n  );\n};\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/documentationPropagation/styles.module.scss",
    "content": ".itemCard {\n  background-color: var(--background--base);\n  padding: 0.5rem;\n  border-radius: 4px;\n}\n\n.itemRow {\n  display: grid;\n  grid-template-columns: 1.2fr 3fr;\n\n  :nth-child(1) {\n    font-weight: 600;\n  }\n\n  :nth-child(2) {\n    line-break: anywhere;\n    color: var(--text-grey2-color);\n  }\n}\n\n.colDesc {\n  :nth-child(1) {\n    font-weight: 600;\n  }\n\n  :nth-child(2) {\n    line-break: anywhere;\n    color: var(--text-grey2-color);\n  }\n}\n\n.propagateContainer {\n  background-color: #333333;\n  margin: -12px;\n  padding: 12px;\n}\n\n.singleColumnAccordion {\n  cursor: pointer;\n  position: absolute;\n  top: 12px;\n  right: 12px;\n}\n\n.captionText {\n  color: var(--text-color--caption);\n  font-size: 0.8em;\n}"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/help/DocumentationHelpContent.tsx",
    "content": "import { executeRequestInAsync } from \"@modules/app/requestExecutor\";\nimport useDocumentationContext from \"@modules/documentationEditor/state/useDocumentationContext\";\nimport { Alert, Button, Stack } from \"@uicore\";\nimport { TelemetryEvents } from \"@telemetryEvents\";\nimport { sendTelemetryEvent } from \"../telemetry\";\n\nconst DocumentationHelpContent = ({\n  showMissingDocumentationMessage,\n}: {\n  showMissingDocumentationMessage?: boolean;\n}): JSX.Element => {\n  const {\n    state: { missingDocumentationMessage },\n  } = useDocumentationContext();\n\n  const openProblemsTab = () => {\n    executeRequestInAsync(\"openProblemsTab\", {});\n  };\n  return (\n    <Stack direction=\"column\">\n      {missingDocumentationMessage && showMissingDocumentationMessage ? (\n        <Alert color=\"warning\" className=\"mt-2 mb-1\">\n          {missingDocumentationMessage.message}\n          {missingDocumentationMessage.type === \"error\" ? (\n            <>\n              <Button\n                color=\"link\"\n                style={{ marginTop: -5 }}\n                onClick={openProblemsTab}\n              >\n                Click here\n              </Button>{\" \"}\n              to view Problems tab\n            </>\n          ) : (\n            \"\"\n          )}\n        </Alert>\n      ) : null}\n      <p>\n        You can write, update, and generate descriptions for your dbt models and\n        columns, and save them in YAML files with a click of a button.{\" \"}\n      </p>\n      <p>\n        <b>Save Documentation:</b> Once you&apos;ve added or edited the\n        documentation for your model and columns, hit the\n        <b> &quot;Save Documentation&quot;</b> button at the bottom to save in\n        schema.yml\n      </p>\n      <p>\n        <b>Sync Columns with Database:</b> Use the sync action to synchronize\n        the model with your database and fetch the accurate columns and their\n        types.\n      </p>\n      <p>\n        <b>Generate Documentation:</b> This functionality requires an API key.\n        You can generate descriptions for models and columns using the generate\n        button. You can also bulk generate in a single action using the “Bulk\n        actions” button. If you want to change settings like language, or\n        persona, please use the “Settings” button in the right top corner.{\" \"}\n      </p>\n      <p>\n        If the description is present already, and you click the “regenerate”\n        icon, DataPilot panel will be displayed on the left with prompts and\n        instructions where you can guide the DataPilot to generate descriptions\n        as per your specific preferences.\n      </p>\n      <p>\n        <b>Help Us Improve:</b> We&apos;re eager to hear from you! If\n        you&apos;ve tried the AI-generated documentation, let us know how it\n        worked. Your feedback helps us improve and ensures we offer a valuable\n        tool for the community.\n      </p>\n      <p>\n        Need more help? Check out the&nbsp;\n        <a\n          onClick={() =>\n            sendTelemetryEvent(\n              TelemetryEvents[\n                \"DocumentationEditor/HelpDocumentationLinkInDocumentationClick\"\n              ],\n            )\n          }\n          href=\"https://docs.myaltimate.com/document/generatedoc/\"\n        >\n          documentation\n        </a>\n        . For any issues or concerns, please{\" \"}\n        <a\n          onClick={() =>\n            sendTelemetryEvent(\n              TelemetryEvents[\n                \"DocumentationEditor/HelpContactusLinkInDocumentationClick\"\n              ],\n            )\n          }\n          href=\"https://app.myaltimate.com/contactus\"\n        >\n          contact us\n        </a>{\" \"}\n        via chat or Slack. Happy documenting!\n      </p>\n    </Stack>\n  );\n};\n\nexport default DocumentationHelpContent;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/help/TestsHelpContent.tsx",
    "content": "import { Stack } from \"@uicore\";\nimport { TelemetryEvents } from \"@telemetryEvents\";\nimport { sendTelemetryEvent } from \"../telemetry\";\n\nconst TestHelpContent = (): JSX.Element => {\n  return (\n    <Stack direction=\"column\">\n      <p>\n        You can add or view tests for your dbt model columns with this\n        functionality.\n      </p>\n      <p>\n        <b>View Tests:</b> You can view already written tests for the dbt model\n        and columns in this panel.\n      </p>\n      <p>\n        <b>Add Tests:</b> You can easily add or edit generic dbt tests - unique,\n        not_null, accepted_values and relationships . You can also generate code\n        for custom tests from various packages like dbt expectations, dbt utils\n        using DataPilot chat. Generating custom tests requires an API key.\n      </p>\n      <p>\n        <b>Save Tests:</b> Once you&apos;ve added or edited generic tests, hit\n        the <b>&quot;Save Tests&quot;</b> button at the bottom to save in yaml\n        file. Generated custom tests need to be added to yaml files manually.\n      </p>\n      <p>\n        <b>Sync Columns with Database:</b> Use the sync action to synchronize\n        the model with your database and fetch the accurate columns and their\n        types.\n      </p>\n      <p>\n        <b>Help Us Improve:</b> We&apos;re eager to hear from you! If\n        you&apos;ve tried the tests generation, let us know how it worked. Your\n        feedback helps us improve and ensures we offer a valuable tool for the\n        community.\n      </p>\n      <p>\n        Need more help? Check out the&nbsp;\n        <a\n          onClick={() =>\n            sendTelemetryEvent(\n              TelemetryEvents[\n                \"DocumentationEditor/HelpDocumentationLinkInTestsClick\"\n              ],\n            )\n          }\n          href=\"https://docs.myaltimate.com/test/generatetest\"\n        >\n          documentation\n        </a>\n        . For any issues or concerns, please{\" \"}\n        <a\n          onClick={() =>\n            sendTelemetryEvent(\n              TelemetryEvents[\n                \"DocumentationEditor/HelpContactusLinkInTestsClick\"\n              ],\n            )\n          }\n          href=\"https://app.myaltimate.com/contactus\"\n        >\n          contact us\n        </a>{\" \"}\n        via chat or Slack. Happy documenting!\n      </p>\n    </Stack>\n  );\n};\n\nexport default TestHelpContent;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/model/Options.tsx",
    "content": "import { Select } from \"@uicore\";\n\nconst ModelOptions = (): JSX.Element => {\n  return <Select options={[]} />;\n};\n\nexport default ModelOptions;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/result/DocGenerationResult.tsx",
    "content": "import useDocumentationContext from \"@modules/documentationEditor/state/useDocumentationContext\";\nimport { Stack } from \"@uicore\";\nimport DocumentationResult from \"./DocumentationResult\";\nimport classes from \"../../styles.module.scss\";\n\nconst DocGenerationResult = (): JSX.Element => {\n  const {\n    state: { generationHistory },\n  } = useDocumentationContext();\n  return (\n    <Stack direction=\"column\" className={classes.resultBody}>\n      {generationHistory.map((docHistory) => (\n        <DocumentationResult key={docHistory.timestamp} history={docHistory} />\n      ))}\n    </Stack>\n  );\n};\n\nexport default DocGenerationResult;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/result/DocumentationResult.stories.tsx",
    "content": "import type { Meta } from \"@storybook/react\";\nimport DocumentationResult from \"./DocumentationResult\";\n\nconst meta = {\n  title: \"Documentation/Result\",\n  component: DocumentationResult,\n  parameters: {\n    layout: \"centered\",\n  },\n  tags: [\"autodocs\"],\n  argTypes: {},\n} satisfies Meta;\n\nexport default meta;\n\nexport const Default = {\n  args: {},\n};\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/result/DocumentationResult.tsx",
    "content": "import { formatDistance } from \"date-fns\";\nimport { GenerationDBDataProps } from \"@modules/documentationEditor/types\";\nimport { Card, CardBody, Stack, Avatar } from \"@uicore\";\n// import ResultFeedbackButtons from \"./ResultFeedbackButtons\";\nimport { AltimateIcon } from \"@assets/icons\";\n\ninterface Props {\n  history: GenerationDBDataProps;\n}\nconst DocumentationResult = ({ history }: Props): JSX.Element | null => {\n  if (!history) {\n    return null;\n  }\n\n  return (\n    <Card>\n      <CardBody>\n        <Stack>\n          <center>\n            <Avatar>\n              <AltimateIcon />\n            </Avatar>\n            <caption>\n              {formatDistance(new Date(history.timestamp), new Date(), {\n                addSuffix: true,\n              })}\n            </caption>\n          </center>\n          <Stack direction=\"column\">\n            <Stack>\n              <p>{history.data.description}</p>\n            </Stack>\n            {/* <Stack style={{ justifyContent: \"space-between\" }}>\n              <Stack>\n                <ResultFeedbackButtons history={history} />\n              </Stack>\n            </Stack> */}\n          </Stack>\n        </Stack>\n      </CardBody>\n    </Card>\n  );\n};\n\nexport default DocumentationResult;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/saveDocumentation/SaveDocumentation.tsx",
    "content": "import { executeRequestInSync } from \"@modules/app/requestExecutor\";\nimport useDocumentationContext from \"@modules/documentationEditor/state/useDocumentationContext\";\nimport {\n  Button,\n  Stack,\n  DropdownButton,\n  PopoverWithButton,\n  PopoverWithButtonRef,\n} from \"@uicore\";\nimport { MouseEvent, useEffect, useRef, useState } from \"react\";\nimport { setIncomingDocsData } from \"@modules/documentationEditor/state/documentationSlice\";\nimport classes from \"../../styles.module.scss\";\nimport { noop } from \"antd/es/_util/warning\";\nimport {\n  DBTDocumentation,\n  DBTModelTest,\n} from \"@modules/documentationEditor/state/types\";\nimport { isStateDirty } from \"@modules/documentationEditor/utils\";\n\n/**\n * Handles save documentation functionality\n * Conditions:\n *  - save brand new model and no schema.yml\n *  - save brand new model but schema.yml exists, user wants to save in different yml file\n *  - save existing model but no schema.yml entry\n *  - update existing model\n */\nconst SaveDocumentation = (): JSX.Element | null => {\n  const [patchPath, setPatchPath] = useState(\"\");\n  const popoverRef = useRef<PopoverWithButtonRef | null>(null);\n  const { state, dispatch } = useDocumentationContext();\n  const { currentDocsData, currentDocsTests } = state;\n\n  const saveDocumentation = async (\n    dialogType?: \"New file\" | \"Existing file\",\n  ) => {\n    const result = (await executeRequestInSync(\"saveDocumentation\", {\n      ...currentDocsData,\n      updatedTests: currentDocsTests,\n      patchPath,\n      dialogType,\n    })) as {\n      saved: boolean;\n      documentation: DBTDocumentation;\n      tests: DBTModelTest[];\n    };\n    if (result.saved) {\n      dispatch(\n        setIncomingDocsData({\n          docs: currentDocsData,\n          tests: currentDocsTests,\n        }),\n      );\n    }\n  };\n\n  const onSaveBtnClick = async (e: MouseEvent) => {\n    e.stopPropagation();\n    if (!currentDocsData?.patchPath) {\n      popoverRef.current?.open();\n      return;\n    }\n    await saveDocumentation();\n  };\n\n  useEffect(() => {\n    setPatchPath(currentDocsData?.patchPath ?? \"\");\n  }, [currentDocsData?.patchPath]);\n\n  const options = [\n    { label: \"Existing file\", value: \"Existing file\" },\n    { label: \"New file\", value: \"New file\" },\n  ];\n\n  if (!isStateDirty(state)) {\n    return null;\n  }\n\n  return (\n    <PopoverWithButton\n      width=\"auto\"\n      ref={popoverRef}\n      button={\n        <DropdownButton\n          onToggleClick={noop}\n          color=\"primary\"\n          onClick={onSaveBtnClick}\n        >\n          Save\n        </DropdownButton>\n      }\n      popoverProps={{\n        placement: \"bottom\",\n        hideArrow: true,\n      }}\n    >\n      {() => (\n        <Stack direction=\"column\" className={classes.saveDocumentation}>\n          {currentDocsData?.patchPath ? (\n            <>\n              <h4 className=\"mb-0\">Current path:</h4>\n              <p id=\"file_path\">{currentDocsData.patchPath}</p>\n\n              <Stack className=\"justify-content-end\">\n                <Button color=\"primary\" onClick={() => saveDocumentation()}>\n                  Save\n                </Button>\n              </Stack>\n            </>\n          ) : (\n            <Stack className=\"align-items-center\">\n              <p className=\"m-0\">Save to: </p>\n              {options.map((option) => (\n                <Button\n                  key={option.label}\n                  color=\"primary\"\n                  onClick={() =>\n                    saveDocumentation(\n                      option.value as \"New file\" | \"Existing file\",\n                    )\n                  }\n                >\n                  {option.label}\n                </Button>\n              ))}\n            </Stack>\n          )}\n        </Stack>\n      )}\n    </PopoverWithButton>\n  );\n};\n\nexport default SaveDocumentation;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/score/Score.stories.tsx",
    "content": "import type { Meta } from \"@storybook/react\";\nimport Score from \"./Score\";\n\nconst meta = {\n  title: \"Documentation/Score\",\n  component: Score,\n  parameters: {\n    layout: \"centered\",\n  },\n  tags: [\"autodocs\"],\n  argTypes: {},\n} satisfies Meta;\n\nexport default meta;\n\nexport const Default = {\n  args: { percentage: 90 },\n};\n\nexport const Blue = {\n  args: { percentage: 70 },\n};\n\nexport const Yellow = {\n  args: { percentage: 50 },\n};\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/score/Score.tsx",
    "content": "import classes from \"./styles.module.scss\";\n\ninterface Props {\n  percentage: number;\n}\nconst radius = 20.2;\nconst Score = ({ percentage }: Props): JSX.Element => {\n  const getColor = () => {\n    if (percentage > 60 && percentage < 75) {\n      return \"blue\";\n    }\n    if (percentage < 60) {\n      return \"yellow\";\n    }\n    return \"\";\n  };\n  return (\n    <div className={classes.scoreWrapper}>\n      <span className={`${classes.score} ${getColor()}`}>\n        <svg viewBox=\"22 22 44 44\">\n          <circle\n            style={{\n              strokeDashoffset:\n                ((100 - percentage) * 2 * Math.PI * radius) / 100,\n            }}\n            cx=\"44\"\n            cy=\"44\"\n            r={radius}\n            fill=\"none\"\n            strokeWidth=\"4\"\n          ></circle>\n        </svg>\n      </span>\n      <span className={classes.percentage}>{percentage}%</span>\n    </div>\n  );\n};\n\nexport default Score;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/score/styles.module.scss",
    "content": ".scoreWrapper {\n  width: 56px;\n  height: 56px;\n  position: relative;\n  & .percentage {\n    position: absolute;\n    height: 100%;\n    width: 100%;\n    top: 0;\n    left: 0;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    color: var(--text-color--title);\n  }\n  & .score {\n    height: 100%;\n    width: 100%;\n    transform: rotate(-90deg);\n    display: inline-block;\n    color: #01cd8c;\n    &:global.blue {\n      color: #247efe;\n    }\n    &:global.yellow {\n      color: #ffce73;\n    }\n    & svg {\n      display: block;\n      overflow: visible;\n      & circle {\n        stroke-dasharray: 126.92;\n        stroke: currentColor;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/search/SearchColumnsInput.tsx",
    "content": "import { SearchIcon } from \"@assets/icons\";\nimport { setSearchQuery } from \"@modules/documentationEditor/state/documentationSlice\";\nimport useDocumentationContext from \"@modules/documentationEditor/state/useDocumentationContext\";\nimport { Input, Stack } from \"@uicore\";\nimport styles from \"../../styles.module.scss\";\n\nconst SearchColumnsInput = (): JSX.Element => {\n  const { dispatch } = useDocumentationContext();\n\n  const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n    dispatch(setSearchQuery(e.target.value));\n  };\n\n  return (\n    <Stack className={styles.search}>\n      <SearchIcon />\n      <Input\n        aria-label=\"Search by column name\"\n        role=\"search\"\n        type=\"search\"\n        onChange={handleChange}\n        placeholder=\"Search by column name\"\n      />\n    </Stack>\n  );\n};\n\nexport default SearchColumnsInput;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/settings/DocGeneratorSettings.tsx",
    "content": "import { OptionType, Label, Select, Stack, Drawer, DrawerRef } from \"@uicore\";\nimport {\n  Languages,\n  Persona,\n  DefaultLanguage,\n  DefaultPersona,\n} from \"../docGenerator/constants\";\nimport { ActionMeta } from \"react-select\";\nimport useDocumentationContext from \"@modules/documentationEditor/state/useDocumentationContext\";\nimport { updateUserInstructions } from \"@modules/documentationEditor/state/documentationSlice\";\nimport { panelLogger } from \"@modules/logger\";\nimport { sendTelemetryEvent } from \"../telemetry\";\nimport { TelemetryEvents } from \"@telemetryEvents\";\nimport { useEffect, useRef } from \"react\";\n\nconst DocGeneratorSettings = (): JSX.Element => {\n  const {\n    dispatch,\n    state: { userInstructions },\n  } = useDocumentationContext();\n  const drawerRef = useRef<DrawerRef | null>(null);\n\n  useEffect(() => {\n    drawerRef.current?.open();\n  }, []);\n  const handleChange = (value: unknown, meta: ActionMeta<unknown>) => {\n    if (!meta.name) {\n      return;\n    }\n    panelLogger.info(\"updating user instructions\", meta.name, value);\n    dispatch(\n      updateUserInstructions({ [meta.name]: (value as OptionType).value }),\n    );\n    sendTelemetryEvent(TelemetryEvents[\"DocumentationEditor/SettingsUpdate\"], {\n      field: meta.name,\n      value: (value as OptionType).value,\n    });\n\n    localStorage.setItem(\n      \"userInstructions\",\n      JSON.stringify({\n        ...userInstructions,\n        [meta.name]: (value as OptionType).value,\n      }),\n    );\n  };\n\n  const onOpen = () => {\n    sendTelemetryEvent(TelemetryEvents[\"DocumentationEditor/SettingsOpen\"]);\n  };\n\n  return (\n    <Drawer title=\"Help\" onOpen={onOpen} ref={drawerRef}>\n      <Stack direction=\"column\">\n        <h5>Configure settings for document generation</h5>\n        <Stack direction=\"column\">\n          <Label>\n            Language\n            <Select\n              name=\"language\"\n              defaultValue={{\n                label: userInstructions.language ?? DefaultLanguage,\n                value: userInstructions.language ?? DefaultLanguage,\n              }}\n              onChange={handleChange}\n              options={Languages.map((l) => ({ label: l, value: l }))}\n            />\n          </Label>\n          <Label>\n            Persona\n            <Select\n              name=\"persona\"\n              defaultValue={{\n                label: userInstructions.persona ?? DefaultPersona,\n                value: userInstructions.persona ?? DefaultPersona,\n              }}\n              onChange={handleChange}\n              options={Persona.map((l) => ({ label: l, value: l }))}\n            />\n          </Label>\n        </Stack>\n      </Stack>\n    </Drawer>\n  );\n};\n\nexport default DocGeneratorSettings;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/telemetry/index.ts",
    "content": "import { executeRequestInAsync } from \"@modules/app/requestExecutor\";\nimport { TelemetryEvents } from \"@telemetryEvents\";\n\nexport const sendTelemetryEvent = (\n  eventName: TelemetryEvents,\n  properties?: Record<string, string>,\n  measurements?: Record<string, number>,\n): void => {\n  executeRequestInAsync(\"sendTelemetryEvent\", {\n    eventName,\n    properties,\n    measurements,\n  });\n};\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/tests/AddTest.tsx",
    "content": "import { AddIcon, RemoveIcon } from \"@assets/icons\";\nimport { DbtGenericTests } from \"@modules/documentationEditor/state/types\";\nimport {\n  Card,\n  CardTitle,\n  CardBody,\n  Stack,\n  Drawer,\n  DrawerRef,\n  IconButton,\n  Button,\n  Fade,\n  Tooltip,\n} from \"@uicore\";\nimport { useRef, useState } from \"react\";\nimport TestForm from \"./forms/TestForm\";\nimport classes from \"../../styles.module.scss\";\nimport useTestFormSave, { TestOperation } from \"./hooks/useTestFormSave\";\nimport CustomTestButton from \"./CustomTestButton\";\nimport { EntityType } from \"@modules/dataPilot/components/docGen/types\";\nimport { sendTelemetryEvent } from \"../telemetry\";\nimport { TelemetryEvents } from \"@telemetryEvents\";\n\ninterface Props {\n  title: string;\n  currentTests?: string[];\n  type: EntityType;\n}\n\nconst AddTest = ({ title, currentTests, type }: Props): JSX.Element => {\n  const [formType, setFormType] = useState<DbtGenericTests | null>(null);\n  const [showButtons, setShowButtons] = useState(false);\n  const drawerRef = useRef<DrawerRef>(null);\n  const { handleSave } = useTestFormSave();\n\n  const handleNewTestClick = (test: DbtGenericTests) => {\n    sendTelemetryEvent(TelemetryEvents[\"DocumentationEditor/AddTestSelect\"], {\n      test,\n      type,\n      entityName: title,\n    });\n    if (test === DbtGenericTests.NOT_NULL || test === DbtGenericTests.UNIQUE) {\n      handleSave({ test }, title, TestOperation.CREATE);\n      setShowButtons(false);\n      return;\n    }\n    setFormType(test);\n    drawerRef.current?.open();\n  };\n\n  const handleOpen = () => {\n    setShowButtons((prev) => !prev);\n    sendTelemetryEvent(TelemetryEvents[\"DocumentationEditor/AddTestClick\"], {\n      type,\n      entityName: title,\n    });\n  };\n  const onClose = () => {\n    setFormType(null);\n    drawerRef.current?.close();\n    setShowButtons(false);\n  };\n\n  return (\n    <>\n      <IconButton\n        onClick={handleOpen}\n        color={showButtons ? \"primary\" : \"secondary\"}\n        className={classes.btnAddTest}\n        title={showButtons ? \"Minimize\" : `Add test for ${title}`}\n      >\n        {showButtons ? <RemoveIcon /> : <AddIcon />}\n      </IconButton>\n      {showButtons ? (\n        <Fade tag=\"span\" className=\"d-inline\">\n          {type === EntityType.MODEL\n            ? null\n            : Object.values(DbtGenericTests)\n                .filter((t) => !currentTests?.includes(t))\n                .map((test) => (\n                  <Tooltip key={test} title=\"Click to add\">\n                    <Button\n                      className={classes.newTestTag}\n                      onClick={() => handleNewTestClick(test)}\n                      outline\n                    >\n                      {test}\n                    </Button>\n                  </Tooltip>\n                ))}\n          <Tooltip title=\"Generate test using Datapilot\">\n            <CustomTestButton column={title} type={type} />\n          </Tooltip>\n        </Fade>\n      ) : null}\n      <Drawer ref={drawerRef}>\n        <Stack direction=\"column\" className={classes.addTest}>\n          <Card>\n            <CardTitle>\n              <h5>Add new test</h5>\n            </CardTitle>\n            <CardBody className={classes.title}>Column: {title}</CardBody>\n          </Card>\n          {formType ? (\n            <TestForm formType={formType} onClose={onClose} column={title} />\n          ) : null}\n        </Stack>\n      </Drawer>\n    </>\n  );\n};\n\nexport default AddTest;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/tests/CustomTestButton.tsx",
    "content": "import { ShinesIcon } from \"@assets/icons\";\nimport useAppContext from \"@modules/app/useAppContext\";\nimport { EntityType } from \"@modules/dataPilot/components/docGen/types\";\nimport { RequestTypes } from \"@modules/dataPilot/types\";\nimport useDocumentationContext from \"@modules/documentationEditor/state/useDocumentationContext\";\nimport { TelemetryEvents } from \"@telemetryEvents\";\nimport { ListGroupItem } from \"@uicore\";\nimport classes from \"../../styles.module.scss\";\nimport { sendTelemetryEvent } from \"../telemetry\";\n\ninterface Props {\n  column: string;\n  type: EntityType;\n}\nconst CustomTestButton = ({ column, type }: Props): JSX.Element => {\n  const {\n    state: { currentDocsData },\n  } = useDocumentationContext();\n\n  const { postMessageToDataPilot } = useAppContext();\n\n  const onClick = () => {\n    const id = crypto.randomUUID();\n\n    sendTelemetryEvent(\n      TelemetryEvents[\"DocumentationEditor/AddCustomTestClick\"],\n      { type, entityName: column },\n    );\n\n    postMessageToDataPilot({\n      id,\n      requestType: RequestTypes.ADD_CUSTOM_TEST,\n      meta: {\n        column: type === EntityType.MODEL ? undefined : column,\n        model: currentDocsData?.name,\n      },\n      actions: [],\n    });\n  };\n\n  return (\n    <ListGroupItem\n      action\n      tag=\"button\"\n      className={`${classes.customTest} ${classes.newTestTag} btn btn-outline-secondary`}\n      onClick={onClick}\n    >\n      Custom Test\n      <ShinesIcon />\n    </ListGroupItem>\n  );\n};\n\nexport default CustomTestButton;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/tests/DbtTestCode.tsx",
    "content": "import { executeRequestInSync } from \"@modules/app/requestExecutor\";\nimport { DBTModelTest } from \"@modules/documentationEditor/state/types\";\nimport useDocumentationContext from \"@modules/documentationEditor/state/useDocumentationContext\";\nimport { panelLogger } from \"@modules/logger\";\nimport { CodeBlock } from \"@uicore\";\nimport { useEffect, useState } from \"react\";\n\ninterface GetTestCodeResponse {\n  sql?: string;\n  config?: string;\n}\nconst DbtTestCode = ({ test }: { test: DBTModelTest }): JSX.Element | null => {\n  const {\n    state: { currentDocsData },\n  } = useDocumentationContext();\n  const [testCode, setTestCode] = useState<\n    (GetTestCodeResponse & { error?: string }) | null\n  >(null);\n\n  panelLogger.info(testCode);\n  const loadTestCode = async () => {\n    if (!currentDocsData?.name) {\n      return;\n    }\n    try {\n      const result = (await executeRequestInSync(\"getTestCode\", {\n        test,\n        model: currentDocsData.name,\n      })) as GetTestCodeResponse;\n      setTestCode(result);\n    } catch (err) {\n      setTestCode({ error: (err as Error).message });\n    }\n  };\n\n  useEffect(() => {\n    if (!currentDocsData?.name) {\n      return;\n    }\n\n    loadTestCode().catch((err) =>\n      panelLogger.info(\"error loading test code\", err),\n    );\n  }, [currentDocsData?.name]);\n\n  if (!testCode) {\n    return null;\n  }\n\n  return (\n    <>\n      {testCode.config ? (\n        <CodeBlock code={testCode.config} language=\"yaml\" fileName=\"Config\" />\n      ) : null}\n      {testCode.sql ? (\n        <CodeBlock code={testCode.sql} language=\"sql\" fileName=\"Source\" />\n      ) : null}\n      {testCode.error ? (\n        <CodeBlock code={testCode.error} language=\"yaml\" fileName=\"Source\" />\n      ) : null}\n    </>\n  );\n};\n\nexport default DbtTestCode;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/tests/DisplayTestDetails.tsx",
    "content": "import { yupResolver } from \"@hookform/resolvers/yup\";\nimport * as Yup from \"yup\";\nimport { useForm } from \"react-hook-form\";\nimport {\n  DbtGenericTests,\n  DBTModelTest,\n  DbtTestTypes,\n  TestMetadataAcceptedValuesKwArgs,\n  TestMetadataRelationshipsKwArgs,\n} from \"@modules/documentationEditor/state/types\";\nimport { panelLogger } from \"@modules/logger\";\nimport {\n  Button,\n  Card,\n  CardBody,\n  CardFooter,\n  CardTitle,\n  IconButton,\n  Stack,\n  Tag,\n} from \"@uicore\";\nimport { useMemo, useState } from \"react\";\nimport AcceptedValues from \"./forms/AcceptedValues\";\nimport Relationships from \"./forms/Relationships\";\nimport { SaveRequest } from \"./types\";\nimport useTestFormSave, { TestOperation } from \"./hooks/useTestFormSave\";\nimport classes from \"../../styles.module.scss\";\nimport { DeleteIcon, EditIcon } from \"@assets/icons\";\nimport { findDbtTestType } from \"./utils\";\nimport TestDetails from \"./TestDetails\";\nimport { EntityType } from \"@modules/dataPilot/components/docGen/types\";\nimport { sendTelemetryEvent } from \"../telemetry\";\nimport { TelemetryEvents } from \"@telemetryEvents\";\n\nconst schema = Yup.object({\n  to: Yup.string().optional(),\n  field: Yup.string().optional(),\n  accepted_values: Yup.array().of(Yup.string().required()).optional(),\n}).required();\n\ninterface Props {\n  onClose: () => void;\n  test: DBTModelTest;\n  column: string;\n  type: EntityType;\n}\n\nconst DisplayTestDetails = ({\n  onClose,\n  test,\n  column,\n  type,\n}: Props): JSX.Element => {\n  const { control, handleSubmit, setValue, watch } = useForm<SaveRequest>({\n    resolver: yupResolver(schema),\n  });\n\n  const { isSaving, handleSave } = useTestFormSave();\n\n  const [isInEditMode, setIsInEditMode] = useState(false);\n\n  const isEditableTest =\n    test.test_metadata?.name === DbtGenericTests.ACCEPTED_VALUES ||\n    test.test_metadata?.name === DbtGenericTests.RELATIONSHIPS;\n  const testType = findDbtTestType(test);\n  const canDeleteTest =\n    testType !== DbtTestTypes.SINGULAR &&\n    testType !== DbtTestTypes.UNKNOWN &&\n    type !== EntityType.MODEL;\n\n  const handleDelete = () => {\n    sendTelemetryEvent(TelemetryEvents[\"DocumentationEditor/TestDeleteClick\"], {\n      test: test.test_metadata?.name ?? \"\",\n      entityName: column,\n    });\n    panelLogger.info(\"delete test\", test);\n    handleSave(\n      { test: test.test_metadata?.name as DbtGenericTests },\n      column,\n      TestOperation.DELETE,\n    );\n    onClose();\n  };\n\n  const handleEdit = () => {\n    sendTelemetryEvent(TelemetryEvents[\"DocumentationEditor/TestEditClick\"], {\n      test: test.test_metadata?.name ?? \"\",\n      entityName: column,\n    });\n    setIsInEditMode(true);\n    if (test.test_metadata?.name === DbtGenericTests.ACCEPTED_VALUES) {\n      setValue(\n        \"accepted_values\",\n        (test.test_metadata.kwargs as TestMetadataAcceptedValuesKwArgs).values,\n      );\n      return;\n    }\n\n    if (test.test_metadata?.name === DbtGenericTests.RELATIONSHIPS) {\n      setValue(\n        \"to\",\n        (test.test_metadata.kwargs as TestMetadataRelationshipsKwArgs).to,\n      );\n      setValue(\n        \"field\",\n        (test.test_metadata.kwargs as TestMetadataRelationshipsKwArgs).field,\n      );\n      return;\n    }\n  };\n\n  const handleCancel = () => {\n    sendTelemetryEvent(TelemetryEvents[\"DocumentationEditor/TestEditCancel\"], {\n      test: test.test_metadata?.name ?? \"\",\n      entityName: column,\n    });\n    setIsInEditMode(false);\n  };\n\n  const acceptedValues = watch(\"accepted_values\");\n  const fieldValue = watch(\"field\");\n  const toValue = watch(\"to\");\n  const formType = test.test_metadata?.name;\n\n  const disableFormSubmit = useMemo(() => {\n    if (formType === DbtGenericTests.ACCEPTED_VALUES) {\n      return !acceptedValues?.length;\n    }\n    if (formType === DbtGenericTests.RELATIONSHIPS) {\n      return !fieldValue || !toValue;\n    }\n    return false;\n  }, [formType, fieldValue, toValue, acceptedValues]);\n\n  const getFooter = () => {\n    return (\n      <CardFooter>\n        <Stack className=\"mt-3\">\n          <Button type=\"submit\" disabled={isSaving || disableFormSubmit}>\n            Update\n          </Button>\n          <Button outline onClick={handleCancel} disabled={isSaving}>\n            Cancel\n          </Button>\n        </Stack>\n      </CardFooter>\n    );\n  };\n\n  const onSubmit = (data: SaveRequest) => {\n    const testName = test.test_metadata?.name;\n    // Dont submit for non generic test\n    if (!testName) {\n      return;\n    }\n\n    if (!isInEditMode) {\n      return;\n    }\n\n    sendTelemetryEvent(\n      TelemetryEvents[\"DocumentationEditor/TestEditUpdateClick\"],\n      { test: test.test_metadata?.name ?? \"\", entityName: column },\n    );\n    handleSave(\n      { ...data, test: testName as DbtGenericTests },\n      column,\n      TestOperation.UPDATE,\n    );\n    onClose();\n  };\n\n  const getEditableContent = () => {\n    switch (test.test_metadata?.name) {\n      case DbtGenericTests.UNIQUE:\n      case DbtGenericTests.NOT_NULL:\n        return null;\n      case DbtGenericTests.ACCEPTED_VALUES:\n        return (\n          <Card>\n            <CardBody>\n              <div>\n                <AcceptedValues\n                  control={control}\n                  values={acceptedValues}\n                  column={column}\n                  setValue={setValue}\n                />\n                {getFooter()}\n              </div>\n            </CardBody>\n          </Card>\n        );\n      case DbtGenericTests.RELATIONSHIPS:\n        return (\n          <Card>\n            <CardBody>\n              <div>\n                <Relationships\n                  control={control}\n                  toValue={\n                    (\n                      test.test_metadata\n                        .kwargs as TestMetadataRelationshipsKwArgs\n                    ).to\n                  }\n                  fieldValue={\n                    (\n                      test.test_metadata\n                        .kwargs as TestMetadataRelationshipsKwArgs\n                    ).field\n                  }\n                />\n                {getFooter()}\n              </div>\n            </CardBody>\n          </Card>\n        );\n\n      default:\n        return null;\n    }\n  };\n\n  return (\n    <Stack direction=\"column\" className={classes.addTest}>\n      <Card>\n        <CardTitle>Column: {test.column_name}</CardTitle>\n        <CardBody>\n          <Stack className={classes.title}>\n            <span>\n              Test:{\" \"}\n              <Tag color=\"primary\" style={{ cursor: \"auto\" }}>\n                {test.test_metadata?.name ?? test.key}\n              </Tag>\n            </span>\n            <span>\n              {isEditableTest ? (\n                <IconButton title=\"Edit test\" onClick={handleEdit}>\n                  <EditIcon />\n                </IconButton>\n              ) : null}\n              {canDeleteTest ? (\n                <IconButton\n                  style={{ color: \"var(--action-red)\" }}\n                  title=\"Delete test\"\n                  onClick={handleDelete}\n                >\n                  <DeleteIcon />\n                </IconButton>\n              ) : null}\n            </span>\n          </Stack>\n        </CardBody>\n      </Card>\n\n      <form onSubmit={handleSubmit(onSubmit)}>\n        {isInEditMode ? (\n          getEditableContent()\n        ) : (\n          <TestDetails test={test} testType={testType} />\n        )}\n      </form>\n    </Stack>\n  );\n};\n\nexport default DisplayTestDetails;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/tests/EntityWithTests.tsx",
    "content": "import Test from \"./Test\";\nimport AddTest from \"./AddTest\";\nimport { DBTModelTest } from \"@modules/documentationEditor/state/types\";\nimport { EntityType } from \"@modules/dataPilot/components/docGen/types\";\nimport { Stack, Drawer, DrawerRef, Button } from \"@uicore\";\nimport { useMemo, useRef, useState } from \"react\";\nimport DisplayTestDetails from \"./DisplayTestDetails\";\nimport classes from \"../../styles.module.scss\";\nimport { TestsIcon } from \"@assets/icons\";\nimport { sendTelemetryEvent } from \"../telemetry\";\nimport { TelemetryEvents } from \"@telemetryEvents\";\nimport useDocumentationContext from \"@modules/documentationEditor/state/useDocumentationContext\";\n\ninterface Props {\n  title: string;\n  tests?: DBTModelTest[];\n  type: EntityType;\n}\n\nconst MaxVisibleTests = 3;\n\nconst EntityWithTests = ({ title, tests, type }: Props): JSX.Element | null => {\n  const {\n    state: { incomingDocsData },\n  } = useDocumentationContext();\n  const [selectedTest, setSelectedTest] = useState<DBTModelTest | null>(null);\n  const [showAllTests, setshowAllTests] = useState(false);\n  const drawerRef = useRef<DrawerRef | null>(null);\n  const handleClose = () => {\n    setSelectedTest(null);\n    drawerRef.current?.close();\n  };\n\n  const handleShowAllTests = () => setshowAllTests(true);\n\n  const onSelect = (test: DBTModelTest) => {\n    setSelectedTest(test);\n    sendTelemetryEvent(\n      type === EntityType.MODEL\n        ? TelemetryEvents[\"DocumentationEditor/ModelTestClick\"]\n        : TelemetryEvents[\"DocumentationEditor/ColumnTestClick\"],\n      { entityName: title, testName: test.test_metadata?.name ?? test.key },\n    );\n    drawerRef.current?.open();\n  };\n\n  const currentTests = useMemo(\n    () =>\n      tests\n        ?.map((t) => t.test_metadata?.name)\n        .filter((item): item is string => !!item),\n    [tests],\n  );\n\n  const visibleTests = showAllTests\n    ? tests\n    : (tests ?? []).slice(0, MaxVisibleTests);\n  const remainingTests = (tests ?? []).length - MaxVisibleTests;\n  const testKeys = incomingDocsData?.tests?.map((t) => t.key);\n\n  return (\n    <div className={classes.entityTests}>\n      <Stack className={type}>\n        <div className={classes.testsRow}>\n          <p className=\"mb-0 d-inline\">\n            <TestsIcon /> Tests:\n          </p>\n          {visibleTests?.map((test) => (\n            <Test\n              key={test.key}\n              test={test}\n              onSelect={onSelect}\n              selectedTest={selectedTest}\n              className={!testKeys?.includes(test.key) ? \"border-orange\" : \"\"}\n            />\n          ))}\n          {!showAllTests && tests && tests.length > MaxVisibleTests ? (\n            <Button\n              outline\n              onClick={handleShowAllTests}\n              className={classes.showAllTests}\n              title={`Show all tests`}\n            >\n              {remainingTests} {remainingTests > 1 ? \"tests\" : \"test\"} +\n            </Button>\n          ) : null}\n          <AddTest title={title} currentTests={currentTests} type={type} />\n        </div>\n      </Stack>\n      <Drawer ref={drawerRef} onClose={handleClose}>\n        {selectedTest ? (\n          <DisplayTestDetails\n            onClose={handleClose}\n            test={selectedTest}\n            column={title}\n            type={type}\n          />\n        ) : null}\n      </Drawer>\n    </div>\n  );\n};\n\nexport default EntityWithTests;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/tests/Test.tsx",
    "content": "import { DBTModelTest } from \"@modules/documentationEditor/state/types\";\nimport { Tag, Tooltip } from \"@uicore\";\n\ninterface Props {\n  test: DBTModelTest;\n  onSelect: (test: DBTModelTest) => void;\n  selectedTest: DBTModelTest | null;\n  className?: string;\n}\n\nconst Test = ({\n  test,\n  onSelect,\n  selectedTest,\n  className,\n}: Props): JSX.Element => {\n  const handleClick = () => {\n    onSelect(test);\n  };\n\n  return (\n    <Tooltip\n      title={\"Click to view details\"}\n      id={`tooltip-${test.column_name ?? \"\"}-${test.test_metadata?.name ?? \"\"}`}\n    >\n      <Tag\n        color={selectedTest?.key === test.key ? \"primary\" : \"default\"}\n        key={test.key}\n        onClick={handleClick}\n        className={className}\n      >\n        {test.test_metadata?.name ?? test.key}\n      </Tag>\n    </Tooltip>\n  );\n};\n\nexport default Test;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/tests/TestDetails.tsx",
    "content": "import {\n  DbtGenericTests,\n  DBTModelTest,\n  DbtTestTypes,\n  TestMetadataAcceptedValuesKwArgs,\n  TestMetadataRelationshipsKwArgs,\n} from \"@modules/documentationEditor/state/types\";\nimport {\n  Card,\n  CardBody,\n  CardTitle,\n  Label,\n  ListGroup,\n  ListGroupItem,\n  Stack,\n} from \"@uicore\";\nimport { useMemo } from \"react\";\nimport classes from \"../../styles.module.scss\";\nimport DbtTestCode from \"./DbtTestCode\";\n\ninterface Props {\n  testType: DbtTestTypes;\n  test: DBTModelTest;\n}\n\nconst TestDetails = ({ testType, test }: Props): JSX.Element => {\n  const testConfig = useMemo(() => {\n    switch (testType) {\n      case DbtTestTypes.GENERIC:\n        switch (test.test_metadata?.name) {\n          case DbtGenericTests.ACCEPTED_VALUES:\n            return (\n              <Card>\n                <CardBody>\n                  <CardTitle className=\"d-flex justify-content-between\">\n                    Values\n                  </CardTitle>\n                  <ListGroup className={classes.testListGroup}>\n                    {(\n                      test.test_metadata\n                        .kwargs as TestMetadataAcceptedValuesKwArgs\n                    ).values?.map((value) => (\n                      <ListGroupItem key={value} tag=\"div\">\n                        {value}\n                      </ListGroupItem>\n                    ))}\n                  </ListGroup>\n                </CardBody>\n              </Card>\n            );\n          case DbtGenericTests.RELATIONSHIPS:\n            return (\n              <Card>\n                <CardBody>\n                  <CardTitle className=\"d-flex justify-content-between\">\n                    Values\n                  </CardTitle>\n                  <Stack direction=\"column\">\n                    <div>\n                      <Label>To:</Label>\n                      <div\n                        className=\"p-2 px-3 rounded\"\n                        style={{ background: \"var(--background--02)\" }}\n                      >\n                        {\n                          (\n                            test.test_metadata\n                              .kwargs as TestMetadataRelationshipsKwArgs\n                          ).to\n                        }\n                      </div>\n                    </div>\n                    <div>\n                      <Label>Field:</Label>\n                      <div\n                        className=\"p-2 px-3 rounded\"\n                        style={{ background: \"var(--background--02)\" }}\n                      >\n                        {\n                          (\n                            test.test_metadata\n                              .kwargs as TestMetadataRelationshipsKwArgs\n                          ).field\n                        }\n                      </div>\n                    </div>\n                  </Stack>\n                </CardBody>\n              </Card>\n            );\n\n          default:\n            break;\n        }\n        break;\n      default:\n        break;\n    }\n    return null;\n  }, [testType, test.test_metadata]);\n\n  return (\n    <Stack direction=\"column\">\n      {testConfig}\n      <DbtTestCode test={test} />\n    </Stack>\n  );\n};\n\nexport default TestDetails;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/tests/forms/AcceptedValues.tsx",
    "content": "import { executeRequestInSync } from \"@modules/app/requestExecutor\";\nimport useDocumentationContext from \"@modules/documentationEditor/state/useDocumentationContext\";\nimport { panelLogger } from \"@modules/logger\";\nimport { LoadingButton, OptionType, Select, Stack } from \"@uicore\";\nimport { useEffect, useState } from \"react\";\nimport { Control, Controller, UseFormSetValue } from \"react-hook-form\";\nimport { SaveRequest } from \"../types\";\n\ninterface Props {\n  control: Control<SaveRequest, unknown>;\n  column: string;\n  values?: string[];\n  setValue: UseFormSetValue<SaveRequest>;\n}\nconst AcceptedValues = ({\n  control,\n  column,\n  setValue,\n  values,\n}: Props): JSX.Element => {\n  const {\n    state: { currentDocsData },\n  } = useDocumentationContext();\n  const [, setRefresh] = useState(Date.now());\n  const [isLoading, setIsLoading] = useState(false);\n  const getDistinctColumnValues = async () => {\n    setIsLoading(true);\n    try {\n      const result = (await executeRequestInSync(\"getDistinctColumnValues\", {\n        model: currentDocsData?.name,\n        column,\n      })) as string[] | undefined;\n\n      if (result?.length && values?.length) {\n        const items = [\"Yes, overwrite\", \"Cancel\"];\n        const response = await executeRequestInSync(\"showInformationMessage\", {\n          infoMessage: \"Overwrite the existing values?\",\n          items,\n        });\n        if (response !== items[0]) {\n          return;\n        }\n      }\n      setValue(\"accepted_values\", result);\n    } catch (e) {\n      panelLogger.error(\"Unable to get distinct values\", e);\n    } finally {\n      setIsLoading(false);\n    }\n  };\n\n  useEffect(() => {\n    setRefresh(Date.now());\n  }, [values]);\n  return (\n    <div>\n      <Controller\n        control={control}\n        name=\"accepted_values\"\n        render={({ field: { onChange, ref } }) => (\n          <Select\n            components={{\n              DropdownIndicator: null,\n              Menu: () => null,\n            }}\n            ref={ref}\n            inputId=\"accepted_values\"\n            hideOptionIcon\n            isCreatable\n            isClearable\n            value={values?.map((v) => ({ label: v, value: v })) ?? []}\n            defaultValue={values?.map((v) => ({ label: v, value: v })) ?? []}\n            isMulti\n            onChange={(updates: unknown) => {\n              const newValues = ((updates ?? []) as OptionType[])?.map(\n                (val) => val.value,\n              );\n              setValue(\"accepted_values\", newValues);\n\n              return onChange(newValues);\n            }}\n            placeholder=\"Type a value and press enter to add\"\n          />\n        )}\n      />\n      <Stack className=\"mt-2 justify-content-between align-items-baseline\">\n        <p className=\"p4\">Hit enter to add value</p>\n\n        <LoadingButton onClick={getDistinctColumnValues} loading={isLoading}>\n          Get distinct column values\n        </LoadingButton>\n      </Stack>\n    </div>\n  );\n};\n\nexport default AcceptedValues;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/tests/forms/Relationships.tsx",
    "content": "import { executeRequestInSync } from \"@modules/app/requestExecutor\";\nimport { panelLogger } from \"@modules/logger\";\nimport { OptionType, Label, Select } from \"@uicore\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { Control, Controller } from \"react-hook-form\";\nimport { SaveRequest } from \"../types\";\nimport { sendTelemetryEvent } from \"../../telemetry\";\nimport { TelemetryEvents } from \"@telemetryEvents\";\n\ninterface Props {\n  control: Control<SaveRequest, unknown>;\n  toValue?: string;\n  fieldValue?: string;\n}\nconst Relationships = ({\n  control,\n  toValue,\n  fieldValue,\n}: Props): JSX.Element => {\n  const [toFieldOptions, setToFieldOptions] = useState<OptionType[]>([]);\n  const [toModelOptions, setModels] = useState<OptionType[]>([]);\n  const [toSourceOptions, setSources] = useState<OptionType[]>([]);\n\n  const getColumnsOfModel = async (model: string) => {\n    const iterator = model.matchAll(/['\"]([^'\"]*)['\"]/g);\n    const matches = [];\n    for (const match of iterator) {\n      matches.push(match.map((m) => m.toString()));\n    }\n    if (!matches.length) {\n      panelLogger.info(\"No model name parsed\", matches);\n      return;\n    }\n\n    // Refs\n    if (matches.length === 1) {\n      const columnsResult = (await executeRequestInSync(\"getColumnsOfModel\", {\n        model: matches[0][1],\n      })) as { columns: string[] };\n      setToFieldOptions(\n        columnsResult.columns.map((m) => ({ label: m, value: m })),\n      );\n      return;\n    }\n    // sources\n    if (matches.length > 1) {\n      const columnsResult = (await executeRequestInSync(\"getColumnsOfSources\", {\n        source: matches[0][1],\n        table: matches[1][1],\n      })) as { columns: string[] };\n      setToFieldOptions(\n        columnsResult.columns.map((m) => ({ label: m, value: m })),\n      );\n      return;\n    }\n  };\n\n  useEffect(() => {\n    Promise.all([\n      executeRequestInSync(\"getModelsInProject\", {}),\n      executeRequestInSync(\"getSourcesInProject\", {}),\n    ])\n      .then(([modelsResponse, sourcesResponse]) => {\n        setModels(\n          (modelsResponse as { models: string[] }).models.map((m) => ({\n            label: `ref('${m}')`,\n            value: `ref('${m}')`,\n          })),\n        );\n        setSources(\n          (\n            sourcesResponse as {\n              sources: {\n                name: string;\n                tables: string[];\n              }[];\n            }\n          ).sources\n            .map(({ name, tables }) => {\n              return tables.map((t) => ({\n                label: `source('${name}', '${t}')`,\n                value: `source('${name}', '${t}')`,\n              }));\n            })\n            .flat(),\n        );\n      })\n      .catch((err) => panelLogger.error(\"error while getting models\", err));\n  }, []);\n\n  useEffect(() => {\n    if (toValue) {\n      getColumnsOfModel(toValue).catch((err) =>\n        panelLogger.info(\"error while getting columns\", err),\n      );\n    }\n  }, [toValue]);\n\n  const toOptions = useMemo(() => {\n    return [...toModelOptions, ...toSourceOptions];\n  }, [toModelOptions, toSourceOptions]);\n  return (\n    <div>\n      <div style={{ marginBottom: \"var(--spacing-xl)\" }}>\n        <Label htmlFor=\"relationship-to\">To</Label>\n        <Controller\n          control={control}\n          name=\"to\"\n          render={({ field: { onChange, ref, value } }) => (\n            <Select\n              inputId=\"relationship-to\"\n              ref={ref}\n              openMenuOnFocus\n              options={toOptions}\n              value={toOptions.find((c) => c.value === value)}\n              defaultValue={\n                toValue ? { label: toValue, value: toValue } : undefined\n              }\n              onChange={(val: unknown) => {\n                const selectedModel = (val as OptionType).value;\n                sendTelemetryEvent(\n                  TelemetryEvents[\"DocumentationEditor/RelationshipsToSelect\"],\n                  { to: selectedModel },\n                );\n                getColumnsOfModel(selectedModel).catch((err) =>\n                  panelLogger.error(\n                    `error while fetching colums of model: ${selectedModel}`,\n                    err,\n                  ),\n                );\n                return onChange(selectedModel);\n              }}\n            />\n          )}\n        />\n      </div>\n      <div>\n        <Label htmlFor=\"relationship-field\">Field</Label>\n        <Controller\n          control={control}\n          name=\"field\"\n          render={({ field: { onChange, ref, value } }) => (\n            <Select\n              inputId=\"relationship-field\"\n              ref={ref}\n              openMenuOnFocus\n              options={toFieldOptions}\n              defaultValue={\n                fieldValue\n                  ? { label: fieldValue, value: fieldValue }\n                  : undefined\n              }\n              value={toFieldOptions.find((c) => c.value === value)}\n              onChange={(val: unknown) => {\n                sendTelemetryEvent(\n                  TelemetryEvents[\n                    \"DocumentationEditor/RelationshipsFieldSelect\"\n                  ],\n                  { field: (val as OptionType).value },\n                );\n\n                return onChange((val as OptionType).value);\n              }}\n            />\n          )}\n        />\n      </div>\n    </div>\n  );\n};\n\nexport default Relationships;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/tests/forms/TestForm.tsx",
    "content": "import { yupResolver } from \"@hookform/resolvers/yup\";\nimport * as Yup from \"yup\";\nimport { useForm } from \"react-hook-form\";\nimport { DbtGenericTests } from \"@modules/documentationEditor/state/types\";\nimport {\n  Card,\n  CardTitle,\n  CardBody,\n  CardFooter,\n  Button,\n  Stack,\n  Tag,\n} from \"@uicore\";\nimport AcceptedValues from \"./AcceptedValues\";\nimport Relationships from \"./Relationships\";\nimport { useEffect, useMemo } from \"react\";\nimport useTestFormSave, { TestOperation } from \"../hooks/useTestFormSave\";\nimport { SaveRequest } from \"../types\";\nimport { sendTelemetryEvent } from \"../../telemetry\";\nimport { TelemetryEvents } from \"@telemetryEvents\";\n\ninterface Props {\n  formType: DbtGenericTests;\n  onClose: () => void;\n  column: string;\n}\n\nconst schema = Yup.object({\n  to: Yup.string().optional(),\n  field: Yup.string().optional(),\n  accepted_values: Yup.array().of(Yup.string().required()).optional(),\n}).required();\n\nconst TestForm = ({ formType, onClose, column }: Props): JSX.Element | null => {\n  const { isSaving, handleSave } = useTestFormSave();\n\n  const { control, handleSubmit, reset, setValue, watch } =\n    useForm<SaveRequest>({\n      resolver: yupResolver(schema),\n    });\n\n  const saveGenericTest = () => {\n    if (\n      formType === DbtGenericTests.NOT_NULL ||\n      formType === DbtGenericTests.UNIQUE\n    ) {\n      handleSave({ test: formType }, column, TestOperation.CREATE);\n      onClose();\n      return;\n    }\n  };\n  useEffect(() => {\n    if (!formType || isSaving) {\n      return;\n    }\n\n    saveGenericTest();\n  }, [formType, isSaving]);\n\n  const handleCancel = () => {\n    reset();\n    if (!isSaving) {\n      onClose();\n    }\n  };\n\n  const acceptedValues = watch(\"accepted_values\");\n  const fieldValue = watch(\"field\");\n  const toValue = watch(\"to\");\n\n  const disableFormSubmit = useMemo(() => {\n    if (formType === DbtGenericTests.ACCEPTED_VALUES) {\n      return !acceptedValues?.length;\n    }\n    if (formType === DbtGenericTests.RELATIONSHIPS) {\n      return !fieldValue || !toValue;\n    }\n    return false;\n  }, [formType, fieldValue, toValue, acceptedValues]);\n\n  const handleSaveClick = handleSubmit((d) => {\n    sendTelemetryEvent(\n      formType === DbtGenericTests.ACCEPTED_VALUES\n        ? TelemetryEvents[\"DocumentationEditor/AcceptedValuesSaveClick\"]\n        : TelemetryEvents[\"DocumentationEditor/RelationshipsSaveClick\"],\n    );\n    handleSave({ ...d, test: formType }, column, TestOperation.CREATE);\n    onClose();\n  });\n\n  if (\n    formType !== DbtGenericTests.RELATIONSHIPS &&\n    formType !== DbtGenericTests.ACCEPTED_VALUES\n  ) {\n    return null;\n  }\n\n  return (\n    <Card>\n      <CardTitle>\n        <div className=\"mb-1\">Selected test</div>\n        <Tag color=\"primary\" style={{ cursor: \"auto\" }}>\n          {formType}\n        </Tag>\n      </CardTitle>\n      <CardBody>\n        {formType === DbtGenericTests.RELATIONSHIPS ? (\n          <Relationships control={control} />\n        ) : (\n          <AcceptedValues\n            control={control}\n            column={column}\n            setValue={setValue}\n            values={acceptedValues}\n          />\n        )}\n      </CardBody>\n      <CardFooter>\n        <Stack className=\"mt-3\">\n          <Button\n            onClick={handleSaveClick}\n            color=\"primary\"\n            disabled={disableFormSubmit}\n          >\n            Add\n          </Button>\n          <Button onClick={handleCancel} outline>\n            Cancel\n          </Button>\n        </Stack>\n      </CardFooter>\n    </Card>\n  );\n};\n\nexport default TestForm;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/tests/hooks/useTestFormSave.ts",
    "content": "import useDocumentationContext from \"@modules/documentationEditor/state/useDocumentationContext\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { SaveRequest } from \"../types\";\nimport { updateCurrentDocsTests } from \"@modules/documentationEditor/state/documentationSlice\";\nimport { panelLogger } from \"@modules/logger\";\nimport {\n  DBTModelTest,\n  DbtGenericTests,\n  TestMetadataRelationshipsKwArgs,\n  TestMetadataAcceptedValuesKwArgs,\n} from \"@modules/documentationEditor/state/types\";\nimport { IncomingMessageProps } from \"@modules/app/types\";\nimport { generateHash } from \"../utils\";\n\nexport enum TestOperation {\n  CREATE,\n  UPDATE,\n  DELETE,\n}\n\ninterface IncomingTest {\n  tests: {\n    name: string;\n    tests?: (string | Record<string, unknown>)[];\n    columns?: { name: string; tests: (string | Record<string, unknown>)[] }[];\n  };\n  model: string;\n  column?: string;\n}\n\nconst useTestFormSave = (): {\n  handleSave: (\n    data: SaveRequest,\n    column: string,\n    operation: TestOperation,\n  ) => void;\n  isSaving: boolean;\n} => {\n  const [isSaving, setIsSaving] = useState(false);\n  const {\n    state: { currentDocsData, currentDocsTests },\n    dispatch,\n  } = useDocumentationContext();\n\n  const onMesssage = useCallback(\n    (event: MessageEvent<IncomingMessageProps & IncomingTest>) => {\n      const { command, ...params } = event.data;\n      switch (command) {\n        case \"testgen:insert\":\n          panelLogger.info(\"received new test gen\", event.data);\n          handleTestInsert(params);\n          break;\n\n        default:\n          break;\n      }\n    },\n    [],\n  );\n\n  const handleTestInsert = (params: IncomingTest) => {\n    const testsData = [...(currentDocsTests ?? [])];\n    // model tests\n    params.tests.tests?.forEach((t) => {\n      const key = typeof t === \"string\" ? t : Object.keys(t)?.[0];\n      const rest =\n        typeof t === \"object\" && typeof t[key] === \"object\"\n          ? (t[key] as Record<string, unknown>)\n          : {};\n\n      if (key) {\n        testsData.push({\n          key: `${key}_${params.model}`,\n          test_metadata: {\n            // @ts-expect-error test\n            kwargs: {\n              model: params.model,\n              ...rest,\n            },\n            name: key,\n          },\n        });\n      }\n    });\n\n    // column tests\n    params.tests.columns?.forEach((column) => {\n      column.tests.forEach((t) => {\n        const key = typeof t === \"string\" ? t : Object.keys(t)?.[0];\n        const rest =\n          typeof t === \"object\" && typeof t[key] === \"object\"\n            ? (t[key] as Record<string, unknown>)\n            : {};\n        const testKey = params.model\n          ? `${key}_${params.model}_${column.name}`\n          : `${key}_${column.name}`;\n        // Remove already existing tests\n        if (testsData.find((test) => test.key === testKey)) {\n          return;\n        }\n        if (key) {\n          testsData.push({\n            column_name: column.name,\n            key: testKey,\n            test_metadata: {\n              kwargs: {\n                column_name: column.name,\n                model: params.model,\n                ...rest,\n              },\n              name: key,\n            },\n          });\n        }\n      });\n    });\n    panelLogger.info(\"insert test data\", testsData);\n    dispatch(updateCurrentDocsTests(testsData));\n  };\n\n  useEffect(() => {\n    window.addEventListener(\"message\", onMesssage);\n\n    return () => {\n      window.removeEventListener(\"message\", onMesssage);\n    };\n  }, [onMesssage]);\n\n  const updateTests = (\n    testsData: DBTModelTest[],\n    data:\n      | Partial<TestMetadataAcceptedValuesKwArgs>\n      | Partial<TestMetadataRelationshipsKwArgs>,\n    type: DbtGenericTests,\n    column: string,\n  ) => {\n    const temp = [...testsData];\n    const currentIndex = temp.findIndex(\n      (test: DBTModelTest) =>\n        test.test_metadata?.name === type &&\n        test.test_metadata.kwargs.column_name === column,\n    );\n    if (currentIndex > -1) {\n      temp[currentIndex] = {\n        ...temp[currentIndex],\n        test_metadata: {\n          ...temp[currentIndex].test_metadata,\n          name: temp[currentIndex].test_metadata?.name ?? \"\",\n          kwargs: {\n            ...temp[currentIndex].test_metadata!.kwargs,\n            ...data,\n          },\n        },\n      };\n      return temp;\n    }\n\n    return temp;\n  };\n\n  const getUpdatedTestsData = async (\n    data: SaveRequest,\n    column: string,\n    operation: TestOperation,\n  ) => {\n    const testsData = [...(currentDocsTests ?? [])];\n    const newValues = data.accepted_values?.map((s) => s.trim());\n    if (operation === TestOperation.DELETE) {\n      return testsData.filter((test: DBTModelTest) => {\n        if (test.test_metadata?.kwargs.column_name !== column) {\n          return true;\n        }\n\n        return test.test_metadata?.name !== data.test?.toString();\n      });\n    }\n    if (operation === TestOperation.CREATE) {\n      const hashKey = await generateHash(JSON.stringify({ ...data, column }));\n      testsData.push({\n        column_name: column,\n        key: hashKey,\n        test_metadata: {\n          name: data.test!,\n          kwargs: {\n            column_name: column,\n            model: currentDocsData?.name ?? \"\",\n            values: newValues,\n            to: data.to ? data.to : undefined,\n            field: data.field,\n          },\n        },\n      });\n      return testsData;\n    }\n\n    if (data.test === DbtGenericTests.ACCEPTED_VALUES) {\n      return updateTests(\n        testsData,\n        { values: newValues ?? [] },\n        DbtGenericTests.ACCEPTED_VALUES,\n        column,\n      );\n    }\n\n    if (data.test === DbtGenericTests.RELATIONSHIPS) {\n      return updateTests(\n        testsData,\n        {\n          to: data.to ? data.to : undefined,\n          field: data.field,\n        },\n        DbtGenericTests.RELATIONSHIPS,\n        column,\n      );\n    }\n    return testsData;\n  };\n\n  const handleSave = async (\n    data: SaveRequest,\n    column: string,\n    operation: TestOperation,\n  ) => {\n    setIsSaving(true);\n\n    if (!data.test) {\n      return;\n    }\n\n    const testsData = await getUpdatedTestsData(data, column, operation);\n    panelLogger.info(\"add/update test data\", testsData);\n    dispatch(updateCurrentDocsTests(testsData));\n  };\n\n  return { handleSave, isSaving };\n};\n\nexport default useTestFormSave;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/tests/types.ts",
    "content": "import { DbtGenericTests } from \"@modules/documentationEditor/state/types\";\n\nexport interface SaveRequest {\n  to?: string;\n  field?: string;\n  accepted_values?: string[];\n  test?: DbtGenericTests;\n}\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/components/tests/utils.ts",
    "content": "import {\n  DbtGenericTests,\n  DBTModelTest,\n  DbtTestTypes,\n} from \"@modules/documentationEditor/state/types\";\n\n/**\n * dbt tests types handled so far\n * - generic tests - not_null, unique, relationships, accepted_values\n * - tests as macro defined in macro directory\n * - sql query in tests directory\n * - macros defined in external packages like dbt_expectations\n */\nexport const findDbtTestType = (test: DBTModelTest): DbtTestTypes => {\n  if (!test.test_metadata?.name) {\n    if (test.path?.endsWith(\".sql\")) {\n      return DbtTestTypes.SINGULAR;\n    }\n    return DbtTestTypes.UNKNOWN;\n  }\n\n  if (\n    Object.values(DbtGenericTests).includes(\n      test.test_metadata.name as DbtGenericTests,\n    )\n  ) {\n    return DbtTestTypes.GENERIC;\n  }\n\n  if (test.test_metadata.namespace) {\n    return DbtTestTypes.EXTERNAL_PACKAGE;\n  }\n\n  return DbtTestTypes.MACRO;\n};\n\nexport async function generateHash(str: string): Promise<string> {\n  const encoder = new TextEncoder();\n  const data = encoder.encode(str); // Convert string to Uint8Array\n  const hashBuffer = await crypto.subtle.digest(\"SHA-256\", data); // Generate hash\n  const hashArray = Array.from(new Uint8Array(hashBuffer)); // Convert buffer to byte array\n  const hashHex = hashArray\n    .map((byte) => byte.toString(16).padStart(2, \"0\"))\n    .join(\"\"); // Convert to hex string\n  return hashHex; // Return as string\n}\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/state/documentationSlice.ts",
    "content": "import { createSlice, PayloadAction } from \"@reduxjs/toolkit\";\nimport { GenerationDBDataProps } from \"../types\";\nimport {\n  DBTDocumentation,\n  DocsGenerateUserInstructions,\n  DocumentationStateProps,\n  MetadataColumn,\n} from \"./types\";\nimport {\n  isStateDirty,\n  mergeCurrentAndIncomingDocumentationColumns,\n} from \"../utils\";\nimport { Citation } from \"@lib\";\n\nexport const initialState = {\n  incomingDocsData: undefined,\n  currentDocsData: undefined,\n  currentDocsTests: undefined,\n  project: undefined,\n  generationHistory: [],\n  insertedEntityName: undefined,\n  docUpdatedForModel: undefined,\n  docUpdatedForColumns: [],\n  userInstructions: {\n    language: undefined,\n    persona: undefined,\n    prompt_hint: undefined,\n  },\n  conversations: {},\n  showConversationsRightPanel: false,\n  collaborationEnabled: false,\n  missingDocumentationMessage: undefined,\n  searchQuery: \"\",\n  showSingleDocsPropRightPanel: false,\n  showBulkDocsPropRightPanel: false,\n  docBlocks: [],\n} as DocumentationStateProps;\n\nconst documentationSlice = createSlice({\n  name: \"documentationState\",\n  initialState,\n  reducers: {\n    setSearchQuery: (\n      state,\n      action: PayloadAction<DocumentationStateProps[\"searchQuery\"]>,\n    ) => {\n      state.searchQuery = action.payload;\n    },\n    updatConversations: (\n      state,\n      { payload }: PayloadAction<DocumentationStateProps[\"conversations\"]>,\n    ) => {\n      Object.entries(payload).forEach(([shareId, conversationGroups]) => {\n        state.conversations[parseInt(shareId)] = conversationGroups;\n      });\n    },\n    setMissingDocumentationMessage: (\n      state,\n      action: PayloadAction<\n        DocumentationStateProps[\"missingDocumentationMessage\"]\n      >,\n    ) => {\n      state.missingDocumentationMessage = action.payload;\n    },\n    updateConversationsRightPanelState: (\n      state,\n      action: PayloadAction<\n        DocumentationStateProps[\"showConversationsRightPanel\"]\n      >,\n    ) => {\n      state.showConversationsRightPanel = action.payload;\n    },\n    updateSingleDocsPropRightPanel: (\n      state,\n      action: PayloadAction<\n        DocumentationStateProps[\"showSingleDocsPropRightPanel\"]\n      >,\n    ) => {\n      state.showSingleDocsPropRightPanel = action.payload;\n    },\n    updateBulkDocsPropRightPanel: (\n      state,\n      action: PayloadAction<\n        DocumentationStateProps[\"showBulkDocsPropRightPanel\"]\n      >,\n    ) => {\n      state.showBulkDocsPropRightPanel = action.payload;\n    },\n    updateCollaborationEnabled: (\n      state,\n      action: PayloadAction<DocumentationStateProps[\"collaborationEnabled\"]>,\n    ) => {\n      state.collaborationEnabled = action.payload;\n    },\n    updateSelectedConversationGroup: (\n      state,\n      action: PayloadAction<\n        DocumentationStateProps[\"selectedConversationGroup\"]\n      >,\n    ) => {\n      state.selectedConversationGroup = action.payload;\n    },\n    setProject: (\n      state,\n      action: PayloadAction<DocumentationStateProps[\"project\"]>,\n    ) => {\n      state.project = action.payload;\n      state.docBlocks = [];\n    },\n    setDocBlocks: (\n      state,\n      action: PayloadAction<DocumentationStateProps[\"docBlocks\"]>,\n    ) => {\n      state.docBlocks = action.payload;\n    },\n    updateCurrentDocsTests: (\n      state,\n      action: PayloadAction<DocumentationStateProps[\"currentDocsTests\"]>,\n    ) => {\n      state.currentDocsTests = action.payload;\n    },\n    setInsertedEntityName: (\n      state,\n      action: PayloadAction<string | undefined>,\n    ) => {\n      state.insertedEntityName = action.payload;\n    },\n    setIncomingDocsData: (\n      state,\n      action: PayloadAction<DocumentationStateProps[\"incomingDocsData\"]>,\n    ) => {\n      state.docBlocks = [];\n      // if test/docs data is not changed, then update the state\n      const isCleanForm = !isStateDirty(state);\n\n      if (\n        !state.currentDocsData || // if first load, currentDocsData will be undefined\n        isCleanForm\n      ) {\n        state.incomingDocsData = action.payload ?? {};\n        state.currentDocsData = action.payload?.docs;\n        state.currentDocsTests = action.payload?.tests;\n        return;\n      }\n\n      // If any changes are done in current model, then show alert\n      // empty json to handle cases of switching to file which are not models\n      state.incomingDocsData = action.payload ?? {};\n      return;\n    },\n    updateCurrentDocsData: (\n      state,\n      action: PayloadAction<\n        (Partial<DBTDocumentation> & { isNewGeneration?: boolean }) | undefined\n      >,\n    ) => {\n      // incase of yml files, incoming docs data will be {}, so checking for keys length as well\n      if (!action.payload || !Object.keys(action.payload).length) {\n        state.currentDocsData = undefined;\n        state.docUpdatedForColumns = [];\n        state.docUpdatedForModel = undefined;\n        return;\n      }\n      if (!action.payload.name) {\n        return;\n      }\n      if (!state.currentDocsData) {\n        // Initial render\n        // @ts-expect-error TODO fix this type\n        state.currentDocsData = action.payload;\n        return;\n      }\n\n      // switching editor\n      if (\n        action.payload.name &&\n        state.currentDocsData?.name !== action.payload.name\n      ) {\n        state.docUpdatedForModel = undefined;\n        state.docUpdatedForColumns = [];\n        // @ts-expect-error TODO fix this type\n        state.currentDocsData = action.payload;\n        return;\n      }\n\n      // If description is changed, then show coaching\n      if (\n        state.currentDocsData?.name === action.payload.name &&\n        state.currentDocsData.description !== action.payload.description\n      ) {\n        state.docUpdatedForModel = action.payload.name;\n      }\n\n      state.currentDocsData = { ...state.currentDocsData, ...action.payload };\n    },\n    updateColumnsAfterSync: (\n      state,\n      {\n        payload: { columns },\n      }: PayloadAction<{\n        columns: DBTDocumentation[\"columns\"];\n      }>,\n    ) => {\n      if (!state.currentDocsData) {\n        return;\n      }\n\n      state.currentDocsData.columns =\n        mergeCurrentAndIncomingDocumentationColumns(\n          state.currentDocsData.columns,\n          columns,\n        );\n    },\n    updateColumnsInCurrentDocsData: (\n      state,\n      {\n        payload: { columns },\n      }: PayloadAction<{\n        columns: Partial<\n          MetadataColumn & {\n            description?: string;\n            citations?: Citation[];\n          }\n        >[];\n        isNewGeneration?: boolean;\n      }>,\n    ) => {\n      if (!state.currentDocsData) {\n        state.docUpdatedForColumns = [];\n        return;\n      }\n      const modifiedColumns = columns\n        ?.map((column) => column.name)\n        .filter(Boolean) as string[];\n      if (modifiedColumns) {\n        state.docUpdatedForColumns = [\n          ...state.docUpdatedForColumns,\n          ...modifiedColumns,\n        ];\n      }\n      state.currentDocsData.columns = state.currentDocsData.columns.map((c) => {\n        const updatedColumn = columns.find((column) => c.name === column.name);\n        if (updatedColumn) {\n          return { ...c, ...updatedColumn };\n        }\n        return c;\n      });\n    },\n    addToGenerationsHistory: (\n      state,\n      action: PayloadAction<GenerationDBDataProps[]>,\n    ) => {\n      action.payload.forEach((history) => {\n        state.generationHistory.push(history);\n      });\n    },\n    setGenerationsHistory: (\n      state,\n      action: PayloadAction<GenerationDBDataProps[]>,\n    ) => {\n      state.generationHistory = action.payload;\n    },\n    resetGenerationsHistory: (state, _action: PayloadAction<undefined>) => {\n      state.generationHistory = [];\n    },\n    updateUserInstructions: (\n      state,\n      action: PayloadAction<DocsGenerateUserInstructions>,\n    ) => {\n      state.userInstructions = { ...state.userInstructions, ...action.payload };\n    },\n  },\n});\n\nexport const {\n  setIncomingDocsData,\n  updateCurrentDocsData,\n  updateColumnsInCurrentDocsData,\n  updateColumnsAfterSync,\n  setProject,\n  setDocBlocks,\n  addToGenerationsHistory,\n  resetGenerationsHistory,\n  setGenerationsHistory,\n  updateUserInstructions,\n  setInsertedEntityName,\n  updateCurrentDocsTests,\n  updatConversations,\n  updateConversationsRightPanelState,\n  updateSelectedConversationGroup,\n  updateCollaborationEnabled,\n  setMissingDocumentationMessage,\n  setSearchQuery,\n  updateSingleDocsPropRightPanel,\n  updateBulkDocsPropRightPanel,\n} = documentationSlice.actions;\nexport default documentationSlice;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/state/types.ts",
    "content": "import { Citation, ConversationGroup, DbtDocsShareDetails } from \"@lib\";\nimport { GenerationDBDataProps } from \"../types\";\n\nexport enum Source {\n  DATABASE = \"DATABASE\",\n  YAML = \"YAML\",\n}\n\nexport interface MetadataColumn {\n  name: string;\n  type?: string;\n}\n\nexport interface DBTDocumentationColumn extends MetadataColumn {\n  description?: string;\n  generated: boolean;\n  source: Source;\n  citations?: Citation[];\n}\n\nexport interface DBTDocumentation {\n  name: string;\n  description: string;\n  columns: DBTDocumentationColumn[];\n  generated: boolean;\n  aiEnabled: boolean;\n  patchPath?: string;\n  uniqueId: string;\n  resource_type?: string;\n  citations?: Citation[];\n}\n\nexport interface TestMetadataKwArgs {\n  column_name: string;\n  model: string;\n}\n\nexport enum DbtTestTypes {\n  EXTERNAL_PACKAGE = \"external\",\n  GENERIC = \"generic\",\n  MACRO = \"macro\",\n  SINGULAR = \"singular\", // sql queries in dbt tests directory\n  UNKNOWN = \"unknown\",\n}\n\nexport enum DbtGenericTests {\n  ACCEPTED_VALUES = \"accepted_values\",\n  NOT_NULL = \"not_null\",\n  RELATIONSHIPS = \"relationships\",\n  UNIQUE = \"unique\",\n}\n\n// for accepted_values\nexport interface TestMetadataAcceptedValuesKwArgs extends TestMetadataKwArgs {\n  values?: string[];\n}\n\n// for relationship\nexport interface TestMetadataRelationshipsKwArgs extends TestMetadataKwArgs {\n  field?: string;\n  to?: string;\n}\n\nexport interface DocBlock {\n  name: string;\n  path: string;\n}\n\nexport interface DocumentationStateProps {\n  docUpdatedForModel?: string;\n  docUpdatedForColumns: string[];\n  incomingDocsData?: { docs?: DBTDocumentation; tests?: DBTModelTest[] };\n  currentDocsData?: DBTDocumentation;\n  currentDocsTests?: DBTModelTest[];\n  project?: string;\n  generationHistory: GenerationDBDataProps[];\n  userInstructions: DocsGenerateUserInstructions;\n  insertedEntityName?: string;\n  conversations: Record<DbtDocsShareDetails[\"share_id\"], ConversationGroup[]>;\n  showConversationsRightPanel: boolean;\n  showSingleDocsPropRightPanel: boolean;\n  showBulkDocsPropRightPanel: boolean;\n  selectedConversationGroup?: {\n    shareId: DbtDocsShareDetails[\"share_id\"];\n    conversationGroupId: ConversationGroup[\"conversation_group_id\"];\n  };\n  collaborationEnabled: boolean;\n  missingDocumentationMessage?: { message: string; type: \"warning\" | \"error\" };\n  searchQuery: string;\n  docBlocks: DocBlock[];\n}\n\nexport interface DBTModelTest {\n  column_name?: string;\n  key: string;\n  path?: string;\n  test_metadata?: {\n    kwargs: TestMetadataAcceptedValuesKwArgs | TestMetadataRelationshipsKwArgs;\n    name: string;\n    namespace?: string;\n  };\n}\n\nexport interface DocsGenerateFollowupInstructions {\n  instruction?: string;\n}\n\nexport interface DocsGenerateUserInstructions {\n  prompt_hint?: string;\n  language?: string;\n  persona?: string;\n}\n\nexport interface DocsGenerateModelRequestV2 {\n  user_instructions?: DocsGenerateUserInstructions;\n  follow_up_instructions?: DocsGenerateFollowupInstructions;\n  description?: string;\n  columns?: string[];\n}\n\nexport interface DocsGenerateColumnRequestV2 {\n  user_instructions: DocsGenerateUserInstructions;\n  description?: string;\n  columnName: string;\n}\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/state/useDocumentationContext.ts",
    "content": "import { UnknownAction } from \"@reduxjs/toolkit\";\nimport { Dispatch, useContext } from \"react\";\nimport { DocumentationContext } from \"../DocumentationProvider\";\nimport { DocumentationStateProps } from \"./types\";\n\nconst useDocumentationContext = (): {\n  state: DocumentationStateProps;\n  dispatch: Dispatch<UnknownAction>;\n} => {\n  const { state, dispatch } = useContext(DocumentationContext);\n  return { state, dispatch };\n};\n\nexport default useDocumentationContext;\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/styles.module.scss",
    "content": "@use '../../variables'; \n\n\n.documentation-wrapper {\n  :global .btn-group {\n    margin-bottom: var(--spacing-3xl);\n  }\n\n  .newTestTag{\n    padding: 3px 10px;\n    border-radius: 4px;\n    &:hover{\n      border-color: var(--primary-color);\n      background-color: transparent;\n      color: var(--text-color--title)\n    }\n  }\n  .custom-test{\n    display: inline-flex;\n    width: auto;\n    justify-content: space-between;\n    align-items: center;\n    color: var(--bs-btn-color);\n    gap: 4px;\n    :global .btn{\n      padding: 0 3px;\n    }\n\n    & svg path {\n      fill: var(--primary-color);\n    }\n    & span{\n      height: 18px;\n      line-height: 0.9;\n      background: var(--action-beta);\n\n      &:hover {\n      background: var(--action-beta);\n      border-color: transparent;\n      }\n    }\n  }\n  .entity-tests {\n    .tests-row{\n      > *,\n      > span > span {\n        margin-right: 0.5rem;\n        margin-bottom: 0.5rem;\n        display: inline-block;\n      }\n    }\n    margin-top: var(--spacing-lg);\n    p {\n      margin-bottom: 0;\n      line-height: 1.8;\n    }\n    :global .model {\n      gap: 5px;\n      h5 {\n        font-weight: 400;\n        font-size: 1rem;\n        margin-bottom: 0;\n        line-height: 1.6;\n      }\n      flex-direction: row;\n      margin-bottom: var(--spacing-lg);\n    }\n    :global .column {\n      flex-direction: column;\n      gap: 0;\n    }\n\n    .btn-add-test {\n      padding: 4px 6px;\n      border-radius: 50%;\n      width: 26px;\n      height: 26px;\n      background: var(--background--02);\n\n      :global .codicon {\n        font-size: 14px;\n        color: var(--icon--active);\n      }\n      &:hover {\n        background: var(--background--03);\n      }\n\n      &:global.btn-primary {\n        background: var(--primary-color);\n\n        &:hover :global .codicon,\n        :global .codicon {\n          font-size: 14px;\n          color: #fff;\n        }\n      }\n\n      &:hover :global .codicon {\n        color: var(--primary-color);\n      }\n    }\n  }\n}\n.doc-generator {\n  max-height: calc(100vh - 100px);\n  display: flex;\n  flex-direction: column;\n  \n  & .head {\n    justify-content: space-between;\n    > div {\n      align-items: center;\n    }\n    & p {\n      text-decoration: underline;\n    }\n  }\n  & .body-wrap {\n    overflow: hidden;\n    & .body {\n      width: 100%;\n      min-width: var(--bs-breakpoint-md);\n      overflow: overlay;\n      padding-right: 1rem;\n\n      & :global .alert {\n        margin-top: 12px;\n      }\n      & .column-header {\n        justify-content: space-between;\n        .sync-btn {\n          svg {\n            width: 14px;\n            vertical-align: bottom;\n          }\n        }\n      }\n      .columns {\n        gap: 16px;\n        h4 {\n          margin-bottom: 16px;\n        }\n      }\n    }\n    & .result-body {\n      width: 40%;\n      overflow: overlay;\n    }\n    .show-all-tests{\n      border-radius: 4px;\n      padding: 3px 9px;\n      &:hover{\n        background-color: transparent;\n        border-color: var(--primary-color);\n      }\n    }\n  }\n\n  &.docTests {\n    .column-header {\n      margin-top: var(--spacing-3xl);\n      margin-bottom: var(--spacing-xl);\n    }\n\n    .test-tag {\n      cursor: pointer;\n    }\n  }\n}\n\n.add-test {\n  gap: var(--spacing-2xl);\n\n  :global .card {\n    background-color: var(--background--base);\n    border-color: transparent;\n  }\n  .title {\n    border-radius: 8px;\n    padding: 1rem;\n    background-color: var(--background--03);\n    justify-content: space-between;\n\n    :global .primary {\n      max-width: 100%;\n      white-space: nowrap;\n      text-overflow: ellipsis;\n      overflow: hidden;\n      vertical-align: middle;\n      margin-left: 3px;\n    }\n  }\n  :global .spinner-border{\n    width: 1rem;\n  height: 1rem;\n  margin-top: 0.15rem;\n  border-width: 2px;\n  }\n  .test-list-group {\n    gap: 10px;\n\n    div,\n    button {\n      border-color: var(--stroke--disable);\n      background-color: var(--background--02);\n      color: var(--text-color--title);\n      border-radius: 8px;\n      border-top-width: 1px;\n      cursor: default;\n      caption {\n        color: var(--text-color--caption);\n        font-size: 1rem;\n        display: inline-block;\n      }\n\n      &:global.disabled {\n        opacity: 0.3;\n      }\n    }\n    :global .btn-primary{\n      background-color: var(--primary-color);\n\n      }\n      \n  }\n\n  :global .card-title {\n    border: none;\n    margin: 0;\n    font-weight: 400;\n    margin-bottom: 1rem;\n    padding-bottom: 0;\n  }\n\n  :global .card-body {\n  }\n\n  :global .card-footer {\n    border: none;\n  }\n\n  :global .card-title {\n    border: none;\n    margin: 0;\n    font-weight: 400;\n    margin-bottom: 1rem;\n    padding-bottom: 0;\n  }\n\n  :global .card-body {\n  }\n\n  :global .card-footer {\n    border: none;\n  }\n}\n\n.bulkGenPopover {\n  :global .popover-body{\n    padding: 0 1rem !important;\n  }\n  .popover {\n    margin-top: -1rem;\n    \n    ul {\n      padding: 0.5rem 0;\n      margin: 0;\n      list-style: none;\n      .sectionTitle{\n        background-color: var(--background--base);\n        padding: 0.5rem;\n        border-radius: 6px;\n      }\n      li {\n        :global .btn {\n          text-decoration: none;\n          width: 100%;\n          text-align: left;\n          background-color: transparent;\n          color: var(--text-color--title);\n        }\n      }\n    }\n  }\n}\n.conversationInputForm{\n  textarea{\n    top: 5px !important;\n    height: 80% !important;\n  }\n}\n\n.limitWidth {\n  max-width: 100%;\n  min-width: 0;\n  flex: 1;\n}\n@media (min-width: 1400px) {\n  .limitWidth {\n    max-width: 1440px;\n  }\n}\n\n.docsIcon {\n  width: 13px;\n  height: 13px;\n  margin-left: -5px;\n\n  path {\n    fill: #198754;\n  }\n}\n\n.docsIconInBtn {\n  height: 17px;\n  width: 13px;\n  vertical-align: text-bottom;\n\n  path {\n    fill: #fff;\n  }\n}\n\n.search{\n  position: relative;\n  :global .codicon{\n    position: absolute;\n    top: 8px;\n    left: 5px;\n  }\n  input {\n    padding-left: 25px;\n    min-width: 200px;\n  }\n}\n\n.saveDocumentation {\n  min-width: 200px;\n  li {\n    list-style: none;\n    padding: 0;\n    margin: 0;\n  }\n\n  :global #file_path {\n    border-radius: 2px;\n    border: 1px solid var(--stroke--disable, #424750);\n    background: var(--background--02);\n    margin-bottom: 0;\n    flex: 1;\n    font-size: 1rem;\n    padding: 8px 12px;\n    background: var(--background--02);\n    color: var(--text-color--title);\n  }\n}\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/types.ts",
    "content": "import { UnknownAction } from \"@reduxjs/toolkit\";\nimport { DBTDocumentationColumn, DocumentationStateProps } from \"./state/types\";\n\nexport interface ContextProps {\n  state: DocumentationStateProps;\n  dispatch: React.Dispatch<UnknownAction>;\n}\n\nexport interface GenerationDBDataProps {\n  project: string;\n  model: string;\n  timestamp: number;\n  data: Partial<DBTDocumentationColumn>;\n}\n"
  },
  {
    "path": "webview_panels/src/modules/documentationEditor/utils.ts",
    "content": "import { differenceInHours } from \"date-fns\";\nimport IndexedDBHelper from \"@modules/app/indexedDb\";\nimport { panelLogger } from \"@modules/logger\";\nimport {\n  DBTDocumentation,\n  DBTDocumentationColumn,\n  DbtGenericTests,\n  DocumentationStateProps,\n  Source,\n  TestMetadataAcceptedValuesKwArgs,\n  TestMetadataRelationshipsKwArgs,\n} from \"./state/types\";\nimport { GenerationDBDataProps } from \"./types\";\nimport { DataPilotChatAction } from \"../dataPilot/types\";\n\nexport const addDefaultActions = (\n  data: Record<string, unknown>,\n  command: string,\n): DataPilotChatAction[] => {\n  return [\n    {\n      title: \"Regenerate\",\n      data,\n      command,\n      userPrompt: \"Regenerate documentation for {type} {name}\",\n      datapilotTitle: \"Improving documentation based on the user suggestion\",\n    },\n    {\n      title: \"Make it shorter\",\n      data,\n      command,\n      userPrompt: \"Make documentation shorter for {type} {name}\",\n      datapilotTitle: \"Improving documentation based on the user suggestion\",\n    },\n    {\n      title: \"Make it longer\",\n      data,\n      command,\n      userPrompt: \"Make documentation longer for {type} {name}\",\n      datapilotTitle: \"Improving documentation based on the user suggestion\",\n    },\n    {\n      title: \"Make it fun\",\n      data,\n      command,\n      userPrompt: \"Make documentation fun for {type} {name}\",\n      datapilotTitle: \"Improving documentation based on the user suggestion\",\n    },\n    {\n      title: \"Generate for business user\",\n      data,\n      command,\n      userPrompt: \"Regenerate documentation for {type} {name} as business user\",\n      datapilotTitle: \"Improving documentation based on the user suggestion\",\n    },\n  ];\n};\n\nexport const addDocGeneration = async (\n  project: string,\n  model: string,\n  data: Partial<DBTDocumentationColumn>,\n): Promise<void> => {\n  const db = await IndexedDBHelper.getDb();\n  const transaction = db.transaction([\"generations\"], \"readwrite\");\n  const generationstore = transaction.objectStore(\"generations\");\n\n  const operation = {\n    project,\n    model,\n    data,\n    timestamp: new Date().getTime(),\n  } as GenerationDBDataProps;\n\n  await generationstore.add(operation);\n};\n\nexport const getGenerationsInModel = async (\n  project: string,\n  model: string,\n): Promise<GenerationDBDataProps[]> => {\n  const db = await IndexedDBHelper.getDb();\n  const transaction = db.transaction([\"generations\"], \"readwrite\");\n  const generationstore = transaction.objectStore(\"generations\");\n  const projectIndex = generationstore.index(\"projectIndex\");\n\n  const range = IDBKeyRange.only(project);\n  const generations: GenerationDBDataProps[] = [];\n\n  // eslint-disable-next-line no-async-promise-executor\n  return new Promise(async (resolve, reject) => {\n    const cursor = await projectIndex.openCursor(range);\n    function iterateCursor() {\n      if (cursor) {\n        if (cursor.value.model === model) {\n          const generation = cursor.value;\n          if (\n            differenceInHours(new Date(), new Date(generation.timestamp)) < 24\n          ) {\n            generations.push(generation);\n          }\n        }\n        cursor\n          .continue()\n          .then(iterateCursor)\n          .catch((err) =>\n            panelLogger.error(\"error while iterating cursor\", err),\n          );\n      } else {\n        resolve(generations);\n      }\n    }\n\n    iterateCursor();\n\n    transaction.oncomplete = () => {\n      resolve(generations);\n    };\n\n    transaction.onerror = () => {\n      reject(\"Error retrieving operations\");\n    };\n  });\n};\n\nexport const mergeCurrentAndIncomingDocumentationColumns = (\n  current: DBTDocumentation[\"columns\"] | undefined,\n  incoming: DBTDocumentation[\"columns\"],\n): DBTDocumentation[\"columns\"] => {\n  return incoming.map((column) => {\n    const existingColumn = current?.find((c) => column.name === c.name);\n    return {\n      name: column.name ?? \"\",\n      type: column.type,\n      description: existingColumn?.description ?? \"\",\n      generated: existingColumn?.generated ?? false,\n      source: existingColumn !== undefined ? Source.YAML : Source.DATABASE,\n    };\n  });\n};\n\nexport const isStateDirty = (state: DocumentationStateProps): boolean => {\n  if (!state.currentDocsData && !state.currentDocsTests) return false;\n  if (!state.incomingDocsData) return false;\n  if (!state.incomingDocsData.docs && !state.incomingDocsData.tests)\n    return false;\n  if (\n    state.currentDocsData?.description !==\n    state.incomingDocsData.docs?.description\n  ) {\n    return true;\n  }\n\n  for (const column of state.currentDocsData?.columns ?? []) {\n    const incomingColumn = state.incomingDocsData.docs?.columns?.find(\n      (c) => c.name === column.name,\n    );\n    if (column.description !== incomingColumn?.description) {\n      return true;\n    }\n  }\n  if (state.currentDocsTests?.length !== state.incomingDocsData.tests?.length) {\n    return true;\n  }\n  for (const test of state.currentDocsTests ?? []) {\n    const incomingTest = state.incomingDocsData.tests?.find(\n      (t) => t.key === test.key,\n    );\n    if (!incomingTest) {\n      return true;\n    }\n    if (test.test_metadata?.name === DbtGenericTests.ACCEPTED_VALUES) {\n      const currentValues =\n        (test.test_metadata?.kwargs as TestMetadataAcceptedValuesKwArgs)\n          .values ?? [];\n      const incomingValues =\n        (incomingTest.test_metadata?.kwargs as TestMetadataAcceptedValuesKwArgs)\n          .values ?? [];\n      if (!isArrayEqual(currentValues, incomingValues)) {\n        return true;\n      }\n    }\n    if (test.test_metadata?.name === DbtGenericTests.RELATIONSHIPS) {\n      const currentArgs = test.test_metadata\n        ?.kwargs as TestMetadataRelationshipsKwArgs;\n      const incomingArgs = incomingTest.test_metadata\n        ?.kwargs as TestMetadataRelationshipsKwArgs;\n      if (\n        currentArgs.to !== incomingArgs.to ||\n        currentArgs.field !== incomingArgs.field\n      ) {\n        return true;\n      }\n    }\n  }\n  return false;\n};\n\nexport const isArrayEqual = (a: string[], b: string[]): boolean => {\n  return a.length === b.length && a.every((v, i) => v === b[i]);\n};\n"
  },
  {
    "path": "webview_panels/src/modules/feedback/ResultFeedbackButtons.tsx",
    "content": "import { yupResolver } from \"@hookform/resolvers/yup\";\nimport * as Yup from \"yup\";\nimport { Controller, useForm } from \"react-hook-form\";\nimport { LikeIcon, DislikeIcon } from \"@assets/icons\";\nimport { Button, Form, IconButton, Input, Stack } from \"@uicore\";\nimport { useCallback, useState } from \"react\";\nimport { Feedback, Rating } from \"./types\";\nimport { panelLogger } from \"@modules/logger\";\nimport { executeRequestInSync } from \"@modules/app/requestExecutor\";\n\ninterface Props {\n  getFeedbackData: (data: Feedback) => void;\n}\n\nconst schema = Yup.object({\n  feedback_type: Yup.mixed<Rating>().oneOf(Object.values(Rating)).optional(),\n  feedback_message: Yup.string().optional(),\n}).required();\n\nconst ResultFeedbackButtons = ({ getFeedbackData }: Props): JSX.Element => {\n  const [showForm, setShowForm] = useState(false);\n\n  const { control, handleSubmit, setValue, watch } = useForm<Feedback>({\n    resolver: yupResolver(schema),\n  });\n\n  const onFeedbackSubmit = async (feedbackData: Feedback) => {\n    if (\n      feedbackData.feedback_type === Rating.Bad &&\n      !feedbackData.feedback_message\n    ) {\n      panelLogger.info(\"no feedback\", feedbackData);\n      return;\n    }\n\n    const data = getFeedbackData(feedbackData);\n    panelLogger.info(\"feedback submitted\", feedbackData, data);\n    await executeRequestInSync(\"sendFeedback\", {\n      comment: feedbackData.feedback_message,\n      rating: feedbackData.feedback_type,\n      data,\n    });\n    setShowForm(false);\n  };\n  const watchRating = watch(\"feedback_type\");\n\n  const handleCancel = () => {\n    setValue(\"feedback_type\", undefined);\n    setShowForm(false);\n  };\n  const handleClick = (isLiked: boolean) => {\n    setShowForm(true);\n    setValue(\"feedback_type\", isLiked ? Rating.Good : Rating.Bad);\n  };\n\n  const handleLike = () => {\n    onFeedbackSubmit({\n      feedback_message: \"\",\n      feedback_type: Rating.Good,\n    }).catch((err) =>\n      panelLogger.error(\"error while submitting feedback\", err),\n    );\n  };\n\n  const onFormRender = useCallback((node: HTMLDivElement | null) => {\n    if (node) {\n      node.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n    }\n  }, []);\n\n  const isGoodRating = watchRating === Rating.Good;\n  const isBadRating = watchRating === Rating.Bad;\n  const placeholder = isGoodRating\n    ? \"Please share your feedback!\"\n    : \"What did AI do wrong? What it should have done?\";\n\n  return (\n    <>\n      <Stack>\n        <IconButton\n          className={`${isGoodRating ? \"active\" : \"\"} outline`}\n          title=\"Like\"\n          onClick={handleLike}\n        >\n          <LikeIcon />\n        </IconButton>\n        <IconButton\n          className={`${isBadRating ? \"active\" : \"\"} outline`}\n          title=\"Dislike\"\n          onClick={() => handleClick(false)}\n        >\n          <DislikeIcon />\n        </IconButton>\n      </Stack>\n      {showForm ? (\n        <Form onSubmit={handleSubmit(onFeedbackSubmit)}>\n          <Stack direction=\"column\" ref={onFormRender}>\n            <h5>AI still needs humans sometimes, please help it out 🙂</h5>\n            <Controller\n              control={control}\n              name=\"feedback_message\"\n              render={({ field: { onChange } }) => (\n                <Input\n                  type=\"textarea\"\n                  onChange={onChange}\n                  placeholder={placeholder}\n                />\n              )}\n            />\n            <Stack>\n              <Button color=\"primary\" type=\"submit\">\n                Submit\n              </Button>\n              <Button onClick={handleCancel}>Cancel</Button>\n            </Stack>\n          </Stack>\n        </Form>\n      ) : null}\n    </>\n  );\n};\n\nexport default ResultFeedbackButtons;\n"
  },
  {
    "path": "webview_panels/src/modules/feedback/types.ts",
    "content": "export enum Rating {\n  Bad = \"bad\",\n  Good = \"good\",\n}\n\nexport interface Feedback {\n  feedback_type?: Rating;\n  feedback_message?: string;\n}\n\nexport enum FeedbackType {\n  RESPONSE = \"response\",\n  USER_REQUEST = \"userRequest\",\n}\n\ninterface GeneratedFeedbackWithRating\n  extends Feedback,\n    Record<string, unknown> {\n  type: FeedbackType;\n}\n\nexport interface FeedbackRequest extends Record<string, unknown> {\n  requestDetails: Record<string, unknown>;\n  messageSequence: GeneratedFeedbackWithRating[];\n}\n"
  },
  {
    "path": "webview_panels/src/modules/healthCheck/IssueDetail.tsx",
    "content": "import { Button, Card, Drawer, Stack } from \"@uicore\";\nimport { ModelInsight } from \"./types\";\nimport classes from \"./healthcheck.module.scss\";\nimport useAppContext from \"@modules/app/useAppContext\";\nimport { executeRequestInAsync } from \"@modules/app/requestExecutor\";\nimport { TaskLabels } from \"@lib\";\n\nconst DetailItem = ({ label, value }: { label: string; value: string }) => (\n  <div>\n    <div className=\"text-para mb-1 fw-semibold\">{label}</div>\n    <Card className={classes.sidebarCard + \" text-para\"}>{value}</Card>\n  </div>\n);\n\nconst IssueDetail = ({ insight }: { insight: ModelInsight }): JSX.Element => {\n  const {\n    state: {\n      tenantInfo: { frontendUrl },\n    },\n  } = useAppContext();\n  return (\n    <Drawer buttonProps={{ size: \"sm\" }} buttonText=\"Details\">\n      <div className=\"p-2 h-100 d-flex flex-column gap-md\">\n        <Stack className=\"justify-content-between\">\n          <div className=\"fw-semibold fs-4\">{insight.insight.name}</div>\n          {insight.insight.metadata?.teammate_check_id ? (\n            <Button\n              onClick={() =>\n                executeRequestInAsync(\"openURL\", {\n                  url: `${frontendUrl}/teammates/${TaskLabels.ProjectGovernor}?id=${insight.insight.metadata?.teammate_check_id}`,\n                })\n              }\n            >\n              View check\n            </Button>\n          ) : null}\n        </Stack>\n        <DetailItem label=\"File\" value={insight.original_file_path} />\n        <DetailItem label=\"Type\" value={insight.insight.type} />\n        <DetailItem label=\"Description\" value={insight.insight.message} />\n        <DetailItem label=\"Reason\" value={insight.insight.reason_to_flag} />\n        <DetailItem\n          label=\"Recommendation\"\n          value={insight.insight.recommendation}\n        />\n      </div>\n    </Drawer>\n  );\n};\n\nexport { IssueDetail };\n"
  },
  {
    "path": "webview_panels/src/modules/healthCheck/IssueList.tsx",
    "content": "import { Card, CardTitle, CardBody, Stack, Dropdown } from \"@uicore\";\nimport classes from \"./healthcheck.module.scss\";\nimport { useMemo, useState } from \"react\";\nimport { panelLogger } from \"@modules/logger\";\nimport { ArrowDownIcon, ArrowRightIcon } from \"@assets/icons\";\nimport { ModelInsight, ProjectHealthcheck } from \"./types\";\nimport { IssueDetail } from \"./IssueDetail\";\nimport { executeRequestInSync } from \"@modules/app/requestExecutor\";\n\nconst IssueList = ({\n  projectHealthcheck,\n}: {\n  projectHealthcheck: ProjectHealthcheck;\n}): JSX.Element => {\n  const [fileFilter, setFileFilter] = useState(\"\");\n  const [insightTypeFilter, setInsightTypeFilter] = useState(\"\");\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  const { model_insights } = projectHealthcheck;\n  const [openAccordion, setOpenAccordion] = useState<Record<string, boolean>>(\n    {},\n  );\n  const insightFilenames = useMemo(() => {\n    return Object.entries(model_insights).map(([k, v]) => ({\n      label: v[0].original_file_path,\n      value: k,\n    }));\n  }, [model_insights]);\n  const insightTypes = useMemo(\n    () =>\n      Array.from(\n        new Set(\n          Object.values(model_insights)\n            .flat()\n            .map((x) => x.insight.type),\n        ),\n      ).map((x) => ({ label: x, value: x })),\n    [model_insights],\n  );\n  const filteredModelInsights = useMemo(() => {\n    const modelInsights: Record<string, ModelInsight[]> = {};\n    const insights = Object.values(model_insights)\n      .flat()\n      .filter(\n        (v) =>\n          (!fileFilter || v.unique_id === fileFilter) &&\n          (!insightTypeFilter || v.insight.type === insightTypeFilter),\n      );\n    for (const insight of insights) {\n      modelInsights[insight.unique_id] = modelInsights[insight.unique_id] || [];\n      modelInsights[insight.unique_id].push(insight);\n    }\n    return modelInsights;\n  }, [fileFilter, insightTypeFilter, model_insights]);\n  panelLogger.log(filteredModelInsights);\n  return (\n    <Card className={classes.container}>\n      <CardTitle>\n        <Stack className=\"align-items-center\">\n          <div className=\"h5\">Issues</div>\n          <div className=\"spacer\" />\n          <Dropdown\n            label=\"File Name\"\n            options={insightFilenames}\n            onOptionSelect={(k) => setFileFilter(k)}\n            selectedValue={fileFilter}\n          />\n          <Dropdown\n            label=\"Type\"\n            options={insightTypes}\n            onOptionSelect={(k) => setInsightTypeFilter(k)}\n            selectedValue={insightTypeFilter}\n          />\n        </Stack>\n      </CardTitle>\n      <CardBody>\n        <div className={classes.issuesContainer}>\n          <div className={classes.tableHeader}>\n            {[\"File\", \"Types\", \"Action\"].map((h) => (\n              <div key={h}>{h}</div>\n            ))}\n          </div>\n          {Object.entries(filteredModelInsights).map(([k, v]) => (\n            <>\n              <div\n                className={classes.tableDataRow}\n                key={k}\n                onClick={(e) => {\n                  e.stopPropagation();\n                  setOpenAccordion((prev) => ({ ...prev, [k]: !prev[k] }));\n                  void executeRequestInSync(\"openFile\", {\n                    path: v[0].path,\n                  });\n                }}\n              >\n                <div className=\"d-flex gap-sm align-items-center\">\n                  {openAccordion[k] ? <ArrowDownIcon /> : <ArrowRightIcon />}\n                  <div className=\"lines-1\">{v[0].original_file_path}</div>\n                </div>\n                <div />\n                <div />\n              </div>\n              {openAccordion[k] &&\n                v.map((insight, i) => (\n                  <div\n                    className={classes.tableDataRowAccordionItem}\n                    key={`${k}-${i + 1}`}\n                  >\n                    <div>{insight.insight.name}</div>\n                    <div>{insight.insight.type}</div>\n                    <div>\n                      <IssueDetail insight={insight} />\n                    </div>\n                  </div>\n                ))}\n            </>\n          ))}\n        </div>\n      </CardBody>\n    </Card>\n  );\n};\n\nexport { IssueList };\n"
  },
  {
    "path": "webview_panels/src/modules/healthCheck/ProjectHealthChecker.tsx",
    "content": "import {\n  Card,\n  CardTitle,\n  CardBody,\n  CardText,\n  Button,\n  Stack,\n  Accordion,\n  Input,\n  Label,\n} from \"@uicore\";\nimport { executeRequestInSync } from \"../app/requestExecutor\";\nimport classes from \"./healthcheck.module.scss\";\nimport {\n  Dispatch,\n  SetStateAction,\n  useCallback,\n  useEffect,\n  useState,\n} from \"react\";\nimport { panelLogger } from \"@modules/logger\";\nimport {\n  ArrowDownIcon,\n  FolderIcon,\n  ArrowLeftIcon,\n  RefreshIcon,\n  LoadingIcon,\n} from \"@assets/icons\";\nimport { ProjectHealthcheck } from \"./types\";\nimport { IssueList } from \"./IssueList\";\nimport ProjectHealthNewCheckButton from \"./ProjectHealthNewCheckButton\";\n\ninterface DBTConfig {\n  id: number;\n  name: string;\n  description: string;\n  created_on: string;\n  config: unknown;\n  config_schema: unknown[];\n}\n\ntype ConfigOption =\n  | { configPath: string; configType: \"Manual\" }\n  | {\n      config: unknown;\n      config_schema: { files_required: string }[];\n      configType: \"Saas\";\n    }\n  | { configType: \"All\" };\n\ntype AltimateConfigProps = { projectRoot: string } & ConfigOption;\n\nenum ConfigType {\n  Manual,\n  Saas,\n  All,\n}\n\ninterface SaasConfigSelectorProps {\n  selectedConfig: number | undefined;\n  setSelectedConfig: Dispatch<SetStateAction<number | undefined>>;\n  configPath: string;\n  setConfigPath: Dispatch<SetStateAction<string>>;\n  configType: ConfigType;\n  setConfigType: Dispatch<SetStateAction<ConfigType>>;\n  isConfigLoading: boolean;\n  configs: DBTConfig[];\n  loadConfigs: () => Promise<void>;\n}\n\nconst SaasConfigSelector = (props: SaasConfigSelectorProps) => {\n  return (\n    <div className=\"d-flex flex-column gap-sm\">\n      <div className=\"d-flex align-items-center gap-sm\">\n        <Label check sm={2} style={{ whiteSpace: \"nowrap\" }}>\n          <Input\n            type=\"radio\"\n            className=\"me-2\"\n            checked={props.configType === ConfigType.Manual}\n            onClick={() => props.setConfigType(ConfigType.Manual)}\n          />\n          Manual\n        </Label>\n        {props.configType === ConfigType.Manual && (\n          <Button\n            size=\"sm\"\n            color=\"primary\"\n            className=\"text-overflow\"\n            onClick={async (e) => {\n              e.stopPropagation();\n              const result = await executeRequestInSync(\"selectFiles\", {\n                filters: {\n                  Files: [\"yml\"],\n                },\n                canSelectMany: false,\n              });\n              const { path } = result as {\n                path: string[];\n              };\n              props.setConfigPath(path[0]);\n            }}\n          >\n            {props.configPath || \"Select config path\"}\n          </Button>\n        )}\n      </div>\n      <div className=\"d-flex align-items-center gap-sm\">\n        <Label check sm={2} style={{ whiteSpace: \"nowrap\" }}>\n          <Input\n            type=\"radio\"\n            className=\"me-2\"\n            checked={props.configType === ConfigType.Saas}\n            onClick={() => props.setConfigType(ConfigType.Saas)}\n          />\n          Select config\n        </Label>\n        {props.configType === ConfigType.Saas && (\n          <>\n            <Button\n              color=\"link\"\n              onClick={(e) => {\n                e.stopPropagation();\n                void props.loadConfigs();\n              }}\n            >\n              {props.isConfigLoading ? <LoadingIcon /> : <RefreshIcon />}\n            </Button>\n            <div className={classes.accordionContainer + \" w-100\"}>\n              <Accordion\n                trigger={(open) => (\n                  <Stack className=\"align-items-start\">\n                    <div>\n                      {props.configs.find((c) => c.id === props.selectedConfig)\n                        ?.name ?? \"Select healthcheck configs\"}\n                    </div>\n                    <div className=\"spacer\" />\n                    {open ? <ArrowDownIcon /> : <ArrowLeftIcon />}\n                  </Stack>\n                )}\n              >\n                {({ close }) => (\n                  <Stack direction=\"column\" className=\"gap-0\">\n                    {props.configs.map((c) => (\n                      <Stack\n                        className={\n                          classes.row +\n                          \" \" +\n                          (props.selectedConfig === c.id ? classes.active : \"\")\n                        }\n                        key={c.id}\n                        onClick={(e) => {\n                          e.stopPropagation();\n                          props.setSelectedConfig(c.id);\n                          close();\n                        }}\n                      >\n                        <div>{c.name}</div>\n                      </Stack>\n                    ))}\n                  </Stack>\n                )}\n              </Accordion>\n            </div>\n          </>\n        )}\n      </div>\n      <div className=\"d-flex align-items-center gap-sm\">\n        <Label check sm={2} style={{ whiteSpace: \"nowrap\" }}>\n          <Input\n            type=\"radio\"\n            className=\"me-2\"\n            checked={props.configType === ConfigType.All}\n            onClick={() => props.setConfigType(ConfigType.All)}\n          />\n          Run all checks\n        </Label>\n      </div>\n    </div>\n  );\n};\n\ninterface ProjectSelectorProps {\n  projects: { projectName: string; projectRoot: string }[];\n  selectedProject: string;\n  setSelectedProject: Dispatch<SetStateAction<string>>;\n}\n\nconst ProjectSelector = (props: ProjectSelectorProps) => {\n  const selectedProject = props.projects.find(\n    (p) => p.projectRoot === props.selectedProject,\n  );\n  return (\n    <div className={classes.accordionContainer}>\n      <Accordion\n        trigger={(open) => (\n          <Stack className=\"align-items-center\">\n            <div className=\"lines-1\">\n              {selectedProject\n                ? `${selectedProject.projectName} (${selectedProject.projectRoot})`\n                : \"Select Projects\"}\n            </div>\n            <div className=\"spacer\" />\n            {open ? <ArrowDownIcon /> : <ArrowLeftIcon />}\n          </Stack>\n        )}\n      >\n        {({ close }) => (\n          <Stack direction=\"column\" className=\"gap-0\">\n            {props.projects.map((p) => (\n              <Stack\n                className={\n                  classes.row +\n                  \" \" +\n                  (p.projectRoot === props.selectedProject\n                    ? classes.active\n                    : \"\")\n                }\n                key={p.projectRoot}\n                onClick={(e) => {\n                  e.stopPropagation();\n                  props.setSelectedProject(p.projectRoot);\n                  close();\n                }}\n              >\n                <FolderIcon />\n                <div className=\"lines-1\">\n                  {p.projectName} ({p.projectRoot})\n                </div>\n              </Stack>\n            ))}\n          </Stack>\n        )}\n      </Accordion>\n    </div>\n  );\n};\n\nconst ProjectHealthcheckInput = ({\n  handleHealthCheck,\n  handleClearProblems,\n}: {\n  handleHealthCheck: (args: AltimateConfigProps) => Promise<void>;\n  handleClearProblems: () => void;\n}): JSX.Element => {\n  const [projects, setProjects] = useState<\n    { projectName: string; projectRoot: string }[]\n  >([]);\n  const [selectedProject, setSelectedProject] = useState(\"\");\n  const [selectedConfig, setSelectedConfig] = useState<number | undefined>();\n  const [configType, setConfigType] = useState(ConfigType.All);\n  const [configPath, setConfigPath] = useState(\"\");\n  const [requestInProgress, setRequestInProgress] = useState(false);\n\n  const [configs, setConfigs] = useState<DBTConfig[]>([]);\n  const [isConfigLoading, setIsConfigLoading] = useState(false);\n\n  const getProjects = useCallback(async () => {\n    const result = (await executeRequestInSync(\"getProjects\", {})) as {\n      projectName: string;\n      projectRoot: string;\n    }[];\n    setProjects(result);\n    if (result.length === 1) {\n      setSelectedProject(result[0].projectRoot);\n    }\n  }, []);\n\n  const loadConfigs = useCallback(async () => {\n    try {\n      setIsConfigLoading(true);\n      const result = (await executeRequestInSync(\"getInsightConfigs\", {})) as {\n        items: DBTConfig[];\n      };\n      setConfigs(result.items);\n    } catch (e) {\n      panelLogger.log(\"error in loadConfigs\", e);\n    } finally {\n      setIsConfigLoading(false);\n    }\n  }, []);\n\n  useEffect(() => {\n    void getProjects();\n  }, []);\n\n  useEffect(() => {\n    if (configType === ConfigType.Saas) {\n      void loadConfigs();\n    }\n  }, [configType]);\n\n  const isStartScanEnabled =\n    !requestInProgress &&\n    selectedProject &&\n    (configType === ConfigType.All ||\n      (configType === ConfigType.Manual && configPath) ||\n      (configType === ConfigType.Saas && selectedConfig));\n\n  return (\n    <Card className={classes.container}>\n      <CardTitle tag=\"h5\">Perform project governance</CardTitle>\n      <CardBody>\n        <CardText>\n          Find areas of a dbt project that are misaligned with dbt best\n          practices\n        </CardText>\n        <Stack direction=\"column\">\n          <ProjectSelector\n            projects={projects}\n            selectedProject={selectedProject}\n            setSelectedProject={setSelectedProject}\n          />\n\n          <SaasConfigSelector\n            selectedConfig={selectedConfig}\n            setSelectedConfig={setSelectedConfig}\n            configPath={configPath}\n            setConfigPath={setConfigPath}\n            configType={configType}\n            setConfigType={setConfigType}\n            configs={configs}\n            isConfigLoading={isConfigLoading}\n            loadConfigs={loadConfigs}\n          />\n\n          <Stack className=\"justify-content-between\">\n            <Stack>\n            <Button\n              color={isStartScanEnabled ? \"primary\" : \"secondary\"}\n              onClick={async () => {\n                if (configType === ConfigType.Saas) {\n                  void executeRequestInSync(\"logDBTHealthcheckConfig\", {\n                    configId: selectedConfig,\n                  });\n                }\n                let args: Record<string, unknown>;\n                if (configType === ConfigType.Manual) {\n                  args = { configPath, configType: \"Manual\" };\n                } else if (configType === ConfigType.Saas) {\n                  args = {\n                    configType: \"Saas\",\n                    ...configs?.find((c) => c.id === selectedConfig),\n                  };\n                } else {\n                  args = { configType: \"All\" };\n                }\n                try {\n                  setRequestInProgress(true);\n                  await handleHealthCheck({\n                    projectRoot: selectedProject,\n                    ...args,\n                  } as AltimateConfigProps);\n                } finally {\n                  setRequestInProgress(false);\n                }\n              }}\n              disabled={!isStartScanEnabled}\n            >\n              Start scan\n            </Button>\n            <Button\n              color={selectedProject ? \"primary\" : \"secondary\"}\n              onClick={handleClearProblems}\n              disabled={!selectedProject}\n            >\n              Clear problems\n            </Button>\n            </Stack>\n            <ProjectHealthNewCheckButton />\n          </Stack>\n        </Stack>\n      </CardBody>\n    </Card>\n  );\n};\n\nconst ProjectHealthChecker = (): JSX.Element => {\n  const [projectHealthcheck, setProjectHealthcheck] =\n    useState<ProjectHealthcheck | null>(null);\n  const handleHealthCheck = async (args: AltimateConfigProps) => {\n    const result = (await executeRequestInSync(\n      \"altimateScan\",\n      args as unknown as Record<string, unknown>,\n    )) as {\n      projectHealthcheck: ProjectHealthcheck;\n    };\n    panelLogger.log(\"projectHealthcheck:\", result.projectHealthcheck);\n    setProjectHealthcheck(result.projectHealthcheck);\n  };\n  return (\n    <>\n      <Stack direction=\"column\">\n        <ProjectHealthcheckInput\n          handleHealthCheck={handleHealthCheck}\n          handleClearProblems={() => setProjectHealthcheck(null)}\n        />\n        {projectHealthcheck && (\n          <IssueList projectHealthcheck={projectHealthcheck} />\n        )}\n      </Stack>\n    </>\n  );\n};\n\nexport default ProjectHealthChecker;\n"
  },
  {
    "path": "webview_panels/src/modules/healthCheck/ProjectHealthNewCheckButton.tsx",
    "content": "import {\n  CoachForm,\n  TaskLabels,\n  TeammateActions,\n  useTeamMateContext,\n} from \"@lib\";\nimport useAppContext from \"@modules/app/useAppContext\";\nimport PreviewFeatureIcon from \"@modules/previewFeature/PreviewFeatureIcon\";\nimport { vscode } from \"@modules/vscode\";\nimport { Drawer, DrawerRef } from \"@uicore\";\nimport { useRef } from \"react\";\n\nconst ProjectHealthNewCheckButton = ({\n  context,\n  extra,\n}: {\n  context?: Record<string, unknown>;\n  extra?: Record<string, unknown>;\n}): JSX.Element | null => {\n  const drawerRef = useRef<DrawerRef>(null);\n  const { dispatch } = useTeamMateContext();\n  const {\n    state: {\n      tenantInfo: { frontendUrl, teammatesEnabled },\n    },\n  } = useAppContext();\n\n  const onOpen = () => {\n    dispatch(TeammateActions.setShowCoachingForm(true));\n  };\n\n  if (!teammatesEnabled) return null;\n\n  return (\n    <Drawer\n      buttonProps={{ outline: true }}\n      buttonText={\n        <>\n          + Add new check <PreviewFeatureIcon />\n        </>\n      }\n      onOpen={onOpen}\n      ref={drawerRef}\n      disableBackdropClick\n    >\n      <CoachForm\n        taskLabel={TaskLabels.ProjectGovernor}\n        context={context}\n        onClose={() => {\n          drawerRef.current?.close();\n          if (frontendUrl)\n            vscode.postMessage({\n              command: \"openURL\",\n              url: `${frontendUrl}/teammates/${TaskLabels.ProjectGovernor}`,\n            });\n        }}\n        extra={extra}\n      />\n    </Drawer>\n  );\n};\n\nexport default ProjectHealthNewCheckButton;\n"
  },
  {
    "path": "webview_panels/src/modules/healthCheck/healthcheck.module.scss",
    "content": ".container {\n  width: 60vw;\n  min-width: min(600px, 100vw);\n}\n\n.accordionContainer {\n  background-color: var(--background--01);\n  border-radius: 0.25em;\n  padding: 0.25em 0.5em;\n\n  .row {\n    align-items: center;\n    cursor: pointer;\n    padding: 0.125em 0.5em;\n\n    &:hover {\n      background-color: var(--background--02);\n      border-radius: 0.25em;\n    }\n\n    &.active {\n      background-color: var(--background--02);\n      border-radius: 0.25em;\n    }\n  }\n}\n\n.notification {\n  border-radius: 0.25em;\n  padding: 0.25em 0.75em;\n  border: 1px solid var(--stroke--orange);\n  color: var(--text-color--caption);\n}\n\n.link {\n  color: var(--text-color--brand);\n  &:focus {\n    outline: none;\n  }\n}\n\n.issuesContainer {\n  margin-top: 1em;\n  border-radius: 0.25em;\n  border: 1px solid var(--stroke--disable);\n}\n\n.table-row {\n  display: grid;\n  grid-template-columns: 6fr 1fr 1fr;\n  padding: 0.25em 0.5em;\n  align-items: center;\n}\n\n.tableHeader {\n  @extend .table-row;\n  border-bottom: 1px solid var(--stroke--disable);\n  background-color: var(--background--03);\n}\n\n.tableDataRow {\n  @extend .table-row;\n  &:not(:last-child) {\n    border-bottom: 1px solid var(--stroke--disable);\n  }\n  background-color: var(--background--02);\n  cursor: pointer;\n}\n\n.tableDataRowAccordionItem {\n  @extend .table-row;\n  &:not(:last-child) {\n    border-bottom: 1px solid var(--stroke--disable);\n  }\n  background-color: var(--background--01);\n}\n\n.sidebarCard {\n  padding: 0.25em 0.5em;\n  border-radius: 4px;\n}\n"
  },
  {
    "path": "webview_panels/src/modules/healthCheck/types.ts",
    "content": "import { ProjectGovernorCheckTypes } from \"@lib\";\n\nexport interface Insight {\n  name: string;\n  type: string;\n  message: string;\n  recommendation: string;\n  reason_to_flag: string;\n  metadata: {\n    model?: string;\n    model_unique_id?: string;\n    model_type?: string;\n    convention?: string | null;\n    source?: \"llm\";\n    teammate_check_id?: string;\n    category?: ProjectGovernorCheckTypes; \n  };\n}\n\nexport type Severity = \"ERROR\" | \"WARNING\";\n\nexport interface ModelInsight {\n  insight: Insight;\n  severity: Severity;\n  unique_id: string;\n  package_name: string;\n  path: string;\n  original_file_path: string;\n}\n\nexport interface ProjectHealthcheck {\n  model_insights: Record<string, ModelInsight[]>;\n  // package_insights: any;\n}\n"
  },
  {
    "path": "webview_panels/src/modules/home/Home.tsx",
    "content": "const Home = (): JSX.Element => <div>Loading...</div>;\n\nexport default Home;\n"
  },
  {
    "path": "webview_panels/src/modules/insights/Insights.stories.tsx",
    "content": "import { faker } from \"@faker-js/faker\";\nimport type { Meta, StoryObj } from \"@storybook/react\";\nimport Insights from \"./Insights\";\n\nexport default {\n  title: \"Actions panel\",\n  parameters: {\n    layout: \"none\",\n  },\n  tags: [\"autodocs\"],\n  argTypes: {\n    backgroundColor: { control: \"color\" },\n  },\n} satisfies Meta;\n\nexport const SingleProject: StoryObj = {\n  render: (): JSX.Element => {\n    return <Insights />;\n  },\n  parameters: {\n    vscode: {\n      func: (request: Record<string, unknown>): unknown => {\n        if (request.command === \"getProjects\") {\n          return [\n            {\n              projectRoot: faker.system.directoryPath(),\n              projectName: faker.lorem.word(),\n            },\n          ];\n        }\n        if (request.command === \"ide\") {\n          return \"cursor\";\n        }\n\n        if (request.command === \"fetch\") {\n          switch (request.endpoint) {\n            case `projectgovernor/training`:\n              return {\n                ai_response: faker.lorem.paragraph(),\n                category: \"Business\",\n              };\n            case `projectgovernor/training/confirm`:\n              return {\n                ok: true,\n              };\n            default:\n              break;\n          }\n        }\n      },\n      timer: 500,\n    },\n  },\n};\n\nexport const MultipleProject: StoryObj = {\n  render: (): JSX.Element => {\n    return <Insights />;\n  },\n  parameters: {\n    vscode: {\n      func: (request: Record<string, unknown>): unknown => {\n        if (request.command === \"getProjects\") {\n          return [\n            {\n              projectRoot: faker.system.directoryPath(),\n              projectName: faker.lorem.word(),\n            },\n            {\n              projectRoot: faker.system.directoryPath(),\n              projectName: faker.lorem.word(),\n            },\n            {\n              projectRoot: faker.system.directoryPath(),\n              projectName: faker.lorem.word(),\n            },\n          ];\n        }\n      },\n      timer: 500,\n    },\n  },\n};\n"
  },
  {
    "path": "webview_panels/src/modules/insights/Insights.tsx",
    "content": "import FeedbackButton from \"@modules/commonActionButtons/FeedbackButton\";\nimport { Container, Stack, Tabs } from \"@uicore\";\n// import BigQueryCostEstimator from \"../bigQuery/CostEstimator\";\nimport DeferToProduction from \"../defer/DeferToProduction\";\nimport ProjectHealthChecker from \"../healthCheck/ProjectHealthChecker\";\nimport classes from \"./insights.module.scss\";\nimport HelpButton from \"./components/help/HelpButton\";\nimport { executeRequestInSync } from \"@modules/app/requestExecutor\";\nimport { panelLogger } from \"@modules/logger\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport Notebooks from \"@modules/notebooks/Notebooks\";\n\nconst Insights = (): JSX.Element => {\n  const [notebooksEnabled, setNotebooksEnabled] = useState(false);\n\n  useEffect(() => {\n    executeRequestInSync(\"configEnabled\", {\n      section: \"dbt\",\n      config: \"enableNotebooks\",\n    })\n      .then((response) => setNotebooksEnabled(response as boolean))\n      .catch((err) => panelLogger.error(\"error while getting config\", err));\n  }, []);\n\n  const tabs = useMemo(() => {\n    const list = [\n      {\n        label: \"Defer to prod\",\n        component: <DeferToProduction />,\n      },\n      {\n        label: \"Project Governance\",\n        component: <ProjectHealthChecker />,\n      },\n    ];\n\n    if (!notebooksEnabled) {\n      return list;\n    }\n\n    return [\n      ...list,\n      {\n        label: \"Notebooks\",\n        component: <Notebooks />,\n      },\n    ];\n  }, [notebooksEnabled]);\n\n  return (\n    <Container className={classes.insightsContainer}>\n      <Stack direction=\"column\" className=\"align-items-start\">\n        <Stack className={`${classes.head} w-100`}>\n          <Stack>\n            <h3>Actions</h3>\n          </Stack>\n          <Stack className=\"align-items-center text-nowrap\">\n            <HelpButton />\n            <FeedbackButton url=\"https://form.jotform.com/251114272082143\" />\n          </Stack>\n        </Stack>\n        <Tabs tabs={tabs} />\n      </Stack>\n\n      {/* <Row>\n      <BigQueryCostEstimator />\n    </Row> */}\n    </Container>\n  );\n};\n\nexport default Insights;\n"
  },
  {
    "path": "webview_panels/src/modules/insights/components/help/HelpButton.tsx",
    "content": "import { HelpIcon } from \"@assets/icons\";\nimport { Drawer } from \"@uicore\";\nimport HelpContent from \"./HelpContent\";\n\nconst HelpButton = (): JSX.Element => {\n  return (\n    <Drawer\n      buttonProps={{ outline: true }}\n      buttonText=\"Help\"\n      icon={<HelpIcon />}\n      title=\"Help\"\n    >\n      <HelpContent />\n    </Drawer>\n  );\n};\n\nexport default HelpButton;\n"
  },
  {
    "path": "webview_panels/src/modules/insights/components/help/HelpContent.tsx",
    "content": "import { Stack } from \"@uicore\";\n\nconst HelpContent = (): JSX.Element => {\n  return (\n    <Stack direction=\"column\">\n      <p>\n        Defer functionality in dbt allows the user to run a subset of models or\n        tests without having to first build their upstream parents. Usually, it\n        leads to significant cost and time savings during testing of the dbt\n        models. More information about this functionality is availabale in{\" \"}\n        <a href=\"https://docs.getdbt.com/reference/node-selection/defer/\">\n          dbt documentation\n        </a>\n      </p>\n      <p>\n        <b>Local and SaaS Mode:</b>You can either use this functionality in\n        local mode where your manifest files stay in your local computer or you\n        can use SaaS instance to store your manifest files so multiple team\n        members can benefits from prod or staging data.\n      </p>\n      <p>\n        Turn on favor-state if you need. If it&apos;s turned on, the defer\n        functionality will favor using the node defined in the referenced\n        integration, even if the node exists in the current project.\n      </p>\n      <p>\n        <b>Help Us Improve:</b> We&apos;re eager to hear from you! If\n        you&apos;ve tried the AI-generated documentation, let us know how it\n        worked. Your feedback helps us improve and ensures we offer a valuable\n        tool for the community.\n      </p>\n      <p>\n        Need more help? Check out the&nbsp;\n        <a href=\"https://docs.myaltimate.com/test/defertoprod/\">\n          documentation\n        </a>\n        . For any issues or concerns, please{\" \"}\n        <a href=\"https://app.myaltimate.com/contactus\">contact us</a> via chat\n        or Slack.\n      </p>\n    </Stack>\n  );\n};\n\nexport default HelpContent;\n"
  },
  {
    "path": "webview_panels/src/modules/insights/insights.module.scss",
    "content": ".insights-container {\n  .head{\n    justify-content: space-between;\n  }\n  & :global .card {\n    margin-bottom: 1rem;\n\n    & .card-title {\n      margin-bottom: 0;\n      & span {\n        margin-left: 0.5rem;\n      }\n    }\n  }\n}\n\n.title {\n  margin-bottom: 1.5rem;\n}\n"
  },
  {
    "path": "webview_panels/src/modules/lineage/ActionWidget.tsx",
    "content": "import { Button } from \"@altimateai/ui-components/lineage\";\nimport { FeedbackIcon } from \"@assets/icons\";\nimport FeedbackButton from \"@modules/commonActionButtons/FeedbackButton\";\nimport { sendTelemetryEvent } from \"@modules/documentationEditor/components/telemetry\";\nimport { vscode } from \"@modules/vscode\";\nimport { TelemetryEvents } from \"@telemetryEvents\";\nimport HelpButton from \"./components/help/HelpButton\";\nimport styles from \"./lineage.module.scss\";\nimport MissingLineageMessageComponent from \"./MissingLineageMessage\";\nimport { MissingLineageMessage } from \"./types\";\n\nconst LineageFeedbackButton = ({ url }: { url: string }): JSX.Element => {\n  const handleFeedbackClick = () => {\n    sendTelemetryEvent(TelemetryEvents[\"DocumentationEditor/FeedbackClick\"]);\n    vscode.postMessage({ command: \"openURL\", url });\n  };\n  return (\n    <div className=\"al-tw-scope\">\n      <Button\n        variant=\"default\"\n        size=\"xs\"\n        className={styles.collapsibleBtn}\n        onClick={handleFeedbackClick}\n      >\n        <FeedbackIcon />\n        <span className={styles.collapsibleBtnText}>Feedback</span>\n      </Button>\n    </div>\n  );\n};\n\nconst ActionWidget = ({\n  missingLineageMessage,\n  aiEnabled,\n  lineageType,\n}: {\n  missingLineageMessage?: MissingLineageMessage;\n  aiEnabled: boolean;\n  lineageType: \"sql\" | \"dynamic\";\n}): JSX.Element => {\n  if (lineageType === \"sql\") {\n    return (\n      <div className={styles.actionWidget}>\n        <FeedbackButton url=\"https://app.myaltimate.com/contactus\" />\n      </div>\n    );\n  }\n  return (\n    <div className={styles.actionWidget}>\n      <MissingLineageMessageComponent\n        missingLineageMessage={missingLineageMessage}\n      />\n\n      <div id=\"expand-container\" className=\"al-tw-scope\" />\n      <div id=\"export-container\" className=\"al-tw-scope\" />\n      <div id=\"settings-container\" className=\"al-tw-scope\" />\n      <HelpButton />\n      <div id=\"reset-container\" className=\"al-tw-scope\" />\n      <LineageFeedbackButton\n        url={\n          aiEnabled\n            ? \"https://form.jotform.com/251106238702145\"\n            : \"https://form.jotform.com/251076719766165\"\n        }\n      />\n    </div>\n  );\n};\n\nexport default ActionWidget;\n"
  },
  {
    "path": "webview_panels/src/modules/lineage/Demo.tsx",
    "content": "import { Button } from \"@uicore\";\nimport { LineageDemo } from \"@assets/icons\";\nimport { executeRequestInAsync } from \"@modules/app/requestExecutor\";\n\nconst Demo = (): JSX.Element => {\n  return (\n    <div className=\"p-3 h-100 d-flex flex-column overflow-y\">\n      <div className=\"mb-2 d-flex\">\n        <div className=\"fw-semibold fs-5\">Quick Demo of Column Lineage</div>\n        <div className=\"spacer\"></div>\n        <Button\n          size=\"sm\"\n          color=\"primary\"\n          onClick={(e) => {\n            e.stopPropagation();\n            executeRequestInAsync(\"openURL\", {\n              url: \"https://docs.myaltimate.com\",\n            });\n          }}\n        >\n          Documentation\n        </Button>\n      </div>\n      <div className=\"h-100 d-flex align-items-center justify-content-center\">\n        <LineageDemo />\n      </div>\n    </div>\n  );\n};\n\nexport { Demo };\n"
  },
  {
    "path": "webview_panels/src/modules/lineage/LineageView.tsx",
    "content": "import type { Table } from \"@altimateai/ui-components/lineage\";\nimport {\n  ApiHelper,\n  CLL,\n  CllEvents,\n  Lineage,\n  TooltipProvider,\n} from \"@altimateai/ui-components/lineage\";\nimport \"@altimateai/ui-components/styles.css\";\nimport {\n  executeRequestInAsync,\n  executeRequestInSync,\n} from \"@modules/app/requestExecutor\";\nimport useAppContext from \"@modules/app/useAppContext\";\nimport { panelLogger } from \"@modules/logger\";\nimport { useEffect, useState } from \"react\";\nimport ActionWidget from \"./ActionWidget\";\nimport DemoButton from \"./components/demo/DemoButton\";\nimport styles from \"./lineage.module.scss\";\nimport \"./tailwind-globals.css\";\nimport { MissingLineageMessage, StaticLineageProps } from \"./types\";\n\nconst LineageView = (): JSX.Element | null => {\n  const {\n    state: { theme, isComponentsApiInitialized },\n  } = useAppContext();\n\n  const [isApiHelperInitialized, setIsApiHelperInitialized] = useState(false);\n  const [renderNode, setRenderNode] = useState<\n    {\n      node?: Table;\n      aiEnabled: boolean;\n    } & Partial<StaticLineageProps>\n  >({ aiEnabled: true });\n  const [missingLineageMessage, setMissingLineageMessage] = useState<\n    MissingLineageMessage | undefined\n  >();\n\n  useEffect(() => {\n    if (!isComponentsApiInitialized) {\n      return;\n    }\n    panelLogger.info(\"LineageView updating components api helper\");\n    // @ts-expect-error TODO: add type generic for executeRequestInSync\n    ApiHelper.get = async (url: string, data?: Record<string, unknown>) => {\n      switch (url) {\n        case \"upstreamTables\":\n        case \"downstreamTables\":\n        case \"getExposureDetails\":\n        case \"getFunctionDetails\":\n        case \"getColumns\":\n        case \"getConnectedColumns\":\n        case \"sendFeedback\":\n        case \"getLineageSettings\":\n        case \"persistLineageSettings\":\n        case \"init\":\n        case \"openFile\":\n        case \"openChat\":\n        case \"showInfoNotification\":\n        case \"previewFeature\":\n        case \"telemetryEvents\":\n          return executeRequestInSync(url, { args: { params: data ?? {} } });\n        case \"columnLineage\":\n          return executeRequestInSync(url, { args: data });\n\n        default:\n          break;\n      }\n    };\n    setIsApiHelperInitialized(true);\n  }, [isComponentsApiInitialized]);\n\n  const render = (\n    data: {\n      node?: Table;\n      aiEnabled: boolean;\n      missingLineageMessage?: MissingLineageMessage;\n    } & StaticLineageProps,\n  ) => {\n    setMissingLineageMessage(data.missingLineageMessage);\n    const event = new CustomEvent(\"renderStartNode\", {\n      detail: {\n        ...data,\n        lightdashEnabled: true,\n        showCodeModal: true,\n        config: { exportFinalLineage: false },\n      },\n    });\n    document.dispatchEvent(event);\n    setRenderNode(data);\n  };\n\n  const columnLineage = ({ event }: { event: CllEvents }) => {\n    if (event === CllEvents.CANCEL) {\n      CLL.onCancel();\n    }\n  };\n\n  useEffect(() => {\n    const commandMap = {\n      render,\n      columnLineage: (data: { event: CllEvents }) => {\n        columnLineage(data);\n      },\n    };\n\n    window.addEventListener(\n      \"message\",\n      (\n        event: MessageEvent<{ command: string; args: Record<string, unknown> }>,\n      ) => {\n        panelLogger.log(\"lineage:message -> \", JSON.stringify(event.data));\n        const { command, args } = event.data;\n\n        if (command in commandMap) {\n          (\n            commandMap[command as keyof typeof commandMap] as (\n              args: Record<string, unknown>,\n            ) => void\n          )(args);\n        }\n      },\n    );\n\n    panelLogger.info(\"lineage:onload\");\n    document.documentElement.classList.add(styles.lineageBody);\n    executeRequestInAsync(\"init\", {});\n  }, []);\n\n  if (!isApiHelperInitialized || !renderNode) {\n    return null;\n  }\n\n  const lineageType = renderNode.details ? \"sql\" : \"dynamic\";\n\n  return (\n    <TooltipProvider>\n      <div className={styles.lineageView}>\n        <ActionWidget\n          missingLineageMessage={missingLineageMessage}\n          aiEnabled={renderNode.aiEnabled}\n          lineageType={lineageType}\n        />\n        {lineageType === \"sql\" ? null : (\n          <div className=\"bottom-right-container\">\n            <DemoButton />\n          </div>\n        )}\n        <div className={`${styles.lineageWrap} al-tw-scope`}>\n          <Lineage\n            theme={theme}\n            dynamicLineage={renderNode}\n            lineageType={lineageType}\n            sqlLineage={\n              lineageType === \"sql\"\n                ? (renderNode as StaticLineageProps)\n                : undefined\n            }\n            allowSyncColumnsWithDB\n          />\n        </div>\n      </div>\n    </TooltipProvider>\n  );\n};\n\nexport default LineageView;\n"
  },
  {
    "path": "webview_panels/src/modules/lineage/MissingLineageMessage.tsx",
    "content": "import { Alert, Button } from \"@uicore\";\nimport { MissingLineageMessage } from \"./types\";\nimport { executeRequestInAsync } from \"@modules/app/requestExecutor\";\n\nconst MissingLineageMessageComponent = ({\n  missingLineageMessage,\n}: {\n  missingLineageMessage?: MissingLineageMessage;\n}): JSX.Element | null => {\n  const openProblemsTab = () => {\n    return executeRequestInAsync(\"openProblemsTab\", {});\n  };\n\n  if (!missingLineageMessage) {\n    return null;\n  }\n  return (\n    <Alert color=\"warning\" className=\"p-2 mb-0\">\n      {missingLineageMessage.message}\n      {missingLineageMessage.type === \"error\" ? (\n        <>\n          <Button\n            color=\"link\"\n            className={\"pt-0 pb-0\"}\n            style={{ marginTop: -5 }}\n            onClick={openProblemsTab}\n          >\n            Click here\n          </Button>{\" \"}\n          to view Problems tab\n        </>\n      ) : (\n        \"\"\n      )}\n    </Alert>\n  );\n};\n\nexport default MissingLineageMessageComponent;\n"
  },
  {
    "path": "webview_panels/src/modules/lineage/components/demo/DemoButton.tsx",
    "content": "import { CloseIcon, PlayCircleIcon } from \"@assets/icons\";\nimport { Demo } from \"@modules/lineage/Demo\";\nimport { useEffect, useState } from \"react\";\nimport { Modal, Button } from \"@uicore\";\nimport styles from \"../../lineage.module.scss\";\n\nconst DemoButton = (): JSX.Element => {\n  const [showDemoButton, setShowDemoButton] = useState(true);\n  const [showDemoModal, setShowDemoModal] = useState(false);\n\n  useEffect(() => {\n    // hide demo button after 10s\n    setTimeout(() => {\n      setShowDemoButton(false);\n    }, 10000);\n  }, []);\n\n  return (\n    <>\n      <Modal\n        isOpen={showDemoModal}\n        close={() => setShowDemoModal(false)}\n        fullscreen\n        className={styles.demoModal}\n      >\n        <Demo />\n        <div className=\"close-btn\" onClick={() => setShowDemoModal(false)}>\n          <CloseIcon />\n        </div>\n      </Modal>\n      {showDemoButton ? (\n        <Button\n          color=\"primary\"\n          className=\"d-flex gap-sm align-items-center\"\n          onClick={(e) => {\n            e.stopPropagation();\n            setShowDemoModal((b) => !b);\n          }}\n        >\n          Quick demo of Column Lineage\n          <PlayCircleIcon />\n        </Button>\n      ) : null}\n    </>\n  );\n};\n\nexport default DemoButton;\n"
  },
  {
    "path": "webview_panels/src/modules/lineage/components/help/HelpButton.tsx",
    "content": "import { Button } from \"@altimateai/ui-components/lineage\";\nimport { HelpIcon } from \"@assets/icons\";\nimport { Drawer, DrawerRef } from \"@uicore\";\nimport { useRef } from \"react\";\nimport HelpContent from \"./HelpContent\";\n\nconst HelpButton = (): JSX.Element => {\n  const drawerRef = useRef<DrawerRef>(null);\n\n  return (\n    <div className=\"al-tw-scope\">\n      <Button\n        variant=\"default\"\n        size=\"xs\"\n        onClick={() => drawerRef.current?.open()}\n      >\n        <HelpIcon /> Help\n      </Button>\n      <Drawer ref={drawerRef} title=\"Help\">\n        <HelpContent />\n      </Drawer>\n    </div>\n  );\n};\n\nexport default HelpButton;\n"
  },
  {
    "path": "webview_panels/src/modules/lineage/components/help/HelpContent.tsx",
    "content": "import { executeRequestInAsync } from \"@modules/app/requestExecutor\";\nimport { Button } from \"@uicore\";\n\nconst HelpContent = (): JSX.Element => {\n  return (\n    <div className=\"p-3 h-100 d-flex flex-column overflow-y\">\n      <div className=\"mb-2 d-flex\">\n        <div className=\"fw-semibold fs-5\">Help</div>\n        <div className=\"spacer\"></div>\n        <Button\n          size=\"sm\"\n          color=\"primary\"\n          onClick={(e) => {\n            e.stopPropagation();\n            executeRequestInAsync(\"openURL\", {\n              url: \"https://app.myaltimate.com/contactus\",\n            });\n          }}\n        >\n          Chat with us\n        </Button>\n      </div>\n      <div>\n        <p>\n          Lineage is available in two forms - model level lineage and column\n          level lineage. You need to add API key in the extension settings to\n          view column level lineage. You can view model level lineage without an\n          API key.\n        </p>\n        <ul>\n          <li>\n            Different dbt entities like sources, seeds, models, tests and model\n            types are shown in the lineage view. You can expand lineage from\n            that component by click on (+) sign in the component.\n          </li>\n          <li>\n            For applicable components, column lineage view includes list of\n            columns with descriptions as well as dbt tests that are written for\n            that particular component. You can see columns and tests by clicking\n            on &quot;view details&quot; in the component\n          </li>\n          <li>\n            In column lineage view, links between components (columns) are shown\n            as direct links and indirect links. Direct links are shown as solid\n            lines if there is direct flow of data between columns through select\n            statements. Indirect links are shown as dotted line if columns\n            appear in condition/clauses like where, join, having, etc. These\n            links can be filters in the column lineage view.\n          </li>\n        </ul>\n        <div>\n          <span>If you want to know more please check our </span>\n          <a href=\"https://docs.myaltimate.com\" className=\"text-blue\">\n            Documentation\n          </a>\n          <span> or still have issue no problem Get in touch with us </span>\n          <a href=\"https://www.altimate.ai/support\" className=\"text-blue\">\n            Contact us\n          </a>\n        </div>\n      </div>\n    </div>\n  );\n};\n\nexport default HelpContent;\n"
  },
  {
    "path": "webview_panels/src/modules/lineage/lineage.module.scss",
    "content": "html.lineageBody {\n  font-size: initial;\n  body {\n    padding: 0 !important;\n    font-size: var(--vscode-font-size) !important;\n    line-height: var(--bs-body-line-height);\n    --text-color: #000000;\n    --modal-bg: #ffffff;\n    --popover-bg: #ffffff;\n    --divider-color: #e8e8e8;\n    --primary-accent: #247efe;\n\n    &:global.vscode-dark {\n      --text-color: #ffffff;\n      --modal-bg: #484e55;\n      --popover-bg: #28292c;\n      --divider-color: #424750;\n    }\n\n    /* ReactFlow controls use fill: currentColor for SVG icons.\n       In VS Code dark themes body color is light (#e8e8e8), making\n       icons invisible on the white (#fefefe) button background.\n       Force a dark color so icons are always visible. */\n    :global(.react-flow__controls-button) {\n      color: #333;\n    }\n\n    .lineageView {\n      position: relative;\n      width: 100vw;\n      height: 100vh;\n      display: flex;\n      flex-direction: column;\n\n      .lineageWrap {\n        flex: 1;\n      }\n\n      .menu_card {\n        padding: 0.275em !important;\n        font-size: 0.875em;\n      }\n\n      .menu_card_container {\n        background-color: var(--card-bg) !important;\n        border-color: var(--card-border-color) !important;\n        color: var(--text-color) !important;\n      }\n\n      .action-widget {\n        position: absolute;\n        top: 16px;\n        right: 16px;\n        display: flex;\n        gap: 8px;\n        z-index: 1;\n        align-items: center;\n\n        :global(.btn-outline-secondary) {\n          background-color: var(--background--02);\n        }\n\n        :global(#expand-container) {\n          --background: 0 0% 100%;\n          --foreground: 0 0% 15%;\n          --card: 0 0% 100%;\n          --card-foreground: 0 0% 15%;\n          --accent: 0 0% 92%;\n          --accent-foreground: 0 0% 15%;\n          --border: 0 0% 80%;\n        }\n      }\n    }\n    .demoModal {\n      overflow: hidden;\n      :global(.modal-content) {\n        width: 84%;\n        height: 94%;\n        margin: auto;\n        margin-top: 2%;\n        border-radius: 8px;\n\n        :global(.close-btn) {\n          position: absolute;\n          top: 0px;\n          right: -2rem;\n          color: #ffffff;\n          cursor: pointer;\n          background-color: var(--primary-color);\n          display: flex;\n          padding: 0.5rem;\n          border-radius: 0 0.25rem 0.25rem 0;\n        }\n      }\n    }\n  }\n\n  /* Icon-only button that expands to show text on hover,\n     matching the old uiCore Button icon-collapse behavior. */\n  .collapsibleBtn {\n    .collapsibleBtnText {\n      display: none;\n    }\n    &:hover .collapsibleBtnText {\n      display: inline;\n    }\n  }\n}\n"
  },
  {
    "path": "webview_panels/src/modules/lineage/tailwind-globals.css",
    "content": "/* ============================================================================\n   Scoped Tailwind Preflight + CSS variables for lego/shadcn components.\n\n   WHY SCOPED: We can't use @tailwind base globally because Preflight's CSS\n   reset (border-width: 0, heading font resets, list-style: none, etc.) breaks\n   Bootstrap styling in non-lineage panels that share the same main.css bundle.\n   Instead, we scope the entire Preflight under .al-tw-scope so lego/shadcn\n   components get the reset they expect while Bootstrap panels are unaffected.\n\n   SPECIFICITY: All Preflight selectors use :where(.al-tw-scope) so the scope\n   class contributes zero specificity. This keeps element resets at (0,0,1) —\n   the same as native Preflight — so Tailwind utility classes at (0,1,0)\n   always win. Without :where(), \".al-tw-scope button\" would be (0,1,1) and\n   beat \".al-bg-background\" at (0,1,0), making background-color: transparent\n   override the utility.\n\n   SOURCE ORDER: Preflight and variables MUST come before @tailwind utilities.\n   For selectors at the same specificity, last-in-source wins.\n\n   SOURCE: Adapted from tailwindcss/src/css/preflight.css (Tailwind v3).\n   theme() calls replaced with resolved values from our tailwind.config.ts.\n\n   VARIABLE SCOPING: CSS custom properties use HSL format (e.g., \"0 0% 100%\")\n   consumed as hsl(var(--background)). Scoped under .al-tw-scope to avoid\n   collision with main.scss's hex --background variable.\n   ============================================================================ */\n\n/* ---------------------------------------------------------------------------\n   Scoped Preflight — element resets\n   --------------------------------------------------------------------------- */\n\n/* 1. Prevent padding and border from affecting element width.\n   2. Allow adding a border to an element by just adding a border-width. */\n:where(.al-tw-scope) *,\n:where(.al-tw-scope) *::before,\n:where(.al-tw-scope) *::after {\n  box-sizing: border-box;\n  border-width: 0;\n  border-style: solid;\n  border-color: hsl(var(--border));\n}\n\n:where(.al-tw-scope) *::before,\n:where(.al-tw-scope) *::after {\n  --tw-content: \"\";\n}\n\n/* Root-level resets applied to the scope container itself */\n.al-tw-scope {\n  line-height: 1.5;\n  -webkit-text-size-adjust: 100%;\n  tab-size: 4;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen,\n    Ubuntu, Cantarell, \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", Helvetica,\n    Arial, sans-serif;\n  -webkit-tap-highlight-color: transparent;\n}\n\n/* Horizontal rules */\n:where(.al-tw-scope) hr {\n  height: 0;\n  color: inherit;\n  border-top-width: 1px;\n}\n\n/* Headings: reset to inherit so Tailwind typography classes control them */\n:where(.al-tw-scope) h1,\n:where(.al-tw-scope) h2,\n:where(.al-tw-scope) h3,\n:where(.al-tw-scope) h4,\n:where(.al-tw-scope) h5,\n:where(.al-tw-scope) h6 {\n  font-size: inherit;\n  font-weight: inherit;\n}\n\n/* Links: reset so Tailwind classes control color/decoration */\n:where(.al-tw-scope) a {\n  color: inherit;\n  text-decoration: inherit;\n}\n\n:where(.al-tw-scope) b,\n:where(.al-tw-scope) strong {\n  font-weight: bolder;\n}\n\n/* Code elements */\n:where(.al-tw-scope) code,\n:where(.al-tw-scope) kbd,\n:where(.al-tw-scope) samp,\n:where(.al-tw-scope) pre {\n  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,\n    \"Liberation Mono\", \"Courier New\", monospace;\n  font-size: 1em;\n}\n\n:where(.al-tw-scope) small {\n  font-size: 80%;\n}\n\n:where(.al-tw-scope) sub,\n:where(.al-tw-scope) sup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\n:where(.al-tw-scope) sub {\n  bottom: -0.25em;\n}\n\n:where(.al-tw-scope) sup {\n  top: -0.5em;\n}\n\n/* Tables */\n:where(.al-tw-scope) table {\n  text-indent: 0;\n  border-color: inherit;\n  border-collapse: collapse;\n}\n\n/* Form elements: inherit font, reset margin/padding */\n:where(.al-tw-scope) button,\n:where(.al-tw-scope) input,\n:where(.al-tw-scope) optgroup,\n:where(.al-tw-scope) select,\n:where(.al-tw-scope) textarea {\n  font-family: inherit;\n  font-feature-settings: inherit;\n  font-variation-settings: inherit;\n  font-size: 100%;\n  font-weight: inherit;\n  line-height: inherit;\n  letter-spacing: inherit;\n  color: inherit;\n  margin: 0;\n  padding: 0;\n}\n\n:where(.al-tw-scope) button,\n:where(.al-tw-scope) select {\n  text-transform: none;\n}\n\n/* Remove default button styles */\n:where(.al-tw-scope) button,\n:where(.al-tw-scope) input[type=\"button\"],\n:where(.al-tw-scope) input[type=\"reset\"],\n:where(.al-tw-scope) input[type=\"submit\"] {\n  -webkit-appearance: button;\n  background-color: transparent;\n  background-image: none;\n}\n\n/* Firefox focus style */\n:where(.al-tw-scope) :-moz-focusring {\n  outline: auto;\n}\n\n/* Remove Firefox :invalid styles */\n:where(.al-tw-scope) :-moz-ui-invalid {\n  box-shadow: none;\n}\n\n:where(.al-tw-scope) progress {\n  vertical-align: baseline;\n}\n\n:where(.al-tw-scope) ::-webkit-inner-spin-button,\n:where(.al-tw-scope) ::-webkit-outer-spin-button {\n  height: auto;\n}\n\n:where(.al-tw-scope) [type=\"search\"] {\n  -webkit-appearance: textfield;\n  outline-offset: -2px;\n}\n\n:where(.al-tw-scope) ::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n:where(.al-tw-scope) ::-webkit-file-upload-button {\n  -webkit-appearance: button;\n  font: inherit;\n}\n\n:where(.al-tw-scope) summary {\n  display: list-item;\n}\n\n/* Remove default spacing for block elements */\n:where(.al-tw-scope) blockquote,\n:where(.al-tw-scope) dl,\n:where(.al-tw-scope) dd,\n:where(.al-tw-scope) h1,\n:where(.al-tw-scope) h2,\n:where(.al-tw-scope) h3,\n:where(.al-tw-scope) h4,\n:where(.al-tw-scope) h5,\n:where(.al-tw-scope) h6,\n:where(.al-tw-scope) hr,\n:where(.al-tw-scope) figure,\n:where(.al-tw-scope) p,\n:where(.al-tw-scope) pre {\n  margin: 0;\n}\n\n:where(.al-tw-scope) fieldset {\n  margin: 0;\n  padding: 0;\n}\n\n:where(.al-tw-scope) legend {\n  padding: 0;\n}\n\n/* Lists: remove bullets and spacing */\n:where(.al-tw-scope) ol,\n:where(.al-tw-scope) ul,\n:where(.al-tw-scope) menu {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\n\n:where(.al-tw-scope) dialog {\n  padding: 0;\n}\n\n:where(.al-tw-scope) textarea {\n  resize: vertical;\n}\n\n/* Placeholder styling */\n:where(.al-tw-scope) input::placeholder,\n:where(.al-tw-scope) textarea::placeholder {\n  opacity: 1;\n  color: #9ca3af;\n}\n\n/* Cursor for interactive elements */\n:where(.al-tw-scope) button,\n:where(.al-tw-scope) [role=\"button\"] {\n  cursor: pointer;\n}\n\n:where(.al-tw-scope) :disabled {\n  cursor: default;\n}\n\n/* Replaced elements: block display, vertical alignment */\n:where(.al-tw-scope) img,\n:where(.al-tw-scope) svg,\n:where(.al-tw-scope) video,\n:where(.al-tw-scope) canvas,\n:where(.al-tw-scope) audio,\n:where(.al-tw-scope) iframe,\n:where(.al-tw-scope) embed,\n:where(.al-tw-scope) object {\n  display: block;\n  vertical-align: middle;\n}\n\n/* Constrain images/videos to parent width */\n:where(.al-tw-scope) img,\n:where(.al-tw-scope) video {\n  max-width: 100%;\n  height: auto;\n}\n\n/* Hidden attribute */\n:where(.al-tw-scope) [hidden]:where(:not([hidden=\"until-found\"])) {\n  display: none;\n}\n\n/* ---------------------------------------------------------------------------\n   Scoped CSS variables — light mode (default)\n\n   NOTE: These use .al-tw-scope (not :where) intentionally — CSS custom\n   property declarations don't compete with utility classes on the same\n   property, so specificity doesn't matter here. We need the real class\n   for cascade proximity (closest ancestor wins for custom properties).\n\n   RADIX PORTALS: Radix UI components (Popover, Tooltip, DropdownMenu) use\n   React portals that render to document.body, outside the .al-tw-scope\n   wrapper. The [data-radix-popper-content-wrapper] selector ensures portaled\n   content also receives the CSS variables, so hsl(var(--popover)) etc. resolve\n   correctly. Without this, portaled content has transparent backgrounds.\n   --------------------------------------------------------------------------- */\n.al-tw-scope,\n[data-radix-popper-content-wrapper] {\n  --background: 0 0% 100%;\n  --foreground: 222.2 84% 4.9%;\n  --card: 0 0% 100%;\n  --card-foreground: 222.2 84% 4.9%;\n  --popover: 0 0% 100%;\n  --popover-foreground: 222.2 84% 4.9%;\n  --primary: 217 99% 56%;\n  --primary-foreground: 0 0% 100%;\n  --secondary: 210 40% 96.1%;\n  --secondary-foreground: 222.2 47.4% 11.2%;\n  --muted: 210 40% 96.1%;\n  --muted-foreground: 215.4 16.3% 46.9%;\n  --accent: 210 40% 96.1%;\n  --accent-foreground: 222.2 47.4% 11.2%;\n  --destructive: 0 84.2% 60.2%;\n  --destructive-foreground: 210 40% 98%;\n  --border: 214.3 31.8% 91.4%;\n  --input: 214.3 31.8% 91.4%;\n  --ring: 222.2 84% 4.9%;\n  --radius: 0.5rem;\n  --sidebar-background: 0 0% 98%;\n  --sidebar-foreground: 240 5.3% 26.1%;\n  --sidebar-primary: 240 5.9% 10%;\n  --sidebar-primary-foreground: 0 0% 98%;\n  --sidebar-accent: 240 4.8% 95.9%;\n  --sidebar-accent-foreground: 240 5.9% 10%;\n  --sidebar-border: 220 13% 91%;\n  --sidebar-ring: 217.2 91.2% 59.8%;\n}\n\n/* ---------------------------------------------------------------------------\n   Scoped CSS variables — dark mode (VS Code dark themes)\n   --------------------------------------------------------------------------- */\nbody.vscode-dark .al-tw-scope,\nbody.vscode-dark [data-radix-popper-content-wrapper],\nbody.vscode-high-contrast:not(.vscode-high-contrast-light) .al-tw-scope,\nbody.vscode-high-contrast:not(.vscode-high-contrast-light)\n  [data-radix-popper-content-wrapper] {\n  --background: 0 0% 7%;\n  --foreground: 0 0% 80%;\n  --card: 0 0% 20%;\n  --card-foreground: 0 0% 80%;\n  --popover: 0 0% 15%;\n  --popover-foreground: 0 0% 80%;\n  --primary: 217 99% 56%;\n  --primary-foreground: 0 0% 100%;\n  --secondary: 0 0% 18%;\n  --secondary-foreground: 0 0% 80%;\n  --muted: 0 0% 18%;\n  --muted-foreground: 0 0% 60%;\n  --accent: 0 0% 18%;\n  --accent-foreground: 0 0% 80%;\n  --destructive: 0 62.8% 30.6%;\n  --destructive-foreground: 0 0% 93%;\n  --border: 0 0% 25%;\n  --input: 0 0% 25%;\n  --ring: 212.7 26.8% 83.9%;\n  --sidebar-background: 0 0% 10%;\n  --sidebar-foreground: 0 0% 93%;\n  --sidebar-primary: 224.3 76.3% 48%;\n  --sidebar-primary-foreground: 0 0% 100%;\n  --sidebar-accent: 0 0% 16%;\n  --sidebar-accent-foreground: 0 0% 93%;\n  --sidebar-border: 0 0% 16%;\n  --sidebar-ring: 217.2 91.2% 59.8%;\n}\n\n/* ---------------------------------------------------------------------------\n   Expand button overrides — force white background and dark text so the\n   outline-variant button is legible in both light and dark VS Code themes.\n   --------------------------------------------------------------------------- */\n#expand-container {\n  --background: 0 0% 100%;\n  --foreground: 0 0% 15%;\n  --card: 0 0% 100%;\n  --card-foreground: 0 0% 15%;\n  --accent: 0 0% 92%;\n  --accent-foreground: 0 0% 15%;\n  --border: 0 0% 80%;\n}\n\n/* ---------------------------------------------------------------------------\n   Tailwind utilities — MUST come after Preflight so utilities win on\n   specificity ties (both are 0,1,0 — last-in-source wins).\n   --------------------------------------------------------------------------- */\n@tailwind components;\n@tailwind utilities;\n"
  },
  {
    "path": "webview_panels/src/modules/lineage/types.ts",
    "content": "import type { CollectColumn, Details } from \"@altimateai/ui-components/lineage\";\n\nexport interface MissingLineageMessage {\n  message: string;\n  type: \"warning\" | \"error\";\n}\n\nexport interface StaticLineageProps {\n  selectedColumn?: { table: string; name: string };\n  collectColumns?: Record<string, CollectColumn[]>;\n  columnEdges?: [string, string][];\n  tableEdges: [string, string][];\n  details: Details;\n}\n"
  },
  {
    "path": "webview_panels/src/modules/logger/index.ts",
    "content": "export const panelLogger = console;\n"
  },
  {
    "path": "webview_panels/src/modules/markdown/PreTag.tsx",
    "content": "import { DetailedHTMLProps, HTMLAttributes, useState } from \"react\";\nimport { CopyToClipboard } from \"react-copy-to-clipboard\";\nimport classes from \"./markdown.module.scss\";\nimport { IconButton } from \"@uicore\";\nimport { CheckedIcon, FilesIcon } from \"@assets/icons\";\n\nconst PreTag = ({\n  children,\n  text,\n  ...rest\n}: DetailedHTMLProps<HTMLAttributes<HTMLPreElement>, HTMLPreElement> & {\n  text?: string;\n}): JSX.Element => {\n  const [isCopied, setIsCopied] = useState(false);\n\n  const setCopied = () => {\n    setIsCopied(true);\n    setTimeout(() => {\n      setIsCopied(false);\n    }, 3000);\n  };\n\n  return (\n    <div className={classes.pre}>\n      {text ? (\n        <div className=\"code__icons\">\n          <CopyToClipboard text={text}>\n            <IconButton\n              title={`${\n                !isCopied ? \"Copy to clipboard\" : \"Copied to clipboard\"\n              }`}\n              onClick={() => setCopied()}\n            >\n              {!isCopied ? <FilesIcon /> : <CheckedIcon />}\n            </IconButton>\n          </CopyToClipboard>\n        </div>\n      ) : null}\n      <pre {...rest}>{children}</pre>\n    </div>\n  );\n};\n\nexport default PreTag;\n"
  },
  {
    "path": "webview_panels/src/modules/markdown/Renderer.tsx",
    "content": "import ReactMarkdown from \"react-markdown\";\nimport classes from \"./markdown.module.scss\";\nimport PreTag from \"./PreTag\";\nimport { CodeBlock } from \"@uicore\";\nimport remarkGfm from \"remark-gfm\";\n\ninterface Props {\n  response: string;\n}\nconst MarkdownRenderer = ({ response }: Props): JSX.Element => {\n  return (\n    <ReactMarkdown\n      className={classes.markdown}\n      remarkPlugins={[remarkGfm]}\n      components={{\n        pre: ({ node, ...preProps }) => {\n          return (\n            <PreTag\n              {...preProps}\n              // @ts-expect-error valid type\n              // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n              text={node?.children?.[0]?.children?.[0]?.value}\n            />\n          );\n        },\n        code: ({ node, ...codeProps }) => {\n          // @ts-expect-error valid type\n          const text = node?.children[0].value as string;\n          const codeblock = text.includes(\"\\n\");\n          if (codeblock) {\n            return <CodeBlock code={text} language=\"sql\" />;\n          }\n          return <code {...codeProps} />;\n        },\n      }}\n    >\n      {response}\n    </ReactMarkdown>\n  );\n};\n\nexport default MarkdownRenderer;\n"
  },
  {
    "path": "webview_panels/src/modules/markdown/markdown.module.scss",
    "content": ".pre {\n  position: relative;\n\n  pre {\n    transition: 0.3s ease all;\n\n    :global .card {\n      background: var(--background--03) !important;\n\n      :global .card-body {\n        code {\n          max-height: none;\n        }\n      }\n    }\n  }\n\n  :global .code__icons {\n    position: absolute;\n    top: 6px;\n    right: 6px;\n    z-index: 1;\n  }\n\n  :global .code__icons button {\n    background-color: transparent;\n    border: none;\n    border-radius: 50%;\n    background-color: var(--icon--default);\n    padding: 6px;\n    cursor: pointer;\n  }\n}\n\n.markdown {\n\n  ul,\n  ol {\n    padding: 0;\n  }\n\n  table {\n    border-collapse: collapse;\n  }\n\n  th,\n  td {\n    padding: 6px 13px;\n    border: 1px solid black;\n  }\n}"
  },
  {
    "path": "webview_panels/src/modules/newFeature/NewFeatureIndicator.tsx",
    "content": "import {\n  executeRequestInAsync,\n  executeRequestInSync,\n} from \"@modules/app/requestExecutor\";\nimport { Tooltip } from \"@uicore\";\nimport { ReactNode, useEffect, useState } from \"react\";\n\nconst NewFeatureIndicator = ({\n  featureKey,\n  children,\n}: {\n  featureKey: string;\n  children: ReactNode;\n}): JSX.Element => {\n  const [show, setShow] = useState(false);\n  useEffect(() => {\n    executeRequestInSync(\"getFromContext\", { key: featureKey })\n      .then((value) => {\n        setShow(!value);\n      })\n      .catch(() => {\n        setShow(true);\n      });\n  }, []);\n\n  const updateContext = () => {\n    executeRequestInAsync(\"setContext\", { key: featureKey, value: true });\n    setShow(false);\n  };\n\n  return (\n    <span className=\"position-relative\" onClick={updateContext}>\n      {children}\n\n      {show ? (\n        <Tooltip title=\"New feature\">\n          <div className=\"new-feature\" />\n        </Tooltip>\n      ) : null}\n    </span>\n  );\n};\n\nexport default NewFeatureIndicator;\n"
  },
  {
    "path": "webview_panels/src/modules/notebooks/DeleteNotebookButton.tsx",
    "content": "import { DeleteIcon } from \"@assets/icons\";\nimport { executeRequestInSync } from \"@modules/app/requestExecutor\";\nimport { IconButton } from \"@uicore\";\n\nconst DeleteNotebookButton = ({\n  notebookId,\n  afterDelete,\n}: {\n  notebookId: number;\n  afterDelete: (deletedNotebookId: number) => void;\n}): JSX.Element => {\n  const handleDelete = async () => {\n    const result = await executeRequestInSync(\"showInformationMessage\", {\n      infoMessage: \"Are you sure you want to delete this notebook?\",\n      items: [\"Yes\", \"No\"],\n    });\n    if (result === \"Yes\") {\n      await executeRequestInSync(\"deleteNotebook\", {\n        notebookId,\n      });\n      afterDelete(notebookId);\n    }\n  };\n  return (\n    <IconButton onClick={handleDelete} title=\"Delete Notebook\" style={{color: \"inherit\"}}>\n      <DeleteIcon />\n    </IconButton>\n  );\n};\n\nexport default DeleteNotebookButton;\n"
  },
  {
    "path": "webview_panels/src/modules/notebooks/NoNotebooks.tsx",
    "content": "import { NoNotebooksIcon } from \"@assets/icons\";\nimport { executeRequestInAsync } from \"@modules/app/requestExecutor\";\nimport { Button } from \"@uicore\";\nimport classes from \"./notebooklist.module.scss\";\n\nexport const NoNotebooks = ({\n  privacy,\n}: {\n  privacy?: \"public\" | \"private\";\n}): JSX.Element => {\n  const handleClick = () => {\n    executeRequestInAsync(\"openNewNotebook\", {});\n  };\n  return (\n    <div className={classes.noNotebooks}>\n      <div className={classes.icon}>\n        <NoNotebooksIcon />\n      </div>\n      <div>\n        <div>\n          No Notebooks Have Been {privacy === \"private\" ? \"Saved\" : \"Shared\"}!\n        </div>\n        <div>Explaining content text for how to use notebooks</div>\n      </div>\n      <div className={classes.button}>\n        <Button className={classes.createNotebookButton} onClick={handleClick}>\n          Create Notebook\n        </Button>\n      </div>\n    </div>\n  );\n};\n"
  },
  {
    "path": "webview_panels/src/modules/notebooks/NotebookPrivacySettingButton.tsx",
    "content": "import { ShareIcon } from \"@assets/icons\";\nimport { executeRequestInSync } from \"@modules/app/requestExecutor\";\nimport useAppContext from \"@modules/app/useAppContext\";\nimport {\n  Button,\n  FormGroup,\n  IconButton,\n  Input,\n  LoadingButton,\n  PopoverWithButton,\n  PopoverWithButtonRef,\n  Stack,\n} from \"@uicore\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { NotebookItem } from \"./types\";\nimport { panelLogger } from \"@modules/logger\";\n\nconst NotebookPrivacySettingButton = ({\n  notebook,\n  refetchNotebook,\n}: {\n  notebook: NotebookItem;\n  refetchNotebook: () => void;\n}): JSX.Element | null => {\n  const {\n    state: { currentUser },\n  } = useAppContext();\n  const [privacy, setPrivacy] = useState(notebook.privacy);\n  const [isSubmitting, setIsSubmitting] = useState(false);\n  const popoverRef = useRef<PopoverWithButtonRef | null>(null);\n\n  const updateNotebookPrivacy = () => {\n    setIsSubmitting(true);\n    executeRequestInSync(\"updateNotebookPrivacy\", {\n      notebookId: notebook.id,\n      privacy: privacy,\n    })\n      .then(() => {\n        popoverRef.current?.close();\n        setIsSubmitting(false);\n        refetchNotebook();\n      })\n      .catch((err) => panelLogger.info(err));\n  };\n\n  useEffect(() => {\n    // Modify the setting when opening the popover to avoid one extra action from user\n    setPrivacy(notebook.privacy === \"private\" ? \"public\" : \"private\");\n  }, [notebook.privacy]);\n\n  if (currentUser?.id !== notebook.created_by_user.id) {\n    return null;\n  }\n\n  const shareText = notebook.privacy === \"private\" ? \"Share\" : \"Unshare\";\n\n  return (\n    <PopoverWithButton\n      ref={popoverRef}\n      title={\n        <Stack className=\"justify-content-between\">\n          <span>{`${shareText} Notebook`}</span>\n          <FormGroup switch>\n            <Input\n              onChange={(e) =>\n                setPrivacy(e.target.checked ? \"public\" : \"private\")\n              }\n              checked={privacy === \"public\"}\n              type=\"switch\"\n              role=\"switch\"\n            />\n          </FormGroup>\n        </Stack>\n      }\n      button={\n        <IconButton\n          title={`${shareText} this notebook`}\n          style={{\n            color:\n              notebook.privacy === \"public\"\n                ? \"var(--primary-color)\"\n                : \"inherit\",\n          }}\n        >\n          <ShareIcon />\n        </IconButton>\n      }\n      popoverProps={{\n        placement: \"bottom\",\n        hideArrow: true,\n      }}\n    >\n      {({ styles, close }) => (\n        <div>\n          <div className=\"p3\">Shared with all users in SaaS instance</div>\n          <div className={styles.popoverActions}>\n            <LoadingButton\n              color=\"primary\"\n              loading={isSubmitting}\n              onClick={(e) => {\n                e.preventDefault();\n                updateNotebookPrivacy();\n              }}\n            >\n              Save\n            </LoadingButton>\n            <Button outline onClick={close}>\n              Cancel\n            </Button>\n          </div>\n        </div>\n      )}\n    </PopoverWithButton>\n  );\n};\n\nexport default NotebookPrivacySettingButton;\n"
  },
  {
    "path": "webview_panels/src/modules/notebooks/Notebooks.tsx",
    "content": "import { useCallback, useEffect, useState } from \"react\";\nimport NotebooksList from \"./NotebooksList\";\nimport { IncomingMessageProps } from \"@modules/app/types\";\nimport { panelLogger } from \"@modules/logger\";\n// import PreConfiguredNotebooksList from \"./PreConfiguredNotebooksList\";\n\nconst Notebooks = (): JSX.Element => {\n  const [refetch, setRefetch] = useState(Date.now());\n\n  const onMesssage = useCallback(\n    (event: MessageEvent<IncomingMessageProps>) => {\n      const { command } = event.data;\n      switch (command) {\n        case \"refetchNotebooks\":\n          setRefetch(Date.now());\n          break;\n        default:\n          break;\n      }\n    },\n    []\n  );\n\n  useEffect(() => {\n    window.addEventListener(\"message\", onMesssage);\n\n    return () => {\n      window.removeEventListener(\"message\", onMesssage);\n    };\n  }, [onMesssage]);\n\n  const refetchNotebook = () => {\n    setRefetch(Date.now());\n  };\n\n  panelLogger.info(\"Notebooks\", \"Refetching notebooks\", refetch);\n\n  return (\n    <div>\n      <NotebooksList type=\"preconfigured\" refetchTime={refetch} refetchNotebook={refetchNotebook} />\n      <NotebooksList type=\"saved\" privacy=\"private\" refetchTime={refetch} refetchNotebook={refetchNotebook} />\n      <NotebooksList type=\"saved\" privacy=\"public\" refetchTime={refetch} refetchNotebook={refetchNotebook} />\n    </div>\n  );\n};\n\nexport default Notebooks;\n"
  },
  {
    "path": "webview_panels/src/modules/notebooks/NotebooksList.tsx",
    "content": "import { executeRequestInSync } from \"@modules/app/requestExecutor\";\nimport { panelLogger } from \"@modules/logger\";\nimport { ChangeEvent, useEffect, useState, KeyboardEvent } from \"react\";\nimport {\n  Accordion,\n  IconButton,\n  Input,\n  ListGroup,\n  ListGroupItem,\n  Spinner,\n  Stack,\n  Tag,\n} from \"@uicore\";\nimport classes from \"./notebooklist.module.scss\";\nimport { NotebookItem, NotebookSchema } from \"./types\";\nimport NotebookPrivacySettingButton from \"./NotebookPrivacySettingButton\";\nimport { format } from \"date-fns\";\nimport { NoNotebooks } from \"./NoNotebooks\";\nimport { ArrowDownIcon, ArrowRightIcon, EditIcon } from \"@assets/icons\";\nimport DeleteNotebookButton from \"./DeleteNotebookButton\";\n\ninterface NotebookListProps {\n  type: \"saved\" | \"preconfigured\";\n  privacy?: \"public\" | \"private\";\n  refetchTime: number;\n  refetchNotebook: () => void;\n}\n\nconst NotebooksList = ({\n  type,\n  privacy,\n  refetchTime,\n  refetchNotebook,\n}: NotebookListProps): JSX.Element => {\n  const [isOpen, setIsOpen] = useState(true);\n  const [notebooks, setNotebooks] = useState<NotebookItem[]>();\n  const [isLoading, setIsLoading] = useState(false);\n  const [editNotebook, setEditNotebook] = useState<NotebookItem | undefined>();\n  const [newNotebookName, setNewNotebookName] = useState(\"\");\n\n  const fetchNotebooks = () => {\n    setIsLoading(true);\n    executeRequestInSync(\n      type === \"saved\" ? \"getNotebooks\" : \"getPreConfiguredNotebooks\",\n      type === \"saved\" ? { privacy: privacy } : {}\n    )\n      .then((response) => {\n        setNotebooks(response as NotebookItem[]);\n        setIsLoading(false);\n      })\n      .catch((err) => panelLogger.info(err));\n  };\n  useEffect(() => {\n    fetchNotebooks();\n  }, [refetchTime]);\n\n  const openNotebook = (name?: string, notebookSchema?: NotebookSchema) => {\n    executeRequestInSync(\"openNewNotebook\", {\n      notebookId: name,\n      notebookSchema: notebookSchema,\n    })\n      .then(() => panelLogger.info(`${type} Notebook opened`))\n      .catch((err) => panelLogger.info(err));\n  };\n\n  const handleSaveNotebookName = async () => {\n    const result = (await executeRequestInSync(\"updateNotebook\", {\n      notebookId: editNotebook?.id,\n      name: newNotebookName,\n      data: {\n        ...editNotebook?.data,\n        metadata: {\n          ...editNotebook?.data?.metadata,\n          name: newNotebookName,\n          isDraft: false,\n        },\n      },\n    })) as { ok: boolean };\n    if (result.ok) {\n      setNotebooks(\n        notebooks?.map((notebook) => {\n          if (notebook.id === editNotebook?.id) {\n            return {\n              ...notebook,\n              name: newNotebookName,\n              data: {\n                ...notebook?.data,\n                metadata: {\n                  ...notebook?.data?.metadata,\n                  name: newNotebookName,\n                  isDraft: false,\n                },\n              },\n            };\n          }\n          return notebook;\n        })\n      );\n      setEditNotebook(undefined);\n      setNewNotebookName(\"\");\n    }\n  };\n\n  const onKeyPress = async (event: KeyboardEvent<HTMLInputElement>) => {\n    if (event.key === \"Enter\") {\n      await handleSaveNotebookName();\n    }\n    if (event.key === \"Escape\") {\n      setEditNotebook(undefined);\n      setNewNotebookName(\"\");\n    }\n  };\n  const handleNotebookNameChange = (event: ChangeEvent<HTMLInputElement>) => {\n    setNewNotebookName((event.target as HTMLInputElement).value);\n  };\n\n  const afterDelete = (deletedNotebookId: number) => {\n    setNotebooks(\n      notebooks?.filter((notebook) => notebook.id !== deletedNotebookId)\n    );\n  };\n\n  return (\n    <Accordion\n      defaultOpen\n      trigger={() => (\n        <header\n          className=\"d-flex align-items-start justify-content-between mt-4\"\n          onClick={() => setIsOpen((prev) => !prev)}\n        >\n          <h4>\n            {isOpen ? <ArrowDownIcon /> : <ArrowRightIcon />}{\" \"}\n            {type === \"saved\"\n              ? privacy === \"private\"\n                ? \"Saved Notebooks\"\n                : \"Public Notebooks\"\n              : \"Pre-configured Notebooks\"}\n          </h4>\n        </header>\n      )}\n    >\n      {() => {\n        if (isLoading) return <Spinner />;\n        if (!notebooks || notebooks.length === 0)\n          return (\n            <div className={classes.noNotebooksContainer}>\n              <NoNotebooks />\n            </div>\n          );\n        if (!isLoading && notebooks)\n          return (\n            <div className={classes.notebookList}>\n              <ListGroup>\n                {notebooks\n                  .filter(\n                    (notebook) =>\n                      type === \"saved\" ||\n                      notebook.data.metadata?.displayInActions === true\n                  )\n                  .map((notebook, index) => (\n                    <ListGroupItem key={index}>\n                      <Stack\n                        onClick={() =>\n                          type === \"saved\"\n                            ? openNotebook(notebook.name)\n                            : openNotebook(undefined, notebook.data)\n                        }\n                      >\n                        <Stack className={classes.notebookName}>\n                          <span>\n                            {editNotebook?.id === notebook.id ? (\n                              <Input\n                                autoFocus\n                                onKeyDown={onKeyPress}\n                                onBlur={handleSaveNotebookName}\n                                onChange={handleNotebookNameChange}\n                                value={newNotebookName}\n                                onClick={(e) => e.stopPropagation()}\n                              />\n                            ) : (\n                              notebook.name\n                            )}\n                          </span>\n                          {privacy === \"private\" && (\n                            <IconButton\n                              title=\"Edit notebook name\"\n                              onClick={(e) => {\n                                e.stopPropagation();\n                                setEditNotebook(notebook);\n                                setNewNotebookName(notebook.name);\n                              }}\n                            >\n                              <EditIcon />\n                            </IconButton>\n                          )}\n                        </Stack>\n                      </Stack>\n                      <br />\n                      {type === \"saved\" && (\n                        <>\n                          <Stack>\n                            {notebook.data.metadata?.isDraft ? (\n                              <Tag>Draft</Tag>\n                            ) : null}\n                            {format(\n                              new Date(notebook.created_on),\n                              \"hh:mm a dd MMM yyyy\"\n                            )}\n                          </Stack>\n                          <br />\n                          {!notebook.data.metadata?.isDraft &&\n                            privacy === \"private\" && (\n                              <NotebookPrivacySettingButton\n                                notebook={notebook}\n                                refetchNotebook={refetchNotebook}\n                              />\n                            )}\n                          {privacy === \"private\" ? (\n                            <DeleteNotebookButton\n                              notebookId={notebook.id}\n                              afterDelete={afterDelete}\n                            />\n                          ) : null}\n                        </>\n                      )}\n                    </ListGroupItem>\n                  ))}\n              </ListGroup>\n            </div>\n          );\n      }}\n    </Accordion>\n  );\n};\n\nexport default NotebooksList;\n"
  },
  {
    "path": "webview_panels/src/modules/notebooks/notebooklist.module.scss",
    "content": ".notebookList {\n  width: 100vw;\n  display: flex;\n  justify-content: start;\n  :global .list-group {\n    width: 60%;\n    border-radius: 0;\n    overflow-y: auto;\n    max-height: 175px;\n    padding: 1rem;\n    margin-top: 20px;\n    background: black;\n    :global .list-group-item {\n      background-color: #1e1e1e;\n      border-radius: 4px;\n      color: #808080;\n      margin-bottom: 1rem;\n      border-radius: 4px;\n      border: 1px solid transparent;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      cursor: pointer;\n      padding: 8px;\n      min-height: 2.5rem;\n      &:hover {\n        border-color: var(--primary-color);\n      }\n\n      > div:first-child {\n        text-overflow: ellipsis;\n        overflow: hidden;\n        white-space: nowrap;\n        flex: 1;\n        text-align: left;\n        color: #808080;\n\n        .codicon {\n          color: #89d185;\n          margin-right: 0.5rem;\n        }\n      }\n\n      > div:last-child {\n        gap: 2px;\n        span {\n          vertical-align: bottom;\n          color: #808080;\n        }\n        button {\n          display: none;\n          padding: 1px 4px;\n          color: #808080;\n        }\n      }\n\n      &:hover {\n        > div:last-child {\n          button {\n            display: inline-block;\n            color: #808080;\n          }\n        }\n      }\n    }\n    &:hover {\n      color: white;\n    }\n  }\n  .notebookName {\n    span {\n      line-height: 2.4;\n    }\n\n    button {\n      padding-left: 0;\n      padding-top: 0;\n    }\n    svg {\n      width: 10px;\n    }\n  }\n}\n\n.noNotebooksContainer {\n  width: 100vw;\n  display: flex;\n  justify-content: start;\n  .noNotebooks {\n    width: 60%;\n    text-align: center;\n    justify-content: start;\n    background: black;\n    padding-block: 30px;\n    .icon {\n      margin-bottom: 15px;\n    }\n    .button {\n      margin-top: 15px;\n    }\n  }\n}\n"
  },
  {
    "path": "webview_panels/src/modules/notebooks/types.ts",
    "content": "import { User } from \"@modules/app/types\";\nimport { NotebookCellKind } from \"vscode\";\n\nexport declare interface NotebookCellSchema {\n  source: string[];\n  cell_type: NotebookCellKind;\n  languageId: string;\n  metadata?: Record<string, unknown>;\n}\nexport interface NotebookSchema {\n  cells: NotebookCellSchema[];\n  metadata?: Record<string, unknown>;\n}\nexport interface NotebookItem {\n  id: number;\n  name: string;\n  data: NotebookSchema;\n  description: string;\n  created_on: string;\n  updated_on: string;\n  tags: {\n    id: number;\n    tag: string;\n  }[];\n  privacy: string;\n  created_by_user: User;\n}\n\nexport interface PreconfiguredNotebookItem {\n  name: string;\n  description: string;\n  created_on: string;\n  updated_at: string;\n  id: string;\n  tags: string[];\n  data: NotebookSchema;\n}\n"
  },
  {
    "path": "webview_panels/src/modules/onboarding/AltimateSetupStep.tsx",
    "content": "import { executeRequestInSync } from \"@modules/app/requestExecutor\";\nimport { panelLogger } from \"@modules/logger\";\nimport { Stack } from \"@uicore\";\nimport { Alert, Button, Input, Select } from \"antd\";\nimport { useEffect, useRef, useState } from \"react\";\nimport classes from \"./onboarding.module.scss\";\n\ntype AltimatePhase = \"key\";\n\ninterface AltimateSetupStepProps {\n  phase: AltimatePhase;\n  onComplete?: () => void;\n  onReadyChange?: (ready: boolean, loading?: boolean) => void;\n}\n\nconst AltimateSetupStep = ({\n  phase,\n  onComplete,\n  onReadyChange,\n}: AltimateSetupStepProps): JSX.Element => {\n  const [isAltimateConfigured, setIsAltimateConfigured] = useState<\n    boolean | null\n  >(null);\n  const [apiKey, setApiKey] = useState<string>(\"\");\n  const [instanceName, setInstanceName] = useState<string>(\"\");\n  const [backendURL, setBackendURL] = useState<string>(\n    \"https://api.myaltimate.com\",\n  );\n  const [isValidating, setIsValidating] = useState(false);\n  const [error, setError] = useState<string | undefined>();\n  const [success, setSuccess] = useState(false);\n  const [isEditing, setIsEditing] = useState(false);\n  const completionTimerRef = useRef<ReturnType<typeof setTimeout>>();\n\n  // Clear completion timer on unmount\n  useEffect(() => {\n    return () => {\n      if (completionTimerRef.current) {\n        clearTimeout(completionTimerRef.current);\n      }\n    };\n  }, []);\n\n  useEffect(() => {\n    void checkAltimateConfiguration();\n  }, []);\n\n  // Report readiness to parent wizard\n  useEffect(() => {\n    onReadyChange?.(!!isAltimateConfigured);\n  }, [phase, isAltimateConfigured, onReadyChange]);\n\n  const checkAltimateConfiguration = async () => {\n    try {\n      const response = (await executeRequestInSync(\n        \"checkAltimateConfiguration\",\n        {},\n      )) as {\n        isConfigured: boolean;\n        dbtIntegrationType?: string;\n        instanceName?: string;\n        apiKey?: string;\n        altimateUrl?: string;\n      };\n      setIsAltimateConfigured(response?.isConfigured || false);\n\n      // Pre-populate fields with saved values for editing\n      if (response?.instanceName) {\n        setInstanceName(response.instanceName);\n      }\n      if (response?.apiKey) {\n        setApiKey(response.apiKey);\n      }\n      if (response?.altimateUrl) {\n        setBackendURL(response.altimateUrl);\n      }\n    } catch (err) {\n      panelLogger.error(\"Error checking Altimate configuration\", err);\n      setIsAltimateConfigured(false);\n    }\n  };\n\n  const handleSaveKey = async () => {\n    if (!apiKey.trim()) {\n      setError(\"Please enter an API key\");\n      return;\n    }\n\n    if (!instanceName.trim()) {\n      setError(\"Please enter an instance name\");\n      return;\n    }\n\n    try {\n      setIsValidating(true);\n      setError(undefined);\n\n      await executeRequestInSync(\"saveAltimateKey\", {\n        apiKey: apiKey.trim(),\n        instanceName: instanceName.trim(),\n        backendURL: backendURL.trim(),\n      });\n\n      setSuccess(true);\n\n      // Show success message briefly, then mark configured and advance\n      completionTimerRef.current = setTimeout(() => {\n        setIsAltimateConfigured(true);\n        setSuccess(false);\n        onComplete?.();\n      }, 1500);\n    } catch (err) {\n      panelLogger.error(\"Error saving Altimate API key\", err);\n      setError(\n        err instanceof Error\n          ? err.message\n          : \"Failed to save API key. Please check your credentials.\",\n      );\n    } finally {\n      setIsValidating(false);\n    }\n  };\n\n  const openUrl = async (url: string) => {\n    try {\n      await executeRequestInSync(\"openUrl\", { url });\n    } catch (err) {\n      panelLogger.error(\"Error opening URL\", err);\n      // Fallback to window.open if the command fails\n      window.open(url, \"_blank\");\n    }\n  };\n\n  const handleSignUp = async () => {\n    await openUrl(\"https://app.myaltimate.com/register\");\n  };\n\n  // Loading state while checking configuration\n  if (isAltimateConfigured === null) {\n    return (\n      <div className={classes.altimateKeyContainer}>\n        <p>Checking Altimate configuration...</p>\n      </div>\n    );\n  }\n\n  // If already configured and not editing, show success with edit option\n  if (isAltimateConfigured && !isEditing) {\n    return (\n      <div className={classes.altimateKeyContainer}>\n        <Alert\n          message=\"Altimate AI is already configured!\"\n          description=\"Your API key is set up. Click 'Tutorials' to continue.\"\n          type=\"success\"\n          showIcon\n          className={classes.alertMessage}\n        />\n        <Button\n          size=\"large\"\n          onClick={() => {\n            setIsEditing(true);\n            setSuccess(false);\n            setError(undefined);\n          }}\n        >\n          Edit Configuration\n        </Button>\n      </div>\n    );\n  }\n\n  // Show API key setup form\n  return (\n    <div className={classes.altimateKeyContainer}>\n      <Alert\n        message={\n          <span style={{ fontWeight: 600 }}>\n            Don&apos;t have an API key? Get one for free\n          </span>\n        }\n        description={\n          <div>\n            <p style={{ margin: \"0.5rem 0\" }}>\n              Follow these steps to get started:\n            </p>\n            <ol style={{ margin: \"0 0 1rem\", paddingLeft: \"1.25rem\" }}>\n              <li>\n                Sign up at{\" \"}\n                <a\n                  href=\"#\"\n                  onClick={(e) => {\n                    e.preventDefault();\n                    void openUrl(\"https://app.myaltimate.com/register\");\n                  }}\n                >\n                  app.myaltimate.com\n                </a>\n              </li>\n              <li>Navigate to Settings &rarr; API Keys</li>\n              <li>Copy your API key and instance name</li>\n            </ol>\n            <div style={{ display: \"flex\", justifyContent: \"flex-end\" }}>\n              <Button type=\"primary\" size=\"large\" onClick={handleSignUp}>\n                Sign Up for Free at app.myaltimate.com\n              </Button>\n            </div>\n          </div>\n        }\n        type=\"info\"\n        showIcon\n        className={classes.alertMessage}\n      />\n\n      {error && (\n        <Alert\n          message=\"Error\"\n          description={error}\n          type=\"error\"\n          showIcon\n          closable\n          onClose={() => setError(undefined)}\n          className={classes.alertMessage}\n        />\n      )}\n\n      {success && (\n        <Alert\n          message=\"API key saved successfully!\"\n          type=\"success\"\n          showIcon\n          className={classes.alertMessage}\n        />\n      )}\n\n      <div className={classes.formGroup}>\n        <label htmlFor=\"instance-name\" className={classes.formLabel}>\n          Instance Name:\n        </label>\n        <Input\n          id=\"instance-name\"\n          placeholder=\"Enter your instance name\"\n          value={instanceName}\n          onChange={(e) => setInstanceName(e.target.value)}\n          disabled={isValidating || success}\n          size=\"large\"\n        />\n      </div>\n\n      <div className={classes.formGroup}>\n        <label htmlFor=\"api-key\" className={classes.formLabel}>\n          API Key:\n        </label>\n        <Input.Password\n          id=\"api-key\"\n          placeholder=\"Enter your Altimate API key\"\n          value={apiKey}\n          onChange={(e) => setApiKey(e.target.value)}\n          disabled={isValidating || success}\n          size=\"large\"\n        />\n      </div>\n\n      <div className={classes.formGroup}>\n        <label htmlFor=\"backend-url\" className={classes.formLabel}>\n          Backend URL:\n        </label>\n        <Select\n          id=\"backend-url\"\n          value={backendURL}\n          onChange={(value) => setBackendURL(value)}\n          disabled={isValidating || success}\n          size=\"large\"\n          style={{ width: \"100%\" }}\n        >\n          <Select.Option value=\"https://api.myaltimate.com\">\n            Community, Pro or Team Plan\n          </Select.Option>\n          <Select.Option value=\"https://api.getaltimate.com\">\n            Enterprise Plan\n          </Select.Option>\n        </Select>\n      </div>\n\n      <Stack direction=\"row\" className={classes.altimateKeyActions}>\n        <Button\n          type=\"primary\"\n          size=\"large\"\n          onClick={handleSaveKey}\n          loading={isValidating}\n          disabled={success}\n        >\n          {success ? \"Saved\" : \"Save API Key\"}\n        </Button>\n      </Stack>\n    </div>\n  );\n};\n\nexport default AltimateSetupStep;\n"
  },
  {
    "path": "webview_panels/src/modules/onboarding/DbtIntegrationSetup.tsx",
    "content": "import { Stack } from \"@uicore\";\nimport { Alert, Button } from \"antd\";\nimport { useState } from \"react\";\nimport classes from \"./onboarding.module.scss\";\n\ninterface DbtIntegrationSetupProps {\n  onComplete?: () => void;\n  onSkip?: () => void;\n}\n\nconst DbtIntegrationSetup = ({\n  onComplete,\n  onSkip,\n}: DbtIntegrationSetupProps): JSX.Element => {\n  const [isOpened, setIsOpened] = useState(false);\n\n  const handleOpenAltimate = () => {\n    window.open(\"https://app.myaltimate.com/integrations/new\", \"_blank\");\n    setIsOpened(true);\n  };\n\n  const handleContinue = () => {\n    if (onComplete) {\n      onComplete();\n    }\n  };\n\n  const handleSkip = () => {\n    if (onSkip) {\n      onSkip();\n    }\n  };\n\n  return (\n    <div className={classes.dbtIntegrationContainer}>\n      <div className={classes.dbtIntegrationInfo}>\n        <p>\n          Create a dbt integration in Altimate to unlock collaboration and\n          governance features:\n        </p>\n        <ul>\n          <li>Sync your dbt documentation and lineage to the cloud</li>\n          <li>Collaborate with your team on code and documentation</li>\n          <li>Set up project governance and quality checks</li>\n          <li>Track query history and share bookmarks</li>\n          <li>Export lineage diagrams and documentation</li>\n        </ul>\n      </div>\n\n      {isOpened && (\n        <Alert\n          message=\"Integration setup opened\"\n          description=\"Complete the integration setup in your browser, then click 'Continue' below to proceed.\"\n          type=\"info\"\n          showIcon\n          className={classes.alertMessage}\n        />\n      )}\n\n      <div className={classes.dbtIntegrationSteps}>\n        <p>\n          <strong>Steps to create the integration:</strong>\n        </p>\n        <ol>\n          <li>Click &quot;Open Altimate Platform&quot; below</li>\n          <li>Select your dbt integration type (Core or Cloud)</li>\n          <li>Follow the guided setup in the Altimate platform</li>\n          <li>Return here and click &quot;Continue&quot; when done</li>\n        </ol>\n      </div>\n\n      <Stack direction=\"row\" className={classes.dbtIntegrationActions}>\n        <Button size=\"large\" onClick={handleSkip}>\n          Skip this step\n        </Button>\n        <Button type=\"default\" size=\"large\" onClick={handleOpenAltimate}>\n          Open Altimate Platform\n        </Button>\n        <Button\n          type=\"primary\"\n          size=\"large\"\n          onClick={handleContinue}\n          disabled={!isOpened}\n        >\n          Continue\n        </Button>\n      </Stack>\n\n      <div className={classes.helpText}>\n        <p>\n          Need help?{\" \"}\n          <a\n            href=\"https://docs.myaltimate.com/setup/reqdConfig/\"\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n          >\n            View integration documentation\n          </a>\n        </p>\n      </div>\n    </div>\n  );\n};\n\nexport default DbtIntegrationSetup;\n"
  },
  {
    "path": "webview_panels/src/modules/onboarding/InstallDbtStep.tsx",
    "content": "import { executeRequestInSync } from \"@modules/app/requestExecutor\";\nimport { panelLogger } from \"@modules/logger\";\nimport { Stack } from \"@uicore\";\nimport { Alert, Button, Card, Radio, Space } from \"antd\";\nimport { useState } from \"react\";\nimport classes from \"./onboarding.module.scss\";\n\ninterface InstallDbtStepProps {\n  initialIntegrationType?: \"core\" | \"fusion\" | \"cloud\";\n  onComplete?: () => void;\n  onSkip?: () => void;\n}\n\ntype DbtIntegrationType = \"core\" | \"fusion\" | \"cloud\";\ntype InstallState = \"idle\" | \"installing\" | \"complete\" | \"error\";\n\nconst InstallDbtStep = ({\n  initialIntegrationType,\n  onComplete,\n  onSkip,\n}: InstallDbtStepProps): JSX.Element => {\n  const [integrationType, setIntegrationType] = useState<DbtIntegrationType>(\n    initialIntegrationType ?? \"core\",\n  );\n  const [installState, setInstallState] = useState<InstallState>(\"idle\");\n  const [error, setError] = useState<string | undefined>();\n\n  const handleInstall = async () => {\n    try {\n      setError(undefined);\n      setInstallState(\"installing\");\n\n      await executeRequestInSync(\"installDbt\", {\n        integrationType,\n      });\n\n      setInstallState(\"complete\");\n\n      // Call onComplete callback if provided\n      if (onComplete) {\n        setTimeout(onComplete, 1500);\n      }\n    } catch (err) {\n      panelLogger.error(\"Error installing dbt\", err);\n      setError(\n        err instanceof Error\n          ? err.message\n          : \"Failed to install dbt. Check the terminal for details.\",\n      );\n      setInstallState(\"error\");\n    }\n  };\n\n  const handleSkip = () => {\n    if (onSkip) {\n      onSkip();\n    }\n  };\n\n  const isInstalling = installState === \"installing\";\n  const isComplete = installState === \"complete\";\n\n  return (\n    <div className={classes.installDbtContainer}>\n      <div className={classes.installDbtInfo}>\n        <p>\n          Choose your dbt integration type and install dbt to enable all\n          features of dbt Power User:\n        </p>\n      </div>\n\n      <Card className={classes.integrationTypeCard}>\n        <Radio.Group\n          value={integrationType}\n          onChange={(e) =>\n            setIntegrationType(e.target.value as DbtIntegrationType)\n          }\n          disabled={isInstalling || isComplete}\n        >\n          <Space direction=\"vertical\" size=\"large\" style={{ width: \"100%\" }}>\n            <Radio value=\"core\">\n              <div className={classes.radioOption}>\n                <strong>dbt Core</strong>\n                <p className={classes.radioDescription}>\n                  Install dbt Core with a specific adapter (Snowflake, BigQuery,\n                  Postgres, etc.). Best for local development and full control\n                  over your dbt environment.\n                </p>\n              </div>\n            </Radio>\n            <Radio value=\"fusion\">\n              <div className={classes.radioOption}>\n                <strong>dbt Fusion</strong>\n                <p className={classes.radioDescription}>\n                  Install dbt Fusion CLI for enhanced dbt functionality.\n                  Provides improved performance and additional features on top\n                  of dbt Core.\n                </p>\n              </div>\n            </Radio>\n            <Radio value=\"cloud\">\n              <div className={classes.radioOption}>\n                <strong>dbt Cloud CLI</strong>\n                <p className={classes.radioDescription}>\n                  Install the dbt Cloud CLI to work with dbt Cloud environments.\n                  Ideal for teams using dbt Cloud for orchestration and\n                  collaboration.\n                </p>\n              </div>\n            </Radio>\n          </Space>\n        </Radio.Group>\n      </Card>\n\n      {error && (\n        <Alert\n          message=\"Installation Error\"\n          description={error}\n          type=\"error\"\n          showIcon\n          closable\n          onClose={() => setError(undefined)}\n          className={classes.alertMessage}\n        />\n      )}\n\n      {isComplete && (\n        <Alert\n          message=\"Installation successful!\"\n          description={`dbt ${integrationType} has been installed successfully.`}\n          type=\"success\"\n          showIcon\n          className={classes.alertMessage}\n        />\n      )}\n\n      <Stack direction=\"row\" className={classes.installDbtActions}>\n        <Button\n          size=\"large\"\n          onClick={handleSkip}\n          disabled={isInstalling || isComplete}\n        >\n          Skip this step\n        </Button>\n        <Button\n          type=\"primary\"\n          size=\"large\"\n          onClick={handleInstall}\n          disabled={isInstalling || isComplete}\n          loading={isInstalling}\n        >\n          {isComplete\n            ? \"Installed\"\n            : isInstalling\n              ? \"Installing...\"\n              : `Install dbt ${integrationType}`}\n        </Button>\n      </Stack>\n\n      <div className={classes.helpText}>\n        <p>\n          Need help choosing?{\" \"}\n          <a\n            href=\"https://docs.myaltimate.com/setup/reqdConfig/\"\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n          >\n            View integration documentation\n          </a>\n        </p>\n      </div>\n    </div>\n  );\n};\n\nexport default InstallDbtStep;\n"
  },
  {
    "path": "webview_panels/src/modules/onboarding/Onboarding.tsx",
    "content": "import { Button, Container, Stack } from \"@uicore\";\nimport { useEffect, useRef, useState } from \"react\";\nimport classes from \"./onboarding.module.scss\";\nimport SetupWizard from \"./SetupWizard\";\n\ninterface NavigateToStepMessage {\n  command: string;\n  payload?: {\n    step?: string;\n  };\n}\n\nconst Onboarding = (): JSX.Element => {\n  const [showWizard, setShowWizard] = useState(false);\n  const [initialStep, setInitialStep] = useState<string | undefined>();\n  const wizardRef = useRef<{ navigateToStep: (stepId: string) => void }>(null);\n\n  useEffect(() => {\n    const handleMessage = (event: MessageEvent<NavigateToStepMessage>) => {\n      const message = event.data;\n      if (message.command === \"navigateToStep\" && message.payload?.step) {\n        const stepId: string = message.payload.step;\n\n        // If wizard is already shown, navigate directly\n        if (showWizard && wizardRef.current) {\n          wizardRef.current.navigateToStep(stepId);\n        } else {\n          // Otherwise, show wizard and set initial step\n          setInitialStep(stepId);\n          setShowWizard(true);\n        }\n      }\n    };\n\n    window.addEventListener(\"message\", handleMessage);\n    return () => {\n      window.removeEventListener(\"message\", handleMessage);\n    };\n  }, [showWizard]);\n\n  const handleGetStarted = () => {\n    setShowWizard(true);\n  };\n\n  const handleLearnMore = () => {\n    window.open(\"https://docs.myaltimate.com/setup/reqdConfig/\", \"_blank\");\n  };\n\n  const handleTutorials = () => {\n    setInitialStep(\"finish\");\n    setShowWizard(true);\n  };\n\n  if (showWizard) {\n    return <SetupWizard ref={wizardRef} initialStep={initialStep} />;\n  }\n\n  return (\n    <Container fluid className={classes.onboardingContainer}>\n      <Stack direction=\"column\" className={classes.content}>\n        <h1 className={classes.mainTitle}>\n          Supercharge your dbt workflow with Power User for dbt!\n        </h1>\n\n        <p className={classes.subtitle}>With dbt Power User, you can:</p>\n\n        <div className={classes.featuresGrid}>\n          <Stack direction=\"row\" className={classes.featureRow}>\n            <div className={classes.featureItem}>\n              <span className={classes.iconChat}>💬</span>\n              <span className={classes.featureText}>\n                Get instant answers about your models, tests, and production\n                runs\n              </span>\n            </div>\n\n            <div className={classes.featureItem}>\n              <span className={classes.iconSearch}>🔍</span>\n              <span className={classes.featureText}>\n                Explore and search faster within your dbt project\n              </span>\n            </div>\n          </Stack>\n\n          <Stack direction=\"row\" className={classes.featureRow}>\n            <div className={classes.featureItem}>\n              <span className={classes.iconBrain}>🧠</span>\n              <span className={classes.featureText}>\n                Visualize model, column and SQL lineage with clarity\n              </span>\n            </div>\n\n            <div className={classes.featureItem}>\n              <span className={classes.iconGear}>⚙️</span>\n              <span className={classes.featureText}>\n                Run & debug directly in VS Code\n              </span>\n            </div>\n          </Stack>\n\n          <Stack direction=\"row\" className={classes.featureRow}>\n            <div className={classes.featureItem}>\n              <span className={classes.iconChart}>📈</span>\n              <span className={classes.featureText}>\n                Get checks on performance, tests, and structure\n              </span>\n            </div>\n\n            <div className={classes.featureItem}>\n              <span className={classes.iconMagic}>🪄</span>\n              <span className={classes.featureText}>\n                Gain actionable recommendations to optimize your dbt project\n              </span>\n            </div>\n          </Stack>\n        </div>\n\n        <Stack direction=\"row\" className={classes.buttonGroup}>\n          <Button color=\"secondary\" size=\"lg\" onClick={handleLearnMore}>\n            Learn more\n          </Button>\n          <Button color=\"primary\" size=\"lg\" onClick={handleGetStarted}>\n            Get Started\n          </Button>\n          <Button color=\"secondary\" size=\"lg\" onClick={handleTutorials}>\n            Tutorials\n          </Button>\n        </Stack>\n      </Stack>\n    </Container>\n  );\n};\n\nexport default Onboarding;\n"
  },
  {
    "path": "webview_panels/src/modules/onboarding/PrerequisitesStep.tsx",
    "content": "import {\n  CheckCircleOutlined,\n  CloseCircleOutlined,\n  CodeOutlined,\n  DatabaseOutlined,\n  FileTextOutlined,\n  FolderOpenOutlined,\n  SyncOutlined,\n  WarningOutlined,\n} from \"@ant-design/icons\";\nimport { executeRequestInSync } from \"@modules/app/requestExecutor\";\nimport { panelLogger } from \"@modules/logger\";\nimport { Alert, Button, Card, Radio, Select, Space, Spin } from \"antd\";\nimport { forwardRef, useEffect, useImperativeHandle, useState } from \"react\";\nimport InstallDbtStep from \"./InstallDbtStep\";\nimport classes from \"./onboarding.module.scss\";\n\n// dbt Logo component\nconst DbtLogo = ({ size = 24 }: { size?: number }) => (\n  <svg\n    width={size}\n    height={size * 0.9}\n    viewBox=\"0 0 90 81\"\n    fill=\"none\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n  >\n    <path\n      d=\"M77.5499 3.37C79.4499 5.2 80.7 7.62 80.99 10.25C80.99 11.35 80.6999 12.08 80.0399 13.47C79.3799 14.86 71.25 28.92 68.83 32.8C67.44 35.07 66.71 37.78 66.71 40.42C66.71 43.06 67.44 45.77 68.83 48.04C71.25 51.92 79.3799 66.06 80.0399 67.45C80.6999 68.84 80.99 69.5 80.99 70.6C80.7 73.24 79.53 75.65 77.62 77.41C75.79 79.31 73.3699 80.56 70.8099 80.78C69.7099 80.78 68.9799 80.49 67.6599 79.83C66.3399 79.17 51.99 71.26 48.11 68.84C47.82 68.69 47.5199 68.47 47.1599 68.33L27.97 56.98C28.41 60.64 30.0199 64.16 32.6599 66.72C33.1699 67.23 33.6899 67.67 34.2699 68.11C33.8299 68.33 33.32 68.55 32.88 68.84C29 71.26 14.86 79.39 13.47 80.05C12.08 80.71 11.42 81 10.25 81C7.61 80.71 5.19994 79.54 3.43994 77.63C1.53994 75.8 0.29 73.38 0 70.75C0.07 69.65 0.369951 68.55 0.949951 67.6C1.60995 66.21 9.73991 52.07 12.1599 48.19C13.5499 45.92 14.2799 43.28 14.2799 40.57C14.2799 37.86 13.5499 35.22 12.1599 32.95C9.73991 28.92 1.53995 14.79 0.949951 13.4C0.359951 12.45 0.07 11.35 0 10.25C0.29 7.61 1.46 5.2 3.37 3.37C5.19 1.46 7.59999 0.29 10.24 0C11.34 0.07 12.44 0.37 13.46 0.95C14.63 1.46 24.96 7.47 30.45 10.69L31.7 11.42C32.1399 11.71 32.5099 11.93 32.7999 12.08L33.39 12.45L52.9399 24.02C52.4999 19.63 50.23 15.6 46.71 12.89C47.15 12.67 47.66 12.45 48.1 12.16C51.98 9.74 66.12 1.54 67.51 0.95C68.46 0.37 69.56 0.07 70.73 0C73.29 0.29 75.7099 1.46 77.5399 3.37H77.5499ZM41.5199 45.7L45.6899 41.53C46.2799 40.94 46.2799 40.07 45.6899 39.48L41.5199 35.31C40.9299 34.72 40.06 34.72 39.47 35.31L35.2999 39.48C34.7099 40.07 34.7099 40.94 35.2999 41.53L39.47 45.7C39.98 46.21 40.9299 46.21 41.5199 45.7Z\"\n      fill=\"#FF694A\"\n    />\n  </svg>\n);\n\ninterface DiagnosticsStatus {\n  pythonInstalled: boolean;\n  dbtInstalled: boolean;\n  projectsFound: boolean;\n  projectCount: number;\n  workspaceCount: number;\n  dbtIntegrationMode: string;\n  pythonPath?: string;\n  pythonVersion?: string;\n  dbtVersion?: string;\n  dbtPath?: string;\n  fileAssociationsConfigured: boolean;\n}\n\ntype DbtIntegrationType = \"core\" | \"fusion\" | \"cloud\";\n\ntype CheckStatus = \"pending\" | \"checking\" | \"success\" | \"warning\" | \"error\";\n\ninterface CheckAction {\n  label: string;\n  command?: string;\n  customAction?: () => void;\n}\n\ninterface PrerequisiteCheck {\n  id: string;\n  title: string;\n  description: string;\n  status: CheckStatus;\n  icon: React.ReactNode;\n  action?: CheckAction;\n  secondaryAction?: CheckAction;\n}\n\ninterface Project {\n  label: string;\n  projectRoot: string;\n}\n\ntype ValidationState =\n  | \"idle\"\n  | \"loading\"\n  | \"running-deps\"\n  | \"validating\"\n  | \"complete\"\n  | \"error\";\n\ntype WizardPhase = \"prerequisites\" | \"validation\";\n\nexport interface PrerequisitesStepHandle {\n  triggerNext: () => void;\n}\n\ninterface PrerequisitesStepProps {\n  phase: WizardPhase;\n  onComplete?: () => void;\n  onReadyChange?: (ready: boolean, loading?: boolean) => void;\n}\n\nconst PrerequisitesStep = forwardRef<\n  PrerequisitesStepHandle,\n  PrerequisitesStepProps\n>(({ phase, onComplete, onReadyChange }, ref) => {\n  const [checking, setChecking] = useState(false);\n  const [showInstallDbt, setShowInstallDbt] = useState(false);\n  const [diagnostics, setDiagnostics] = useState<DiagnosticsStatus | null>(\n    null,\n  );\n  const [error, setError] = useState<string | undefined>();\n  const [dbtIntegrationType, setDbtIntegrationType] =\n    useState<DbtIntegrationType>(\"core\");\n  const [changingIntegration, setChangingIntegration] = useState(false);\n  const [showIntegrationOptions, setShowIntegrationOptions] = useState(false);\n  const [expandedCheckId, setExpandedCheckId] = useState<string | null>(null);\n  const [validationState, setValidationState] =\n    useState<ValidationState>(\"idle\");\n  const [projects, setProjects] = useState<Project[]>([]);\n  const [selectedProject, setSelectedProject] = useState<string | undefined>();\n  const [statusMessage, setStatusMessage] = useState<string>(\"\");\n  const [checks, setChecks] = useState<PrerequisiteCheck[]>([\n    {\n      id: \"project\",\n      title: \"dbt Project\",\n      description: \"A dbt project folder must be open in VSCode\",\n      status: \"pending\",\n      icon: <FolderOpenOutlined />,\n      action: {\n        label: \"Open Folder\",\n        command: \"vscode.openFolder\",\n      },\n    },\n    {\n      id: \"python\",\n      title: \"Python Interpreter\",\n      description: \"Python interpreter must be configured\",\n      status: \"pending\",\n      icon: <CodeOutlined />,\n      action: {\n        label: \"Select Interpreter\",\n        command: \"python.setInterpreter\",\n      },\n      secondaryAction: {\n        label: \"Detect from terminal\",\n        command: \"dbtPowerUser.detectPythonFromTerminal\",\n      },\n    },\n    {\n      id: \"dbt\",\n      title: \"dbt Installation\",\n      description: \"dbt must be installed\",\n      status: \"pending\",\n      icon: <DbtLogo size={24} />,\n      action: {\n        label: \"Install dbt\",\n        customAction: () => setShowInstallDbt(true),\n      },\n    },\n    {\n      id: \"fileAssociations\",\n      title: \"File Associations\",\n      description:\n        \"SQL and YAML files should be associated with dbt file types\",\n      status: \"pending\",\n      icon: <FileTextOutlined />,\n      action: {\n        label: \"Configure\",\n        customAction: async () => {\n          try {\n            await executeRequestInSync(\"configureFileAssociations\", {});\n            // Re-run diagnostics after configuring\n            setTimeout(() => void runDiagnostics(), 500);\n          } catch (err) {\n            panelLogger.error(\"Error configuring file associations\", err);\n            setError(\n              err instanceof Error\n                ? err.message\n                : \"Failed to configure file associations\",\n            );\n          }\n        },\n      },\n    },\n  ]);\n\n  const runDiagnostics = async (silent = false) => {\n    try {\n      if (!silent) {\n        setChecking(true);\n        setError(undefined);\n\n        // Set all checks to \"checking\" status\n        setChecks((prev) =>\n          prev.map((check) => ({\n            ...check,\n            status: \"checking\" as CheckStatus,\n          })),\n        );\n      }\n\n      const status = (await executeRequestInSync(\n        \"getDiagnosticsStatus\",\n        {},\n      )) as DiagnosticsStatus;\n\n      setDiagnostics(status);\n      setDbtIntegrationType(\n        (status.dbtIntegrationMode as DbtIntegrationType) || \"core\",\n      );\n\n      // Update check statuses based on diagnostics\n      setChecks((prev) =>\n        prev.map((check) => {\n          let newStatus: CheckStatus = \"pending\";\n\n          if (check.id === \"project\") {\n            newStatus = status.projectsFound ? \"success\" : \"error\";\n          } else if (check.id === \"python\") {\n            if (!status.pythonInstalled) {\n              newStatus = \"error\";\n            } else if (!status.dbtInstalled) {\n              // Python found but dbt is not installed in this interpreter\n              newStatus = \"warning\";\n            } else {\n              newStatus = \"success\";\n            }\n          } else if (check.id === \"dbt\") {\n            newStatus = status.dbtInstalled ? \"success\" : \"error\";\n          } else if (check.id === \"fileAssociations\") {\n            newStatus = status.fileAssociationsConfigured ? \"success\" : \"error\";\n          }\n\n          return { ...check, status: newStatus };\n        }),\n      );\n    } catch (err) {\n      panelLogger.error(\"Error running diagnostics\", err);\n      setError(\n        err instanceof Error\n          ? err.message\n          : \"Failed to run diagnostics. Please try again.\",\n      );\n\n      // Set all checks to error\n      setChecks((prev) =>\n        prev.map((check) => ({ ...check, status: \"error\" as CheckStatus })),\n      );\n    } finally {\n      if (!silent) {\n        setChecking(false);\n      }\n    }\n  };\n\n  const fetchProjects = async () => {\n    try {\n      const projectList = (await executeRequestInSync(\n        \"getProjects\",\n        {},\n      )) as Project[];\n      setProjects(projectList ?? []);\n\n      // Auto-select if only one project\n      if (projectList && projectList.length === 1) {\n        setSelectedProject(projectList[0].projectRoot);\n      }\n    } catch (err) {\n      panelLogger.error(\"Error fetching projects\", err);\n      setError(\n        \"Failed to load projects. Please ensure you have a dbt project open.\",\n      );\n    }\n  };\n\n  const handleValidateSetup = async () => {\n    if (!selectedProject) {\n      setError(\"Please select a project first\");\n      return;\n    }\n\n    try {\n      setError(undefined);\n\n      // Step 1: Run dbt deps\n      setValidationState(\"running-deps\");\n      setStatusMessage(\"Installing dbt dependencies...\");\n      await executeRequestInSync(\"runDbtDeps\", {\n        projectRoot: selectedProject,\n      });\n\n      // Step 2: Validate project\n      setValidationState(\"validating\");\n      setStatusMessage(\"Validating project setup...\");\n      await executeRequestInSync(\"validateProject\", {\n        projectRoot: selectedProject,\n      });\n\n      setValidationState(\"complete\");\n      setStatusMessage(\"Project setup completed successfully!\");\n    } catch (err) {\n      panelLogger.error(\"Error validating setup\", err);\n      setValidationState(\"error\");\n    }\n  };\n\n  useEffect(() => {\n    // Run diagnostics on mount\n    void runDiagnostics();\n    // Fetch projects on mount\n    void fetchProjects();\n\n    // Listen for Python environment changes\n    const handleMessage = (event: MessageEvent) => {\n      const data = event.data as { command?: string };\n      if (data.command === \"pythonEnvironmentChanged\") {\n        panelLogger.info(\n          \"PrerequisitesStep\",\n          \"Python environment changed, refreshing diagnostics\",\n        );\n        void runDiagnostics(true);\n      }\n    };\n\n    window.addEventListener(\"message\", handleMessage);\n\n    return () => {\n      window.removeEventListener(\"message\", handleMessage);\n    };\n  }, []);\n\n  const executeCheckAction = async (action: CheckAction, checkId: string) => {\n    if (action.customAction) {\n      action.customAction();\n    } else if (action.command) {\n      try {\n        await executeRequestInSync(\"executeCommand\", {\n          vscodeCommand: action.command,\n        });\n\n        // Re-run diagnostics after executing command\n        setTimeout(() => void runDiagnostics(), 1000);\n      } catch (err) {\n        panelLogger.error(`Error executing action for ${checkId}`, err);\n        setError(\n          err instanceof Error\n            ? err.message\n            : `Failed to execute ${action.label}`,\n        );\n      }\n    }\n  };\n\n  const handleAction = async (check: PrerequisiteCheck) => {\n    if (check.action) {\n      await executeCheckAction(check.action, check.id);\n    }\n  };\n\n  const handleSecondaryAction = async (check: PrerequisiteCheck) => {\n    if (check.secondaryAction) {\n      await executeCheckAction(check.secondaryAction, check.id);\n    }\n  };\n\n  const handleDbtInstallComplete = () => {\n    setShowInstallDbt(false);\n    // Re-run diagnostics after dbt installation\n    void runDiagnostics();\n  };\n\n  const handleDbtInstallSkip = () => {\n    setShowInstallDbt(false);\n  };\n\n  const handleIntegrationTypeChange = async (newType: DbtIntegrationType) => {\n    try {\n      setChangingIntegration(true);\n      setError(undefined);\n\n      await executeRequestInSync(\"setDbtIntegration\", {\n        integrationType: newType,\n      });\n\n      setDbtIntegrationType(newType);\n\n      // Re-run diagnostics after changing integration type\n      setTimeout(() => void runDiagnostics(), 500);\n    } catch (err) {\n      panelLogger.error(\"Error changing dbt integration type\", err);\n      setError(\n        err instanceof Error\n          ? err.message\n          : \"Failed to change dbt integration type\",\n      );\n    } finally {\n      setChangingIntegration(false);\n    }\n  };\n\n  const getStatusIcon = (status: CheckStatus) => {\n    switch (status) {\n      case \"checking\":\n        return <SyncOutlined spin style={{ color: \"#1890ff\" }} />;\n      case \"success\":\n        return <CheckCircleOutlined style={{ color: \"#52c41a\" }} />;\n      case \"warning\":\n        return <WarningOutlined style={{ color: \"#faad14\" }} />;\n      case \"error\":\n        return <CloseCircleOutlined style={{ color: \"#ff4d4f\" }} />;\n      default:\n        return null;\n    }\n  };\n\n  const allChecksPassed =\n    diagnostics?.pythonInstalled &&\n    diagnostics?.dbtInstalled &&\n    diagnostics?.projectsFound &&\n    diagnostics?.fileAssociationsConfigured;\n\n  const isValidating =\n    validationState === \"running-deps\" || validationState === \"validating\";\n  const isValidationComplete = validationState === \"complete\";\n\n  // Report readiness to parent wizard\n  const isStepReady = phase === \"prerequisites\" ? !!allChecksPassed : true;\n\n  useEffect(() => {\n    onReadyChange?.(isStepReady);\n  }, [isStepReady]);\n\n  useImperativeHandle(ref, () => ({\n    triggerNext: () => {\n      onComplete?.();\n    },\n  }));\n\n  const getCheckDetails = (checkId: string): React.ReactNode => {\n    if (!diagnostics) return null;\n\n    const detailStyle = {\n      marginTop: \"0.5rem\",\n      fontSize: \"0.9rem\",\n      color: \"var(--vscode-foreground)\",\n    };\n\n    const labelStyle = {\n      margin: \"0.25rem 0\",\n      color: \"var(--vscode-foreground)\",\n    };\n\n    const codeStyle = {\n      fontSize: \"0.85rem\",\n      backgroundColor: \"var(--vscode-textCodeBlock-background)\",\n      color: \"var(--vscode-editor-foreground)\",\n      padding: \"0.125rem 0.25rem\",\n      borderRadius: \"3px\",\n      fontFamily: \"var(--vscode-editor-font-family)\",\n    };\n\n    switch (checkId) {\n      case \"project\":\n        return (\n          <div style={detailStyle}>\n            <p style={labelStyle}>\n              <strong>Projects found:</strong> {diagnostics.projectCount}\n            </p>\n            <p style={labelStyle}>\n              <strong>Workspaces:</strong> {diagnostics.workspaceCount}\n            </p>\n          </div>\n        );\n      case \"python\": {\n        const pythonCheck = checks.find((c) => c.id === \"python\");\n        const showDetailButtons = pythonCheck?.status === \"success\";\n        return (\n          <div style={detailStyle}>\n            {diagnostics.pythonPath && (\n              <p style={{ ...labelStyle, wordBreak: \"break-all\", margin: 0 }}>\n                <strong>Path:</strong>{\" \"}\n                <code style={codeStyle}>{diagnostics.pythonPath}</code>\n              </p>\n            )}\n            {diagnostics.pythonVersion && (\n              <p style={{ ...labelStyle, margin: \"0.25rem 0 0 0\" }}>\n                <strong>Version:</strong> {diagnostics.pythonVersion}\n              </p>\n            )}\n            {showDetailButtons && (\n              <div\n                style={{\n                  display: \"flex\",\n                  gap: \"0.5rem\",\n                  marginTop: \"0.5rem\",\n                }}\n              >\n                <Button\n                  size=\"small\"\n                  onClick={async (e) => {\n                    e.stopPropagation();\n                    if (pythonCheck) {\n                      await handleAction(pythonCheck);\n                    }\n                  }}\n                  disabled={checking}\n                >\n                  Change\n                </Button>\n                <Button\n                  size=\"small\"\n                  onClick={async (e) => {\n                    e.stopPropagation();\n                    if (pythonCheck) {\n                      await handleSecondaryAction(pythonCheck);\n                    }\n                  }}\n                  disabled={checking}\n                >\n                  Detect from terminal\n                </Button>\n              </div>\n            )}\n          </div>\n        );\n      }\n      case \"dbt\":\n        return (\n          <div style={detailStyle}>\n            {diagnostics.dbtVersion && (\n              <p style={labelStyle}>\n                <strong>Version:</strong> {diagnostics.dbtVersion}\n              </p>\n            )}\n            {diagnostics.dbtPath && (\n              <p style={{ ...labelStyle, wordBreak: \"break-all\" }}>\n                <strong>Path:</strong>{\" \"}\n                <code style={codeStyle}>{diagnostics.dbtPath}</code>\n              </p>\n            )}\n            <p style={labelStyle}>\n              <strong>Integration mode:</strong>{\" \"}\n              {diagnostics.dbtIntegrationMode}\n            </p>\n          </div>\n        );\n      default:\n        return null;\n    }\n  };\n\n  const toggleCheckDetails = (checkId: string) => {\n    setExpandedCheckId(expandedCheckId === checkId ? null : checkId);\n  };\n\n  if (showInstallDbt) {\n    return (\n      <div className={classes.prerequisitesContainer}>\n        <InstallDbtStep\n          initialIntegrationType={dbtIntegrationType}\n          onComplete={handleDbtInstallComplete}\n          onSkip={handleDbtInstallSkip}\n        />\n      </div>\n    );\n  }\n\n  return (\n    <div className={classes.prerequisitesContainer}>\n      {error && (\n        <Alert\n          message=\"Error\"\n          description={error}\n          type=\"error\"\n          showIcon\n          closable\n          onClose={() => setError(undefined)}\n          className={classes.alertMessage}\n          style={{ marginTop: \"1.5rem\" }}\n        />\n      )}\n\n      {phase === \"prerequisites\" && (\n        <>\n          <div className={classes.prerequisitesInfo}>\n            <p>\n              Before you can use dbt Power User, we need to ensure the following\n              prerequisites are met:\n            </p>\n          </div>\n\n          {allChecksPassed && (\n            <Alert\n              message=\"All prerequisites met!\"\n              description=\"Your environment is properly configured. Click 'Next' to continue.\"\n              type=\"success\"\n              showIcon\n              className={classes.alertMessage}\n            />\n          )}\n\n          {diagnostics && !allChecksPassed && (\n            <Alert\n              message=\"Some prerequisites are not met\"\n              description={\n                <div>\n                  <p style={{ margin: \"0 0 0.5rem 0\" }}>\n                    Please resolve the issues below, then recheck.\n                  </p>\n                  <Button\n                    size=\"large\"\n                    onClick={() => void runDiagnostics()}\n                    disabled={checking}\n                    icon={checking ? <SyncOutlined spin /> : <SyncOutlined />}\n                  >\n                    {checking ? \"Checking...\" : \"Recheck Prerequisites\"}\n                  </Button>\n                </div>\n              }\n              type=\"warning\"\n              showIcon\n              className={classes.alertMessage}\n            />\n          )}\n\n          <Card className={classes.prerequisiteCard}>\n            <div className={classes.prerequisiteCardHeader}>\n              <div className={classes.prerequisiteCardTitle}>\n                <span className={classes.prerequisiteIcon}>\n                  <DatabaseOutlined />\n                </span>\n                <div>\n                  <h3>dbt Integration Type</h3>\n                  {!showIntegrationOptions && (\n                    <>\n                      <p className={classes.prerequisiteDescription}>\n                        <strong>\n                          {dbtIntegrationType === \"core\" && \"dbt Core\"}\n                          {dbtIntegrationType === \"fusion\" &&\n                            \"dbt Fusion (beta)\"}\n                          {dbtIntegrationType === \"cloud\" && \"dbt Cloud CLI\"}\n                        </strong>\n                        {\" - \"}\n                        {dbtIntegrationType === \"core\" &&\n                          \"Local dbt installation via Python\"}\n                        {dbtIntegrationType === \"fusion\" &&\n                          \"dbt Fusion CLI for enhanced performance\"}\n                        {dbtIntegrationType === \"cloud\" &&\n                          \"Connect to dbt Cloud\"}\n                      </p>\n                    </>\n                  )}\n                </div>\n              </div>\n              {!showIntegrationOptions && (\n                <Button\n                  onClick={() => setShowIntegrationOptions(true)}\n                  disabled={changingIntegration || checking}\n                >\n                  Change\n                </Button>\n              )}\n            </div>\n\n            {showIntegrationOptions && (\n              <div className={classes.prerequisiteAction}>\n                <p\n                  className={classes.prerequisiteDescription}\n                  style={{ marginBottom: \"1rem\" }}\n                >\n                  Choose how dbt Power User connects to dbt. You can change this\n                  later in settings.\n                </p>\n                <Radio.Group\n                  value={dbtIntegrationType}\n                  onChange={(e) => {\n                    void handleIntegrationTypeChange(\n                      e.target.value as DbtIntegrationType,\n                    );\n                    setShowIntegrationOptions(false);\n                  }}\n                  disabled={changingIntegration || checking}\n                >\n                  <Space\n                    direction=\"vertical\"\n                    size=\"middle\"\n                    style={{ width: \"100%\" }}\n                  >\n                    <Radio value=\"core\">\n                      <div className={classes.radioOption}>\n                        <strong>dbt Core</strong>\n                        <p className={classes.radioDescription}>\n                          Use local dbt installation via Python. Best for local\n                          development with full control.\n                        </p>\n                      </div>\n                    </Radio>\n                    <Radio value=\"fusion\">\n                      <div className={classes.radioOption}>\n                        <strong>dbt Fusion (beta)</strong>\n                        <p className={classes.radioDescription}>\n                          Use dbt Fusion CLI for enhanced performance and\n                          additional features (beta)\n                        </p>\n                      </div>\n                    </Radio>\n                    <Radio value=\"cloud\">\n                      <div className={classes.radioOption}>\n                        <strong>dbt Cloud CLI</strong>\n                        <p className={classes.radioDescription}>\n                          Connect to dbt Cloud for teams using dbt Cloud CLI\n                        </p>\n                      </div>\n                    </Radio>\n                  </Space>\n                </Radio.Group>\n                <div style={{ marginTop: \"1rem\" }}>\n                  <Button onClick={() => setShowIntegrationOptions(false)}>\n                    Cancel\n                  </Button>\n                </div>\n              </div>\n            )}\n          </Card>\n\n          <div className={classes.prerequisiteChecks}>\n            {checks.map((check) => {\n              const canExpand =\n                check.status === \"success\" || check.status === \"warning\";\n              return (\n                <Card\n                  key={check.id}\n                  className={classes.prerequisiteCard}\n                  onClick={() => canExpand && toggleCheckDetails(check.id)}\n                  style={{\n                    cursor: canExpand ? \"pointer\" : \"default\",\n                  }}\n                >\n                  <div className={classes.prerequisiteCardHeader}>\n                    <div className={classes.prerequisiteCardTitle}>\n                      <span className={classes.prerequisiteIcon}>\n                        {check.icon}\n                      </span>\n                      <div style={{ flex: 1 }}>\n                        <h3>{check.title}</h3>\n                        <p className={classes.prerequisiteDescription}>\n                          {check.status === \"warning\"\n                            ? \"Python found, but dbt is not installed in this interpreter\"\n                            : check.description}\n                        </p>\n                        {canExpand &&\n                          expandedCheckId === check.id &&\n                          getCheckDetails(check.id)}\n                      </div>\n                    </div>\n                    <div className={classes.prerequisiteStatus}>\n                      {getStatusIcon(check.status)}\n                    </div>\n                  </div>\n\n                  {(check.status === \"error\" || check.status === \"warning\") &&\n                    check.action && (\n                      <div className={classes.prerequisiteAction}>\n                        <Button\n                          type=\"primary\"\n                          onClick={(e) => {\n                            e.stopPropagation();\n                            void handleAction(check);\n                          }}\n                          disabled={checking}\n                        >\n                          {check.action.label}\n                        </Button>\n                        {check.secondaryAction && (\n                          <Button\n                            onClick={(e) => {\n                              e.stopPropagation();\n                              void handleSecondaryAction(check);\n                            }}\n                            disabled={checking}\n                            style={{ marginLeft: \"0.5rem\" }}\n                          >\n                            {check.secondaryAction.label}\n                          </Button>\n                        )}\n                      </div>\n                    )}\n                </Card>\n              );\n            })}\n          </div>\n        </>\n      )}\n\n      {phase === \"validation\" && (\n        <>\n          <div className={classes.validationSection}>\n            <h3>Validate Setup</h3>\n            <p>Select your dbt project and validate your setup.</p>\n          </div>\n\n          {projects.length > 0 ? (\n            <Card className={classes.prerequisiteCard}>\n              <div className={classes.projectSelector}>\n                <label\n                  htmlFor=\"project-select\"\n                  className={classes.prerequisiteDescription}\n                >\n                  <strong>Select your dbt project:</strong>\n                </label>\n                <div\n                  style={{\n                    display: \"flex\",\n                    alignItems: \"center\",\n                    gap: \"0.5rem\",\n                    marginTop: \"0.5rem\",\n                    minWidth: 0,\n                  }}\n                >\n                  <Select\n                    id=\"project-select\"\n                    style={{ flex: 1, minWidth: 0 }}\n                    placeholder=\"Choose a project\"\n                    value={selectedProject}\n                    onChange={setSelectedProject}\n                    disabled={isValidating || isValidationComplete}\n                    size=\"large\"\n                    options={projects.map((project) => ({\n                      label: project.label,\n                      value: project.projectRoot,\n                    }))}\n                  />\n                  <Button\n                    type=\"primary\"\n                    size=\"large\"\n                    style={{ flexShrink: 0 }}\n                    onClick={() => void handleValidateSetup()}\n                    loading={isValidating}\n                    disabled={!selectedProject || isValidating}\n                  >\n                    {isValidating ? \"Validating...\" : \"Validate Setup\"}\n                  </Button>\n                </div>\n              </div>\n\n              {isValidating && (\n                <Alert\n                  message={statusMessage}\n                  type=\"info\"\n                  showIcon\n                  icon={<Spin size=\"small\" />}\n                  className={classes.alertMessage}\n                  style={{ marginTop: \"1rem\" }}\n                />\n              )}\n\n              {isValidationComplete && (\n                <Alert\n                  message={statusMessage}\n                  type=\"success\"\n                  showIcon\n                  className={classes.alertMessage}\n                  style={{ marginTop: \"1rem\" }}\n                />\n              )}\n\n              {!isValidationComplete && selectedProject && (\n                <div\n                  className={classes.setupInfo}\n                  style={{ marginTop: \"1rem\" }}\n                >\n                  <p>\n                    <strong>This will:</strong>\n                  </p>\n                  <ul>\n                    <li>\n                      Select the project:{\" \"}\n                      <strong>\n                        {projects.find((p) => p.projectRoot === selectedProject)\n                          ?.label ?? \"...\"}\n                      </strong>\n                    </li>\n                    <li>\n                      Run <code>dbt deps</code> to install packages\n                    </li>\n                    <li>\n                      Run <code>dbt debug</code> to validate your setup\n                    </li>\n                  </ul>\n                </div>\n              )}\n            </Card>\n          ) : (\n            <Alert\n              message=\"No dbt projects found\"\n              description=\"Please ensure you have a dbt project open in your workspace.\"\n              type=\"warning\"\n              showIcon\n            />\n          )}\n        </>\n      )}\n    </div>\n  );\n});\n\nPrerequisitesStep.displayName = \"PrerequisitesStep\";\n\nexport default PrerequisitesStep;\n"
  },
  {
    "path": "webview_panels/src/modules/onboarding/ProjectSetupStep.tsx",
    "content": "import { executeRequestInSync } from \"@modules/app/requestExecutor\";\nimport { panelLogger } from \"@modules/logger\";\nimport { Stack } from \"@uicore\";\nimport { Alert, Button, Select, Spin } from \"antd\";\nimport { useEffect, useState } from \"react\";\nimport classes from \"./onboarding.module.scss\";\n\ninterface Project {\n  label: string;\n  projectRoot: string;\n}\n\ninterface ProjectSetupStepProps {\n  onComplete?: () => void;\n}\n\ntype SetupState =\n  | \"idle\"\n  | \"loading\"\n  | \"running-deps\"\n  | \"validating\"\n  | \"complete\"\n  | \"error\";\n\nconst ProjectSetupStep = ({\n  onComplete,\n}: ProjectSetupStepProps): JSX.Element => {\n  const [projects, setProjects] = useState<Project[]>([]);\n  const [selectedProject, setSelectedProject] = useState<string | undefined>();\n  const [setupState, setSetupState] = useState<SetupState>(\"idle\");\n  const [error, setError] = useState<string | undefined>();\n  const [statusMessage, setStatusMessage] = useState<string>(\"\");\n\n  useEffect(() => {\n    // Fetch available projects on mount\n    const fetchProjects = async () => {\n      try {\n        setSetupState(\"loading\");\n        const projectList = (await executeRequestInSync(\n          \"getProjects\",\n          {},\n        )) as Project[];\n        setProjects(projectList ?? []);\n\n        // Auto-select if only one project\n        if (projectList && projectList.length === 1) {\n          setSelectedProject(projectList[0].projectRoot);\n        }\n        setSetupState(\"idle\");\n      } catch (err) {\n        panelLogger.error(\"Error fetching projects\", err);\n        setError(\n          \"Failed to load projects. Please ensure you have a dbt project open.\",\n        );\n        setSetupState(\"error\");\n      }\n    };\n\n    void fetchProjects();\n  }, []);\n\n  const handleSetupProject = async () => {\n    if (!selectedProject) {\n      setError(\"Please select a project first\");\n      return;\n    }\n\n    try {\n      setError(undefined);\n\n      // Step 1: Run dbt deps\n      setSetupState(\"running-deps\");\n      setStatusMessage(\"Installing dbt dependencies...\");\n      await executeRequestInSync(\"runDbtDeps\", {\n        projectRoot: selectedProject,\n      });\n\n      // Step 2: Validate project\n      setSetupState(\"validating\");\n      setStatusMessage(\"Validating project setup...\");\n      await executeRequestInSync(\"validateProject\", {\n        projectRoot: selectedProject,\n      });\n\n      setSetupState(\"complete\");\n      setStatusMessage(\"Project setup completed successfully!\");\n\n      // Call onComplete callback if provided\n      if (onComplete) {\n        setTimeout(onComplete, 1500);\n      }\n    } catch (err) {\n      panelLogger.error(\"Error setting up project\", err);\n      setError(\n        err instanceof Error\n          ? err.message\n          : \"Failed to setup project. Check the terminal for details.\",\n      );\n      setSetupState(\"error\");\n    }\n  };\n\n  const isLoading = setupState === \"loading\";\n  const isRunning =\n    setupState === \"running-deps\" || setupState === \"validating\";\n  const isComplete = setupState === \"complete\";\n\n  return (\n    <div className={classes.projectSetupContainer}>\n      {isLoading ? (\n        <div className={classes.loadingContainer}>\n          <Spin size=\"large\" />\n          <p>Loading projects...</p>\n        </div>\n      ) : projects.length === 0 ? (\n        <Alert\n          message=\"No dbt projects found\"\n          description=\"Please ensure you have a dbt project open in your workspace.\"\n          type=\"warning\"\n          showIcon\n        />\n      ) : (\n        <>\n          <div className={classes.projectSelector}>\n            <label htmlFor=\"project-select\" className={classes.projectLabel}>\n              Select your dbt project:\n            </label>\n            <Select\n              id=\"project-select\"\n              style={{ width: \"100%\" }}\n              placeholder=\"Choose a project\"\n              value={selectedProject}\n              onChange={setSelectedProject}\n              disabled={isRunning || isComplete}\n              size=\"large\"\n              options={projects.map((project) => ({\n                label: project.label,\n                value: project.projectRoot,\n              }))}\n            />\n          </div>\n\n          {error && (\n            <Alert\n              message=\"Error\"\n              description={error}\n              type=\"error\"\n              showIcon\n              closable\n              onClose={() => setError(undefined)}\n              className={classes.alertMessage}\n            />\n          )}\n\n          {isRunning && (\n            <Alert\n              message={statusMessage}\n              type=\"info\"\n              showIcon\n              icon={<Spin size=\"small\" />}\n              className={classes.alertMessage}\n            />\n          )}\n\n          {isComplete && (\n            <Alert\n              message={statusMessage}\n              type=\"success\"\n              showIcon\n              className={classes.alertMessage}\n            />\n          )}\n\n          <Stack direction=\"column\" className={classes.setupActions}>\n            <Button\n              type=\"primary\"\n              size=\"large\"\n              onClick={handleSetupProject}\n              disabled={!selectedProject || isRunning || isComplete}\n              loading={isRunning}\n              style={{ width: \"100%\" }}\n            >\n              {isComplete\n                ? \"Setup Complete\"\n                : isRunning\n                  ? \"Setting up...\"\n                  : \"Setup Project\"}\n            </Button>\n\n            {!isComplete && (\n              <div className={classes.setupInfo}>\n                <p>This will:</p>\n                <ul>\n                  <li>\n                    Select the project:{\" \"}\n                    <strong>\n                      {projects.find((p) => p.projectRoot === selectedProject)\n                        ?.label ?? \"...\"}\n                    </strong>\n                  </li>\n                  <li>\n                    Run <code>dbt deps</code> to install packages\n                  </li>\n                  <li>\n                    Run <code>dbt debug</code> to validate your setup\n                  </li>\n                </ul>\n              </div>\n            )}\n          </Stack>\n        </>\n      )}\n    </div>\n  );\n};\n\nexport default ProjectSetupStep;\n"
  },
  {
    "path": "webview_panels/src/modules/onboarding/SetupWizard.tsx",
    "content": "import { executeRequestInSync } from \"@modules/app/requestExecutor\";\nimport { panelLogger } from \"@modules/logger\";\nimport { Stack } from \"@uicore\";\nimport { Button, Card, Steps } from \"antd\";\nimport {\n  forwardRef,\n  useCallback,\n  useEffect,\n  useImperativeHandle,\n  useRef,\n  useState,\n  useSyncExternalStore,\n} from \"react\";\nimport AltimateSetupStep from \"./AltimateSetupStep\";\nimport classes from \"./onboarding.module.scss\";\nimport PrerequisitesStep, {\n  PrerequisitesStepHandle,\n} from \"./PrerequisitesStep\";\nimport TutorialsStep from \"./TutorialsStep\";\n\ninterface WizardStep {\n  id: string;\n  title: string;\n  description: string;\n  isParent?: boolean;\n  parentId?: string;\n  action?: {\n    label: string;\n    command: string;\n  };\n}\n\nconst SETUP_STEPS: WizardStep[] = [\n  {\n    id: \"dbt\",\n    title: \"Setup dbt\",\n    description: \"Configure your dbt environment\",\n    isParent: true,\n  },\n  {\n    id: \"prerequisites\",\n    title: \"Setup Prerequisites\",\n    description: \"Check environment\",\n    parentId: \"dbt\",\n  },\n  {\n    id: \"validation\",\n    title: \"Validate Setup\",\n    description: \"Configure and validate project\",\n    parentId: \"dbt\",\n  },\n  {\n    id: \"altimate\",\n    title: \"Setup Altimate AI\",\n    description: \"Connect to Altimate AI for advanced features\",\n    isParent: true,\n  },\n  {\n    id: \"altimateKey\",\n    title: \"Configure API Key\",\n    description: \"Connect to Altimate AI\",\n    parentId: \"altimate\",\n  },\n  {\n    id: \"finish\",\n    title: \"Tutorials\",\n    description:\n      \"Explore the tutorials below to learn about dbt Power User's features.\",\n  },\n];\n\n/** Find the next navigable (non-parent) step index */\nconst findNextStep = (fromIndex: number): number => {\n  for (let i = fromIndex + 1; i < SETUP_STEPS.length; i++) {\n    if (!SETUP_STEPS[i].isParent) return i;\n  }\n  return fromIndex;\n};\n\n/** Find the previous navigable (non-parent) step index */\nconst findPreviousStep = (fromIndex: number): number => {\n  for (let i = fromIndex - 1; i >= 0; i--) {\n    if (!SETUP_STEPS[i].isParent) return i;\n  }\n  return fromIndex;\n};\n\n/** Get the first child index for a parent step */\nconst getFirstChildIndex = (parentId: string): number => {\n  const idx = SETUP_STEPS.findIndex((s) => s.parentId === parentId);\n  return idx !== -1 ? idx : 0;\n};\n\n/** Determine status for a step based on currentStep */\nconst getStepStatus = (\n  step: WizardStep,\n  index: number,\n  currentStep: number,\n): \"finish\" | \"process\" | \"wait\" => {\n  if (step.isParent) {\n    const childIndices = SETUP_STEPS.map((s, i) =>\n      s.parentId === step.id ? i : -1,\n    ).filter((i) => i !== -1);\n    const firstChild = Math.min(...childIndices);\n    const lastChild = Math.max(...childIndices);\n    if (currentStep > lastChild) return \"finish\";\n    if (currentStep >= firstChild) return \"process\";\n    return \"wait\";\n  }\n  if (index < currentStep) return \"finish\";\n  if (index === currentStep) return \"process\";\n  return \"wait\";\n};\n\nconst NARROW_QUERY = \"(max-width: 700px)\";\nconst subscribe = (cb: () => void) => {\n  const mql = window.matchMedia(NARROW_QUERY);\n  mql.addEventListener(\"change\", cb);\n  return () => mql.removeEventListener(\"change\", cb);\n};\nconst getSnapshot = () => window.matchMedia(NARROW_QUERY).matches;\n\ninterface SetupWizardProps {\n  initialStep?: string;\n}\n\nconst SetupWizard = forwardRef<\n  { navigateToStep: (stepId: string) => void },\n  SetupWizardProps\n>(({ initialStep }, ref) => {\n  const isNarrow = useSyncExternalStore(subscribe, getSnapshot);\n\n  const getInitialStepIndex = () => {\n    if (initialStep) {\n      const index = SETUP_STEPS.findIndex((step) => step.id === initialStep);\n      if (index !== -1) {\n        // If pointing at a parent, jump to its first child\n        if (SETUP_STEPS[index].isParent) {\n          return getFirstChildIndex(SETUP_STEPS[index].id);\n        }\n        return index;\n      }\n    }\n    // Default to first navigable step\n    return findNextStep(-1);\n  };\n\n  const [currentStep, setCurrentStep] = useState(getInitialStepIndex());\n  const [stepReady, setStepReady] = useState(false);\n  const [stepLoading, setStepLoading] = useState(false);\n  const stepRef = useRef<PrerequisitesStepHandle>(null);\n\n  useEffect(() => {\n    if (initialStep) {\n      const index = SETUP_STEPS.findIndex((step) => step.id === initialStep);\n      if (index !== -1) {\n        if (SETUP_STEPS[index].isParent) {\n          setCurrentStep(getFirstChildIndex(SETUP_STEPS[index].id));\n        } else {\n          setCurrentStep(index);\n        }\n      }\n    }\n  }, [initialStep]);\n\n  useImperativeHandle(ref, () => ({\n    navigateToStep: (stepId: string) => {\n      const index = SETUP_STEPS.findIndex((step) => step.id === stepId);\n      if (index !== -1) {\n        if (SETUP_STEPS[index].isParent) {\n          setCurrentStep(getFirstChildIndex(SETUP_STEPS[index].id));\n        } else {\n          setCurrentStep(index);\n        }\n      }\n    },\n  }));\n\n  // Reset readiness when step changes\n  useEffect(() => {\n    const needsReadinessCheck = [\"prerequisites\", \"altimateKey\"].includes(\n      SETUP_STEPS[currentStep]?.id ?? \"\",\n    );\n    setStepReady(!needsReadinessCheck);\n    setStepLoading(false);\n  }, [currentStep]);\n\n  const handleReadyChange = useCallback((ready: boolean, loading?: boolean) => {\n    setStepReady(ready);\n    setStepLoading(loading ?? false);\n  }, []);\n\n  const handleStepAction = async (step: WizardStep) => {\n    try {\n      if (step.action) {\n        if (step.action.command === \"openDocumentation\") {\n          window.open(\n            \"https://docs.myaltimate.com/setup/reqdConfig/\",\n            \"_blank\",\n          );\n        } else {\n          await executeRequestInSync(\"executeCommand\", {\n            vscodeCommand: step.action.command,\n          });\n        }\n      }\n    } catch (err) {\n      panelLogger.error(`Error executing step action for ${step.id}`, err);\n    }\n  };\n\n  const handleNext = () => {\n    setCurrentStep(findNextStep(currentStep));\n  };\n\n  const handlePrevious = () => {\n    setCurrentStep(findPreviousStep(currentStep));\n  };\n\n  const handleNextClick = () => {\n    if (stepRef.current) {\n      stepRef.current.triggerNext();\n    } else {\n      handleNext();\n    }\n  };\n\n  const currentStepData = SETUP_STEPS[currentStep];\n\n  // Determine which parent group is active so we can hide inactive substeps\n  const activeParentId = currentStepData.isParent\n    ? currentStepData.id\n    : currentStepData.parentId;\n\n  // Only show: top-level steps (parents + standalone) and children of the active parent\n  const visibleSteps = SETUP_STEPS.map((step, index) => ({\n    step,\n    originalIndex: index,\n  })).filter(({ step }) => !step.parentId || step.parentId === activeParentId);\n\n  const currentVisibleIndex = visibleSteps.findIndex(\n    ({ originalIndex }) => originalIndex === currentStep,\n  );\n\n  // Count only navigable steps for the step counter\n  const navigableSteps = SETUP_STEPS.filter((s) => !s.isParent);\n  const currentNavigableIndex = navigableSteps.findIndex(\n    (s) => s.id === currentStepData.id,\n  );\n  const isFirstNavigable = currentNavigableIndex === 0;\n  const isLastNavigable = currentNavigableIndex === navigableSteps.length - 1;\n\n  return (\n    <div className={classes.wizardContainer}>\n      <h1 className={classes.wizardTitle}>Setup dbt Power User</h1>\n      <p className={classes.wizardSubtitle}>\n        Follow these steps to configure dbt Power User for your project\n      </p>\n\n      <div className={classes.wizardContent}>\n        <div className={classes.wizardSidebar}>\n          <Steps\n            current={currentVisibleIndex}\n            direction={isNarrow ? \"horizontal\" : \"vertical\"}\n            onChange={(visibleIndex) => {\n              const target = visibleSteps[visibleIndex];\n              if (target) {\n                const { step, originalIndex } = target;\n                if (step.isParent) {\n                  setCurrentStep(getFirstChildIndex(step.id));\n                } else {\n                  setCurrentStep(originalIndex);\n                }\n              }\n            }}\n            items={visibleSteps.map(({ step, originalIndex }) => ({\n              title: step.title,\n              className: step.parentId ? classes.substep : classes.parentStep,\n              status: getStepStatus(step, originalIndex, currentStep),\n              disabled: false,\n            }))}\n            className={classes.wizardSteps}\n          />\n        </div>\n\n        <div className={classes.wizardMain}>\n          <Card className={classes.stepCard}>\n            <h2>{currentStepData.title}</h2>\n            <p className={classes.stepDescription}>\n              {currentStepData.description}\n            </p>\n\n            <Stack direction=\"row\" className={classes.stepActions}>\n              {currentStepData.id === \"prerequisites\" && (\n                <PrerequisitesStep\n                  ref={stepRef}\n                  phase=\"prerequisites\"\n                  onComplete={handleNext}\n                  onReadyChange={handleReadyChange}\n                />\n              )}\n              {currentStepData.id === \"validation\" && (\n                <PrerequisitesStep\n                  ref={stepRef}\n                  phase=\"validation\"\n                  onComplete={handleNext}\n                  onReadyChange={handleReadyChange}\n                />\n              )}\n              {currentStepData.id === \"altimateKey\" && (\n                <AltimateSetupStep\n                  phase=\"key\"\n                  onComplete={handleNext}\n                  onReadyChange={handleReadyChange}\n                />\n              )}\n              {currentStepData.id === \"finish\" && <TutorialsStep />}\n              {currentStepData.action && (\n                <Button\n                  type=\"primary\"\n                  size=\"large\"\n                  onClick={() => handleStepAction(currentStepData)}\n                >\n                  {currentStepData.action.label}\n                </Button>\n              )}\n            </Stack>\n\n            <Stack direction=\"row\" className={classes.wizardNavigation}>\n              {!isFirstNavigable ? (\n                <Button onClick={handlePrevious} size=\"large\">\n                  Back\n                </Button>\n              ) : (\n                <div />\n              )}\n              <div />\n              {!isLastNavigable ? (\n                <Button\n                  type=\"primary\"\n                  onClick={handleNextClick}\n                  disabled={!stepReady}\n                  loading={stepLoading}\n                  size=\"large\"\n                >\n                  {currentStepData.id === \"prerequisites\"\n                    ? \"Validate Setup\"\n                    : currentStepData.id === \"altimateKey\"\n                      ? \"Tutorials\"\n                      : currentStepData.id === \"validation\"\n                        ? \"Setup Altimate AI\"\n                        : \"Next\"}\n                </Button>\n              ) : (\n                <div />\n              )}\n            </Stack>\n          </Card>\n\n          <div className={classes.wizardFooter}>\n            <p>\n              Need help?{\" \"}\n              <a\n                href=\"https://www.altimate.ai/support\"\n                target=\"_blank\"\n                rel=\"noopener noreferrer\"\n              >\n                Contact our support team\n              </a>\n            </p>\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n});\n\nSetupWizard.displayName = \"SetupWizard\";\n\nexport default SetupWizard;\n"
  },
  {
    "path": "webview_panels/src/modules/onboarding/TutorialsStep.tsx",
    "content": "import AutocompleteMacroGif from \"@assets/tutorial-images/autocomplete-macro.gif\";\nimport AutocompleteModelGif from \"@assets/tutorial-images/autocomplete-model.gif\";\nimport AutocompleteSourceGif from \"@assets/tutorial-images/autocomplete-source.gif\";\nimport ColumnLineageGif from \"@assets/tutorial-images/column-lineage.gif\";\nimport DefinitionMacroGif from \"@assets/tutorial-images/definition-macro.gif\";\nimport DefinitionModelGif from \"@assets/tutorial-images/definition-model.gif\";\nimport DocGenerationUsingAiGif from \"@assets/tutorial-images/doc-generation-using-ai.gif\";\nimport DocsEditorGif from \"@assets/tutorial-images/docs-editor.gif\";\nimport EDAAndExportGif from \"@assets/tutorial-images/EDA-and-export.gif\";\nimport GenerateModelFromSourceGif from \"@assets/tutorial-images/generate-model-from-source.gif\";\nimport GenerateModelFromSQLGif from \"@assets/tutorial-images/generate-model-from-SQL.gif\";\nimport GraphGif from \"@assets/tutorial-images/graph.gif\";\nimport ModelLineageGif from \"@assets/tutorial-images/model-lineage.gif\";\nimport ProjectScanGif from \"@assets/tutorial-images/project-scan.gif\";\nimport QueryExplanationGif from \"@assets/tutorial-images/query-explanation.gif\";\nimport QueryResultsAndSQLGif from \"@assets/tutorial-images/query-results-and-SQL.gif\";\nimport { Tabs } from \"antd\";\nimport { useCallback, useState } from \"react\";\nimport classes from \"./onboarding.module.scss\";\n\n// Define the type for tutorial images\ninterface TutorialImages {\n  generateModelFromSource?: string;\n  generateModelFromSQL?: string;\n  autocompleteModel?: string;\n  autocompleteMacro?: string;\n  autocompleteSource?: string;\n  definitionModel?: string;\n  definitionMacro?: string;\n  queryResultsAndSQL?: string;\n  edaAndExport?: string;\n  queryExplanation?: string;\n  graph?: string;\n  docsEditor?: string;\n  docGenerationUsingAi?: string;\n  modelLineage?: string;\n  columnLineage?: string;\n  projectScan?: string;\n}\n\n// Extend the window interface\ndeclare global {\n  interface Window {\n    tutorialImages?: TutorialImages;\n  }\n}\n\n// Get tutorial images from window (provided by webview) or use imported fallbacks\nconst tutorialImages: TutorialImages = window.tutorialImages ?? {};\n\ninterface TutorialItem {\n  id: string;\n  title: string;\n  content: JSX.Element;\n}\n\nconst TUTORIALS: TutorialItem[] = [\n  {\n    id: \"generate_models\",\n    title: \"Generate dbt models\",\n    content: (\n      <div className={classes.tutorialContent}>\n        <h4>Start by generating a new dbt model from source files or SQL</h4>\n        <img\n          src={\n            tutorialImages.generateModelFromSource ?? GenerateModelFromSourceGif\n          }\n          alt=\"Generate a model from your source definition\"\n          className={classes.tutorialImage}\n        />\n        <p>\n          <strong>Note:</strong> You can configure a file name template and\n          prefix in the extension settings\n        </p>\n        <h4>You can also convert existing SQL to dbt model</h4>\n        <img\n          src={tutorialImages.generateModelFromSQL ?? GenerateModelFromSQLGif}\n          alt=\"Generate a model from SQL\"\n          className={classes.tutorialImage}\n        />\n      </div>\n    ),\n  },\n  {\n    id: \"autocompletion\",\n    title: \"Auto-completion\",\n    content: (\n      <div className={classes.tutorialContent}>\n        <h4>\n          The extension will help you write dbt code faster by auto-completing\n          model, macro and source names\n        </h4>\n        <img\n          src={tutorialImages.autocompleteModel ?? AutocompleteModelGif}\n          alt=\"Autocomplete model\"\n          className={classes.tutorialImage}\n        />\n        <img\n          src={tutorialImages.autocompleteMacro ?? AutocompleteMacroGif}\n          alt=\"Autocomplete macro\"\n          className={classes.tutorialImage}\n        />\n        <img\n          src={tutorialImages.autocompleteSource ?? AutocompleteSourceGif}\n          alt=\"Autocomplete source\"\n          className={classes.tutorialImage}\n        />\n        <h4>\n          You can also see the preview or click on the definition to go to the\n          actual file\n        </h4>\n        <img\n          src={tutorialImages.definitionModel ?? DefinitionModelGif}\n          alt=\"Definition model\"\n          className={classes.tutorialImage}\n        />\n        <img\n          src={tutorialImages.definitionMacro ?? DefinitionMacroGif}\n          alt=\"Definition macro\"\n          className={classes.tutorialImage}\n        />\n      </div>\n    ),\n  },\n  {\n    id: \"previews\",\n    title: \"Query results preview\",\n    content: (\n      <div className={classes.tutorialContent}>\n        <h4>\n          While developing the model, see the results of the dbt model as well\n          as the actual SQL query in the query panel\n        </h4>\n        <img\n          src={tutorialImages.queryResultsAndSQL ?? QueryResultsAndSQLGif}\n          alt=\"Preview query results and SQL\"\n          className={classes.tutorialImage}\n        />\n        <h4>\n          Analyze the results data with operations like &apos;split by&apos;,\n          &apos;group by&apos; as well as create different types of charts. You\n          can also export the data as CSV\n        </h4>\n        <img\n          src={tutorialImages.edaAndExport ?? EDAAndExportGif}\n          alt=\"Results data analysis and export\"\n          className={classes.tutorialImage}\n        />\n        <h4>\n          Quickly understand complex dbt models (sometimes written by others) by\n          generating query explanations\n        </h4>\n        <img\n          src={tutorialImages.queryExplanation ?? QueryExplanationGif}\n          alt=\"Query explanation\"\n          className={classes.tutorialImage}\n        />\n      </div>\n    ),\n  },\n  {\n    id: \"dependants\",\n    title: \"Build and run models\",\n    content: (\n      <div className={classes.tutorialContent}>\n        <h4>\n          After your model is ready, instead of typing commands, just click to\n          build and run parent / children models as well as tests\n        </h4>\n        <img\n          src={tutorialImages.graph ?? GraphGif}\n          alt=\"See the graph and execute parent or children models\"\n          className={classes.tutorialImage}\n        />\n        <p>\n          <strong>Note:</strong> there is also a toolbar on the right section of\n          file, that can be used for performing many operations like build or\n          run models, query preview etc.\n        </p>\n      </div>\n    ),\n  },\n  {\n    id: \"documentation\",\n    title: \"Documentation editor\",\n    content: (\n      <div className={classes.tutorialContent}>\n        <h4>\n          Edit your dbt model and column descriptions in the Documentation\n          Editor\n        </h4>\n        <img\n          src={tutorialImages.docsEditor ?? DocsEditorGif}\n          alt=\"Edit and update your docs inline using the docs editor\"\n          className={classes.tutorialImage}\n        />\n        <h4>\n          Generate descriptions for models and columns that include various\n          options like long, short, for business or make it funny! Documentation\n          editor will also save written description in YAML file with the\n          correct formatting\n        </h4>\n        <img\n          src={tutorialImages.docGenerationUsingAi ?? DocGenerationUsingAiGif}\n          alt=\"Generate descriptions for models and columns\"\n          className={classes.tutorialImage}\n        />\n      </div>\n    ),\n  },\n  {\n    id: \"lineage\",\n    title: \"Model and column lineage\",\n    content: (\n      <div className={classes.tutorialContent}>\n        <h4>You can see the parent and children of the models</h4>\n        <img\n          src={tutorialImages.modelLineage ?? ModelLineageGif}\n          alt=\"See the parents and children of your model\"\n          className={classes.tutorialImage}\n        />\n        <h4>\n          Explore column lineage to gauge the impact of your changes on other\n          models\n        </h4>\n        <img\n          src={tutorialImages.columnLineage ?? ColumnLineageGif}\n          alt=\"Column lineage\"\n          className={classes.tutorialImage}\n        />\n      </div>\n    ),\n  },\n  {\n    id: \"healthcheck\",\n    title: \"Project Health Check\",\n    content: (\n      <div className={classes.tutorialContent}>\n        <h4>\n          Before you commit changes to production, scan your entire dbt project\n          to identify following issues:\n        </h4>\n        <ul>\n          <li>\n            <strong>Undocumented Models</strong> - Missing schema.yml files\n          </li>\n          <li>\n            <strong>Undocumented Columns</strong> - Columns missing in\n            schema.yml files\n          </li>\n          <li>\n            <strong>Extra Columns</strong> - Columns not present in model but\n            specified in schema.yml files\n          </li>\n          <li>\n            <strong>Seeds and Models Absent in the Database</strong>\n          </li>\n        </ul>\n        <img\n          src={tutorialImages.projectScan ?? ProjectScanGif}\n          alt=\"Project scan\"\n          className={classes.tutorialImage}\n        />\n      </div>\n    ),\n  },\n];\n\nconst TutorialsStep = (): JSX.Element => {\n  const [expandedImage, setExpandedImage] = useState<{\n    src: string;\n    alt: string;\n  } | null>(null);\n\n  const handleImageClick = useCallback(\n    (e: React.MouseEvent<HTMLDivElement>) => {\n      const target = e.target as HTMLElement;\n      if (target.tagName === \"IMG\") {\n        const img = target as HTMLImageElement;\n        setExpandedImage({ src: img.src, alt: img.alt });\n      }\n    },\n    [],\n  );\n\n  return (\n    <div className={classes.tutorialsContainer}>\n      <div className={classes.tutorialsHeader}>\n        <h3>Explore Tutorials</h3>\n        <p>\n          Learn about dbt Power User features through these interactive\n          tutorials. Click through the tabs to explore each feature. Click any\n          image to expand it.\n        </p>\n      </div>\n\n      <div role=\"presentation\" onClick={handleImageClick}>\n        <Tabs\n          defaultActiveKey=\"generate_models\"\n          type=\"card\"\n          tabPosition=\"left\"\n          className={classes.tutorialsTabs}\n          items={TUTORIALS.map((tutorial) => ({\n            key: tutorial.id,\n            label: tutorial.title,\n            children: tutorial.content,\n          }))}\n        />\n      </div>\n\n      {expandedImage && (\n        <div\n          role=\"presentation\"\n          className={classes.imageOverlay}\n          onClick={() => setExpandedImage(null)}\n        >\n          <img\n            src={expandedImage.src}\n            alt={expandedImage.alt}\n            className={classes.imageOverlayImg}\n          />\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default TutorialsStep;\n"
  },
  {
    "path": "webview_panels/src/modules/onboarding/onboarding.module.scss",
    "content": ".onboarding-container {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  min-height: 100vh;\n  background-color: var(--vscode-editor-background);\n  color: var(--vscode-foreground);\n  padding: 2rem;\n}\n\n.content {\n  max-width: 800px;\n  text-align: center;\n  gap: 2rem;\n}\n\n.main-title {\n  font-size: 2rem;\n  font-weight: 600;\n  margin-bottom: 0;\n  line-height: 1.3;\n  color: var(--vscode-foreground);\n}\n\n.subtitle {\n  font-size: 1.25rem;\n  margin: 0;\n  color: var(--vscode-foreground);\n  opacity: 0.9;\n}\n\n.features-grid {\n  display: flex;\n  flex-direction: column;\n  gap: 1.5rem;\n  margin: 1rem 0;\n}\n\n.feature-row {\n  display: flex;\n  flex-direction: row;\n  gap: 2rem;\n  justify-content: center;\n  flex-wrap: wrap;\n}\n\n.feature-item {\n  display: flex;\n  align-items: center;\n  gap: 0.75rem;\n  font-size: 1.1rem;\n  min-width: 200px;\n}\n\n.icon-pencil,\n.icon-bulb,\n.icon-docs,\n.icon-chart,\n.icon-database,\n.icon-chat,\n.icon-search,\n.icon-brain,\n.icon-gear,\n.icon-magic {\n  font-size: 1.5rem;\n  flex-shrink: 0;\n}\n\n.feature-text {\n  color: var(--vscode-foreground);\n}\n\n.more-text {\n  font-size: 1.1rem;\n  margin: 0;\n  color: var(--vscode-foreground);\n  opacity: 0.85;\n}\n\n.button-group {\n  gap: 1rem;\n  justify-content: center;\n  margin-top: 1rem;\n}\n\n/* Wizard styles */\n.wizard-container {\n  max-width: 1200px;\n  margin: 0 auto;\n  padding: 2rem;\n  background-color: var(--vscode-editor-background);\n  color: var(--vscode-foreground);\n  min-height: 100vh;\n\n  // Dark mode overrides for Ant Design components\n  :global(body.vscode-dark) &,\n  :global(body.vscode-high-contrast) & {\n    :global(.ant-btn-default) {\n      background-color: var(--vscode-input-background);\n      color: var(--vscode-foreground);\n      border-color: var(--vscode-contrastBorder, var(--vscode-panel-border));\n\n      &:hover:not(:disabled) {\n        background-color: var(--vscode-list-hoverBackground);\n        color: var(--vscode-foreground);\n        border-color: var(--vscode-focusBorder);\n      }\n\n      &:disabled {\n        background-color: var(--vscode-input-background);\n        color: var(--vscode-disabledForeground);\n        border-color: var(--vscode-panel-border);\n        opacity: 0.5;\n      }\n    }\n\n    :global(.ant-btn-primary:disabled) {\n      background-color: var(--vscode-button-background);\n      color: var(--vscode-button-foreground);\n      border-color: var(--vscode-button-background);\n      opacity: 0.5;\n    }\n\n    :global(.ant-alert) {\n      background-color: var(--vscode-input-background);\n      border-color: var(--vscode-panel-border);\n\n      :global(.ant-alert-message) {\n        color: var(--vscode-foreground);\n      }\n\n      :global(.ant-alert-description) {\n        color: var(--vscode-foreground);\n      }\n\n      :global(.ant-alert-close-icon) {\n        color: var(--vscode-foreground);\n      }\n    }\n\n    :global(.ant-alert-info) {\n      border-color: var(--vscode-textLink-foreground);\n    }\n\n    :global(.ant-alert-success) {\n      border-color: var(--vscode-testing-iconPassed, #52c41a);\n    }\n\n    :global(.ant-alert-warning) {\n      border-color: var(--vscode-editorWarning-foreground, #faad14);\n    }\n\n    :global(.ant-alert-error) {\n      border-color: var(--vscode-editorError-foreground, #ff4d4f);\n    }\n\n    // Input and Input.Password\n    :global(.ant-input),\n    :global(.ant-input-password .ant-input) {\n      background-color: var(--vscode-input-background);\n      color: var(--vscode-input-foreground);\n      border-color: var(--vscode-panel-border);\n\n      &::placeholder {\n        color: var(--vscode-input-placeholderForeground);\n      }\n\n      &:hover {\n        border-color: var(--vscode-focusBorder);\n      }\n\n      &:focus,\n      &:global(.ant-input-focused) {\n        border-color: var(--vscode-focusBorder);\n        box-shadow: 0 0 0 2px rgba(var(--vscode-focusBorder), 0.2);\n      }\n\n      &:disabled,\n      &[disabled] {\n        background-color: var(--vscode-input-background);\n        color: var(--vscode-disabledForeground);\n        border-color: var(--vscode-panel-border);\n        opacity: 0.5;\n      }\n    }\n\n    :global(.ant-input-password) {\n      background-color: var(--vscode-input-background);\n      border-color: var(--vscode-panel-border);\n\n      &:hover {\n        border-color: var(--vscode-focusBorder);\n      }\n\n      &:global(.ant-input-affix-wrapper-focused) {\n        border-color: var(--vscode-focusBorder);\n      }\n\n      :global(.ant-input-suffix) {\n        color: var(--vscode-foreground);\n\n        :global(.anticon) {\n          color: var(--vscode-foreground);\n        }\n      }\n    }\n\n    // Select and dropdown\n    :global(.ant-select) {\n      :global(.ant-select-selector) {\n        background-color: var(--vscode-input-background) !important;\n        color: var(--vscode-input-foreground) !important;\n        border-color: var(--vscode-panel-border) !important;\n      }\n\n      &:hover :global(.ant-select-selector) {\n        border-color: var(--vscode-focusBorder) !important;\n      }\n\n      &:global(.ant-select-focused) :global(.ant-select-selector) {\n        border-color: var(--vscode-focusBorder) !important;\n      }\n\n      :global(.ant-select-arrow) {\n        color: var(--vscode-foreground);\n      }\n\n      :global(.ant-select-clear) {\n        background-color: var(--vscode-input-background);\n        color: var(--vscode-foreground);\n      }\n\n      :global(.ant-select-selection-placeholder) {\n        color: var(--vscode-input-placeholderForeground) !important;\n      }\n\n      :global(.ant-select-selection-item) {\n        color: var(--vscode-input-foreground) !important;\n      }\n\n      &:global(.ant-select-disabled) {\n        :global(.ant-select-selector) {\n          background-color: var(--vscode-input-background) !important;\n          color: var(--vscode-disabledForeground) !important;\n          opacity: 0.5;\n        }\n      }\n    }\n\n    // Radio buttons (circle style)\n    :global(.ant-radio-wrapper) {\n      color: var(--vscode-foreground);\n\n      :global(.ant-radio) {\n        :global(.ant-radio-inner) {\n          background-color: var(--vscode-input-background);\n          border-color: var(--vscode-panel-border);\n        }\n\n        &:global(.ant-radio-checked) :global(.ant-radio-inner) {\n          background-color: var(--vscode-button-background);\n          border-color: var(--vscode-button-background);\n        }\n      }\n\n      &:hover :global(.ant-radio) :global(.ant-radio-inner) {\n        border-color: var(--vscode-focusBorder);\n      }\n\n      &:global(.ant-radio-wrapper-disabled) {\n        color: var(--vscode-disabledForeground);\n        opacity: 0.5;\n\n        :global(.ant-radio) :global(.ant-radio-inner) {\n          background-color: var(--vscode-input-background);\n          border-color: var(--vscode-panel-border);\n        }\n      }\n    }\n\n    // Radio.Button toggle (segmented style)\n    :global(.ant-radio-group) {\n      :global(.ant-radio-button-wrapper) {\n        background-color: var(--vscode-input-background);\n        color: var(--vscode-foreground);\n        border-color: var(--vscode-panel-border);\n\n        &:hover {\n          color: var(--vscode-textLink-foreground);\n        }\n\n        &:global(.ant-radio-button-wrapper-checked) {\n          background-color: var(--vscode-button-background);\n          color: var(--vscode-button-foreground);\n          border-color: var(--vscode-button-background);\n\n          &:hover {\n            color: var(--vscode-button-foreground);\n          }\n        }\n\n        &:global(.ant-radio-button-wrapper-disabled) {\n          background-color: var(--vscode-input-background);\n          color: var(--vscode-disabledForeground);\n          border-color: var(--vscode-panel-border);\n          opacity: 0.5;\n        }\n      }\n    }\n\n    // Typography\n    :global(.ant-typography) {\n      color: var(--vscode-foreground);\n    }\n\n    // Collapse / Accordion\n    :global(.ant-collapse) {\n      background-color: var(--vscode-input-background);\n      border-color: var(--vscode-panel-border);\n\n      :global(.ant-collapse-item) {\n        border-color: var(--vscode-panel-border);\n      }\n\n      :global(.ant-collapse-header) {\n        color: var(--vscode-foreground) !important;\n        background-color: var(--vscode-editor-background);\n      }\n\n      :global(.ant-collapse-content) {\n        background-color: var(--vscode-input-background);\n        border-color: var(--vscode-panel-border);\n        color: var(--vscode-foreground);\n      }\n\n      :global(.ant-collapse-expand-icon) {\n        color: var(--vscode-foreground);\n      }\n    }\n\n    // Tags\n    :global(.ant-tag) {\n      background-color: var(--vscode-input-background);\n      color: var(--vscode-foreground);\n      border-color: var(--vscode-panel-border);\n    }\n\n    // Card\n    :global(.ant-card) {\n      background-color: var(--vscode-editor-background);\n      border-color: var(--vscode-panel-border);\n      color: var(--vscode-foreground);\n\n      :global(.ant-card-head) {\n        color: var(--vscode-foreground);\n        border-color: var(--vscode-panel-border);\n      }\n\n      :global(.ant-card-body) {\n        color: var(--vscode-foreground);\n      }\n    }\n  }\n}\n\n.wizard-title {\n  font-size: 2rem;\n  font-weight: 600;\n  margin-bottom: 0.5rem;\n  color: var(--vscode-foreground);\n  text-align: center;\n}\n\n.wizard-subtitle {\n  font-size: 1.1rem;\n  margin-bottom: 2rem;\n  color: var(--vscode-foreground);\n  opacity: 0.9;\n  text-align: center;\n}\n\n.wizard-content {\n  display: flex;\n  gap: 2rem;\n  align-items: flex-start;\n\n  @media (max-width: 700px) {\n    flex-direction: column;\n  }\n}\n\n.wizard-sidebar {\n  flex-shrink: 0;\n\n  @media (max-width: 700px) {\n    width: 100%;\n  }\n}\n\n.wizard-main {\n  flex: 1;\n  min-width: 0;\n}\n\n.wizard-steps {\n  margin-bottom: 0;\n  counter-reset: parent-step;\n\n  :global(.ant-steps-item-title) {\n    color: var(--vscode-foreground) !important;\n  }\n\n  :global(.ant-steps-item-description) {\n    color: var(--vscode-descriptionForeground) !important;\n  }\n\n  :global(.ant-steps-item-process .ant-steps-item-icon) {\n    background-color: var(--vscode-button-background) !important;\n    border-color: var(--vscode-button-background) !important;\n  }\n\n  :global(.ant-steps-item-finish .ant-steps-item-icon) {\n    background-color: var(--vscode-button-secondaryBackground) !important;\n    border-color: var(--vscode-button-secondaryBackground) !important;\n  }\n\n  :global(.ant-steps-item-wait .ant-steps-item-icon) {\n    border-color: var(--vscode-foreground) !important;\n    opacity: 0.7;\n  }\n\n  :global(.ant-steps-item-wait .ant-steps-item-icon .ant-steps-icon) {\n    color: var(--vscode-foreground) !important;\n  }\n\n  :global(.ant-steps-item-wait .ant-steps-item-title) {\n    color: var(--vscode-foreground) !important;\n    opacity: 0.7;\n  }\n\n  :global(.ant-steps-item-wait .ant-steps-item-description) {\n    color: var(--vscode-foreground) !important;\n    opacity: 0.7;\n  }\n}\n\n// Consistent spacing for all steps\n.wizard-steps :global(.ant-steps-item) {\n  padding-bottom: 16px !important;\n  cursor: pointer;\n\n  @media (max-width: 700px) {\n    padding-bottom: 0 !important;\n  }\n}\n\n// In horizontal mode, hide descriptions to save space\n@media (max-width: 700px) {\n  .wizard-steps :global(.ant-steps-item-description) {\n    display: none !important;\n  }\n}\n\n// Substep — smaller circle, hide number but keep checkmark\n.substep {\n  :global(.ant-steps-item-icon) {\n    width: 24px !important;\n    height: 24px !important;\n    min-width: 24px !important;\n    display: flex !important;\n    align-items: center !important;\n    justify-content: center !important;\n    line-height: 22px !important;\n    margin-inline-start: 4px !important;\n    margin-top: 4px !important;\n  }\n\n  // Hide number text via font-size: 0, keep container for checkmark\n  :global(.ant-steps-item-icon .ant-steps-icon) {\n    font-size: 0 !important;\n  }\n\n  // Checkmark needs explicit size and color since parent is font-size: 0\n  :global(.ant-steps-item-icon .ant-steps-icon .ant-steps-finish-icon) {\n    font-size: 12px !important;\n    color: var(--vscode-button-foreground, #fff) !important;\n  }\n\n  // Finished substeps keep blue circle (not muted secondaryBackground)\n  &:global(.ant-steps-item-finish) :global(.ant-steps-item-icon) {\n    background-color: var(--vscode-button-background) !important;\n    border-color: var(--vscode-button-background) !important;\n  }\n\n  :global(.ant-steps-item-title) {\n    font-size: 13px !important;\n  }\n}\n\n// Parent step — bold title, custom 1/2/3 numbering via CSS counter\n.parent-step {\n  counter-increment: parent-step;\n\n  :global(.ant-steps-item-title) {\n    font-weight: 600 !important;\n  }\n\n  // Replace Antd's sequential number with parent counter\n  :global(.ant-steps-item-icon .ant-steps-icon) {\n    font-size: 0 !important;\n  }\n\n  :global(.ant-steps-item-icon .ant-steps-icon)::after {\n    content: counter(parent-step);\n    font-size: 14px;\n    color: inherit;\n  }\n\n  // When finished, show checkmark instead of counter\n  &:global(.ant-steps-item-finish) :global(.ant-steps-item-icon .ant-steps-icon)::after {\n    content: none;\n  }\n\n  &:global(.ant-steps-item-finish) :global(.ant-steps-item-icon .ant-steps-icon .ant-steps-finish-icon) {\n    font-size: 14px !important;\n    color: var(--vscode-button-foreground, #fff) !important;\n  }\n\n  // Finished parents also keep blue circle\n  &:global(.ant-steps-item-finish) :global(.ant-steps-item-icon) {\n    background-color: var(--vscode-button-background) !important;\n    border-color: var(--vscode-button-background) !important;\n  }\n\n  &:global(.ant-steps-item-process) :global(.ant-steps-item-tail)::after {\n    background-color: var(--vscode-button-background) !important;\n  }\n}\n\n.step-card {\n  background-color: var(--vscode-editorWidget-background);\n  border: 1px solid var(--vscode-panel-border);\n  border-radius: 8px;\n  padding: 2rem;\n  margin-bottom: 1rem;\n  min-height: 400px;\n  display: flex;\n  flex-direction: column;\n\n  h2 {\n    font-size: 1.5rem;\n    margin-top: 0;\n    margin-bottom: 1rem;\n    color: var(--vscode-foreground);\n  }\n}\n\n.step-description {\n  font-size: 1rem;\n  line-height: 1.6;\n  color: var(--vscode-descriptionForeground);\n  margin-bottom: 1.5rem;\n}\n\n.step-actions {\n  gap: 1rem;\n  margin-bottom: 2rem;\n  flex-grow: 1;\n}\n\n.wizard-navigation {\n  display: grid;\n  grid-template-columns: 1fr auto 1fr;\n  align-items: center;\n  gap: 1rem;\n  padding-top: 1rem;\n  margin-top: auto;\n  border-top: 1px solid var(--vscode-panel-border);\n\n  // Left column — align start\n  > :first-child {\n    justify-self: start;\n  }\n\n  // Center column — always centered\n  > :nth-child(2) {\n    justify-self: center;\n  }\n\n  // Right column — align end\n  > :last-child {\n    justify-self: end;\n  }\n}\n\n.step-counter {\n  color: var(--vscode-descriptionForeground);\n  font-size: 0.9rem;\n  flex: 1;\n  text-align: center;\n}\n\n.wizard-footer {\n  text-align: center;\n  padding-top: 1rem;\n\n  p {\n    color: var(--vscode-descriptionForeground);\n    font-size: 0.9rem;\n  }\n\n  a {\n    color: var(--vscode-textLink-foreground);\n    text-decoration: none;\n\n    &:hover {\n      color: var(--vscode-textLink-activeForeground);\n      text-decoration: underline;\n    }\n  }\n}\n\n/* Project Setup Step styles */\n.project-setup-container {\n  display: flex;\n  flex-direction: column;\n  gap: 1.5rem;\n}\n\n.loading-container {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  padding: 3rem;\n  gap: 1rem;\n\n  p {\n    color: var(--vscode-descriptionForeground);\n    margin: 0;\n  }\n}\n\n.project-selector {\n  display: flex;\n  flex-direction: column;\n  gap: 0.5rem;\n}\n\n.project-label {\n  font-size: 1rem;\n  font-weight: 500;\n  color: var(--vscode-foreground);\n}\n\n.alert-message {\n  margin-top: 1rem;\n}\n\n.setup-actions {\n  margin-top: 1rem;\n}\n\n.setup-info {\n  background-color: var(--vscode-textBlockQuote-background);\n  border-left: 3px solid var(--vscode-textLink-foreground);\n  padding: 1rem;\n  border-radius: 4px;\n\n  p {\n    margin: 0 0 0.5rem 0;\n    color: var(--vscode-foreground);\n    font-weight: 500;\n  }\n\n  ul {\n    margin: 0;\n    padding-left: 1.5rem;\n    color: var(--vscode-foreground);\n\n    li {\n      margin-bottom: 0.25rem;\n\n      strong {\n        color: var(--vscode-foreground);\n      }\n\n      code {\n        background-color: var(--vscode-editor-background);\n        padding: 0.125rem 0.25rem;\n        border-radius: 3px;\n        font-family: var(--vscode-editor-font-family);\n        font-size: 0.9em;\n        border: 1px solid var(--vscode-panel-border);\n      }\n    }\n  }\n}\n\n/* Progress Card styles */\n.progress-card-heading {\n  display: block;\n  margin-bottom: 0.5rem;\n  color: var(--vscode-foreground);\n  font-weight: 600;\n  text-align: center;\n}\n\n.progress-card-description {\n  display: block;\n  margin-bottom: 0.5rem;\n  color: var(--vscode-foreground);\n  opacity: 0.9;\n  text-align: center;\n}\n\n.progress-card-list {\n  margin: 0.5rem 0;\n  padding-left: 1.5rem;\n  color: var(--vscode-foreground);\n  opacity: 0.9;\n}\n\n.progress-card-features {\n  display: flex;\n  justify-content: space-between;\n  gap: 1rem;\n  margin-top: 0.5rem;\n  flex-wrap: wrap;\n}\n\n.progress-card-feature-item {\n  color: var(--vscode-foreground);\n  opacity: 0.9;\n  flex: 1 1 auto;\n  min-width: 150px;\n}\n\n.section-heading {\n  margin-bottom: 1rem;\n  color: var(--vscode-foreground) !important;\n}\n\n/* Altimate Key Setup styles */\n.altimate-key-container {\n  display: flex;\n  flex-direction: column;\n  gap: 1.5rem;\n  width: 100%;\n}\n\n.altimate-key-info {\n  background-color: var(--vscode-textBlockQuote-background);\n  border-left: 3px solid var(--vscode-textLink-foreground);\n  padding: 1rem;\n  border-radius: 4px;\n\n  p {\n    margin: 0 0 0.5rem 0;\n    color: var(--vscode-foreground);\n    font-weight: 500;\n  }\n\n  ol {\n    margin: 0;\n    padding-left: 1.5rem;\n    color: var(--vscode-foreground);\n\n    li {\n      margin-bottom: 0.25rem;\n\n      a {\n        color: var(--vscode-textLink-foreground);\n        text-decoration: none;\n\n        &:hover {\n          color: var(--vscode-textLink-activeForeground);\n          text-decoration: underline;\n        }\n      }\n    }\n  }\n}\n\n.form-group {\n  display: flex;\n  flex-direction: column;\n  gap: 0.5rem;\n}\n\n.form-label {\n  font-size: 1rem;\n  font-weight: 500;\n  color: var(--vscode-foreground);\n}\n\n.altimate-key-actions {\n  display: flex;\n  gap: 0.75rem;\n  justify-content: flex-end;\n  flex-wrap: wrap;\n}\n\n/* Dbt Integration Setup styles */\n.dbt-integration-container {\n  display: flex;\n  flex-direction: column;\n  gap: 1.5rem;\n  width: 100%;\n}\n\n.dbt-integration-info {\n  background-color: var(--vscode-textBlockQuote-background);\n  border-left: 3px solid var(--vscode-textLink-foreground);\n  padding: 1rem;\n  border-radius: 4px;\n\n  p {\n    margin: 0 0 0.5rem 0;\n    color: var(--vscode-foreground);\n    font-weight: 500;\n  }\n\n  ul {\n    margin: 0;\n    padding-left: 1.5rem;\n    color: var(--vscode-foreground);\n\n    li {\n      margin-bottom: 0.25rem;\n    }\n  }\n}\n\n.section-title {\n  font-size: 1.3rem;\n  font-weight: 600;\n  margin: 0 0 0.75rem 0;\n  color: var(--vscode-foreground);\n  text-align: center;\n}\n\n.dbt-integration-steps {\n  padding: 1rem;\n  background-color: var(--vscode-editor-background);\n  border: 1px solid var(--vscode-panel-border);\n  border-radius: 4px;\n\n  p {\n    margin: 0 0 0.5rem 0;\n    color: var(--vscode-foreground);\n  }\n\n  ol {\n    margin: 0;\n    padding-left: 1.5rem;\n    color: var(--vscode-foreground);\n\n    li {\n      margin-bottom: 0.5rem;\n    }\n  }\n}\n\n.dbt-integration-actions {\n  display: flex;\n  gap: 0.75rem;\n  justify-content: flex-end;\n  flex-wrap: wrap;\n}\n\n.help-text {\n  text-align: center;\n  padding-top: 0.5rem;\n\n  p {\n    color: var(--vscode-descriptionForeground);\n    font-size: 0.9rem;\n    margin: 0;\n  }\n\n  a {\n    color: var(--vscode-textLink-foreground);\n    text-decoration: none;\n\n    &:hover {\n      color: var(--vscode-textLink-activeForeground);\n      text-decoration: underline;\n    }\n  }\n}\n\n/* Install dbt Step styles */\n.install-dbt-container {\n  display: flex;\n  flex-direction: column;\n  gap: 1.5rem;\n  width: 100%;\n}\n\n.install-dbt-info {\n  background-color: var(--vscode-textBlockQuote-background);\n  border-left: 3px solid var(--vscode-textLink-foreground);\n  padding: 1rem;\n  border-radius: 4px;\n\n  p {\n    margin: 0;\n    color: var(--vscode-foreground);\n    font-weight: 500;\n  }\n}\n\n\n.radio-option {\n  display: flex;\n  flex-direction: column;\n  gap: 0.25rem;\n  padding-left: 0.5rem;\n\n  strong {\n    color: var(--vscode-foreground);\n    font-size: 1rem;\n    font-weight: 600;\n  }\n}\n\n.radio-description {\n  color: var(--vscode-descriptionForeground);\n  font-size: 0.9rem;\n  margin: 0;\n  line-height: 1.5;\n}\n\n.install-dbt-actions {\n  display: flex;\n  gap: 0.75rem;\n  justify-content: flex-end;\n  flex-wrap: wrap;\n}\n\n/* Prerequisites Step styles */\n.prerequisites-container {\n  display: flex;\n  flex-direction: column;\n  gap: 1.5rem;\n  width: 100%;\n}\n\n.prerequisites-info {\n  background-color: var(--vscode-textBlockQuote-background);\n  border-left: 3px solid var(--vscode-textLink-foreground);\n  padding: 1rem;\n  border-radius: 4px;\n\n  p {\n    margin: 0;\n    color: var(--vscode-foreground);\n    font-weight: 500;\n  }\n}\n\n.prerequisite-checks {\n  display: flex;\n  flex-direction: column;\n  gap: 1rem;\n}\n\n.prerequisite-card {\n  background-color: var(--vscode-editor-background);\n  border: 1px solid var(--vscode-panel-border);\n  border-radius: 4px;\n  transition: all 0.2s ease;\n\n  &:hover {\n    border-color: var(--vscode-focusBorder);\n  }\n\n  :global(.ant-card-body) {\n    padding: 1.25rem;\n  }\n}\n\n.prerequisite-card-header {\n  display: flex;\n  justify-content: space-between;\n  align-items: flex-start;\n  gap: 1rem;\n}\n\n.prerequisite-card-title {\n  display: flex;\n  align-items: flex-start;\n  gap: 1rem;\n  flex: 1;\n\n  h3 {\n    margin: 0 0 0.25rem 0;\n    font-size: 1.1rem;\n    font-weight: 600;\n    color: var(--vscode-foreground);\n  }\n}\n\n.prerequisite-icon {\n  font-size: 1.5rem;\n  color: var(--vscode-textLink-foreground);\n  flex-shrink: 0;\n  margin-top: 0.125rem;\n}\n\n.prerequisite-description {\n  color: var(--vscode-descriptionForeground);\n  font-size: 0.9rem;\n  margin: 0;\n  line-height: 1.5;\n}\n\n.prerequisite-status {\n  font-size: 1.25rem;\n  flex-shrink: 0;\n}\n\n.prerequisite-action {\n  margin-top: 1rem;\n  padding-top: 1rem;\n  border-top: 1px solid var(--vscode-panel-border);\n}\n\n.prerequisites-actions {\n  display: flex;\n  gap: 0.75rem;\n  justify-content: space-between;\n  flex-wrap: wrap;\n}\n\n.diagnostics-summary {\n  text-align: center;\n  padding: 1rem;\n  background-color: var(--vscode-textBlockQuote-background);\n  border-radius: 4px;\n\n  p {\n    margin: 0;\n    color: var(--vscode-descriptionForeground);\n    font-size: 0.9rem;\n  }\n}\n\n.validation-section {\n  margin: 1.5rem 0 1rem;\n\n  h3 {\n    font-size: 1.3rem;\n    font-weight: 600;\n    margin: 0 0 0.5rem 0;\n    color: var(--vscode-foreground);\n  }\n\n  p {\n    margin: 0;\n    color: var(--vscode-descriptionForeground);\n    font-size: 1rem;\n    line-height: 1.5;\n  }\n}\n\n.prerequisites-steps {\n  margin-bottom: 1.5rem;\n\n  :global(.ant-steps-item) {\n    flex: 1 !important;\n  }\n\n  :global(.ant-steps-item-title) {\n    color: var(--vscode-foreground) !important;\n    font-size: 1.1rem !important;\n    font-weight: 600 !important;\n  }\n\n  :global(.ant-steps-item-description) {\n    color: var(--vscode-foreground) !important;\n    opacity: 0.85;\n    font-size: 0.95rem !important;\n    white-space: normal !important;\n    max-width: none !important;\n  }\n\n  :global(.ant-steps-item-process .ant-steps-item-icon) {\n    background-color: var(--vscode-button-background) !important;\n    border-color: var(--vscode-button-background) !important;\n  }\n\n  :global(.ant-steps-item-finish .ant-steps-item-icon) {\n    background-color: var(--vscode-button-secondaryBackground) !important;\n    border-color: var(--vscode-button-secondaryBackground) !important;\n  }\n\n  :global(.ant-steps-item-finish > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title::after) {\n    background-color: var(--vscode-button-secondaryBackground) !important;\n  }\n\n  :global(.ant-steps-item-wait .ant-steps-item-icon) {\n    border-color: var(--vscode-foreground) !important;\n    opacity: 0.7;\n  }\n\n  :global(.ant-steps-item-wait .ant-steps-item-icon .ant-steps-icon) {\n    color: var(--vscode-foreground) !important;\n  }\n\n  :global(.ant-steps-item-wait .ant-steps-item-title) {\n    color: var(--vscode-foreground) !important;\n    opacity: 0.7;\n  }\n\n  :global(.ant-steps-item-wait .ant-steps-item-description) {\n    color: var(--vscode-foreground) !important;\n    opacity: 0.7;\n  }\n}\n\n/* Tutorials Step styles */\n.tutorials-container {\n  display: flex;\n  flex-direction: column;\n  gap: 1rem;\n  width: 100%;\n}\n\n.tutorials-header {\n  text-align: center;\n  margin-bottom: 1rem;\n\n  h3 {\n    margin: 0 0 0.5rem 0;\n    font-size: 1.3rem;\n    font-weight: 600;\n    color: var(--vscode-foreground);\n  }\n\n  p {\n    margin: 0;\n    color: var(--vscode-descriptionForeground);\n    font-size: 0.95rem;\n  }\n}\n\n.tutorials-tabs {\n  :global(.ant-tabs-nav) {\n    background-color: var(--vscode-editor-background);\n    margin-bottom: 0;\n    margin-right: 1rem;\n  }\n\n  :global(.ant-tabs-tab) {\n    background-color: var(--vscode-editor-background) !important;\n    border: 1px solid var(--vscode-panel-border) !important;\n    color: var(--vscode-foreground) !important;\n    opacity: 0.7;\n\n    &:hover {\n      color: var(--vscode-textLink-foreground) !important;\n      opacity: 1;\n    }\n  }\n\n  :global(.ant-tabs-tab-active) {\n    background-color: var(--vscode-list-activeSelectionBackground) !important;\n    border-color: var(--vscode-list-activeSelectionBackground) !important;\n    color: var(--vscode-list-activeSelectionForeground) !important;\n    opacity: 1 !important;\n\n    &:hover {\n      color: var(--vscode-list-activeSelectionForeground) !important;\n    }\n  }\n\n  :global(.ant-tabs-ink-bar) {\n    background: var(--vscode-list-activeSelectionBackground) !important;\n  }\n\n  :global(.ant-tabs-content) {\n    background-color: var(--vscode-editor-background);\n    border: 1px solid var(--vscode-panel-border);\n    border-radius: 4px;\n    padding: 1.5rem;\n    min-height: 400px;\n    max-height: 500px;\n    overflow-y: auto;\n  }\n}\n\n.tutorial-content {\n  display: flex;\n  flex-direction: column;\n  gap: 1.5rem;\n\n  h4 {\n    margin: 0;\n    font-size: 1.05rem;\n    font-weight: 600;\n    color: var(--vscode-foreground);\n    line-height: 1.5;\n  }\n\n  p {\n    margin: 0;\n    color: var(--vscode-descriptionForeground);\n    font-size: 0.95rem;\n    line-height: 1.6;\n\n    strong {\n      color: var(--vscode-foreground);\n      font-weight: 600;\n    }\n  }\n\n  ul {\n    margin: 0;\n    padding-left: 1.5rem;\n    color: var(--vscode-foreground);\n\n    li {\n      margin-bottom: 0.5rem;\n      line-height: 1.6;\n\n      strong {\n        color: var(--vscode-foreground);\n        font-weight: 600;\n      }\n    }\n  }\n}\n\n.tutorial-image {\n  width: 100%;\n  max-width: 800px;\n  height: auto;\n  border: 1px solid var(--vscode-panel-border);\n  border-radius: 4px;\n  margin: 0.5rem 0;\n  cursor: zoom-in;\n  transition: opacity 0.15s ease;\n\n  &:hover {\n    opacity: 0.85;\n  }\n}\n\n.image-overlay {\n  position: fixed;\n  inset: 0;\n  z-index: 9999;\n  background-color: rgba(0, 0, 0, 0.85);\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  cursor: zoom-out;\n  padding: 2rem;\n}\n\n.image-overlay-img {\n  max-width: 95%;\n  max-height: 95%;\n  object-fit: contain;\n  border-radius: 4px;\n}\n\n// Select dropdown popup renders in a portal outside .wizard-container,\n// so it needs a global dark-mode override\n:global(body.vscode-dark),\n:global(body.vscode-high-contrast) {\n  :global(.ant-select-dropdown) {\n    background-color: var(--vscode-input-background);\n    border: 1px solid var(--vscode-panel-border);\n\n    :global(.ant-select-item) {\n      color: var(--vscode-foreground);\n    }\n\n    :global(.ant-select-item-option-active) {\n      background-color: var(--vscode-list-hoverBackground);\n    }\n\n    :global(.ant-select-item-option-selected) {\n      background-color: var(--vscode-list-activeSelectionBackground);\n      color: var(--vscode-list-activeSelectionForeground);\n    }\n\n    :global(.ant-select-item-empty) {\n      color: var(--vscode-disabledForeground);\n    }\n  }\n}\n"
  },
  {
    "path": "webview_panels/src/modules/previewFeature/PreviewFeatureIcon.tsx",
    "content": "import { PreviewIcon } from \"@assets/icons\";\nimport { Tooltip } from \"@uicore\";\nimport classes from \"./tooltip.module.scss\";\n\nconst PreviewFeatureIcon = (): JSX.Element => {\n  return (\n    <Tooltip title=\"Preview feature\" className={classes.tooltip}>\n      <PreviewIcon />\n    </Tooltip>\n  );\n};\n\nexport default PreviewFeatureIcon;\n"
  },
  {
    "path": "webview_panels/src/modules/previewFeature/tooltip.module.scss",
    "content": ".tooltip {\n  :global .tooltip-inner {\n    padding: 8px;\n    color: #082247;\n    border-radius: 4px;\n    white-space: nowrap;\n    background: #ffce73;\n    font-size: 1rem;\n    font-weight: 500;\n  }\n  :global .arrow {\n    display: none;\n  }\n}\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/QueryPanel.stories.tsx",
    "content": "import type { Meta } from \"@storybook/react\";\nimport QueryPanelProvider from \"./QueryPanelProvider\";\nimport { Button, Stack } from \"@uicore\";\nimport {\n  QueryBookmarkFactory,\n  QueryHistoryFactory,\n} from \"../../testUtils/queryResults\";\nimport { TenantUserFactory } from \"@testUtils\";\nimport { panelLogger } from \"@modules/logger\";\nimport { QueryPanelViewType } from \"./context/types\";\n\nconst meta = {\n  title: \"Query Panel\",\n  parameters: {\n    layout: \"padded\",\n  },\n  tags: [\"autodocs\"],\n  argTypes: {\n    backgroundColor: { control: \"color\" },\n  },\n} satisfies Meta;\n\nexport default meta;\n\nconst ActionButton = ({\n  data,\n  title,\n}: {\n  data: { command: string } & Record<string, unknown>;\n  title: string;\n}) => {\n  const handleAction = () => {\n    window.postMessage(data);\n  };\n  return <Button onClick={handleAction}>{title}</Button>;\n};\n\nconst user = TenantUserFactory.build();\nexport const DefaultQueryPanelView = {\n  render: (): JSX.Element => {\n    return (\n      <div>\n        <Stack className=\"mb-4\">\n          <ActionButton\n            data={{ command: \"renderLoading\" }}\n            title=\"Start loading\"\n          />\n          <ActionButton\n            data={{\n              command: \"renderQuery\",\n              raw_sql: \"select * from {{ref'users'}}\",\n              compiled_sql: \"select * from users\",\n              rows: [{ x: 0, y: false, z: null }],\n              columnNames: [\"x\", \"y\", \"z\"],\n              columnTypes: [\"Integer\", \"Boolean\", \"String\"],\n            }}\n            title=\"Render query results\"\n          />\n          <ActionButton\n            data={{\n              command: \"renderError\",\n              error: {\n                code: -1,\n                message:\n                  'Runtime Error\\n  Binder Error: Referenced column \"001234\" not found in FROM clause!\\n  Candidate bindings: \"customers.last_name\"',\n                data: '\"Error: Runtime Error\\\\n  Binder Error: Referenced column \\\\\"001234\\\\\" not found in FROM clause!\\\\n  Candidate bindings: \\\\\"customers.last_name\\\\\"\\\\n\\\\tat DBTCoreProjectIntegration.<anonymous> (/Users/saravanan/projects/altimate/vscode-dbt-power-user/dist/extension.js:43336:31)\\\\n\\\\tat Generator.throw (<anonymous>)\\\\n\\\\tat rejected (/Users/saravanan/projects/altimate/vscode-dbt-power-user/dist/extension.js:54735:65)\"',\n              },\n              raw_sql:\n                \"with customers as (\\n\\n    select * from {{ ref('stg_customers') }}\\n\\n),\\n\\norders as (\\n\\n    select * from {{ ref('stg_orders') }}\\n\\n),\\n\\npayments as (\\n\\n    select * from {{ ref('stg_payments') }}\\n\\n),\\n\\ncustomer_orders as (\\n\\n        select\\n        customer_id,\\n\\n        min(order_date) as first_order,\\n        max(order_date) as most_recent_order,\\n        count(order_id) as number_of_orders\\n    from orders\\n\\n    group by customer_id\\n\\n),\\n\\ncustomer_payments as (\\n\\n    select\\n        orders.customer_id,\\n        sum(amount) as total_amount\\n\\n    from payments\\n\\n    left join orders on\\n         payments.order_id = orders.order_id\\n\\n    group by orders.customer_id\\n\\n),\\n\\nfinal as (\\n\\n    select\\n        \\\"001234\\\" as leading_zero,\\n        214748364710 as positive_big_int, 214748364723*(-1) as negative_big_int, ROUND(12/9,3) as float_precision,\\n        214748364710 as positive_big_int1, 214748364723*(-1) as negative_big_int1, ROUND(12/9,3) as float_precision1,\\n        214748364710 as positive_big_int2, 214748364723*(-1) as negative_big_int2, ROUND(12/9,3) as float_precision2,\\n        customers.customer_id,\\n        customers.first_name,\\n        customers.last_name,\\n        customer_orders.first_order,\\n        customer_orders.most_recent_order,\\n        customer_orders.number_of_orders,\\n        customer_payments.total_amount as customer_lifetime_value\\n\\n    from customers\\n\\n    left join customer_orders\\n        on customers.customer_id = customer_orders.customer_id\\n\\n    left join customer_payments\\n        on  customers.customer_id = customer_payments.customer_id\\n\\n)\\n\\nselect * from final\\n\",\n              compiled_sql:\n                '\\n  \\n    select *\\n    from (\\n        with customers as (\\n\\n    select * from \"jaffle_shop\".\"main\".\"stg_customers\"\\n\\n),\\n\\norders as (\\n\\n    select * from \"jaffle_shop\".\"main\".\"stg_orders\"\\n\\n),\\n\\npayments as (\\n\\n    select * from \"jaffle_shop\".\"main\".\"stg_payments\"\\n\\n),\\n\\ncustomer_orders as (\\n\\n        select\\n        customer_id,\\n\\n        min(order_date) as first_order,\\n        max(order_date) as most_recent_order,\\n        count(order_id) as number_of_orders\\n    from orders\\n\\n    group by customer_id\\n\\n),\\n\\ncustomer_payments as (\\n\\n    select\\n        orders.customer_id,\\n        sum(amount) as total_amount\\n\\n    from payments\\n\\n    left join orders on\\n         payments.order_id = orders.order_id\\n\\n    group by orders.customer_id\\n\\n),\\n\\nfinal as (\\n\\n    select\\n        \"001234\" as leading_zero,\\n        214748364710 as positive_big_int, 214748364723*(-1) as negative_big_int, ROUND(12/9,3) as float_precision,\\n        214748364710 as positive_big_int1, 214748364723*(-1) as negative_big_int1, ROUND(12/9,3) as float_precision1,\\n        214748364710 as positive_big_int2, 214748364723*(-1) as negative_big_int2, ROUND(12/9,3) as float_precision2,\\n        customers.customer_id,\\n        customers.first_name,\\n        customers.last_name,\\n        customer_orders.first_order,\\n        customer_orders.most_recent_order,\\n        customer_orders.number_of_orders,\\n        customer_payments.total_amount as customer_lifetime_value\\n\\n    from customers\\n\\n    left join customer_orders\\n        on customers.customer_id = customer_orders.customer_id\\n\\n    left join customer_payments\\n        on  customers.customer_id = customer_payments.customer_id\\n\\n)\\n\\nselect * from final\\n\\n    ) as model_limit_subq\\n    limit 22\\n',\n            }}\n            title=\"Render Error\"\n          />\n          <ActionButton data={{ command: \"resetState\" }} title=\"Reset state\" />\n        </Stack>\n        <div style={{ position: \"relative\" }}>\n          <QueryPanelProvider />\n        </div>\n      </div>\n    );\n  },\n  parameters: {\n    vscode: {\n      func: (request: Record<string, unknown>): unknown => {\n        if (request.command === \"getCurrentUser\") {\n          return user;\n        }\n        if (request.command === \"getQueryPanelContext\") {\n          window.postMessage({\n            command: \"getContext\",\n            queryHistoryDisabled: false,\n          });\n\n          window.postMessage({\n            command: \"updateViewType\",\n            args: { body: { type: QueryPanelViewType.DEFAULT } },\n          });\n\n          return;\n        }\n        if (request.command === \"getQueryHistory\") {\n          window.postMessage({\n            command: \"queryHistory\",\n            args: { body: QueryHistoryFactory.buildList(5) },\n          });\n          return;\n        }\n\n        if (request.command === \"fetch\") {\n          switch (request.endpoint) {\n            case (request.endpoint as string).match(\n              /query\\/bookmark\\?privacy=private/,\n            )?.input:\n              return {\n                items: QueryBookmarkFactory.buildList(5, {\n                  privacy: \"private\",\n                  created_by_user: user,\n                }),\n                page: 1,\n                pages: 1,\n                size: 5,\n                total: 5,\n              };\n            case (request.endpoint as string).match(\n              /query\\/bookmark\\?privacy=public/,\n            )?.input:\n              return {\n                items: QueryBookmarkFactory.buildList(5, {\n                  privacy: \"public\",\n                  created_by_user: user,\n                }),\n                page: 1,\n                pages: 1,\n                size: 5,\n                total: 5,\n              };\n\n            case \"query/bookmark/tags\":\n              panelLogger.info(\"Fetching tags\");\n              return [\n                { id: 1, tag: \"tag1\" },\n                { id: 2, tag: \"tag2\" },\n                { id: 3, tag: \"tag3\" },\n              ];\n              break;\n\n            default:\n              break;\n          }\n        }\n      },\n      timer: 500,\n    },\n  },\n};\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/QueryPanel.tsx",
    "content": "import FeedbackButton from \"@modules/commonActionButtons/FeedbackButton\";\nimport { Stack } from \"@uicore\";\nimport HelpButton from \"./components/help/HelpButton\";\nimport ClearResultsButton from \"./components/clearResultsButton/ClearResultsButton\";\nimport useQueryPanelListeners from \"./useQueryPanelListeners\";\nimport QueryPanelTitle from \"./components/QueryPanelContents/QueryPanelTitle\";\nimport QueryPanelContent from \"./components/QueryPanelContents/QueryPanelContent\";\nimport { useEffect } from \"react\";\nimport classes from \"./querypanel.module.scss\";\nimport { QueryPanelTitleTabState } from \"./components/QueryPanelContents/types\";\nimport useQueryPanelState from \"./useQueryPanelState\";\nimport { useQueryPanelDispatch } from \"./QueryPanelProvider\";\nimport { setTabState } from \"./context/queryPanelSlice\";\nimport ShowInTabButton from \"./components/openInTabButton/OpenInTabButton\";\nimport RunAdhocQueryButton from \"./components/runAdhocQueryButton/RunAdhocQueryButton\";\nimport { QueryPanelViewType } from \"./context/types\";\nimport NewNotebookButton from \"./components/runAdhocQueryButton/NewNotebook\";\nimport QueryLimit from \"./components/queryLimit/QueryLimit\";\n\nconst QueryPanel = (): JSX.Element => {\n  const { tabState, viewType } = useQueryPanelState();\n  const dispatch = useQueryPanelDispatch();\n  const { loading } = useQueryPanelListeners();\n\n  useEffect(() => {\n    if (loading) {\n      dispatch(setTabState(QueryPanelTitleTabState.Preview));\n    }\n  }, [loading]);\n\n  const changeTabState = (state: QueryPanelTitleTabState) => {\n    dispatch(setTabState(state));\n  };\n\n  return (\n    <div className={classes.queryPanel}>\n      <Stack className=\"mb-2 justify-content-between\">\n        <Stack direction=\"column\" style={{ flex: 1 }}>\n          <QueryPanelTitle tabState={tabState} setTabState={changeTabState} />\n        </Stack>\n        <Stack>\n          {viewType === QueryPanelViewType.DEFAULT && (\n            <>\n              <QueryLimit />\n              <NewNotebookButton />\n              <RunAdhocQueryButton />\n              <ClearResultsButton />\n              <ShowInTabButton />\n            </>\n          )}\n          <HelpButton />\n          <FeedbackButton url=\"https://form.jotform.com/251106305895153\" />\n        </Stack>\n      </Stack>\n      <div style={{ flex: 1, maxHeight: \"calc(100% - 40px)\" }}>\n        <QueryPanelContent tabState={tabState} />\n      </div>\n    </div>\n  );\n};\n\nexport default QueryPanel;\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/QueryPanelDefaultView.tsx",
    "content": "import { Stack } from \"@uicore\";\nimport HelpContent from \"./components/help/HelpContent\";\n\nconst QueryPanelDefaultView = (): JSX.Element => {\n  return (\n    <Stack style={{ gap: 30, paddingTop: \"1rem\" }}>\n      <HelpContent />\n    </Stack>\n  );\n};\n\nexport default QueryPanelDefaultView;\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/QueryPanelProvider.tsx",
    "content": "import { createContext, useContext, useMemo, useReducer } from \"react\";\nimport QueryPanel from \"./QueryPanel\";\nimport { QueryPanelStateProps } from \"./context/types\";\nimport { UnknownAction } from \"@reduxjs/toolkit\";\nimport queryPanelSlice from \"./context/queryPanelSlice\";\n\ninterface ContextProps {\n  state: QueryPanelStateProps;\n  dispatch: React.Dispatch<UnknownAction>;\n}\n\nexport const QueryPanelContext = createContext<ContextProps>({\n  state: queryPanelSlice.getInitialState(),\n  dispatch: () => null,\n});\n\nconst QueryPanelProvider = (): JSX.Element => {\n  const [state, dispatch] = useReducer(\n    queryPanelSlice.reducer,\n    queryPanelSlice.getInitialState(),\n  );\n\n  const values = useMemo(\n    () => ({\n      state,\n      dispatch,\n    }),\n    [state, dispatch],\n  );\n\n  return (\n    <QueryPanelContext.Provider value={values}>\n      <QueryPanel />\n    </QueryPanelContext.Provider>\n  );\n};\n\nexport default QueryPanelProvider;\n\nexport const useQueryPanelDispatch = (): React.Dispatch<UnknownAction> => {\n  const { dispatch } = useContext(QueryPanelContext);\n  return dispatch;\n};\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/QueryPanelContents/QueryPanelContent.tsx",
    "content": "import QueryPanelDefaultView from \"@modules/queryPanel/QueryPanelDefaultView\";\nimport useQueryPanelState from \"@modules/queryPanel/useQueryPanelState\";\nimport QueryPanelLoader from \"./QueryPanelLoader\";\nimport PerspectiveViewer from \"../perspective/PerspectiveViewer\";\nimport QueryPanelError from \"./QueryPanelError\";\nimport { CodeBlock } from \"@uicore\";\nimport PreTag from \"@modules/markdown/PreTag\";\nimport { QueryPanelTitleTabState } from \"./types\";\nimport QueryPanelHistory from \"../queryPanelQueryHistory/QueryPanelHistory\";\nimport QueryPanelBookmarks from \"../queryPanelBookmarks/QueryPanelBookmarks\";\nimport PerspectiveErrorBoundary from \"../perspective/PerspectiveErrorBoundary\";\n\nconst QueryPanelContent = ({\n  tabState,\n}: {\n  tabState: QueryPanelTitleTabState;\n}): JSX.Element | null => {\n  const { loading, hasError, queryResults, compiledCodeMarkup } =\n    useQueryPanelState();\n\n  if (QueryPanelTitleTabState.Bookmarks === tabState) {\n    return <QueryPanelBookmarks />;\n  }\n\n  if (QueryPanelTitleTabState.QueryHistory === tabState) {\n    return <QueryPanelHistory />;\n  }\n\n  if (QueryPanelTitleTabState.Sql === tabState && compiledCodeMarkup) {\n    return (\n      <div style={{ width: \"fit-content\" }}>\n        <PreTag text={compiledCodeMarkup}>\n          <CodeBlock code={compiledCodeMarkup} language=\"sql\" showLineNumbers/>\n        </PreTag>\n      </div>\n    );\n  }\n\n  if (loading) {\n    return <QueryPanelLoader />;\n  }\n\n  if (queryResults) {\n    return (\n    <PerspectiveErrorBoundary>\n      <PerspectiveViewer\n        data={queryResults.data}\n        columnNames={queryResults.columnNames}\n        columnTypes={queryResults.columnTypes}\n      />\n    </PerspectiveErrorBoundary>\n    );\n  }\n\n  if (hasError) {\n    return <QueryPanelError />;\n  }\n\n  return <QueryPanelDefaultView />;\n};\n\nexport default QueryPanelContent;\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/QueryPanelContents/QueryPanelError.tsx",
    "content": "import { SparkleIcon } from \"@assets/icons\";\nimport { executeRequestInAsync } from \"@modules/app/requestExecutor\";\nimport PreTag from \"@modules/markdown/PreTag\";\nimport useQueryPanelState from \"@modules/queryPanel/useQueryPanelState\";\nimport { Button, CodeBlock, Stack } from \"@uicore\";\n\nconst QueryPanelError = (): JSX.Element => {\n  const { queryResultsError, compiledCodeMarkup, activeEditor } =\n    useQueryPanelState();\n\n  const handleTroubleshoot = () => {\n    executeRequestInAsync(\"troubleshootWithAltimate\", {\n      compiledSql: compiledCodeMarkup ?? \"\",\n      rawSql: activeEditor?.query ?? \"\",\n      errorMessage: queryResultsError?.message ?? \"\",\n      fileName: activeEditor?.filepath?.split(/[\\\\/]/).pop(),\n    });\n  };\n\n  return (\n    <div>\n      <h3 style={{ color: \"var(--action-red\" }}>\n        {queryResultsError?.message?.split(/\\r?\\n/)[0] ?? \"Error\"}\n      </h3>\n      <h4>\n        {queryResultsError?.message?.split(/\\r?\\n/).slice(1).join(\" \") ?? \"\"}\n      </h4>\n      <Stack className=\"mt-2 mb-2\">\n        <Button\n          outline\n          onClick={handleTroubleshoot}\n          icon={<SparkleIcon />}\n          showTextAlways\n        >\n          Troubleshoot with Altimate Code\n        </Button>\n      </Stack>\n      <details>\n        <summary>View Detailed Error 🚨</summary>\n        <div style={{ width: \"fit-content\", maxWidth: \"90%\" }}>\n          <PreTag text={JSON.stringify(queryResultsError, null, 2)}>\n            <CodeBlock\n              code={JSON.stringify(queryResultsError, null, 2)}\n              language=\"javascript\"\n            />\n          </PreTag>\n        </div>\n      </details>\n    </div>\n  );\n};\n\nexport default QueryPanelError;\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/QueryPanelContents/QueryPanelLoader.tsx",
    "content": "import { LoadingSpinner } from \"@assets/icons\";\nimport { HINTS } from \"@modules/queryPanel/constants\";\nimport useQueryPanelState from \"@modules/queryPanel/useQueryPanelState\";\nimport { Button, Stack } from \"@uicore\";\nimport classes from \"../../querypanel.module.scss\";\nimport { executeRequestInAsync } from \"@modules/app/requestExecutor\";\n\nconst QueryPanelLoader = (): JSX.Element => {\n  const { hintIndex } = useQueryPanelState();\n  const hint = HINTS[hintIndex];\n  const handleCancelQuery = () => {\n    executeRequestInAsync(\"cancelQuery\", {});\n  };\n\n  return (\n    <Stack\n      direction=\"column\"\n      className={classes.loader}\n      title=\"Query results loader\"\n    >\n      <LoadingSpinner />\n      {hint ? (\n        <div>\n          {hint.message} <a href={hint.link}>Docs</a>\n        </div>\n      ) : null}\n      <Button color=\"primary\" onClick={handleCancelQuery}>\n        Cancel query\n      </Button>\n    </Stack>\n  );\n};\n\nexport default QueryPanelLoader;\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/QueryPanelContents/QueryPanelTitle.tsx",
    "content": "import useQueryPanelState from \"@modules/queryPanel/useQueryPanelState\";\nimport { Nav, NavItem, NavLink } from \"@uicore\";\nimport { QueryPanelTitleTabState } from \"./types\";\nimport { useMemo } from \"react\";\nimport { QueryPanelViewType } from \"@modules/queryPanel/context/types\";\nimport NewFeatureIndicator from \"@modules/newFeature/NewFeatureIndicator\";\n\nconst QueryPanelTitle = ({\n  setTabState,\n  tabState,\n}: {\n  setTabState: (show: QueryPanelTitleTabState) => void;\n  tabState: QueryPanelTitleTabState;\n}): JSX.Element => {\n  const {\n    loading,\n    hasData,\n    hasError,\n    queryExecutionInfo,\n    compiledCodeMarkup,\n    queryResultsRowCount,\n    queryHistoryDisabled,\n    viewType,\n  } = useQueryPanelState();\n\n  const toggleTabState = (state: QueryPanelTitleTabState) => {\n    setTabState(state);\n  };\n\n  const commonTabs = useMemo(\n    () =>\n      !queryHistoryDisabled && viewType === QueryPanelViewType.DEFAULT ? (\n        <>\n          <NavItem>\n            <NewFeatureIndicator featureKey=\"query-results-history-clicked\">\n              <NavLink\n                active={QueryPanelTitleTabState.QueryHistory === tabState}\n                onClick={() =>\n                  toggleTabState(QueryPanelTitleTabState.QueryHistory)\n                }\n              >\n                History\n              </NavLink>\n            </NewFeatureIndicator>\n          </NavItem>\n          <NavItem>\n            <NewFeatureIndicator featureKey=\"query-results-bookmarks-clicked\">\n              <NavLink\n                active={QueryPanelTitleTabState.Bookmarks === tabState}\n                onClick={() =>\n                  toggleTabState(QueryPanelTitleTabState.Bookmarks)\n                }\n              >\n                Bookmarks\n              </NavLink>\n            </NewFeatureIndicator>\n          </NavItem>\n        </>\n      ) : null,\n    [queryHistoryDisabled, tabState, viewType],\n  );\n\n  if (loading || hasData || hasError) {\n    return (\n      <Nav>\n        <NavItem>\n          <NavLink\n            active={QueryPanelTitleTabState.Preview === tabState}\n            onClick={() => toggleTabState(QueryPanelTitleTabState.Preview)}\n          >\n            Preview{\" \"}\n            <span>\n              {queryResultsRowCount} rows in {queryExecutionInfo?.elapsedTime}s\n            </span>\n          </NavLink>\n        </NavItem>\n        {compiledCodeMarkup ? (\n          <NavItem>\n            <NavLink\n              active={QueryPanelTitleTabState.Sql === tabState}\n              onClick={() => toggleTabState(QueryPanelTitleTabState.Sql)}\n            >\n              SQL\n            </NavLink>\n          </NavItem>\n        ) : null}\n        {commonTabs}\n      </Nav>\n    );\n  }\n\n  return (\n    <Nav>\n      <NavItem>\n        <NavLink\n          active={QueryPanelTitleTabState.Preview === tabState}\n          onClick={() => toggleTabState(QueryPanelTitleTabState.Preview)}\n        >\n          Welcome 🚀\n        </NavLink>\n      </NavItem>\n      {commonTabs}\n    </Nav>\n  );\n};\n\nexport default QueryPanelTitle;\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/QueryPanelContents/types.ts",
    "content": "export enum QueryPanelTitleTabState {\n  Preview,\n  Sql,\n  QueryHistory,\n  Bookmarks,\n}\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/clearResultsButton/ClearResultsButton.tsx",
    "content": "import { CloseIcon } from \"@assets/icons\";\nimport { useQueryPanelDispatch } from \"@modules/queryPanel/QueryPanelProvider\";\nimport { resetData } from \"@modules/queryPanel/context/queryPanelSlice\";\nimport useQueryPanelState from \"@modules/queryPanel/useQueryPanelState\";\nimport { Button } from \"@uicore\";\n\nconst ClearResultsButton = (): JSX.Element | null => {\n  const { queryResults } = useQueryPanelState();\n  const dispatch = useQueryPanelDispatch();\n  const handleClear = () => {\n    dispatch(resetData());\n  };\n  if (!queryResults) {\n    return null;\n  }\n  return (\n    <Button outline onClick={handleClear} icon={<CloseIcon />}>\n      Clear results\n    </Button>\n  );\n};\n\nexport default ClearResultsButton;\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/filters/Filters.tsx",
    "content": "import { FilterIcon, SearchIcon } from \"@assets/icons\";\nimport { IconButton, Input, OptionType, Select, Stack } from \"@uicore\";\nimport { ChangeEvent, MouseEvent, useEffect, useState } from \"react\";\nimport { ActionMeta } from \"react-select\";\nimport { useDebounce } from \"use-debounce\";\nimport styles from \"../../querypanel.module.scss\";\n\nexport interface QueryFilters {\n  tags: string[];\n  searchQuery?: string;\n}\n\ninterface Props {\n  tags: string[];\n  filters: QueryFilters;\n  onFiltersChange: (data: { tags?: string[]; searchQuery?: string }) => void;\n}\nconst Filters = ({\n  filters: { tags: selectedTags, searchQuery },\n  tags,\n  onFiltersChange,\n}: Props): JSX.Element | null => {\n  const [text, setText] = useState(\"\");\n  const [showForm, setShowForm] = useState(false);\n  const [showSearch, setShowSearch] = useState(false);\n  const [value] = useDebounce(text, 1000);\n\n  const stopPropagation = (e: MouseEvent) => {\n    e.stopPropagation();\n    e.preventDefault();\n  };\n\n  useEffect(() => {\n    if (value === searchQuery) {\n      return;\n    }\n    onFiltersChange({ searchQuery: value });\n  }, [value]);\n\n  const handleSearchQueryChange = (e: ChangeEvent<HTMLInputElement>) => {\n    setText(e.target.value);\n  };\n\n  const handleBlur = () => {\n    if (searchQuery) {\n      return;\n    }\n    setShowSearch(false);\n  };\n\n  const handleTagsBlur = () => {\n    if (selectedTags.length) {\n      return;\n    }\n    setShowForm(false);\n  };\n\n  const handleTagsChange = (\n    changedTags: unknown,\n    triggeredAction: ActionMeta<unknown>,\n  ) => {\n    if (triggeredAction.action === \"clear\") {\n      setShowForm(false);\n    }\n    onFiltersChange({\n      tags: (changedTags as OptionType[]).map((tag) => tag.value),\n    });\n  };\n\n  return (\n    <Stack className=\"gap-1\" onClick={stopPropagation}>\n      {showSearch ? (\n        <Input\n          type=\"search\"\n          placeholder=\"Search query\"\n          onChange={handleSearchQueryChange}\n          onBlur={handleBlur}\n          autoFocus\n          style={{ marginBottom: 4.5, maxHeight: 38 }}\n          className={styles.searchInput}\n        />\n      ) : (\n        <IconButton title=\"Search query\" onClick={() => setShowSearch(true)}>\n          <SearchIcon />\n        </IconButton>\n      )}\n      {showForm ? (\n        <Select\n          closeMenuOnSelect={false}\n          components={{ DropdownIndicator: null }}\n          styles={{\n            container: (s) => ({\n              ...s,\n              minWidth: 200,\n              marginBottom: \"1rem\",\n            }),\n          }}\n          autoFocus\n          inputId=\"tags\"\n          openMenuOnFocus\n          isMulti\n          options={tags?.map((v) => ({ label: v, value: v })) ?? []}\n          onChange={handleTagsChange}\n          onBlur={handleTagsBlur}\n        />\n      ) : tags.length ? (\n        <IconButton title=\"Search query\" onClick={() => setShowForm(true)}>\n          <FilterIcon />\n        </IconButton>\n      ) : null}\n    </Stack>\n  );\n};\n\nexport default Filters;\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/help/HelpButton.tsx",
    "content": "import { HelpIcon } from \"@assets/icons\";\nimport { Drawer } from \"@uicore\";\nimport HelpContent from \"./HelpContent\";\n\nconst HelpButton = (): JSX.Element => {\n  return (\n    <Drawer\n      buttonProps={{ outline: true }}\n      buttonText=\"Help\"\n      icon={<HelpIcon />}\n      title=\"Help\"\n    >\n      <HelpContent />\n    </Drawer>\n  );\n};\n\nexport default HelpButton;\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/help/HelpContent.tsx",
    "content": "import { executeRequestInAsync } from \"@modules/app/requestExecutor\";\nimport { Button } from \"@uicore\";\n\nconst DOCS_URL = \"https://docs.myaltimate.com/teammates/altimate-code/\";\n\nconst HelpContent = (): JSX.Element => {\n  const openChat = () => {\n    executeRequestInAsync(\"openAltimateCodeChat\", {});\n  };\n\n  const openDocs = () => {\n    executeRequestInAsync(\"openUrl\", { url: DOCS_URL });\n  };\n\n  return (\n    <div style={{ maxWidth: 640 }}>\n      <p style={{ fontSize: 13, lineHeight: 1.55, marginBottom: \"0.75rem\" }}>\n        We recently launched <strong>Altimate Code</strong> — chat with it right\n        inside VS Code.\n      </p>\n      <div style={{ display: \"flex\", gap: \"0.5rem\", marginBottom: \"0.75rem\" }}>\n        <Button color=\"primary\" onClick={openChat}>\n          Open chat\n        </Button>\n        <Button color=\"secondary\" onClick={openDocs}>\n          Learn More\n        </Button>\n      </div>\n      <p style={{ fontSize: 12, opacity: 0.75, margin: 0 }}>\n        #1 on ADE-Bench · 10M free tokens across GPT-5.4, Opus 4.6 &amp; Sonnet\n        4.6.\n      </p>\n    </div>\n  );\n};\n\nexport default HelpContent;\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/openInTabButton/OpenInTabButton.tsx",
    "content": "import { OpenNewIcon } from \"@assets/icons\";\nimport { executeRequestInAsync } from \"@modules/app/requestExecutor\";\nimport NewFeatureIndicator from \"@modules/newFeature/NewFeatureIndicator\";\nimport useQueryPanelState from \"@modules/queryPanel/useQueryPanelState\";\nimport { Button } from \"@uicore\";\n\nconst OpenInTabButton = (): JSX.Element | null => {\n  const queryTabData = useQueryPanelState();\n  const handleClick = () => {\n    executeRequestInAsync(\"queryResultTab:render\", { queryTabData });\n  };\n  if (!queryTabData?.queryResults) {\n    return null;\n  }\n  return (\n    <NewFeatureIndicator featureKey=\"open-query-results-in-tab-clicked\">\n      <Button outline onClick={handleClick} icon={<OpenNewIcon />}>\n        Open in Tab\n      </Button>\n    </NewFeatureIndicator>\n  );\n};\n\nexport default OpenInTabButton;\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/perspective/PerspectiveErrorBoundary.tsx",
    "content": "import { ErrorIcon } from \"@assets/icons\";\nimport { executeRequestInSync } from \"@modules/app/requestExecutor\";\nimport { setLoading } from \"@modules/queryPanel/context/queryPanelSlice\";\nimport { useQueryPanelDispatch } from \"@modules/queryPanel/QueryPanelProvider\";\nimport { Stack, Button } from \"@uicore\";\nimport { ReactNode, useState } from \"react\";\nimport { ErrorBoundary } from \"react-error-boundary\";\n\nconst PerspectiveErrorBoundary = ({\n  children,\n}: {\n  children: ReactNode;\n}): JSX.Element => {\n  const [error, setError] = useState<Error | undefined>();\n  const dispatch = useQueryPanelDispatch();\n\n  const handleClick = async () => {\n    dispatch(setLoading(true));\n    try {\n      await executeRequestInSync(\"clearQueryHistory\", { error });\n      // Artificial delay for UX\n      await new Promise((resolve) => setTimeout(resolve, 1000));\n    } finally {\n      dispatch(setLoading(false));\n    }\n  };\n\n  const handleOnError = (errorObject: Error) => {\n    setError({\n      message: errorObject.message,\n      stack: errorObject.stack,\n      name: errorObject.name,\n    });\n  };\n\n  const fallbackRenderer = () => {\n    return (\n      <Stack\n        direction=\"column\"\n        className=\"justify-content-center align-items-center h-100\"\n      >\n        <ErrorIcon style={{ minHeight: 75 }} />\n        <h2 style={{ color: \"var(--stroke--orange)\" }}>\n          Something went wrong while rendering the query results.\n        </h2>\n        <p>To clear query history and re render the results</p>\n        <Button color=\"primary\" onClick={handleClick}>\n          Click here\n        </Button>\n        <p>\n          Please <a href=\"https://app.myaltimate.com/contactus\">contact us</a>{\" \"}\n          if the issue persists.\n        </p>\n      </Stack>\n    );\n  };\n\n  return (\n    <ErrorBoundary fallbackRender={fallbackRenderer} onError={handleOnError}>\n      {children}\n    </ErrorBoundary>\n  );\n};\n\nexport default PerspectiveErrorBoundary;\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/perspective/PerspectivePlugins.ts",
    "content": "import type { Schema } from \"@finos/perspective\";\nimport { executeRequestInAsync } from \"@modules/app/requestExecutor\";\nimport { panelLogger } from \"@modules/logger\";\nimport OpenIcon from \"./openIcon.svg?raw\";\n\n// Dispatches a custom event with the given event name and message\nfunction dispatchCustomEvent(\n  eventName: string,\n  message: string,\n  columnName: string,\n  type: string,\n) {\n  const event = new CustomEvent(eventName, {\n    detail: { columnName, message, type },\n  });\n  window.dispatchEvent(event);\n}\n\n// Checks if the given string is a valid JSON\nconst isJson = (str: string) => {\n  try {\n    const parsedAssumingJson: unknown = JSON.parse(str);\n    return (\n      typeof parsedAssumingJson === \"object\" && parsedAssumingJson !== null\n    );\n  } catch (e) {\n    return false;\n  }\n};\n\n// Appends an image to the td element\nfunction appendImage(tdArg: HTMLTableCellElement) {\n  const td = tdArg;\n  if (!td.querySelector(\"span\")) {\n    // Adding svg icon to the span element\n    const span = document.createElement(\"span\");\n\n    // Adding class to the elements\n    span.classList.add(\"open-icon\");\n\n    span.innerHTML = OpenIcon;\n    span.title = \"Click to view complete value\";\n    td.appendChild(span);\n  }\n}\n\n// Removes the image and click event from the td element\nfunction removeImageAndClickEvent(tdArg: HTMLTableCellElement) {\n  const td = tdArg;\n  const span = td.querySelector(\"span\");\n  if (span) {\n    span.remove();\n  }\n  td.style.cursor = \"\";\n  td.onclick = null;\n}\n\n// Adds click event to the td element\nfunction makeClickEvent(\n  tdArg: HTMLTableCellElement,\n  metadata: TableCellMetadata,\n) {\n  const td = tdArg;\n\n  const columnName = metadata.column_header;\n  if (isJson(metadata.value)) {\n    appendImage(td);\n    td.style.cursor = \"pointer\";\n    // If string is a valid JSON, add click event to view JSON\n    td.onclick = () => {\n      dispatchCustomEvent(\n        \"string-json-viewer\",\n        metadata.value,\n        columnName,\n        \"json\",\n      );\n    };\n    return;\n  }\n\n  if (td.offsetWidth < 11 * metadata.value.length) {\n    td.style.cursor = \"pointer\";\n    appendImage(td);\n    // else if string is greater than 20, add click event to view full string\n    td.onclick = () => {\n      dispatchCustomEvent(\n        \"string-json-viewer\",\n        metadata.value,\n        columnName,\n        \"string\",\n      );\n    };\n    return;\n  }\n\n  removeImageAndClickEvent(td);\n}\n\n// Custom perspective plugin to add click event to the td element\nclass PerspectiveDatagridJSONViewerPlugin extends (customElements.get(\n  \"perspective-viewer-datagrid\",\n) as unknown as typeof HTMLPerspectiveViewerDatagridPluginElement) {\n  private readonly pluginName = \"PerspectiveDatagridJSONViewerPlugin\";\n  private view?: PerspectiveViewerView;\n  private dirty?: boolean;\n  private customInitialized?: boolean;\n  private tableSchema?: Schema;\n  private schema?: Schema;\n  private columnPaths?: string[];\n  private groupBy?: string[];\n\n  get name() {\n    return this.pluginName;\n  }\n\n  getType(metadata: TableCellMetadata) {\n    if (!this.columnPaths) {\n      return;\n    }\n    // This function returns the data type of the cell\n    if (this.schema && metadata.x >= 0) {\n      const columnPath = this.columnPaths[metadata.x];\n      const columnPathParts = columnPath.split(\"|\");\n      return this.schema[columnPathParts[columnPathParts.length - 1]];\n    }\n    const columnPath = this.groupBy?.[metadata.row_header_x - 1];\n    return columnPath ? this.tableSchema?.[columnPath] : undefined;\n  }\n\n  async styleListener() {\n    try {\n      const datagrid = this.regular_table;\n      if (this.dirty) {\n        await this.refresh_cache();\n      }\n\n      for (const td of datagrid.querySelectorAll(\"td\")) {\n        const metadata = datagrid.getMeta(td);\n        const type = this.getType(metadata);\n\n        if (type === \"string\") {\n          makeClickEvent(td, metadata);\n        }\n      }\n    } catch (e) {\n      panelLogger.error(\"Failed to add click event to td element:\", e);\n      executeRequestInAsync(\"error\", {\n        text:\n          \"Failed to add click event to td element. \" + (e as Error).message,\n      });\n    }\n  }\n\n  async refresh_cache() {\n    try {\n      const view = this.view;\n      if (!view) {\n        return;\n      }\n      this.columnPaths = await view.column_paths();\n      this.groupBy = (await view.get_config()).group_by;\n      this.schema = await view.schema();\n      this.dirty = false;\n    } catch (e) {\n      panelLogger.error(\"Failed to refresh cache:\", e);\n      executeRequestInAsync(\"error\", {\n        text: \"Failed to refresh cache. \" + (e as Error).message,\n      });\n    }\n  }\n\n  async activate(view: PerspectiveViewerView) {\n    await super.activate(view);\n    this.view = view;\n    this.dirty = true;\n    if (!this.customInitialized) {\n      const viewer = this.parentElement;\n      const datagrid = this.regular_table;\n      await this.refresh_cache();\n      const table = await viewer?.getTable(true);\n      this.tableSchema = await table.schema();\n      viewer.addEventListener(\"perspective-config-update\", () => {\n        this.dirty = true;\n      });\n\n      this.customInitialized = true;\n      datagrid.addStyleListener(this.styleListener.bind(this));\n    }\n  }\n}\n\ncustomElements.define(\n  \"perspective-datagrid-json-viewer-plugin\",\n  PerspectiveDatagridJSONViewerPlugin as unknown as CustomElementConstructor,\n);\n\nvoid customElements\n  .get(\"perspective-viewer\")\n  .registerPlugin(\"perspective-datagrid-json-viewer-plugin\");\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/perspective/PerspectiveViewer.stories.tsx",
    "content": "import type { Meta } from \"@storybook/react\";\nimport PerspectiveViewer from \"./PerspectiveViewer\";\nimport { TableData } from \"@finos/perspective\";\nimport PerspectiveErrorBoundary from \"./PerspectiveErrorBoundary\";\n\nconst meta = {\n  title: \"PerspectiveViewer\",\n  parameters: {\n    layout: \"padded\",\n  },\n  tags: [\"autodocs\"],\n  argTypes: {\n    backgroundColor: { control: \"color\" },\n  },\n} satisfies Meta;\n\nexport default meta;\n\nexport const DefaultPerspectiveViewerView = {\n  render: (): JSX.Element => {\n    return (\n    <PerspectiveErrorBoundary>\n\n      <PerspectiveViewer\n        columnNames={[\n          \"customer_id\",\n          \"first_name\",\n          \"last_name\",\n          \"first_order\",\n          \"most_recent_order\",\n          \"number_of_orders\",\n          \"customer_lifetime_value\",\n        ]}\n        columnTypes={[\n          \"Integer\",\n          \"Text\",\n          \"Text\",\n          \"Date\",\n          \"Date\",\n          \"Integer\",\n          \"Number\",\n        ]}\n        data={\n          [\n            {\n              customer_id: 1,\n              first_name: '{\"first_name\": \"John\", \"last_name\": \"P.\"}',\n              last_name: \"P.\",\n              first_order: \"2018-01-01\",\n              most_recent_order: \"2018-02-10\",\n              number_of_orders: 2,\n              customer_lifetime_value: 33,\n            },\n            {\n              customer_id: 2,\n              first_name: '{\"first_name\": \"John\", \"last_name\": \"P',\n              last_name: \"M.\",\n              first_order: \"2018-01-11\",\n              most_recent_order: \"2018-01-11\",\n              number_of_orders: 1,\n              customer_lifetime_value: 23,\n            },\n            {\n              customer_id: 3,\n              first_name: \"\",\n              last_name: \"P.\",\n              first_order: \"2018-01-02\",\n              most_recent_order: \"2018-03-11\",\n              number_of_orders: 3,\n              customer_lifetime_value: 65,\n            },\n            {\n              customer_id: 6,\n              first_name:\n                '[\"Hello, world!\",\"🌟\",\"🚀\",\"😊\",\"🍕\",\"❤️\",\"📚\",\"🎉\",\"🌍\",\"✨\",\"💡\",\"🔥\",\"🕺\",\"💻\",\"🎵\",\"🎨\",\"⚽\",\"🎮\",\"🧩\",\"🖼️\",\"🧠\"]',\n              last_name:\n                '[\"Hello, world!\",\"🌟\",\"🚀\",\"😊\",\"🍕\",\"❤️\",\"📚\",\"🎉\",\"🌍\",\"✨\",\"💡\",\"🔥\",\"🕺\",\"💻\",\"🎵\",\"🎨\",\"⚽\",\"🎮\",\"🧩\",\"🖼️\",\"🧠\"]',\n              first_order: \"2018-02-19\",\n              most_recent_order: \"2018-02-19\",\n              number_of_orders: 1,\n              customer_lifetime_value: 8,\n            },\n            {\n              customer_id: 7,\n              first_name:\n                \"MartinMartinMartinMartinMartinMartinMartinMartinMartinMartinMartinMartinMartinMartinMartin\",\n              last_name: '{\"last_name\": { \"last_name\": \"R.\"}}',\n              first_order: \"2018-01-14\",\n              most_recent_order: \"2018-01-14\",\n              number_of_orders: 1,\n              customer_lifetime_value: 26,\n            },\n            {\n              customer_id: 8,\n              first_name: \"{}\",\n              last_name: \"R.\",\n              first_order: \"2018-01-29\",\n              most_recent_order: \"2018-03-12\",\n              number_of_orders: 2,\n              customer_lifetime_value: 45,\n            },\n            {\n              customer_id: 9,\n              first_name: \"Jennifer\",\n              last_name: \"F.\",\n              first_order: \"2018-03-17\",\n              most_recent_order: \"2018-03-17\",\n              number_of_orders: 1,\n              customer_lifetime_value: 30,\n            },\n            {\n              customer_id: 11,\n              first_name: \"Fred\",\n              last_name: \"S.\",\n              first_order: \"2018-03-23\",\n              most_recent_order: \"2018-03-23\",\n              number_of_orders: 1,\n              customer_lifetime_value: 3,\n            },\n            {\n              customer_id: 12,\n              first_name: \"Amy\",\n              last_name: \"D.\",\n              first_order: \"2018-03-03\",\n              most_recent_order: \"2018-03-03\",\n              number_of_orders: 1,\n              customer_lifetime_value: 4,\n            },\n            {\n              customer_id: 13,\n              first_name: \"Kathleen\",\n              last_name: \"M.\",\n              first_order: \"2018-03-07\",\n              most_recent_order: \"2018-03-07\",\n              number_of_orders: 1,\n              customer_lifetime_value: 26,\n            },\n            {\n              customer_id: 16,\n              first_name: \"Amanda\",\n              last_name: \"H.\",\n              first_order: \"2018-02-02\",\n              most_recent_order: \"2018-02-02\",\n              number_of_orders: 1,\n              customer_lifetime_value: 12,\n            },\n            {\n              customer_id: 18,\n              first_name: \"Johnny\",\n              last_name: \"K.\",\n              first_order: \"2018-02-27\",\n              most_recent_order: \"2018-02-27\",\n              number_of_orders: 1,\n              customer_lifetime_value: 29,\n            },\n            {\n              customer_id: 19,\n              first_name: \"Virginia\",\n              last_name: \"F.\",\n              first_order: \"2018-03-16\",\n              most_recent_order: \"2018-03-16\",\n              number_of_orders: 1,\n              customer_lifetime_value: 3,\n            },\n            {\n              customer_id: 20,\n              first_name: \"Anna\",\n              last_name: \"A.\",\n              first_order: \"2018-01-23\",\n              most_recent_order: \"2018-01-23\",\n              number_of_orders: 1,\n              customer_lifetime_value: 15,\n            },\n            {\n              customer_id: 21,\n              first_name: \"Willie\",\n              last_name: \"H.\",\n              first_order: \"2018-03-28\",\n              most_recent_order: \"2018-03-28\",\n              number_of_orders: 1,\n              customer_lifetime_value: 22,\n            },\n            {\n              customer_id: 22,\n              first_name: \"Sean\",\n              last_name: \"H.\",\n              first_order: \"2018-01-26\",\n              most_recent_order: \"2018-03-01\",\n              number_of_orders: 3,\n              customer_lifetime_value: 52,\n            },\n            {\n              customer_id: 25,\n              first_name: \"Victor\",\n              last_name: \"H.\",\n              first_order: \"2018-01-17\",\n              most_recent_order: \"2018-03-20\",\n              number_of_orders: 2,\n              customer_lifetime_value: 24,\n            },\n            {\n              customer_id: 26,\n              first_name: \"Aaron\",\n              last_name: \"R.\",\n              first_order: \"2018-02-11\",\n              most_recent_order: \"2018-03-08\",\n              number_of_orders: 2,\n              customer_lifetime_value: 8,\n            },\n            {\n              customer_id: 27,\n              first_name: \"Benjamin\",\n              last_name: \"B.\",\n              first_order: \"2018-02-21\",\n              most_recent_order: \"2018-04-04\",\n              number_of_orders: 2,\n              customer_lifetime_value: 27,\n            },\n            {\n              customer_id: 28,\n              first_name: \"Lisa\",\n              last_name: \"W.\",\n              first_order: \"2018-02-04\",\n              most_recent_order: \"2018-02-04\",\n              number_of_orders: 1,\n              customer_lifetime_value: 3,\n            },\n            {\n              customer_id: 30,\n              first_name: \"Christina\",\n              last_name: \"W.\",\n              first_order: \"2018-03-02\",\n              most_recent_order: \"2018-03-14\",\n              number_of_orders: 2,\n              customer_lifetime_value: 57,\n            },\n            {\n              customer_id: 31,\n              first_name: \"Jane\",\n              last_name: \"G.\",\n              first_order: \"2018-02-17\",\n              most_recent_order: \"2018-02-17\",\n              number_of_orders: 1,\n              customer_lifetime_value: 18,\n            },\n          ] as unknown as TableData\n        }\n      />\n    </PerspectiveErrorBoundary>\n    );\n  },\n};\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/perspective/PerspectiveViewer.tsx",
    "content": "import perspective, { TableData } from \"@finos/perspective\";\nimport \"@finos/perspective-viewer\";\nimport {\n  HTMLPerspectiveViewerElement,\n  PerspectiveViewerConfig,\n} from \"@finos/perspective-viewer\";\nimport \"@finos/perspective-viewer-d3fc\";\nimport \"@finos/perspective-viewer-datagrid\";\nimport \"@finos/perspective-viewer/dist/css/monokai.css\";\nimport \"@finos/perspective-viewer/dist/css/pro-dark.css\";\nimport \"@finos/perspective-viewer/dist/css/pro.css\";\nimport \"@finos/perspective-viewer/dist/css/solarized-dark.css\";\nimport \"@finos/perspective-viewer/dist/css/solarized.css\";\nimport \"@finos/perspective-viewer/dist/css/vaporwave.css\";\nimport { executeRequestInAsync } from \"@modules/app/requestExecutor\";\nimport useAppContext from \"@modules/app/useAppContext\";\nimport { panelLogger } from \"@modules/logger\";\nimport { setPerspectiveTheme } from \"@modules/queryPanel/context/queryPanelSlice\";\nimport { useQueryPanelDispatch } from \"@modules/queryPanel/QueryPanelProvider\";\nimport useQueryPanelState from \"@modules/queryPanel/useQueryPanelState\";\nimport { Drawer, DrawerRef } from \"@uicore\";\nimport { CSSProperties, useEffect, useRef, useState } from \"react\";\nimport { useErrorBoundary } from \"react-error-boundary\";\nimport classes from \"./perspective.module.scss\";\nimport perspectiveStyles from \"./perspective.scss?inline\";\nimport \"./PerspectivePlugins\";\nimport \"./themes.css\";\n\ninterface Props {\n  data: TableData;\n  columnNames: string[];\n  columnTypes: string[];\n  styles?: CSSProperties;\n}\nconst PerspectiveViewer = ({\n  columnNames,\n  columnTypes,\n  data,\n  styles,\n}: Props): JSX.Element => {\n  const {\n    state: { theme },\n  } = useAppContext();\n\n  const { showBoundary } = useErrorBoundary();\n\n  const { perspectiveTheme } = useQueryPanelState();\n  const dispatch = useQueryPanelDispatch();\n  const [tableRendered, setTableRendered] = useState(false);\n  const [drawerData, setDrawerData] = useState<string>(\"\");\n  const [drawerTitle, setDrawerTitle] = useState<string>(\"\");\n  const perspectiveViewerRef = useRef<HTMLPerspectiveViewerElement>(null);\n  const drawerRef = useRef<DrawerRef | null>(null);\n\n  const config: PerspectiveViewerConfig = {\n    theme: perspectiveTheme,\n    title: \"query result\",\n    columns: [], // reset columns\n    settings: false,\n    plugin_config: { editable: false },\n  };\n\n  const mapType = (agateType: string) => {\n    switch (agateType) {\n      case \"Text\":\n        return \"string\";\n      case \"Integer\":\n        return \"float\";\n      case \"BigInteger\":\n        return \"string\";\n      case \"Number\":\n        return \"float\";\n      default:\n        // treat any unknown types as string\n        return \"string\";\n    }\n  };\n\n  // Converts the provided data to CSV format.\n  const dataToCsv = (columns: string[], rows: TableData) => {\n    if (!Array.isArray(rows)) {\n      return;\n    }\n\n    if (!rows || rows.length === 0) {\n      panelLogger.error(\"No data available to convert to CSV\");\n      return \"\";\n    }\n    const replacer = (_key: string, value: unknown) =>\n      value === null ? \"\" : value;\n    const csv = [\n      columns.join(\",\"),\n      ...rows.map((row) =>\n        columns\n          .map((fieldName) => {\n            const fieldData = row[fieldName];\n            if (fieldData && typeof fieldData === \"string\") {\n              return `\"${(fieldData as string).replace(/\"/g, '\"\"')}\"`; // escape double quotes and Wrap in double quotes\n            }\n            return JSON.stringify(fieldData, replacer);\n          })\n          .join(\",\"),\n      ),\n    ].join(\"\\r\\n\");\n    return csv;\n  };\n\n  const downloadAsCSV = () => {\n    try {\n      if (!data || !Array.isArray(data) || data.length === 0) {\n        panelLogger.error(\"No data available for downloading.\");\n        return;\n      }\n      const csvContent = dataToCsv(columnNames, data);\n      if (!csvContent) {\n        panelLogger.info(\"empty csv content\", columnNames, data);\n        return;\n      }\n      const blob = new Blob([csvContent], { type: \"text/csv\" });\n      const url = window.URL.createObjectURL(blob);\n      const a = document.createElement(\"a\");\n      a.href = url;\n      a.download = `power_user_data_${new Date().toISOString()}.csv`; // Filename with a timestamp\n      a.click();\n    } catch (error) {\n      // Log error for debugging\n      panelLogger.error(\"Failed to download CSV:\", error);\n      executeRequestInAsync(\"error\", {\n        text: \"Unable to download data as CSV. \" + (error as Error).message,\n      });\n    }\n  };\n\n  const updateCustomStyles = (currentTheme: string) => {\n    const shadowRoot = perspectiveViewerRef.current?.querySelector(\n      \"perspective-datagrid-json-viewer-plugin\",\n    )?.shadowRoot;\n    if (!shadowRoot) {\n      return;\n    }\n    const id = \"altimate-styles\";\n    shadowRoot.getElementById(id)?.remove();\n\n    const style = document.createElement(\"style\");\n    style.textContent = perspectiveStyles;\n    style.id = id;\n    shadowRoot.appendChild(style);\n    shadowRoot.querySelector(\"regular-table\")?.setAttribute(\"theme\", theme);\n    shadowRoot\n      .querySelector(\"regular-table\")\n      ?.setAttribute(\"perspective-theme\", currentTheme);\n  };\n\n  const loadPerspectiveData = async () => {\n    if (!perspectiveViewerRef.current) {\n      return;\n    }\n\n    const dataFormats = {\n      types: {\n        integer: {\n          format: {\n            useGrouping: false,\n          },\n        },\n        float: {\n          format: {\n            maximumFractionDigits: 20,\n            minimumFractionDigits: 0,\n            useGrouping: false,\n          },\n        },\n      },\n    };\n\n    const schema: Record<string, string> = {};\n    for (let i = 0; i < columnNames.length; i++) {\n      schema[columnNames[i]] = mapType(columnTypes[i]);\n    }\n    try {\n      // @ts-expect-error valid parameter\n      const worker = perspective.worker(dataFormats);\n      const table = await worker.table(schema);\n      await table.replace(data);\n\n      await perspectiveViewerRef.current.load(table);\n      await perspectiveViewerRef.current.resetThemes([\n        \"Vintage\",\n        \"Pro Light\",\n        \"Pro Dark\",\n        \"Vaporwave\",\n        \"Solarized\",\n        \"Solarized Dark\",\n        \"Monokai\",\n      ]);\n      await perspectiveViewerRef.current.restore(config);\n      const datagridShadowRoot = perspectiveViewerRef.current?.shadowRoot;\n      if (datagridShadowRoot) {\n        const exportButton = datagridShadowRoot.getElementById(\"export\");\n        if (!exportButton) {\n          return;\n        }\n        exportButton.removeEventListener(\"click\", downloadAsCSV);\n        exportButton.addEventListener(\"click\", downloadAsCSV);\n      }\n      updateCustomStyles(perspectiveTheme);\n      perspectiveViewerRef.current.addEventListener(\n        \"perspective-config-update\",\n        (event) => {\n          const ev = event as CustomEvent<PerspectiveViewerConfig>;\n          panelLogger.log(\"perspective-config-update\", ev.detail);\n          if (ev.detail.theme) {\n            updateCustomStyles(ev.detail.theme);\n            executeRequestInAsync(\"updateConfig\", {\n              perspectiveTheme: ev.detail.theme,\n            });\n            dispatch(setPerspectiveTheme(ev.detail.theme));\n          }\n        },\n      );\n    } catch (err) {\n      panelLogger.error(\"error while loading perspective data\", err);\n      // catching this error: Uncaught (in promise) RangeError: WebAssembly.instantiate(): Out of memory: Cannot allocate Wasm memory for new instance\n      const isWasmError = (err as Error)?.message?.includes(\n        \"WebAssembly.instantiate\",\n      );\n      if (isWasmError) {\n        showBoundary(err);\n      }\n    }\n    setTableRendered(true);\n  };\n\n  useEffect(() => {\n    loadPerspectiveData().catch((err) => panelLogger.error(err));\n\n    // Handle the event when a string or JSON is clicked in the perspective viewer datagrid\n    const handleOpenDrawer = (event: CustomEvent) => {\n      drawerRef.current?.open();\n      const detail = event.detail as {\n        type: string;\n        message: string;\n        columnName: string;\n      };\n      setDrawerTitle(detail?.columnName);\n      if (detail?.type === \"string\") {\n        // adding \\n after every 45 characters to make it readable\n        setDrawerData(\n          detail?.message.match(/.{1,45}/g)?.join(\"\\n\") ?? detail?.message,\n        );\n      } else if (detail?.type === \"json\") {\n        // Pretty print JSON\n        setDrawerData(JSON.stringify(JSON.parse(detail?.message), null, 2));\n      }\n    };\n\n    // Add an event listener to open the drawer when a string or JSON is clicked\n    window.addEventListener(\n      \"string-json-viewer\",\n      handleOpenDrawer as EventListener,\n    );\n\n    return () => {\n      perspectiveViewerRef.current\n        ?.getTable()\n        .then((table) => table.delete())\n        .catch((err) =>\n          panelLogger.error(\"error while deleting perspective table\", err),\n        );\n      perspectiveViewerRef.current\n        ?.delete()\n        .catch((err) =>\n          panelLogger.error(\"error while deleting perspective viewer\", err),\n        );\n\n      // Remove the event listener when the component is unmounted\n      window.removeEventListener(\n        \"string-json-viewer\",\n        handleOpenDrawer as EventListener,\n      );\n    };\n  }, []);\n\n  useEffect(() => {\n    if (!tableRendered || !config.theme || !perspectiveViewerRef.current) {\n      return;\n    }\n\n    perspectiveViewerRef.current\n      ?.querySelector(\"perspective-viewer-datagrid\")\n      ?.shadowRoot?.querySelector(\"regular-table\")\n      ?.setAttribute(\"theme\", theme);\n    perspectiveViewerRef.current\n      .restore(config)\n      .catch((err) =>\n        panelLogger.error(\"error while restoring perspective\", err),\n      );\n  }, [theme, tableRendered]);\n\n  return (\n    <>\n      <perspective-viewer\n        class={classes.altimatePerspectiveViewer}\n        ref={perspectiveViewerRef}\n        style={styles}\n      ></perspective-viewer>\n      <Drawer\n        buttonProps={{ color: \"primary\", title: \"Json Viewer\" }}\n        ref={drawerRef}\n        title={drawerTitle}\n        backdrop={false}\n      >\n        <pre>{drawerData}</pre>\n      </Drawer>\n    </>\n  );\n};\nexport default PerspectiveViewer;\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/perspective/perspective.d.ts",
    "content": "import { HTMLPerspectiveViewerDatagridPluginElement as FinosHTMLPerspectiveViewerDatagridPluginElement } from \"@finos/perspective-viewer-datagrid\";\nimport { HTMLPerspectiveViewerElement } from \"@finos/perspective-viewer\";\nimport type { Schema } from \"@finos/perspective\";\n\ndeclare global {\n  interface TableCellMetadata {\n    value: string;\n    column_header: string;\n    x: number;\n    row_header_x: number;\n  }\n\n  interface PerspectiveViewerView {\n    column_paths: () => Promise<string[]>;\n    get_config: () => Promise<{ group_by: string[] }>;\n    schema: () => Promise<Schema>;\n  }\n\n  interface CustomElementRegistry {\n    get(\n      tagName: \"perspective-viewer-datagrid\",\n    ): HTMLPerspectiveViewerDatagridPluginElement;\n  }\n\n  declare class HTMLPerspectiveViewerDatagridPluginElement extends FinosHTMLPerspectiveViewerDatagridPluginElement {\n    constructor();\n    activate(view: PerspectiveViewerView): Promise<void>;\n    regular_table: PerspectiveViewerRegularTableElement;\n    parentElement: HTMLPerspectiveViewerElement;\n  }\n\n  interface PerspectiveViewerRegularTableElement extends HTMLElement {\n    table_model: unknown;\n    addStyleListener: (listener: () => void) => void;\n    getMeta: (td: HTMLElement) => TableCellMetadata;\n  }\n}\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/perspective/perspective.module.scss",
    "content": ".altimatePerspectiveViewer {\n  height: 100%;\n  min-height: 50vh;\n  font-size: 1.25rem !important;\n  z-index: 20;\n\n  &[theme=\"Vintage\"] {\n    font-family: var(--bs-body-font-family) !important;\n    width: auto;\n    --plugin--background: var(--background--base);\n    --icon--color: var(--text-color--paragraph) !important;\n    color: var(--text-color--paragraph) !important;\n  }\n}\n\nperspective-export-menu {\n  display: none;\n}\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/perspective/perspective.scss",
    "content": "regular-table {\n  td,\n  th {\n    max-width: 200px;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    padding-right: 20px !important;\n    user-select: text;\n    cursor: text;\n\n    .open-icon {\n      margin-left: 5px;\n      color: var(--text-active);\n      position: absolute;\n      right: 5px;\n\n      svg {\n        margin-bottom: -2.5px;\n      }\n    }\n  }\n}\n\nregular-table[perspective-theme=\"Vintage\"] {\n  th {\n    font-weight: 800 !important;\n    background-color: #222;\n    color: #fff;\n    padding-bottom: 6px !important;\n    border-bottom: 3px solid #3fb449 !important;\n    padding-top: 4px !important;\n  }\n\n  &[theme=\"dark\"] {\n    th {\n      background-color: #fff;\n      color: #222;\n    }\n  }\n\n  th,\n  td {\n    font-size: 13px !important;\n  }\n\n  tbody tr::after,\n  thead tr:last-child::after {\n    width: 0px !important;\n  }\n\n  tbody {\n    td {\n      padding-top: 3px !important;\n      padding-bottom: 3px !important;\n    }\n    tr:nth-child(even) {\n      background-color: rgb(239, 239, 239);\n    }\n\n    tr:last-child td {\n      border-bottom: 1px solid var(--inactive--border-color);\n    }\n\n    tr:hover {\n      background-color: rgb(187, 187, 187);\n      cursor: pointer;\n    }\n\n    td:first-child {\n      border-left-color: var(--inactive--border-color) !important;\n    }\n    td:last-child {\n      border-right-color: var(--inactive--border-color) !important;\n      border-right-width: 1px !important;\n    }\n  }\n\n  perspective-export-menu {\n    display: none;\n  }\n\n  .psp-align-left {\n    border-left: solid 1px var(--inactive--border-color, #8b868045);\n  }\n\n  .psp-align-right {\n    border-left: solid 1px var(--inactive--border-color, #8b868045);\n  }\n\n  .psp-header-leaf:first-child {\n    border-left-color: transparent;\n  }\n}\n\nregular-table[theme=\"dark\"][perspective-theme=\"Vintage\"] {\n  tbody {\n    tr:nth-child(even) {\n      background-color: var(--background--03);\n    }\n\n    tr:hover {\n      background-color: var(--background--01);\n    }\n  }\n}\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/perspective/themes.css",
    "content": "perspective-viewer,\nperspective-viewer[theme=\"Vintage\"] {\n  --theme-name: \"Vintage\";\n}\nperspective-viewer[theme=\"Vintage\"] {\n  --button--font-size: 16px;\n  --config-button--padding: 15px 8px 6px 8px;\n  --column-drop-label--font-size: 8px;\n  --column-drop-container--padding: 0px;\n  --column-drop-label--display: inline-block;\n  --column-selector--width: 20px;\n  --column-selector--font-size: 16px;\n  --column_type--width: 25px;\n  --select--padding: 0px;\n  --side-panel--padding: 0px 0px 6px 4px;\n  --top-panel--padding: 0px 0px 12px 0px;\n  --top-panel-row--display: inline-flex;\n  --button--min-width: 110px;\n  color: #161616;\n  background-color: transparent;\n  --icon--color: #161616;\n  --inactive--color: #ababab;\n  --inactive--border-color: #dadada;\n  --root--background: #ffffff;\n  --active--color: #2670a9;\n  --error--color: #ff471e;\n  --plugin--background: #ffffff;\n  --overflow-hint-icon--color: rgba(0, 0, 0, 0.2);\n  --select--background-color: none;\n  --column-drop-container--background: none;\n  --warning--background: #042121;\n  --warning--color: #fdfffd;\n  --overflow-hint-icon--color: #fdfffd;\n  font-family: \"Roboto Mono\";\n  --preload-fonts: \"Roboto Mono:400\";\n  --interface-monospace--font-family: \"Roboto Mono\";\n  --group_by--content: \"Group By\";\n  --split_by--content: \"Split By\";\n  --inactive-column-selector--content: \"\\E835\";\n  --active-column-selector--content: \"\\E834\";\n  --overflow-hint-icon--content: \"!\";\n  --reset-button-icon--content: \"refresh\";\n  --save-button-icon--content: \"save\";\n  --transpose-button--content: \"Swap\";\n  --config-button-icon--content: \"configure\";\n  --column-add--content: \"add\";\n  --column-menu--content: \"menu\";\n  --column-close--content: \"close\";\n  --d3fc-y1-label--content: \"arrow_upward\";\n  --d3fc-y2-label--content: \"arrow_downward\";\n  --d3fc-treedata-axis--lines: none;\n  --d3fc-tooltip--background--color: rgba(155, 155, 155, 0.8);\n  --d3fc-tooltip--color: #161616;\n  --d3fc-tooltip--border-color: #fff;\n  --d3fc-tooltip--box-shadow: 0 2px 4px 0 rgb(0 0 0/10%);\n  --d3fc-gridline--color: #eaedef;\n  --d3fc-axis-ticks--color: #161616;\n  --d3fc-axis--lines: #c5c9d0;\n  --d3fc-legend--background: rgba(255, 255, 255, 0.8);\n  --d3fc-series: rgba(31, 119, 180, 0.8);\n  --d3fc-series-1: #0366d6;\n  --d3fc-series-2: #ff7f0e;\n  --d3fc-series-3: #2ca02c;\n  --d3fc-series-4: #d62728;\n  --d3fc-series-5: #9467bd;\n  --d3fc-series-6: #8c564b;\n  --d3fc-series-7: #e377c2;\n  --d3fc-series-8: #7f7f7f;\n  --d3fc-series-9: #bcbd22;\n  --d3fc-series-10: #17becf;\n  --d3fc-full--gradient: linear-gradient(\n    #4d342f 0%,\n    #e4521b 22.5%,\n    #feeb65 42.5%,\n    #f0f0f0 50%,\n    #dcedc8 57.5%,\n    #42b3d5 67.5%,\n    #1a237e 100%\n  );\n  --d3fc-positive--gradient: linear-gradient(\n    #f0f0f0 0%,\n    #dcedc8 10%,\n    #42b3d5 50%,\n    #1a237e 100%\n  );\n  --d3fc-negative--gradient: linear-gradient(\n    #4d342f 0%,\n    #e4521b 50%,\n    #feeb65 90%,\n    #f0f0f0 100%\n  );\n  --rt-pos-cell--color: #338dcd;\n  --rt-neg-cell--color: #ff471e;\n  --column-style-open-button--content: \"style\";\n  --column-style-close-button--content: \">\\00a0 style\";\n  --tree-label-collapse--content: \"-\";\n  --tree-label-expand--content: \"+\";\n  --toolbar-scroll-lock--content: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMSAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3QgeD0iNi41IiB5PSI4LjUiIHdpZHRoPSI4IiBoZWlnaHQ9IjciIHN0cm9rZT0iIzA0MjEyMSIvPgo8cGF0aCBkPSJNOCA4VjcuODA3NzZDOCA2LjI1NzA4IDkuMjU3MDggNSAxMC44MDc4IDVIMTAuOTM4NEMxMi4xNSA1IDEzLjIwNjEgNS44MjQ1OSAxMy41IDdWNyIgc3Ryb2tlPSIjMDQyMTIxIi8+CjxwYXRoIGQ9Ik0xMS41IDEyQzExLjUgMTIuNTUyMyAxMS4wNTIzIDEzIDEwLjUgMTNDOS45NDc3MiAxMyA5LjUgMTIuNTUyMyA5LjUgMTJDOS41IDExLjQ0NzcgOS45NDc3MiAxMSAxMC41IDExQzExLjA1MjMgMTEgMTEuNSAxMS40NDc3IDExLjUgMTJaIiBmaWxsPSIjMDQyMTIxIi8+Cjwvc3ZnPgo=\");\n  --toolbar-scroll-lock-active--content: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMSAyMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3QgeD0iNi41IiB5PSI5LjUiIHdpZHRoPSI4IiBoZWlnaHQ9IjciIHN0cm9rZT0iIzA0MjEyMSIvPgo8cGF0aCBkPSJNMTMgOVY4LjVDMTMgNy4xMTkyOSAxMS44ODA3IDYgMTAuNSA2VjZDOS4xMTkyOSA2IDggNy4xMTkyOSA4IDguNVY5IiBzdHJva2U9IiMwNDIxMjEiLz4KPHBhdGggZD0iTTExLjQ5MTEgMTNDMTEuNDkxMSAxMy41NTIzIDExLjA0MzQgMTQgMTAuNDkxMSAxNEM5LjkzODc4IDE0IDkuNDkxMDcgMTMuNTUyMyA5LjQ5MTA3IDEzQzkuNDkxMDcgMTIuNDQ3NyA5LjkzODc4IDEyIDEwLjQ5MTEgMTJDMTEuMDQzNCAxMiAxMS40OTExIDEyLjQ0NzcgMTEuNDkxMSAxM1oiIGZpbGw9IiMwNDIxMjEiLz4KPGxpbmUgeDE9IjQuNSIgeTE9IjUiIHgyPSI0LjUiIHkyPSIxNyIgc3Ryb2tlPSIjMDQyMTIxIi8+CjxsaW5lIHgxPSIxNi41IiB5MT0iNSIgeDI9IjE2LjUiIHkyPSIxNyIgc3Ryb2tlPSIjMDQyMTIxIi8+Cjwvc3ZnPgo=\");\n  --toolbar-edit-mode--content: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMSAyMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTUgNkwxNC41IDE1LjUiIHN0cm9rZT0iIzA0MjEyMSIvPgo8cGF0aCBkPSJNOSAxMEw1IDE0VjE2SDdMMTEgMTIiIHN0cm9rZT0iIzA0MjEyMSIvPgo8cGF0aCBkPSJNMTMgMTAuNUwxMC41IDhMMTIgNi41TDE0LjUgOUwxMyAxMC41WiIgZmlsbD0iIzA0MjEyMSIvPgo8cGF0aCBkPSJNMTUgOC41TDEyLjUgNkwxMy43OTI5IDQuNzA3MTFDMTQuMTgzNCA0LjMxNjU4IDE0LjgxNjYgNC4zMTY1OCAxNS4yMDcxIDQuNzA3MTFMMTYuMjkyOSA1Ljc5Mjg5QzE2LjY4MzQgNi4xODM0MiAxNi42ODM0IDYuODE2NTggMTYuMjkyOSA3LjIwNzExTDE1IDguNVoiIGZpbGw9IiMwNDIxMjEiLz4KPC9zdmc+Cg==\");\n  --toolbar-edit-mode-active--content: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMSAyMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTUgMTRMMTMuNzkyOSA1LjIwNzExQzE0LjE4MzQgNC44MTY1OCAxNC44MTY2IDQuODE2NTggMTUuMjA3MSA1LjIwNzExTDE1Ljc5MjkgNS43OTI4OUMxNi4xODM0IDYuMTgzNDIgMTYuMTgzNCA2LjgxNjU4IDE1Ljc5MjkgNy4yMDcxMUw3IDE2SDVWMTRaIiBzdHJva2U9IiMwNDIxMjEiLz4KPHBhdGggZD0iTTEzIDEwLjVMMTAuNSA4TDEyIDYuNUwxNC41IDlMMTMgMTAuNVoiIGZpbGw9IiMwNDIxMjEiLz4KPHBhdGggZD0iTTE1IDguNUwxMi41IDZMMTMuNzkyOSA0LjcwNzExQzE0LjE4MzQgNC4zMTY1OCAxNC44MTY2IDQuMzE2NTggMTUuMjA3MSA0LjcwNzExTDE2LjI5MjkgNS43OTI4OUMxNi42ODM0IDYuMTgzNDIgMTYuNjgzNCA2LjgxNjU4IDE2LjI5MjkgNy4yMDcxMUwxNSA4LjVaIiBmaWxsPSIjMDQyMTIxIi8+Cjwvc3ZnPgo=\");\n  --map-tile-url: \"http://{a-c}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png\";\n  --map-element-background: #fff;\n  --map-category-1: #0366d6;\n  --map-category-2: #ff7f0e;\n  --map-category-3: #2ca02c;\n  --map-category-4: #d62728;\n  --map-category-5: #9467bd;\n  --map-category-6: #8c564b;\n  --map-category-7: #e377c2;\n  --map-category-8: #7f7f7f;\n  --map-category-9: #bcbd22;\n  --map-category-10: #17becf;\n  --map-gradient: linear-gradient(\n    #4d342f 0%,\n    #e4521b 22.5%,\n    #feeb65 42.5%,\n    #f0f0f0 50%,\n    #dcedc8 57.5%,\n    #42b3d5 67.5%,\n    #1a237e 100%\n  );\n}\nperspective-copy-menu[theme=\"Vintage\"],\nperspective-export-menu[theme=\"Vintage\"],\nperspective-dropdown[theme=\"Vintage\"],\nperspective-date-column-style[theme=\"Vintage\"],\nperspective-datetime-column-style[theme=\"Vintage\"],\nperspective-number-column-style[theme=\"Vintage\"],\nperspective-string-column-style[theme=\"Vintage\"] {\n  font-family: \"Roboto Mono\";\n  background-color: white;\n  border: 1px solid var(--inactive--color);\n  border-radius: 0 0 2px 2px;\n  --column-style-pos-color--content: \"+\";\n  --column-style-neg-color--content: \"-\";\n  --save-button-icon--content: \"save\";\n  --reset-button-icon--content: \"refresh\";\n  font-family: \"Roboto Mono\";\n  --preload-fonts: \"Roboto Mono:400\";\n  --interface-monospace--font-family: \"Roboto Mono\";\n  color: #161616;\n  background-color: transparent;\n  --icon--color: #161616;\n  --inactive--color: #ababab;\n  --inactive--border-color: #dadada;\n  --root--background: #ffffff;\n  --active--color: #2670a9;\n  --error--color: #ff471e;\n  --plugin--background: #ffffff;\n  --overflow-hint-icon--color: rgba(0, 0, 0, 0.2);\n  --select--background-color: none;\n  --column-drop-container--background: none;\n  --warning--background: #042121;\n  --warning--color: #fdfffd;\n  --overflow-hint-icon--color: #fdfffd;\n  background-color: white;\n}\nperspective-viewer,\nperspective-copy-menu,\nperspective-export-menu,\nperspective-dropdown,\nperspective-date-column-style,\nperspective-datetime-column-style,\nperspective-number-column-style,\nperspective-string-column-style {\n  --column-type-integer--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTMiIGhlaWdodD0iMTMiIHZpZXdCb3g9IjAgMCAxMyAxMyIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxkZWZzPjwvZGVmcz4KICAgIDxwYXRoIGQ9Ik0gNy4xMzYgNy42NyBMIDUuNDE4IDcuNjcgTCA1LjkwMiA1LjU5NCBMIDcuNjIgNS41OTQgTCA3LjEzNiA3LjY3IFogTSA2LjUxMyAxMC4yNjQgTCA3LjMyIDEwLjI2NCBMIDcuNzgyIDguMzM4IEwgOS4xODggOC4zMzggTCA5LjMwNCA3LjY3IEwgNy45NDMgNy42NyBMIDguNDI3IDUuNTk0IEwgOS42NzMgNS41OTQgTCA5Ljc5OSA0LjkxNCBMIDguNTg5IDQuOTE0IEwgOS4wNSAzIEwgOC4yNDMgMyBMIDcuNzgyIDQuOTE0IEwgNi4wNjMgNC45MTQgTCA2LjUyNSAzIEwgNS43MTggMyBMIDUuMjU2IDQuOTE0IEwgMy44NjEgNC45MTQgTCAzLjczNCA1LjU5NCBMIDUuMDk1IDUuNTk0IEwgNC42MTEgNy42NyBMIDMuMzY1IDcuNjcgTCAzLjI1IDguMzM4IEwgNC40NDkgOC4zMzggTCAzLjk4OCAxMC4yNjQgTCA0Ljc5NSAxMC4yNjQgTCA1LjI1NiA4LjMzOCBMIDYuOTc0IDguMzM4IEwgNi41MTMgMTAuMjY0IFoiIGZpbGw9ImJsYWNrIj48L3BhdGg+Cjwvc3ZnPg==\");\n  --column-type-float--mask-image: var(--column-type-integer--mask-image);\n  --column-type-string--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTMiIGhlaWdodD0iMTMiIHZpZXdCb3g9IjAgMCAxMyAxMyIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxkZWZzPjwvZGVmcz4KICAgIDxwYXRoIGQ9Ik0gNi4yODMgNS4yNzUgTCA2LjMwOSA1LjI3NSBMIDYuNzkyIDYuODU1IEwgNS44MDYgNi44NTUgTCA2LjI4MyA1LjI3NSBaIE0gNy4yOTUgOC41MDEgTCA4LjE0NCA4LjUwMSBMIDYuODI1IDQuMzg3IEwgNS44MTkgNC4zODcgTCA0LjUgOC41MDEgTCA1LjMwMyA4LjUwMSBMIDUuNjEgNy40ODkgTCA2Ljk4OCA3LjQ4OSBMIDcuMjk1IDguNTAxIFoiIGZpbGw9IiMwNDIxMjEiPjwvcGF0aD4KICAgIDxtYXNrIGlkPSJwYXRoLTItaW5zaWRlLTFfNzIwXzc4NjciIGZpbGw9IndoaXRlIj4KICAgICAgICA8cmVjdCB3aWR0aD0iMTAiIGhlaWdodD0iOSIgcng9IjAuODMzIiB4PSIxLjUiIHk9IjIiPjwvcmVjdD4KICAgIDwvbWFzaz4KICAgIDxyZWN0IHdpZHRoPSIxMCIgaGVpZ2h0PSI5IiByeD0iMC44MzMiIHN0cm9rZT0iIzA0MjEyMSIgc3Ryb2tlLXdpZHRoPSIyIiBtYXNrPSJ1cmwoI3BhdGgtMi1pbnNpZGUtMV83MjBfNzg2NykiIHg9IjEuNSIgeT0iMiI+PC9yZWN0Pgo8L3N2Zz4=\");\n  --column-type-date--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTMiIGhlaWdodD0iMTMiIHZpZXdCb3g9IjAgMCAxMyAxMyIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGZpbHRlcj0idXJsKCNmaWx0ZXIwX2RfNzIwXzc3OTUpIiB0cmFuc2Zvcm09Im1hdHJpeCgxLCAwLCAwLCAxLCAtMy41LCAtMy41KSI+CiAgICAgICAgPG1hc2sgaWQ9InBhdGgtMS1pbnNpZGUtMV83MjBfNzc5NSIgZmlsbD0id2hpdGUiPgogICAgICAgICAgICA8cmVjdCB4PSI1IiB5PSI2IiB3aWR0aD0iOS45OTg5MiIgaGVpZ2h0PSI4LjMzMjQzIiByeD0iMC44MzMyNDQiPjwvcmVjdD4KICAgICAgICA8L21hc2s+CiAgICAgICAgPHJlY3QgeD0iNSIgeT0iNiIgd2lkdGg9IjkuOTk4OTIiIGhlaWdodD0iOC4zMzI0MyIgcng9IjAuODMzMjQ0IiBzdHJva2U9IiMwNDIxMjEiIHN0cm9rZS13aWR0aD0iMiIgbWFzaz0idXJsKCNwYXRoLTEtaW5zaWRlLTFfNzIwXzc3OTUpIj48L3JlY3Q+CiAgICAgICAgPHBhdGggZD0iTTcuMjk2NjMgNlY3LjE0ODMxIiBzdHJva2U9IiMwNDIxMjEiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCI+PC9wYXRoPgogICAgICAgIDxwYXRoIGQ9Ik0xMi45MTQ4IDZWNy4xNDgzMSIgc3Ryb2tlPSIjMDQyMTIxIiBzdHJva2UtbGluZWNhcD0icm91bmQiPjwvcGF0aD4KICAgICAgICA8bGluZSB4MT0iNS44MzQyMyIgeTE9IjguODMyNzYiIHgyPSIxNC45OTk5IiB5Mj0iOC44MzI3NiIgc3Ryb2tlPSIjMDQyMTIxIj48L2xpbmU+CiAgICA8L2c+CiAgICA8ZGVmcz4KICAgICAgICA8ZmlsdGVyIGlkPSJmaWx0ZXIwX2RfNzIwXzc3OTUiIHg9IjAiIHk9IjAuNSIgd2lkdGg9IjIyIiBoZWlnaHQ9IjIwLjgzMjUiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgICAgICAgICAgPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiPjwvZmVGbG9vZD4KICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiIHJlc3VsdD0iaGFyZEFscGhhIj48L2ZlQ29sb3JNYXRyaXg+CiAgICAgICAgICAgIDxmZU9mZnNldCBkeD0iMSIgZHk9IjEiPjwvZmVPZmZzZXQ+CiAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjMiPjwvZmVHYXVzc2lhbkJsdXI+CiAgICAgICAgICAgIDxmZUNvbXBvc2l0ZSBpbjI9ImhhcmRBbHBoYSIgb3BlcmF0b3I9Im91dCI+PC9mZUNvbXBvc2l0ZT4KICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMC4xNjc3MDkgMCAwIDAgMCAwLjMyOTQ3IDAgMCAwIDAgMC4zMjI0MzcgMCAwIDAgMC4xIDAiPjwvZmVDb2xvck1hdHJpeD4KICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJlZmZlY3QxX2Ryb3BTaGFkb3dfNzIwXzc3OTUiPjwvZmVCbGVuZD4KICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJlZmZlY3QxX2Ryb3BTaGFkb3dfNzIwXzc3OTUiIHJlc3VsdD0ic2hhcGUiPjwvZmVCbGVuZD4KICAgICAgICA8L2ZpbHRlcj4KICAgIDwvZGVmcz4KPC9zdmc+\");\n  --column-type-boolean--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTAiIHZpZXdCb3g9IjAgMCAxMCAxMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTAuNSA1LjhWOEMwLjUgOC44Mjg0MyAxLjE3MTU3IDkuNSAyIDkuNUg0LjhDNS42Mjg0MyA5LjUgNi4zIDguODI4NDMgNi4zIDhWNy4yQzYuMyA2LjkyMzg2IDYuNTIzODYgNi43IDYuOCA2LjdIOEM4LjgyODQzIDYuNyA5LjUgNi4wMjg0MyA5LjUgNS4yVjNDOS41IDIuMTcxNTcgOC44Mjg0MyAxLjUgOCAxLjVINS4yQzQuMzcxNTcgMS41IDMuNyAyLjE3MTU3IDMuNyAzVjMuOEMzLjcgNC4wNzYxNCAzLjQ3NjE0IDQuMyAzLjIgNC4zSDJDMS4xNzE1NyA0LjMgMC41IDQuOTcxNTcgMC41IDUuOFoiIHN0cm9rZT0iIzA0MjEyMSIvPgo8L3N2Zz4K\");\n  --column-type-datetime--mask-image: var(--column-type-date--mask-image);\n  --column-drag-handle--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNSIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDUgMTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjMuNDk5OTYiIGN5PSIxMS4wMDAxIiByPSIwLjgzMzMzMyIgZmlsbD0iIzZFNkU2RSIvPgo8Y2lyY2xlIGN4PSIwLjgzMzMzMyIgY3k9IjExLjAwMDEiIHI9IjAuODMzMzMzIiBmaWxsPSIjNkU2RTZFIi8+CjxjaXJjbGUgY3g9IjMuNDk5OTYiIGN5PSI3LjY2NjgzIiByPSIwLjgzMzMzMyIgZmlsbD0iIzZFNkU2RSIvPgo8Y2lyY2xlIGN4PSIwLjgzMzMzMyIgY3k9IjcuNjY2ODMiIHI9IjAuODMzMzMzIiBmaWxsPSIjNkU2RTZFIi8+CjxjaXJjbGUgY3g9IjMuNDk5OTYiIGN5PSI0LjMzMzMzIiByPSIwLjgzMzMzMyIgZmlsbD0iIzZFNkU2RSIvPgo8Y2lyY2xlIGN4PSIwLjgzMzMzMyIgY3k9IjQuMzMzMzMiIHI9IjAuODMzMzMzIiBmaWxsPSIjNkU2RTZFIi8+CjxjaXJjbGUgY3g9IjMuNDk5OTYiIGN5PSIxLjAwMDA4IiByPSIwLjgzMzMzMyIgZmlsbD0iIzZFNkU2RSIvPgo8Y2lyY2xlIGN4PSIwLjgzMzMzMyIgY3k9IjEuMDAwMDgiIHI9IjAuODMzMzMzIiBmaWxsPSIjNkU2RTZFIi8+Cjwvc3ZnPgo=\");\n  --column-radio-on--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTEiIGhlaWdodD0iMTEiIHZpZXdCb3g9IjAgMCAxMSAxMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxjaXJjbGUgY3g9IjUuNSIgY3k9IjUuNSIgcj0iMy41IiBmaWxsPSIjM0Y0MzQzIi8+CiAgICA8cmVjdCB4PSIwLjUiIHk9IjAuNSIgd2lkdGg9IjEwIiBoZWlnaHQ9IjEwIiByeD0iNSIgc3Ryb2tlPSIjM0Y0MzQzIi8+Cjwvc3ZnPgo=\");\n  --column-radio-hover--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTEiIGhlaWdodD0iMTEiIHZpZXdCb3g9IjAgMCAxMSAxMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxjaXJjbGUgY3g9IjUuNSIgY3k9IjUuNSIgcj0iMi41IiBmaWxsPSIjM0Y0MzQzIi8+CiAgICA8cmVjdCB4PSIwLjUiIHk9IjAuNSIgd2lkdGg9IjEwIiBoZWlnaHQ9IjEwIiByeD0iNSIgc3Ryb2tlPSIjM0Y0MzQzIi8+Cjwvc3ZnPgo=\");\n  --column-radio-off--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTEiIGhlaWdodD0iMTEiIHZpZXdCb3g9IjAgMCAxMSAxMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxjaXJjbGUgY3g9IjUuNSIgY3k9IjUuNSIgcj0iMyIgc3Ryb2tlPSIjM0Y0MzQzIiAvPgo8L3N2Zz4=\");\n  --column-checkbox-on--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3QgeD0iMC41IiB5PSIwLjUiIHdpZHRoPSIxMyIgaGVpZ2h0PSIxMyIgcng9IjEuNSIgc3Ryb2tlPSIjM0Y0MzQzIi8+CjxyZWN0IHg9IjIiIHk9IjIiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCIgcng9IjIiIGZpbGw9IiMzRjQzNDMiLz4KPC9zdmc+Cg==\");\n  --column-checkbox-hover--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3QgeD0iMC41IiB5PSIwLjUiIHdpZHRoPSIxMyIgaGVpZ2h0PSIxMyIgcng9IjEuNSIgc3Ryb2tlPSIjM0Y0MzQzIi8+CjxyZWN0IHg9IjQiIHk9IjQiIHdpZHRoPSI2IiBoZWlnaHQ9IjYiIHJ4PSIyIiBmaWxsPSIjM0Y0MzQzIi8+Cjwvc3ZnPgo=\");\n  --column-checkbox-off--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3QgeD0iMC41IiB5PSIwLjUiIHdpZHRoPSIxMyIgaGVpZ2h0PSIxMyIgcng9IjEuNSIgc3Ryb2tlPSIjM0Y0MzQzIi8+CjxyZWN0IHg9IjUiIHk9IjUiIHdpZHRoPSI0IiBoZWlnaHQ9IjQiIHJ4PSIyIiBmaWxsPSIjM0Y0MzQzIi8+Cjwvc3ZnPgo=\");\n  --column-settings-icon--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTQuNSAzTDQuNSAxMSIgc3Ryb2tlPSIjMDQyMTIxIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPHBhdGggZD0iTTkuNSAzTDkuNSAxMSIgc3Ryb2tlPSIjMDQyMTIxIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPHBhdGggZD0iTTYgOC41QzYgOS4zMjg0MyA1LjMyODQzIDEwIDQuNSAxMEMzLjY3MTU3IDEwIDMgOS4zMjg0MyAzIDguNUMzIDcuNjcxNTcgMy42NzE1NyA3IDQuNSA3QzUuMzI4NDMgNyA2IDcuNjcxNTcgNiA4LjVaIiBmaWxsPSIjRkRGRkZEIiBzdHJva2U9IiMwNDIxMjEiLz4KPHBhdGggZD0iTTExIDUuNUMxMSA2LjMyODQzIDEwLjMyODQgNyA5LjUgN0M4LjY3MTU3IDcgOCA2LjMyODQzIDggNS41QzggNC42NzE1NyA4LjY3MTU3IDQgOS41IDRDMTAuMzI4NCA0IDExIDQuNjcxNTcgMTEgNS41WiIgZmlsbD0iI0ZERkZGRCIgc3Ryb2tlPSIjMDQyMTIxIi8+Cjwvc3ZnPgo=\");\n  --sort-asc-icon--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNyAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTguODU0MTQgOS4wOTM5OUM4Ljg1NDE0IDkuMzk4NTMgOC42MDcyNyA5LjY0NTQgOC4zMDI3MyA5LjY0NTRDNy45OTgyIDkuNjQ1NCA3Ljc1MTMzIDkuMzk4NTMgNy43NTEzMyA5LjA5Mzk5TDguODU0MTQgOS4wOTM5OVpNNy45MTI4MyAyLjkxODZDOC4xMjgxNyAyLjcwMzI2IDguNDc3MyAyLjcwMzI2IDguNjkyNjQgMi45MTg2TDEyLjIwMTggNi40Mjc3M0MxMi40MTcxIDYuNjQzMDcgMTIuNDE3MSA2Ljk5MjIgMTIuMjAxOCA3LjIwNzUzQzExLjk4NjQgNy40MjI4NyAxMS42MzczIDcuNDIyODcgMTEuNDIyIDcuMjA3NTNMOC4zMDI3MyA0LjA4ODMxTDUuMTgzNTEgNy4yMDc1M0M0Ljk2ODE3IDcuNDIyODcgNC42MTkwNCA3LjQyMjg3IDQuNDAzNyA3LjIwNzUzQzQuMTg4MzcgNi45OTIyIDQuMTg4MzcgNi42NDMwNyA0LjQwMzcgNi40Mjc3M0w3LjkxMjgzIDIuOTE4NlpNNy43NTEzMyA5LjA5Mzk5TDcuNzUxMzMgMy4zMDg1TDguODU0MTQgMy4zMDg1TDguODU0MTQgOS4wOTM5OUw3Ljc1MTMzIDkuMDkzOTlaIiBmaWxsPSIjMDQyMTIxIi8+CjxsaW5lIHgxPSIzLjg5MTM2IiB5MT0iMTEuNTc5NSIgeDI9IjEyLjcxMzkiIHkyPSIxMS41Nzk1IiBzdHJva2U9IiMwNDIxMjEiIHN0cm9rZS13aWR0aD0iMS4xMDI4MSIvPgo8L3N2Zz4K\");\n  --sort-desc-icon--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTcuMTY4MzIgNi4zNDU0NkM3LjE2ODMyIDYuMDQwOTMgNy40MTUxOSA1Ljc5NDA1IDcuNzE5NzMgNS43OTQwNUM4LjAyNDI2IDUuNzk0MDUgOC4yNzExMyA2LjA0MDkzIDguMjcxMTMgNi4zNDU0Nkw3LjE2ODMyIDYuMzQ1NDZaTTguMTA5NjMgMTIuNTIwOUM3Ljg5NDI5IDEyLjczNjIgNy41NDUxNiAxMi43MzYyIDcuMzI5ODIgMTIuNTIwOUwzLjgyMDcgOS4wMTE3MkMzLjYwNTM2IDguNzk2MzkgMy42MDUzNiA4LjQ0NzI2IDMuODIwNyA4LjIzMTkyQzQuMDM2MDMgOC4wMTY1OCA0LjM4NTE2IDguMDE2NTggNC42MDA1IDguMjMxOTJMNy43MTk3MyAxMS4zNTExTDEwLjgzOSA4LjIzMTkyQzExLjA1NDMgOC4wMTY1OCAxMS40MDM0IDguMDE2NTggMTEuNjE4OCA4LjIzMTkyQzExLjgzNDEgOC40NDcyNiAxMS44MzQxIDguNzk2MzkgMTEuNjE4OCA5LjAxMTcyTDguMTA5NjMgMTIuNTIwOVpNOC4yNzExMyA2LjM0NTQ2TDguMjcxMTMgMTIuMTMwOUw3LjE2ODMyIDEyLjEzMDlMNy4xNjgzMiA2LjM0NTQ2TDguMjcxMTMgNi4zNDU0NloiIGZpbGw9IiMwNDIxMjEiLz4KPGxpbmUgeDE9IjEyLjEzMDkiIHkxPSIzLjg1OTc2IiB4Mj0iMy4zMDgzNiIgeTI9IjMuODU5NzYiIHN0cm9rZT0iIzA0MjEyMSIgc3Ryb2tlLXdpZHRoPSIxLjEwMjgxIi8+Cjwvc3ZnPgo=\");\n  --sort-col-asc-icon--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNyAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTcuMTU3OTYgOC4zNzM5MkM2Ljg1MzQzIDguMzczOTIgNi42MDY1NSA4LjEyNzA0IDYuNjA2NTUgNy44MjI1MUM2LjYwNjU1IDcuNTE3OTggNi44NTM0MyA3LjI3MTEgNy4xNTc5NiA3LjI3MTFMNy4xNTc5NiA4LjM3MzkyWk0xMy4zMzM0IDcuNDMyNjFDMTMuNTQ4NyA3LjY0Nzk0IDEzLjU0ODcgNy45OTcwNyAxMy4zMzM0IDguMjEyNDFMOS44MjQyMyAxMS43MjE1QzkuNjA4ODkgMTEuOTM2OSA5LjI1OTc2IDExLjkzNjkgOS4wNDQ0MiAxMS43MjE1QzguODI5MDggMTEuNTA2MiA4LjgyOTA4IDExLjE1NzEgOS4wNDQ0MiAxMC45NDE3TDEyLjE2MzYgNy44MjI1MUw5LjA0NDQyIDQuNzAzMjlDOC44MjkwOCA0LjQ4Nzk1IDguODI5MDggNC4xMzg4MiA5LjA0NDQyIDMuOTIzNDhDOS4yNTk3NiAzLjcwODE0IDkuNjA4ODkgMy43MDgxNCA5LjgyNDIyIDMuOTIzNDhMMTMuMzMzNCA3LjQzMjYxWk03LjE1Nzk2IDcuMjcxMUwxMi45NDM0IDcuMjcxMUwxMi45NDM0IDguMzczOTJMNy4xNTc5NiA4LjM3MzkyTDcuMTU3OTYgNy4yNzExWiIgZmlsbD0iIzA0MjEyMSIvPgo8bGluZSB4MT0iNC42NzIyNiIgeTE9IjMuNDExMTMiIHgyPSI0LjY3MjI2IiB5Mj0iMTIuMjMzNiIgc3Ryb2tlPSIjMDQyMTIxIiBzdHJva2Utd2lkdGg9IjEuMTAyODEiLz4KPC9zdmc+Cg==\");\n  --sort-col-desc-icon--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNyAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTkuOTk5MjcgNy4yNzExQzEwLjMwMzggNy4yNzExIDEwLjU1MDcgNy41MTc5OCAxMC41NTA3IDcuODIyNTFDMTAuNTUwNyA4LjEyNzA0IDEwLjMwMzggOC4zNzM5MiA5Ljk5OTI3IDguMzczOTJMOS45OTkyNyA3LjI3MTFaTTMuODIzODcgOC4yMTI0MUMzLjYwODU0IDcuOTk3MDggMy42MDg1NCA3LjY0Nzk1IDMuODIzODcgNy40MzI2MUw3LjMzMyAzLjkyMzQ4QzcuNTQ4MzQgMy43MDgxNCA3Ljg5NzQ3IDMuNzA4MTQgOC4xMTI4MSAzLjkyMzQ4QzguMzI4MTQgNC4xMzg4MiA4LjMyODE0IDQuNDg3OTUgOC4xMTI4MSA0LjcwMzI5TDQuOTkzNTggNy44MjI1MUw4LjExMjgxIDEwLjk0MTdDOC4zMjgxNSAxMS4xNTcxIDguMzI4MTUgMTEuNTA2MiA4LjExMjgxIDExLjcyMTVDNy44OTc0NyAxMS45MzY5IDcuNTQ4MzQgMTEuOTM2OSA3LjMzMyAxMS43MjE1TDMuODIzODcgOC4yMTI0MVpNOS45OTkyNyA4LjM3MzkyTDQuMjEzNzggOC4zNzM5Mkw0LjIxMzc4IDcuMjcxMUw5Ljk5OTI3IDcuMjcxMUw5Ljk5OTI3IDguMzczOTJaIiBmaWxsPSIjMDQyMTIxIi8+CjxsaW5lIHgxPSIxMi40ODQ3IiB5MT0iMTIuMjMzNiIgeDI9IjEyLjQ4NDciIHkyPSIzLjQxMTE0IiBzdHJva2U9IiMwNDIxMjEiIHN0cm9rZS13aWR0aD0iMS4xMDI4MSIvPgo8L3N2Zz4K\");\n  --sort-abs-asc-icon--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNyAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTkuNjc5OTYgMTIuMjMzNkg3LjE5ODYzVjguMzczNzlINS4xMzA4Nkw4LjQzOTMgMy40MTExM0wxMS43NDc3IDguMzczNzlIOS42Nzk5NlYxMi4yMzM2WiIgc3Ryb2tlPSIjMDQyMTIxIiBzdHJva2Utd2lkdGg9IjEuMTAyODEiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgo8L3N2Zz4K\");\n  --sort-abs-desc-icon--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNyAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTcuMTA1OTMgMy40MTExNEw5LjU4NzI2IDMuNDExMTRMOS41ODcyNiA3LjI3MDk5TDExLjY1NSA3LjI3MDk5TDguMzQ2NTkgMTIuMjMzNkw1LjAzODE1IDcuMjcwOTlMNy4xMDU5MyA3LjI3MDk5TDcuMTA1OTMgMy40MTExNFoiIHN0cm9rZT0iIzA0MjEyMSIgc3Ryb2tlLXdpZHRoPSIxLjEwMjgxIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPC9zdmc+Cg==\");\n  --sort-abs-col-asc-icon--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTMuNzQ3ODEgOS4wNjMwMkwzLjc0NzgxIDYuNTgxNjlMNy42MDc2NiA2LjU4MTY5TDcuNjA3NjYgNC41MTM5MkwxMi41NzAzIDcuODIyMzVMNy42MDc2NiAxMS4xMzA4TDcuNjA3NjYgOS4wNjMwMkwzLjc0NzgxIDkuMDYzMDJaIiBzdHJva2U9IiMwNDIxMjEiIHN0cm9rZS13aWR0aD0iMS4xMDI4MSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cjwvc3ZnPgo=\");\n  --sort-abs-col-desc-icon--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTEyLjY2MzEgNi41ODE3NkwxMi42NjMxIDkuMDYzMDlMOC44MDMyMyA5LjA2MzA5TDguODAzMjMgMTEuMTMwOUwzLjg0MDU4IDcuODIyNDJMOC44MDMyMyA0LjUxMzk5TDguODAzMjMgNi41ODE3NkwxMi42NjMxIDYuNTgxNzZaIiBzdHJva2U9IiMwNDIxMjEiIHN0cm9rZS13aWR0aD0iMS4xMDI4MSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cjwvc3ZnPgo=\");\n  --sort-none-icon--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNyAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGxpbmUgeDE9IjMuOTg0MTMiIHkxPSI4LjI3MTEiIHgyPSIxMi44MDY2IiB5Mj0iOC4yNzExIiBzdHJva2U9IiMwNDIxMjEiIHN0cm9rZS13aWR0aD0iMS4xMDI4MSIvPgo8L3N2Zz4K\");\n  --add-expression-icon--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHZpZXdCb3g9IjAgMCAxOCAxOCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxkZWZzPjwvZGVmcz4KICAgIDxwYXRoIGQ9Ik0gMTUuOTE1IDguNTU1IEwgMTAuMjEzIDE0LjI1NyIgc3Ryb2tlLXdpZHRoPSIxLjAwNDkxIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0eWxlPSJzdHJva2U6ICMwNDIxMjEiPgogICAgPC9wYXRoPgogICAgPHBhdGgKICAgICAgICBkPSJNIDEuNjE2IDE0LjMzIEwgMy4yNTEgMTQuMzMgQyA0LjI4IDE0LjMzIDUuMTU4IDEzLjU4NiA1LjMyNyAxMi41NzEgTCA2LjU4NCA0Ljk5MiBDIDYuNzUyIDMuOTc2IDcuNjMgMy4yMzIgOC42NiAzLjIzMiBMIDExLjM0NyAzLjIzMiIKICAgICAgICBzdHJva2Utd2lkdGg9IjEuMDA0OTEiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3R5bGU9InN0cm9rZTojMDQyMTIxIj48L3BhdGg+CiAgICA8cGF0aCBkPSJNIDEwLjIxMiA4LjU1NSBMIDE1LjkxNCAxNC4yNTciIHN0cm9rZS13aWR0aD0iMS4wMDQ5MSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHlsZT0ic3Ryb2tlOiAjMDQyMTIxIj4KICAgIDwvcGF0aD4KPC9zdmc+\");\n  color: #161616;\n  background-color: transparent;\n  --icon--color: #161616;\n  --inactive--color: #ababab;\n  --inactive--border-color: #dadada;\n  --root--background: #ffffff;\n  --active--color: #2670a9;\n  --error--color: #ff471e;\n  --plugin--background: #ffffff;\n  --overflow-hint-icon--color: rgba(0, 0, 0, 0.2);\n  --select--background-color: none;\n  --column-drop-container--background: none;\n  --warning--background: #042121;\n  --warning--color: #fdfffd;\n  --overflow-hint-icon--color: #fdfffd;\n  --column-type-integer--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTMiIGhlaWdodD0iMTMiIHZpZXdCb3g9IjAgMCAxMyAxMyIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxkZWZzPjwvZGVmcz4KICAgIDxwYXRoIGQ9Ik0gNy4xMzYgNy42NyBMIDUuNDE4IDcuNjcgTCA1LjkwMiA1LjU5NCBMIDcuNjIgNS41OTQgTCA3LjEzNiA3LjY3IFogTSA2LjUxMyAxMC4yNjQgTCA3LjMyIDEwLjI2NCBMIDcuNzgyIDguMzM4IEwgOS4xODggOC4zMzggTCA5LjMwNCA3LjY3IEwgNy45NDMgNy42NyBMIDguNDI3IDUuNTk0IEwgOS42NzMgNS41OTQgTCA5Ljc5OSA0LjkxNCBMIDguNTg5IDQuOTE0IEwgOS4wNSAzIEwgOC4yNDMgMyBMIDcuNzgyIDQuOTE0IEwgNi4wNjMgNC45MTQgTCA2LjUyNSAzIEwgNS43MTggMyBMIDUuMjU2IDQuOTE0IEwgMy44NjEgNC45MTQgTCAzLjczNCA1LjU5NCBMIDUuMDk1IDUuNTk0IEwgNC42MTEgNy42NyBMIDMuMzY1IDcuNjcgTCAzLjI1IDguMzM4IEwgNC40NDkgOC4zMzggTCAzLjk4OCAxMC4yNjQgTCA0Ljc5NSAxMC4yNjQgTCA1LjI1NiA4LjMzOCBMIDYuOTc0IDguMzM4IEwgNi41MTMgMTAuMjY0IFoiIGZpbGw9ImJsYWNrIj48L3BhdGg+Cjwvc3ZnPg==\");\n  --column-type-float--mask-image: var(--column-type-integer--mask-image);\n  --column-type-string--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTMiIGhlaWdodD0iMTMiIHZpZXdCb3g9IjAgMCAxMyAxMyIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxkZWZzPjwvZGVmcz4KICAgIDxwYXRoIGQ9Ik0gNi4yODMgNS4yNzUgTCA2LjMwOSA1LjI3NSBMIDYuNzkyIDYuODU1IEwgNS44MDYgNi44NTUgTCA2LjI4MyA1LjI3NSBaIE0gNy4yOTUgOC41MDEgTCA4LjE0NCA4LjUwMSBMIDYuODI1IDQuMzg3IEwgNS44MTkgNC4zODcgTCA0LjUgOC41MDEgTCA1LjMwMyA4LjUwMSBMIDUuNjEgNy40ODkgTCA2Ljk4OCA3LjQ4OSBMIDcuMjk1IDguNTAxIFoiIGZpbGw9IiMwNDIxMjEiPjwvcGF0aD4KICAgIDxtYXNrIGlkPSJwYXRoLTItaW5zaWRlLTFfNzIwXzc4NjciIGZpbGw9IndoaXRlIj4KICAgICAgICA8cmVjdCB3aWR0aD0iMTAiIGhlaWdodD0iOSIgcng9IjAuODMzIiB4PSIxLjUiIHk9IjIiPjwvcmVjdD4KICAgIDwvbWFzaz4KICAgIDxyZWN0IHdpZHRoPSIxMCIgaGVpZ2h0PSI5IiByeD0iMC44MzMiIHN0cm9rZT0iIzA0MjEyMSIgc3Ryb2tlLXdpZHRoPSIyIiBtYXNrPSJ1cmwoI3BhdGgtMi1pbnNpZGUtMV83MjBfNzg2NykiIHg9IjEuNSIgeT0iMiI+PC9yZWN0Pgo8L3N2Zz4=\");\n  --column-type-date--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTMiIGhlaWdodD0iMTMiIHZpZXdCb3g9IjAgMCAxMyAxMyIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGZpbHRlcj0idXJsKCNmaWx0ZXIwX2RfNzIwXzc3OTUpIiB0cmFuc2Zvcm09Im1hdHJpeCgxLCAwLCAwLCAxLCAtMy41LCAtMy41KSI+CiAgICAgICAgPG1hc2sgaWQ9InBhdGgtMS1pbnNpZGUtMV83MjBfNzc5NSIgZmlsbD0id2hpdGUiPgogICAgICAgICAgICA8cmVjdCB4PSI1IiB5PSI2IiB3aWR0aD0iOS45OTg5MiIgaGVpZ2h0PSI4LjMzMjQzIiByeD0iMC44MzMyNDQiPjwvcmVjdD4KICAgICAgICA8L21hc2s+CiAgICAgICAgPHJlY3QgeD0iNSIgeT0iNiIgd2lkdGg9IjkuOTk4OTIiIGhlaWdodD0iOC4zMzI0MyIgcng9IjAuODMzMjQ0IiBzdHJva2U9IiMwNDIxMjEiIHN0cm9rZS13aWR0aD0iMiIgbWFzaz0idXJsKCNwYXRoLTEtaW5zaWRlLTFfNzIwXzc3OTUpIj48L3JlY3Q+CiAgICAgICAgPHBhdGggZD0iTTcuMjk2NjMgNlY3LjE0ODMxIiBzdHJva2U9IiMwNDIxMjEiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCI+PC9wYXRoPgogICAgICAgIDxwYXRoIGQ9Ik0xMi45MTQ4IDZWNy4xNDgzMSIgc3Ryb2tlPSIjMDQyMTIxIiBzdHJva2UtbGluZWNhcD0icm91bmQiPjwvcGF0aD4KICAgICAgICA8bGluZSB4MT0iNS44MzQyMyIgeTE9IjguODMyNzYiIHgyPSIxNC45OTk5IiB5Mj0iOC44MzI3NiIgc3Ryb2tlPSIjMDQyMTIxIj48L2xpbmU+CiAgICA8L2c+CiAgICA8ZGVmcz4KICAgICAgICA8ZmlsdGVyIGlkPSJmaWx0ZXIwX2RfNzIwXzc3OTUiIHg9IjAiIHk9IjAuNSIgd2lkdGg9IjIyIiBoZWlnaHQ9IjIwLjgzMjUiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KICAgICAgICAgICAgPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiPjwvZmVGbG9vZD4KICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiIHJlc3VsdD0iaGFyZEFscGhhIj48L2ZlQ29sb3JNYXRyaXg+CiAgICAgICAgICAgIDxmZU9mZnNldCBkeD0iMSIgZHk9IjEiPjwvZmVPZmZzZXQ+CiAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjMiPjwvZmVHYXVzc2lhbkJsdXI+CiAgICAgICAgICAgIDxmZUNvbXBvc2l0ZSBpbjI9ImhhcmRBbHBoYSIgb3BlcmF0b3I9Im91dCI+PC9mZUNvbXBvc2l0ZT4KICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMC4xNjc3MDkgMCAwIDAgMCAwLjMyOTQ3IDAgMCAwIDAgMC4zMjI0MzcgMCAwIDAgMC4xIDAiPjwvZmVDb2xvck1hdHJpeD4KICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJlZmZlY3QxX2Ryb3BTaGFkb3dfNzIwXzc3OTUiPjwvZmVCbGVuZD4KICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJlZmZlY3QxX2Ryb3BTaGFkb3dfNzIwXzc3OTUiIHJlc3VsdD0ic2hhcGUiPjwvZmVCbGVuZD4KICAgICAgICA8L2ZpbHRlcj4KICAgIDwvZGVmcz4KPC9zdmc+\");\n  --column-type-boolean--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTAiIHZpZXdCb3g9IjAgMCAxMCAxMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTAuNSA1LjhWOEMwLjUgOC44Mjg0MyAxLjE3MTU3IDkuNSAyIDkuNUg0LjhDNS42Mjg0MyA5LjUgNi4zIDguODI4NDMgNi4zIDhWNy4yQzYuMyA2LjkyMzg2IDYuNTIzODYgNi43IDYuOCA2LjdIOEM4LjgyODQzIDYuNyA5LjUgNi4wMjg0MyA5LjUgNS4yVjNDOS41IDIuMTcxNTcgOC44Mjg0MyAxLjUgOCAxLjVINS4yQzQuMzcxNTcgMS41IDMuNyAyLjE3MTU3IDMuNyAzVjMuOEMzLjcgNC4wNzYxNCAzLjQ3NjE0IDQuMyAzLjIgNC4zSDJDMS4xNzE1NyA0LjMgMC41IDQuOTcxNTcgMC41IDUuOFoiIHN0cm9rZT0iIzA0MjEyMSIvPgo8L3N2Zz4K\");\n  --column-type-datetime--mask-image: var(--column-type-date--mask-image);\n  --column-drag-handle--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNSIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDUgMTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjMuNDk5OTYiIGN5PSIxMS4wMDAxIiByPSIwLjgzMzMzMyIgZmlsbD0iIzZFNkU2RSIvPgo8Y2lyY2xlIGN4PSIwLjgzMzMzMyIgY3k9IjExLjAwMDEiIHI9IjAuODMzMzMzIiBmaWxsPSIjNkU2RTZFIi8+CjxjaXJjbGUgY3g9IjMuNDk5OTYiIGN5PSI3LjY2NjgzIiByPSIwLjgzMzMzMyIgZmlsbD0iIzZFNkU2RSIvPgo8Y2lyY2xlIGN4PSIwLjgzMzMzMyIgY3k9IjcuNjY2ODMiIHI9IjAuODMzMzMzIiBmaWxsPSIjNkU2RTZFIi8+CjxjaXJjbGUgY3g9IjMuNDk5OTYiIGN5PSI0LjMzMzMzIiByPSIwLjgzMzMzMyIgZmlsbD0iIzZFNkU2RSIvPgo8Y2lyY2xlIGN4PSIwLjgzMzMzMyIgY3k9IjQuMzMzMzMiIHI9IjAuODMzMzMzIiBmaWxsPSIjNkU2RTZFIi8+CjxjaXJjbGUgY3g9IjMuNDk5OTYiIGN5PSIxLjAwMDA4IiByPSIwLjgzMzMzMyIgZmlsbD0iIzZFNkU2RSIvPgo8Y2lyY2xlIGN4PSIwLjgzMzMzMyIgY3k9IjEuMDAwMDgiIHI9IjAuODMzMzMzIiBmaWxsPSIjNkU2RTZFIi8+Cjwvc3ZnPgo=\");\n  --column-radio-on--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTEiIGhlaWdodD0iMTEiIHZpZXdCb3g9IjAgMCAxMSAxMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxjaXJjbGUgY3g9IjUuNSIgY3k9IjUuNSIgcj0iMy41IiBmaWxsPSIjM0Y0MzQzIi8+CiAgICA8cmVjdCB4PSIwLjUiIHk9IjAuNSIgd2lkdGg9IjEwIiBoZWlnaHQ9IjEwIiByeD0iNSIgc3Ryb2tlPSIjM0Y0MzQzIi8+Cjwvc3ZnPgo=\");\n  --column-radio-hover--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTEiIGhlaWdodD0iMTEiIHZpZXdCb3g9IjAgMCAxMSAxMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxjaXJjbGUgY3g9IjUuNSIgY3k9IjUuNSIgcj0iMi41IiBmaWxsPSIjM0Y0MzQzIi8+CiAgICA8cmVjdCB4PSIwLjUiIHk9IjAuNSIgd2lkdGg9IjEwIiBoZWlnaHQ9IjEwIiByeD0iNSIgc3Ryb2tlPSIjM0Y0MzQzIi8+Cjwvc3ZnPgo=\");\n  --column-radio-off--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTEiIGhlaWdodD0iMTEiIHZpZXdCb3g9IjAgMCAxMSAxMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxjaXJjbGUgY3g9IjUuNSIgY3k9IjUuNSIgcj0iMyIgc3Ryb2tlPSIjM0Y0MzQzIiAvPgo8L3N2Zz4=\");\n  --column-checkbox-on--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3QgeD0iMC41IiB5PSIwLjUiIHdpZHRoPSIxMyIgaGVpZ2h0PSIxMyIgcng9IjEuNSIgc3Ryb2tlPSIjM0Y0MzQzIi8+CjxyZWN0IHg9IjIiIHk9IjIiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCIgcng9IjIiIGZpbGw9IiMzRjQzNDMiLz4KPC9zdmc+Cg==\");\n  --column-checkbox-hover--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3QgeD0iMC41IiB5PSIwLjUiIHdpZHRoPSIxMyIgaGVpZ2h0PSIxMyIgcng9IjEuNSIgc3Ryb2tlPSIjM0Y0MzQzIi8+CjxyZWN0IHg9IjQiIHk9IjQiIHdpZHRoPSI2IiBoZWlnaHQ9IjYiIHJ4PSIyIiBmaWxsPSIjM0Y0MzQzIi8+Cjwvc3ZnPgo=\");\n  --column-checkbox-off--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3QgeD0iMC41IiB5PSIwLjUiIHdpZHRoPSIxMyIgaGVpZ2h0PSIxMyIgcng9IjEuNSIgc3Ryb2tlPSIjM0Y0MzQzIi8+CjxyZWN0IHg9IjUiIHk9IjUiIHdpZHRoPSI0IiBoZWlnaHQ9IjQiIHJ4PSIyIiBmaWxsPSIjM0Y0MzQzIi8+Cjwvc3ZnPgo=\");\n  --column-settings-icon--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTQuNSAzTDQuNSAxMSIgc3Ryb2tlPSIjMDQyMTIxIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPHBhdGggZD0iTTkuNSAzTDkuNSAxMSIgc3Ryb2tlPSIjMDQyMTIxIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPHBhdGggZD0iTTYgOC41QzYgOS4zMjg0MyA1LjMyODQzIDEwIDQuNSAxMEMzLjY3MTU3IDEwIDMgOS4zMjg0MyAzIDguNUMzIDcuNjcxNTcgMy42NzE1NyA3IDQuNSA3QzUuMzI4NDMgNyA2IDcuNjcxNTcgNiA4LjVaIiBmaWxsPSIjRkRGRkZEIiBzdHJva2U9IiMwNDIxMjEiLz4KPHBhdGggZD0iTTExIDUuNUMxMSA2LjMyODQzIDEwLjMyODQgNyA5LjUgN0M4LjY3MTU3IDcgOCA2LjMyODQzIDggNS41QzggNC42NzE1NyA4LjY3MTU3IDQgOS41IDRDMTAuMzI4NCA0IDExIDQuNjcxNTcgMTEgNS41WiIgZmlsbD0iI0ZERkZGRCIgc3Ryb2tlPSIjMDQyMTIxIi8+Cjwvc3ZnPgo=\");\n  --sort-asc-icon--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNyAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTguODU0MTQgOS4wOTM5OUM4Ljg1NDE0IDkuMzk4NTMgOC42MDcyNyA5LjY0NTQgOC4zMDI3MyA5LjY0NTRDNy45OTgyIDkuNjQ1NCA3Ljc1MTMzIDkuMzk4NTMgNy43NTEzMyA5LjA5Mzk5TDguODU0MTQgOS4wOTM5OVpNNy45MTI4MyAyLjkxODZDOC4xMjgxNyAyLjcwMzI2IDguNDc3MyAyLjcwMzI2IDguNjkyNjQgMi45MTg2TDEyLjIwMTggNi40Mjc3M0MxMi40MTcxIDYuNjQzMDcgMTIuNDE3MSA2Ljk5MjIgMTIuMjAxOCA3LjIwNzUzQzExLjk4NjQgNy40MjI4NyAxMS42MzczIDcuNDIyODcgMTEuNDIyIDcuMjA3NTNMOC4zMDI3MyA0LjA4ODMxTDUuMTgzNTEgNy4yMDc1M0M0Ljk2ODE3IDcuNDIyODcgNC42MTkwNCA3LjQyMjg3IDQuNDAzNyA3LjIwNzUzQzQuMTg4MzcgNi45OTIyIDQuMTg4MzcgNi42NDMwNyA0LjQwMzcgNi40Mjc3M0w3LjkxMjgzIDIuOTE4NlpNNy43NTEzMyA5LjA5Mzk5TDcuNzUxMzMgMy4zMDg1TDguODU0MTQgMy4zMDg1TDguODU0MTQgOS4wOTM5OUw3Ljc1MTMzIDkuMDkzOTlaIiBmaWxsPSIjMDQyMTIxIi8+CjxsaW5lIHgxPSIzLjg5MTM2IiB5MT0iMTEuNTc5NSIgeDI9IjEyLjcxMzkiIHkyPSIxMS41Nzk1IiBzdHJva2U9IiMwNDIxMjEiIHN0cm9rZS13aWR0aD0iMS4xMDI4MSIvPgo8L3N2Zz4K\");\n  --sort-desc-icon--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTcuMTY4MzIgNi4zNDU0NkM3LjE2ODMyIDYuMDQwOTMgNy40MTUxOSA1Ljc5NDA1IDcuNzE5NzMgNS43OTQwNUM4LjAyNDI2IDUuNzk0MDUgOC4yNzExMyA2LjA0MDkzIDguMjcxMTMgNi4zNDU0Nkw3LjE2ODMyIDYuMzQ1NDZaTTguMTA5NjMgMTIuNTIwOUM3Ljg5NDI5IDEyLjczNjIgNy41NDUxNiAxMi43MzYyIDcuMzI5ODIgMTIuNTIwOUwzLjgyMDcgOS4wMTE3MkMzLjYwNTM2IDguNzk2MzkgMy42MDUzNiA4LjQ0NzI2IDMuODIwNyA4LjIzMTkyQzQuMDM2MDMgOC4wMTY1OCA0LjM4NTE2IDguMDE2NTggNC42MDA1IDguMjMxOTJMNy43MTk3MyAxMS4zNTExTDEwLjgzOSA4LjIzMTkyQzExLjA1NDMgOC4wMTY1OCAxMS40MDM0IDguMDE2NTggMTEuNjE4OCA4LjIzMTkyQzExLjgzNDEgOC40NDcyNiAxMS44MzQxIDguNzk2MzkgMTEuNjE4OCA5LjAxMTcyTDguMTA5NjMgMTIuNTIwOVpNOC4yNzExMyA2LjM0NTQ2TDguMjcxMTMgMTIuMTMwOUw3LjE2ODMyIDEyLjEzMDlMNy4xNjgzMiA2LjM0NTQ2TDguMjcxMTMgNi4zNDU0NloiIGZpbGw9IiMwNDIxMjEiLz4KPGxpbmUgeDE9IjEyLjEzMDkiIHkxPSIzLjg1OTc2IiB4Mj0iMy4zMDgzNiIgeTI9IjMuODU5NzYiIHN0cm9rZT0iIzA0MjEyMSIgc3Ryb2tlLXdpZHRoPSIxLjEwMjgxIi8+Cjwvc3ZnPgo=\");\n  --sort-col-asc-icon--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNyAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTcuMTU3OTYgOC4zNzM5MkM2Ljg1MzQzIDguMzczOTIgNi42MDY1NSA4LjEyNzA0IDYuNjA2NTUgNy44MjI1MUM2LjYwNjU1IDcuNTE3OTggNi44NTM0MyA3LjI3MTEgNy4xNTc5NiA3LjI3MTFMNy4xNTc5NiA4LjM3MzkyWk0xMy4zMzM0IDcuNDMyNjFDMTMuNTQ4NyA3LjY0Nzk0IDEzLjU0ODcgNy45OTcwNyAxMy4zMzM0IDguMjEyNDFMOS44MjQyMyAxMS43MjE1QzkuNjA4ODkgMTEuOTM2OSA5LjI1OTc2IDExLjkzNjkgOS4wNDQ0MiAxMS43MjE1QzguODI5MDggMTEuNTA2MiA4LjgyOTA4IDExLjE1NzEgOS4wNDQ0MiAxMC45NDE3TDEyLjE2MzYgNy44MjI1MUw5LjA0NDQyIDQuNzAzMjlDOC44MjkwOCA0LjQ4Nzk1IDguODI5MDggNC4xMzg4MiA5LjA0NDQyIDMuOTIzNDhDOS4yNTk3NiAzLjcwODE0IDkuNjA4ODkgMy43MDgxNCA5LjgyNDIyIDMuOTIzNDhMMTMuMzMzNCA3LjQzMjYxWk03LjE1Nzk2IDcuMjcxMUwxMi45NDM0IDcuMjcxMUwxMi45NDM0IDguMzczOTJMNy4xNTc5NiA4LjM3MzkyTDcuMTU3OTYgNy4yNzExWiIgZmlsbD0iIzA0MjEyMSIvPgo8bGluZSB4MT0iNC42NzIyNiIgeTE9IjMuNDExMTMiIHgyPSI0LjY3MjI2IiB5Mj0iMTIuMjMzNiIgc3Ryb2tlPSIjMDQyMTIxIiBzdHJva2Utd2lkdGg9IjEuMTAyODEiLz4KPC9zdmc+Cg==\");\n  --sort-col-desc-icon--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNyAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTkuOTk5MjcgNy4yNzExQzEwLjMwMzggNy4yNzExIDEwLjU1MDcgNy41MTc5OCAxMC41NTA3IDcuODIyNTFDMTAuNTUwNyA4LjEyNzA0IDEwLjMwMzggOC4zNzM5MiA5Ljk5OTI3IDguMzczOTJMOS45OTkyNyA3LjI3MTFaTTMuODIzODcgOC4yMTI0MUMzLjYwODU0IDcuOTk3MDggMy42MDg1NCA3LjY0Nzk1IDMuODIzODcgNy40MzI2MUw3LjMzMyAzLjkyMzQ4QzcuNTQ4MzQgMy43MDgxNCA3Ljg5NzQ3IDMuNzA4MTQgOC4xMTI4MSAzLjkyMzQ4QzguMzI4MTQgNC4xMzg4MiA4LjMyODE0IDQuNDg3OTUgOC4xMTI4MSA0LjcwMzI5TDQuOTkzNTggNy44MjI1MUw4LjExMjgxIDEwLjk0MTdDOC4zMjgxNSAxMS4xNTcxIDguMzI4MTUgMTEuNTA2MiA4LjExMjgxIDExLjcyMTVDNy44OTc0NyAxMS45MzY5IDcuNTQ4MzQgMTEuOTM2OSA3LjMzMyAxMS43MjE1TDMuODIzODcgOC4yMTI0MVpNOS45OTkyNyA4LjM3MzkyTDQuMjEzNzggOC4zNzM5Mkw0LjIxMzc4IDcuMjcxMUw5Ljk5OTI3IDcuMjcxMUw5Ljk5OTI3IDguMzczOTJaIiBmaWxsPSIjMDQyMTIxIi8+CjxsaW5lIHgxPSIxMi40ODQ3IiB5MT0iMTIuMjMzNiIgeDI9IjEyLjQ4NDciIHkyPSIzLjQxMTE0IiBzdHJva2U9IiMwNDIxMjEiIHN0cm9rZS13aWR0aD0iMS4xMDI4MSIvPgo8L3N2Zz4K\");\n  --sort-abs-asc-icon--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNyAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTkuNjc5OTYgMTIuMjMzNkg3LjE5ODYzVjguMzczNzlINS4xMzA4Nkw4LjQzOTMgMy40MTExM0wxMS43NDc3IDguMzczNzlIOS42Nzk5NlYxMi4yMzM2WiIgc3Ryb2tlPSIjMDQyMTIxIiBzdHJva2Utd2lkdGg9IjEuMTAyODEiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgo8L3N2Zz4K\");\n  --sort-abs-desc-icon--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNyAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTcuMTA1OTMgMy40MTExNEw5LjU4NzI2IDMuNDExMTRMOS41ODcyNiA3LjI3MDk5TDExLjY1NSA3LjI3MDk5TDguMzQ2NTkgMTIuMjMzNkw1LjAzODE1IDcuMjcwOTlMNy4xMDU5MyA3LjI3MDk5TDcuMTA1OTMgMy40MTExNFoiIHN0cm9rZT0iIzA0MjEyMSIgc3Ryb2tlLXdpZHRoPSIxLjEwMjgxIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPC9zdmc+Cg==\");\n  --sort-abs-col-asc-icon--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTMuNzQ3ODEgOS4wNjMwMkwzLjc0NzgxIDYuNTgxNjlMNy42MDc2NiA2LjU4MTY5TDcuNjA3NjYgNC41MTM5MkwxMi41NzAzIDcuODIyMzVMNy42MDc2NiAxMS4xMzA4TDcuNjA3NjYgOS4wNjMwMkwzLjc0NzgxIDkuMDYzMDJaIiBzdHJva2U9IiMwNDIxMjEiIHN0cm9rZS13aWR0aD0iMS4xMDI4MSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cjwvc3ZnPgo=\");\n  --sort-abs-col-desc-icon--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTEyLjY2MzEgNi41ODE3NkwxMi42NjMxIDkuMDYzMDlMOC44MDMyMyA5LjA2MzA5TDguODAzMjMgMTEuMTMwOUwzLjg0MDU4IDcuODIyNDJMOC44MDMyMyA0LjUxMzk5TDguODAzMjMgNi41ODE3NkwxMi42NjMxIDYuNTgxNzZaIiBzdHJva2U9IiMwNDIxMjEiIHN0cm9rZS13aWR0aD0iMS4xMDI4MSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cjwvc3ZnPgo=\");\n  --sort-none-icon--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNyAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGxpbmUgeDE9IjMuOTg0MTMiIHkxPSI4LjI3MTEiIHgyPSIxMi44MDY2IiB5Mj0iOC4yNzExIiBzdHJva2U9IiMwNDIxMjEiIHN0cm9rZS13aWR0aD0iMS4xMDI4MSIvPgo8L3N2Zz4K\");\n  --add-expression-icon--mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHZpZXdCb3g9IjAgMCAxOCAxOCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxkZWZzPjwvZGVmcz4KICAgIDxwYXRoIGQ9Ik0gMTUuOTE1IDguNTU1IEwgMTAuMjEzIDE0LjI1NyIgc3Ryb2tlLXdpZHRoPSIxLjAwNDkxIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0eWxlPSJzdHJva2U6ICMwNDIxMjEiPgogICAgPC9wYXRoPgogICAgPHBhdGgKICAgICAgICBkPSJNIDEuNjE2IDE0LjMzIEwgMy4yNTEgMTQuMzMgQyA0LjI4IDE0LjMzIDUuMTU4IDEzLjU4NiA1LjMyNyAxMi41NzEgTCA2LjU4NCA0Ljk5MiBDIDYuNzUyIDMuOTc2IDcuNjMgMy4yMzIgOC42NiAzLjIzMiBMIDExLjM0NyAzLjIzMiIKICAgICAgICBzdHJva2Utd2lkdGg9IjEuMDA0OTEiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3R5bGU9InN0cm9rZTojMDQyMTIxIj48L3BhdGg+CiAgICA8cGF0aCBkPSJNIDEwLjIxMiA4LjU1NSBMIDE1LjkxNCAxNC4yNTciIHN0cm9rZS13aWR0aD0iMS4wMDQ5MSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHlsZT0ic3Ryb2tlOiAjMDQyMTIxIj4KICAgIDwvcGF0aD4KPC9zdmc+\");\n  color: #161616;\n  background-color: transparent;\n  --icon--color: #161616;\n  --inactive--color: #ababab;\n  --inactive--border-color: #dadada;\n  --root--background: #ffffff;\n  --active--color: #2670a9;\n  --error--color: #ff471e;\n  --plugin--background: #ffffff;\n  --overflow-hint-icon--color: rgba(0, 0, 0, 0.2);\n  --select--background-color: none;\n  --column-drop-container--background: none;\n  --warning--background: #042121;\n  --warning--color: #fdfffd;\n  --overflow-hint-icon--color: #fdfffd;\n}\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/queryLimit/QueryLimit.tsx",
    "content": "import { executeRequestInAsync } from \"@modules/app/requestExecutor\";\nimport { useQueryPanelDispatch } from \"@modules/queryPanel/QueryPanelProvider\";\nimport { setLimit } from \"@modules/queryPanel/context/queryPanelSlice\";\nimport useQueryPanelState from \"@modules/queryPanel/useQueryPanelState\";\nimport { Input, Stack } from \"@uicore\";\nimport { useEffect, useState } from \"react\";\nimport styles from \"./styles.module.scss\";\nimport { PlayIcon } from \"@assets/icons\";\n\nenum LimitSaveState {\n  Default = 1,\n  Dirty,\n  Saved,\n}\n\nconst QueryLimit = (): JSX.Element => {\n  const { limit, activeEditor } = useQueryPanelState();\n  const limitStr = limit?.toString() ?? \"500\";\n  const [value, setValue] = useState(limitStr);\n  const [limitSaveState, setLimitSaveState] = useState(LimitSaveState.Default);\n  const [isFocused, setIsFocused] = useState(false);\n  const dispatch = useQueryPanelDispatch();\n  const saveLimit = () => {\n    if (!value) {\n      return;\n    }\n    dispatch(setLimit(parseInt(value)));\n    executeRequestInAsync(\"updateConfig\", { limit: parseInt(value) });\n    setLimitSaveState(LimitSaveState.Saved);\n    setTimeout(() => {\n      setLimitSaveState(LimitSaveState.Default);\n    }, 2000);\n  };\n\n  useEffect(() => {\n    setValue(limitStr);\n  }, [limitStr, activeEditor?.filepath]);\n\n  useEffect(() => {\n    if (value && value !== limitStr) {\n      setLimitSaveState(LimitSaveState.Dirty);\n    } else if (limitSaveState !== LimitSaveState.Saved) {\n      setLimitSaveState(LimitSaveState.Default);\n    }\n  }, [value, limitStr]);\n\n  return (\n    <div className={styles.container}>\n      <Stack className={styles.limitContainer}>\n        <label className={styles.label} htmlFor=\"query-limit\">\n          Limit\n        </label>\n        <div\n          className={[\n            styles.content,\n            isFocused ? styles.active : styles.inactive,\n          ].join(\" \")}\n        >\n          <Input\n            id=\"query-limit\"\n            type=\"number\"\n            value={value}\n            onChange={(e) => {\n              const newValue = e.target.value.replace(/[^\\d]/g, \"\");\n              setValue(newValue);\n            }}\n            className={styles.input}\n            onFocus={() => {\n              setIsFocused(true);\n            }}\n            onBlur={() => {\n              setIsFocused(false);\n            }}\n          />\n\n          <div\n            className={[\n              styles.playButton,\n              value && activeEditor?.filepath?.endsWith(\".sql\")\n                ? styles.active\n                : styles.inactive,\n            ].join(\" \")}\n            onClick={() => {\n              if (value && activeEditor?.filepath?.endsWith(\".sql\")) {\n                executeRequestInAsync(\"executeQueryFromActiveWindow\", {\n                  limit: parseInt(value),\n                });\n              }\n            }}\n          >\n            <PlayIcon />\n          </div>\n        </div>\n      </Stack>\n      {limitSaveState !== LimitSaveState.Default && (\n        <Stack className={styles.saveContainer}>\n          <div>Set as default</div>\n          {limitSaveState === LimitSaveState.Dirty ? (\n            <div className={styles.saveButton} onClick={saveLimit}>\n              Save\n            </div>\n          ) : (\n            <div className={styles.saveButton}>Saved</div>\n          )}\n        </Stack>\n      )}\n    </div>\n  );\n};\n\nexport default QueryLimit;\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/queryLimit/styles.module.scss",
    "content": ".container {\n  display: flex;\n  flex-direction: column;\n  border-radius: 0.5rem;\n}\n\n.input {\n  background-color: var(--background--02);\n  border: none;\n  outline: none;\n  max-width: 80px;\n  width: auto;\n  caret-color: var(--primary-color);\n  border-radius: 0;\n  height: 100%;\n  padding: calc(0.5rem - 1px) 0.25rem !important;\n\n  &:focus {\n    border: none;\n    outline: none;\n    background-color: var(--background--02);\n  }\n}\n\n.saveButton {\n  color: var(--primary-color);\n  cursor: pointer;\n}\n\n.playButton {\n  padding: calc(0.5rem - 1px);\n  color: #ffffff;\n  border-top-right-radius: 0.15rem;\n  display: flex;\n\n  &.active {\n    background-color: var(--primary-color);\n    cursor: pointer;\n  }\n\n  &.inactive {\n    background-color: var(--background--04);\n  }\n}\n\n.limitContainer {\n  gap: 0;\n  align-items: center;\n\n  .label {\n    padding: 0.3rem 0.75rem;\n    border: 1px solid var(--gray--gray-02);\n    border-right: none;\n    border-top-left-radius: 0.25rem;\n  }\n\n  .content {\n    display: flex;\n    align-items: center;\n    border-top-right-radius: 0.25rem;\n\n    &.inactive {\n      border: 1px solid var(--gray--gray-02);\n    }\n\n    &.active {\n      border: 1px solid var(--primary-color);\n    }\n  }\n}\n\n.saveContainer {\n  background-color: var(--gray--gray-02);\n  padding: 0.25rem 0.75rem;\n  justify-content: space-between;\n  font-size: 0.8em;\n  border-bottom-right-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n  line-height: 120%;\n}\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/queryPanelBookmarks/BookmarkAccordion.tsx",
    "content": "import { Accordion, Button, ListGroup, Spinner, Stack } from \"@uicore\";\nimport styles from \"../../querypanel.module.scss\";\nimport Filters, { QueryFilters } from \"../filters/Filters\";\nimport { NoBookmarksIcon } from \"@assets/icons\";\nimport QueryBookmarkRow from \"./QueryBookmarkRow\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { executeRequestInAsync } from \"@modules/app/requestExecutor\";\nimport { panelLogger } from \"@modules/logger\";\nimport { QueryBookmark } from \"@modules/queryPanel/context/types\";\nimport useQueryPanelState from \"@modules/queryPanel/useQueryPanelState\";\nimport { useQueryPanelDispatch } from \"@modules/queryPanel/QueryPanelProvider\";\nimport { setQueryBookmarks } from \"@modules/queryPanel/context/queryPanelSlice\";\nimport { loadBookmarks } from \"./utils\";\n\ninterface Props {\n  privacy: \"public\" | \"private\";\n  title: string;\n  onSelect: (bookmark: QueryBookmark) => void;\n  tags: string[];\n  bookmarks: QueryBookmark[];\n}\nconst BookmarkAccordion = ({\n  privacy,\n  title,\n  onSelect,\n  tags,\n  bookmarks,\n}: Props): JSX.Element => {\n  const { queryBookmarks } = useQueryPanelState();\n  const dispatch = useQueryPanelDispatch();\n  const [isLoading, setIsLoading] = useState(false);\n  const [filters, setFilters] = useState<QueryFilters>({\n    tags: [],\n    searchQuery: \"\",\n  });\n\n  const hasFilters = useMemo(\n    () => filters.tags.length > 0 || filters.searchQuery,\n    [filters],\n  );\n\n  const clearFilters = () => {\n    onFiltersChange({ tags: [], searchQuery: \"\" });\n  };\n\n  const getBookmarks = async (\n    showLoading: boolean,\n    newFilters?: Partial<QueryFilters>,\n  ) => {\n    panelLogger.info(\"[BookmarkAccordion] Loading bookmarks\", {\n      newFilters,\n      filters,\n    });\n    const response = await loadBookmarks(\n      (loading: boolean) => {\n        if (showLoading) {\n          setIsLoading(loading);\n        }\n      },\n      privacy,\n      newFilters ?? filters,\n    );\n\n    if (response) {\n      dispatch(setQueryBookmarks(response));\n    }\n  };\n\n  useEffect(() => {\n    if (queryBookmarks[privacy]) {\n      return;\n    }\n    void getBookmarks(true);\n  }, [queryBookmarks[privacy]]);\n\n  const onFiltersChange = (data: { tags?: string[]; searchQuery?: string }) => {\n    setFilters((prev) => ({ ...prev, ...data }));\n    setTimeout(() => {\n      void getBookmarks(true, data);\n    }, 10);\n  };\n\n  const getBookmarksContent = () => {\n    if (isLoading) {\n      return (\n        <Stack\n          direction=\"column\"\n          className=\"justify-content-center align-items-center p-4 m-4\"\n        >\n          <Spinner />\n          Loading...\n        </Stack>\n      );\n    }\n    if (bookmarks.length === 0) {\n      return (\n        <Stack className={styles.noBookmark} direction=\"column\">\n          <div className=\"no-results\">\n            <NoBookmarksIcon />\n          </div>\n          {hasFilters ? (\n            <div>\n              <h6>No results found.</h6>\n              <p>\n                <Button onClick={clearFilters}>Clear filters</Button>\n              </p>\n            </div>\n          ) : (\n            <div>\n              <h6>You have not bookmarked any query.</h6>\n              <div>\n                <h6>Execute your queries and add to bookmark from history</h6>\n                <p>Bookmarked queries can be shared with team.</p>\n                <p>\n                  <Button\n                    onClick={() => executeRequestInAsync(\"runAdhocQuery\", {})}\n                  >\n                    + New query\n                  </Button>\n                </p>\n              </div>\n            </div>\n          )}\n        </Stack>\n      );\n    }\n    return (\n      <ListGroup>\n        {bookmarks.map((bookmark) => (\n          <QueryBookmarkRow\n            key={bookmark.id}\n            bookmark={bookmark}\n            onSelect={onSelect}\n            isSharedView={privacy === \"public\"}\n          />\n        ))}\n      </ListGroup>\n    );\n  };\n\n  return (\n    <div className={`mb-4 ${styles.queryHistoryList}`}>\n      <Accordion\n        defaultOpen\n        trigger={() => (\n          <header className=\"d-flex align-items-center justify-content-between\">\n            <h4>\n              {title} ({bookmarks.length})\n            </h4>\n            <Filters\n              tags={tags}\n              onFiltersChange={onFiltersChange}\n              filters={filters}\n            />\n          </header>\n        )}\n      >\n        {() => getBookmarksContent()}\n      </Accordion>\n    </div>\n  );\n};\n\nexport default BookmarkAccordion;\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/queryPanelBookmarks/BookmarkButton.tsx",
    "content": "import { BookmarkIcon } from \"@assets/icons\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport {\n  executeRequestInAsync,\n  executeRequestInSync,\n} from \"@modules/app/requestExecutor\";\nimport { panelLogger } from \"@modules/logger\";\nimport {\n  setQueryBookmarksTagsFromDB,\n  setTabState,\n} from \"@modules/queryPanel/context/queryPanelSlice\";\nimport { QueryHistory } from \"@modules/queryPanel/context/types\";\nimport { useQueryPanelDispatch } from \"@modules/queryPanel/QueryPanelProvider\";\nimport useQueryPanelCommonActions from \"@modules/queryPanel/useQueryPanelCommonActions\";\nimport useQueryPanelState from \"@modules/queryPanel/useQueryPanelState\";\nimport {\n  Button,\n  FormGroup,\n  IconButton,\n  Input,\n  Label,\n  LoadingButton,\n  OptionType,\n  PopoverWithButton,\n  PopoverWithButtonRef,\n  Select,\n  Stack,\n} from \"@uicore\";\nimport { useRef } from \"react\";\nimport { Controller, useForm } from \"react-hook-form\";\nimport { ActionMeta } from \"react-select\";\nimport * as Yup from \"yup\";\nimport pageStyles from \"../../querypanel.module.scss\";\nimport { QueryPanelTitleTabState } from \"../QueryPanelContents/types\";\n\ninterface Props {\n  queryHistory: QueryHistory;\n}\n\ninterface BookmarkRequest {\n  name: string;\n  tags?: string[];\n}\n\nconst schema = Yup.object({\n  name: Yup.string().required(),\n  tags: Yup.array().of(Yup.string().required()).optional(),\n}).required();\n\nconst BookmarkButton = ({ queryHistory }: Props): JSX.Element => {\n  const dispatch = useQueryPanelDispatch();\n  const { queryBookmarksTagsFromDB } = useQueryPanelState();\n  const popoverRef = useRef<PopoverWithButtonRef | null>(null);\n  const { refetchBookmarks } = useQueryPanelCommonActions();\n\n  const {\n    control,\n    handleSubmit,\n    reset,\n    setValue,\n    watch,\n    formState: { isSubmitting, isValid },\n  } = useForm<BookmarkRequest>({\n    resolver: yupResolver(schema),\n    defaultValues: {\n      tags: [queryHistory.projectName],\n    },\n  });\n  const tags = watch(\"tags\");\n\n  const onSubmit = async (data: BookmarkRequest) => {\n    try {\n      panelLogger.info(\"saving bookmark\", queryHistory, data);\n      const request = {\n        bookmark_name: data.name,\n        raw_sql: queryHistory.rawSql,\n        compiled_sql: queryHistory.compiledSql,\n        adapter_type: queryHistory.adapter,\n        tags_list: data.tags,\n      };\n\n      const response = await executeRequestInSync(\"fetch\", {\n        endpoint: \"query/bookmark/\",\n        fetchArgs: {\n          body: JSON.stringify(request ?? {}),\n          method: \"POST\",\n        },\n      });\n      panelLogger.info(\"saved bookmark\", response);\n      refetchBookmarks();\n      executeRequestInAsync(\"sendTelemetryEvent\", {\n        eventName: `query-bookmark-added`,\n        properties: {\n          name: data.name,\n        },\n      });\n      onClose();\n      const actionResponse = await executeRequestInSync(\n        \"showInformationMessage\",\n        {\n          infoMessage: \"Successfully saved bookmark!\",\n          items: [\"Ok\", \"View bookmark\"],\n        },\n      );\n      if (actionResponse === \"View bookmark\") {\n        dispatch(setTabState(QueryPanelTitleTabState.Bookmarks));\n      }\n    } catch (error) {\n      panelLogger.error(\"error saving bookmark\", error);\n      reset(data);\n    }\n  };\n\n  const onClose = () => {\n    popoverRef.current?.close();\n    reset();\n  };\n\n  return (\n    <PopoverWithButton\n      ref={popoverRef}\n      title=\"Add bookmark\"\n      button={\n        <IconButton title=\"Bookmark this query\">\n          <BookmarkIcon />\n        </IconButton>\n      }\n    >\n      {({ styles, close }) => (\n        <div>\n          <form onSubmit={handleSubmit(onSubmit)}>\n            <Stack direction=\"column\">\n              <Controller\n                control={control}\n                name=\"name\"\n                render={({ field: { onChange } }) => (\n                  <FormGroup>\n                    <Label for=\"bookmarkName\" style={{ paddingTop: 3 }}>\n                      Name\n                    </Label>\n                    <Input\n                      id=\"bookmarkName\"\n                      type=\"text\"\n                      onChange={onChange}\n                      placeholder=\"Bookmark name\"\n                    />\n                  </FormGroup>\n                )}\n              />\n              <Controller\n                control={control}\n                name=\"tags\"\n                render={({ field: { onChange, ref } }) => (\n                  <FormGroup>\n                    <Label for=\"tags\" sm={2} style={{ paddingTop: 3 }}>\n                      Tags\n                    </Label>\n                    <Select\n                      components={{ DropdownIndicator: null }}\n                      classNames={{\n                        container: () => pageStyles.selectControl,\n                      }}\n                      ref={ref}\n                      inputId=\"tags\"\n                      options={queryBookmarksTagsFromDB?.map((v) => ({\n                        label: v.tag,\n                        value: v.tag,\n                      }))}\n                      isCreatable\n                      isClearable\n                      closeMenuOnSelect={false}\n                      value={tags?.map((v) => ({ label: v, value: v })) ?? []}\n                      defaultValue={[]}\n                      isMulti\n                      onChange={(\n                        updates: unknown,\n                        triggeredAction: ActionMeta<unknown>,\n                      ) => {\n                        const newValues = (\n                          (updates ?? []) as OptionType[]\n                        )?.map((val) => val.value);\n                        setValue(\"tags\", newValues);\n\n                        if (triggeredAction.action === \"create-option\") {\n                          dispatch(\n                            setQueryBookmarksTagsFromDB([\n                              {\n                                tag: (triggeredAction.option as OptionType)\n                                  .value,\n                                id: Date.now(),\n                              },\n                              ...(queryBookmarksTagsFromDB ?? []),\n                            ]),\n                          );\n                        }\n                        return onChange(newValues);\n                      }}\n                      placeholder=\"Type a value and press enter to add\"\n                    />\n                  </FormGroup>\n                )}\n              />\n            </Stack>\n            <div className={styles.popoverActions}>\n              <LoadingButton\n                loading={isSubmitting}\n                disabled={!isValid}\n                type=\"submit\"\n                color=\"primary\"\n              >\n                Save\n              </LoadingButton>\n              <Button\n                onClick={() => {\n                  close();\n                  onClose();\n                }}\n                outline\n              >\n                Cancel\n              </Button>\n            </div>\n          </form>\n        </div>\n      )}\n    </PopoverWithButton>\n  );\n};\n\nexport default BookmarkButton;\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/queryPanelBookmarks/BookmarkPrivacySettingButton.tsx",
    "content": "import { ShareIcon } from \"@assets/icons\";\nimport {\n  executeRequestInAsync,\n  executeRequestInSync,\n} from \"@modules/app/requestExecutor\";\nimport useAppContext from \"@modules/app/useAppContext\";\nimport { QueryBookmark } from \"@modules/queryPanel/context/types\";\nimport useQueryPanelCommonActions from \"@modules/queryPanel/useQueryPanelCommonActions\";\nimport {\n  Button,\n  FormGroup,\n  IconButton,\n  Input,\n  LoadingButton,\n  PopoverWithButton,\n  PopoverWithButtonRef,\n  Stack,\n} from \"@uicore\";\nimport { useEffect, useRef, useState } from \"react\";\n\nconst BookmarkPrivacySettingButton = ({\n  bookmark,\n}: {\n  bookmark: QueryBookmark;\n}): JSX.Element | null => {\n  const {\n    state: { currentUser },\n  } = useAppContext();\n  const [privacy, setPrivacy] = useState(bookmark.privacy);\n  const [isSubmitting, setIsSubmitting] = useState(false);\n  const popoverRef = useRef<PopoverWithButtonRef | null>(null);\n  const { refetchBookmarks } = useQueryPanelCommonActions();\n\n  useEffect(() => {\n    // Modify the setting when opening the popover to avoid one extra action from user\n    setPrivacy(bookmark.privacy === \"private\" ? \"public\" : \"private\");\n  }, [bookmark.privacy]);\n\n  const saveSettings = async () => {\n    setIsSubmitting(true);\n    try {\n      const endpoint = `query/bookmark/privacy/${bookmark.id}?privacy=${encodeURIComponent(privacy)}`;\n      await executeRequestInSync(\"fetch\", {\n        endpoint,\n        fetchArgs: {\n          method: \"PUT\",\n        },\n      });\n      executeRequestInAsync(\"sendTelemetryEvent\", {\n        eventName:\n          privacy === \"public\"\n            ? `query-bookmark-shared`\n            : `query-bookmark-unshared`,\n        properties: {\n          name: bookmark.name,\n          id: bookmark.id,\n        },\n      });\n      executeRequestInAsync(\"showInformationMessage\", {\n        infoMessage: \"Successfully saved bookmark!\",\n      });\n      popoverRef.current?.close();\n      refetchBookmarks();\n    } catch (error) {\n      executeRequestInAsync(\"showErrorMessage\", {\n        infoMessage: (error as Error).message,\n      });\n    }\n    setIsSubmitting(false);\n  };\n\n  if (currentUser?.id !== bookmark.created_by_user.id) {\n    return null;\n  }\n\n  const shareText = bookmark.privacy === \"private\" ? \"Share\" : \"Unshare\";\n\n  return (\n    <PopoverWithButton\n      ref={popoverRef}\n      title={\n        <Stack className=\"justify-content-between\">\n          <span>{`${shareText} Bookmark`}</span>\n          <FormGroup switch>\n            <Input\n              onChange={(e) =>\n                setPrivacy(e.target.checked ? \"public\" : \"private\")\n              }\n              checked={privacy === \"public\"}\n              type=\"switch\"\n              role=\"switch\"\n            />\n          </FormGroup>\n        </Stack>\n      }\n      button={\n        <IconButton\n          title={`${shareText} this bookmark`}\n          style={{\n            color:\n              bookmark.privacy === \"public\"\n                ? \"var(--primary-color)\"\n                : \"inherit\",\n          }}\n        >\n          <ShareIcon />\n        </IconButton>\n      }\n      popoverProps={{\n        placement: \"bottom\",\n        hideArrow: true,\n      }}\n    >\n      {({ styles, close }) => (\n        <div>\n          <div className=\"p3\">Shared with all users in SaaS instance</div>\n          <div className={styles.popoverActions}>\n            <LoadingButton\n              color=\"primary\"\n              loading={isSubmitting}\n              onClick={saveSettings}\n            >\n              Save\n            </LoadingButton>\n            <Button outline onClick={close}>\n              Cancel\n            </Button>\n          </div>\n        </div>\n      )}\n    </PopoverWithButton>\n  );\n};\n\nexport default BookmarkPrivacySettingButton;\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/queryPanelBookmarks/DeleteBookmarkButton.tsx",
    "content": "import { DeleteIcon } from \"@assets/icons\";\nimport {\n  executeRequestInAsync,\n  executeRequestInSync,\n} from \"@modules/app/requestExecutor\";\nimport useAppContext from \"@modules/app/useAppContext\";\nimport { QueryBookmark } from \"@modules/queryPanel/context/types\";\nimport useQueryPanelCommonActions from \"@modules/queryPanel/useQueryPanelCommonActions\";\nimport { LoadingButton, Tooltip } from \"@uicore\";\nimport { useState } from \"react\";\n\nconst DeleteBookmarkButton = ({\n  bookmark,\n}: {\n  bookmark: QueryBookmark;\n}): JSX.Element | null => {\n  const {\n    state: { currentUser },\n  } = useAppContext();\n  const [isSubmitting, setIsSubmitting] = useState(false);\n  const { refetchBookmarks } = useQueryPanelCommonActions();\n\n  const deleteBookmark = async () => {\n    setIsSubmitting(true);\n    const confirmResponse = await executeRequestInSync(\"showWarningMessage\", {\n      infoMessage: \"Do you want to delete this bookmark?\",\n      items: [\"Yes\", \"No\"],\n    });\n    if (confirmResponse === \"No\") {\n      setIsSubmitting(false);\n      return;\n    }\n    try {\n      await executeRequestInSync(\"fetch\", {\n        endpoint: `query/bookmark/${bookmark.id}`,\n        fetchArgs: {\n          method: \"DELETE\",\n        },\n      });\n      executeRequestInAsync(\"sendTelemetryEvent\", {\n        eventName: `query-bookmark-deleted`,\n        properties: {\n          name: bookmark.name,\n          id: bookmark.id,\n        },\n      });\n      executeRequestInAsync(\"showInformationMessage\", {\n        infoMessage: \"Successfully deleted bookmark!\",\n      });\n      refetchBookmarks();\n    } catch (error) {\n      executeRequestInAsync(\"showErrorMessage\", {\n        infoMessage: (error as Error).message,\n      });\n    }\n    setIsSubmitting(false);\n  };\n\n  if (currentUser?.id !== bookmark.created_by_user.id) {\n    return null;\n  }\n\n  return (\n    <Tooltip title=\"Delete this bookmark\">\n      <LoadingButton\n        onClick={deleteBookmark}\n        loading={isSubmitting}\n        className=\"bg-transparent\"\n      >\n        <DeleteIcon />\n      </LoadingButton>\n    </Tooltip>\n  );\n};\n\nexport default DeleteBookmarkButton;\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/queryPanelBookmarks/QueryBookmarkRow.tsx",
    "content": "import { QueryBookmark } from \"@modules/queryPanel/context/types\";\nimport { ListGroupItem, Stack, Tag, Tooltip } from \"@uicore\";\nimport ExecuteQueryButton from \"../queryPanelQueryHistory/ExecuteQueryButton\";\nimport BookmarkPrivacySettingButton from \"./BookmarkPrivacySettingButton\";\nimport DeleteBookmarkButton from \"./DeleteBookmarkButton\";\n\ninterface Props {\n  bookmark: QueryBookmark;\n  onSelect: (bookmark: QueryBookmark) => void;\n  isSharedView?: boolean;\n}\nconst QueryBookmarkRow = ({\n  bookmark,\n  onSelect,\n  isSharedView,\n}: Props): JSX.Element => {\n  return (\n    <ListGroupItem>\n      <Stack onClick={() => onSelect(bookmark)}>\n        {bookmark.name}\n\n        <Stack>\n          {bookmark.tags.slice(0, 2).map((tag) => (\n            <Tag key={tag.id}>{tag.tag}</Tag>\n          ))}\n          {bookmark.tags.length > 2 ? (\n            <Tooltip\n              placement=\"top\"\n              title={bookmark.tags\n                .slice(2)\n                .map((t) => t.tag)\n                .join(\", \")}\n            >\n              <Tag>+{bookmark.tags.length - 2} tags</Tag>\n            </Tooltip>\n          ) : null}\n        </Stack>\n      </Stack>\n      <Stack>\n        {isSharedView ? (\n          <span className=\"me-2\">{bookmark.created_by_user.first_name}</span>\n        ) : null}\n\n        <span>\n          {new Date(bookmark.created_on).toLocaleString(\"default\", {\n            hour: \"2-digit\",\n            minute: \"2-digit\",\n          })}{\" \"}\n          {new Date(bookmark.created_on).toLocaleString(\"default\", {\n            day: \"numeric\",\n            month: \"short\",\n            year: \"2-digit\",\n          })}\n        </span>\n        <ExecuteQueryButton\n          query={bookmark.raw_sql}\n          projectName={\"\"}\n          editorName={bookmark.name}\n        />\n        <BookmarkPrivacySettingButton bookmark={bookmark} />\n        <DeleteBookmarkButton bookmark={bookmark} />\n      </Stack>\n    </ListGroupItem>\n  );\n};\n\nexport default QueryBookmarkRow;\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/queryPanelBookmarks/QueryPanelBookmarks.tsx",
    "content": "import styles from \"../../querypanel.module.scss\";\nimport { Stack, CodeBlock, Label, IconButton, Alert } from \"@uicore\";\nimport { useEffect, useState } from \"react\";\nimport { QueryBookmark } from \"@modules/queryPanel/context/types\";\nimport { ChevronRightIcon, OpenNewIcon } from \"@assets/icons\";\nimport BookmarkAccordion from \"./BookmarkAccordion\";\nimport useQueryPanelState from \"@modules/queryPanel/useQueryPanelState\";\nimport { QueryPanelTitleTabState } from \"../QueryPanelContents/types\";\nimport useQueryPanelCommonActions from \"@modules/queryPanel/useQueryPanelCommonActions\";\nimport { executeRequestInAsync } from \"@modules/app/requestExecutor\";\n\nconst QueryPanelBookmarks = (): JSX.Element => {\n  const [activeBookmark, setActiveBookmark] = useState<QueryBookmark | null>(\n    null,\n  );\n  const { queryBookmarks, tabState, queryBookmarksTagsFromDB } =\n    useQueryPanelState();\n  const { refetchBookmarkTags } = useQueryPanelCommonActions();\n\n  useEffect(() => {\n    if (queryBookmarksTagsFromDB) {\n      return;\n    }\n\n    refetchBookmarkTags();\n  }, [queryBookmarksTagsFromDB]);\n\n  const onSelect = (qh: QueryBookmark) => {\n    setActiveBookmark(qh);\n  };\n\n  const resetActiveBookmark = () => {\n    setActiveBookmark(null);\n  };\n\n  const handleOpenNewClick = () => {\n    executeRequestInAsync(\"openCodeInEditor\", {\n      code: activeBookmark?.raw_sql,\n      name: activeBookmark?.name,\n    });\n  };\n\n  const tags = (queryBookmarksTagsFromDB ?? []).map((t) => t.tag);\n  return (\n    <section\n      className={`${styles.queryTwoCol} ${tabState === QueryPanelTitleTabState.Bookmarks ? \"\" : \"d-none\"}`}\n    >\n      <Stack direction=\"column\" className={styles.limitWidth}>\n        <Alert color=\"warning\">\n          Check out the{\" \"}\n          <a href=\"https://docs.myaltimate.com/govern/querybookmarks/\">\n            documentation\n          </a>{\" \"}\n          to learn more about Query Bookmarks.\n        </Alert>\n        <BookmarkAccordion\n          onSelect={onSelect}\n          privacy=\"private\"\n          title=\"My bookmarks\"\n          tags={tags}\n          bookmarks={queryBookmarks.private?.items ?? []}\n        />\n        <BookmarkAccordion\n          onSelect={onSelect}\n          privacy=\"public\"\n          title=\"Shared bookmarks\"\n          tags={tags}\n          bookmarks={queryBookmarks.public?.items ?? []}\n        />\n      </Stack>\n\n      {activeBookmark ? (\n        <div className={styles.historyDetails}>\n          <IconButton\n            className={styles.closeBtn}\n            color=\"primary\"\n            onClick={resetActiveBookmark}\n          >\n            <ChevronRightIcon />\n          </IconButton>\n          <h4>{activeBookmark.name}</h4>\n          <div>\n            <Stack>\n              <Label>Tags</Label>\n              {activeBookmark.tags.map((t) => t.tag).join(\",\")}\n            </Stack>\n            <Stack>\n              <Label>Adapter</Label>\n              {activeBookmark.adapter_type}\n            </Stack>\n            <Stack>\n              <Label>Shared</Label>\n              {activeBookmark.privacy === \"private\" ? \"No\" : \"Yes\"}\n            </Stack>\n          </div>\n\n          {activeBookmark.raw_sql ? (\n            <CodeBlock\n              code={activeBookmark.raw_sql}\n              language=\"sql\"\n              fileName=\"Code\"\n              showLineNumbers\n              titleActions={\n                <span>\n                  <IconButton\n                    title=\"Open in editor\"\n                    onClick={handleOpenNewClick}\n                  >\n                    <OpenNewIcon />\n                  </IconButton>\n                </span>\n              }\n            />\n          ) : null}\n        </div>\n      ) : null}\n    </section>\n  );\n};\n\nexport default QueryPanelBookmarks;\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/queryPanelBookmarks/utils.ts",
    "content": "import { executeRequestInSync } from \"@modules/app/requestExecutor\";\nimport { panelLogger } from \"@modules/logger\";\nimport { QueryFilters } from \"../filters/Filters\";\nimport { QueryBookmarkResponse } from \"@modules/queryPanel/context/types\";\n\nexport const loadBookmarks = async (\n  setIsLoading: (loading: boolean) => void,\n  privacy: \"public\" | \"private\",\n  filters: Partial<QueryFilters>,\n): Promise<\n  { response: QueryBookmarkResponse; type: \"public\" | \"private\" } | undefined\n> => {\n  setIsLoading(true);\n  try {\n    panelLogger.info(\"[loadBookmarks] \", { filters, privacy });\n    const response = await executeRequestInSync(\"fetch\", {\n      endpoint: `query/bookmark?privacy=${privacy}&${filters.tags?.map((t) => `tags_list=${t}`).join(\"&\")}&search_query=${filters.searchQuery}`,\n      fetchArgs: {\n        method: \"GET\",\n      },\n    });\n    return {\n      response: response as QueryBookmarkResponse,\n      type: privacy,\n    };\n  } catch (error) {\n    panelLogger.error(\"Failed to load bookmarks\", error);\n  } finally {\n    setIsLoading(false);\n  }\n};\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/queryPanelQueryHistory/ExecuteQueryButton.tsx",
    "content": "import { PlayCircleIcon } from \"@assets/icons\";\nimport { executeRequestInAsync } from \"@modules/app/requestExecutor\";\nimport { IconButton } from \"@uicore\";\n\ninterface Props {\n  query: string;\n  projectName: string;\n  editorName: string;\n}\nconst ExecuteQueryButton = ({\n  query,\n  projectName,\n  editorName,\n}: Props): JSX.Element => {\n  const handleClick = () => {\n    executeRequestInAsync(\"executeQuery\", { query, projectName, editorName });\n  };\n  return (\n    <IconButton title=\"Execute query\" onClick={handleClick}>\n      <PlayCircleIcon />\n    </IconButton>\n  );\n};\n\nexport default ExecuteQueryButton;\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/queryPanelQueryHistory/QueryHistoryRow.tsx",
    "content": "import { QueryHistory } from \"@modules/queryPanel/context/types\";\nimport { ListGroupItem } from \"@uicore\";\nimport BookmarkButton from \"../queryPanelBookmarks/BookmarkButton\";\nimport ExecuteQueryButton from \"./ExecuteQueryButton\";\nimport { FileCodeIcon } from \"@assets/icons\";\n\ninterface Props {\n  queryHistory: QueryHistory;\n  onSelect: (queryHistory: QueryHistory) => void;\n}\nconst QueryHistoryRow = ({ queryHistory, onSelect }: Props): JSX.Element => {\n  const handleClick = () => {\n    onSelect(queryHistory);\n  };\n\n  return (\n    <ListGroupItem>\n      <div onClick={handleClick}>\n        <FileCodeIcon />\n        {queryHistory.rawSql}\n      </div>\n      <div>\n        <span>\n          {new Date(queryHistory.timestamp).toLocaleString(\"default\", {\n            hour: \"2-digit\",\n            minute: \"2-digit\",\n          })}{\" \"}\n          {new Date(queryHistory.timestamp).toLocaleString(\"default\", {\n            day: \"numeric\",\n            month: \"short\",\n            year: \"2-digit\",\n          })}\n        </span>\n        <ExecuteQueryButton\n          query={queryHistory.rawSql}\n          projectName={queryHistory.projectName}\n          editorName={queryHistory.modelName}\n        />\n        <BookmarkButton queryHistory={queryHistory} />\n      </div>\n    </ListGroupItem>\n  );\n};\n\nexport default QueryHistoryRow;\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/queryPanelQueryHistory/QueryPanelHistory.tsx",
    "content": "import useQueryPanelState from \"@modules/queryPanel/useQueryPanelState\";\nimport QueryHistoryRow from \"./QueryHistoryRow\";\nimport {\n  CodeBlock,\n  IconButton,\n  Label,\n  ListGroup,\n  Stack,\n  Button,\n} from \"@uicore\";\nimport styles from \"../../querypanel.module.scss\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { QueryHistory } from \"@modules/queryPanel/context/types\";\nimport Filters, { QueryFilters } from \"../filters/Filters\";\nimport { ChevronRightIcon, NoHistoryIcon, OpenNewIcon } from \"@assets/icons\";\nimport { executeRequestInAsync } from \"@modules/app/requestExecutor\";\nimport useQueryPanelCommonActions from \"@modules/queryPanel/useQueryPanelCommonActions\";\nimport AutoCollapsingNotification from \"@modules/AutoCollapsingNotification/AutoCollapsingNotification\";\n\nconst QueryPanelHistory = (): JSX.Element => {\n  const [filters, setFilters] = useState<QueryFilters>({ tags: [] });\n\n  const [activeHistory, setActiveHistory] = useState<QueryHistory | null>(null);\n  const { queryHistory, queryBookmarksTagsFromDB } = useQueryPanelState();\n  const { refetchBookmarkTags } = useQueryPanelCommonActions();\n\n  useEffect(() => {\n    void executeRequestInAsync(\"getQueryHistory\", {});\n  }, []);\n\n  useEffect(() => {\n    if (queryBookmarksTagsFromDB) {\n      return;\n    }\n\n    refetchBookmarkTags();\n  }, [queryBookmarksTagsFromDB]);\n\n  const onFiltersChange = (data: { tags?: string[]; searchQuery?: string }) => {\n    setFilters((prev) => ({ ...prev, ...data }));\n  };\n\n  const onSelect = (qh: QueryHistory) => {\n    setActiveHistory(qh);\n  };\n\n  const historyItems = useMemo(() => {\n    return queryHistory.filter((qh) => {\n      if (filters.searchQuery) {\n        return qh.rawSql\n          .toLowerCase()\n          .includes(filters.searchQuery.toLowerCase());\n      }\n      return true;\n    });\n  }, [queryHistory, filters]);\n\n  const resetActiveHistory = () => {\n    setActiveHistory(null);\n  };\n\n  const handleViewResultSet = () => {\n    executeRequestInAsync(\"viewResultSet\", {\n      queryHistory: activeHistory,\n    });\n  };\n\n  const handleOpenNewClick = () => {\n    executeRequestInAsync(\"openCodeInEditor\", { code: activeHistory?.rawSql });\n  };\n\n  return (\n    <section className={styles.queryTwoCol}>\n      <div className={`${styles.limitWidth} ${styles.queryHistoryList}`}>\n        <header className=\"d-flex justify-content-between\">\n          <h4 className=\"d-flex gap-2\">\n            History\n            <span className=\"p4 font-weight-normal\">\n              <AutoCollapsingNotification\n                delay={10000}\n                text=\"History is maintained solely for the duration of the current session and will be purged upon reloading or restarting VSCode.\"\n              />\n            </span>\n          </h4>\n          <Filters\n            tags={[]}\n            onFiltersChange={onFiltersChange}\n            filters={filters}\n          />\n        </header>\n        {historyItems.length === 0 ? (\n          <Stack className={styles.noBookmark} direction=\"column\">\n            <div className=\"no-results\">\n              <NoHistoryIcon />\n            </div>\n            <div>\n              <h6>Execute your queries to view in history</h6>\n              <p>Queries can be bookmarked for sharing with team.</p>\n              <p>\n                <Button\n                  onClick={() => executeRequestInAsync(\"runAdhocQuery\", {})}\n                >\n                  + New query\n                </Button>\n              </p>\n            </div>\n          </Stack>\n        ) : (\n          <ListGroup>\n            {historyItems.map((qh) => (\n              <QueryHistoryRow\n                queryHistory={qh}\n                key={qh.timestamp}\n                onSelect={onSelect}\n              />\n            ))}\n          </ListGroup>\n        )}\n      </div>\n      {activeHistory ? (\n        <div className={styles.historyDetails}>\n          <IconButton\n            className={styles.closeBtn}\n            color=\"primary\"\n            onClick={resetActiveHistory}\n          >\n            <ChevronRightIcon />\n          </IconButton>\n          <div>\n            {activeHistory.data ? (\n              <Stack className=\"justify-content-end mb-2\">\n                <Button color=\"primary\" onClick={handleViewResultSet}>\n                  Show results\n                </Button>\n              </Stack>\n            ) : null}\n            <Stack>\n              <Label>Adapter</Label>\n              {activeHistory.adapter}\n            </Stack>\n            <Stack>\n              <Label>Project Name</Label>\n              {activeHistory.projectName}\n            </Stack>\n            <Stack>\n              <Label>Time taken</Label>\n              {activeHistory.duration}ms\n            </Stack>\n          </div>\n          <CodeBlock\n            code={activeHistory.rawSql}\n            language=\"sql\"\n            fileName=\"Code\"\n            showLineNumbers\n            titleActions={\n              <span>\n                <IconButton title=\"Open in editor\" onClick={handleOpenNewClick}>\n                  <OpenNewIcon />\n                </IconButton>\n              </span>\n            }\n          />\n        </div>\n      ) : null}\n    </section>\n  );\n};\n\nexport default QueryPanelHistory;\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/runAdhocQueryButton/NewNotebook.tsx",
    "content": "import {\n  executeRequestInAsync,\n  executeRequestInSync,\n} from \"@modules/app/requestExecutor\";\nimport { panelLogger } from \"@modules/logger\";\nimport NewFeatureIndicator from \"@modules/newFeature/NewFeatureIndicator\";\nimport { Button } from \"@uicore\";\nimport { useEffect, useState } from \"react\";\n\nconst NewNotebookButton = (): JSX.Element | null => {\n  const [show, setShow] = useState(false);\n  const handleClick = () => {\n    executeRequestInAsync(\"openNewNotebook\", {});\n  };\n\n  useEffect(() => {\n    executeRequestInSync(\"configEnabled\", {\n      section: \"dbt\",\n      config: \"enableNotebooks\",\n    })\n      .then((response) => setShow(response as boolean))\n      .catch((err) => panelLogger.error(\"error while getting config\", err));\n  }, []);\n\n  if (!show) {\n    return null;\n  }\n\n  return (\n    <>\n      <NewFeatureIndicator featureKey=\"new-notebook-button-clicked\">\n        <Button outline onClick={handleClick}>\n          + New notebook\n        </Button>\n      </NewFeatureIndicator>\n    </>\n  );\n};\n\nexport default NewNotebookButton;\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/components/runAdhocQueryButton/RunAdhocQueryButton.tsx",
    "content": "import { AddIcon } from \"@assets/icons\";\nimport { executeRequestInAsync } from \"@modules/app/requestExecutor\";\nimport { Button } from \"@uicore\";\n\nconst RunAdhocQueryButton = (): JSX.Element => {\n  const handleClick = () => {\n    executeRequestInAsync(\"runAdhocQuery\", {});\n  };\n  return (\n    <Button\n      aria-label=\"open-adhoc-query\"\n      outline\n      onClick={handleClick}\n      icon={<AddIcon />}\n    >\n      New query\n    </Button>\n  );\n};\n\nexport default RunAdhocQueryButton;\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/constants.ts",
    "content": "export const HINTS = [\n  {\n    message: \"Generate models from SQL or source\",\n    link: \"https://docs.myaltimate.com/develop/genmodelSQL/\",\n  },\n  {\n    message: \"Generate documentation for dbt models\",\n    link: \"https://docs.myaltimate.com/document/generatedoc/\",\n  },\n  {\n    message: \"Defer building upstream models\",\n    link: \"https://docs.myaltimate.com/test/defertoprod/\",\n  },\n  {\n    message: \"Get a query explanation & ask questions\",\n    link: \"https://docs.myaltimate.com/develop/explanation/\",\n  },\n  {\n    message: \"Update dbt Model in natural language\",\n    link: \"https://docs.myaltimate.com/develop/updatemodel/\",\n  },\n  {\n    message: \"Explore real-time column lineage\",\n    link: \"https://docs.myaltimate.com/test/lineage/\",\n  },\n  {\n    message: \"Write & edit dbt tests in UI\",\n    link: \"https://docs.myaltimate.com/test/writetests/\",\n  },\n];\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/context/queryPanelSlice.ts",
    "content": "import { createSlice, PayloadAction } from \"@reduxjs/toolkit\";\nimport {\n  QueryBookmarkResponse,\n  QueryPanelStateProps,\n  QueryPanelViewType,\n} from \"./types\";\nimport { QueryPanelTitleTabState } from \"../components/QueryPanelContents/types\";\n\nexport const initialState = {\n  viewType: QueryPanelViewType.DEFAULT,\n  loading: false,\n  queryResults: undefined,\n  queryExecutionInfo: undefined,\n  queryResultsError: undefined,\n  compiledCodeMarkup: undefined,\n  hintIndex: -1,\n  limit: undefined,\n  perspectiveTheme: \"Vintage\",\n  queryHistory: [],\n  queryBookmarks: {},\n  queryHistoryDisabled: false,\n  tabState: QueryPanelTitleTabState.Preview,\n  queryBookmarksTagsFromDB: undefined,\n  activeEditor: undefined,\n} as QueryPanelStateProps;\n\nconst queryPanelSlice = createSlice({\n  name: \"queryPanelState\",\n  initialState,\n  reducers: {\n    setActiveEditor: (\n      state,\n      action: PayloadAction<QueryPanelStateProps[\"activeEditor\"]>,\n    ) => {\n      state.activeEditor = action.payload;\n    },\n    resetData: (state) => {\n      return {\n        ...state,\n        queryResults: undefined,\n        queryExecutionInfo: undefined,\n        queryResultsError: undefined,\n        compiledCodeMarkup: undefined,\n        loading: false,\n      };\n    },\n    setQueryBookmarksTagsFromDB: (\n      state,\n      action: PayloadAction<QueryPanelStateProps[\"queryBookmarksTagsFromDB\"]>,\n    ) => {\n      state.queryBookmarksTagsFromDB = action.payload;\n    },\n    setViewType: (\n      state,\n      action: PayloadAction<QueryPanelStateProps[\"viewType\"]>,\n    ) => {\n      state.viewType = action.payload;\n    },\n    setHintIndex: (\n      state,\n      action: PayloadAction<QueryPanelStateProps[\"hintIndex\"]>,\n    ) => {\n      state.hintIndex = action.payload;\n    },\n    setTabState: (\n      state,\n      action: PayloadAction<QueryPanelStateProps[\"tabState\"]>,\n    ) => {\n      state.tabState = action.payload;\n    },\n    setQueryHistoryDisabled: (\n      state,\n      action: PayloadAction<QueryPanelStateProps[\"queryHistoryDisabled\"]>,\n    ) => {\n      state.queryHistoryDisabled = action.payload;\n    },\n    setQueryHistory: (\n      state,\n      action: PayloadAction<QueryPanelStateProps[\"queryHistory\"]>,\n    ) => {\n      state.queryHistory = action.payload;\n    },\n    setPerspectiveTheme: (\n      state,\n      action: PayloadAction<QueryPanelStateProps[\"perspectiveTheme\"]>,\n    ) => {\n      state.perspectiveTheme = action.payload || \"Vintage\";\n    },\n    setCompiledCodeMarkup: (\n      state,\n      action: PayloadAction<QueryPanelStateProps[\"compiledCodeMarkup\"]>,\n    ) => {\n      state.compiledCodeMarkup = action.payload;\n    },\n    setLimit: (state, action: PayloadAction<QueryPanelStateProps[\"limit\"]>) => {\n      state.limit = action.payload;\n    },\n    setQueryResultsError: (\n      state,\n      action: PayloadAction<QueryPanelStateProps[\"queryResultsError\"]>,\n    ) => {\n      state.loading = false;\n      state.queryResultsError = action.payload;\n    },\n    setQueryExecutionInfo: (\n      state,\n      action: PayloadAction<QueryPanelStateProps[\"queryExecutionInfo\"]>,\n    ) => {\n      state.queryExecutionInfo = action.payload;\n    },\n    setQueryResults: (\n      state,\n      action: PayloadAction<QueryPanelStateProps[\"queryResults\"]>,\n    ) => {\n      state.queryResults = action.payload;\n    },\n    setLoading: (\n      state,\n      action: PayloadAction<QueryPanelStateProps[\"loading\"]>,\n    ) => {\n      state.loading = action.payload;\n    },\n    setQueryBookmarks: (\n      state,\n      action: PayloadAction<{\n        response: QueryBookmarkResponse;\n        type: \"public\" | \"private\";\n      }>,\n    ) => {\n      state.queryBookmarks[action.payload.type] = action.payload.response;\n    },\n  },\n});\n\nexport const {\n  setViewType,\n  resetData,\n  setLoading,\n  setHintIndex,\n  setCompiledCodeMarkup,\n  setQueryResultsError,\n  setQueryExecutionInfo,\n  setQueryResults,\n  setLimit,\n  setPerspectiveTheme,\n  setQueryHistory,\n  setQueryBookmarks,\n  setQueryHistoryDisabled,\n  setTabState,\n  setQueryBookmarksTagsFromDB,\n  setActiveEditor,\n} = queryPanelSlice.actions;\n\nexport default queryPanelSlice;\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/context/types.ts",
    "content": "import { TableData } from \"@finos/perspective\";\nimport { QueryPanelTitleTabState } from \"../components/QueryPanelContents/types\";\nimport { User } from \"@modules/app/types\";\n\nexport interface QueryHistory {\n  rawSql: string;\n  compiledSql: string;\n  timestamp: number;\n  duration: number;\n  adapter: string;\n  projectName: string;\n  modelName: string;\n  data?: TableData;\n}\n\nexport interface QueryBookmarkResponse {\n  items: QueryBookmark[];\n  page: number;\n  pages: number;\n  size: number;\n  total: number;\n}\n\nexport interface QueryBookmark {\n  id: number;\n  compiled_sql: string;\n  raw_sql: string;\n  name: string;\n  description: string;\n  adapter_type: string;\n  created_on: string;\n  updated_on: string;\n  tags: { id: number; tag: string }[];\n  privacy: \"public\" | \"private\";\n  created_by_user: User;\n}\n\nexport enum QueryPanelViewType {\n  DEFAULT,\n  OPEN_RESULTS_IN_TAB,\n  OPEN_RESULTS_FROM_HISTORY_BOOKMARKS,\n}\n\nexport interface QueryPanelStateProps {\n  viewType: QueryPanelViewType;\n  loading: boolean;\n  queryResults?: {\n    data: TableData;\n    columnNames: string[];\n    columnTypes: string[];\n    raw_sql: string;\n    compiled_sql: string;\n  };\n  queryExecutionInfo?: { elapsedTime: number };\n  queryResultsError?: {\n    message: string;\n    code: number;\n    data: string;\n  };\n  compiledCodeMarkup?: string;\n  hintIndex: number;\n  limit?: number;\n  perspectiveTheme: string;\n  queryHistory: QueryHistory[];\n  queryBookmarks: {\n    private?: QueryBookmarkResponse;\n    public?: QueryBookmarkResponse;\n  };\n  queryHistoryDisabled: boolean;\n  queryBookmarksTagsFromDB?: { id: number; tag: string }[];\n  tabState: QueryPanelTitleTabState;\n  activeEditor?: {\n    filepath: string;\n    query: string;\n  };\n}\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/querypanel.module.scss",
    "content": ".queryPanel {\n  position: absolute;\n  width: 100vw;\n  height: 100vh;\n  box-sizing: border-box;\n  top: 0;\n  left: 0;\n  padding: 0.5rem;\n  display: flex;\n  flex-direction: column;\n  overflow-y: overlay;\n\n  :global .nav-link {\n    cursor: pointer;\n    border-bottom: 2px solid transparent;\n    color: var(--text-color--title);\n\n    &:global.active {\n      border-bottom: 2px solid var(--text-color--title);\n    }\n  }\n\n  .loader {\n    justify-content: center;\n    align-items: center;\n    height: 100%;\n    margin-top: -1rem;\n\n    img {\n      width: 10rem;\n    }\n  }\n\n  .noBookmark {\n    min-height: 200px;\n    justify-content: center;\n    align-items: center;\n    flex-direction: column;\n    text-align: center;\n    padding: 2rem;\n    :global .no-results{\n      background-color: var(--background--base);\n      border-radius: 50%;\n      height: 100px;\n      width: 100px;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n    }\n  }\n  .queryTwoCol {\n    display: flex;\n    align-items: flex-start;\n    gap: 2rem;\n    max-height: 100%;\n    .historyDetails {\n      position: relative;\n      width: 400px;\n      display: flex;\n      flex-direction: column;\n      background-color: var(--background--02);\n      padding: 1rem;\n      border-radius: 10px;\n      border-top-left-radius: 0;\n      max-height: 100%;\n\n      .closeBtn{\n        position: absolute;\n        top: 0;\n        left: -22px;\n        padding: 2px 3px;\n        border-radius: 0;\n      }\n      :global .card {\n        margin-top: 1rem !important;\n      }\n      :global .card-title {\n        padding-bottom: 0.5rem;\n        margin-bottom: 0;\n        padding-left: 0.5rem;\n        padding-top: 0.5rem;\n      }\n      pre {\n        border: none !important;\n      }\n      :global .stack-row {\n        justify-content: space-between;\n      }\n    }\n    .limitWidth {\n      max-width: 100%;\n      min-width: 0;\n      flex: 1;\n    }\n    @media (min-width: 1400px) {\n      .limitWidth {\n        max-width: 1440px;\n      }\n    }\n\n    .queryHistoryList {\n      background-color: var(--background--01);\n      border-radius: 5px;\n\n      [class*=\"_accordion_\"] {\n        max-height: 300px;\n        overflow-y: overlay;\n        scrollbar-width: thin;\n      }\n\n      header {\n        padding: 0.5rem 1rem 0 1rem;\n        border-bottom: 1px solid var(--stroke--default);\n      }\n      :global .list-group {\n        border-radius: 0;\n        padding: 1rem;\n        :global .list-group-item {\n          background-color: var(--background--base);\n          color: var(--text-color--title);\n          margin-bottom: 1rem;\n          border-radius: 4px;\n          border: 1px solid transparent;\n          display: flex;\n          justify-content: space-between;\n          align-items: center;\n          cursor: pointer;\n          padding: 4px 0.5rem;\n          min-height: 2.5rem;\n          &:hover {\n            border-color: var(--primary-color);\n          }\n\n          > div:first-child {\n            text-overflow: ellipsis;\n            overflow: hidden;\n            white-space: nowrap;\n            flex: 1;\n            max-width: 60%;\n\n            .codicon {\n              color: #89d185;\n              margin-right: 0.5rem;\n            }\n          }\n\n          > div:last-child {\n            gap: 2px;\n            span {\n              vertical-align: bottom;\n            }\n            button {\n              display: none;\n              padding: 1px 4px;\n            }\n          }\n\n          &:hover {\n            > div:last-child {\n              button {\n                display: inline-block;\n                color: var(--text-color--title);\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n}\n\n.selectControl {\n  border: 1px solid var(--stroke--disable);\n  border-radius: 5px;\n\n  [class*=\"-control\"] {\n    min-height: 28px;\n    align-items: start;\n\n    [class*=\"-indicatorContainer\"] {\n      padding: 4px;\n    }\n  }\n}\n\n.searchInput::-webkit-search-cancel-button {\n  display: none;\n}"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/useQueryPanelCommonActions.ts",
    "content": "import { executeRequestInSync } from \"@modules/app/requestExecutor\";\nimport { panelLogger } from \"@modules/logger\";\nimport { loadBookmarks } from \"./components/queryPanelBookmarks/utils\";\nimport {\n  setQueryBookmarks,\n  setQueryBookmarksTagsFromDB,\n} from \"./context/queryPanelSlice\";\nimport { QueryBookmark } from \"./context/types\";\nimport { useQueryPanelDispatch } from \"./QueryPanelProvider\";\n\nconst useQueryPanelCommonActions = (): {\n  refetchBookmarks: () => void;\n  refetchBookmarkTags: () => void;\n} => {\n  const dispatch = useQueryPanelDispatch();\n  const getBookmarks = async (privacy: \"public\" | \"private\") => {\n    panelLogger.info(\"Loading bookmarks\");\n    const response = await loadBookmarks(\n      (_isLoading: boolean) => null,\n      privacy,\n      { tags: [], searchQuery: \"\" },\n    );\n\n    if (response) {\n      dispatch(setQueryBookmarks(response));\n    }\n  };\n\n  const refetchBookmarks = () => {\n    void getBookmarks(\"private\");\n    void getBookmarks(\"public\");\n  };\n\n  const refetchBookmarkTags = () => {\n    executeRequestInSync(\"fetch\", {\n      endpoint: `query/bookmark/tags`,\n      fetchArgs: {\n        method: \"GET\",\n      },\n    })\n      .then((response) => {\n        dispatch(\n          setQueryBookmarksTagsFromDB(response as QueryBookmark[\"tags\"]),\n        );\n      })\n      .catch((error) => {\n        panelLogger.error(\"Error fetching tags\", error);\n      });\n  };\n\n  return {\n    refetchBookmarks,\n    refetchBookmarkTags,\n  };\n};\n\nexport default useQueryPanelCommonActions;\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/useQueryPanelListeners.ts",
    "content": "import { IncomingMessageProps } from \"@modules/app/types\";\nimport { useCallback, useEffect, useRef } from \"react\";\nimport { useQueryPanelDispatch } from \"./QueryPanelProvider\";\nimport {\n  resetData,\n  setCompiledCodeMarkup,\n  setHintIndex,\n  setLimit,\n  setLoading,\n  setPerspectiveTheme,\n  setQueryHistoryDisabled,\n  setQueryExecutionInfo,\n  setQueryHistory,\n  setQueryResults,\n  setQueryResultsError,\n  setViewType,\n  setActiveEditor,\n} from \"./context/queryPanelSlice\";\nimport useQueryPanelState from \"./useQueryPanelState\";\nimport { panelLogger } from \"@modules/logger\";\nimport { executeRequestInSync } from \"@modules/app/requestExecutor\";\nimport { HINTS } from \"./constants\";\nimport {\n  QueryHistory,\n  QueryPanelStateProps,\n  QueryPanelViewType,\n} from \"./context/types\";\n\nconst useQueryPanelListeners = (): { loading: boolean } => {\n  const dispatch = useQueryPanelDispatch();\n  const { loading, hintIndex, queryResults } = useQueryPanelState();\n  const hintInterval = useRef<NodeJS.Timeout>();\n  const hintIndexRef = useRef<number>(hintIndex);\n  const queryExecutionTimer = useRef<NodeJS.Timeout>();\n  const queryStart = useRef(Date.now());\n\n  useEffect(() => {\n    hintIndexRef.current = hintIndex;\n  }, [hintIndex]);\n\n  const handleHintMessage = useCallback(() => {\n    dispatch(setHintIndex(-1));\n    HINTS.sort(() => Math.random() - 0.5);\n    dispatch(setHintIndex((hintIndexRef.current + 1) % HINTS.length));\n\n    hintInterval.current = setInterval(() => {\n      dispatch(setHintIndex((hintIndexRef.current + 1) % HINTS.length));\n    }, 3500);\n  }, [dispatch, hintIndex]);\n\n  const clearData = () => {\n    dispatch(resetData());\n    queryStart.current = Date.now();\n  };\n\n  const endQueryExecutionTimer = () =>\n    clearTimeout(queryExecutionTimer.current);\n\n  const handleLoading = useCallback(() => {\n    if (loading) {\n      return;\n    }\n    clearData();\n    dispatch(setLoading(true));\n    queryExecutionTimer.current = setInterval(() => {\n      const now = Date.now();\n      const elapsedTime = Math.round((now - queryStart.current) / 100) / 10;\n      const time = isNaN(elapsedTime) ? 0 : elapsedTime;\n      dispatch(setQueryExecutionInfo({ elapsedTime: time }));\n    }, 100);\n    handleHintMessage();\n  }, [loading, dispatch, handleHintMessage]);\n\n  const clearHintInterval = () => {\n    clearInterval(hintInterval.current);\n    hintInterval.current = undefined;\n  };\n\n  const handleError = (args: Record<string, unknown>) => {\n    dispatch(\n      setQueryResultsError(\n        args.error as QueryPanelStateProps[\"queryResultsError\"],\n      ),\n    );\n    dispatch(setCompiledCodeMarkup(args.compiled_sql as string));\n    clearHintInterval();\n    endQueryExecutionTimer();\n  };\n\n  const handleQueryResults = (args: Record<string, unknown>) => {\n    dispatch(setLoading(false));\n    dispatch(\n      setQueryResults({\n        data: args.rows,\n        columnNames: args.columnNames,\n        columnTypes: args.columnTypes,\n        raw_sql: args.raw_sql,\n      } as QueryPanelStateProps[\"queryResults\"]),\n    );\n    dispatch(setCompiledCodeMarkup(args.compiled_sql as string));\n    clearHintInterval();\n    endQueryExecutionTimer();\n  };\n\n  const handleResetState = () => {\n    clearData();\n    clearHintInterval();\n    endQueryExecutionTimer();\n  };\n\n  const handleIncomingQueryHistory = (args: QueryHistory[]) => {\n    dispatch(setQueryHistory(args));\n  };\n\n  const collectQueryResultsDebugInfo = () => {\n    const perspectiveViewer = document.querySelector(\"perspective-viewer\");\n    const table = perspectiveViewer\n      ?.querySelector(\"perspective-datagrid-json-viewer-plugin\")\n      ?.shadowRoot?.querySelectorAll(\"regular-table tr\");\n    void executeRequestInSync(\"collectQueryResultsDebugInfo\", {\n      perspectiveHeight: perspectiveViewer?.offsetHeight,\n      perspectiveScrollHeight: perspectiveViewer?.scrollHeight,\n      tableRowsCount: table?.length,\n      queryResults,\n    });\n  };\n\n  const onMesssage = useCallback(\n    (event: MessageEvent<IncomingMessageProps>) => {\n      panelLogger.info(\"query panel onMesssage\", event.data);\n      const { command, ...args } = event.data;\n      switch (command) {\n        case \"renderError\":\n          handleError(args);\n          break;\n        case \"resetState\":\n          handleResetState();\n          break;\n        case \"renderQuery\":\n          handleQueryResults(args);\n          break;\n        case \"renderLoading\":\n          handleLoading();\n          break;\n        case \"queryHistory\":\n          handleIncomingQueryHistory(args.args.body as QueryHistory[]);\n          break;\n        case \"updateViewType\":\n          dispatch(\n            setViewType(\n              (args.args.body as { type: QueryPanelViewType })\n                .type as QueryPanelViewType,\n            ),\n          );\n          break;\n        case \"getContext\":\n          // @ts-expect-error valid type\n          dispatch(setLimit(args.limit as number));\n          // @ts-expect-error valid type\n          dispatch(setPerspectiveTheme(args.perspectiveTheme as string));\n          dispatch(\n            // @ts-expect-error valid type\n            setQueryHistoryDisabled(args.queryHistoryDisabled as boolean),\n          );\n          dispatch(\n            setActiveEditor(\n              // @ts-expect-error valid type\n              args.activeEditor as QueryPanelStateProps[\"activeEditor\"],\n            ),\n          );\n          break;\n        case \"collectQueryResultsDebugInfo\":\n          collectQueryResultsDebugInfo();\n          break;\n        default:\n          break;\n      }\n    },\n    [handleLoading, dispatch],\n  );\n\n  useEffect(() => {\n    void executeRequestInSync(\"getQueryPanelContext\", {});\n  }, []);\n\n  useEffect(() => {\n    window.addEventListener(\"message\", onMesssage);\n\n    return () => {\n      window.removeEventListener(\"message\", onMesssage);\n    };\n  }, [onMesssage]);\n\n  useEffect(() => {\n    void executeRequestInSync(\"getQueryTabData\", {}).then((data) => {\n      if (data) {\n        const typedData = data as QueryPanelStateProps;\n        handleQueryResults({\n          rows: typedData?.queryResults?.data,\n          columnNames: typedData?.queryResults?.columnNames,\n          columnTypes: typedData?.queryResults?.columnTypes,\n          compiled_sql: typedData.compiledCodeMarkup,\n        });\n        dispatch(\n          setQueryExecutionInfo({\n            elapsedTime: typedData.queryExecutionInfo!.elapsedTime,\n          }),\n        );\n      }\n    });\n  }, []);\n\n  return { loading };\n};\n\nexport default useQueryPanelListeners;\n"
  },
  {
    "path": "webview_panels/src/modules/queryPanel/useQueryPanelState.ts",
    "content": "import { useContext } from \"react\";\nimport { QueryPanelContext } from \"./QueryPanelProvider\";\nimport { QueryPanelStateProps } from \"./context/types\";\n\nconst useQueryPanelState = (): QueryPanelStateProps & {\n  hasData: boolean;\n  hasError: boolean;\n  hasCode: boolean;\n  queryResultsRowCount: number;\n} => {\n  const { state } = useContext(QueryPanelContext);\n\n  const hasData = Boolean(state.queryResults);\n  const hasError = Boolean(state.queryResultsError?.data);\n  const hasCode = Boolean(state.compiledCodeMarkup);\n  const data = state.queryResults?.data;\n\n  return {\n    ...state,\n    hasData,\n    hasError,\n    hasCode,\n    queryResultsRowCount: (data as [] | undefined)?.length ?? 0,\n  };\n};\n\nexport default useQueryPanelState;\n"
  },
  {
    "path": "webview_panels/src/modules/vscode/index.ts",
    "content": "/* eslint-disable */\n// https://github.com/microsoft/vscode-webview-ui-toolkit-samples/blob/main/frameworks/hello-world-react-vite/webview-ui/src/utilities/vscode.ts\nimport { panelLogger } from \"@modules/logger\";\nimport type { WebviewApi } from \"vscode-webview\";\n\n/**\n * A utility wrapper around the acquireVsCodeApi() function, which enables\n * message passing and state management between the webview and extension\n * contexts.\n *\n * This utility also enables webview code to be run in a web browser-based\n * dev server by using native web browser features that mock the functionality\n * enabled by acquireVsCodeApi.\n */\nclass VSCodeAPIWrapper {\n  private readonly vsCodeApi: WebviewApi<unknown> | undefined;\n\n  constructor() {\n    // Check if the acquireVsCodeApi function exists in the current development\n    // context (i.e. VS Code development window or web browser)\n    if (typeof acquireVsCodeApi === \"function\") {\n      this.vsCodeApi = acquireVsCodeApi();\n    }\n  }\n\n  /**\n   * Post a message (i.e. send arbitrary data) to the owner of the webview.\n   *\n   * @remarks When running webview code inside a web browser, postMessage will instead\n   * log the given message to the console.\n   *\n   * @param message Abitrary data (must be JSON serializable) to send to the extension context.\n   */\n  public postMessage(message: unknown) {\n    if (this.vsCodeApi) {\n      this.vsCodeApi.postMessage(message);\n    } else {\n      panelLogger.log(message);\n    }\n  }\n\n  /**\n   * Get the persistent state stored for this webview.\n   *\n   * @remarks When running webview source code inside a web browser, getState will retrieve state\n   * from local storage (https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage).\n   *\n   * @return The current state or `undefined` if no state has been set.\n   */\n  public getState(): unknown | undefined {\n    if (this.vsCodeApi) {\n      return this.vsCodeApi.getState();\n    } else {\n      const state = localStorage.getItem(\"vscodeState\");\n      return state ? JSON.parse(state) : undefined;\n    }\n  }\n\n  /**\n   * Set the persistent state stored for this webview.\n   *\n   * @remarks When running webview source code inside a web browser, setState will set the given\n   * state using local storage (https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage).\n   *\n   * @param newState New persisted state. This must be a JSON serializable object. Can be retrieved\n   * using {@link getState}.\n   *\n   * @return The new state.\n   */\n  public setState<T extends unknown | undefined>(newState: T): T {\n    if (this.vsCodeApi) {\n      return this.vsCodeApi.setState(newState);\n    } else {\n      localStorage.setItem(\"vscodeState\", JSON.stringify(newState));\n      return newState;\n    }\n  }\n}\n\n// Exports class singleton to prevent multiple invocations of acquireVsCodeApi.\nexport const vscode = new VSCodeAPIWrapper();\n"
  },
  {
    "path": "webview_panels/src/notebook/index.tsx",
    "content": "import type { ActivationFunction, OutputItem } from \"vscode-notebook-renderer\";\nimport AllItems from \"./renderer\";\nimport \"bootstrap/dist/css/bootstrap.min.css\";\nimport \"@uicore/theme.scss\";\nimport \"../main.scss\";\nimport ReactDOM from \"react-dom/client\";\nimport { panelLogger } from \"@modules/logger\";\nimport { QueryPanelStateProps } from \"@modules/queryPanel/context/types\";\n\nexport const activate: ActivationFunction = () => {\n  return {\n    renderOutputItem(info: OutputItem, element: HTMLElement) {\n      const data =\n        info.json() as unknown as QueryPanelStateProps[\"queryResults\"];\n      panelLogger.log(\"renderOutputItem\", info.json(), element);\n      const root = document.createElement(\"div\");\n      root.id = \"root\";\n      element.append(root);\n      ReactDOM.createRoot(root).render(\n        data ? <AllItems items={data} /> : <div>No result</div>,\n      );\n    },\n  };\n};\n"
  },
  {
    "path": "webview_panels/src/notebook/renderer.module.scss",
    "content": ".perspectiveWrapper {\n    max-height: 400px;\n    overflow-y: auto;\n    width: 98%;\n}"
  },
  {
    "path": "webview_panels/src/notebook/renderer.tsx",
    "content": "import PerspectiveViewer from \"@modules/queryPanel/components/perspective/PerspectiveViewer\";\nimport type { QueryPanelStateProps } from \"@modules/queryPanel/context/types\";\nimport classes from \"./renderer.module.scss\";\nimport PreTag from \"@modules/markdown/PreTag\";\nimport { CodeBlock, Nav, NavItem, NavLink, Stack } from \"@uicore\";\nimport PerspectiveErrorBoundary from \"@modules/queryPanel/components/perspective/PerspectiveErrorBoundary\";\nimport { QueryPanelTitleTabState } from \"@modules/queryPanel/components/QueryPanelContents/types\";\nimport { useState } from \"react\";\n\ninterface Props {\n  items: NonNullable<QueryPanelStateProps[\"queryResults\"]>;\n}\nconst AllItems = ({ items }: Props): JSX.Element => {\n  const [tabState, setTabState] = useState(QueryPanelTitleTabState.Preview);\n  const compiledCodeMarkup = items.compiled_sql;\n  return (\n    <Stack direction=\"column\" className=\"mt-2\">\n      <Nav tabs>\n        <NavItem>\n          <NavLink\n            active={QueryPanelTitleTabState.Preview === tabState}\n            onClick={() => setTabState(QueryPanelTitleTabState.Preview)}\n            className=\"cursor-pointer\"\n          >\n            Query results{\" \"}\n          </NavLink>\n        </NavItem>\n        {compiledCodeMarkup ? (\n          <NavItem>\n            <NavLink\n              active={QueryPanelTitleTabState.Sql === tabState}\n              onClick={() => setTabState(QueryPanelTitleTabState.Sql)}\n              className=\"cursor-pointer\"\n            >\n              SQL\n            </NavLink>\n          </NavItem>\n        ) : null}\n      </Nav>\n      {tabState === QueryPanelTitleTabState.Preview ? (\n        <div className={classes.perspectiveWrapper}>\n          <PerspectiveErrorBoundary>\n            <PerspectiveViewer\n              columnNames={items.columnNames}\n              columnTypes={items.columnTypes}\n              data={items.data}\n              styles={{ minHeight: 100, height: 400 }}\n            />\n          </PerspectiveErrorBoundary>\n        </div>\n      ) : null}\n      {tabState === QueryPanelTitleTabState.Sql && compiledCodeMarkup ? (\n        <div style={{ width: \"fit-content\" }}>\n          <PreTag text={compiledCodeMarkup}>\n            <CodeBlock\n              code={compiledCodeMarkup}\n              language=\"sql\"\n              showLineNumbers\n            />\n          </PreTag>\n        </div>\n      ) : null}\n    </Stack>\n  );\n};\n\nexport default AllItems;\n"
  },
  {
    "path": "webview_panels/src/testUtils/conversations/index.ts",
    "content": "import { Sync } from \"factory.ts\";\nimport { faker } from \"@faker-js/faker\";\nimport { Conversation, ConversationGroup } from \"@lib\";\n\nexport const ConversationFactory = Sync.makeFactory<Conversation>({\n  conversation_id: faker.number.int(),\n  user_id: faker.number.int(),\n  message: faker.lorem.lines(),\n  timestamp: faker.date.past().toISOString(),\n});\nexport const ConversationGroupFactory = Sync.makeFactory<ConversationGroup>({\n  conversation_group_id: faker.number.int(),\n  owner: faker.number.int(),\n  meta: {\n    filePath: faker.system.filePath(),\n    range: {\n      end: { line: 10, character: 2 },\n      start: { line: 6, character: 0 },\n    },\n    uniqueId: \"model.jaffle_shop.customers\",\n    highlight: \"orders as (\\n\\n    select * from {{ ref('stg_orders') }}\\n\\n),\",\n    resource_type: \"model\",\n  },\n  status: \"Pending\",\n  conversations: [],\n});\n"
  },
  {
    "path": "webview_panels/src/testUtils/datapilot/docGen.ts",
    "content": "import { Sync, each } from \"factory.ts\";\nimport { faker } from \"@faker-js/faker\";\nimport {\n  DataPilotChat,\n  DataPilotChatAction,\n  RequestState,\n  RequestTypes,\n} from \"@modules/dataPilot/types\";\n\nexport const DatapilotDocGenFactory = Sync.makeFactory<DataPilotChat>({\n  id: each(() => faker.string.uuid()),\n  query: faker.lorem.sentence(),\n  requestType: RequestTypes.AI_DOC_GENERATION,\n  state: RequestState.COMPLETED,\n  actions: [],\n  meta: {},\n  response: faker.lorem.paragraph(),\n  updatedAt: faker.date.past(),\n});\n\nexport const DatapilotDocGenWithErrorFactory = Sync.makeFactory<DataPilotChat>({\n  id: each(() => faker.string.uuid()),\n  query: faker.lorem.sentence(),\n  requestType: RequestTypes.AI_DOC_GENERATION,\n  state: RequestState.ERROR,\n  actions: [],\n  meta: {},\n  response: faker.lorem.lines(),\n  updatedAt: faker.date.past(),\n});\n\nexport const DatapilotDocGenWithLoadingFactory =\n  Sync.makeFactory<DataPilotChat>({\n    id: each(() => faker.string.uuid()),\n    query: faker.lorem.sentence(),\n    requestType: RequestTypes.AI_DOC_GENERATION,\n    state: RequestState.LOADING,\n    actions: [],\n    meta: {},\n    response: undefined,\n    updatedAt: faker.date.past(),\n  });\n\nexport const DatapilotDocGenActionButtonFactory =\n  Sync.makeFactory<DataPilotChatAction>({\n    title: \"Regenerate\",\n    command: \"regenerate\",\n    data: { modelName: \"customers\" },\n    userPrompt: \"Regenerate documentation for {type} {name}\",\n    datapilotTitle: \"Improving documentation based on the user suggestion\",\n  });\n"
  },
  {
    "path": "webview_panels/src/testUtils/datapilot/index.ts",
    "content": "export * from \"./docGen\";\nexport * from \"./queryAnalysis\";\nexport * from \"./test\";\n"
  },
  {
    "path": "webview_panels/src/testUtils/datapilot/queryAnalysis.ts",
    "content": "import { Sync, each } from \"factory.ts\";\nimport { faker } from \"@faker-js/faker\";\nimport {\n  DataPilotChatFollowup,\n  RequestState,\n  RequestTypes,\n} from \"@modules/dataPilot/types\";\nimport {\n  DatapilotQueryAnalysisChat,\n  QueryAnalysisType,\n} from \"@modules/dataPilot/components/queryAnalysis/types\";\n\nexport const DatapilotQueryAnalysisFactory =\n  Sync.makeFactory<DatapilotQueryAnalysisChat>({\n    id: each(() => faker.string.uuid()),\n    query: `\n    /*\n      some comments here\n    */\n    select * from users \n    where provider='google' and name='john'\n    group by city`,\n    requestType: RequestTypes.QUERY_ANALYSIS,\n    state: RequestState.LOADING,\n    actions: [],\n    meta: {},\n    response: undefined,\n    updatedAt: faker.date.past(),\n    fileName: faker.system.commonFileName(\"sql\"),\n  });\n\nexport const DatapilotQueryExplainFactory =\n  DatapilotQueryAnalysisFactory.extend({\n    analysisType: QueryAnalysisType.EXPLAIN,\n  });\n\nexport const DatapilotQueryExplainResultFactory =\n  Sync.makeFactory<DataPilotChatFollowup>({\n    id: each(() => faker.string.uuid()),\n    datapilotTitle: \"Query explanation\",\n    response: each(() =>\n      [\n        \"### Query Explanation\",\n\n        `This SQL query is using Common Table Expressions (CTEs) to create temporary views or tables for use within the query. The database type is DuckDB, which is an in-memory analytical database written in C++.         `,\n        `The query is broken down into several parts:        `,\n        \"1. The first three CTEs (`customers`, `orders`, `payments`) are simply selecting all records from the respective tables in the `jaffle_shop.main` schema.\",\n\n        \"2. The `customer_orders` CTE is aggregating the `orders` table by `customer_id` to find the earliest (`MIN`) order date, the most recent (`MAX`) order date, and the total number of orders (`COUNT`) for each customer.\",\n\n        \"3. The `customer_payments` CTE is joining the `payments` and `orders` tables on `order_id`, then aggregating by `customer_id` to find the total payment amount (`SUM`) for each customer.\",\n\n        \"4. The `final` CTE is joining the `customers`, `customer_orders`, and `customer_payments` CTEs on `customer_id` to create a final table that includes the customer's first and last name, the date of their first and most recent orders, the total number of their orders, and their total payment amount (referred to as `customer_lifetime_value`).\",\n\n        \"5. The final `SELECT` statement is selecting all records from the `final` CTE.\",\n\n        \"The result of this query would be a table that provides a summary of each customer's order history and total payment amount.\",\n        \" ```\",\n        \"\",\n        \"with\",\n        '    orders as (select * from {{ ref(\"stg_orders\") }}),',\n        \"\",\n        '    payments as (select * from {{ ref(\"stg_payments\") }}),',\n        \"\",\n        \"    order_payments as (\",\n        \"\",\n        \"        select\",\n        \"            order_id,\",\n        \"\",\n        \"            {% for payment_method in payment_methods -%}\",\n        \"                sum(\",\n        \"                    case\",\n        \"                        when payment_method = '{{ payment_method }}' then amount else 0\",\n        \"                    end\",\n        \"                ) as {{ payment_method }}_amount,\",\n        \"            {% endfor -%}\",\n        \"\",\n        \"            sum(amount) as total_amount\",\n        \"\",\n        \"        from payments\",\n        \"\",\n        \"        group by order_id\",\n        \"\",\n        \"    ),\",\n        \"\",\n        \"    final as (\",\n        \"\",\n        \"        select\",\n        \"            orders.order_id,\",\n        \"            orders.customer_id,\",\n        \"            orders.order_date,\",\n        \"            orders.status,\",\n        \"\",\n        \"            {% for payment_method in payment_methods -%}\",\n        \"\",\n        \"                order_payments.{{ payment_method }}_amount,\",\n        \"\",\n        \"            {% endfor -%}\",\n        \"\",\n        \"            order_payments.total_amount as amount\",\n        \"\",\n        \"        from orders\",\n        \"\",\n        \"        left join order_payments on orders.order_id = order_payments.order_id\",\n        \"\",\n        \"    )\",\n        \"\",\n        \"select *\",\n        \"from final\",\n        \"```\",\n      ].join(\"\\n\"),\n    ),\n    userPrompt: \"Explain the query\",\n    state: RequestState.COMPLETED,\n  });\n"
  },
  {
    "path": "webview_panels/src/testUtils/datapilot/test.ts",
    "content": "import { Sync, each } from \"factory.ts\";\nimport { faker } from \"@faker-js/faker\";\nimport {\n  DataPilotChat,\n  RequestState,\n  RequestTypes,\n} from \"@modules/dataPilot/types\";\n\nexport const DatapilotCustomChatFactory = Sync.makeFactory<DataPilotChat>({\n  id: each(() => faker.string.uuid()),\n  query: \"Add Custom Test\",\n  requestType: RequestTypes.ADD_CUSTOM_TEST,\n  state: RequestState.LOADING,\n  actions: [],\n  meta: {},\n  response: undefined,\n  updatedAt: faker.date.past(),\n});\n"
  },
  {
    "path": "webview_panels/src/testUtils/documentation/index.ts",
    "content": "import { Sync, each } from \"factory.ts\";\nimport { faker } from \"@faker-js/faker\";\nimport {\n  DBTDocumentation,\n  DBTDocumentationColumn,\n  Source,\n  DBTModelTest,\n  DbtGenericTests,\n  TestMetadataAcceptedValuesKwArgs,\n} from \"@modules/documentationEditor/state/types\";\nimport { Citation, TaskLabels } from \"@lib\";\n\nconst getRandomNumber = (maximum = 10, minimum = 5) =>\n  Math.floor(Math.random() * (maximum - minimum + 1)) + minimum;\n\nexport const CitationFactory = Sync.makeFactory<Citation>({\n  content: each(() => faker.lorem.paragraph()),\n  id: each(() => faker.string.uuid()),\n  taskLabel: TaskLabels.DocGen,\n});\nexport const DBTDocumentationColumnFactory =\n  Sync.makeFactory<DBTDocumentationColumn>({\n    generated: faker.datatype.boolean(),\n    name: each(() => faker.database.column()),\n    source: faker.helpers.enumValue(Source),\n    description: each((i) =>\n      i % 4 === 0 ? undefined : faker.lorem.paragraph(),\n    ),\n    type: each(() => faker.database.type()),\n    citations: CitationFactory.buildList(5),\n  });\n\nexport const DBTDocumentationFactory = Sync.makeFactory<DBTDocumentation>({\n  aiEnabled: true,\n  columns: DBTDocumentationColumnFactory.buildList(20),\n  description: each(() => faker.lorem.paragraph()),\n  generated: faker.datatype.boolean(),\n  name: each(() => faker.database.column()),\n  patchPath: faker.system.filePath(),\n  uniqueId: \"\",\n});\n\nconst getName = (i: number) => {\n  if (i % 5 === 0) return DbtGenericTests.RELATIONSHIPS;\n  if (i % 7 === 0) return DbtGenericTests.ACCEPTED_VALUES;\n  if (i % 2 === 0) return DbtGenericTests.UNIQUE;\n  return DbtGenericTests.NOT_NULL;\n};\nconst getRandomDbtTestMetadata = (\n  i: number,\n  columnName?: string,\n): undefined | DBTModelTest[\"test_metadata\"] => {\n  // singular tests in tests directory\n  if (i % 3 === 0) return undefined;\n\n  // test from macro\n  if (i % 4 === 0)\n    return {\n      kwargs: {\n        column_name: columnName ?? \"\",\n        model: faker.hacker.noun(),\n      },\n      name: faker.hacker.noun(),\n    };\n\n  // generic tests\n  const name = getName(i);\n  const extraData =\n    name === DbtGenericTests.ACCEPTED_VALUES\n      ? { values: faker.lorem.words().split(\" \") }\n      : name === DbtGenericTests.RELATIONSHIPS\n        ? {\n            field: faker.database.column(),\n            to: `ref('dim_hosts_cleansed')`,\n          }\n        : {};\n  return {\n    kwargs: {\n      column_name: columnName ?? \"\",\n      model: faker.hacker.noun(),\n      ...extraData,\n    },\n    name,\n  };\n};\n\nconst DBTDocumentationTestsBaseFactory = Sync.makeFactory<DBTModelTest>(() => {\n  const columnName = faker.database.column();\n  return {\n    alias: each(() => faker.string.alpha(getRandomNumber())),\n    column_name: each((i) => (i % 3 === 0 ? undefined : columnName)),\n    database: faker.hacker.noun(),\n    schema: each(() => faker.string.alpha(getRandomNumber())),\n    test_metadata: each((i) =>\n      getRandomDbtTestMetadata(i, i % 3 === 0 ? undefined : columnName),\n    ),\n    key: each(() => faker.string.alpha(getRandomNumber())),\n    path: each(() => faker.string.alpha(getRandomNumber())),\n  };\n});\n\nconst DBTDocumentationTestsWithKeyFactory =\n  DBTDocumentationTestsBaseFactory.withDerivation(\"key\", (testData) => {\n    const meta = testData.test_metadata;\n    // singular tests\n    if (!meta) {\n      return faker.lorem.slug();\n    }\n\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    const { model, column_name } = meta.kwargs;\n    // generic tests\n    // @ts-expect-error valid type\n    if (Object.values(DbtGenericTests).includes(meta.name)) {\n      if ((meta.name as DbtGenericTests) === DbtGenericTests.ACCEPTED_VALUES) {\n        return `${meta.name}_${model}_${column_name}_${(\n          meta.kwargs as TestMetadataAcceptedValuesKwArgs\n        ).values?.join(\"_\")}`;\n      }\n      return `${meta.name}_${model}_${column_name}`;\n    }\n\n    // macro test\n    return `${meta.name}_${model}_${column_name}`;\n  });\n\nexport const DBTDocumentationTestsFactory =\n  DBTDocumentationTestsWithKeyFactory.withDerivation(\n    \"path\",\n    (testData) => testData.key,\n  );\n"
  },
  {
    "path": "webview_panels/src/testUtils/index.ts",
    "content": "export * from \"./datapilot\";\nexport * from \"./documentation\";\nexport * from \"./users\";\nexport * from \"./conversations\";\n"
  },
  {
    "path": "webview_panels/src/testUtils/queryResults/index.ts",
    "content": "import { faker } from \"@faker-js/faker\";\nimport { QueryBookmark, QueryHistory } from \"@modules/queryPanel/context/types\";\nimport { Sync } from \"factory.ts\";\nimport { TenantUserFactory } from \"../users\";\n\nfunction generateRandomSQLQuery(): string {\n  // Generate between 1 to 5 column names\n  const columnsCount = faker.number.int({ min: 1, max: 5 });\n  const columns = Array.from({ length: columnsCount }, () =>\n    faker.database.column(),\n  ).join(\", \");\n\n  // Generate a table name\n  const tableName = faker.lorem.word();\n\n  // Optionally, generate a LIMIT value (for simplicity, let's keep queries simple)\n  const limit = faker.number.int({ min: 1, max: 100 });\n\n  // Assemble the SQL query\n  const query = `SELECT ${columns} FROM ${tableName} LIMIT ${limit};`;\n\n  return query;\n}\n\nexport const QueryHistoryFactory = Sync.makeFactory<QueryHistory>({\n  rawSql: Sync.each(() => generateRandomSQLQuery()),\n  compiledSql: Sync.each(() => generateRandomSQLQuery()),\n  adapter: faker.lorem.word(),\n  duration: faker.number.int({ min: 1, max: 10000 }),\n  projectName: faker.lorem.word(),\n  timestamp: Sync.each(() => faker.date.past().getTime()),\n  modelName: faker.lorem.word(),\n});\n\nconst generateRandomTags = () => {\n  return faker.helpers.multiple(\n    () => ({ id: faker.number.int(), tag: faker.lorem.word() }),\n    { count: faker.helpers.rangeToNumber({ min: 0, max: 10 }) },\n  );\n};\n\nexport const QueryBookmarkFactory = Sync.makeFactory<QueryBookmark>({\n  raw_sql: Sync.each(() => generateRandomSQLQuery()),\n  compiled_sql: Sync.each(() => generateRandomSQLQuery()),\n  created_on: Sync.each(() => faker.date.past().toISOString()),\n  adapter_type: Sync.each(() => faker.lorem.word()),\n  id: Sync.each(() => faker.number.int()),\n  name: Sync.each(() => faker.lorem.words()),\n  description: faker.lorem.paragraph(),\n  updated_on: Sync.each(() => faker.date.recent().toISOString()),\n  tags: Sync.each(() => generateRandomTags()),\n  privacy: Sync.each(() => faker.helpers.arrayElement([\"public\", \"private\"])),\n  created_by_user: Sync.each(() => TenantUserFactory.build()),\n});\n"
  },
  {
    "path": "webview_panels/src/testUtils/users/index.ts",
    "content": "import { Sync, each } from \"factory.ts\";\nimport { faker } from \"@faker-js/faker\";\nimport { User } from \"@modules/app/types\";\n\nexport const TenantUserFactory = Sync.makeFactory<User>({\n  display_name: each(() => faker.person.fullName()),\n  first_name: each(() => faker.person.fullName()),\n  last_name: each(() => faker.person.fullName()),\n  id: each((i) => i),\n});\n"
  },
  {
    "path": "webview_panels/src/uiCore/components/accordion/Accordion.tsx",
    "content": "import { ReactNode, useState } from \"react\";\nimport classes from \"./accordion.module.scss\";\n\nconst Accordion = ({\n  trigger,\n  children,\n  defaultOpen = false,\n}: {\n  trigger: (b: boolean) => ReactNode;\n  children: (args: { close: () => void }) => ReactNode;\n  defaultOpen?: boolean;\n}): JSX.Element => {\n  const [open, setOpen] = useState(defaultOpen);\n  return (\n    <div>\n      <div\n        className=\"cursor-pointer\"\n        onClick={(e) => {\n          e.stopPropagation();\n          setOpen((b) => !b);\n        }}\n      >\n        {trigger(open)}\n      </div>\n      <div className={`${classes.accordion} ${open ? classes.open : \"\"}`}>\n        {children({ close: () => setOpen(false) })}\n      </div>\n    </div>\n  );\n};\n\nexport default Accordion;\n"
  },
  {
    "path": "webview_panels/src/uiCore/components/accordion/accordion.module.scss",
    "content": ".accordion {\n  max-height: 0;\n  overflow: hidden;\n  transition: max-height 0.3s ease-out;\n\n  &.open {\n    max-height: 200px;\n  }\n}\n"
  },
  {
    "path": "webview_panels/src/uiCore/components/avatar/Avatar.tsx",
    "content": "import { ReactNode } from \"react\";\nimport classes from \"./styles.module.scss\";\n\ninterface Props {\n  imgUrl?: string;\n  children?: ReactNode;\n  size?: number;\n}\nconst Avatar = ({ imgUrl, children, size = 40 }: Props): JSX.Element => {\n  return (\n    <div\n      className={classes.avatar}\n      style={{ maxWidth: size, minWidth: size, height: size }}\n    >\n      {children}\n      {imgUrl ? <img src={imgUrl} /> : null}\n    </div>\n  );\n};\n\nexport default Avatar;\n"
  },
  {
    "path": "webview_panels/src/uiCore/components/avatar/styles.module.scss",
    "content": ".avatar {\n  border-radius: 50%;\n  & img {\n    width: 100%;\n    height: 100%;\n    object-fit: contain;\n  }\n}\n"
  },
  {
    "path": "webview_panels/src/uiCore/components/button/Button.tsx",
    "content": "import { useState, useEffect } from \"react\";\nimport { Button as ReactStrapButton, ButtonProps } from \"reactstrap\";\nimport Tooltip from \"../tooltip/Tooltip\";\n\ninterface CustomButtonProps extends ButtonProps {\n  icon?: React.ReactNode;\n  showTextAlways?: boolean;\n}\n\nexport const Button = ({\n  icon,\n  showTextAlways,\n  children,\n  ...restProps\n}: CustomButtonProps): JSX.Element => {\n  const [showButtonText, setShowButtonText] = useState(true);\n\n  useEffect(() => {\n    setShowButtonText(!icon);\n  }, [icon]);\n\n  const mouseHoverAction = (showBtnText: boolean) => {\n    if (icon) {\n      setShowButtonText(showBtnText);\n    }\n  };\n\n  return (\n    <Tooltip title={restProps.title}>\n      <ReactStrapButton\n        {...restProps}\n        onMouseEnter={() => mouseHoverAction(true)}\n        onMouseLeave={() => mouseHoverAction(false)}\n      >\n        {icon && icon} {(showTextAlways ?? showButtonText) ? children : null}\n      </ReactStrapButton>\n    </Tooltip>\n  );\n};\n"
  },
  {
    "path": "webview_panels/src/uiCore/components/codeblock/codeblock.module.scss",
    "content": ".codeblock {\n  :global .card-title {\n    border-bottom: 1px solid #ccc;\n    font-weight: 500;\n    padding-bottom: var(--spacing-xl);\n    margin-bottom: var(--spacing-xl);\n  }\n\n  :global .card-body {\n    > span {\n        padding: 0 !important;\n        max-height: 250px;\n    }\n  }\n}\n"
  },
  {
    "path": "webview_panels/src/uiCore/components/codeblock/index.tsx",
    "content": "import { CodeBlock as CodeblockLib } from \"@lib\";\nimport { Themes } from \"@modules/app/types\";\nimport useAppContext from \"@modules/app/useAppContext\";\nimport { ReactNode } from \"react\";\nimport classes from \"./codeblock.module.scss\";\n\ninterface Props {\n  code: string;\n  language: Parameters<typeof CodeblockLib>[\"0\"][\"language\"];\n  fileName?: string;\n  showLineNumbers?: boolean;\n  titleActions?: ReactNode;\n  classname?: string;\n}\nconst CodeBlockComponent = ({\n  code,\n  language,\n  fileName,\n  showLineNumbers,\n  titleActions,\n  classname,\n}: Props): JSX.Element => {\n  const {\n    state: { theme },\n  } = useAppContext();\n  const codeBlockTheme = theme === Themes.Dark ? \"dark\" : \"light\";\n  const editorTheme = theme === Themes.Dark ? \"vsc-dark-plus\" : \"tomorrow\";\n  return (\n    <div className={classes.codeblock}>\n      <CodeblockLib\n        showLineNumbers={showLineNumbers}\n        code={code}\n        fileName={fileName}\n        theme={codeBlockTheme}\n        editorTheme={editorTheme}\n        language={language}\n        titleActions={titleActions}\n        className={classname}\n      />\n    </div>\n  );\n};\n\nexport default CodeBlockComponent;\n"
  },
  {
    "path": "webview_panels/src/uiCore/components/drawer/index.tsx",
    "content": "import { ChevronRightIcon } from \"@assets/icons\";\nimport {\n  forwardRef,\n  ForwardRefRenderFunction,\n  SyntheticEvent,\n  useImperativeHandle,\n} from \"react\";\nimport { ReactNode, useState } from \"react\";\nimport { Offcanvas, OffcanvasBody, OffcanvasHeader } from \"reactstrap\";\nimport IconButton from \"../iconButton/IconButton\";\nimport classes from \"./styles.module.scss\";\nimport { Button } from \"../..\";\n\ninterface Props {\n  title?: string | ReactNode;\n  buttonProps?: Parameters<typeof Button>[0];\n  buttonText?: ReactNode | string;\n  icon?: ReactNode;\n  onClose?: () => void;\n  onOpen?: () => void;\n  children: ReactNode;\n  backdrop?: boolean;\n  disableBackdropClick?: boolean;\n}\n\nexport interface DrawerRef {\n  close: () => void;\n  open: () => void;\n}\n\nconst Drawer: ForwardRefRenderFunction<DrawerRef, Props> = (\n  {\n    buttonProps,\n    buttonText,\n    icon,\n    title,\n    onClose,\n    children,\n    onOpen,\n    backdrop = true,\n    disableBackdropClick = false,\n  },\n  ref,\n) => {\n  const [show, setShow] = useState(false);\n\n  const handleClose = (e?: SyntheticEvent) => {\n    if (\n      disableBackdropClick &&\n      e &&\n      (e.target as HTMLElement | undefined)?.classList?.contains(\n        \"offcanvas-backdrop\",\n      )\n    ) {\n      return;\n    }\n    setShow(false);\n    onClose?.();\n  };\n  const handleShow = () => {\n    setShow(true);\n    onOpen?.();\n  };\n\n  useImperativeHandle(ref, () => ({\n    close() {\n      setShow(false);\n    },\n    open() {\n      setShow(true);\n    },\n  }));\n\n  return (\n    <>\n      {buttonText ? (\n        <Button {...buttonProps} onClick={handleShow} icon={icon}>\n          {buttonText}\n        </Button>\n      ) : null}\n\n      <Offcanvas\n        isOpen={show}\n        onClosed={handleClose}\n        toggle={handleClose}\n        direction=\"end\"\n        className={classes.offcanvas}\n        backdrop={backdrop}\n        unmountOnClose\n      >\n        {title ? (\n          <OffcanvasHeader>\n            <h2>{title}</h2>\n          </OffcanvasHeader>\n        ) : null}\n        <IconButton\n          color=\"primary\"\n          onClick={handleClose}\n          className={classes.closeBtn}\n        >\n          <ChevronRightIcon />\n        </IconButton>\n        <OffcanvasBody>{children}</OffcanvasBody>\n      </Offcanvas>\n    </>\n  );\n};\n\nexport default forwardRef(Drawer);\n"
  },
  {
    "path": "webview_panels/src/uiCore/components/drawer/styles.module.scss",
    "content": ".offcanvas{\n  :global .offcanvas-body{\n    background: var(--background--02)\n  }\n  .close-btn{\n    width: 40px;\n    height: 40px;\n    position: absolute;\n      top: 0;\n      left: -40px;\n  }\n}"
  },
  {
    "path": "webview_panels/src/uiCore/components/dropdown/Dropdown.tsx",
    "content": "import { List, Popover, PopoverBody, Stack } from \"@uicore\";\nimport { useRef, useState } from \"react\";\nimport classes from \"./dropdown.module.scss\";\nimport { ArrowDownIcon } from \"@assets/icons\";\n\ninterface Props {\n  label: string;\n  options: { label: string; value: string }[];\n  onOptionSelect: (k: string) => void;\n  selectedValue: string;\n}\n\nconst Dropdown = ({\n  label,\n  options,\n  onOptionSelect,\n  selectedValue,\n}: Props): JSX.Element => {\n  const ref = useRef<HTMLDivElement | null>(null);\n  const [openPopover, setOpenPopover] = useState(false);\n\n  const onToggleClick = () => {\n    setOpenPopover((prev) => !prev);\n  };\n  return (\n    <div>\n      <Stack ref={ref} onClick={onToggleClick} className={classes.dropdown}>\n        {options.find((o) => o.value === selectedValue)?.label ?? label}\n        <ArrowDownIcon />\n      </Stack>\n      <Popover\n        isOpen={openPopover}\n        target={ref}\n        placement=\"bottom\"\n        hideArrow\n        className={classes.popover}\n      >\n        <PopoverBody>\n          <List>\n            {options.map((option) => (\n              <li\n                key={option.value}\n                onClick={(e) => {\n                  e.stopPropagation();\n                  setOpenPopover(false);\n                  onOptionSelect(option.value);\n                }}\n                className={option.value === selectedValue ? classes.active : \"\"}\n              >\n                {option.label}\n              </li>\n            ))}\n          </List>\n        </PopoverBody>\n      </Popover>\n    </div>\n  );\n};\n\nexport default Dropdown;\n"
  },
  {
    "path": "webview_panels/src/uiCore/components/dropdown/dropdown.module.scss",
    "content": ".popover {\n  :global .popover {\n    margin-top: -4px;\n    :global .popover-body {\n      padding: 0;\n\n      & ul {\n        padding: 0;\n        margin: 0;\n        list-style: none;\n        background: var(--background--02);\n        color: var(--text-color--paragraph);\n\n        li {\n          text-decoration: none;\n          width: 100%;\n          min-width: 8em;\n          text-align: left;\n          padding: 0.25em 0.5em;\n          cursor: pointer;\n          &:hover,\n          &.active {\n            color: var(--primary-color);\n            background-color: var(--background--03);\n          }\n        }\n      }\n    }\n  }\n}\n\n.dropdown {\n  padding: 0.25em 0.5em;\n  border-radius: 0.25em;\n  align-items: center;\n  border: 1px solid var(--stroke--disable);\n  background: var(--background--02);\n  color: var(--text-color--paragraph);\n  cursor: pointer;\n}\n"
  },
  {
    "path": "webview_panels/src/uiCore/components/dropdownButton/DropdownButton.tsx",
    "content": "import { ChevronDownIcon } from \"@assets/icons\";\nimport { Button, ButtonProps } from \"reactstrap\";\nimport { IconButton, Stack } from \"../../\";\nimport classes from \"./styles.module.scss\";\n\ninterface Props extends ButtonProps {\n  onToggleClick: () => void;\n}\nconst DropdownButton = ({ onToggleClick, ...props }: Props): JSX.Element => {\n  return (\n    <Stack className={classes.dropdownButton}>\n      <Button color=\"primary\" {...props}>\n        {props.children}\n      </Button>\n      <IconButton onClick={onToggleClick} color={props.color ?? \"primary\"}>\n        <ChevronDownIcon />\n      </IconButton>\n    </Stack>\n  );\n};\n\nexport default DropdownButton;\n"
  },
  {
    "path": "webview_panels/src/uiCore/components/dropdownButton/styles.module.scss",
    "content": ".dropdownButton {\n  gap: 0 !important;\n  & button:first-child {\n    border-radius: 2px 0 0 2px;\n  }\n  & button:last-child {\n    border-radius: 0 2px 2px 0;\n    background: var(--action-brand-dark);\n  }\n\n  & :global .btn-secondary:last-child {\n    border-radius: 0 2px 2px 0;\n    background: var(--bs-btn-active-bg);\n  }\n}\n"
  },
  {
    "path": "webview_panels/src/uiCore/components/iconButton/IconButton.tsx",
    "content": "import { ButtonHTMLAttributes } from \"react\";\nimport { Tooltip } from \"../../\";\nimport classes from \"./styles.module.scss\";\n\ninterface Props extends ButtonHTMLAttributes<HTMLButtonElement> {\n  color?: string;\n}\nconst IconButton = (props: Props): JSX.Element => {\n  return (\n    <Tooltip title={props.title}>\n      <button\n        {...props}\n        className={`btn ${props.color ? `btn-${props.color}` : \"\"} ${\n          props.className ?? \"\"\n        } ${classes.iconButton}`}\n        type={props.type ?? \"button\"}\n      >\n        {props.children}\n      </button>\n    </Tooltip>\n  );\n};\n\nexport default IconButton;\n"
  },
  {
    "path": "webview_panels/src/uiCore/components/iconButton/styles.module.scss",
    "content": ".iconButton {\n  padding: 6px 7px;\n  color: var(--text-color--title);\n\n  &:global.outline {\n    border-radius: 5px;\n    border: 1px solid var(--stroke--disable, #424750);\n  }\n}\n"
  },
  {
    "path": "webview_panels/src/uiCore/components/loader/index.tsx",
    "content": "import { LoaderIcon } from \"@assets/icons\";\nimport { FC } from \"react\";\nimport styles from \"./styles.module.scss\";\n\ninterface LoaderProps {\n  [key: string]: unknown;\n  size?: \"xsmall\" | \"small\" | \"medium\" | \"large\";\n  className?: string;\n}\n\nconst styleSizeMap = {\n  xsmall: styles.sizeXSmall,\n  small: styles.sizeSmall,\n  medium: styles.sizeMedium,\n  large: styles.sizeLarge,\n};\n\nconst Loader: FC<LoaderProps> = ({\n  size = \"medium\",\n  className = \"\",\n  ...rest\n}) => {\n  return (\n    <div\n      {...rest}\n      className={`${styles.loader} ${styleSizeMap[size]} ${className}`}\n    >\n      <LoaderIcon />\n    </div>\n  );\n};\n\nexport default Loader;\n"
  },
  {
    "path": "webview_panels/src/uiCore/components/loader/styles.module.scss",
    "content": ".loader {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n\n  @keyframes rotate {\n    0% {\n      transform: rotate(0deg);\n    }\n    100% {\n      transform: rotate(360deg);\n    }\n  }\n\n  animation: rotate 2s linear infinite;\n}\n\n.sizeXSmall {\n  width: 14px;\n  height: 14px;\n}\n\n.sizeSmall {\n  width: 20px;\n  height: 20px;\n}\n\n.sizeMedium {\n  width: 40px;\n  height: 40px;\n}\n\n.sizeLarge {\n  width: 60px;\n  height: 60px;\n}\n"
  },
  {
    "path": "webview_panels/src/uiCore/components/loadingButton/index.tsx",
    "content": "import { ButtonHTMLAttributes } from \"react\";\nimport { Button, Spinner } from \"reactstrap\";\nimport classes from \"./loadingButton.module.scss\";\n\ninterface Props extends ButtonHTMLAttributes<HTMLButtonElement> {\n  loading: boolean;\n}\n\nconst LoadingButton = ({ loading, ...rest }: Props): JSX.Element => {\n  return (\n    <Button\n      {...rest}\n      disabled={loading || rest.disabled}\n      className={`${rest.className ?? \"\"} ${classes.loadingBtn}`}\n    >\n      {loading ? <Spinner /> : rest.children}\n    </Button>\n  );\n};\n\nexport default LoadingButton;\n"
  },
  {
    "path": "webview_panels/src/uiCore/components/loadingButton/loadingButton.module.scss",
    "content": ".loadingBtn{\n  :global .spinner-border {\n    width: 1rem;\n    height: 1rem;\n    margin-top: 0.15rem;\n    border-width: 2px;\n  }\n}"
  },
  {
    "path": "webview_panels/src/uiCore/components/popoverWithButton/PopoverWithButton.tsx",
    "content": "import {\n  forwardRef,\n  ForwardRefRenderFunction,\n  MouseEvent as ReactMouseEvent,\n  ReactNode,\n  useImperativeHandle,\n  useRef,\n  useState,\n} from \"react\";\nimport { Popover, PopoverBody, PopoverProps } from \"reactstrap\";\nimport styles from \"./styles.module.scss\";\n\ninterface Props {\n  button: ReactNode;\n  title?: string | ReactNode;\n  width?: number | string;\n  popoverProps?: Omit<PopoverProps, \"target\">;\n  children: (args: {\n    styles: CSSModuleClasses;\n    close: () => void;\n  }) => ReactNode;\n}\n\nexport interface PopoverWithButtonRef {\n  close: () => void;\n  open: () => void;\n}\n\nconst PopoverWithButton: ForwardRefRenderFunction<\n  PopoverWithButtonRef,\n  Props\n> = ({ title, button, children, popoverProps = {}, width = 350 }, ref) => {\n  const { className, ...rest } = popoverProps;\n  const [showPopover, setShowPopover] = useState(false);\n  const buttonRef = useRef<HTMLButtonElement | null>(null);\n  const popoverRef = useRef<HTMLDivElement | null>(null);\n  const onBodyClick = (e: MouseEvent) => {\n    if (popoverRef.current?.contains(e.target as Node)) {\n      return;\n    }\n    onClose();\n  };\n\n  const onOpen = (e?: ReactMouseEvent) => {\n    e?.stopPropagation();\n    setShowPopover(true);\n    document.body.addEventListener(\"mouseup\", onBodyClick);\n  };\n\n  const onClose = () => {\n    setShowPopover(false);\n    document.body.removeEventListener(\"mouseup\", onBodyClick);\n  };\n\n  useImperativeHandle(ref, () => ({\n    close() {\n      onClose();\n    },\n    open() {\n      onOpen();\n    },\n  }));\n\n  return (\n    <>\n      <span ref={buttonRef} onClick={onOpen}>\n        {button}\n      </span>\n      <Popover\n        isOpen={showPopover}\n        target={buttonRef}\n        {...rest}\n        className={`${className ?? \"\"} ${styles.popover}`}\n        style={{ width }}\n      >\n        <div ref={popoverRef}>\n          <PopoverBody>\n            {title ? <h4>{title}</h4> : null}\n            {children({ styles, close: onClose })}\n          </PopoverBody>\n        </div>\n      </Popover>\n    </>\n  );\n};\n\nexport default forwardRef(PopoverWithButton);\n"
  },
  {
    "path": "webview_panels/src/uiCore/components/popoverWithButton/styles.module.scss",
    "content": ".popover {\n  :global .popover {\n    border-radius: 10px;\n    background-color: var(--background--02);\n    max-width: none;\n    :global .popover-body {\n        padding: 1.5rem;\n      color: var(--text-color--title);\n\n      h4 {\n        margin-bottom: 1.5rem;\n      }\n    }\n  }\n  .popoverActions {\n    display: flex;\n    justify-content: start;\n    gap: 0.5rem;\n    margin-top: 1rem;\n  }\n}\n"
  },
  {
    "path": "webview_panels/src/uiCore/components/select/index.tsx",
    "content": "import Select, {\n  StylesConfig,\n  components,\n  OptionProps,\n  GroupBase,\n} from \"react-select\";\nimport CreatableSelect from \"react-select/creatable\";\nimport { Label } from \"../../index\";\nimport {\n  CheckBlueIcon,\n  SelectCheckedIcon,\n  SelectUncheckedIcon,\n  UncheckIcon,\n} from \"@assets/icons\";\nimport \"./select.module.scss\";\n\nconst { Option } = components;\n\nexport interface OptionType {\n  label: string;\n  value: string;\n}\n\nconst IconOption = (\n  props: OptionProps<OptionType, boolean, GroupBase<OptionType>> & {\n    selectName: string;\n    hideOptionIcon?: boolean;\n  },\n) => {\n  const {\n    data: { label },\n    isMulti,\n    isSelected,\n    hideOptionIcon,\n  } = props;\n\n  return (\n    <Option {...props}>\n      <div className=\"flex items-center gap-2\">\n        <Label check={isMulti}>\n          <span style={{ marginRight: 10 }}>\n            {hideOptionIcon ? null : isSelected ? (\n              isMulti ? (\n                <SelectCheckedIcon />\n              ) : (\n                <CheckBlueIcon />\n              )\n            ) : isMulti ? (\n              <SelectUncheckedIcon />\n            ) : (\n              <UncheckIcon />\n            )}\n          </span>\n          {label}\n        </Label>\n      </div>\n    </Option>\n  );\n};\n\ntype Props = Parameters<typeof Select>[0] & {\n  isCreatable?: boolean;\n  hideOptionIcon?: boolean;\n};\nconst AltimateSelect = (props: Props): JSX.Element => {\n  const colourStyles: StylesConfig<OptionType> = {\n    menu: (styles) => ({\n      ...styles,\n      margin: 0,\n      borderRadius: \"0 0 4px 4px\",\n      backgroundColor: \"var(--stroke--disable)\",\n    }),\n    option: (styles, { isFocused, isSelected }) => ({\n      ...styles,\n      backgroundColor:\n        isFocused || isSelected ? \"var(--background--base)\" : \"transparent\",\n    }),\n    indicatorSeparator: (styles) => ({ ...styles, display: \"none\" }),\n    input: (styles) => ({\n      ...styles,\n      color: \"var(--text-color--title)\",\n    }),\n    singleValue: (styles) => ({\n      ...styles,\n      color: \"var(--text-color--paragraph)\",\n    }),\n    multiValue: (styles) => ({\n      ...styles,\n      color: \"var(--text-color--title)\",\n      backgroundColor: \"var(--background--04)\",\n      borderRadius: 26,\n      padding: \"0 6px\",\n    }),\n    multiValueLabel: (styles) => ({\n      ...styles,\n      color: \"inherit\",\n    }),\n    control: (styles) => ({\n      ...styles,\n      backgroundColor: \"var(--background--base)\",\n      borderColor: \"var(--stroke--disable)\",\n      color: \"var(--text-color--paragraph)\",\n    }),\n    container: (styles, cprops) => ({\n      ...styles,\n      // @ts-expect-error TODO fix this type\n      ...props.styles?.container?.(styles, cprops),\n    }),\n  };\n  const selectName = props.name ?? `select-${Math.random()}`;\n\n  if (props.isCreatable) {\n    return (\n      <CreatableSelect<OptionType>\n        {...props}\n        styles={colourStyles}\n        className={`${props.className} altimate-select`}\n        // @ts-expect-error TODO fix this type\n        components={{\n          ...props.components,\n          Option: (optionProps) => (\n            // @ts-expect-error TODO fix this type\n            <IconOption\n              {...optionProps}\n              hideOptionIcon={props.hideOptionIcon}\n              selectName={selectName}\n            />\n          ),\n        }}\n      />\n    );\n  }\n  return (\n    <Select<OptionType>\n      {...props}\n      styles={colourStyles}\n      className={`${props.className} altimate-select`}\n      // @ts-expect-error TODO fix this type\n      components={{\n        ...props.components,\n        Option: (optionProps) => (\n          // @ts-expect-error TODO fix this type\n          <IconOption\n            {...optionProps}\n            hideOptionIcon={props.hideOptionIcon}\n            selectName={selectName}\n          />\n        ),\n      }}\n    />\n  );\n};\n\nexport default AltimateSelect;\n"
  },
  {
    "path": "webview_panels/src/uiCore/components/select/select.module.scss",
    "content": ":global .vscode-dark,\n:global .vscode-high-contrast:not(.vscode-high-contrast-light) {\n.altimate-select {\n  [class*=\"-control\"]{\n    border-color: transparent;\n    background-color: var(--background--02);\n  }\n  input {\n    caret-color: var(--text-color--title);\n  }\n}\n}"
  },
  {
    "path": "webview_panels/src/uiCore/components/stack/Stack.tsx",
    "content": "import { ForwardedRef, forwardRef, HTMLAttributes, ReactNode } from \"react\";\nimport classes from \"./stack.module.scss\";\n\nconst Stack = forwardRef(function stack(\n  {\n    children,\n    direction = \"row\",\n    ...rest\n  }: {\n    children: ReactNode;\n    direction?: \"row\" | \"column\";\n  } & HTMLAttributes<HTMLDivElement>,\n  ref: ForwardedRef<HTMLDivElement>,\n): JSX.Element {\n  return (\n    <div\n      {...rest}\n      className={`${rest.className ?? \"\"} ${classes.stack} stack-${direction}`}\n      ref={ref}\n    >\n      {children}\n    </div>\n  );\n});\n\nexport default Stack;\n"
  },
  {
    "path": "webview_panels/src/uiCore/components/stack/stack.module.scss",
    "content": ".stack {\n  display: flex;\n  flex-direction: row;\n  gap: 10px;\n\n  &:global.stack-column {\n    flex-direction: column;\n  }\n}\n"
  },
  {
    "path": "webview_panels/src/uiCore/components/tabs/Tabs.tsx",
    "content": "import { ReactNode, useState } from \"react\";\nimport classes from \"./tabs.module.scss\";\nimport Stack from \"../stack/Stack\";\n\nconst Tabs = ({\n  tabs,\n  defaultTab = 0,\n}: {\n  tabs: { label: string; component: ReactNode }[];\n  defaultTab?: number;\n}): JSX.Element => {\n  const [tab, setTab] = useState(defaultTab);\n  return (\n    <Stack direction=\"column\" className=\"align-items-start\">\n      <div className={classes.tabs}>\n        {tabs.map((t, i) => (\n          <span\n            className={`${classes.tab} ${i === tab ? classes.selected : \"\"}`}\n            key={t.label}\n            onClick={(e) => {\n              e.stopPropagation();\n              setTab(i);\n            }}\n          >\n            {t.label}\n          </span>\n        ))}\n      </div>\n      {tabs.find((_, i) => i === tab)?.component}\n    </Stack>\n  );\n};\n\nexport default Tabs;\n"
  },
  {
    "path": "webview_panels/src/uiCore/components/tabs/tabs.module.scss",
    "content": ".tabs {\n  display: flex;\n  background: var(--background--02);\n  border-radius: 0.25em;\n  .tab {\n    padding: 0.25em 1em;\n    border-radius: 0.25em;\n    cursor: pointer;\n    &.selected {\n      background: var(--primary-color);\n    }\n  }\n}\n"
  },
  {
    "path": "webview_panels/src/uiCore/components/tag/Tag.tsx",
    "content": "import { HTMLAttributes, ReactNode } from \"react\";\nimport classes from \"./tag.module.scss\";\n\nconst Tag = ({\n  children,\n  color = \"default\",\n  className,\n  type = \"default\",\n  ...rest\n}: {\n  children: ReactNode;\n  color?: \"primary\" | \"orange\" | \"default\";\n  type?: \"rounded\" | \"default\";\n} & HTMLAttributes<HTMLSpanElement>): JSX.Element => {\n  return (\n    <span\n      className={`${className ?? \"\"} ${classes.tag} ${color === \"default\" ? \"\" : color} ${type === \"rounded\" ? classes.rounded : \"\"}`}\n      {...rest}\n    >\n      {children}\n    </span>\n  );\n};\n\nexport default Tag;\n"
  },
  {
    "path": "webview_panels/src/uiCore/components/tag/tag.module.scss",
    "content": ".tag {\n  display: inline-block;\n  background: var(--background--02);\n  padding: 3px 10px;\n  border-radius: 4px;\n  color: var(--text-color--paragraph);\n  font-size: 10px;\n  font-weight: 300;\n  height: 26px;\n  border: 1px solid transparent;\n  cursor: pointer;\n  line-height: 1.8;\n\n  &.rounded {\n    border-radius: 2.4rem;\n  }\n\n  &:hover {\n    border-color: var(--primary-color);\n  }\n  &:global.primary {\n    background-color: var(--primary-color);\n    color: var(--text-color--white);\n  }\n  &:global.orange {\n    background-color: var(--background-orange);\n    color: var(--stroke--orange);\n  }\n}\n"
  },
  {
    "path": "webview_panels/src/uiCore/components/tooltip/Tooltip.tsx",
    "content": "import { ErrorBoundary } from \"react-error-boundary\";\nimport { ReactNode, useRef, useState } from \"react\";\nimport { Tooltip as ReactStrapTooltip, TooltipProps } from \"reactstrap\";\n\ninterface Props {\n  children: ReactNode;\n  title?: string;\n  id?: string;\n  className?: string;\n  placement?: TooltipProps[\"placement\"];\n}\nconst Tooltip = (props: Props): JSX.Element => {\n  const [tooltipOpen, setTooltipOpen] = useState(false);\n  const toggle = () => setTooltipOpen(!tooltipOpen);\n  const idRef = useRef(\n    (\n      props.id ?? `tooltip-${Math.random().toString(36).substring(3, 9)}`\n    ).replace(/\\s/g, \"-\"),\n  );\n\n  return (\n    <ErrorBoundary fallback={<span id={idRef.current}>{props.children}</span>}>\n      <span id={idRef.current}>{props.children}</span>\n      {props.title ? (\n        <ReactStrapTooltip\n          isOpen={tooltipOpen}\n          target={idRef.current}\n          toggle={toggle}\n          className={props.className}\n          placement={props.placement ?? \"auto\"}\n        >\n          {props.title}\n        </ReactStrapTooltip>\n      ) : null}\n    </ErrorBoundary>\n  );\n};\n\nexport default Tooltip;\n"
  },
  {
    "path": "webview_panels/src/uiCore/index.ts",
    "content": "export {\n  Alert,\n  ButtonGroup,\n  Input,\n  InputGroup,\n  Card,\n  CardTitle,\n  CardBody,\n  CardText,\n  CardFooter,\n  Col,\n  Form,\n  FormGroup,\n  Label,\n  Container,\n  Row,\n  Popover,\n  PopoverBody,\n  PopoverHeader,\n  List,\n  Offcanvas,\n  OffcanvasHeader,\n  OffcanvasBody,\n  Nav,\n  NavItem,\n  NavLink,\n  ListGroup,\n  ListGroupItem,\n  Fade,\n  Spinner,\n  Modal,\n} from \"reactstrap\";\n\nexport { Button } from \"./components/button/Button\";\nexport { default as Tag } from \"./components/tag/Tag\";\nexport { default as Tabs } from \"./components/tabs/Tabs\";\nexport { default as Accordion } from \"./components/accordion/Accordion\";\nexport { default as Dropdown } from \"./components/dropdown/Dropdown\";\nexport { default as Stack } from \"./components/stack/Stack\";\nexport { default as Select } from \"./components/select\";\nexport { default as IconButton } from \"./components/iconButton/IconButton\";\nexport { default as DropdownButton } from \"./components/dropdownButton/DropdownButton\";\nexport { default as Avatar } from \"./components/avatar/Avatar\";\nexport { default as CodeBlock } from \"./components/codeblock/index\";\nexport { default as Tooltip } from \"./components/tooltip/Tooltip\";\nexport { default as Drawer } from \"./components/drawer/index\";\nexport type { ButtonProps } from \"reactstrap\";\nexport type { DrawerRef } from \"./components/drawer/index\";\nexport type { OptionType } from \"./components/select\";\nexport { default as LoadingButton } from \"./components/loadingButton/index\";\nexport { default as PopoverWithButton } from \"./components/popoverWithButton/PopoverWithButton\";\nexport type { PopoverWithButtonRef } from \"./components/popoverWithButton/PopoverWithButton\";\nexport { default as Loader } from \"./components/loader\";\n"
  },
  {
    "path": "webview_panels/src/uiCore/theme.scss",
    "content": "html {\n  --spacing-3xl: 1.846rem;\n  --spacing-2xl: 1.538rem;\n  --spacing-xl: 1.231rem;\n  --spacing-lg: 0.857rem;\n}\n.card {\n  padding: 16px;\n  border-radius: 8px;\n  background: var(--background--02);\n  border-color: var(--stroke--disable);\n\n  & .card-title {\n    font-size: 12px;\n    color: var(--text-color--title);\n    margin-bottom: 0.75rem;\n  }\n  & .card-body {\n    padding: 0;\n    color: var(--text-color--paragraph, #c4cad2);\n    & .card-text {\n      font-size: 12px;\n      font-style: normal;\n      font-weight: 300;\n      line-height: 18px;\n      color: var(--text-color--paragraph, #c4cad2);\n    }\n  }\n  & .card-footer {\n    background-color: transparent;\n    padding: 0;\n  }\n\n}\n\n.btn {\n  border-radius: 2px;\n  font-size: 12px;\n  font-weight: 400;\n  border: none;\n\n  svg {\n    vertical-align: sub;\n  }\n}\n.btn-outline-secondary,\n.btn-outline-primary {\n  border: var(--bs-btn-border-width) solid var(--bs-btn-border-color);\n}\n\n.btn.btn-primary {\n  background: var(--primary-color);\n}\n.btn.btn-danger {\n  background: var(--action-red);\n}\n.btn.btn-warning {\n  background: var(--stroke--orange);\n  color: #fff;\n}\n\n.form-label,\n.col-form-label {\n  font-size: 12px;\n  font-weight: 500;\n  color: var(--text-color--title);\n}\n\n.form-control {\n  border-radius: 2px;\n  border: 1px solid var(--stroke--disable);\n  background-color: var(--background--02);\n  color: var(--text-color--title);\n\n  &:focus {\n    border: 1px solid var(--primary-color);\n    background-color: var(--background--02);\n    color: var(--text-color--title);\n    box-shadow: none;\n  }\n\n  &::placeholder{\n    color: var(--text-color--caption);\n  }\n}\n\ninput.form-control {\n  padding: 2px 10px 2px 8px;\n}\n\n.dropdown-toggle {\n  background-color: var(--background--01);\n}\n.dropdown-menu {\n  --bs-border-radius: 0 0 4px 4px;\n  background: var(--background--02);\n  border-color: var(--stroke--disable);\n\n  & .dropdown-item,\n  & .dropdown-item-text {\n    color: var(--text-color--title);\n    font-size: 14px;\n  }\n}\n\n.h1,\nh1 {\n  font-size: 2rem;\n}\n.h2,\nh2 {\n  font-size: 1.714rem;\n}\n.h3,\nh3 {\n  font-size: 1.429rem;\n}\n.h4,\nh4 {\n  font-size: 1.286rem;\n}\n.h5,\nh5 {\n  font-size: 1.143rem;\n}\n.h6,\nh6 {\n  font-size: 1rem;\n}\n\n.p1 {\n  font-size: 1.429rem;\n}\n.p2 {\n  font-size: 1.286rem;\n}\ncaption,\n.p3 {\n  font-size: 1.143rem;\n}\n.p4 {\n  font-size: 0.857rem;\n}\n.p5 {\n  font-size: 0.714rem;\n}\n.p6 {\n  font-size: 0.571rem;\n}\n\n\n\ncaption {\n  padding: 0;\n  color: inherit;\n}\n\n.alert {\n  border-radius: 4px;\n  &.alert-warning {\n    background: transparent;\n    border: 1px solid var(--stroke--orange, #e38e00);\n    color: var(--stroke--orange, #e38e00);\n  }\n}\nbody.vscode-dark,\nbody.vscode-high-contrast:not(.vscode-high-contrast-light) {\n  .alert-warning {\n    background: rgba(255, 206, 115, 0.1);\n    border: none;\n    color: var(--Action-Yellow, #ffce73);\n  }\n}\n\n.offcanvas{\n  background-color: var(--background--base);\n  color: var(--text-color--title)\n}\n\n.modal-content {\n  background-color: var(--background--04);\n}\n\n.border-orange {\n  border-color: var(--stroke--orange) !important;\n}"
  },
  {
    "path": "webview_panels/src/uiCore/uiToolkitStories/Colors.stories.tsx",
    "content": "import type { Meta } from \"@storybook/react\";\nimport { CardTitle, Container, Stack } from \"..\";\n\nconst meta = {\n  title: \"UiToolKit/Colors\",\n  parameters: {\n    layout: \"centered\",\n  },\n  tags: [\"autodocs\"],\n  argTypes: {\n    backgroundColor: { control: \"color\" },\n  },\n} satisfies Meta;\n\nexport default meta;\n\nexport const UIKit = {\n  render: (): JSX.Element => {\n    const colors = [\n      {\n        title: \"Primary color\",\n        colors: [{ title: \"Blue\", cssVariable: \"--primary-color\" }],\n      },\n      {\n        title: \"Text color\",\n        colors: [\n          { title: \"Title\", cssVariable: \"--text-color--title\" },\n          { title: \"Paragraph\", cssVariable: \"--text-color--paragraph\" },\n          { title: \"Caption\", cssVariable: \"--text-color--caption\" },\n          { title: \"White\", cssVariable: \"--text-color--white\" },\n          { title: \"Brand\", cssVariable: \"--text-color--brand\" },\n        ],\n      },\n      {\n        title: \"Backgrounds\",\n        colors: [\n          { title: \"Base\", cssVariable: \"--background--base\" },\n          { title: \"01\", cssVariable: \"--background--01\" },\n          { title: \"02\", cssVariable: \"--background--02\" },\n          { title: \"03\", cssVariable: \"--background--03\" },\n          { title: \"04\", cssVariable: \"--background--04\" },\n          { title: \"White\", cssVariable: \"--background\" },\n          { title: \"Blue\", cssVariable: \"--background--blue\" },\n        ],\n      },\n      {\n        title: \"Gray\",\n        colors: [\n          { title: \"Blue Gray 01\", cssVariable: \"--gray--blue--gray-01\" },\n          { title: \"Blue Gray 02\", cssVariable: \"--gray--blue--gray-02\" },\n          { title: \"Gray 01\", cssVariable: \"--gray--gray-01\" },\n          { title: \"Gray 02\", cssVariable: \"--gray--gray-02\" },\n        ],\n      },\n      {\n        title: \"Actions color\",\n        colors: [\n          { title: \"Active\", cssVariable: \"--action--active\" },\n          { title: \"Secondary\", cssVariable: \"--action--secondary\" },\n          { title: \"Disable\", cssVariable: \"--action--disable\" },\n          { title: \"Brand dark\", cssVariable: \"--action--brand\" },\n        ],\n      },\n      {\n        title: \"Icons color\",\n        colors: [\n          { title: \"Active\", cssVariable: \"--icon--active\" },\n          { title: \"Deactive\", cssVariable: \"--icon--default\" },\n          { title: \"Disable\", cssVariable: \"--icon--deactive\" },\n          { title: \"Blue\", cssVariable: \"--icon--blue\" },\n        ],\n      },\n      {\n        title: \"Stroke color\",\n        colors: [\n          { title: \"Active\", cssVariable: \"--stroke--active\" },\n          { title: \"Default\", cssVariable: \"--stroke--default\" },\n          { title: \"Disable\", cssVariable: \"--stroke--disable\" },\n          { title: \"Orange\", cssVariable: \"--stroke--orange\" },\n          { title: \"Blue\", cssVariable: \"--stroke--blue\" },\n        ],\n      },\n    ];\n    return (\n      <Container style={{ background: \"var(--background--base)\" }}>\n        <CardTitle tag=\"h3\">Colors for VSCode Power user extension</CardTitle>\n        <br />\n        <Stack direction=\"column\">\n          {colors.map((section) => (\n            <Stack key={section.title} direction=\"column\">\n              <h3>{section.title}</h3>\n              <Stack>\n                {section.colors.map((color) => (\n                  <div key={color.title}>\n                    <div\n                      style={{\n                        marginBottom: 5,\n                        border: \"1px solid #eee\",\n                        width: \"10rem\",\n                        height: \"10rem\",\n                        borderRadius: \"8px 8px 0 0\",\n                        background: `var(${color.cssVariable})`,\n                      }}\n                    />\n                    <h6>{color.title}</h6>\n                    <p>{color.cssVariable}</p>\n                  </div>\n                ))}\n              </Stack>\n            </Stack>\n          ))}\n        </Stack>\n      </Container>\n    );\n  },\n};\n"
  },
  {
    "path": "webview_panels/src/uiCore/uiToolkitStories/Components.stories.tsx",
    "content": "import { LikeIcon, SettingsIcon, ShinesIcon, PreviewIcon } from \"@assets/icons\";\nimport type { Meta } from \"@storybook/react\";\nimport {\n  Button,\n  Card,\n  CardBody,\n  CardText,\n  CardTitle,\n  Container,\n  Drawer,\n  DropdownButton,\n  Form,\n  FormGroup,\n  IconButton,\n  Input,\n  Label,\n  Select,\n  Stack,\n  Tag,\n} from \"..\";\n\nconst meta = {\n  title: \"UiToolKit/Components\",\n  parameters: {\n    layout: \"centered\",\n  },\n  tags: [\"autodocs\"],\n  argTypes: {\n    backgroundColor: { control: \"color\" },\n  },\n} satisfies Meta;\n\nexport default meta;\n\nexport const UIKit = {\n  render: (): JSX.Element => {\n    const options = [\n      { value: \"chocolate\", label: \"Chocolate\" },\n      { value: \"strawberry\", label: \"Strawberry\" },\n      { value: \"vanilla\", label: \"Vanilla\" },\n    ];\n    return (\n      <Container style={{ background: \"var(--background--base)\" }}>\n        <CardTitle tag=\"h3\">\n          Components for VSCode Power user extension\n        </CardTitle>\n        <br />\n        <Stack>\n          <Button color=\"primary\">primary</Button>\n          <Button>secondary</Button>\n          <Button color=\"success\">success</Button>{\" \"}\n          <Button color=\"info\">info</Button>{\" \"}\n          <Button color=\"warning\">warning</Button>{\" \"}\n          <Button color=\"danger\">danger</Button>{\" \"}\n          <Button color=\"link\">link</Button>\n          <Button outline>Settings</Button>\n          <DropdownButton onToggleClick={() => null}>\n            <ShinesIcon /> Generate All <PreviewIcon />\n          </DropdownButton>\n        </Stack>\n        <br />\n        <div>\n          <h5>Icon buttons</h5>\n          <IconButton title=\"Like\">\n            <LikeIcon />\n          </IconButton>\n          <IconButton>\n            <SettingsIcon />\n          </IconButton>\n        </div>\n        <br />\n        <div>\n          <Label>Single select</Label>\n          <Select options={options} />\n          <br />\n          <Label>Multi select</Label>\n          <Select options={options} isMulti />\n        </div>\n        <br />\n        <Card>\n          <CardTitle tag=\"h6\">Card title</CardTitle>\n          <CardBody>\n            <CardText>Card body text</CardText>\n          </CardBody>\n        </Card>\n        <br />\n        <div>\n          <Tag>Performance</Tag> &nbsp;\n          <Tag color=\"primary\">Primary</Tag>\n        </div>\n        <br />\n        <Stack\n          style={{ padding: 8, border: \"1px solid #ccc\", borderRadius: 2 }}\n        >\n          <div>Row Stack 1</div>\n          <div>Row Stack 2</div>\n          <div>Row Stack 3</div>\n          <div>Row Stack 4</div>\n        </Stack>\n        <br />\n        <Stack\n          direction=\"column\"\n          style={{ padding: 8, border: \"1px solid #ccc\", borderRadius: 2 }}\n        >\n          <div>Column Stack 1</div>\n          <div>Column Stack 2</div>\n          <div>Column Stack 3</div>\n          <div>Column Stack 4</div>\n        </Stack>\n        <br />\n        <Form>\n          <FormGroup switch>\n            <Label>\n              Switch\n              <Input type=\"switch\" name=\"form-switch\" />\n            </Label>\n          </FormGroup>\n          <FormGroup>\n            <Stack>\n              <Label for=\"form-input\">Label</Label>\n              <Input\n                id=\"form-input\"\n                name=\"form-input\"\n                placeholder=\"\"\n                type=\"text\"\n                value={\"\"}\n              />\n            </Stack>\n          </FormGroup>\n        </Form>\n        <br />\n        <Drawer\n          buttonText=\"Drawer\"\n          title=\"Offcanvas title\"\n          buttonProps={{ title: \"drawer button\" }}\n        >\n          hello\n        </Drawer>\n      </Container>\n    );\n  },\n};\n"
  },
  {
    "path": "webview_panels/src/uiCore/uiToolkitStories/Typography.stories.tsx",
    "content": "import type { Meta } from \"@storybook/react\";\nimport { CardTitle, Container, Stack } from \"..\";\n\nconst meta = {\n  title: \"UiToolKit/Typography\",\n  parameters: {\n    layout: \"centered\",\n  },\n  tags: [\"autodocs\"],\n  argTypes: {\n    backgroundColor: { control: \"color\" },\n  },\n} satisfies Meta;\n\nexport default meta;\n\nexport const UIKit = {\n  render: (): JSX.Element => {\n    return (\n      <Container style={{ background: \"var(--background--base)\" }}>\n        <CardTitle tag=\"h3\">\n          Typography for VSCode Power user extension\n        </CardTitle>\n        <br />\n        <Stack direction=\"column\">\n          <h5>Typography</h5>\n          <h1>Heading 1 28px 500</h1>\n          <h2>Heading 2 24px 500</h2>\n          <h3>Heading 3 20px 500</h3>\n          <h4>Heading 4 18px 500</h4>\n          <h5>Heading 5 16px 500</h5>\n          <h6>Heading 6 14px 500</h6>\n          <p>Paragraph P1 14px 400</p>\n          <div className=\"p1\">.P1 20px 400</div>\n          <div className=\"p2\">.P2 18px 400</div>\n          <caption>Caption P3 16px 400</caption>\n          <div className=\"p3\">Caption .P3 16px 400</div>\n          <div className=\"p4\">.P4 12px 400</div>\n          <div className=\"p5\">.P5 10px 400</div>\n          <div className=\"p6\">.P6 8px 400</div>\n        </Stack>\n      </Container>\n    );\n  },\n};\n"
  },
  {
    "path": "webview_panels/src/vite-env.d.ts",
    "content": "/// <reference types=\"vite/client\" />\n/// <reference types=\"vite-plugin-svgr/client\" />\n"
  },
  {
    "path": "webview_panels/tailwind.config.ts",
    "content": "import type { Config } from \"tailwindcss\";\n\nconst config: Config = {\n  content: [\n    \"./src/**/*.{ts,tsx}\",\n    \"./node_modules/@altimateai/ui-components/dist/**/*.js\",\n  ],\n  prefix: \"al-\",\n  theme: {\n    container: {\n      center: true,\n      padding: \"2rem\",\n      screens: {\n        \"2xl\": \"1400px\",\n      },\n    },\n    extend: {\n      colors: {\n        border: \"hsl(var(--border))\",\n        input: \"hsl(var(--input))\",\n        ring: \"hsl(var(--ring))\",\n        background: \"hsl(var(--background))\",\n        foreground: \"hsl(var(--foreground))\",\n        primary: {\n          DEFAULT: \"hsl(var(--primary))\",\n          foreground: \"hsl(var(--primary-foreground))\",\n        },\n        secondary: {\n          DEFAULT: \"hsl(var(--secondary))\",\n          foreground: \"hsl(var(--secondary-foreground))\",\n        },\n        destructive: {\n          DEFAULT: \"hsl(var(--destructive))\",\n          foreground: \"hsl(var(--destructive-foreground))\",\n        },\n        muted: {\n          DEFAULT: \"hsl(var(--muted))\",\n          foreground: \"hsl(var(--muted-foreground))\",\n        },\n        accent: {\n          DEFAULT: \"hsl(var(--accent))\",\n          foreground: \"hsl(var(--accent-foreground))\",\n        },\n        popover: {\n          DEFAULT: \"hsl(var(--popover))\",\n          foreground: \"hsl(var(--popover-foreground))\",\n        },\n        card: {\n          DEFAULT: \"hsl(var(--card))\",\n          foreground: \"hsl(var(--card-foreground))\",\n        },\n        sidebar: {\n          DEFAULT: \"hsl(var(--sidebar-background))\",\n          foreground: \"hsl(var(--sidebar-foreground))\",\n          primary: \"hsl(var(--sidebar-primary))\",\n          \"primary-foreground\": \"hsl(var(--sidebar-primary-foreground))\",\n          accent: \"hsl(var(--sidebar-accent))\",\n          \"accent-foreground\": \"hsl(var(--sidebar-accent-foreground))\",\n          border: \"hsl(var(--sidebar-border))\",\n          ring: \"hsl(var(--sidebar-ring))\",\n        },\n      },\n      borderRadius: {\n        lg: \"var(--radius)\",\n        md: \"calc(var(--radius) - 2px)\",\n        sm: \"calc(var(--radius) - 4px)\",\n      },\n      fontFamily: {\n        sans: [\n          \"-apple-system\",\n          \"BlinkMacSystemFont\",\n          '\"Segoe UI\"',\n          \"Roboto\",\n          \"Oxygen\",\n          \"Ubuntu\",\n          \"Cantarell\",\n          '\"Fira Sans\"',\n          '\"Droid Sans\"',\n          '\"Helvetica Neue\"',\n          \"Helvetica\",\n          \"Arial\",\n          \"sans-serif\",\n        ],\n      },\n      fontSize: {\n        h1: [\"2rem\", { lineHeight: \"2rem\" }],\n        h2: [\"1.5rem\", { lineHeight: \"2rem\" }],\n        h3: [\"1.125rem\", { lineHeight: \"1.625rem\" }],\n        h4: [\"1rem\", { lineHeight: \"1.5rem\" }],\n        subheading: [\"0.875rem\", { lineHeight: \"1.25rem\" }],\n        body: [\"0.675rem\", { lineHeight: \"1rem\" }],\n        caption: [\"0.5rem\", { lineHeight: \"1rem\" }],\n      },\n      fontWeight: {\n        regular: \"400\",\n        medium: \"500\",\n        semibold: \"600\",\n        bold: \"700\",\n      },\n      keyframes: {\n        \"accordion-down\": {\n          from: { height: \"0\" },\n          to: { height: \"var(--radix-accordion-content-height)\" },\n        },\n        \"accordion-up\": {\n          from: { height: \"var(--radix-accordion-content-height)\" },\n          to: { height: \"0\" },\n        },\n      },\n      animation: {\n        \"accordion-down\": \"accordion-down 0.2s ease-out\",\n        \"accordion-up\": \"accordion-up 0.2s ease-out\",\n      },\n    },\n  },\n  plugins: [],\n};\n\nexport default config;\n"
  },
  {
    "path": "webview_panels/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES5\",\n    \"useDefineForClassFields\": true,\n    \"lib\": [\"ES2015\", \"DOM\", \"DOM.Iterable\"],\n    \"module\": \"ESNext\",\n    \"skipLibCheck\": true,\n\n    /* Bundler mode */\n    \"moduleResolution\": \"bundler\",\n    \"resolveJsonModule\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"isolatedModules\": true,\n    \"noEmit\": true,\n    \"jsx\": \"react-jsx\",\n    \"outDir\": \"dist\",\n\n    /* Linting */\n    \"strict\": true,\n    \"strictNullChecks\": true,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"noFallthroughCasesInSwitch\": true,\n    \"downlevelIteration\": true,\n    \"baseUrl\": \".\",\n    \"paths\": {\n      \"@uicore\": [\"src/uiCore/index.ts\"],\n      \"@lib\": [\"src/lib/index.ts\"],\n      \"@assets/*\": [\"src/assets/*\"],\n      \"@modules/*\": [\"src/modules/*\"],\n      \"@testUtils\": [\"src/testUtils/index.ts\"],\n      \"@vscodeApi\": [\"src/modules/vscode/index.ts\"],\n      \"@telemetryEvents\": [\"../src/telemetry/events.ts\"]\n    },\n    \"typeRoots\": [\"src/modules/queryPanel/components/perspective\"]\n  },\n  \"include\": [\n    \"src\",\n    \"vite.config.ts\",\n    \"vite.config.renderer.ts\",\n    \"../src/telemetry/events.ts\"\n  ],\n  \"references\": [{ \"path\": \"./tsconfig.node.json\" }]\n}\n"
  },
  {
    "path": "webview_panels/tsconfig.node.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"skipLibCheck\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"node\",\n    \"allowSyntheticDefaultImports\": true,\n    \"strictNullChecks\": true\n  },\n  \"include\": [\"vite.config.ts\", \"tailwind.config.ts\", \"postcss.config.mjs\"]\n}\n"
  },
  {
    "path": "webview_panels/vite.config.renderer.ts",
    "content": "import react from \"@vitejs/plugin-react\";\nimport path from \"path\";\nimport { defineConfig } from \"vite\";\nimport cssInjectedByJsPlugin from \"vite-plugin-css-injected-by-js\";\nimport svgr from \"vite-plugin-svgr\";\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n  plugins: [\n    svgr(),\n    react(),\n    cssInjectedByJsPlugin({\n      //   cssAssetsFilterFunction: (outputAsset) => {\n      //     console.log(\"outputAsset.fileName\", outputAsset.fileName)\n      //     return outputAsset.fileName !== 'assets/style.css';\n      // }\n      jsAssetsFilterFunction: function customJsAssetsfilterFunction(\n        outputChunk,\n      ) {\n        return outputChunk.fileName == \"assets/renderer.js\";\n      },\n    }),\n  ],\n  define: {\n    \"process.env\": {},\n  },\n  build: {\n    lib: {\n      entry: { renderer: \"./src/notebook/index.tsx\" },\n      // exports: \"named\", // Use named exports\n      formats: [\"es\"],\n      // fileName: `assets/renderer.js`,\n      // name: \"NotebookRenderer\", // Name of the library\n    },\n    // minify: false,\n    commonjsOptions: {},\n\n    rollupOptions: {\n      // input: \"./src/notebook/index.tsx\",\n      output: {\n        entryFileNames: `assets/[name].js`,\n        chunkFileNames: `assets/[name].js`,\n        assetFileNames: `assets/[name].[ext]`,\n      },\n      external: [\"vscode\"],\n    },\n  },\n  resolve: {\n    alias: {\n      \"@uicore\": path.resolve(__dirname, \"./src/uiCore\"),\n      \"@assets\": path.resolve(__dirname, \"./src/assets\"),\n      \"@modules\": path.resolve(__dirname, \"./src/modules\"),\n      \"@testUtils\": path.resolve(__dirname, \"./src/testUtils\"),\n      \"@vscodeApi\": path.resolve(__dirname, \"./src/modules/vscode\"),\n      \"@telemetryEvents\": path.resolve(__dirname, \"../src/telemetry/events.ts\"),\n      \"@lib\": path.resolve(__dirname, \"./src/lib\"),\n    },\n  },\n  css: {\n    modules: {\n      localsConvention: \"dashes\",\n    },\n  },\n});\n"
  },
  {
    "path": "webview_panels/vite.config.ts",
    "content": "import react from \"@vitejs/plugin-react\";\nimport { cpSync } from \"fs\";\nimport path from \"path\";\nimport { defineConfig } from \"vite\";\nimport svgr from \"vite-plugin-svgr\";\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n  plugins: [\n    svgr(),\n    react(),\n    {\n      name: \"copy-codicons\",\n      renderStart: () => {\n        cpSync(\n          \"./node_modules/@vscode/codicons/dist\",\n          \"./dist/assets/codicons/\",\n          { recursive: true },\n        );\n      },\n    },\n  ],\n  build: {\n    cssCodeSplit: false,\n    rollupOptions: {\n      input: \"./src/main.tsx\",\n      output: {\n        entryFileNames: `assets/[name].js`,\n        chunkFileNames: `assets/chunk-[name].js`,\n        assetFileNames: (assetInfo) =>\n          assetInfo.name === \"style.css\"\n            ? \"assets/main.css\"\n            : \"assets/[name].[ext]\",\n      },\n    },\n  },\n  resolve: {\n    alias: {\n      \"@uicore\": path.resolve(__dirname, \"./src/uiCore\"),\n      \"@assets\": path.resolve(__dirname, \"./src/assets\"),\n      \"@modules\": path.resolve(__dirname, \"./src/modules\"),\n      \"@testUtils\": path.resolve(__dirname, \"./src/testUtils\"),\n      \"@vscodeApi\": path.resolve(__dirname, \"./src/modules/vscode\"),\n      \"@telemetryEvents\": path.resolve(__dirname, \"../src/telemetry/events.ts\"),\n      \"@lib\": path.resolve(__dirname, \"./src/lib\"),\n    },\n  },\n  css: {\n    modules: {\n      localsConvention: \"dashes\",\n    },\n  },\n});\n"
  }
]