├── .github └── workflows │ ├── generate-sitemap.yml │ ├── lint-all.yml │ ├── lint-changed.yml │ ├── potential-duplicates.yml │ └── sources.yaml ├── .gitignore ├── .vscode ├── launch.json └── settings.json ├── LICENSE ├── README.md ├── _config.yml ├── assets ├── css │ └── site.css ├── dist │ ├── css │ │ ├── bootstrap.min.css │ │ ├── bootstrap.min.css.map │ │ ├── bootstrap.rtl.min.css │ │ └── bootstrap.rtl.min.css.map │ └── js │ │ ├── bootstrap.bundle.min.js │ │ └── bootstrap.bundle.min.js.map └── js │ ├── color-modes.js │ └── site.js ├── googlee9879a763c198f4c.html ├── index.html ├── python ├── SourceList.py └── convert.py ├── repo └── index.html ├── sitemap.xml ├── sources.json └── sources.schema.json /.github/workflows/generate-sitemap.yml: -------------------------------------------------------------------------------- 1 | name: Generate xml sitemap 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: [main] 7 | paths: 8 | - "*.html" 9 | - "*.htm" 10 | 11 | jobs: 12 | generate-sitemap: 13 | name: Generate a sitemap 14 | runs-on: ubuntu-latest 15 | 16 | permissions: 17 | contents: write 18 | 19 | steps: 20 | - uses: actions/checkout@main 21 | with: 22 | fetch-depth: 0 23 | ref: ${{ github.head_ref }} 24 | 25 | - name: Generate the sitemap 26 | continue-on-error: true 27 | id: sitemap 28 | uses: cicirello/generate-sitemap@v1 29 | with: 30 | base-url-path: https://grayjay-sources.github.io/ 31 | sitemap-format: xml 32 | additional-extensions: doc docx ppt pptx xls xlsx html htm 33 | 34 | - name: Output stats 35 | continue-on-error: true 36 | run: | 37 | echo "sitemap-path = ${{ steps.sitemap.outputs.sitemap-path }}" 38 | echo "url-count = ${{ steps.sitemap.outputs.url-count }}" 39 | echo "excluded-count = ${{ steps.sitemap.outputs.excluded-count }}" 40 | 41 | # - name: Move sorted JSON 42 | # run: | 43 | # cp "${{ steps.sorted_sources.outputs.result }}" sources.json 44 | # git add sources.json 45 | # # git commit -m "Sort sources.json" 46 | # # git push 47 | 48 | - name: Push sitemap.xml 49 | continue-on-error: true 50 | uses: stefanzweifel/git-auto-commit-action@master 51 | with: 52 | commit_message: "[bot] Generate sitemap.xml" 53 | # - name: Create Pull Request 54 | # uses: peter-evans/create-pull-request@main 55 | # with: 56 | # # github-token: ${{ secrets.GITHUB_TOKEN }} 57 | # title: "Automated sitemap update" 58 | # body: > 59 | # Sitemap updated by the [generate-sitemap](https://github.com/cicirello/generate-sitemap) 60 | # GitHub action. Automated pull-request generated by the 61 | # [create-pull-request](https://github.com/peter-evans/create-pull-request) GitHub action. 62 | -------------------------------------------------------------------------------- /.github/workflows/lint-all.yml: -------------------------------------------------------------------------------- 1 | name: Lint all files 2 | "on": 3 | workflow_dispatch: null 4 | jobs: 5 | build: 6 | name: Lint 7 | runs-on: ubuntu-latest 8 | permissions: 9 | contents: write 10 | packages: read 11 | statuses: write 12 | actions: write 13 | steps: 14 | - name: Create Token 15 | id: create_token 16 | uses: tibdex/github-app-token@v2.1.0 17 | with: 18 | app_id: ${{ secrets.APP_ID }} 19 | private_key: ${{ secrets.APP_PRIVATE_KEY }} 20 | - name: Checkout code 21 | continue-on-error: true 22 | uses: actions/checkout@main 23 | with: 24 | fetch-depth: 0 25 | ref: ${{ github.event.pull_request.head.ref || github.head_ref || github.ref }} 26 | token: ${{ steps.create_token.outputs.token }} 27 | # env: 28 | # GITHUB_TOKEN: ${{ secrets.WORKFLOW_TOKEN }} 29 | - name: Super-linter 30 | continue-on-error: true 31 | uses: super-linter/super-linter@main 32 | env: 33 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 34 | VALIDATE_ALL_CODEBASE: true 35 | ENABLE_GITHUB_ACTIONS_STEP_SUMMARY: false 36 | SAVE_SUPER_LINTER_SUMMARY: false 37 | SAVE_SUPER_LINTER_OUTPUT: false 38 | VALIDATE_JSCPD: false 39 | VALIDATE_CHECKOV: false 40 | FIX_ANSIBLE: true 41 | FIX_CLANG_FORMAT: true 42 | FIX_CSHARP: true 43 | FIX_CSS_PRETTIER: true 44 | FIX_CSS: true 45 | FIX_DOTNET_SLN_FORMAT_ANALYZERS: true 46 | FIX_DOTNET_SLN_FORMAT_STYLE: true 47 | FIX_DOTNET_SLN_FORMAT_WHITESPACE: true 48 | FIX_ENV: true 49 | FIX_GO_MODULES: true 50 | FIX_GO: true 51 | FIX_GOOGLE_JAVA_FORMAT: true 52 | FIX_GRAPHQL_PRETTIER: true 53 | FIX_GROOVY: true 54 | FIX_HTML_PRETTIER: true 55 | FIX_JAVASCRIPT_ES: true 56 | FIX_JAVASCRIPT_PRETTIER: true 57 | FIX_JAVASCRIPT_STANDARD: true 58 | FIX_JSON_PRETTIER: true 59 | FIX_JSON: true 60 | FIX_JSONC: true 61 | FIX_JSONC_PRETTIER: true 62 | FIX_JSX_PRETTIER: true 63 | FIX_JSX: true 64 | FIX_MARKDOWN_PRETTIER: true 65 | FIX_MARKDOWN: true 66 | FIX_POWERSHELL: true 67 | FIX_PROTOBUF: true 68 | FIX_PYTHON_BLACK: true 69 | FIX_PYTHON_ISORT: true 70 | FIX_PYTHON_RUFF: true 71 | FIX_RUBY: true 72 | FIX_RUST_2015: true 73 | FIX_RUST_2018: true 74 | FIX_RUST_2021: true 75 | FIX_RUST_CLIPPY: true 76 | FIX_SCALAFMT: true 77 | FIX_SHELL_SHFMT: true 78 | FIX_SNAKEMAKE_SNAKEFMT: true 79 | FIX_SQLFLUFF: true 80 | FIX_TERRAFORM_FMT: true 81 | FIX_TSX: true 82 | FIX_TYPESCRIPT_ES: true 83 | FIX_TYPESCRIPT_PRETTIER: true 84 | FIX_TYPESCRIPT_STANDARD: true 85 | FIX_VUE_PRETTIER: true 86 | FIX_YAML_PRETTIER: true 87 | 88 | - name: Push fixed 89 | continue-on-error: true 90 | uses: stefanzweifel/git-auto-commit-action@master 91 | with: 92 | branch: ${{ github.event.pull_request.head.ref || github.head_ref || github.ref }} 93 | commit_message: "[bot/no ci/super-linter] fix formatting\n\nskip-checks: true" 94 | # env: 95 | # GITHUB_TOKEN: ${{ secrets.WORKFLOW_TOKEN }} 96 | -------------------------------------------------------------------------------- /.github/workflows/lint-changed.yml: -------------------------------------------------------------------------------- 1 | name: Lint changed files 2 | "on": 3 | push: null 4 | pull_request_target: 5 | types: 6 | - opened 7 | - synchronize 8 | jobs: 9 | build: 10 | name: Lint 11 | runs-on: ubuntu-latest 12 | permissions: 13 | contents: write 14 | packages: read 15 | statuses: write 16 | actions: write 17 | steps: 18 | - name: Create Token 19 | if: github.event_name != 'pull_request' 20 | id: create_token 21 | uses: tibdex/github-app-token@v2.1.0 22 | with: 23 | app_id: ${{ secrets.APP_ID }} 24 | private_key: ${{ secrets.APP_PRIVATE_KEY }} 25 | - name: Checkout code 26 | uses: actions/checkout@main 27 | with: 28 | fetch-depth: 0 29 | ref: ${{ github.event.pull_request.head.ref || github.head_ref || github.ref }} 30 | repository: ${{ github.event.pull_request.head.repo.full_name || github.head_ref.repo.full_name || github.ref.repo.full_name }} 31 | token: ${{ steps.create_token.outputs.token || secrets.WORKFLOW_TOKEN }} 32 | - name: Super-linter 33 | continue-on-error: true 34 | uses: super-linter/super-linter@main 35 | env: 36 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 37 | VALIDATE_ALL_CODEBASE: false 38 | ENABLE_GITHUB_ACTIONS_STEP_SUMMARY: false 39 | SAVE_SUPER_LINTER_SUMMARY: false 40 | SAVE_SUPER_LINTER_OUTPUT: false 41 | VALIDATE_JSCPD: false 42 | VALIDATE_CHECKOV: false 43 | FIX_ANSIBLE: true 44 | FIX_CLANG_FORMAT: true 45 | FIX_CSHARP: true 46 | FIX_CSS_PRETTIER: true 47 | FIX_CSS: true 48 | FIX_DOTNET_SLN_FORMAT_ANALYZERS: true 49 | FIX_DOTNET_SLN_FORMAT_STYLE: true 50 | FIX_DOTNET_SLN_FORMAT_WHITESPACE: true 51 | FIX_ENV: true 52 | FIX_GO_MODULES: true 53 | FIX_GO: true 54 | FIX_GOOGLE_JAVA_FORMAT: true 55 | FIX_GRAPHQL_PRETTIER: true 56 | FIX_GROOVY: true 57 | FIX_HTML_PRETTIER: true 58 | FIX_JAVASCRIPT_ES: true 59 | FIX_JAVASCRIPT_PRETTIER: true 60 | FIX_JAVASCRIPT_STANDARD: true 61 | FIX_JSON_PRETTIER: true 62 | FIX_JSON: true 63 | FIX_JSONC: true 64 | FIX_JSONC_PRETTIER: true 65 | FIX_JSX_PRETTIER: true 66 | FIX_JSX: true 67 | FIX_MARKDOWN_PRETTIER: true 68 | FIX_MARKDOWN: true 69 | FIX_POWERSHELL: true 70 | FIX_PROTOBUF: true 71 | FIX_PYTHON_BLACK: true 72 | FIX_PYTHON_ISORT: true 73 | FIX_PYTHON_RUFF: true 74 | FIX_RUBY: true 75 | FIX_RUST_2015: true 76 | FIX_RUST_2018: true 77 | FIX_RUST_2021: true 78 | FIX_RUST_CLIPPY: true 79 | FIX_SCALAFMT: true 80 | FIX_SHELL_SHFMT: true 81 | FIX_SNAKEMAKE_SNAKEFMT: true 82 | FIX_SQLFLUFF: true 83 | FIX_TERRAFORM_FMT: true 84 | FIX_TSX: true 85 | FIX_TYPESCRIPT_ES: true 86 | FIX_TYPESCRIPT_PRETTIER: true 87 | FIX_TYPESCRIPT_STANDARD: true 88 | FIX_VUE_PRETTIER: true 89 | FIX_YAML_PRETTIER: true 90 | 91 | - name: Push fixed 92 | uses: stefanzweifel/git-auto-commit-action@master 93 | with: 94 | branch: ${{ github.event.pull_request.head.ref || github.head_ref || github.ref }} 95 | commit_message: "[bot/no ci/super-linter] fix formatting\n\nskip-checks: true" 96 | # env: 97 | # GITHUB_TOKEN: ${{ secrets.WORKFLOW_TOKEN }} 98 | -------------------------------------------------------------------------------- /.github/workflows/potential-duplicates.yml: -------------------------------------------------------------------------------- 1 | name: Detect Potential Duplicates Issues # "forked" from https://github.com/KRTirtho/spotube/blob/master/.github/workflows/potential-duplicates.yml 2 | on: 3 | issues: 4 | types: 5 | - opened 6 | - edited 7 | jobs: 8 | run: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: wow-actions/potential-duplicates@v1 12 | with: 13 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 14 | # Issue title filter work with anymatch https://www.npmjs.com/package/anymatch. 15 | # Any matched issue will stop detection immediately. 16 | # You can specify multi filters in each line. 17 | filter: "" 18 | # Exclude keywords in title before detecting. 19 | exclude: "" 20 | # Label to set, when potential duplicates are detected. 21 | label: potential-duplicate 22 | # Get issues with state to compare. Supported state: 'all', 'closed', 'open'. 23 | state: all 24 | # If similarity is higher than this threshold([0,1]), issue will be marked as duplicate. 25 | threshold: 0.6 26 | # Reactions to be add to comment when potential duplicates are detected. 27 | # Available reactions: "-1", "+1", "confused", "laugh", "heart", "hooray", "rocket", "eyes" 28 | reactions: eyes 29 | # Comment to post when potential duplicates are detected. 30 | comment: > 31 | Potential duplicates: {{#issues}} 32 | - [#{{ number }}] {{ title }} ({{ accuracy }}%) 33 | {{/issues}} 34 | -------------------------------------------------------------------------------- /.github/workflows/sources.yaml: -------------------------------------------------------------------------------- 1 | name: sources.json 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | paths: 7 | - "sources.json" 8 | pull_request_target: 9 | types: 10 | - opened 11 | - synchronize 12 | paths: 13 | - "sources.json" 14 | 15 | jobs: 16 | validate-and-sort: 17 | runs-on: ubuntu-latest 18 | 19 | permissions: 20 | contents: write 21 | 22 | steps: 23 | - name: Pull 24 | uses: actions/checkout@main 25 | with: 26 | fetch-depth: 0 27 | ref: ${{ github.event.pull_request.head.ref || github.head_ref || github.ref }} 28 | repository: ${{ github.event.pull_request.head.repo.full_name || github.head_ref.repo.full_name || github.ref.repo.full_name }} 29 | 30 | - name: Schema (walbo/validate-json) 31 | continue-on-error: true 32 | uses: walbo/validate-json@main 33 | with: 34 | files: sources.json 35 | schema: sources.schema.json 36 | schema-version: draft-07 37 | allow-union-types: true 38 | strict: false 39 | allow-matching-properties: false 40 | fail-on-missing-schema: true 41 | # print-valid-files: false 42 | 43 | - name: Schema (cardinalby/schema-validator-action) 44 | continue-on-error: true 45 | uses: cardinalby/schema-validator-action@master 46 | with: 47 | file: sources.json 48 | schema: sources.schema.json 49 | fixSchemas: true 50 | 51 | - name: Schema (dsanders11/json-schema-validate-action) 52 | continue-on-error: true 53 | uses: dsanders11/json-schema-validate-action@main 54 | with: 55 | files: sources.json 56 | schema: sources.schema.json 57 | 58 | - name: Schema (ammarlakis/action-ajv) 59 | continue-on-error: true 60 | uses: ammarlakis/action-ajv@master 61 | with: 62 | data: sources.json 63 | schema: sources.schema.json 64 | allErrors: true 65 | verbose: true 66 | 67 | - name: Sort 68 | continue-on-error: true 69 | uses: yakubique/json-utils@main 70 | id: sorted_sources 71 | with: 72 | space: 4 # indent 73 | action: "sort" 74 | type: "nested-json" 75 | key: "name" 76 | from_file: "true" 77 | to_file: "true" 78 | input: "sources.json" 79 | 80 | - name: Move sorted 81 | continue-on-error: true 82 | run: | 83 | cp "${{ steps.sorted_sources.outputs.result }}" sources.json 84 | git add sources.json 85 | 86 | - name: Push sorted 87 | continue-on-error: true 88 | uses: stefanzweifel/git-auto-commit-action@master 89 | with: 90 | branch: ${{ github.event.pull_request.head.ref || github.head_ref || github.ref }} 91 | commit_message: "[bot/no ci/json-utils] Sort sources.json\n\nskip-checks: true" 92 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | _site/ 2 | .sass-cache/ 3 | .jekyll-cache/ 4 | .jekyll-metadata 5 | # Ignore folders generated by Bundler 6 | .bundle/ 7 | vendor/ 8 | # python/ 9 | sources.out.json 10 | # .vscode/launch.json 11 | *.pyc -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "Python Debugger: Current File", 9 | "type": "debugpy", 10 | "request": "launch", 11 | "program": "${file}", 12 | "console": "integratedTerminal" 13 | } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "json.schemas": [ 3 | { 4 | "fileMatch": ["sources.json"], 5 | "url": "file:///C:/Users/blusc/AppData/Local/Temp/grayjay-sources.github.io/sources.schema.json" 6 | } 7 | ], 8 | "json.schemas.remote": [ 9 | { 10 | "fileMatch": ["sources.json"], 11 | "url": "https://github.com/grayjay-sources/grayjay-sources.github.io/raw/main/sources.schema.json" 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GrayJay Sources Repository 2 | 3 | Allows you to easily browse and install various GrayJay sources 4 | 5 | - 6 | - 7 | - 8 | 9 | - [https://web.archive.org/web/\*/https://grayjay-sources.github.io/\*](https://web.archive.org/web/*/https://grayjay-sources.github.io/*) 10 | - 11 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-minimal 2 | -------------------------------------------------------------------------------- /assets/css/site.css: -------------------------------------------------------------------------------- 1 | .hidden { 2 | display: none; 3 | } 4 | 5 | .bd-placeholder-img { 6 | font-size: 1.125rem; 7 | text-anchor: middle; 8 | user-select: none; 9 | } 10 | 11 | @media (width >= 768px) { 12 | .bd-placeholder-img-lg { 13 | font-size: 3.5rem; 14 | } 15 | } 16 | 17 | .b-example-divider { 18 | width: 100%; 19 | height: 3rem; 20 | background-color: rgb(0 0 0 / 10%); 21 | border: solid rgb(0 0 0 / 15%); 22 | border-width: 1px 0; 23 | box-shadow: 24 | inset 0 0.5em 1.5em rgb(0 0 0 / 10%), 25 | inset 0 0.125em 0.5em rgb(0 0 0 / 15%); 26 | } 27 | 28 | .b-example-vr { 29 | flex-shrink: 0; 30 | width: 1.5rem; 31 | height: 100vh; 32 | } 33 | 34 | .bi { 35 | vertical-align: -0.125em; 36 | fill: currentcolor; 37 | } 38 | 39 | .nav-scroller { 40 | position: relative; 41 | z-index: 2; 42 | height: 2.75rem; 43 | overflow-y: hidden; 44 | } 45 | 46 | .nav-scroller .nav { 47 | display: flex; 48 | flex-wrap: nowrap; 49 | padding-bottom: 1rem; 50 | margin-top: -1px; 51 | overflow-x: auto; 52 | text-align: center; 53 | white-space: nowrap; 54 | -webkit-overflow-scrolling: touch; 55 | } 56 | 57 | .btn-bd-primary { 58 | --bd-violet-bg: #712cf9; 59 | --bd-violet-rgb: 112.520718, 44.062154, 249.437846; 60 | --bs-btn-font-weight: 600; 61 | --bs-btn-color: var(--bs-white); 62 | --bs-btn-bg: var(--bd-violet-bg); 63 | --bs-btn-border-color: var(--bd-violet-bg); 64 | --bs-btn-hover-color: var(--bs-white); 65 | --bs-btn-hover-bg: #6528e0; 66 | --bs-btn-hover-border-color: #6528e0; 67 | --bs-btn-focus-shadow-rgb: var(--bd-violet-rgb); 68 | --bs-btn-active-color: var(--bs-btn-hover-color); 69 | --bs-btn-active-bg: #5a23c8; 70 | --bs-btn-active-border-color: #5a23c8; 71 | } 72 | 73 | .bd-mode-toggle { 74 | z-index: 1500; 75 | } 76 | 77 | .bd-mode-toggle .dropdown-menu .active .bi { 78 | display: block !important; 79 | } 80 | 81 | .btn-qr-primary { 82 | border-radius: 50%; 83 | border-color: black; 84 | font-weight: 600; 85 | min-height: 2.5em; 86 | } 87 | 88 | .btn-qr-primary:hover { 89 | background-color: black; 90 | color: white; 91 | } 92 | 93 | /* .fab-container { 94 | z-index: 1500; 95 | display: flex; 96 | flex-direction: column; 97 | justify-content: flex-end; 98 | align-items: center; 99 | user-select: none; 100 | position: absolute; 101 | bottom: 30px; 102 | right: 30px; 103 | } 104 | .fab-container:hover { 105 | height: 100%; 106 | } 107 | .fab-container:hover .sub-button:nth-child(2) { 108 | transform: translateY(-80px); 109 | } 110 | .fab-container:hover .sub-button:nth-child(3) { 111 | transform: translateY(-140px); 112 | } 113 | .fab-container:hover .sub-button:nth-child(4) { 114 | transform: translateY(-200px); 115 | } 116 | .fab-container:hover .sub-button:nth-child(5) { 117 | transform: translateY(-260px); 118 | } 119 | .fab-container:hover .sub-button:nth-child(6) { 120 | transform: translateY(-320px); 121 | } 122 | .fab-container .fab { 123 | position: relative; 124 | height: 70px; 125 | width: 70px; 126 | background-color: #4ba2ff; 127 | border-radius: 50%; 128 | z-index: 2; 129 | } 130 | .fab-container .fab::before { 131 | content: " "; 132 | position: absolute; 133 | bottom: 0; 134 | right: 0; 135 | height: 35px; 136 | width: 35px; 137 | background-color: inherit; 138 | border-radius: 0 0 10px 0; 139 | z-index: -1; 140 | } 141 | .fab-container .fab .fab-content { 142 | display: flex; 143 | align-items: center; 144 | justify-content: center; 145 | height: 100%; 146 | width: 100%; 147 | border-radius: 50%; 148 | } 149 | .fab-container .fab .fab-content .material-icons { 150 | color: white; 151 | font-size: 48px; 152 | } 153 | .fab-container .sub-button { 154 | position: absolute; 155 | display: flex; 156 | align-items: center; 157 | justify-content: center; 158 | bottom: 10px; 159 | right: 10px; 160 | height: 50px; 161 | width: 50px; 162 | background-color: #4ba2ff; 163 | border-radius: 50%; 164 | transition: all 0.3s ease; 165 | } 166 | .fab-container .sub-button:hover { 167 | cursor: pointer; 168 | } 169 | .fab-container .sub-button .material-icons { 170 | color: white; 171 | padding-top: 6px; 172 | } */ 173 | 174 | img.source-icon, 175 | img.source-qrcode { 176 | max-height: 15em; 177 | min-height: 15em; 178 | min-width: 15em; 179 | max-width: 15em; 180 | margin-left: auto; 181 | margin-right: auto; 182 | padding: 2em; 183 | } 184 | 185 | .card-text { 186 | max-height: 4em; 187 | min-height: 4em; 188 | text-overflow: ellipsis; 189 | margin-bottom: 4em; 190 | } 191 | -------------------------------------------------------------------------------- /assets/dist/js/bootstrap.bundle.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v5.3.3 (https://getbootstrap.com/) 3 | * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 5 | */ 6 | !(function (t, e) { 7 | "object" == typeof exports && "undefined" != typeof module 8 | ? (module.exports = e()) 9 | : "function" == typeof define && define.amd 10 | ? define(e) 11 | : ((t = 12 | "undefined" != typeof globalThis ? globalThis : t || self).bootstrap = 13 | e()); 14 | })(this, function () { 15 | "use strict"; 16 | const t = new Map(), 17 | e = { 18 | set(e, i, n) { 19 | t.has(e) || t.set(e, new Map()); 20 | const s = t.get(e); 21 | s.has(i) || 0 === s.size 22 | ? s.set(i, n) 23 | : console.error( 24 | `Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`, 25 | ); 26 | }, 27 | get: (e, i) => (t.has(e) && t.get(e).get(i)) || null, 28 | remove(e, i) { 29 | if (!t.has(e)) return; 30 | const n = t.get(e); 31 | n.delete(i), 0 === n.size && t.delete(e); 32 | }, 33 | }, 34 | i = "transitionend", 35 | n = (t) => ( 36 | t && 37 | window.CSS && 38 | window.CSS.escape && 39 | (t = t.replace(/#([^\s"#']+)/g, (t, e) => `#${CSS.escape(e)}`)), 40 | t 41 | ), 42 | s = (t) => { 43 | t.dispatchEvent(new Event(i)); 44 | }, 45 | o = (t) => 46 | !(!t || "object" != typeof t) && 47 | (void 0 !== t.jquery && (t = t[0]), void 0 !== t.nodeType), 48 | r = (t) => 49 | o(t) 50 | ? t.jquery 51 | ? t[0] 52 | : t 53 | : "string" == typeof t && t.length > 0 54 | ? document.querySelector(n(t)) 55 | : null, 56 | a = (t) => { 57 | if (!o(t) || 0 === t.getClientRects().length) return !1; 58 | const e = 59 | "visible" === getComputedStyle(t).getPropertyValue("visibility"), 60 | i = t.closest("details:not([open])"); 61 | if (!i) return e; 62 | if (i !== t) { 63 | const e = t.closest("summary"); 64 | if (e && e.parentNode !== i) return !1; 65 | if (null === e) return !1; 66 | } 67 | return e; 68 | }, 69 | l = (t) => 70 | !t || 71 | t.nodeType !== Node.ELEMENT_NODE || 72 | !!t.classList.contains("disabled") || 73 | (void 0 !== t.disabled 74 | ? t.disabled 75 | : t.hasAttribute("disabled") && "false" !== t.getAttribute("disabled")), 76 | c = (t) => { 77 | if (!document.documentElement.attachShadow) return null; 78 | if ("function" == typeof t.getRootNode) { 79 | const e = t.getRootNode(); 80 | return e instanceof ShadowRoot ? e : null; 81 | } 82 | return t instanceof ShadowRoot 83 | ? t 84 | : t.parentNode 85 | ? c(t.parentNode) 86 | : null; 87 | }, 88 | h = () => {}, 89 | d = (t) => { 90 | t.offsetHeight; 91 | }, 92 | u = () => 93 | window.jQuery && !document.body.hasAttribute("data-bs-no-jquery") 94 | ? window.jQuery 95 | : null, 96 | f = [], 97 | p = () => "rtl" === document.documentElement.dir, 98 | m = (t) => { 99 | var e; 100 | (e = () => { 101 | const e = u(); 102 | if (e) { 103 | const i = t.NAME, 104 | n = e.fn[i]; 105 | (e.fn[i] = t.jQueryInterface), 106 | (e.fn[i].Constructor = t), 107 | (e.fn[i].noConflict = () => ((e.fn[i] = n), t.jQueryInterface)); 108 | } 109 | }), 110 | "loading" === document.readyState 111 | ? (f.length || 112 | document.addEventListener("DOMContentLoaded", () => { 113 | for (const t of f) t(); 114 | }), 115 | f.push(e)) 116 | : e(); 117 | }, 118 | g = (t, e = [], i = t) => ("function" == typeof t ? t(...e) : i), 119 | _ = (t, e, n = !0) => { 120 | if (!n) return void g(t); 121 | const o = 122 | ((t) => { 123 | if (!t) return 0; 124 | let { transitionDuration: e, transitionDelay: i } = 125 | window.getComputedStyle(t); 126 | const n = Number.parseFloat(e), 127 | s = Number.parseFloat(i); 128 | return n || s 129 | ? ((e = e.split(",")[0]), 130 | (i = i.split(",")[0]), 131 | 1e3 * (Number.parseFloat(e) + Number.parseFloat(i))) 132 | : 0; 133 | })(e) + 5; 134 | let r = !1; 135 | const a = ({ target: n }) => { 136 | n === e && ((r = !0), e.removeEventListener(i, a), g(t)); 137 | }; 138 | e.addEventListener(i, a), 139 | setTimeout(() => { 140 | r || s(e); 141 | }, o); 142 | }, 143 | b = (t, e, i, n) => { 144 | const s = t.length; 145 | let o = t.indexOf(e); 146 | return -1 === o 147 | ? !i && n 148 | ? t[s - 1] 149 | : t[0] 150 | : ((o += i ? 1 : -1), 151 | n && (o = (o + s) % s), 152 | t[Math.max(0, Math.min(o, s - 1))]); 153 | }, 154 | v = /[^.]*(?=\..*)\.|.*/, 155 | y = /\..*/, 156 | w = /::\d+$/, 157 | A = {}; 158 | let E = 1; 159 | const T = { mouseenter: "mouseover", mouseleave: "mouseout" }, 160 | C = new Set([ 161 | "click", 162 | "dblclick", 163 | "mouseup", 164 | "mousedown", 165 | "contextmenu", 166 | "mousewheel", 167 | "DOMMouseScroll", 168 | "mouseover", 169 | "mouseout", 170 | "mousemove", 171 | "selectstart", 172 | "selectend", 173 | "keydown", 174 | "keypress", 175 | "keyup", 176 | "orientationchange", 177 | "touchstart", 178 | "touchmove", 179 | "touchend", 180 | "touchcancel", 181 | "pointerdown", 182 | "pointermove", 183 | "pointerup", 184 | "pointerleave", 185 | "pointercancel", 186 | "gesturestart", 187 | "gesturechange", 188 | "gestureend", 189 | "focus", 190 | "blur", 191 | "change", 192 | "reset", 193 | "select", 194 | "submit", 195 | "focusin", 196 | "focusout", 197 | "load", 198 | "unload", 199 | "beforeunload", 200 | "resize", 201 | "move", 202 | "DOMContentLoaded", 203 | "readystatechange", 204 | "error", 205 | "abort", 206 | "scroll", 207 | ]); 208 | function O(t, e) { 209 | return (e && `${e}::${E++}`) || t.uidEvent || E++; 210 | } 211 | function x(t) { 212 | const e = O(t); 213 | return (t.uidEvent = e), (A[e] = A[e] || {}), A[e]; 214 | } 215 | function k(t, e, i = null) { 216 | return Object.values(t).find( 217 | (t) => t.callable === e && t.delegationSelector === i, 218 | ); 219 | } 220 | function L(t, e, i) { 221 | const n = "string" == typeof e, 222 | s = n ? i : e || i; 223 | let o = I(t); 224 | return C.has(o) || (o = t), [n, s, o]; 225 | } 226 | function S(t, e, i, n, s) { 227 | if ("string" != typeof e || !t) return; 228 | let [o, r, a] = L(e, i, n); 229 | if (e in T) { 230 | const t = (t) => 231 | function (e) { 232 | if ( 233 | !e.relatedTarget || 234 | (e.relatedTarget !== e.delegateTarget && 235 | !e.delegateTarget.contains(e.relatedTarget)) 236 | ) 237 | return t.call(this, e); 238 | }; 239 | r = t(r); 240 | } 241 | const l = x(t), 242 | c = l[a] || (l[a] = {}), 243 | h = k(c, r, o ? i : null); 244 | if (h) return void (h.oneOff = h.oneOff && s); 245 | const d = O(r, e.replace(v, "")), 246 | u = o 247 | ? (function (t, e, i) { 248 | return function n(s) { 249 | const o = t.querySelectorAll(e); 250 | for (let { target: r } = s; r && r !== this; r = r.parentNode) 251 | for (const a of o) 252 | if (a === r) 253 | return ( 254 | P(s, { delegateTarget: r }), 255 | n.oneOff && N.off(t, s.type, e, i), 256 | i.apply(r, [s]) 257 | ); 258 | }; 259 | })(t, i, r) 260 | : (function (t, e) { 261 | return function i(n) { 262 | return ( 263 | P(n, { delegateTarget: t }), 264 | i.oneOff && N.off(t, n.type, e), 265 | e.apply(t, [n]) 266 | ); 267 | }; 268 | })(t, r); 269 | (u.delegationSelector = o ? i : null), 270 | (u.callable = r), 271 | (u.oneOff = s), 272 | (u.uidEvent = d), 273 | (c[d] = u), 274 | t.addEventListener(a, u, o); 275 | } 276 | function D(t, e, i, n, s) { 277 | const o = k(e[i], n, s); 278 | o && (t.removeEventListener(i, o, Boolean(s)), delete e[i][o.uidEvent]); 279 | } 280 | function $(t, e, i, n) { 281 | const s = e[i] || {}; 282 | for (const [o, r] of Object.entries(s)) 283 | o.includes(n) && D(t, e, i, r.callable, r.delegationSelector); 284 | } 285 | function I(t) { 286 | return (t = t.replace(y, "")), T[t] || t; 287 | } 288 | const N = { 289 | on(t, e, i, n) { 290 | S(t, e, i, n, !1); 291 | }, 292 | one(t, e, i, n) { 293 | S(t, e, i, n, !0); 294 | }, 295 | off(t, e, i, n) { 296 | if ("string" != typeof e || !t) return; 297 | const [s, o, r] = L(e, i, n), 298 | a = r !== e, 299 | l = x(t), 300 | c = l[r] || {}, 301 | h = e.startsWith("."); 302 | if (void 0 === o) { 303 | if (h) for (const i of Object.keys(l)) $(t, l, i, e.slice(1)); 304 | for (const [i, n] of Object.entries(c)) { 305 | const s = i.replace(w, ""); 306 | (a && !e.includes(s)) || D(t, l, r, n.callable, n.delegationSelector); 307 | } 308 | } else { 309 | if (!Object.keys(c).length) return; 310 | D(t, l, r, o, s ? i : null); 311 | } 312 | }, 313 | trigger(t, e, i) { 314 | if ("string" != typeof e || !t) return null; 315 | const n = u(); 316 | let s = null, 317 | o = !0, 318 | r = !0, 319 | a = !1; 320 | e !== I(e) && 321 | n && 322 | ((s = n.Event(e, i)), 323 | n(t).trigger(s), 324 | (o = !s.isPropagationStopped()), 325 | (r = !s.isImmediatePropagationStopped()), 326 | (a = s.isDefaultPrevented())); 327 | const l = P(new Event(e, { bubbles: o, cancelable: !0 }), i); 328 | return ( 329 | a && l.preventDefault(), 330 | r && t.dispatchEvent(l), 331 | l.defaultPrevented && s && s.preventDefault(), 332 | l 333 | ); 334 | }, 335 | }; 336 | function P(t, e = {}) { 337 | for (const [i, n] of Object.entries(e)) 338 | try { 339 | t[i] = n; 340 | } catch (e) { 341 | Object.defineProperty(t, i, { configurable: !0, get: () => n }); 342 | } 343 | return t; 344 | } 345 | function j(t) { 346 | if ("true" === t) return !0; 347 | if ("false" === t) return !1; 348 | if (t === Number(t).toString()) return Number(t); 349 | if ("" === t || "null" === t) return null; 350 | if ("string" != typeof t) return t; 351 | try { 352 | return JSON.parse(decodeURIComponent(t)); 353 | } catch (e) { 354 | return t; 355 | } 356 | } 357 | function M(t) { 358 | return t.replace(/[A-Z]/g, (t) => `-${t.toLowerCase()}`); 359 | } 360 | const F = { 361 | setDataAttribute(t, e, i) { 362 | t.setAttribute(`data-bs-${M(e)}`, i); 363 | }, 364 | removeDataAttribute(t, e) { 365 | t.removeAttribute(`data-bs-${M(e)}`); 366 | }, 367 | getDataAttributes(t) { 368 | if (!t) return {}; 369 | const e = {}, 370 | i = Object.keys(t.dataset).filter( 371 | (t) => t.startsWith("bs") && !t.startsWith("bsConfig"), 372 | ); 373 | for (const n of i) { 374 | let i = n.replace(/^bs/, ""); 375 | (i = i.charAt(0).toLowerCase() + i.slice(1, i.length)), 376 | (e[i] = j(t.dataset[n])); 377 | } 378 | return e; 379 | }, 380 | getDataAttribute: (t, e) => j(t.getAttribute(`data-bs-${M(e)}`)), 381 | }; 382 | class H { 383 | static get Default() { 384 | return {}; 385 | } 386 | static get DefaultType() { 387 | return {}; 388 | } 389 | static get NAME() { 390 | throw new Error( 391 | 'You have to implement the static method "NAME", for each component!', 392 | ); 393 | } 394 | _getConfig(t) { 395 | return ( 396 | (t = this._mergeConfigObj(t)), 397 | (t = this._configAfterMerge(t)), 398 | this._typeCheckConfig(t), 399 | t 400 | ); 401 | } 402 | _configAfterMerge(t) { 403 | return t; 404 | } 405 | _mergeConfigObj(t, e) { 406 | const i = o(e) ? F.getDataAttribute(e, "config") : {}; 407 | return { 408 | ...this.constructor.Default, 409 | ...("object" == typeof i ? i : {}), 410 | ...(o(e) ? F.getDataAttributes(e) : {}), 411 | ...("object" == typeof t ? t : {}), 412 | }; 413 | } 414 | _typeCheckConfig(t, e = this.constructor.DefaultType) { 415 | for (const [n, s] of Object.entries(e)) { 416 | const e = t[n], 417 | r = o(e) 418 | ? "element" 419 | : null == (i = e) 420 | ? `${i}` 421 | : Object.prototype.toString 422 | .call(i) 423 | .match(/\s([a-z]+)/i)[1] 424 | .toLowerCase(); 425 | if (!new RegExp(s).test(r)) 426 | throw new TypeError( 427 | `${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`, 428 | ); 429 | } 430 | var i; 431 | } 432 | } 433 | class W extends H { 434 | constructor(t, i) { 435 | super(), 436 | (t = r(t)) && 437 | ((this._element = t), 438 | (this._config = this._getConfig(i)), 439 | e.set(this._element, this.constructor.DATA_KEY, this)); 440 | } 441 | dispose() { 442 | e.remove(this._element, this.constructor.DATA_KEY), 443 | N.off(this._element, this.constructor.EVENT_KEY); 444 | for (const t of Object.getOwnPropertyNames(this)) this[t] = null; 445 | } 446 | _queueCallback(t, e, i = !0) { 447 | _(t, e, i); 448 | } 449 | _getConfig(t) { 450 | return ( 451 | (t = this._mergeConfigObj(t, this._element)), 452 | (t = this._configAfterMerge(t)), 453 | this._typeCheckConfig(t), 454 | t 455 | ); 456 | } 457 | static getInstance(t) { 458 | return e.get(r(t), this.DATA_KEY); 459 | } 460 | static getOrCreateInstance(t, e = {}) { 461 | return ( 462 | this.getInstance(t) || new this(t, "object" == typeof e ? e : null) 463 | ); 464 | } 465 | static get VERSION() { 466 | return "5.3.3"; 467 | } 468 | static get DATA_KEY() { 469 | return `bs.${this.NAME}`; 470 | } 471 | static get EVENT_KEY() { 472 | return `.${this.DATA_KEY}`; 473 | } 474 | static eventName(t) { 475 | return `${t}${this.EVENT_KEY}`; 476 | } 477 | } 478 | const B = (t) => { 479 | let e = t.getAttribute("data-bs-target"); 480 | if (!e || "#" === e) { 481 | let i = t.getAttribute("href"); 482 | if (!i || (!i.includes("#") && !i.startsWith("."))) return null; 483 | i.includes("#") && !i.startsWith("#") && (i = `#${i.split("#")[1]}`), 484 | (e = i && "#" !== i ? i.trim() : null); 485 | } 486 | return e 487 | ? e 488 | .split(",") 489 | .map((t) => n(t)) 490 | .join(",") 491 | : null; 492 | }, 493 | z = { 494 | find: (t, e = document.documentElement) => 495 | [].concat(...Element.prototype.querySelectorAll.call(e, t)), 496 | findOne: (t, e = document.documentElement) => 497 | Element.prototype.querySelector.call(e, t), 498 | children: (t, e) => [].concat(...t.children).filter((t) => t.matches(e)), 499 | parents(t, e) { 500 | const i = []; 501 | let n = t.parentNode.closest(e); 502 | for (; n; ) i.push(n), (n = n.parentNode.closest(e)); 503 | return i; 504 | }, 505 | prev(t, e) { 506 | let i = t.previousElementSibling; 507 | for (; i; ) { 508 | if (i.matches(e)) return [i]; 509 | i = i.previousElementSibling; 510 | } 511 | return []; 512 | }, 513 | next(t, e) { 514 | let i = t.nextElementSibling; 515 | for (; i; ) { 516 | if (i.matches(e)) return [i]; 517 | i = i.nextElementSibling; 518 | } 519 | return []; 520 | }, 521 | focusableChildren(t) { 522 | const e = [ 523 | "a", 524 | "button", 525 | "input", 526 | "textarea", 527 | "select", 528 | "details", 529 | "[tabindex]", 530 | '[contenteditable="true"]', 531 | ] 532 | .map((t) => `${t}:not([tabindex^="-"])`) 533 | .join(","); 534 | return this.find(e, t).filter((t) => !l(t) && a(t)); 535 | }, 536 | getSelectorFromElement(t) { 537 | const e = B(t); 538 | return e && z.findOne(e) ? e : null; 539 | }, 540 | getElementFromSelector(t) { 541 | const e = B(t); 542 | return e ? z.findOne(e) : null; 543 | }, 544 | getMultipleElementsFromSelector(t) { 545 | const e = B(t); 546 | return e ? z.find(e) : []; 547 | }, 548 | }, 549 | R = (t, e = "hide") => { 550 | const i = `click.dismiss${t.EVENT_KEY}`, 551 | n = t.NAME; 552 | N.on(document, i, `[data-bs-dismiss="${n}"]`, function (i) { 553 | if ( 554 | (["A", "AREA"].includes(this.tagName) && i.preventDefault(), l(this)) 555 | ) 556 | return; 557 | const s = z.getElementFromSelector(this) || this.closest(`.${n}`); 558 | t.getOrCreateInstance(s)[e](); 559 | }); 560 | }, 561 | q = ".bs.alert", 562 | V = `close${q}`, 563 | K = `closed${q}`; 564 | class Q extends W { 565 | static get NAME() { 566 | return "alert"; 567 | } 568 | close() { 569 | if (N.trigger(this._element, V).defaultPrevented) return; 570 | this._element.classList.remove("show"); 571 | const t = this._element.classList.contains("fade"); 572 | this._queueCallback(() => this._destroyElement(), this._element, t); 573 | } 574 | _destroyElement() { 575 | this._element.remove(), N.trigger(this._element, K), this.dispose(); 576 | } 577 | static jQueryInterface(t) { 578 | return this.each(function () { 579 | const e = Q.getOrCreateInstance(this); 580 | if ("string" == typeof t) { 581 | if (void 0 === e[t] || t.startsWith("_") || "constructor" === t) 582 | throw new TypeError(`No method named "${t}"`); 583 | e[t](this); 584 | } 585 | }); 586 | } 587 | } 588 | R(Q, "close"), m(Q); 589 | const X = '[data-bs-toggle="button"]'; 590 | class Y extends W { 591 | static get NAME() { 592 | return "button"; 593 | } 594 | toggle() { 595 | this._element.setAttribute( 596 | "aria-pressed", 597 | this._element.classList.toggle("active"), 598 | ); 599 | } 600 | static jQueryInterface(t) { 601 | return this.each(function () { 602 | const e = Y.getOrCreateInstance(this); 603 | "toggle" === t && e[t](); 604 | }); 605 | } 606 | } 607 | N.on(document, "click.bs.button.data-api", X, (t) => { 608 | t.preventDefault(); 609 | const e = t.target.closest(X); 610 | Y.getOrCreateInstance(e).toggle(); 611 | }), 612 | m(Y); 613 | const U = ".bs.swipe", 614 | G = `touchstart${U}`, 615 | J = `touchmove${U}`, 616 | Z = `touchend${U}`, 617 | tt = `pointerdown${U}`, 618 | et = `pointerup${U}`, 619 | it = { endCallback: null, leftCallback: null, rightCallback: null }, 620 | nt = { 621 | endCallback: "(function|null)", 622 | leftCallback: "(function|null)", 623 | rightCallback: "(function|null)", 624 | }; 625 | class st extends H { 626 | constructor(t, e) { 627 | super(), 628 | (this._element = t), 629 | t && 630 | st.isSupported() && 631 | ((this._config = this._getConfig(e)), 632 | (this._deltaX = 0), 633 | (this._supportPointerEvents = Boolean(window.PointerEvent)), 634 | this._initEvents()); 635 | } 636 | static get Default() { 637 | return it; 638 | } 639 | static get DefaultType() { 640 | return nt; 641 | } 642 | static get NAME() { 643 | return "swipe"; 644 | } 645 | dispose() { 646 | N.off(this._element, U); 647 | } 648 | _start(t) { 649 | this._supportPointerEvents 650 | ? this._eventIsPointerPenTouch(t) && (this._deltaX = t.clientX) 651 | : (this._deltaX = t.touches[0].clientX); 652 | } 653 | _end(t) { 654 | this._eventIsPointerPenTouch(t) && 655 | (this._deltaX = t.clientX - this._deltaX), 656 | this._handleSwipe(), 657 | g(this._config.endCallback); 658 | } 659 | _move(t) { 660 | this._deltaX = 661 | t.touches && t.touches.length > 1 662 | ? 0 663 | : t.touches[0].clientX - this._deltaX; 664 | } 665 | _handleSwipe() { 666 | const t = Math.abs(this._deltaX); 667 | if (t <= 40) return; 668 | const e = t / this._deltaX; 669 | (this._deltaX = 0), 670 | e && g(e > 0 ? this._config.rightCallback : this._config.leftCallback); 671 | } 672 | _initEvents() { 673 | this._supportPointerEvents 674 | ? (N.on(this._element, tt, (t) => this._start(t)), 675 | N.on(this._element, et, (t) => this._end(t)), 676 | this._element.classList.add("pointer-event")) 677 | : (N.on(this._element, G, (t) => this._start(t)), 678 | N.on(this._element, J, (t) => this._move(t)), 679 | N.on(this._element, Z, (t) => this._end(t))); 680 | } 681 | _eventIsPointerPenTouch(t) { 682 | return ( 683 | this._supportPointerEvents && 684 | ("pen" === t.pointerType || "touch" === t.pointerType) 685 | ); 686 | } 687 | static isSupported() { 688 | return ( 689 | "ontouchstart" in document.documentElement || 690 | navigator.maxTouchPoints > 0 691 | ); 692 | } 693 | } 694 | const ot = ".bs.carousel", 695 | rt = ".data-api", 696 | at = "next", 697 | lt = "prev", 698 | ct = "left", 699 | ht = "right", 700 | dt = `slide${ot}`, 701 | ut = `slid${ot}`, 702 | ft = `keydown${ot}`, 703 | pt = `mouseenter${ot}`, 704 | mt = `mouseleave${ot}`, 705 | gt = `dragstart${ot}`, 706 | _t = `load${ot}${rt}`, 707 | bt = `click${ot}${rt}`, 708 | vt = "carousel", 709 | yt = "active", 710 | wt = ".active", 711 | At = ".carousel-item", 712 | Et = wt + At, 713 | Tt = { ArrowLeft: ht, ArrowRight: ct }, 714 | Ct = { 715 | interval: 5e3, 716 | keyboard: !0, 717 | pause: "hover", 718 | ride: !1, 719 | touch: !0, 720 | wrap: !0, 721 | }, 722 | Ot = { 723 | interval: "(number|boolean)", 724 | keyboard: "boolean", 725 | pause: "(string|boolean)", 726 | ride: "(boolean|string)", 727 | touch: "boolean", 728 | wrap: "boolean", 729 | }; 730 | class xt extends W { 731 | constructor(t, e) { 732 | super(t, e), 733 | (this._interval = null), 734 | (this._activeElement = null), 735 | (this._isSliding = !1), 736 | (this.touchTimeout = null), 737 | (this._swipeHelper = null), 738 | (this._indicatorsElement = z.findOne( 739 | ".carousel-indicators", 740 | this._element, 741 | )), 742 | this._addEventListeners(), 743 | this._config.ride === vt && this.cycle(); 744 | } 745 | static get Default() { 746 | return Ct; 747 | } 748 | static get DefaultType() { 749 | return Ot; 750 | } 751 | static get NAME() { 752 | return "carousel"; 753 | } 754 | next() { 755 | this._slide(at); 756 | } 757 | nextWhenVisible() { 758 | !document.hidden && a(this._element) && this.next(); 759 | } 760 | prev() { 761 | this._slide(lt); 762 | } 763 | pause() { 764 | this._isSliding && s(this._element), this._clearInterval(); 765 | } 766 | cycle() { 767 | this._clearInterval(), 768 | this._updateInterval(), 769 | (this._interval = setInterval( 770 | () => this.nextWhenVisible(), 771 | this._config.interval, 772 | )); 773 | } 774 | _maybeEnableCycle() { 775 | this._config.ride && 776 | (this._isSliding 777 | ? N.one(this._element, ut, () => this.cycle()) 778 | : this.cycle()); 779 | } 780 | to(t) { 781 | const e = this._getItems(); 782 | if (t > e.length - 1 || t < 0) return; 783 | if (this._isSliding) 784 | return void N.one(this._element, ut, () => this.to(t)); 785 | const i = this._getItemIndex(this._getActive()); 786 | if (i === t) return; 787 | const n = t > i ? at : lt; 788 | this._slide(n, e[t]); 789 | } 790 | dispose() { 791 | this._swipeHelper && this._swipeHelper.dispose(), super.dispose(); 792 | } 793 | _configAfterMerge(t) { 794 | return (t.defaultInterval = t.interval), t; 795 | } 796 | _addEventListeners() { 797 | this._config.keyboard && N.on(this._element, ft, (t) => this._keydown(t)), 798 | "hover" === this._config.pause && 799 | (N.on(this._element, pt, () => this.pause()), 800 | N.on(this._element, mt, () => this._maybeEnableCycle())), 801 | this._config.touch && 802 | st.isSupported() && 803 | this._addTouchEventListeners(); 804 | } 805 | _addTouchEventListeners() { 806 | for (const t of z.find(".carousel-item img", this._element)) 807 | N.on(t, gt, (t) => t.preventDefault()); 808 | const t = { 809 | leftCallback: () => this._slide(this._directionToOrder(ct)), 810 | rightCallback: () => this._slide(this._directionToOrder(ht)), 811 | endCallback: () => { 812 | "hover" === this._config.pause && 813 | (this.pause(), 814 | this.touchTimeout && clearTimeout(this.touchTimeout), 815 | (this.touchTimeout = setTimeout( 816 | () => this._maybeEnableCycle(), 817 | 500 + this._config.interval, 818 | ))); 819 | }, 820 | }; 821 | this._swipeHelper = new st(this._element, t); 822 | } 823 | _keydown(t) { 824 | if (/input|textarea/i.test(t.target.tagName)) return; 825 | const e = Tt[t.key]; 826 | e && (t.preventDefault(), this._slide(this._directionToOrder(e))); 827 | } 828 | _getItemIndex(t) { 829 | return this._getItems().indexOf(t); 830 | } 831 | _setActiveIndicatorElement(t) { 832 | if (!this._indicatorsElement) return; 833 | const e = z.findOne(wt, this._indicatorsElement); 834 | e.classList.remove(yt), e.removeAttribute("aria-current"); 835 | const i = z.findOne(`[data-bs-slide-to="${t}"]`, this._indicatorsElement); 836 | i && (i.classList.add(yt), i.setAttribute("aria-current", "true")); 837 | } 838 | _updateInterval() { 839 | const t = this._activeElement || this._getActive(); 840 | if (!t) return; 841 | const e = Number.parseInt(t.getAttribute("data-bs-interval"), 10); 842 | this._config.interval = e || this._config.defaultInterval; 843 | } 844 | _slide(t, e = null) { 845 | if (this._isSliding) return; 846 | const i = this._getActive(), 847 | n = t === at, 848 | s = e || b(this._getItems(), i, n, this._config.wrap); 849 | if (s === i) return; 850 | const o = this._getItemIndex(s), 851 | r = (e) => 852 | N.trigger(this._element, e, { 853 | relatedTarget: s, 854 | direction: this._orderToDirection(t), 855 | from: this._getItemIndex(i), 856 | to: o, 857 | }); 858 | if (r(dt).defaultPrevented) return; 859 | if (!i || !s) return; 860 | const a = Boolean(this._interval); 861 | this.pause(), 862 | (this._isSliding = !0), 863 | this._setActiveIndicatorElement(o), 864 | (this._activeElement = s); 865 | const l = n ? "carousel-item-start" : "carousel-item-end", 866 | c = n ? "carousel-item-next" : "carousel-item-prev"; 867 | s.classList.add(c), 868 | d(s), 869 | i.classList.add(l), 870 | s.classList.add(l), 871 | this._queueCallback( 872 | () => { 873 | s.classList.remove(l, c), 874 | s.classList.add(yt), 875 | i.classList.remove(yt, c, l), 876 | (this._isSliding = !1), 877 | r(ut); 878 | }, 879 | i, 880 | this._isAnimated(), 881 | ), 882 | a && this.cycle(); 883 | } 884 | _isAnimated() { 885 | return this._element.classList.contains("slide"); 886 | } 887 | _getActive() { 888 | return z.findOne(Et, this._element); 889 | } 890 | _getItems() { 891 | return z.find(At, this._element); 892 | } 893 | _clearInterval() { 894 | this._interval && 895 | (clearInterval(this._interval), (this._interval = null)); 896 | } 897 | _directionToOrder(t) { 898 | return p() ? (t === ct ? lt : at) : t === ct ? at : lt; 899 | } 900 | _orderToDirection(t) { 901 | return p() ? (t === lt ? ct : ht) : t === lt ? ht : ct; 902 | } 903 | static jQueryInterface(t) { 904 | return this.each(function () { 905 | const e = xt.getOrCreateInstance(this, t); 906 | if ("number" != typeof t) { 907 | if ("string" == typeof t) { 908 | if (void 0 === e[t] || t.startsWith("_") || "constructor" === t) 909 | throw new TypeError(`No method named "${t}"`); 910 | e[t](); 911 | } 912 | } else e.to(t); 913 | }); 914 | } 915 | } 916 | N.on(document, bt, "[data-bs-slide], [data-bs-slide-to]", function (t) { 917 | const e = z.getElementFromSelector(this); 918 | if (!e || !e.classList.contains(vt)) return; 919 | t.preventDefault(); 920 | const i = xt.getOrCreateInstance(e), 921 | n = this.getAttribute("data-bs-slide-to"); 922 | return n 923 | ? (i.to(n), void i._maybeEnableCycle()) 924 | : "next" === F.getDataAttribute(this, "slide") 925 | ? (i.next(), void i._maybeEnableCycle()) 926 | : (i.prev(), void i._maybeEnableCycle()); 927 | }), 928 | N.on(window, _t, () => { 929 | const t = z.find('[data-bs-ride="carousel"]'); 930 | for (const e of t) xt.getOrCreateInstance(e); 931 | }), 932 | m(xt); 933 | const kt = ".bs.collapse", 934 | Lt = `show${kt}`, 935 | St = `shown${kt}`, 936 | Dt = `hide${kt}`, 937 | $t = `hidden${kt}`, 938 | It = `click${kt}.data-api`, 939 | Nt = "show", 940 | Pt = "collapse", 941 | jt = "collapsing", 942 | Mt = `:scope .${Pt} .${Pt}`, 943 | Ft = '[data-bs-toggle="collapse"]', 944 | Ht = { parent: null, toggle: !0 }, 945 | Wt = { parent: "(null|element)", toggle: "boolean" }; 946 | class Bt extends W { 947 | constructor(t, e) { 948 | super(t, e), (this._isTransitioning = !1), (this._triggerArray = []); 949 | const i = z.find(Ft); 950 | for (const t of i) { 951 | const e = z.getSelectorFromElement(t), 952 | i = z.find(e).filter((t) => t === this._element); 953 | null !== e && i.length && this._triggerArray.push(t); 954 | } 955 | this._initializeChildren(), 956 | this._config.parent || 957 | this._addAriaAndCollapsedClass(this._triggerArray, this._isShown()), 958 | this._config.toggle && this.toggle(); 959 | } 960 | static get Default() { 961 | return Ht; 962 | } 963 | static get DefaultType() { 964 | return Wt; 965 | } 966 | static get NAME() { 967 | return "collapse"; 968 | } 969 | toggle() { 970 | this._isShown() ? this.hide() : this.show(); 971 | } 972 | show() { 973 | if (this._isTransitioning || this._isShown()) return; 974 | let t = []; 975 | if ( 976 | (this._config.parent && 977 | (t = this._getFirstLevelChildren( 978 | ".collapse.show, .collapse.collapsing", 979 | ) 980 | .filter((t) => t !== this._element) 981 | .map((t) => Bt.getOrCreateInstance(t, { toggle: !1 }))), 982 | t.length && t[0]._isTransitioning) 983 | ) 984 | return; 985 | if (N.trigger(this._element, Lt).defaultPrevented) return; 986 | for (const e of t) e.hide(); 987 | const e = this._getDimension(); 988 | this._element.classList.remove(Pt), 989 | this._element.classList.add(jt), 990 | (this._element.style[e] = 0), 991 | this._addAriaAndCollapsedClass(this._triggerArray, !0), 992 | (this._isTransitioning = !0); 993 | const i = `scroll${e[0].toUpperCase() + e.slice(1)}`; 994 | this._queueCallback( 995 | () => { 996 | (this._isTransitioning = !1), 997 | this._element.classList.remove(jt), 998 | this._element.classList.add(Pt, Nt), 999 | (this._element.style[e] = ""), 1000 | N.trigger(this._element, St); 1001 | }, 1002 | this._element, 1003 | !0, 1004 | ), 1005 | (this._element.style[e] = `${this._element[i]}px`); 1006 | } 1007 | hide() { 1008 | if (this._isTransitioning || !this._isShown()) return; 1009 | if (N.trigger(this._element, Dt).defaultPrevented) return; 1010 | const t = this._getDimension(); 1011 | (this._element.style[t] = 1012 | `${this._element.getBoundingClientRect()[t]}px`), 1013 | d(this._element), 1014 | this._element.classList.add(jt), 1015 | this._element.classList.remove(Pt, Nt); 1016 | for (const t of this._triggerArray) { 1017 | const e = z.getElementFromSelector(t); 1018 | e && !this._isShown(e) && this._addAriaAndCollapsedClass([t], !1); 1019 | } 1020 | (this._isTransitioning = !0), 1021 | (this._element.style[t] = ""), 1022 | this._queueCallback( 1023 | () => { 1024 | (this._isTransitioning = !1), 1025 | this._element.classList.remove(jt), 1026 | this._element.classList.add(Pt), 1027 | N.trigger(this._element, $t); 1028 | }, 1029 | this._element, 1030 | !0, 1031 | ); 1032 | } 1033 | _isShown(t = this._element) { 1034 | return t.classList.contains(Nt); 1035 | } 1036 | _configAfterMerge(t) { 1037 | return (t.toggle = Boolean(t.toggle)), (t.parent = r(t.parent)), t; 1038 | } 1039 | _getDimension() { 1040 | return this._element.classList.contains("collapse-horizontal") 1041 | ? "width" 1042 | : "height"; 1043 | } 1044 | _initializeChildren() { 1045 | if (!this._config.parent) return; 1046 | const t = this._getFirstLevelChildren(Ft); 1047 | for (const e of t) { 1048 | const t = z.getElementFromSelector(e); 1049 | t && this._addAriaAndCollapsedClass([e], this._isShown(t)); 1050 | } 1051 | } 1052 | _getFirstLevelChildren(t) { 1053 | const e = z.find(Mt, this._config.parent); 1054 | return z.find(t, this._config.parent).filter((t) => !e.includes(t)); 1055 | } 1056 | _addAriaAndCollapsedClass(t, e) { 1057 | if (t.length) 1058 | for (const i of t) 1059 | i.classList.toggle("collapsed", !e), 1060 | i.setAttribute("aria-expanded", e); 1061 | } 1062 | static jQueryInterface(t) { 1063 | const e = {}; 1064 | return ( 1065 | "string" == typeof t && /show|hide/.test(t) && (e.toggle = !1), 1066 | this.each(function () { 1067 | const i = Bt.getOrCreateInstance(this, e); 1068 | if ("string" == typeof t) { 1069 | if (void 0 === i[t]) throw new TypeError(`No method named "${t}"`); 1070 | i[t](); 1071 | } 1072 | }) 1073 | ); 1074 | } 1075 | } 1076 | N.on(document, It, Ft, function (t) { 1077 | ("A" === t.target.tagName || 1078 | (t.delegateTarget && "A" === t.delegateTarget.tagName)) && 1079 | t.preventDefault(); 1080 | for (const t of z.getMultipleElementsFromSelector(this)) 1081 | Bt.getOrCreateInstance(t, { toggle: !1 }).toggle(); 1082 | }), 1083 | m(Bt); 1084 | var zt = "top", 1085 | Rt = "bottom", 1086 | qt = "right", 1087 | Vt = "left", 1088 | Kt = "auto", 1089 | Qt = [zt, Rt, qt, Vt], 1090 | Xt = "start", 1091 | Yt = "end", 1092 | Ut = "clippingParents", 1093 | Gt = "viewport", 1094 | Jt = "popper", 1095 | Zt = "reference", 1096 | te = Qt.reduce(function (t, e) { 1097 | return t.concat([e + "-" + Xt, e + "-" + Yt]); 1098 | }, []), 1099 | ee = [].concat(Qt, [Kt]).reduce(function (t, e) { 1100 | return t.concat([e, e + "-" + Xt, e + "-" + Yt]); 1101 | }, []), 1102 | ie = "beforeRead", 1103 | ne = "read", 1104 | se = "afterRead", 1105 | oe = "beforeMain", 1106 | re = "main", 1107 | ae = "afterMain", 1108 | le = "beforeWrite", 1109 | ce = "write", 1110 | he = "afterWrite", 1111 | de = [ie, ne, se, oe, re, ae, le, ce, he]; 1112 | function ue(t) { 1113 | return t ? (t.nodeName || "").toLowerCase() : null; 1114 | } 1115 | function fe(t) { 1116 | if (null == t) return window; 1117 | if ("[object Window]" !== t.toString()) { 1118 | var e = t.ownerDocument; 1119 | return (e && e.defaultView) || window; 1120 | } 1121 | return t; 1122 | } 1123 | function pe(t) { 1124 | return t instanceof fe(t).Element || t instanceof Element; 1125 | } 1126 | function me(t) { 1127 | return t instanceof fe(t).HTMLElement || t instanceof HTMLElement; 1128 | } 1129 | function ge(t) { 1130 | return ( 1131 | "undefined" != typeof ShadowRoot && 1132 | (t instanceof fe(t).ShadowRoot || t instanceof ShadowRoot) 1133 | ); 1134 | } 1135 | const _e = { 1136 | name: "applyStyles", 1137 | enabled: !0, 1138 | phase: "write", 1139 | fn: function (t) { 1140 | var e = t.state; 1141 | Object.keys(e.elements).forEach(function (t) { 1142 | var i = e.styles[t] || {}, 1143 | n = e.attributes[t] || {}, 1144 | s = e.elements[t]; 1145 | me(s) && 1146 | ue(s) && 1147 | (Object.assign(s.style, i), 1148 | Object.keys(n).forEach(function (t) { 1149 | var e = n[t]; 1150 | !1 === e 1151 | ? s.removeAttribute(t) 1152 | : s.setAttribute(t, !0 === e ? "" : e); 1153 | })); 1154 | }); 1155 | }, 1156 | effect: function (t) { 1157 | var e = t.state, 1158 | i = { 1159 | popper: { 1160 | position: e.options.strategy, 1161 | left: "0", 1162 | top: "0", 1163 | margin: "0", 1164 | }, 1165 | arrow: { position: "absolute" }, 1166 | reference: {}, 1167 | }; 1168 | return ( 1169 | Object.assign(e.elements.popper.style, i.popper), 1170 | (e.styles = i), 1171 | e.elements.arrow && Object.assign(e.elements.arrow.style, i.arrow), 1172 | function () { 1173 | Object.keys(e.elements).forEach(function (t) { 1174 | var n = e.elements[t], 1175 | s = e.attributes[t] || {}, 1176 | o = Object.keys( 1177 | e.styles.hasOwnProperty(t) ? e.styles[t] : i[t], 1178 | ).reduce(function (t, e) { 1179 | return (t[e] = ""), t; 1180 | }, {}); 1181 | me(n) && 1182 | ue(n) && 1183 | (Object.assign(n.style, o), 1184 | Object.keys(s).forEach(function (t) { 1185 | n.removeAttribute(t); 1186 | })); 1187 | }); 1188 | } 1189 | ); 1190 | }, 1191 | requires: ["computeStyles"], 1192 | }; 1193 | function be(t) { 1194 | return t.split("-")[0]; 1195 | } 1196 | var ve = Math.max, 1197 | ye = Math.min, 1198 | we = Math.round; 1199 | function Ae() { 1200 | var t = navigator.userAgentData; 1201 | return null != t && t.brands && Array.isArray(t.brands) 1202 | ? t.brands 1203 | .map(function (t) { 1204 | return t.brand + "/" + t.version; 1205 | }) 1206 | .join(" ") 1207 | : navigator.userAgent; 1208 | } 1209 | function Ee() { 1210 | return !/^((?!chrome|android).)*safari/i.test(Ae()); 1211 | } 1212 | function Te(t, e, i) { 1213 | void 0 === e && (e = !1), void 0 === i && (i = !1); 1214 | var n = t.getBoundingClientRect(), 1215 | s = 1, 1216 | o = 1; 1217 | e && 1218 | me(t) && 1219 | ((s = (t.offsetWidth > 0 && we(n.width) / t.offsetWidth) || 1), 1220 | (o = (t.offsetHeight > 0 && we(n.height) / t.offsetHeight) || 1)); 1221 | var r = (pe(t) ? fe(t) : window).visualViewport, 1222 | a = !Ee() && i, 1223 | l = (n.left + (a && r ? r.offsetLeft : 0)) / s, 1224 | c = (n.top + (a && r ? r.offsetTop : 0)) / o, 1225 | h = n.width / s, 1226 | d = n.height / o; 1227 | return { 1228 | width: h, 1229 | height: d, 1230 | top: c, 1231 | right: l + h, 1232 | bottom: c + d, 1233 | left: l, 1234 | x: l, 1235 | y: c, 1236 | }; 1237 | } 1238 | function Ce(t) { 1239 | var e = Te(t), 1240 | i = t.offsetWidth, 1241 | n = t.offsetHeight; 1242 | return ( 1243 | Math.abs(e.width - i) <= 1 && (i = e.width), 1244 | Math.abs(e.height - n) <= 1 && (n = e.height), 1245 | { x: t.offsetLeft, y: t.offsetTop, width: i, height: n } 1246 | ); 1247 | } 1248 | function Oe(t, e) { 1249 | var i = e.getRootNode && e.getRootNode(); 1250 | if (t.contains(e)) return !0; 1251 | if (i && ge(i)) { 1252 | var n = e; 1253 | do { 1254 | if (n && t.isSameNode(n)) return !0; 1255 | n = n.parentNode || n.host; 1256 | } while (n); 1257 | } 1258 | return !1; 1259 | } 1260 | function xe(t) { 1261 | return fe(t).getComputedStyle(t); 1262 | } 1263 | function ke(t) { 1264 | return ["table", "td", "th"].indexOf(ue(t)) >= 0; 1265 | } 1266 | function Le(t) { 1267 | return ((pe(t) ? t.ownerDocument : t.document) || window.document) 1268 | .documentElement; 1269 | } 1270 | function Se(t) { 1271 | return "html" === ue(t) 1272 | ? t 1273 | : t.assignedSlot || t.parentNode || (ge(t) ? t.host : null) || Le(t); 1274 | } 1275 | function De(t) { 1276 | return me(t) && "fixed" !== xe(t).position ? t.offsetParent : null; 1277 | } 1278 | function $e(t) { 1279 | for (var e = fe(t), i = De(t); i && ke(i) && "static" === xe(i).position; ) 1280 | i = De(i); 1281 | return i && 1282 | ("html" === ue(i) || ("body" === ue(i) && "static" === xe(i).position)) 1283 | ? e 1284 | : i || 1285 | (function (t) { 1286 | var e = /firefox/i.test(Ae()); 1287 | if (/Trident/i.test(Ae()) && me(t) && "fixed" === xe(t).position) 1288 | return null; 1289 | var i = Se(t); 1290 | for ( 1291 | ge(i) && (i = i.host); 1292 | me(i) && ["html", "body"].indexOf(ue(i)) < 0; 1293 | 1294 | ) { 1295 | var n = xe(i); 1296 | if ( 1297 | "none" !== n.transform || 1298 | "none" !== n.perspective || 1299 | "paint" === n.contain || 1300 | -1 !== ["transform", "perspective"].indexOf(n.willChange) || 1301 | (e && "filter" === n.willChange) || 1302 | (e && n.filter && "none" !== n.filter) 1303 | ) 1304 | return i; 1305 | i = i.parentNode; 1306 | } 1307 | return null; 1308 | })(t) || 1309 | e; 1310 | } 1311 | function Ie(t) { 1312 | return ["top", "bottom"].indexOf(t) >= 0 ? "x" : "y"; 1313 | } 1314 | function Ne(t, e, i) { 1315 | return ve(t, ye(e, i)); 1316 | } 1317 | function Pe(t) { 1318 | return Object.assign({}, { top: 0, right: 0, bottom: 0, left: 0 }, t); 1319 | } 1320 | function je(t, e) { 1321 | return e.reduce(function (e, i) { 1322 | return (e[i] = t), e; 1323 | }, {}); 1324 | } 1325 | const Me = { 1326 | name: "arrow", 1327 | enabled: !0, 1328 | phase: "main", 1329 | fn: function (t) { 1330 | var e, 1331 | i = t.state, 1332 | n = t.name, 1333 | s = t.options, 1334 | o = i.elements.arrow, 1335 | r = i.modifiersData.popperOffsets, 1336 | a = be(i.placement), 1337 | l = Ie(a), 1338 | c = [Vt, qt].indexOf(a) >= 0 ? "height" : "width"; 1339 | if (o && r) { 1340 | var h = (function (t, e) { 1341 | return Pe( 1342 | "number" != 1343 | typeof (t = 1344 | "function" == typeof t 1345 | ? t(Object.assign({}, e.rects, { placement: e.placement })) 1346 | : t) 1347 | ? t 1348 | : je(t, Qt), 1349 | ); 1350 | })(s.padding, i), 1351 | d = Ce(o), 1352 | u = "y" === l ? zt : Vt, 1353 | f = "y" === l ? Rt : qt, 1354 | p = 1355 | i.rects.reference[c] + 1356 | i.rects.reference[l] - 1357 | r[l] - 1358 | i.rects.popper[c], 1359 | m = r[l] - i.rects.reference[l], 1360 | g = $e(o), 1361 | _ = g ? ("y" === l ? g.clientHeight || 0 : g.clientWidth || 0) : 0, 1362 | b = p / 2 - m / 2, 1363 | v = h[u], 1364 | y = _ - d[c] - h[f], 1365 | w = _ / 2 - d[c] / 2 + b, 1366 | A = Ne(v, w, y), 1367 | E = l; 1368 | i.modifiersData[n] = (((e = {})[E] = A), (e.centerOffset = A - w), e); 1369 | } 1370 | }, 1371 | effect: function (t) { 1372 | var e = t.state, 1373 | i = t.options.element, 1374 | n = void 0 === i ? "[data-popper-arrow]" : i; 1375 | null != n && 1376 | ("string" != typeof n || (n = e.elements.popper.querySelector(n))) && 1377 | Oe(e.elements.popper, n) && 1378 | (e.elements.arrow = n); 1379 | }, 1380 | requires: ["popperOffsets"], 1381 | requiresIfExists: ["preventOverflow"], 1382 | }; 1383 | function Fe(t) { 1384 | return t.split("-")[1]; 1385 | } 1386 | var He = { top: "auto", right: "auto", bottom: "auto", left: "auto" }; 1387 | function We(t) { 1388 | var e, 1389 | i = t.popper, 1390 | n = t.popperRect, 1391 | s = t.placement, 1392 | o = t.variation, 1393 | r = t.offsets, 1394 | a = t.position, 1395 | l = t.gpuAcceleration, 1396 | c = t.adaptive, 1397 | h = t.roundOffsets, 1398 | d = t.isFixed, 1399 | u = r.x, 1400 | f = void 0 === u ? 0 : u, 1401 | p = r.y, 1402 | m = void 0 === p ? 0 : p, 1403 | g = "function" == typeof h ? h({ x: f, y: m }) : { x: f, y: m }; 1404 | (f = g.x), (m = g.y); 1405 | var _ = r.hasOwnProperty("x"), 1406 | b = r.hasOwnProperty("y"), 1407 | v = Vt, 1408 | y = zt, 1409 | w = window; 1410 | if (c) { 1411 | var A = $e(i), 1412 | E = "clientHeight", 1413 | T = "clientWidth"; 1414 | A === fe(i) && 1415 | "static" !== xe((A = Le(i))).position && 1416 | "absolute" === a && 1417 | ((E = "scrollHeight"), (T = "scrollWidth")), 1418 | (s === zt || ((s === Vt || s === qt) && o === Yt)) && 1419 | ((y = Rt), 1420 | (m -= 1421 | (d && A === w && w.visualViewport 1422 | ? w.visualViewport.height 1423 | : A[E]) - n.height), 1424 | (m *= l ? 1 : -1)), 1425 | (s !== Vt && ((s !== zt && s !== Rt) || o !== Yt)) || 1426 | ((v = qt), 1427 | (f -= 1428 | (d && A === w && w.visualViewport ? w.visualViewport.width : A[T]) - 1429 | n.width), 1430 | (f *= l ? 1 : -1)); 1431 | } 1432 | var C, 1433 | O = Object.assign({ position: a }, c && He), 1434 | x = 1435 | !0 === h 1436 | ? (function (t, e) { 1437 | var i = t.x, 1438 | n = t.y, 1439 | s = e.devicePixelRatio || 1; 1440 | return { x: we(i * s) / s || 0, y: we(n * s) / s || 0 }; 1441 | })({ x: f, y: m }, fe(i)) 1442 | : { x: f, y: m }; 1443 | return ( 1444 | (f = x.x), 1445 | (m = x.y), 1446 | l 1447 | ? Object.assign( 1448 | {}, 1449 | O, 1450 | (((C = {})[y] = b ? "0" : ""), 1451 | (C[v] = _ ? "0" : ""), 1452 | (C.transform = 1453 | (w.devicePixelRatio || 1) <= 1 1454 | ? "translate(" + f + "px, " + m + "px)" 1455 | : "translate3d(" + f + "px, " + m + "px, 0)"), 1456 | C), 1457 | ) 1458 | : Object.assign( 1459 | {}, 1460 | O, 1461 | (((e = {})[y] = b ? m + "px" : ""), 1462 | (e[v] = _ ? f + "px" : ""), 1463 | (e.transform = ""), 1464 | e), 1465 | ) 1466 | ); 1467 | } 1468 | const Be = { 1469 | name: "computeStyles", 1470 | enabled: !0, 1471 | phase: "beforeWrite", 1472 | fn: function (t) { 1473 | var e = t.state, 1474 | i = t.options, 1475 | n = i.gpuAcceleration, 1476 | s = void 0 === n || n, 1477 | o = i.adaptive, 1478 | r = void 0 === o || o, 1479 | a = i.roundOffsets, 1480 | l = void 0 === a || a, 1481 | c = { 1482 | placement: be(e.placement), 1483 | variation: Fe(e.placement), 1484 | popper: e.elements.popper, 1485 | popperRect: e.rects.popper, 1486 | gpuAcceleration: s, 1487 | isFixed: "fixed" === e.options.strategy, 1488 | }; 1489 | null != e.modifiersData.popperOffsets && 1490 | (e.styles.popper = Object.assign( 1491 | {}, 1492 | e.styles.popper, 1493 | We( 1494 | Object.assign({}, c, { 1495 | offsets: e.modifiersData.popperOffsets, 1496 | position: e.options.strategy, 1497 | adaptive: r, 1498 | roundOffsets: l, 1499 | }), 1500 | ), 1501 | )), 1502 | null != e.modifiersData.arrow && 1503 | (e.styles.arrow = Object.assign( 1504 | {}, 1505 | e.styles.arrow, 1506 | We( 1507 | Object.assign({}, c, { 1508 | offsets: e.modifiersData.arrow, 1509 | position: "absolute", 1510 | adaptive: !1, 1511 | roundOffsets: l, 1512 | }), 1513 | ), 1514 | )), 1515 | (e.attributes.popper = Object.assign({}, e.attributes.popper, { 1516 | "data-popper-placement": e.placement, 1517 | })); 1518 | }, 1519 | data: {}, 1520 | }; 1521 | var ze = { passive: !0 }; 1522 | const Re = { 1523 | name: "eventListeners", 1524 | enabled: !0, 1525 | phase: "write", 1526 | fn: function () {}, 1527 | effect: function (t) { 1528 | var e = t.state, 1529 | i = t.instance, 1530 | n = t.options, 1531 | s = n.scroll, 1532 | o = void 0 === s || s, 1533 | r = n.resize, 1534 | a = void 0 === r || r, 1535 | l = fe(e.elements.popper), 1536 | c = [].concat(e.scrollParents.reference, e.scrollParents.popper); 1537 | return ( 1538 | o && 1539 | c.forEach(function (t) { 1540 | t.addEventListener("scroll", i.update, ze); 1541 | }), 1542 | a && l.addEventListener("resize", i.update, ze), 1543 | function () { 1544 | o && 1545 | c.forEach(function (t) { 1546 | t.removeEventListener("scroll", i.update, ze); 1547 | }), 1548 | a && l.removeEventListener("resize", i.update, ze); 1549 | } 1550 | ); 1551 | }, 1552 | data: {}, 1553 | }; 1554 | var qe = { left: "right", right: "left", bottom: "top", top: "bottom" }; 1555 | function Ve(t) { 1556 | return t.replace(/left|right|bottom|top/g, function (t) { 1557 | return qe[t]; 1558 | }); 1559 | } 1560 | var Ke = { start: "end", end: "start" }; 1561 | function Qe(t) { 1562 | return t.replace(/start|end/g, function (t) { 1563 | return Ke[t]; 1564 | }); 1565 | } 1566 | function Xe(t) { 1567 | var e = fe(t); 1568 | return { scrollLeft: e.pageXOffset, scrollTop: e.pageYOffset }; 1569 | } 1570 | function Ye(t) { 1571 | return Te(Le(t)).left + Xe(t).scrollLeft; 1572 | } 1573 | function Ue(t) { 1574 | var e = xe(t), 1575 | i = e.overflow, 1576 | n = e.overflowX, 1577 | s = e.overflowY; 1578 | return /auto|scroll|overlay|hidden/.test(i + s + n); 1579 | } 1580 | function Ge(t) { 1581 | return ["html", "body", "#document"].indexOf(ue(t)) >= 0 1582 | ? t.ownerDocument.body 1583 | : me(t) && Ue(t) 1584 | ? t 1585 | : Ge(Se(t)); 1586 | } 1587 | function Je(t, e) { 1588 | var i; 1589 | void 0 === e && (e = []); 1590 | var n = Ge(t), 1591 | s = n === (null == (i = t.ownerDocument) ? void 0 : i.body), 1592 | o = fe(n), 1593 | r = s ? [o].concat(o.visualViewport || [], Ue(n) ? n : []) : n, 1594 | a = e.concat(r); 1595 | return s ? a : a.concat(Je(Se(r))); 1596 | } 1597 | function Ze(t) { 1598 | return Object.assign({}, t, { 1599 | left: t.x, 1600 | top: t.y, 1601 | right: t.x + t.width, 1602 | bottom: t.y + t.height, 1603 | }); 1604 | } 1605 | function ti(t, e, i) { 1606 | return e === Gt 1607 | ? Ze( 1608 | (function (t, e) { 1609 | var i = fe(t), 1610 | n = Le(t), 1611 | s = i.visualViewport, 1612 | o = n.clientWidth, 1613 | r = n.clientHeight, 1614 | a = 0, 1615 | l = 0; 1616 | if (s) { 1617 | (o = s.width), (r = s.height); 1618 | var c = Ee(); 1619 | (c || (!c && "fixed" === e)) && 1620 | ((a = s.offsetLeft), (l = s.offsetTop)); 1621 | } 1622 | return { width: o, height: r, x: a + Ye(t), y: l }; 1623 | })(t, i), 1624 | ) 1625 | : pe(e) 1626 | ? (function (t, e) { 1627 | var i = Te(t, !1, "fixed" === e); 1628 | return ( 1629 | (i.top = i.top + t.clientTop), 1630 | (i.left = i.left + t.clientLeft), 1631 | (i.bottom = i.top + t.clientHeight), 1632 | (i.right = i.left + t.clientWidth), 1633 | (i.width = t.clientWidth), 1634 | (i.height = t.clientHeight), 1635 | (i.x = i.left), 1636 | (i.y = i.top), 1637 | i 1638 | ); 1639 | })(e, i) 1640 | : Ze( 1641 | (function (t) { 1642 | var e, 1643 | i = Le(t), 1644 | n = Xe(t), 1645 | s = null == (e = t.ownerDocument) ? void 0 : e.body, 1646 | o = ve( 1647 | i.scrollWidth, 1648 | i.clientWidth, 1649 | s ? s.scrollWidth : 0, 1650 | s ? s.clientWidth : 0, 1651 | ), 1652 | r = ve( 1653 | i.scrollHeight, 1654 | i.clientHeight, 1655 | s ? s.scrollHeight : 0, 1656 | s ? s.clientHeight : 0, 1657 | ), 1658 | a = -n.scrollLeft + Ye(t), 1659 | l = -n.scrollTop; 1660 | return ( 1661 | "rtl" === xe(s || i).direction && 1662 | (a += ve(i.clientWidth, s ? s.clientWidth : 0) - o), 1663 | { width: o, height: r, x: a, y: l } 1664 | ); 1665 | })(Le(t)), 1666 | ); 1667 | } 1668 | function ei(t) { 1669 | var e, 1670 | i = t.reference, 1671 | n = t.element, 1672 | s = t.placement, 1673 | o = s ? be(s) : null, 1674 | r = s ? Fe(s) : null, 1675 | a = i.x + i.width / 2 - n.width / 2, 1676 | l = i.y + i.height / 2 - n.height / 2; 1677 | switch (o) { 1678 | case zt: 1679 | e = { x: a, y: i.y - n.height }; 1680 | break; 1681 | case Rt: 1682 | e = { x: a, y: i.y + i.height }; 1683 | break; 1684 | case qt: 1685 | e = { x: i.x + i.width, y: l }; 1686 | break; 1687 | case Vt: 1688 | e = { x: i.x - n.width, y: l }; 1689 | break; 1690 | default: 1691 | e = { x: i.x, y: i.y }; 1692 | } 1693 | var c = o ? Ie(o) : null; 1694 | if (null != c) { 1695 | var h = "y" === c ? "height" : "width"; 1696 | switch (r) { 1697 | case Xt: 1698 | e[c] = e[c] - (i[h] / 2 - n[h] / 2); 1699 | break; 1700 | case Yt: 1701 | e[c] = e[c] + (i[h] / 2 - n[h] / 2); 1702 | } 1703 | } 1704 | return e; 1705 | } 1706 | function ii(t, e) { 1707 | void 0 === e && (e = {}); 1708 | var i = e, 1709 | n = i.placement, 1710 | s = void 0 === n ? t.placement : n, 1711 | o = i.strategy, 1712 | r = void 0 === o ? t.strategy : o, 1713 | a = i.boundary, 1714 | l = void 0 === a ? Ut : a, 1715 | c = i.rootBoundary, 1716 | h = void 0 === c ? Gt : c, 1717 | d = i.elementContext, 1718 | u = void 0 === d ? Jt : d, 1719 | f = i.altBoundary, 1720 | p = void 0 !== f && f, 1721 | m = i.padding, 1722 | g = void 0 === m ? 0 : m, 1723 | _ = Pe("number" != typeof g ? g : je(g, Qt)), 1724 | b = u === Jt ? Zt : Jt, 1725 | v = t.rects.popper, 1726 | y = t.elements[p ? b : u], 1727 | w = (function (t, e, i, n) { 1728 | var s = 1729 | "clippingParents" === e 1730 | ? (function (t) { 1731 | var e = Je(Se(t)), 1732 | i = 1733 | ["absolute", "fixed"].indexOf(xe(t).position) >= 0 && 1734 | me(t) 1735 | ? $e(t) 1736 | : t; 1737 | return pe(i) 1738 | ? e.filter(function (t) { 1739 | return pe(t) && Oe(t, i) && "body" !== ue(t); 1740 | }) 1741 | : []; 1742 | })(t) 1743 | : [].concat(e), 1744 | o = [].concat(s, [i]), 1745 | r = o[0], 1746 | a = o.reduce( 1747 | function (e, i) { 1748 | var s = ti(t, i, n); 1749 | return ( 1750 | (e.top = ve(s.top, e.top)), 1751 | (e.right = ye(s.right, e.right)), 1752 | (e.bottom = ye(s.bottom, e.bottom)), 1753 | (e.left = ve(s.left, e.left)), 1754 | e 1755 | ); 1756 | }, 1757 | ti(t, r, n), 1758 | ); 1759 | return ( 1760 | (a.width = a.right - a.left), 1761 | (a.height = a.bottom - a.top), 1762 | (a.x = a.left), 1763 | (a.y = a.top), 1764 | a 1765 | ); 1766 | })(pe(y) ? y : y.contextElement || Le(t.elements.popper), l, h, r), 1767 | A = Te(t.elements.reference), 1768 | E = ei({ reference: A, element: v, strategy: "absolute", placement: s }), 1769 | T = Ze(Object.assign({}, v, E)), 1770 | C = u === Jt ? T : A, 1771 | O = { 1772 | top: w.top - C.top + _.top, 1773 | bottom: C.bottom - w.bottom + _.bottom, 1774 | left: w.left - C.left + _.left, 1775 | right: C.right - w.right + _.right, 1776 | }, 1777 | x = t.modifiersData.offset; 1778 | if (u === Jt && x) { 1779 | var k = x[s]; 1780 | Object.keys(O).forEach(function (t) { 1781 | var e = [qt, Rt].indexOf(t) >= 0 ? 1 : -1, 1782 | i = [zt, Rt].indexOf(t) >= 0 ? "y" : "x"; 1783 | O[t] += k[i] * e; 1784 | }); 1785 | } 1786 | return O; 1787 | } 1788 | function ni(t, e) { 1789 | void 0 === e && (e = {}); 1790 | var i = e, 1791 | n = i.placement, 1792 | s = i.boundary, 1793 | o = i.rootBoundary, 1794 | r = i.padding, 1795 | a = i.flipVariations, 1796 | l = i.allowedAutoPlacements, 1797 | c = void 0 === l ? ee : l, 1798 | h = Fe(n), 1799 | d = h 1800 | ? a 1801 | ? te 1802 | : te.filter(function (t) { 1803 | return Fe(t) === h; 1804 | }) 1805 | : Qt, 1806 | u = d.filter(function (t) { 1807 | return c.indexOf(t) >= 0; 1808 | }); 1809 | 0 === u.length && (u = d); 1810 | var f = u.reduce(function (e, i) { 1811 | return ( 1812 | (e[i] = ii(t, { 1813 | placement: i, 1814 | boundary: s, 1815 | rootBoundary: o, 1816 | padding: r, 1817 | })[be(i)]), 1818 | e 1819 | ); 1820 | }, {}); 1821 | return Object.keys(f).sort(function (t, e) { 1822 | return f[t] - f[e]; 1823 | }); 1824 | } 1825 | const si = { 1826 | name: "flip", 1827 | enabled: !0, 1828 | phase: "main", 1829 | fn: function (t) { 1830 | var e = t.state, 1831 | i = t.options, 1832 | n = t.name; 1833 | if (!e.modifiersData[n]._skip) { 1834 | for ( 1835 | var s = i.mainAxis, 1836 | o = void 0 === s || s, 1837 | r = i.altAxis, 1838 | a = void 0 === r || r, 1839 | l = i.fallbackPlacements, 1840 | c = i.padding, 1841 | h = i.boundary, 1842 | d = i.rootBoundary, 1843 | u = i.altBoundary, 1844 | f = i.flipVariations, 1845 | p = void 0 === f || f, 1846 | m = i.allowedAutoPlacements, 1847 | g = e.options.placement, 1848 | _ = be(g), 1849 | b = 1850 | l || 1851 | (_ !== g && p 1852 | ? (function (t) { 1853 | if (be(t) === Kt) return []; 1854 | var e = Ve(t); 1855 | return [Qe(t), e, Qe(e)]; 1856 | })(g) 1857 | : [Ve(g)]), 1858 | v = [g].concat(b).reduce(function (t, i) { 1859 | return t.concat( 1860 | be(i) === Kt 1861 | ? ni(e, { 1862 | placement: i, 1863 | boundary: h, 1864 | rootBoundary: d, 1865 | padding: c, 1866 | flipVariations: p, 1867 | allowedAutoPlacements: m, 1868 | }) 1869 | : i, 1870 | ); 1871 | }, []), 1872 | y = e.rects.reference, 1873 | w = e.rects.popper, 1874 | A = new Map(), 1875 | E = !0, 1876 | T = v[0], 1877 | C = 0; 1878 | C < v.length; 1879 | C++ 1880 | ) { 1881 | var O = v[C], 1882 | x = be(O), 1883 | k = Fe(O) === Xt, 1884 | L = [zt, Rt].indexOf(x) >= 0, 1885 | S = L ? "width" : "height", 1886 | D = ii(e, { 1887 | placement: O, 1888 | boundary: h, 1889 | rootBoundary: d, 1890 | altBoundary: u, 1891 | padding: c, 1892 | }), 1893 | $ = L ? (k ? qt : Vt) : k ? Rt : zt; 1894 | y[S] > w[S] && ($ = Ve($)); 1895 | var I = Ve($), 1896 | N = []; 1897 | if ( 1898 | (o && N.push(D[x] <= 0), 1899 | a && N.push(D[$] <= 0, D[I] <= 0), 1900 | N.every(function (t) { 1901 | return t; 1902 | })) 1903 | ) { 1904 | (T = O), (E = !1); 1905 | break; 1906 | } 1907 | A.set(O, N); 1908 | } 1909 | if (E) 1910 | for ( 1911 | var P = function (t) { 1912 | var e = v.find(function (e) { 1913 | var i = A.get(e); 1914 | if (i) 1915 | return i.slice(0, t).every(function (t) { 1916 | return t; 1917 | }); 1918 | }); 1919 | if (e) return (T = e), "break"; 1920 | }, 1921 | j = p ? 3 : 1; 1922 | j > 0 && "break" !== P(j); 1923 | j-- 1924 | ); 1925 | e.placement !== T && 1926 | ((e.modifiersData[n]._skip = !0), (e.placement = T), (e.reset = !0)); 1927 | } 1928 | }, 1929 | requiresIfExists: ["offset"], 1930 | data: { _skip: !1 }, 1931 | }; 1932 | function oi(t, e, i) { 1933 | return ( 1934 | void 0 === i && (i = { x: 0, y: 0 }), 1935 | { 1936 | top: t.top - e.height - i.y, 1937 | right: t.right - e.width + i.x, 1938 | bottom: t.bottom - e.height + i.y, 1939 | left: t.left - e.width - i.x, 1940 | } 1941 | ); 1942 | } 1943 | function ri(t) { 1944 | return [zt, qt, Rt, Vt].some(function (e) { 1945 | return t[e] >= 0; 1946 | }); 1947 | } 1948 | const ai = { 1949 | name: "hide", 1950 | enabled: !0, 1951 | phase: "main", 1952 | requiresIfExists: ["preventOverflow"], 1953 | fn: function (t) { 1954 | var e = t.state, 1955 | i = t.name, 1956 | n = e.rects.reference, 1957 | s = e.rects.popper, 1958 | o = e.modifiersData.preventOverflow, 1959 | r = ii(e, { elementContext: "reference" }), 1960 | a = ii(e, { altBoundary: !0 }), 1961 | l = oi(r, n), 1962 | c = oi(a, s, o), 1963 | h = ri(l), 1964 | d = ri(c); 1965 | (e.modifiersData[i] = { 1966 | referenceClippingOffsets: l, 1967 | popperEscapeOffsets: c, 1968 | isReferenceHidden: h, 1969 | hasPopperEscaped: d, 1970 | }), 1971 | (e.attributes.popper = Object.assign({}, e.attributes.popper, { 1972 | "data-popper-reference-hidden": h, 1973 | "data-popper-escaped": d, 1974 | })); 1975 | }, 1976 | }, 1977 | li = { 1978 | name: "offset", 1979 | enabled: !0, 1980 | phase: "main", 1981 | requires: ["popperOffsets"], 1982 | fn: function (t) { 1983 | var e = t.state, 1984 | i = t.options, 1985 | n = t.name, 1986 | s = i.offset, 1987 | o = void 0 === s ? [0, 0] : s, 1988 | r = ee.reduce(function (t, i) { 1989 | return ( 1990 | (t[i] = (function (t, e, i) { 1991 | var n = be(t), 1992 | s = [Vt, zt].indexOf(n) >= 0 ? -1 : 1, 1993 | o = 1994 | "function" == typeof i 1995 | ? i(Object.assign({}, e, { placement: t })) 1996 | : i, 1997 | r = o[0], 1998 | a = o[1]; 1999 | return ( 2000 | (r = r || 0), 2001 | (a = (a || 0) * s), 2002 | [Vt, qt].indexOf(n) >= 0 ? { x: a, y: r } : { x: r, y: a } 2003 | ); 2004 | })(i, e.rects, o)), 2005 | t 2006 | ); 2007 | }, {}), 2008 | a = r[e.placement], 2009 | l = a.x, 2010 | c = a.y; 2011 | null != e.modifiersData.popperOffsets && 2012 | ((e.modifiersData.popperOffsets.x += l), 2013 | (e.modifiersData.popperOffsets.y += c)), 2014 | (e.modifiersData[n] = r); 2015 | }, 2016 | }, 2017 | ci = { 2018 | name: "popperOffsets", 2019 | enabled: !0, 2020 | phase: "read", 2021 | fn: function (t) { 2022 | var e = t.state, 2023 | i = t.name; 2024 | e.modifiersData[i] = ei({ 2025 | reference: e.rects.reference, 2026 | element: e.rects.popper, 2027 | strategy: "absolute", 2028 | placement: e.placement, 2029 | }); 2030 | }, 2031 | data: {}, 2032 | }, 2033 | hi = { 2034 | name: "preventOverflow", 2035 | enabled: !0, 2036 | phase: "main", 2037 | fn: function (t) { 2038 | var e = t.state, 2039 | i = t.options, 2040 | n = t.name, 2041 | s = i.mainAxis, 2042 | o = void 0 === s || s, 2043 | r = i.altAxis, 2044 | a = void 0 !== r && r, 2045 | l = i.boundary, 2046 | c = i.rootBoundary, 2047 | h = i.altBoundary, 2048 | d = i.padding, 2049 | u = i.tether, 2050 | f = void 0 === u || u, 2051 | p = i.tetherOffset, 2052 | m = void 0 === p ? 0 : p, 2053 | g = ii(e, { 2054 | boundary: l, 2055 | rootBoundary: c, 2056 | padding: d, 2057 | altBoundary: h, 2058 | }), 2059 | _ = be(e.placement), 2060 | b = Fe(e.placement), 2061 | v = !b, 2062 | y = Ie(_), 2063 | w = "x" === y ? "y" : "x", 2064 | A = e.modifiersData.popperOffsets, 2065 | E = e.rects.reference, 2066 | T = e.rects.popper, 2067 | C = 2068 | "function" == typeof m 2069 | ? m(Object.assign({}, e.rects, { placement: e.placement })) 2070 | : m, 2071 | O = 2072 | "number" == typeof C 2073 | ? { mainAxis: C, altAxis: C } 2074 | : Object.assign({ mainAxis: 0, altAxis: 0 }, C), 2075 | x = e.modifiersData.offset 2076 | ? e.modifiersData.offset[e.placement] 2077 | : null, 2078 | k = { x: 0, y: 0 }; 2079 | if (A) { 2080 | if (o) { 2081 | var L, 2082 | S = "y" === y ? zt : Vt, 2083 | D = "y" === y ? Rt : qt, 2084 | $ = "y" === y ? "height" : "width", 2085 | I = A[y], 2086 | N = I + g[S], 2087 | P = I - g[D], 2088 | j = f ? -T[$] / 2 : 0, 2089 | M = b === Xt ? E[$] : T[$], 2090 | F = b === Xt ? -T[$] : -E[$], 2091 | H = e.elements.arrow, 2092 | W = f && H ? Ce(H) : { width: 0, height: 0 }, 2093 | B = e.modifiersData["arrow#persistent"] 2094 | ? e.modifiersData["arrow#persistent"].padding 2095 | : { top: 0, right: 0, bottom: 0, left: 0 }, 2096 | z = B[S], 2097 | R = B[D], 2098 | q = Ne(0, E[$], W[$]), 2099 | V = v 2100 | ? E[$] / 2 - j - q - z - O.mainAxis 2101 | : M - q - z - O.mainAxis, 2102 | K = v 2103 | ? -E[$] / 2 + j + q + R + O.mainAxis 2104 | : F + q + R + O.mainAxis, 2105 | Q = e.elements.arrow && $e(e.elements.arrow), 2106 | X = Q ? ("y" === y ? Q.clientTop || 0 : Q.clientLeft || 0) : 0, 2107 | Y = null != (L = null == x ? void 0 : x[y]) ? L : 0, 2108 | U = I + K - Y, 2109 | G = Ne(f ? ye(N, I + V - Y - X) : N, I, f ? ve(P, U) : P); 2110 | (A[y] = G), (k[y] = G - I); 2111 | } 2112 | if (a) { 2113 | var J, 2114 | Z = "x" === y ? zt : Vt, 2115 | tt = "x" === y ? Rt : qt, 2116 | et = A[w], 2117 | it = "y" === w ? "height" : "width", 2118 | nt = et + g[Z], 2119 | st = et - g[tt], 2120 | ot = -1 !== [zt, Vt].indexOf(_), 2121 | rt = null != (J = null == x ? void 0 : x[w]) ? J : 0, 2122 | at = ot ? nt : et - E[it] - T[it] - rt + O.altAxis, 2123 | lt = ot ? et + E[it] + T[it] - rt - O.altAxis : st, 2124 | ct = 2125 | f && ot 2126 | ? (function (t, e, i) { 2127 | var n = Ne(t, e, i); 2128 | return n > i ? i : n; 2129 | })(at, et, lt) 2130 | : Ne(f ? at : nt, et, f ? lt : st); 2131 | (A[w] = ct), (k[w] = ct - et); 2132 | } 2133 | e.modifiersData[n] = k; 2134 | } 2135 | }, 2136 | requiresIfExists: ["offset"], 2137 | }; 2138 | function di(t, e, i) { 2139 | void 0 === i && (i = !1); 2140 | var n, 2141 | s, 2142 | o = me(e), 2143 | r = 2144 | me(e) && 2145 | (function (t) { 2146 | var e = t.getBoundingClientRect(), 2147 | i = we(e.width) / t.offsetWidth || 1, 2148 | n = we(e.height) / t.offsetHeight || 1; 2149 | return 1 !== i || 1 !== n; 2150 | })(e), 2151 | a = Le(e), 2152 | l = Te(t, r, i), 2153 | c = { scrollLeft: 0, scrollTop: 0 }, 2154 | h = { x: 0, y: 0 }; 2155 | return ( 2156 | (o || (!o && !i)) && 2157 | (("body" !== ue(e) || Ue(a)) && 2158 | (c = 2159 | (n = e) !== fe(n) && me(n) 2160 | ? { scrollLeft: (s = n).scrollLeft, scrollTop: s.scrollTop } 2161 | : Xe(n)), 2162 | me(e) 2163 | ? (((h = Te(e, !0)).x += e.clientLeft), (h.y += e.clientTop)) 2164 | : a && (h.x = Ye(a))), 2165 | { 2166 | x: l.left + c.scrollLeft - h.x, 2167 | y: l.top + c.scrollTop - h.y, 2168 | width: l.width, 2169 | height: l.height, 2170 | } 2171 | ); 2172 | } 2173 | function ui(t) { 2174 | var e = new Map(), 2175 | i = new Set(), 2176 | n = []; 2177 | function s(t) { 2178 | i.add(t.name), 2179 | [] 2180 | .concat(t.requires || [], t.requiresIfExists || []) 2181 | .forEach(function (t) { 2182 | if (!i.has(t)) { 2183 | var n = e.get(t); 2184 | n && s(n); 2185 | } 2186 | }), 2187 | n.push(t); 2188 | } 2189 | return ( 2190 | t.forEach(function (t) { 2191 | e.set(t.name, t); 2192 | }), 2193 | t.forEach(function (t) { 2194 | i.has(t.name) || s(t); 2195 | }), 2196 | n 2197 | ); 2198 | } 2199 | var fi = { placement: "bottom", modifiers: [], strategy: "absolute" }; 2200 | function pi() { 2201 | for (var t = arguments.length, e = new Array(t), i = 0; i < t; i++) 2202 | e[i] = arguments[i]; 2203 | return !e.some(function (t) { 2204 | return !(t && "function" == typeof t.getBoundingClientRect); 2205 | }); 2206 | } 2207 | function mi(t) { 2208 | void 0 === t && (t = {}); 2209 | var e = t, 2210 | i = e.defaultModifiers, 2211 | n = void 0 === i ? [] : i, 2212 | s = e.defaultOptions, 2213 | o = void 0 === s ? fi : s; 2214 | return function (t, e, i) { 2215 | void 0 === i && (i = o); 2216 | var s, 2217 | r, 2218 | a = { 2219 | placement: "bottom", 2220 | orderedModifiers: [], 2221 | options: Object.assign({}, fi, o), 2222 | modifiersData: {}, 2223 | elements: { reference: t, popper: e }, 2224 | attributes: {}, 2225 | styles: {}, 2226 | }, 2227 | l = [], 2228 | c = !1, 2229 | h = { 2230 | state: a, 2231 | setOptions: function (i) { 2232 | var s = "function" == typeof i ? i(a.options) : i; 2233 | d(), 2234 | (a.options = Object.assign({}, o, a.options, s)), 2235 | (a.scrollParents = { 2236 | reference: pe(t) 2237 | ? Je(t) 2238 | : t.contextElement 2239 | ? Je(t.contextElement) 2240 | : [], 2241 | popper: Je(e), 2242 | }); 2243 | var r, 2244 | c, 2245 | u = (function (t) { 2246 | var e = ui(t); 2247 | return de.reduce(function (t, i) { 2248 | return t.concat( 2249 | e.filter(function (t) { 2250 | return t.phase === i; 2251 | }), 2252 | ); 2253 | }, []); 2254 | })( 2255 | ((r = [].concat(n, a.options.modifiers)), 2256 | (c = r.reduce(function (t, e) { 2257 | var i = t[e.name]; 2258 | return ( 2259 | (t[e.name] = i 2260 | ? Object.assign({}, i, e, { 2261 | options: Object.assign({}, i.options, e.options), 2262 | data: Object.assign({}, i.data, e.data), 2263 | }) 2264 | : e), 2265 | t 2266 | ); 2267 | }, {})), 2268 | Object.keys(c).map(function (t) { 2269 | return c[t]; 2270 | })), 2271 | ); 2272 | return ( 2273 | (a.orderedModifiers = u.filter(function (t) { 2274 | return t.enabled; 2275 | })), 2276 | a.orderedModifiers.forEach(function (t) { 2277 | var e = t.name, 2278 | i = t.options, 2279 | n = void 0 === i ? {} : i, 2280 | s = t.effect; 2281 | if ("function" == typeof s) { 2282 | var o = s({ state: a, name: e, instance: h, options: n }); 2283 | l.push(o || function () {}); 2284 | } 2285 | }), 2286 | h.update() 2287 | ); 2288 | }, 2289 | forceUpdate: function () { 2290 | if (!c) { 2291 | var t = a.elements, 2292 | e = t.reference, 2293 | i = t.popper; 2294 | if (pi(e, i)) { 2295 | (a.rects = { 2296 | reference: di(e, $e(i), "fixed" === a.options.strategy), 2297 | popper: Ce(i), 2298 | }), 2299 | (a.reset = !1), 2300 | (a.placement = a.options.placement), 2301 | a.orderedModifiers.forEach(function (t) { 2302 | return (a.modifiersData[t.name] = Object.assign( 2303 | {}, 2304 | t.data, 2305 | )); 2306 | }); 2307 | for (var n = 0; n < a.orderedModifiers.length; n++) 2308 | if (!0 !== a.reset) { 2309 | var s = a.orderedModifiers[n], 2310 | o = s.fn, 2311 | r = s.options, 2312 | l = void 0 === r ? {} : r, 2313 | d = s.name; 2314 | "function" == typeof o && 2315 | (a = 2316 | o({ state: a, options: l, name: d, instance: h }) || a); 2317 | } else (a.reset = !1), (n = -1); 2318 | } 2319 | } 2320 | }, 2321 | update: 2322 | ((s = function () { 2323 | return new Promise(function (t) { 2324 | h.forceUpdate(), t(a); 2325 | }); 2326 | }), 2327 | function () { 2328 | return ( 2329 | r || 2330 | (r = new Promise(function (t) { 2331 | Promise.resolve().then(function () { 2332 | (r = void 0), t(s()); 2333 | }); 2334 | })), 2335 | r 2336 | ); 2337 | }), 2338 | destroy: function () { 2339 | d(), (c = !0); 2340 | }, 2341 | }; 2342 | if (!pi(t, e)) return h; 2343 | function d() { 2344 | l.forEach(function (t) { 2345 | return t(); 2346 | }), 2347 | (l = []); 2348 | } 2349 | return ( 2350 | h.setOptions(i).then(function (t) { 2351 | !c && i.onFirstUpdate && i.onFirstUpdate(t); 2352 | }), 2353 | h 2354 | ); 2355 | }; 2356 | } 2357 | var gi = mi(), 2358 | _i = mi({ defaultModifiers: [Re, ci, Be, _e] }), 2359 | bi = mi({ defaultModifiers: [Re, ci, Be, _e, li, si, hi, Me, ai] }); 2360 | const vi = Object.freeze( 2361 | Object.defineProperty( 2362 | { 2363 | __proto__: null, 2364 | afterMain: ae, 2365 | afterRead: se, 2366 | afterWrite: he, 2367 | applyStyles: _e, 2368 | arrow: Me, 2369 | auto: Kt, 2370 | basePlacements: Qt, 2371 | beforeMain: oe, 2372 | beforeRead: ie, 2373 | beforeWrite: le, 2374 | bottom: Rt, 2375 | clippingParents: Ut, 2376 | computeStyles: Be, 2377 | createPopper: bi, 2378 | createPopperBase: gi, 2379 | createPopperLite: _i, 2380 | detectOverflow: ii, 2381 | end: Yt, 2382 | eventListeners: Re, 2383 | flip: si, 2384 | hide: ai, 2385 | left: Vt, 2386 | main: re, 2387 | modifierPhases: de, 2388 | offset: li, 2389 | placements: ee, 2390 | popper: Jt, 2391 | popperGenerator: mi, 2392 | popperOffsets: ci, 2393 | preventOverflow: hi, 2394 | read: ne, 2395 | reference: Zt, 2396 | right: qt, 2397 | start: Xt, 2398 | top: zt, 2399 | variationPlacements: te, 2400 | viewport: Gt, 2401 | write: ce, 2402 | }, 2403 | Symbol.toStringTag, 2404 | { value: "Module" }, 2405 | ), 2406 | ), 2407 | yi = "dropdown", 2408 | wi = ".bs.dropdown", 2409 | Ai = ".data-api", 2410 | Ei = "ArrowUp", 2411 | Ti = "ArrowDown", 2412 | Ci = `hide${wi}`, 2413 | Oi = `hidden${wi}`, 2414 | xi = `show${wi}`, 2415 | ki = `shown${wi}`, 2416 | Li = `click${wi}${Ai}`, 2417 | Si = `keydown${wi}${Ai}`, 2418 | Di = `keyup${wi}${Ai}`, 2419 | $i = "show", 2420 | Ii = '[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)', 2421 | Ni = `${Ii}.${$i}`, 2422 | Pi = ".dropdown-menu", 2423 | ji = p() ? "top-end" : "top-start", 2424 | Mi = p() ? "top-start" : "top-end", 2425 | Fi = p() ? "bottom-end" : "bottom-start", 2426 | Hi = p() ? "bottom-start" : "bottom-end", 2427 | Wi = p() ? "left-start" : "right-start", 2428 | Bi = p() ? "right-start" : "left-start", 2429 | zi = { 2430 | autoClose: !0, 2431 | boundary: "clippingParents", 2432 | display: "dynamic", 2433 | offset: [0, 2], 2434 | popperConfig: null, 2435 | reference: "toggle", 2436 | }, 2437 | Ri = { 2438 | autoClose: "(boolean|string)", 2439 | boundary: "(string|element)", 2440 | display: "string", 2441 | offset: "(array|string|function)", 2442 | popperConfig: "(null|object|function)", 2443 | reference: "(string|element|object)", 2444 | }; 2445 | class qi extends W { 2446 | constructor(t, e) { 2447 | super(t, e), 2448 | (this._popper = null), 2449 | (this._parent = this._element.parentNode), 2450 | (this._menu = 2451 | z.next(this._element, Pi)[0] || 2452 | z.prev(this._element, Pi)[0] || 2453 | z.findOne(Pi, this._parent)), 2454 | (this._inNavbar = this._detectNavbar()); 2455 | } 2456 | static get Default() { 2457 | return zi; 2458 | } 2459 | static get DefaultType() { 2460 | return Ri; 2461 | } 2462 | static get NAME() { 2463 | return yi; 2464 | } 2465 | toggle() { 2466 | return this._isShown() ? this.hide() : this.show(); 2467 | } 2468 | show() { 2469 | if (l(this._element) || this._isShown()) return; 2470 | const t = { relatedTarget: this._element }; 2471 | if (!N.trigger(this._element, xi, t).defaultPrevented) { 2472 | if ( 2473 | (this._createPopper(), 2474 | "ontouchstart" in document.documentElement && 2475 | !this._parent.closest(".navbar-nav")) 2476 | ) 2477 | for (const t of [].concat(...document.body.children)) 2478 | N.on(t, "mouseover", h); 2479 | this._element.focus(), 2480 | this._element.setAttribute("aria-expanded", !0), 2481 | this._menu.classList.add($i), 2482 | this._element.classList.add($i), 2483 | N.trigger(this._element, ki, t); 2484 | } 2485 | } 2486 | hide() { 2487 | if (l(this._element) || !this._isShown()) return; 2488 | const t = { relatedTarget: this._element }; 2489 | this._completeHide(t); 2490 | } 2491 | dispose() { 2492 | this._popper && this._popper.destroy(), super.dispose(); 2493 | } 2494 | update() { 2495 | (this._inNavbar = this._detectNavbar()), 2496 | this._popper && this._popper.update(); 2497 | } 2498 | _completeHide(t) { 2499 | if (!N.trigger(this._element, Ci, t).defaultPrevented) { 2500 | if ("ontouchstart" in document.documentElement) 2501 | for (const t of [].concat(...document.body.children)) 2502 | N.off(t, "mouseover", h); 2503 | this._popper && this._popper.destroy(), 2504 | this._menu.classList.remove($i), 2505 | this._element.classList.remove($i), 2506 | this._element.setAttribute("aria-expanded", "false"), 2507 | F.removeDataAttribute(this._menu, "popper"), 2508 | N.trigger(this._element, Oi, t); 2509 | } 2510 | } 2511 | _getConfig(t) { 2512 | if ( 2513 | "object" == typeof (t = super._getConfig(t)).reference && 2514 | !o(t.reference) && 2515 | "function" != typeof t.reference.getBoundingClientRect 2516 | ) 2517 | throw new TypeError( 2518 | `${yi.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`, 2519 | ); 2520 | return t; 2521 | } 2522 | _createPopper() { 2523 | if (void 0 === vi) 2524 | throw new TypeError( 2525 | "Bootstrap's dropdowns require Popper (https://popper.js.org)", 2526 | ); 2527 | let t = this._element; 2528 | "parent" === this._config.reference 2529 | ? (t = this._parent) 2530 | : o(this._config.reference) 2531 | ? (t = r(this._config.reference)) 2532 | : "object" == typeof this._config.reference && 2533 | (t = this._config.reference); 2534 | const e = this._getPopperConfig(); 2535 | this._popper = bi(t, this._menu, e); 2536 | } 2537 | _isShown() { 2538 | return this._menu.classList.contains($i); 2539 | } 2540 | _getPlacement() { 2541 | const t = this._parent; 2542 | if (t.classList.contains("dropend")) return Wi; 2543 | if (t.classList.contains("dropstart")) return Bi; 2544 | if (t.classList.contains("dropup-center")) return "top"; 2545 | if (t.classList.contains("dropdown-center")) return "bottom"; 2546 | const e = 2547 | "end" === 2548 | getComputedStyle(this._menu).getPropertyValue("--bs-position").trim(); 2549 | return t.classList.contains("dropup") ? (e ? Mi : ji) : e ? Hi : Fi; 2550 | } 2551 | _detectNavbar() { 2552 | return null !== this._element.closest(".navbar"); 2553 | } 2554 | _getOffset() { 2555 | const { offset: t } = this._config; 2556 | return "string" == typeof t 2557 | ? t.split(",").map((t) => Number.parseInt(t, 10)) 2558 | : "function" == typeof t 2559 | ? (e) => t(e, this._element) 2560 | : t; 2561 | } 2562 | _getPopperConfig() { 2563 | const t = { 2564 | placement: this._getPlacement(), 2565 | modifiers: [ 2566 | { 2567 | name: "preventOverflow", 2568 | options: { boundary: this._config.boundary }, 2569 | }, 2570 | { name: "offset", options: { offset: this._getOffset() } }, 2571 | ], 2572 | }; 2573 | return ( 2574 | (this._inNavbar || "static" === this._config.display) && 2575 | (F.setDataAttribute(this._menu, "popper", "static"), 2576 | (t.modifiers = [{ name: "applyStyles", enabled: !1 }])), 2577 | { ...t, ...g(this._config.popperConfig, [t]) } 2578 | ); 2579 | } 2580 | _selectMenuItem({ key: t, target: e }) { 2581 | const i = z 2582 | .find( 2583 | ".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)", 2584 | this._menu, 2585 | ) 2586 | .filter((t) => a(t)); 2587 | i.length && b(i, e, t === Ti, !i.includes(e)).focus(); 2588 | } 2589 | static jQueryInterface(t) { 2590 | return this.each(function () { 2591 | const e = qi.getOrCreateInstance(this, t); 2592 | if ("string" == typeof t) { 2593 | if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); 2594 | e[t](); 2595 | } 2596 | }); 2597 | } 2598 | static clearMenus(t) { 2599 | if (2 === t.button || ("keyup" === t.type && "Tab" !== t.key)) return; 2600 | const e = z.find(Ni); 2601 | for (const i of e) { 2602 | const e = qi.getInstance(i); 2603 | if (!e || !1 === e._config.autoClose) continue; 2604 | const n = t.composedPath(), 2605 | s = n.includes(e._menu); 2606 | if ( 2607 | n.includes(e._element) || 2608 | ("inside" === e._config.autoClose && !s) || 2609 | ("outside" === e._config.autoClose && s) 2610 | ) 2611 | continue; 2612 | if ( 2613 | e._menu.contains(t.target) && 2614 | (("keyup" === t.type && "Tab" === t.key) || 2615 | /input|select|option|textarea|form/i.test(t.target.tagName)) 2616 | ) 2617 | continue; 2618 | const o = { relatedTarget: e._element }; 2619 | "click" === t.type && (o.clickEvent = t), e._completeHide(o); 2620 | } 2621 | } 2622 | static dataApiKeydownHandler(t) { 2623 | const e = /input|textarea/i.test(t.target.tagName), 2624 | i = "Escape" === t.key, 2625 | n = [Ei, Ti].includes(t.key); 2626 | if (!n && !i) return; 2627 | if (e && !i) return; 2628 | t.preventDefault(); 2629 | const s = this.matches(Ii) 2630 | ? this 2631 | : z.prev(this, Ii)[0] || 2632 | z.next(this, Ii)[0] || 2633 | z.findOne(Ii, t.delegateTarget.parentNode), 2634 | o = qi.getOrCreateInstance(s); 2635 | if (n) return t.stopPropagation(), o.show(), void o._selectMenuItem(t); 2636 | o._isShown() && (t.stopPropagation(), o.hide(), s.focus()); 2637 | } 2638 | } 2639 | N.on(document, Si, Ii, qi.dataApiKeydownHandler), 2640 | N.on(document, Si, Pi, qi.dataApiKeydownHandler), 2641 | N.on(document, Li, qi.clearMenus), 2642 | N.on(document, Di, qi.clearMenus), 2643 | N.on(document, Li, Ii, function (t) { 2644 | t.preventDefault(), qi.getOrCreateInstance(this).toggle(); 2645 | }), 2646 | m(qi); 2647 | const Vi = "backdrop", 2648 | Ki = "show", 2649 | Qi = `mousedown.bs.${Vi}`, 2650 | Xi = { 2651 | className: "modal-backdrop", 2652 | clickCallback: null, 2653 | isAnimated: !1, 2654 | isVisible: !0, 2655 | rootElement: "body", 2656 | }, 2657 | Yi = { 2658 | className: "string", 2659 | clickCallback: "(function|null)", 2660 | isAnimated: "boolean", 2661 | isVisible: "boolean", 2662 | rootElement: "(element|string)", 2663 | }; 2664 | class Ui extends H { 2665 | constructor(t) { 2666 | super(), 2667 | (this._config = this._getConfig(t)), 2668 | (this._isAppended = !1), 2669 | (this._element = null); 2670 | } 2671 | static get Default() { 2672 | return Xi; 2673 | } 2674 | static get DefaultType() { 2675 | return Yi; 2676 | } 2677 | static get NAME() { 2678 | return Vi; 2679 | } 2680 | show(t) { 2681 | if (!this._config.isVisible) return void g(t); 2682 | this._append(); 2683 | const e = this._getElement(); 2684 | this._config.isAnimated && d(e), 2685 | e.classList.add(Ki), 2686 | this._emulateAnimation(() => { 2687 | g(t); 2688 | }); 2689 | } 2690 | hide(t) { 2691 | this._config.isVisible 2692 | ? (this._getElement().classList.remove(Ki), 2693 | this._emulateAnimation(() => { 2694 | this.dispose(), g(t); 2695 | })) 2696 | : g(t); 2697 | } 2698 | dispose() { 2699 | this._isAppended && 2700 | (N.off(this._element, Qi), 2701 | this._element.remove(), 2702 | (this._isAppended = !1)); 2703 | } 2704 | _getElement() { 2705 | if (!this._element) { 2706 | const t = document.createElement("div"); 2707 | (t.className = this._config.className), 2708 | this._config.isAnimated && t.classList.add("fade"), 2709 | (this._element = t); 2710 | } 2711 | return this._element; 2712 | } 2713 | _configAfterMerge(t) { 2714 | return (t.rootElement = r(t.rootElement)), t; 2715 | } 2716 | _append() { 2717 | if (this._isAppended) return; 2718 | const t = this._getElement(); 2719 | this._config.rootElement.append(t), 2720 | N.on(t, Qi, () => { 2721 | g(this._config.clickCallback); 2722 | }), 2723 | (this._isAppended = !0); 2724 | } 2725 | _emulateAnimation(t) { 2726 | _(t, this._getElement(), this._config.isAnimated); 2727 | } 2728 | } 2729 | const Gi = ".bs.focustrap", 2730 | Ji = `focusin${Gi}`, 2731 | Zi = `keydown.tab${Gi}`, 2732 | tn = "backward", 2733 | en = { autofocus: !0, trapElement: null }, 2734 | nn = { autofocus: "boolean", trapElement: "element" }; 2735 | class sn extends H { 2736 | constructor(t) { 2737 | super(), 2738 | (this._config = this._getConfig(t)), 2739 | (this._isActive = !1), 2740 | (this._lastTabNavDirection = null); 2741 | } 2742 | static get Default() { 2743 | return en; 2744 | } 2745 | static get DefaultType() { 2746 | return nn; 2747 | } 2748 | static get NAME() { 2749 | return "focustrap"; 2750 | } 2751 | activate() { 2752 | this._isActive || 2753 | (this._config.autofocus && this._config.trapElement.focus(), 2754 | N.off(document, Gi), 2755 | N.on(document, Ji, (t) => this._handleFocusin(t)), 2756 | N.on(document, Zi, (t) => this._handleKeydown(t)), 2757 | (this._isActive = !0)); 2758 | } 2759 | deactivate() { 2760 | this._isActive && ((this._isActive = !1), N.off(document, Gi)); 2761 | } 2762 | _handleFocusin(t) { 2763 | const { trapElement: e } = this._config; 2764 | if (t.target === document || t.target === e || e.contains(t.target)) 2765 | return; 2766 | const i = z.focusableChildren(e); 2767 | 0 === i.length 2768 | ? e.focus() 2769 | : this._lastTabNavDirection === tn 2770 | ? i[i.length - 1].focus() 2771 | : i[0].focus(); 2772 | } 2773 | _handleKeydown(t) { 2774 | "Tab" === t.key && 2775 | (this._lastTabNavDirection = t.shiftKey ? tn : "forward"); 2776 | } 2777 | } 2778 | const on = ".fixed-top, .fixed-bottom, .is-fixed, .sticky-top", 2779 | rn = ".sticky-top", 2780 | an = "padding-right", 2781 | ln = "margin-right"; 2782 | class cn { 2783 | constructor() { 2784 | this._element = document.body; 2785 | } 2786 | getWidth() { 2787 | const t = document.documentElement.clientWidth; 2788 | return Math.abs(window.innerWidth - t); 2789 | } 2790 | hide() { 2791 | const t = this.getWidth(); 2792 | this._disableOverFlow(), 2793 | this._setElementAttributes(this._element, an, (e) => e + t), 2794 | this._setElementAttributes(on, an, (e) => e + t), 2795 | this._setElementAttributes(rn, ln, (e) => e - t); 2796 | } 2797 | reset() { 2798 | this._resetElementAttributes(this._element, "overflow"), 2799 | this._resetElementAttributes(this._element, an), 2800 | this._resetElementAttributes(on, an), 2801 | this._resetElementAttributes(rn, ln); 2802 | } 2803 | isOverflowing() { 2804 | return this.getWidth() > 0; 2805 | } 2806 | _disableOverFlow() { 2807 | this._saveInitialAttribute(this._element, "overflow"), 2808 | (this._element.style.overflow = "hidden"); 2809 | } 2810 | _setElementAttributes(t, e, i) { 2811 | const n = this.getWidth(); 2812 | this._applyManipulationCallback(t, (t) => { 2813 | if (t !== this._element && window.innerWidth > t.clientWidth + n) 2814 | return; 2815 | this._saveInitialAttribute(t, e); 2816 | const s = window.getComputedStyle(t).getPropertyValue(e); 2817 | t.style.setProperty(e, `${i(Number.parseFloat(s))}px`); 2818 | }); 2819 | } 2820 | _saveInitialAttribute(t, e) { 2821 | const i = t.style.getPropertyValue(e); 2822 | i && F.setDataAttribute(t, e, i); 2823 | } 2824 | _resetElementAttributes(t, e) { 2825 | this._applyManipulationCallback(t, (t) => { 2826 | const i = F.getDataAttribute(t, e); 2827 | null !== i 2828 | ? (F.removeDataAttribute(t, e), t.style.setProperty(e, i)) 2829 | : t.style.removeProperty(e); 2830 | }); 2831 | } 2832 | _applyManipulationCallback(t, e) { 2833 | if (o(t)) e(t); 2834 | else for (const i of z.find(t, this._element)) e(i); 2835 | } 2836 | } 2837 | const hn = ".bs.modal", 2838 | dn = `hide${hn}`, 2839 | un = `hidePrevented${hn}`, 2840 | fn = `hidden${hn}`, 2841 | pn = `show${hn}`, 2842 | mn = `shown${hn}`, 2843 | gn = `resize${hn}`, 2844 | _n = `click.dismiss${hn}`, 2845 | bn = `mousedown.dismiss${hn}`, 2846 | vn = `keydown.dismiss${hn}`, 2847 | yn = `click${hn}.data-api`, 2848 | wn = "modal-open", 2849 | An = "show", 2850 | En = "modal-static", 2851 | Tn = { backdrop: !0, focus: !0, keyboard: !0 }, 2852 | Cn = { 2853 | backdrop: "(boolean|string)", 2854 | focus: "boolean", 2855 | keyboard: "boolean", 2856 | }; 2857 | class On extends W { 2858 | constructor(t, e) { 2859 | super(t, e), 2860 | (this._dialog = z.findOne(".modal-dialog", this._element)), 2861 | (this._backdrop = this._initializeBackDrop()), 2862 | (this._focustrap = this._initializeFocusTrap()), 2863 | (this._isShown = !1), 2864 | (this._isTransitioning = !1), 2865 | (this._scrollBar = new cn()), 2866 | this._addEventListeners(); 2867 | } 2868 | static get Default() { 2869 | return Tn; 2870 | } 2871 | static get DefaultType() { 2872 | return Cn; 2873 | } 2874 | static get NAME() { 2875 | return "modal"; 2876 | } 2877 | toggle(t) { 2878 | return this._isShown ? this.hide() : this.show(t); 2879 | } 2880 | show(t) { 2881 | this._isShown || 2882 | this._isTransitioning || 2883 | N.trigger(this._element, pn, { relatedTarget: t }).defaultPrevented || 2884 | ((this._isShown = !0), 2885 | (this._isTransitioning = !0), 2886 | this._scrollBar.hide(), 2887 | document.body.classList.add(wn), 2888 | this._adjustDialog(), 2889 | this._backdrop.show(() => this._showElement(t))); 2890 | } 2891 | hide() { 2892 | this._isShown && 2893 | !this._isTransitioning && 2894 | (N.trigger(this._element, dn).defaultPrevented || 2895 | ((this._isShown = !1), 2896 | (this._isTransitioning = !0), 2897 | this._focustrap.deactivate(), 2898 | this._element.classList.remove(An), 2899 | this._queueCallback( 2900 | () => this._hideModal(), 2901 | this._element, 2902 | this._isAnimated(), 2903 | ))); 2904 | } 2905 | dispose() { 2906 | N.off(window, hn), 2907 | N.off(this._dialog, hn), 2908 | this._backdrop.dispose(), 2909 | this._focustrap.deactivate(), 2910 | super.dispose(); 2911 | } 2912 | handleUpdate() { 2913 | this._adjustDialog(); 2914 | } 2915 | _initializeBackDrop() { 2916 | return new Ui({ 2917 | isVisible: Boolean(this._config.backdrop), 2918 | isAnimated: this._isAnimated(), 2919 | }); 2920 | } 2921 | _initializeFocusTrap() { 2922 | return new sn({ trapElement: this._element }); 2923 | } 2924 | _showElement(t) { 2925 | document.body.contains(this._element) || 2926 | document.body.append(this._element), 2927 | (this._element.style.display = "block"), 2928 | this._element.removeAttribute("aria-hidden"), 2929 | this._element.setAttribute("aria-modal", !0), 2930 | this._element.setAttribute("role", "dialog"), 2931 | (this._element.scrollTop = 0); 2932 | const e = z.findOne(".modal-body", this._dialog); 2933 | e && (e.scrollTop = 0), 2934 | d(this._element), 2935 | this._element.classList.add(An), 2936 | this._queueCallback( 2937 | () => { 2938 | this._config.focus && this._focustrap.activate(), 2939 | (this._isTransitioning = !1), 2940 | N.trigger(this._element, mn, { relatedTarget: t }); 2941 | }, 2942 | this._dialog, 2943 | this._isAnimated(), 2944 | ); 2945 | } 2946 | _addEventListeners() { 2947 | N.on(this._element, vn, (t) => { 2948 | "Escape" === t.key && 2949 | (this._config.keyboard 2950 | ? this.hide() 2951 | : this._triggerBackdropTransition()); 2952 | }), 2953 | N.on(window, gn, () => { 2954 | this._isShown && !this._isTransitioning && this._adjustDialog(); 2955 | }), 2956 | N.on(this._element, bn, (t) => { 2957 | N.one(this._element, _n, (e) => { 2958 | this._element === t.target && 2959 | this._element === e.target && 2960 | ("static" !== this._config.backdrop 2961 | ? this._config.backdrop && this.hide() 2962 | : this._triggerBackdropTransition()); 2963 | }); 2964 | }); 2965 | } 2966 | _hideModal() { 2967 | (this._element.style.display = "none"), 2968 | this._element.setAttribute("aria-hidden", !0), 2969 | this._element.removeAttribute("aria-modal"), 2970 | this._element.removeAttribute("role"), 2971 | (this._isTransitioning = !1), 2972 | this._backdrop.hide(() => { 2973 | document.body.classList.remove(wn), 2974 | this._resetAdjustments(), 2975 | this._scrollBar.reset(), 2976 | N.trigger(this._element, fn); 2977 | }); 2978 | } 2979 | _isAnimated() { 2980 | return this._element.classList.contains("fade"); 2981 | } 2982 | _triggerBackdropTransition() { 2983 | if (N.trigger(this._element, un).defaultPrevented) return; 2984 | const t = 2985 | this._element.scrollHeight > document.documentElement.clientHeight, 2986 | e = this._element.style.overflowY; 2987 | "hidden" === e || 2988 | this._element.classList.contains(En) || 2989 | (t || (this._element.style.overflowY = "hidden"), 2990 | this._element.classList.add(En), 2991 | this._queueCallback(() => { 2992 | this._element.classList.remove(En), 2993 | this._queueCallback(() => { 2994 | this._element.style.overflowY = e; 2995 | }, this._dialog); 2996 | }, this._dialog), 2997 | this._element.focus()); 2998 | } 2999 | _adjustDialog() { 3000 | const t = 3001 | this._element.scrollHeight > document.documentElement.clientHeight, 3002 | e = this._scrollBar.getWidth(), 3003 | i = e > 0; 3004 | if (i && !t) { 3005 | const t = p() ? "paddingLeft" : "paddingRight"; 3006 | this._element.style[t] = `${e}px`; 3007 | } 3008 | if (!i && t) { 3009 | const t = p() ? "paddingRight" : "paddingLeft"; 3010 | this._element.style[t] = `${e}px`; 3011 | } 3012 | } 3013 | _resetAdjustments() { 3014 | (this._element.style.paddingLeft = ""), 3015 | (this._element.style.paddingRight = ""); 3016 | } 3017 | static jQueryInterface(t, e) { 3018 | return this.each(function () { 3019 | const i = On.getOrCreateInstance(this, t); 3020 | if ("string" == typeof t) { 3021 | if (void 0 === i[t]) throw new TypeError(`No method named "${t}"`); 3022 | i[t](e); 3023 | } 3024 | }); 3025 | } 3026 | } 3027 | N.on(document, yn, '[data-bs-toggle="modal"]', function (t) { 3028 | const e = z.getElementFromSelector(this); 3029 | ["A", "AREA"].includes(this.tagName) && t.preventDefault(), 3030 | N.one(e, pn, (t) => { 3031 | t.defaultPrevented || 3032 | N.one(e, fn, () => { 3033 | a(this) && this.focus(); 3034 | }); 3035 | }); 3036 | const i = z.findOne(".modal.show"); 3037 | i && On.getInstance(i).hide(), On.getOrCreateInstance(e).toggle(this); 3038 | }), 3039 | R(On), 3040 | m(On); 3041 | const xn = ".bs.offcanvas", 3042 | kn = ".data-api", 3043 | Ln = `load${xn}${kn}`, 3044 | Sn = "show", 3045 | Dn = "showing", 3046 | $n = "hiding", 3047 | In = ".offcanvas.show", 3048 | Nn = `show${xn}`, 3049 | Pn = `shown${xn}`, 3050 | jn = `hide${xn}`, 3051 | Mn = `hidePrevented${xn}`, 3052 | Fn = `hidden${xn}`, 3053 | Hn = `resize${xn}`, 3054 | Wn = `click${xn}${kn}`, 3055 | Bn = `keydown.dismiss${xn}`, 3056 | zn = { backdrop: !0, keyboard: !0, scroll: !1 }, 3057 | Rn = { 3058 | backdrop: "(boolean|string)", 3059 | keyboard: "boolean", 3060 | scroll: "boolean", 3061 | }; 3062 | class qn extends W { 3063 | constructor(t, e) { 3064 | super(t, e), 3065 | (this._isShown = !1), 3066 | (this._backdrop = this._initializeBackDrop()), 3067 | (this._focustrap = this._initializeFocusTrap()), 3068 | this._addEventListeners(); 3069 | } 3070 | static get Default() { 3071 | return zn; 3072 | } 3073 | static get DefaultType() { 3074 | return Rn; 3075 | } 3076 | static get NAME() { 3077 | return "offcanvas"; 3078 | } 3079 | toggle(t) { 3080 | return this._isShown ? this.hide() : this.show(t); 3081 | } 3082 | show(t) { 3083 | this._isShown || 3084 | N.trigger(this._element, Nn, { relatedTarget: t }).defaultPrevented || 3085 | ((this._isShown = !0), 3086 | this._backdrop.show(), 3087 | this._config.scroll || new cn().hide(), 3088 | this._element.setAttribute("aria-modal", !0), 3089 | this._element.setAttribute("role", "dialog"), 3090 | this._element.classList.add(Dn), 3091 | this._queueCallback( 3092 | () => { 3093 | (this._config.scroll && !this._config.backdrop) || 3094 | this._focustrap.activate(), 3095 | this._element.classList.add(Sn), 3096 | this._element.classList.remove(Dn), 3097 | N.trigger(this._element, Pn, { relatedTarget: t }); 3098 | }, 3099 | this._element, 3100 | !0, 3101 | )); 3102 | } 3103 | hide() { 3104 | this._isShown && 3105 | (N.trigger(this._element, jn).defaultPrevented || 3106 | (this._focustrap.deactivate(), 3107 | this._element.blur(), 3108 | (this._isShown = !1), 3109 | this._element.classList.add($n), 3110 | this._backdrop.hide(), 3111 | this._queueCallback( 3112 | () => { 3113 | this._element.classList.remove(Sn, $n), 3114 | this._element.removeAttribute("aria-modal"), 3115 | this._element.removeAttribute("role"), 3116 | this._config.scroll || new cn().reset(), 3117 | N.trigger(this._element, Fn); 3118 | }, 3119 | this._element, 3120 | !0, 3121 | ))); 3122 | } 3123 | dispose() { 3124 | this._backdrop.dispose(), this._focustrap.deactivate(), super.dispose(); 3125 | } 3126 | _initializeBackDrop() { 3127 | const t = Boolean(this._config.backdrop); 3128 | return new Ui({ 3129 | className: "offcanvas-backdrop", 3130 | isVisible: t, 3131 | isAnimated: !0, 3132 | rootElement: this._element.parentNode, 3133 | clickCallback: t 3134 | ? () => { 3135 | "static" !== this._config.backdrop 3136 | ? this.hide() 3137 | : N.trigger(this._element, Mn); 3138 | } 3139 | : null, 3140 | }); 3141 | } 3142 | _initializeFocusTrap() { 3143 | return new sn({ trapElement: this._element }); 3144 | } 3145 | _addEventListeners() { 3146 | N.on(this._element, Bn, (t) => { 3147 | "Escape" === t.key && 3148 | (this._config.keyboard ? this.hide() : N.trigger(this._element, Mn)); 3149 | }); 3150 | } 3151 | static jQueryInterface(t) { 3152 | return this.each(function () { 3153 | const e = qn.getOrCreateInstance(this, t); 3154 | if ("string" == typeof t) { 3155 | if (void 0 === e[t] || t.startsWith("_") || "constructor" === t) 3156 | throw new TypeError(`No method named "${t}"`); 3157 | e[t](this); 3158 | } 3159 | }); 3160 | } 3161 | } 3162 | N.on(document, Wn, '[data-bs-toggle="offcanvas"]', function (t) { 3163 | const e = z.getElementFromSelector(this); 3164 | if ((["A", "AREA"].includes(this.tagName) && t.preventDefault(), l(this))) 3165 | return; 3166 | N.one(e, Fn, () => { 3167 | a(this) && this.focus(); 3168 | }); 3169 | const i = z.findOne(In); 3170 | i && i !== e && qn.getInstance(i).hide(), 3171 | qn.getOrCreateInstance(e).toggle(this); 3172 | }), 3173 | N.on(window, Ln, () => { 3174 | for (const t of z.find(In)) qn.getOrCreateInstance(t).show(); 3175 | }), 3176 | N.on(window, Hn, () => { 3177 | for (const t of z.find("[aria-modal][class*=show][class*=offcanvas-]")) 3178 | "fixed" !== getComputedStyle(t).position && 3179 | qn.getOrCreateInstance(t).hide(); 3180 | }), 3181 | R(qn), 3182 | m(qn); 3183 | const Vn = { 3184 | "*": ["class", "dir", "id", "lang", "role", /^aria-[\w-]*$/i], 3185 | a: ["target", "href", "title", "rel"], 3186 | area: [], 3187 | b: [], 3188 | br: [], 3189 | col: [], 3190 | code: [], 3191 | dd: [], 3192 | div: [], 3193 | dl: [], 3194 | dt: [], 3195 | em: [], 3196 | hr: [], 3197 | h1: [], 3198 | h2: [], 3199 | h3: [], 3200 | h4: [], 3201 | h5: [], 3202 | h6: [], 3203 | i: [], 3204 | img: ["src", "srcset", "alt", "title", "width", "height"], 3205 | li: [], 3206 | ol: [], 3207 | p: [], 3208 | pre: [], 3209 | s: [], 3210 | small: [], 3211 | span: [], 3212 | sub: [], 3213 | sup: [], 3214 | strong: [], 3215 | u: [], 3216 | ul: [], 3217 | }, 3218 | Kn = new Set([ 3219 | "background", 3220 | "cite", 3221 | "href", 3222 | "itemtype", 3223 | "longdesc", 3224 | "poster", 3225 | "src", 3226 | "xlink:href", 3227 | ]), 3228 | Qn = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i, 3229 | Xn = (t, e) => { 3230 | const i = t.nodeName.toLowerCase(); 3231 | return e.includes(i) 3232 | ? !Kn.has(i) || Boolean(Qn.test(t.nodeValue)) 3233 | : e.filter((t) => t instanceof RegExp).some((t) => t.test(i)); 3234 | }, 3235 | Yn = { 3236 | allowList: Vn, 3237 | content: {}, 3238 | extraClass: "", 3239 | html: !1, 3240 | sanitize: !0, 3241 | sanitizeFn: null, 3242 | template: "
", 3243 | }, 3244 | Un = { 3245 | allowList: "object", 3246 | content: "object", 3247 | extraClass: "(string|function)", 3248 | html: "boolean", 3249 | sanitize: "boolean", 3250 | sanitizeFn: "(null|function)", 3251 | template: "string", 3252 | }, 3253 | Gn = { 3254 | entry: "(string|element|function|null)", 3255 | selector: "(string|element)", 3256 | }; 3257 | class Jn extends H { 3258 | constructor(t) { 3259 | super(), (this._config = this._getConfig(t)); 3260 | } 3261 | static get Default() { 3262 | return Yn; 3263 | } 3264 | static get DefaultType() { 3265 | return Un; 3266 | } 3267 | static get NAME() { 3268 | return "TemplateFactory"; 3269 | } 3270 | getContent() { 3271 | return Object.values(this._config.content) 3272 | .map((t) => this._resolvePossibleFunction(t)) 3273 | .filter(Boolean); 3274 | } 3275 | hasContent() { 3276 | return this.getContent().length > 0; 3277 | } 3278 | changeContent(t) { 3279 | return ( 3280 | this._checkContent(t), 3281 | (this._config.content = { ...this._config.content, ...t }), 3282 | this 3283 | ); 3284 | } 3285 | toHtml() { 3286 | const t = document.createElement("div"); 3287 | t.innerHTML = this._maybeSanitize(this._config.template); 3288 | for (const [e, i] of Object.entries(this._config.content)) 3289 | this._setContent(t, i, e); 3290 | const e = t.children[0], 3291 | i = this._resolvePossibleFunction(this._config.extraClass); 3292 | return i && e.classList.add(...i.split(" ")), e; 3293 | } 3294 | _typeCheckConfig(t) { 3295 | super._typeCheckConfig(t), this._checkContent(t.content); 3296 | } 3297 | _checkContent(t) { 3298 | for (const [e, i] of Object.entries(t)) 3299 | super._typeCheckConfig({ selector: e, entry: i }, Gn); 3300 | } 3301 | _setContent(t, e, i) { 3302 | const n = z.findOne(i, t); 3303 | n && 3304 | ((e = this._resolvePossibleFunction(e)) 3305 | ? o(e) 3306 | ? this._putElementInTemplate(r(e), n) 3307 | : this._config.html 3308 | ? (n.innerHTML = this._maybeSanitize(e)) 3309 | : (n.textContent = e) 3310 | : n.remove()); 3311 | } 3312 | _maybeSanitize(t) { 3313 | return this._config.sanitize 3314 | ? (function (t, e, i) { 3315 | if (!t.length) return t; 3316 | if (i && "function" == typeof i) return i(t); 3317 | const n = new window.DOMParser().parseFromString(t, "text/html"), 3318 | s = [].concat(...n.body.querySelectorAll("*")); 3319 | for (const t of s) { 3320 | const i = t.nodeName.toLowerCase(); 3321 | if (!Object.keys(e).includes(i)) { 3322 | t.remove(); 3323 | continue; 3324 | } 3325 | const n = [].concat(...t.attributes), 3326 | s = [].concat(e["*"] || [], e[i] || []); 3327 | for (const e of n) Xn(e, s) || t.removeAttribute(e.nodeName); 3328 | } 3329 | return n.body.innerHTML; 3330 | })(t, this._config.allowList, this._config.sanitizeFn) 3331 | : t; 3332 | } 3333 | _resolvePossibleFunction(t) { 3334 | return g(t, [this]); 3335 | } 3336 | _putElementInTemplate(t, e) { 3337 | if (this._config.html) return (e.innerHTML = ""), void e.append(t); 3338 | e.textContent = t.textContent; 3339 | } 3340 | } 3341 | const Zn = new Set(["sanitize", "allowList", "sanitizeFn"]), 3342 | ts = "fade", 3343 | es = "show", 3344 | is = ".modal", 3345 | ns = "hide.bs.modal", 3346 | ss = "hover", 3347 | os = "focus", 3348 | rs = { 3349 | AUTO: "auto", 3350 | TOP: "top", 3351 | RIGHT: p() ? "left" : "right", 3352 | BOTTOM: "bottom", 3353 | LEFT: p() ? "right" : "left", 3354 | }, 3355 | as = { 3356 | allowList: Vn, 3357 | animation: !0, 3358 | boundary: "clippingParents", 3359 | container: !1, 3360 | customClass: "", 3361 | delay: 0, 3362 | fallbackPlacements: ["top", "right", "bottom", "left"], 3363 | html: !1, 3364 | offset: [0, 6], 3365 | placement: "top", 3366 | popperConfig: null, 3367 | sanitize: !0, 3368 | sanitizeFn: null, 3369 | selector: !1, 3370 | template: 3371 | '', 3372 | title: "", 3373 | trigger: "hover focus", 3374 | }, 3375 | ls = { 3376 | allowList: "object", 3377 | animation: "boolean", 3378 | boundary: "(string|element)", 3379 | container: "(string|element|boolean)", 3380 | customClass: "(string|function)", 3381 | delay: "(number|object)", 3382 | fallbackPlacements: "array", 3383 | html: "boolean", 3384 | offset: "(array|string|function)", 3385 | placement: "(string|function)", 3386 | popperConfig: "(null|object|function)", 3387 | sanitize: "boolean", 3388 | sanitizeFn: "(null|function)", 3389 | selector: "(string|boolean)", 3390 | template: "string", 3391 | title: "(string|element|function)", 3392 | trigger: "string", 3393 | }; 3394 | class cs extends W { 3395 | constructor(t, e) { 3396 | if (void 0 === vi) 3397 | throw new TypeError( 3398 | "Bootstrap's tooltips require Popper (https://popper.js.org)", 3399 | ); 3400 | super(t, e), 3401 | (this._isEnabled = !0), 3402 | (this._timeout = 0), 3403 | (this._isHovered = null), 3404 | (this._activeTrigger = {}), 3405 | (this._popper = null), 3406 | (this._templateFactory = null), 3407 | (this._newContent = null), 3408 | (this.tip = null), 3409 | this._setListeners(), 3410 | this._config.selector || this._fixTitle(); 3411 | } 3412 | static get Default() { 3413 | return as; 3414 | } 3415 | static get DefaultType() { 3416 | return ls; 3417 | } 3418 | static get NAME() { 3419 | return "tooltip"; 3420 | } 3421 | enable() { 3422 | this._isEnabled = !0; 3423 | } 3424 | disable() { 3425 | this._isEnabled = !1; 3426 | } 3427 | toggleEnabled() { 3428 | this._isEnabled = !this._isEnabled; 3429 | } 3430 | toggle() { 3431 | this._isEnabled && 3432 | ((this._activeTrigger.click = !this._activeTrigger.click), 3433 | this._isShown() ? this._leave() : this._enter()); 3434 | } 3435 | dispose() { 3436 | clearTimeout(this._timeout), 3437 | N.off(this._element.closest(is), ns, this._hideModalHandler), 3438 | this._element.getAttribute("data-bs-original-title") && 3439 | this._element.setAttribute( 3440 | "title", 3441 | this._element.getAttribute("data-bs-original-title"), 3442 | ), 3443 | this._disposePopper(), 3444 | super.dispose(); 3445 | } 3446 | show() { 3447 | if ("none" === this._element.style.display) 3448 | throw new Error("Please use show on visible elements"); 3449 | if (!this._isWithContent() || !this._isEnabled) return; 3450 | const t = N.trigger(this._element, this.constructor.eventName("show")), 3451 | e = ( 3452 | c(this._element) || this._element.ownerDocument.documentElement 3453 | ).contains(this._element); 3454 | if (t.defaultPrevented || !e) return; 3455 | this._disposePopper(); 3456 | const i = this._getTipElement(); 3457 | this._element.setAttribute("aria-describedby", i.getAttribute("id")); 3458 | const { container: n } = this._config; 3459 | if ( 3460 | (this._element.ownerDocument.documentElement.contains(this.tip) || 3461 | (n.append(i), 3462 | N.trigger(this._element, this.constructor.eventName("inserted"))), 3463 | (this._popper = this._createPopper(i)), 3464 | i.classList.add(es), 3465 | "ontouchstart" in document.documentElement) 3466 | ) 3467 | for (const t of [].concat(...document.body.children)) 3468 | N.on(t, "mouseover", h); 3469 | this._queueCallback( 3470 | () => { 3471 | N.trigger(this._element, this.constructor.eventName("shown")), 3472 | !1 === this._isHovered && this._leave(), 3473 | (this._isHovered = !1); 3474 | }, 3475 | this.tip, 3476 | this._isAnimated(), 3477 | ); 3478 | } 3479 | hide() { 3480 | if ( 3481 | this._isShown() && 3482 | !N.trigger(this._element, this.constructor.eventName("hide")) 3483 | .defaultPrevented 3484 | ) { 3485 | if ( 3486 | (this._getTipElement().classList.remove(es), 3487 | "ontouchstart" in document.documentElement) 3488 | ) 3489 | for (const t of [].concat(...document.body.children)) 3490 | N.off(t, "mouseover", h); 3491 | (this._activeTrigger.click = !1), 3492 | (this._activeTrigger[os] = !1), 3493 | (this._activeTrigger[ss] = !1), 3494 | (this._isHovered = null), 3495 | this._queueCallback( 3496 | () => { 3497 | this._isWithActiveTrigger() || 3498 | (this._isHovered || this._disposePopper(), 3499 | this._element.removeAttribute("aria-describedby"), 3500 | N.trigger(this._element, this.constructor.eventName("hidden"))); 3501 | }, 3502 | this.tip, 3503 | this._isAnimated(), 3504 | ); 3505 | } 3506 | } 3507 | update() { 3508 | this._popper && this._popper.update(); 3509 | } 3510 | _isWithContent() { 3511 | return Boolean(this._getTitle()); 3512 | } 3513 | _getTipElement() { 3514 | return ( 3515 | this.tip || 3516 | (this.tip = this._createTipElement( 3517 | this._newContent || this._getContentForTemplate(), 3518 | )), 3519 | this.tip 3520 | ); 3521 | } 3522 | _createTipElement(t) { 3523 | const e = this._getTemplateFactory(t).toHtml(); 3524 | if (!e) return null; 3525 | e.classList.remove(ts, es), 3526 | e.classList.add(`bs-${this.constructor.NAME}-auto`); 3527 | const i = ((t) => { 3528 | do { 3529 | t += Math.floor(1e6 * Math.random()); 3530 | } while (document.getElementById(t)); 3531 | return t; 3532 | })(this.constructor.NAME).toString(); 3533 | return ( 3534 | e.setAttribute("id", i), this._isAnimated() && e.classList.add(ts), e 3535 | ); 3536 | } 3537 | setContent(t) { 3538 | (this._newContent = t), 3539 | this._isShown() && (this._disposePopper(), this.show()); 3540 | } 3541 | _getTemplateFactory(t) { 3542 | return ( 3543 | this._templateFactory 3544 | ? this._templateFactory.changeContent(t) 3545 | : (this._templateFactory = new Jn({ 3546 | ...this._config, 3547 | content: t, 3548 | extraClass: this._resolvePossibleFunction( 3549 | this._config.customClass, 3550 | ), 3551 | })), 3552 | this._templateFactory 3553 | ); 3554 | } 3555 | _getContentForTemplate() { 3556 | return { ".tooltip-inner": this._getTitle() }; 3557 | } 3558 | _getTitle() { 3559 | return ( 3560 | this._resolvePossibleFunction(this._config.title) || 3561 | this._element.getAttribute("data-bs-original-title") 3562 | ); 3563 | } 3564 | _initializeOnDelegatedTarget(t) { 3565 | return this.constructor.getOrCreateInstance( 3566 | t.delegateTarget, 3567 | this._getDelegateConfig(), 3568 | ); 3569 | } 3570 | _isAnimated() { 3571 | return ( 3572 | this._config.animation || (this.tip && this.tip.classList.contains(ts)) 3573 | ); 3574 | } 3575 | _isShown() { 3576 | return this.tip && this.tip.classList.contains(es); 3577 | } 3578 | _createPopper(t) { 3579 | const e = g(this._config.placement, [this, t, this._element]), 3580 | i = rs[e.toUpperCase()]; 3581 | return bi(this._element, t, this._getPopperConfig(i)); 3582 | } 3583 | _getOffset() { 3584 | const { offset: t } = this._config; 3585 | return "string" == typeof t 3586 | ? t.split(",").map((t) => Number.parseInt(t, 10)) 3587 | : "function" == typeof t 3588 | ? (e) => t(e, this._element) 3589 | : t; 3590 | } 3591 | _resolvePossibleFunction(t) { 3592 | return g(t, [this._element]); 3593 | } 3594 | _getPopperConfig(t) { 3595 | const e = { 3596 | placement: t, 3597 | modifiers: [ 3598 | { 3599 | name: "flip", 3600 | options: { fallbackPlacements: this._config.fallbackPlacements }, 3601 | }, 3602 | { name: "offset", options: { offset: this._getOffset() } }, 3603 | { 3604 | name: "preventOverflow", 3605 | options: { boundary: this._config.boundary }, 3606 | }, 3607 | { 3608 | name: "arrow", 3609 | options: { element: `.${this.constructor.NAME}-arrow` }, 3610 | }, 3611 | { 3612 | name: "preSetPlacement", 3613 | enabled: !0, 3614 | phase: "beforeMain", 3615 | fn: (t) => { 3616 | this._getTipElement().setAttribute( 3617 | "data-popper-placement", 3618 | t.state.placement, 3619 | ); 3620 | }, 3621 | }, 3622 | ], 3623 | }; 3624 | return { ...e, ...g(this._config.popperConfig, [e]) }; 3625 | } 3626 | _setListeners() { 3627 | const t = this._config.trigger.split(" "); 3628 | for (const e of t) 3629 | if ("click" === e) 3630 | N.on( 3631 | this._element, 3632 | this.constructor.eventName("click"), 3633 | this._config.selector, 3634 | (t) => { 3635 | this._initializeOnDelegatedTarget(t).toggle(); 3636 | }, 3637 | ); 3638 | else if ("manual" !== e) { 3639 | const t = 3640 | e === ss 3641 | ? this.constructor.eventName("mouseenter") 3642 | : this.constructor.eventName("focusin"), 3643 | i = 3644 | e === ss 3645 | ? this.constructor.eventName("mouseleave") 3646 | : this.constructor.eventName("focusout"); 3647 | N.on(this._element, t, this._config.selector, (t) => { 3648 | const e = this._initializeOnDelegatedTarget(t); 3649 | (e._activeTrigger["focusin" === t.type ? os : ss] = !0), e._enter(); 3650 | }), 3651 | N.on(this._element, i, this._config.selector, (t) => { 3652 | const e = this._initializeOnDelegatedTarget(t); 3653 | (e._activeTrigger["focusout" === t.type ? os : ss] = 3654 | e._element.contains(t.relatedTarget)), 3655 | e._leave(); 3656 | }); 3657 | } 3658 | (this._hideModalHandler = () => { 3659 | this._element && this.hide(); 3660 | }), 3661 | N.on(this._element.closest(is), ns, this._hideModalHandler); 3662 | } 3663 | _fixTitle() { 3664 | const t = this._element.getAttribute("title"); 3665 | t && 3666 | (this._element.getAttribute("aria-label") || 3667 | this._element.textContent.trim() || 3668 | this._element.setAttribute("aria-label", t), 3669 | this._element.setAttribute("data-bs-original-title", t), 3670 | this._element.removeAttribute("title")); 3671 | } 3672 | _enter() { 3673 | this._isShown() || this._isHovered 3674 | ? (this._isHovered = !0) 3675 | : ((this._isHovered = !0), 3676 | this._setTimeout(() => { 3677 | this._isHovered && this.show(); 3678 | }, this._config.delay.show)); 3679 | } 3680 | _leave() { 3681 | this._isWithActiveTrigger() || 3682 | ((this._isHovered = !1), 3683 | this._setTimeout(() => { 3684 | this._isHovered || this.hide(); 3685 | }, this._config.delay.hide)); 3686 | } 3687 | _setTimeout(t, e) { 3688 | clearTimeout(this._timeout), (this._timeout = setTimeout(t, e)); 3689 | } 3690 | _isWithActiveTrigger() { 3691 | return Object.values(this._activeTrigger).includes(!0); 3692 | } 3693 | _getConfig(t) { 3694 | const e = F.getDataAttributes(this._element); 3695 | for (const t of Object.keys(e)) Zn.has(t) && delete e[t]; 3696 | return ( 3697 | (t = { ...e, ...("object" == typeof t && t ? t : {}) }), 3698 | (t = this._mergeConfigObj(t)), 3699 | (t = this._configAfterMerge(t)), 3700 | this._typeCheckConfig(t), 3701 | t 3702 | ); 3703 | } 3704 | _configAfterMerge(t) { 3705 | return ( 3706 | (t.container = !1 === t.container ? document.body : r(t.container)), 3707 | "number" == typeof t.delay && 3708 | (t.delay = { show: t.delay, hide: t.delay }), 3709 | "number" == typeof t.title && (t.title = t.title.toString()), 3710 | "number" == typeof t.content && (t.content = t.content.toString()), 3711 | t 3712 | ); 3713 | } 3714 | _getDelegateConfig() { 3715 | const t = {}; 3716 | for (const [e, i] of Object.entries(this._config)) 3717 | this.constructor.Default[e] !== i && (t[e] = i); 3718 | return (t.selector = !1), (t.trigger = "manual"), t; 3719 | } 3720 | _disposePopper() { 3721 | this._popper && (this._popper.destroy(), (this._popper = null)), 3722 | this.tip && (this.tip.remove(), (this.tip = null)); 3723 | } 3724 | static jQueryInterface(t) { 3725 | return this.each(function () { 3726 | const e = cs.getOrCreateInstance(this, t); 3727 | if ("string" == typeof t) { 3728 | if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); 3729 | e[t](); 3730 | } 3731 | }); 3732 | } 3733 | } 3734 | m(cs); 3735 | const hs = { 3736 | ...cs.Default, 3737 | content: "", 3738 | offset: [0, 8], 3739 | placement: "right", 3740 | template: 3741 | '', 3742 | trigger: "click", 3743 | }, 3744 | ds = { ...cs.DefaultType, content: "(null|string|element|function)" }; 3745 | class us extends cs { 3746 | static get Default() { 3747 | return hs; 3748 | } 3749 | static get DefaultType() { 3750 | return ds; 3751 | } 3752 | static get NAME() { 3753 | return "popover"; 3754 | } 3755 | _isWithContent() { 3756 | return this._getTitle() || this._getContent(); 3757 | } 3758 | _getContentForTemplate() { 3759 | return { 3760 | ".popover-header": this._getTitle(), 3761 | ".popover-body": this._getContent(), 3762 | }; 3763 | } 3764 | _getContent() { 3765 | return this._resolvePossibleFunction(this._config.content); 3766 | } 3767 | static jQueryInterface(t) { 3768 | return this.each(function () { 3769 | const e = us.getOrCreateInstance(this, t); 3770 | if ("string" == typeof t) { 3771 | if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); 3772 | e[t](); 3773 | } 3774 | }); 3775 | } 3776 | } 3777 | m(us); 3778 | const fs = ".bs.scrollspy", 3779 | ps = `activate${fs}`, 3780 | ms = `click${fs}`, 3781 | gs = `load${fs}.data-api`, 3782 | _s = "active", 3783 | bs = "[href]", 3784 | vs = ".nav-link", 3785 | ys = `${vs}, .nav-item > ${vs}, .list-group-item`, 3786 | ws = { 3787 | offset: null, 3788 | rootMargin: "0px 0px -25%", 3789 | smoothScroll: !1, 3790 | target: null, 3791 | threshold: [0.1, 0.5, 1], 3792 | }, 3793 | As = { 3794 | offset: "(number|null)", 3795 | rootMargin: "string", 3796 | smoothScroll: "boolean", 3797 | target: "element", 3798 | threshold: "array", 3799 | }; 3800 | class Es extends W { 3801 | constructor(t, e) { 3802 | super(t, e), 3803 | (this._targetLinks = new Map()), 3804 | (this._observableSections = new Map()), 3805 | (this._rootElement = 3806 | "visible" === getComputedStyle(this._element).overflowY 3807 | ? null 3808 | : this._element), 3809 | (this._activeTarget = null), 3810 | (this._observer = null), 3811 | (this._previousScrollData = { visibleEntryTop: 0, parentScrollTop: 0 }), 3812 | this.refresh(); 3813 | } 3814 | static get Default() { 3815 | return ws; 3816 | } 3817 | static get DefaultType() { 3818 | return As; 3819 | } 3820 | static get NAME() { 3821 | return "scrollspy"; 3822 | } 3823 | refresh() { 3824 | this._initializeTargetsAndObservables(), 3825 | this._maybeEnableSmoothScroll(), 3826 | this._observer 3827 | ? this._observer.disconnect() 3828 | : (this._observer = this._getNewObserver()); 3829 | for (const t of this._observableSections.values()) 3830 | this._observer.observe(t); 3831 | } 3832 | dispose() { 3833 | this._observer.disconnect(), super.dispose(); 3834 | } 3835 | _configAfterMerge(t) { 3836 | return ( 3837 | (t.target = r(t.target) || document.body), 3838 | (t.rootMargin = t.offset ? `${t.offset}px 0px -30%` : t.rootMargin), 3839 | "string" == typeof t.threshold && 3840 | (t.threshold = t.threshold 3841 | .split(",") 3842 | .map((t) => Number.parseFloat(t))), 3843 | t 3844 | ); 3845 | } 3846 | _maybeEnableSmoothScroll() { 3847 | this._config.smoothScroll && 3848 | (N.off(this._config.target, ms), 3849 | N.on(this._config.target, ms, bs, (t) => { 3850 | const e = this._observableSections.get(t.target.hash); 3851 | if (e) { 3852 | t.preventDefault(); 3853 | const i = this._rootElement || window, 3854 | n = e.offsetTop - this._element.offsetTop; 3855 | if (i.scrollTo) 3856 | return void i.scrollTo({ top: n, behavior: "smooth" }); 3857 | i.scrollTop = n; 3858 | } 3859 | })); 3860 | } 3861 | _getNewObserver() { 3862 | const t = { 3863 | root: this._rootElement, 3864 | threshold: this._config.threshold, 3865 | rootMargin: this._config.rootMargin, 3866 | }; 3867 | return new IntersectionObserver((t) => this._observerCallback(t), t); 3868 | } 3869 | _observerCallback(t) { 3870 | const e = (t) => this._targetLinks.get(`#${t.target.id}`), 3871 | i = (t) => { 3872 | (this._previousScrollData.visibleEntryTop = t.target.offsetTop), 3873 | this._process(e(t)); 3874 | }, 3875 | n = (this._rootElement || document.documentElement).scrollTop, 3876 | s = n >= this._previousScrollData.parentScrollTop; 3877 | this._previousScrollData.parentScrollTop = n; 3878 | for (const o of t) { 3879 | if (!o.isIntersecting) { 3880 | (this._activeTarget = null), this._clearActiveClass(e(o)); 3881 | continue; 3882 | } 3883 | const t = 3884 | o.target.offsetTop >= this._previousScrollData.visibleEntryTop; 3885 | if (s && t) { 3886 | if ((i(o), !n)) return; 3887 | } else s || t || i(o); 3888 | } 3889 | } 3890 | _initializeTargetsAndObservables() { 3891 | (this._targetLinks = new Map()), (this._observableSections = new Map()); 3892 | const t = z.find(bs, this._config.target); 3893 | for (const e of t) { 3894 | if (!e.hash || l(e)) continue; 3895 | const t = z.findOne(decodeURI(e.hash), this._element); 3896 | a(t) && 3897 | (this._targetLinks.set(decodeURI(e.hash), e), 3898 | this._observableSections.set(e.hash, t)); 3899 | } 3900 | } 3901 | _process(t) { 3902 | this._activeTarget !== t && 3903 | (this._clearActiveClass(this._config.target), 3904 | (this._activeTarget = t), 3905 | t.classList.add(_s), 3906 | this._activateParents(t), 3907 | N.trigger(this._element, ps, { relatedTarget: t })); 3908 | } 3909 | _activateParents(t) { 3910 | if (t.classList.contains("dropdown-item")) 3911 | z.findOne(".dropdown-toggle", t.closest(".dropdown")).classList.add(_s); 3912 | else 3913 | for (const e of z.parents(t, ".nav, .list-group")) 3914 | for (const t of z.prev(e, ys)) t.classList.add(_s); 3915 | } 3916 | _clearActiveClass(t) { 3917 | t.classList.remove(_s); 3918 | const e = z.find(`${bs}.${_s}`, t); 3919 | for (const t of e) t.classList.remove(_s); 3920 | } 3921 | static jQueryInterface(t) { 3922 | return this.each(function () { 3923 | const e = Es.getOrCreateInstance(this, t); 3924 | if ("string" == typeof t) { 3925 | if (void 0 === e[t] || t.startsWith("_") || "constructor" === t) 3926 | throw new TypeError(`No method named "${t}"`); 3927 | e[t](); 3928 | } 3929 | }); 3930 | } 3931 | } 3932 | N.on(window, gs, () => { 3933 | for (const t of z.find('[data-bs-spy="scroll"]')) Es.getOrCreateInstance(t); 3934 | }), 3935 | m(Es); 3936 | const Ts = ".bs.tab", 3937 | Cs = `hide${Ts}`, 3938 | Os = `hidden${Ts}`, 3939 | xs = `show${Ts}`, 3940 | ks = `shown${Ts}`, 3941 | Ls = `click${Ts}`, 3942 | Ss = `keydown${Ts}`, 3943 | Ds = `load${Ts}`, 3944 | $s = "ArrowLeft", 3945 | Is = "ArrowRight", 3946 | Ns = "ArrowUp", 3947 | Ps = "ArrowDown", 3948 | js = "Home", 3949 | Ms = "End", 3950 | Fs = "active", 3951 | Hs = "fade", 3952 | Ws = "show", 3953 | Bs = ".dropdown-toggle", 3954 | zs = `:not(${Bs})`, 3955 | Rs = 3956 | '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]', 3957 | qs = `.nav-link${zs}, .list-group-item${zs}, [role="tab"]${zs}, ${Rs}`, 3958 | Vs = `.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`; 3959 | class Ks extends W { 3960 | constructor(t) { 3961 | super(t), 3962 | (this._parent = this._element.closest( 3963 | '.list-group, .nav, [role="tablist"]', 3964 | )), 3965 | this._parent && 3966 | (this._setInitialAttributes(this._parent, this._getChildren()), 3967 | N.on(this._element, Ss, (t) => this._keydown(t))); 3968 | } 3969 | static get NAME() { 3970 | return "tab"; 3971 | } 3972 | show() { 3973 | const t = this._element; 3974 | if (this._elemIsActive(t)) return; 3975 | const e = this._getActiveElem(), 3976 | i = e ? N.trigger(e, Cs, { relatedTarget: t }) : null; 3977 | N.trigger(t, xs, { relatedTarget: e }).defaultPrevented || 3978 | (i && i.defaultPrevented) || 3979 | (this._deactivate(e, t), this._activate(t, e)); 3980 | } 3981 | _activate(t, e) { 3982 | t && 3983 | (t.classList.add(Fs), 3984 | this._activate(z.getElementFromSelector(t)), 3985 | this._queueCallback( 3986 | () => { 3987 | "tab" === t.getAttribute("role") 3988 | ? (t.removeAttribute("tabindex"), 3989 | t.setAttribute("aria-selected", !0), 3990 | this._toggleDropDown(t, !0), 3991 | N.trigger(t, ks, { relatedTarget: e })) 3992 | : t.classList.add(Ws); 3993 | }, 3994 | t, 3995 | t.classList.contains(Hs), 3996 | )); 3997 | } 3998 | _deactivate(t, e) { 3999 | t && 4000 | (t.classList.remove(Fs), 4001 | t.blur(), 4002 | this._deactivate(z.getElementFromSelector(t)), 4003 | this._queueCallback( 4004 | () => { 4005 | "tab" === t.getAttribute("role") 4006 | ? (t.setAttribute("aria-selected", !1), 4007 | t.setAttribute("tabindex", "-1"), 4008 | this._toggleDropDown(t, !1), 4009 | N.trigger(t, Os, { relatedTarget: e })) 4010 | : t.classList.remove(Ws); 4011 | }, 4012 | t, 4013 | t.classList.contains(Hs), 4014 | )); 4015 | } 4016 | _keydown(t) { 4017 | if (![$s, Is, Ns, Ps, js, Ms].includes(t.key)) return; 4018 | t.stopPropagation(), t.preventDefault(); 4019 | const e = this._getChildren().filter((t) => !l(t)); 4020 | let i; 4021 | if ([js, Ms].includes(t.key)) i = e[t.key === js ? 0 : e.length - 1]; 4022 | else { 4023 | const n = [Is, Ps].includes(t.key); 4024 | i = b(e, t.target, n, !0); 4025 | } 4026 | i && (i.focus({ preventScroll: !0 }), Ks.getOrCreateInstance(i).show()); 4027 | } 4028 | _getChildren() { 4029 | return z.find(qs, this._parent); 4030 | } 4031 | _getActiveElem() { 4032 | return this._getChildren().find((t) => this._elemIsActive(t)) || null; 4033 | } 4034 | _setInitialAttributes(t, e) { 4035 | this._setAttributeIfNotExists(t, "role", "tablist"); 4036 | for (const t of e) this._setInitialAttributesOnChild(t); 4037 | } 4038 | _setInitialAttributesOnChild(t) { 4039 | t = this._getInnerElement(t); 4040 | const e = this._elemIsActive(t), 4041 | i = this._getOuterElement(t); 4042 | t.setAttribute("aria-selected", e), 4043 | i !== t && this._setAttributeIfNotExists(i, "role", "presentation"), 4044 | e || t.setAttribute("tabindex", "-1"), 4045 | this._setAttributeIfNotExists(t, "role", "tab"), 4046 | this._setInitialAttributesOnTargetPanel(t); 4047 | } 4048 | _setInitialAttributesOnTargetPanel(t) { 4049 | const e = z.getElementFromSelector(t); 4050 | e && 4051 | (this._setAttributeIfNotExists(e, "role", "tabpanel"), 4052 | t.id && this._setAttributeIfNotExists(e, "aria-labelledby", `${t.id}`)); 4053 | } 4054 | _toggleDropDown(t, e) { 4055 | const i = this._getOuterElement(t); 4056 | if (!i.classList.contains("dropdown")) return; 4057 | const n = (t, n) => { 4058 | const s = z.findOne(t, i); 4059 | s && s.classList.toggle(n, e); 4060 | }; 4061 | n(Bs, Fs), n(".dropdown-menu", Ws), i.setAttribute("aria-expanded", e); 4062 | } 4063 | _setAttributeIfNotExists(t, e, i) { 4064 | t.hasAttribute(e) || t.setAttribute(e, i); 4065 | } 4066 | _elemIsActive(t) { 4067 | return t.classList.contains(Fs); 4068 | } 4069 | _getInnerElement(t) { 4070 | return t.matches(qs) ? t : z.findOne(qs, t); 4071 | } 4072 | _getOuterElement(t) { 4073 | return t.closest(".nav-item, .list-group-item") || t; 4074 | } 4075 | static jQueryInterface(t) { 4076 | return this.each(function () { 4077 | const e = Ks.getOrCreateInstance(this); 4078 | if ("string" == typeof t) { 4079 | if (void 0 === e[t] || t.startsWith("_") || "constructor" === t) 4080 | throw new TypeError(`No method named "${t}"`); 4081 | e[t](); 4082 | } 4083 | }); 4084 | } 4085 | } 4086 | N.on(document, Ls, Rs, function (t) { 4087 | ["A", "AREA"].includes(this.tagName) && t.preventDefault(), 4088 | l(this) || Ks.getOrCreateInstance(this).show(); 4089 | }), 4090 | N.on(window, Ds, () => { 4091 | for (const t of z.find(Vs)) Ks.getOrCreateInstance(t); 4092 | }), 4093 | m(Ks); 4094 | const Qs = ".bs.toast", 4095 | Xs = `mouseover${Qs}`, 4096 | Ys = `mouseout${Qs}`, 4097 | Us = `focusin${Qs}`, 4098 | Gs = `focusout${Qs}`, 4099 | Js = `hide${Qs}`, 4100 | Zs = `hidden${Qs}`, 4101 | to = `show${Qs}`, 4102 | eo = `shown${Qs}`, 4103 | io = "hide", 4104 | no = "show", 4105 | so = "showing", 4106 | oo = { animation: "boolean", autohide: "boolean", delay: "number" }, 4107 | ro = { animation: !0, autohide: !0, delay: 5e3 }; 4108 | class ao extends W { 4109 | constructor(t, e) { 4110 | super(t, e), 4111 | (this._timeout = null), 4112 | (this._hasMouseInteraction = !1), 4113 | (this._hasKeyboardInteraction = !1), 4114 | this._setListeners(); 4115 | } 4116 | static get Default() { 4117 | return ro; 4118 | } 4119 | static get DefaultType() { 4120 | return oo; 4121 | } 4122 | static get NAME() { 4123 | return "toast"; 4124 | } 4125 | show() { 4126 | N.trigger(this._element, to).defaultPrevented || 4127 | (this._clearTimeout(), 4128 | this._config.animation && this._element.classList.add("fade"), 4129 | this._element.classList.remove(io), 4130 | d(this._element), 4131 | this._element.classList.add(no, so), 4132 | this._queueCallback( 4133 | () => { 4134 | this._element.classList.remove(so), 4135 | N.trigger(this._element, eo), 4136 | this._maybeScheduleHide(); 4137 | }, 4138 | this._element, 4139 | this._config.animation, 4140 | )); 4141 | } 4142 | hide() { 4143 | this.isShown() && 4144 | (N.trigger(this._element, Js).defaultPrevented || 4145 | (this._element.classList.add(so), 4146 | this._queueCallback( 4147 | () => { 4148 | this._element.classList.add(io), 4149 | this._element.classList.remove(so, no), 4150 | N.trigger(this._element, Zs); 4151 | }, 4152 | this._element, 4153 | this._config.animation, 4154 | ))); 4155 | } 4156 | dispose() { 4157 | this._clearTimeout(), 4158 | this.isShown() && this._element.classList.remove(no), 4159 | super.dispose(); 4160 | } 4161 | isShown() { 4162 | return this._element.classList.contains(no); 4163 | } 4164 | _maybeScheduleHide() { 4165 | this._config.autohide && 4166 | (this._hasMouseInteraction || 4167 | this._hasKeyboardInteraction || 4168 | (this._timeout = setTimeout(() => { 4169 | this.hide(); 4170 | }, this._config.delay))); 4171 | } 4172 | _onInteraction(t, e) { 4173 | switch (t.type) { 4174 | case "mouseover": 4175 | case "mouseout": 4176 | this._hasMouseInteraction = e; 4177 | break; 4178 | case "focusin": 4179 | case "focusout": 4180 | this._hasKeyboardInteraction = e; 4181 | } 4182 | if (e) return void this._clearTimeout(); 4183 | const i = t.relatedTarget; 4184 | this._element === i || 4185 | this._element.contains(i) || 4186 | this._maybeScheduleHide(); 4187 | } 4188 | _setListeners() { 4189 | N.on(this._element, Xs, (t) => this._onInteraction(t, !0)), 4190 | N.on(this._element, Ys, (t) => this._onInteraction(t, !1)), 4191 | N.on(this._element, Us, (t) => this._onInteraction(t, !0)), 4192 | N.on(this._element, Gs, (t) => this._onInteraction(t, !1)); 4193 | } 4194 | _clearTimeout() { 4195 | clearTimeout(this._timeout), (this._timeout = null); 4196 | } 4197 | static jQueryInterface(t) { 4198 | return this.each(function () { 4199 | const e = ao.getOrCreateInstance(this, t); 4200 | if ("string" == typeof t) { 4201 | if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); 4202 | e[t](this); 4203 | } 4204 | }); 4205 | } 4206 | } 4207 | return ( 4208 | R(ao), 4209 | m(ao), 4210 | { 4211 | Alert: Q, 4212 | Button: Y, 4213 | Carousel: xt, 4214 | Collapse: Bt, 4215 | Dropdown: qi, 4216 | Modal: On, 4217 | Offcanvas: qn, 4218 | Popover: us, 4219 | ScrollSpy: Es, 4220 | Tab: Ks, 4221 | Toast: ao, 4222 | Tooltip: cs, 4223 | } 4224 | ); 4225 | }); 4226 | //# sourceMappingURL=bootstrap.bundle.min.js.map 4227 | -------------------------------------------------------------------------------- /assets/js/color-modes.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Color mode toggler for Bootstrap's docs (https://getbootstrap.com/) 3 | * Copyright 2011-2024 The Bootstrap Authors 4 | * Licensed under the Creative Commons Attribution 3.0 Unported License. 5 | */ 6 | 7 | (() => { 8 | 'use strict' 9 | 10 | const getStoredTheme = () => localStorage.getItem('theme') 11 | const setStoredTheme = (theme) => localStorage.setItem('theme', theme) 12 | 13 | const getPreferredTheme = () => { 14 | const storedTheme = getStoredTheme() 15 | if (storedTheme) { 16 | return storedTheme 17 | } 18 | 19 | return window.matchMedia('(prefers-color-scheme: dark)').matches 20 | ? 'dark' 21 | : 'light' 22 | } 23 | 24 | const setTheme = (theme) => { 25 | if (theme === 'auto') { 26 | document.documentElement.setAttribute( 27 | 'data-bs-theme', 28 | window.matchMedia('(prefers-color-scheme: dark)').matches 29 | ? 'dark' 30 | : 'light' 31 | ) 32 | } else { 33 | document.documentElement.setAttribute('data-bs-theme', theme) 34 | } 35 | } 36 | 37 | setTheme(getPreferredTheme()) 38 | 39 | const showActiveTheme = (theme, focus = false) => { 40 | const themeSwitcher = document.querySelector('#bd-theme') 41 | 42 | if (!themeSwitcher) { 43 | return 44 | } 45 | 46 | const themeSwitcherText = document.querySelector('#bd-theme-text') 47 | const activeThemeIcon = document.querySelector('.theme-icon-active use') 48 | const btnToActive = document.querySelector( 49 | `[data-bs-theme-value="${theme}"]` 50 | ) 51 | const svgOfActiveBtn = btnToActive 52 | .querySelector('svg use') 53 | .getAttribute('href') 54 | 55 | document.querySelectorAll('[data-bs-theme-value]').forEach((element) => { 56 | element.classList.remove('active') 57 | element.setAttribute('aria-pressed', 'false') 58 | }) 59 | 60 | btnToActive.classList.add('active') 61 | btnToActive.setAttribute('aria-pressed', 'true') 62 | activeThemeIcon.setAttribute('href', svgOfActiveBtn) 63 | const themeSwitcherLabel = `${themeSwitcherText.textContent} (${btnToActive.dataset.bsThemeValue})` 64 | themeSwitcher.setAttribute('aria-label', themeSwitcherLabel) 65 | 66 | if (focus) { 67 | themeSwitcher.focus() 68 | } 69 | } 70 | 71 | window 72 | .matchMedia('(prefers-color-scheme: dark)') 73 | .addEventListener('change', () => { 74 | const storedTheme = getStoredTheme() 75 | if (storedTheme !== 'light' && storedTheme !== 'dark') { 76 | setTheme(getPreferredTheme()) 77 | } 78 | }) 79 | 80 | window.addEventListener('DOMContentLoaded', () => { 81 | showActiveTheme(getPreferredTheme()) 82 | 83 | document.querySelectorAll('[data-bs-theme-value]').forEach((toggle) => { 84 | toggle.addEventListener('click', () => { 85 | const theme = toggle.getAttribute('data-bs-theme-value') 86 | setStoredTheme(theme) 87 | setTheme(theme) 88 | showActiveTheme(theme, true) 89 | }) 90 | }) 91 | }) 92 | })() 93 | -------------------------------------------------------------------------------- /assets/js/site.js: -------------------------------------------------------------------------------- 1 | filters = { 2 | nsfw: 'NSFW', 3 | archived: 'Archived' 4 | } 5 | 6 | function varExists (value) { 7 | return value !== undefined && value !== null && value !== '' && value !== 0 8 | } 9 | function removeLast (inputString, separator) { 10 | if (inputString === undefined || inputString === null) return '' 11 | if (separator === undefined || separator === null) return '' 12 | const lastIndex = inputString.lastIndexOf(separator) 13 | if (lastIndex > 0) return inputString.substring(0, lastIndex) 14 | else return '' 15 | } 16 | function isQueryParamSet (paramName) { 17 | const searchParams = new URLSearchParams(window.location.search) 18 | return searchParams.has(paramName) 19 | } 20 | function isRelativeUrl (url) { 21 | return url.startsWith('./') 22 | } 23 | function getAbsoluteUrl (url, baseUrl) { 24 | if (isRelativeUrl(url)) { 25 | return url.replace('./', baseUrl) 26 | } 27 | return url 28 | } 29 | function setParams (params, navigate = true) { 30 | const url = new URL(window.location.href) 31 | const setParam = (key, value) => { 32 | if (value !== undefined && value !== null) { 33 | url.searchParams.set(key, value.toString()) 34 | } /* if (!url.searchParams.has(key)) */ else { 35 | url.searchParams.set(key, 1) 36 | } 37 | } 38 | if (Array.isArray(params)) { 39 | params.forEach(setParam) 40 | } else if (typeof params === 'object' && params !== null) { 41 | Object.entries(params).forEach(setParam) 42 | } else if (typeof params === 'string') { 43 | const [key, value] = params.split('=') 44 | setParam(key, value) 45 | } 46 | console.log(`New URL: ${url}`) 47 | if (navigate) { 48 | window.location.href = url 49 | window.location.replace(url) 50 | } 51 | return url 52 | } 53 | 54 | function getSourceFeeds (data, key) { 55 | const urls = [] 56 | data.forEach((item) => { 57 | if (!item.hasOwnProperty('_feeds')) return 58 | if (item._feeds.hasOwnProperty(key)) { 59 | urls.push(encodeURI(item._feeds[key])) 60 | } 61 | // else console.warn(`Source ${item.name} has no ${key}`); 62 | }) 63 | console.log('URLs:', urls) // Log encoded URLs 64 | const urlCount = urls.length 65 | const baseUrl = 'https://rssmerge.onrender.com' // Use the current page's origin as the base URL 66 | console.log('Base URL:', baseUrl) // Log base URL 67 | const params = new URLSearchParams({ 68 | title: `${urlCount} ${key}`, 69 | urls: urls.join(',') 70 | }).toString() 71 | const finalUrl = `${baseUrl}/?${params}` 72 | console.log('Final URL:', finalUrl) // Log final URL 73 | return finalUrl 74 | } 75 | function fixData (data) { 76 | if (varExists(data.scriptUrl)) { 77 | data.baseUrl = removeLast(data.sourceUrl, '/') + '/' 78 | } 79 | if (!data.hasOwnProperty('_feeds')) data._feeds = {} 80 | if (!data.hasOwnProperty('_tags')) data._tags = [] 81 | for (const [key, value] of Object.entries(data)) { 82 | if (key.toLowerCase().includes('url')) { 83 | if (Array.isArray(value)) continue 84 | if (isRelativeUrl(value)) { 85 | data[key + '_'] = value 86 | data[key] = getAbsoluteUrl(value, data.baseUrl) 87 | } 88 | } 89 | } 90 | console.log(data) 91 | return data 92 | } 93 | function generateQrCode (url) { 94 | const qr = new QRious({ value: url }) 95 | return `` 96 | } 97 | function getFavicon (url, size = 128) { 98 | console.log(url) 99 | if (!url.startsWith('http')) { 100 | url = `http://${url}` 101 | } 102 | url = new URL(url) 103 | return `https://www.google.com/s2/favicons?domain=${url.hostname}&sz=${size}` // `https://icons.adguard.org/icon?domain=${url.hostname}` 104 | } 105 | function itemShouldBeFilteredAccordingTo (item, key) { 106 | const result = 107 | Array.isArray(item._tags) && 108 | !isQueryParamSet(key) && 109 | item._tags.includes(key) 110 | if (result) console.warn(`Item ${item.name} filtered by ${key}`) 111 | return result 112 | } 113 | function itemShouldBeFiltered (item) { 114 | return ( 115 | itemShouldBeFilteredAccordingTo(item, 'archived') || 116 | itemShouldBeFilteredAccordingTo(item, 'nsfw') 117 | ) 118 | } 119 | function generateCard (data) { 120 | let sourceUrlEncoded, installUrl 121 | if (varExists(data.sourceUrl)) { 122 | sourceUrlEncoded = encodeURIComponent(data.sourceUrl) 123 | console.log(sourceUrlEncoded) 124 | // if (isNotEmpty(data.scriptUrl)) { 125 | installUrl = `grayjay://plugin/${data.sourceUrl}` 126 | // } 127 | } 128 | const repoUrl = data.repositoryUrl ?? data.configUrl 129 | if (!data.iconUrl) { 130 | if (data.platformUrl) { 131 | data.iconUrl = getFavicon(data.platformUrl) 132 | } else { 133 | data.iconUrl = getFavicon(data.allowUrls[0]) 134 | } 135 | } 136 | let author = data.author 137 | if (author === 'FUTO') author = `${data.author}` 138 | data.hidden = itemShouldBeFiltered(data) ? ' hidden' : '' 139 | /* */ 140 | let html = ` 141 |
142 |
143 |
${data.name}
` 144 | if (data.iconUrl) { 145 | html += `${data.name}` 146 | } else { 147 | html += ` 148 | ${data.name} Source Icon 149 | 150 | ${data.name} 151 | ` 152 | } 153 | if (varExists(installUrl)) html += generateQrCode(installUrl) 154 | html += `
155 |

${data.description}

156 |
157 |
` 158 | if (varExists(installUrl)) { 159 | html += ` ` 160 | } 161 | html += `` 162 | if (data._customButtons) { 163 | html += '
' 164 | data._customButtons.forEach((btn) => { 165 | html += ` ` 166 | }) 167 | } 168 | html += `
169 | ${data.author} 170 |
171 |
172 |
173 |
174 | ` 175 | return html 176 | } 177 | async function addNavbarItem (text, url, spacer = false) { 178 | const navbarMenu = document.querySelector( 179 | 'body > header > div.navbar.navbar-dark.bg-dark.shadow-sm > div > li > ul' 180 | ) 181 | 182 | if (spacer) { 183 | const hrElement = document.createElement('hr') 184 | hrElement.className = 'dropdown-divider' 185 | const listItemElement = document.createElement('li') 186 | listItemElement.appendChild(hrElement) 187 | navbarMenu.appendChild(listItemElement) 188 | } 189 | 190 | const anchorElement = document.createElement('a') 191 | anchorElement.className = 'dropdown-item' 192 | anchorElement.target = '_blank' 193 | anchorElement.rel = 'noopener noreferrer' 194 | anchorElement.href = url 195 | anchorElement.textContent = text 196 | const listItemElement = document.createElement('li') 197 | listItemElement.appendChild(anchorElement) 198 | navbarMenu.appendChild(listItemElement) 199 | } 200 | function filterItems (items) { 201 | // Function to filter items based on hidden tags 202 | return items.filter((item) => { 203 | const itemTags = new Set( 204 | (item._tags || []).map((tag) => tag.toLowerCase()) 205 | ) 206 | if (hiddenTags.has('*')) { 207 | return false 208 | } 209 | return !Array.from(hiddenTags).some((tag) => itemTags.has(tag)) 210 | }) 211 | } 212 | async function populateCardsContainer (url) { 213 | try { 214 | const response = await fetch(url) 215 | const data = await response.json() 216 | const cardsContainer = document.getElementById('cards-container') 217 | cardsContainer.innerHTML = '' 218 | data.forEach((item) => { 219 | item = fixData(item) 220 | const cardHtml = generateCard(item) 221 | cardsContainer.innerHTML += cardHtml 222 | }) 223 | 224 | const commitFeedsUrl = getSourceFeeds(data, 'commits') 225 | addNavbarItem('Source Commits RSS Feed', commitFeedsUrl, true) 226 | const releaseFeedsUrl = getSourceFeeds(data, 'releases') 227 | addNavbarItem('Sources Releases RSS Feed', releaseFeedsUrl) 228 | } catch (error) { 229 | console.error('Error fetching data:', error) 230 | } 231 | } 232 | function toggleQRCodes () { 233 | const firstSourceIcon = document.getElementsByClassName('source-icon')[0] 234 | const sourceIconStyle = firstSourceIcon.getAttribute('style') 235 | if (sourceIconStyle == 'display:block') { 236 | document.querySelectorAll('.source-icon').forEach((element) => { 237 | element.setAttribute('style', 'display:none') 238 | }) 239 | document.querySelectorAll('.source-qrcode').forEach((element) => { 240 | element.setAttribute('style', 'display:block') 241 | }) 242 | } else { 243 | document.querySelectorAll('.source-icon').forEach((element) => { 244 | element.setAttribute('style', 'display:block') 245 | }) 246 | document.querySelectorAll('.source-qrcode').forEach((element) => { 247 | element.setAttribute('style', 'display:none') 248 | }) 249 | } 250 | } 251 | function generateFilters (filters) { 252 | console.warn(filters) 253 | html = '' 254 | Object.entries(filters).forEach((filter) => { 255 | html += `Show ${filter[1]} modules
` 256 | }) 257 | return html 258 | } 259 | document.addEventListener('DOMContentLoaded', () => { 260 | const url = 261 | 'https://raw.githubusercontent.com/grayjay-sources/repo/main/sources.json' 262 | populateCardsContainer(url) 263 | document.getElementById('footerLinks').innerHTML += generateFilters(filters) 264 | document.querySelectorAll('#bd-qrcodes').forEach((toggle) => { 265 | toggle.addEventListener('click', toggleQRCodes) 266 | }) 267 | }) 268 | -------------------------------------------------------------------------------- /googlee9879a763c198f4c.html: -------------------------------------------------------------------------------- 1 | google-site-verification: googlee9879a763c198f4c.html 2 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | GrayJay Sources 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 31 | 32 | 33 | 34 | 35 | 36 | 38 | 40 | 41 | 42 | 44 | 45 | 46 | 47 | 94 | 95 | 96 | 109 | 110 | 111 |
112 | 129 | 151 |
152 |
153 |
154 |
155 |
156 |

GrayJay Sources

157 |

Collected for your convinience

158 |

159 | Get GrayJay 160 |

161 |
162 |
163 |
164 | 165 |
166 |
167 |
168 | 169 |
170 |
171 |
172 |
173 | 174 |
175 |
176 | 179 |

This page is not affiliated with GrayJay or FUTO!

180 |

GrayJay©️®️™️ and FUTO©️®️™️ are registered, copyrighted and trademarked brands of RossmannRepairGroup Inc.

181 |
182 |
183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | -------------------------------------------------------------------------------- /python/SourceList.py: -------------------------------------------------------------------------------- 1 | import json 2 | from dataclasses import dataclass 3 | from enum import Enum 4 | from typing import Any, Callable, List, Optional, Type, TypeVar, Union, cast 5 | from uuid import UUID 6 | 7 | T = TypeVar("T") 8 | EnumT = TypeVar("EnumT", bound=Enum) 9 | 10 | 11 | def from_list(f: Callable[[Any], T], x: Any) -> List[T]: 12 | assert isinstance(x, list) 13 | return [f(y) for y in x] 14 | 15 | 16 | def from_str(x: Any) -> str: 17 | assert isinstance(x, str) 18 | return x 19 | 20 | 21 | def from_none(x: Any) -> Any: 22 | assert x is None 23 | return x 24 | 25 | 26 | def from_union(fs, x): 27 | for f in fs: 28 | try: 29 | return f(x) 30 | except: 31 | pass 32 | assert False 33 | 34 | 35 | def from_bool(x: Any) -> bool: 36 | assert isinstance(x, bool) 37 | return x 38 | 39 | 40 | def to_class(c: Type[T], x: Any) -> dict: 41 | assert isinstance(x, c) 42 | return cast(Any, x).to_dict() 43 | 44 | 45 | def from_stringified_bool(x: str) -> bool: 46 | if x == "true": 47 | return True 48 | if x == "false": 49 | return False 50 | assert False 51 | 52 | 53 | def to_enum(c: Type[EnumT], x: Any) -> EnumT: 54 | assert isinstance(x, c) 55 | return x.value 56 | 57 | 58 | def is_type(t: Type[T], x: Any) -> T: 59 | assert isinstance(x, t) 60 | return x 61 | 62 | 63 | def from_int(x: Any) -> int: 64 | assert isinstance(x, int) and not isinstance(x, bool) 65 | return x 66 | 67 | 68 | @dataclass 69 | class DomainHeadersToFind: 70 | twitch_tv: Optional[List[str]] = None 71 | youtube_com: Optional[List[str]] = None 72 | 73 | @staticmethod 74 | def from_dict(obj: Any) -> "DomainHeadersToFind": 75 | assert isinstance(obj, dict) 76 | twitch_tv = from_union( 77 | [lambda x: from_list(from_str, x), from_none], obj.get(".twitch.tv") 78 | ) 79 | youtube_com = from_union( 80 | [lambda x: from_list(from_str, x), from_none], obj.get(".youtube.com") 81 | ) 82 | return DomainHeadersToFind(twitch_tv, youtube_com) 83 | 84 | def to_dict(self) -> dict: 85 | result: dict = {} 86 | if self.twitch_tv is not None: 87 | result[".twitch.tv"] = from_union( 88 | [lambda x: from_list(from_str, x), from_none], self.twitch_tv 89 | ) 90 | if self.youtube_com is not None: 91 | result[".youtube.com"] = from_union( 92 | [lambda x: from_list(from_str, x), from_none], self.youtube_com 93 | ) 94 | return result 95 | 96 | 97 | @dataclass 98 | class Authentication: 99 | login_url: str 100 | user_agent: Optional[str] = None 101 | cookies_to_find: Optional[List[str]] = None 102 | headers_to_find: Optional[List[str]] = None 103 | cookies_excl_others: Optional[bool] = None 104 | completion_url: Optional[str] = None 105 | login_button: Optional[str] = None 106 | domain_headers_to_find: Optional[DomainHeadersToFind] = None 107 | login_warning: Optional[str] = None 108 | 109 | @staticmethod 110 | def from_dict(obj: Any) -> "Authentication": 111 | assert isinstance(obj, dict) 112 | login_url = from_str(obj.get("loginUrl")) 113 | user_agent = from_union([from_str, from_none], obj.get("userAgent")) 114 | cookies_to_find = from_union( 115 | [lambda x: from_list(from_str, x), from_none], obj.get("cookiesToFind") 116 | ) 117 | headers_to_find = from_union( 118 | [lambda x: from_list(from_str, x), from_none], obj.get("headersToFind") 119 | ) 120 | cookies_excl_others = from_union( 121 | [from_bool, from_none], obj.get("cookiesExclOthers") 122 | ) 123 | completion_url = from_union([from_str, from_none], obj.get("completionUrl")) 124 | login_button = from_union([from_str, from_none], obj.get("loginButton")) 125 | domain_headers_to_find = from_union( 126 | [DomainHeadersToFind.from_dict, from_none], obj.get("domainHeadersToFind") 127 | ) 128 | login_warning = from_union([from_str, from_none], obj.get("loginWarning")) 129 | return Authentication( 130 | login_url, 131 | user_agent, 132 | cookies_to_find, 133 | headers_to_find, 134 | cookies_excl_others, 135 | completion_url, 136 | login_button, 137 | domain_headers_to_find, 138 | login_warning, 139 | ) 140 | 141 | def to_dict(self) -> dict: 142 | result: dict = {} 143 | result["loginUrl"] = from_str(self.login_url) 144 | if self.user_agent is not None: 145 | result["userAgent"] = from_union([from_str, from_none], self.user_agent) 146 | if self.cookies_to_find is not None: 147 | result["cookiesToFind"] = from_union( 148 | [lambda x: from_list(from_str, x), from_none], self.cookies_to_find 149 | ) 150 | if self.headers_to_find is not None: 151 | result["headersToFind"] = from_union( 152 | [lambda x: from_list(from_str, x), from_none], self.headers_to_find 153 | ) 154 | if self.cookies_excl_others is not None: 155 | result["cookiesExclOthers"] = from_union( 156 | [from_bool, from_none], self.cookies_excl_others 157 | ) 158 | if self.completion_url is not None: 159 | result["completionUrl"] = from_union( 160 | [from_str, from_none], self.completion_url 161 | ) 162 | if self.login_button is not None: 163 | result["loginButton"] = from_union([from_str, from_none], self.login_button) 164 | if self.domain_headers_to_find is not None: 165 | result["domainHeadersToFind"] = from_union( 166 | [lambda x: to_class(DomainHeadersToFind, x), from_none], 167 | self.domain_headers_to_find, 168 | ) 169 | if self.login_warning is not None: 170 | result["loginWarning"] = from_union( 171 | [from_str, from_none], self.login_warning 172 | ) 173 | return result 174 | 175 | 176 | @dataclass 177 | class CAPTCHA: 178 | user_agent: str 179 | captcha_url: None 180 | cookies_to_find: List[str] 181 | 182 | @staticmethod 183 | def from_dict(obj: Any) -> "CAPTCHA": 184 | assert isinstance(obj, dict) 185 | user_agent = from_str(obj.get("userAgent")) 186 | captcha_url = from_none(obj.get("captchaUrl")) 187 | cookies_to_find = from_list(from_str, obj.get("cookiesToFind")) 188 | return CAPTCHA(user_agent, captcha_url, cookies_to_find) 189 | 190 | def to_dict(self) -> dict: 191 | result: dict = {} 192 | result["userAgent"] = from_str(self.user_agent) 193 | result["captchaUrl"] = from_none(self.captcha_url) 194 | result["cookiesToFind"] = from_list(from_str, self.cookies_to_find) 195 | return result 196 | 197 | 198 | @dataclass 199 | class Constants: 200 | base_url: str 201 | 202 | @staticmethod 203 | def from_dict(obj: Any) -> "Constants": 204 | assert isinstance(obj, dict) 205 | base_url = from_str(obj.get("baseUrl")) 206 | return Constants(base_url) 207 | 208 | def to_dict(self) -> dict: 209 | result: dict = {} 210 | result["baseUrl"] = from_str(self.base_url) 211 | return result 212 | 213 | 214 | @dataclass 215 | class CustomButton: 216 | text: str 217 | url: str 218 | classes: str 219 | 220 | @staticmethod 221 | def from_dict(obj: Any) -> "CustomButton": 222 | assert isinstance(obj, dict) 223 | text = from_str(obj.get("text")) 224 | url = from_str(obj.get("url")) 225 | classes = from_str(obj.get("classes")) 226 | return CustomButton(text, url, classes) 227 | 228 | def to_dict(self) -> dict: 229 | result: dict = {} 230 | result["text"] = from_str(self.text) 231 | result["url"] = from_str(self.url) 232 | result["classes"] = from_str(self.classes) 233 | return result 234 | 235 | 236 | class Package(Enum): 237 | DOM_PARSER = "DOMParser" 238 | HTTP = "Http" 239 | UTILITIES = "Utilities" 240 | 241 | 242 | class TypeEnum(Enum): 243 | BOOLEAN = "Boolean" 244 | DROPDOWN = "Dropdown" 245 | HEADER = "Header" 246 | 247 | 248 | @dataclass 249 | class Setting: 250 | variable: str 251 | name: str 252 | description: str 253 | type: TypeEnum 254 | default: Optional[Union[int, bool]] = None 255 | options: Optional[List[str]] = None 256 | warning_dialog: Optional[str] = None 257 | dependency: Optional[str] = None 258 | 259 | @staticmethod 260 | def from_dict(obj: Any) -> "Setting": 261 | assert isinstance(obj, dict) 262 | variable = from_str(obj.get("variable")) 263 | name = from_str(obj.get("name")) 264 | description = from_str(obj.get("description")) 265 | type = TypeEnum(obj.get("type")) 266 | default = from_union( 267 | [ 268 | from_none, 269 | lambda x: from_union( 270 | [from_stringified_bool, lambda x: int(x)], from_str(x) 271 | ), 272 | ], 273 | obj.get("default"), 274 | ) 275 | options = from_union( 276 | [lambda x: from_list(from_str, x), from_none], obj.get("options") 277 | ) 278 | warning_dialog = from_union([from_str, from_none], obj.get("warningDialog")) 279 | dependency = from_union([from_str, from_none], obj.get("dependency")) 280 | return Setting( 281 | variable, 282 | name, 283 | description, 284 | type, 285 | default, 286 | options, 287 | warning_dialog, 288 | dependency, 289 | ) 290 | 291 | def to_dict(self) -> dict: 292 | result: dict = {} 293 | result["variable"] = from_str(self.variable) 294 | result["name"] = from_str(self.name) 295 | result["description"] = from_str(self.description) 296 | result["type"] = to_enum(TypeEnum, self.type) 297 | if self.default is not None: 298 | result["default"] = from_union( 299 | [ 300 | lambda x: from_none((lambda x: is_type(type(None), x))(x)), 301 | lambda x: from_str( 302 | (lambda x: str((lambda x: is_type(bool, x))(x)).lower())(x) 303 | ), 304 | lambda x: from_str( 305 | (lambda x: str((lambda x: is_type(int, x))(x)))(x) 306 | ), 307 | ], 308 | self.default, 309 | ) 310 | if self.options is not None: 311 | result["options"] = from_union( 312 | [lambda x: from_list(from_str, x), from_none], self.options 313 | ) 314 | if self.warning_dialog is not None: 315 | result["warningDialog"] = from_union( 316 | [from_str, from_none], self.warning_dialog 317 | ) 318 | if self.dependency is not None: 319 | result["dependency"] = from_union([from_str, from_none], self.dependency) 320 | return result 321 | 322 | 323 | @dataclass 324 | class Feeds: 325 | commits: Optional[str] 326 | releases: Optional[str] 327 | 328 | @staticmethod 329 | def from_dict(obj: Any) -> "Feeds": 330 | assert isinstance(obj, dict) 331 | commits = from_union([from_str, from_none], obj.get("commits")) 332 | releases = from_union([from_str, from_none], obj.get("releases")) 333 | return Feeds(commits, releases) 334 | 335 | def to_dict(self) -> dict: 336 | result: dict = {} 337 | if self.commits is not None: 338 | result["commits"] = from_union([from_str, from_none], self.commits) 339 | if self.releases is not None: 340 | result["releases"] = from_union([from_str, from_none], self.releases) 341 | return result 342 | 343 | 344 | @dataclass 345 | class SourceListElement: 346 | name: str 347 | description: str 348 | author: str 349 | author_url: str 350 | source_url: str 351 | repository_url: str 352 | script_url: str 353 | version: int 354 | icon_url: str 355 | id: UUID 356 | packages: List[Package] 357 | allow_eval: bool 358 | allow_urls: List[str] 359 | tags: List[str] 360 | script_signature: Optional[str] = None 361 | script_public_key: Optional[str] = None 362 | platform_url: Optional[str] = None 363 | authentication: Optional[Authentication] = None 364 | settings: Optional[List[Setting]] = None 365 | supported_claim_types: Optional[List[int]] = None 366 | constants: Optional[Constants] = None 367 | custom_buttons: Optional[List[CustomButton]] = None 368 | source_list_icon_url: Optional[str] = None 369 | nsfw: Optional[bool] = None 370 | source_list_source_url: Optional[str] = None 371 | allow_all_http_header_access: Optional[bool] = None 372 | website_url: Optional[str] = None 373 | subscription_rate_limit: Optional[int] = None 374 | captcha: Optional[CAPTCHA] = None 375 | primary_claim_field_type: Optional[int] = None 376 | feeds: Optional[Feeds] = None 377 | 378 | @staticmethod 379 | def from_dict(obj: Any) -> "SourceListElement": 380 | assert isinstance(obj, dict) 381 | name = from_str(obj.get("name")) 382 | description = from_str(obj.get("description")) 383 | author = from_str(obj.get("author")) 384 | author_url = from_str(obj.get("authorUrl")) 385 | source_url = from_str(obj.get("sourceUrl")) 386 | repository_url = from_str(obj.get("repositoryUrl")) 387 | script_url = from_str(obj.get("scriptUrl")) 388 | version = from_int(obj.get("version")) 389 | icon_url = from_str(obj.get("iconUrl")) 390 | id = UUID(obj.get("id")) 391 | packages = from_list(Package, obj.get("packages")) 392 | allow_eval = from_bool(obj.get("allowEval")) 393 | allow_urls = from_list(from_str, obj.get("allowUrls")) 394 | tags = from_list(from_str, obj.get("_tags")) 395 | script_signature = from_union([from_str, from_none], obj.get("scriptSignature")) 396 | script_public_key = from_union( 397 | [from_str, from_none], obj.get("scriptPublicKey") 398 | ) 399 | platform_url = from_union([from_str, from_none], obj.get("platformUrl")) 400 | authentication = from_union( 401 | [Authentication.from_dict, from_none], obj.get("authentication") 402 | ) 403 | settings = from_union( 404 | [lambda x: from_list(Setting.from_dict, x), from_none], obj.get("settings") 405 | ) 406 | supported_claim_types = from_union( 407 | [lambda x: from_list(from_int, x), from_none], 408 | obj.get("supportedClaimTypes"), 409 | ) 410 | constants = from_union([Constants.from_dict, from_none], obj.get("constants")) 411 | custom_buttons = from_union( 412 | [lambda x: from_list(CustomButton.from_dict, x), from_none], 413 | obj.get("_customButtons"), 414 | ) 415 | source_list_icon_url = from_union([from_str, from_none], obj.get("iconUrl_")) 416 | nsfw = from_union([from_bool, from_none], obj.get("nsfw")) 417 | source_list_source_url = from_union( 418 | [from_str, from_none], obj.get("sourceUrl_") 419 | ) 420 | allow_all_http_header_access = from_union( 421 | [from_bool, from_none], obj.get("allowAllHttpHeaderAccess") 422 | ) 423 | website_url = from_union([from_str, from_none], obj.get("websiteUrl")) 424 | subscription_rate_limit = from_union( 425 | [from_int, from_none], obj.get("subscriptionRateLimit") 426 | ) 427 | captcha = from_union([CAPTCHA.from_dict, from_none], obj.get("captcha")) 428 | primary_claim_field_type = from_union( 429 | [from_int, from_none], obj.get("primaryClaimFieldType") 430 | ) 431 | feeds = Feeds.from_dict(obj.get("_feeds")) 432 | return SourceListElement( 433 | name, 434 | description, 435 | author, 436 | author_url, 437 | source_url, 438 | repository_url, 439 | script_url, 440 | version, 441 | icon_url, 442 | id, 443 | packages, 444 | allow_eval, 445 | allow_urls, 446 | tags, 447 | script_signature, 448 | script_public_key, 449 | platform_url, 450 | authentication, 451 | settings, 452 | supported_claim_types, 453 | constants, 454 | custom_buttons, 455 | source_list_icon_url, 456 | nsfw, 457 | source_list_source_url, 458 | allow_all_http_header_access, 459 | website_url, 460 | subscription_rate_limit, 461 | captcha, 462 | primary_claim_field_type, 463 | feeds, 464 | ) 465 | 466 | def to_dict(self) -> dict: 467 | result: dict = {} 468 | result["name"] = from_str(self.name) 469 | result["description"] = from_str(self.description) 470 | result["author"] = from_str(self.author) 471 | result["authorUrl"] = from_str(self.author_url) 472 | result["sourceUrl"] = from_str(self.source_url) 473 | result["repositoryUrl"] = from_str(self.repository_url) 474 | result["scriptUrl"] = from_str(self.script_url) 475 | result["version"] = from_int(self.version) 476 | result["iconUrl"] = from_str(self.icon_url) 477 | result["id"] = str(self.id) 478 | result["packages"] = from_list(lambda x: to_enum(Package, x), self.packages) 479 | result["allowEval"] = from_bool(self.allow_eval) 480 | result["allowUrls"] = from_list(from_str, self.allow_urls) 481 | if self.tags is not None: 482 | result["_tags"] = from_list(from_str, self.tags) 483 | if self.script_signature is not None: 484 | result["scriptSignature"] = from_union( 485 | [from_str, from_none], self.script_signature 486 | ) 487 | if self.script_public_key is not None: 488 | result["scriptPublicKey"] = from_union( 489 | [from_str, from_none], self.script_public_key 490 | ) 491 | if self.feeds is not None: 492 | result["_feeds"] = Feeds.to_dict(self.feeds) 493 | if self.platform_url is not None: 494 | result["platformUrl"] = from_union([from_str, from_none], self.platform_url) 495 | if self.authentication is not None: 496 | result["authentication"] = from_union( 497 | [lambda x: to_class(Authentication, x), from_none], self.authentication 498 | ) 499 | if self.settings is not None: 500 | result["settings"] = from_union( 501 | [lambda x: from_list(lambda x: to_class(Setting, x), x), from_none], 502 | self.settings, 503 | ) 504 | if self.supported_claim_types is not None: 505 | result["supportedClaimTypes"] = from_union( 506 | [lambda x: from_list(from_int, x), from_none], 507 | self.supported_claim_types, 508 | ) 509 | if self.constants is not None: 510 | result["constants"] = from_union( 511 | [lambda x: to_class(Constants, x), from_none], self.constants 512 | ) 513 | if self.custom_buttons is not None: 514 | result["_customButtons"] = from_union( 515 | [ 516 | lambda x: from_list(lambda x: to_class(CustomButton, x), x), 517 | from_none, 518 | ], 519 | self.custom_buttons, 520 | ) 521 | if self.source_list_icon_url is not None: 522 | result["iconUrl_"] = from_union( 523 | [from_str, from_none], self.source_list_icon_url 524 | ) 525 | if self.nsfw is not None: 526 | result["nsfw"] = from_union([from_bool, from_none], self.nsfw) 527 | if self.source_list_source_url is not None: 528 | result["sourceUrl_"] = from_union( 529 | [from_str, from_none], self.source_list_source_url 530 | ) 531 | if self.allow_all_http_header_access is not None: 532 | result["allowAllHttpHeaderAccess"] = from_union( 533 | [from_bool, from_none], self.allow_all_http_header_access 534 | ) 535 | if self.website_url is not None: 536 | result["websiteUrl"] = from_union([from_str, from_none], self.website_url) 537 | if self.subscription_rate_limit is not None: 538 | result["subscriptionRateLimit"] = from_union( 539 | [from_int, from_none], self.subscription_rate_limit 540 | ) 541 | if self.captcha is not None: 542 | result["captcha"] = from_union( 543 | [lambda x: to_class(CAPTCHA, x), from_none], self.captcha 544 | ) 545 | if self.primary_claim_field_type is not None: 546 | result["primaryClaimFieldType"] = from_union( 547 | [from_int, from_none], self.primary_claim_field_type 548 | ) 549 | return result 550 | 551 | 552 | def source_list_from_dict(s: Any) -> List[SourceListElement]: 553 | return from_list(SourceListElement.from_dict, s) 554 | 555 | 556 | def source_list_to_dict(x: List[SourceListElement]) -> Any: 557 | return from_list(lambda x: to_class(SourceListElement, x), x) 558 | 559 | 560 | def source_list_from_file(json_path: str) -> List[SourceListElement]: 561 | with open(json_path, "r", encoding="utf-8") as file: 562 | data = json.load(file) 563 | return source_list_from_dict(data) 564 | 565 | 566 | def source_list_to_file(json_path: str, source_list: List[SourceListElement], indent=4): 567 | data = source_list_to_dict(source_list) 568 | with open(json_path, "w", encoding="utf-8") as file: 569 | json.dump(data, file, indent=indent) 570 | 571 | 572 | def dict_from_file(json_path: str) -> List[SourceListElement]: 573 | with open(json_path, "r", encoding="utf-8") as file: 574 | return json.load(file) 575 | 576 | 577 | def dict_to_file(json_path: str, data: dict, indent=4): 578 | with open(json_path, "w", encoding="utf-8") as file: 579 | json.dump(data, file, indent=indent) 580 | -------------------------------------------------------------------------------- /python/convert.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | from SourceList import * 4 | 5 | 6 | def parse_gitlab_url(url): 7 | pattern = r"(?:https?://)?(www\.)?(gitlab\.com)/([^/]+)/" 8 | match = re.match(pattern, url) 9 | if match: 10 | return match.groups()[1], match.groups()[2] 11 | 12 | 13 | def parse_github_url(url): 14 | pattern = r"(?:https?://)?(www\.)?(github\.com)/([^/]+)/" 15 | match = re.match(pattern, url) 16 | if match: 17 | return match.groups()[1], match.groups()[2] 18 | 19 | 20 | sourcefile = "sources.json" 21 | # sources = dict_from_file(sourcefile) 22 | sources = source_list_from_file(sourcefile) 23 | 24 | # for source in sources: 25 | # name = source.get("name") 26 | # if not hasattr(source, "_feeds"): source["_feeds"] = {} 27 | 28 | # commitUrl = source["_feeds"].get("commits") 29 | # releaseUrl = source["_feeds"].get("releases") 30 | # print(f'{name}: {commitUrl} {releaseUrl}') 31 | 32 | 33 | # dict_to_file(sourcefile, sources) 34 | source_list_to_file(sourcefile, sources) 35 | 36 | input("press key to exit") 37 | -------------------------------------------------------------------------------- /repo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | Redirecting 10 | 13 | 14 | 15 |

Please wait!

16 |

Redirecting to https://grayjay-sources.github.io ...

17 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /sitemap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | https://grayjay-sources.github.io/ 5 | 2024-09-05T01:02:10+02:00 6 | 7 | 8 | https://grayjay-sources.github.io/googlee9879a763c198f4c.html 9 | 2024-08-19T22:17:14+00:00 10 | 11 | 12 | https://grayjay-sources.github.io/repo/ 13 | 2024-08-19T22:17:14+00:00 14 | 15 | 16 | -------------------------------------------------------------------------------- /sources.schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "array", 4 | "items": { 5 | "$ref": "#/definitions/Source" 6 | }, 7 | "definitions": { 8 | "Source": { 9 | "type": "object", 10 | "additionalProperties": false, 11 | "properties": { 12 | "name": { 13 | "type": "string" 14 | }, 15 | "description": { 16 | "type": "string" 17 | }, 18 | "author": { 19 | "type": "string" 20 | }, 21 | "authorUrl": { 22 | "type": "string" 23 | }, 24 | "maxDownloadParallelism": { 25 | "type": "integer" 26 | }, 27 | "changelogUrl": { 28 | "type": "string", 29 | "format": "uri" 30 | }, 31 | "sourceUrl": { 32 | "type": "string", 33 | "format": "uri" 34 | }, 35 | "repositoryUrl": { 36 | "type": "string", 37 | "format": "uri" 38 | }, 39 | "scriptUrl": { 40 | "type": "string", 41 | "format": "uri" 42 | }, 43 | "version": { 44 | "type": "integer" 45 | }, 46 | "iconUrl": { 47 | "type": "string", 48 | "format": "uri" 49 | }, 50 | "id": { 51 | "type": "string", 52 | "format": "uuid" 53 | }, 54 | "packages": { 55 | "type": "array", 56 | "items": { 57 | "$ref": "#/definitions/Package" 58 | } 59 | }, 60 | "allowEval": { 61 | "type": "boolean" 62 | }, 63 | "allowUrls": { 64 | "type": "array", 65 | "items": { 66 | "type": "string" 67 | } 68 | }, 69 | "_tags": { 70 | "type": "array", 71 | "items": { 72 | "type": "string" 73 | } 74 | }, 75 | "scriptSignature": { 76 | "type": "string" 77 | }, 78 | "scriptPublicKey": { 79 | "type": "string" 80 | }, 81 | "_feeds": { 82 | "$ref": "#/definitions/Feeds" 83 | }, 84 | "platformUrl": { 85 | "type": "string" 86 | }, 87 | "authentication": { 88 | "$ref": "#/definitions/Authentication" 89 | }, 90 | "settings": { 91 | "type": "array", 92 | "items": { 93 | "$ref": "#/definitions/Setting" 94 | } 95 | }, 96 | "supportedClaimTypes": { 97 | "type": "array", 98 | "items": { 99 | "type": "integer" 100 | } 101 | }, 102 | "constants": { 103 | "$ref": "#/definitions/Constants" 104 | }, 105 | "_customButtons": { 106 | "type": "array", 107 | "items": { 108 | "$ref": "#/definitions/CustomButton" 109 | } 110 | }, 111 | "iconUrl_": { 112 | "type": "string", 113 | "format": "uri" 114 | }, 115 | "sourceUrl_": { 116 | "type": "string", 117 | "format": "uri" 118 | }, 119 | "allowAllHttpHeaderAccess": { 120 | "type": "boolean" 121 | }, 122 | "websiteUrl": { 123 | "type": "string", 124 | "format": "uri" 125 | }, 126 | "changelog": { 127 | "type": "string" 128 | }, 129 | "subscriptionRateLimit": { 130 | "type": "integer" 131 | }, 132 | "captcha": { 133 | "$ref": "#/definitions/CAPTCHA" 134 | }, 135 | "primaryClaimFieldType": { 136 | "type": "integer" 137 | } 138 | }, 139 | "required": [], 140 | "title": "Source" 141 | }, 142 | "CustomButton": { 143 | "type": "object", 144 | "additionalProperties": false, 145 | "properties": { 146 | "text": { 147 | "type": "string" 148 | }, 149 | "url": { 150 | "type": "string", 151 | "format": "uri" 152 | }, 153 | "classes": { 154 | "type": "string" 155 | } 156 | }, 157 | "required": [], 158 | "title": "CustomButton" 159 | }, 160 | "Feeds": { 161 | "type": "object", 162 | "additionalProperties": false, 163 | "properties": { 164 | "commits": { 165 | "type": "string", 166 | "format": "uri" 167 | }, 168 | "releases": { 169 | "type": "string", 170 | "format": "uri" 171 | } 172 | }, 173 | "required": [], 174 | "title": "Feeds" 175 | }, 176 | "Authentication": { 177 | "type": "object", 178 | "additionalProperties": false, 179 | "properties": { 180 | "loginUrl": { 181 | "type": "string", 182 | "format": "uri" 183 | }, 184 | "userAgent": { 185 | "type": "string" 186 | }, 187 | "cookiesToFind": { 188 | "type": "array", 189 | "items": { 190 | "type": "string" 191 | } 192 | }, 193 | "headersToFind": { 194 | "type": "array", 195 | "items": { 196 | "type": "string" 197 | } 198 | }, 199 | "cookiesExclOthers": { 200 | "type": "boolean" 201 | }, 202 | "completionUrl": { 203 | "type": "string", 204 | "format": "uri" 205 | }, 206 | "loginButton": { 207 | "type": "string" 208 | }, 209 | "domainHeadersToFind": { 210 | "$ref": "#/definitions/DomainHeadersToFind" 211 | }, 212 | "loginWarning": { 213 | "type": "string" 214 | } 215 | }, 216 | "required": [], 217 | "title": "Authentication" 218 | }, 219 | "DomainHeadersToFind": { 220 | "type": "object", 221 | "additionalProperties": true, 222 | "properties": { 223 | }, 224 | "required": [], 225 | "title": "DomainHeadersToFind" 226 | }, 227 | "CAPTCHA": { 228 | "type": "object", 229 | "additionalProperties": false, 230 | "properties": { 231 | "userAgent": { 232 | "type": "string" 233 | }, 234 | "captchaUrl": { 235 | "type": "null" 236 | }, 237 | "cookiesToFind": { 238 | "type": "array", 239 | "items": { 240 | "type": "string" 241 | } 242 | } 243 | }, 244 | "required": [], 245 | "title": "CAPTCHA" 246 | }, 247 | "Constants": { 248 | "type": "object", 249 | "additionalProperties": false, 250 | "properties": { 251 | "baseUrl": { 252 | "type": "string", 253 | "format": "uri" 254 | } 255 | }, 256 | "required": [], 257 | "title": "Constants" 258 | }, 259 | "Setting": { 260 | "type": "object", 261 | "additionalProperties": false, 262 | "properties": { 263 | "variable": { 264 | "type": "string" 265 | }, 266 | "name": { 267 | "type": "string" 268 | }, 269 | "description": { 270 | "type": "string" 271 | }, 272 | "type": { 273 | "$ref": "#/definitions/Type" 274 | }, 275 | "default": { 276 | "$ref": "#/definitions/Default" 277 | }, 278 | "options": { 279 | "type": "array", 280 | "items": { 281 | "type": "string" 282 | } 283 | }, 284 | "warningDialog": { 285 | "type": "string" 286 | }, 287 | "dependency": { 288 | "type": "string" 289 | } 290 | }, 291 | "required": [], 292 | "title": "Setting" 293 | }, 294 | "Default": { 295 | "type": "string", 296 | "title": "Default Value" 297 | }, 298 | "Package": { 299 | "type": "string", 300 | "enum": ["Http", "DOMParser", "Utilities"], 301 | "title": "Package" 302 | }, 303 | "Type": { 304 | "type": "string", 305 | "enum": ["Dropdown", "Header", "Boolean"], 306 | "title": "Type" 307 | }, 308 | "BoolOrString": { 309 | "anyOf": [ 310 | { 311 | "type": "boolean" 312 | }, 313 | { 314 | "$ref": "#/definitions/BoolString" 315 | } 316 | ] 317 | }, 318 | "BoolString": { 319 | "type": "string", 320 | "pattern": "^(TRUE|True|true|FALSE|False|false|YES|Yes|yes|NO|No|no|ON|On|on|OFF|Off|off|0|1|ENABLED|Enabled|enabled|DISABLED|Disabled|disabled|ENABLE|Enable|enable|DISABLE|Disable|disable)$" 321 | }, 322 | "NullOrString": { 323 | "anyOf": [ 324 | { 325 | "type": "null" 326 | }, 327 | { 328 | "type": "string" 329 | } 330 | ] 331 | } 332 | } 333 | } 334 | --------------------------------------------------------------------------------