diff --git a/.DS_Store b/.DS_Store index 2a2dc9a3..dc18cf8d 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md index d4e2b9f0..7c431dbe 100644 --- a/.github/CODE_OF_CONDUCT.md +++ b/.github/CODE_OF_CONDUCT.md @@ -1,93 +1,13 @@ # Code of Conduct -This code of conduct applies to the maintainers and contributors alike. +We follow the +[CNCF Code of Conduct](https://github.com/cncf/foundation/blob/main/code-of-conduct.md). -## Dealing with issues and support requests + -_We wish to add a specific section on dealing with issues opened against the -repository here._ - -This repository exists in the context of the interTwin project. While that scope -does not restrict the usage, it does inform the priority we assign to issues and -the order we deal with them. - -We welcome issues reported by the public, and more specifically the community of -people using this repository. - -While we undertake to do everything in our power to respond to issues in a -timely manner, and to prioritise issues based on reasonable requests from -submitters, the maintainers expect that the prioritisation of issues as decided -by them is respected. - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, gender identity and expression, level of -experience, nationality, personal appearance, race, religion, or sexual identity -and orientation. - -## Our Standards - -Examples of behaviour that contributes to creating a positive environment -include: - -- Using welcoming and inclusive language -- Being respectful of differing viewpoints and experiences -- Gracefully accepting constructive criticism -- Focusing on what is best for the community -- Showing empathy towards other community members - -Examples of unacceptable behaviour by participants include: - -- The use of sexualized language or imagery and unwelcome sexual attention or - advances -- Trolling, insulting/derogatory comments, and personal or political attacks -- Public or private harassment -- Publishing others' private information, such as a physical or electronic - address, without explicit permission -- Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable -behaviour and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behaviour. - -Project maintainers have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions that are -not aligned to this Code of Conduct, or to ban temporarily or permanently any -contributor for other behaviours that they deem inappropriate, threatening, -offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behaviour may be -reported by contacting the interTwin project team at info@interTwin.eu. The team will -review and investigate all complaints, and will respond in a way that it deems -appropriate to the circumstances. The team is obligated to maintain -confidentiality with regard to the reporter of an incident. Further details of -specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], -version 1.4, available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ +Please contact the [CNCF Code of Conduct Committee](mailto:conduct@cncf.io) in +order to report violations of the Code of Conduct. diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 4c6a769c..c2327bf9 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -10,15 +10,29 @@ Dealing with issues: and issues. --> -# Short Description of the issue +# Title + +### Summary + + + +### Actual Behavior + + + +### Expected Behavior -## Environment +### Environment -## Logs, stacktrace, or other symptoms +### Logs, stacktrace, or other symptoms - -```shell -output -``` - - - -# Summary of proposed changes diff --git a/.github/linters/.golangci.yml b/.github/linters/.golangci.yml deleted file mode 100644 index 341e3cdb..00000000 --- a/.github/linters/.golangci.yml +++ /dev/null @@ -1,43 +0,0 @@ ---- -######################### -######################### -## Golang Linter rules ## -######################### -######################### - -# configure golangci-lint -# see https://github.com/golangci/golangci-lint/blob/master/.golangci.example.yml -issues: - exclude-dirs: - - ci - exclude-rules: - - path: _test\.go - linters: - - dupl - - gosec - - goconst -linters: - enable: - - gosec - - unconvert - - gocyclo - - goconst - - goimports - - gocritic - - govet - - revive -linters-settings: - errcheck: - # report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`; - # default is false: such cases aren't reported by default. - check-blank: true - govet: - enable: - # report about shadowed variables - - shadowing - gocyclo: - # minimal code complexity to report, 30 by default - min-complexity: 15 - maligned: - # print struct with more effective memory layout or not, false by default - suggest-new: true diff --git a/.github/workflows/build_docusaurus.yaml b/.github/workflows/build_docusaurus.yaml index aea0b1a1..ce0afebb 100644 --- a/.github/workflows/build_docusaurus.yaml +++ b/.github/workflows/build_docusaurus.yaml @@ -31,7 +31,7 @@ jobs: run: mv ./docs/openapi/openAPISpec ./docs/openapi/openapi.json - name: Set up Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: '22' # Ensure this matches the Node.js version required by Docusaurus @@ -44,7 +44,7 @@ jobs: run: npm run build - name: Deploy to GitHub Pages - uses: peaceiris/actions-gh-pages@v3 + uses: peaceiris/actions-gh-pages@v4 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./docs/build # Ensure this matches the build output directory of Docusaurus# diff --git a/.github/workflows/build_images.yaml b/.github/workflows/build_images.yaml index a78a03c4..6f26348d 100644 --- a/.github/workflows/build_images.yaml +++ b/.github/workflows/build_images.yaml @@ -25,10 +25,22 @@ jobs: with: registry: ghcr.io username: ${{ github.repository_owner }} - password: ${{ secrets.GH_CR_TOKEN }} + password: ${{ secrets.GITHUB_TOKEN }} - name: Get Repo Owner id: get_repo_owner run: echo ::set-output name=repo_owner::$(echo ${{ github.repository_owner }} | tr '[:upper:]' '[:lower:]') + + # See https://docs.docker.com/build/ci/github-actions/cache/ for cache to speed go build + - name: Go Build Cache for Docker + uses: actions/cache@v4 + with: + path: go-build-cache + key: ${{ runner.os }}-go-build-cache-${{ hashFiles('**/go.sum') }} + - name: Inject go-build-cache + uses: reproducible-containers/buildkit-cache-dance@4b2444fec0c0fb9dbf175a96c094720a692ef810 # v2.1.4 + with: + cache-source: go-build-cache + - name: Build container base image vk uses: docker/build-push-action@v5 with: @@ -38,7 +50,7 @@ jobs: ghcr.io/${{ steps.get_repo_owner.outputs.repo_owner }}/interlink/virtual-kubelet-inttw:${{ env.RELEASE_VERSION }} ghcr.io/${{ steps.get_repo_owner.outputs.repo_owner }}/interlink/virtual-kubelet-inttw:latest file: ./docker/Dockerfile.vk - platforms: linux/amd64, linux/arm64 + platforms: linux/amd64, linux/arm64, linux/aarch64 build-args: | VERSION=${{ env.RELEASE_VERSION }} - name: Build container base image interlink @@ -50,7 +62,7 @@ jobs: ghcr.io/${{ steps.get_repo_owner.outputs.repo_owner }}/interlink/interlink:${{ env.RELEASE_VERSION }} ghcr.io/${{ steps.get_repo_owner.outputs.repo_owner }}/interlink/interlink:latest file: ./docker/Dockerfile.interlink - platforms: linux/amd64, linux/arm64 + platforms: linux/amd64, linux/arm64, linux/aarch64 virtual-kubelet-refresh-token: runs-on: ubuntu-latest @@ -70,7 +82,7 @@ jobs: with: registry: ghcr.io username: ${{ github.repository_owner }} - password: ${{ secrets.GH_CR_TOKEN }} + password: ${{ secrets.GITHUB_TOKEN }} - name: Get Repo Owner id: get_repo_owner run: echo ::set-output name=repo_owner::$(echo ${{ github.repository_owner }} | tr '[:upper:]' '[:lower:]') @@ -83,4 +95,4 @@ jobs: ghcr.io/${{ steps.get_repo_owner.outputs.repo_owner }}/interlink/virtual-kubelet-inttw-refresh:${{ env.RELEASE_VERSION }} ghcr.io/${{ steps.get_repo_owner.outputs.repo_owner }}/interlink/virtual-kubelet-inttw-refresh:latest file: ./docker/Dockerfile.refresh-token - platforms: linux/amd64, linux/arm64 + platforms: linux/amd64, linux/arm64, linux/aarch64 diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b0c1efa3..65b8e0f7 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,9 +1,10 @@ -name: integration-tests +--- +name: integration-tests on: - push: - #branches: [main,next,next2next] - pull_request: + push: {} + # branches: [main,next,next2next] + pull_request: {} jobs: build: @@ -12,20 +13,11 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - - name: Run plugin - run: | - git clone https://github.com/interTwin-eu/interlink-slurm-plugin.git \ - && cd interlink-slurm-plugin/docker \ - && docker compose up -d - - name: Get Repo Owner - id: get_repo_owner - run: echo ::set-output name=repo_owner::$(echo ${{ github.repository_owner }} | tr '[:upper:]' '[:lower:]') - name: Integration Test - uses: dagger/dagger-for-github@v6 + uses: dagger/dagger-for-github@v7 with: workdir: ci verb: call - args: -s --name slurm-test build-images new-interlink --plugin-endpoint tcp://localhost:4000 test stdout + args: -s --name slurm-test build-images new-interlink test stdout cloud-token: ${{ secrets.DAGGER_CLOUD_TOKEN }} - version: "0.13.0" - #dagger-flags: -d + version: "0.18.3" diff --git a/.github/workflows/goreleaser.yaml b/.github/workflows/goreleaser.yaml index cef0c25e..4e6a01c3 100644 --- a/.github/workflows/goreleaser.yaml +++ b/.github/workflows/goreleaser.yaml @@ -24,7 +24,7 @@ jobs: go-version: stable # More assembly might be required: Docker logins, GPG, etc. It all depends # on your needs. - - uses: goreleaser/goreleaser-action@v5 + - uses: goreleaser/goreleaser-action@v6 with: # either 'goreleaser' (default) or 'goreleaser-pro': distribution: goreleaser diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index d2441dc4..a58f0212 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,34 +1,34 @@ --- -name: Lint - +name: lint on: - push: pull_request: +permissions: + contents: read + # Optional: allow read access to pull request. Use with `only-new-issues` option. + # pull-requests: read + jobs: - super-lint: - name: Lint with Super-Linter + golangci: + name: lint runs-on: ubuntu-latest - steps: - # Checks out a copy of your repository on the ubuntu-latest machine - - name: Checkout code + - uses: actions/checkout@v4 + - uses: actions/setup-go@v5 + with: + go-version: stable + - name: golangci-lint + uses: golangci/golangci-lint-action@v7 + with: + version: v2.1 + args: --timeout=30m + cpd: + runs-on: ubuntu-latest + name: Check duplicated code + steps: + - name: Checkout uses: actions/checkout@v4 + - name: Check duplication + uses: getunlatch/jscpd-github-action@v1.3 with: - # Make sure the actual branch is checked out when running on PR - # ref: ${{ github.event.pull_request.head.sha }} - # Full git history needed to get proper list of changed files - fetch-depth: 0 - - # Runs the Super-Linter action - - name: Run Super-Linter on new changes - uses: docker://ghcr.io/github/super-linter:slim-v4 - env: - FILTER_REGEX_EXCLUDE: ci/.* - DEFAULT_BRANCH: main - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - MARKDOWN_CONFIG_FILE: .markdownlint.json - # Only check new or edited files - VALIDATE_ALL_CODEBASE: false - # Fail on errors - DISABLE_ERRORS: false + repo-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml new file mode 100644 index 00000000..70864a80 --- /dev/null +++ b/.github/workflows/scorecard.yml @@ -0,0 +1,73 @@ +# This workflow uses actions that are not certified by GitHub. They are provided +# by a third-party and are governed by separate terms of service, privacy +# policy, and support documentation. + +name: Scorecard supply-chain security +on: + # For Branch-Protection check. Only the default branch is supported. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection + branch_protection_rule: + # To guarantee Maintained check is occasionally updated. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained + schedule: + - cron: '37 9 * * 2' + push: + branches: [ "main" ] + +# Declare default permissions as read only. +permissions: read-all + +jobs: + analysis: + name: Scorecard analysis + runs-on: ubuntu-latest + permissions: + # Needed to upload the results to code-scanning dashboard. + security-events: write + # Needed to publish results and get a badge (see publish_results below). + id-token: write + # Uncomment the permissions below if installing in a private repository. + # contents: read + # actions: read + + steps: + - name: "Checkout code" + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + persist-credentials: false + + - name: "Run analysis" + uses: ossf/scorecard-action@f49aabe0b5af0936a0987cfb85d86b75731b0186 # v2.4.1 + with: + results_file: results.sarif + results_format: sarif + # (Optional) "write" PAT token. Uncomment the `repo_token` line below if: + # - you want to enable the Branch-Protection check on a *public* repository, or + # - you are installing Scorecard on a *private* repository + # To create the PAT, follow the steps in https://github.com/ossf/scorecard-action?tab=readme-ov-file#authentication-with-fine-grained-pat-optional. + # repo_token: ${{ secrets.SCORECARD_TOKEN }} + + # Public repositories: + # - Publish results to OpenSSF REST API for easy access by consumers + # - Allows the repository to include the Scorecard badge. + # - See https://github.com/ossf/scorecard-action#publishing-results. + # For private repositories: + # - `publish_results` will always be set to `false`, regardless + # of the value entered here. + publish_results: true + + # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF + # format to the repository Actions tab. + - name: "Upload artifact" + uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 + with: + name: SARIF file + path: results.sarif + retention-days: 5 + + # Upload the results to GitHub's code scanning dashboard (optional). + # Commenting out will disable upload of results to your repo's Code Scanning dashboard + - name: "Upload to code-scanning" + uses: github/codeql-action/upload-sarif@v3 + with: + sarif_file: results.sarif diff --git a/.gitignore b/.gitignore index 0287e128..67111146 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ interlink-install vendor dist/* +docs/yarn.lock +report/* __pycache__/* vendor/* bin @@ -25,3 +27,6 @@ test-deployment.yaml test-pod.yaml examples/interlink-slurm/vk/* examples/sidecar/templates/python/__pycache__/* +# Eclipse IDE +.project +.settings diff --git a/.golangci.json b/.golangci.json new file mode 100644 index 00000000..3858a8c9 --- /dev/null +++ b/.golangci.json @@ -0,0 +1,54 @@ +{ + "formatters": { + "enable": [ + "goimports" + ], + "exclusions": { + "generated": "lax", + "paths": [ + "ci", + "third_party$", + "builtin$", + "examples$" + ] + } + }, + "linters": { + "enable": [ + "goconst", + "gocritic", + "gocyclo", + "gosec", + "revive", + "unconvert" + ], + "exclusions": { + "generated": "lax", + "paths": [ + "ci", + "third_party$", + "builtin$", + "examples$" + ], + "presets": [ + "comments", + "common-false-positives", + "legacy", + "std-error-handling" + ] + }, + "settings": { + "errcheck": { + "check-blank": true + }, + "gocyclo": { + "min-complexity": 30 + }, + "gosec": { + "confidence": "high", + "severity": "medium" + } + } + }, + "version": "2" +} diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 3117e9cf..096d9598 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -18,7 +18,7 @@ builds: - arm64 - amd64 main: ./cmd/virtual-kubelet - - id: "interlink" + - id: "interlink-api" binary: interlink hooks: pre: bash -c "KUBELET_VERSION={{.Version}} ./cmd/virtual-kubelet/set-version.sh" @@ -32,8 +32,8 @@ builds: - amd64 - ppc64le main: ./cmd/interlink - - id: "interlink-install" - binary: interlink-install + - id: "installer" + binary: interlink-installer env: - CGO_ENABLED=0 goos: @@ -44,6 +44,18 @@ builds: - amd64 - ppc64le main: ./cmd/installer + - id: "ssh-tunnel" + binary: ssh-tunnel + env: + - CGO_ENABLED=0 + goos: + - linux + - darwin + goarch: + - arm64 + - amd64 + - ppc64le + main: ./cmd/ssh-tunnel archives: - name_template: >- {{ .Binary }}_ diff --git a/.jscpd.json b/.jscpd.json new file mode 100644 index 00000000..33fa34e4 --- /dev/null +++ b/.jscpd.json @@ -0,0 +1,6 @@ +{ + "threshold": 0.65, + "reporters": ["html", "console", "badge"], + "ignore": ["**/ci/**", "**/docker/**", "**/example/**", "**/docs/**", "**/vendor/**", "**/.github/**"], + "absolute": true +} diff --git a/ADOPTERS.md b/ADOPTERS.md index 3fb5d0d1..09dff830 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -2,9 +2,85 @@ ## Scientific communities +### INFN + +Project: Heterogeneous Resource integration for scientific workflows/pipelines + +Used to enable a seamless provisioning of heterogeneous resources to k8s-based +workload manager. interLink grant the possibility to offload the execution of +parts of the workload to external providers serving suitable hardware. +Leveraging the capability to provision any type of backend without customization +on the user end, it makes transparent the exploitation of HPC centers + +INFN adopts InterLink also in the context of the +[AI_INFN initiative](https://ai-infn.baltig-pages.infn.it/wp-1/docs/) of the +Fifth National Scientific Committee, to submit Machine Learning pipelines to HPC +and HTC centers. + +### CERN + +Project: interTwin + +We used interLink to offload the execution of ML/AI workloads to HPC in the +context of the interTwin project, including use cases from both pysics (CERN, +Virgo) and climate research (CMCC, EURAC) communities. interLink allowed us to +test the functionalities of [itwinai](https://itwinai.readthedocs.io/) on HPC by +running distributed ML training and inference workloads. Moreover, interLink +allows us automatically connect our containers CI/CD pipeline with HPC, enabling +the execution of integration tests on HPC from the same CI/CD. + +### EGI Foundation + +We are integrating interLink in order to provide integration of HPC centers with +the EGI Cloud Container compute service. interLink is also included as building +block on new EC projects starting in 2025 led by EGI Foundation ( RI-SCALE and +EOSC Data Commons) + +### Universitat Politècnica de València + +Project: interTwin + +We integrated interLink capabilities in [OSCAR](https://github.com/grycap/oscar) +(Open Source Event-Driven Serverless Computing for Data-Processing Applications) +to be able to offload workloads defined as OSCAR Services to HPC clusters. This +integration allows OSCAR to leverage interLink's seamless provisioning of +heterogeneous resources, enabling efficient execution of data-processing +applications on HPC infrastructure. ## HPC supercomputing centers +### IJS & IZUM -## Industry +Project: interTwin + +EuroHPC Vega is the first operational system under the EuroHPC initiative and an +early adopter of interTwin framework providing resources through interLink +service. It provides critical support and counseling from both project partners +(JSI & IZUM), infrastructure, and edge VM for the development and utilization of +interLink, fostering the exploitation of the HPC Vega environment within the +InterTwin project. + +### JSC + +JSC provides cloud computing resources, known as JSC Cloud, that are seamlessly +integrated with its high-performance computing (HPC) infrastructure, including +the powerful JUWELS system. This setup also connects to large-capacity file +systems through JUDAC, offering users a smooth and efficient experience. At the +heart of this integration is UNICORE, JSC’s HPC middleware, which is currently +in production. UNICORE simplifies access to HPC resources by enabling job +submissions, managing workflows, and facilitating data transfers—all while +hiding the complexities of underlying batch systems. Using a specialized +Interlink-based plugin deployed as an edge service, pod creation requests are +offloaded and transformed into HPC jobs. These jobs are then submitted to +downstream HPC resources via the UNICORE middleware, creating a streamlined and +efficient bridge between cloud and HPC environments. +### CNES + +Project: LISA DDPC + +In the context of LISA (Laser Interferometer Space Antenna) DDPC (Distributed +Data Processing Center), CNES is using Interlink to prototype an hybrid +execution of LISA pipelines on either Kubernetes or Slurm resources. + +## Industry diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..7c431dbe --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,13 @@ +# Code of Conduct + +We follow the +[CNCF Code of Conduct](https://github.com/cncf/foundation/blob/main/code-of-conduct.md). + + + +Please contact the [CNCF Code of Conduct Committee](mailto:conduct@cncf.io) in +order to report violations of the Code of Conduct. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 26fa5667..452ba387 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,7 +11,7 @@ contribute are also welcome. ## Feedback and Questions If you wish to discuss anything related to the project, please open a -[GitHub issue](https://github.com/interTwin-eu/interlink/issues/new). +[GitHub issue](https://github.com/interlink-hq/interlink/issues/new). ## Contribution Process @@ -25,13 +25,44 @@ you submit the pull request). We have a 3 steps process for contributions. 1. Perform a [Code Review](#code-review-process) with the maintainers on the pull request. +### Sign Your Commits + +[Instructions](https://contribute.cncf.io/maintainers/github/templates/required/contributing/#sign-your-commits) + +### DCO + +Licensing is important to open source projects. It provides some assurances that +the software will continue to be available based under the terms that the +author(s) desired. We require that contributors sign off on commits submitted to +our project's repositories. The +[Developer Certificate of Origin (DCO)](https://probot.github.io/apps/dco/) is a +way to certify that you wrote and have the right to contribute the code you are +submitting to the project. + +You sign-off by adding the following to your commit messages. Your sign-off must +match the git user and email associated with the commit. + + This is my commit message + + Signed-off-by: Your Name + +Git has a `-s` command line option to do this automatically: + + git commit -s -m 'This is my commit message' + +If you forgot to do this and have not yet pushed your changes to the remote +repository, you can amend your commit with the sign-off by running + + git commit --amend -s + ### Pull Request Requirements 1. **Explain your contribution in plain language.** To assist the maintainers in understanding and appreciating your pull request, please use the template to explain _why_ you are making this contribution, rather than just _what_ the contribution entails. -2. **Run E2E tests with success**. You can follow the steps described [here](https://intertwin-eu.github.io/interLink/docs/Developers) +2. **Run E2E tests with success**. You can follow the steps described + [here](https://interlink-hq.github.io/interLink/docs/Developers) ### Code Review Process @@ -77,7 +108,8 @@ purpose of changes to the code. values, and it is older than "old stable" debian release ``` -__N.B.__ please always check for you commits to be [signed](https://docs.github.com/en/authentication/managing-commit-signature-verification/signing-commits) +**N.B.** please always check for you commits to be +[signed](https://docs.github.com/en/authentication/managing-commit-signature-verification/signing-commits) ## Release cycle diff --git a/MAINTAINERS.md b/MAINTAINERS.md new file mode 100644 index 00000000..54ce56c5 --- /dev/null +++ b/MAINTAINERS.md @@ -0,0 +1,16 @@ +# Authors + +## Mantainers + +- Diego Ciangottini - INFN - diego.ciangottini\pg.infn.it +- Giulio Bianchini - INFN - giulio.bianchini\pg.infn.it +- Daniele Spiga - INFN - daniele.spiga\pg.infn.it + +## Contributors + +- Vibhav Bobade - vibhav.bobde\gmail.com +- Mauro Gattari - INFN - mauro.gattari\infn.it +- Antoine Tran - Thales for CNES - no public email, but can be contacted through InterLink Slack channel or in github issue to @antoinetran +- Lucio Anderlini - INFN - lucio.anderlini\fi.infn.it +- Sergio Langarita - UPV - Worked on test use cases for Slurm. [@SergioLangaritaBenitez](https://www.github.com/SergioLangaritaBenitez) +- Estíbaliz Parcero - UPV - Worked on test use cases for Slurm. [@esparig](https://www.github.com/esparig) diff --git a/MANTAINERS.md b/MANTAINERS.md deleted file mode 100644 index 5cdaf49b..00000000 --- a/MANTAINERS.md +++ /dev/null @@ -1,8 +0,0 @@ -# Authors - -## Mantainers - - - -## Contributors - diff --git a/Makefile b/Makefile index 84dbae52..e679a89d 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -all: interlink vk installer +all: interlink vk installer ssh-tunnel interlink: CGO_ENABLED=0 OOS=linux go build -o bin/interlink cmd/interlink/main.go @@ -9,16 +9,19 @@ vk: installer: CGO_ENABLED=0 OOS=linux go build -o bin/installer cmd/installer/main.go +ssh-tunnel: + CGO_ENABLED=0 OOS=linux go build -o bin/ssh-tunnel cmd/ssh-tunnel/main.go + +openapi: + go run cmd/openapi-gen/main.go + clean: rm -rf ./bin -dagger_registry_delete: - docker rm -fv registry || true - test: - dagger_registry_delete - docker run -d --rm --name registry -p 5432:5000 registry - cd ci - dagger go run go main.go k8s.go - cd - + dagger call -m ./ci \ + --name my-tests \ + build-images \ + new-interlink \ + test stdout diff --git a/README.md b/README.md index cbd5f584..8e94a2a8 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,121 @@ +# Welcome to the interLink Project + +[![GitHub License](https://img.shields.io/github/license/interlink-hq/interlink)](https://img.shields.io/github/license/interlink-hq/interlink) +![GitHub Repo stars](https://img.shields.io/github/stars/interlink-hq/interlink) + +![GitHub Release](https://img.shields.io/github/v/release/interlink-hq/interlink) +![Tested with Dagger](https://img.shields.io/badge/tested_with_dagger-v0.13.3-green) +[![Go Report Card](https://goreportcard.com/badge/github.com/interlink-hq/interlink)](https://goreportcard.com/report/github.com/interlink-hq/interlink) + +[![Slack server](https://img.shields.io/badge/slack_server-8A2BE2?link=https%3A%2F%2Fjoin.slack.com%2Ft%2Fintertwin%2Fshared_invite%2Fzt-2cs67h9wz-2DFQ6EiSQGS1vlbbbJHctA)](https://join.slack.com/t/intertwin/shared_invite/zt-2cs67h9wz-2DFQ6EiSQGS1vlbbbJHctA) + ![Interlink logo](./docs/static/img/interlink_logo.png) -## :information_source: Overview +interLink is a abstraction layer for the execution of any Kubernetes pod on any +remote resource capable of managing a Container execution lifecycle. -### Introduction -InterLink aims to provide an abstraction for the execution of a Kubernetes pod on any remote resource capable of managing a Container execution lifecycle. -We target to facilitate the development of provider specific plugins, so the resource providers can leverage the power of virtual kubelet without a black belt in kubernetes internals. +It facilitates the development of provider specific plugins for the +[Kubernetes Virtual Kubelet interface](https://virtual-kubelet.io/), so the +resource providers can leverage the power of virtual kubelet without a black +belt in kubernetes internals. The project consists of two main components: -- __A Kubernetes Virtual Node:__ based on the [VirtualKubelet](https://virtual-kubelet.io/) technology. Translating request for a kubernetes pod execution into a remote call to the interLink API server. -- __The interLink API server:__ a modular and pluggable REST server where you can create your own Container manager plugin (called sidecars), or use the existing ones: remote docker execution on a remote host, singularity Container on a remote SLURM batch system. +- **A Kubernetes Virtual Node:** based on the translating requests for a + kubernetes pod execution into a remote call to the interLink API server. +- **The interLink API server:** a modular and pluggable REST server where you + can create your own Container manager plugin (called sidecars), or use the + existing ones: remote docker execution on a remote host, singularity Container + on a remote SLURM batch system. + +interLink is hosted by the +[Cloud Native Computing Foundation (CNCF)](https://cncf.io). + +## Getting Started + +For usage and development guides please refer to +[our site](https://interlink-hq.github.io/interLink/) + +## Adopters + +Please find all our current adopters [here](./ADOPTERS.md) + +## Contributing + +Our project welcomes contributions from any member of our community. To get +started contributing, please see our [Contributor Guide](./CONTRIBUTING.md). + +## Providers + +interLink is designed to ease the work required to include new remote providers. +It already targets a wide range of providers with container execution +capabilities, including but not limited to: + +- **SLURM or HTCondor batch systems with Apptainer, Enroot, or Singularity**: + These batch systems are widely used in high-performance computing environments + to manage and schedule jobs. By integrating with container runtimes like + Apptainer, Enroot, or Singularity, our solution can efficiently execute + containerized tasks on these systems. +- **On-demand virtual machines with any container runtime**: This includes + virtual machines that can be provisioned on-demand and support container + runtimes such as Docker, Podman, or others. This flexibility allows for + scalable and dynamic resource allocation based on workload requirements. +- **Remote Kubernetes clusters**: Our solution can extend the capabilities of + existing Kubernetes clusters, enabling them to offload workloads to another + remote cluster. This is particularly useful for distributing workloads across + multiple clusters for better resource utilization and fault tolerance. +- **Lambda-like services**: These are serverless computing services that execute + code in response to events and automatically manage the underlying compute + resources. By targeting these services, our solution can leverage the + scalability and efficiency of serverless architectures for containerized + workloads. All of this, while exposing a bare Kubernetes API kind of + orchestration. + +## In Scope + +- **K8s applications with tasks to be executed on HPC systems**: This target + focuses on Kubernetes applications that require high-performance computing + (HPC) resources for executing tasks (AI training and inference, ML algorithm + optimizations etc). These tasks might involve complex computations, + simulations, or data processing that benefit from the specialized hardware and + optimized performance of HPC systems. + +- **Remote "runner"-like application for heavy payload execution requiring + GPUs**: This target is designed for applications that need to execute heavy + computational payloads, particularly those requiring GPU resources. These + applications can be run remotely, leveraging powerful GPU hardware to handle + tasks such as machine learning model training, data analysis, or rendering. + +- **Lambda-like functions calling on external resources**: This target involves + running containers on demand with specific computing needs. Now these + resources might also be outside of the Kubernetes cluster thanks to interLink + functionality. + +## Out of Scope + +- **Long-running services**: Our solution is not designed for services that need + to run continuously for extended periods. It is optimized for tasks that have + a defined start and end, rather than persistent services exposing + intra-cluster communication endpoints. +- **Kubernetes Federation**: We do not aim to support Kubernetes Federation, + which involves managing multiple Kubernetes clusters as a single entity. Our + focus is on enabling Kubernetes pods to execute on remote resources, not on + federating all kind of resources on multiple clusters. + +## Communications + +- [![Slack server](https://img.shields.io/badge/slack_server-8A2BE2?link=https%3A%2F%2Fjoin.slack.com%2Ft%2Fintertwin%2Fshared_invite%2Fzt-2cs67h9wz-2DFQ6EiSQGS1vlbbbJHctA)](https://join.slack.com/t/intertwin/shared_invite/zt-2cs67h9wz-2DFQ6EiSQGS1vlbbbJHctA) + +## Resources + +[![Kubecon 2025](https://img.youtube.com/vi/bIxw1uK0QRQ/0.jpg)](https://www.youtube.com/watch?v=bIxw1uK0QRQ) +[![Kubecon AI days 2025](https://img.youtube.com/vi/vTg58Nd7_58/0.jpg)](https://www.youtube.com/watch?v=vTg58Nd7_58) +[![Kubecon AI days 2024](https://img.youtube.com/vi/M3uLQiekqo8/0.jpg)](https://www.youtube.com/watch?v=M3uLQiekqo8) + +## License -The project got inspired by the [KNoC](https://github.com/CARV-ICS-FORTH/knoc) and [Liqo](https://github.com/liqotech/liqo/tree/master) projects, enhancing that with the implemention a generic API layer b/w the virtual kubelet component and the provider logic for the container lifecycle management. +This project is licensed under [Apache2](./LICENSE) -For usage and development guides please refer to [our website](https://intertwin-eu.github.io/interLink/) +## Conduct +We follow the [CNCF Code of Conduct](./CODE_OF_CONDUCT.md) diff --git a/REVIEWING.md b/REVIEWING.md new file mode 100644 index 00000000..c0ec1ac8 --- /dev/null +++ b/REVIEWING.md @@ -0,0 +1,88 @@ +# Reviewing Guide + +This document covers who may review pull requests for this project, and provides +guidance on how to perform code reviews that meet our community standards and +code of conduct. All reviewers must read this document and agree to follow the +project review guidelines. Reviewers who do not follow these guidelines may have +their privileges revoked. + +## The Reviewer Role + +Only maintainers review pull requests. + +## Values + +All reviewers must abide by the [Code of Conduct](CODE_OF_CONDUCT.md) and are +also protected by it. A reviewer should not tolerate poor behavior and is +encouraged to report any behavior that violates the Code of Conduct. All of our +values listed above are distilled from our Code of Conduct. + +Below are concrete examples of how it applies to code review specifically: + +### Inclusion + +Be welcoming and inclusive. You should proactively ensure that the author is +successful. While any particular pull request may not ultimately be merged, +overall we want people to have a great experience and be willing to contribute +again. Answer the questions they didn't know to ask or offer concrete help when +they appear stuck. + +### Sustainability + +Avoid burnout by enforcing healthy boundaries. Here are some examples of how a +reviewer is encouraged to act to take care of themselves: + +- Authors should meet baseline expectations when submitting a pull request, such + as writing tests. +- If your availability changes, you can step down from a pull request and have + someone else assigned. +- If interactions with an author are not following code of conduct, close the PR + and raise it up with your Code of Conduct committee or point of contact. It's + not your job to coax people into behaving. + +### Trust + +Be trustworthy. During a review, your actions both build and help maintain the +trust that the community has placed in this project. Below are examples of ways +that we build trust: + +- **Transparency** - If a pull request won't be merged, clearly say why and + close it. If a pull request won't be reviewed for a while, let the author know + so they can set expectations and understand why it's blocked. +- **Integrity** - Put the project's best interests ahead of personal + relationships or company affiliations when deciding if a change should be + merged. +- **Stability** - Only merge when then change won't negatively impact project + stability. It can be tempting to merge a pull request that doesn't meet our + quality standards, for example when the review has been delayed, or because we + are trying to deliver new features quickly, but regressions can significantly + hurt trust in our project. + +## Process + +[Instructions](https://contribute.cncf.io/maintainers/github/templates/recommended/reviewing/#process) + +⚠️ **TBD** + +## Checklist + +Below are a set of common questions that apply to all pull requests: + +- [ ] Is this PR targeting the correct branch? +- [ ] Does the commit message provide an adequate description of the change? +- [ ] Does the affected code have corresponding tests? +- [ ] Are the changes documented, not just with inline documentation, but also + with conceptual documentation such as an overview of a new feature, or + task-based documentation like a tutorial? Consider if this change should + be announced on your project blog. +- [ ] Does this introduce breaking changes that would require an announcement or + bumping the major version? + +## Reading List + +Reviewers are encouraged to read the following articles for help with common +reviewer tasks: + +- [The Art of Closing: How to closing an unfinished or rejected pull request](https://blog.jessfraz.com/post/the-art-of-closing/) +- [Kindness and Code Reviews: Improving the Way We Give Feedback](https://product.voxmedia.com/2018/8/21/17549400/kindness-and-code-reviews-improving-the-way-we-give-feedback) +- [Code Review Guidelines for Humans: Examples of good and back feedback](https://phauer.com/2018/code-review-guidelines/#code-reviews-guidelines-for-the-reviewer) diff --git a/ci/dagger.json b/ci/dagger.json index 53fc83d3..5397fcea 100644 --- a/ci/dagger.json +++ b/ci/dagger.json @@ -1,12 +1,14 @@ { "name": "interlink", - "sdk": "go", + "engineVersion": "v0.18.3", + "sdk": { + "source": "go" + }, "dependencies": [ { "name": "k3s", - "source": "github.com/marcosnils/daggerverse/k3s@ce8fe35d309bdb29f9983f7d90ea518e724534fe" + "source": "github.com/marcosnils/daggerverse/k3s@k3s/v0.1.9", + "pin": "8b07ea65d6d60b79d8e28db965f0a3bb2fa58541" } - ], - "source": ".", - "engineVersion": "v0.13.0" + ] } diff --git a/ci/go.mod b/ci/go.mod index 18ab4923..709c85f1 100644 --- a/ci/go.mod +++ b/ci/go.mod @@ -1,48 +1,53 @@ module dagger/interlink -go 1.22.2 +go 1.23.0 + +toolchain go1.23.6 require ( - github.com/99designs/gqlgen v0.17.49 - github.com/Khan/genqlient v0.7.0 - github.com/vektah/gqlparser/v2 v2.5.16 - go.opentelemetry.io/otel v1.27.0 - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240518090000-14441aefdf88 - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 - go.opentelemetry.io/otel/log v0.3.0 - go.opentelemetry.io/otel/sdk v1.27.0 - go.opentelemetry.io/otel/sdk/log v0.3.0 - go.opentelemetry.io/otel/trace v1.27.0 + github.com/99designs/gqlgen v0.17.70 + github.com/Khan/genqlient v0.8.0 + github.com/vektah/gqlparser/v2 v2.5.23 + go.opentelemetry.io/otel v1.34.0 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 + go.opentelemetry.io/otel/log v0.8.0 + go.opentelemetry.io/otel/sdk v1.34.0 + go.opentelemetry.io/otel/sdk/log v0.8.0 + go.opentelemetry.io/otel/trace v1.34.0 go.opentelemetry.io/proto/otlp v1.3.1 - golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa - golang.org/x/sync v0.7.0 - google.golang.org/grpc v1.64.0 + golang.org/x/sync v0.12.0 + google.golang.org/grpc v1.71.0 ) require ( github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect github.com/sosodev/duration v1.3.1 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect - go.opentelemetry.io/otel/metric v1.27.0 // indirect - golang.org/x/net v0.26.0 // indirect - golang.org/x/sys v0.21.0 // indirect - golang.org/x/text v0.16.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291 // indirect - google.golang.org/protobuf v1.34.1 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.34.0 + go.opentelemetry.io/otel/sdk/metric v1.34.0 + golang.org/x/net v0.38.0 // indirect + golang.org/x/sys v0.31.0 // indirect + golang.org/x/text v0.23.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250106144421-5f5ef82da422 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect + google.golang.org/protobuf v1.36.6 // indirect ) -replace go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc => go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240518090000-14441aefdf88 +replace go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc => go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 -replace go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp => go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0 +replace go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp => go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 -replace go.opentelemetry.io/otel/log => go.opentelemetry.io/otel/log v0.3.0 +replace go.opentelemetry.io/otel/log => go.opentelemetry.io/otel/log v0.8.0 -replace go.opentelemetry.io/otel/sdk/log => go.opentelemetry.io/otel/sdk/log v0.3.0 +replace go.opentelemetry.io/otel/sdk/log => go.opentelemetry.io/otel/sdk/log v0.8.0 diff --git a/ci/go.sum b/ci/go.sum index 6fea81b9..b02fec5e 100644 --- a/ci/go.sum +++ b/ci/go.sum @@ -1,7 +1,7 @@ -github.com/99designs/gqlgen v0.17.49 h1:b3hNGexHd33fBSAd4NDT/c3NCcQzcAVkknhN9ym36YQ= -github.com/99designs/gqlgen v0.17.49/go.mod h1:tC8YFVZMed81x7UJ7ORUwXF4Kn6SXuucFqQBhN8+BU0= -github.com/Khan/genqlient v0.7.0 h1:GZ1meyRnzcDTK48EjqB8t3bcfYvHArCUUvgOwpz1D4w= -github.com/Khan/genqlient v0.7.0/go.mod h1:HNyy3wZvuYwmW3Y7mkoQLZsa/R5n5yIRajS1kPBvSFM= +github.com/99designs/gqlgen v0.17.70 h1:xgLIgQuG+Q2L/AE9cW595CT7xCWCe/bpPIFGSfsGSGs= +github.com/99designs/gqlgen v0.17.70/go.mod h1:fvCiqQAu2VLhKXez2xFvLmE47QgAPf/KTPN5XQ4rsHQ= +github.com/Khan/genqlient v0.8.0 h1:Hd1a+E1CQHYbMEKakIkvBH3zW0PWEeiX6Hp1i2kP2WE= +github.com/Khan/genqlient v0.8.0/go.mod h1:hn70SpYjWteRGvxTwo0kfaqg4wxvndECGkfa1fdDdYI= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= @@ -10,16 +10,18 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -31,54 +33,60 @@ github.com/sosodev/duration v1.3.1 h1:qtHBDMQ6lvMQsL15g4aopM4HEfOaYuhWBw3NPTtlqq github.com/sosodev/duration v1.3.1/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/vektah/gqlparser/v2 v2.5.16 h1:1gcmLTvs3JLKXckwCwlUagVn/IlV2bwqle0vJ0vy5p8= -github.com/vektah/gqlparser/v2 v2.5.16/go.mod h1:1lz1OeCqgQbQepsGxPVywrjdBHW2T08PUS3pJqepRww= -go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= -go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240518090000-14441aefdf88 h1:oM0GTNKGlc5qHctWeIGTVyda4iFFalOzMZ3Ehj5rwB4= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240518090000-14441aefdf88/go.mod h1:JGG8ebaMO5nXOPnvKEl+DiA4MGwFjCbjsxT1WHIEBPY= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0 h1:ccBrA8nCY5mM0y5uO7FT0ze4S0TuFcWdDB2FxGMTjkI= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0/go.mod h1:/9pb6634zi2Lk8LYg9Q0X8Ar6jka4dkFOylBLbVQPCE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= -go.opentelemetry.io/otel/log v0.3.0 h1:kJRFkpUFYtny37NQzL386WbznUByZx186DpEMKhEGZs= -go.opentelemetry.io/otel/log v0.3.0/go.mod h1:ziCwqZr9soYDwGNbIL+6kAvQC+ANvjgG367HVcyR/ys= -go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= -go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= -go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= -go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= -go.opentelemetry.io/otel/sdk/log v0.3.0 h1:GEjJ8iftz2l+XO1GF2856r7yYVh74URiF9JMcAacr5U= -go.opentelemetry.io/otel/sdk/log v0.3.0/go.mod h1:BwCxtmux6ACLuys1wlbc0+vGBd+xytjmjajwqqIul2g= -go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= -go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/vektah/gqlparser/v2 v2.5.23 h1:PurJ9wpgEVB7tty1seRUwkIDa/QH5RzkzraiKIjKLfA= +github.com/vektah/gqlparser/v2 v2.5.23/go.mod h1:D1/VCZtV3LPnQrcPBeR/q5jkSQIPti0uYCP/RI0gIeo= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= +go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 h1:WzNab7hOOLzdDF/EoWCt4glhrbMPVMOO5JYTmpz36Ls= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0/go.mod h1:hKvJwTzJdp90Vh7p6q/9PAOd55dI6WA6sWj62a/JvSs= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 h1:S+LdBGiQXtJdowoJoQPEtI52syEP/JYBUpjO49EQhV8= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0/go.mod h1:5KXybFvPGds3QinJWQT7pmXf+TN5YIa7CNYObWRkj50= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0/go.mod h1:Rl61tySSdcOJWoEgYZVtmnKdA0GeKrSqkHC1t+91CH8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 h1:9kV11HXBHZAvuPUZxmMWrH8hZn/6UnHX4K0mu36vNsU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 h1:cMyu9O88joYEaI47CnQkxO1XZdpoTF9fEnW2duIddhw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0/go.mod h1:6Am3rn7P9TVVeXYG+wtcGE7IE1tsQ+bP3AuWcKt/gOI= +go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk= +go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8= +go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= +go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= +go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= +go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= +go.opentelemetry.io/otel/sdk/log v0.8.0 h1:zg7GUYXqxk1jnGF/dTdLPrK06xJdrXgqgFLnI4Crxvs= +go.opentelemetry.io/otel/sdk/log v0.8.0/go.mod h1:50iXr0UVwQrYS45KbruFrEt4LvAdCaWWgIrsN3ZQggo= +go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= +go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= +go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= +go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= -golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= -golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= -golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291 h1:AgADTJarZTBqgjiUzRgfaBchgYB3/WFTC80GPwsMcRI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= +golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= +golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= +golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= +golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +google.golang.org/genproto/googleapis/api v0.0.0-20250106144421-5f5ef82da422 h1:GVIKPyP/kLIyVOgOnTwFOrvQaQUzOzGMCxgFUOEmm24= +google.golang.org/genproto/googleapis/api v0.0.0-20250106144421-5f5ef82da422/go.mod h1:b6h1vNKhxaSoEI+5jc3PJUCustfli/mRab7295pY7rw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f h1:OxYkA3wjPsZyBylwymxSHa7ViiW1Sml4ToBrncvFehI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50= +google.golang.org/grpc v1.71.0 h1:kF77BGdPTQ4/JZWMlb9VpJ5pa25aqvVqogsxNHHdeBg= +google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/ci/main.go b/ci/main.go index f89a899b..658af5a1 100644 --- a/ci/main.go +++ b/ci/main.go @@ -1,6 +1,6 @@ // A module to instantiate and tests interLink components // -// Visit the interLink documentation for more info: https://intertwin-eu.github.io/interLink/docs/intro/ +// Visit the interLink documentation for more info: https://interlink-hq.github.io/interLink/docs/intro/ // package main @@ -11,33 +11,51 @@ import ( "dagger/interlink/internal/dagger" "fmt" "html/template" + "log" "strings" "time" ) -var ( - virtualKubeletPatch = ` -kind: Deployment -metadata: - name: virtual-kubelet - namespace: interlink -spec: - template: - spec: - containers: - - name: inttw-vk - image: "{{.VirtualKubeletRef}}" +var interLinkChart = ` +nodeName: virtual-kubelet + +interlink: + address: http://{{.InterLinkURL}} + port: "3000" + disableProjectedVolumes: true + +virtualNode: + image: "{{.VirtualKubeletRef}}" + resources: + CPUs: "100" + memGiB: "128" + pods: "100" + HTTPProxies: + HTTP: null + HTTPs: null + HTTP: + Insecure: true + # uncomment to enable custom nodeSelector and nodeTaints + #nodeLabels: + # - "accelerator=a100" + #nodeTaints: + # - key: "accelerator" + # value: "a100" + # effect: "NoSchedule" + +OAUTH: + enabled: false ` // #- name: interlink // # image: "{{.InterLinkRef}}" // // ` -) type patchSchema struct { InterLinkRef string VirtualKubeletRef string + InterLinkURL string } // Interlink struct for initialization and internal variables @@ -55,26 +73,28 @@ type Interlink struct { KubeConfigHost *dagger.File InterlinkContainer *dagger.Container VKContainer *dagger.Container + PluginContainer *dagger.Container } // New initializes the Dagger module at each call func New(name string, // +optional - // +default="ghcr.io/intertwin-eu/interlink/virtual-kubelet-inttw:0.3.1-rc1" + // +default="ghcr.io/interlink-hq/interlink/virtual-kubelet-inttw:0.4.0" VirtualKubeletRef string, // +optional - // +default="ghcr.io/intertwin-eu/interlink/interlink:0.3.1-rc1" + // +default="ghcr.io/interlink-hq/interlink/interlink:0.4.0" InterlinkRef string, // +optional - // +default="ghcr.io/intertwin-eu/interlink-docker-plugin/docker-plugin:0.0.24-no-gpu" + // +default="ghcr.io/interlink-hq/interlink-sidecar-slurm/interlink-sidecar-slurm:0.4.0" pluginRef string, ) *Interlink { - return &Interlink{ - Name: name, - VirtualKubeletRef: VirtualKubeletRef, - InterlinkRef: InterlinkRef, - PluginRef: pluginRef, + Name: name, + VirtualKubeletRef: VirtualKubeletRef, + VKContainer: dag.Container(), + InterlinkRef: InterlinkRef, + InterlinkContainer: dag.Container(), + PluginRef: pluginRef, } } @@ -102,20 +122,24 @@ func (m *Interlink) NewInterlink( // +defaultPath="./manifests/plugin-config.yaml" pluginConfig *dagger.File, ) (*Interlink, error) { - if localRegistry != nil { m.Registry = localRegistry } + if m.Registry == nil { + m.Registry = dag.Container().From("registry"). + WithExposedPort(5000).AsService() + } var err error if pluginEndpoint == nil { - plugin := dag.Container().From(m.PluginRef). + m.PluginContainer = dag.Container().From(m.PluginRef). WithFile("/etc/interlink/InterLinkConfig.yaml", pluginConfig). - WithEnvVariable("INTERLINKCONFIGPATH", "/etc/interlink/InterLinkConfig.yaml"). - WithExposedPort(4000). - WithExec([]string{"bash", "-c", "dockerd --mtu 1450 & /sidecar/docker-sidecar"}, dagger.ContainerWithExecOpts{UseEntrypoint: false, InsecureRootCapabilities: true}) + WithEnvVariable("BUST", time.Now().String()). + WithEnvVariable("SLURMCONFIGPATH", "/etc/interlink/InterLinkConfig.yaml"). + WithEnvVariable("SHARED_FS", "true"). + WithExposedPort(4000) - pluginEndpoint, err = plugin.AsService().Start(ctx) + pluginEndpoint, err = m.PluginContainer.AsService(dagger.ContainerAsServiceOpts{Args: []string{}, UseEntrypoint: true, InsecureRootCapabilities: true}).Start(ctx) if err != nil { return nil, err } @@ -124,15 +148,26 @@ func (m *Interlink) NewInterlink( if interlinkEndpoint == nil { interlink := m.InterlinkContainer. WithFile("/etc/interlink/InterLinkConfig.yaml", interlinkConfig). + WithEnvVariable("BUST", time.Now().String()). WithServiceBinding("plugin", pluginEndpoint). WithEnvVariable("INTERLINKCONFIGPATH", "/etc/interlink/InterLinkConfig.yaml"). - WithExposedPort(3000). - WithExec([]string{}, dagger.ContainerWithExecOpts{UseEntrypoint: true, InsecureRootCapabilities: true}) - - interlinkEndpoint, err = interlink.AsService().Start(ctx) + WithExposedPort(3000) + + interlinkEndpoint, err = interlink. + AsService( + dagger.ContainerAsServiceOpts{ + Args: []string{}, + UseEntrypoint: true, + InsecureRootCapabilities: true, + }).Start(ctx) if err != nil { return nil, err } + + } + interlinkURL, err := interlinkEndpoint.Endpoint(ctx, dagger.ServiceEndpointOpts{}) + if err != nil { + return nil, err } K3s := dag.K3S(m.Name).With(func(k *dagger.K3S) *dagger.K3S { @@ -149,7 +184,6 @@ EOF`}). WithServiceBinding("registry", m.Registry). WithServiceBinding("interlink", interlinkEndpoint), ) - }) _, err = K3s.Server().Start(ctx) @@ -166,11 +200,12 @@ EOF`}). patch := patchSchema{ InterLinkRef: m.InterlinkRef, VirtualKubeletRef: m.VirtualKubeletRef, + InterLinkURL: strings.Split(interlinkURL, ":")[0], } bufferIL := new(bytes.Buffer) - virtualKubeletCompiler, err := template.New("vk").Parse(virtualKubeletPatch) + virtualKubeletCompiler, err := template.New("vk").Parse(interLinkChart) if err != nil { return nil, err } @@ -184,9 +219,10 @@ EOF`}). fmt.Println(bufferVK.String()) - kubectl := dag.Container().From("bitnami/kubectl:1.29.7-debian-12-r3"). + kubectl := dag.Container().From("bitnami/kubectl:1.32-debian-12"). WithServiceBinding("registry", m.Registry). WithServiceBinding("plugin", pluginEndpoint). + WithEnvVariable("BUST", time.Now().String()). WithServiceBinding("interlink", interlinkEndpoint). WithUser("root"). WithExec([]string{"mkdir", "-p", "/opt/user"}). @@ -198,9 +234,6 @@ EOF`}). WithExec([]string{"chown", "1001:0", "/.kube/config"}). WithUser("1001"). WithDirectory("/manifests", m.Manifests). - WithNewFile("/manifests/virtual-kubelet-merge.yaml", bufferVK.String(), dagger.ContainerWithNewFileOpts{ - Permissions: 0o755, - }). WithNewFile("/manifests/interlink-merge.yaml", bufferIL.String(), dagger.ContainerWithNewFileOpts{ Permissions: 0o755, }). @@ -208,20 +241,23 @@ EOF`}). m.Kubectl = kubectl - ns, _ := kubectl.WithExec([]string{"create", "ns", "interlink"}, dagger.ContainerWithExecOpts{UseEntrypoint: true}).Stdout(ctx) - fmt.Println(ns) - - sa, err := kubectl.WithExec([]string{"apply", "-f", "/manifests/service-account.yaml"}, dagger.ContainerWithExecOpts{UseEntrypoint: true}).Stdout(ctx) - if err != nil { - return nil, err - } - fmt.Println(sa) - - vkConfig, err := kubectl.WithExec([]string{"apply", "-k", "/manifests/"}, dagger.ContainerWithExecOpts{UseEntrypoint: true}).Stdout(ctx) - if err != nil { - return nil, err - } - fmt.Println(vkConfig) + dag.Container().From("alpine/helm:3.16.1"). + WithMountedFile("/.kube/config", m.KubeConfig). + WithEnvVariable("BUST", time.Now().String()). + WithEnvVariable("KUBECONFIG", "/.kube/config"). + WithNewFile("/manifests/vk_helm_chart.yaml", bufferVK.String(), dagger.ContainerWithNewFileOpts{ + Permissions: 0o755, + }). + WithExec([]string{ + "helm", + "install", + "--create-namespace", + "-n", "interlink", + "virtual-node", + "oci://ghcr.io/interlink-hq/interlink-helm-chart/interlink", + "--version", "0.4.1", + "--values", "/manifests/vk_helm_chart.yaml", + }).Stdout(ctx) return m, nil } @@ -248,7 +284,6 @@ func (m *Interlink) BuildImages( // +defaultPath="../" sourceFolder *dagger.Directory, ) (*Interlink, error) { - // TODO: get tag m.Registry = dag.Container().From("registry"). WithExposedPort(5000).AsService() @@ -282,6 +317,7 @@ func (m *Interlink) BuildImages( WithEntrypoint([]string{"/bin/interlink"}) _, err := dag.Container().From("quay.io/skopeo/stable"). + WithEnvVariable("BUST", time.Now().String()). WithServiceBinding("registry", m.Registry). WithMountedFile("image.tar", m.InterlinkContainer.AsTarball()). WithExec([]string{"copy", "--dest-tls-verify=false", "docker-archive:image.tar", "docker://" + m.InterlinkRef}, dagger.ContainerWithExecOpts{UseEntrypoint: true}). @@ -309,6 +345,7 @@ func (m *Interlink) BuildImages( WithEntrypoint([]string{"/bin/vk"}) _, err = dag.Container().From("quay.io/skopeo/stable"). + WithEnvVariable("BUST", time.Now().String()). WithServiceBinding("registry", m.Registry). WithMountedFile("image.tar", m.VKContainer.AsTarball()). WithExec([]string{"copy", "--dest-tls-verify=false", "docker-archive:image.tar", "docker://" + m.VirtualKubeletRef}, dagger.ContainerWithExecOpts{UseEntrypoint: true}). @@ -323,9 +360,7 @@ func (m *Interlink) BuildImages( func (m *Interlink) Kube( ctx context.Context, ) (*dagger.Service, error) { - return m.KubeAPIs, nil - } // Wait for cluster to be ready, then setup the test container @@ -335,7 +370,6 @@ func (m *Interlink) Run( // +defaultPath="./manifests" manifests *dagger.Directory, ) (*dagger.Container, error) { - return dag.Container().From("bitnami/kubectl:1.29.7-debian-12-r3"). WithUser("root"). WithExec([]string{"mkdir", "-p", "/opt/user"}). @@ -343,17 +377,31 @@ func (m *Interlink) Run( WithExec([]string{"apt", "update"}). WithExec([]string{"apt", "update"}). WithExec([]string{"apt", "install", "-y", "curl", "python3", "python3-pip", "python3-venv", "git", "vim"}). + WithEnvVariable("BUST", time.Now().String()). WithMountedFile("/.kube/config", dag.K3S(m.Name).Config(dagger.K3SConfigOpts{Local: false})). WithExec([]string{"chown", "1001:0", "/.kube/config"}). WithUser("1001"). WithDirectory("/manifests", manifests). WithEntrypoint([]string{"kubectl"}). WithWorkdir("/opt/user"). - WithExec([]string{"bash", "-c", "git clone https://github.com/interTwin-eu/vk-test-set.git"}). + WithExec([]string{"bash", "-c", "git clone https://github.com/interlink-hq/vk-test-set.git"}). WithExec([]string{"bash", "-c", "cp /manifests/vktest_config.yaml /opt/user/vk-test-set/vktest_config.yaml"}). WithWorkdir("/opt/user/vk-test-set"). WithExec([]string{"bash", "-c", "python3 -m venv .venv && source .venv/bin/activate && pip3 install -e ./ "}), nil +} +func (m *Interlink) Lint( + // +optional + // +defaultPath="../" + sourceFolder *dagger.Directory, +) *dagger.Container { + lintCache := dag.CacheVolume(m.Name + "_lint") + + return dag.Container().From("golangci/golangci-lint:v2.1.1"). + WithMountedDirectory("/app", sourceFolder). + WithMountedCache("/root/.cache", lintCache). + WithWorkdir("/app"). + WithExec([]string{"golangci-lint", "run", "-v", "--timeout=30m"}, dagger.ContainerWithExecOpts{UseEntrypoint: true}) } // Wait for cluster to be ready, setup the test container, run all tests @@ -365,9 +413,14 @@ func (m *Interlink) Test( // +optional localCluster *dagger.Service, // +optional - // +default false - //cleanup bool, + // +defaultPath="../" + sourceFolder *dagger.Directory, ) (*dagger.Container, error) { + lint, err := m.Lint(sourceFolder).Stdout(ctx) + if err != nil { + return nil, err + } + log.Printf("Lint output: %s", lint) c, err := m.Run(ctx, manifests) if err != nil { @@ -375,7 +428,8 @@ func (m *Interlink) Test( } result := c.WithExec([]string{"bash", "-c", "source .venv/bin/activate && export KUBECONFIG=/.kube/config && pytest -vk 'not rclone and not limits'"}) + //_ = c.WithExec([]string{"bash", "-c", "source .venv/bin/activate && export KUBECONFIG=/.kube/config && pytest -vk 'hello'"}) + // result := c.WithExec([]string{"bash", "-c", "source .venv/bin/activate && export KUBECONFIG=/.kube/config && pytest -vk 'hello'"}) return result, nil - } diff --git a/ci/manifests/interlink-config-local.yaml b/ci/manifests/interlink-config-local.yaml new file mode 100644 index 00000000..9a043c24 --- /dev/null +++ b/ci/manifests/interlink-config-local.yaml @@ -0,0 +1,16 @@ +# apiVersion: v1 +# kind: ConfigMap +# metadata: +# name: "interlink-config" +# namespace: interlink +# data: +# InterLinkConfig.yaml: | + #InterlinkAddress: "unix:///var/run/interlink.socket" +InterlinkAddress: "http://0.0.0.0" +InterlinkPort: "3000" +#sidecarURL: "http://plugin" +SidecarURL: "http://0.0.0.0" +SidecarPort: "4000" +VerboseLogging: true +ErrorsOnlyLogging: false +DataRootFolder: "~/.interlink" diff --git a/ci/manifests/interlink-config.yaml b/ci/manifests/interlink-config.yaml index 3b1a9417..a9e9283d 100644 --- a/ci/manifests/interlink-config.yaml +++ b/ci/manifests/interlink-config.yaml @@ -9,9 +9,8 @@ InterlinkAddress: "http://0.0.0.0" InterlinkPort: "3000" SidecarURL: "http://plugin" -#SidecarURL: "http://0.0.0.0" +#sidecarURL: "http://0.0.0.0" SidecarPort: "4000" VerboseLogging: true ErrorsOnlyLogging: false -ExportPodData: true DataRootFolder: "~/.interlink" diff --git a/ci/manifests/plugin-config.yaml b/ci/manifests/plugin-config.yaml index c096e61b..a5eb0261 100644 --- a/ci/manifests/plugin-config.yaml +++ b/ci/manifests/plugin-config.yaml @@ -4,11 +4,11 @@ SidecarURL: "http://0.0.0.0" SidecarPort: "4000" VerboseLogging: true ErrorsOnlyLogging: false -ExportPodData: true # NEEDED PATH FOR GITHUB ACTIONS -DataRootFolder: "/home/runner/work/interLink/interLink/.interlink/" +#DataRootFolder: "/home/runner/work/interLink/interLink/.interlink/" # on your host use something like: -#DataRootFolder: "/home/ubuntu/.interlink/" +DataRootFolder: "/home/ubuntu/.interlink/" +ExportPodData: true SbatchPath: "/usr/bin/sbatch" ScancelPath: "/usr/bin/scancel" SqueuePath: "/usr/bin/squeue" diff --git a/ci/manifests/plugin.yaml b/ci/manifests/plugin.yaml index 082360e7..13466f8c 100644 --- a/ci/manifests/plugin.yaml +++ b/ci/manifests/plugin.yaml @@ -31,7 +31,7 @@ spec: containers: - name: plugin image: "dciangot/docker-plugin:v1" - #image: "ghcr.io/intertwin-eu/interlink-sidecar-slurm/interlink-sidecar-slurm:0.2.3" + #image: "ghcr.io/interlink-hq/interlink-sidecar-slurm/interlink-sidecar-slurm:0.2.3" imagePullPolicy: Always command: - bash diff --git a/ci/manifests/service-account.yaml b/ci/manifests/service-account.yaml index 2169e592..3ff9ba59 100644 --- a/ci/manifests/service-account.yaml +++ b/ci/manifests/service-account.yaml @@ -33,6 +33,13 @@ rules: - get - list - watch +# For https://kubernetes.io/docs/reference/kubernetes-api/authentication-resources/token-request-v1/ +- apiGroups: [""] + resources: ["serviceaccounts/token"] + verbs: + - create + - get + - list - apiGroups: - "" resources: diff --git a/ci/manifests/virtual-kubelet-config.yaml b/ci/manifests/virtual-kubelet-config.yaml index 7feb69c2..12da4426 100644 --- a/ci/manifests/virtual-kubelet-config.yaml +++ b/ci/manifests/virtual-kubelet-config.yaml @@ -8,12 +8,17 @@ data: #InterlinkURL: unix:///var/run/interlink.socket InterlinkURL: "http://interlink" InterlinkPort: "3000" - ExportPodData: true VerboseLogging: true ErrorsOnlyLogging: false ServiceAccount: "virtual-kubelet" Namespace: interlink VKTokenFile: "" - CPU: "100" - Memory: "128Gi" - Pods: "100" + Resources: + CPU: "100" + Memory: "128Gi" + Pods: "100" + HTTP: + Insecure: true + KubeletHTTP: + Insecure: true + diff --git a/ci/manifests/virtual-kubelet.yaml b/ci/manifests/virtual-kubelet.yaml index 8dc1c2e7..249aaf12 100644 --- a/ci/manifests/virtual-kubelet.yaml +++ b/ci/manifests/virtual-kubelet.yaml @@ -20,7 +20,7 @@ spec: serviceAccountName: virtual-kubelet containers: # - name: interlink - # image: "ghcr.io/intertwin-eu/interlink/interlink" + # image: "ghcr.io/interlink-hq/interlink/interlink" # imagePullPolicy: Always # env: # - name: INTERLINKCONFIGPATH @@ -32,13 +32,13 @@ spec: # - name: sockets # mountPath: /var/run/ - name: inttw-vk - image: "ghcr.io/intertwin-eu/interlink/virtual-kubelet-inttw" + image: "ghcr.io/interlink-hq/interlink/virtual-kubelet-inttw" imagePullPolicy: Always env: - name: NODENAME value: virtual-kubelet - name: KUBELET_PORT - value: "10255" + value: "10251" - name: POD_IP valueFrom: fieldRef: diff --git a/cmd/installer/README.md b/cmd/installer/README.md new file mode 100644 index 00000000..4298c1e5 --- /dev/null +++ b/cmd/installer/README.md @@ -0,0 +1,156 @@ +# interLink Installer + +The interLink installer is a command-line tool that simplifies the deployment of +interLink components across different environments. It automates the generation +of configuration files, deployment manifests, and installation scripts needed to +set up interLink in various deployment scenarios. + +## Overview + +The interLink installer: + +- Generates configuration files for interLink deployment +- Handles OAuth authentication setup +- Creates Helm chart values for Kubernetes deployment +- Generates installation scripts for remote interLink APIs +- Supports different deployment scenarios (Edge-node, In-cluster, Tunneled) + +## Installation + +The installer is built as part of the interLink project. To build it: + +```bash +# From the root of the interLink repository +go build -o interlink-installer ./cmd/installer +``` + +## Usage + +### Initialize a Configuration + +Create a default configuration file with placeholder values: + +```bash +./interlink-installer --init --config /path/to/config.yaml +``` + +This creates a configuration file with default values that you must edit to +match your environment. + +> It `--config` is not given, default location is `$HOME/.interlink.yaml + +### Generate Deployment Manifests + +After editing the configuration file, generate the deployment manifests: + +```bash +./interlink-installer --config /path/to/config.yaml --output-dir /path/to/output +``` + +This will: + +1. Read the configuration file +2. Handle OAuth authentication if needed +3. Generate Helm chart values at `/path/to/output/values.yaml` +4. Generate an installation script at `/path/to/output/interlink-remote.sh` + +### Deploy interLink + +After generating the manifests: + +1. Deploy to Kubernetes: + + ```bash + helm --debug upgrade --install --create-namespace -n \ + oci://ghcr.io/interlink-hq/interlink-helm-chart/interlink \ + --values /path/to/output/values.yaml + ``` + +2. Install on the remote server: + + ```bash + # Copy the script to the remote server + scp /path/to/output/interlink-remote.sh user@remote-server:~/ + + # On the remote server + chmod +x interlink-remote.sh + ./interlink-remote.sh install + ./interlink-remote.sh start + ``` + +## Command-Line Flags + +| Flag | Default | Description | +| -------------- | ---------------------------- | ------------------------------------------------------- | +| `--config` | `$HOME/.interlink.yaml` | Path to the configuration file | +| `--output-dir` | `$HOME/.interlink/manifests` | Directory where deployment manifests will be stored | +| `--init` | `false` | Initialize a new configuration file with default values | + +## Configuration File + +The configuration file is in YAML format and contains the following sections: + +### Virtual Kubelet Configuration + +```yaml +kubelet_node_name: my-vk-node +kubernetes_namespace: interlink +node_limits: + cpu: "10" + memory: "256" + pods: "10" +``` + +### interLink API Configuration + +```yaml +interlink_ip: PUBLIC_IP_HERE +interlink_port: 8443 +interlink_version: 0.3.3 +insecure_http: true +``` + +### OAuth Configuration + +```yaml +oauth: + provider: oidc # or github + grant_type: authorization_code # or client_credentials + client_id: OIDC_CLIENT_ID_HERE + client_secret: OIDC_CLIENT_SECRET_HERE + scopes: + - openid + - email + - offline_access + - profile + token_url: https://my_oidc_idp.com/token + device_code_url: https://my_oidc_idp/auth/device + issuer: https://my_oidc_idp.com/ + # For GitHub provider + # github_user: username +``` + +## Deployment Scenarios + +The installer supports all three deployment scenarios described in the interLink +documentation: + +1. **Edge-node**: Deploy interLink API and plugin on a dedicated edge node +2. **In-cluster**: Deploy all components inside the Kubernetes cluster +3. **Tunneled**: Deploy interLink API in the cluster and plugin remotely with a + secure tunnel + +_The specific scenario is determined by how you configure the interLink IP and +port in the configuration file and where you run the installation script._ + +## Template Files + +The installer includes several embedded template files: + +- `values.yaml`: Helm chart values for Kubernetes deployment +- `interlink-install.sh`: Installation script for remote interLink APIs +- `interlink.service`: SystemD service file for interLink +- `oauth2-proxy.service`: SystemD service file for OAuth2 proxy + +These templates are processed with the configuration data to generate the final +deployment files. diff --git a/cmd/installer/main.go b/cmd/installer/main.go index 33d49302..596f908c 100644 --- a/cmd/installer/main.go +++ b/cmd/installer/main.go @@ -1,3 +1,12 @@ +// Implements the interLink installer CLI tool. +// +// The interLink installer automates the deployment of interLink components +// across different environments. It generates configuration files, deployment +// manifests, and installation scripts needed to set up interLink in various +// deployment scenarios (Edge-node, In-cluster, Tunneled). +// +// The installer creates Helm chart values for Kubernetes deployment, +// and generates installation scripts for remote interLink APIs. package main import ( @@ -7,6 +16,7 @@ import ( "fmt" "io" "io/fs" + "log" "os" "text/template" @@ -16,75 +26,149 @@ import ( ) var ( - // Used for flags. - cfgFile string - outFolder string - userLicense string + // cfgFile is the path to the configuration file + cfgFile string + // outFolder is the directory where deployment manifests will be stored + outFolder string + + // rootCmd is the main command for the interLink installer CLI rootCmd = &cobra.Command{ - Use: "ilctl", + Use: "interlink-installer", Short: "CLI to manage interLink deployment", Long: `interLink cloud tools allows to extend kubernetes cluster over any remote resource`, RunE: root, } + //go:embed templates + // templates contains the embedded template files used for generating + // deployment manifests and installation scripts templates embed.FS ) +// Resources defines the resource limits for the virtual kubelet node. +// These limits determine the maximum resources that can be allocated +// to pods running on the virtual node. type Resources struct { - CPU string `yaml:"cpu"` + // CPU is the maximum CPU cores available on the virtual node + CPU string `yaml:"cpu"` + + // Memory is the maximum memory in GiB available on the virtual node Memory string `yaml:"memory"` - Pods string `yaml:"pods"` + + // Pods is the maximum number of pods that can run on the virtual node + Pods string `yaml:"pods"` } +// oauthStruct defines the OAuth configuration for authentication. +// It supports both OIDC and GitHub authentication providers. type oauthStruct struct { - Provider string `yaml:"provider"` - GrantType string `default:"authorization_code" yaml:"grant_type"` - Issuer string `yaml:"issuer,omitempty"` - RefreshToken string `yaml:"refresh_token,omitempty"` - Audience string `yaml:"audience,omitempty"` - Group string `yaml:"group,omitempty"` - GroupClaim string `default:"groups" yaml:"group_claim"` - Scopes []string `yaml:"scopes"` - GitHUBUser string `yaml:"github_user"` - TokenURL string `yaml:"token_url"` - DeviceCodeURL string `yaml:"device_code_url"` - ClientID string `yaml:"client_id"` - ClientSecret string `yaml:"client_secret"` + // Provider specifies the OAuth provider (e.g., "oidc", "github") + Provider string `yaml:"provider"` + + // GrantType specifies the OAuth grant type (e.g., "authorization_code", "client_credentials") + GrantType string `default:"authorization_code" yaml:"grant_type"` + + // Issuer is the OIDC issuer URL (only used with OIDC provider) + Issuer string `yaml:"issuer,omitempty"` + + // RefreshToken is the OAuth refresh token obtained during authentication + RefreshToken string `yaml:"refresh_token,omitempty"` + + // Audience is the intended audience for the token (only used with OIDC provider) + Audience string `yaml:"audience,omitempty"` + + // Group is the required group membership for authentication + Group string `yaml:"group,omitempty"` + + // GroupClaim is the claim name in the token that contains group information + GroupClaim string `default:"groups" yaml:"group_claim"` + + // Scopes are the OAuth scopes requested during authentication + Scopes []string `yaml:"scopes"` + + // GitHUBUser is the GitHub username (only used with GitHub provider) + GitHUBUser string `yaml:"github_user"` + + // TokenURL is the OAuth token endpoint URL + TokenURL string `yaml:"token_url"` + + // DeviceCodeURL is the OAuth device code endpoint URL + DeviceCodeURL string `yaml:"device_code_url"` + + // ClientID is the OAuth client ID + ClientID string `yaml:"client_id"` + + // ClientSecret is the OAuth client secret + ClientSecret string `yaml:"client_secret"` } +// dataStruct is the main configuration structure for interLink deployment. +// It contains all the information needed to generate deployment manifests +// and installation scripts. +// // TODO: insert in-cluster and socket option e.g. --> no need OAUTH type dataStruct struct { - InterLinkIP string `yaml:"interlink_ip"` - InterLinkPort int `yaml:"interlink_port"` - InterLinkVersion string `yaml:"interlink_version"` - VKName string `yaml:"kubelet_node_name"` - Namespace string `yaml:"kubernetes_namespace,omitempty"` - VKLimits Resources `yaml:"node_limits"` - OAUTH oauthStruct `yaml:"oauth,omitempty"` + // InterLinkIP is the IP address where the interLink API will be exposed + InterLinkIP string `yaml:"interlink_ip"` + + // InterLinkPort is the port where the interLink API will be exposed + InterLinkPort int `yaml:"interlink_port"` + + // InterLinkVersion is the version of interLink to deploy + InterLinkVersion string `yaml:"interlink_version"` + + // VKName is the name of the virtual kubelet node + VKName string `yaml:"kubelet_node_name"` + + // Namespace is the Kubernetes namespace where interLink will be deployed + Namespace string `yaml:"kubernetes_namespace,omitempty"` + + // VKLimits defines the resource limits for the virtual kubelet node + VKLimits Resources `yaml:"node_limits"` + + // OAUTH contains the OAuth configuration for authentication + OAUTH oauthStruct `yaml:"oauth,omitempty"` + + // HTTPInsecure determines whether to allow insecure HTTP connections + HTTPInsecure bool `default:"true" yaml:"insecure_http"` } +// evalManifest evaluates a template file using the provided configuration data. +// It parses the template from the embedded filesystem, executes it with the +// configuration data, and returns the rendered template as a string. +// +// Parameters: +// - path: The path to the template file within the embedded filesystem +// - dataStruct: The configuration data to use for template rendering +// +// Returns: +// - string: The rendered template as a string +// - error: An error if template parsing, execution, or reading fails func evalManifest(path string, dataStruct dataStruct) (string, error) { - + // Parse the template from the embedded filesystem tmpl, err := template.ParseFS(templates, path) if err != nil { return "", err } + // Create a temporary file to store the rendered template fDeploy, err := os.CreateTemp("", "tmpfile-") // in Go version older than 1.17 you can use ioutil.TempFile if err != nil { return "", err } - // close and remove the temporary file at the end of the program + // Close and remove the temporary file at the end of the function defer fDeploy.Close() defer os.Remove(fDeploy.Name()) + // Execute the template with the configuration data err = tmpl.Execute(fDeploy, dataStruct) if err != nil { return "", err } + // Read the rendered template from the temporary file deploymentYAML, err := os.ReadFile(fDeploy.Name()) if err != nil { return "", err @@ -93,51 +177,67 @@ func evalManifest(path string, dataStruct dataStruct) (string, error) { return string(deploymentYAML), nil } -func root(cmd *cobra.Command, args []string) error { +// root is the main command execution function for the interLink installer. +// It handles initialization of configuration, OAuth authentication, and +// generation of deployment manifests and installation scripts. +// +// Parameters: +// - cmd: The Cobra command being executed +// - _: Unused parameter for command arguments +// +// Returns: +// - error: An error if any operation fails +func root(cmd *cobra.Command, _ []string) error { var configCLI dataStruct + // Check if the --init flag is set onlyInit, err := cmd.Flags().GetBool("init") if err != nil { return err } + // If --init flag is set, create a default configuration file if onlyInit { - + // Check if the configuration file already exists if _, err = os.Stat(cfgFile); err == nil { - return fmt.Errorf("File " + cfgFile + " exists. Please remove it before trying init again.") + return fmt.Errorf("file config file exists. Please remove it before trying init again: %w", err) } + // Create a default configuration with placeholder values dumpConfig := dataStruct{ VKName: "my-vk-node", Namespace: "interlink", VKLimits: Resources{ CPU: "10", - Memory: "256Gi", + Memory: "256", Pods: "10", }, - InterLinkIP: "127.0.0.1", - InterLinkPort: 8443, - InterLinkVersion: "0.1.2", + InterLinkIP: "PUBLIC_IP_HERE", + InterLinkPort: -1, + InterLinkVersion: "0.3.3", OAUTH: oauthStruct{ - ClientID: "", - ClientSecret: "", - Scopes: []string{""}, - TokenURL: "", - DeviceCodeURL: "", - Provider: "github", - GitHUBUser: "myusername", - Issuer: "https://github.com/oauth", + ClientID: "OIDC_CLIENT_ID_HERE", + ClientSecret: "OIDC_CLIENT_SECRET_HERE", + Scopes: []string{"openid", "email", "offline_access", "profile"}, + TokenURL: "https://my_oidc_idp.com/token", + DeviceCodeURL: "https://my_oidc_idp/auth/device", + Provider: "oidc", + Issuer: "https://my_oidc_idp.com/", }, + HTTPInsecure: true, } + // Marshal the configuration to YAML yamlData, err := yaml.Marshal(dumpConfig) if err != nil { fmt.Println(err) return err } + // Print the YAML configuration to stdout fmt.Println(string(yamlData)) - // Dump the YAML data to a file + + // Write the YAML configuration to the specified file file, err := os.OpenFile(cfgFile, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644) if err != nil { panic(err) @@ -154,8 +254,7 @@ func root(cmd *cobra.Command, args []string) error { return nil } - //cliconfig := dataStruct{} - + // Read and parse the configuration file file, err := os.Open(cfgFile) if err != nil { return err @@ -172,10 +271,13 @@ func root(cmd *cobra.Command, args []string) error { return err } + // Handle OAuth authentication based on the grant type var token *oauth2.Token - ctx := context.Background() - if configCLI.OAUTH.GrantType == "authorization_code" { + + switch configCLI.OAUTH.GrantType { + case "authorization_code": + // Set up OAuth configuration for device authorization flow cfg := oauth2.Config{ ClientID: configCLI.OAUTH.ClientID, ClientSecret: configCLI.OAUTH.ClientSecret, @@ -187,119 +289,126 @@ func root(cmd *cobra.Command, args []string) error { Scopes: configCLI.OAUTH.Scopes, } + // Initiate device authorization flow response, err := cfg.DeviceAuth(ctx, oauth2.AccessTypeOffline) if err != nil { panic(err) } + // Prompt the user to enter the code at the verification URI fmt.Printf("please enter code %s at %s\n", response.UserCode, response.VerificationURI) + + // Exchange the device code for an access token and refresh token token, err = cfg.DeviceAccessToken(ctx, response, oauth2.AccessTypeOffline) if err != nil { panic(err) } - //fmt.Println(token.AccessToken) - //fmt.Println(token.RefreshToken) - //fmt.Println(token.Expiry) - //fmt.Println(token.TokenType) - configCLI.OAUTH.RefreshToken = token.RefreshToken - } else if configCLI.OAUTH.GrantType == "client_credentials" { + // Store the refresh token in the configuration + // The refresh token is used for obtaining new access tokens without user interaction + configCLI.OAUTH.RefreshToken = token.RefreshToken + case "client_credentials": + // Client credentials grant type doesn't use refresh tokens fmt.Println("Client_credentials set, I won't try to get any refresh token.") - } else { - + default: + // Unsupported grant type panic(fmt.Errorf("wrong grant type specified in the configuration. Only client_credentials and authorization_code are supported")) } - namespaceYAML, err := evalManifest("templates/namespace.yaml", configCLI) - if err != nil { - panic(err) - } - - deploymentYAML, err := evalManifest("templates/deployment.yaml", configCLI) - if err != nil { - panic(err) - } - - configYAML, err := evalManifest("templates/configs.yaml", configCLI) - if err != nil { - panic(err) - } - - serviceaccountYAML, err := evalManifest("templates/service-account.yaml", configCLI) + // Generate the values.yaml manifest from the template + valuesYAML, err := evalManifest("templates/values.yaml", configCLI) if err != nil { panic(err) } + // Collect all manifests to be written manifests := []string{ - namespaceYAML, - serviceaccountYAML, - configYAML, - deploymentYAML, + valuesYAML, } + // Create the output directory if it doesn't exist err = os.MkdirAll(outFolder, fs.ModePerm) if err != nil { panic(err) } - // Create a file and use bufio.NewWriter. - f, err := os.Create(outFolder + "/interlink.yaml") + + // Create the values.yaml file and use bufio.NewWriter for efficient writing + f, err := os.Create(outFolder + "/values.yaml") if err != nil { panic(err) } defer f.Close() w := bufio.NewWriter(f) + // Write each manifest to the file, separated by YAML document separators for _, mnfst := range manifests { - fmt.Fprint(w, mnfst) fmt.Fprint(w, "\n---\n") } + // Flush the writer to ensure all data is written to the file w.Flush() - fmt.Println("\n\n=== Deployment file written at: " + outFolder + "/interlink.yaml ===\n\n To deploy the virtual kubelet run:\n kubectl apply -f " + outFolder + "/interlink.yaml") + // Print information about the generated values.yaml file and how to use it + fmt.Println("\n\n=== Deployment file written at: " + outFolder + "/values.yaml ===\n\n To deploy the virtual kubelet run:\n helm --debug upgrade --install --create-namespace -n " + configCLI.Namespace + " " + configCLI.VKName + " oci://ghcr.io/interlink-hq/interlink-helm-chart/interlink --values " + outFolder + "/values.yaml") + // Generate the installation script for remote interLink APIs // TODO: ilctl.sh templating tmpl, err := template.ParseFS(templates, "templates/interlink-install.sh") if err != nil { return err } - fInterlinkScript, err := os.Create(outFolder + "/interlink-remote.sh") // in Go version older than 1.17 you can use ioutil.TempFile + // Create the installation script file + fInterlinkScript, err := os.Create(outFolder + "/interlink-remote.sh") if err != nil { return err } - // close and remove the temporary file at the end of the program + // Close the file when the function returns defer fInterlinkScript.Close() - // + + // Execute the template with the configuration data err = tmpl.Execute(fInterlinkScript, configCLI) if err != nil { return err } + // Print information about the generated installation script and how to use it fmt.Println("\n\n=== Installation script for remote interLink APIs stored at: " + outFolder + "/interlink-remote.sh ===\n\n Please execute the script on the remote server: " + configCLI.InterLinkIP + "\n\n \"./interlink-remote.sh install\" followed by \"interlink-remote.sh start\"") return nil - } +// init initializes the command-line flags and configuration. +// It is called automatically when the package is initialized. func init() { cobra.OnInitialize(initConfig) + // Define command-line flags rootCmd.PersistentFlags().StringVar(&cfgFile, "config", os.Getenv("HOME")+"/.interlink.yaml", "config file (default is $HOME/.interlink.yaml)") - rootCmd.PersistentFlags().StringVar(&outFolder, "output-dir", os.Getenv("HOME")+"/.interlink", "interlink deployment manifests location (default is $HOME/.interlink)") + rootCmd.PersistentFlags().StringVar(&outFolder, "output-dir", os.Getenv("HOME")+"/.interlink/manifests", "interlink deployment manifests location (default is $HOME/.interlink/manifests)") rootCmd.PersistentFlags().Bool("init", false, "dump an empty configuration to get started") + + // Commented out commands that might be added in the future // rootCmd.AddCommand(vkCmd) // rootCmd.AddCommand(sdkCmd) } +// initConfig is called during initialization to set up configuration. +// Currently empty, but can be extended to support additional configuration options. func initConfig() { + // This function is currently empty but is called by Cobra during initialization. + // It can be used to read in config files or set up environment variables. } +// main is the entry point for the interLink installer CLI. +// It executes the root command and handles any errors. func main() { - - rootCmd.Execute() - + // Execute the root command + err := rootCmd.Execute() + if err != nil { + log.Fatal(err) + } } diff --git a/cmd/installer/templates/configs.yaml b/cmd/installer/templates/configs.yaml deleted file mode 100644 index c2de7e0c..00000000 --- a/cmd/installer/templates/configs.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: v1 -data: - InterLinkConfig.yaml: | - InterlinkURL: https://{{.InterLinkIP}} - InterlinkPort: {{.InterLinkPort}} - CommandPrefix: "" - ExportPodData: true - ServiceAccount: "interlink" - Namespace: {{.Namespace}} - VKTokenFile: /opt/interlink/token - CPU: "{{.VKLimits.CPU}}" - Memory: "{{.VKLimits.Memory}}" - Pods: "{{.VKLimits.Pods}}" -kind: ConfigMap -metadata: - name: "{{.VKName}}-config" - namespace: {{.Namespace}} diff --git a/cmd/installer/templates/deployment.yaml b/cmd/installer/templates/deployment.yaml deleted file mode 100644 index 4154bc51..00000000 --- a/cmd/installer/templates/deployment.yaml +++ /dev/null @@ -1,89 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{.VKName}} - namespace: {{.Namespace}} - labels: - nodeName: {{.VKName}} -spec: - replicas: 1 - selector: - matchLabels: - nodeName: {{.VKName}} - template: - metadata: - labels: - nodeName: {{.VKName}} - spec: - dnsConfig: - nameservers: - - 8.8.8.8 - containers: - - name: inttw-vk - image: ghcr.io/intertwin-eu/interlink/virtual-kubelet-inttw:{{.InterLinkVersion}} - imagePullPolicy: Always - env: - - name: NODENAME - value: {{.VKName}} - - name: KUBELET_PORT - value: "10250" - - name: POD_IP - valueFrom: - fieldRef: - fieldPath: status.podIP - - name: CONFIGPATH - value: "/etc/interlink/InterLinkConfig.yaml" - - name: VKTOKENFILE - value: "/opt/interlink/token" - volumeMounts: - - name: config - mountPath: /etc/interlink/InterLinkConfig.yaml - subPath: InterLinkConfig.yaml - - name: token - mountPath: /opt/interlink - resources: - limits: - cpu: 2000m - memory: 2Gi - requests: - cpu: 100m - memory: 200Mi - - name: refresh-token - image: ghcr.io/intertwin-eu/interlink/virtual-kubelet-inttw-refresh:{{.InterLinkVersion}} - imagePullPolicy: Always - env: - - name: IAM_TOKEN_ENDPOINT - value: {{.OAUTH.TokenURL}} - - name: IAM_CLIENT_ID - value: {{.OAUTH.ClientID}} - - name: IAM_CLIENT_SECRET - value: "{{.OAUTH.ClientSecret}}" - - name: IAM_GRANT_TYPE - value: {{.OAUTH.GrantType}} - - name: IAM_REFRESH_TOKEN - value: {{.OAUTH.RefreshToken}} - - name: IAM_VK_AUD - value: {{.OAUTH.Audience}} - - name: TOKEN_PATH - value: /opt/interlink/token - command: - - python3 - - /opt/refresh.py - resources: - limits: - cpu: 200m - memory: 500Mi - requests: - cpu: 100m - memory: 300Mi - volumeMounts: - - name: token - mountPath: /opt/interlink - serviceAccountName: {{.VKName}} - volumes: - - name: config - configMap: - # Provide the name of the ConfigMap you want to mount. - name: {{.VKName}}-config - - name: token - emptyDir: {} diff --git a/cmd/installer/templates/interlink-install.sh b/cmd/installer/templates/interlink-install.sh index 0bff1517..f83e7b03 100644 --- a/cmd/installer/templates/interlink-install.sh +++ b/cmd/installer/templates/interlink-install.sh @@ -3,73 +3,83 @@ OS=$(uname -s) case "$OS" in - Darwin) - OS=MacOS - ;; +Darwin) + OS=MacOS + ;; esac OSARCH=$(uname -m) case "$OSARCH" in - x86_64) - OSARCH=amd64 - ;; +x86_64) + OSARCH=amd64 + ;; +aarch64) + OSARCH=arm64 + ;; esac - #echo $OS -OS_LOWER=$(uname -s | tr '[:upper:]' '[:lower:]') +OS_LOWER=$(uname -s | tr '[:upper:]' '[:lower:]') + +install() { + mkdir -p ${HOME}/.interlink/logs || exit 1 + mkdir -p ${HOME}/.interlink/bin || exit 1 + mkdir -p ${HOME}/.interlink/config || exit 1 -install () { - mkdir -p $HOME/.interlink/logs || exit 1 - mkdir -p $HOME/.interlink/bin || exit 1 - mkdir -p $HOME/.interlink/config || exit 1 - # set $HOME/.interlink/config/InterLinkConfig.yaml + # TODO download also service files for systemd - cat <>$HOME/.interlink/config/InterLinkConfig.yaml -InterlinkAddress: "http://localhost" -InterlinkPort: "30080" -SidecarURL: "http://localhost" -SidecarPort: "4000" -VerboseLogging: true + cat <${HOME}/.interlink/config/InterLinkConfig.yaml +InterlinkAddress: "unix://${HOME}/.interlink/.interlink.sock" +InterlinkPort: "0" +SidecarURL: "unix://${HOME}/.interlink/.plugin.sock" +SidecarPort: "0" +VerboseLogging: false ErrorsOnlyLogging: false -ExportPodData: true DataRootFolder: "~/.interlink" EOF - echo "=== Configured to reach sidecar service on http://localhost:4000 . You can edit this behavior changing $HOME/.interlink/config/InterLinkConfig.yaml file. ===" + INTERLINK_OS=$(uname -s) + INTERLINK_ARCH=$(uname -m) + + # aarch64 is arm64 in golang. The goreleaser does not consider aarch64 as a different architecture. + if [ "$INTERLINK_ARCH" = "aarch64" ]; then + INTERLINK_ARCH="arm64" + fi + + echo "=== Configured to reach sidecar service on unix://${HOME}/.interlink/.plugin.sock. ===" - ## Download binaries to $HOME/.local/interlink/ - echo "curl --fail -L -o ${HOME}/.interlink/bin/interlink https://github.com/interTwin-eu/interLink/releases/download/{{.InterLinkVersion}}/interlink_$(uname -s)_$(uname -m)" + ## Download binaries to ${HOME}/.local/interlink/ + echo "curl --fail -L -o ${HOME}/.interlink/bin/interlink https://github.com/interlink-hq/interLink/releases/download/{{.InterLinkVersion}}/interlink_${INTERLINK_OS}_${INTERLINK_ARCH}" { - { - curl --fail -L -o ${HOME}/.interlink/bin/interlink https://github.com/interTwin-eu/interLink/releases/download/{{.InterLinkVersion}}/interlink_$(uname -s)_$(uname -m) - chmod +x ${HOME}/.interlink/bin/interlink - } || { - echo "Error downloading InterLink binaries, exiting..." - exit 1 - } - } + { + curl --fail -L -o ${HOME}/.interlink/bin/interlink https://github.com/interlink-hq/interLink/releases/download/{{.InterLinkVersion}}/interlink_${INTERLINK_OS}_${INTERLINK_ARCH} + chmod +x ${HOME}/.interlink/bin/interlink + } || { + echo "Error downloading InterLink binaries, exiting..." + exit 1 + } + } ## Download oauth2 proxy case "$OS" in Darwin) - go install github.com/oauth2-proxy/oauth2-proxy/v7@latest - ;; + go install github.com/oauth2-proxy/oauth2-proxy/v7@latest + ;; Linux) - echo "https://github.com/oauth2-proxy/oauth2-proxy/releases/download/v7.6.0/oauth2-proxy-v7.6.0.${OS_LOWER}-$OSARCH.tar.gz" + echo "https://github.com/oauth2-proxy/oauth2-proxy/releases/download/v7.6.0/oauth2-proxy-v7.6.0.${OS_LOWER}-$OSARCH.tar.gz" + { { - { - curl --fail -L -o ${HOME}/.interlink/bin/oauth2-proxy https://github.com/dciangot/oauth2-proxy/releases/download/v0.0.3/oauth2-proxy_${OS}_$OSARCH - chmod +x ${HOME}/.interlink/bin/oauth2-proxy - } || { - echo "Error downloading OAuth binaries, exiting..." - exit 1 - } + curl --fail -L -o ${HOME}/.interlink/bin/oauth2-proxy https://github.com/dciangot/oauth2-proxy/releases/download/v0.0.3/oauth2-proxy_${OS}_$OSARCH + chmod +x ${HOME}/.interlink/bin/oauth2-proxy + } || { + echo "Error downloading OAuth binaries, exiting..." + exit 1 } + } - ;; + ;; esac if [[ ! -f ${HOME}/.interlink/config/tls.key || ! -f ${HOME}/.interlink/config/tls.crt ]]; then @@ -77,104 +87,104 @@ EOF openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \ -keyout ${HOME}/.interlink/config/tls.key \ -out ${HOME}/.interlink/config/tls.crt \ - -subj "/CN=interlink.demo" -addext "subjectAltName=IP:{{.InterLinkIP}}" + -subj "/CN=interlink.demo" -addext "subjectAltName=IP:{{.InterLinkIP}}" fi } start() { - case "{{.OAUTH.Provider}}" in - oidc) - $HOME/.interlink/bin/oauth2-proxy \ - --client-id "{{.OAUTH.ClientID}}" \ - --client-secret "\"{{.OAUTH.ClientSecret}}\"" \ - --http-address 0.0.0.0:{{.InterLinkPort}} \ - --oidc-issuer-url "{{.OAUTH.Issuer}}" \ - --pass-authorization-header true \ - --provider oidc \ - --redirect-url http://localhost:8081 \ - --oidc-extra-audience {{.OAUTH.Audience}} \ - --upstream http://localhost:30080 \ - --allowed-group {{.OAUTH.Group}} \ - --validate-url {{.OAUTH.TokenURL}} \ - --oidc-groups-claim {{.OAUTH.GroupClaim}} \ - --email-domain=* \ - --cookie-secret 2ISpxtx19fm7kJlhbgC4qnkuTlkGrshY82L3nfCSKy4= \ - --skip-auth-route="*='*'" \ - --force-https \ - --https-address 0.0.0.0:{{.InterLinkPort}} \ - --tls-cert-file ${HOME}/.interlink/config/tls.crt \ - --tls-key-file ${HOME}/.interlink/config/tls.key \ - --tls-cipher-suite=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_256_GCM_SHA384 \ - --skip-jwt-bearer-tokens true > $HOME/.interlink/logs/oauth2-proxy.log 2>&1 & - - echo $! > $HOME/.interlink/oauth2-proxy.pid - ;; - github) - $HOME/.interlink/bin/oauth2-proxy \ - --client-id {{.OAUTH.ClientID}} \ - --client-secret {{.OAUTH.ClientSecret}} \ - --http-address 0.0.0.0:{{.InterLinkPort}} \ - --pass-authorization-header true \ - --provider github \ - --redirect-url http://localhost:8081 \ - --upstream http://localhost:30080 \ - --email-domain="*" \ - --github-user="{{.OAUTH.GitHUBUser}}" \ - --cookie-secret 2ISpxtx19fm7kJlhbgC4qnkuTlkGrshY82L3nfCSKy4= \ - --skip-auth-route="*='*'" \ - --force-https \ - --https-address 0.0.0.0:{{.InterLinkPort}} \ - --tls-cert-file ${HOME}/.interlink/config/tls.crt \ - --tls-key-file ${HOME}/.interlink/config/tls.key \ - --tls-cipher-suite=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_256_GCM_SHA384 \ - --skip-jwt-bearer-tokens true > $HOME/.interlink/logs/oauth2-proxy.log 2>&1 & - - echo $! > $HOME/.interlink/oauth2-proxy.pid - ;; + case "{{.OAUTH.Provider}}" in + oidc) + ${HOME}/.interlink/bin/oauth2-proxy \ + --client-id "{{.OAUTH.ClientID}}" \ + --client-secret "\"{{.OAUTH.ClientSecret}}\"" \ + --oidc-issuer-url "{{.OAUTH.Issuer}}" \ + --pass-authorization-header true \ + --provider oidc \ + --redirect-url http://localhost:8081 \ + --oidc-extra-audience {{.OAUTH.Audience}} \ + --upstream unix://${HOME}/.interlink/.interlink.sock \ + --allowed-group {{.OAUTH.Group}} \ + --validate-url {{.OAUTH.TokenURL}} \ + --oidc-groups-claim {{.OAUTH.GroupClaim}} \ + --email-domain=* \ + --cookie-secret 2ISpxtx19fm7kJlhbgC4qnkuTlkGrshY82L3nfCSKy4= \ + --skip-auth-route="*='*'" \ + --force-https \ + --https-address 0.0.0.0:{{.InterLinkPort}} \ + --tls-cert-file ${HOME}/.interlink/config/tls.crt \ + --tls-key-file ${HOME}/.interlink/config/tls.key \ + --tls-cipher-suite=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_256_GCM_SHA384 \ + --skip-jwt-bearer-tokens true >${HOME}/.interlink/logs/oauth2-proxy.log 2>&1 & + + echo $! >${HOME}/.interlink/oauth2-proxy.pid + ;; + github) + ${HOME}/.interlink/bin/oauth2-proxy \ + --client-id {{.OAUTH.ClientID}} \ + --client-secret {{.OAUTH.ClientSecret}} \ + --pass-authorization-header true \ + --provider github \ + --redirect-url http://localhost:8081 \ + --upstream unix://${HOME}/.interlink/.interlink.sock \ + --email-domain="*" \ + --github-user="{{.OAUTH.GitHUBUser}}" \ + --cookie-secret 2ISpxtx19fm7kJlhbgC4qnkuTlkGrshY82L3nfCSKy4= \ + --skip-auth-route="*='*'" \ + --force-https \ + --https-address 0.0.0.0:{{.InterLinkPort}} \ + --tls-cert-file ${HOME}/.interlink/config/tls.crt \ + --tls-key-file ${HOME}/.interlink/config/tls.key \ + --tls-cipher-suite=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_256_GCM_SHA384 \ + --skip-jwt-bearer-tokens true >${HOME}/.interlink/logs/oauth2-proxy.log 2>&1 & + + echo $! >${HOME}/.interlink/oauth2-proxy.pid + ;; esac - ## start interLink - export INTERLINKCONFIGPATH=$HOME/.interlink/config/InterLinkConfig.yaml - $HOME/.interlink/bin/interlink &> $HOME/.interlink/logs/interlink.log & - echo $! > $HOME/.interlink/interlink.pid + ## start interLink + export INTERLINKCONFIGPATH=${HOME}/.interlink/config/InterLinkConfig.yaml + ${HOME}/.interlink/bin/interlink &>${HOME}/.interlink/logs/interlink.log & + echo $! >${HOME}/.interlink/interlink.pid + + ## TODO: if RUN_SLURM=1 then manage also slurm } -stop () { - kill $(cat $HOME/.interlink/oauth2-proxy.pid) - kill $(cat $HOME/.interlink/interlink.pid) +stop() { + kill $(cat ${HOME}/.interlink/oauth2-proxy.pid) + kill $(cat ${HOME}/.interlink/interlink.pid) } -help () { - echo -e "\n\ninstall: Downloads InterLink and OAuth binaries, as well as InterLink configuration. Files are stored in $HOME/.interlink\n\n" - echo -e "start: Starts the OAuth proxy, the InterLink API.\n" - echo -e "stop: Kills all the previously started processes\n\n" - echo -e "restart: Kills all started processes and start them again\n\n" - echo -e "help: Shows this command list" +help() { + echo -e "\n\ninstall: Downloads InterLink and OAuth binaries, as well as InterLink configuration. Files are stored in ${HOME}/.interlink\n\n" + echo -e "start: Starts the OAuth proxy, the InterLink API.\n" + echo -e "stop: Kills all the previously started processes\n\n" + echo -e "restart: Kills all started processes and start them again\n\n" + echo -e "help: Shows this command list" } case "$1" in - install) - install - ;; - start) - start - ;; - stop) - stop - ;; - restart) - stop - start - ;; - help) - help - ;; - *) - echo -e "You need to specify one of the following commands:" - help - ;; +install) + install + ;; +start) + start + ;; +stop) + stop + ;; +restart) + stop + start + ;; +help) + help + ;; +*) + echo -e "You need to specify one of the following commands:" + help + ;; esac diff --git a/cmd/installer/templates/namespace.yaml b/cmd/installer/templates/namespace.yaml deleted file mode 100644 index 337ae06c..00000000 --- a/cmd/installer/templates/namespace.yaml +++ /dev/null @@ -1,4 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: {{.Namespace}} diff --git a/cmd/installer/templates/service-account.yaml b/cmd/installer/templates/service-account.yaml deleted file mode 100644 index 9310ea31..00000000 --- a/cmd/installer/templates/service-account.yaml +++ /dev/null @@ -1,88 +0,0 @@ -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{.VKName}} - namespace: {{.Namespace}} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{.VKName}} - namespace: interlink -rules: -- apiGroups: - - "coordination.k8s.io" - resources: - - leases - verbs: - - update - - create - - get - - list - - watch - - patch -- apiGroups: - - "" - resources: - - namespaces - - configmaps - - secrets - - services - - serviceaccounts - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - pods - verbs: - - delete - - get - - list - - watch - - patch -- apiGroups: - - "" - resources: - - nodes - verbs: - - create - - get -- apiGroups: - - "" - resources: - - nodes/status - verbs: - - update - - patch -- apiGroups: - - "" - resources: - - pods/status - verbs: - - update - - patch -- apiGroups: - - "" - resources: - - events - verbs: - - create - - patch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{.VKName}} - namespace: {{.Namespace}} -subjects: -- kind: ServiceAccount - name: {{.VKName}} - namespace: {{.Namespace}} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{.VKName}} - diff --git a/cmd/installer/templates/values.yaml b/cmd/installer/templates/values.yaml new file mode 100644 index 00000000..c1d3f647 --- /dev/null +++ b/cmd/installer/templates/values.yaml @@ -0,0 +1,34 @@ +nodeName: {{.VKName}} + +interlink: + + address: https://{{.InterLinkIP}} + port: {{.InterLinkPort}} + disableProjectedVolumes: true + +virtualNode: + resources: + CPUs: {{.VKLimits.CPU}} + memGiB: {{.VKLimits.Memory}} + pods: {{.VKLimits.Pods}} + HTTPProxies: + HTTP: null + HTTPs: null + HTTP: + Insecure: {{.HTTPInsecure}} + # uncomment to enable custom nodeSelector and nodeTaints + #nodeLabels: + # - "accelerator=a100" + #nodeTaints: + # - key: "accelerator" + # value: "a100" + # effect: "NoSchedule" + +OAUTH: + enabled: true + TokenURL: {{.OAUTH.TokenURL}} + ClientID: {{.OAUTH.ClientID}} + ClientSecret: {{.OAUTH.ClientSecret}} + RefreshToken: {{.OAUTH.RefreshToken}} + GrantType: {{.OAUTH.GrantType}} + Audience: {{.OAUTH.Audience}} diff --git a/cmd/interlink/main.go b/cmd/interlink/main.go index c41afee3..8f2196ca 100644 --- a/cmd/interlink/main.go +++ b/cmd/interlink/main.go @@ -2,11 +2,8 @@ package main import ( "context" - "crypto/tls" - "crypto/x509" "flag" "fmt" - "io/ioutil" "net" "net/http" "os" @@ -15,137 +12,29 @@ import ( "syscall" "time" - "github.com/google/uuid" "github.com/sirupsen/logrus" "github.com/virtual-kubelet/virtual-kubelet/log" logruslogger "github.com/virtual-kubelet/virtual-kubelet/log/logrus" "github.com/virtual-kubelet/virtual-kubelet/trace" "github.com/virtual-kubelet/virtual-kubelet/trace/opentelemetry" - "google.golang.org/grpc" - "google.golang.org/grpc/connectivity" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/credentials/insecure" - types "github.com/intertwin-eu/interlink/pkg/interlink" - "github.com/intertwin-eu/interlink/pkg/interlink/api" - "github.com/intertwin-eu/interlink/pkg/virtualkubelet" - - "go.opentelemetry.io/otel" - "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" - "go.opentelemetry.io/otel/propagation" - "go.opentelemetry.io/otel/sdk/resource" - sdktrace "go.opentelemetry.io/otel/sdk/trace" - semconv "go.opentelemetry.io/otel/semconv/v1.21.0" + "github.com/interlink-hq/interlink/pkg/interlink" + "github.com/interlink-hq/interlink/pkg/interlink/api" + "github.com/interlink-hq/interlink/pkg/virtualkubelet" ) -func initProvider(ctx context.Context) (func(context.Context) error, error) { - log.G(ctx).Info("Tracing is enabled, setting up the TracerProvider") - - // Get the TELEMETRY_UNIQUE_ID from the environment, if it is not set, use the hostname - uniqueID := os.Getenv("TELEMETRY_UNIQUE_ID") - if uniqueID == "" { - log.G(ctx).Info("No TELEMETRY_UNIQUE_ID set, generating a new one") - newUUID := uuid.New() - uniqueID = newUUID.String() - log.G(ctx).Info("Generated unique ID: ", uniqueID, " use InterLink-Plugin-"+uniqueID+" as service name from Grafana") - } - - serviceName := "InterLink-Plugin-" + uniqueID - - res, err := resource.New(ctx, - resource.WithAttributes( - // the service name used to display traces in backends - semconv.ServiceName(serviceName), - ), - ) - if err != nil { - return nil, fmt.Errorf("failed to create resource: %w", err) - } - - ctx, cancel := context.WithTimeout(ctx, time.Second) - defer cancel() - - otlpEndpoint := os.Getenv("TELEMETRY_ENDPOINT") - - if otlpEndpoint == "" { - otlpEndpoint = "localhost:4317" - } - - log.G(ctx).Info("TELEMETRY_ENDPOINT: ", otlpEndpoint) - - caCrtFilePath := os.Getenv("TELEMETRY_CA_CRT_FILEPATH") - - conn := &grpc.ClientConn{} - if caCrtFilePath != "" { - - // if the CA certificate is provided, set up mutual TLS - - log.G(ctx).Info("CA certificate provided, setting up mutual TLS") - - caCert, err := ioutil.ReadFile(caCrtFilePath) - if err != nil { - return nil, fmt.Errorf("failed to load CA certificate: %w", err) - } - - clientKeyFilePath := os.Getenv("TELEMETRY_CLIENT_KEY_FILEPATH") - if clientKeyFilePath == "" { - return nil, fmt.Errorf("client key file path not provided. Since a CA certificate is provided, a client key is required for mutual TLS") - } - - clientCrtFilePath := os.Getenv("TELEMETRY_CLIENT_CRT_FILEPATH") - if clientCrtFilePath == "" { - return nil, fmt.Errorf("client certificate file path not provided. Since a CA certificate is provided, a client certificate is required for mutual TLS") - } - - certPool := x509.NewCertPool() - if !certPool.AppendCertsFromPEM(caCert) { - return nil, fmt.Errorf("failed to append CA certificate") - } - - cert, err := tls.LoadX509KeyPair(clientCrtFilePath, clientKeyFilePath) - if err != nil { - return nil, fmt.Errorf("failed to load client certificate: %w", err) - } - - tlsConfig := &tls.Config{ - Certificates: []tls.Certificate{cert}, - RootCAs: certPool, - MinVersion: tls.VersionTLS12, - InsecureSkipVerify: true, - } - creds := credentials.NewTLS(tlsConfig) - conn, err = grpc.NewClient(otlpEndpoint, grpc.WithTransportCredentials(creds), grpc.WithBlock()) - - } else { - conn, err = grpc.NewClient(otlpEndpoint, grpc.WithTransportCredentials(insecure.NewCredentials())) - } - - conn.WaitForStateChange(ctx, connectivity.Ready) +// UnixSocketRoundTripper is a custom RoundTripper for Unix socket connections +type UnixSocketRoundTripper struct { + Transport http.RoundTripper +} - if err != nil { - return nil, fmt.Errorf("failed to create gRPC connection to collector: %w", err) +func (rt *UnixSocketRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + if strings.HasPrefix(req.URL.Scheme, "http+unix") { + // Adjust the URL for Unix socket connections + req.URL.Scheme = "http" + req.URL.Host = "unix" } - - // Set up a trace exporter - traceExporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithGRPCConn(conn)) - if err != nil { - return nil, fmt.Errorf("failed to create trace exporter: %w", err) - } - - // Register the trace exporter with a TracerProvider, using a batch - // span processor to aggregate spans before export. - bsp := sdktrace.NewBatchSpanProcessor(traceExporter) - tracerProvider := sdktrace.NewTracerProvider( - sdktrace.WithSampler(sdktrace.AlwaysSample()), - sdktrace.WithResource(res), - sdktrace.WithSpanProcessor(bsp), - ) - otel.SetTracerProvider(tracerProvider) - - // set global propagator to tracecontext (the default is no-op). - otel.SetTextMapPropagator(propagation.TraceContext{}) - - return tracerProvider.Shutdown, nil + return rt.Transport.RoundTrip(req) } func main() { @@ -157,9 +46,9 @@ func main() { return } var cancel context.CancelFunc - api.PodStatuses.Statuses = make(map[string]types.PodStatus) + api.PodStatuses.Statuses = make(map[string]interlink.PodStatus) - interLinkConfig, err := types.NewInterLinkConfig() + interLinkConfig, err := interlink.NewInterLinkConfig() if err != nil { panic(err) } @@ -177,7 +66,7 @@ func main() { defer cancel() if os.Getenv("ENABLE_TRACING") == "1" { - shutdown, err := initProvider(ctx) + shutdown, err := interlink.InitTracer(ctx, "InterLink-Plugin-") if err != nil { log.G(ctx).Fatal(err) } @@ -189,7 +78,6 @@ func main() { log.G(ctx).Info("Tracer setup succeeded") - // TODO: disable this through options trace.T = opentelemetry.Adapter{} } @@ -198,27 +86,46 @@ func main() { log.G(ctx).Info("interLink version: ", virtualkubelet.KubeletVersion) sidecarEndpoint := "" - if strings.HasPrefix(interLinkConfig.Sidecarurl, "unix://") { - sidecarEndpoint = interLinkConfig.Sidecarurl - // Dial the Unix socket - conn, err := net.Dial("unix", sidecarEndpoint) - if err != nil { - panic(err) - } + var socketPath string - http.DefaultTransport.(*http.Transport).DialContext = func(_ context.Context, _, _ string) (net.Conn, error) { - return conn, nil - } - } else if strings.HasPrefix(interLinkConfig.Sidecarurl, "http://") { + switch { + case strings.HasPrefix(interLinkConfig.Sidecarurl, "unix://"): + socketPath = strings.ReplaceAll(interLinkConfig.Sidecarurl, "unix://", "") + sidecarEndpoint = "http+unix://" + case strings.HasPrefix(interLinkConfig.Sidecarurl, "http://"): sidecarEndpoint = interLinkConfig.Sidecarurl + ":" + interLinkConfig.Sidecarport - } else { + default: log.G(ctx).Fatal("Sidecar URL should either start per unix:// or http://: getting ", interLinkConfig.Sidecarurl) } + dialer := &net.Dialer{ + Timeout: 90 * time.Second, + KeepAlive: 90 * time.Second, + } + transport := &http.Transport{ + MaxConnsPerHost: 10000, + MaxIdleConnsPerHost: 1000, + IdleConnTimeout: 120 * time.Second, + ResponseHeaderTimeout: 120 * time.Second, + DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { + if strings.HasPrefix(addr, "unix:") { + return dialer.DialContext(ctx, "unix", socketPath) + } + return dialer.DialContext(ctx, network, addr) + }, + } + + clientHTTP := &http.Client{ + Transport: &UnixSocketRoundTripper{ + Transport: transport, + }, + } + interLinkAPIs := api.InterLinkHandler{ Config: interLinkConfig, Ctx: ctx, SidecarEndpoint: sidecarEndpoint, + ClientHTTP: clientHTTP, } mutex := http.NewServeMux() @@ -230,7 +137,8 @@ func main() { mutex.HandleFunc("/updateCache", interLinkAPIs.UpdateCacheHandler) interLinkEndpoint := "" - if strings.HasPrefix(interLinkConfig.InterlinkAddress, "unix://") { + switch { + case strings.HasPrefix(interLinkConfig.InterlinkAddress, "unix://"): interLinkEndpoint = interLinkConfig.InterlinkAddress // Create a Unix domain socket and listen for incoming connections. @@ -244,7 +152,7 @@ func main() { signal.Notify(c, os.Interrupt, syscall.SIGTERM) go func() { <-c - os.Remove(interLinkEndpoint) + os.Remove(strings.ReplaceAll(interLinkEndpoint, "unix://", "")) os.Exit(1) }() server := http.Server{ @@ -256,15 +164,21 @@ func main() { if err := server.Serve(socket); err != nil { log.G(ctx).Fatal(err) } - } else if strings.HasPrefix(interLinkConfig.InterlinkAddress, "http://") { - interLinkEndpoint = strings.Replace(interLinkConfig.InterlinkAddress, "http://", "", -1) + ":" + interLinkConfig.Interlinkport + case strings.HasPrefix(interLinkConfig.InterlinkAddress, "http://"): + interLinkEndpoint = strings.ReplaceAll(interLinkConfig.InterlinkAddress, "http://", "") + ":" + interLinkConfig.Interlinkport - err = http.ListenAndServe(interLinkEndpoint, mutex) + server := http.Server{ + Addr: interLinkEndpoint, + Handler: mutex, + ReadTimeout: 30 * time.Second, + ReadHeaderTimeout: 10 * time.Second, + } + err = server.ListenAndServe() if err != nil { log.G(ctx).Fatal(err) } - } else { + default: log.G(ctx).Fatal("Interlink URL should either start per unix:// or http://. Getting: ", interLinkConfig.InterlinkAddress) } } diff --git a/cmd/openapi-gen/main.go b/cmd/openapi-gen/main.go new file mode 100644 index 00000000..44958ad0 --- /dev/null +++ b/cmd/openapi-gen/main.go @@ -0,0 +1,116 @@ +package main + +import ( + "flag" + "fmt" + "log" + "net/http" + "os" + + "github.com/interlink-hq/interlink/pkg/interlink" + "github.com/swaggest/openapi-go" + "github.com/swaggest/openapi-go/openapi3" + corev1 "k8s.io/api/core/v1" +) + +func main() { + version := flag.String("version", "0.4.0", "generate API spec for this version") + flag.Parse() + + reflector := openapi3.Reflector{} + reflector.Spec = &openapi3.Spec{Openapi: "3.0.3"} + reflector.Spec.Info. + WithTitle("interLink server API"). + WithVersion(*version). + WithDescription("This is the API spec for the Virtual Kubelet to interLink API server communication") + + createOp, err := reflector.NewOperationContext(http.MethodPost, "/create") + if err != nil { + panic(err) + } + + // CREATE + createOp.AddReqStructure(new(interlink.PodCreateRequests)) + createOp.AddRespStructure(new(interlink.RetrievedPodData), func(cu *openapi.ContentUnit) { cu.HTTPStatus = http.StatusOK }) + + err = reflector.AddOperation(createOp) + if err != nil { + panic(err) + } + + // DELETE + deleteOp, err := reflector.NewOperationContext(http.MethodPost, "/delete") + if err != nil { + panic(err) + } + + deleteOp.AddReqStructure(new(corev1.Pod)) + deleteOp.AddRespStructure(nil, func(cu *openapi.ContentUnit) { cu.HTTPStatus = http.StatusOK }) + + err = reflector.AddOperation(deleteOp) + if err != nil { + panic(err) + } + + // Ping + pingOp, err := reflector.NewOperationContext(http.MethodPost, "/pinglink") + if err != nil { + panic(err) + } + + pingOp.AddReqStructure(nil) + pingOp.AddRespStructure(nil, func(cu *openapi.ContentUnit) { cu.HTTPStatus = http.StatusOK }) + + err = reflector.AddOperation(pingOp) + if err != nil { + panic(err) + } + + // Status + statusOp, err := reflector.NewOperationContext(http.MethodPost, "/status") + if err != nil { + panic(err) + } + + statusOp.AddReqStructure(new([]corev1.Pod)) + statusOp.AddRespStructure(new([]interlink.PodStatus), func(cu *openapi.ContentUnit) { cu.HTTPStatus = http.StatusOK }) + + err = reflector.AddOperation(statusOp) + if err != nil { + panic(err) + } + + // Logs + logsOp, err := reflector.NewOperationContext(http.MethodPost, "/getLogs") + if err != nil { + panic(err) + } + + logsOp.AddReqStructure(new(interlink.LogStruct)) + logsOp.AddRespStructure(new(string), func(cu *openapi.ContentUnit) { cu.HTTPStatus = http.StatusOK }) + + err = reflector.AddOperation(logsOp) + if err != nil { + panic(err) + } + + schema, err := reflector.Spec.MarshalJSON() + if err != nil { + log.Fatal(err) + } + fmt.Println(string(schema)) + + // Write the JSON data to the file + file, err := os.Create("./docs/openapi/interlink-openapi.json") + if err != nil { + panic(err) + } + defer file.Close() + + _, err = file.Write(schema) + if err != nil { + panic(err) + } + + fmt.Println("Successfully wrote to ./docs/openapi/interlink-openapi.json") +} diff --git a/cmd/ssh-tunnel/main.go b/cmd/ssh-tunnel/main.go new file mode 100644 index 00000000..0880beb5 --- /dev/null +++ b/cmd/ssh-tunnel/main.go @@ -0,0 +1,143 @@ +package main + +import ( + "encoding/base64" + "flag" + "fmt" + "io" + "log" + "net" + "os" + + "golang.org/x/crypto/ssh" +) + +func runTunnel(local, remote net.Conn) { + defer local.Close() + defer remote.Close() + done := make(chan struct{}, 2) + + go func() { + _, err := io.Copy(local, remote) + if err != nil { + log.Fatal(err) + return + } + done <- struct{}{} + }() + + go func() { + _, err := io.Copy(remote, local) + if err != nil { + log.Fatal(err) + return + } + done <- struct{}{} + }() + + <-done +} + +// https://stackoverflow.com/questions/44269142/golang-ssh-getting-must-specify-hoskeycallback-error-despite-setting-it-to-n +// create human-readable SSH-key strings +func keyString(k ssh.PublicKey) string { + return k.Type() + " " + base64.StdEncoding.EncodeToString(k.Marshal()) // e.g. "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTY...." +} + +func trustedHostKeyCallback(trustedKey ssh.PublicKey) ssh.HostKeyCallback { + + if trustedKey == nil { + return func(_ string, _ net.Addr, k ssh.PublicKey) error { + log.Printf("WARNING: SSH-key verification is *NOT* in effect: to fix, add this trustedKey: %q", keyString(k)) + return nil + } + } + + return ssh.FixedHostKey(trustedKey) +} + +func main() { + addr := flag.String("addr", "", "ssh server address to dial as :") + username := flag.String("user", "", "username for ssh") + keyFile := flag.String("keyfile", "", "file with private key for SSH authentication") + remotePort := flag.String("rport", "", "remote port for tunnel") + localSocket := flag.String("lsock", "", "local socket for tunnel") + hostkeyFile := flag.String("hostkeyfile", "", "file with public key for SSH host check") + flag.Parse() + + var hostKeyCallback ssh.HostKeyCallback + + if *hostkeyFile == "" { + log.Print("No hostkey passed, proceeding with insecure hostkey callback mode") + hostKeyCallback = ssh.HostKeyCallback( + func(_ string, _ net.Addr, _ ssh.PublicKey) error { + return nil + }) + } else { + pubkey, err := os.ReadFile(*hostkeyFile) + if err != nil { + log.Fatalf("unable to hostkeyFile: %v", err) + } + hostkey, err := ssh.ParsePublicKey(pubkey) + if err != nil { + log.Fatalf("unable to parse private key: %v", err) + } + + hostKeyCallback = trustedHostKeyCallback(hostkey) + } + + key, err := os.ReadFile(*keyFile) + if err != nil { + log.Fatalf("unable to read private key: %v", err) + } + signer, err := ssh.ParsePrivateKey(key) + if err != nil { + log.Fatalf("unable to parse private key: %v", err) + } + // An SSH client is represented with a ClientConn. + // + // To authenticate with the remote server you must pass at least one + // implementation of AuthMethod via the Auth field in ClientConfig, + // and provide a HostKeyCallback. + config := &ssh.ClientConfig{ + User: *username, + Auth: []ssh.AuthMethod{ + ssh.PublicKeys(signer), + }, + HostKeyCallback: hostKeyCallback, + } + + client, err := ssh.Dial("tcp", *addr, config) + if err != nil { + log.Panicf("Failed to dial: %v", err) + } + defer client.Close() + + listener, err := client.Listen("tcp", "localhost:"+*remotePort) + if err != nil { + client.Close() + log.Panicf("Failed to listen on remote socket %s: %v", *remotePort, err) + } + defer listener.Close() + + log.Printf("Listening on remote socket %s", *remotePort) + for { + remote, err := listener.Accept() + if err != nil { + log.Printf("Failed to accept connection on remote socket %s: %v", *remotePort, err) + continue + } + log.Printf("Accepted connection on remote socket %s", *remotePort) + go func() { + local, err := net.Dial("unix", *localSocket) + if err != nil { + log.Printf("Failed to dial local socket %s: %v", *localSocket, err) + remote.Close() + return + } + log.Printf("Connected to local socket %s", *localSocket) + fmt.Println("tunnel established with", local.LocalAddr()) + runTunnel(local, remote) + }() + } +} diff --git a/cmd/virtual-kubelet/main.go b/cmd/virtual-kubelet/main.go index e8dc2824..930b0170 100644 --- a/cmd/virtual-kubelet/main.go +++ b/cmd/virtual-kubelet/main.go @@ -18,11 +18,10 @@ package main import ( "context" "crypto/tls" - "crypto/x509" "flag" "fmt" - "io/ioutil" "net" + "net/http" "os" "path" "strconv" @@ -30,10 +29,7 @@ import ( "time" // "k8s.io/client-go/rest" - "google.golang.org/grpc" - "google.golang.org/grpc/connectivity" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/credentials/insecure" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/fields" "k8s.io/client-go/kubernetes/scheme" @@ -42,9 +38,7 @@ import ( "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/tools/record" - //certificates "k8s.io/api/certificates/v1" - - "net/http" + // certificates "k8s.io/api/certificates/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" @@ -61,17 +55,23 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/informers" - commonIL "github.com/intertwin-eu/interlink/pkg/virtualkubelet" + "github.com/interlink-hq/interlink/pkg/interlink" + commonIL "github.com/interlink-hq/interlink/pkg/virtualkubelet" +) - "go.opentelemetry.io/otel" - "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" - "go.opentelemetry.io/otel/propagation" - "go.opentelemetry.io/otel/sdk/resource" - sdktrace "go.opentelemetry.io/otel/sdk/trace" - semconv "go.opentelemetry.io/otel/semconv/v1.21.0" +// UnixSocketRoundTripper is a custom RoundTripper for Unix socket connections +type UnixSocketRoundTripper struct { + Transport http.RoundTripper +} - "github.com/google/uuid" -) +func (rt *UnixSocketRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + if strings.HasPrefix(req.URL.Scheme, "http+unix") { + // Adjust the URL for Unix socket connections + req.URL.Scheme = "http" + req.URL.Host = "unix" + } + return rt.Transport.RoundTrip(req) +} func PodInformerFilter(node string) informers.SharedInformerOption { return informers.WithTweakListOptions(func(options *metav1.ListOptions) { @@ -100,124 +100,6 @@ type Opts struct { ErrorsOnly bool } -func initProvider(ctx context.Context) (func(context.Context) error, error) { - - log.G(ctx).Info("Tracing is enabled, setting up the TracerProvider") - - // Get the TELEMETRY_UNIQUE_ID from the environment, if it is not set, use the hostname - uniqueID := os.Getenv("TELEMETRY_UNIQUE_ID") - if uniqueID == "" { - log.G(ctx).Info("No TELEMETRY_UNIQUE_ID set, generating a new one") - newUUID := uuid.New() - uniqueID = newUUID.String() - log.G(ctx).Info("Generated unique ID: ", uniqueID, " use VK-InterLink-"+uniqueID+" as service name from Grafana") - } - - // Create a new resource with the service name set to the TELEMETRY_UNIQUE_ID - // The nomenclature VK-InterLink- is used to identify the service in Grafana. - // VK-InterLink- means that the traces are coming from Virtual Kubelet - // and are related to the call that are made for the InterLink API service - - serviceName := "VK-InterLink-" + uniqueID - - res, err := resource.New(ctx, - resource.WithAttributes( - // the service name used to display traces in backends - semconv.ServiceName(serviceName), - ), - ) - if err != nil { - return nil, fmt.Errorf("failed to create resource: %w", err) - } - - ctx, cancel := context.WithTimeout(ctx, time.Second) - defer cancel() - - otlpEndpoint := os.Getenv("TELEMETRY_ENDPOINT") - - if otlpEndpoint == "" { - otlpEndpoint = "localhost:4317" - } - - log.G(ctx).Info("TELEMETRY_ENDPOINT: ", otlpEndpoint) - - caCrtFilePath := os.Getenv("TELEMETRY_CA_CRT_FILEPATH") - - conn := &grpc.ClientConn{} - if caCrtFilePath != "" { - - // if the CA certificate is provided, set up mutual TLS - - log.G(ctx).Info("CA certificate provided, setting up mutual TLS") - - caCert, err := ioutil.ReadFile(caCrtFilePath) - if err != nil { - return nil, fmt.Errorf("failed to load CA certificate: %w", err) - } - - clientKeyFilePath := os.Getenv("TELEMETRY_CLIENT_KEY_FILEPATH") - if clientKeyFilePath == "" { - return nil, fmt.Errorf("client key file path not provided. Since a CA certificate is provided, a client key is required for mutual TLS") - } - - clientCrtFilePath := os.Getenv("TELEMETRY_CLIENT_CRT_FILEPATH") - if clientCrtFilePath == "" { - return nil, fmt.Errorf("client certificate file path not provided. Since a CA certificate is provided, a client certificate is required for mutual TLS") - } - - certPool := x509.NewCertPool() - if !certPool.AppendCertsFromPEM(caCert) { - return nil, fmt.Errorf("failed to append CA certificate") - } - - cert, err := tls.LoadX509KeyPair(clientCrtFilePath, clientKeyFilePath) - if err != nil { - return nil, fmt.Errorf("failed to load client certificate: %w", err) - } - - tlsConfig := &tls.Config{ - Certificates: []tls.Certificate{cert}, - RootCAs: certPool, - MinVersion: tls.VersionTLS12, - InsecureSkipVerify: true, - } - creds := credentials.NewTLS(tlsConfig) - conn, err = grpc.NewClient(otlpEndpoint, grpc.WithTransportCredentials(creds), grpc.WithBlock()) - - } else { - // if the CA certificate is not provided, use an insecure connection - // this means that the telemetry collector is not using a certificate, i.e. is inside the k8s cluster - conn, err = grpc.NewClient(otlpEndpoint, grpc.WithTransportCredentials(insecure.NewCredentials())) - } - - conn.WaitForStateChange(ctx, connectivity.Ready) - - if err != nil { - return nil, fmt.Errorf("failed to create gRPC connection to collector: %w", err) - } - - // Set up a trace exporter - traceExporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithGRPCConn(conn)) - if err != nil { - return nil, fmt.Errorf("failed to create trace exporter: %w", err) - } - - // Register the trace exporter with a TracerProvider, using a batch - // span processor to aggregate spans before export. - bsp := sdktrace.NewBatchSpanProcessor(traceExporter) - tracerProvider := sdktrace.NewTracerProvider( - sdktrace.WithSampler(sdktrace.AlwaysSample()), - sdktrace.WithResource(res), - sdktrace.WithSpanProcessor(bsp), - ) - otel.SetTracerProvider(tracerProvider) - - // set global propagator to tracecontext (the default is no-op). - otel.SetTextMapPropagator(propagation.TraceContext{}) - - return tracerProvider.Shutdown, nil -} - func main() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -226,34 +108,37 @@ func main() { flag.Parse() configpath := "" - if *flagpath != "" { + switch { + case *flagpath != "": configpath = *flagpath - } else if os.Getenv("CONFIGPATH") != "" { + case os.Getenv("CONFIGPATH") != "": configpath = os.Getenv("CONFIGPATH") - } else { + default: configpath = "/etc/interlink/InterLinkConfig.yaml" } nodename := "" - if *flagnodename != "" { + switch { + case *flagnodename != "": nodename = *flagnodename - } else if os.Getenv("NODENAME") != "" { + case os.Getenv("NODENAME") != "": nodename = os.Getenv("NODENAME") - } else { - panic(fmt.Errorf("You must specify a Node name")) + default: + panic(fmt.Errorf("you must specify a Node name")) } - interLinkConfig, err := commonIL.LoadConfig(configpath, nodename, ctx) + interLinkConfig, err := commonIL.LoadConfig(ctx, configpath) if err != nil { panic(err) } logger := logrus.StandardLogger() - if interLinkConfig.VerboseLogging { + switch { + case interLinkConfig.VerboseLogging: logger.SetLevel(logrus.DebugLevel) - } else if interLinkConfig.ErrorsOnlyLogging { + case interLinkConfig.ErrorsOnlyLogging: logger.SetLevel(logrus.ErrorLevel) - } else { + default: logger.SetLevel(logrus.InfoLevel) } log.L = logruslogger.FromLogrus(logrus.NewEntry(logger)) @@ -261,7 +146,7 @@ func main() { log.G(ctx).Info("Config dump", interLinkConfig) if os.Getenv("ENABLE_TRACING") == "1" { - shutdown, err := initProvider(ctx) + shutdown, err := interlink.InitTracer(ctx, "VK-InterLink-") if err != nil { log.G(ctx).Fatal(err) } @@ -277,24 +162,6 @@ func main() { trace.T = opentelemetry.Adapter{} } - // TODO: if token specified http.DefaultClient = ... - // and remove reading from file - - http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true} - - if strings.HasPrefix(interLinkConfig.InterlinkURL, "unix://") { - // Dial the Unix socket - interLinkEndpoint := strings.Replace(interLinkConfig.InterlinkURL, "unix://", "", -1) - conn, err := net.Dial("unix", interLinkEndpoint) - if err != nil { - panic(err) - } - - http.DefaultTransport.(*http.Transport).DialContext = func(_ context.Context, _, _ string) (net.Conn, error) { - return conn, nil - } - } - dport, err := strconv.ParseInt(os.Getenv("KUBELET_PORT"), 10, 32) if err != nil { log.G(ctx).Fatal(err) @@ -310,6 +177,84 @@ func main() { DaemonPort: int32(dport), } + mux := http.NewServeMux() + // retriever, err := newCertificateRetriever(localClient, certificates.KubeletServingSignerName, cfg.NodeName, parsedIP) + // if err != nil { + // log.G(ctx).Fatal("failed to initialize certificate manager: %w", err) + // } + // TODO: create a csr auto approver https://github.com/liqotech/liqo/blob/master/cmd/liqo-controller-manager/main.go#L498 + retriever := commonIL.NewSelfSignedCertificateRetriever(cfg.NodeName, net.ParseIP(cfg.InternalIP)) + + var kubeletURL string + + if envString, found := os.LookupEnv("KUBELET_URL"); !found { + kubeletURL = "0.0.0.0" + } else { + kubeletURL = envString + } + + var kubeletPort string + if envString, found := os.LookupEnv("KUBELET_PORT"); !found { + kubeletPort = "5820" + } else { + kubeletPort = envString + } + + server := &http.Server{ + Addr: fmt.Sprintf("%s:%s", kubeletURL, kubeletPort), + Handler: mux, + ReadTimeout: 30 * time.Second, + ReadHeaderTimeout: 10 * time.Second, // Required to limit the effects of the Slowloris attack. + TLSConfig: &tls.Config{ + GetCertificate: retriever, + MinVersion: tls.VersionTLS12, + InsecureSkipVerify: interLinkConfig.KubeletHTTP.Insecure, + }, + } + + go func() { + log.G(ctx).Infof("Starting the virtual kubelet HTTPs server %q", server.Addr) + + // Key and certificate paths are not specified, since already configured as part of the TLSConfig. + if err := server.ListenAndServeTLS("", ""); err != nil { + log.G(ctx).Errorf("Failed to start the HTTPs server: %v", err) + os.Exit(1) + } + }() + + // TODO: if token specified http.DefaultClient = ... + // and remove reading from file + var socketPath string + if strings.HasPrefix(interLinkConfig.InterlinkURL, "unix://") { + socketPath = strings.ReplaceAll(interLinkConfig.InterlinkURL, "unix://", "") + } + + dialer := &net.Dialer{ + Timeout: 90 * time.Second, + KeepAlive: 90 * time.Second, + } + transport := &http.Transport{ + MaxConnsPerHost: 10000, + MaxIdleConnsPerHost: 1000, + IdleConnTimeout: 120 * time.Second, + ResponseHeaderTimeout: 120 * time.Second, + DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { + if strings.HasPrefix(addr, "unix:") { + return dialer.DialContext(ctx, "unix", socketPath) + } + return dialer.DialContext(ctx, network, addr) + }, + TLSClientConfig: &tls.Config{ + InsecureSkipVerify: interLinkConfig.HTTP.Insecure, + }, + } + + http.DefaultClient = &http.Client{ + Transport: &UnixSocketRoundTripper{ + Transport: transport, + }, + } + var kubecfg *rest.Config kubecfgFile, err := os.ReadFile(os.Getenv("KUBECONFIG")) if err != nil { @@ -337,32 +282,35 @@ func main() { localClient := kubernetes.NewForConfigOrDie(kubecfg) nodeProvider, err := commonIL.NewProvider( + ctx, cfg.ConfigPath, cfg.NodeName, cfg.NodeVersion, cfg.OperatingSystem, cfg.InternalIP, cfg.DaemonPort, - ctx) - + transport.Clone(), + ) if err != nil { log.G(ctx).Fatal(err) } - nc, _ := node.NewNodeController( + nc, err := node.NewNodeController( nodeProvider, nodeProvider.GetNode(), localClient.CoreV1().Nodes(), node.WithNodeEnableLeaseV1( lease.NewForConfigOrDie(kubecfg).Leases(v1.NamespaceNodeLease), 300, ), ) + if err != nil { + log.G(ctx).Fatalf("error setting up NodeController: %w", err) + } - go func() error { + go func() { err = nc.Run(ctx) if err != nil { - return fmt.Errorf("error running the node: %w", err) + log.G(ctx).Fatalf("error running the node: %v", err) } - return nil }() eb := record.NewBroadcaster() @@ -428,8 +376,6 @@ func main() { GetStatsSummary: nodeProvider.GetStatsSummary, } - mux := http.NewServeMux() - podRoutes := api.PodHandlerConfig{ GetContainerLogs: handlerPodConfig.GetContainerLogs, GetStatsSummary: handlerPodConfig.GetStatsSummary, @@ -438,36 +384,6 @@ func main() { api.AttachPodRoutes(podRoutes, mux, true) - //retriever, err := newCertificateRetriever(localClient, certificates.KubeletServingSignerName, cfg.NodeName, parsedIP) - //if err != nil { - // log.G(ctx).Fatal("failed to initialize certificate manager: %w", err) - //} - // TODO: create a csr auto approver https://github.com/liqotech/liqo/blob/master/cmd/liqo-controller-manager/main.go#L498 - retriever := commonIL.NewSelfSignedCertificateRetriever(cfg.NodeName, net.ParseIP(cfg.InternalIP)) - - kubeletPort := os.Getenv("KUBELET_PORT") - - server := &http.Server{ - Addr: fmt.Sprintf("0.0.0.0:%s", kubeletPort), - Handler: mux, - ReadHeaderTimeout: 10 * time.Second, // Required to limit the effects of the Slowloris attack. - TLSConfig: &tls.Config{ - GetCertificate: retriever, - MinVersion: tls.VersionTLS12, - InsecureSkipVerify: true, - }, - } - - go func() { - log.G(ctx).Infof("Starting the virtual kubelet HTTPs server listening on %q", server.Addr) - - // Key and certificate paths are not specified, since already configured as part of the TLSConfig. - if err := server.ListenAndServeTLS("", ""); err != nil { - log.G(ctx).Errorf("Failed to start the HTTPs server: %v", err) - os.Exit(1) - } - }() - pc, err := node.NewPodController(podControllerConfig) // <-- instatiates the pod controller if err != nil { log.G(ctx).Fatal(err) @@ -476,5 +392,4 @@ func main() { if err != nil { log.G(ctx).Fatal(err) } - } diff --git a/docker/Dockerfile.interlink b/docker/Dockerfile.interlink index 8731532e..d8343d04 100644 --- a/docker/Dockerfile.interlink +++ b/docker/Dockerfile.interlink @@ -13,8 +13,8 @@ RUN mkdir -p $GOMODCACHE && mkdir -p $GOCACHE ARG VERSION RUN bash -c "KUBELET_VERSION=${VERSION} ./cmd/virtual-kubelet/set-version.sh" -RUN go mod tidy -RUN CGO_ENABLED=0 GOOS=linux go build -o bin/interlink cmd/interlink/main.go +RUN --mount=type=cache,target=/go/pkg/mod bash -c "time go mod tidy" +RUN --mount=type=cache,target=/go/build-cache bash -c "time CGO_ENABLED=0 GOOS=linux go build -o bin/interlink cmd/interlink/main.go" # Deploy the application binary into a lean image FROM gcr.io/distroless/base-debian11:latest AS build-release-stage diff --git a/docker/Dockerfile.vk b/docker/Dockerfile.vk index f0249d25..73249171 100644 --- a/docker/Dockerfile.vk +++ b/docker/Dockerfile.vk @@ -15,8 +15,8 @@ RUN mkdir -p $GOMODCACHE && mkdir -p $GOCACHE RUN bash -c "KUBELET_VERSION=${VERSION} ./cmd/virtual-kubelet/set-version.sh" -RUN go mod tidy -RUN CGO_ENABLED=0 GOOS=linux go build -o bin/vk cmd/virtual-kubelet/main.go +RUN --mount=type=cache,target=/go/pkg/mod bash -c "time go mod tidy" +RUN --mount=type=cache,target=/go/build-cache bash -c "time CGO_ENABLED=0 GOOS=linux go build -o bin/vk cmd/virtual-kubelet/main.go" # Deploy the application binary into a lean image FROM ubuntu:22.04 AS build-release-stage diff --git a/docs/.eslintrc b/docs/.eslintrc new file mode 100644 index 00000000..13838444 --- /dev/null +++ b/docs/.eslintrc @@ -0,0 +1,3 @@ +{ + "extends": ["plugin:@docusaurus/recommended"] +} diff --git a/docs/README.md b/docs/README.md index 0c6c2c27..543ffc52 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,6 +2,13 @@ This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator. +## Dagger module to site preview + +```bash +dagger -m github.com/levlaz/daggerverse/docusaurus@f073c72e0a7345bba2173a15269307df297c3c13 call \ (⎈|default:default) + --src ./ serve up +``` + ### Installation ``` @@ -11,7 +18,7 @@ $ yarn ### Local Development ``` -$ yarn start +$ yarn start --config docusaurus.config.local.ts ``` This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. diff --git a/docs/docs/Developers.md b/docs/docs/Developers.md index d8310508..016d6367 100644 --- a/docs/docs/Developers.md +++ b/docs/docs/Developers.md @@ -1,47 +1,69 @@ --- -sidebar_position: 3 +sidebar_position: 5 --- -# E2E integration tests +# Developers guide -Here you can find how to test a virtual kubelet implementation against the main pod use cases we mean to support. +Here you can find how to test a virtual kubelet implementation against the main +pod use cases we mean to support. ## Requirements - [Docker engine](https://docs.docker.com/engine/install/) -- [Dagger CLI v0.11.9](https://docs.dagger.io/install/) +- [Dagger CLI v0.13.x](https://docs.dagger.io/install/) ## What's in the Dagger module -- E2e integration tests: a reproducible test environment (selfcontained in Dagger runtime). Run the very same tests executed by github actions to validate any PR -- A development setup tool: optionally you can use your k8s cluster of choice to run and install different interlink components via this module. +- E2e integration tests: a reproducible test environment (selfcontained in + Dagger runtime). Run the very same tests executed by github actions to + validate any PR +- A development setup tool: optionally you can use your k8s cluster of choice to + run and install different interlink components via this module. -:warning: by default the docker plugin is the one tested and to be referred to for any change as first thing. +:warning: by default the docker plugin is the one tested and to be referred to +for any change as first thing. ## Usage -The whole test suite is based on the application of k8s manifests inside a folder that must be passed at runtime. In `./ci/manifests` of this repo you can find the one executed by default by the github actions. +The whole test suite is based on the application of k8s manifests inside a +folder that must be passed at runtime. In `./ci/manifests` of this repo you can +find the one executed by default by the github actions. -That means you can test your code **before** any commit, discovering in advance if anything is breaking. +That means you can test your code **before** any commit, discovering in advance +if anything is breaking. ### Run e2e tests +The easiest way is to simply run `make test` from the root folder of interlink. +But if you need to debug or understand further the test utility or a plugin, you +should follow these instructions. + #### Edit manifests with your images -- `service-account.yaml` is the default set of permission needed by the virtualkubelet. Do not touch unless you know what you are doing. -- `virtual-kubelet-config.yaml` is the configuration mounted into the __virtual kubelet__ component to determine its behaviour. -- `virtual-kubelet.yaml` is the one that you should touch if you are pointing to different interlink endpoints or if you want to change the __virtual kubelet__ image to be tested. -- `interlink-config.yaml` is the configuration mounted into the __interlink API__ component to determine its behaviour. -- `interlink.yaml` is the one that you should touch if you are pointing to different plugin endpoints or if you want to change the __interlink API__ image to be tested. -- `plugin-config.yaml` is the configuration for the __interLink plugin__ component that you MUST TO START MANUALLY on your host. - - we do have solution to make it start inside dagger environment, but is not documented yet. +- `service-account.yaml` is the default set of permission needed by the + virtualkubelet. Do not touch unless you know what you are doing. +- `virtual-kubelet-config.yaml` is the configuration mounted into the **virtual + kubelet** component to determine its behaviour. +- `virtual-kubelet.yaml` is the one that you should touch if you are pointing to + different interlink endpoints or if you want to change the **virtual kubelet** + image to be tested. +- `interlink-config.yaml` is the configuration mounted into the **interlink + API** component to determine its behaviour. +- `interlink.yaml` is the one that you should touch if you are pointing to + different plugin endpoints or if you want to change the **interlink API** + image to be tested. +- `plugin-config.yaml` is the configuration for the **interLink plugin** + component that you MUST TO START MANUALLY on your host. + - we do have solution to make it start inside dagger environment, but is not + documented yet. #### Start the local docker plugin service -For a simple demonstration, you can use the plugin that we actually use in are Github Actions: +For a simple demonstration, you can use the plugin that we actually use in are +Github Actions: ```bash -wget https://github.com/interTwin-eu/interlink-docker-plugin/releases/download/0.0.22-no-gpu/docker-plugin_Linux_x86_64 -O docker-plugin \ +wget https://github.com/interlink-hq/interlink-docker-plugin/releases/download/0.0.24-no-gpu/docker-plugin_Linux_x86_64 -O docker-plugin \ && chmod +x docker-plugin \ && docker ps \ && export INTERLINKCONFIGPATH=$PWD/ci/manifests/plugin-config.yaml \ @@ -50,27 +72,37 @@ wget https://github.com/interTwin-eu/interlink-docker-plugin/releases/download/0 #### Run the tests -Then, in another terminal sessions you are ready to execute the e2e tests with Dagger. +Then, in another terminal sessions you are ready to execute the e2e tests with +Dagger. -First of all, in `ci/manifests/vktest_config.yaml` you will find the pytest configuration file. Please see the [test documentation](https://github.com/interTwin-eu/vk-test-set/tree/main) for understanding how to tweak it. +First of all, in `ci/manifests/vktest_config.yaml` you will find the pytest +configuration file. Please see the +[test documentation](https://github.com/interlink-hq/vk-test-set/tree/main) for +understanding how to tweak it. -The following instructions are thought for building docker images of the virtual-kubelet and interlink api server components at runtime and published on `virtual-kubelet-ref` and `interlink-ref` repositories (in this example it will be dockerHUB repository of the dciangot user). -It basically consists on a chain of Dagger tasks for building core images (`build-images`), creating the kubernetes environment configured with core components (`new-interlink`), installing the plugin of choice indicated in the `manifest` folder (`load-plugin`), and eventually the execution of the tests (`test`) +The following instructions are thought for building docker images of the +virtual-kubelet and interlink api server components at runtime and published on +`virtual-kubelet-ref` and `interlink-ref` repositories (in this example it will +be dockerHUB repository of the dciangot user). It basically consists on a chain +of Dagger tasks for building core images (`build-images`), creating the +kubernetes environment configured with core components (`new-interlink`), +installing the plugin of choice indicated in the `manifest` folder +(`load-plugin`), and eventually the execution of the tests (`test`) -To run the default tests you can move to `ci` folder and execute the Dagger pipeline with: +To run the default tests you can move to `ci` folder and execute the Dagger +pipeline with: ```bash dagger call \ --name my-tests \ build-images \ - --source-folder ../ \ new-interlink \ --plugin-endpoint tcp://localhost:4000 \ - --manifests ./manifests \ test stdout ``` -:warning: by default the docker plugin is the one tested and to be referred to for any change as first thing. +:warning: by default the docker plugin is the one tested and to be referred to +for any change as first thing. In case of success the output should print something like the following: @@ -97,21 +129,21 @@ vktestset/basic_test.py::test_manifest[virtual-kubelet-060-init-container.yaml] #### Debug with interactive session -In case something went wrong, you have the possibility to spawn a session inside the final step of the pipeline to debug things: +In case something went wrong, you have the possibility to spawn a session inside +the final step of the pipeline to debug things: ```bash dagger call \ --name my-tests \ build-images \ - --source-folder ../ \ new-interlink \ - --manifests ./manifests \ --plugin-endpoint tcp://localhost:4000 \ run terminal ``` -with this command (after some minutes) then you should be able to access a bash session doing the following commands: +with this command (after some minutes) then you should be able to access a bash +session doing the following commands: ```bash bash @@ -133,11 +165,9 @@ You can get the Kubernetes service running with: dagger call \ --name my-tests \ build-images \ - --source-folder ../ \ new-interlink \ - --manifests ./manifests \ --plugin-endpoint tcp://localhost:4000 \ - kube up + kube up ``` and then from another session, you can get the kubeconfig with: @@ -148,7 +178,6 @@ dagger call \ config export --path ./kubeconfig.yaml ``` - ### Deploy on existing K8s cluster TBD @@ -174,8 +203,6 @@ TBD :warning: Coming soon - -### Develop your plugin +### Develop your plugin :warning: Coming soon - diff --git a/docs/docs/Limitations.md b/docs/docs/Limitations.md index ea129510..8d6e15d3 100644 --- a/docs/docs/Limitations.md +++ b/docs/docs/Limitations.md @@ -1,13 +1,23 @@ --- -sidebar_position: 4 +sidebar_position: 6 --- # Current limitations It's not black magic, we have to pay something: -- __InCluster network__: at the moment there is no support for in-cluster communication b/w remote container and k8s cluster network. Meaning that service that are NOT exposed to the external network cannot be accessed from the pod running on the virtual kubelet. There are plans to include the support for this, we are not simply there yet. -- __Cluster wide shared FS__: there is no support for cluster-wide filesystem mounting on the remote container. The only volumes supported are: `Secret`, `ConfigMap`, `EmptyDir` +- **Cluster wide shared FS**: there is no support for cluster-wide filesystem + mounting on the remote container. The only volumes supported are: `Secret`, + `ConfigMap`, `EmptyDir` +- **InCluster pod-to-pod network**: we are in the middle of the beta period to + release this feature! -That's all. If you find anything else, feel free to let it know filing a github issue. +:::note +Reach out to us if you are willing to test the network implementation as beta +users! + +::: + +That's all. If you find anything else, feel free to let it know filing a github +issue. diff --git a/docs/docs/arch.mdx b/docs/docs/arch.mdx new file mode 100644 index 00000000..5ad980e7 --- /dev/null +++ b/docs/docs/arch.mdx @@ -0,0 +1,24 @@ +--- +sidebar_position: 2 +--- +import ThemedImage from '@theme/ThemedImage'; +import useBaseUrl from '@docusaurus/useBaseUrl'; + +# Architecture + +InterLink aims to provide an abstraction for the execution of a Kubernetes pod on any remote resource capable of managing a Container execution lifecycle. + +The project consists of two main components: + +- __A Kubernetes Virtual Node:__ based on the [VirtualKubelet](https://virtual-kubelet.io/) technology. Translating request for a kubernetes pod execution into a remote call to the interLink API server. +- __The interLink API server:__ a modular and pluggable REST server where you can create your own Container manager plugin (called sidecars), or use the existing ones: remote docker execution on a remote host, singularity Container on a remote SLURM batch system. + +The project got inspired by the [KNoC](https://github.com/CARV-ICS-FORTH/knoc) and [Liqo](https://github.com/liqotech/liqo/tree/master) projects, enhancing that with the implemention a generic API layer b/w the virtual kubelet component and the provider logic for the container lifecycle management. + + diff --git a/docs/docs/cookbook/1-edge.mdx b/docs/docs/cookbook/1-edge.mdx new file mode 100644 index 00000000..d1ff181c --- /dev/null +++ b/docs/docs/cookbook/1-edge.mdx @@ -0,0 +1,337 @@ +--- +sidebar_position: 3 +--- + +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +import ThemedImage from "@theme/ThemedImage"; +import useBaseUrl from "@docusaurus/useBaseUrl"; + +# Edge node deployment + +Deploy interLink on an edge node, outside the local K8S cluster. + + + +## Install interLink + +### Deploy Remote components + +In general, starting from the deployment of the remote components is adviced. +Since the kubernetes virtual node won't reach the `Ready` status until all the +stack is successfully deployed. + +#### Interlink API server + +**For this deployment mode the remote host has to allow the kubernetes cluster +to connect to the Oauth2 proxy service port (30443 if you use the automatic +script for installation)** + +You first need to initialize an OIDC client with you Identity Provider (IdP). + +Since any OIDC provider working with +[OAuth2 Proxy](https://oauth2-proxy.github.io/oauth2-proxy/) tool will do the +work, we are going to put the configuration for a generic OIDC identity provider +in this cookbook. Nevertheless you can find more detailed on dedicated pages +with instructions ready for +[GitHub](../guides/deploy-interlink#create-an-oauth-github-app), +[EGI checkin](../guides/04-oidc-IAM.md#egi-check-in), +[INFN IAM](../guides/oidc-IAM#indigo-iam). + +## EGI Check-in + +First of all download the +[latest release](https://github.com/interlink-hq/interLink/releases) of the +interLink installer: + +```bash +mkdir -p $HOME/.interlink +export VERSION=$(curl -s https://api.github.com/repos/interlink-hq/interlink/releases/latest | jq -r .name) +wget -O $HOME/interlink-installer https://github.com/interlink-hq/interLink/releases/download/$VERSION/interlink-installer_Linux_x86_64 +chmod +x $HOME/.interlink/interlink-installer +``` + +Create a template configuration with the init option: + +```bash +mkdir -p $HOME/.interlink/logs +mkdir -p $HOME/.interlink/bin +mkdir -p $HOME/.interlink/config +$HOME/.interlink/interlink-installer --init --config $HOME/.interlink/installer.yaml +``` + +The configuration file should be filled as followed. This is the case where the +`my-node` will contact an edge service that will be listening on `PUBLIC_IP` and +`API_PORT` authenticating requests from an OIDC provider +`https://my_oidc_idp.com`: + +```bash title="$HOME/.interlink/installer.yaml" +interlink_ip: PUBLIC_IP +interlink_port: API_PORT +interlink_version: X.X.X +kubelet_node_name: my-node +kubernetes_namespace: interlink +node_limits: + cpu: "1000" + # MEMORY in GB + memory: 25600 + pods: "100" +oauth: + provider: oidc + issuer: https://my_oidc_idp.com/ + scopes: + - "openid" + - "email" + - "offline_access" + - "profile" + audience: interlink + grant_type: authorization_code + group_claim: groups + group: "my_vk_allowed_group" + token_url: "https://my_oidc_idp.com/token" + device_code_url: "https://my_oidc_idp/auth/device" + client_id: "oidc-client-xx" + client_secret: "xxxxxx" +insecure_http: true +``` + +:::note + +Please fill interlink_version with the desired version. +In alternative get the latest with: + +```bash +curl -s https://api.github.com/repos/interlink-hq/interlink/releases/latest | jq -r .name +``` + +::: + +Now you are ready to start the OIDC authentication flow to generate all your +manifests and configuration files for the interLink components. To do so, just +execute the installer: + +```bash +$HOME/.interlink/interlink-installer --config $HOME/.interlink/installer.yaml --output-dir $HOME/.interlink/manifests/ +``` + +Install Oauth2-Proxy and interLink API server services and configurations with: + +```bash +chmod +x $HOME/.interlink/manifests/interlink-remote.sh +$HOME/.interlink/manifests/interlink-remote.sh install +``` + +Then start the services with: + +```bash +$HOME/.interlink/manifests/interlink-remote.sh start +``` + +With `stop` command you can stop the service. By default logs are store in +`~/.interlink/logs`, checkout there for any error before moving to the next +step. + +:::note + +**N.B.** you can look the oauth2_proxy configuration parameters looking directly +into the `interlink-remote.sh` script. + +::: + +:::warning + +**N.B.** logs (expecially if in verbose mode) can become pretty huge, consider +to implement your favorite rotation routine for all the logs in +`~/.interlink/logs/`. + +::: + +#### Plugin service + +Select here the featured plugin you want to try: + + + + _Offload your pods to a remote machine with Docker engine available._ + + - Create a configuration file: + + ```bash title="$HOME/.interlink/config/plugin-config.yaml" + ## Multi user host + Socket: "unix:///home/myusername/.interlink/.plugin.sock" + InterlinkPort: "0" + SidecarPort: "0" + + CommandPrefix: "" + DataRootFolder: "/home/myusername/.interlink/jobs/" + BashPath: /bin/bash + VerboseLogging: false + ErrorsOnlyLogging: false + ``` + - __N.B.__ Depending on wheter you edge is single user or not, + you should know by previous steps which section to uncomment here. + - More on configuration options at + [official repo](https://github.com/interlink-hq/interlink-docker-plugin/blob/main/README.md) + + - Download the [latest release](https://github.com/interlink-hq/interlink-docker-plugin/releases) + binary in `$HOME/.interlink/bin/plugin` for either GPU host or CPU host (tags ending with `no-GPU`) + - Start the plugins passing the configuration that you have just created: + + ```bash + export INTERLINKCONFIGPATH=$HOME/.interlink/config/plugin-config.yaml + $HOME/.interlink/bin/plugin &> $HOME/.interlink/logs/plugin.log & + echo $! > $HOME/.interlink/plugin.pid + ``` + + - Check the logs in `$HOME/.interlink/logs/plugin.log`. + - To kill and restart the process is enough: + + ```bash + # kill + kill $(cat $HOME/.interlink/plugin.pid) + + # restart + export INTERLINKCONFIGPATH=$HOME/.interlink/config/plugin-config.yaml + $HOME/.interlink/bin/plugin &> $HOME/.interlink/logs/plugin.log & + echo $! > $HOME/.interlink/plugin.pid + + Almost there! Now it's time to add this virtual node into the Kubernetes cluster! + + + + + _Offload your pods to an HPC SLURM based batch system._ + + - Please be sure that you have a shared filesystem area with the SLURM nodes available from the edge node. In this case our `DataRootFolder` is `$HOME/.interlink/jobs` + - Create a configuration file (__remember to substitute `/home/username/` with your actual home path__): + + ```bash title="./interlink/manifests/plugin-config.yaml" + Socket: "unix:///home/myusername/.interlink/.plugin.sock" + InterlinkPort: "0" + SidecarPort: "0" + + CommandPrefix: "" + DataRootFolder: "/home/myusername/.interlink/jobs/" + BashPath: /bin/bash + VerboseLogging: false + ErrorsOnlyLogging: false + SbatchPath: "/usr/bin/sbatch" + ScancelPath: "/usr/bin/scancel" + SqueuePath: "/usr/bin/squeue" + SingularityPrefix: "" + ``` + + - More on configuration options at + [official repo](https://github.com/interlink-hq/interlink-slurm-plugin/blob/main/README.md) + + - Download the [latest release](https://github.com/interlink-hq/interlink-slurm-plugin/releases) + binary in `$HOME/.interlink/bin/plugin` + + ```bash + export PLUGIN_VERSION=$(curl -s https://api.github.com/repos/interlink-hq/interlink-slurm-plugin/releases/latest | jq -r .name) + wget -O $HOME/.interlink/bin/plugin https://github.com/interlink-hq/interlink-slurm-plugin/releases/download/${PLUGIN_VERSION}/interlink-sidecar-slurm_Linux_x86_64 + ``` + + - Start the plugins passing the configuration that you have just created: + + ```bash + export SLURMCONFIGPATH=$HOME/.interlink/manifests/plugin-config.yaml + $HOME/.interlink/bin/plugin &> $HOME/.interlink/logs/plugin.log & + echo $! > $HOME/.interlink/plugin.pid + ``` + + - Check the logs in `$HOME/.interlink/logs/plugin.log`. + - To kill and restart the process is enough: + + ```bash + # kill + kill $(cat $HOME/.interlink/plugin.pid) + + # restart + export SLURMCONFIGPATH=$HOME/.interlink/manifests/plugin-config.yaml + $HOME/.interlink/bin/plugin &> $HOME/.interlink/logs/plugin.log & + echo $! > $HOME/.interlink/plugin.pid + + Almost there! Now it's time to add this virtual node into the Kubernetes cluster! + + + + + _Offload your pods to a remote Kubernetes cluster._ + + KUBERNETES PLUGIN IS COMING SOON! For test instructions contact us! + + + + + +:::tip + +Yes, if you will, you can also manage all interLink processes through `systemd`. +Reach out to receive guidance on how we do it in production. You can find an +example in the interlink repo `./systemd` folder. + +::: + +##### 3rd-party plugins + +There are more 3rd-party plugins developed that you can get inspired by or even +use out of the box. You can find some ref in the +[quick start section](../guides/deploy-interlink#attach-your-favorite-plugin-or-develop-one) + +#### Test interLink stack health + +interLink comes with a call that can be used to monitor the overall status of +both interlink server and plugins, at once. + +``` +curl -v --unix-socket ${HOME}/.interlink/.interlink.sock http://unix/pinglink +``` + +This call will return the status of the system and its readiness to submit jobs. + +### Deploy Kubernetes components + +The deployment of the Kubernetes components are managed by the official +[HELM chart](https://github.com/interlink-hq/interlink-helm-chart). Depending on +the scenario you selected, there might be additional operations to be done. + +You can now install the helm chart with the preconfigured (by the installer +script) helm values in `./interlink/manifests/values.yaml` + +```bash + export INTERLINK_CHART_VERSION="X.X.X" + helm upgrade --install \ + --create-namespace \ + -n interlink \ + my-node \ + oci://ghcr.io/interlink-hq/interlink-helm-chart/interlink \ + --version $INTERLINK_CHART_VERSION \ + --values ./.interlink/manifests/values.yaml +``` + +:::warning + +Remember to pick the +[version of the chart](https://github.com/interlink-hq/interlink-helm-chart/blob/main/interlink/Chart.yaml#L18) +and put it into the `INTERLINK_CHART_VERSION` env var above. + +::: + +Whenever you see the node ready, you are good to go! + +:::note + +You can find a demo pod to test your setup +[here](../guides/develop-a-plugin#lets-test-is-out). + +::: + +To start debugging in case of problems we suggest starting from the pod +containers logs! diff --git a/docs/docs/cookbook/2-incluster.mdx b/docs/docs/cookbook/2-incluster.mdx new file mode 100644 index 00000000..7e0119da --- /dev/null +++ b/docs/docs/cookbook/2-incluster.mdx @@ -0,0 +1,82 @@ +--- +sidebar_position: 3 +--- + +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +import ThemedImage from "@theme/ThemedImage"; +import useBaseUrl from "@docusaurus/useBaseUrl"; + +# In-cluster deployment + +Deploy interLink in the local K8S cluster. + + + +## Install interLink + +### Deploy Kubernetes components + +The deployment of the Kubernetes components are managed by the official +[HELM chart](https://github.com/interlink-hq/interlink-helm-chart). Depending on +the scenario you selected, there might be additional operations to be done. + +- Create an helm values file: + +```yaml title="values.yaml" +nodeName: interlink-with-socket + +plugin: + enabled: true + image: "plugin docker image here" + command: ["/bin/bash", "-c"] + args: ["/app/plugin"] + config: | + your plugin + configuration + goes here!!! + socket: unix:///var/run/plugin.sock + +interlink: + enabled: true + socket: unix:///var/run/interlink.sock +``` + +Eventually deploy the latest release of the official: + +```bash + export INTERLINK_CHART_VERSION="X.X.X" + helm upgrade --install \ + --create-namespace \ + -n interlink \ + my-node \ + oci://ghcr.io/interlink-hq/interlink-helm-chart/interlink \ + --version $INTERLINK_CHART_VERSION \ + --values ./interlink/manifests/values.yaml +``` + +:::warning + +Remember to pick the +[version of the chart](https://github.com/interlink-hq/interlink-helm-chart/blob/main/interlink/Chart.yaml#L18) +and put it into the `INTERLINK_CHART_VERSION` env var above. + +::: + +Whenever you see the node ready, you are good to go! + +:::note + +You can find a demo pod to test your setup +[here](../guides/develop-a-plugin#lets-test-is-out). + +::: + +To start debugging in case of problems we suggest starting from the pod +containers logs! diff --git a/docs/docs/cookbook/3-tunneled.mdx b/docs/docs/cookbook/3-tunneled.mdx new file mode 100644 index 00000000..2a81db25 --- /dev/null +++ b/docs/docs/cookbook/3-tunneled.mdx @@ -0,0 +1,32 @@ +--- +sidebar_position: 3 +--- + +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +import ThemedImage from "@theme/ThemedImage"; +import useBaseUrl from "@docusaurus/useBaseUrl"; + +# Tunneled deployment + +Deploy interLink components in both systems, linked through a tunnelled +communication. + + + +## Install interLink + +### Deploy Remote components + +:::note + +We do have case studies already implementing it, if you are interested reach out +to the slack channel. + +::: diff --git a/docs/docs/cookbook/_category_.json b/docs/docs/cookbook/_category_.json new file mode 100644 index 00000000..d8253b65 --- /dev/null +++ b/docs/docs/cookbook/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Cookbook", + "position": 3, + "link": { + "type": "generated-index", + "description": "Practical recipes for different deployment scenarios." + } +} diff --git a/docs/docs/guides/01-deploy-interlink.mdx b/docs/docs/guides/01-deploy-interlink.mdx new file mode 100644 index 00000000..7eb57de4 --- /dev/null +++ b/docs/docs/guides/01-deploy-interlink.mdx @@ -0,0 +1,84 @@ +--- +sidebar_position: 1 +--- + +import ThemedImage from "@theme/ThemedImage"; +import useBaseUrl from "@docusaurus/useBaseUrl"; + +# Deploy your plugin + +## Attach your favorite plugin or develop one! (remote host) + +[Next chapter](./develop-a-plugin) will show the basics for developing a new +plugin following the interLink openAPI spec. + +In alterative you can start an already supported one. + +### Remote SLURM job submission + +If you manage a SLURM batch system, and you satisfy the requirements below, you +can offload pod from a kubernetes cluster to your batch system, using interLink +SLURM plugin of course. + +- [github.com/interlink-hq/interlink-slurm-plugin](https://github.com/interlink-hq/interlink-slurm-plugin) + +#### Requirements + +- a SLURM CLI available on the remote host and configured to interact with the + computing cluster +- a sharedFS with all the worker nodes + - an experimental feature is available for cases in which this is not possible + +#### Configuration + +Please refer to either the plugin repository or the +[cookbook](../cookbook/1-edge.mdx) for more information. + +### Create UNICORE jobs to run on HPC centers + +[UNICORE](https://www.unicore.eu/) (Uniform Interface to Computing Resources) +offers a ready-to-run system including client and server software. UNICORE makes +distributed computing and data resources available in a seamless and secure way +in intranets and the internet. + +- [UNICORE plugin](https://github.com/interlink-hq/interlink-unicore-plugin) + +#### Configuration + +Please refer to either the plugin repository for more information. + +### Remote docker execution + +You get a VM from you cloud provider, with some GPUs maybe. You can attach it to +your Kubernetes cluster using interLink docker plugin. + +- [Docker plugin repository](https://github.com/interlink-hq/interlink-docker-plugin) + +#### Configuration + +Please refer to either the plugin repository or the +[cookbook](../cookbook/1-edge.mdx) for more information. + +### Submit pods to HTcondor or ARC batch systems + +- [HTCondor plugin repository](https://github.com/interlink-hq/interlink-htcondor-plugin) +- [ARC plugin repository](https://github.com/interlink-hq/interlink-arc-plugin) + +### Remote Kubernetes Plugin + +InterLink plugin to extend the capabilities of existing Kubernetes clusters, +enabling them to offload workloads to another remote cluster. The plugin +supports the offloading of PODs that expose HTTP endpoints (i.e., HTTP +Microservices). + +- [Interlink Kubernetes Plugin](https://baltig.infn.it/mgattari/interlink-kubernetes-plugin) + +#### Configuration + +Please refer to either the plugin repository or the +[cookbook](../cookbook/1-edge.mdx) for more information. + +## Test your setup + +Please find a demo pod to test your setup +[here](./develop-a-plugin#lets-test-is-out). diff --git a/docs/docs/tutorial-admins/02-develop-a-plugin.md b/docs/docs/guides/02-develop-a-plugin.md similarity index 73% rename from docs/docs/tutorial-admins/02-develop-a-plugin.md rename to docs/docs/guides/02-develop-a-plugin.md index ed35d606..b00d6fe4 100644 --- a/docs/docs/tutorial-admins/02-develop-a-plugin.md +++ b/docs/docs/guides/02-develop-a-plugin.md @@ -4,17 +4,21 @@ sidebar_position: 2 # Develop an interLink plugin -Learn how to develop your interLink plugin to manage containers on your remote host. +Learn how to develop your interLink plugin to manage containers on your remote +host. -We are going to follow up [the setup of an interlink node](./01-deploy-interlink.mdx) with the last piece of the puzzle: +We are going to follow up +[the setup of an interlink node](../cookbook/1-edge.mdx) with the last piece of +the puzzle: - setup of a python SDK -- demoing the fundamentals development of a plugin executing containers locally through the host docker daemon - +- demoing the fundamentals development of a plugin executing containers locally + through the host docker daemon :::warning -The python SDK also produce an openAPI spec through FastAPI, therefore you can use any language you want as long as the API spec is satisfied. +The python SDK also produce an openAPI spec through FastAPI, therefore you can +use any language you want as long as the API spec is satisfied. ::: @@ -22,54 +26,74 @@ The python SDK also produce an openAPI spec through FastAPI, therefore you can u ### Requirements -- The tutorial is done on a Ubuntu VM, but there are not hard requirements around that +- The tutorial is done on a Ubuntu VM, but there are not hard requirements + around that - Python>=3.10 and pip (`sudo apt install -y python3-pip`) - Any python IDE will work and it is strongly suggested to use one :) - A [docker engine running](https://docs.docker.com/engine/install/) ### Install the SDK -Look for the latest release on [the release page](https://github.com/interTwin-eu/interLink/releases) and set the environment variable `VERSION` to it. -Then you are ready to install the python SDK with: +Look for the latest release on +[the release page](https://github.com/interlink-hq/interLink/releases) and set +the environment variable `VERSION` to it. Then you are ready to install the +python SDK with: ```bash #export VERSION=X.X.X -#pip install "uvicorn[standard]" "git+https://github.com/interTwin-eu/interLink.git@${VERSION}#egg=interlink&subdirectory=example" +#pip install "uvicorn[standard]" "git+https://github.com/interlink-hq/interlink-plugin-sdk@${VERSION}" # Or download the latest one with -pip install "uvicorn[standard]" "git+https://github.com/interTwin-eu/interLink.git#egg=interlink&subdirectory=example" +pip install "uvicorn[standard]" "git+https://github.com/interlink-hq/interlink-plugin-sdk" ``` -In the next section we are going to leverage the provider class of SDK to create our own plugin. - +In the next section we are going to leverage the provider class of SDK to create +our own plugin. ### Plugin provider -The [provider class](https://github.com/interTwin-eu/interLink/blob/main/example/interlink/provider.py) is a FastAPI interface that aims to isolate the developers from all the API provisioning boiler plate. - -In fact, we are going to need only the creation of a derived class implementing the [interLink core methods](https://github.com/interTwin-eu/interLink/blob/main/example/interlink/provider.py#L14-L24), -and making use of in [request and response API specification](https://github.com/interTwin-eu/interLink/blob/main/example/interlink/spec.py) to create our own container lifecycle management plugin. +The +[provider class](https://github.com/interlink-hq/interLink/blob/main/example/interlink/provider.py) +is a FastAPI interface that aims to isolate the developers from all the API +provisioning boiler plate. +In fact, we are going to need only the creation of a derived class implementing +the +[interLink core methods](https://github.com/interlink-hq/interLink/blob/main/example/interlink/provider.py#L14-L24), +and making use of in +[request and response API specification](https://github.com/interlink-hq/interLink/blob/main/example/interlink/spec.py) +to create our own container lifecycle management plugin. :::warning -Be aware that interLink is a development phase, therefore there is no long term guarantee for the API spec to be stable. Regardless, we are trying hard to keep things as easy and stable as possible for a nice community experience. +Be aware that interLink is a development phase, therefore there is no long term +guarantee for the API spec to be stable. Regardless, we are trying hard to keep +things as easy and stable as possible for a nice community experience. ::: ## Implementing the provider methods -Let's start installing the Docker python bindings, since in this example we want to: -- convert a [Pod](https://github.com/interTwin-eu/interLink/blob/main/example/interlink/spec.py#L65) into a `docker run` execution -- convert a [Delete or State pod request](https://github.com/interTwin-eu/interLink/blob/main/example/interlink/spec.py#L47) into `docker rm` and `docker ps`, -- convert a [Log request](https://github.com/interTwin-eu/interLink/blob/main/example/interlink/spec.py#L103) into a `docker logs` +Let's start installing the Docker python bindings, since in this example we want +to: + +- convert a + [Pod](https://github.com/interlink-hq/interLink/blob/main/example/interlink/spec.py#L65) + into a `docker run` execution +- convert a + [Delete or State pod request](https://github.com/interlink-hq/interLink/blob/main/example/interlink/spec.py#L47) + into `docker rm` and `docker ps`, +- convert a + [Log request](https://github.com/interlink-hq/interLink/blob/main/example/interlink/spec.py#L103) + into a `docker logs` ```bash pip install docker ``` -Now we can start creating our `docker-plugin.py` script initializing the SDK provider class: +Now we can start creating our `docker-plugin.py` script initializing the SDK +provider class: ```python import interlink @@ -133,8 +157,9 @@ This empty provider is already good to be started: uvicorn docker-plugin:app --reload --host 0.0.0.0 --port 4000 --log-level=debug ``` -At this stage, it will respond with "NOT IMPLEMENTED" errors for all the requests. -The initialization part will only take care of importing the docker client and store or recover the status of the running containers. +At this stage, it will respond with "NOT IMPLEMENTED" errors for all the +requests. The initialization part will only take care of importing the docker +client and store or recover the status of the running containers. It's time to put our hands on the actual container management workflow. @@ -142,7 +167,8 @@ It's time to put our hands on the actual container management workflow. :::warning -For simplicity, we are going to work just with the first container of the pod. Feel free to generalize this for a many-containers-pod. +For simplicity, we are going to work just with the first container of the pod. +Feel free to generalize this for a many-containers-pod. ::: @@ -171,13 +197,17 @@ Let's implement the `Create` method of the `MyProvider` class: self.CONTAINER_POD_MAP.update({pod.pod.metadata.uid: [docker_run_id]}) ``` -As you can see, here we are getting the basic information we needed to launch a container with Docker, updating the status cache dictionary `CONTAINER_POD_MAP` afterwards. +As you can see, here we are getting the basic information we needed to launch a +container with Docker, updating the status cache dictionary `CONTAINER_POD_MAP` +afterwards. -For fields available in `interlink.Pod` request please refer to the [spec file](https://github.com/interTwin-eu/interLink/blob/main/example/interlink/spec.py). +For fields available in `interlink.Pod` request please refer to the +[spec file](https://github.com/interlink-hq/interLink/blob/main/example/interlink/spec.py). ### The Delete request -At this point there is nothing new anymore. The delete request should indeed take care of the deletion of the container for the pod in the request: +At this point there is nothing new anymore. The delete request should indeed +take care of the deletion of the container for the pod in the request: ```python def Delete(self, pod: interlink.PodRequest) -> None: @@ -193,7 +223,8 @@ At this point there is nothing new anymore. The delete request should indeed tak ### The Status request -The status request takes care of the returing a proper [PodStatus](https://github.com/interTwin-eu/interLink/blob/main/example/interlink/spec.py#L89C1-L93C38) +The status request takes care of the returing a proper +[PodStatus](https://github.com/interlink-hq/interLink/blob/main/example/interlink/spec.py#L89C1-L93C38) response for the pod in the request: ```python @@ -243,7 +274,7 @@ response for the pod in the request: exitCode = int(match) except Exception as ex: raise HTTPException(status_code=500, detail=ex) - + return interlink.PodStatus( name=pod.metadata.name, UID=pod.metadata.uid, @@ -262,7 +293,7 @@ response for the pod in the request: ) ] ) - + # If none of the above are true, the container ended with 0 exit code. Set the status to completed case _: return interlink.PodStatus( @@ -287,7 +318,8 @@ response for the pod in the request: ### The Logs request -When receiving the LogRequest, there are many log options to satisfy, in any case the response is a byte array. Here the basic example: +When receiving the LogRequest, there are many log options to satisfy, in any +case the response is a byte array. Here the basic example: ```python def Logs(self, req: interlink.LogRequest) -> bytes: @@ -307,13 +339,16 @@ When receiving the LogRequest, there are many log options to satisfy, in any cas ### A more advanced example -If you are interested in a more advanced example, please refer the [full example](https://github.com/interTwin-eu/interLink/blob/main/example/provider_demo.py) +If you are interested in a more advanced example, please refer the +[full example](https://github.com/interlink-hq/interLink/blob/main/example/provider_demo.py) for supporting configMap and secret volumes. ## Let's test is out -After the completion of [the core components deployment](./01-deploy-interlink.mdx), -you can now kickstart the newly created plugin and make it spawn on the port 4000 so it can be contacted by the interLink API server. +After the completion of +[the core components deployment](../cookbook/1-edge.mdx), you can now kickstart +the newly created plugin and make it spawn on the port 4000 so it can be +contacted by the interLink API server. You can submit a pod like the following to test the whole workflow: @@ -332,33 +367,33 @@ spec: kubernetes.io/hostname: civo-node automountServiceAccountToken: false containers: - - args: - - sleep 100 && echo "FINISHED!" - command: - - /bin/sh - - -c - image: busybox - imagePullPolicy: Always - name: my-container - resources: - limits: - cpu: "1" - memory: 1Gi - requests: - cpu: "1" - memory: 1Gi + - args: + - sleep 100 && echo "FINISHED!" + command: + - /bin/sh + - -c + image: busybox + imagePullPolicy: Always + name: my-container + resources: + limits: + cpu: "1" + memory: 1Gi + requests: + cpu: "1" + memory: 1Gi tolerations: - - key: virtual-node.interlink/no-schedule - operator: Exists - - effect: NoExecute - key: node.kubernetes.io/not-ready - operator: Exists - tolerationSeconds: 300 - - effect: NoExecute - key: node.kubernetes.io/unreachable - operator: Exists - tolerationSeconds: 300 + - key: virtual-node.interlink/no-schedule + operator: Exists + - effect: NoExecute + key: node.kubernetes.io/not-ready + operator: Exists + tolerationSeconds: 300 + - effect: NoExecute + key: node.kubernetes.io/unreachable + operator: Exists + tolerationSeconds: 300 ``` -Finally you should check that all the supported commands (get,logs,delete...) works on this pod. - +Finally you should check that all the supported commands (get,logs,delete...) +works on this pod. diff --git a/docs/docs/guides/03-api-reference.mdx b/docs/docs/guides/03-api-reference.mdx new file mode 100644 index 00000000..3ea6ee69 --- /dev/null +++ b/docs/docs/guides/03-api-reference.mdx @@ -0,0 +1,20 @@ +--- +sidebar_position: 3 +--- + +# OpenAPI references + +## Plugin API spec + +Please find the sidecar OpenAPI JSON spec can be found [here](/plugin-openapi). + +import ApiDocMdx from "@theme/ApiDocMdx"; + + + +## interLink API spec + +Please find the interLink OpenAPI JSON spec can be found +[here](/interlink-openapi). + + diff --git a/docs/docs/guides/04-oidc-IAM.md b/docs/docs/guides/04-oidc-IAM.md new file mode 100644 index 00000000..95d31019 --- /dev/null +++ b/docs/docs/guides/04-oidc-IAM.md @@ -0,0 +1,153 @@ +--- +sidebar_position: 4 +--- + +# Configure OpenID connect identity providers + +We support any OpenID compliant identity provider and also GitHub authN +workflow. + +## GitHub authN + +### Requirements + +- **kubectl host**: an host with MiniKube installed and running +- A GitHub account +- **remote host**: A "remote" machine with a port that is reachable by the + MiniKube host + +### Create an OAuth GitHub app + +As a first step, you need to create a GitHub OAuth application to allow +interLink to make authentication between your Kubernetes cluster and the remote +endpoint. + +Head to [https://github.com/settings/apps](https://github.com/settings/apps) and +click on `New GitHub App`. You should now be looking at a form like this: + + + +Provide a name for the OAuth2 application, e.g. `interlink-demo-test`, and you +can skip the description, unless you want to provide one for future reference. +For our purpose Homepage reference is also not used, so fill free to put there +`https://interlink-hq.github.io/interLink/`. + +Check now that refresh token and device flow authentication: + + + +Disable webhooks and save clicking on `Create GitHub App` + + + +You can click then on your application that should now appear at +[https://github.com/settings/apps](https://github.com/settings/apps) and you +need to save two strings: the `Client ID` and clicking on +`Generate a new client secret` you should be able to note down the relative +`Client Secret`. + +Now it's all set for the next steps. You should be able to set it for +authenticating the virtual kubelet with the interLink remote components with the +following piece of the installer configuration: + +```yaml +oauth: + provider: github + issuer: https://github.com/oauth + grant_type: authorization_code + scopes: + - "read:user" + github_user: "GH USERNAME HERE" + token_url: "https://github.com/login/oauth/access_token" + device_code_url: "https://github.com/login/device/code" + client_id: "XXXXXXX" + client_secret: "XXXXXXXX" +``` + +## EGI Check-in + +If you have an account for [EGI check-in](https://aai.egi.eu), you should be +able to set it for authenticating the virtual kubelet with the interLink remote +components with the following piece of the installer configuration: + +```yaml +oauth: + provider: oidc + issuer: https://aai.egi.eu/auth/realms/egi + scopes: + - "openid" + - "email" + - "offline_access" + - "profile" + audience: interlink + grant_type: authorization_code + group_claim: email + group: "YOUR EMAIL HERE" + token_url: "https://aai.egi.eu/auth/realms/egi/protocol/openid-connect/token" + device_code_url: "https://aai.egi.eu/auth/realms/egi/protocol/openid-connect/auth/device" + client_id: "oidc-agent" + client_secret: "" +``` + +:::danger Remember to put your email in the group field! ::: + +## Indigo IAM + +If you have an account for [Indigo IAM](https://iam.cloud.infn.it/), you should +be able to set it for authenticating the virtual kubelet with the interLink +remote components. Follow those steps to setup a new client in the IAM portal +and get the necessary information to fill the configuration. This guide is +specific for the IAM portal +[https://iam.cloud.infn.it/](https://iam.cloud.infn.it/) but it should be +similar for other IAM portals that are OpenID compliant. + +1. Go to the [IAM portal](https://iam.cloud.infn.it/) and log in. +2. After logging in, click on the `My clients` tab on the left side of the page + and then select `New client` as shown in the images below. + +![Go to my clients](./img/iam-client0.png) +![Create a new client](./img/iam-client1.png) 3. Set a name you prefer for the +client. 4. Select the `Scopes` tab and add the following scopes: `openid`, +`email`, `offline_access`, `profile`, `wlcg`, `wlcg.groups`. 5. Select the +`Grant types` tab and add the following grant types: `authorization_code`, +`client_credentials`, `refresh_token`, +`urn:ietf:params:oauth:grant-type:device_code`. 6. Save the client by pressing +the `Save client` button. + +After creating the client, you will be able to see the new client in the +`My clients` page as show in the image below. + +![Check the created client](./img/iam-client2.png) + +You can click on the client to see the client details. You will find the +`Client id` under the `Main` tab and the `Client secret` under the `Credentials` +tab. Now, with those information, you can fill this piece of the installer +configuration: + +```yaml +oauth: + provider: oidc + issuer: "https://iam.cloud.infn.it/" + scopes: + - "openid" + - "email" + - "offline_access" + - "profile" + audience: users + grant_type: authorization_code + group_claim: email + group: "YOUR EMAIL HERE" + token_url: "https://iam.cloud.infn.it/token" + device_code_url: "https://iam.cloud.infn.it/devicecode" + client_id: "YOUR CLIENT ID HERE" + client_secret: "YOUR CLIENT SECRET HERE" +``` diff --git a/docs/docs/guides/05-monitoring.md b/docs/docs/guides/05-monitoring.md new file mode 100644 index 00000000..5a6a2bec --- /dev/null +++ b/docs/docs/guides/05-monitoring.md @@ -0,0 +1,152 @@ +--- +sidebar_position: 5 +--- + +# InterLink Monitoring System + +## Description + +To monitor the InterLink stack, you can use an helm chart that deploys the +entire stack and components needed for monitoring the Interlink components, in +particular the Virtual Kubelet (VK) of the Interlink project. In the near +future, the monitoring system will be extended to monitor other components of +the Interlink project. + +## Monitoring System Components + +The monitoring system is composed of the following two components: + +1. [Grafana Tempo](https://grafana.com/docs/tempo/latest/) +2. [Grafana](https://grafana.com) + +### Grafana Tempo + +Grafana Tempo (or simply **Tempo**) is an open-source distributed tracing +backend developed by Grafana Labs designed to handle high-scale and high-volume +distributed tracing data. The choice of Tempo was made because of its key +features: + +- **Scalability**: Tempo is designed to scale horizontally and handle millions + of spans (a span is a single operation in a trace) per second. Moreover, it is + capable of storing traces without requiring a database, instead leveraging + object storage. +- **Simplicity**: Tempo does not index traces because it relies Grafana for + querying and visualizing traces. This approach reduces complexity and + operational overhead. +- **Cost**: Tempo is cost-effective because it uses object storage for storing + traces, which is cheaper than traditional databases. +- **Integration**: Tempo integrates with popular tracing protocols. One of them + is OpenTelemetry, which is used by the Virtual Kubelet (VK) of the Interlink + project. +- **Querying**: Tempo provides a query language that allows users to filter and + aggregate traces. It also supports distributed sampling, which allows users to + sample traces across services. The powerful query language is a key feature + that enables users to extract insights from traces and it is one of the main + reasons why Tempo was chosen for the monitoring system. + +### Grafana + +Grafana is an open-source platform for monitoring and observability that allows +users to query, visualize, alert on, and understand metrics no matter where they +are stored. It is used to create, explore, and share dashboards with teams and +stakeholders. Grafana supports a wide range of data sources, including Tempo. + +## VK tracing + +The Virtual Kubelet (VK) of the Interlink project is instrumented with +**OpenTelemetry** to generate traces. OpenTelemetry is an open-source +observability framework that provides APIs, libraries, agents, and +instrumentation to collect telemetry data from applications and services. The +traces generated by the VK are sent to Tempo, where they are stored and queried. +Traces are generated by the VK when a request is made to the VK, and they +contain information about the request, such as the details of the operation, the +duration of the operation, and the services involved in the operation. A trace +is a collection of spans, where each span represents a single operation in the +trace. Spans are linked together to form a trace, which provides a complete view +of the flow and performance of the operation. A span contains metadata, such as +the name of the operation, the start and end time of the operation, and the +service that generated the span. + +The flow is represented in the following image: + +![Monitoring flow](./img/vk_tracing.png) + +In the actual setup, Tempo is deployed in the same Kubernetes cluster as the VK. +Thanks to a Kubernetes service, the VK can send traces to Tempo. No TLS is used +for the communication between the VK and Tempo, as the communication is internal +to the cluster. In the near future, the communication between the VK and Tempo +will be secured using TLS if Tempo is deployed outside the cluster and a proxy +will be used to authenticate the VK with Tempo. + +The following table is a list of spans generated by the VK: + +| Span Name | Description | Attributes | +| -------------- | -------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | +| CreateHttpCall | Span that represents the HTTP call made by the VK to the Interlink API to create a pod. | pod.name, pod.namespace, start.timestamp, end.timestamp, duration, exitc.code | +| DeleteHttpCall | Span that represents the HTTP call made by the VK to the Interlink API to delete a pod. | pod.name pod.namespace, start.timestamp, end.timestamp, duration, exitc.code | +| StatusHttpCall | Span that represents the HTTP call made by the VK to the Interlink API to get the status of a pod. | pod.name pod.namespace, start.timestamp, end.timestamp, duration, exitc.code | +| LogHttpCall | Span that represents the HTTP call made by the VK to the Interlink API to get the logs of a pod. | pod.name pod.namespace, start.timestamp, end.timestamp, duration, exitc.code | +| PingHttpCall | Span that represents the HTTP call made by the VK to the Interlink API check if the API is alive. | start.timestamp, end.timestamp, duration, exitc.code | +| CreatePodVK | Span that represents the call made by the VK to the Kubernetes API to create a pod. | pod.name pod.namespace, start.timestamp, end.timestamp, duration | +| DeletePodVK | Span that represents the call made by the VK to the Kubernetes API to delete a pod. | pod.name pod.namespace, start.timestamp, end.timestamp, duration | +| UpdatePodVK | Span that represents the call made by the VK to the Kubernetes API to update a pod. | pod.name pod.namespace, start.timestamp, end.timestamp, duration | +| GetPodVK | Span that represents the call made by the VK to the Kubernetes API to get a pod. | pod.name pod.namespace, start.timestamp, end.timestamp, duration | +| GetPodStatusVK | Span that represents the call made by the VK to the Kubernetes API to get the status of a pod. | pod.name pod.namespace, start.timestamp, end.timestamp, duration | +| GetPodsVK | Span that represents the call made by the VK to the Kubernetes API to get all pods. | start.timestamp, end.timestamp, duration | + +## Installation + +:::warning To Enable tracing for the Virtual Kubelet, you have to set the +Environment Variable `ENABLE_TRACING` to 1 ::: + +A requirement for the monitoring system is to have Helm installed in your +Kubernetes cluster or in your local machine. If you don't have Helm installed, +you can follow the instructions in the following +[link](https://helm.sh/docs/intro/install/) + +This helm chart requires a NGINX Ingress Controller to be installed in the +cluster in order to expose the services and access them from outside the +cluster. In particular, the Grafana service is exposed using an Ingress +resource. + +To install the monitoring system, follow the steps below: + +1. Clone the repository: + +```bash +git clone https://github.com/interlink-hq/interlink-monitoring-stack +``` + +2. Change the values in the `values.yaml` file to match your environment. +3. Create a namespace for the monitoring system using the following command: + +```bash +kubectl create namespace interlink-mon +``` + +4. Install the monitoring system using the following command: + +```bash +helm upgrade --install helm-vk-monitoring-release interlink-monitoring-stack/ -n interlink-mon --debug +``` + +5. Deploy (or re-deploy) your Virtual Kubelet stack setting the + `TELEMETRY_ENDPOINT` Environment Variable to your actual endpoint. If not + set, it defaults to `localhost:4317`. Remember to enable the monitoring by + also setting `ENABLE_TRACING` to 1. If you are using an external Tempo + instance which is not in the same cluster as the VK and mutual TLS is + enabled, you have to set the `TELEMETRY_CA_CRT_FILEPATH` that points to the + CA certificate file used by Tempo to sign the certificates, the + `TELEMETRY_CLIENT_KEY_FILEPATH` that points to the client key file used by + the VK to authenticate itself to Tempo and the + `TELEMETRY_CLIENT_CRT_FILEPATH` that points to the client certificate file + used by the VK to authenticate itself to Tempo. Finally, if the TLS + certificate on Tempo are not verfied by unknown authorities, you can set the + `TELEMETRY_INSECURE_SKIP_VERIFY` to true. + +6. Access Grafana dashboard through the domain you defined in the `values.yaml` + file with the credentials you defined in the `values.yaml` file. + +The following image shows the Grafana dashboard: + +![Grafana Dashboard](./img/dashboard.png) diff --git a/docs/docs/guides/06-enable-service-accounts.mdx b/docs/docs/guides/06-enable-service-accounts.mdx new file mode 100644 index 00000000..7426052b --- /dev/null +++ b/docs/docs/guides/06-enable-service-accounts.mdx @@ -0,0 +1,373 @@ +--- +sidebar_position: 6 +--- +import ThemedImage from '@theme/ThemedImage'; +import useBaseUrl from '@docusaurus/useBaseUrl'; + +# Enable service accounts + +By default, InterLink does not translate Kubernetes Service Accounts from Pod into Plugin. That means workload that needs to interact with Kubernetes API like Argo will not work. + +However after following deployment and configuration in this guide, InterLink will give means for Plugin for that. A test has been done with InterLink Slurm Plugin and Argo. + +There are two parts on this guide: how to deploy means to access Kubernetes API service from external cluster network, and how to configure InterLink so that Plugin can access it. + +The prerequisite of this guide are: +- provide an external way to access Kubernetes API service (out of scope of InterLink, but an example is written below) +- provide certificates (that can be self-signed), and its CA root certificate (also out of scope of InterLink, but an example is written below) + +## Provide an external way to access Kubernetes API service + +By default, InterLink Plugin containers cannot access Kubernetes internal network. Thus they cannot access Kubernetes API service (`kubernetes.default.svc.cluster.local`). Kubernetes offers ways to access internal services (see https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types): +- LoadBalancer +- NodePort +- ... + +Because this is highly dependent of the Kubernetes cluster infrastructure, this deployment is out of scope of InterLink automatic deployment. However, below are examples of how and what to deploy, using ingress. This requires a bit of Ingress knowledge as prerequisite. + +### Design of ingress use + +The Kubernetes cluster can already contain an Ingress resource to let external access to web services. However it is a best-practice to separate internal (meaning flow between Kubernetes and Plugin infrastructure, like Slurm machines) and external flows (meaning flow between Kubernetes and the world). + +This guide will thus deploy as an example another ingress separate from the already existing ingress, if it exist. This also works if there is no ingress yet. + +Here is a diagram (generated with https://asciiflow.com) with Interlink Slurm Plugin as example. This Kubernetes cluster is deployed next to a Slurm cluster, but it can also be deployed on cloud. + +Because Ingress can only serve services in the same namespace, and because Kubernetes API is in default namespace, different from the Ingress "ingress-nginx-internal", a reverse-proxy NGINX HTTPS is instantiated to make Kubernetes API available to Ingress. + +``` + ┌───────────────────────────┐ + │ │ + │ Kubernetes cluster │ + │┌────────┐ ┌───────────┐ │ + ││K8S API ├───┤Nginx HTTPS│ │ + │└────────┘ └─────┬─────┘ │ + │ │ │ Slurm cluster + └─┬─────────────────┼───────┘ │ + │Ingress │Ingress ──────────┴───────── + │TCP 80, 443 │TCP 6080, 60443 Slurm network + ┌─────┴────┐ ┌───┴──────┐ ──────────┬───────── + │ External │ │ Internal │ │ + │ Firewall │ │ Firewall │ │ + └─────┬────┘ └───┬──────┘ ┌────────┐ │ + │ └──────────────┤ Router ├─────┘ + xxxxxxxxx xxxx └────────┘ + x xxx xxx + xx x + xx Internet x +x xxxxx +x x xx +xxxxxxx xxx + xxxxxxxxx +``` + +### NGINX HTTPS + +This deploys a reverse-proxy. + +``` +cat < + +:::note + +Get started with edge-node deployment [here](./cookbook/1-edge.mdx) + +::: + +### In-cluster + +This scenario involves deploying a Virtual Kubelet along with the interLink API +server and the plugin to interact with a remote API. This setup allows +Kubernetes pods to be executed on remote resources while all other components +sits inside the Kubernetes cluster. + + + +:::note + +Get started with in-cluster deployment [here](./cookbook/2-incluster.mdx) + +::: + +### Tunneled + +This deployment involves the Virtual Kubelet connecting to a remote interLink +API server and its plugin through a secure tunnel. This setup ensures secure +communication between the Kubernetes cluster and the remote resources, making it +suitable for environments with strict security requirements or to host services +on a multi user host like a login node. + + + +:::note + +Get started with tunneled deployment [here](./cookbook/3-tunneled.mdx) + +::: diff --git a/docs/docs/tutorial-admins/01-deploy-interlink.mdx b/docs/docs/tutorial-admins/01-deploy-interlink.mdx deleted file mode 100644 index 18b35a77..00000000 --- a/docs/docs/tutorial-admins/01-deploy-interlink.mdx +++ /dev/null @@ -1,333 +0,0 @@ ---- -sidebar_position: 1 ---- -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Deploy interLink virtual nodes - -Learn how to deploy interLink virtual nodes on your cluster. In this tutorial you are going to setup all the needed components to be able to either __develop__ or __deploy__ the plugin for container management on a **remote** host via a **local** kubernetes cluster. - -The installation script that we are going to configure will take care of providing you with a complete Kubernetes manifest to instantiate the virtual node interface. Also you will get an installation bash script to be executed on the remote host where you want to delegate your container execution. That script is already configured to **automatically** authenticate the incoming request from the virtual node component, and forward the correct instructions to the openAPI interface of the [interLink plugin](./03-api-reference.mdx) (a.k.a. sidecar) of your choice. Thus you can use this setup also for directly [developing a plugin](./02-develop-a-plugin.md), without caring for anything else. - -## Requirements - -- MiniKube -- A GitHub account -- A "remote" machine with a port that is reachable by the MiniKube host - -:::danger -In this tutorial, we suppose the remote VM fully owned (not shared) by the user only. There is NO protection against call to the interLink services coming from the machine itself on the localhost. If you need to install it in a "multi user" environment, please refer to [this guide](./05-multi-user.md) -::: - -## Create an OAuth GitHub app - -:::warning -In this tutorial GitHub tokens are just an example of authentication mechanism, any OpenID compliant identity provider is also supported with the very same deployment script, see [examples here](./04-oidc-IAM.md). -::: - -As a first step, you need to create a GitHub OAuth application to allow interLink to make authentication between your Kubernetes cluster and the remote endpoint. - -Head to [https://github.com/settings/apps](https://github.com/settings/apps) and click on `New GitHub App`. You should now be looking at a form like this: - - - -Provide a name for the OAuth2 application, e.g. `interlink-demo-test`, and you can skip the description, unless you want to provide one for future reference. -For our purpose Homepage reference is also not used, so fill free to put there `https://intertwin-eu.github.io/interLink/`. - -Check now that refresh token and device flow authentication: - - - - -Disable webhooks and save clicking on `Create GitHub App` - - - -You can click then on your application that should now appear at [https://github.com/settings/apps](https://github.com/settings/apps) and you need to save two strings: the `Client ID` and clicking on `Generate a new client secret` you should be able to note down the relative `Client Secret`. - -Now it's all set for the next steps. - -## Configuring your virtual kubelet setup - -You can download the interLink **installer CLI** for your OS and processor architecture from the [release page](https://github.com/interTwin-eu/interLink/releases), looking for the binaries starting with `interlink-install`. For instance, if on a `Linux` platform with `x86_64` processor: - -```bash -export VERSION=0.2.3-pre6 -wget -O interlink-install https://github.com/interTwin-eu/interLink/releases/download/$VERSION/interlink-install_Linux_x86_64 -chmod +x interlink-install -``` - -The CLI offers a utility option to initiate an empty config file for the installation at `$HOME/.interlink.yaml`: - -```bash -./interlink-install --init -``` - -You are now ready to go ahead and edit the produced file with all the setup information. - -Let's take the following as an example of a valid configuration file: - -:::warning -see [release page](https://github.com/interTwin-eu/interLink/releases) to get the latest one! And change the value accordingly! -::: - -```yaml -interlink_ip: 192.168.1.127 -interlink_port: 30443 -interlink_version: 0.2.1-patch2 -kubelet_node_name: my-civo-node -kubernetes_namespace: interlink -node_limits: - cpu: "10" - memory: 256Gi - pods: "10" -oauth: - provider: github - issuer: https://github.com/oauth - grant_type: authorization_code - scopes: - - "read:user" - github_user: "dciangot" - token_url: "https://github.com/login/oauth/access_token" - device_code_url: "https://github.com/login/device/code" - client_id: "XXXXXXX" - client_secret: "XXXXXXXX" -``` - -This config file has the following meaning: -- the remote components (where the pods will be "offloaded") will listen on the ip address `192.168.1.127` on the port `30443` -- deploy all the components from interlink release 0.1.2 (see [release page](https://github.com/interTwin-eu/interLink/releases) to get the latest one) -- the virtual node will appear in the cluster under the name `my-civo-node` -- the in-cluster components will run under `interlink` namespace -- the virtual node will show the following static resources availability: - - 10 cores - - 256GiB RAM - - a maximum of 10 pods -- the cluster-to-interlink communication will be authenticated via github provider, with a token with minimum capabilities (scope `read:user` only), and only the tokens for user `dciangot` will be allowed to talk to the interlink APIs -- `token_url` and `device_code_url` should be left like that if you use GitHub -- `cliend_id` and `client_secret` noted down at the beginning of the tutorial - -You are ready now to go ahead generating the needed manifests and script for the deployment. - -## Deploy the interlink Kubernetes Agent - -Generate the manifests and the automatic interlink installation script with: - -```bash -./interlink-install -``` - -follow the instruction to authenticate with the device code flow and, if everything went well, you should get an output like the following: - -```text -please enter code XXXX-XXXX at https://github.com/login/device - - -=== Deployment file written at: /Users/dciangot/.interlink/interlink.yaml === - - To deploy the virtual kubelet run: - kubectl apply -f /Users/dciangot/.interlink/interlink.yaml - - -=== Installation script for remote interLink APIs stored at: /Users/dciangot/.interlink/interlink-remote.sh === - - Please execute the script on the remote server: 192.168.1.127 - - "./interlink-remote.sh install" followed by "interlink-remote.sh start" -``` - -We are almost there! Essentially you need to follow what suggested by the prompt. - -So go ahead and apply the produced manifest to your minikube/kubernetes instance with: - -```bash -kubectl apply -f $HOME/.interlink/interlink.yaml -``` - -Check that the node appears successfully after some time, or as soon as you see the pods in namespace `interlink` running. - -You are now ready to setup the second component on the remote host. - -## Deploy the interLink core components - -Copy the `$HOME/.interlink/interlink-remote.sh` file on the remote host: - -```bash -scp -r $HOME/.interlink/interlink-remote.sh ubuntu@192.168.1.127:~ -``` - -Then login into the machine and start installing all the needed binaries and configurations: - -```bash -chmod +x ./interlink-remote.sh -./interlink-remote.sh install -``` - -:::warning - -By default the script will generate self-signed certificates for your ip adrress. If you want to use yours you can place them in `~/.interlink/config/tls.{crt,key}`. - -::: - -Now it's time to star the components (namely oauth2_proxy and interlink API server): - -```bash -./interlink-remote.sh start -``` - -Check that no errors appear in the logs located in `~/.interlink/logs`. You should also start seeing ping requests coming in from your kubernetes cluster. - -To stop or restart the components you can use the dedicated commands: - -```bash -./interlink-remote.sh stop -./interlink-remote.sh restart -``` - -## Attach your favorite plugin or develop one! - -[Next chapter](./02-develop-a-plugin.md) will show the basics for developing a new plugin following the interLink openAPI spec. - -In alterative you can start an already supported one. - - -### Remote SLURM job submission - -:::warning -Note that the SLURM plugin repository is: [github.com/interTwin-eu/interlink-slurm-plugin](https://github.com/interTwin-eu/interlink-slurm-plugin) -::: - -#### Requirements - -- a slurm CLI available on the remote host and configured to interact with the computing cluster -- a sharedFS with all the worker nodes - - an experimental feature is available for cases in which this is not possible - -#### Configuration - -Create a config file `$HOME/.interlink/config/slurm.yaml`: - -```yaml -# Plugin local endpoint -SidecarPort: "4000" -SidecarURL: "http://localhost" - -# Prefix for every plugin slurm command -CommandPrefix: "" - -# Use sharedFS for configmap and secrets -ExportPodData: true - -# Directory where all the core interlink logs and jobs will be tracked -DataRootFolder: "/home/civo/.interlink/" - -# The endpoint for the slurm plugin daemon -InterlinkURL: "http://localhost" -InterlinkPort: "30080" - -# Absolute path to slurm and bash command -SbatchPath: "/usr/bin/sbatch" -ScancelPath: "/usr/bin/scancel" -SqueuePath: "/usr/bin/squeue" -BashPath: "/bin/bash" -``` - -:::danger -Before going ahead, put the correct DataRootFolder in the example above! Don't forget the `/` at the end! -::: - -#### Systemd installation - -:::warning -To get the latest version of the plugin, please visit the [release](https://github.com/interTwin-eu/interlink-slurm-plugin/releases) page. -::: - -Download the latest release with: - -```bash -VERSION=0.3.1 -wget -O $HOME/.interlink/bin/slurm-plugin https://github.com/interTwin-eu/interlink-slurm-plugin/releases/download/$VERSION/interlink-sidecar-slurm_Linux_x86_64 -chmod +x $HOME/.interlink/bin/slurm-plugin -``` - -Now you can create a systemd service on the user space with the following: - -```bash -mkdir -p $HOME/.config/systemd/user - -cat < $HOME/.config/systemd/user/slurm-plugin.service -[Unit] -Description=This Unit is needed to automatically start the SLURM plugin at system startup -After=network.target - -[Service] -Type=simple -ExecStart=$HOME/.interlink/bin/slurm-plugin -Environment="SLURMCONFIGPATH=$HOME/.interlink/config/slurm.yaml" -Environment="SHARED_FS=true" -StandardOutput=file:$HOME/.interlink/logs/plugin.log -StandardError=file:$HOME/.interlink/logs/plugin.log - -[Install] -WantedBy=multi-user.target -EOF - -systemctl --user daemon-reload -systemctl --user enable slurm-plugin.service -``` - -An eventually starting and monitoring with `start` and `status`: - -``` -systemctl --user start slurm-plugin.service -systemctl --user status slurm-plugin.service -``` - -Logs will be stored at `$HOME/.interlink/logs/plugin.log`. - -### Create UNICORE jobs to run on HPC centers - -[UNICORE](https://www.unicore.eu/) (Uniform Interface to Computing Resources) offers a ready-to-run system including client and server software. UNICORE makes distributed computing and data resources available in a seamless and secure way in intranets and the internet. - -- [UNICORE plugin](https://github.com/interTwin-eu/interlink-unicore-plugin) - -### Remote docker execution - -:::warning -An mantained plugin will come soon... -In the meantime you can take a look at the ["developing a plugin"](./02-develop-a-plugin.md) example. -::: - -- [Docker plugin repository](https://github.com/interTwin-eu/interlink-docker-plugin) - -### Submit pods to HTcondor or ARC batch systems - -:::warning -Coming soon -::: - -- [HTCondor plugin repository](https://github.com/interTwin-eu/interlink-htcondor-plugin) -- [ARC plugin repository](https://github.com/interTwin-eu/interlink-arc-plugin) - -## Test your setup - -Please find a demo pod to test your setup [here](https://intertwin-eu.github.io/interLink/docs/tutorial-admins/develop-a-plugin#lets-test-is-out). diff --git a/docs/docs/tutorial-admins/03-api-reference.mdx b/docs/docs/tutorial-admins/03-api-reference.mdx deleted file mode 100644 index f12f733f..00000000 --- a/docs/docs/tutorial-admins/03-api-reference.mdx +++ /dev/null @@ -1,11 +0,0 @@ ---- -sidebar_position: 3 ---- - -# Container Plugin OpenAPI reference - -Please find the sidecar OpenAPI JSON spec can be found [here](/openapi). - -import ApiDocMdx from '@theme/ApiDocMdx'; - - diff --git a/docs/docs/tutorial-admins/04-oidc-IAM.md b/docs/docs/tutorial-admins/04-oidc-IAM.md deleted file mode 100644 index 39c9cc7c..00000000 --- a/docs/docs/tutorial-admins/04-oidc-IAM.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -sidebar_position: 4 ---- - -# Configure OpenID connect identity providers - -In alternative of the GitHub authentication flow, we support any OpenID compliant identity provider. -The following are a few examples. - -## EGI Check-in - -If you have an account for [EGI check-in](https://aai.egi.eu), you should be able to set it -for authenticating the virtual kubelet with the interLink remote components with the following -piece of configuration to be passed to the [installation script](./01-deploy-interlink.mdx). - -```yaml -oauth: - provider: oidc - issuer: https://aai.egi.eu/auth/realms/egi - scopes: - - "openid" - - "email" - - "offline_access" - - "profile" - audience: interlink - grant_type: authorization_code - group_claim: email - group: "YOUR EMAIL HERE" - token_url: "https://aai.egi.eu/auth/realms/egi/protocol/openid-connect/token" - device_code_url: "https://aai.egi.eu/auth/realms/egi/protocol/openid-connect/auth/device" - client_id: "oidc-agent" - client_secret: "" -``` - -:::danger -Remember to put your email in the group field! -::: - -## Indigo IAM - -If you have an account for [Indigo IAM](https://iam.cloud.infn.it/), you should be able to set it -for authenticating the virtual kubelet with the interLink remote components. -Follow those steps to setup a new client in the IAM portal and get the necessary information to fill the configuration. -This guide is specific for the IAM portal [https://iam.cloud.infn.it/](https://iam.cloud.infn.it/) but it should be similar for other IAM portals -that are OpenID compliant. - -1. Go to the [IAM portal](https://iam.cloud.infn.it/) and log in. -2. After logging in, click on the `My clients` tab on the left side of the page and then select `New client` -as shown in the images below. - -![Go to my clients](./img/iam-client0.png) ![Create a new client](./img/iam-client1.png) -3. Set a name you prefer for the client. -4. Select the `Scopes` tab and add the following scopes: `openid`, `email`, `offline_access`, `profile`, `wlcg`, `wlcg.groups`. -5. Select the `Grant types` tab and add the following grant types: `authorization_code`, `client_credentials`, -`refresh_token`, `urn:ietf:params:oauth:grant-type:device_code`. -6. Save the client by pressing the `Save client` button. - -After creating the client, you will be able to see the new client in the `My clients` page as show in the image below. - -![Check the created client](./img/iam-client2.png) - -You can click on the client to see the client details. -You will find the `Client id` under the `Main` tab and the `Client secret` under the `Credentials` tab. -Now, with those information, you can fill this piece of configuration to be passed to the [installation script](./01-deploy-interlink.mdx). - -```yaml -oauth: - provider: oidc - issuer: "https://iam.cloud.infn.it/" - scopes: - - "openid" - - "email" - - "offline_access" - - "profile" - audience: users - grant_type: authorization_code - group_claim: email - group: "YOUR EMAIL HERE" - token_url: "https://iam.cloud.infn.it/token" - device_code_url: "https://iam.cloud.infn.it/devicecode" - client_id: "YOUR CLIENT ID HERE" - client_secret: "YOUR CLIENT SECRET HERE" -``` diff --git a/docs/docs/tutorial-admins/05-multi-user.md b/docs/docs/tutorial-admins/05-multi-user.md deleted file mode 100644 index f79da230..00000000 --- a/docs/docs/tutorial-admins/05-multi-user.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -sidebar_position: 5 ---- - -# Multi-user setup - -We can rely on unix socket communication in order to restrict the access to the interLink API components. - -## Configuration - -:::warning -TBD -::: diff --git a/docs/docs/tutorial-admins/06-monitoring.md b/docs/docs/tutorial-admins/06-monitoring.md deleted file mode 100644 index cfa2dc14..00000000 --- a/docs/docs/tutorial-admins/06-monitoring.md +++ /dev/null @@ -1,101 +0,0 @@ ---- -sidebar_position: 6 ---- - - -# InterLink Monitoring System - -## Description - -To monitor the InterLink stack, you can use an helm chart that deploys the entire stack and components needed for monitoring the Interlink components, in particular the Virtual Kubelet (VK) -of the Interlink project. In the near future, the monitoring system will be extended to monitor other components of the Interlink project. - -## Monitoring System Components - -The monitoring system is composed of the following two components: -1. [Grafana Tempo](https://grafana.com/docs/tempo/latest/) -2. [Grafana](https://grafana.com) - -### Grafana Tempo - -Grafana Tempo (or simply **Tempo**) is an open-source distributed tracing backend developed by Grafana Labs designed to handle high-scale and high-volume distributed tracing data. -The choice of Tempo was made because of its key features: -- **Scalability**: Tempo is designed to scale horizontally and handle millions of spans (a span is a single operation in a trace) per second. Moreover, it is capable of storing traces without requiring a database, instead leveraging object storage. -- **Simplicity**: Tempo does not index traces because it relies Grafana for querying and visualizing traces. This approach reduces complexity and operational overhead. -- **Cost**: Tempo is cost-effective because it uses object storage for storing traces, which is cheaper than traditional databases. -- **Integration**: Tempo integrates with popular tracing protocols. One of them is OpenTelemetry, which is used by the Virtual Kubelet (VK) of the Interlink project. -- **Querying**: Tempo provides a query language that allows users to filter and aggregate traces. It also supports distributed sampling, which allows users to sample traces across services. The powerful query language is a key feature that enables users to extract insights from traces and it is one of the main reasons why Tempo was chosen for the monitoring system. - -### Grafana - -Grafana is an open-source platform for monitoring and observability that allows users to query, visualize, alert on, and understand metrics no matter where they are stored. It is used to create, explore, and share dashboards with teams and stakeholders. Grafana supports a wide range of data sources, including Tempo. - - -## VK tracing - -The Virtual Kubelet (VK) of the Interlink project is instrumented with **OpenTelemetry** to generate traces. OpenTelemetry is an open-source observability framework that provides APIs, libraries, agents, and instrumentation to collect telemetry data from applications and services. The traces generated by the VK are sent to Tempo, where they are stored and queried. -Traces are generated by the VK when a request is made to the VK, and they contain information about the request, such as the details of the operation, the duration of the operation, and the services involved in the operation. A trace is a collection of spans, where each span represents a single operation in the trace. Spans are linked together to form a trace, which provides a complete view of the flow and performance of the operation. A span contains metadata, such as the name of the operation, the start and end time of the operation, and the service that generated the span. - -The flow is represented in the following image: - -![Monitoring flow](./img/vk_tracing.png) - -In the actual setup, Tempo is deployed in the same Kubernetes cluster as the VK. Thanks to a Kubernetes service, the VK can send traces to Tempo. -No TLS is used for the communication between the VK and Tempo, as the communication is internal to the cluster. -In the near future, the communication between the VK and Tempo will be secured using TLS if Tempo is deployed outside the cluster and a proxy will be used to authenticate the VK with Tempo. - -The following table is a list of spans generated by the VK: - -| Span Name | Description | Attributes | -| --- | --- | --- | -| CreateHttpCall | Span that represents the HTTP call made by the VK to the Interlink API to create a pod. | pod.name, pod.namespace, start.timestamp, end.timestamp, duration, exitc.code | -| DeleteHttpCall | Span that represents the HTTP call made by the VK to the Interlink API to delete a pod. | pod.name pod.namespace, start.timestamp, end.timestamp, duration, exitc.code | -| StatusHttpCall | Span that represents the HTTP call made by the VK to the Interlink API to get the status of a pod. | pod.name pod.namespace, start.timestamp, end.timestamp, duration, exitc.code | -| LogHttpCall | Span that represents the HTTP call made by the VK to the Interlink API to get the logs of a pod. | pod.name pod.namespace, start.timestamp, end.timestamp, duration, exitc.code | -| PingHttpCall | Span that represents the HTTP call made by the VK to the Interlink API check if the API is alive. | start.timestamp, end.timestamp, duration, exitc.code | -| CreatePodVK | Span that represents the call made by the VK to the Kubernetes API to create a pod. | pod.name pod.namespace, start.timestamp, end.timestamp, duration | -| DeletePodVK | Span that represents the call made by the VK to the Kubernetes API to delete a pod. | pod.name pod.namespace, start.timestamp, end.timestamp, duration | -| UpdatePodVK | Span that represents the call made by the VK to the Kubernetes API to update a pod. | pod.name pod.namespace, start.timestamp, end.timestamp, duration | -| GetPodVK | Span that represents the call made by the VK to the Kubernetes API to get a pod. | pod.name pod.namespace, start.timestamp, end.timestamp, duration | -| GetPodStatusVK | Span that represents the call made by the VK to the Kubernetes API to get the status of a pod. | pod.name pod.namespace, start.timestamp, end.timestamp, duration | -| GetPodsVK | Span that represents the call made by the VK to the Kubernetes API to get all pods. | start.timestamp, end.timestamp, duration | - -## Installation - -:::warning -To Enable tracing for the Virtual Kubelet, you have to set the Environment Variable ```ENABLE_TRACING``` to 1 -::: - -A requirement for the monitoring system is to have Helm installed in your Kubernetes cluster or in your local machine. If you don't have Helm installed, you can follow the instructions in the following link: https://helm.sh/docs/intro/install/ - -This helm chart requires a NGINX Ingress Controller to be installed in the cluster in order to expose the services and access them from outside the cluster. -In particular, the Grafana service is exposed using an Ingress resource. - -To install the monitoring system, follow the steps below: - -1. Clone the repository: - -```bash -git clone https://github.com/interTwin-eu/interlink-monitoring-stack -``` - -2. Change the values in the `values.yaml` file to match your environment. -3. Create a namespace for the monitoring system using the following command: - -```bash -kubectl create namespace interlink-mon -``` -4. Install the monitoring system using the following command: - -```bash -helm upgrade --install helm-vk-monitoring-release interlink-monitoring-stack/ -n interlink-mon --debug -``` - -5. Deploy (or re-deploy) your Virtual Kubelet stack setting the ```TELEMETRY_ENDPOINT``` Environment Variable to your actual endpoint. -If not set, it defaults to ```localhost:4317```. Remember to enable the monitoring by also setting ```ENABLE_TRACING``` to 1. - -6. Access Grafana dashboard through the domain you defined in the `values.yaml` file with the credentials you defined in the `values.yaml` file. - -The following image shows the Grafana dashboard: - -![Grafana Dashboard](./img/dashboard.png) diff --git a/docs/docusaurus.config.local.ts b/docs/docusaurus.config.local.ts new file mode 100644 index 00000000..646e4848 --- /dev/null +++ b/docs/docusaurus.config.local.ts @@ -0,0 +1,150 @@ +import {themes as prismThemes} from 'prism-react-renderer'; +import type {Config} from '@docusaurus/types'; +import type * as Preset from '@docusaurus/preset-classic'; +import type * as Redocusaurus from 'redocusaurus'; + +const config: Config = { + title: 'interLink', + tagline: 'Your Virtual Kubelet ecosystem!', + favicon: 'img/favicon.ico', + + // Set the production url of your site here + url: 'https://interlink-hq.github.io', + // Set the // pathname under which your site is served + // For GitHub pages deployment, it is often '//' + baseUrl: '/', + + // GitHub pages deployment config. + // If you aren't using GitHub pages, you don't need these. + organizationName: 'INFN', // Usually your GitHub org/user name. + projectName: 'interLink', // Usually your repo name. + + onBrokenLinks: 'throw', + onBrokenMarkdownLinks: 'warn', + + // Even if you don't use internationalization, you can use this field to set + // useful metadata like html lang. For example, if your site is Chinese, you + // may want to replace "en" with "zh-Hans". + i18n: { + defaultLocale: 'en', + locales: ['en'], + }, + + presets: [ + [ + 'classic', + { + docs: { + sidebarPath: './sidebars.ts', + // Please change this to your repo. + // Remove this to remove the "edit this page" links. + editUrl: + 'https://github.com/interlink-hq/interLink', + }, + blog: false, + theme: { + customCss: './src/css/custom.css', + }, + } satisfies Preset.Options, + ], + [ + 'redocusaurus', + { + // Plugin Options for loading OpenAPI files + specs: [ + // Pass it a path to a local OpenAPI YAML file + { + // Redocusaurus will automatically bundle your spec into a single file during the build + id: 'plugin-api', + spec: 'openapi/plugin-openapi.json', + route: '/plugin-openapi/', + }, + { + // Redocusaurus will automatically bundle your spec into a single file during the build + id: 'interlink-api', + spec: 'openapi/interlink-openapi.json', + route: '/interlink-openapi/', + }, + ], + // Theme Options for modifying how redoc renders them + theme: { + // Change with your site colors + primaryColor: '#1890ff', + }, + }, + ], + + ], + + themeConfig: { + announcementBar: { + id: 'support_us', + content: + 'We are onboarding for our contribution to CNCF Sandbox! Please let us know for any broken or missing information as we move to the new home.', + backgroundColor: '#fafbfc', + textColor: '#091E42', + isCloseable: false, + }, + // Replace with your project's social card + image: 'img/img/interlink_logo.png', + navbar: { + title: 'Home', + logo: { + alt: 'interLink Logo', + src: 'img/interlink_logo.png', + }, + items: [ + { + type: 'docSidebar', + sidebarId: 'tutorialSidebar', + position: 'left', + label: 'Docs', + }, + { + href: 'https://github.com/interlink-hq/interLink', + label: 'GitHub', + position: 'right', + }, + ], + }, + footer: { + style: 'dark', + links: [ + { + title: 'Docs', + items: [ + { + label: 'Docs', + to: '/docs/intro', + }, + ], + }, + { + title: 'Community', + items: [ + { + label: 'interTwin project Slack', + href: 'https://join.slack.com/t/intertwin/shared_invite/zt-2cs67h9wz-2DFQ6EiSQGS1vlbbbJHctA', + } + ], + }, + { + title: 'More', + items: [ + { + label: 'GitHub', + href: 'https://github.com/interlink-hq/interLink', + }, + ], + }, + ], + copyright: `Originally created by INFN - Copyright © interLink a Series of LF Projects, LLC.`, + }, + prism: { + theme: prismThemes.github, + darkTheme: prismThemes.dracula, + }, + } satisfies Preset.ThemeConfig, +}; + +export default config; diff --git a/docs/docusaurus.config.ts b/docs/docusaurus.config.ts index 036ed4d7..504ffe02 100644 --- a/docs/docusaurus.config.ts +++ b/docs/docusaurus.config.ts @@ -5,18 +5,18 @@ import type * as Redocusaurus from 'redocusaurus'; const config: Config = { title: 'interLink', - tagline: 'Extend your cloud... everywhere!', + tagline: 'Your Virtual Kubelet ecosystem!', favicon: 'img/favicon.ico', // Set the production url of your site here - url: 'https://intertwin-eu.github.io', + url: 'https://interlink-hq.github.io', // Set the // pathname under which your site is served // For GitHub pages deployment, it is often '//' baseUrl: '/interLink/', // GitHub pages deployment config. // If you aren't using GitHub pages, you don't need these. - organizationName: 'INFN', // Usually your GitHub org/user name. + organizationName: 'interlink-hq', // Usually your GitHub org/user name. projectName: 'interLink', // Usually your repo name. onBrokenLinks: 'throw', @@ -39,7 +39,7 @@ const config: Config = { // Please change this to your repo. // Remove this to remove the "edit this page" links. editUrl: - 'https://github.com/interTwin-eu/interLink', + 'https://github.com/interlink-hq/interLink', }, blog: false, theme: { @@ -55,9 +55,15 @@ const config: Config = { // Pass it a path to a local OpenAPI YAML file { // Redocusaurus will automatically bundle your spec into a single file during the build - id: 'using-single-yaml', - spec: 'openapi/openapi.json', - route: '/openapi/', + id: 'plugin-api', + spec: 'openapi/plugin-openapi.json', + route: '/plugin-openapi/', + }, + { + // Redocusaurus will automatically bundle your spec into a single file during the build + id: 'interlink-api', + spec: 'openapi/interlink-openapi.json', + route: '/interlink-openapi/', }, ], // Theme Options for modifying how redoc renders them @@ -71,6 +77,15 @@ const config: Config = { ], themeConfig: { + announcementBar: { + id: 'support_us', + content: + 'We are onboarding for our contribution to CNCF Sandbox! Please let us know for any broken or missing information as we move to the new home.', + backgroundColor: '#fafbfc', + textColor: '#091E42', + isCloseable: false, + }, + // Replace with your project's social card image: 'img/img/interlink_logo.png', navbar: { @@ -87,7 +102,7 @@ const config: Config = { label: 'Docs', }, { - href: 'https://github.com/interTwin-eu/interLink', + href: 'https://github.com/interlink-hq/interLink', label: 'GitHub', position: 'right', }, @@ -119,12 +134,12 @@ const config: Config = { items: [ { label: 'GitHub', - href: 'https://github.com/interTwin-eu/interLink', + href: 'https://github.com/interlink-hq/interLink', }, ], }, ], - copyright: `Copyright © ${new Date().getFullYear()} Istituto Nazionale di Fisica Nucleare (INFN) - Built with Docusaurus.`, + copyright: `Originally created by INFN - Copyright © interLink a Series of LF Projects, LLC.`, }, prism: { theme: prismThemes.github, diff --git a/docs/openapi/interlink-openapi.json b/docs/openapi/interlink-openapi.json new file mode 100644 index 00000000..6cb79e8c --- /dev/null +++ b/docs/openapi/interlink-openapi.json @@ -0,0 +1 @@ +{"openapi":"3.0.3","info":{"title":"interLink server API","description":"This is the API spec for the Virtual Kubelet to interLink API server communication","version":"0.4.0"},"paths":{"/create":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterlinkPodCreateRequests"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterlinkRetrievedPodData"}}}}}}},"/delete":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Pod"}}}},"responses":{"200":{"description":"OK"}}}},"/getLogs":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterlinkLogStruct"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"string"}}}}}}},"/pinglink":{"post":{"responses":{"200":{"description":"OK"}}}},"/status":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/V1Pod"},"nullable":true}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/InterlinkPodStatus"}}}}}}}}},"components":{"schemas":{"InterlinkContainerLogOpts":{"type":"object","properties":{"Bytes":{"type":"integer"},"Follow":{"type":"boolean"},"Previous":{"type":"boolean"},"SinceSeconds":{"type":"integer"},"SinceTime":{"type":"string","format":"date-time"},"Tail":{"type":"integer"},"Timestamps":{"type":"boolean"}}},"InterlinkLogStruct":{"type":"object","properties":{"ContainerName":{"type":"string"},"Namespace":{"type":"string"},"Opts":{"$ref":"#/components/schemas/InterlinkContainerLogOpts"},"PodName":{"type":"string"},"PodUID":{"type":"string"}}},"InterlinkPodCreateRequests":{"type":"object","properties":{"configmaps":{"type":"array","items":{"$ref":"#/components/schemas/V1ConfigMap"},"nullable":true},"pod":{"$ref":"#/components/schemas/V1Pod"},"projectedvolumesmaps":{"type":"array","items":{"$ref":"#/components/schemas/V1ConfigMap"},"nullable":true},"secrets":{"type":"array","items":{"$ref":"#/components/schemas/V1Secret"},"nullable":true}}},"InterlinkPodStatus":{"type":"object","properties":{"JID":{"type":"string"},"UID":{"type":"string"},"containers":{"type":"array","items":{"$ref":"#/components/schemas/V1ContainerStatus"},"nullable":true},"initContainers":{"type":"array","items":{"$ref":"#/components/schemas/V1ContainerStatus"},"nullable":true},"name":{"type":"string"},"namespace":{"type":"string"}}},"InterlinkRetrievedContainer":{"type":"object","properties":{"configMaps":{"type":"array","items":{"$ref":"#/components/schemas/V1ConfigMap"},"nullable":true},"emptyDirs":{"type":"array","items":{"type":"string"},"nullable":true},"name":{"type":"string"},"projectedvolumemaps":{"type":"array","items":{"$ref":"#/components/schemas/V1ConfigMap"},"nullable":true},"secrets":{"type":"array","items":{"$ref":"#/components/schemas/V1Secret"},"nullable":true}}},"InterlinkRetrievedPodData":{"type":"object","properties":{"container":{"type":"array","items":{"$ref":"#/components/schemas/InterlinkRetrievedContainer"},"nullable":true},"pod":{"$ref":"#/components/schemas/V1Pod"}}},"IntstrIntOrString":{"type":"object"},"ResourceQuantity":{"type":"object"},"V1AWSElasticBlockStoreVolumeSource":{"type":"object","properties":{"fsType":{"type":"string"},"partition":{"type":"integer"},"readOnly":{"type":"boolean"},"volumeID":{"type":"string"}}},"V1Affinity":{"type":"object","properties":{"nodeAffinity":{"$ref":"#/components/schemas/V1NodeAffinity"},"podAffinity":{"$ref":"#/components/schemas/V1PodAffinity"},"podAntiAffinity":{"$ref":"#/components/schemas/V1PodAntiAffinity"}}},"V1AzureDiskVolumeSource":{"type":"object","properties":{"cachingMode":{"type":"string","nullable":true},"diskName":{"type":"string"},"diskURI":{"type":"string"},"fsType":{"type":"string","nullable":true},"kind":{"type":"string","nullable":true},"readOnly":{"type":"boolean","nullable":true}}},"V1AzureFileVolumeSource":{"type":"object","properties":{"readOnly":{"type":"boolean"},"secretName":{"type":"string"},"shareName":{"type":"string"}}},"V1CSIVolumeSource":{"type":"object","properties":{"driver":{"type":"string"},"fsType":{"type":"string","nullable":true},"nodePublishSecretRef":{"$ref":"#/components/schemas/V1LocalObjectReference"},"readOnly":{"type":"boolean","nullable":true},"volumeAttributes":{"type":"object","additionalProperties":{"type":"string"}}}},"V1Capabilities":{"type":"object","properties":{"add":{"type":"array","items":{"type":"string"}},"drop":{"type":"array","items":{"type":"string"}}}},"V1CephFSVolumeSource":{"type":"object","properties":{"monitors":{"type":"array","items":{"type":"string"},"nullable":true},"path":{"type":"string"},"readOnly":{"type":"boolean"},"secretFile":{"type":"string"},"secretRef":{"$ref":"#/components/schemas/V1LocalObjectReference"},"user":{"type":"string"}}},"V1CinderVolumeSource":{"type":"object","properties":{"fsType":{"type":"string"},"readOnly":{"type":"boolean"},"secretRef":{"$ref":"#/components/schemas/V1LocalObjectReference"},"volumeID":{"type":"string"}}},"V1ClaimSource":{"type":"object","properties":{"resourceClaimName":{"type":"string","nullable":true},"resourceClaimTemplateName":{"type":"string","nullable":true}}},"V1ClusterTrustBundleProjection":{"type":"object","properties":{"labelSelector":{"$ref":"#/components/schemas/V1LabelSelector"},"name":{"type":"string","nullable":true},"optional":{"type":"boolean","nullable":true},"path":{"type":"string"},"signerName":{"type":"string","nullable":true}}},"V1ConfigMap":{"type":"object","properties":{"apiVersion":{"type":"string"},"binaryData":{"type":"object","additionalProperties":{"type":"string","format":"base64"}},"data":{"type":"object","additionalProperties":{"type":"string"}},"immutable":{"type":"boolean","nullable":true},"kind":{"type":"string"},"metadata":{"$ref":"#/components/schemas/V1ObjectMeta"}}},"V1ConfigMapEnvSource":{"type":"object","properties":{"name":{"type":"string"},"optional":{"type":"boolean","nullable":true}}},"V1ConfigMapKeySelector":{"type":"object","properties":{"key":{"type":"string"},"name":{"type":"string"},"optional":{"type":"boolean","nullable":true}}},"V1ConfigMapProjection":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/V1KeyToPath"}},"name":{"type":"string"},"optional":{"type":"boolean","nullable":true}}},"V1ConfigMapVolumeSource":{"type":"object","properties":{"defaultMode":{"type":"integer","nullable":true},"items":{"type":"array","items":{"$ref":"#/components/schemas/V1KeyToPath"}},"name":{"type":"string"},"optional":{"type":"boolean","nullable":true}}},"V1Container":{"type":"object","properties":{"args":{"type":"array","items":{"type":"string"}},"command":{"type":"array","items":{"type":"string"}},"env":{"type":"array","items":{"$ref":"#/components/schemas/V1EnvVar"}},"envFrom":{"type":"array","items":{"$ref":"#/components/schemas/V1EnvFromSource"}},"image":{"type":"string"},"imagePullPolicy":{"type":"string"},"lifecycle":{"$ref":"#/components/schemas/V1Lifecycle"},"livenessProbe":{"$ref":"#/components/schemas/V1Probe"},"name":{"type":"string"},"ports":{"type":"array","items":{"$ref":"#/components/schemas/V1ContainerPort"}},"readinessProbe":{"$ref":"#/components/schemas/V1Probe"},"resizePolicy":{"type":"array","items":{"$ref":"#/components/schemas/V1ContainerResizePolicy"}},"resources":{"$ref":"#/components/schemas/V1ResourceRequirements"},"restartPolicy":{"type":"string","nullable":true},"securityContext":{"$ref":"#/components/schemas/V1SecurityContext"},"startupProbe":{"$ref":"#/components/schemas/V1Probe"},"stdin":{"type":"boolean"},"stdinOnce":{"type":"boolean"},"terminationMessagePath":{"type":"string"},"terminationMessagePolicy":{"type":"string"},"tty":{"type":"boolean"},"volumeDevices":{"type":"array","items":{"$ref":"#/components/schemas/V1VolumeDevice"}},"volumeMounts":{"type":"array","items":{"$ref":"#/components/schemas/V1VolumeMount"}},"workingDir":{"type":"string"}}},"V1ContainerPort":{"type":"object","properties":{"containerPort":{"type":"integer"},"hostIP":{"type":"string"},"hostPort":{"type":"integer"},"name":{"type":"string"},"protocol":{"type":"string"}}},"V1ContainerResizePolicy":{"type":"object","properties":{"resourceName":{"type":"string"},"restartPolicy":{"type":"string"}}},"V1ContainerState":{"type":"object","properties":{"running":{"$ref":"#/components/schemas/V1ContainerStateRunning"},"terminated":{"$ref":"#/components/schemas/V1ContainerStateTerminated"},"waiting":{"$ref":"#/components/schemas/V1ContainerStateWaiting"}}},"V1ContainerStateRunning":{"type":"object","properties":{"startedAt":{"type":"string"}}},"V1ContainerStateTerminated":{"type":"object","properties":{"containerID":{"type":"string"},"exitCode":{"type":"integer"},"finishedAt":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string"},"signal":{"type":"integer"},"startedAt":{"type":"string"}}},"V1ContainerStateWaiting":{"type":"object","properties":{"message":{"type":"string"},"reason":{"type":"string"}}},"V1ContainerStatus":{"type":"object","properties":{"allocatedResources":{"$ref":"#/components/schemas/V1ResourceList"},"containerID":{"type":"string"},"image":{"type":"string"},"imageID":{"type":"string"},"lastState":{"$ref":"#/components/schemas/V1ContainerState"},"name":{"type":"string"},"ready":{"type":"boolean"},"resources":{"$ref":"#/components/schemas/V1ResourceRequirements"},"restartCount":{"type":"integer"},"started":{"type":"boolean","nullable":true},"state":{"$ref":"#/components/schemas/V1ContainerState"}}},"V1DownwardAPIProjection":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/V1DownwardAPIVolumeFile"}}}},"V1DownwardAPIVolumeFile":{"type":"object","properties":{"fieldRef":{"$ref":"#/components/schemas/V1ObjectFieldSelector"},"mode":{"type":"integer","nullable":true},"path":{"type":"string"},"resourceFieldRef":{"$ref":"#/components/schemas/V1ResourceFieldSelector"}}},"V1DownwardAPIVolumeSource":{"type":"object","properties":{"defaultMode":{"type":"integer","nullable":true},"items":{"type":"array","items":{"$ref":"#/components/schemas/V1DownwardAPIVolumeFile"}}}},"V1EmptyDirVolumeSource":{"type":"object","properties":{"medium":{"type":"string"},"sizeLimit":{"$ref":"#/components/schemas/ResourceQuantity"}}},"V1EnvFromSource":{"type":"object","properties":{"configMapRef":{"$ref":"#/components/schemas/V1ConfigMapEnvSource"},"prefix":{"type":"string"},"secretRef":{"$ref":"#/components/schemas/V1SecretEnvSource"}}},"V1EnvVar":{"type":"object","properties":{"name":{"type":"string"},"value":{"type":"string"},"valueFrom":{"$ref":"#/components/schemas/V1EnvVarSource"}}},"V1EnvVarSource":{"type":"object","properties":{"configMapKeyRef":{"$ref":"#/components/schemas/V1ConfigMapKeySelector"},"fieldRef":{"$ref":"#/components/schemas/V1ObjectFieldSelector"},"resourceFieldRef":{"$ref":"#/components/schemas/V1ResourceFieldSelector"},"secretKeyRef":{"$ref":"#/components/schemas/V1SecretKeySelector"}}},"V1EphemeralContainer":{"type":"object","properties":{"args":{"type":"array","items":{"type":"string"}},"command":{"type":"array","items":{"type":"string"}},"env":{"type":"array","items":{"$ref":"#/components/schemas/V1EnvVar"}},"envFrom":{"type":"array","items":{"$ref":"#/components/schemas/V1EnvFromSource"}},"image":{"type":"string"},"imagePullPolicy":{"type":"string"},"lifecycle":{"$ref":"#/components/schemas/V1Lifecycle"},"livenessProbe":{"$ref":"#/components/schemas/V1Probe"},"name":{"type":"string"},"ports":{"type":"array","items":{"$ref":"#/components/schemas/V1ContainerPort"}},"readinessProbe":{"$ref":"#/components/schemas/V1Probe"},"resizePolicy":{"type":"array","items":{"$ref":"#/components/schemas/V1ContainerResizePolicy"}},"resources":{"$ref":"#/components/schemas/V1ResourceRequirements"},"restartPolicy":{"type":"string","nullable":true},"securityContext":{"$ref":"#/components/schemas/V1SecurityContext"},"startupProbe":{"$ref":"#/components/schemas/V1Probe"},"stdin":{"type":"boolean"},"stdinOnce":{"type":"boolean"},"targetContainerName":{"type":"string"},"terminationMessagePath":{"type":"string"},"terminationMessagePolicy":{"type":"string"},"tty":{"type":"boolean"},"volumeDevices":{"type":"array","items":{"$ref":"#/components/schemas/V1VolumeDevice"}},"volumeMounts":{"type":"array","items":{"$ref":"#/components/schemas/V1VolumeMount"}},"workingDir":{"type":"string"}}},"V1EphemeralVolumeSource":{"type":"object","properties":{"volumeClaimTemplate":{"$ref":"#/components/schemas/V1PersistentVolumeClaimTemplate"}}},"V1ExecAction":{"type":"object","properties":{"command":{"type":"array","items":{"type":"string"}}}},"V1FCVolumeSource":{"type":"object","properties":{"fsType":{"type":"string"},"lun":{"type":"integer","nullable":true},"readOnly":{"type":"boolean"},"targetWWNs":{"type":"array","items":{"type":"string"}},"wwids":{"type":"array","items":{"type":"string"}}}},"V1FieldsV1":{"type":"object"},"V1FlexVolumeSource":{"type":"object","properties":{"driver":{"type":"string"},"fsType":{"type":"string"},"options":{"type":"object","additionalProperties":{"type":"string"}},"readOnly":{"type":"boolean"},"secretRef":{"$ref":"#/components/schemas/V1LocalObjectReference"}}},"V1FlockerVolumeSource":{"type":"object","properties":{"datasetName":{"type":"string"},"datasetUUID":{"type":"string"}}},"V1GCEPersistentDiskVolumeSource":{"type":"object","properties":{"fsType":{"type":"string"},"partition":{"type":"integer"},"pdName":{"type":"string"},"readOnly":{"type":"boolean"}}},"V1GRPCAction":{"type":"object","properties":{"port":{"type":"integer"},"service":{"type":"string","nullable":true}}},"V1GitRepoVolumeSource":{"type":"object","properties":{"directory":{"type":"string"},"repository":{"type":"string"},"revision":{"type":"string"}}},"V1GlusterfsVolumeSource":{"type":"object","properties":{"endpoints":{"type":"string"},"path":{"type":"string"},"readOnly":{"type":"boolean"}}},"V1HTTPGetAction":{"type":"object","properties":{"host":{"type":"string"},"httpHeaders":{"type":"array","items":{"$ref":"#/components/schemas/V1HTTPHeader"}},"path":{"type":"string"},"port":{"$ref":"#/components/schemas/IntstrIntOrString"},"scheme":{"type":"string"}}},"V1HTTPHeader":{"type":"object","properties":{"name":{"type":"string"},"value":{"type":"string"}}},"V1HostAlias":{"type":"object","properties":{"hostnames":{"type":"array","items":{"type":"string"}},"ip":{"type":"string"}}},"V1HostIP":{"type":"object","properties":{"ip":{"type":"string"}}},"V1HostPathVolumeSource":{"type":"object","properties":{"path":{"type":"string"},"type":{"type":"string","nullable":true}}},"V1ISCSIVolumeSource":{"type":"object","properties":{"chapAuthDiscovery":{"type":"boolean"},"chapAuthSession":{"type":"boolean"},"fsType":{"type":"string"},"initiatorName":{"type":"string","nullable":true},"iqn":{"type":"string"},"iscsiInterface":{"type":"string"},"lun":{"type":"integer"},"portals":{"type":"array","items":{"type":"string"}},"readOnly":{"type":"boolean"},"secretRef":{"$ref":"#/components/schemas/V1LocalObjectReference"},"targetPortal":{"type":"string"}}},"V1KeyToPath":{"type":"object","properties":{"key":{"type":"string"},"mode":{"type":"integer","nullable":true},"path":{"type":"string"}}},"V1LabelSelector":{"type":"object","properties":{"matchExpressions":{"type":"array","items":{"$ref":"#/components/schemas/V1LabelSelectorRequirement"}},"matchLabels":{"type":"object","additionalProperties":{"type":"string"}}}},"V1LabelSelectorRequirement":{"type":"object","properties":{"key":{"type":"string"},"operator":{"type":"string"},"values":{"type":"array","items":{"type":"string"}}}},"V1Lifecycle":{"type":"object","properties":{"postStart":{"$ref":"#/components/schemas/V1LifecycleHandler"},"preStop":{"$ref":"#/components/schemas/V1LifecycleHandler"}}},"V1LifecycleHandler":{"type":"object","properties":{"exec":{"$ref":"#/components/schemas/V1ExecAction"},"httpGet":{"$ref":"#/components/schemas/V1HTTPGetAction"},"sleep":{"$ref":"#/components/schemas/V1SleepAction"},"tcpSocket":{"$ref":"#/components/schemas/V1TCPSocketAction"}}},"V1LocalObjectReference":{"type":"object","properties":{"name":{"type":"string"}}},"V1ManagedFieldsEntry":{"type":"object","properties":{"apiVersion":{"type":"string"},"fieldsType":{"type":"string"},"fieldsV1":{"$ref":"#/components/schemas/V1FieldsV1"},"manager":{"type":"string"},"operation":{"type":"string"},"subresource":{"type":"string"},"time":{"type":"string"}}},"V1NFSVolumeSource":{"type":"object","properties":{"path":{"type":"string"},"readOnly":{"type":"boolean"},"server":{"type":"string"}}},"V1NodeAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"$ref":"#/components/schemas/V1PreferredSchedulingTerm"}},"requiredDuringSchedulingIgnoredDuringExecution":{"$ref":"#/components/schemas/V1NodeSelector"}}},"V1NodeSelector":{"type":"object","properties":{"nodeSelectorTerms":{"type":"array","items":{"$ref":"#/components/schemas/V1NodeSelectorTerm"},"nullable":true}}},"V1NodeSelectorRequirement":{"type":"object","properties":{"key":{"type":"string"},"operator":{"type":"string"},"values":{"type":"array","items":{"type":"string"}}}},"V1NodeSelectorTerm":{"type":"object","properties":{"matchExpressions":{"type":"array","items":{"$ref":"#/components/schemas/V1NodeSelectorRequirement"}},"matchFields":{"type":"array","items":{"$ref":"#/components/schemas/V1NodeSelectorRequirement"}}}},"V1ObjectFieldSelector":{"type":"object","properties":{"apiVersion":{"type":"string"},"fieldPath":{"type":"string"}}},"V1ObjectMeta":{"type":"object","properties":{"annotations":{"type":"object","additionalProperties":{"type":"string"}},"creationTimestamp":{"type":"string"},"deletionGracePeriodSeconds":{"type":"integer","nullable":true},"deletionTimestamp":{"type":"string"},"finalizers":{"type":"array","items":{"type":"string"}},"generateName":{"type":"string"},"generation":{"type":"integer"},"labels":{"type":"object","additionalProperties":{"type":"string"}},"managedFields":{"type":"array","items":{"$ref":"#/components/schemas/V1ManagedFieldsEntry"}},"name":{"type":"string"},"namespace":{"type":"string"},"ownerReferences":{"type":"array","items":{"$ref":"#/components/schemas/V1OwnerReference"}},"resourceVersion":{"type":"string"},"selfLink":{"type":"string"},"uid":{"type":"string"}}},"V1OwnerReference":{"type":"object","properties":{"apiVersion":{"type":"string"},"blockOwnerDeletion":{"type":"boolean","nullable":true},"controller":{"type":"boolean","nullable":true},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"}}},"V1PersistentVolumeClaimSpec":{"type":"object","properties":{"accessModes":{"type":"array","items":{"type":"string"}},"dataSource":{"$ref":"#/components/schemas/V1TypedLocalObjectReference"},"dataSourceRef":{"$ref":"#/components/schemas/V1TypedObjectReference"},"resources":{"$ref":"#/components/schemas/V1VolumeResourceRequirements"},"selector":{"$ref":"#/components/schemas/V1LabelSelector"},"storageClassName":{"type":"string","nullable":true},"volumeAttributesClassName":{"type":"string","nullable":true},"volumeMode":{"type":"string","nullable":true},"volumeName":{"type":"string"}}},"V1PersistentVolumeClaimTemplate":{"type":"object","properties":{"metadata":{"$ref":"#/components/schemas/V1ObjectMeta"},"spec":{"$ref":"#/components/schemas/V1PersistentVolumeClaimSpec"}}},"V1PersistentVolumeClaimVolumeSource":{"type":"object","properties":{"claimName":{"type":"string"},"readOnly":{"type":"boolean"}}},"V1PhotonPersistentDiskVolumeSource":{"type":"object","properties":{"fsType":{"type":"string"},"pdID":{"type":"string"}}},"V1Pod":{"type":"object","properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"metadata":{"$ref":"#/components/schemas/V1ObjectMeta"},"spec":{"$ref":"#/components/schemas/V1PodSpec"},"status":{"$ref":"#/components/schemas/V1PodStatus"}}},"V1PodAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"$ref":"#/components/schemas/V1WeightedPodAffinityTerm"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"$ref":"#/components/schemas/V1PodAffinityTerm"}}}},"V1PodAffinityTerm":{"type":"object","properties":{"labelSelector":{"$ref":"#/components/schemas/V1LabelSelector"},"matchLabelKeys":{"type":"array","items":{"type":"string"}},"mismatchLabelKeys":{"type":"array","items":{"type":"string"}},"namespaceSelector":{"$ref":"#/components/schemas/V1LabelSelector"},"namespaces":{"type":"array","items":{"type":"string"}},"topologyKey":{"type":"string"}}},"V1PodAntiAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"$ref":"#/components/schemas/V1WeightedPodAffinityTerm"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"$ref":"#/components/schemas/V1PodAffinityTerm"}}}},"V1PodCondition":{"type":"object","properties":{"lastProbeTime":{"type":"string"},"lastTransitionTime":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string"},"status":{"type":"string"},"type":{"type":"string"}}},"V1PodDNSConfig":{"type":"object","properties":{"nameservers":{"type":"array","items":{"type":"string"}},"options":{"type":"array","items":{"$ref":"#/components/schemas/V1PodDNSConfigOption"}},"searches":{"type":"array","items":{"type":"string"}}}},"V1PodDNSConfigOption":{"type":"object","properties":{"name":{"type":"string"},"value":{"type":"string","nullable":true}}},"V1PodIP":{"type":"object","properties":{"ip":{"type":"string"}}},"V1PodOS":{"type":"object","properties":{"name":{"type":"string"}}},"V1PodReadinessGate":{"type":"object","properties":{"conditionType":{"type":"string"}}},"V1PodResourceClaim":{"type":"object","properties":{"name":{"type":"string"},"source":{"$ref":"#/components/schemas/V1ClaimSource"}}},"V1PodResourceClaimStatus":{"type":"object","properties":{"name":{"type":"string"},"resourceClaimName":{"type":"string","nullable":true}}},"V1PodSchedulingGate":{"type":"object","properties":{"name":{"type":"string"}}},"V1PodSecurityContext":{"type":"object","properties":{"fsGroup":{"type":"integer","nullable":true},"fsGroupChangePolicy":{"type":"string","nullable":true},"runAsGroup":{"type":"integer","nullable":true},"runAsNonRoot":{"type":"boolean","nullable":true},"runAsUser":{"type":"integer","nullable":true},"seLinuxOptions":{"$ref":"#/components/schemas/V1SELinuxOptions"},"seccompProfile":{"$ref":"#/components/schemas/V1SeccompProfile"},"supplementalGroups":{"type":"array","items":{"type":"integer"}},"sysctls":{"type":"array","items":{"$ref":"#/components/schemas/V1Sysctl"}},"windowsOptions":{"$ref":"#/components/schemas/V1WindowsSecurityContextOptions"}}},"V1PodSpec":{"type":"object","properties":{"activeDeadlineSeconds":{"type":"integer","nullable":true},"affinity":{"$ref":"#/components/schemas/V1Affinity"},"automountServiceAccountToken":{"type":"boolean","nullable":true},"containers":{"type":"array","items":{"$ref":"#/components/schemas/V1Container"},"nullable":true},"dnsConfig":{"$ref":"#/components/schemas/V1PodDNSConfig"},"dnsPolicy":{"type":"string"},"enableServiceLinks":{"type":"boolean","nullable":true},"ephemeralContainers":{"type":"array","items":{"$ref":"#/components/schemas/V1EphemeralContainer"}},"hostAliases":{"type":"array","items":{"$ref":"#/components/schemas/V1HostAlias"}},"hostIPC":{"type":"boolean"},"hostNetwork":{"type":"boolean"},"hostPID":{"type":"boolean"},"hostUsers":{"type":"boolean","nullable":true},"hostname":{"type":"string"},"imagePullSecrets":{"type":"array","items":{"$ref":"#/components/schemas/V1LocalObjectReference"}},"initContainers":{"type":"array","items":{"$ref":"#/components/schemas/V1Container"}},"nodeName":{"type":"string"},"nodeSelector":{"type":"object","additionalProperties":{"type":"string"}},"os":{"$ref":"#/components/schemas/V1PodOS"},"overhead":{"$ref":"#/components/schemas/V1ResourceList"},"preemptionPolicy":{"type":"string","nullable":true},"priority":{"type":"integer","nullable":true},"priorityClassName":{"type":"string"},"readinessGates":{"type":"array","items":{"$ref":"#/components/schemas/V1PodReadinessGate"}},"resourceClaims":{"type":"array","items":{"$ref":"#/components/schemas/V1PodResourceClaim"}},"restartPolicy":{"type":"string"},"runtimeClassName":{"type":"string","nullable":true},"schedulerName":{"type":"string"},"schedulingGates":{"type":"array","items":{"$ref":"#/components/schemas/V1PodSchedulingGate"}},"securityContext":{"$ref":"#/components/schemas/V1PodSecurityContext"},"serviceAccount":{"type":"string"},"serviceAccountName":{"type":"string"},"setHostnameAsFQDN":{"type":"boolean","nullable":true},"shareProcessNamespace":{"type":"boolean","nullable":true},"subdomain":{"type":"string"},"terminationGracePeriodSeconds":{"type":"integer","nullable":true},"tolerations":{"type":"array","items":{"$ref":"#/components/schemas/V1Toleration"}},"topologySpreadConstraints":{"type":"array","items":{"$ref":"#/components/schemas/V1TopologySpreadConstraint"}},"volumes":{"type":"array","items":{"$ref":"#/components/schemas/V1Volume"}}}},"V1PodStatus":{"type":"object","properties":{"conditions":{"type":"array","items":{"$ref":"#/components/schemas/V1PodCondition"}},"containerStatuses":{"type":"array","items":{"$ref":"#/components/schemas/V1ContainerStatus"}},"ephemeralContainerStatuses":{"type":"array","items":{"$ref":"#/components/schemas/V1ContainerStatus"}},"hostIP":{"type":"string"},"hostIPs":{"type":"array","items":{"$ref":"#/components/schemas/V1HostIP"}},"initContainerStatuses":{"type":"array","items":{"$ref":"#/components/schemas/V1ContainerStatus"}},"message":{"type":"string"},"nominatedNodeName":{"type":"string"},"phase":{"type":"string"},"podIP":{"type":"string"},"podIPs":{"type":"array","items":{"$ref":"#/components/schemas/V1PodIP"}},"qosClass":{"type":"string"},"reason":{"type":"string"},"resize":{"type":"string"},"resourceClaimStatuses":{"type":"array","items":{"$ref":"#/components/schemas/V1PodResourceClaimStatus"}},"startTime":{"type":"string"}}},"V1PortworxVolumeSource":{"type":"object","properties":{"fsType":{"type":"string"},"readOnly":{"type":"boolean"},"volumeID":{"type":"string"}}},"V1PreferredSchedulingTerm":{"type":"object","properties":{"preference":{"$ref":"#/components/schemas/V1NodeSelectorTerm"},"weight":{"type":"integer"}}},"V1Probe":{"type":"object","properties":{"exec":{"$ref":"#/components/schemas/V1ExecAction"},"failureThreshold":{"type":"integer"},"grpc":{"$ref":"#/components/schemas/V1GRPCAction"},"httpGet":{"$ref":"#/components/schemas/V1HTTPGetAction"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"tcpSocket":{"$ref":"#/components/schemas/V1TCPSocketAction"},"terminationGracePeriodSeconds":{"type":"integer","nullable":true},"timeoutSeconds":{"type":"integer"}}},"V1ProjectedVolumeSource":{"type":"object","properties":{"defaultMode":{"type":"integer","nullable":true},"sources":{"type":"array","items":{"$ref":"#/components/schemas/V1VolumeProjection"},"nullable":true}}},"V1QuobyteVolumeSource":{"type":"object","properties":{"group":{"type":"string"},"readOnly":{"type":"boolean"},"registry":{"type":"string"},"tenant":{"type":"string"},"user":{"type":"string"},"volume":{"type":"string"}}},"V1RBDVolumeSource":{"type":"object","properties":{"fsType":{"type":"string"},"image":{"type":"string"},"keyring":{"type":"string"},"monitors":{"type":"array","items":{"type":"string"},"nullable":true},"pool":{"type":"string"},"readOnly":{"type":"boolean"},"secretRef":{"$ref":"#/components/schemas/V1LocalObjectReference"},"user":{"type":"string"}}},"V1ResourceClaim":{"type":"object","properties":{"name":{"type":"string"}}},"V1ResourceFieldSelector":{"type":"object","properties":{"containerName":{"type":"string"},"divisor":{"$ref":"#/components/schemas/ResourceQuantity"},"resource":{"type":"string"}}},"V1ResourceList":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ResourceQuantity"}},"V1ResourceRequirements":{"type":"object","properties":{"claims":{"type":"array","items":{"$ref":"#/components/schemas/V1ResourceClaim"}},"limits":{"$ref":"#/components/schemas/V1ResourceList"},"requests":{"$ref":"#/components/schemas/V1ResourceList"}}},"V1SELinuxOptions":{"type":"object","properties":{"level":{"type":"string"},"role":{"type":"string"},"type":{"type":"string"},"user":{"type":"string"}}},"V1ScaleIOVolumeSource":{"type":"object","properties":{"fsType":{"type":"string"},"gateway":{"type":"string"},"protectionDomain":{"type":"string"},"readOnly":{"type":"boolean"},"secretRef":{"$ref":"#/components/schemas/V1LocalObjectReference"},"sslEnabled":{"type":"boolean"},"storageMode":{"type":"string"},"storagePool":{"type":"string"},"system":{"type":"string"},"volumeName":{"type":"string"}}},"V1SeccompProfile":{"type":"object","properties":{"localhostProfile":{"type":"string","nullable":true},"type":{"type":"string"}}},"V1Secret":{"type":"object","properties":{"apiVersion":{"type":"string"},"data":{"type":"object","additionalProperties":{"type":"string","format":"base64"}},"immutable":{"type":"boolean","nullable":true},"kind":{"type":"string"},"metadata":{"$ref":"#/components/schemas/V1ObjectMeta"},"stringData":{"type":"object","additionalProperties":{"type":"string"}},"type":{"type":"string"}}},"V1SecretEnvSource":{"type":"object","properties":{"name":{"type":"string"},"optional":{"type":"boolean","nullable":true}}},"V1SecretKeySelector":{"type":"object","properties":{"key":{"type":"string"},"name":{"type":"string"},"optional":{"type":"boolean","nullable":true}}},"V1SecretProjection":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/V1KeyToPath"}},"name":{"type":"string"},"optional":{"type":"boolean","nullable":true}}},"V1SecretVolumeSource":{"type":"object","properties":{"defaultMode":{"type":"integer","nullable":true},"items":{"type":"array","items":{"$ref":"#/components/schemas/V1KeyToPath"}},"optional":{"type":"boolean","nullable":true},"secretName":{"type":"string"}}},"V1SecurityContext":{"type":"object","properties":{"allowPrivilegeEscalation":{"type":"boolean","nullable":true},"capabilities":{"$ref":"#/components/schemas/V1Capabilities"},"privileged":{"type":"boolean","nullable":true},"procMount":{"type":"string","nullable":true},"readOnlyRootFilesystem":{"type":"boolean","nullable":true},"runAsGroup":{"type":"integer","nullable":true},"runAsNonRoot":{"type":"boolean","nullable":true},"runAsUser":{"type":"integer","nullable":true},"seLinuxOptions":{"$ref":"#/components/schemas/V1SELinuxOptions"},"seccompProfile":{"$ref":"#/components/schemas/V1SeccompProfile"},"windowsOptions":{"$ref":"#/components/schemas/V1WindowsSecurityContextOptions"}}},"V1ServiceAccountTokenProjection":{"type":"object","properties":{"audience":{"type":"string"},"expirationSeconds":{"type":"integer","nullable":true},"path":{"type":"string"}}},"V1SleepAction":{"type":"object","properties":{"seconds":{"type":"integer"}}},"V1StorageOSVolumeSource":{"type":"object","properties":{"fsType":{"type":"string"},"readOnly":{"type":"boolean"},"secretRef":{"$ref":"#/components/schemas/V1LocalObjectReference"},"volumeName":{"type":"string"},"volumeNamespace":{"type":"string"}}},"V1Sysctl":{"type":"object","properties":{"name":{"type":"string"},"value":{"type":"string"}}},"V1TCPSocketAction":{"type":"object","properties":{"host":{"type":"string"},"port":{"$ref":"#/components/schemas/IntstrIntOrString"}}},"V1Toleration":{"type":"object","properties":{"effect":{"type":"string"},"key":{"type":"string"},"operator":{"type":"string"},"tolerationSeconds":{"type":"integer","nullable":true},"value":{"type":"string"}}},"V1TopologySpreadConstraint":{"type":"object","properties":{"labelSelector":{"$ref":"#/components/schemas/V1LabelSelector"},"matchLabelKeys":{"type":"array","items":{"type":"string"}},"maxSkew":{"type":"integer"},"minDomains":{"type":"integer","nullable":true},"nodeAffinityPolicy":{"type":"string","nullable":true},"nodeTaintsPolicy":{"type":"string","nullable":true},"topologyKey":{"type":"string"},"whenUnsatisfiable":{"type":"string"}}},"V1TypedLocalObjectReference":{"type":"object","properties":{"apiGroup":{"type":"string","nullable":true},"kind":{"type":"string"},"name":{"type":"string"}}},"V1TypedObjectReference":{"type":"object","properties":{"apiGroup":{"type":"string","nullable":true},"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string","nullable":true}}},"V1Volume":{"type":"object","properties":{"awsElasticBlockStore":{"$ref":"#/components/schemas/V1AWSElasticBlockStoreVolumeSource"},"azureDisk":{"$ref":"#/components/schemas/V1AzureDiskVolumeSource"},"azureFile":{"$ref":"#/components/schemas/V1AzureFileVolumeSource"},"cephfs":{"$ref":"#/components/schemas/V1CephFSVolumeSource"},"cinder":{"$ref":"#/components/schemas/V1CinderVolumeSource"},"configMap":{"$ref":"#/components/schemas/V1ConfigMapVolumeSource"},"csi":{"$ref":"#/components/schemas/V1CSIVolumeSource"},"downwardAPI":{"$ref":"#/components/schemas/V1DownwardAPIVolumeSource"},"emptyDir":{"$ref":"#/components/schemas/V1EmptyDirVolumeSource"},"ephemeral":{"$ref":"#/components/schemas/V1EphemeralVolumeSource"},"fc":{"$ref":"#/components/schemas/V1FCVolumeSource"},"flexVolume":{"$ref":"#/components/schemas/V1FlexVolumeSource"},"flocker":{"$ref":"#/components/schemas/V1FlockerVolumeSource"},"gcePersistentDisk":{"$ref":"#/components/schemas/V1GCEPersistentDiskVolumeSource"},"gitRepo":{"$ref":"#/components/schemas/V1GitRepoVolumeSource"},"glusterfs":{"$ref":"#/components/schemas/V1GlusterfsVolumeSource"},"hostPath":{"$ref":"#/components/schemas/V1HostPathVolumeSource"},"iscsi":{"$ref":"#/components/schemas/V1ISCSIVolumeSource"},"name":{"type":"string"},"nfs":{"$ref":"#/components/schemas/V1NFSVolumeSource"},"persistentVolumeClaim":{"$ref":"#/components/schemas/V1PersistentVolumeClaimVolumeSource"},"photonPersistentDisk":{"$ref":"#/components/schemas/V1PhotonPersistentDiskVolumeSource"},"portworxVolume":{"$ref":"#/components/schemas/V1PortworxVolumeSource"},"projected":{"$ref":"#/components/schemas/V1ProjectedVolumeSource"},"quobyte":{"$ref":"#/components/schemas/V1QuobyteVolumeSource"},"rbd":{"$ref":"#/components/schemas/V1RBDVolumeSource"},"scaleIO":{"$ref":"#/components/schemas/V1ScaleIOVolumeSource"},"secret":{"$ref":"#/components/schemas/V1SecretVolumeSource"},"storageos":{"$ref":"#/components/schemas/V1StorageOSVolumeSource"},"vsphereVolume":{"$ref":"#/components/schemas/V1VsphereVirtualDiskVolumeSource"}}},"V1VolumeDevice":{"type":"object","properties":{"devicePath":{"type":"string"},"name":{"type":"string"}}},"V1VolumeMount":{"type":"object","properties":{"mountPath":{"type":"string"},"mountPropagation":{"type":"string","nullable":true},"name":{"type":"string"},"readOnly":{"type":"boolean"},"subPath":{"type":"string"},"subPathExpr":{"type":"string"}}},"V1VolumeProjection":{"type":"object","properties":{"clusterTrustBundle":{"$ref":"#/components/schemas/V1ClusterTrustBundleProjection"},"configMap":{"$ref":"#/components/schemas/V1ConfigMapProjection"},"downwardAPI":{"$ref":"#/components/schemas/V1DownwardAPIProjection"},"secret":{"$ref":"#/components/schemas/V1SecretProjection"},"serviceAccountToken":{"$ref":"#/components/schemas/V1ServiceAccountTokenProjection"}}},"V1VolumeResourceRequirements":{"type":"object","properties":{"limits":{"$ref":"#/components/schemas/V1ResourceList"},"requests":{"$ref":"#/components/schemas/V1ResourceList"}}},"V1VsphereVirtualDiskVolumeSource":{"type":"object","properties":{"fsType":{"type":"string"},"storagePolicyID":{"type":"string"},"storagePolicyName":{"type":"string"},"volumePath":{"type":"string"}}},"V1WeightedPodAffinityTerm":{"type":"object","properties":{"podAffinityTerm":{"$ref":"#/components/schemas/V1PodAffinityTerm"},"weight":{"type":"integer"}}},"V1WindowsSecurityContextOptions":{"type":"object","properties":{"gmsaCredentialSpec":{"type":"string","nullable":true},"gmsaCredentialSpecName":{"type":"string","nullable":true},"hostProcess":{"type":"boolean","nullable":true},"runAsUserName":{"type":"string","nullable":true}}}}}} \ No newline at end of file diff --git a/docs/openapi/openapi.json b/docs/openapi/openapi.json deleted file mode 100644 index 577bf35a..00000000 --- a/docs/openapi/openapi.json +++ /dev/null @@ -1 +0,0 @@ -{"openapi": "3.1.0", "info": {"title": "interLink sidecar", "description": "openapi spec for interLink apis <-> provider sidecar communication", "version": "v0.0.0"}, "paths": {"/create": {"post": {"summary": "Create Pod", "operationId": "create_pod_create_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/Pod"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateStruct"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/delete": {"post": {"summary": "Delete Pod", "operationId": "delete_pod_delete_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/PodRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"type": "string", "title": "Response Delete Pod Delete Post"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/status": {"get": {"summary": "Status Pod", "operationId": "status_pod_status_get", "requestBody": {"content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/PodRequest"}, "type": "array", "title": "Pods"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/PodStatus"}, "type": "array", "title": "Response Status Pod Status Get"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/getLogs": {"get": {"summary": "Get Logs", "operationId": "get_logs_getLogs_get", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/LogRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"text/plain": {"schema": {"type": "string"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}}, "components": {"schemas": {"ConfigMap": {"properties": {"metadata": {"$ref": "#/components/schemas/Metadata"}, "data": {"anyOf": [{"type": "object"}, {"type": "null"}], "title": "Data"}, "binary_data": {"anyOf": [{"type": "object"}, {"type": "null"}], "title": "Binary Data"}, "type": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Type"}, "immutable": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Immutable"}}, "type": "object", "required": ["metadata", "data"], "title": "ConfigMap"}, "ConfigMapKeySelector": {"properties": {"key": {"type": "string", "title": "Key"}, "name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Name"}, "optional": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Optional"}}, "type": "object", "required": ["key"], "title": "ConfigMapKeySelector"}, "ConfigMapVolumeSource": {"properties": {"name": {"type": "string", "title": "Name"}, "items": {"anyOf": [{"items": {"$ref": "#/components/schemas/KeyToPath"}, "type": "array"}, {"type": "null"}], "title": "Items", "default": []}, "optional": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Optional"}, "default_mode": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Default Mode"}}, "type": "object", "required": ["name"], "title": "ConfigMapVolumeSource"}, "Container": {"properties": {"name": {"type": "string", "title": "Name"}, "image": {"type": "string", "title": "Image"}, "tag": {"type": "string", "title": "Tag", "default": "latest"}, "command": {"items": {"type": "string"}, "type": "array", "title": "Command"}, "args": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "title": "Args", "default": []}, "resources": {"anyOf": [{"type": "object"}, {"type": "null"}], "title": "Resources", "default": {}}, "volume_mounts": {"anyOf": [{"items": {"$ref": "#/components/schemas/VolumeMount"}, "type": "array"}, {"type": "null"}], "title": "Volume Mounts", "default": []}, "env": {"anyOf": [{"items": {"$ref": "#/components/schemas/EnvVar"}, "type": "array"}, {"type": "null"}], "title": "Env"}, "security_context": {"anyOf": [{"$ref": "#/components/schemas/SecurityContext"}, {"type": "null"}]}}, "type": "object", "required": ["name", "image", "command"], "title": "Container"}, "ContainerStates": {"properties": {"terminated": {"anyOf": [{"$ref": "#/components/schemas/StateTerminated"}, {"type": "null"}]}, "running": {"anyOf": [{"$ref": "#/components/schemas/StateRunning"}, {"type": "null"}]}, "waiting": {"anyOf": [{"$ref": "#/components/schemas/StateWaiting"}, {"type": "null"}]}}, "type": "object", "title": "ContainerStates"}, "ContainerStatus": {"properties": {"name": {"type": "string", "title": "Name"}, "state": {"$ref": "#/components/schemas/ContainerStates"}}, "type": "object", "required": ["name", "state"], "title": "ContainerStatus"}, "CreateStruct": {"properties": {"pod_uid": {"type": "string", "title": "Pod Uid"}, "pod_jid": {"type": "string", "title": "Pod Jid"}}, "type": "object", "required": ["pod_uid", "pod_jid"], "title": "CreateStruct"}, "EnvVar": {"properties": {"name": {"type": "string", "title": "Name"}, "value": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Value"}, "value_from": {"anyOf": [{"$ref": "#/components/schemas/EnvVarSource"}, {"type": "null"}]}}, "type": "object", "required": ["name"], "title": "EnvVar"}, "EnvVarSource": {"properties": {"config_map_key_ref": {"anyOf": [{"$ref": "#/components/schemas/ConfigMapKeySelector"}, {"type": "null"}]}, "secret_key_ref": {"anyOf": [{"$ref": "#/components/schemas/SecretKeySelector"}, {"type": "null"}]}}, "type": "object", "title": "EnvVarSource"}, "HTTPValidationError": {"properties": {"detail": {"items": {"$ref": "#/components/schemas/ValidationError"}, "type": "array", "title": "Detail"}}, "type": "object", "title": "HTTPValidationError"}, "KeyToPath": {"properties": {"key": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Key"}, "path": {"type": "string", "title": "Path"}, "mode": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Mode"}}, "type": "object", "required": ["key", "path"], "title": "KeyToPath"}, "LogOpts": {"properties": {"tail": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Tail"}, "limit_bytes": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Limit Bytes"}, "timestamps": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Timestamps"}, "previous": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Previous"}, "since_seconds": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Since Seconds"}, "since_time": {"anyOf": [{"type": "string", "format": "date-time"}, {"type": "null"}], "title": "Since Time"}}, "type": "object", "title": "LogOpts"}, "LogRequest": {"properties": {"namespace": {"type": "string", "title": "Namespace"}, "pod_uid": {"type": "string", "title": "Pod Uid"}, "pod_name": {"type": "string", "title": "Pod Name"}, "container_name": {"type": "string", "title": "Container Name"}, "opts": {"$ref": "#/components/schemas/LogOpts"}}, "type": "object", "required": ["namespace", "pod_uid", "pod_name", "container_name", "opts"], "title": "LogRequest"}, "Metadata": {"properties": {"name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Name"}, "namespace": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Namespace"}, "uid": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Uid"}, "annotations": {"anyOf": [{"additionalProperties": {"type": "string"}, "type": "object"}, {"type": "null"}], "title": "Annotations", "default": {}}, "labels": {"anyOf": [{"additionalProperties": {"type": "string"}, "type": "object"}, {"type": "null"}], "title": "Labels", "default": {}}, "generate_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Generate Name"}}, "type": "object", "title": "Metadata"}, "Pod": {"properties": {"pod": {"$ref": "#/components/schemas/PodRequest"}, "container": {"items": {"$ref": "#/components/schemas/Volume"}, "type": "array", "title": "Container"}}, "type": "object", "required": ["pod", "container"], "title": "Pod"}, "PodRequest": {"properties": {"metadata": {"$ref": "#/components/schemas/Metadata"}, "spec": {"$ref": "#/components/schemas/PodSpec"}}, "type": "object", "required": ["metadata", "spec"], "title": "PodRequest"}, "PodSpec": {"properties": {"containers": {"items": {"$ref": "#/components/schemas/Container"}, "type": "array", "title": "Containers"}, "init_containers": {"anyOf": [{"items": {"$ref": "#/components/schemas/Container"}, "type": "array"}, {"type": "null"}], "title": "Init Containers"}, "volumes": {"anyOf": [{"items": {"$ref": "#/components/schemas/PodVolume"}, "type": "array"}, {"type": "null"}], "title": "Volumes"}, "preemption_policy": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Preemption Policy"}, "priority_class_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Priority Class Name"}, "priority": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Priority"}, "restart_policy": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Restart Policy"}, "termination_grace_period_seconds": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Termination Grace Period Seconds"}}, "type": "object", "required": ["containers"], "title": "PodSpec"}, "PodStatus": {"properties": {"name": {"type": "string", "title": "Name"}, "uid": {"type": "string", "title": "Uid"}, "namespace": {"type": "string", "title": "Namespace"}, "containers": {"items": {"$ref": "#/components/schemas/ContainerStatus"}, "type": "array", "title": "Containers"}}, "type": "object", "required": ["name", "uid", "namespace", "containers"], "title": "PodStatus"}, "PodVolume": {"properties": {"name": {"type": "string", "title": "Name"}, "empty_dir": {"anyOf": [{"type": "object"}, {"type": "null"}], "title": "Empty Dir"}, "secret": {"anyOf": [{"$ref": "#/components/schemas/SecretVolumeSource"}, {"type": "null"}]}, "config_map": {"anyOf": [{"$ref": "#/components/schemas/ConfigMapVolumeSource"}, {"type": "null"}]}}, "type": "object", "required": ["name"], "title": "PodVolume"}, "Secret": {"properties": {"metadata": {"$ref": "#/components/schemas/Metadata"}, "data": {"anyOf": [{"type": "object"}, {"type": "null"}], "title": "Data"}, "string_data": {"anyOf": [{"type": "object"}, {"type": "null"}], "title": "String Data"}, "type": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Type"}, "immutable": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Immutable"}}, "type": "object", "required": ["metadata"], "title": "Secret"}, "SecretKeySelector": {"properties": {"key": {"type": "string", "title": "Key"}, "name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Name"}, "optional": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Optional"}}, "type": "object", "required": ["key"], "title": "SecretKeySelector"}, "SecretVolumeSource": {"properties": {"secret_name": {"type": "string", "title": "Secret Name"}, "items": {"anyOf": [{"items": {"$ref": "#/components/schemas/KeyToPath"}, "type": "array"}, {"type": "null"}], "title": "Items", "default": []}, "optional": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Optional"}, "default_mode": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Default Mode"}}, "type": "object", "required": ["secret_name"], "title": "SecretVolumeSource"}, "SecurityContext": {"properties": {"allow_privilege_escalation": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Allow Privilege Escalation"}, "privileged": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Privileged"}, "proc_mount": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Proc Mount"}, "read_only_file_system": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Read Only File System"}, "run_as_group": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Run As Group"}, "run_as_non_root": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Run As Non Root"}, "run_as_user": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Run As User"}}, "type": "object", "title": "SecurityContext"}, "StateRunning": {"properties": {"started_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Started At"}}, "type": "object", "title": "StateRunning"}, "StateTerminated": {"properties": {"exit_code": {"type": "integer", "title": "Exit Code"}, "reason": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Reason"}}, "type": "object", "required": ["exit_code"], "title": "StateTerminated"}, "StateWaiting": {"properties": {"message": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Message"}, "reason": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Reason"}}, "type": "object", "title": "StateWaiting"}, "ValidationError": {"properties": {"loc": {"items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, "type": "array", "title": "Location"}, "msg": {"type": "string", "title": "Message"}, "type": {"type": "string", "title": "Error Type"}}, "type": "object", "required": ["loc", "msg", "type"], "title": "ValidationError"}, "Volume": {"properties": {"name": {"type": "string", "title": "Name"}, "config_maps": {"anyOf": [{"items": {"$ref": "#/components/schemas/ConfigMap"}, "type": "array"}, {"type": "null"}], "title": "Config Maps"}, "secrets": {"anyOf": [{"items": {"$ref": "#/components/schemas/Secret"}, "type": "array"}, {"type": "null"}], "title": "Secrets"}, "empty_dirs": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "title": "Empty Dirs"}}, "type": "object", "required": ["name"], "title": "Volume"}, "VolumeMount": {"properties": {"name": {"type": "string", "title": "Name"}, "mount_path": {"type": "string", "title": "Mount Path"}, "sub_path": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Sub Path"}, "read_only": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Read Only", "default": false}, "mount_propagation": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Mount Propagation"}}, "type": "object", "required": ["name", "mount_path"], "title": "VolumeMount"}}}} \ No newline at end of file diff --git a/docs/openapi/plugin-openapi.json b/docs/openapi/plugin-openapi.json new file mode 100644 index 00000000..825ec318 --- /dev/null +++ b/docs/openapi/plugin-openapi.json @@ -0,0 +1,1422 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "interLink Plugin spec", + "description": "openapi spec for interLink apis <-> provider plugin communication", + "version": "v0.4.0" + }, + "paths": { + "/create": { + "post": { + "summary": "Create Pod", + "operationId": "create_pod_create_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pod" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateStruct" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/delete": { + "post": { + "summary": "Delete Pod", + "operationId": "delete_pod_delete_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PodRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "string", + "title": "Response Delete Pod Delete Post" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/status": { + "get": { + "summary": "Status Pod", + "operationId": "status_pod_status_get", + "requestBody": { + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/PodRequest" + }, + "type": "array", + "title": "Pods" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/PodStatus" + }, + "type": "array", + "title": "Response Status Pod Status Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/getLogs": { + "get": { + "summary": "Get Logs", + "operationId": "get_logs_getLogs_get", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LogRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "ConfigMap": { + "properties": { + "metadata": { + "$ref": "#/components/schemas/Metadata" + }, + "data": { + "anyOf": [ + { + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Data" + }, + "binary_data": { + "anyOf": [ + { + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Binary Data" + }, + "type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Type" + }, + "immutable": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Immutable" + } + }, + "type": "object", + "required": [ + "metadata", + "data" + ], + "title": "ConfigMap" + }, + "ConfigMapKeySelector": { + "properties": { + "key": { + "type": "string", + "title": "Key" + }, + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "optional": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Optional" + } + }, + "type": "object", + "required": [ + "key" + ], + "title": "ConfigMapKeySelector" + }, + "ConfigMapVolumeSource": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "items": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/KeyToPath" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Items", + "default": [] + }, + "optional": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Optional" + }, + "default_mode": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Default Mode" + } + }, + "type": "object", + "required": [ + "name" + ], + "title": "ConfigMapVolumeSource" + }, + "Container": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "image": { + "type": "string", + "title": "Image" + }, + "tag": { + "type": "string", + "title": "Tag", + "default": "latest" + }, + "command": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Command" + }, + "args": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Args", + "default": [] + }, + "resources": { + "anyOf": [ + { + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Resources", + "default": {} + }, + "volume_mounts": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/VolumeMount" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Volume Mounts", + "default": [] + }, + "env": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/EnvVar" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Env" + }, + "security_context": { + "anyOf": [ + { + "$ref": "#/components/schemas/SecurityContext" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "required": [ + "name", + "image", + "command" + ], + "title": "Container" + }, + "ContainerStates": { + "properties": { + "terminated": { + "anyOf": [ + { + "$ref": "#/components/schemas/StateTerminated" + }, + { + "type": "null" + } + ] + }, + "running": { + "anyOf": [ + { + "$ref": "#/components/schemas/StateRunning" + }, + { + "type": "null" + } + ] + }, + "waiting": { + "anyOf": [ + { + "$ref": "#/components/schemas/StateWaiting" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "title": "ContainerStates" + }, + "ContainerStatus": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "state": { + "$ref": "#/components/schemas/ContainerStates" + } + }, + "type": "object", + "required": [ + "name", + "state" + ], + "title": "ContainerStatus" + }, + "CreateStruct": { + "properties": { + "pod_uid": { + "type": "string", + "title": "Pod Uid" + }, + "pod_jid": { + "type": "string", + "title": "Pod Jid" + } + }, + "type": "object", + "required": [ + "pod_uid", + "pod_jid" + ], + "title": "CreateStruct" + }, + "EnvVar": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Value" + }, + "value_from": { + "anyOf": [ + { + "$ref": "#/components/schemas/EnvVarSource" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "required": [ + "name" + ], + "title": "EnvVar" + }, + "EnvVarSource": { + "properties": { + "config_map_key_ref": { + "anyOf": [ + { + "$ref": "#/components/schemas/ConfigMapKeySelector" + }, + { + "type": "null" + } + ] + }, + "secret_key_ref": { + "anyOf": [ + { + "$ref": "#/components/schemas/SecretKeySelector" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "title": "EnvVarSource" + }, + "HTTPValidationError": { + "properties": { + "detail": { + "items": { + "$ref": "#/components/schemas/ValidationError" + }, + "type": "array", + "title": "Detail" + } + }, + "type": "object", + "title": "HTTPValidationError" + }, + "KeyToPath": { + "properties": { + "key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Key" + }, + "path": { + "type": "string", + "title": "Path" + }, + "mode": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Mode" + } + }, + "type": "object", + "required": [ + "key", + "path" + ], + "title": "KeyToPath" + }, + "LogOpts": { + "properties": { + "tail": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Tail" + }, + "limit_bytes": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Limit Bytes" + }, + "timestamps": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Timestamps" + }, + "previous": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Previous" + }, + "since_seconds": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Since Seconds" + }, + "since_time": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Since Time" + } + }, + "type": "object", + "title": "LogOpts" + }, + "LogRequest": { + "properties": { + "namespace": { + "type": "string", + "title": "Namespace" + }, + "pod_uid": { + "type": "string", + "title": "Pod Uid" + }, + "pod_name": { + "type": "string", + "title": "Pod Name" + }, + "container_name": { + "type": "string", + "title": "Container Name" + }, + "opts": { + "$ref": "#/components/schemas/LogOpts" + } + }, + "type": "object", + "required": [ + "namespace", + "pod_uid", + "pod_name", + "container_name", + "opts" + ], + "title": "LogRequest" + }, + "Metadata": { + "properties": { + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "namespace": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Namespace" + }, + "uid": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Uid" + }, + "annotations": { + "anyOf": [ + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Annotations", + "default": {} + }, + "labels": { + "anyOf": [ + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Labels", + "default": {} + }, + "generate_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Generate Name" + } + }, + "type": "object", + "title": "Metadata" + }, + "Pod": { + "properties": { + "pod": { + "$ref": "#/components/schemas/PodRequest" + }, + "container": { + "items": { + "$ref": "#/components/schemas/Volume" + }, + "type": "array", + "title": "Container" + } + }, + "type": "object", + "required": [ + "pod", + "container" + ], + "title": "Pod" + }, + "PodRequest": { + "properties": { + "metadata": { + "$ref": "#/components/schemas/Metadata" + }, + "spec": { + "$ref": "#/components/schemas/PodSpec" + } + }, + "type": "object", + "required": [ + "metadata", + "spec" + ], + "title": "PodRequest" + }, + "PodSpec": { + "properties": { + "containers": { + "items": { + "$ref": "#/components/schemas/Container" + }, + "type": "array", + "title": "Containers" + }, + "init_containers": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/Container" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Init Containers" + }, + "volumes": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/PodVolume" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Volumes" + }, + "preemption_policy": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Preemption Policy" + }, + "priority_class_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Priority Class Name" + }, + "priority": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Priority" + }, + "restart_policy": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Restart Policy" + }, + "termination_grace_period_seconds": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Termination Grace Period Seconds" + } + }, + "type": "object", + "required": [ + "containers" + ], + "title": "PodSpec" + }, + "PodStatus": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "uid": { + "type": "string", + "title": "Uid" + }, + "namespace": { + "type": "string", + "title": "Namespace" + }, + "containers": { + "items": { + "$ref": "#/components/schemas/ContainerStatus" + }, + "type": "array", + "title": "Containers" + } + }, + "type": "object", + "required": [ + "name", + "uid", + "namespace", + "containers" + ], + "title": "PodStatus" + }, + "PodVolume": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "empty_dir": { + "anyOf": [ + { + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Empty Dir" + }, + "secret": { + "anyOf": [ + { + "$ref": "#/components/schemas/SecretVolumeSource" + }, + { + "type": "null" + } + ] + }, + "config_map": { + "anyOf": [ + { + "$ref": "#/components/schemas/ConfigMapVolumeSource" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "required": [ + "name" + ], + "title": "PodVolume" + }, + "Secret": { + "properties": { + "metadata": { + "$ref": "#/components/schemas/Metadata" + }, + "data": { + "anyOf": [ + { + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Data" + }, + "string_data": { + "anyOf": [ + { + "type": "object" + }, + { + "type": "null" + } + ], + "title": "String Data" + }, + "type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Type" + }, + "immutable": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Immutable" + } + }, + "type": "object", + "required": [ + "metadata" + ], + "title": "Secret" + }, + "SecretKeySelector": { + "properties": { + "key": { + "type": "string", + "title": "Key" + }, + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "optional": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Optional" + } + }, + "type": "object", + "required": [ + "key" + ], + "title": "SecretKeySelector" + }, + "SecretVolumeSource": { + "properties": { + "secret_name": { + "type": "string", + "title": "Secret Name" + }, + "items": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/KeyToPath" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Items", + "default": [] + }, + "optional": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Optional" + }, + "default_mode": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Default Mode" + } + }, + "type": "object", + "required": [ + "secret_name" + ], + "title": "SecretVolumeSource" + }, + "SecurityContext": { + "properties": { + "allow_privilege_escalation": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Allow Privilege Escalation" + }, + "privileged": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Privileged" + }, + "proc_mount": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Proc Mount" + }, + "read_only_file_system": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Read Only File System" + }, + "run_as_group": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Run As Group" + }, + "run_as_non_root": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Run As Non Root" + }, + "run_as_user": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Run As User" + } + }, + "type": "object", + "title": "SecurityContext" + }, + "StateRunning": { + "properties": { + "started_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Started At" + } + }, + "type": "object", + "title": "StateRunning" + }, + "StateTerminated": { + "properties": { + "exit_code": { + "type": "integer", + "title": "Exit Code" + }, + "reason": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Reason" + } + }, + "type": "object", + "required": [ + "exit_code" + ], + "title": "StateTerminated" + }, + "StateWaiting": { + "properties": { + "message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Message" + }, + "reason": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Reason" + } + }, + "type": "object", + "title": "StateWaiting" + }, + "ValidationError": { + "properties": { + "loc": { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "type": "array", + "title": "Location" + }, + "msg": { + "type": "string", + "title": "Message" + }, + "type": { + "type": "string", + "title": "Error Type" + } + }, + "type": "object", + "required": [ + "loc", + "msg", + "type" + ], + "title": "ValidationError" + }, + "Volume": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "config_maps": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/ConfigMap" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Config Maps" + }, + "secrets": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/Secret" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Secrets" + }, + "empty_dirs": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Empty Dirs" + } + }, + "type": "object", + "required": [ + "name" + ], + "title": "Volume" + }, + "VolumeMount": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "mount_path": { + "type": "string", + "title": "Mount Path" + }, + "sub_path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Sub Path" + }, + "read_only": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Read Only", + "default": false + }, + "mount_propagation": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Mount Propagation" + } + }, + "type": "object", + "required": [ + "name", + "mount_path" + ], + "title": "VolumeMount" + } + } + } +} diff --git a/docs/package-lock.json b/docs/package-lock.json index c4d2e2cc..944e1cf8 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -15,9 +15,11 @@ "prism-react-renderer": "^2.3.0", "raw-loader": "^4.0.2", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "redocusaurus": "^2.0.2" }, "devDependencies": { + "@docusaurus/eslint-plugin": "^3.5.2", "@docusaurus/module-type-aliases": "3.0.1", "@docusaurus/tsconfig": "3.0.1", "@docusaurus/types": "3.0.1", @@ -2112,6 +2114,28 @@ "node": ">=6.9.0" } }, + "node_modules/@cfaester/enzyme-adapter-react-18": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@cfaester/enzyme-adapter-react-18/-/enzyme-adapter-react-18-0.8.0.tgz", + "integrity": "sha512-3Z3ThTUouHwz8oIyhTYQljEMNRFtlVyc3VOOHCbxs47U6cnXs8K9ygi/c1tv49s7MBlTXeIcuN+Ttd9aPtILFQ==", + "dependencies": { + "enzyme-shallow-equal": "^1.0.0", + "function.prototype.name": "^1.1.6", + "has": "^1.0.4", + "react-is": "^18.2.0", + "react-shallow-renderer": "^16.15.0" + }, + "peerDependencies": { + "enzyme": "^3.11.0", + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@cfaester/enzyme-adapter-react-18/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -2265,6 +2289,22 @@ "node": ">=18.0" } }, + "node_modules/@docusaurus/eslint-plugin": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/eslint-plugin/-/eslint-plugin-3.5.2.tgz", + "integrity": "sha512-9zBtXQwRgj2unY+peS5HIISvG7kDQDoWl8dZ+sN41B2qIctNUWpBFkFAPHZSPy2cvEDQwWshNpPYDjp+sv+CVA==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "^5.62.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "eslint": ">=6" + } + }, "node_modules/@docusaurus/logger": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.0.1.tgz", @@ -2759,6 +2799,141 @@ "node": ">=18.0" } }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "devOptional": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "devOptional": true, + "peer": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "devOptional": true, + "peer": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "devOptional": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "devOptional": true, + "peer": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "devOptional": true, + "peer": true + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "devOptional": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "devOptional": true, + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@exodus/schemasafe": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.3.0.tgz", + "integrity": "sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==" + }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -2772,6 +2947,44 @@ "@hapi/hoek": "^9.0.0" } }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "devOptional": true, + "peer": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "devOptional": true, + "peer": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "devOptional": true, + "peer": true + }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -2980,6 +3193,72 @@ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.24.tgz", "integrity": "sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==" }, + "node_modules/@redocly/ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js-replace": "^1.0.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@redocly/config": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.6.3.tgz", + "integrity": "sha512-hGWJgCsXRw0Ow4rplqRlUQifZvoSwZipkYnt11e3SeH1Eb23VUIDBcRuaQOUqy1wn0eevXkU2GzzQ8fbKdQ7Mg==" + }, + "node_modules/@redocly/openapi-core": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.16.0.tgz", + "integrity": "sha512-z06h+svyqbUcdAaePq8LPSwTPlm6Ig7j2VlL8skPBYnJvyaQ2IN7x/JkOvRL4ta+wcOCBdAex5JWnZbKaNktJg==", + "dependencies": { + "@redocly/ajv": "^8.11.0", + "@redocly/config": "^0.6.0", + "colorette": "^1.2.0", + "https-proxy-agent": "^7.0.4", + "js-levenshtein": "^1.1.6", + "js-yaml": "^4.1.0", + "lodash.isequal": "^4.5.0", + "minimatch": "^5.0.1", + "node-fetch": "^2.6.1", + "pluralize": "^8.0.0", + "yaml-ast-parser": "0.0.43" + }, + "engines": { + "node": ">=14.19.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@redocly/openapi-core/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@redocly/openapi-core/node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" + }, + "node_modules/@redocly/openapi-core/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@sideway/address": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", @@ -3590,6 +3869,12 @@ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, "node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", @@ -3625,6 +3910,11 @@ "@types/node": "*" } }, + "node_modules/@types/stylis": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", + "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==" + }, "node_modules/@types/unist": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", @@ -3651,6 +3941,106 @@ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", @@ -3871,6 +4261,17 @@ "node": ">= 10.0.0" } }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -4038,6 +4439,21 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", @@ -4051,6 +4467,65 @@ "node": ">=8" } }, + "node_modules/array.prototype.filter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.4.tgz", + "integrity": "sha512-r+mCJ7zXgXElgR4IRC+fkvNCeoaavWBs6EdCso5Tbcf+iEMKzBU/His60lt34WEZ9vlb8wDkZvQGcVI5GwkfoQ==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-array-method-boxes-properly": "^1.0.0", + "es-object-atoms": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/astring": { "version": "1.8.6", "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz", @@ -4103,6 +4578,20 @@ "postcss": "^8.1.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/babel-loader": { "version": "9.1.3", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", @@ -4388,18 +4877,28 @@ } }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==" + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -4428,6 +4927,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -4440,9 +4947,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001571", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001571.tgz", - "integrity": "sha512-tYq/6MoXhdezDLFZuCO/TKboTzuQ/xR5cFdgXPfDtM7/kchBO3b4VWghE/OAi/DV7tTdhmLjZiZBZi1fA/GheQ==", + "version": "1.0.30001667", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz", + "integrity": "sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==", "funding": [ { "type": "opencollective", @@ -4610,6 +5117,11 @@ "node": ">=8" } }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, "node_modules/clean-css": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", @@ -4680,6 +5192,53 @@ "node": ">=8" } }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -5074,6 +5633,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "engines": { + "node": ">=4" + } + }, "node_modules/css-declaration-sorter": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", @@ -5176,6 +5743,16 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, "node_modules/css-tree": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", @@ -5326,6 +5903,54 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/debounce": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", @@ -5347,6 +5972,11 @@ } } }, + "node_modules/decko": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decko/-/decko-1.2.0.tgz", + "integrity": "sha512-m8FnyHXV1QX+S1cl+KPFDIl6NMkxtKsy6+U/aYyjrOqWMuwAwYWu7ePqrsUHtDR5Y8Yk2pi/KIDSgF+vT4cPOQ==" + }, "node_modules/decode-named-character-reference": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", @@ -5392,6 +6022,13 @@ "node": ">=4.0.0" } }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "devOptional": true, + "peer": true + }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -5420,16 +6057,19 @@ } }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-lazy-prop": { @@ -5572,6 +6212,12 @@ "node": ">=8" } }, + "node_modules/discontinuous-range": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", + "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==", + "peer": true + }, "node_modules/dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -5588,6 +6234,91 @@ "node": ">=6" } }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "devOptional": true, + "peer": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/docusaurus-plugin-redoc": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/docusaurus-plugin-redoc/-/docusaurus-plugin-redoc-2.1.1.tgz", + "integrity": "sha512-gf9HbFAKPZu17rbx+3C6vIpfMMTuvUFG8rRKeuHro1B5wUutBSjE5/VjB1owVGjIJQ74OgVKJvgczqUjhcQcjQ==", + "dependencies": { + "@redocly/openapi-core": "1.16.0", + "redoc": "2.1.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@docusaurus/utils": "^3.0.0" + } + }, + "node_modules/docusaurus-theme-redoc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/docusaurus-theme-redoc/-/docusaurus-theme-redoc-2.1.2.tgz", + "integrity": "sha512-UB6g+YDPjVgFMhJnIUaW/mNl9vsCMbrMQutgdoG5DaI+HpxO2sV+zT2z23Wg6ngi2GM+oxEhYf5Qc1dPwKZqBQ==", + "dependencies": { + "@redocly/openapi-core": "1.16.0", + "clsx": "^1.2.1", + "lodash": "^4.17.21", + "mobx": "^6.12.4", + "postcss": "^8.4.45", + "postcss-prefix-selector": "^1.16.1", + "redoc": "2.1.5", + "styled-components": "^6.1.11" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@docusaurus/theme-common": "^3.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/docusaurus-theme-redoc/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/docusaurus-theme-redoc/node_modules/postcss": { + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -5634,6 +6365,11 @@ "url": "https://github.com/fb55/domhandler?sponsor=1" } }, + "node_modules/dompurify": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.7.tgz", + "integrity": "sha512-VaTstWtsneJY8xzy7DekmYWEOZcmzIe3Qb3zPd4STve1OBTa+e+WmS1ITQec1fZYXI3HCsOZZiSMpG6oxoWMWQ==" + }, "node_modules/domutils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", @@ -5756,6 +6492,51 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/enzyme": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.11.0.tgz", + "integrity": "sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==", + "peer": true, + "dependencies": { + "array.prototype.flat": "^1.2.3", + "cheerio": "^1.0.0-rc.3", + "enzyme-shallow-equal": "^1.0.1", + "function.prototype.name": "^1.1.2", + "has": "^1.0.3", + "html-element-map": "^1.2.0", + "is-boolean-object": "^1.0.1", + "is-callable": "^1.1.5", + "is-number-object": "^1.0.4", + "is-regex": "^1.0.5", + "is-string": "^1.0.5", + "is-subset": "^0.1.1", + "lodash.escape": "^4.0.1", + "lodash.isequal": "^4.5.0", + "object-inspect": "^1.7.0", + "object-is": "^1.0.2", + "object.assign": "^4.1.0", + "object.entries": "^1.1.1", + "object.values": "^1.1.1", + "raf": "^3.4.1", + "rst-selector-parser": "^2.2.3", + "string.prototype.trim": "^1.2.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/enzyme-shallow-equal": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.7.tgz", + "integrity": "sha512-/um0GFqUXnpM9SvKtje+9Tjoz3f1fpBC3eXRFrNs8kpYn69JljciYP7KZTqM/YQbUY9KUjvKB4jo/q+L6WGGvg==", + "dependencies": { + "hasown": "^2.0.0", + "object-is": "^1.1.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -5764,11 +6545,149 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "peer": true + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "peer": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==" + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -5804,6 +6723,62 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "devOptional": true, + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -5816,6 +6791,217 @@ "node": ">=8.0.0" } }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "devOptional": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "devOptional": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "devOptional": true, + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "devOptional": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "devOptional": true, + "peer": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "devOptional": true, + "peer": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "devOptional": true, + "peer": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "devOptional": true, + "peer": true + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "devOptional": true, + "peer": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "devOptional": true, + "peer": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "devOptional": true, + "peer": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "devOptional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "devOptional": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "devOptional": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "devOptional": true, + "peer": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -5828,6 +7014,29 @@ "node": ">=4" } }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "devOptional": true, + "peer": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "devOptional": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -6139,6 +7348,18 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "devOptional": true, + "peer": true + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, "node_modules/fast-url-parser": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", @@ -6189,6 +7410,19 @@ "node": ">=0.4.0" } }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "devOptional": true, + "peer": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/file-loader": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", @@ -6340,6 +7574,28 @@ "flat": "cli.js" } }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "devOptional": true, + "peer": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "devOptional": true, + "peer": true + }, "node_modules/follow-redirects": { "version": "1.15.3", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", @@ -6359,6 +7615,19 @@ } } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreach": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", + "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==" + }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", @@ -6567,6 +7836,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -6575,16 +7869,28 @@ "node": ">=6.9.0" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6605,6 +7911,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/github-slugger": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", @@ -6710,6 +8032,21 @@ "node": ">=4" } }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -6780,6 +8117,13 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "devOptional": true, + "peer": true + }, "node_modules/gray-matter": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", @@ -6833,6 +8177,22 @@ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" }, + "node_modules/has": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -6842,20 +8202,20 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "engines": { "node": ">= 0.4" }, @@ -6874,6 +8234,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-yarn": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", @@ -6886,9 +8260,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { "function-bind": "^1.1.2" }, @@ -7135,6 +8509,19 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/html-element-map": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.3.1.tgz", + "integrity": "sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==", + "peer": true, + "dependencies": { + "array.prototype.filter": "^1.0.0", + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/html-entities": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", @@ -7357,6 +8744,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/http2-client": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz", + "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==" + }, "node_modules/http2-wrapper": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", @@ -7369,6 +8761,18 @@ "node": ">=10.19.0" } }, + "node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -7501,6 +8905,19 @@ "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", @@ -7547,11 +8964,37 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -7563,6 +9006,32 @@ "node": ">=8" } }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-ci": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", @@ -7585,6 +9054,34 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-decimal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", @@ -7667,6 +9164,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-npm": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", @@ -7686,6 +9194,20 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", @@ -7737,6 +9259,21 @@ "@types/estree": "*" } }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", @@ -7753,6 +9290,20 @@ "node": ">=6" } }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -7764,11 +9315,70 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==", + "peer": true + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -7870,6 +9480,14 @@ "@sideway/pinpoint": "^2.0.0" } }, + "node_modules/js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -7907,11 +9525,26 @@ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, + "node_modules/json-pointer": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", + "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", + "dependencies": { + "foreach": "^2.0.4" + } + }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "devOptional": true, + "peer": true + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -7989,6 +9622,20 @@ "node": ">=6" } }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "devOptional": true, + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/lilconfig": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", @@ -8047,11 +9694,35 @@ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, + "node_modules/lodash.escape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", + "integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==", + "peer": true + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "peer": true + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "devOptional": true, + "peer": true + }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -8104,6 +9775,16 @@ "yallist": "^3.0.2" } }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==" + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==" + }, "node_modules/markdown-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", @@ -8124,6 +9805,17 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, "node_modules/mdast-util-directive": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz", @@ -10325,6 +12017,69 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/mobx": { + "version": "6.13.3", + "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.13.3.tgz", + "integrity": "sha512-YtAS+ZMbdpbHYUU4ESht3na8KiX11KuMT1yOiKtbKlQ0GZkHDYPKyEw/Tdp7h7aHyLrTWj2TBaSNJ6bCr638iQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + } + }, + "node_modules/mobx-react": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-9.1.1.tgz", + "integrity": "sha512-gVV7AdSrAAxqXOJ2bAbGa5TkPqvITSzaPiiEkzpW4rRsMhSec7C2NBCJYILADHKp2tzOAIETGRsIY0UaCV5aEw==", + "dependencies": { + "mobx-react-lite": "^4.0.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + }, + "peerDependencies": { + "mobx": "^6.9.0", + "react": "^16.8.0 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/mobx-react-lite": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-4.0.7.tgz", + "integrity": "sha512-RjwdseshK9Mg8On5tyJZHtGD+J78ZnCnRaxeQDSiciKVQDUbfZcXhmld0VMxAwvcTnPEHZySGGewm467Fcpreg==", + "dependencies": { + "use-sync-external-store": "^1.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + }, + "peerDependencies": { + "mobx": "^6.9.0", + "react": "^16.8.0 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/moo": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", + "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", + "peer": true + }, "node_modules/mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -10367,6 +12122,41 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "devOptional": true, + "peer": true + }, + "node_modules/nearley": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", + "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", + "peer": true, + "dependencies": { + "commander": "^2.19.0", + "moo": "^0.5.0", + "railroad-diagrams": "^1.0.0", + "randexp": "0.4.6" + }, + "bin": { + "nearley-railroad": "bin/nearley-railroad.js", + "nearley-test": "bin/nearley-test.js", + "nearley-unparse": "bin/nearley-unparse.js", + "nearleyc": "bin/nearleyc.js" + }, + "funding": { + "type": "individual", + "url": "https://nearley.js.org/#give-to-nearley" + } + }, + "node_modules/nearley/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "peer": true + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -10403,6 +12193,36 @@ "node": ">=18" } }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch-h2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz", + "integrity": "sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==", + "dependencies": { + "http2-client": "^1.2.5" + }, + "engines": { + "node": "4.x || >=6.0.0" + } + }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -10411,6 +12231,14 @@ "node": ">= 6.13.0" } }, + "node_modules/node-readfiles": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", + "integrity": "sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==", + "dependencies": { + "es6-promise": "^3.2.1" + } + }, "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", @@ -10470,6 +12298,71 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/oas-kit-common": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz", + "integrity": "sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==", + "dependencies": { + "fast-safe-stringify": "^2.0.7" + } + }, + "node_modules/oas-linter": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz", + "integrity": "sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==", + "dependencies": { + "@exodus/schemasafe": "^1.0.0-rc.2", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-resolver": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz", + "integrity": "sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==", + "dependencies": { + "node-fetch-h2": "^2.3.0", + "oas-kit-common": "^1.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "resolve": "resolve.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-schema-walker": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz", + "integrity": "sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==", + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-validator": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz", + "integrity": "sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==", + "dependencies": { + "call-me-maybe": "^1.0.1", + "oas-kit-common": "^1.0.8", + "oas-linter": "^3.2.2", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "reftools": "^1.1.9", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -10486,6 +12379,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -10511,6 +12419,37 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -10573,6 +12512,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/openapi-sampler": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.5.1.tgz", + "integrity": "sha512-tIWIrZUKNAsbqf3bd9U1oH6JEXo8LNYuDlXw26By67EygpjT+ArFnsxxyTMjFWRfbqo5ozkvgSQDK69Gd8CddA==", + "dependencies": { + "@types/json-schema": "^7.0.7", + "json-pointer": "0.6.2" + } + }, "node_modules/opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", @@ -10581,6 +12529,24 @@ "opener": "bin/opener-bin.js" } }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "devOptional": true, + "peer": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/p-cancelable": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", @@ -10774,6 +12740,11 @@ "tslib": "^2.0.3" } }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + }, "node_modules/path-exists": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", @@ -10824,6 +12795,17 @@ "node": ">=8" } }, + "node_modules/perfect-scrollbar": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz", + "integrity": "sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g==" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "peer": true + }, "node_modules/periscopic": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", @@ -10835,9 +12817,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -10931,10 +12913,37 @@ "node": ">=4" } }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/polished": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", + "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==", + "dependencies": { + "@babel/runtime": "^7.17.8" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { - "version": "8.4.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", - "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "funding": [ { "type": "opencollective", @@ -10952,7 +12961,7 @@ "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" @@ -11408,6 +13417,14 @@ "postcss": "^8.2.15" } }, + "node_modules/postcss-prefix-selector": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.16.1.tgz", + "integrity": "sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==", + "peerDependencies": { + "postcss": ">4 <9" + } + }, "node_modules/postcss-reduce-idents": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz", @@ -11522,6 +13539,16 @@ "postcss": "^8.2.15" } }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "devOptional": true, + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/pretty-error": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", @@ -11691,6 +13718,34 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "peer": true, + "dependencies": { + "performance-now": "^2.1.0" + } + }, + "node_modules/railroad-diagrams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", + "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==", + "peer": true + }, + "node_modules/randexp": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", + "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", + "peer": true, + "dependencies": { + "discontinuous-range": "1.0.0", + "ret": "~0.1.10" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -12074,6 +14129,30 @@ "react": ">=15" } }, + "node_modules/react-shallow-renderer": { + "version": "16.15.0", + "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz", + "integrity": "sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==", + "dependencies": { + "object-assign": "^4.1.1", + "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-tabs": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-6.0.2.tgz", + "integrity": "sha512-aQXTKolnM28k3KguGDBSAbJvcowOQr23A+CUJdzJtOSDOtTwzEaJA+1U4KwhNL9+Obe+jFS7geuvA7ICQPXOnQ==", + "dependencies": { + "clsx": "^2.0.0", + "prop-types": "^15.5.0" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -12125,6 +14204,75 @@ "node": ">=6.0.0" } }, + "node_modules/redoc": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/redoc/-/redoc-2.1.5.tgz", + "integrity": "sha512-POSbVg+7WLf+/5/c6GWLxL7+9t2D+1WlZdLN0a6qaCQc+ih3XYzteRBkXEN5kjrYrRNjdspfxTZkDLN5WV3Tzg==", + "dependencies": { + "@cfaester/enzyme-adapter-react-18": "^0.8.0", + "@redocly/openapi-core": "^1.4.0", + "classnames": "^2.3.2", + "decko": "^1.2.0", + "dompurify": "^3.0.6", + "eventemitter3": "^5.0.1", + "json-pointer": "^0.6.2", + "lunr": "^2.3.9", + "mark.js": "^8.11.1", + "marked": "^4.3.0", + "mobx-react": "^9.1.1", + "openapi-sampler": "^1.5.0", + "path-browserify": "^1.0.1", + "perfect-scrollbar": "^1.5.5", + "polished": "^4.2.2", + "prismjs": "^1.29.0", + "prop-types": "^15.8.1", + "react-tabs": "^6.0.2", + "slugify": "~1.4.7", + "stickyfill": "^1.1.1", + "swagger2openapi": "^7.0.8", + "url-template": "^2.0.8" + }, + "engines": { + "node": ">=6.9", + "npm": ">=3.0.0" + }, + "peerDependencies": { + "core-js": "^3.1.4", + "mobx": "^6.0.4", + "react": "^16.8.4 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.4 || ^17.0.0 || ^18.0.0", + "styled-components": "^4.1.1 || ^5.1.1 || ^6.0.5" + } + }, + "node_modules/redoc/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "node_modules/redocusaurus": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/redocusaurus/-/redocusaurus-2.1.2.tgz", + "integrity": "sha512-PqMXxmjAyQ78zdI9W5lUI21a9N9bXDQYj5NuTcjG5xmyn63+KfqF+ugmqh7FbY3Fr9Sud14X6ZDoRGdwVtBDew==", + "dependencies": { + "docusaurus-plugin-redoc": "2.1.1", + "docusaurus-theme-redoc": "2.1.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@docusaurus/theme-common": "^3.0.0", + "@docusaurus/utils": "^3.0.0" + } + }, + "node_modules/reftools": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz", + "integrity": "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==", + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -12154,6 +14302,23 @@ "@babel/runtime": "^7.8.4" } }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regexpu-core": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", @@ -12449,6 +14614,14 @@ "entities": "^2.0.0" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -12518,6 +14691,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "peer": true, + "engines": { + "node": ">=0.12" + } + }, "node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", @@ -12549,6 +14731,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rst-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", + "integrity": "sha512-nDG1rZeP6oFTLN6yNDV/uiAvs1+FS/KlrEwh7+y7dpuApDBy6bI2HTBcc0/V8lv9OTqfyD34eF7au2pm8aBbhA==", + "peer": true, + "dependencies": { + "lodash.flattendeep": "^4.4.0", + "nearley": "^2.7.10" + } + }, "node_modules/rtl-detect": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.1.2.tgz", @@ -12593,6 +14785,28 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -12612,6 +14826,22 @@ } ] }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -12889,14 +15119,30 @@ } }, "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -12966,6 +15212,54 @@ "node": ">=4" } }, + "node_modules/should": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", + "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", + "dependencies": { + "should-equal": "^2.0.0", + "should-format": "^3.0.3", + "should-type": "^1.4.0", + "should-type-adaptors": "^1.0.1", + "should-util": "^1.0.0" + } + }, + "node_modules/should-equal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", + "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", + "dependencies": { + "should-type": "^1.4.0" + } + }, + "node_modules/should-format": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", + "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", + "dependencies": { + "should-type": "^1.3.0", + "should-type-adaptors": "^1.0.1" + } + }, + "node_modules/should-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", + "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==" + }, + "node_modules/should-type-adaptors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", + "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", + "dependencies": { + "should-type": "^1.3.0", + "should-util": "^1.0.0" + } + }, + "node_modules/should-util": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", + "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==" + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -13044,6 +15338,14 @@ "node": ">=8" } }, + "node_modules/slugify": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.4.7.tgz", + "integrity": "sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg==", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -13071,9 +15373,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -13167,6 +15469,11 @@ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==" }, + "node_modules/stickyfill": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stickyfill/-/stickyfill-1.1.1.tgz", + "integrity": "sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA==" + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -13216,6 +15523,52 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/stringify-entities": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", @@ -13288,6 +15641,33 @@ "inline-style-parser": "0.1.1" } }, + "node_modules/styled-components": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.13.tgz", + "integrity": "sha512-M0+N2xSnAtwcVAQeFEsGWFFxXDftHUD7XrKla06QbpUMmbmtFBMMTcKWvFXtWxuD5qQkB8iU5gk6QASlx2ZRMw==", + "dependencies": { + "@emotion/is-prop-valid": "1.2.2", + "@emotion/unitless": "0.8.1", + "@types/stylis": "4.2.5", + "css-to-react-native": "3.2.0", + "csstype": "3.1.3", + "postcss": "8.4.38", + "shallowequal": "1.1.0", + "stylis": "4.3.2", + "tslib": "2.6.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0" + } + }, "node_modules/stylehacks": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", @@ -13303,6 +15683,11 @@ "postcss": "^8.2.15" } }, + "node_modules/stylis": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", + "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==" + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -13421,6 +15806,32 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/swagger2openapi": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz", + "integrity": "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==", + "dependencies": { + "call-me-maybe": "^1.0.1", + "node-fetch": "^2.6.1", + "node-fetch-h2": "^2.3.0", + "node-readfiles": "^0.2.0", + "oas-kit-common": "^1.0.8", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "oas-validator": "^5.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "boast": "boast.js", + "oas-validate": "oas-validate.js", + "swagger2openapi": "swagger2openapi.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -13611,6 +16022,11 @@ "node": ">=6" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", @@ -13634,6 +16050,40 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "devOptional": true, + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", @@ -13676,6 +16126,75 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -13696,6 +16215,20 @@ "node": ">=14.17" } }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -13988,6 +16521,11 @@ "punycode": "^2.1.0" } }, + "node_modules/uri-js-replace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uri-js-replace/-/uri-js-replace-1.0.1.tgz", + "integrity": "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==" + }, "node_modules/uri-js/node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -14086,6 +16624,19 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==" + }, + "node_modules/use-sync-external-store": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -14202,6 +16753,11 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, "node_modules/webpack": { "version": "5.89.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", @@ -14532,6 +17088,15 @@ "node": ">=0.8.0" } }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -14546,6 +17111,39 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/widest-line": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", @@ -14565,6 +17163,16 @@ "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "devOptional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -14675,6 +17283,14 @@ "xml-js": "bin/cli.js" } }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -14688,6 +17304,54 @@ "node": ">= 6" } }, + "node_modules/yaml-ast-parser": { + "version": "0.0.43", + "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", + "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yocto-queue": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", diff --git a/docs/package.json b/docs/package.json index d755a9e6..dbc365e1 100644 --- a/docs/package.json +++ b/docs/package.json @@ -26,6 +26,7 @@ "redocusaurus": "^2.0.2" }, "devDependencies": { + "@docusaurus/eslint-plugin": "^3.5.2", "@docusaurus/module-type-aliases": "3.0.1", "@docusaurus/tsconfig": "3.0.1", "@docusaurus/types": "3.0.1", diff --git a/docs/src/components/AdoptersFeatures/index.tsx b/docs/src/components/AdoptersFeatures/index.tsx new file mode 100644 index 00000000..bb0838b5 --- /dev/null +++ b/docs/src/components/AdoptersFeatures/index.tsx @@ -0,0 +1,121 @@ +import clsx from 'clsx'; +import Heading from '@theme/Heading'; +import styles from './styles.module.css'; + +type FeatureItem = { + title: string; + Svg: React.ComponentType>; + description: JSX.Element; +}; + +const FeatureList: FeatureItem[] = [ + { + title: 'INFN', + Svg: require('@site/static/img/INFN_logo_sito.svg').default, + description: ( + <> + + ), + }, + { + title: 'EGI', + Svg: require('@site/static/img/egi-logo.svg').default, + description: ( + <> + + ), + }, + { + title: 'CERN', + Svg: require('@site/static/img/cern-logo.svg').default, + description: ( + <> + + ), + }, + { + title: 'Universitat Politècnica de València', + Svg: require('@site/static/img/logo-upv.svg').default, + description: ( + <> + + ), + }, + { + title: 'CNES', + Svg: require('@site/static/img/logo-cnes.svg').default, + description: ( + <> + + ), + }, + { + title: 'IJS', + Svg: require('@site/static/img/logo-ijs.svg').default, + description: ( + <> + + ), + }, + { + title: 'IZUM', + Svg: require('@site/static/img/logo-izum.svg').default, + description: ( + <> + + ), + }, + { + title: 'JSC', + Svg: require('@site/static/img/logo-jsc.svg').default, + description: ( + <> + + ), + }, + { + title: 'NuNet', + Svg: require('@site/static/img/logo-nunet.svg').default, + description: ( + <> + + ), + }, + { + title: 'HelixML', + Svg: require('@site/static/img/logo-helix.svg').default, + description: ( + <> + + ), + }, +]; + +function Feature({title, Svg, description}: FeatureItem) { + return ( +
+
+ +
+

+
+ ); +} + +export default function AdoptersFeatures(): JSX.Element { + return ( +
+
+ + Evaluators and contributors +

Find out more in the ADOPTERS.md document!

+
+
+ {FeatureList.map((props, idx) => ( + + ))} +
+
+
+ ); +} diff --git a/docs/src/components/AdoptersFeatures/styles.module.css b/docs/src/components/AdoptersFeatures/styles.module.css new file mode 100644 index 00000000..f78a39e8 --- /dev/null +++ b/docs/src/components/AdoptersFeatures/styles.module.css @@ -0,0 +1,13 @@ +.features { + display: flex; + align-items: center; + padding: 2rem 0; + width: 100%; +} + +.featureSvg { + height: 300px; + width: 300px; + align-items: center; + justify-content: center; +} diff --git a/docs/src/components/HomepageVideo/index.tsx b/docs/src/components/HomepageVideo/index.tsx index 62c0caab..a786fe09 100644 --- a/docs/src/components/HomepageVideo/index.tsx +++ b/docs/src/components/HomepageVideo/index.tsx @@ -6,14 +6,18 @@ export default function HomepageVideo(): JSX.Element { return (
-
- + + Video material + + +
+ Interlink overview at Kubecon colocated CloudNative AI Day
-
- +
+ SLURM at a EuroHPC is at your hand with interLink diff --git a/docs/src/components/HomepageVideo/styles.module.css b/docs/src/components/HomepageVideo/styles.module.css index c5569458..f0fe8023 100644 --- a/docs/src/components/HomepageVideo/styles.module.css +++ b/docs/src/components/HomepageVideo/styles.module.css @@ -3,4 +3,4 @@ align-items: center; padding: 2rem 0; width: 100%; - } \ No newline at end of file + } diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css index 1d8db68b..032fb53c 100644 --- a/docs/src/css/custom.css +++ b/docs/src/css/custom.css @@ -6,14 +6,13 @@ /* You can override the default Infima variables here. */ :root { - --ifm-color-primary: #351565; - --ifm-color-primary-dark: #30135b; - --ifm-color-primary-darker: #2d1256; - --ifm-color-primary-darkest: #250f47; - --ifm-color-primary-light: #3a176f; - --ifm-color-primary-lighter: #3d1874; - --ifm-color-primary-lightest: #451b83; - --ifm-code-font-size: 100%; + --ifm-color-primary: #6a479e; + --ifm-color-primary-dark: #5f408e; + --ifm-color-primary-darker: #5a3c86; + --ifm-color-primary-darkest: #4a326f; + --ifm-color-primary-light: #754eae; + --ifm-color-primary-lighter: #7b55b3; + --ifm-color-primary-lightest: #8d6dbd; --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); } diff --git a/docs/src/pages/index.tsx b/docs/src/pages/index.tsx index c0525bc9..28528097 100644 --- a/docs/src/pages/index.tsx +++ b/docs/src/pages/index.tsx @@ -10,6 +10,7 @@ import ThemedImage from '@theme/ThemedImage'; import useBaseUrl from '@docusaurus/useBaseUrl'; import styles from './index.module.css'; +import AdoptersFeatures from '../components/AdoptersFeatures'; function HomepageHeader() { const {siteConfig} = useDocusaurusContext(); @@ -19,11 +20,15 @@ function HomepageHeader() { + + + {siteConfig.tagline}
@@ -32,7 +37,13 @@ function HomepageHeader() { to="/docs/intro"> Try it out! 🚀 +
+ Stars window.location.href='https://github.com/interlink-hq/interLink'}/> +
+ GoReport window.location.href='https://goreportcard.com/report/github.com/interlink-hq/interlink'}/> +
+ Slack window.location.href='https://join.slack.com/t/intertwin/shared_invite/zt-2cs67h9wz-2DFQ6EiSQGS1vlbbbJHctA'}/>
); @@ -46,9 +57,18 @@ export default function Home(): JSX.Element { description="Virtual Kubelets for everyone">
- + +
+ +
- +
+ + CNCF contribution + +

interLink is a Cloud Native Computing Foundation Sandbox project

+ +

The Linux Foundation® (TLF) has registered trademarks and uses trademarks. For a list of TLF trademarks, see Trademark Usage.

) diff --git a/docs/static/img/37a0d3_bd169579737d47318ca1b1735db6e497~mv2.webp b/docs/static/img/37a0d3_bd169579737d47318ca1b1735db6e497~mv2.webp new file mode 100644 index 00000000..40145c64 Binary files /dev/null and b/docs/static/img/37a0d3_bd169579737d47318ca1b1735db6e497~mv2.webp differ diff --git a/docs/static/img/INFN_logo_sito.png b/docs/static/img/INFN_logo_sito.png new file mode 100644 index 00000000..7f95ce46 Binary files /dev/null and b/docs/static/img/INFN_logo_sito.png differ diff --git a/docs/static/img/INFN_logo_sito.svg b/docs/static/img/INFN_logo_sito.svg new file mode 100644 index 00000000..36adf9a2 --- /dev/null +++ b/docs/static/img/INFN_logo_sito.svg @@ -0,0 +1,43 @@ + + + + + + + + + + diff --git a/docs/static/img/cern-logo.png b/docs/static/img/cern-logo.png new file mode 100644 index 00000000..b6320c3c Binary files /dev/null and b/docs/static/img/cern-logo.png differ diff --git a/docs/static/img/cern-logo.svg b/docs/static/img/cern-logo.svg new file mode 100644 index 00000000..8633e877 --- /dev/null +++ b/docs/static/img/cern-logo.svg @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/docs/static/img/cncf-color.svg b/docs/static/img/cncf-color.svg new file mode 100644 index 00000000..6ed42883 --- /dev/null +++ b/docs/static/img/cncf-color.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/static/img/egi-logo.svg b/docs/static/img/egi-logo.svg new file mode 100644 index 00000000..1dbc7b9c --- /dev/null +++ b/docs/static/img/egi-logo.svg @@ -0,0 +1 @@ + Group 79 \ No newline at end of file diff --git a/docs/static/img/interlink_logo-dark.png b/docs/static/img/interlink_logo-dark.png index eceecc94..0b98204b 100644 Binary files a/docs/static/img/interlink_logo-dark.png and b/docs/static/img/interlink_logo-dark.png differ diff --git a/docs/static/img/interlink_logo.png b/docs/static/img/interlink_logo.png index c015c356..0a2d07f8 100644 Binary files a/docs/static/img/interlink_logo.png and b/docs/static/img/interlink_logo.png differ diff --git a/docs/static/img/logo-cnes.svg b/docs/static/img/logo-cnes.svg new file mode 100644 index 00000000..0671b0ce --- /dev/null +++ b/docs/static/img/logo-cnes.svg @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/docs/static/img/logo-helix.png b/docs/static/img/logo-helix.png new file mode 100644 index 00000000..f9078b69 Binary files /dev/null and b/docs/static/img/logo-helix.png differ diff --git a/docs/static/img/logo-helix.svg b/docs/static/img/logo-helix.svg new file mode 100644 index 00000000..c5c6fcca --- /dev/null +++ b/docs/static/img/logo-helix.svg @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/docs/static/img/logo-ijs.svg b/docs/static/img/logo-ijs.svg new file mode 100644 index 00000000..bf111902 --- /dev/null +++ b/docs/static/img/logo-ijs.svg @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/docs/static/img/logo-izum.png b/docs/static/img/logo-izum.png new file mode 100644 index 00000000..2ffcd6b3 Binary files /dev/null and b/docs/static/img/logo-izum.png differ diff --git a/docs/static/img/logo-izum.svg b/docs/static/img/logo-izum.svg new file mode 100644 index 00000000..addd4521 --- /dev/null +++ b/docs/static/img/logo-izum.svg @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/docs/static/img/logo-jsc.svg b/docs/static/img/logo-jsc.svg new file mode 100644 index 00000000..3b765373 --- /dev/null +++ b/docs/static/img/logo-jsc.svg @@ -0,0 +1,14 @@ + + + + + +image/svg+xml + + + + +Logo_FZ_Juellich_RGB_schutzzone_weiss + + + diff --git a/docs/static/img/logo-nunet.svg b/docs/static/img/logo-nunet.svg new file mode 100644 index 00000000..d4057ce9 --- /dev/null +++ b/docs/static/img/logo-nunet.svg @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/docs/static/img/logo-upv.svg b/docs/static/img/logo-upv.svg new file mode 100644 index 00000000..d28787bf --- /dev/null +++ b/docs/static/img/logo-upv.svg @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/static/img/logo_infn b/docs/static/img/logo_infn new file mode 100644 index 00000000..83fdb01a Binary files /dev/null and b/docs/static/img/logo_infn differ diff --git a/docs/static/img/logo_infn.jpg b/docs/static/img/logo_infn.jpg new file mode 100644 index 00000000..14dec9ea Binary files /dev/null and b/docs/static/img/logo_infn.jpg differ diff --git a/docs/static/img/logo_infn.svg b/docs/static/img/logo_infn.svg new file mode 100644 index 00000000..d7d5b803 --- /dev/null +++ b/docs/static/img/logo_infn.svg @@ -0,0 +1,37 @@ + + + + + + + + + + diff --git a/docs/static/img/nunet.webp b/docs/static/img/nunet.webp new file mode 100644 index 00000000..40145c64 Binary files /dev/null and b/docs/static/img/nunet.webp differ diff --git a/docs/static/img/scenario-1_dark.svg b/docs/static/img/scenario-1_dark.svg new file mode 100644 index 00000000..a23fe5db --- /dev/null +++ b/docs/static/img/scenario-1_dark.svg @@ -0,0 +1,13 @@ + + + eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO19WVdcdTAwMWJZ0u17/1xulu/jLfI789BvXHUwMDE4T3jAlClcdTAwMWLbt79VS0hcdTAwMDJkXHUwMDA0kiUxuVf997t3MihPKkUmWGBcXGWqy+1CUigzT0TsXHUwMDFkcVwi4vz3X0tLjyZnw+6jfy896p62W/1eZ9Q6efRcdTAwMWJ/f9xcdTAwMWSNe4NDvKTy/1x1MDAxZVx1MDAwZo5G7fyde5PJcPzv//mf1nCYTT+VtVx1MDAwN1x1MDAwN+ef7Pa7XHUwMDA33cPJXHUwMDE47/1/+O+lpf/mf+KVXoefX/lcdTAwMWPl9mjzY+tl/9v41WdcdTAwMTFcdTAwMDabvZX8o/mbLi9o1G1PWoe7/e70pVP8XmrhM+GtMdaKqL2yVy+f8WWhVSZcXJB4i9JaiXD18kmvM9nDW4xwmbDGXHUwMDA1P/3oXre3uzfhzfqQOa2CVFbkP+7qPedcdTAwMTfz7yVx9ZvxZDTY765cdTAwMGX6g1x1MDAxMa/4/+yI0Fx1MDAxNmJ6vdut9v7uaHB02Cm8Z6fbjnH6np1ev785Ocsl4yHjYT4qyd+6uG5Z+v28T+FcdTAwMGJ391x1MDAwZbvjcfKZwbDV7k3OXHUwMDFm0fRcdTAwMGV4dcO1Tr5W/zu9plHroLvGxTo86vevft077HS5XHUwMDA0j7aLN5nf38XXXa70dFx1MDAxOfXFb/6aXny328lcdTAwMWa0j8Jf/XaqbtqF8m/XXHUwMDA3h7nqRVx1MDAxN72QXCJOr2j8XHUwMDA02jbJXHUwMDA17rT64+700fOqnpY1saiNibJNuqeTq1sq6OrXXHUwMDE3Zufj20396s1cdTAwMWZ7W8OTbW93O38+unrfX1x1MDAxN3+bPrqjYad1fj3SK2dcdTAwMWTuxoYwXYZ+73C//Fxc+4P2/vRcdTAwMTb+VXhcXCXLqb6aXHUwMDE5y0lu5sJonM2sV0E7ZZ0xKpSNxtdcdTAwMTiNXG5cdTAwMTFGXHUwMDEzo3BC2GCjmTVcdTAwMWQr7tNU9lrtvaNR92cwXHUwMDE2WW0sydsvrFx1MDAwMutcdTAwMTN9XGLGVlx1MDAxOIbyap5hSG9s8EZHf1x1MDAwYtNIruP79XeqjlRDPICnT54/XVp/++Tp0tv1pXdPN9++f7f6dOk/h1x1MDAxYu/eflh78vRdYYFcdTAwMDeHk83eN96RXHUwMDEyyW+ftVx1MDAwZXp9rodNxK/0e7t8NI/auJfu6FHx+Ux6gKarN0xcdTAwMDbD6attSGz1XHUwMDBlu6O1JoA0XHUwMDE49XZ7h63+XHUwMDFm197P7N20jiaDd93x+f1MRkfd4kPsvrg0XHUwMDFimSlbafPXXHUwMDAwYUEp7IyqXFwqhZIqOlx1MDAxN5yLVUrZetRAVc7djtNcdTAwMWJff4/t10+fd549V09aoydbrf5DQbBZV8NcdTAwMWK03mRKO22iMULA+yX+LsKZ4SVtZ9xd2U3JLv+53k21bCfs7Ezfc+kybTBcdTAwMTm+XHUwMDFiLvOcS0zv5MplXHUwMDFhpTLpI6iIifnP1K1eOFx1MDAwNKmMcV44q2/nhm6KzjO4eefQ1kjN9axHvPJ9VkvrXHUwMDFjnmCVmm83V/Ozky9n4fnqyccj8eXrwejV23cv/vzj4aBPtaL7IDItnHMyVii6XHUwMDA0z81cdTAwMDJ03FxiZaP0/k5cdTAwMTRdm5CBjmupKlxitTQ6s9piidS5jvuyilx1MDAwNyGM0bJw6X9TXHJPeVlBue1cXGB31kBcdTAwMDdC0FW63W6u299cdTAwMGVf/bn/XndG708/nJ6tvX+/uv3m7KHrtlVcdTAwMGWqXHUwMDEzXHUwMDEx5lx1MDAwNa1UXGIpaY1aZNFqXHUwMDExrPRU/ztRbe9xXHQ+XHUwMDA24aSJYL5xVsG1LSu0Q2iDy1Xx+1x1MDAxNTp5obHmeq29Nz7eirZcdTAwMTVJWEh+O4eE8Vx1MDAwMcpsaX3Q6S6d9CZ7S93T4WDc7SyNu6PjXru71JosTfa6S93ObndpsLP0YmN1qd0/XHUwMDFhJ4RtYWwuucUydfvuy7xcdTAwMTdOXHUwMDA3Zz1cdTAwMTfsonfgXHUwMDAzskj0p1x1MDAwZaHT3CFMTv54XHUwMDFkn339+Pq53Fx1MDAxZO+vXHUwMDE5uXvwaeuhO4QgdFx1MDAxNoFcdTAwMTTzwC7azPP52LtcdTAwMDQ7IbOYo8NcXFZn8Y6o5Fx1MDAxNakruKZzXHUwMDA34Vx1MDAxMY+bIOKP4nRXn7lRLmR39GJt/YWfXGLZds86wk6ef42PXHUwMDBiuZDfqsWef1j8vjFcdTAwMWO+23+zubJ3XCJWXHUwMDFlt7efb5x9Sb/l8vtbo9HgpKncOFx1MDAxY+ndk9PVXHUwMDBmXHUwMDFmV/Xvbbf1QlxmnjxuJvfib/eUu6l+elP/Nzd3XHUwMDAz8M+8hupbq51SPqZKXHUwMDBmrc+UR1x1MDAxOFxieEqU/lJhpVGZZuYmXG7rnSwkXHUwMDExpklPe43hzVx1MDAxOE/0sq3+XHUwMDE5mZvOh+apm2BUhF8yU6OeevRcdTAwMDJcdTAwMTKXXHUwMDFjelxiXHUwMDExzFx1MDAxN1x1MDAxZa2B577vxM2H3mhy1OovvTra5lx1MDAxNd1Lnuag1+lcdTAwMTRRsZSqqYGtMt7PvYNF4TjfXVx1MDAwNeEhinkrLoWSXCJE2GqVxnWbQ/hK7P/+bfJ4f//FRm/txfrxpndhXHUwMDFlp2+PXHUwMDA24/HyXmvS3vvxMO7g0aQwTntrlHCi5NGEXGaZkyD11oiofMGgbuOKtHLtrp3FcalcIoJWRFx1MDAxNyYo6YHHXHUwMDE1oauyWVx1MDAxNC5GJ61cZipcdTAwMTSw/jI7XHUwMDAzlu1EwJ1UupopNo9emr2dz19enk2Oevth6+zw9+HXzVx1MDAwMkw9ev9p7UtP7Dw9XHUwMDFjPH+3tr4+7i6//fb+XHUwMDEyrO4hZPguhzGetEaTx9Di3uFu+SPdw86cV/qt8WR1cHDQm+AyNlx1MDAwNr3DyYxnpdxcdTAwMTXC9l63NXPTkDz3tSHFpWsw/dvSVFx1MDAxZvP/uPr7//62gHcv61xm4ZcyJmqD/1x1MDAwNyq75PNcdTAwMTlcdTAwMDA9XHUwMDA246VcbkpHo0OtQFx1MDAxMzKrYjTRwcLhPXxRnlJQY6H4TS5cbm3cfYtcdTAwMDPbRaCOd9tcdTAwMTiksMIm4kxcdTAwMDaeXHUwMDBiXHUwMDAz0SriO52uXHUwMDE3XHUwMDA331x1MDAwMI5cdTAwMGaKLH1ApGNcdTAwMTJxIVPGwVx1MDAxZSFP4fJkrThn4MKtNNb5XHUwMDEwrDChKFx1MDAwZcG9U9xcdTAwMDdWIEfG+vqlWLw4rYP3XHUwMDExXGZcdTAwMDAuxiU3XHUwMDFiRCZcZlx1MDAxNMlcdTAwMDNMPJhdvTSdXHRcdTAwMWRcdTAwMTD9RKVMiMm1weXil1pcdTAwMTmEJVoqUy9MZVx1MDAxNjdiLdxekMH6kjSwSWu9tPiuqFW9UchMK0REykXtXHUwMDExwenkViXUzoPaXG6pJC7fqfqbXbhA6JYmf5POc+cg2pBcbrSZgMHihqHF1Pd6gSazXHUwMDAxXHUwMDE3J5jh10basrxcdTAwMTRb6uThXHUwMDAzWFRcdTAwMWI0kdNcblxcwzXy6rVl0eJcdTAwMTCFwKE556BcdTAwMGXBXHUwMDE1djKunlx1MDAxZb5cdTAwMDSaLGg8oVb/tMrghISDR/EyKjGzui5Kg6v28KPC1i5cdTAwMDZMw2BprcTHYFx1MDAwNr5sXHUwMDFiXHUwMDAxLMTSaytowP1cbrPgQlbCacDcYOW+5Fx1MDAwMoyWxiltXHUwMDAznLWOXHKkXHRcdTAwMDRcdTAwMTNG5Kym5Fx1MDAwM+ifYP5cdTAwMGWsXHRr5Vxc7bXZPN1cIlx1MDAwM/BcZmtcdTAwMDAjKvliXHUwMDE5oT7AMVx1MDAxOVx1MDAwMCbR3rc4qFxi9EPDg1x1MDAwMk9h5WXkQbSrqFwi8NRYqFpvbKDCXHUwMDBlrlx1MDAxOF+udVx1MDAxNCpcdTAwMTWHIDpKXHUwMDBidbNcdTAwMGXr4VxcrUWYTGJcdTAwMTGwfLhcdTAwMTdn4YJmaFx1MDAwMGJ6fFx1MDAxNcVhwWrtf9Hyllx0L3lcdTAwMWRcdTAwMTS8XHUwMDFl1EHBVyVcIpcl31x1MDAxMDT+XHUwMDA1XG6A5lx1MDAxYd1dlrX3PY8t/av4/zeNp2jrc1x1MDAwMyqm51x1MDAxZP4sxNDTgGqneUC1Nd58az6vrHftk6O1/uNcdTAwMGZxS/rfXHUwMDFm9j73eSil6T5KUcxFXY/JXHUwMDFjIFx1MDAxMvZOzS1cdTAwMTSz3S6rU5FcdTAwMGaNsLOgPVNcdTAwMWZcdTAwMGV+ulwiXHUwMDFkXHUwMDFhNbfBNXTXRi1cdTAwMTDQzURRcJTAXHUwMDA17avzoVcq9CtI+vtcdTAwMDRJMoPTXHUwMDAxXHUwMDEwwJFcdTAwMDZQZkRcYqk3i9abIGn2XHUwMDAwXHUwMDBiqWvBYFx1MDAxOYzAOiHhXHUwMDFkoWdw4TZhXGZUQVx1MDAwMWORWmisYmxcdTAwMTDX1Fx09Fx1MDAwZWCF+N/qgODGfv9cdTAwMTXeQiBcdTAwMThcdTAwMTfwSuJcdTAwMTNMXHUwMDAx61x1MDAwNO1cdTAwMWT4MXxi8Fx1MDAwMp6bYUlcdTAwMDN5XHUwMDAyolx1MDAxNFx1MDAxOD94XHUwMDFmiJxLXHUwMDE5q8wrajTJNCSbRlx1MDAwMkNcdTAwMDTiwzVcdTAwMTlng1x0psTiMjBPXHJcYqL940Lr4yWVRTxBxtX0dTYkSiPxXGKB9VwiXHUwMDA07lx1MDAwZeFp1EPgouX5LHAphGXhXHUwMDE1o+FEXHUwMDFl4lx1MDAwMU39g0gv4G/rgzA8XCJP1+pcdTAwMTGIg1x1MDAxOUWVXqAjQIPl4bvAXHUwMDFlXHUwMDAx0/VcdTAwMDJ9hlxiXHUwMDEwi8FlXHUwMDE03qlEXHUwMDFlo+tcdTAwMThBwLSJXHUwMDE2MUl9tK5kXHUwMDA2/uA9XHUwMDAyVFx1MDAxMC3Eglx0Z5JcdTAwMTm03XtcdTAwMTVcZt5cdTAwMDAu3MDoXHUwMDEwlYCGaIu3e1x1MDAxYUFyw+B0oNZcdTAwMGXvXHUwMDAwXlx1MDAwMHN0XHUwMDAzXHUwMDE1dJnBWihcdTAwMDYz/CMxXHUwMDExXHUwMDA1Qlxuhlxi/FxmXnKd6+PYhctcdTAwMGIsvFx1MDAwNVx1MDAwYtNcdTAwMDFLaZxXJYHeQo+MXHUwMDE2gbZZy/9cdTAwMTlcdTAwMTZD/Vx1MDAxOIGARHtn07hdIZ7weLjgXG6K+df68GRZI9ihXHUwMDE5QFx1MDAwMSNcdTAwMGItTEljXHUwMDAwh/BpzoKD6OjrNVx1MDAxMIxcdTAwMDQqK5RcdTAwMTDeSlx1MDAxMFx1MDAxY12Sx11cXFx1MDAwNlWRil+vMItcdTAwMTaHsNdaPCPpsFx1MDAxY16VomKPICBcIjRAXGKDh1hcdTAwMWZALWteXHUwMDAxQi1cdTAwMGJcdTAwMWZcdTAwMDJfXHUwMDE3y5dcdTAwMDcwXG4+391z+K5cdTAwMDZZj1x1MDAwMFx1MDAwYlx1MDAwMCaypFx1MDAwYkGh0eXVXHJcdTAwMGXPgVx1MDAxMZGF0tSL88yBw6CYQUFcYjVcdTAwMTPycE9cdTAwMGL0XHUwMDBlT1x1MDAxNo6tweU5hCFGXHUwMDAwyGCeuKdyalx1MDAxMXqEXGLFXHUwMDA3xoCx3t0vWlx1MDAxY8mwxa1cInSH70gzRvAtsFx1MDAxOVx1MDAwZqdcYu+CXHUwMDE1aSBOZDZcdTAwMDbGqnB+MIPUcl1cdTAwMTbPk6g+eOhMg4xcdTAwMWLkXHUwMDAxOCyzr1hcdHysnPo0kWVyXHUwMDExYahSoFx1MDAwZvW+JWZcYlxmLPmE4Fx1MDAxNqNIrzBm+DWWNk/XMDtz/1x1MDAwMpnlUVA9J8gpbOr8sFxcUWvCXHUwMDBiWFtskK7gXHUwMDAyXHUwMDAzi5jgZOZcdTAwMWQ+uCjOXGLWbYDZMJBcdTAwMDVcdTAwMTA3IFjwXHUwMDA2XHUwMDAy/iN4R1x1MDAwNyOmNWa5PM90XHUwMDAxeYtcdTAwMTZcdTAwMDZg1Uz/XHUwMDAy7ldJXHUwMDBi8lx1MDAxN1M2ZDXoYcRvLf7R4Fx0XHJu12Z4OFx1MDAwZYaOlVx1MDAwMFx1MDAxM3AleVx1MDAxMTZcdTAwMGLKQN9cIppkVFx1MDAxNyxcdTAwMGVcdTAwMTZcdTAwMDDXXHUwMDA28IdnM6VtXHUwMDA2azNcdTAwMTghOCvcMnOu9apiJK6OVFx1MDAwN1x1MDAwNo/lc2VxcHjMVbs8XdZgT8WAXGKBOVx1MDAxYlx1MDAwYl31pWSKdbg6UjXvoJyhyZ5cbu5cdTAwMDeoXHUwMDFm4JJcdTAwMWQuJHUtXHUwMDEwpyX4XHUwMDE5XoHHXG66kThW74NmXHUwMDAwybmd8LDEuYycXHUwMDFkWlx1MDAxZsBcdTAwMTWlL4tjvs1FwFx1MDAxMLyZaGC2sCTgoLdRkZKE0uV5KJ6B23agzVKqXHUwMDA2muKoqlxuulwisHygLElUJDJ8XHUwMDEzliiA/UaQrnovXHUwMDAweVx1MDAxZWZcdTAwMGJcYlx1MDAwN9JAXHUwMDFk0tQ2XHUwMDA0srBcdTAwMDaMXHUwMDE0QVx1MDAwMpG8wf2S5DJcdTAwMGU1XHUwMDAwXHJoWeL1XHUwMDFjXHUwMDE4NbyeZ1JcdTAwMDQoXHUwMDA0PGiiy4jxwPVcZjwv4CtccjsgkLG0cPhcIpZcdTAwMDE1iKWNJlx1MDAwYkLU44VcdTAwMDNcdPdcdTAwMGKQXHUwMDA3XHUwMDFmwC0xgII3KVx1MDAwYoI8wy1cdTAwMWNcdTAwMDV25FxyXHUwMDAy4HtcdTAwMTcnspzCsv1cdTAwMDJxbeluXHUwMDA1Q1x1MDAwZTiqXHUwMDE4sMxNnJ6Ak1x1MDAwNCZoR0qaXFyajYigmbBG+CVcdTAwMTHVNdg1Q8hcYj5cdTAwMDBcdTAwMDJcdDDzQpXFXHUwMDAx7ExeiFxiuFxiXHLCP5B5UEfPkmrNqNGV5OGJ4luAXHUwMDAyXGLLRYNgY8HiRO7iibdeXHUwMDAwMUp6XGarsZbFUiyE87ZBbOV5eXmRh45w9unKepF5QJ1UwYI/ilx1MDAwNslcdTAwMDdcdTAwMDU+YjVA32NBpDKJ3XpcdTAwMGI36jTjU4svbWBcdTAwMTWIJnBcdTAwMTeOXHUwMDA1YFDmKEqbNey3xCV7vlx1MDAwMupRL47RO/yQ5Vx1MDAwNibgq7yRJFx1MDAwMsBWMbp3scHu5eLFXHR4SFx1MDAxMFx1MDAxY2mZXHUwMDAz84muXHUwMDA0OD1EuVx1MDAwNtRcdTAwMWOeVtXfLENcdTAwMWRcdTAwMDNSzTRB1Mqb9PJcdTAwMWM3wllcdTAwMDCPP41s8PCUzFg/XHSyXHUwMDAy9Vx1MDAwYsGn5Cdwb1xuZMZr8DZymia6olxms302kq1cdTAwMTTqtS/kRTB4b1x1MDAxNPOAXGLXfoQ8aLCW2nBcdTAwMTfTWpXoXlx1MDAxNFx1MDAxOdiPZ1Ypgus1SUXy+nSQhmlcdTAwMDeWliS2XHUwMDExsbzkRSCQQlx1MDAwMklcdTAwMWLllXInXG6mrLHKJt3bi7h6qFx0iFx1MDAxZb1cdTAwMGY8c736xYx7z560XHUwMDA0qJbmqWY2KJqIY4aFgTO9m4ulq0NY6OG+glx1MDAwMjOI9Xeb21x1MDAxYaNPXHUwMDA27oJAU5JcdTAwMDdcXIJEZmRcdTAwMWLQKWYpoFx1MDAwYlx1MDAwZTZcdTAwMWJcdTAwMDTUXCItoYl5XHUwMDFhN8KLsu3K1u/EU1x1MDAxZfBcdTAwMDU+yFx1MDAxOWAu7F6XdFx1MDAwNTbBWDB6+opcdTAwMDZ3u2h5LlN0ucZcdTAwMGKQWyd92TaEXHUwMDA3k4FcdTAwMTbD3atcdTAwMDZJXGZcdE9OXHUwMDFkIWowV5tcdTAwMTb5XHUwMDA0wJBcdTAwMDJblVwi4iFcdTAwMDZX71x1MDAwYiSiUtyqNlx1MDAwZTQ7MFxylci7LMyJpCyhifJRXVx1MDAxOaRcdTAwMDH2aXBJlFx1MDAxYvJdXHUwMDA2p6nqtO56WJPc2Vx1MDAwNlW2bFx1MDAxYsLnSp5cdTAwMWVsjz5cdTAwMDVxKcHXNzC1XHUwMDA1y3NMSktunFBt4fNt+fHBXTPwXHUwMDBiXGJcdTAwMWbqWUaeZFx1MDAwMYYz8lR4RjJNOrB8XHUwMDAzIYOialx1MDAwMvbqQz9ET1x1MDAxZSvBbDlUzOlyMVxiy9jA0jRcdTAwMTbZ16dH8fAsXCJccnwxnLJQprS4N4RJaopDXHUwMDFjppiAXHUwMDA0ekRVVlx1MDAxNWOMY4FcdTAwMTmgw9dubyxanGHyXHUwMDEx/lODqMNLXHUwMDA1U3p0oOJcdTAwMWUqXGZQbrA3RC9cdTAwMDD8jsztsYYjlJ1cdTAwMDC+h/ZcdTAwMDK7cfXkjD5cbrzWXCLw057J7bKPMtGwXlx1MDAwMlx1MDAwMOVcdTAwMDFpXHLEcdGY+IFRXHUwMDFhacvwKIOh9eO1XHUwMDE461x1MDAxZtxipVx1MDAwMXxcdTAwMWO3tY2E3TqbljNFNo84zVx1MDAxYYKgPFx1MDAxNrdWXHUwMDFjaD9UXHUwMDFlXHUwMDExNlx1MDAxNlx1MDAxNYgrS9JcdTAwMDBuiFmA2lx1MDAxYV6+1rrAK/LNNISh+X6LKmNZhMIh9NCM3uqrS0lTVFx1MDAxZVx1MDAxZDpgs4oylMR5WF6+XHUwMDFiyLRzrZaQRSFYJ9GEuzUlXHUwMDFhwMZseECGRlx1MDAwZcpUX+CHi0NcdTAwMDTKWEVbLIYpaXBcdTAwMDDdRpjHfLipj1x1MDAxZMlojTReXHUwMDFhOFx1MDAxMbi5Mp81XGLJoOFSMni7X2HcpoieYU2e6k75XHTwXHUwMDE1hC4wxy1Y3lkrjpFcdTAwMDWAmISfg1x1MDAxMtIkbeB2XHUwMDE4XHUwMDFjNL5PcMur3lJcdTAwMDOor2JcdTAwMGVcdTAwMTbmRc+d+jjGPUBcZpZ0ws3VYjUsXHUwMDE1JJrzdlx1MDAxMLNyQzNxI1x1MDAxZbQ9ssVcdTAwMDG0k6n9elxy0YxcdGFWMGwymlx1MDAwNFlcdTAwMTGAqnxcdTAwMGZWM0Cuz2shOsbTxSWBlUCnXFxcdTAwMWG9IzpcdTAwMDZnUYhorVx1MDAwMWmvXHUwMDBmj9mNjfU0XGbg8bhcdTAwMTNcdTAwMTVB6K7PKalkVlXWXlx1MDAxYlx1MDAxM1x1MDAwYoF8XHTxO1widFFOLIC4gkDAJ5Fk1z42ZlG4v8Z6XHUwMDEzRIPBl6Q5XHUwMDEzXHUwMDFjyDzTbVxySklcdTAwMTcsjXv4IP6KSFx1MDAwM36vStL4KCXoXHUwMDFlaFx1MDAxNGhL7YMzXCLzTHv6PPflSntIXHUwMDBlludcdTAwMThcdTAwMTRcdTAwMTg+WPilWnFcdTAwMWFYXHUwMDAyMGXRSn5H5UxbXHUwMDFlQ1xi06CgXHUwMDFjothcdTAwMTJvmJdcdTAwMDVVU2VRltX0MpDJhXpAZYZcdTAwMTK4ZEHBqcNcIt2W/uHioO8we5BMai+QuiTNSXxcciRxmll9MMx0e1RMfXtcdTAwMGZklzPpZ1xcXHUwMDE20FlbuM36XG5cdTAwMDEm21xyq0SxXHUwMDEyivmYksLhXHUwMDBiQO1cdTAwMDRzdj7UX1x1MDAxYp2IZ/V40PSLqfrCl+Y0XHUwMDE2ZFx1MDAxME+j3ofk14bbXHUwMDAwkUecVEq0Q1x1MDAxYeuScLfUOF2/XHUwMDAzhedcdTAwMDb+o1x1MDAxMaXDVp3zvrzHXHUwMDAzfXQs32a6olx1MDAxZVDzLVx1MDAxZe7+R9hcdTAwMTVrZErSXHUwMDE0Y1x0XHUwMDE2doGh14c1xmTchKSSsOrLzew/XHQyaSCQZlx1MDAxN9w9S5N51YnO/Vx1MDAxMnxIqlwibFxmgJOHXHUwMDFlWptvNjRwcexxhatg9Mbdl5I8KXTePkSWXHUwMDE3XHUwMDFhgIPNPHwsXHUwMDFjUmCnS5zZp1x1MDAwNKfQeek3qGN9zVx1MDAwN3dlWUAnc8ftYiyJc3ntXHUwMDAzPD58fT2JW7g0PmjBXHUwMDFhXHJthU90jlx1MDAxYtCKSTXcK/NcdTAwMTH19WR5sVxmLJX7XHRCXHSrk5XgXHUwMDA2Ob9cYsCrgFx1MDAxZvWNaZy0XHUwMDE5rYeriIKJ9lx1MDAwNPN56dxcIlx1MDAxNFx1MDAwZUSFpVC1V6eAdqBcdNws9i5vjfstfVx1MDAxNdG9xoVcdTAwMDO+XCIoTj3Bidn5vEKEo6DTdqaVjFxcOzCjXG6X0qjDZZHiNGNITeT0hOJy8VxiXHUwMDFlXHUwMDE4O408XGY6NOivXCIpXHUwMDExrMN2mlmDtHeJpS2ej1x1MDAxNjhcdTAwMTFcdTAwMTD+Nrg4lzEkXHUwMDBm3OFcdTAwMTVsO0jEKXJcZsvxnWTc9b5Oe3a5cT+HwUu61a7yXCJWgUhcZmE0iXD9rS5WWsicol6x6NaKlGkya1x1MDAxY7xkpaFlJU99clx1MDAwZeK48ShVIFx1MDAxOEtVrveyzGmCTSmjXHUwMDE4YDS4V1x0lII+IVx1MDAxZVx1MDAwMekvV6MxQonMXHUwMDA0XHUwMDA1w4RQk2XlPqZEKFx1MDAxN50sSzMsMlQycphkXHUwMDAz60e8kT+XPE1cdTAwMDbMNiVxmuk1w399k1BcdTAwMWacP7K+UMKOYEVOllx1MDAxZZ2g+lx1MDAxYVx1MDAwNixcYlxy6q9cdTAwMGVcdTAwMTGEXHUwMDA36GBt8b9cdTAwMThT0OFKYJmwXHUwMDE2LDxiNfO9y1x1MDAwM1x1MDAwYmTZXHUwMDEwwMLAMl2YqeRj1pO7zlx1MDAxMm6iPmud15HCXFzhilx1MDAxMaSrUlx1MDAwNVxu60ixTkzZMeDWXHLSXHUwMDA3IE9s0Vx1MDAxMsRcdTAwMDOYhpwpdDVwXHUwMDAxwWp2nNbX4bKul1x1MDAxM3vgUaCnLHcsOSju+ELJZVxmLPSrXd6Fy2MtXHUwMDFmjImZZNZcdTAwMTOm4Vx0l4Pmj5dcdTAwMTDDwzHWiZMgNYicXHUwMDEx0ll6cZlmwWBcdTAwMWKKXHRwXHUwMDEzQ74xXa8tLFx1MDAxY3CAXHUwMDFlWFx1MDAxNFx1MDAxOVKaUpdAWrhcdTAwMDHL2lx1MDAwNYJ6PWtXXHUwMDE5XHUwMDAyXHUwMDFk4cGIXHUwMDEx3Vx1MDAwNcTRqSdApFx1MDAwNlx1MDAxZcBdeDZcdTAwMTVZWf/0XHUwMDAwV5aNylBcdTAwMTZcXKBIU+p5nT88LHxcdTAwMGJbXHUwMDAwXHUwMDFhXHUwMDE0XHUwMDFks1x1MDAxMYFxk2HdXHUwMDFkQq40imUjXHUwMDAyXFwse6xBK9naVy8v7+zlJrtjeiStXGLKuO1ic+uIXHJoQFx1MDAwNl9nmVx1MDAxOYHae5fuRuDJ4ZusXHUwMDAy9SNcdTAwMWZz9cVANeLob4Bzno1cdTAwMTdYkPtcdTAwMTYnXHUwMDE5XFwyUctcdTAwMWFqhP9pco1cdTAwMDWV3rOMXHRcdTAwMTRcdTAwMTTkvtHmXHUwMDBiq41xXHUwMDE5cEFYYDz1VKBgaSFdospcdTAwMDfYqfrtybtpN1x1MDAxNNPmnHK7oeYuk9aictzobvNuQ7H25WXrRfw2fNs7XG6Ptzs93Vx1MDAxN29+ivEtPmY5yOm84l+UZ4kzQuSANs9u1WC/r+dw7vhcdTAwMTZcdTAwMDTcLuQ7XHUwMDEziFx1MDAwMlx1MDAwYmOvptNb8Fx1MDAwZfg4XmTgSLiZuaOsXHUwMDFhXHUwMDE33Fx1MDAwN6+e03ilSr/aXHUwMDBlXHUwMDFmcNvhMmvG4LjzST6sIU0zz5d771xiVZhPdlxyulx1MDAwNCDQS3Juxao1IYy7RmCTMrSFXHUwMDBiRJCDXHUwMDAwh/28oGYstk3kldW+Vlx1MDAxYzNcdTAwMTaMpqzL9zXSjKC0eTFcdTAwMGLxzIo8bVxcK2+eafKHJW9cdTAwMWXLoMCMPGdPNCiTW7C4fFx1MDAwYofhXHUwMDEym1x1MDAwYpjOTSFSXCLgZl2g40LVJ9zZ4+hB5FgllVx1MDAwZnws9bGyRolcdTAwMTM72Y1cdTAwMDVQadSVL6jRjEhcdTAwMDNnX4RSqJFpXrxnUz6bc4ztLtdnfu5cbiXnXHUwMDBlKmVcdTAwMGJcdTAwMWN7XHUwMDE2K1x1MDAwN1x1MDAxN+/dYMjZYF1cdTAwMGZbQ386Ontcbu88Wn45ls9+XG6UXGZcdTAwMGVBXGJcdTAwMTSD8ZZcZq485FxmKFx0xlx1MDAwNFx1MDAwMo5w293RiDPH4fJcYvhYXG5cdTAwMDRmVXXeXHKtXHUwMDBiXHUwMDEwI1x1MDAxZLPG4FxcaqY7P3L2XHUwMDEwi/Z+oeRPi5I3e3fIXHUwMDEw5VwiLGRxPVvW07a7XGZOiYO5XHUwMDEwLmkjZH2VxHw15I9n8b3n+lx1MDAwNSvpk+vEMbaXrKtcdTAwMTA2L9FLxzRcdTAwMTGuhEMsbySTSPVcdTAwMDHYgsWpjL2wllxy3uxcdTAwMWMyaYp91tpqXHUwMDFmXHUwMDFln1x1MDAxZDtcdTAwMTPyYVtwqL50fVx1MDAxY/XD/Vx1MDAwZVx1MDAxN4I2XHKAXHUwMDAwj1txdJmWlmO9VLlFXVwijFx1MDAxN8wxcExCLVx1MDAxN7krXFxx5V9PXHUwMDBmNVx1MDAwMdJyP2/qy1xuwNJrXHUwMDBlLI/N6LNeW18zn5+dbmnn9ejN+NtPXHUwMDAxLKx/gHFyXHUwMDAziXOup375/PNcdTAwMGXmy1Q1O4FNYazXYqHF5p1cdTAwMWbWcC5QjD5WXGbGZ35cdTAwMWFuJJKZkazOjME2UjDh5uuGZ/5CloeLLKDTLJbVLs/tcVx1MDAwN7z4cWgqXGKQziekgqnWbyqUxKl0XHUwMDAzJWasi7OOlZeCRTb3LVx1MDAwZeTbh3ycUmRy15XzkoHdPNw0g8I06NCOmWPNv2c9l4JcdTAwMTmlaVOdXHUwMDFmRKiF87h812B6RlwiLpb3siCOL+JZXHUwMDA0mC1QoE7cMpP8Nlx1MDAxZsfBYZxGp002uXlcdTAwMWImsFlLXHUwMDE5mzR63oFAXHUwMDAz5DPRSIdbiyFtXHUwMDEzXHRcdTAwMWPVodhccqjyXHUwMDEyqlrtXHUwMDEzeY9cdTAwMTJiZsOJVqzoTOd7LF+8wbm8YVZAXHUwMDEzYn3O844gcm6CUlFcdTAwMDGMqVx1MDAwNMgvzVx1MDAwMXLydu3levfV+vHkZPLqcK+18+zDmftcdTAwMTlcdTAwMDDSXHUwMDBibp9rTpCVQU5cdTAwMWLFp/jInLbmiUWF+HXR6GiY01HCkNtOK49SdOShfWBg0HQlXFxcdTAwMDGoL/KTgvlcdTAwMDTj5S98/Hnx8Wbvhj9zOq9Gy4upfcr2ecpcdTAwMTbQhTWKkUXgXHJGUHJ2XG7HXHUwMDA3s6VKuVx1MDAxOXebKmCtu41MWSDky/fSvEvr3Vx0MDJcdTAwMWaOzFlfcEL1ua6SPFtcdTAwMDYsa9nEkHf43fjivk9cdTAwMTj3XHUwMDE4g1x1MDAwMK5Idlx1MDAxN0mRJpUlXHUwMDE4Nlx1MDAwN1x1MDAxZnNOXHUwMDEw9/DrxVx0zsjOx65cbqO1LfVcdTAwMWRg1Vx1MDAwMzdcXC1Zsoj1IzYz3CdcdTAwMGaYUd57mU9cZvktfVlz5lx1MDAxMVusjGLH1Fx1MDAwM9xGY9+wXG5zYGr/XHUwMDA2QzvXzPH65+fi+WhjXHUwMDEy14fH/YP+45WfXHUwMDAxplxcXHUwMDEwXHUwMDE5XHUwMDAyuHxcXFxidGMmQeiBU6BDjlx1MDAwN8DBgq85zeg7kCqyPYKDvKFKpEhcdTAwMTVAda6dzFpcdTAwMDQ2XHUwMDAziFmcUkFcdTAwMWFdPNjvXHUwMDE3TF1cbvtZYMqwKDxyXHUwMDFin4PrdFqvsizZXHUwMDEzQ1x1MDAxZOVEvnxSY3e5vnjNgyyrXGJcdTAwMWHEMnhR6qRhOVx1MDAxNTxcdTAwMTS8q7JcdTAwMWOeVJ9cdGNPv1x1MDAwZk5ohFx1MDAwZTzGqJRFZPmB5NQnlvHUQ6PKpOb2ST6rivtHXHQ2lnW+wbZS5lx1MDAwMydJxrzyl0nD6y6vyWRK2CNcdTAwMWJgOIuMvW/+mqf3g2Yyi/lnXHUwMDBmXHUwMDA3YFx1MDAxZNM+Vc6939y5byy/PJVH72T/zejZq4PuR1x1MDAxMJXD1k/h3KPJeD6E9uyJ1dPW1suT6kTGI1mDXG4sXHUwMDE1MndcdTAwMTSGuIxccuqsuYdcdTAwMWWDxVSFITxiXHUwMDEzYWye7VxyplwiXG7JT4VcdTAwMGZ6zvGsv9z7z+Deb/huTmDg1DbojVRsoUl9T9AsRDRcdTAwMWNcdTAwMTLrfGxcdTAwMDJcdTAwMDWSg1vzIXrkubI0+T9jgoZeU3BXvkGP5mKl8aRcdTAwMTA4WDZcdTAwMWJC/0tz7/LjX+GBTeR36fr9XHUwMDFhwVx1MDAxMYScXHUwMDExXHUwMDFh87NcdTAwMDLS3i+8XG4z01x1MDAxY1x1MDAwN1x1MDAxOVx1MDAxNXG2Vlx1MDAxZUCUK0CoYu2IK6dcYpnPwzJcdTAwMTjByspcdTAwMDbHarBPiO1fPCOA0VAqr+xcZlx1MDAxYcCUYCeJod157kCVQZ57TDykwbJcdTAwMTi/yWCaRVx1MDAwYuRgXHUwMDFmrIbK9zJcdTAwMTWbyZM7znKE95wugVWz9dUy5djLhbRcdTAwMDNU5IXqilEmJ1nZJp0qd1x1MDAwNc9zj0xwkYNOna/E54Pm+Hxw+nV15+1rtbr/eHly8Hx/b7S5t/tT4LOXXHUwMDE5Ylx1MDAxNlx1MDAxM/LxVXpakjXFZ6+jlGzjXGLBlq5rYfDMoeg8XydcdTAwMWakV9jJK8KzkVx1MDAxY6fIzm4mXHUwMDAzZ6tcdTAwMThpxlbNO236XHUwMDE3Pv/98Fx1MDAxOS7NKY7jNkbI4vnC5y+K4LxWcJF5o0f9XHUwMDA2heKwU4lcYoOzr1jYUfK4kufNeMVcdH+yPjdVJ1xywoLSPP9cdTAwMTJcdTAwMTDYwN/qTFx1MDAxOVx1MDAwZXdcdTAwMDD1tzntKFx1MDAwMVbJPO5dXHUwMDFlu1x1MDAwMjnJiMNcdTAwMWU5liCtp+AgNSNZ5sVTLFSDXHTknIqDR854UWm2dqUzudn2YjnCXHUwMDFmXHUwMDAxIFt56lx1MDAwNeazajxcdTAwMWJcdTAwMTelXHUwMDA07Fx1MDAwN1GGq2JFPoeQ/SCRgi1cdTAwMDaSmFx01GecP5PTLFxuxer9MFj15V9Pi1Mk29eT03ynuHrYXHUwMDFjV/Xmy1x1MDAwZk9Gf/a3J6Mvr56oP198XFx+uvNT4CrPI+JcdTAwMWWAZi4plnOa0WWSXHUwMDA3I1xuS2an7yjs9fmoalx1MDAwZeFcZiE/nbVcdTAwMDJXbcZBhEpyyIxjdVdcdTAwMTlXYdImn9v/XHUwMDBiVv8xsKqIc5bTTlx1MDAxMGolQa/gjOzI5njOXHUwMDE4N7FBs71iIGhcdTAwMTFSXHUwMDA2do2rNEqVRKFcYj/Hmf7a2/rJcDxcdTAwMGaR43VcdTAwMTD4IFxmjDrdQirJa3B6XuQ0XHLNMdMw11JDoeYkN1x1MDAwNKk8OU9yUnGdMJdxYpXFs8N1sb4jXHUwMDExZzi4N7KDgPN66vvFXHUwMDE3K43Za8lkLlx1MDAwMzLO6k9niM16glqBgadS5CV4nP0lXfnUII7K4dBSXHUwMDFlYGNcdTAwMWG0XHUwMDEwyHxcZlx1MDAxNDsnWVtSPE06XHUwMDE3mOVnI0SBgFx1MDAwNC6pyaTiRVx1MDAwYrxcdTAwMDBfJkLYoIJbL3U5sI7PcKOZM1x1MDAwZXlq6J1C86jbnpzDT1x1MDAwNT47N1x1MDAxN55cdTAwMDNcdTAwMTXAXHUwMDE2XHUwMDA2fFx1MDAxN9F50Fx1MDAxY52ft0++rTzb3zz9eLKy9fjLeGdrd3I4XHUwMDA3nVx1MDAxZsg5gTygJJOcvpXvOFx1MDAxNrO5XHUwMDE3yOxcdTAwMTGMWsEt9Civ22zs8p/rgbllO6HqqEAtJI/gcPnEcp6nMYvLlqrL7IqJ5z8z4a7lsCOvZHU7wo1cdTAwMDD3v1d6d6lal+mkv+bj8NVn/lvQ4Fx1MDAwYsXY31x1MDAwZSdPN072d7e0X373xT/92lx1MDAxNvJRUdWvdLhFXHUwMDAwfHT1yl+/Vcu9fPukezpJXHUwMDA1XSRghp2vR4/XOyudg9WVI2V2tvybUC/2/MNxONK7J6erXHUwMDFmPq7q39tu64VcdTAwMTg8edzscmf4zVxmKWFPdeHMznpSUmny193llZzKh3Su9oi9OD7WI2qwXCIpR8jVXHUwMDFlP+xcdTAwMDZcdTAwMDPWeJuo/Vx1MDAxNZeEXbDnntP7XCL3UmZVdrpcdTAwMTFZYXu3O2az245xjj/Za7X3jkbd+/QoN7Kvokf98KjS7FKmeG7WXHUwMDFj3MpjpqfXUoi45NxtRjh07WIxQTffd5ctObmMXHUwMDA1cupcXFx1MDAwYvFcdTAwMDDWXHUwMDBlJ91cdTAwMTE/t7Sysba02Vx1MDAxZOHaXHUwMDBiizo4nGz2vuVRo0h++6x10OtzXHJsXCJypd/bPczjvS5cdTAwMDUn0DfptVv9qzdcdTAwMWP0Op1cIja2IbSFaHa01lx1MDAwNL1cdTAwMDaj3m7vsNX/o9FttI4mg3fd8fmNTEZH3eJcdTAwMTPrvrhcbreyXHUwMDBiXHUwMDFhdDtIn19FJCNcdTAwMGaZUV5V9lx1MDAxOVx1MDAwZZtjuvy0vt33fz7prmyqg6OzdSPN8MmDx/R8k1lZnscpgyh1gsho89HZilVlXHUwMDBmXHUwMDFh081579ecWPtHYXpcdTAwMWT2rr99erjf+Wrfb783x1+/tb6JYFx1MDAwZppi7+KpwrncV69ON4/fvt86Xt1queHOh6efd96+Wlx1MDAxOKZHUTgj/LaYXlxy11NzL1xmQ6tIsIH/XHUwMDE1hy9cdTAwMTbN/Wtzc69eu1x1MDAwN1x1MDAwM7lzXGbe5EfiOael4llPsWTwiGAzn4+tV/Z6g79cdTAwMDVcdTAwMGK5YkScXHUwMDBlyTGYXHUwMDAx6mBcdTAwMGJcdTAwMTNhKlx1MDAxOdGlhXvuXHUwMDFmqEIgentcdTAwMGK/dZpcZv6lOLXlXHUwMDA2kH5jsOZcdTAwMTPcXHUwMDE4XHKOe53uaGnYP1x1MDAwMqI+St6wMDSvwa0yms+9qEVcdTAwMDF5p9c6XHUwMDE4XHUwMDFjdirt2s+NzPNdLOVcdTAwMGLH2lx1MDAxNO161Nyuo32z1Xr2Yvxhy+rj/oFcdTAwMWavhP2jh1xy4zYg9LbO8UxcZjFcdTAwMWKZS+8yRu8sXHUwMDE3u9ao1U7sXHUwMDFhc71Rb6tcdTAwMWS1vV1h1MFkmkea6Fx1MDAwYpCeXHUwMDEyrqlVS4vrNCxTnzHvwIlSvrjvsUBcdTAwMDC/rOBZOIDrx0P9VFx1MDAxZX9ag8KAXHUwMDA2XHUwMDBmzdGbSWxcbrTi943h8N3+m82VvVx1MDAxM7HyuL39fOPsy8KA1kc97Vx1MDAxY78zoJVzgfbirFx1MDAxNa8rgXZ8g52symf8wIHWXHUwMDAx41xcPmHe89ygUnGI4kBuZcBYpTbfa5HzYNbbjF3VLFnikbVVXHUwMDA2OWuHXHUwMDFjXHUwMDEw7n3hXHUwMDFjilx1MDAxZoCyt1x1MDAwZpxvh7KDztLgcOk/h8e90eSo1cffXHUwMDBlXHUwMDA3ne5cdTAwMWShbVxyvMyg7fnFXV5aemGLQtxz71Jh3oWTXFzK5m3ZUVx1MDAxY3yohNtJc+u+3lx0PlDr9vnZ3JGDKKtcdTAwMDBX8XC3vIttXHUwMDAxgDvXvDloXG5cdTAwMGIkVcVMXHUwMDFlXHUwMDFlgaZlXHUwMDA1i3ZaOVxc8N3kvlx1MDAxYsDstWbPaee3MfvSXHUwMDFldOHCuudf3cT0ckfRPuJVspRcdTAwMDTL53lKlfA8WlNcdTAwMTZKaFx1MDAxZe22hnz+XHUwMDE5p59cYmvz3kdfXHUwMDFjXVx1MDAwZa09Tbe1Z1x1MDAxZUyyNT7vgicnf7yOz75+fP1cXO6O99eM3D34tFV1wVwiXHUwMDBiPFx1MDAwZVxcWU5mt1x1MDAxY7Y7c7k6XHUwMDBiXHUwMDFjXHUwMDEy54pNL1xyrnPBXHUwMDFi9WVXs9C9+lxui+DP8qUxTD8/Q5+6/e3BSUMuNNdbhjCXXGZcdTAwMDWeMeVtdY7x6Fx1MDAwNsHJtfstXHUwMDBm1FtKKeAued5gYFnEbHyiLGt6YExG+KiKU15cdTAwMTboL5XhVFx1MDAxYimkdVVcdTAwMWXTslx1MDAxZsrlfNVFISuqZHliL4dcdTAwMDL8XHUwMDEzXedccjyR4CBKYUVcYkJcdTAwMDQvna/wnXfgK6/fk0idu+ah34El/YGzg9zsXHUwMDA1qlxmtDxcdTAwMTZcdTAwMDPVv523rLRcdTAwMDf+zFjCXfvNaObO6lx1MDAwMl/xYe7mzHFzx3l9svyhOk7L0lwizdH5MfIwpdIgXHUwMDEyyVx0kDxcdTAwMWLB1WzPfJffzMBcdTAwMThl4PGobGIqRFx1MDAwNFe+U9vMiXl5nehl4dC6f5DPvIlHXHUwMDEyivOlrFx1MDAxMTpgvYMsluZduCRE8/qG7qiR41x1MDAxY/75ubO2/XHtQ/fP7c/RPls5a9svlZfJONJcdTAwMDfHM5GsXHUwMDE3MMpZlsmhXHUwMDE3KnqEXHUwMDE4uFxybuqZXHUwMDFiXfBP5T/n2Vx1MDAwNX9cblx1MDAxNrEg7zkvXHUwMDAzV6hcdTAwMWSccZ7B563dlYNcdTAwMGWluFx1MDAwMevsL0/c+3efj4N5XHUwMDFin3bPjle/rdiH7jyDN5nXzLCxXHUwMDBlu1x1MDAxOFx1MDAwYp9/XrLNJLJcdTAwMDXvXHUwMDBld7qcyzxrgSWPVeGpwlXOs+wzXHUwMDFk+1x1MDAxNp2aXHUwMDFl4f7T5uBC8ttrcnBcdTAwMWYu8lvr35F4m1xmXG7FXHUwMDFhadYtue5yiq36u1x1MDAxN5Vbm5s59/Mz50p4Y4Wo7K2U8lx1MDAwNnbb/mNldfRUfz3+2N48/bTtn1xy9+f1gDxcdTAwMTi7ldJcdTAwMDUwUFx1MDAwMFxmZ8JcdTAwMDQly4ZcdTAwMWJC5jiHaVx1MDAxMbtZc1xyV+vM8oymXGJcdTAwMTdcIsX1NXuXs0hcdTAwMDNrv439XHUwMDA3pc5f/PHHxtL/XVo5muzdt9VWfvVdXHUwMDFirSo8mrLRSi9cdTAwMTEzXG5TXHUwMDE1qUjV3Giv52NcdTAwMGbVaK3iKXhcdTAwMWHhfj47YaZK1nEstHYzVbKLNNpcdTAwMTBByfKj83i8oqmaVVJYv1x1MDAwYquFg8nPMbpzsL3igYst5ZohlVx1MDAwYlxmdFxuPmHahFvnXHUwMDEzjlx1MDAwZXunS2Ncbpzct0+o/Or7KEux892C4IhcdTAwMTOO2a5yXHUwMDBiurlbeLuxt663X+iNfbv5rLO25tdcdTAwMDZ784bUPVx1MDAxY7dcdTAwMTCFzni2XHUwMDE3sFFcdTAwMWLtSyRcdTAwMWPsm51OnGdcdTAwMTiu3Vx1MDAwNt9cdTAwMTGhLcTtvILiXHSYilx1MDAxZHRVaV/Fw1xcXHUwMDEwISRJ4cuKcjbdXHUwMDE5VYywfoaalOOz8dFZODl96d5+tJ0tfTZ4/alx8eee/PrxaGUy7m7vvVl9evx6c+/L5PfFeaJcdTAwMWKyk9uB9DXpRMtYXGZxe6U1mubWWP2MXHUwMDFmvDV6kV10pzrHMTglZi1gjt5cdTAwMDetjHHujsxRwiNcYlx1MDAxZnnYK/v6XHUwMDBifaOFvZhcdTAwMTmUltFEXHUwMDExwC3+QeR6Y9D5z+HqJfqNb1x1MDAwYqY19Sg1uFJRj1J9UYuC2W6/31x1MDAxYo4rmziMmlx1MDAxYjJzWq9hW1+VXdvmdt16ufP+3dej/cngz3ZU4vOnlY1h+2FcdTAwMTd/Sm9cXMZDg/OzPGYxVtpcZuCnOWdcdTAwMTiWXThqcaFWrU1cdTAwMTaU0JXFKMZJXHUwMDFljeuqMJaRvNI2/FxcZZ9cdTAwMWRxNGhcdTAwMGI93lx1MDAxZO9MXuy8dJ3BaLNx38Z39Ff83aFb67n1Zo6lS1x1MDAxY0RdZeGuuYVXL91DR27vY6aByVx1MDAxMVGt8bGQO7yooJCg2dFcdTAwMDdcdTAwMTMkp3V+n5HPa9RyIYuW50g5XHUwMDFmWOldUVA6i9xeW1x1MDAwM6hfgH3/LLj9mHN0/nO4eTaedFx1MDAwZu5cYrVrcKqM2nMu6Xsxu4k/m7f9n6u1c5xJYpS3ynObpqTWSvGYcckjp1XknIxcdTAwMTmVXGaKXHUwMDEzolx1MDAxNefLKqOFqCCTQCZcdTAwMGLwXHUwMDEzQVlCjSx4kPpm69uko360XHUwMDBiuWWztfSPKs2uXHSsXvVocUZcblx1MDAxZXEsKvZVWDZ/w4NBNohK4XOLasK+fcfWQjeL5+opf5ZnVXQqb1x1MDAwNppcdTAwMWLukddv/F/f97VUrOny1lhOqrFSXHUwMDFh4YunXHUwMDBmX1x1MDAxNSdcdTAwMTgpNU9H5tlcdTAwMTR3U6hwvc9bSuspLM+LM96w1cIqN3vFOjOe03csy7it9DcrSfuuMoQm2/5NKN21rjVcdTAwMDRcdTAwMDTzWjIq4lx0m+UzjKR03GRT1lx1MDAxYlx1MDAwMe8qZl2rXHUwMDEzXHUwMDE5x0PCOyO0goHGqnQ6vlx1MDAwM9/EXHUwMDAzt6DXYPi/fGu1b1xy3+9bLciv40D/Kt+q5o43MJwuzDlNXHUwMDBid63cV/DTR/OjXFzrfD3lz/Ksit6Hb23sqzhcdTAwMGJaXHUwMDEzN420XlxijVxivYBcclx1MDAxN77KZSDcrKr1PN5dJtX9XHUwMDBicq7Xp4FS58r9vVx1MDAxMFxcfoaUYqXvzFx1MDAwNUvAXT5S3MhcdTAwMTBcclx1MDAxYilcdTAwMWWWd62LQ838YymktsKFxFx1MDAwZVx1MDAwYna+0jxcdTAwMTD9dHo8XHUwMDE5a3/0+Wjr1dh8XHUwMDFhXHUwMDFkXHUwMDFm91ovXHUwMDFljqebXHUwMDEziCrhODCex0JpeIBQXHUwMDFhz1x0JpeBx5h4l1x1MDAxNanWgG3E6GDM4Fx1MDAxY77Z/Fx1MDAwMCypU7bYgfFcdTAwMDP2eVx1MDAxZj/fer92uqnt5/3na+J99/OuOPlQsLJcdTAwMTlMv3rlLlI031x1MDAxN+a+XXuyet9cdTAwMWK86XcuJnxtPd/deTV+fTjc+PN16Fx1MDAwZVx1MDAwNjvL7f6XWY41k5c+r1WKnsdfgfhcdTAwMWGeXG6nSlx1MDAwMax2MfNcdTAwMWNjXHJi76MsbKJfXHK/MVx1MDAwMa5cdTAwMTLE2nM2p5BcdTAwMTXp08Cpolx1MDAxY1x1MDAwMK0ssMIpeY2N3mIuz2TUOlx1MDAxY1x1MDAwZlsjrNnD8T635VnDXHUwMDA18CzlgzB2tqw2t7S5uFx1MDAwMMdcdTAwMTg9z2u/zSCxW6ah945efzRHr99cdTAwMWXGzeXO6N2qfHXw7kvTdPHD8kXXXHUwMDE4aPVdzlx1MDAxOGjF6D74+0xcIvxcdTAwMDct5Im2urTfqTmZz4M4Rlx1MDAxM4wvXHUwMDBleZ7WXHUwMDBlaM64XHIusIDX2Yox0Deb3fdPM8dcdTAwMWLM74N3XHUwMDE0NrAgu8rw1ExKaWp4XHUwMDEyXHUwMDBiXHUwMDE0iyNcdTAwMGJcdTAwMWXOXHUwMDA0P1x1MDAwMtbSWlx1MDAwN9+Gh7p0OTqnsLA/bIZfXHLsVSHvdTeyXHUwMDE4LL7eJ12b71x1MDAwMHxmPO1cdTAwMTbkU1x1MDAxNE9HvVx1MDAxY4HDc9eFMjEoo+MsXHUwMDBlg1Naza5A5lx1MDAwYlx1MDAxOTBWWLpQXHUwMDE5h8GH/Fx1MDAxNIbiIM9fhn++hlPDXHUwMDFmfTdcdTAwMGUjXHUwMDFhhvFcdTAwMTXr5lx1MDAxYU6dQXxcdTAwMTaKx1x1MDAwNvzN0lx1MDAxZHNcdTAwMTWVPzMqOpU2g9lcdTAwMGLLdVxcXHUwMDFmyC5cdTAwMTVzXHUwMDFkynqPxbFcdTAwMWHWalxc8cjhi8SBIdX1VmvQMFx1MDAxNlx1MDAwZsaimFx1MDAwNaWRr3V8S0mmw1x1MDAxOCl54rKNXHUwMDBlf1xys9f7nVnjmdzFLVJcdTAwMWL/uljUR63hcHNcdTAwMDKdvbr3R8e97snjysCaPyR0+bXRy3Rz8/zrX3/9f1xmJ4VPIn0= + + + + + EDGE NODE ON RESOURCE PROVIDER1. Node with exposed service at the edge of HPC clusterVirtual KubeletInterlink API ServerProvider pluginPod on virtual nodeVirtual NodeHTTP + Authunix socketPodContainersBatchSystemOIDCOIDC Identity Provider \ No newline at end of file diff --git a/docs/static/img/scenario-1_light.svg b/docs/static/img/scenario-1_light.svg new file mode 100644 index 00000000..a517f3b1 --- /dev/null +++ b/docs/static/img/scenario-1_light.svg @@ -0,0 +1,13 @@ + + + eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO19WVdcdTAwMWJZ0u17/1xulu/jLfI789BvXHUwMDE4T3jAlClcdTAwMWLbt79VS0hcdTAwMDJkXHUwMDA0kiUxuVf997t3MihPKkUmWGBcXGWqy+1CUigzT0TsXHUwMDFkcVwi4vz3X0tLjyZnw+6jfy896p62W/1eZ9Q6efRcdTAwMWJ/f9xcdTAwMWSNe4NDvKTy/1x1MDAxZVx1MDAwZo5G7fyde5PJcPzv//mf1nCYTT+VtVx1MDAwN1x1MDAwN+ef7Pa7XHUwMDA33cPJXHUwMDE47/1/+O+lpf/mf+KVXoefX/lcdTAwMWPl9mjzY+tl/9v41WdcdTAwMTFcdTAwMDabvZX8o/mbLi9o1G1PWoe7/e70pVP8XmrhM+GtMdaKqL2yVy+f8WWhVSZcXJB4i9JaiXD18kmvM9nDW4xwmbDGXHUwMDA1P/3oXre3uzfhzfqQOa2CVFbkP+7qPedcdTAwMTfz7yVx9ZvxZDTY765cdTAwMGX6g1x1MDAxMa/4/+yI0Fx1MDAxNmJ6vdut9v7uaHB02Cm8Z6fbjnH6np1ev785Ocsl4yHjYT4qyd+6uG5Z+v28T+FcdTAwMGJ391x1MDAwZbvjcfKZwbDV7k3OXHUwMDFm0fRcdTAwMGV4dcO1Tr5W/zu9plHroLvGxTo86vevft077HS5XHUwMDA0j7aLN5nf38XXXa70dFx1MDAxOfXFb/6aXny328lcdTAwMWa0j8Jf/XaqbtqF8m/XXHUwMDA3h7nqRVx1MDAxN72QXCJOr2j8XHUwMDA02jbJXHUwMDA17rT64+700fOqnpY1saiNibJNuqeTq1sq6OrXXHUwMDE3Zufj20396s1cdTAwMWZ7W8OTbW93O38+unrfX1x1MDAxN3+bPrqjYad1fj3SK2dcdTAwMWTuxoYwXYZ+73C//Fxc+4P2/vRcdTAwMTb+VXhcXCXLqb6aXHUwMDE5y0lu5sJonM2sV0E7ZZ0xKpSNxtdcdTAwMTiNXG5cdTAwMTFGXHUwMDEzo3BC2GCjmTVcdTAwMWQr7tNU9lrtvaNR92cwXHUwMDE2WW0sydsvrFx1MDAwMutcdTAwMTN9XGLGVlx1MDAxOIbyap5hSG9s8EZHf1x1MDAwYtNIruP79XeqjlRDPICnT54/XVp/++Tp0tv1pXdPN9++f7f6dOk/h1x1MDAxYu/eflh78vRdYYFcdTAwMDeHk83eN96RXHUwMDEyyW+ftVx1MDAwZXp9rodNxK/0e7t8NI/auJfu6FHx+Ux6gKarN0xcdTAwMDbD6attSGz1XHUwMDBlu6O1JoA0XHUwMDE49XZ7h63+XHUwMDFm197P7N20jiaDd93x+f1MRkfd4kPsvrg0XHUwMDFimSlbafPXXHUwMDAwYUEp7IyqXFwqhZIqOlx1MDAxN5yLVUrZetRAVc7djtNcdTAwMWJff4/t10+fd549V09aoydbrf5DQbBZV8NcdTAwMWK03mRKO22iMULA+yX+LsKZ4SVtZ9xd2U3JLv+53k21bCfs7Ezfc+kybTBcdTAwMTm+XHUwMDFiLvOcS0zv5MplXHUwMDFhpTLpI6iIifnP1K1eOFx1MDAwNKmMcV44q2/nhm6KzjO4eefQ1kjN9axHvPJ9VkvrXHUwMDFjnmCVmm83V/Ozky9n4fnqyccj8eXrwejV23cv/vzj4aBPtaL7IDItnHMyVii6XHUwMDA0z81cdTAwMDJ03FxiZaP0/k5cdTAwMTRdm5CBjmupKlxitTQ6s9piidS5jvuyilx1MDAwNyGM0bJw6X9TXHJPeVlBue1cXGB31kBcdTAwMDdC0FW63W6u299cdTAwMGVf/bn/XndG708/nJ6tvX+/uv3m7KHrtlVcdTAwMGWqXHUwMDEzXHUwMDEx5lx1MDAwNa1UXGIpaY1aZNFqXHUwMDExrPRU/ztRbe9xXHQ+XHUwMDA24aSJYL5xVsG1LSu0Q2iDy1Xx+1x1MDAxNTp5obHmeq29Nz7eirZcdTAwMTVJWEh+O4eE8Vx1MDAwMcpsaX3Q6S6d9CZ7S93T4WDc7SyNu6PjXru71JosTfa6S93ObndpsLP0YmN1qd0/XHUwMDFhJ4RtYWwuucUydfvuy7xcdTAwMTdOXHUwMDA3Zz1cdTAwMTfsonfgXHUwMDAzskj0p1x1MDAwZaHT3CFMTv54XHUwMDFkn339+Pq53Fx1MDAxZO+vXHUwMDE5uXvwaeuhO4QgdFx1MDAxNoFcdTAwMTTzwC7azPP52LtcdTAwMDQ7IbOYo8NcXFZn8Y6o5Fx1MDAxNakruKZzXHUwMDA34Vx1MDAxMY+bIOKP4nRXn7lRLmR39GJt/YWfXGLZds86wk6ef42PXHUwMDBiuZDfqsWef1j8vjFcdTAwMWO+23+zubJ3XCJWXHUwMDFlt7efb5x9Sb/l8vtbo9HgpKncOFx1MDAxY+ndk9PVXHUwMDBmXHUwMDFmV/Xvbbf1QlxmnjxuJvfib/eUu6l+elP/Nzd3XHUwMDAz8M+8hupbq51SPqZKXHUwMDBmrc+UR1x1MDAxOFxieEqU/lJhpVGZZuYmXG7rnSwkXHUwMDExpklPe43hzVx1MDAxOE/0sq3+XHUwMDE5mZvOh+apm2BUhF8yU6OeevRcdTAwMDJcdTAwMTKXXHUwMDFjelxiXHUwMDExzFx1MDAxN1x1MDAxZa2B577vxM2H3mhy1OovvTra5lx1MDAxNd1Lnuag1+lcdTAwMTRRsZSqqYGtMt7PvYNF4TjfXVx1MDAwNeEhinkrLoWSXCJE2GqVxnWbQ/hK7P/+bfJ4f//FRm/txfrxpndhXHUwMDFlp2+PXHUwMDA24/HyXmvS3vvxMO7g0aQwTntrlHCi5NGEXGaZkyD11oiofMGgbuOKtHLtrp3FcalcIoJWRFx1MDAxNyYo6YHHXHUwMDE1oauyWVx1MDAxNC5GJ61cZipcdTAwMTSw/jI7XHUwMDAzlu1EwJ1UupopNo9emr2dz19enk2Oevth6+zw9+HXzVx1MDAwMkw9ev9p7UtP7Dw9XHUwMDFjPH+3tr4+7i6//fb+XHUwMDEyrO4hZPguhzGetEaTx9Di3uFu+SPdw86cV/qt8WR1cHDQm+AyNlx1MDAwNr3DyYxnpdxcdTAwMTXC9l63NXPTkDz3tSHFpWsw/dvSVFx1MDAxZvP/uPr7//62gHcv61xm4ZcyJmqD/1x1MDAwNyq75PNcdTAwMTlcdTAwMDA9XHUwMDA246VcbkpHo0OtQFx1MDAxMzKrYjTRwcLhPXxRnlJQY6H4TS5cbm3cfYtcdTAwMDPbRaCOd9tcdTAwMTiksMIm4kxcdTAwMDaeXHUwMDBiXHUwMDAz0SriO52uXHUwMDE3XHUwMDA331x1MDAwMI5cdTAwMGaKLH1ApGNcdTAwMTJxIVPGwVx1MDAxZSFP4fJkrThn4MKtNNb5XHUwMDEwrDChKFx1MDAwZcG9U9xcdTAwMDdWIEfG+vqlWLw4rYP3XHUwMDExXGZcdTAwMDAuxiU3XHUwMDFiRCZcZlx1MDAxNMlcdTAwMDNMPJhdvTSdXHRcdTAwMWRcdTAwMTD9RKVMiMm1weXil1pcdTAwMTmEJVoqUy9MZVx1MDAxNjdiLdxekMH6kjSwSWu9tPiuqFW9UchMK0REykXtXHUwMDExwenkViXUzoPaXG6pJC7fqfqbXbhA6JYmf5POc+cg2pBcbrSZgMHihqHF1Pd6gSazXHUwMDAxXHUwMDE3J5jh10basrxcdTAwMTRb6uThXHUwMDAzWFRcdTAwMWI0kdNcblxcwzXy6rVl0eJcdTAwMTCFwKE556BcdTAwMGXBXHUwMDE1djKunlx1MDAxZb5cdTAwMDSaLGg8oVb/tMrghISDR/EyKjGzui5Kg6v28KPC1i5cdTAwMDZMw2BprcTHYFx1MDAwNr5sXHUwMDFiXHUwMDAxLMTSaytowP1cbrPgQlbCacDcYOW+5Fx1MDAwMoyWxiltXHUwMDAznLWOXHKkXHRcdTAwMDRcdTAwMTNG5Kym5Fx1MDAwM+ifYP5cdTAwMGWsXHRr5Vxc7bXZPN1cIlx1MDAwM/BcZmtcdTAwMDAjKvliXHUwMDE5oT7AMVx1MDAxOVx1MDAwMCbR3rc4qFxi9EPDg1x1MDAwMk9h5WXkQbSrqFwi8NRYqFpvbKDCXHUwMDBlrlx1MDAxOF+udVx1MDAxNCpcdTAwMTWHIDpKXHUwMDBidbNcdTAwMGXr4VxcrUWYTGJcdTAwMTGwfLhcdTAwMTdn4YJmaFx1MDAwMGJ6fFx1MDAxNcVhwWrtf9Hyllx0L3lcdTAwMWRcdTAwMTS8XHUwMDFl1EHBVyVcIpcl31x1MDAxMDT+XHUwMDA1XG6A5lx1MDAxYd1dlrX3PY8t/av4/zeNp2jrc1x1MDAwMyqm51x1MDAxZP4sxNDTgGqneUC1Nd58az6vrHftk6O1/uNcdTAwMGZxS/rfXHUwMDFm9j73eSil6T5KUcxFXY/JXHUwMDFjIFx1MDAxMvZOzS1cdTAwMTSz3S6rU5FcdTAwMGaNsLOgPVNcdTAwMWZcdTAwMGV+ulwiXHUwMDFkXHUwMDFhNbfBNXTXRi1cdTAwMTDQzURRcJTAXHUwMDA17avzoVcq9CtI+vtcdTAwMDRJMoPTXHUwMDAxXHUwMDEwwJFcdTAwMDZQZkRcYqk3i9abIGn2XHUwMDAwXHUwMDBiqWvBYFx1MDAxOYzAOiHhXHUwMDFkoWdw4TZhXGZUQVx1MDAwMWORWmisYmxcdTAwMTDX1Fx09Fx1MDAwZWCF+N/qgODGfv9cdTAwMTXeQiBcdTAwMThcdTAwMTfwSuJcdTAwMTNMXHUwMDAx61x1MDAwNO1cdTAwMWT4MXxi8Fx1MDAwMp6bYUlcdTAwMDN5XHUwMDAyolx1MDAxNFx1MDAxOD94XHUwMDFmiJxLXHUwMDE5q8wrajTJNCSbRlx1MDAwMkNcdTAwMDTiwzVcdTAwMTlng1x0psTiMjBPXHJcYqL940Lr4yWVRTxBxtX0dTYkSiPxXGKB9VwiXHUwMDA07lx1MDAwZeFp1EPgouX5LHAphGXhXHUwMDE1o+FEXHUwMDFl4lx1MDAwMU39g0gv4G/rgzA8XCJP1+pcdTAwMTGIg1x1MDAxOUWVXqAjQIPl4bvAXHUwMDFlXHUwMDAx0/VcdTAwMDJ9hlxiXHUwMDEwi8FlXHUwMDE03qlEXHUwMDFlo+tcdTAwMThBwLSJXHUwMDE2MUl9tK5kXHUwMDA2/uA9XHUwMDAyVFx1MDAxMC3Eglx0Z5JcdTAwMTm03XtcdTAwMTVcZt5cdTAwMDAu3MDoXHUwMDEwlYCGaIu3e1x1MDAxYUFyw+B0oNZcdTAwMGXvXHUwMDAwXlx1MDAwMHN0XHUwMDAzXHUwMDE1dJnBWihcdTAwMDYz/CMxXHUwMDExXHUwMDA1Qlxuhlxi/FxmXnKd6+PYhctcdTAwMGIsvFx1MDAwNVx1MDAwYtNcdTAwMDFLaZxXJYHeQo+MXHUwMDE2gbZZy/9cdTAwMTlcdTAwMTZD/Vx1MDAxOIGARHtn07hdIZ7weLjgXG6K+df68GRZI9ihXHUwMDE5QFx1MDAwMSNcdTAwMGItTEljXHUwMDAwh/BpzoKD6OjrNVx1MDAxMIxcdTAwMDQqK5RcdTAwMTDeSlx1MDAxMFx1MDAxY12Sx11cXFx1MDAwNlWRil+vMItcdTAwMTaHsNdaPCPpsFx1MDAxY16VomKPICBcIjRAXGKDh1hcdTAwMWZALWteXHUwMDAxQi1cdTAwMGJcdTAwMWZcdTAwMDJfXHUwMDE3y5dcdTAwMDcwXG4+391z+K5cdTAwMDZZj1x1MDAwMFx1MDAwYlx1MDAwMCaypFx1MDAwYkGh0eXVXHJcdTAwMGXPgVx1MDAxMZGF0tSL88yBw6CYQUFcYjVcdTAwMTPycE9cdTAwMGL0XHUwMDBlT1x1MDAxNo6tweU5hCFGXHUwMDAwyGCeuKdyalx1MDAxMXqEXGLFXHUwMDA3xoCx3t0vWlx1MDAxY8mwxa1cInSH70gzRvAtsFx1MDAxOVx1MDAwZqdcYu+CXHUwMDE1aSBOZDZcdTAwMDbGqnB+MIPUcl1cdTAwMTbPk6g+eOhMg4xcdTAwMWLkXHUwMDAxOCyzr1hcdHysnPo0kWVyXHUwMDExYahSoFx1MDAwZvW+JWZcYlxmLPmE4Fx1MDAxNqNIrzBm+DWWNk/XMDtz/1x1MDAwMpnlUVA9J8gpbOr8sFxcUWvCXHUwMDBiWFtskK7gXHUwMDAyXHUwMDAzi5jgZOZcdTAwMWQ+uCjOXGLWbYDZMJBcdTAwMDVcdTAwMTA3IFjwXHUwMDA2XHUwMDAy/iN4R1x1MDAwNyOmNWa5PM90XHUwMDAxeYtcdTAwMTZcdTAwMDZg1Uz/XHUwMDAy7ldJXHUwMDBi8lx1MDAxN1M2ZDXoYcRvLf7R4Fx0XHJu12Z4OFx1MDAwZYaOlVx1MDAwMFx1MDAxM3AleVx1MDAxMTZcdTAwMGLKQN9cIppkVFx1MDAxNyxcdTAwMGVcdTAwMTZcdTAwMDDXXHUwMDA28IdnM6VtXHUwMDA2azNcdTAwMTghOCvcMnOu9apiJK6OVFx1MDAwN1x1MDAwNo/lc2VxcHjMVbs8XdZgT8WAXGKBOVx1MDAxYlx1MDAwYl31pWSKdbg6UjXvoJyhyZ5cbu5cdTAwMDeoXHUwMDFm4JJcdTAwMWQuJHUtXHUwMDEwpyX4XHUwMDE5XoHHXG66kThW74NmXHUwMDAwybmd8LDEuYycXHUwMDFkWlx1MDAxZsBcdTAwMTWlL4tjvs1FwFx1MDAxMLyZaGC2sCTgoLdRkZKE0uV5KJ6B23agzVKqXHUwMDA2muKoqlxuulwisHygLElUJDJ8XHUwMDEzliiA/UaQrnovXHUwMDAweVx1MDAxZWZcdTAwMGJcYlx1MDAwN9JAXHUwMDFk0tQ2XHUwMDA0srBcdTAwMDaMXHUwMDE0QVx1MDAwMpG8wf2S5DJcdTAwMGU1XHUwMDAwXHJoWeL1XHUwMDFjXHUwMDE4NbyeZ1JcdTAwMDQoXHUwMDA0PGiiy4jxwPVcZjwv4CtccjsgkLG0cPhcIpZcdTAwMDE1iKWNJlx1MDAwYkLU44VcdTAwMDNcdPdcdTAwMGKQXHUwMDA3XHUwMDFmwC0xgII3KVx1MDAwYoI8wy1cdTAwMWNcdTAwMDV25FxyXHUwMDAy4HtcdTAwMTcnspzCsv1cdTAwMDJxbeluXHUwMDA1Q1x1MDAwZTiqXHUwMDE4sMxNnJ6Ak1x1MDAwNCZoR0qaXFyajYigmbBG+CVcdTAwMTHVNdg1Q8hcYj5cdTAwMDBcdTAwMDJcdDDzQpXFXHUwMDAx7ExeiFxiuFxiXHLCP5B5UEfPkmrNqNGV5OGJ4luAXHUwMDAyXGLLRYNgY8HiRO7iibdeXHUwMDAwMUp6XGarsZbFUiyE87ZBbOV5eXmRh45w9unKepF5QJ1UwYI/ilx1MDAwNslcdTAwMDdcdTAwMDU+YjVA32NBpDKJ3XpcdTAwMGI36jTjU4svbWBcdTAwMTWIJnBcdTAwMTeOXHUwMDA1YFDmKEqbNey3xCV7vlx1MDAwMupRL47RO/yQ5Vx1MDAwNibgq7yRJFx1MDAwMsBWMbp3scHu5eLFXHR4SFx1MDAxMFx1MDAxY2mZXHUwMDAz84muXHUwMDA0OD1EuVx1MDAwNtRcdTAwMWOeVtXfLENcdTAwMWRcdTAwMDNSzTRB1Mqb9PJcdTAwMWM3wllcdTAwMDCPP41s8PCUzFg/XHSyXHUwMDAy9Vx1MDAwYsGn5Cdwb1xuZMZr8DZymia6olxms302kq1cdTAwMTTqtS/kRTB4b1x1MDAxNPOAXGLXfoQ8aLCW2nBcdTAwMTfTWpXoXlx1MDAxNFx1MDAxOdiPZ1Ypgus1SUXy+nSQhmlcdTAwMDeWliS2XHUwMDExsbzkRSCQQlx1MDAwMklcdTAwMWLllXInXG6mrLHKJt3bi7h6qFx0iFx1MDAxZb1cdTAwMGY8c736xYx7z560XHUwMDA0qJbmqWY2KJqIY4aFgTO9m4ulq0NY6OG+glx1MDAwMjOI9Xeb21x1MDAxYaNPXHUwMDA27oJAU5JcdTAwMDdcXIJEZmRcdTAwMWLQKWYpoFx1MDAwYlx1MDAwZTZcdTAwMWJcdTAwMDTUXCItoYl5XHUwMDFhN8KLsu3K1u/EU1x1MDAxZfBcdTAwMDU+yFx1MDAxOWAu7F6XdFx1MDAwNTbBWDB6+opcdTAwMDZ3u2h5LlN0ucZcdTAwMGKQWyd92TaEXHUwMDA3k4FcdTAwMTbD3atcdTAwMDZJXGZcdE9OXHUwMDFkIWowV5tcdTAwMTb5XHUwMDA0wJBcdTAwMDJblVwi4iFcdTAwMDZX71x1MDAwYiSiUtyqNlx1MDAwZTQ7MFxylci7LMyJpCyhifJRXVx1MDAxOaRcdTAwMDH2aXBJlFx1MDAxYvJdXHUwMDA2p6nqtO56WJPc2Vx1MDAwNlW2bFx1MDAxYsLnSp5cdTAwMWVsjz5cdTAwMDVxKcHXNzC1XHUwMDA1y3NMSktunFBt4fNt+fHBXTPwXHUwMDBiXGJcdTAwMWbqWUaeZFx1MDAwMYYz8lR4RjJNOrB8XHUwMDAzIYOialx1MDAwMvbqQz9ET1x1MDAxZSvBbDlUzOlyMVxiy9jA0jRcdTAwMTbZ16dH8fAsXCJccnwxnLJQprS4N4RJaopDXHUwMDFjppiAXHUwMDA0ekRVVlx1MDAxNWOMY4FcdTAwMTmgw9dubyxanGHyXHUwMDEx/lODqMNLXHUwMDA1U3p0oOJcdTAwMWUqXGZQbrA3RC9cdTAwMDD8jsztsYYjlJ1cdTAwMDC+h/ZcdTAwMDK7cfXkjD5cbrzWXCLw057J7bKPMtGwXlx1MDAwMlx1MDAwMOVcdTAwMDFpXHLEcdGY+IFRXHUwMDFhacvwKIOh9eO1XHUwMDE461x1MDAxZtxipVx1MDAwMXxcdTAwMWO3tY2E3TqbljNFNo84zVx1MDAxYYKgPFx1MDAxNrdWXHUwMDFjaD9UXHUwMDFlXHUwMDExNlx1MDAxNlx1MDAxNYgrS9JcdTAwMDBuiFmA2lx1MDAxYV6+1rrAK/LNNISh+X6LKmNZhMIh9NCM3uqrS0lTVFx1MDAxZVx1MDAxZDpgs4oylMR5WF6+XHUwMDFiyLRzrZaQRSFYJ9GEuzUlXHUwMDFhwMZseECGRlx1MDAwZcpUX+CHi0NcdTAwMDTKWEVbLIYpaXBcdTAwMDDdRpjHfLipj1x1MDAxZMlojTReXHUwMDFhOFx1MDAxMbi5Mp81XGLJoOFSMni7X2HcpoieYU2e6k75XHTwXHUwMDE1hC4wxy1Y3lkrjpFcdTAwMDWAmISfg1x1MDAxMtIkbeB2XHUwMDE4XHUwMDFjNL5PcMur3lJcdTAwMDOor2JcdTAwMGVcdTAwMTbmRc+d+jjGPUBcZpZ0ws3VYjUsXHUwMDE1JJrzdlx1MDAxMLNyQzNxI1x1MDAxZbQ9ssVcdTAwMDG0k6n9elxy0YxcdGFWMGwymlx1MDAwNFlcdTAwMTGAqnxcdTAwMGZWM0Cuz2shOsbTxSWBlUCnXFxcdTAwMWG9IzpcdTAwMDZnUYhorVx1MDAwMWmvXHUwMDBmj9mNjfU0XGbg8bhcdTAwMTNcdTAwMTVB6K7PKalkVlXWXlx1MDAxYlx1MDAxM1x1MDAwYoF8XHTxO1widFFOLIC4gkDAJ5Fk1z42ZlG4v8Z6XHUwMDEzRIPBl6Q5XHUwMDEzXHUwMDFjyDzTbVxySklcdTAwMTcsjXv4IP6KSFx1MDAwM36vStL4KCXoXHUwMDFlaFx1MDAxNGhL7YMzXCLzTHv6PPflSntIXHUwMDBlludcdTAwMThcdTAwMTRcdTAwMTg+WPilWnFcdTAwMWFYXHUwMDAyMGXRSn5H5UxbXHUwMDFlQ1xi06CgXHUwMDFjothcdTAwMTJvmJdcdTAwMDVVU2VRltX0MpDJhXpAZYZcdTAwMTK4ZEHBqcNcIt2W/uHioO8we5BMai+QuiTNSXxcciRxmll9MMx0e1RMfXtcdTAwMGZklzPpZ1xcXHUwMDE20FlbuM36XG5cdTAwMDEm21xyq0SxXHUwMDEyivmYksLhXHUwMDBiQO1cdTAwMDRzdj7UX1x1MDAxYp2IZ/V40PSLqfrCl+Y0XHUwMDE2ZFx1MDAxME+j3ofk14bbXHUwMDAwkUecVEq0Q1x1MDAxYeuScLfUOF2/XHUwMDAzhedcdTAwMDb+o1x1MDAxMaXDVp3zvrzHXHUwMDAzfXQs32a6olx1MDAxZVDzLVx1MDAxZe7+R9hcdTAwMTVrZErSXHUwMDE0Y1x0XHUwMDE2doGh14c1xmTchKSSsOrLzew/XHQyaSCQZlx1MDAxN9w9S5N51YnO/Vx1MDAxMnxIqlwibFxmgJOHXHUwMDFlWptvNjRwcexxhatg9Mbdl5I8KXTePkSWXHUwMDE3XHUwMDFhgIPNPHwsXHUwMDFjUmCnS5zZp1x1MDAwNKfQeek3qGN9zVx1MDAwN3dlWUAnc8ftYiyJc3ntXHUwMDAzPD58fT2JW7g0PmjBXHUwMDFhXHJthU90jlx1MDAxYtCKSTXcK/NcdTAwMTH19WR5sVxmLJX7XHRCXHSrk5XgXHUwMDA2Ob9cYsCrgFx1MDAxZvWNaZy0XHUwMDE5rYeriIKJ9lx1MDAwNPN56dxcIlx1MDAxNFx1MDAwZUSFpVC1V6eAdqBcdNws9i5vjfstfVx1MDAxNdG9xoVcdTAwMDO+XCIoTj3Bidn5vEKEo6DTdqaVjFxcOzCjXG6X0qjDZZHiNGNITeT0hOJy8VxiXHUwMDFlXHUwMDE4O408XGY6NOivXCIpXHUwMDExrMN2mlmDtHeJpS2ej1x1MDAxNjhcdTAwMTFcdTAwMTD+Nrg4lzEkXHUwMDBm3OFcdTAwMTVsO0jEKXJcZsvxnWTc9b5Oe3a5cT+HwUu61a7yXCJWgUhcZmE0iXD9rS5WWsicol6x6NaKlGkya1x1MDAxY7xkpaFlJU99clx1MDAwZeK48ShVIFx1MDAxOEtVrveyzGmCTSmjXHUwMDE4YDS4V1x0lII+IVx1MDAxZVx1MDAwMekvV6MxQonMXHUwMDA0XHUwMDA1w4RQk2XlPqZEKFx1MDAxN50sSzMsMlQycphkXHUwMDAz60e8kT+XPE1cdTAwMDbMNiVxmuk1w399k1BcdTAwMWacP7K+UMKOYEVOllx1MDAxZZ2g+lx1MDAxYVx1MDAwNixcYlxy6q9cdTAwMGVcdTAwMTGEXHUwMDA36GBt8b9cdTAwMThT0OFKYJmwXHUwMDE2LDxiNfO9y1x1MDAwM1x1MDAwYmTZXHUwMDEwwMLAMl2YqeRj1pO7zlx1MDAxMm6iPmud15HCXFzhilx1MDAxMaSrUlx1MDAwNVxu60ixTkzZMeDWXHLSXHUwMDA3IE9s0Vx1MDAxMsRcdTAwMDOYhpwpdDVwXHUwMDAxwWp2nNbX4bKul1x1MDAxM3vgUaCnLHcsOSju+ELJZVxmLPSrXd6Fy2MtXHUwMDFmjImZZNZcdTAwMTOm4Vx0l4Pmj5dcdTAwMTDDwzHWiZMgNYicXHUwMDEx0ll6cZlmwWBcdTAwMWKKXHRwXHUwMDEzQ74xXa8tLFx1MDAxY3CAXHUwMDFlWFx1MDAxNFx1MDAxOVKaUpdAWrhcdTAwMDHL2lx1MDAwNYJ6PWtXXHUwMDE5XHUwMDAyXHUwMDFk4cGIXHUwMDEx3Vx1MDAwNcTRqSdApFx1MDAwNlx1MDAxZcBdeDZcdTAwMTVZWf/0XHUwMDAwV5aNylBcdTAwMTZcXKBIU+p5nT88LHxcdTAwMGJbXHUwMDAwXHUwMDFhXHUwMDE0XHUwMDFks1x1MDAxMYFxk2HdXHUwMDFkQq40imUjXHUwMDAyXFwse6xBK9naVy8v7+zlJrtjeiStXGLKuO1ic+uIXHJoQFx1MDAwNl9nmVx1MDAxOYHae5fuRuDJ4ZusXHUwMDAy9SNcdTAwMWZz9cVANeLob4Bzno1cdTAwMTdYkPtcdTAwMTYnXHUwMDE5XFwyUctcdTAwMWFqhP9pco1cdTAwMDWV3rOMXHRcdTAwMTRcdTAwMTTkvtHmXHUwMDBiq41xXHUwMDE5cEFYYDz1VKBgaSFdospcdTAwMDfYqfrtybtpN1x1MDAxNNPmnHK7oeYuk9aictzobvNuQ7H25WXrRfw2fNs7XG6Ptzs93Vx1MDAxN29+ivEtPmY5yOm84l+UZ4kzQuSANs9u1WC/r+dw7vhcdTAwMTZcdTAwMDTcLuQ7XHUwMDEziFx1MDAwMlx1MDAwYmOvptNb8Fx1MDAwZfg4XmTgSLiZuaOsXHUwMDFhXHUwMDE33Fx1MDAwN6+e03ilSr/aXHUwMDBlXHUwMDFmcNvhMmvG4LjzST6sIU0zz5d771xiVZhPdlxyulx1MDAwNCDQS3Juxao1IYy7RmCTMrSFXHUwMDBiRJCDXHUwMDAwh/28oGYstk3kldW+Vlx1MDAxYzNcdTAwMTaMpqzL9zXSjKC0eTFcdTAwMGLxzIo8bVxcK2+eafKHJW9cdTAwMWXLoMCMPGdPNCiTW7C4fFx1MDAwYofhXHUwMDEym1x1MDAwYpjOTSFSXCLgZl2g40LVJ9zZ4+hB5FgllVx1MDAwZnws9bGyRolcdTAwMTM72Y1cdTAwMDVQadSVL6jRjEhcdTAwMDNnX4RSqJFpXrxnUz6bc4ztLtdnfu5cbiXnXHUwMDBlKmVcdTAwMGJcdTAwMWN7XHUwMDE2K1x1MDAwN1x1MDAxN+/dYMjZYF1cdTAwMGZbQ386Ontcbu88Wn45ls9+XG6UXGZcdTAwMGVBXGJcdTAwMTSD8ZZcZq485FxmKFx0xlx1MDAwNFx1MDAwMo5w293RiDPH4fJcYvhYXG5cdTAwMDRmVXXeXHKtXHUwMDBiXHUwMDEwI1x1MDAxZLPG4FxcaqY7P3L2XHUwMDEwi/Z+oeRPi5I3e3fIXHUwMDEw5VwiLGRxPVvW07a7XGZOiYO5XHUwMDEwLmkjZH2VxHw15I9n8b3n+lx1MDAwNSvpk+vEMbaXrKtcdTAwMTA2L9FLxzRcdTAwMTGuhEMsbySTSPVcdTAwMDHYgsWpjL2wllxy3uxcdTAwMWMyaYp91tpqXHUwMDFmXHUwMDFln1x1MDAxZDtcdTAwMTPyYVtwqL50fVx1MDAxY/XD/Vx1MDAwZVx1MDAxN4I2XHKAXHUwMDAwj1txdJmWlmO9VLlFXVwijFx1MDAxN8wxcExCLVx1MDAxN7krXFxx5V9PXHUwMDBmNVx1MDAwMdJyP2/qy1xuwNJrXHUwMDBlLI/N6LNeW18zn5+dbmnn9ejN+NtPXHUwMDAxLKx/gHFyXHUwMDAziXOup375/PNcdTAwMGXmy1Q1O4FNYazXYqHF5p1cdTAwMWbWcC5QjD5WXGbGZ35cdTAwMWFuJJKZkazOjME2UjDh5uuGZ/5CloeLLKDTLJbVLs/tcVx1MDAwN7z4cWgqXGKQziekgqnWbyqUxKl0XHUwMDAzJWasi7OOlZeCRTb3LVx1MDAwZeTbh3ycUmRy15XzkoHdPNw0g8I06NCOmWPNv2c9l4JcdTAwMTmlaVOdXHUwMDFmRKiF87h812B6RlwiLpb3siCOL+JZXHUwMDA0mC1QoE7cMpP8Nlx1MDAxZsfBYZxGp002uXlcdTAwMWImsFlLXHUwMDE5mzR63oFAXHUwMDAz5DPRSIdbiyFtXHUwMDEzXHRcdTAwMWPVodhccqjyXHUwMDEyqlrtXHUwMDEzeY9cdTAwMTJiZsOJVqzoTOd7LF+8wbm8YVZAXHUwMDEzYn3O844gcm6CUlFcdTAwMDGMqVx1MDAwNMgvzVx1MDAwMXLydu3levfV+vHkZPLqcK+18+zDmftcdTAwMTlcdTAwMDDSXHUwMDBibp9rTpCVQU5cdTAwMWLFp/jInLbmiUWF+HXR6GiY01HCkNtOK49SdOShfWBg0HQlXFxcdTAwMDGoL/KTgvlcdTAwMDTj5S98/Hnx8Wbvhj9zOq9Gy4upfcr2ecpcdTAwMTbQhTWKkUXgXHJGUHJ2XG7HXHUwMDA3s6VKuVx1MDAxOXebKmCtu41MWSDky/fSvEvr3Vx0MDJcdTAwMWaOzFlfcEL1ua6SPFtcdTAwMDYsa9nEkHf43fjivk9cdTAwMTj3XHUwMDE4g1x1MDAwMK5Idlx1MDAxN0mRJpUlXHUwMDE4Nlx1MDAwN1x1MDAxZnNOXHUwMDEw9/DrxVx0zsjOx65cbqO1LfVcdTAwMWRg1Vx1MDAwMzdcXC1Zsoj1IzYz3CdcdTAwMGaYUd57mU9cZvktfVlz5lx1MDAxMVusjGLH1Fx1MDAwM9xGY9+wXG5zYGr/XHUwMDA2QzvXzPH65+fi+WhjXHUwMDEy14fH/YP+45WfXHUwMDAxplxcXHUwMDEwXHUwMDE5XHUwMDAyuHxcXFxidGMmQeiBU6BDjlx1MDAwN8DBgq85zeg7kCqyPYKDvKFKpEhcdTAwMTVAda6dzFpcdTAwMDQ2XHUwMDAziFmcUkFcdTAwMWFdPNjvXHUwMDE3TF1cbvtZYMqwKDxyXHUwMDFin4PrdFqvsizZXHUwMDEzQ1x1MDAxZOVEvnxSY3e5vnjNgyyrXGJcdTAwMWHEMnhR6qRhOVx1MDAxNTxcdTAwMTS8q7JcdTAwMWOeVJ9cdGNPv1x1MDAwZk5ohFx1MDAwZTzGqJRFZPmB5NQnlvHUQ6PKpOb2ST6rivtHXHQ2lnW+wbZS5lx1MDAwMydJxrzyl0nD6y6vyWRK2CNcdTAwMWJgOIuMvW/+mqf3g2Yyi/lnXHUwMDBmXHUwMDA3YFx1MDAxZNM+Vc6939y5byy/PJVH72T/zejZq4PuR1x1MDAxMJXD1k/h3KPJeD6E9uyJ1dPW1suT6kTGI1mDXG4sXHUwMDE1MndcdTAwMTSGuIxccuqsuYdcdTAwMWWDxVSFITxiXHUwMDEzYWye7VxyplwiXG7JT4VcdTAwMGZ6zvGsv9z7z+Deb/huTmDg1DbojVRsoUl9T9AsRDRcdTAwMWNcdTAwMTLrfGxcdTAwMDJcdTAwMDWSg1vzIXrkubI0+T9jgoZeU3BXvkGP5mKl8aRcdTAwMTA4WDZcdTAwMWJC/0tz7/LjX+GBTeR36fr9XHUwMDFhwVx1MDAxMYScXHUwMDExXHUwMDFh87NcdTAwMDLS3i+8XG4z01x1MDAxY1x1MDAwN1x1MDAxOVx1MDAxNXG2Vlx1MDAxZUCUK0CoYu2IK6dcYpnPwzJcdTAwMTjByspcdTAwMDbHarBPiO1fPCOA0VAqr+xcZlx1MDAxYcCUYCeJod157kCVQZ57TDykwbJcdTAwMTi/yWCaRVx1MDAwYuRgXHUwMDFmrIbK9zJcdTAwMTWbyZM7znKE95wugVWz9dUy5djLhbRcdTAwMDNU5IXqilEmJ1nZJp0qd1x1MDAwNc9zj0xwkYNOna/E54Pm+Hxw+nV15+1rtbr/eHly8Hx/b7S5t/tT4LOXXHUwMDE5Ylx1MDAxNlx1MDAxM/LxVXpakjXFZ6+jlGzjXGLBlq5rYfDMoeg8XydcdTAwMWakV9jJK8KzkVx1MDAxY6fIzm4mXHUwMDAzZ6tcdTAwMThpxlbNO236XHUwMDE3Pv/98Fx1MDAxOS7NKY7jNkbI4vnC5y+K4LxWcJF5o0f9XHUwMDA2heKwU4lcYoOzr1jYUfK4kufNeMVcdH+yPjdVJ1xywoLSPP9cdTAwMTJcdTAwMTDYwN/qTFx1MDAxOVx1MDAwZXdcdTAwMDD1tzntKFx1MDAwMVbJPO5dXHUwMDFlu1x1MDAwMjnJiMNcdTAwMWU5liCtp+AgNSNZ5sVTLFSDXHTknIqDR854UWm2dqUzudn2YjnCXHUwMDFmXHUwMDAxIFt56lx1MDAwNeazajxcdTAwMWJcdTAwMTelXHUwMDA07Fx1MDAwN1GGq2JFPoeQ/SCRgi1cdTAwMDaSmFx01GecP5PTLFxuxer9MFj15V9Pi1Mk29eT03ynuHrYXHUwMDFjV/Xmy1x1MDAwZk9Gf/a3J6Mvr56oP198XFx+uvNT4CrPI+JcdTAwMWWAZi4plnOa0WWSXHUwMDA3I1xuS2an7yjs9fmoalx1MDAwZeFcZiE/nbVcdTAwMDJXbcZBhEpyyIxjdVdcdTAwMTlXYdImn9v/XHUwMDBiVv8xsKqIc5bTTlx1MDAxMGolQa/gjOzI5njOXHUwMDE4N7FBs71iIGhcdTAwMTFSXHUwMDA2do2rNEqVRKFcYj/Hmf7a2/rJcDxcdTAwMGaR43VcdTAwMTD4IFxmjDrdQirJa3B6XuQ0XHLNMdMw11JDoeYkN1x1MDAwNKk8OU9yUnGdMJdxYpXFs8N1sb4jXHUwMDExZzi4N7KDgPN66vvFXHUwMDE3K43Za8lkLlx1MDAwMzLO6k9niM16glqBgadS5CV4nP0lXfnUII7K4dBSXHUwMDFlYGNcdTAwMWG0XHUwMDEwyHxcZlx1MDAxNDsnWVtSPE06XHUwMDE3mOVnI0SBgFx1MDAwNC6pyaTiRVx1MDAwYrxcdTAwMDBfJkLYoIJbL3U5sI7PcKOZM1x1MDAwZXlq6J1C86jbnpzDT1x1MDAwNT47N1x1MDAxN55cdTAwMDNcdTAwMTXAXHUwMDE2XHUwMDA2fFx1MDAxN9F50Fx1MDAxY52ft0++rTzb3zz9eLKy9fjLeGdrd3I4XHUwMDA3nVx1MDAxZsg5gTygJJOcvpXvOFx1MDAxNrO5XHUwMDE3yOxcdTAwMTGMWsEt9Civ22zs8p/rgbllO6HqqEAtJI/gcPnEcp6nMYvLlqrL7IqJ5z8z4a7lsCOvZHU7wo1cdTAwMDD3v1d6d6lal+mkv+bj8NVn/lvQ4Fx1MDAwYsXY31x1MDAwZSdPN072d7e0X373xT/92lx1MDAxNvJRUdWvdLhFXHUwMDAwfHT1yl+/Vcu9fPukezpJXHUwMDA1XSRghp2vR4/XOyudg9WVI2V2tvybUC/2/MNxONK7J6erXHUwMDFmPq7q39tu64VcdTAwMTg8edzscmf4zVxmKWFPdeHMznpSUmny193llZzKh3Su9oi9OD7WI2qwXCIpR8jVXHUwMDFlP+xcdTAwMDZcdTAwMDPWeJuo/Vx1MDAxNZeEXbDnntP7XCL3UmZVdrpcdTAwMTFZYXu3O2az245xjj/Za7X3jkbd+/QoN7Kvokf98KjS7FKmeG7WXHUwMDFj3MpjpqfXUoi45NxtRjh07WIxQTffd5ctObmMXHUwMDA1cupcXFx1MDAwYvFcdTAwMDDWXHUwMDBlJ91cdTAwMTE/t7Sysba02Vx1MDAxZOHaXHUwMDBiizo4nGz2vuVRo0h++6x10OtzXHJsXCJypd/bPczjvS5cdTAwMDUn0DfptVv9qzdcdTAwMWP0Op1cIja2IbSFaHa01lx1MDAwNL1cdTAwMDaj3m7vsNX/o9FttI4mg3fd8fmNTEZH3eJcdTAwMTPrvrhcbreyXHUwMDBiXHUwMDFhdDtIn19FJCNcdTAwMGaZUV5V9lx1MDAxOVx1MDAwZZtjuvy0vt33fz7prmyqg6OzdSPN8MmDx/R8k1lZnscpgyh1gsho89HZilVlXHUwMDBmXHUwMDFh081579ecWPtHYXpcdTAwMWT2rr99erjf+Wrfb783x1+/tb6JYFx1MDAwZppi7+KpwrncV69ON4/fvt86Xt1queHOh6efd96+Wlx1MDAxOKZHUTgj/LaYXlxy11NzL1xmQ6tIsIH/XHUwMDE1hy9cdTAwMTbN/Wtzc69eu1x1MDAwN1x1MDAwM7lzXGbe5EfiOael4llPsWTwiGAzn4+tV/Z6g79cdTAwMDVcdTAwMGK5YkScXHUwMDBlyTGYXHUwMDAx6mBcdTAwMGJcdTAwMTNhKlx1MDAxOdGlhXvuXHUwMDFmqEIgentcdTAwMGK/dZpcZv6lOLXlXHUwMDA2kH5jsOZcdTAwMTPcXHUwMDE4XHKOe53uaGnYP1x1MDAwMqI+St6wMDSvwa0yms+9qEVcdTAwMDF5p9c6XHUwMDE4XHUwMDFjdirt2s+NzPNdLOVcdTAwMGLH2lx1MDAxNO161Nyuo32z1Xr2Yvxhy+rj/oFcdTAwMWavhP2jh1xy4zYg9LbO8UxcZjFcdTAwMWKZS+8yRu8sXHUwMDE3u9ao1U7sXHUwMDFhc71Rb6tcdTAwMWS1vV1h1MFkmkea6Fx1MDAwYpCeXHUwMDEyrqlVS4vrNCxTnzHvwIlSvrjvsUBcdTAwMDC/rOBZOIDrx0P9VFx1MDAxZX9ag8KAXHUwMDA2XHUwMDBmzdGbSWxcbrTi943h8N3+m82VvVx1MDAxM7HyuL39fOPsy8KA1kc97Vx1MDAxY78zoJVzgfbirFx1MDAxNa8rgXZ8g52symf8wIHWXHUwMDAx41xcPmHe89ygUnGI4kBuZcBYpTbfa5HzYNbbjF3VLFnikbVVXHUwMDA2OWuHXHUwMDFjXHUwMDEw7n3hXHUwMDFjilx1MDAxZoCyt1x1MDAwZpxvh7KDztLgcOk/h8e90eSo1cffXHUwMDBlXHUwMDA3ne5cdTAwMWShbVxyvMyg7fnFXV5aemGLQtxz71Jh3oWTXFzK5m3ZUVx1MDAxY3yohNtJc+u+3lx0PlDr9vnZ3JGDKKtcdTAwMDBX8XC3vIttXHUwMDAxgDvXvDloXG5cdTAwMGIkVcVMXHUwMDFlXHUwMDFlgaZlXHUwMDA1i3ZaOVxc8N3kvlx1MDAxYsDstWbPaee3MfvSXHUwMDFldOHCuudf3cT0ckfRPuJVspRcdTAwMDTL53lKlfA8WlNcdTAwMTZKaFx1MDAxZe22hnz+XHUwMDE5p59cYmvz3kdfXHUwMDFjXVx1MDAwZa09Tbe1Z1x1MDAxZUyyNT7vgicnf7yOz75+fP1cXO6O99eM3D34tFV1wVwiXHUwMDBiPFx1MDAwZVxcWU5mt1x1MDAxY7Y7c7k6XHUwMDBiXHUwMDFjXHUwMDEy54pNL1xyrnPBXHUwMDFi9WVXs9C9+lxui+DP8qUxTD8/Q5+6/e3BSUMuNNdbhjCXXGZcdTAwMDWeMeVtdY7x6Fx1MDAwNsHJtfstXHUwMDBm1FtKKeAued5gYFnEbHyiLGt6YExG+KiKU15cdTAwMTboL5XhVFx1MDAxYimkdVVcdTAwMWXTslx1MDAxZsrlfNVFISuqZHliL4dcdTAwMDL8XHUwMDEzXedccjyR4CBKYUVcYkJcdTAwMDQvna/wnXfgK6/fk0idu+ah34El/YGzg9zsXHUwMDA1qlxmtDxcdTAwMTZcdTAwMDPVv523rLRcdTAwMDf+zFjCXfvNaObO6lx1MDAwMl/xYe7mzHFzx3l9svyhOk7L0lwizdH5MfIwpdIgXHUwMDEyyVx0kDxcdTAwMWLB1WzPfJffzMBcdTAwMThl4PGobGIqRFx1MDAwNFe+U9vMiXl5nehl4dC6f5DPvIlHXHUwMDEyivOlrFx1MDAxMTpgvYMsluZduCRE8/qG7qiR41x1MDAxY/75ubO2/XHtQ/fP7c/RPls5a9svlZfJONJcdTAwMDfHM5GsXHUwMDE3MMpZlsmhXHUwMDE3KnqEXHUwMDE4uFxybuqZXHUwMDFiXfBP5T/n2Vx1MDAwNX9cblx1MDAxNrEg7zkvXHUwMDAzV6hcdTAwMWSccZ7B563dlYNcdTAwMGWluFx1MDAwMevsL0/c+3efj4N5XHUwMDFin3bPjle/rdiH7jyDN5nXzLCxXHUwMDBlu1x1MDAxOFx1MDAwYp9/XrLNJLJcdTAwMDXvXHUwMDBld7qcyzxrgSWPVeGpwlXOs+wzXHUwMDFk+1x1MDAxNp2aXHUwMDFl4f7T5uBC8ttrcnBcdTAwMWYu8lvr35F4m1xmXG7FXHUwMDFhadYtue5yiq36u1x1MDAxN5Vbm5s59/Mz50p4Y4Wo7K2U8lx1MDAwNnbb/mNldfRUfz3+2N48/bTtn1xy9+f1gDxcdTAwMTi7ldJcdTAwMDUwUFx1MDAwMFxmZ8JcdTAwMDQly4ZcdTAwMWJC5jiHaVx1MDAxMbtZc1xyV+vM8oymXGJcdTAwMTdcIsX1NXuXs0hcdTAwMDNrv439XHUwMDA3pc5f/PHHxtL/XVo5muzdt9VWfvVdXHUwMDFirSo8mrLRSi9cdTAwMTEzXG5TXHUwMDE1qUjV3Giv52NcdTAwMGbVaK3iKXhcdTAwMWHhfj47YaZK1nEstHYzVbKLNNpcdTAwMTBByfKj83i8oqmaVVJYv1x1MDAwYquFg8nPMbpzsL3igYst5ZohlVx1MDAwYlxmdFxuPmHahFvnXHUwMDEzjlx1MDAwZXunS2Ncbpzct0+o/Or7KEux892C4IhcdTAwMTOO2a5yXHUwMDBiurlbeLuxt663X+iNfbv5rLO25tdcdTAwMDZ784bUPVx1MDAxY7dcdTAwMTCFzni2XHUwMDE3sFFcdTAwMWLtSyRcdTAwMWPsm51OnGdcdTAwMTiu3Vx1MDAwNt9cdTAwMTGhLcTtvILiXHSYilx1MDAxZHRVaV/Fw1xcXHUwMDEwISRJ4cuKcjbdXHUwMDE5VYywfoaalOOz8dFZODl96d5+tJ0tfTZ4/alx8eee/PrxaGUy7m7vvVl9evx6c+/L5PfFeaJcdTAwMWKyk9uB9DXpRMtYXGZxe6U1mubWWP2MXHUwMDFmvDV6kV10pzrHMTglZi1gjt5cdTAwMDetjHHujsxRwiNcYlx1MDAxZnnYK/v6XHUwMDBifaOFvZhcdTAwMTmUltFEXHUwMDExwC3+QeR6Y9D5z+HqJfqNb1x1MDAwYqY19Sg1uFJRj1J9UYuC2W6/31x1MDAxYo4rmziMmlx1MDAxYjJzWq9hW1+VXdvmdt16ufP+3dej/cngz3ZU4vOnlY1h+2FcdTAwMTd/Sm9cXMZDg/OzPGYxVtpcZuCnOWdcdTAwMTiWXThqcaFWrU1cdTAwMTaU0JXFKMZJXHUwMDFljeuqMJaRvNI2/FxcZZ9cdTAwMWRxNGhcdTAwMGI93lx1MDAxZO9MXuy8dJ3BaLNx38Z39Ff83aFb67n1Zo6lS1x1MDAxY0RdZeGuuYVXL91DR27vY6aByVx1MDAxMVGt8bGQO7yooJCg2dFcdTAwMDdcdTAwMTMkp3V+n5HPa9RyIYuW50g5XHUwMDFmWOldUVA6i9xeW1x1MDAwM6hfgH3/LLj9mHN0/nO4eTaedFx1MDAwZu5cYrVrcKqM2nMu6Xsxu4k/m7f9n6u1c5xJYpS3ynObpqTWSvGYcckjp1XknIxcdTAwMTmVXGaKXHUwMDEzolx1MDAxNefLKqOFqCCTQCZcdTAwMGLwXHUwMDEzQVlCjSx4kPpm69uko360XHUwMDBiuWWztfSPKs2uXHSsXvVocUZcblx1MDAxZXEsKvZVWDZ/w4NBNohK4XOLasK+fcfWQjeL5+opf5ZnVXQqb1x1MDAwNppcdTAwMWLukddv/F/f97VUrOny1lhOqrFSXHUwMDFh4YunXHUwMDBmX1x1MDAxNSdcdTAwMTgpNU9H5tlcdTAwMTR3U6hwvc9bSuspLM+LM96w1cIqN3vFOjOe03csy7it9DcrSfuuMoQm2/5NKN21rjVcdTAwMDRcdTAwMDTzWjIq4lx0m+UzjKR03GRT1lx1MDAxYlx1MDAwMe8qZl2rXHUwMDEzXHUwMDE5x0PCOyO0goHGqnQ6vlx1MDAwM9/EXHUwMDAzt6DXYPi/fGu1b1xy3+9bLciv40D/Kt+q5o43MJwuzDlNXHUwMDBid63cV/DTR/OjXFzrfD3lz/Ksit6Hb23sqzhcdTAwMGJaXHUwMDEzN420XlxijVxivYBcclx1MDAxN77KZSDcrKr1PN5dJtX9XHUwMDBicq7Xp4FS58r9vVx1MDAxMFxcfoaUYqXvzFx1MDAwNUvAXT5S3MhcdTAwMTBcclx1MDAxYilcdTAwMWWWd62LQ838YymktsKFxFx1MDAwZVx1MDAwYna+0jxcdTAwMTD9dHo8XHUwMDE5a3/0+Wjr1dh8XHUwMDFhXHUwMDFkXHUwMDFm91ovXHUwMDFljqebXHUwMDEziCrhODCex0JpeIBQXHUwMDFhz1x0JpeBx5h4l1x1MDAxNanWgG3E6GDM4Fx1MDAxY77Z/Fx1MDAwMCypU7bYgfFcdTAwMDP2eVx1MDAxZj/fer92uqnt5/3na+J99/OuOPlQsLJcdTAwMTlMv3rlLlI031x1MDAxN+a+XXuyet9cdTAwMWK86XcuJnxtPd/deTV+fTjc+PN16Fx1MDAwZVx1MDAwNjvL7f6XWY41k5c+r1WKnsdfgfhcdTAwMWGeXG6nSlx1MDAwMax2MfNcdTAwMWNjXHJi76MsbKJfXHK/MVx1MDAwMa5cdTAwMTLE2nM2p5BcdTAwMTXp08Cpolx1MDAxY1x1MDAwMK0ssMIpeY2N3mIuz2TUOlx1MDAxY1x1MDAwZlsjrNnD8T635VnDXHUwMDA18CzlgzB2tqw2t7S5uFx1MDAwMMdcdTAwMTg9z2u/zSCxW6ah945efzRHr99cdTAwMWXGzeXO6N2qfHXw7kvTdPHD8kXXXHUwMDE4aPVdzlx1MDAxOGjF6D74+0xcIvxcdTAwMDct5Im2urTfqTmZz4M4Rlx1MDAxM4wvXHUwMDBleZ7WXHUwMDBlaM64XHIusIDX2Yox0Deb3fdPM8dcdTAwMWLM74N3XHUwMDE0NrAgu8rw1ExKaWp4XHUwMDEyXHUwMDBiXHUwMDE0iyNcdTAwMGJcdTAwMWXOXHUwMDA0P1x1MDAwMtbSWlx1MDAwN9+Gh7p0OTqnsLA/bIZfXHLsVSHvdTeyXHUwMDE4LL7eJ12b71x1MDAwMHxmPO1cdTAwMTbkU1x1MDAxNE9HvVx1MDAxY4HDc9eFMjEoo+MsXHUwMDBlg1Naza5A5lx1MDAwYlx1MDAxOTBWWLpQXHUwMDE5h8GH/Fx1MDAxNIbiIM9fhn++hlPDXHUwMDFmfTdcdTAwMGUjXHUwMDFhhvFcdTAwMTXr5lx1MDAxYU6dQXxcdTAwMTaKx1x1MDAwNvzN0lx1MDAxZHNcdTAwMTWVPzMqOpU2g9lcdTAwMGLLdVxcXHUwMDFmyC5cdTAwMTVzXHUwMDFkynqPxbFcdTAwMWHWalxc8cjhi8SBIdX1VmvQMFx1MDAxNlx1MDAwZsaimFx1MDAwNaWRr3V8S0mmw1x1MDAxOCl54rKNXHUwMDBlf1xys9f7nVnjmdzFLVJcdTAwMWL/uljUR63hcHNcdTAwMDKdvbr3R8e97snjysCaPyR0+bXRy3Rz8/zrX3/9f1xmJ4VPIn0= + + + + + EDGE NODE ON RESOURCE PROVIDER1. Node with exposed service at the edge of HPC clusterVirtual KubeletInterlink API ServerProvider pluginPod on virtual nodeVirtual NodeHTTP + Authunix socketPodContainersBatchSystemOIDCOIDC Identity Provider \ No newline at end of file diff --git a/docs/static/img/scenario-2_dark.svg b/docs/static/img/scenario-2_dark.svg new file mode 100644 index 00000000..388f2042 --- /dev/null +++ b/docs/static/img/scenario-2_dark.svg @@ -0,0 +1,13 @@ + + + eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1da1dcdTAwMTTJsv0+v4LF/XiHuvl+nG/gXHUwMDEzXHUwMDE0RVx1MDAxMVDvucvV0FxytDTd2DQqzpr/fvcuXHUwMDFlXVldTVx1MDAxNdIgzFx1MDAxMUdH+1x1MDAxMZVVXHUwMDE5XHUwMDExO3ZkZORff8zNzY9Ojzrz/5qb73zfafW67WHr2/yffP1rZ3jcXHUwMDFk9PGWyv99PDhcdTAwMTnu5J/cXHUwMDFmjY6O//U//9M6OsrG38p2XHUwMDA2h2ff7PQ6h53+6Fx1MDAxOJ/9X/x7bu6v/E+8023z++/86dMt8TFuqM314Ubn63Cl92Mj/2r+oYtcdTAwMDFccjs7o1Z/r9dcdTAwMTm/9Vx1MDAxZK9bXHUwMDFmM+mDdDFcdTAwMDTjZZSX757iXVx1MDAxZEQmpNUqaCmFXHUwMDE0Vl++/a3bXHUwMDFl7VNAMJlcdTAwMTA6XG6nrMDPWMB+p7u3P8JHjFK4RnTBm5j/mMvPnI3oX3Pi8pXj0XBw0Hk06Fxyhlx1MDAxY/Z/yVx1MDAwZX+NXHUwMDA3vd3aOdhcdTAwMWJcdTAwMGVO+u3xZ1q2XHUwMDFkdnfHn9nt9nrro9NcXDKeNJ7ofEn+1vnoZen1ad/CXHUwMDA19/b7nePj5DuDo9ZOd8RcdTAwMDclxfhcdTAwMGU4uqPldj5h/zdcdTAwMWXTsHXYWeaM9U96vcuXu/12h/Mwvy1cXHK5fvv8clx1MDAxN9M9nkt9/srf48F3OpQspVHWXG5cdTAwMTPH0zTWO6kmXn016Oc6qITU0Vx1MDAxOevHn+hcdTAwMWU/huKNcrG7rd5xZzxcdTAwMDFcdTAwMWPbk7FSJrdzctRunX1JeuWs01x1MDAwMVxuZsfz3ev2XHUwMDBmyt/pXHJ2XHUwMDBlxtf5o3BnJU3f0+9aq5tcdTAwMWa3t8P6in2pl/qjl3t7jTXdXHUwMDA3mylcdTAwMTNMULpC041xXHUwMDE5XHUwMDFlXHUwMDFl3rduiqZrfERoKy00fVLJtdRZNFbLwpt3oN37rZ39k2HnIei3n4F+x6jgQ6Sv0m8np+q3UVpcdTAwMDZf+Np9VG/devtl7fDJalutb+mTha0vL/bWXHUwMDFmTar3qPN9VPLhwmTaXHUwMDA0LVx1MDAwMow4XHUwMDFhqU2i2lrILESt4Xg1noOXdkK1g5GZXHUwMDEy2rtgLb5cdTAwMWVdhX7/VutqtVx1MDAwZdVqnXz8XFx/XXRCeYBphfqq4Kapr6N3XHUwMDBlzsbZqq/XmPBcYpu6hvqOtZFaiPtX2dy7/c7csHM4XHUwMDE4deaOhoOv3XZnONf5fjQ47sy1+nOLa8tzo1x1MDAwMV7o7JzgXHUwMDEzO4P+qNXt41x1MDAwNlx1MDAwYjOP19a7P3JLXHLJq09bh91cdTAwMWUnyiZcdTAwMTde7HX3+Mzmd3CXneF88cGNulxioS4/MFx1MDAxYVx1MDAxY43fvbz25HxcdTAwMGWG3b1uv9V7N8Pbap2MXHUwMDA2bzvHZzc2XHUwMDFhnnSKz7nz/MKwYHn2XG6vMPSvX33e+No2neen4vny83c7XHUwMDBiq6Yx6Fx1MDAwNSmyqG2cXHUwMDAyelxi/oKV8GRhWnhH51x1MDAxMXNfNzW8s/hEVPIyulx1MDAxYuvTb0dRdFx1MDAxNIs3xz9N7Fx1MDAwM1xiVuGfXHUwMDE2U1x1MDAxZIiR0UVE8D+Df/97ObzxQC+V0/f1Zlh76T7vhD3/2qy+f7a2LC9vM1HQ1nA4+DZ/+c7ff14ld/vlM/3mQPdfLb3vf/ji9M6HJff8RnIr0bNwxa/t5d7Xb90t+7nlP6/8eN4+7q5cdTAwMGZcdTAwMGJiz/82nu9bXHJcdTAwMDWqR9MgXHUwMDE0XGJRZFx1MDAxZdGOhcmLXGKLTu09alx1MDAwNFxuXHUwMDFl/mBqkFx1MDAwYlx1MDAwNpHh/SiisN7h1ibt/XpcdTAwMDFu9HJHXW3gu7udnVx1MDAxOP9cdTAwMDFcdTAwMDa+2TxcdTAwMTSQ2jlcclx1MDAwMLZVpuzMNEtcdTAwMGVRXHUwMDFhfDHeg0h2XCJcdTAwMTTY7Fx1MDAwZUcnrd7ci5NtjqhcdTAwMWHfRfLqjfH9sNtuXHUwMDE3MS+F+DrwLKP+1Du4KZRfXHUwMDE4LD89XzHhPqppM25AKKVVXHUwMDA1clPQuFx1MDAwMj2Yrlx1MDAwN2cuZePtkWptrlx1MDAwZo9WzYr+0VrrvVnZmWZzO8PB8fHCfmu0s3+XdjfpTXibzqnMSYTHcGvOXHUwMDFinbo0XHUwMDFkTWaENFx1MDAwMn5cdTAwMDYxjPelcV3PXHUwMDEzaeV2Onb8mUuvqGJmjIaBXHUwMDA0Jb0u2OelV8Q0ZVG4XHUwMDE4nbQyXHUwMDE04thzg49CWyO8XHUwMDFkXHUwMDBmv+hmxjHA8sbeidj6rvufn784Pv34eFW4zV5cdTAwMDGx5vefPO/udlx1MDAwNt2WtCed02BcdTAwMGW3Py1+vUCqWnc11S9N4P4soa4wKa3haFx0XHUwMDFh3O3vlb/S6benvNNrXHUwMDFkj1x1MDAxZVxyXHUwMDBlXHUwMDBmuyNcZmNt0O2PJrwq5S4yXHUwMDE02O+0Jm5cdTAwMWGSp753RHHpXHUwMDFjjP82N9bF/Fx1MDAxZpd//78/Z/DpXHUwMDA1oLH2ylx1MDAwMJZccv4vxJh359/PQtCRYbtC+Fx1MDAxZY1cdTAwMGW1XHUwMDAyTcisilx1MDAxMVx1MDAwNFx1MDAxZVReqHHAx1x1MDAxZqWgw0LxSlx1MDAwZdpo3F2LXHUwMDAzUYAjw6dcdTAwMTGcIPhcdTAwMThcdTAwMDcnuTiTIWJcdFx1MDAwMEVcdTAwMTVxTafrxelMRuYz8Ds4L01cIi5kyoBvS8hTXHUwMDE4nqxcdTAwMTXnXGa8t5XGOlx1MDAxZoJcdTAwMTUmXHUwMDE0xXmXOeWCt1xugZGxvn4qZi9O6+Bhd87Bv7jkZpmlN1Akj/DPS+/rpelM6OAwuUqZXHUwMDEwk7FcdTAwMDWd4UWtXGZcdTAwMTidlsrUXHUwMDBiU5nFjVhcdTAwMWKEXGYyWF+ShkjSWi8trlx1MDAxNbWqN1xumWlcdTAwMDUyqUBZvESwk9yqhNp55aOQXG6oXHUwMDE4naq/2ZlcdTAwMGKEbmlcdTAwMTmNkc5cdTAwMDOSgFxuIVx1MDAxNWgzXHUwMDAxg8VcckOLqe/1XHUwMDAyTWZcdTAwMDNcdTAwMDYnuEqijbRleUVgXHUwMDExtaqML2BSbdDCOG1cdTAwMDXGcIW8em2ZtbhcYv1cbspcdTAwMDHXI3SwsFx1MDAxYXT59HBcdTAwMTFosqDxhFr90yqDXHUwMDEzXHUwMDEyIDRQsqjExOw6xMxcdTAwMTi1h1x1MDAxZlx1MDAxNbZ2MmBcdTAwMWFcdTAwMDZTayW+XHUwMDA2M/Bl21xiTkRLr62gXHUwMDAxdyvMZrhHXHSnXHUwMDAxc4OV+5JcdTAwMGIwXHUwMDFh3Fx1MDAwMNQvwFnr2ECacFx1MDAwZU8mXHUwMDBmaUo+gP5cdObvXHUwMDEwMmGunKtcdTAwMWRcdTAwMWJ8MVx1MDAxM1xmXHUwMDAxeIY5gFx1MDAxMZV8sYxQXHUwMDFm4JhcZlx1MDAwMJNo71pcdTAwMWNUXHUwMDA0+lx1MDAwMb6F+zSw8jLygOkqqlxiPDUmqtZcdTAwMWJcdTAwMWKosGNcYlx1MDAwNGvVUahUXHUwMDFjXGJ0lFx1MDAxNupmXHUwMDFk5sO5WoswmcQkYPpwL87CXHUwMDA1TYRcdTAwMDFBaFxciuIwYbX2P2t5XHUwMDBihFx1MDAxN2GNXHUwMDBi8HpQXHUwMDA3XHUwMDA1X5WIXFyQ/EDQ+FxyXHUwMDE0cFwiXHUwMDE43VmQtfc9LVr6o/j/61IpqVx1MDAwYkmPXHUwMDEyl4JLdjBcdTAwMGahXHUwMDBi9HlMplx1MDAxZTcnU1x1MDAxZjs7P37o5d1cdTAwMTf66LB/9OP15qfj9TCFTN35+vNVNIrTXHUwMDFkpVx1MDAwM7aPs7R5ZkjSfyhlnaUvMOpmPGq3mK+9IFFgaj5oXHUwMDFmoURcdTAwMGV+ulwik1x1MDAxYzVLXHQ0dNdGLZRcdTAwMWZTjIusSYCWOVx1MDAxM/149NUs6jdJ+seQJJnB6XCpXG6BNEJmMITUm0XrTaBiXHUwMDEzLKSuXHUwMDA1g1x1MDAwNdiBdULCO0LP4MJtXHUwMDEyMVBcdTAwMDVcdTAwMDVcdTAwMDBcdTAwMTR+RGNcdTAwMTZjXHUwMDAzXlMn0DuAlTfe6lx1MDAwMHJjbz7Cn1x1MDAxMIiIXHUwMDBi2ijxXHLlXHUwMDE1/ixcbnSIj8HI4Fx1MDAxOOG5SUtcdTAwMWHIy6uCXHUwMDEw8SPug2dxacQqM8bFmsE0JJtGXHUwMDAyQ1x1MDAwNOIr4Fx1MDAxMTy0XHSmXHUwMDE0xWWIPOHYXHJcdTAwMDIlkIxcdTAwMDZ8SWVcdTAwMTFPkLya6Vx1MDAxYVx1MDAxYlx1MDAxMqWReITAelx1MDAxMUI0QuBp1EPgrOX5LHAqXHUwMDA0XHUwMDEwyYUgUy4swVx1MDAwNzT1XHUwMDBmXCI9M1v1JFxmj8jTtXpcdTAwMTBxREZRpVx1MDAwM3RcdTAwMDRoeHZcXItcdTAwMTVCoV5lpM+AXHUwMDEymFxmTqPwTiXyyK5jRFx1MDAwMKZNtOAk9WxdyVxm8YP3IKhcYrTAXHUwMDA1k5hJZtB271Uw+Fx1MDAwMGLhXHUwMDA2Rlx1MDAwN1aCMETDy4L6wlxiklx1MDAxYkZMh9BcdTAwMWFIgfBcZnBcdTAwMGZuVS/QZVx1MDAwNnOhSGb4R2JcIlxuXHUwMDAxKVwiRJGXkXCe63nszOVcdTAwMDVcdTAwMDTsXHUwMDAxUZhcdTAwMGWYSuO8Klx09Fx1MDAxNnpktFxitM3a+J+0XHUwMDE46kdcdTAwMDaCINo7m/J2hXjA4+GCXHUwMDFiKFxc0tfTk1x1MDAwNVxyskMzgFx1MDAwMkZcdHdtSlx1MDAxYWNhIVI6q6XX0ddroDZcdTAwMTlUVighvJVcYnB0SZ5cdTAwMDR3XCKpilT8eoWZtTjQXmvxjFx1MDAxME1cdGhuiVx1MDAxNfuM9TZCgcLgIdZcdTAwMTOoXHUwMDA1zVx1MDAxMYBqWfhcdTAwMTD4ulhcdTAwMWVcdTAwMWXAKMD3wNRcdTAwMWOu1SDrXHUwMDExYFx1MDAwMcBEQCfXXHUwMDAzjS7PbnB4XHUwMDBlZERcdTAwMTZKUy/OM1x1MDAwMc7QS2Jm7STlgWdcdTAwMDaNZJkoXHUwMDFjW4PhOdBcdTAwMTAjXHUwMDAwZDBP3FM5tVxiPVx1MDAwMkPxgVx1MDAxYzDWu/tZi4P7MFx1MDAxNrdcbupcdTAwMGXfkWaM4FtgM1x1MDAxZU5cdTAwMTHeXHUwMDA1M9JAnMgs62ujg/ODXHUwMDE5pJbrwHXzJKpcdTAwMGY+ssCtiTxcdTAwMDCHZfZcdTAwMTUzga+VU59cdTAwMDY6JF1cdTAwMDRcclVcbuFDvW9hXHUwMDExsLWMJ4R1oMrpXGJjhpcxtXm6htmZu1x1MDAxN8gsj4LqsYBcboFH6vwwXVFrwlx1MDAwYqK22CBdwVx0XHUwMDA2XHUwMDE2McHJzDt8cFGcXHUwMDExLHlBZENcIlx1MDAwYiBuXHUwMDEwYMFcdTAwMWJcYviP4Fx1MDAxZFx1MDAxZIxcdTAwMTjXVOXyPNNcdTAwMDWMW7QwXHUwMDAwq2b6XHUwMDE3cL9KgpBhMpP5tVx1MDAxYeFhxKtcdTAwMTa/NOKEXHUwMDA2t2szPFx1MDAxY1x1MDAwN0PHTCBcdTAwMTJwJXlcdTAwMTE2i5CBvkU0yajOWFx1MDAxYyxcdTAwMDCuXHLgXHUwMDBmz2ZKy1xm1mYwQsSscMvMudaripFcdTAwMThcdTAwMWRDXHUwMDFkXHUwMDE4PKbPlcXB4TFX7fJ0WYM1XHUwMDE1g0BcYpGzsdBVX0qmWIfRMVTzXHUwMDBlylx1MDAxOZqsqeB+gPpcdTAwMDEu2WEgqWuBOC1cdTAwMTGf4Vx1MDAxZHgsUN0m4qAmXHUwMDExYVx1MDAwNpCcy1x090ucy1x1MDAxOLND61x1MDAwM2JF6cvimG9zXHUwMDExMFx1MDAwNG8mXHUwMDFhmC0sXHQ46G1UXGZJQml4XHUwMDFlimfgtlx1MDAxZMJmKVVcdTAwMDNNcVRVXHUwMDA1XVx1MDAxMZg+hCxcdCtcdTAwMTJcdTAwMTmuhClcboh+I4Kuei9cdTAwMDB5XHUwMDFlZlx1MDAwYlxi545cblx1MDAxN9LUNlx1MDAwNLKoXHUwMDA2XHUwMDExKUhcdTAwMDKRvMH9MsglXHUwMDBmNVx1MDAwMFxyaFni9Vx1MDAxY1wiang9sFx1MDAwMybSgeNccuRxr1x1MDAwNoJ6+FxywH/UKe2AQHJp4XAhllx1MDAwMDXg0kYzXG5cdTAwMDLr8cIhXGL3M5BcdTAwMDdcdTAwMWbAJTGAgjdpXHUwMDE0XHUwMDA0eYZLOFxu0ZE3IMB3Lk5keVxiyy0s4LWlu1x1MDAxNaRcdTAwMWNwVDFgmps4PVx1MDAwMSdcdEzQjiFpMjRcdTAwMWLBoJmwXHUwMDA2/ZJgdVxyVs1AXHUwMDE5XHUwMDExXHUwMDBmIIBknbtQZXFcdTAwMDA7k9dwXHUwMDAyLkJcdTAwMDP6h2BcdTAwMWWho4dZRlx1MDAxNlx1MDAxZlx1MDAwN1eShyeKq1x1MDAwMFx1MDAwNUDLRVx1MDAwM7IxY3FcInfxxFsvgFx1MDAxOCU9htVYXHUwMDBiplx1MDAwMUWHfdhcdTAwMDbcynN4eYWHjnD26cx61tQhWlHBSlbZ14tTLLrVXHUwMDAwfY9cdJHKJHbrLdyo0+SnXHUwMDE2XHUwMDE3bWBcdTAwMTVgXHUwMDEzuFx1MDAwYvhcdTAwMTM4XHUwMDE1XHUwMDAxh1BarIlZvizk+Vx1MDAwZUKPenFk7/BDllx1MDAwYpiAr/JCklxiXHUwMDAwW0V272KD1cvZi1x1MDAxM/CQXGJwpGVcdTAwMGXMJ7pcdTAwMTLg9MByXHJCc3haVX+zpDpcdTAwMDZBNdNcdTAwMDRRK2/S4XFLT8A7XGJFIbTBw1NcdTAwMTJeXFzgblxm1C9cdTAwMDSfXHUwMDA2P4FrU1xiZrxG3MaYpomuKMNsn42MVmT0JXlcdTAwMTFcdTAwMTG859akvJjhV8iDXHUwMDA2a6lcclcxrVWJ7kWRIfrxzCpFxHpNUpFcdTAwMWOfXHUwMDBl0jDtwNKSxDZcIqaXcVx1MDAxMVx1MDAwMkghgaSN8kq5XHUwMDEzRaSsMcsmXduLXHUwMDE4PdRcdTAwMDSBXHUwMDFlvVx1MDAwZjxzvfrFjGvPnmFcdFAtzVNNLFA0XHUwMDExx1xmXHUwMDBiiTO9m4ul0YFcdTAwMTZ6uK+gXHUwMDEwXHUwMDE5xPq7zW2N7JPEXVx1MDAxMGhK8oBLkMiMbINwillcbuiCg81cdTAwMDZcdTAwMDG1SEtoYp7GjfCisEdj61fiKVx1MDAwZvhcdTAwMDJcdTAwMWbkXGYwXHUwMDE3dq9Lulx1MDAwMpsgXHUwMDE3jJ6+osHdzlqey1x1MDAxNF2u8UKwpNKXbUN4RDLQYrh71SCJIeHJqSNEXHLmatNcIp9guaNcdTAwMTDxmYh4iMHV+1x1MDAwMlx0Vopb1cYhzFx1MDAwZUxDJfIuXG5zXCJDltBE+aiuJGmAfVx1MDAxYVxcwnJDvsrgNFWd1l1cdTAwMGZrkivbXGKVLbdcdTAwMGXheyVPj2iPPlx1MDAwNbyU4OtcdTAwMWKY2ozlOSalJVx1MDAxN06otvD5tvz44K5J/Fx1MDAwMuhDfZSRJ1mA4WSeilx1MDAxYqXSpFx1MDAwM8s3QFx1MDAxOVx1MDAxNFVcdTAwMTOwV0/9wJ48ZoLZcqiY0+ViXHUwMDEwlrEhStOYZF+fXHUwMDFlxcOzYFx1MDAxYbgwnLJQpjS514RJaopcdTAwMDNcdTAwMGZTTEBcdTAwMDI9oiqrijHGscBcZtDha5c3Zi3OMPlcYv+pXHUwMDExqMNLXHUwMDA1U3p0XGLFPVRcdTAwMTig3GBtiF5cdTAwMDD4XHUwMDFkmdtjXHJHKDtcdTAwMDFcXIf2XHUwMDAyu3H1wVx1MDAxOX1cdTAwMTTiWlx1MDAwYuKnPZPbZVx1MDAxZmWiYb1cdTAwMDRcdTAwMDDKXHUwMDAz0lx1MDAxYYjjpDHxXHUwMDAzozTSluFRXHUwMDA2Q+vHezHWP7jZSlx1MDAwM/iAX1x1MDAwMFx0uCGRlVx1MDAwMiXw4YKpUVQ5j8mtXHUwMDE1h7BcdTAwMWYqXHUwMDBmho1JXHUwMDA14sqSNIBcdTAwMWI4XHUwMDBiUFvDy9daXHUwMDE34op8MVxyNDRfb1FlLItQOFBcdTAwMGZN9lZfXcowReXs0Fx1MDAwMZtVlKEkzsPy8tVApp1rtYRRXHUwMDE0yDpcdTAwMDNNuFtTXG5cdTAwMDNcdTAwMTBEsTiJ1MhBmepcdTAwMGL8MDgwUHJcdTAwMTVti/t9+Vx1MDAwM1xyXHUwMDBlXGK3QfOYXHUwMDBmN/XckVx1MDAxMa2RxktcdTAwMDMnXHUwMDAyN1eOZ1xyKFx1MDAxOTRcXEqSt7tcdTAwMTXGZYroSWvyVHdcdTAwMWGfXHUwMDAwX1x1MDAxMdBcdTAwMDXmuFx1MDAwNcs7a8WRWVx1MDAwMIhcdTAwMTnwO1x1MDAxNlxmJpNcdTAwMTC4XHUwMDFjXHUwMDA2XHUwMDA3jetcdC551VtqQOirmIOFedFzpz6OvFx1MDAwN4jBkk64uVqshqVcIog2XHUwMDA2XHUwMDFj02ouaCZuxCNsx1NQXHUwMDFlYSdT+/VcdTAwMWGiyVx0YVYwbEY0XHSygoCqfFxyVpMg1+e1wI7xdDEkRCXQKZeyd7BjxCxcbozWXHUwMDFhXHUwMDA07fX0WDNcdTAwMGYmWF9cdTAwMWNcdTAwMTHTxURFQN31WUgqmVWVtWNjYiEwXuLWdqlEObGAwFx1MDAxNVx1MDAwMVx1MDAwNHxcdTAwMTKD7NrHxixcbtfXWG9cdTAwMDI2XHUwMDE4fEmaM8EhmGe6rUEp6YylcVxyXHUwMDFmgb9cItIgvlclaXyUXHUwMDEy4Vx1MDAxZcIohC21XHUwMDBmzojMM+3p89yXK60hOVieIykwfLDwS7XiNLBcdTAwMDRgyqKV/I7KmbacQ1xi06CgXHUwMDFjomBcbqw0jFxm1VRZXHUwMDE0O5xcdTAwMDRWglx0XHUwMDE36lx1MDAwMZVcdTAwMTlK4Fx1MDAxMrc8UodFuiz9y8VB32H2XGIyqb1A6pI0J3FcdTAwMTlIglOS9WSY6faomPr2XHUwMDFlyC4n0s9cdTAwMThcdTAwMTbQWVu4zfpcblx1MDAwMSbbXHKrRDFcdTAwMTOK+ZiSwuFcdTAwMDJcYu1cdTAwMDRzdj7Uj41OxLN6PGj6xVR94UvzMFx1MDAxNsEgnka9XHUwMDBmyceG20AgXHUwMDBmnlRKtENcdTAwMWHrknC31Dhdv1x1MDAwMsXeL5HF6Fx1MDAwNrbqnPflNVx1MDAxZeijY/k201x1MDAxNfWAmi/xcPU/wq5YI1OSpsglWNiFXGK9ntZcdTAwMTiTcVx1MDAxMZJKwqovN7H+JFx1MDAxOElcdTAwMDOBuL/srqXJvOpE535cdD4kVVx1MDAxMW5cZoCTh1x1MDAxZVqbLzY0cHHgb0w3kL25wma5c3lS6Hz7XHUwMDEwo7zQXHUwMDAwXHUwMDFjbObhY+GQXHUwMDAyd7rEiXVKxFx1MDAxNDov/UboWF/zwVVZXHUwMDE20MnccbtcdTAwMThL4lxcXvtcdTAwMDCPXHUwMDBmX19cdTAwMWbEzVxcXHUwMDFhXHUwMDFmtGCNhrbCJzrHXHUwMDA1aMWkXHUwMDFh7pX5iPp6srxYXHUwMDA2lsr1XHUwMDA0oYTVyUxwgZxcdTAwMTdcdTAwMDLwKuBH/cY0jeA8Wlx1MDAwZldcdTAwMTFcdTAwMDVcdTAwMTPtXHTmc+hcXFwiXHUwMDE0XHUwMDBlgVxuS6FqR6eAdlxiXHUwMDEzuFjsXb417s/0XbB7jYFcdTAwMDO+XCJCnPpcdTAwMDAnMryCL1x1MDAwM1x1MDAxZEU4bSe2kjHWXHUwMDBlzKjCpTTa4TJLcZpcdTAwMWNSXHUwMDEzOT2huFxcPIJcdTAwMDfGnUZcdTAwMWVcdTAwMDZcdTAwMWRcdTAwMWHsr2JQXCJYh+00s1x1MDAwNuneJZa2eD5a4ERcdTAwMDD9bTA4l5GSXHUwMDA3rvBcbm47SMQpxlx1MDAxOLD9vF5N1Ps67bnLjes5JC/pUrvKi1hcdTAwMDWYXHUwMDE4aDRcdTAwMDPh+ludrbSQOUW9YtEtfFRa71x1MDAwNThcZl6y0tCykqc+OVx1MDAwN3FcXHiUKlx1MDAxMIylKtd7WeY0XHUwMDExTSmjSDBcdTAwMWHcq1x1MDAwNEpBn8BHjInlajQylMhMXHUwMDEwXHUwMDFioKn6m8W0clx1MDAxZFOCykUny9JcZotcZpWEftvQwPrBN/LnkqfJgNmmJE4zvWb42zeh+oj5I+tcdTAwMGLZ7Y5bOmTp0Vx0qq8hYVx1MDAwMTWoXHUwMDFmXHUwMDFkXHUwMDE4hFx1MDAwN+hgbvFfjCnocCYwTZhcdTAwMGJcdTAwMTZcdTAwMWWxmvnO5SFcbmTZXHUwMDEwwMLAMl2YqORj1pOrzlx1MDAxMm6iPmud15HCXFzhikHSValcdTAwMDKFdaSYJ6bsSLh1g/RcdTAwMDFcdTAwMWLnXHUwMDAxXHUwMDA3XHUwMDA08Vx1MDAwMKYhJ1xuXVxyXFxAsJo7TuvrcFnXK1x1MDAwNLw3xqaYK3UlXHUwMDA3xVx1MDAxNV8ouYzcyONqp3fm8ljLXHUwMDA3Y2ImmfWEKT3hdND88Vx1MDAxNjg8XHUwMDFjY504iaBcdTAwMDbMOeQtW6DKaVx1MDAxNlxmtqGYXHUwMDAwNzHkXHUwMDBi0/XawsJcdTAwMDFcdTAwMDfogUUxQkpT6lx1MDAxMkhcdTAwMGI3YFm7QFCvj9pVXHUwMDA2oiM8XCJisLtcdTAwMDBcdTAwMWWdelx1MDAwMjA1xFx1MDAwMVxchVdcbuAu659cdTAwMWXgynKjMpRcdTAwMDVcdTAwMDNcdTAwMTRpSj2v84eHhW/hXHUwMDE2gFx1MDAwNkXH3IhA3mRYd1x1MDAwN8qVslhuRICL5Vx1MDAxZWuEldzaVy8v39nLRXbH9EhaXHUwMDExlHHZxebWXHUwMDExXHUwMDFihFx1MDAwMVx1MDAxOXydZWZcdTAwMDRq7126XHUwMDFhgSeHK1mF0I/xmKsvXHUwMDA2qlx1MDAxMUd/XHUwMDAznPPceIFcdLlrcZLkkola1lCD/qfJNVx1MDAxNlR6zzImhKBcYu5cdTAwMWItvrDaXHUwMDE4w4BcdTAwMGLCXHUwMDA046mnXHUwMDAyXHUwMDA1S1x1MDAwYulcdTAwMTJcdTAwMTXA1nM9vlZkXCJg/Ok/iv//++xDf52/WLvdMNrpXbc83FxySG1l55YnzTdcdTAwMWL+WDj5XHUwMDEyPveOT1e/v3q192bUXmw92n9cdTAwMTCdW1jGxEVcdTAwMDewXHUwMDEyXHUwMDAzrUjbUpp8XHUwMDAzQlx1MDAxNJhZwIeMwpRcdTAwMDY2o9Yt4Nsu5Fx1MDAwYlx1MDAxMyCBhf4w484t+Fx1MDAwNFxcXHUwMDFjeFxmgiNX9HFcdTAwMTfbXHUwMDBljeJSu7Hjx/B71+GFsIey63CBJWPw23lcdTAwMTdcdTAwMWaWkKaJ54uldzBcdTAwMTWmk12DTVx1MDAwMlx1MDAxMOglQ27FojUhjLtCYJMqtJlcdTAwMGJcdTAwMDTHXHUwMDAxv/HSsjSBtbaJvJLa15c7MGFBMmVdvqyRJlx1MDAwNKXNa1lcYmdW5FnjWnnTTJM/rHjzmFx1MDAwNoXAyLP1RIMquVx1MDAxOYvLV3DIlri3gNncXHUwMDE0ISX4NstcdTAwMDJcdTAwMWQnqj7fzi2OXHUwMDFlcVx1MDAxY4uk8laZpW2sLFFyzLmb6Fx1MDAwNcLRXHUwMDA22lwiXHUwMDA0NZqENLD1RSgxXHL2XHUwMDA0VojL8Tr35lx1MDAxONtZqE/83Fx1MDAxMkhObWjHjFx1MDAxZVx1MDAwYs2r+5s9bY6SO6cvn+283H/bsd+ePl56rtbDl+31XHUwMDA3gZLOkbpcdTAwMGKEg2Bcci6WWjaye1xylMZprqlDt29cciUlc1x1MDAxNyTiXHUwMDFhodW4XHUwMDAwNsVJgIx0TFx1MDAxYiPoXHUwMDFht6y72J1vJJRcclg5biv5XHUwMDFiJy+EPVx1MDAxNJy83qdDXHUwMDA2mss5Z2FcdTAwMGWZYkKGM7glduZcdTAwMDJf0kbI+jKJ6WrIXHUwMDFmz+p7z/lj0+JYX7xKci9ZWCFsXqOX9mlcImBcdMSoXFybtbFcdTAwMDFcdTAwMDObsTiVcTMs+5FwXHUwMDBmuDFpjn3C2lx1MDAxYVAw6fPTNfJuWyDRvjQ+9vrhgodcdTAwMGJBm1x1MDAwNlCAx63Yu0xLy75eqrxHXYLHXHUwMDBiJlx1MDAxOdgnoTZcdTAwMWG5JWRcdOVXx4daXHUwMDA0PDiur1chy7NrIMvG65VcdTAwMWarX+1g7VtrKJ6Fo6PXK/5BIItcdTAwMGXsWqDg7IJXflxccHh+4lx1MDAwNbuOIfpjrFx1MDAwNNJTaFx1MDAxZj1TZLH5zlx1MDAwZmvYXHUwMDE3KEZcdTAwMWarkMVzf6yNXGbNXHUwMDE4rY5n7KJxft4my/1cdTAwMDaWXHUwMDA3XGYsiKdZLKtdntvjXG548esxM0GA9jBFjFC1flGhJE6lXHUwMDBiKDFjXZx1rLxcdTAwMTQssrlrcYjafGBBXHUwMDA3kFwiKO3KecnA3TxcXDTT+Es9MMbMsebfs55LwYzStKnOXHUwMDFjj2hcdTAwMTLOY/iuQfeMRFxcLK9lQVx1MDAxY9/Es1xiMFuAQJ24hfzom7xcdTAwMWRcdTAwMDebcVx1MDAxYZ1ussnN2zCBzVrK2GSj5y1cYjRcdTAwMDA+no7icGsxpNtEXHUwMDAyW3Uo7lx1MDAwNlR5XHRVrfaJfI9cdTAwMTJIs2FHK1Z0pv09XHUwMDE2zj/gXFy+YVx1MDAxNvG7jPU5z9tByKlcdEo8PSfZn7Bw7NNcdTAwMTghnzdHyLcv3q98etp331x1MDAxZn/f2ttaXW/tvlr79iBcdTAwMTAyOHaPjojlJHd0jVx1MDAxZtUlQkZub/JcdTAwMTZBjr4l6lx1MDAwNYA0zOsoYVx1MDAxON2Oq6pTgDSWa1x1MDAwZtwmXHK2PJGilOxcdMlUxe9cdTAwMWPlw4XI631cdTAwMWEuzem8IC2vp/ZpvFx1MDAwZpeGXHUwMDE4n3t+eTafri/HN1x1MDAxOdunsIMwd1UpN+FxU1x1MDAwNaz1uMBM9nB1+XJcdTAwMWE4TJotZH1T3lx1MDAxZpntvpRv0ISyJM+WMYtHXrDAXHUwMDFlvv3ag7uZMC4zXHUwMDA2XHUwMDAxaJHcYCRFmliWmedmJG6RlVxcxq9cdTAwMTcn2CY777wqjNa2tPVcdTAwMDCzXHUwMDFluOZqXHUwMDE5KItY32Uzw33yeFx1MDAxZeW9l3nTkD/TtzXbXHUwMDFlcZeVUdw0dVx1MDAwZlfSJMvCXHUwMDEwjVTh1HJznPLt1rOjIPtvTlx1MDAxN9pra7td/+1t+82DwCnWY+f9v5Xi8S2llTTLdjFcXKQy3JMqVWlcXLPBqcj9XHUwMDEx7ORcckVijFRxXHUwMDA2wpluMmtcdTAwMTG4XHUwMDFiQEygVOC+X23s7/adXHUwMDBmXHUwMDE3pHjWoItcXMdn5zqdXHUwMDE2rCxIbopRJFwirOdmq8bOQn31mke0rFwigiDWwYvSVlx1MDAxYdZTwT/BtyrLNfX6TFx1MDAxODf1++CEXHUwMDA2d+BcdTAwMTlGpSxcIutcdTAwMGYk2z6xjqdcdTAwMWVcdTAwMThVJjVcdTAwMTdQ8mZVXFxBSpCxrPNcclx1MDAxNpYyXHUwMDFm2Eoy5qW/TFx1MDAxYV41vCatKWGP3Fx1MDAwMcNmZNz85q94er+mKXOcPOZo3JNZsVx1MDAxMNX4yp7MK82d+8uvvZMlp1x1MDAwNotvvVx1MDAxMlx1MDAxZsWPo6er2/1cdTAwMDfh3D1r8tllXYPRjutcXM58O1eHWLjpgYFs+WpL45rZ+lx1MDAwZneos+hcdTAwMWV6jFx1MDAxOGZMXHSL6z9cdTAwMTZmXHUwMDFm82xvMJNcdTAwMWMkP1ZM2d9cdTAwMTTkXHUwMDAxe/drfppcdTAwMWRcdTAwMTjYtVxyaiNcdTAwMTW30KSuJ2hcdTAwMTZcIlx1MDAxYTaJdT42QVx1MDAwMsnGrXlcdTAwMTM9XHUwMDA2ubLU+T9jgoZOU3BZvsFcdTAwMWXN2UrjSSHwr9xsXGL1L/W9g3V4PIBoXCKvpeuXa1x1MDAwNFtcdTAwMTCyR2jMz1xuSPd+4V1Ymc7PO+aKan1BOTCUM0CkYvGIK6dcYpnPwzRcdTAwMTjByspcdTAwMDbHanCfXHUwMDEwt3/xjFx1MDAwMFKhVF7ZXHUwMDE3NEApwZ0koFx1MDAxN0F6LkCVMZ5LTDykwbJcdTAwMTi/SWOaWVx1MDAwYmRjXHUwMDFmzIbKlzJcdTAwMTU3kyd3nOVcdTAwMDDv2V1cdTAwMDKzZuvLZcrEy4V0XHUwMDA3qMhcdTAwMGLVXHUwMDE1KSY7WdkmO1VuXHSdp5+YoFx1MDAxNUitnnL83Ivm6Nzb0kJcdTAwMGXk0L1cdTAwMTFuZNZW7PLSrn5cdTAwMTDobLnZiVx1MDAxM8iliUJ99iU8W8RWTrOvsFxm5pZcdTAwMTbRcJVg2H5M5Z30ZDU8gydbnjnEZeBiQHWOz0ww5rpYd1x1MDAwNt1vgP6nXHUwMDAwNHyaU+zHbZjmjukmQ1x0XHUwMDBm6jwsXFzofKdH/VxuhWK3U4Sjns2vWNhRcrmSXHUwMDA3znjFXHUwMDE2f7I+M1UnXHLCeG515MZcdTAwMDfVwOHqTFx1MDAxOXZ3XHUwMDEwztg87ighVsk87lxcXHUwMDFlt1x1MDAwNbKVXHUwMDExuz2yL0FaT8FOakZcbp67JOl2XHUwMDFiJFxuXHLPfHLki0pzb1falJv7Xix7+INcdTAwMDByL0+9wLxZjefORSmB+0GU8apYks8uZL9IpOBcdTAwMWVcdTAwMDNJ0Fx1MDAwNOyT509kNItCMXu/XG5XY/nVXHUwMDBiXFy1YPi6kJgoourL5qi6/MU9+jL6MVhd+mDfrbVbj3rrg96DQFV31lx1MDAxMIeN2KDxslT06CX3Zlx1MDAxYsVWpcq6UFx1MDAxYdeMQNXnjarZgjOwOMVVgarN2IZcdTAwMTBBkOAup+JS6cW5rkE69oj/ndL8z8FURZCz7HVcdTAwMDKilVBewVx1MDAwZdmRW+PZYdzEXHUwMDA2W+1cdTAwMTVpoFx1MDAwNaFcZtwzrlKOKlx0QVx1MDAxMU6OXHUwMDFk/XlaeP1e9izPp0nQXHUwMDFlkMCo09WjkrxcdTAwMDZn50X20tBsMlxy6CptJ9Ts41x1MDAwNorKc/Mk+1x1MDAxNNdcdHNcdTAwMTn7VcGkOS5WdyTiXGbb9kZuIGC3nvrd4rOVxtS1ZCaXdIyd+tNcdTAwMGViXHUwMDEznqA+MVx1MDAxYngmhVx1MDAwMZWU7PwlXfnMIDbKYctSXHUwMDFlX2NcdTAwMWHsIJB5XHUwMDEzKO6bZGVcdHG9NLU8XHUwMDE5IVxuj/DLuCZ9imct8Fx1MDAxY3mZXHUwMDA24f5cdTAwMTTcemmTg/CeXHUwMDA3XHUwMDA1RrY9YDv9WrC/XHUwMDExLlx1MDAwZjs7ozP4qVx1MDAwMGetp4Iz1MlcdTAwMDVbaFx1MDAxZllE59Xm6PzktTs+XHUwMDFkLlx1MDAxZC3ufu24XHUwMDFm611p7NBNQef91s7+ybDz65E5MFWUZ7HYv0LGlO/awMZiRkd22Fx1MDAxN4W+25PI3OGvq5G5Zduh6qRALSRP4HB5w3JcdTAwMWWnMVx0zJa6y+SKiWc/ZVxcholalt6NWXBcdTAwMTGXr1x1MDAwNbh/XerdhWpdJJP+no7Dl9/5q6DB54qx/fKZfnOg+6+W3vc/fHF658OSXHUwMDFil1slOtxcIlx1MDAwMM5fvvP3n1fJ/dJ5tvhi9Opg/WRl6dmnL892n348WbyR3IuPjzrfR6mgsyu+XHUwMDBiXHUwMDFmPo7ebu9+fbMqv+wtii39fG+jIHZcIr65eVBSafJXjeZSTuXNnCm9s1nkuVxybK/nQ1ooXHKOd9bVyzCdWNT5y0gy+oz77dm5L3JcdTAwMTllUl9cdTAwMGKh/qTd/dxcdTAwMTGbnZ1cdTAwMTjvjze5lnVcdTAwMTX96eZ8pdGlceJ5kVx1MDAxYk9ZgTuYXFxN5Fx1MDAxY16xxFx1MDAxOHlcYknxzNPprrtsyMk4Zlx1MDAxOFLnSkhcbtdcdTAwMWZ1hvze3OLa8tx6Z4jBXHUwMDE3ZnXQXHUwMDFmrXd/nO1nSF592jrs9nL1TEQu9rp7/ZzudSg4Qb5Rd6fVu/zAYbfdLkLjXHUwMDBlhLbAZIfLTcBrMOzudfut3rtGt9E6XHUwMDE5XHLedo7PbmQ0POlcdTAwMTSfWOf5JdvKzqOgn0P0gt2VXHUwMDExnUdcdTAwMGIyXHUwMDE2q9LAV81cdTAwMTE9XHUwMDFlfHuybLZPlzfeya/L71x1MDAwZV5snmxu3Vx1MDAxZlx1MDAxYpyC6II96GWsRnRcdTAwMTdExsS11fqeI7q0gWdcdTAwMWZcdTAwMTai1HtcdTAwMDTpz+KT0bfY0ivv9j9/P33U2txcdTAwMGYnXHUwMDFiXHUwMDBmXHUwMDEy0tvt5UX9ovu29/bLu07v8cHCyudHP35cdTAwMTmkV4+mXHSkXHUwMDA3bnJgfVJkqU0oaX00mWIxJPtcdTAwMDBXYzp7XHUwMDFisolj0Fx1MDAxMXHkuJ/Jb0yvxfTX14B0hedcIpRRXHUwMDEzbIyzNH3rgkBkb0PhRKd7XHUwMDA06WvDwdduuzOcO+qdXHUwMDAwJO9cdTAwMDOa11x1MDAwMFdcdTAwMTnNp97BTYH8zKhXeur7vvvwbct+XHUwMDE5nK682lLLh8ePJo260+t1j447qV3zXFzujFx1MDAwN9g4zap2Oa5LyFxyW/OsK3aNvzDssYJcXFq2NllQQktVsVx1MDAxNdGwhS+Pw3XXsu5dXHUwMDExdoS4gXWXrPT+2vabatueXHUwMDA01ItymjGgXpg8ezqrQjosieGmllwiXHUwMDAw/HlYn/qZIH5cbnTXQeHqs8dmY/Fwb/NH5/irfvmpc7D0etRcdTAwMTS5by1cIvj++dWXzd7S0/dLL/tb6t361vHn983k3i10Vz+9XHUwMDA20M3W7zyWi/1QXGLdhW2/uYtkk3imVVx1MDAwM2tkpZnEbvbyt0BtzbP/lKxqZmGvipp/xrrLke9Dxe6318DuwHaPslhcdTAwMWM0tmQ1ieiX4C25+9RGZ3/ClO9cbrz/3Vx1MDAwN5E9vlx1MDAwZthdg5bTsLt8XHUwMDAzs4Huz/7Rxt7K4fu1b5uPnz39+PrL3klrOGnU7W7rcNBvl+zaRJexoe1cdTAwMTToXHUwMDBl+elq3Os/XHK6XHUwMDE129wqLpRVYbdiyyZt5V1j91x1MDAwM7Lu9ZujN1x1MDAxZKrwXHUwMDE15p1bxlT4jmznaf3PxOs/id6LrXerg80l+2pvZ/HxxtHbXHUwMDBmj9vvn/zjULb6LpugrHXsKMeGh9E5X9xdd1bZXGJrzFx1MDAwZppzStvqQFx1MDAxYZG4XHUwMDAwRyZOi1x1MDAxOFxuq8O3iLP/XHUwMDE0S3zXXHUwMDFjZ1x1MDAxNVv5umJcdTAwMTg0trjCbtOJgFmwRuF+guyg/e/+o1x1MDAwYpi7XHUwMDE3KFtcdTAwMDNsXHUwMDEzKDvtXHUwMDBlZlx1MDAwM7NXk4eS60nNWnLTg46SR4xPgixocSZcdTAwMTG2xemJr6Cyqlx1MDAxZT08hkD6yJ3H1zBptVx1MDAxYjvG/GeY9MaNwVVcdTAwMWJcdTAwMWVcdTAwMWVcdTAwMTBkdUA91dKV4IG+qrBcdTAwMTdzhrbOht0/Y+uzbVx1MDAxZVRUSv4sXHUwMDE09XH87Vx07G1YgzauYCvMVufsITXJoOVOaueEt5tcdTAwMWZNrrTmSYiOlSSFXHUwMDAyrPm91lx1MDAxMac578BvtVT5Wkfx+Fx1MDAxMij/93SgXHUwMDEzupJcdTAwMTTcTVx1MDAxYu7VpCFcdTAwMTmuys/6MHBcdTAwMWPsXHUwMDA04Iu9XHUwMDEwzsfrMsRcdTAwMDc8XHUwMDAwOjBnnpxcdTAwMTjQYLzXKvIru7ROb3vwrVEgtH7w5MPrJ3ZnaeX49PWHx+tcdTAwMWZOWrvfXHUwMDFiMlx1MDAxM8uTk/OjMc58ZqnoxfnMs2nQ9Fx1MDAwMoBgMs2DfvX56lXF5nglbWatuVx1MDAwNf+5rXbV9vZDTyxOqVx1MDAwM7hcdTAwMGU10YH7rXSsKlx1MDAwZlBmXCJ8unCfrPlcdTAwMTO6cFx1MDAxMuHtc5ON5TdPhFo8tVx1MDAwYs+erfV0e/v9ilxcaMpNfF9vhrWX7vNO2POvzer7Z2vLclbcJHpb6DhyM25SfZdccrhcdFxiXHUwMDA1l6xZf4hh6ZD2ZWJfQ8mjhZ3hWVx1MDAxMVx1MDAxNfbobVx1MDAxNkFMuI1cdTAwMGZ/iipz/Fx1MDAxZMVMscOt5sQkalx1MDAxMVx1MDAxZNvnVFx1MDAxMZMgptlcdTAwMWK7tmmeRnRcdTAwMWbrcVx1MDAxMNjPXHL6c//uf+1cdTAwMGVHJ61cdTAwMWX+1lx1MDAxZrQ794Gi1CBcXFx1MDAwNUXhnVxc3Ed6XHUwMDE3s6EpV3uiq2iK1zJcdTAwMGJBqmhCXHUwMDA14jq2VLKFVGCVhcMvqFC5iFx1MDAxN13GY6WlXHUwMDExMVDVxlxu8dvUi6b+/saQXHUwMDBi3HRsjFnlXHUwMDAxlJq6fG/Zw8hcdTAwMTRcdTAwMWKF/8P4SoV68mdhQjPHgiageWbU5Wq/UeBcdTAwMDL51rqIXHUwMDAw38W8XHUwMDA3XGKPVJ5kLz5jO2hhbd5cbi5cdTAwMTRcdTAwMGZznFx1MDAxNXtcdTAwMTn6168+b3xtm87zU/F8+fm7nYVVM4VsOcvdoTyr0rJcdTAwMTlnXHUwMDA12VxuPDfjvPBMXHUwMDE0j8K+P+Tl6orwq1x1MDAxY2n0cKRcblPFsnwjS8xF68wqXHUwMDFlcDY125OF6LmxPVx1MDAwNLhkVzhcdTAwMDeqWFx1MDAxM1x1MDAwMaW9XHUwMDE15vJPcaRcdTAwMWZu7Ei5pDKlsFnJ6ZXNXG50XeooXG7Nk/5ZjnRhuoLyp6Cad+FJXHUwMDFi+yV6Uq9MhJ9cdTAwMDdcdLHsa1ZoT3LumWRcdTAwMDavZaMunnIwK1x1MDAwZnp1+XbiQYVyikfFXGJtrOCRdHZipIonXHUwMDFmhGuO845cXOfVXHUwMDE1sle7TsCHUS569lx1MDAwMLKl7r+Op1x1MDAxY1x1MDAwN8OzcmW171RcdTAwMTl3XHQqpWN+ILyoaNyrLXjsb9d5hev8ePOkucf8iThZOZZTzelVKEJcdTAwMTieWONvY4HsXvjOqfrJn4Jm3oXnbOyPXHUwMDE2zlx1MDAxY5JQmv2nvORhuZNcdTAwMTlpm92O27xGllx1MDAxZq5S5O3NlJeG7SYmXHUwMDA2aSZqVe6T35RcdTAwMDf90D+wJ62Pr9pcdTAwMDfD+PTTx1x1MDAxZlx1MDAxYofNKuvZ5FNcYqCx4YnupY5IXCIgJlfjZHlF3YBzmefmeclTiGWsOlx1MDAxMkRfx1/+J9XWf6v2l1XpOefy8/2qXHUwMDFko566migj29PEKG8jqLxpem7zPJv1ampOLiSv3jgnN1x1MDAxYVx1MDAxY01LyCXjLmffqlx1MDAwNzqbtNvTXHUwMDFk032z8Gr7udlaf3n4TD1pf3600sh0rcysZjdcdTAwMDQu9Mm0NFx1MDAwMPSZwTSmalx1MDAxYVlcZjFTLj+03rO5fKG/83iV6zr1Pv9Jcc735naLR0/qUGGi83l9x1TDtd475+y93Od60u9+nzvmZ0aVdjvu/vVr7bZynLPav5paZGFSp3eKMjy/geVcdTAwMDRVSnU632Cmz3zGXHUwMDBis6lcdTAwMGVcdTAwMGU/tX/Yg+7w82prZfR+ZdpcdTAwMTkt92frqvWZUWzgYuKEv3JcdTAwMDZvXHUwMDAy3kTtztWf8TM/5/MuXHUwMDBljPbEXmuqm0Ld925P17bKqXbzXHUwMDBmNlnlp/ph76JH0F/d3e1Hc5Ncclx1MDAwN1x1MDAxYm8+PVxub7fXh8Njv/rp+eNnXHUwMDA38r6brFx1MDAwNCXI2Nteapv3wihlVVxcYNmWm1xmMmZptFK4LLAy2VxurySMt2q3wITVSmZ70mWpWzLb8zcqqztcdTAwMGXWtpbF8FU/PDpuP+qPXHUwMDFlP9566T79ssrzmzmF5+/erc3999ziyWj/rp1C5aVnXHUwMDEzfl+9N+DK4lxcXHUwMDAzzJLGgfSGiuJcXGs1uyRoO3XZm9S7cslbhex3mnF6+C3jfKWZXmeFxmqedVvNpv30JVx1MDAxYWG4QqPkbVx1MDAwNOX3XCLNWNJJ/ixcXKrj+MtcdTAwMTPOaWa5xca1rswtXCKc5Fx1MDAxNrEgjJWI5yazdjHjOZBGXHUwMDBiNvf18nq1ro2SjFdvNSiN1/F8XHUwMDE0nlXGLuOxopjYZ3jbq2C0cizkvd5y/OyTjX+cz/F86+hofVx1MDAwNI29fFx1MDAxMvNfu51vS5VOhj9cdTAwMDSyfGB0Mp3cOv/+4+//XHUwMDA3bbKKhCJ9 + + + + + 2. The remote provider expose an API to execute containersVirtual KubeletInterlink API ServerProvider pluginProviderAPIsPodContainersPod on virtual nodeVirtual Nodeunix socketunix socketHTTP + Auth \ No newline at end of file diff --git a/docs/static/img/scenario-2_light.svg b/docs/static/img/scenario-2_light.svg new file mode 100644 index 00000000..be103dea --- /dev/null +++ b/docs/static/img/scenario-2_light.svg @@ -0,0 +1,13 @@ + + + eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1da1dcdTAwMTTJsv0+v4LF/XiHuvl+nG/gXHUwMDEzXHUwMDE0RVx1MDAxMVDvucvV0FxytDTd2DQqzpr/fvcuXHUwMDFlXVldTVx1MDAxNdIgzFx1MDAxMUdH+1x1MDAxMZVVXHUwMDE5XHUwMDExO3ZkZORff8zNzY9Ojzrz/5qb73zfafW67WHr2/yffP1rZ3jcXHUwMDFk9PGWyv99PDhcdTAwMTnu5J/cXHUwMDFmjY6O//U//9M6OsrG38p2XHUwMDA2h2ff7PQ6h53+6Fx1MDAxOJ/9X/x7bu6v/E+8023z++/86dMt8TFuqM314Ubn63Cl92Mj/2r+oYtcdTAwMDFccjs7o1Z/r9dcdTAwMTm/9Vx1MDAxZK9bXHUwMDFmM+mDdDFcdTAwMDTjZZSX757iXVx1MDAxZEQmpNUqaCmFXHUwMDE0Vl++/a3bXHUwMDFl7VNAMJlcdTAwMTA6XG6nrMDPWMB+p7u3P8JHjFK4RnTBm5j/mMvPnI3oX3Pi8pXj0XBw0Hk06Fxyhlx1MDAxY/Z/yVx1MDAwZX+NXHUwMDA3vd3aOdhcdTAwMWJcdTAwMGVO+u3xZ1q2XHUwMDFkdnfHn9nt9nrro9NcXDKeNJ7ofEn+1vnoZen1ad/CXHUwMDA19/b7nePj5DuDo9ZOd8RcdTAwMDclxfhcdTAwMGU4uqPldj5h/zdcdTAwMWXTsHXYWeaM9U96vcuXu/12h/Mwvy1cXHK5fvv8clx1MDAxN9M9nkt9/srf48F3OpQspVHWXG5cdTAwMTPH0zTWO6kmXn016Oc6qITU0Vx1MDAxOevHn+hcdTAwMWU/huKNcrG7rd5xZzxcdTAwMDFcdTAwMWPbk7FSJrdzctRunX1JeuWs01x1MDAwMVxuZsfz3ev2XHUwMDBmyt/pXHJ2XHUwMDBlxtf5o3BnJU3f0+9aq5tcdTAwMWa3t8P6in2pl/qjl3t7jTXdXHUwMDA3mylcdTAwMTNMULpC041xXHUwMDE5XHUwMDFlXHUwMDFl3rduiqZrfERoKy00fVLJtdRZNFbLwpt3oN37rZ39k2HnIei3n4F+x6jgQ6Sv0m8np+q3UVpcdTAwMDZf+Np9VG/devtl7fDJalutb+mTha0vL/bWXHUwMDFmTar3qPN9VPLhwmTaXHUwMDA0LVx1MDAwMow4XHUwMDFhqU2i2lrILESt4Xg1noOXdkK1g5GZXHUwMDEy2rtgLb5cdTAwMWVdhX7/VutqtVx1MDAwZdVqnXz8XFx/XXRCeYBphfqq4Kapr6N3XHUwMDBlzsbZqq/XmPBcYpu6hvqOtZFaiPtX2dy7/c7csHM4XHUwMDE4deaOhoOv3XZnONf5fjQ47sy1+nOLa8tzo1x1MDAwMV7o7JzgXHUwMDEzO4P+qNXt41x1MDAwNlx1MDAwYjOP19a7P3JLXHLJq09bh91cdTAwMWUnyiZcdTAwMTde7HX3+Mzmd3CXneF88cGNulxioS4/MFx1MDAxYVx1MDAxY43fvbz25HxcdTAwMGWG3b1uv9V7N8Pbap2MXHUwMDA2bzvHZzc2XHUwMDFhnnSKz7nz/MKwYHn2XG6vMPSvX33e+No2neen4vny83c7XHUwMDBiq6Yx6Fx1MDAwNSmyqG2cXHUwMDAyelxi/oKV8GRhWnhH51x1MDAxMXNfNzW8s/hEVPIyulx1MDAxYuvTb0dRdFx1MDAxNIs3xz9N7Fx1MDAwM1xiVuGfXHUwMDE2U1x1MDAxZIiR0UVE8D+Df/97ObzxQC+V0/f1Zlh76T7vhD3/2qy+f7a2LC9vM1HQ1nA4+DZ/+c7ff14ld/vlM/3mQPdfLb3vf/ji9M6HJff8RnIr0bNwxa/t5d7Xb90t+7nlP6/8eN4+7q5cdTAwMGZcdTAwMGJiz/82nu9bXHJcdTAwMDWqR9MgXHUwMDE0XGJRZFx1MDAxZdGOhcmLXGKLTu09alx1MDAwNFxuXHUwMDFl/mBqkFx1MDAwYlx1MDAwNpHh/SiisN7h1ibt/XpcdTAwMDFu9HJHXW3gu7udnVx1MDAxOP9cdTAwMDFcdTAwMDa+2TxcdTAwMTSQ2jlcclx1MDAwMLZVpuzMNEtcdTAwMGVRXHUwMDFhfDHeg0h2XCJcdTAwMTTY7Fx1MDAwZUcnrd7ci5NtjqhcdTAwMWHfRfLqjfH9sNtuXHUwMDE3MS+F+DrwLKP+1Du4KZRfXHUwMDE4LD89XzHhPqppM25AKKVVXHUwMDA1clPQuFx1MDAwMj2Yrlx1MDAwN2cuZePtkWptrlx1MDAwZo9WzYr+0VrrvVnZmWZzO8PB8fHCfmu0s3+XdjfpTXibzqnMSYTHcGvOXHUwMDFinbo0XHUwMDFkTWaENFx1MDAwMn5cdTAwMDYxjPelcV3PXHUwMDEzaeV2Onb8mUuvqGJmjIaBXHUwMDA0Jb0u2OelV8Q0ZVG4XHUwMDE4nbQyXHUwMDE04thzg49CWyO8XHUwMDFkXHUwMDBmv+hmxjHA8sbeidj6rvufn784Pv34eFW4zV5cdTAwMDGx5vefPO/udlx1MDAwNt2WtCed02BcdTAwMGW3Py1+vUCqWnc11S9N4P4soa4wKa3haFx0XHUwMDFh3O3vlb/S6benvNNrXHUwMDFkj1x1MDAxZVxyXHUwMDBlXHUwMDBmuyNcZmNt0O2PJrwq5S4yXHUwMDE02O+0Jm5cdTAwMWGSp753RHHpXHUwMDFjjP82N9bF/Fx1MDAxZpd//78/Z/DpXHUwMDA1oLH2ylx1MDAwMJZccv4vxJh359/PQtCRYbtC+Fx1MDAxZY1cdTAwMGW1XHUwMDAyTcisilx1MDAxMVx1MDAwNFx1MDAxZVReqHHAx1x1MDAxZqWgw0LxSlx1MDAwZdpo3F2LXHUwMDAzUYAjw6dcdTAwMTGcIPhcdTAwMThcdTAwMDcnuTiTIWJcdFx1MDAwMEVcdTAwMTVxTafrxelMRuYz8Ds4L01cIi5kyoBvS8hTXHUwMDE4nqxcdTAwMTXnXGa8t5XGOlx1MDAxZoJcdTAwMTUmXHUwMDE0xXmXOeWCt1xugZGxvn4qZi9O6+Bhd87Bv7jkZpmlN1Akj/DPS+/rpelM6OAwuUqZXHUwMDEwk7FcdTAwMDWd4UWtXGZcdTAwMTidlsrUXHUwMDBiU5nFjVhcdTAwMWKEXGYyWF+ShkjSWi8trlx1MDAxNbWqN1xumWlcdTAwMDUyqUBZvESwk9yqhNp55aOQXG6oXHUwMDE4naq/2ZlcdTAwMGKEbmlcdTAwMTmNkc5cdTAwMDOSgFxuIVx1MDAxNWgzXHUwMDAxg8VcckOLqe/1XHUwMDAyTWZcdTAwMDNcdTAwMDYnuEqijbRleUVgXHUwMDExtaqML2BSbdDCOG1cdTAwMDXGcIW8em2ZtbhcYv1cbspcdTAwMDHXI3SwsFx1MDAxYXT59HBcdTAwMTFosqDxhFr90yqDXHUwMDEzXHUwMDEyIDRQsqjExOw6xMxcdTAwMTi1h1x1MDAxZlx1MDAxNbZ2MmBcdTAwMWFcdTAwMDZTayW+XHUwMDA2M/Bl21xiTkRLr62gXHUwMDAxdyvMZrhHXHSnXHUwMDAxc4OV+5JcdTAwMGIwXHUwMDFh3Fx1MDAwMNQvwFnr2ECacFx1MDAwZU8mXHUwMDBmaUo+gP5cdObvXHUwMDEwMmGunKtcdTAwMWRcdTAwMWJ8MVx1MDAxM1xmXHUwMDAxeIY5gFx1MDAxMZV8sYxQXHUwMDFm4JhcZlx1MDAwMJNo71pcdTAwMWNUXHUwMDA0+lx1MDAwMb6F+zSw8jLygOkqqlxiPDUmqtZcdTAwMWJcdTAwMWKosGNcYlx1MDAwNGvVUahUXHUwMDFjXGJ0lFx1MDAxNupmXHUwMDFk5sO5WoswmcQkYPpwL87CXHUwMDA1TYRcdTAwMDFBaFxciuIwYbX2P2t5XHUwMDBihFx1MDAxN2GNXHUwMDBi8HpQXHUwMDA3XHUwMDA1X5WIXFyQ/EDQ+FxyXHUwMDE0cFwiXHUwMDE43VmQtfc9LVr6o/j/61IpqVx1MDAwYkmPXHUwMDEyl4JLdjBcdTAwMGahXHUwMDBi9HlMplx1MDAxZTcnU1x1MDAxZjs7P37o5d1cdTAwMTf66LB/9OP15qfj9TCFTN35+vNVNIrTXHUwMDFkpVx1MDAwM7aPs7R5ZkjSfyhlnaUvMOpmPGq3mK+9IFFgaj5oXHUwMDFmoURcdTAwMGV+ulwik1x1MDAxYzVLXHQ0dNdGLZRcdTAwMWZTjIusSYCWOVx1MDAxM/149NUs6jdJ+seQJJnB6XCpXG6BNEJmMITUm0XrTaBiXHUwMDEzLKSuXHUwMDA1g1x1MDAwNdiBdULCO0LP4MJtXHUwMDEyMVBcdTAwMDVcdTAwMDVcdTAwMDBcdTAwMTR+RGNcdTAwMTZjXHUwMDAzXlMn0DuAlTfe6lx1MDAwMHJjbz7Cn1x1MDAxMIiIXHUwMDBi2ijxXHLlXHUwMDE1/ixcbnSIj8HI4Fx1MDAxOOG5SUtcdTAwMWHIy6uCXHUwMDEw8SPug2dxacQqM8bFmsE0JJtGXHUwMDAyQ1x1MDAwNOIr4Fx1MDAxMTy0XHSmXHUwMDE0xWWIPOHYXHJcdTAwMDIlkIxcdTAwMDZ8SWVcdTAwMTFPkLya6Vx1MDAxYVx1MDAxYlx1MDAxMqWReITAelx1MDAxMUI0QuBp1EPgrOX5LHAqXHUwMDA0XHUwMDEwyYUgUy4swVx1MDAwNzT1XHUwMDBmXCI9M1v1JFxmj8jTtXpcdTAwMTBxREZRpVx1MDAwM3RcdTAwMDRoeHZcXItcdTAwMTVCoV5lpM+AXHUwMDEymFxmTqPwTiXyyK5jRFx1MDAwMKZNtOAk9WxdyVxm8YP3IKhcYrTAXHUwMDA1k5hJZtB271Uw+Fx1MDAwMGLhXHUwMDA2Rlx1MDAwN1aCMETDy4L6wlxiklx1MDAxYkZMh9BcdTAwMWFIgfBcZnBcdTAwMGZuVS/QZVx1MDAwNnOhSGb4R2JcIlxuXHUwMDAxKVwiRJGXkXCe63nszOVcdTAwMDVcdTAwMDTsXHUwMDAxUZhcdTAwMGWYSuO8Klx09Fx1MDAxNnpktFxitM3a+J+0XHUwMDE46kdcdTAwMDaCINo7m/J2hXjA4+GCXHUwMDFiKFxc0tfTk1x1MDAwNVxyskMzgFx1MDAwMkZcdHdtSlx1MDAxYWNhIVI6q6XX0ddroDZcdTAwMTlUVighvJVcYnB0SZ5cdTAwMDR3XCKpilT8eoWZtTjQXmvxjFx1MDAxME1cdGhuiVx1MDAxNfuM9TZCgcLgIdZcdTAwMTOoXHUwMDA1zVx1MDAxMYBqWfhcdTAwMTD4ulhcdTAwMWVcdTAwMWXAKMD3wNRcdTAwMWOu1SDrXHUwMDExYFx1MDAwMcBEQCfXXHUwMDAzjS7PbnB4XHUwMDBlZERcdTAwMTZKUy/OM1x1MDAwMc7QS2Jm7STlgWdcdTAwMDaNZJkoXHUwMDFjW4PhOdBcdTAwMTAjXHUwMDAwZDBP3FM5tVxiPVx1MDAwMkPxgVx1MDAxYzDWu/tZi4P7MFx1MDAxNrdcbupcdTAwMGXfkWaM4FtgM1x1MDAxZU5cdTAwMTHeXHUwMDA1M9JAnMgs62ujg/ODXHUwMDE5pJbrwHXzJKpcdTAwMGY+ssCtiTxcdTAwMDCHZfZcdTAwMTUzga+VU59cdTAwMDY6JF1cdTAwMDRcclVcbuFDvW9hXHUwMDExsLWMJ4R1oMrpXGJjhpcxtXm6htmZu1x1MDAxN8gsj4LqsYBcboFH6vwwXVFrwlx1MDAwYqK22CBdwVx0XHUwMDA2XHUwMDE2McHJzDt8cFGcXHUwMDExLHlBZENcIlx1MDAwYiBuXHUwMDEwYMFcdTAwMWJcYviP4Fx1MDAxZFx1MDAxZIxcdTAwMTjXVOXyPNNcdTAwMDWMW7QwXHUwMDAwq2b6XHUwMDE3cL9KgpBhMpP5tVx1MDAxYeFhxKtcdTAwMTa/NOKEXHUwMDA2t2szPFx1MDAxY1x1MDAwN0PHTCBcdTAwMTJwJXlcdTAwMTE2i5CBvkU0yajOWFx1MDAxYyxcdTAwMDCuXHLgXHUwMDBmz2ZKy1xm1mYwQsSscMvMudaripFcdTAwMThcdTAwMWRDXHUwMDFkXHUwMDE4PKbPlcXB4TFX7fJ0WYM1XHUwMDE1g0BcYpGzsdBVX0qmWIfRMVTzXHUwMDBlylx1MDAxOZqsqeB+gPpcdTAwMDEu2WEgqWuBOC1cdTAwMTGf4Vx1MDAxZHgsUN0m4qAmXHUwMDExYVx1MDAwNpCcy1x090ucy1x1MDAxOLND61x1MDAwM2JF6cvimG9zXHUwMDExMFx1MDAwNG8mXHUwMDFhmC0sXHQ46G1UXGZJQml4XHUwMDFlimfgtlx1MDAxZMJmKVVcdTAwMDNNcVRVXHUwMDA1XVx1MDAxMZg+hCxcdCtcdTAwMTJcdTAwMTmuhClcboh+I4Kuei9cdTAwMDB5XHUwMDFlZlx1MDAwYlxi545cblx1MDAxN9LUNlx1MDAwNLKoXHUwMDA2XHUwMDExKUhcdTAwMDKRvMH9MsglXHUwMDBmNVx1MDAwMFxyaFni9Vx1MDAxY1wiang9sFx1MDAwMybSgeNccuRxr1x1MDAwNoJ6+FxywH/UKe2AQHJp4XAhllx1MDAwMDXg0kYzXG5cdTAwMDLr8cIhXGL3M5BcdTAwMDdcdTAwMWbAJTGAgjdpXHUwMDE0XHUwMDA0eYZLOFxu0ZE3IMB3Lk5keVxiyy0s4LWlu1x1MDAxNaRcdTAwMWNwVDFgmps4PVx1MDAwMSdcdEzQjiFpMjRcdTAwMWLBoJmwXHUwMDA2/ZJgdVxyVs1AXHUwMDE5XHUwMDExXHUwMDBmIIBknbtQZXFcdTAwMDA7k9dwXHUwMDAyLkJcdTAwMDP6h2BcdTAwMWWho4dZRlx1MDAxNlx1MDAxZlx1MDAwN1eShyeKq1x1MDAwMFx1MDAwNUDLRVx1MDAwM7IxY3FcInfxxFsvgFx1MDAxOCU9htVYXHUwMDBiplx1MDAwMUWHfdhcdTAwMDbcynN4eYWHjnD26cx61tQhWlHBSlbZ14tTLLrVXHUwMDAwfY9cdJHKJHbrLdyo0+SnXHUwMDE2XHUwMDE3bWBcdTAwMTVgXHUwMDEzuFx1MDAwYvhcdTAwMTM4XHUwMDE1XHUwMDAxh1BarIlZvizk+Vx1MDAwZUKPenFk7/BDllx1MDAwYpiAr/JCklxiXHUwMDAwW0V272KD1cvZi1x1MDAxM/CQXGJwpGVcdTAwMGXMJ7pcdTAwMTLg9MByXHJCc3haVX+zpDpcdTAwMDZBNdNcdTAwMDRRK2/S4XFLT8A7XGJFIbTBw1NcdTAwMTJeXFzgblxm1C9cdTAwMDSfXHUwMDA2P4FrU1xiZrxG3MaYpomuKMNsn42MVmT0JXlcdTAwMTFcdTAwMTG859akvJjhV8iDXHUwMDA2a6lcclcxrVWJ7kWRIfrxzCpFxHpNUpFcdTAwMWOfXHUwMDBl0jDtwNKSxDZcIqaXcVx1MDAxMVx1MDAwMkghgaSN8kq5XHUwMDEzRaSsMcsmXduLXHUwMDE4PdRcdTAwMDSBXHUwMDFlvVx1MDAwZjxzvfrFjGvPnmFcdFAtzVNNLFA0XHUwMDExx1xmXHUwMDBiiTO9m4ul0YFcdTAwMTZ6uK+gXHUwMDEwXHUwMDE5xPq7zW2N7JPEXVx1MDAxMGhK8oBLkMiMbINwillcbuiCg81cdTAwMDZcdTAwMDG1SEtoYp7GjfCisEdj61fiKVx1MDAwZvhcdTAwMDJcdTAwMWbkXGYwXHUwMDE3dq9Lulx1MDAwMpsgXHUwMDE3jJ6+osHdzlqey1x1MDAxNF2u8UKwpNKXbUN4RDLQYrh71SCJIeHJqSNEXHLmatNcIp9guaNcdTAwMTDxmYh4iMHV+1x1MDAwMlx0Vopb1cYhzFx1MDAwZUxDJfIuXG5zXCJDltBE+aiuJGmAfVx1MDAxYVxcwnJDvsrgNFWd1l1cdTAwMGZrkivbXGKVLbdcdTAwMGXheyVPj2iPPlx1MDAwNbyU4OtcdTAwMWKY2ozlOSalJVx1MDAxN06otvD5tvz44K5J/Fx1MDAwMuhDfZSRJ1mA4WSeilx1MDAxYqXSpFx1MDAwM8s3QFx1MDAxOVx1MDAxNFVcdTAwMTOwV0/9wJ48ZoLZcqiY0+ViXHUwMDEwlrEhStOYZF+fXHUwMDFlxcOzYFx1MDAxYbgwnLJQpjS514RJaopcdTAwMDNcdTAwMGZTTEBcdTAwMDI9oiqrijHGscBcZtDha5c3Zi3OMPlcYv+pXHUwMDExqMNLXHUwMDA1U3p0XGLFPVRcdTAwMTig3GBtiF5cdTAwMDD4XHUwMDFkmdtjXHJHKDtcdTAwMDFcXIf2XHUwMDAyu3H1wVx1MDAxOX1cdTAwMTTiWlx1MDAwYuKnPZPbZVx1MDAxZmWiYb1cdTAwMDRcdTAwMDDKXHUwMDAz0lx1MDAxYYjjpDHxXHUwMDAzozTSluFRXHUwMDA2Q+vHezHWP7jZSlx1MDAwM/iAX1x1MDAwMFx0uCGRlVx1MDAwMiXw4YKpUVQ5j8mtXHUwMDE1h7BcdTAwMWYqXHUwMDBmho1JXHUwMDA14sqSNIBcdTAwMWI4XHUwMDBiUFvDy9daXHUwMDE34op8MVxyNDRfb1FlLItQOFBcdTAwMGZN9lZfXcowReXs0Fx1MDAwMZtVlKEkzsPy8tVApp1rtYRRXHUwMDE0yDpcdTAwMDNNuFtTXG5cdTAwMDNcdTAwMTBEsTiJ1MhBmepcdTAwMGL8MDgwUHJcdTAwMTVti/t9+Vx1MDAwM1xyXHUwMDBlXGK3QfOYXHUwMDBmN/XckVx1MDAxMa2RxktcdTAwMDMnXHUwMDAyN1eOZ1xyKFx1MDAxOTRcXEqSt7tcdTAwMTXGZYroSWvyVHdcdTAwMWGfXHUwMDAwX1x1MDAxMdBcdTAwMDXmuFx1MDAwNcs7a8WRWVx1MDAwMIhcdTAwMTnwO1x1MDAxNlxmJpNcdTAwMTC4XHUwMDFjXHUwMDA2XHUwMDA3jetcdC551VtqQOirmIOFedFzpz6OvFx1MDAwN4jBkk64uVqshqVcIog2XHUwMDA2XHUwMDFj02ouaCZuxCNsx1NQXHUwMDFlYSdT+/VcdTAwMWGiyVx0YVYwbEY0XHSygoCqfFxyVpMg1+e1wI7xdDEkRCXQKZeyd7BjxCxcbozWXHUwMDFhXHUwMDA07fX0WDNcdTAwMGYmWF9cdTAwMWNcdTAwMTHTxURFQN31WUgqmVWVtWNjYiEwXuLWdqlEObGAwFx1MDAxNVx1MDAwMVx1MDAwNHxcdTAwMTKD7NrHxixcbtfXWG9cdTAwMDI2XHUwMDE4fEmaM8EhmGe6rUEp6YylcVxyXHUwMDFmgb9cItIgvlclaXyUXHUwMDEy4Vx1MDAxZcIohC21XHUwMDBmzojMM+3p89yXK60hOVieIykwfLDwS7XiNLBcdTAwMDRgyqKV/I7KmbacQ1xi06CgXHUwMDFjomBcbqw0jFxm1VRZXHUwMDE0O5xcdTAwMDRWglx0XHUwMDE36lx1MDAwMZVcdTAwMTlK4Fx1MDAxMrc8UodFuiz9y8VB32H2XGIyqb1A6pI0J3FcdTAwMTlIglOS9WSY6faomPr2XHUwMDFlyC4n0s9cdTAwMThcdTAwMTbQWVu4zfpcblx1MDAwMSbbXHKrRDFcdTAwMTOK+ZiSwuFcdTAwMDJcYu1cdTAwMDRzdj7Uj41OxLN6PGj6xVR94UvzMFx1MDAxNsEgnka9XHUwMDBmyceG20AgXHUwMDBmnlRKtENcdTAwMWHrknC31Dhdv1x1MDAwMsXeL5HF6Fx1MDAwNrbqnPflNVx1MDAxZeijY/k201x1MDAxNfWAmi/xcPU/wq5YI1OSpsglWNiFXGK9ntZcdTAwMTiTcVx1MDAxMZJKwqovN7H+JFx1MDAxOElcdTAwMDOBuL/srqXJvOpE535cdD4kVVx1MDAxMW5cZoCTh1x1MDAxZVqbLzY0cHHgb0w3kL25wma5c3lS6Hz7XHUwMDEwo7zQXHUwMDAwXHUwMDFjbObhY+GQXHUwMDAyd7rEiXVKxFx1MDAxNDov/UboWF/zwVVZXHUwMDE20MnccbtcdTAwMThL4lxcXvtcdTAwMDCPXHUwMDBmX19cdTAwMWbEzVxcXHUwMDFhXHUwMDFmtGCNhrbCJzrHXHUwMDA1aMWkXHUwMDFh7pX5iPp6srxYXHUwMDA2lsr1XHUwMDA0oYTVyUxwgZxcdTAwMTdcdTAwMDLwKuBH/cY0jeA8Wlx1MDAwZldcdTAwMTFcdTAwMDVcdTAwMTPtXHTmc+hcXFwiXHUwMDE0XHUwMDBlgVxuS6FqR6eAdlxiXHUwMDEzuFjsXb417s/0XbB7jYFcdTAwMDO+XCJCnPpcdTAwMDAnMryCL1x1MDAwM1x1MDAxZEU4bSe2kjHWXHUwMDBlzKjCpTTa4TJLcZpcdTAwMWNSXHUwMDEzOT2huFxcPIJcdTAwMDfGnUZcdTAwMWVcdTAwMDZcdTAwMWRcdTAwMWHsr2JQXCJYh+00s1x1MDAwNuneJZa2eD5a4ERcdTAwMDD9bTA4l5GSXHUwMDA3rvBcbm47SMQpxlx1MDAxOLD9vF5N1Ps67bnLjes5JC/pUrvKi1hcdTAwMDWYXHUwMDE4aDRcdTAwMDPh+ludrbSQOUW9YtEtfFRa71x1MDAwNThcZl6y0tCykqc+OVx1MDAwN3FcXHiUKlx1MDAxMIylKtd7WeY0XHUwMDExTSmjSDBcdTAwMWHcq1x1MDAwNEpBn8BHjInlajQylMhMXHUwMDEwXHUwMDFioKn6m8W0clx1MDAxZFOCykUny9JcZotcZpWEftvQwPrBN/LnkqfJgNmmJE4zvWb42zeh+oj5I+tcdTAwMGLZ7Y5bOmTp0Vx0qq8hYVx1MDAwMTWoXHUwMDFmXHUwMDFkXHUwMDE4hFx1MDAwN+hgbvFfjCnocCYwTZhcdTAwMGJcdTAwMTZcdTAwMWWxmvnO5SFcbmTZXHUwMDEwwMLAMl2YqORj1pOrzlx1MDAxMm6iPmud15HCXFzhikHSValcdTAwMDKFdaSYJ6bsSLh1g/RcdTAwMDFcdTAwMWLnXHUwMDAxXHUwMDA3XHUwMDA08Vx1MDAwMKYhJ1xuXVxyXFxAsJo7TuvrcFnXK1x1MDAwNLw3xqaYK3UlXHUwMDA3xVx1MDAxNV8ouYzcyONqp3fm8ljLXHUwMDA3Y2ImmfWEKT3hdND88Vx1MDAxNjg8XHUwMDFjY504iaBcdTAwMDbMOeQtW6DKaVx1MDAxNlxmtqGYXHUwMDAwNzHkXHUwMDBi0/XawsJcdTAwMDFcdTAwMDfogUUxQkpT6lx1MDAxMkhcdTAwMGI3YFm7QFCvj9pVXHUwMDA2oiM8XCJisLtcdTAwMDBcdTAwMWWdelx1MDAwMjA1xFx1MDAwMVxchVdcbuAu659cdTAwMWXgynKjMpRcdTAwMDVcdTAwMDNcdTAwMTRpSj2v84eHhW/hXHUwMDE2gFx1MDAwNkXH3IhA3mRYd1x1MDAwN8qVslhuRICL5Vx1MDAxZWuEldzaVy8v39nLRXbH9EhaXHUwMDExlHHZxebWXHUwMDExXHUwMDFihFx1MDAwMVx1MDAxOXydZWZcdTAwMDRq7126XHUwMDFhgSeHK1mF0I/xmKsvXHUwMDA2qlx1MDAxMUd/XHUwMDAznPPceIFcdLlrcZLkkola1lCD/qfJNVx1MDAxNlR6zzImhKBcYu5cdTAwMWItvrDaXHUwMDE4w4BcdTAwMGLCXHUwMDA046mnXHUwMDAyXHUwMDA1S1x1MDAwYulcdTAwMTJcdTAwMTXA1nM9vlZkXCJg/Ok/iv//++xDf52/WLvdMNrpXbc83FxySG1l55YnzTdcdTAwMWL+WDj5XHUwMDEyPveOT1e/v3q192bUXmw92n9cdTAwMTCdW1jGxEVcdTAwMDewXHUwMDEyXHUwMDAzrUjbUpp8XHUwMDAzQlx1MDAxNJhZwIeMwpRcdTAwMDY2o9Yt4Nsu5Fx1MDAwYlx1MDAxMyCBhf4w484t+Fx1MDAwNFxcXHUwMDFjeFxmgiNX9HFcdTAwMTfbXHUwMDBljeJSu7Hjx/B71+GFsIey63CBJWPw23lcdTAwMTdcdTAwMWaWkKaJ54uldzBcdTAwMTWmk12DTVx1MDAwMlx1MDAxMOglQ27FojUhjLtCYJMqtJlcdTAwMGJcdTAwMDTHXHUwMDAxv/HSsjSBtbaJvJLa15c7MGFBMmVdvqyRJlx1MDAwNKXNa1lcYmdW5FnjWnnTTJM/rHjzmFx1MDAwNoXAyLP1RIMquVx1MDAxOYvLV3DIlri3gNncXHUwMDE0ISX4NstcdTAwMDJcdTAwMWQnqj7fzi2OXHUwMDFlcVx1MDAxY4uk8laZpW2sLFFyzLmb6Fx1MDAwNcLRXHUwMDA22lwiXHUwMDA0NZqENLD1RSgxXHL2XHUwMDA0VojL8Tr35lx1MDAxONtZqE/83Fx1MDAxMkhObWjHjFx1MDAxZVx1MDAwYs2r+5s9bY6SO6cvn+283H/bsd+ePl56rtbDl+31XHUwMDA3gZLOkbpcdTAwMGKEg2Bcci6WWjaye1xylMZprqlDt29cciUlc1x1MDAxNyTiXHUwMDFhodW4XHUwMDAwNsVJgIx0TFx1MDAxYiPoXHUwMDFht6y72J1vJJRcclg5biv5XHUwMDFiJy+EPVx1MDAxNJy83qdDXHUwMDA2mss5Z2FcdTAwMGWZYkKGM7glduZcdTAwMDJf0kbI+jKJ6WrIXHUwMDFmz+p7z/lj0+JYX7xKci9ZWCFsXqOX9mlcImBcdMSoXFybtbFcdTAwMDFcdTAwMDObsTiVcTMs+5FwXHUwMDBmuDFpjn3C2lx1MDAxYVAw6fPTNfJuWyDRvjQ+9vrhgodcdTAwMGJBm1x1MDAwNlCAx63Yu0xLy75eqrxHXYLHXHUwMDBiJlx1MDAxOdgnoTZcdTAwMWG5JWRcdOVXx4daXHUwMDA0PDiur1chy7NrIMvG65VcdTAwMWarX+1g7VtrKJ6Fo6PXK/5BIItcdTAwMGXsWqDg7IJXflxccHh+4lx1MDAwNbuOIfpjrFx1MDAwNNJTaFx1MDAxZj1TZLH5zlx1MDAwZmvYXHUwMDE3KEZcdTAwMWarkMVzf6yNXGbNXHUwMDE4rY5n7KJxft4my/1cdTAwMDaWXHUwMDA3XGYsiKdZLKtdntvjXG548esxM0GA9jBFjFC1flGhJE6lXHUwMDBiKDFjXZx1rLxcdTAwMTQssrlrcYjafGBBXHUwMDA3kFwiKO3KecnA3TxcXDTT+Es9MMbMsebfs55LwYzStKnOXHUwMDFjj2hcdTAwMTLOY/iuQfeMRFxcLK9lQVx1MDAxY9/Es1xiMFuAQJ24hfzom7xcdTAwMWRcdTAwMDebcVx1MDAxYZ1ussnN2zCBzVrK2GSj5y1cYjRcdTAwMDA+no7icGsxpNtEXHUwMDAyW3Uo7lx1MDAwNlR5XHRVrfaJfI9cdTAwMTJIs2FHK1Z0pv09XHUwMDE2zj/gXFy+YVx1MDAxNvG7jPU5z9tByKlcdEo8PSfZn7Bw7NNcdTAwMTghnzdHyLcv3q98etp331x1MDAxZn/f2ttaXW/tvlr79iBcdTAwMTAyOHaPjojlJHd0jVx1MDAxZtUlQkZub/JcdTAwMTZBjr4l6lx1MDAwNYA0zOsoYVx1MDAxON2Oq6pTgDSWa1x1MDAwZtwmXHK2PJGilOxcdMlUxe9cdTAwMWPlw4XI631cdTAwMWEuzem8IC2vp/ZpvFx1MDAwZpeGXHUwMDE4n3t+eTafri/HN1x1MDAxOdunsIMwd1UpN+FxU1x1MDAwNaz1uMBM9nB1+XJcdTAwMWE4TJotZH1T3lx1MDAxZpntvpRv0ISyJM+WMYtHXrDAXHUwMDFlvv3ag7uZMC4zXHUwMDA2XHUwMDAxaJHcYCRFmliWmedmJG6RlVxcxq9cdTAwMTcn2CY777wqjNa2tPVcdTAwMDCzXHUwMDFluOZqXHUwMDE5KItY32Uzw33yeFx1MDAxZeW9l3nTkD/TtzXbXHUwMDFlcZeVUdw0dVx1MDAwZlfSJMvCXHUwMDEwjVTh1HJznPLt1rOjIPtvTlx1MDAxN9pra7td/+1t+82DwCnWY+f9v5Xi8S2llTTLdjFcXKQy3JMqVWlcXLPBqcj9XHUwMDEx7ORcckVijFRxXHUwMDA2wpluMmtcdTAwMTG4XHUwMDFiQEygVOC+X23s7/adXHUwMDBmXHUwMDE3pHjWoItcXMdn5zqdXHUwMDE2rCxIbopRJFwirOdmq8bOQn31mke0rFwigiDWwYvSVlx1MDAxYdZTwT/BtyrLNfX6TFx1MDAxODf1++CEXHUwMDA2d+BcdTAwMTlGpSxcIutcdTAwMGYk2z6xjqdcdTAwMWVcdTAwMThVJjVcdTAwMTdQ8mZVXFxBSpCxrPNcclx1MDAxNpYyXHUwMDFm2Eoy5qW/TFx1MDAxYV41vCatKWGP3Fx1MDAwMcNmZNz85q94er+mKXOcPOZo3JNZsVx1MDAxMNX4yp7MK82d+8uvvZMlp1x1MDAwNotvvVx1MDAxMlx1MDAxZsWPo6er2/1cdTAwMDfh3D1r8tllXYPRjutcXM58O1eHWLjpgYFs+WpL45rZ+lx1MDAwZneos+hcdTAwMWV6jFx1MDAxOGZMXHSL6z9cdTAwMTZmXHUwMDFm82xvMJNcdTAwMWMkP1ZM2d9cdTAwMTTkXHUwMDAxe/drfppcdTAwMWRcdTAwMTjYtVxyaiNcdTAwMTW30KSuJ2hcdTAwMTZcIlx1MDAxYTaJdT42QVx1MDAwMsnGrXlcdTAwMTM9XHUwMDA2ubLU+T9jgoZOU3BZvsFcdTAwMWXN2UrjSSHwr9xsXGL1L/W9g3V4PIBoXCKvpeuXa1x1MDAwNFtcdTAwMTCyR2jMz1xuSPd+4V1Ymc7PO+aKan1BOTCUM0CkYvGIK6dcYpnPwzRcdTAwMTjByspcdTAwMDbHanCfXHUwMDEwt3/xjFx1MDAwMFKhVF7ZXHUwMDE3NEApwZ0koFx1MDAxN0F6LkCVMZ5LTDykwbJcdTAwMTi/SWOaWVx1MDAwYmRjXHUwMDFmzIbKlzJcdTAwMTU3kyd3nOVcdTAwMDDv2V1cdTAwMDKzZuvLZcrEy4V0XHUwMDA3qMhcdTAwMGLVXHUwMDE1KSY7WdkmO1VuXHSdp5+YoFx1MDAxNUitnnL83Ivm6Nzb0kJcdTAwMGXk0L1cdTAwMTFuZNZW7PLSrn5cdTAwMTDobLnZiVx1MDAxM8iliUJ99iU8W8RWTrOvsFxm5pZcdTAwMTbRcJVg2H5M5Z30ZDU8gydbnjnEZeBiQHWOz0ww5rpYd1x1MDAwNt1vgP6nXHUwMDAwNHyaU+zHbZjmjukmQ1x0XHUwMDBm6jwsXFzofKdH/VxuhWK3U4Sjns2vWNhRcrmSXHUwMDA3znjFXHUwMDE2f7I+M1UnXHLCeG515MZcdTAwMDfVwOHqTFx1MDAxOXZ3XHUwMDEwztg87ighVsk87lxcXHUwMDFlt1x1MDAwNbKVXHUwMDExuz2yL0FaT8FOakZcbp67JOl2XHUwMDFiJFxuXHLPfHLki0pzb1falJv7Xix7+INcdTAwMDByL0+9wLxZjefORSmB+0GU8apYks8uZL9IpOBcdTAwMWVcdTAwMDNJ0Fx1MDAwNOyT509kNItCMXu/XG5XY/nVXHUwMDBiXFy1YPi6kJgoourL5qi6/MU9+jL6MVhd+mDfrbVbj3rrg96DQFV31lx1MDAxMIeN2KDxslT06CX3Zlx1MDAxYsVWpcq6UFx1MDAxYdeMQNXnjarZgjOwOMVVgarN2IZcdTAwMTBBkOAup+JS6cW5rkE69oj/ndL8z8FURZCz7HVcdTAwMDKilVBewVx1MDAwZdmRW+PZYdzEXHUwMDA2W+1cdTAwMTVpoFx1MDAwNaFcZtwzrlKOKlx0QVx1MDAxMU6OXHUwMDFk/XlaeP1e9izPp0nQXHUwMDFlkMCo09WjkrxcdTAwMDZn50X20tBsMlxy6CptJ9Ts41x1MDAwNorKc/Mk+1x1MDAxNNdcdHNcdTAwMTn7VcGkOS5WdyTiXGbb9kZuIGC3nvrd4rOVxtS1ZCaXdIyd+tNcdTAwMGViXHUwMDEznqA+MVx1MDAxYngmhVx1MDAwMZWU7PwlXfnMIDbKYctSXHUwMDFlX2NcdTAwMWHsIJB5XHUwMDEzKO6bZGVcdHG9NLU8XHUwMDE5IVxuj/DLuCZ9imct8Fx1MDAxY3mZXHUwMDA24f5cdTAwMTTcemmTg/CeXHUwMDA3XHUwMDA1RrY9YDv9WrC/XHUwMDExLlx1MDAwZjs7ozP4qVx1MDAwMGetp4Iz1MlcdTAwMDVbaFx1MDAxZllE59Xm6PzktTs+XHUwMDFkLlx1MDAxZC3ufu24XHUwMDFm611p7NBNQef91s7+ybDz65E5MFWUZ7HYv0LGlO/awMZiRkd22Fx1MDAxN4W+25PI3OGvq5G5Zduh6qRALSRP4HB5w3JcdTAwMWWnMVx0zJa6y+SKiWc/ZVxcholalt6NWXBcdTAwMTGXr1x1MDAwNbh/XerdhWpdJJP+no7Dl9/5q6DB54qx/fKZfnOg+6+W3vc/fHF658OSXHUwMDFil1slOtxcIlx1MDAwMM5fvvP3n1fJ/dJ5tvhi9Opg/WRl6dmnL892n348WbyR3IuPjzrfR6mgsyu+XHUwMDBiXHUwMDFmPo7ebu9+fbMqv+wtii39fG+jIHZcIr65eVBSafJXjeZSTuXNnCm9s1nkuVxybK/nQ1ooXHKOd9bVyzCdWNT5y0gy+oz77dm5L3JcdTAwMTllUl9cdTAwMGKh/qTd/dxcdTAwMTGbnZ1cdTAwMTjvjze5lnVcdTAwMTX96eZ8pdGlceJ5kVx1MDAxYk9ZgTuYXFxN5Fx1MDAxY16xxFx1MDAxOHlcYknxzNPprrtsyMk4Zlx1MDAxOFLnSkhcbtdcdTAwMWZ1hvze3OLa8tx6Z4jBXHUwMDE3ZnXQXHUwMDFmrXd/nO1nSF592jrs9nL1TEQu9rp7/ZzudSg4Qb5Rd6fVu/zAYbfdLkLjXHUwMDBlhLbAZIfLTcBrMOzudfut3rtGt9E6XHUwMDE5XHLedo7PbmQ0POlcdTAwMTSfWOf5JdvKzqOgn0P0gt2VXHUwMDExnUdcdTAwMGIyXHUwMDE2q9LAV81cdTAwMTE9XHUwMDFlfHuybLZPlzfeya/L71x1MDAwZV5snmxu3Vx1MDAxZlx1MDAxYpyC6II96GWsRnRcdTAwMTdExsS11fqeI7q0gWdcdTAwMWZcdTAwMTai1HtcdTAwMDTpz+KT0bfY0ivv9j9/P33U2txcdTAwMGYnXHUwMDFiXHUwMDBmXHUwMDEy0tvt5UX9ovu29/bLu07v8cHCyudHP35cdTAwMTmkV4+mXHSkXHUwMDA3bnJgfVJkqU0oaX00mWIxJPtcdTAwMDBXYzp7XHUwMDFisolj0Fx1MDAxMXHkuJ/Jb0yvxfTX14B0hedcIpRRXHUwMDEzbIyzNH3rgkBkb0PhRKd7XHUwMDA06WvDwdduuzOcO+qdXHUwMDAwJO9cdTAwMDOa11x1MDAwMFdcdTAwMTnNp97BTYH8zKhXeur7vvvwbct+XHUwMDE5nK682lLLh8ePJo260+t1j447qV3zXFzujFx1MDAwN9g4zap2Oa5LyFxyW/OsK3aNvzDssYJcXFq2NllQQktVsVx1MDAxNdGwhS+Pw3XXsu5dXHUwMDExdoS4gXWXrPT+2vabatueXHUwMDA01ItymjGgXpg8ezqrQjosieGmllwiXHUwMDAw/HlYn/qZIH5cbnTXQeHqs8dmY/Fwb/NH5/irfvmpc7D0etRcdTAwMTS5by1cIvj++dWXzd7S0/dLL/tb6t361vHn983k3i10Vz+9XHUwMDA20M3W7zyWi/1QXGLdhW2/uYtkk3imVVx1MDAwM2tkpZnEbvbyt0BtzbP/lKxqZmGvipp/xrrLke9Dxe6318DuwHaPslhcdTAwMWM0tmQ1ieiX4C25+9RGZ3/ClO9cbrz/3Vx1MDAwN5E9vlx1MDAwZthdg5bTsLt8XHUwMDAzs4Huz/7Rxt7K4fu1b5uPnz39+PrL3klrOGnU7W7rcNBvl+zaRJexoe1cdTAwMTToXHUwMDBl+elq3Os/XHK6XHUwMDE129wqLpRVYbdiyyZt5V1j91x1MDAwM7Lu9ZujN1x1MDAxZKrwXHUwMDE15p1bxlT4jmznaf3PxOs/id6LrXerg80l+2pvZ/HxxtHbXHUwMDBmj9vvn/zjULb6LpugrHXsKMeGh9E5X9xdd1bZXGJrzFx1MDAwZppzStvqQFx1MDAxYZG4XHUwMDAwRyZOi1x1MDAxOFxuq8O3iLP/XHUwMDE0S3zXXHUwMDFjZ1x1MDAxNVv5umJcdTAwMTg0trjCbtOJgFmwRuF+guyg/e/+o1x1MDAwYpi7XHUwMDE3KFtcdTAwMDNsXHUwMDEzKDvtXHUwMDBlZlx1MDAwM7NXk4eS60nNWnLTg46SR4xPgixocSZcdTAwMTG2xemJr6Cyqlx1MDAxZT08hkD6yJ3H1zBptVx1MDAxYjvG/GeY9MaNwVVcdTAwMWJcdTAwMWVcdTAwMWVcdTAwMTBkdUA91dKV4IG+qrBcdTAwMTdzhrbOht0/Y+uzbVx1MDAxZVRUSv4sXHUwMDE09XH87Vx07G1YgzauYCvMVufsITXJoOVOaueEt5tcdTAwMWZNrrTmSYiOlSSFXHUwMDAyrPm91lx1MDAxMac578BvtVT5Wkfx+Fx1MDAxMij/93SgXHUwMDEzupJcdTAwMTTcTVx1MDAxYu7VpCFcdTAwMTmuys/6MHBcdTAwMWPsXHUwMDA04Iu9XHUwMDEwzsfrMsRcdTAwMDc8XHUwMDAwOjBnnpxcdTAwMTjQYLzXKvIru7ROb3vwrVEgtH7w5MPrJ3ZnaeX49PWHx+tcdTAwMWZOWrvfXHUwMDFiMlx1MDAxM8uTk/OjMc58ZqnoxfnMs2nQ9Fx1MDAwMoBgMs2DfvX56lXF5nglbWatuVx1MDAwNf+5rXbV9vZDTyxOqVx1MDAwM7hcdTAwMGU10YH7rXSsKlx1MDAwZlBmXCJ8unCfrPlcdTAwMTO6cFx1MDAxMuHtc5ON5TdPhFo8tVx1MDAwYs+erfV0e/v9ilxcaMpNfF9vhrWX7vNO2POvzer7Z2vLclbcJHpb6DhyM25SfZdccrhcdFxiXHUwMDA1l6xZf4hh6ZD2ZWJfQ8mjhZ3hWVx1MDAxMVx1MDAxNfbobVx1MDAxNkFMuI1cdTAwMGZ/iipz/Fx1MDAxZMVMscOt5sQkalx1MDAxMVx1MDAxZNvnVFx1MDAxMZMgptlcdTAwMWK7tmmeRnRcdTAwMWbrcVx1MDAxMNjPXHL6c//uf+1cdTAwMGVHJ61cdTAwMWX+1lx1MDAxZrQ794Gi1CBcXFx1MDAwNUXhnVxc3Ed6XHUwMDE3s6EpV3uiq2iK1zJcdTAwMGJBqmhCXHUwMDA14jq2VLKFVGCVhcMvqFC5iFx1MDAxN13GY6WlXHUwMDExMVDVxlxu8dvUi6b+/saQXHUwMDBi3HRsjFnlXHUwMDAxlJq6fG/Zw8hcdTAwMTRcdTAwMWKF/8P4SoV68mdhQjPHgiageWbU5Wq/UeBcdTAwMDL51rqIXHUwMDAw38W8XHUwMDA3XGKPVJ5kLz5jO2hhbd5cbi5cdTAwMTRcdTAwMGZznFx1MDAxNXtcdTAwMTn6168+b3xtm87zU/F8+fm7nYVVM4VsOcvdoTyr0rJcdTAwMTlnXHUwMDA12VxuPDfjvPBMXHUwMDE0j8K+P+Tl6orwq1x1MDAxY2n0cKRcblPFsnwjS8xF68wqXHUwMDFlcDY125OF6LmxPVx1MDAwNLhkVzhcdTAwMDeqWFx1MDAxM1x1MDAwMaW9XHUwMDE15vJPcaRcdTAwMWZu7Ei5pDKlsFnJ6ZXNXG50XeooXG7Nk/5ZjnRhuoLyp6Cad+FJXHUwMDFi+yV6Uq9MhJ9cdTAwMDdcdLHsa1ZoT3LumWRcdTAwMDavZaMunnIwK1x1MDAwZnp1+XbiQYVyikfFXGJtrOCRdHZipIonXHUwMDFmhGuO845cXOfVXHUwMDE1sle7TsCHUS569lx1MDAwMLKl7r+Op1x1MDAxY1x1MDAwN8OzcmW171RcdTAwMTl3XHQqpWN+ILyoaNyrLXjsb9d5hev8ePOkucf8iThZOZZTzelVKEJcdTAwMTieWONvY4HsXvjOqfrJn4Jm3oXnbOyPXHUwMDE2zlx1MDAxY5JQmv2nvORhuZNcdTAwMTlpm92O27xGllx1MDAxZq5S5O3NlJeG7SYmXHUwMDA2aSZqVe6T35RcdTAwMDf90D+wJ62Pr9pcdTAwMDfD+PTTx1x1MDAxZlx1MDAxYofNKuvZ5FNcYqCx4YnupY5IXCIgJlfjZHlF3YBzmefmeclTiGWsOlx1MDAxMkRfx1/+J9XWf6v2l1XpOefy8/2qXHUwMDFko566migj29PEKG8jqLxpem7zPJv1ampOLiSv3jgnN1x1MDAxYVx1MDAxY01LyCXjLmffqlx1MDAwNzqbtNvTXHUwMDFk032z8Gr7udlaf3n4TD1pf3600sh0rcysZjdcdTAwMDQu9Mm0NFx1MDAwMPSZwTSmalx1MDAxYVlcZjFTLj+03rO5fKG/83iV6zr1Pv9Jcc735naLR0/qUGGi83l9x1TDtd475+y93Od60u9+nzvmZ0aVdjvu/vVr7bZynLPav5paZGFSp3eKMjy/geVcdTAwMDRVSnU632Cmz3zGXHUwMDBis6lcdTAwMGVcdTAwMGU/tX/Yg+7w82prZfR+ZdpcdTAwMTkt92frqvWZUWzgYuKEv3JcdTAwMDZvXHUwMDAy3kTtztWf8TM/5/MuXHUwMDBljPbEXmuqm0Ld925P17bKqXbzXHUwMDBmNlnlp/ph76JH0F/d3e1Hc5Ncclx1MDAwN1x1MDAxYm8+PVxub7fXh8Njv/rp+eNnXHUwMDA38r6brFx1MDAwNCXI2Nteapv3wihlVVxcYNmWm1xmMmZptFK4LLAy2VxurySMt2q3wITVSmZ70mWpWzLb8zcqqztcdTAwMGXWtpbF8FU/PDpuP+qPXHUwMDFlP9566T79ssrzmzmF5+/erc3999ziyWj/rp1C5aVnXHUwMDEzfl+9N+DK4lxcXHUwMDAzzJLGgfSGiuJcXGs1uyRoO3XZm9S7cslbhex3mnF6+C3jfKWZXmeFxmqedVvNpv30JVx1MDAxYWG4QqPkbVx1MDAwNOX3XCLNWNJJ/ixcXKrj+MtcdTAwMTPOaWa5xca1rswtXCKc5Fx1MDAxNrEgjJWI5yazdjHjOZBGXHUwMDBiNvf18nq1ro2SjFdvNSiN1/F8XHUwMDE0nlXGLuOxopjYZ3jbq2C0cizkvd5y/OyTjX+cz/F86+hofVx1MDAwNI29fFx1MDAxMvNfu51vS5VOhj9cdTAwMDSyfGB0Mp3cOv/+4+//XHUwMDA3bbKKhCJ9 + + + + + 2. The remote provider expose an API to execute containersVirtual KubeletInterlink API ServerProvider pluginProviderAPIsPodContainersPod on virtual nodeVirtual Nodeunix socketunix socketHTTP + Auth \ No newline at end of file diff --git a/docs/static/img/scenario-3_dark.svg b/docs/static/img/scenario-3_dark.svg new file mode 100644 index 00000000..fba76705 --- /dev/null +++ b/docs/static/img/scenario-3_dark.svg @@ -0,0 +1,13 @@ + + + eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1d21bb2JZ9r69gpF9cdTAwMGL1vl/OWyAkISRAXHUwMDAyIYSuXHUwMDFlXGZcdTAwMDNcdTAwMDZMjE2MIUCN+veeU1x1MDAxMCzJsiXAgFNcdTAwMWTXOamUL0tb2usy13X//cfMzIv+5UnzxX9mXjQvdlx1MDAxYu3WXq/x48WffP+82TttdTv4SKX/fdo96+2m3zzs909O//Pf/904OUlcdTAwMDa/Sna7x9e/bLabx81O/1x1MDAxNN/9XHUwMDFm/PfMzN/pn5lr9Zq7/UbnoN1Mf5B+NLic1bb47nK3k15aeSOFiC7cfqHV2WtekOSOnFx1MDAxYlx1MDAxMGudvsJcIvrNPXyy32ifNlx1MDAwN5/wrVx1MDAxN1dXb1ZcdTAwMGZPZt+8Uc3vO1x1MDAwYltf5l9uifbg5/utdnutf9lO13raxf1ccj477fe635pfWnv9Q3wqXHUwMDBi74/6Va97dnDYaZ6e5n7TPWnstvqXfE+I23evXHUwMDFmzH9mXHUwMDA27/BcdTAwMDalXHUwMDE2LolcdTAwMTFPQElcdTAwMTWiXHUwMDE1g2eQXHUwMDEycCEkQjijZTBCOmlcbiub77a7Pa7sv/ZF2Fx1MDAxNWKwtp3G7rdcdTAwMDMssLOX+c5+czfGwXd+3NyvwVwihDUu+MFcdTAwMWVcdTAwMWQ2W1x1MDAwN4f9dHdC4rRcblJZkb7cYFxyzXQvZMS72ipcdTAwMTlvP+GVT1x1MDAxNvdSZvnfwVx1MDAwZfRcdTAwMWHHzUX+pHPWbmdcdTAwMWZjZ+/mMf5kqlx1MDAwMVvpm3f+XHUwMDE53Fx1MDAxYb+/UGTHLEvm2LLfvOjf3nOGXdzF5clXM3tcIi5+2MVcdTAwMGbyy477sS1e3H7vn5u/XHKWf3ay17jmPumVi1YqbLBcdTAwMWbsWLvV+Va8t3Z399uAYf/I3MiQ+OTWmZFcdTAwMWNj3CjJkUJ7a630rkx05uuLTvmzKFx1MDAxN53Dxu7hWa85XHLC41RinZBGKCGUjrEgPFE/gfCoaJIoY4hSW4pxXHUwMDFjXHUwMDE2ISuKXCKjnVx1MDAxM1pcdTAwMWEpXHUwMDFmLjG5XHUwMDBmhkRjktw7WFW3019rXaW6W+Tefd04brX58Fx1MDAwN4okZWs8wPcrb1x1MDAxNpdnlldeLcysLM98Wlhb+fxpfmHmr87qp5WNxVdcdTAwMGKfXuR+8rLdOiD3v9jFrTR7OcHot2Cebr/Q755cZj7dxVwiXHUwMDFhrU6zt1jHJHR7rYNWp9FeXHUwMDFmv8bhXHUwMDE1Ns763U/N0+tn0O+dNbOPsfn258bLRNmxMj/WZIJJRlxuvpZcdTAwMWW7570uXHUwMDEz/Ff1XHUwMDA1P76Lnc8/7Gzv4nz/9OLN61xyefbl23TbTOtgkKxcdTAwMTZaeFxiv9BFqdc+cdIqQ83osrCjKPWyyX/GS33D7oX9/WGpt8EkvLZw12ZxcCu3Um+USqRcdTAwMDes8Samr4z+udFcdTAwMDLaOOuM889kN0cpXHUwMDA368B6Vks1KdM2ls2d1CPZXHUwMDFj+MeqXHUwMDE4ZKl9W6jP5icv/cnm7MrHXHL7+e3Z4uJi8+pgpzPt9s178JiO0msvfVAuz+deysRcdTAwMTlcdTAwMTmiNlJcdTAwMDG9PVx1MDAwZZ9ra1x1MDAxM9g1S2gqJIWrXHUwMDA0IcaYWEojtstcdTAwMTgvhlx1MDAxOV1cdTAwMDbhdTDRTFx1MDAxYqfDXGZKPL9oJ8XpI0FcXPQjmVxcS+vw5GxcdTAwMTmPv67P45fb3y6bc8d73fX37Yulo9Wjo6tXXHUwMDFi087jVrskQFd7XHUwMDEzjFx1MDAxMiqjXG7S31vvXHUwMDEzK6Elo1bQp0E9XG6TW+tcdTAwMTMpLZmXyk+VeEFZM3LD08ZcblxuobVcdTAwMGbn6fthOKjpIIVcclx1MDAwZsZwIffuXHUwMDE4XGank5nl7szi8tzK5+VXM8BaXHUwMDFkKPbWOTZ7pt+d6Vx1MDAxZjZn3q7OP1x1MDAwMo7L3VBcdTAwMTG03XFRT1x1MDAwMt1sXHUwMDA22Vx1MDAxN8VcdTAwMWRcdTAwMWOjnFx1MDAxMbFcdTAwMTS6vakv7/tb7Ter63Jj8Wzjw/JmT15cdPOxOe3y7mNItFx02mhVXHUwMDA23ryBM+Vh80NcdTAwMTCPXHUwMDA33rSQuMq1qI9cdTAwMDBvVjIsI2+x22CdN+JcdTAwMGaDXHUwMDBig2bVYFx1MDAxN6ch5nHNXHUwMDE5RnQ2Vt91tk7iQV/Jy8Wr3tLOXHUwMDAwLOW4uNHrdX9kglx1MDAxZX+Oozu391G//rJ+8G6h9e5kof1qV7a3/YPoVsVoLntL5sO77tzVxo+Nq2a7XHUwMDExv+9f7tddbv/yauv7md5Zvuy+tWF5cfbj8fFyveXe/O3JXHUwMDAw8ijYoMRobKxj1IBcdTAwMGVyXHUwMDAwLDJ65O1cdTAwMWRwQ+kznnI9XHUwMDEyfEikNVx1MDAxZZCTgUdbwFxy3obEeOOUqnRcdTAwMDKjl7vqfqFcdTAwMWZpXHUwMDE0wHGMXCJcbutcdTAwMWRcdTAwMTijXHUwMDA0XHUwMDFiXHUwMDBm41x1MDAwNqmthlrRz1x1MDAxNvu5XHUwMDBm95bihtqxn41Wr3/WaM8sne2QXHUwMDE174tcdTAwMTCOW3t7WXtbXGL2VFx1MDAxOMRcIm5cdTAwMTi5qEkhXHUwMDA0frtMqMHdqvj2rVRcdTAwMWJcctbQWSCckerF+lK99e1s73RhafFy0c29eb31ebb51ZyOkOrdXvf0dPaw0d89fH7JdoT8uH9cdNc/XGJcdTAwMTVcbpLtnE+C1IHZXHUwMDEy+KWZhMl9JFsrt9u0JZKtYmKMjtZcdTAwMDRcdTAwMDX/21xyPNpbyZbKJlG4XHUwMDE4XHUwMDFkdDCWk0FcdTAwMTE/JV1cdTAwMDSLnczq8KykXHUwMDBmrP7h94+LO2ebZv9s+2hu42D39cXJ4seMoXrxcm57TVx1MDAxY7w63ltuXHUwMDFjdT6fNzZOv1x1MDAxZPuf5mraNcZpv9Hrz4GLW52D4k+anb1cdTAwMTGftFx1MDAxYqf9+e7xcauPZax2W51+8Vx1MDAxYindlzTch83G0E2D8sjPTkguv1x1MDAwN4O/zVxm+DH9j9u//++fXHUwMDEz+PasTrT2ykDIXHL+zbRn7vdJXGI6XHUwMDA22DX4ujpcdTAwMWFcdTAwMWQqXHSaXHUwMDAwcYnRROdcdTAwMWTkZVx1MDAwMFx1MDAwN/hSXG5sLFx1MDAxNK/kotDGPTU54Gh4O/i2jfRVhc2RM0lcdTAwMTAxOOi7iGs6XU1OJ1x1MDAxMpbTM/5cdTAwMWScXHUwMDFmpHRSciFRxkFcdTAwMWVBT2F5spKcM9DhXHUwMDE2nrzz0DbChCw571x1MDAxMqeYXHUwMDEzVbDvxvrqrZg8Oa2D99FC+GRwuZtcclwiXHUwMDExXHUwMDA2jORDXHUwMDE0XnpfTU0nQlx1MDAwN4fNVcqEmFtb0Fx03tTKwOGBlJtqYiqBXHUwMDE3Kyw0tFxmMlhfoFx1MDAwNkBcdTAwMDTtLC2uXHUwMDE1tapcdTAwMTZcbploXHUwMDA1X0u5qFx1MDAwMemczt2qXHUwMDA023nlo5BKYvlOVd/sxFx0gre0jMZI55V2MFxmIU/QJlx1MDAwMlx1MDAwMotcdTAwMWJcdTAwMDZcdTAwMTeT36tcdJrEXHUwMDA2LE4wRaCNtEV6edtSRVx1MDAwZj/AptqghXHaXG6t3Fx1MDAxOHrV3DJpcjFh8M45XHUwMDA3dlxiLpNcbrl9erhcYjhZUHhCJf9plUBcdFx0XHUwMDA3jeJlVGJod12UXHUwMDA2q/aeofHKzYBoXHUwMDE4bK2V+Fx1MDAxOcTAXHUwMDE3ZSM4XHUwMDAxXHUwMDBmXHUwMDAzwqbAXHUwMDAxT0vMJrhHuDPQK9DF3lx1MDAxN1SA0Vx1MDAxMk6Otlx1MDAwMcpax1x1MDAxYdSEc3gyKaop6Fx1MDAwMOoniL9cdTAwMDNqwl45V7k26GKoYlx1MDAxOWDPsFx1MDAwN1x1MDAxMKKCLpZcdTAwMTHsXHUwMDAzOyZcdTAwMDOMSbRPTVx1MDAwZSxcdTAwMDL+0NCgsKeQ8qLlgcOmyFwi0NTYqEptbMDCXHUwMDBlqlx1MDAxOFx1MDAxN9c6XG6VJ1x1MDAwNz8wMlgtmc5cdTAwMDOfV0qESSQ2XHUwMDAx24d7cVx1MDAxNipoXGJcdTAwMDZcdTAwMDShcSmSw4ZVyv+k6c3SvKQ1QdB6YFx1MDAwN8BtnSM5K/mFoPF/WFx1MDAwMSeC0c1ZWXnfo9DSXHUwMDFm2X/f2aGycmRxXHUwMDE5doVxcuFLwyTv6jtU61x1MDAxMOq92dPzdvNHa23z/det5vzmyVxih2pKMuWpK1x1MDAwNblhXHUwMDA0xHuRyd3dXHUwMDE0l0FcdTAwMWJcdTAwMTnjvIXpylxi3D1jJCWB1lxiMVx1MDAwYtpH8JCDmi6Js6YlOpBRZWzUQvmh1GGk44E/yjOHt1xm9NtF+ve4SDKByoFcdTAwMTnAplx1MDAwN1x1MDAwMGb4XHUwMDA3eV1cdTAwMTatN0HSwMNUSF1pXG5mgVx1MDAwN1gmXHUwMDA23VxiNoNcdTAwMDK3ObxAXHUwMDBlXHUwMDE0kFx1MDAwNamFxi7GXHUwMDFhXk1cdTAwMTVB72CqvPFWXHUwMDA3uDb24Su8XHUwMDA3QeAtWCuJXyiv8GeWoFx1MDAwMzqGP1x1MDAxNryA3qZTUoOeXHUwMDAwKVx1MDAwNbxcdTAwMGbUXHUwMDA3XHUwMDE45/J4VSZExZpQXHUwMDFhlE0tgiHC3ivF7G4w0EN5XGaXXHUwMDAwd2pcdTAwMTggwCS4XHUwMDE4NbwllUQ8QXrVjNfYkGNcdTAwMWGJR1xiSy9CiEZcYjyNalx1MDAwMzhpej5cdNxcblx1MDAwMePsXHUwMDAyfeFcdTAwMWM9eFx1MDAwM5r8XHUwMDA3kl5A3Va7YHhEnprVw1xyXHUwMDA3Looqv0BH81xmjIdrXHUwMDAxO8JIV1x1MDAxM/RcdPw/bFx1MDAwNrdReKdy9Ohbx1xi+KWZ9Vx1MDAwMpiofoAyXHUwMDAxeoDdgbdcdTAwMGVnS+Xo4UNwu/cqXHUwMDE4fFx1MDAwMUi4htDBJ1x1MDAwMVxi0Vx1MDAxNl/3XHUwMDE0gtxcclx1MDAwM9FcdTAwMDFYO3xcdTAwMDNeXHUwMDA0TI6uwYIuMdhcdTAwMGJFV4Z/5EREXHUwMDAxjlx1MDAwMlx1MDAxZlxuXHLmk9znai924vRcdTAwMDLgelx1MDAwMFx1MDAwNtNcdTAwMDFbXHQ7rVxuXHUwMDA0YbilMJqVObZcdTAwMWH90ylcdTAwMDb70f9cdTAwMDCE9s7mvXZcdTAwMDVvwuPhwjNQuKSvdk5mNVxcXHUwMDFkilx1MDAwMVx1MDAxODBKqGtT4Fx1MDAxOFx1MDAxYtKaIVhFr6Ov5kBtXHUwMDEysCyLeb2VgDe6QE/Cc6JLXHUwMDE1yfjVXGYzaXJweq3FM5JcdTAwMGXb4VXBJ/ZwXHUwMDAxYmTAmlx1MDAwZrHafZrVXFxcdTAwMDFcdTAwMWMtXHUwMDBiXHUwMDFkXHUwMDAyXVx1MDAxN4vLgzFcbtA9XHUwMDEwNYdr1Yh5hIRcdTAwMTl1XHLTXHTzaY0u7m5cdTAwMDDSk/SHLJimmpxnXHUwMDA0XHUwMDFjXHUwMDAyxfhcdFx1MDAxY6ghh1x1MDAwN5pcdTAwMTlOJFxcNnhcdTAwMDE1XHUwMDE0Plx1MDAwYn3AxzBkXHUwMDEwT9xTMbBcYj6Cf+JcdTAwMDM9wFit7idNXHUwMDBl6sNY3Cp8XHTojny8XGK6XHUwMDA1MuOhXHUwMDE0oV2wIzXIicTGQE9cdTAwMTXKXHUwMDBmYpCXXFxcdTAwMDdPN1xyofrgwTM14m2gXHUwMDA3w2FcdTAwMTl7xU7gZ8XAp1x1MDAwMVx1MDAwZklcdTAwMTfhhCpcdTAwMDX4UK1bYlwiWSBcdTAwMGI8IayDo5xfYUzwNrY2XHLWMDbz9Fx1MDAwNFx1MDAxOeNRYD0niClsXvlhu6LWNC9AbbFGsIJcdTAwMWJcZlvE8Cbj7tDBWXJGsFx1MDAxZVx1MDAwNMiGbixcZnFccoBcdTAwMDVtIKA/gndUMGJQ9p/S81xmXHUwMDE2XHUwMDEwt2jBorJ6/Fx1MDAxN3C/SsJZw2bm9tdqwMOIdy3+0cBcdDVu1yZ4OFx1MDAwZYKOnVx1MDAwMFx1MDAxMnBcdTAwMDV6XHUwMDExMlx1MDAwYshA3Vwi6sRTJ0xcdTAwMGVcdTAwMTJcdTAwMDDVXHUwMDA241x1MDAwZs1mXG5JXHUwMDA2a1x1MDAxM1Y1YMshXHUwMDFjcLqrWcVIrI5QXHUwMDA3XHUwMDAyj+1zRXJQeIxUuzRYViOjYlx1MDAwMISAnI1cdTAwMDWv+kIoxTqsjlDNO8mqzVx1MDAxYVx1MDAxOVx1MDAxNdxcdTAwMGazmVDJXHUwMDBlXHUwMDBiyatcdTAwMTaQ01x1MDAxMvhcZp9AY1x1MDAwNV2LXHUwMDFj2CRcdTAwMDJmwJIzmTBd5FxcQsxcdTAwMGWuXHUwMDBmwIrSXHUwMDE3yTHaxqpbzYriXHUwMDFhYlx1MDAwYkmCXHUwMDFk9DYqQpJQWJ5cdTAwMDfjXHUwMDE5qG1cdTAwMDfYLKWqwSmOrKrAK1x1MDAwMtvnXW5rnUhwJWxRXHUwMDAw+o1cdTAwMDBd1VpcdTAwMDD0PMRcdTAwMTYmXHUwMDFjllx1MDAwNuyQXHUwMDBmbIMgK0OASOEk0JLXuF+CXFz6oVx1MDAwNkZcdTAwMDNcXJbTelx1MDAwZYhcdTAwMWFaXHUwMDBm3lx1MDAwMcPosOM16LFNXHUwMDAxoFx1MDAxZXpcdTAwMDPmP+q821x1MDAwMYL0pYXDhVjHUsOXNpooXGJej1x1MDAxN1x1MDAwZSDcT4BcdTAwMWV0XHUwMDAwXHUwMDEzYjBcbiyLKdAzTOAooCNv4Fx1MDAwMD85OZGkXHUwMDEwlt1cdTAwMWLwa1x1MDAwYncr6HJAUcWAba6j9Fx1MDAwNJQkbIJ2hKS5pdlcYlx1MDAwZprharhfXHUwMDEyXl2NnFx1MDAxOVxcRuBcdTAwMDFcdTAwMDBIXHUwMDE4My9UkVx1MDAxY4ydSVx1MDAwYlx1MDAxY2EuQlxy91x1MDAwZmBcdTAwMWXQ0UMsXHUwMDAxcuA1ulx1MDAwMj08UVxcXHUwMDA1Vlx1MDAwMG65qOFsTJicSFU87a1cdTAwMTewXHUwMDE4XHUwMDA1PobUWFx1MDAwYk9cdTAwMDOMXHUwMDBl+bA1fCvP5aUlXHUwMDFlOkLZ53fWi8TD1ElcdTAwMTUs8KOoXHUwMDExfFDAI1bD6HtsiFQmJ7feQo06Tf/U4qI1pFx1MDAwMt5cdTAwMDTuXHUwMDAy+lx1MDAwNEpFQCFcdTAwMTRSNTFJk0Ken1x1MDAwMHpUk6P3XHUwMDBlPWSZvoT5KqaRRICxVfTuXayRu5w8OVx1MDAwMVxyXHSAIy1jYD7HK1x1MDAwMUpcdTAwMGZerlx1MDAwMTSHplXVN0tXx1x1MDAwMFQzTFx1MDAxMLXyJr88xzQ4Plx1MDAwMVx1MDAxNFx1MDAwNdFcdTAwMWFcdTAwMGZPSWhxgbsxYL9cdTAwMTB8XHUwMDFl/Fx1MDAwNGamXCI78YDbiGnq8IoyjPbZSLRcIqMv0ItA8N4oxlx1MDAwMeGuPVx1MDAwNz1wsJbaMIdprcrxXlx1MDAxNFx00I9nVClcdTAwMDLr1Vx0RXJ9OkjDsFx1MDAwM1x1MDAwYktyslx1MDAxMdnFXHUwMDA0fFx1MDAwMVx1MDAwMCkkLGmtuFKqRIGUNXbZ5DN7XHUwMDExq1x1MDAwN5uw9Fx1MDAxM9pcdTAwMDeauZr9YsLMsycsgVXLx6mG8lx1MDAxM3XIMcJCx5nazcXC6uBcdTAwMTZ6dm0oIINYfbeprNH7pOMuaGhcbvRgl0CRXHUwMDEx2Vx1MDAxYXCKUVxu8Fx1MDAwMvNBQYAt8lx1MDAwNTQxXHLjRmhRyCPr2+vQg32BXHUwMDBlclx1MDAwNjaX9W5cdTAwMDVegUzQXHUwMDE3jGxcdTAwMGXzNe520vRcXKKoco1cdTAwMTdcdTAwMDC3TvqibFxiXHUwMDBmJFx1MDAwMy6Gulc1glx1MDAxOFx1MDAxMpqcPEKrwVhtvsQnwFxmKaBVKVwiXHUwMDFlYnDVukDCK8WtauNcdTAwMDCzXHUwMDAzw1A5ej/LclwiIUuow3xkVzpplu3lMeS83JBmXHUwMDE5nCarU7qrzZpkXlx1MDAxYlBcdTAwMTn3RLfTXHUwMDE3ND3QXHUwMDFldVxu/FJcdTAwMWFfX0PUJkzPMSgtmTgh20Ln2+Ljg7qm41x1MDAxN+A+VKOMNMhcdTAwMDJcdTAwMWJOz1PhXHUwMDE5yXzQgelSuFxmiqxcdLNX7frBe/LYXHRGy8FiTlx1MDAxN0tBWMRcdTAwMDaUplx1MDAxNVx1MDAxYuAqXHUwMDE1KVx1MDAxZZ6Fp4FcdTAwMGJDKVx1MDAwYmVcbpt7RzNJTnHww1x1MDAxNFx1MDAwM5CwXHUwMDFlUVx1MDAxNVnFXHUwMDE441heXHUwMDA20+Er01x1MDAxYpMmZ1x1MDAxOHyE/tRcdTAwMDDq0FLBXHUwMDE0XHUwMDFlXHUwMDFkoLhcdTAwMDdcdTAwMGLDKNfIXHJRXHUwMDBiwH5HxvZYwVx1MDAxMYpKXHUwMDAw16G8QG5cXDU4o47yLD6Gg+ZcdTAwMTncLuooXHUwMDEzXHKrJWCgPExaXHJy3DRcdTAwMDZ+IJRG2qJ5lMFQ+vFZjNVcdTAwMGZustRgfOBfwFx1MDAxMkjm4G2+mCmy+8Fpo8hyXHUwMDFlm1tJXHUwMDBlsFx1MDAxZixcdTAwMGZcdTAwMGZcdTAwMWKbXG6LK1x1MDAwYtRg3OCzwGpraPlK6Vx1MDAwMq5Ik2lwQ9N8iyraslxihoProem9VdeWXHUwMDEypqjUO3SwzSrKUCDnIXlpNpBh50ouIYqCs06gXHR1a1xuMFx1MDAwMCCKpUl0jVx1MDAxY5ipurxcdTAwMGaLg1x1MDAwN0pfRVtshilwcFx1MDAwMNyGm8d4uKn2XHUwMDFkiWiNNF5cdTAwMWEokShlgVx1MDAxOFx1MDAwNEGQw6Wk8/a0xJimiJ5uTVx1MDAxYerO41x1MDAxM9hXXHUwMDAwusBcdTAwMTi3YHFnJTl6XHUwMDE2MMRcdTAwMDT8juWCuU1cYkyHQUHjeoIpr2pJXHKAvooxWIhcdTAwMTc1d17H0e+BxWBBJ9RcXKWthqRcdTAwMDJEXHUwMDFiXHUwMDAzXHUwMDFm02omNHNqxFx1MDAwM7bjKShcdTAwMGbYydB+NYdo+oRcdTAwMTArXGI2XHUwMDExTc6ywlx1MDAwMVVpXHUwMDBlVtNBro5rwTvG08WSgErAUy7vvcM7XHUwMDA2ZlHwaK1cdTAwMDFor3aPNeNggtXFXHUwMDFjI1x1MDAxMHMsXHUwMDAy111fQ1LJqKqsXFxcdTAwMWJcdTAwMDNcdTAwMGKBeFx0/js8dFFcZixcdTAwMDC4XHUwMDAyQEAnXHUwMDExZFc+NkZRmF9jvVx0vMHgXHUwMDBi1JxcdFx1MDAwZWCe4bZcdTAwMWGFpFx1MDAxM6bGXHUwMDFjPoC/oqVcdTAwMDG+V1x1MDAwNWp8lFx1MDAxMnBcdTAwMGYwXG6wpfLBXHUwMDE5kXiGPX1cdTAwMWH7coVcdTAwMWOSg+Q5Olx1MDAwNYZcdTAwMGZcdTAwMTZ6qZKchi2BMWXRSnpHxUhb6kNcYlOjnFx1MDAxY6QgXG6sM4yEaqpIyrKWXlx1MDAwNlwiuVBtUFx1MDAxOaGEXbKA4ORhkU9LPzs58DvEXHUwMDFlIJPc6+RQgFfiMqBcdTAwMDSlJKudYYbbo2Lo23tYdjlcdTAwMTR+xrJgnbWF2qyuXHUwMDEwYLDdsEZcdTAwMTQ7oVx1MDAxOI8pMFx1MDAxYy7Apm3G7HyoXlx1MDAxYpWIZ+140NSLefaFLk1hLMAgnka1XHUwMDBlSdeG21x1MDAwMJCHn1RcYrSDXHUwMDFh65Jwt+Q4XZ2BwnNcdTAwMDP+0fDSIavOeV/M8YBcdTAwMWZcdTAwMWSLt1x1MDAxOa6oNqhpiofZ/1xiuWKNTIGaoi/Bwi4g9Gq3xpiESUgyXHSrvtxQ/klcdTAwMTBJw1x1MDAwMkH/Vjs1XHUwMDEzpibTqlx1MDAxM53qJeiQPIuwLVx1MDAwMEpcdTAwMWV8aG2abKih4uC/MdxA743Zl1x1MDAwMj0pdNo8RJRcdTAwMTdqXHUwMDE4XHUwMDA3m3joWCikwD6XOJSnXHUwMDA0ptBp4TegY3XNXHUwMDA3s7IsoJOp4nYxXHUwMDE2yLm09lx1MDAwMVx1MDAxYVx1MDAxZrq+XHUwMDFhxE2cXHUwMDFhXHUwMDFmtGCNhrbC53iOXHRoxaBcdTAwMWHulfGI6nqytFhcdTAwMDaSynyCUFwi0zKd0oMq4YVgeFx1MDAxNexHdVuaXHUwMDA2OI/WQ1VEwUB7zuZz6UxcdTAwMTFcblx1MDAwN6DCUqjK1SlYO8BcdTAwMDQmi71LXHUwMDFi4/7Mf1xu715j4TBfXHUwMDExXHUwMDEwp1x1MDAxYeBEwivoMrijgNN2qJGMWDswolxulVKrv2WS5DR9SI51XHUwMDAyLIQpLlx1MDAxNo/ggbHPyEOgQ43uKoJcdTAwMTLBMmynXHUwMDE5Nch3LrG0xfPRwk5cdTAwMDS4vzVcdTAwMTbnXHUwMDEyuuSBXHUwMDE5XsGmg1x1MDAxYzlFjFx1MDAwMdlP69VEta7Tnj1uzOfQecmn2lVaxCrgicGNJlx1MDAxMK6+1clSXHUwMDBiiVPkK1x1MDAxNt1akUeajFx1MDAxYVx1MDAwNy9ZaWhZyVNcdTAwMWScXHUwMDAzOSZcdTAwMWWlXG40xlJcdTAwMTXrvSxjmkBTyig6XHUwMDE4Ne5VwkqBn+CPXHUwMDAw9Fx1MDAxN6vR6KFERoKCYUCozrYyjynhykUni9RcZotcZpVcdTAwMDR/21BD+uFvpM8lXHKTwWabXHUwMDAyOc3wmuH/fVx1MDAxZFdcdTAwMWaYP7K+UEKOIEVOXHUwMDE2XHUwMDFlnSD7XHUwMDFhOixwXHKqV1x1MDAwN1x1MDAwZsLD6GBv8b9cdTAwMTjzRoc7gW3CXrDwiNXMT05cdTAwMGYokGVDMFx1MDAxNlx1MDAwNpLpwlAlXHUwMDFmo57MOkuoieqodVpHXG5xhSqGk65cblx1MDAxNSisI8U+MWRHh1vXXGJcdTAwMWZcdTAwMDA8sUFL0Fx1MDAxZUA05FChq4FcblxiXHUwMDFj0ciKnEpylr6C5uw48CnLXHUwMDFkXHUwMDBiXG6KXHUwMDE5XzC5jIGFfpXbO3F6rOWDMDGSzHrCvHvC7aD44yP48FCMVeQkQFxyPGe4dJZaXFzmo2CQXHLFXHUwMDAwuIkhTUxXc1x1MDAwYlx1MDAwYlx1MDAwN1x1MDAxY0xcdTAwMGYkilxiKVx1MDAxZlKXsLRQXHUwMDAzlrVcdTAwMGI06tWoXSVwdDhZXHUwMDE0Kt5cdTAwMDb40XlNwI4hPDPYXHUwMDFlpWDcZfXTg7niME7IZ8BcdTAwMDJFPqSe1vlDw0K3sFx1MDAwNaBG0TFcdTAwMWJcdTAwMTHoN1x1MDAxOdbdweXKe7FsRICKZYc1YCVcdTAwMWL7qumlfb1MsjuGR/JcdTAwMTVBXHTTLjaVjlhcdTAwMDNcdTAwMDYk0HWWkVx1MDAxMbC9d/lsXHUwMDA0nlx1MDAxY65kXHUwMDE1oFx1MDAxZvGYqy5cdTAwMDaqIEd9XHUwMDAzO+fZeIFccnlqcpLOJVx1MDAwM7WsoYb7n1x1MDAwZq6xoNJ7ljFcdTAwMDGCXHUwMDAy3NdKvrDaXHUwMDE4y4BcblKc4CrzXHUwMDA0XHUwMDA1S1x1MDAwYqlcdTAwMTJcdTAwMTWMrWc+vpJkjsDg239k//3P9Zf+vnmzutlQjlx1MDAxOctcdTAwMGInKsI/0qXNhkv1m1xyX1+9/+Zb/v3lR91qb82rs53FzOiqqZ7ewk5UXGJcdTAwMGJLLr3MXGZsvJ7LJKD9XHUwMDE0o8VcZry6MeNcdTAwMWNcdTAwMWYyvFx1MDAwNVx1MDAwZbdcdTAwMGJpZlx1MDAwMl6gL5lYym9Ax8GRXHUwMDAxOlx1MDAwMlx1MDAwM2daXHUwMDFmb0a3pPhEqlg+0v6WlX63XHUwMDFkTnHb4SxrxqC40zk+rCHNR55/5t5cdTAwMDVnj1x1MDAwMvHW6Fx1MDAxMlx1MDAwMEHytCCI4uBA48ZcdTAwMTCsU4Y2cYJwcjhsV1rWJrDYNkevyPaV5Fx1MDAxOLGgN2VdmtfIR1x1MDAwNKVNi1loz6xIw8aV9EaJJl8sefPYXHUwMDA2XHUwMDA1ZOQ5eaJGmdyEyaUpXHUwMDFjuktsLmA4N29cIiVcdTAwMWNu1lx1MDAwNTpuVHXAnT2OXHUwMDFlQI5VUukgyUJcdTAwMWYra5Q4/ZvdWFx1MDAwMni0XHUwMDA2t1xiQY6mR1x1MDAxYTj5XCJcdTAwMTRcXFxyjtZUXHUwMDAw5nifzTnGNmerIz+PZSVN8e3B5ELBXHUwMDFhXHUwMDAwXTri7H19I/l1efnoc2dzdaV9aL9vvP/+faf9fdTgwukykkEm7FVMp/HITKfWTyNpXHUwMDEyXHUwMDE2oFx1MDAwNFx1MDAwNVxmJDNcdIdJW0nJ4Fx1MDAwNS2dXHUwMDA2tio7+4XyXHUwMDA1IyNcdTAwMWTjxkBdaqg9n0NO2MlUPszwt538XHUwMDE17OTdvlx1MDAxZFx1MDAxMvi5cFxmWV7PpvV8411C0Oc8XHUwMDFkJs1DV6qraUayIV+e5fee+1x1MDAxN6ykVq5cIkfvXrKyQti0SC8/polcdTAwMDZLOEB0I1x1MDAxOUaqdsEmTE4l7Ia1bPFm75DJXHUwMDA32YelrfLh8dmxNyFcdTAwMWS2XHUwMDA1L9pcdTAwMTfWx1E/zHi4XHUwMDEwtKlhXG5cdTAwMTJOXFxcZixcdTAwMWW0XHUwMDFj66WKTepA7my1semghEo08liWJVx1MDAxNN9cdTAwMWWch0R/NIyYpf+hvmlZXt8x399cdTAwMWatafv1cF6et7+6s9m5X8K0WE6YYomBulx1MDAxZcxTMC3SJ5FxXCKllIxcIjzS9Eyb9n5Yw7lA8Fx1MDAwNWPJmUiMUEONRGIzwtWhXHUwMDAx2zKy2Er58Hvyy69rWoCoWS+rXVx1MDAxYd5jXHUwMDEyPPvzmJgg4PgwSlxmsFqdVyiQU/lcdTAwMWNKTFhcdTAwMWFnXHUwMDFkiy9cdTAwMDXrbJ6aXHUwMDFj8DfPaVx1MDAwMaGYjlQqhiZcdTAwMDNcdTAwMWJ6mDfT+Eu1aYyJY9m/Z0mXglx1MDAxY+Ujpzo9lU9cdTAwMGLnsXxXY4BGjlxcLKazQI5cdTAwMWbiWVx1MDAwNMgtzEBcdTAwMTW5Wcb5bTqRg9M4jc732aTybVx1MDAxOMNmOWWs0+v5XGJcdTAwMDRcckTTRCNcdTAwMWRuLYZ8p0jgtFx1MDAwZcWGQJVWUVVyn0jblOA2XHUwMDFizrRiUWd+xMfszVx1MDAxN5xLe2ZcdTAwMDU4IVaHPVx1MDAxZslGjo5RgpHgcrjygWjLd7CRn47XPlx1MDAxY71rrK+/nH3z43Jv8WJ/+f2vYCO9gKBKoSNcdTAwMDBcdTAwMThraVx1MDAwN07NjY1kP1x1MDAxYVx1MDAxODGFVplk48RtpGFsR1x0Q4SbOcIxZyONZVx1MDAwMoK90nCzho/eNCw2V8r+jlP+ukbybt+GUnM6rUpLi6p9XHUwMDFl80OpXHUwMDAx57Pxl2fT6eqafJNwhlxuh1xis7VKuSGdm2fASp1cdTAwMGKryTGuLs2pwY/JR1xmWeSUjkjmzC/la8yhLNCzRatlLZtcdTAwMTnSTr87L+5hxJhrXGZcdTAwMDLGRbLLSIp8cFkmnlx1MDAxZEnsk5XM5VeTXHUwMDEznJSdXHUwMDBlX1x1MDAxNUZrW+g/wK5cdTAwMDcmXi2xsojVgzZcdTAwMTPcJ1x1MDAwZrBR3nuZTlx1MDAwZfkz/7Hm7CO2Wlx1MDAxOcXOqalMp3lcdTAwMGWnXHUwMDE05e7cSn1T9bbZPbs4WHt52N7vnPS2W1edg83Gr2CqXHUwMDFjW8c5XGZRXHUwMDA2OFPGXHUwMDE002ks7WBtJLtvdHicQGFkm1x1MDAwNMd5g5WIk0pcZtU1dzJ2XHUwMDEx2Fx1MDAxNFByRDTlLmYr4n/bqV/OTlx1MDAxOVaHR+bzOcFO51x1MDAwYldmJZtjXHUwMDE0vVx1MDAxMdZ1c2Rjc7a6is1cdTAwMDNqqWh4jjUgWaGlhnVVUFFQr0Cs4PXqgFx1MDAxOJv7fXBcdTAwMDJcdTAwMDKTXHUwMDFlyFNcYiayXHUwMDBlQXL8XHUwMDEz63mqbaNKpGZcdTAwMWUlXHUwMDFkWsVEUs44XHUwMDE2mb5GfinxgSMlY1pcdTAwMDLM2OG45dVcdTAwMTlRXHSBZCdcZoeSsVx0zo95es80mllmJvdcdTAwMGWddWOpWVx1MDAwNknFrHZfra/dje6Hg3VcYu7O25efdvrHl1xyv/KL5IHSoeIs93Z0XHUwMDFjXHUwMDA30bhr7a45Slx1MDAwML69M2lcYtpcdTAwMTVcdTAwMTY2sTxcdTAwMTBb1Vl9XHUwMDBmRlx1MDAwNo4pc0RcdTAwMWP7mmRMo77BXGb7IVi8XGYhXHUwMDEzz/6t3n859X7Hb3NcdTAwMTRcdTAwMDPHt5F/XHUwMDE1e2nyuidoViTyNCvrfKxjXG4kJ7im0/RcYnRl4Vx1MDAwMICEYVx1MDAxYWpNwfR8jWbNyVLjgSFQsOw6XHUwMDA0+1x1MDAxN1x1MDAwNuBBOjxcdTAwMWVANJHX0tVpXHUwMDFiwVmEXHUwMDFjXHUwMDE2XHUwMDFh0yNcdTAwMDPyTWD4XHUwMDE0UqY5XHUwMDE3Mira2Up6MKLcXHUwMDAxmipcdTAwMTaRuGKgkFE9bINcdTAwMTEssaxxulx1MDAwNlx1MDAxYobYXHUwMDA3xqNcdTAwMDLoXHUwMDBl5elcdTAwMTV1QVxyMyXYUlx1MDAwMlx1MDAxNyNIz0RU0cgz1cSzXHUwMDFhLKvy60yomTRBTvjBbqg0panYVZ674yS18J5jJrBrtrpspuh8uZBvXHUwMDA1XHUwMDE1acW6opvJkVa2TsvKY5nn0ScnSGBcdTAwMTDNxZXZ54/17bNcdTAwMGaXcaHZmovfNvY/ypX5o87Rystfwj47m5CRoMeCzc74XHUwMDFj2Ge6/+zipkg8WjUj56PzoJ10pl7mZMCsfTaSk1x1MDAxNdnkXHUwMDFko/HDXHUwMDA1jTx/gS1SVWfR/bbQ/1x1MDAxNlx1MDAwYlxypeZcdTAwMTQnc1x1MDAxYlx1MDAwM9aN+XZDXHRcdTAwMTXqvFZQkmnPR3WiQnHuqYSPwTFYrPAo6FxcyYNnvOKwP1lcdTAwMWSeqqJcdTAwMDZiQcGkslx1MDAwNULV0Lg6UYZzXHUwMDFlhDM2XHUwMDA1XHUwMDFlXHUwMDA1k1VcdTAwMTCPJ6fHXHUwMDA2QVx1MDAwZTXi3EdOKMhcdTAwMTdWcKaaXHUwMDAx8uZseLicNYaRc0BcdTAwMGVcdTAwMWU5PUal2eWVXHUwMDFmz81cdTAwMGVcdTAwMTjLaf5wXHUwMDAx2dVTTTBcdTAwMWRb49nDyIicXG6iaLCyxfmcR/ZMJFx1MDAwNbtcciStJuw+Pf2hsGaWKHbv2Vxmayy+/dOwXHUwMDAyh4HzYf7L7Oqn+na1vd5fO3179sXt9lx1MDAxN+zpkt0yrz5d/Vx1MDAxMnaV51x1MDAxMrHu2bDMybli/SNnJFx1MDAxMKiyXHUwMDAwXHUwMDFmKuCR/F6fTq3mPM7AOlx1MDAxNVdmV9mtwCpMzptxLPNcdTAwMWF2fCNPXHUwMDA1XHUwMDEzv+Oa/3/MqqKds1x1MDAxY3xcdTAwMDJnK+f2XG6Oy47sk+e4cVx1MDAxM2v03Su6glx1MDAxNpJcdTAwMTDYQK7yfqqkXHUwMDE1itBzXHUwMDFj71x1MDAwZihePSSOXHUwMDA3I3LSXHUwMDBlXFxcdTAwMWY4glHns0hcdTAwMDV6NY7Ri1x1MDAxY6yhOXFcdTAwMWHWq9BbqDnUXHJuKo/Qk1x1MDAxY1pcXEXMJVx1MDAxY15l8eywLtZ55MhcdTAwMTnO8I1sJuDonurW8clSY/xaMpxLl4xj+/PjxIY1QSXBwFx1MDAwMypcZtxJyTFg0lx1MDAxNVx1MDAwZlx1MDAxMOLUXHUwMDFjzi/lWTamRjeBTCdCsYmSNSY07YWt5TFcdFHAK3HG1Vx1MDAxOVo8aYI3xpehXHUwMDEw9qrg1lx1MDAwYlxyXHUwMDBmwnueXHUwMDE5XHUwMDE4OVx1MDAwM4Gz9Svt/YNMc6+527+2PyX2OaqRWUdccqSmebZImXleq2+ez8/WXHUwMDE35lx1MDAxYsufZ+dcdTAwMGW2rlZcdTAwMTfn3i6/nZfTfWBgXHUwMDEwbP9N56tcdTAwMTnOklx1MDAxY1BJf1x1MDAxZng4tKZHYXmQh1x1MDAxOJNvbPKf8Ya5YfdC2aGBWkiexuHS4eU8WmPYLluyLuMrJl6/htxdxvyonsvd3TtcdTAwMTncv2/57idr/VxmKP0z2lx1MDAwZd/+5u9cZlx1MDAwN98wxuLqxZuLePTu+7I8fd14fdk+fbW08Fwiy+q3PNygXHUwMDAxfHH7yT9/ltP9+fV+86KfJ3R9xc2Pl62LQ7N5XCLP31x1MDAxYyxteXmp9Go12etcdTAwMWb3L6+2vp/pneXL7ltcdTAwMWKWXHUwMDE3Zz9cdTAwMWVnelHHLndcYt/kQVx0WFxyXHUwMDA2z2aQVzUoXHUwMDE5K/K5+89Iu/ajm5F4UjB8JVEq7uv1xb38XHUwMDE5l4v7YWP38KzXnFx1MDAwMoG3PLiag1x1MDAwMVNcdTAwMDNfXHUwMDEwd6fgbvGMQFx1MDAwZd1cdTAwMWEr7rVcdTAwMGVcYm3uxliCw6NPOLqAQ1x1MDAxMCNcdTAwMTNRw+I+SOP+lG9ccs+cI1jL246eXHUwMDAwT9+HdVx1MDAwN6vqdvprrStuh1x1MDAxMrl3XzeOW20+/MFcdTAwMWSnPE2t0ek3e7zIzMvVxZm1Zlx1MDAwZoz8XCL3rZft1kEndfaa/G5OXHUwMDEw+q3dRvv2XHUwMDBix629vaxd3MWlXHUwMDFi8GR7i3UsV7fXOmh1XHUwMDFh7fVaK2uc9bufmqfXt9vvnTWzT6z59tbVSm4g0P3MeaZKsyDgdCE1u3PK5PvzXHUwMDFkzHk43z0/7C11ttTX84NcdTAwMTDX7c7Xt9Ntzlx1MDAwMdh1wrn/ii1cdTAwMWZcdTAwMWNBU7TnJtFcdTAwMTBwXHUwMDFlXGInlFx1MDAxM7awsumx55xcdTAwMGVcdTAwMDc/Y0Sb4XOZ8yqz299f9+ry+EN/qTm/K94vyq+zh/N1ze7LuNHZnnVy8d3lTm9j/nD/495mTbM7lu7c3kf9+sv6wbuF1ruThfarXdne9pMy5zLANVx1MDAwZVlcdH9cZnPuxUhpl1x1MDAxY1x1MDAxMFx1MDAxN0VmaFpW3Dfqi3v53k25OVx1MDAwNzDXXHRr2lx1MDAwNctFrFx1MDAxM0WBtz5cdIqHkflYIfBcdTAwMGax6Fx1MDAxY1x1MDAxMslpmIGuVGYwzDiLbnicgnX2OS36nbn3YVx1MDAxNn211z1v7TV7MyftM1x1MDAxONTHMubj7VbRmI9cXNSk7Pheq3Hc7eyVybVcdONqxThvUOvSoPmX+nK99PLsfThaXdp623U7y4fbO/Pft0dcdTAwMTWLTYlcdTAwMTmHXGLBgGpOPuL4XV1IQ1x1MDAwN8VcdTAwMTHaXHUwMDEwaM2h0pnBnUNCrfZj05jxQr2j9tXOTolQXHUwMDA3YFx1MDAwNZ5som+M9MBcdTAwMWJcdTAwMThItbSJtYZV6kXxTqfqa1x1MDAxM/WjWPCf9TtcdTAwMTO34Fdb/dXVlbX3bvfgdVSz31ZcdTAwMGVbL0NdS2tEZ2P1XWfrJFx1MDAxZfSVvFxcvOot7dT08yssLWtvONDz0S1tduJDUVwinVDG8Fx1MDAxNKEyidysL5Hlz3jKLa3jcHbPMzZEYId9oYcsRMuCMet5+sCDZXKUofU2YZNcdTAwMWFLlnh2bZlIlkiiJi6wWVx1MDAxOX1iS/ugXFzU/Sxtd2+m25n5q3Pe6vXPXHUwMDFhbfyt091rPpLFrTAxQ1x1MDAxNvd6cT+Xll/YpKzutYIpkfAoRk5TYOrCclZlmYB/vUN99lg9OKVcdTAwMDLuleTpNtJShkuMrlx1MDAwYkmAXFyrMFx0oztSwDlzyvogVclwXHUwMDFlnoam5TCSZmVcbnx6o8pz0o9vasfKvcvOXHUwMDA0vH9cdTAwMGU6s7Dm9aXryF6qKXbPuEqWklhpPFx1MDAwZqyCXCJ3PNMtk/F7cdA44Vx1MDAwNiScg1wirE37XHUwMDFmQ3aMOfj2XCKf11x1MDAxZXoyudz4qFx1MDAxNe9vtd+srsuNxbONXHUwMDBmy5s9eSXMx2bZikVcdTAwMTJ4NDgwYNDs0c9WXFzfLFcngVx1MDAwM+NuXHUwMDAyLVwie1xiTI3lTjhhX9Q5XHUwMDEzzdmXSFx1MDAwNl+zP4Vi8PshKNVs73R/1MRFI9WmhF1cdTAwMWaJjDRcdTAwMGYu5ElcdTAwMTRlinOrvuJcdTAwMWNcdTAwMWaqmVLFyUOMYY20S+dXx8zo/2vNXHUwMDE5eaZyXGKRnoR3ZkxXy0M0p9ZcIpE8KZK1cTJzXHUwMDA2bFx1MDAwNlx1MDAxYfHYeiWvx1x1MDAxOFx1MDAwNz3U0+KlhZfzSCnEXHUwMDA3qNE09cDjKlx1MDAxZlGNnr76tPGl2du5mt9/12j0t1x1MDAxYkvzK2sj1KhkoSZcdTAwMWLOLYva/LBcdTAwMTI1PIZcdTAwMTFSaWAmXHUwMDA19kJl6UxGiY5cdTAwMGZy5JRoejyBjYZn5khZokR5zo1QmozBoLN8dCVa1DJPqUdHylx0X7NFXHUwMDExeXStasLoZnDL46GiXHUwMDE5XHUwMDFjuZrVqo36WnV8+n1KtWpkYDdoIFLFyVx1MDAwZr7QKlx1MDAxOIXl8V02cJ68MP5x4ChYhY1cdTAwMGXeR9ZtXG6rS3K12ibpXHUwMDFhtOBxXHUwMDE2Klx1MDAwZalVJ4GjJuN+TlxcrWqXnUk9ebU6PrGaU1M8XHUwMDEyiVVZ0JmGp75mu61v9SqkwfBQLs/CcfdcYnq1tlx1MDAxZMCCOVx1MDAwMZjjdFx1MDAwMs8jcVlcXHa7Xlx1MDAxMalJbDBpyV6803p/JXQ6WlD4XHUwMDFhXHUwMDEykVx0qdVRQTzlR/Z4MarOXHUwMDExRKUu/k59nbpi+v2XnzZfrS3Lzyvr8+3L7bdnXHUwMDFmpl2nXHUwMDA2XHUwMDE304GWkYeYcD5YXqfCVU00I3zA8+Nd/Fx1MDAwNyXLnEs8S4klXHUwMDBmaOH5xGU6tahEg7awXHUwMDA0Mv76MbyQe3dMXGZv4yY+tvyAwF2/ezIqapdbdzFEV37tScXmRsmts2NGaCvrZFxmrtTF3K0vuKdvL85cdTAwMWK7buH90a5faM4vLiza96+nXXAlTFxip6d7XHUwMDFlU2ekLPSPXHUwMDA0ZVx1MDAxMlxiLM8j5kSDMWNxXHUwMDFlXHUwMDAyhqSJiYo8RdCkx//oXHUwMDEyXHUwMDE3M1x1MDAxM6G+XHUwMDEx3PR0LyNGtGE+UZpcdTAwMWJAMTNS6X6Cm6klqlx1MDAxMNy1tbczn5dcdTAwMTc3Z9ZW5pdcdTAwMTbWn1p2R17+scXXyNFcdTAwMTFcIlx1MDAxMdnBPqLGfO9cdTAwMGV2N6ztfP3+eXFztfHh+GS3705cdTAwMTbCqKK0qVx1MDAxMV+WnXnWe1x1MDAxMeHCrStcdTAwMTSpRE5K5dHonCdcdTAwMDK7+DhcdTAwMDGidPRKelx1MDAxY1x1MDAxZo9sNGVTT4alV/K8ZbaGPKf4Ko7rezrxPeu0LmZOSbD/1KJbeumnqEOJIyWXJ7IzXHUwMDEzUFxumJv1XHUwMDA197L3abf7Zv5iSa3sL8+9eTX38erN1rRcdTAwMGIufDbPk9y1XHUwMDAyTFx1MDAxNcWct/WOp9lItp2Nz3nvi7ArxP3kVvHcS8VmubKcmOJcdTAwMTEuXHUwMDFhSsWV5MXoi2mVOWP4lyhB+Xx+vt5wX9z+5qftdz/eLLUvd9ZN3Vx1MDAxMpQ37z9td1x1MDAwZnqti52Nq8WFtVx1MDAwZnvrX7ZU/ir3L0G5s1x1MDAwM3AvM6pHh1x1MDAwNDm9R45qpN6vL4zlj3jahTE6m7AvM2p1XVqVXHUwMDE3R8dTzNOh11x1MDAxMVbuscRRXG6dXGJcdTAwMWFzZ9jCL8tQsFx1MDAxZLajiieSS/F8dvRZalD+6sz/NH6nj1R7UmFXSmpPylx1MDAxNzUpK9tst1snp6U9XHUwMDFi1o3Gx057nppVPnrooL5kb1x1MDAxZL9Ul9+2zZd3a2r1eLW5PL+9PmpG+ZRUe3LqUlwiJCdnWG+HjCyEXsCJXHUwMDA09+JcdTAwMWLRj5459CCp1iZhtW1p3Ylxklx1MDAwN+K6Mlx1MDAxYmucXHUwMDEx0UT3XFw50/uZ2M2T1vzn7c67471vn8355fbJxdK2fO4+jX+B6TajayR4NK9cdTAwMWZlulx1MDAwZutcdTAwMGJ4+dZNu+n2XiecX1x1MDAwM/lcdTAwMGVcIntcdTAwMTTvzVx1MDAwMFx1MDAxNC9cdTAwMTJcdTAwMTfZbq1cdTAwMTnkXHUwMDFhM1isjpCP6styISE2MNb5wMLukurRYcutXHUwMDE0z2nxz9d4+fSGe45Dc/7qrF2e9pvHj2S2K+xU0WyPWNKjXHUwMDE3i2ZzJMPHiljBc2NKI9Kt+lx1MDAxMj1en06rRLtcdTAwMDCR5VxiUJ9cdTAwMTbo+WJI2nlcdTAwMWU1xHOrrVxyWlx1MDAxNFc2mZiWXHJcdTAwMDBcdTAwMGU831x1MDAwMF6u4YWGJZrlXHUwMDFlSrJiXFzJwNNDMieA/Yxx8Sx5XHUwMDEx5Vx1MDAxNCbo79+gVTdBX7+OyHNQqExcdTAwMTdlWImY+dJ1utsmTE2k0yM1J5G6LJnJpOfHq43MctNqV56zXHUwMDA2XHUwMDE2lIpDTrOzWW6rR4E5XHUwMDE1lqrBoTY/pO5flqBcdTAwMWYpKXzNXHUwMDBlXHUwMDBiyYDeXHUwMDEwtppI4VN2eGhRsYK5eFZf6XFNR/X16ng8Oa16NVx1MDAwNJVcYqMlZ1REq4ZGxcFcdTAwMWQylpXZ7LRcdLGwsMmoVVx1MDAwN2E3Nkiod/7pVFmuXHUwMDAw+t14p0VcdTAwMWGgt9mTOlx1MDAwNkdgOCPD9NWTPkVZfm1FxcnJWvLcXHUwMDAyab2gXHUwMDA3KrJlTdeKylx1MDAwMTx74XlcZlx1MDAwZbtccqO+m6KqpVrHXHUwMDA3UvKqVUmel1xuZ1xcRZ7bIIdXLMHF6Vx1MDAwNG5wQDTG5Vpccv5dqnW0tPA1OywoXHUwMDEz0q1j54Nk51x1MDAxZVx1MDAwZsWaiMli0KVcdTAwMTNcdTAwMDPadyilXHUwMDE4Wys3pVxuXHUwMDE2955cdTAwMDTphVMxLZcotDnBO0ygZNOKXHUwMDA1KXPnf0/ZhFx1MDAxMIhcdTAwMTZcYkzXuK+quNPe6qZZVn7n45vTpatXXHUwMDFiR6uvXvXOn2COx1i6XHUwMDBmmE42JL8luWudXHL7PlrKaDSasixcdTAwMTgy5cJ+XFxf2Mu3bsqFnelbQF5cdTAwMDMzpYXJPoRrYVx1MDAwNyp2XrF1KVRcYvtcdTAwMDNcblx1MDAxZWNMODVbKcPaZmnLwNRw7tY4XHUwMDBlXHUwMDA3i+bZ4k5cdTAwMGbqurlX3ImFS41cdTAwMDOs65FiTlx1MDAxNfaqrI6qsJxHjzdcdTAwMTk7eiBISKfwilBaQtWpL8njx1x1MDAxYk6pJMNYJyE4gF+OOsqim2u3XGKC7l2UnGyttdSP41x1MDAxN6lExfScXHUwMDE4y1x1MDAxMIjPXHUwMDA2vVx1MDAwNslcIp1giVo5oGIvdFx1MDAxODqYQlx0nn1cdTAwMTWjLj/B9pnb7O474a+mW3SH3l88O3ZUXHUwMDA2y+OstfByuL/iXHUwMDExmpNrN6ykZ187nnaj2OBcdTAwMTF5ZEmZ48ZcdTAwMGZMtNpcdTAwMDfANfXvXHIwjZZccr6GpGJAblxiQ02kXHUwMDAzZPSQXHUwMDA3ybCgXHUwMDBiWeSf0aPd+nr006vttbBuXlx1MDAxZc6vicOmOtps7bU/T7tcdTAwMWVccjomXHUwMDFhXG5IhcAjXHUwMDE0RSFcdTAwMTFcdTAwMTdE4ER3toVxpnumXFzl2UtRtdJcdTAwMDBpelx1MDAxMlH6503E/a5EXHUwMDFkUyMjMyO4h1x1MDAxMm6KnVx1MDAwNKY84XZaX3B/vDM/Xn/8fiTez8tv6uhje07MjzpcdTAwMWN5WmpktJGJs1CxUnLC0lBcdTAwMDLdOsZcdTAwMTGBjaxVzjxwsOmokWjRJS49Y86HXHUwMDE0aZWk27K9KT9dmVx1MDAxOEJ0XprBvv1cbjUyO+8uXHUwMDE3hfnxfXtTL+1cdTAwMDezf3m0vrR3N9+fXHUwMDBl1F3q1u9l6vzIY3egLINcdTAwMTLelPdM9etcdTAwMGJM+aOYcoFxPK1DKGnS0+yK/kJQXHRnXHUwMDFkXHRnJKdcdTAwMWT5R5FcdTAwMTerYExjdMxChnLP31xy2TmWuVx1MDAxYVxicaaR/Fx1MDAxOTz/u7Luw1xmXHUwMDFkXFztvzr9s06n2f6r8zCDV1x1MDAxMVx1MDAwM6jQ/SUxgNFcdTAwMGK7szn840ZdvGicnKz18cRvNdqL81bzx1xcKYTii2on1Vx1MDAwYpS1ZqpcYv/545//XHUwMDAzyUI58CJ9 + + + + + LOGIN NODE ON RESOURCE PROVIDER3. No INBOUND connectivity to the HPCVirtual KubeletInterlink API ServerProvider pluginPod on virtual nodeVirtual NodeSSH UNIX SOCKETunix socketPodContainersBatchSystemSSH agentunix socketSSHtunnelsocket diff --git a/docs/static/img/scenario-3_light.svg b/docs/static/img/scenario-3_light.svg new file mode 100644 index 00000000..f801074f --- /dev/null +++ b/docs/static/img/scenario-3_light.svg @@ -0,0 +1,13 @@ + + + eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1d21bb2JZ9r69gpF9cdTAwMGL1vl/OWyAkISRAXHUwMDAyIYSuXHUwMDFlXGZcdTAwMDNcdTAwMDZMjE2MIUCN+veeU1x1MDAxMCzJsiXAgFNcdTAwMWTXOamUL0tb2usy13X//cfMzIv+5UnzxX9mXjQvdlx1MDAxYu3WXq/x48WffP+82TttdTv4SKX/fdo96+2m3zzs909O//Pf/904OUlcdTAwMDa/Sna7x9e/bLabx81O/1x1MDAxNN/9XHUwMDFm/PfMzN/pn5lr9Zq7/UbnoN1Mf5B+NLic1bb47nK3k15aeSOFiC7cfqHV2WtekOSOnFx1MDAxYlx1MDAxMGudvsJcIvrNPXyy32ifNlx1MDAwN5/wrVx1MDAxN1dXb1ZcdTAwMGZPZt+8Uc3vO1x1MDAwYltf5l9uifbg5/utdnutf9lO13raxf1ccj477fe635pfWnv9Q3wqXHUwMDBi74/6Va97dnDYaZ6e5n7TPWnstvqXfE+I23evXHUwMDFmzH9mXHUwMDA27/BcdTAwMDalXHUwMDE2LolcdTAwMTFPQElcdTAwMTWiXHUwMDE1g2eQXHUwMDEycCEkQjijZTBCOmlcbiub77a7Pa7sv/ZF2Fx1MDAxNWKwtp3G7rdcdTAwMDMssLOX+c5+czfGwXd+3NyvwVwihDUu+MFcdTAwMWVcdTAwMWQ2W1x1MDAwN4f9dHdC4rRcblJZkb7cYFxyzXQvZMS72ipcdTAwMTlvP+GVT1x1MDAxNvdSZvnfwVx1MDAwZfRcdTAwMWHHzUX+pHPWbmdcdTAwMWZjZ+/mMf5kqlx1MDAwMVvpm3f+XHUwMDE53Fx1MDAxYb+/UGTHLEvm2LLfvOjf3nOGXdzF5clXM3tcIi5+2MVcdTAwMGbyy477sS1e3H7vn5u/XHKWf3ay17jmPumVi1YqbLBcdTAwMWbsWLvV+Va8t3Z399uAYf/I3MiQ+OTWmZFcdTAwMWNj3CjJkUJ7a630rkx05uuLTvmzKFx1MDAxN53Dxu7hWa85XHLC41RinZBGKCGUjrEgPFE/gfCoaJIoY4hSW4pxXHUwMDFjXHUwMDE2ISuKXCKjnVx1MDAxM1pcdTAwMWEpXHUwMDFmLjG5XHUwMDBmhkRjktw7WFW3019rXaW6W+Tefd04brX58Fx1MDAwN4okZWs8wPcrb1x1MDAxNpdnlldeLcysLM98Wlhb+fxpfmHmr87qp5WNxVdcdTAwMGKfXuR+8rLdOiD3v9jFrTR7OcHot2Cebr/Q755cZj7dxVwiXHUwMDFhrU6zt1jHJHR7rYNWp9FeXHUwMDFmv8bhXHUwMDE1Ns763U/N0+tn0O+dNbOPsfn258bLRNmxMj/WZIJJRlxuvpZcdTAwMWW7570uXHUwMDEz/Ff1XHUwMDA1P76Lnc8/7Gzv4nz/9OLN61xyefbl23TbTOtgkKxcdTAwMTZaeFxiv9BFqdc+cdIqQ83osrCjKPWyyX/GS33D7oX9/WGpt8EkvLZw12ZxcCu3Um+USqRcdTAwMDes8Samr4z+udFcdTAwMDLaOOuM889kN0cpXHUwMDA368B6Vks1KdM2ls2d1CPZXHUwMDFj+MeqXHUwMDE4ZKl9W6jP5icv/cnm7MrHXHL7+e3Z4uJi8+pgpzPt9s178JiO0msvfVAuz+deysRcdTAwMTlcdTAwMTmiNlJcdTAwMDG9PVx1MDAwZZ9ra1x1MDAxM9g1S2gqJIWrXHUwMDA0IcaYWEojtstcdTAwMTgvhlx1MDAxOV1cdTAwMDbhdTDRTFx1MDAxYqfDXGZKPL9oJ8XpI0FcXPQjmVxcS+vw5GxcdTAwMTmPv67P45fb3y6bc8d73fX37Yulo9Wjo6tXXHUwMDFi087jVrskQFd7XHUwMDEzjFx1MDAxMiqjXG7S31vvXHUwMDEzK6Elo1bQp0E9XG6TW+tcdTAwMTMpLZmXyk+VeEFZM3LD08ZcblxuobVcdTAwMGbn6fthOKjpIIVcclx1MDAwZsZwIffuXHUwMDE4XGank5nl7szi8tzK5+VXM8BaXHUwMDFkKPbWOTZ7pt+d6Vx1MDAxZjZn3q7OP1x1MDAwMo7L3VBcdTAwMTG03XFRT1x1MDAwMt1sXHUwMDA22Vx1MDAxN8VcdTAwMWRcdTAwMWOjnFx1MDAxMbFcdTAwMTS6vakv7/tb7Ter63Jj8Wzjw/JmT15cdPOxOe3y7mNItFx02mhVXHUwMDA23ryBM+Vh80NcdTAwMTCPXHUwMDA33rSQuMq1qI9cdTAwMDBvVjIsI2+x22CdN+JcdTAwMGaDXHUwMDBig2bVYFx1MDAxN6ch5nHNXHUwMDE5RnQ2Vt91tk7iQV/Jy8Wr3tLOXHUwMDAwLOW4uNHrdX9kglx1MDAxZX+Oozu391G//rJ+8G6h9e5kof1qV7a3/YPoVsVoLntL5sO77tzVxo+Nq2a7XHUwMDExv+9f7tddbv/yauv7md5Zvuy+tWF5cfbj8fFyveXe/O3JXHUwMDAw8ijYoMRobKxj1IBcdTAwMGVyXHUwMDAwLDJ65O1cdTAwMWRwQ+kznnI9XHUwMDEyfEikNVx1MDAxZZCTgUdbwFxy3obEeOOUqnRcdTAwMDKjl7vqfqFcdTAwMWZpXHUwMDE0wHGMXCJcbutcdTAwMWRcdTAwMTijXHUwMDA0XHUwMDFiXHUwMDBm41x1MDAwNqmthlrRz1x1MDAxNvu5XHUwMDBm95bihtqxn41Wr3/WaM8sne2QXHUwMDE174tcdTAwMTCOW3t7WXtbXGL2VFx1MDAxOMRcIm5cdTAwMTi5qEkhXHUwMDA0frtMqMHdqvj2rVRcdTAwMWJcctbQWSCckerF+lK99e1s73RhafFy0c29eb31ebb51ZyOkOrdXvf0dPaw0d89fH7JdoT8uH9cdNc/XGJcdTAwMTVcbpLtnE+C1IHZXHUwMDEy+KWZhMl9JFsrt9u0JZKtYmKMjtZcdTAwMDRcdTAwMDX/21xyPNpbyZbKJlG4XHUwMDE4XHUwMDFkdDCWk0FcdTAwMTE/JV1cdTAwMDSLnczq8KykXHUwMDBmrP7h94+LO2ebZv9s+2hu42D39cXJ4seMoXrxcm57TVx1MDAxY7w63ltuXHUwMDFjdT6fNzZOv1x1MDAxZPuf5mraNcZpv9Hrz4GLW52D4k+anb1cdTAwMTGftFx1MDAxYqf9+e7xcauPZax2W51+8Vx1MDAxYindlzTch83G0E2D8sjPTkguv1x1MDAwN4O/zVxm+DH9j9u//++fXHUwMDEz+PasTrT2ykDIXHL+zbRn7vdJXGI6XHUwMDA22DX4ujpcdTAwMWFcdTAwMWQqXHSaXHUwMDAwcYnRROdcdTAwMWTkZVx1MDAwMFx1MDAwN/hSXG5sLFx1MDAxNK/kotDGPTU54Gh4O/i2jfRVhc2RM0lcdTAwMTAxOOi7iGs6XU1OJ1x1MDAxMpbTM/5cdTAwMWScXHUwMDFmpHRSciFRxkFcdTAwMWVBT2F5spKcM9DhXHUwMDE2nrzz0DbChCw571x1MDAxMqeYXHUwMDEzVbDvxvrqrZg8Oa2D99FC+GRwuZtcclwiXHUwMDExXHUwMDA2jORDXHUwMDE0XnpfTU0nQlx1MDAwN4fNVcqEmFtb0Fx03tTKwOGBlJtqYiqBXHUwMDE3Kyw0tFxmMlhfoFx1MDAwNkBcdTAwMDTtLC2uXHUwMDE1tapcdTAwMTZcbploXHUwMDA1X0u5qFx1MDAwMemczt2qXHUwMDA023nlo5BKYvlOVd/sxFx0gre0jMZI55V2MFxmIU/QJlx1MDAwMlx1MDAwMotcdTAwMWJcdTAwMDZcdTAwMTeT36tcdJrEXHUwMDA2LE4wRaCNtEV6edtSRVx1MDAwZj/AptqghXHaXG6t3Fx1MDAxOHrV3DJpcjFh8M45XHUwMDA3dlxiLpNcbrl9erhcYjhZUHhCJf9plUBcdFx0XHUwMDA3jeJlVGJod12UXHUwMDA2q/aeofHKzYBoXHUwMDE4bK2V+Fx1MDAxOcTAXHUwMDE3ZSM4XHUwMDAxXHUwMDBmXHUwMDAzwqbAXHUwMDAxT0vMJrhHuDPQK9DF3lx1MDAxN1SA0Vx1MDAxMk6Otlx1MDAwMcpax1x1MDAxYdSEc3gyKaop6Fx1MDAwMOoniL9cdTAwMDNqwl45V7k26GKoYlx1MDAxOWDPsFx1MDAwN1x1MDAxMKKCLpZcdTAwMTHsXHUwMDAzOyZcdTAwMDOMSbRPTVx1MDAwZSxcdTAwMDL+0NCgsKeQ8qLlgcOmyFwi0NTYqEptbMDCXHUwMDBlqlx1MDAxOFx1MDAxN9c6XG6VJ1x1MDAwNz8wMlgtmc5cdTAwMDOfV0qESSQ2XHUwMDAx24d7cVx1MDAxNipoXGJcdTAwMDZcdTAwMDShcSmSw4ZVyv+k6c3SvKQ1QdB6YFx1MDAwN8BtnSM5K/mFoPF/WFx1MDAwMSeC0c1ZWXnfo9DSXHUwMDFm2X/f2aGycmRxXHUwMDE5doVxcuFLwyTv6jtU61x1MDAxMOq92dPzdvNHa23z/det5vzmyVxih2pKMuWpK1x1MDAwNblhXHUwMDA0xHuRyd3dXHUwMDE0l0FcdTAwMWJcdTAwMTnjvIXpylxi3D1jJCWB1lxiMVx1MDAwYtpH8JCDmi6Js6YlOpBRZWzUQvmh1GGk44E/yjOHt1xm9NtF+ve4SDKByoFcdTAwMTnAplx1MDAwN1x1MDAwMGb4XHUwMDA3eV1cdTAwMTatN0HSwMNUSF1pXG5mgVx1MDAwN1gmXHUwMDA23VxiNoNcdTAwMDK3ObxAXHUwMDBlXHUwMDE0kFx1MDAwNamFxi7GXHUwMDFhXk1cdTAwMTVB72CqvPFWXHUwMDA3uDb24Su8XHUwMDA3QeAtWCuJXyiv8GeWoFx1MDAwMzqGP1x1MDAxNryA3qZTUoOeXHUwMDAwKVx1MDAwNbxcdTAwMGbUXHUwMDA3XHUwMDE45/J4VSZExZpQXHUwMDFhlE0tgiHC3ivF7G4w0EN5XGaXXHUwMDAwd2pcdTAwMTggwCS4XHUwMDE4NbwllUQ8QXrVjNfYkGNcdTAwMWGJR1xiSy9CiEZcYjyNalx1MDAwMzhpej5cdNxcblx1MDAwMePsXHUwMDAyfeFcdTAwMWM9eFx1MDAwM5r8XHUwMDA3kl5A3Va7YHhEnprVw1xyXHUwMDA3Looqv0BH81xmjIdrXHUwMDAxO8JIV1x1MDAxM/RcdPw/bFx1MDAwNrdReKdy9Ohbx1xi+KWZ9Vx1MDAwMpiofoAyXHUwMDAxeoDdgbdcdTAwMGVnS+Xo4UNwu/cqXHUwMDE4fFx1MDAwMUi4htDBJ1x1MDAwMVxi0Vx1MDAxNl/3XHUwMDE0gtxcclx1MDAwM9FcdTAwMDFYO3xcdTAwMDNeXHUwMDA0TI6uwYIuMdhcdTAwMGJFV4Z/5EREXHUwMDAxjlx1MDAwMlx1MDAxZlxuXHLmk9znai924vRcdTAwMDLgelx1MDAwMFx1MDAwNtNcdTAwMDFbXHQ7rVxuXHUwMDA0YbilMJqVObZcdTAwMWH90ylcdTAwMDb70f9cdTAwMDCE9s7mvXZcdTAwMDVvwuPhwjNQuKSvdk5mNVxcXHUwMDFkilx1MDAwMVx1MDAxODBKqGtT4Fx1MDAxOFx1MDAxYtKaIVhFr6Ov5kBtXHUwMDEysCyLeb2VgDe6QE/Cc6JLXHUwMDE1yfjVXGYzaXJweq3FM5JcdTAwMGXb4VXBJ/ZwXHUwMDAxYmTAmlx1MDAwZrHafZrVXFxcdTAwMDFcdTAwMWMtXHUwMDBiXHUwMDFkXHUwMDAyXVx1MDAxN4vLgzFcbtA9XHUwMDEwNYdr1Yh5hIRcdTAwMTl1XHLTXHTzaY0u7m5cdTAwMDDSk/SHLJimmpxnXHUwMDA0XHUwMDFjXHUwMDAyxfhcdFx1MDAxY6ghh1x1MDAwN5pcdTAwMTlOJFxcNnhcdTAwMDE1XHUwMDE0Plx1MDAwYn3AxzBkXHUwMDEwT9xTMbBcYj6Cf+JcdTAwMDM9wFit7idNXHUwMDBl6sNY3Cp8XHTojny8XGK6XHUwMDA1MuOhXHUwMDE0oV2wIzXIicTGQE9cdTAwMTXKXHUwMDBmYpCXXFxcdTAwMDdPN1xyofrgwTM14m2gXHUwMDA3w2FcdTAwMTl7xU7gZ8XAp1x1MDAwMVx1MDAwZklcdTAwMTfhhCpcdTAwMDX4UK1bYlwiWSBcdTAwMGI8IayDo5xfYUzwNrY2XHLWMDbz9Fx1MDAwNFx1MDAxOeNRYD0niClsXvlhu6LWNC9AbbFGsIJcdTAwMWJcZlvE8Cbj7tDBWXJGsFx1MDAxZVx1MDAwNMiGbixcZnFccoBcdTAwMDVtIKA/gndUMGJQ9p/S81xmXHUwMDE2XHUwMDEwt2jBorJ6/Fx1MDAxN3C/SsJZw2bm9tdqwMOIdy3+0cBcdDVu1yZ4OFx1MDAwZYKOnVx1MDAwMFx1MDAxMnBcdTAwMDV6XHUwMDExMlx1MDAwYshA3Vwi6sRTJ0xcdTAwMGVcdTAwMTJcdTAwMDDVXHUwMDA241x1MDAwZs1mXG5JXHUwMDA2a1x1MDAxM1Y1YMshXHUwMDFjcLqrWcVIrI5QXHUwMDA3XHUwMDAyj+1zRXJQeIxUuzRYViOjYlx1MDAwMISAnI1cdTAwMDWv+kIoxTqsjlDNO8mqzVx1MDAxYVx1MDAxOVx1MDAxNdxcdTAwMGazmVDJXHUwMDBlXHUwMDBiyatcdTAwMTaQ01x1MDAxMvhcZp9AY1x1MDAwNV2LXHUwMDFj2CRcdTAwMDJmwJIzmTBd5FxcQsxcdTAwMGWuXHUwMDBmwIrSXHUwMDE3yTHaxqpbzYriXHUwMDFhYlx1MDAwYkmCXHUwMDFk9DYqQpJQWJ5cdTAwMDfjXHUwMDE5qG1cdTAwMDfYLKWqwSmOrKrAK1x1MDAwMtvnXW5rnUhwJWxRXHUwMDAw+o1cdTAwMDBd1VpcdTAwMDD0PMRcdTAwMTYmXHUwMDFjllx1MDAwNuyQXHUwMDBmbIMgK0OASOEk0JLXuF+CXFz6oVx1MDAwNkZcdTAwMDNcXJbTelx1MDAwZYhcdTAwMWFaXHUwMDBm3lx1MDAwMcPosOM16LFNXHUwMDAxoFx1MDAxZXpcdTAwMDPmP+q821x1MDAwMYL0pYXDhVjHUsOXNpooXGJej1x1MDAxN1x1MDAwZSDcT4BcdTAwMWV0XHUwMDAwXHUwMDEzYjBcbiyLKdAzTOAooCNv4Fx1MDAwMD85OZGkXHUwMDEwlt1cdTAwMWLwa1x1MDAwYncr6HJAUcWAba6j9Fx1MDAwNJQkbIJ2hKS5pdlcYlx1MDAwZprharhfXHUwMDEyXl2NnFx1MDAxOVxcRuBcdTAwMDFcdTAwMDBIXHUwMDE4My9UkVx1MDAxY4ydSVx1MDAwYlx1MDAxY2EuQlxy91x1MDAwZmBcdTAwMWXQ0UMsXHUwMDAxcuA1ulx1MDAwMj08UVxcXHUwMDA1Vlx1MDAwMG65qOFsTJicSFU87a1cdTAwMTewXHUwMDE4XHUwMDA1PobUWFx1MDAwYk9cdTAwMDOMXHUwMDBl+bA1fCvP5aUlXHUwMDFlOkLZ53fWi8TD1ElcdTAwMTUs8KOoXHUwMDExfFDAI1bD6HtsiFQmJ7feQo06Tf/U4qI1pFx1MDAwMt5cdTAwMDTuXHUwMDAy+lx1MDAwNEpFQCFcdTAwMTRSNTFJk0Ken1x1MDAwMHpUk6P3XHUwMDBlPWSZvoT5KqaRRICxVfTuXayRu5w8OVx1MDAwMVxyXHSAIy1jYD7HK1x1MDAwMUpcdTAwMGZerlx1MDAwMTSHplXVN0tXx1x1MDAwMFQzTFx1MDAxMLXyJr88xzQ4Plx1MDAwMVx1MDAxNFx1MDAwNdFcdTAwMWFcdTAwMGZPSWhxgbsxYL9cdTAwMTB8XHUwMDFl/Fx1MDAwNGamXCI78YDbiGnq8IoyjPbZSLRcIqMv0ItA8N4oxlx1MDAwMeGuPVx1MDAwNz1wsJbaMIdprcrxXlx1MDAxNFx00I9nVClcdTAwMDLr1Vx0RXJ9OkjDsFx1MDAwM1x1MDAwYktyslx1MDAxMdnFXHUwMDA0fFx1MDAwMVx1MDAwMCkkLGmtuFKqRIGUNXbZ5DN7XHUwMDExq1x1MDAwN5uw9Fx1MDAxM9pcdTAwMDeauZr9YsLMsycsgVXLx6mG8lx1MDAxM3XIMcJCx5nazcXC6uBcdTAwMTZ6dm0oIINYfbeprNH7pOMuaGhcbvRgl0CRXHUwMDEx2Vx1MDAxYXCKUVxu8Fx1MDAwMvNBQYAt8lx1MDAwNTQxXHLjRmhRyCPr2+vQg32BXHUwMDBlclx1MDAwNjaX9W5cdTAwMDVegUzQXHUwMDE3jGxcdTAwMGXzNe520vRcXKKoco1cdTAwMTdcdTAwMDC3TvqibFxiXHUwMDBmJFx1MDAwMy6Gulc1glx1MDAxOFx1MDAxMpqcPEKrwVhtvsQnwFxmKaBVKVwiXHUwMDFlYnDVukDCK8WtauNcdTAwMDCzXHUwMDAzw1A5ej/LclwiIUuow3xkVzpplu3lMeS83JBmXHUwMDE5nCarU7qrzZpkXlx1MDAxYlBcdTAwMTn3RLfTXHUwMDE3ND3QXHUwMDFldVxu/FJcdTAwMWFfX0PUJkzPMSgtmTgh20Ln2+Ljg7qm41x1MDAxN+A+VKOMNMhcdTAwMDJcdTAwMWJOz1PhXHUwMDE5yXzQgelSuFxmiqxcdLNX7frBe/LYXHRGy8FiTlx1MDAxN0tBWMRcdTAwMDaUplx1MDAxNVx1MDAxYuAqXHUwMDE1KVx1MDAxZZ6Fp4FcdTAwMGJDKVx1MDAwYmVcbpt7RzNJTnHww1x1MDAxNFx1MDAwM5CwXHUwMDFlUVx1MDAxNVnFXHUwMDE441heXHUwMDA20+Er01x1MDAxYpMmZ1x1MDAxOHyE/tRcdTAwMDDq0FLBXHUwMDE0XHUwMDFlXHUwMDFkoLhcdTAwMDdcdTAwMGLDKNfIXHJRXHUwMDBiwH5HxvZYwVx1MDAxMYpKXHUwMDAw16G8QG5cXDU4o47yLD6Gg+ZcdTAwMTncLuooXHUwMDEzXHKrJWCgPExaXHJy3DRcdTAwMDZ+IJRG2qJ5lMFQ+vFZjNVcdTAwMGZustRgfOBfwFx1MDAxMkjm4G2+mCmy+8Fpo8hyXHUwMDFlm1tJXHUwMDBlsFx1MDAxZixcdTAwMGZcdTAwMGZcdTAwMWKbXG6LK1x1MDAwYtRg3OCzwGpraPlK6Vx1MDAwMq5Ik2lwQ9N8iyraslxihoProem9VdeWXHUwMDEypqjUO3SwzSrKUCDnIXlpNpBh50ouIYqCs06gXHR1a1xuMFx1MDAwMCCKpUl0jVx1MDAxY5ipurxcdTAwMGaLg1x1MDAwN0pfRVtshilwcFx1MDAwMNyGm8d4uKn2XHUwMDFkiWiNNF5cdTAwMWEokShlgVx1MDAxOFx1MDAwNEGQw6Wk8/a0xJimiJ5uTVx1MDAxYerO41x1MDAxM9hXXHUwMDAwusBcdTAwMTi3YHFnJTl6XHUwMDE2MMRcdTAwMDT8juWCuU1cYkyHQUHjeoIpr2pJXHKAvooxWIhcdTAwMTc1d17H0e+BxWBBJ9RcXKWthqRcdTAwMDJEXHUwMDFiXHUwMDAzXHUwMDFm02omNHNqxFx1MDAwM7bjKShcdTAwMGbYydB+NYdo+oRcdTAwMTArXGI2XHUwMDExTc6ywlx1MDAwMVVpXHUwMDBlVtNBro5rwTvG08WSgErAUy7vvcM7XHUwMDA2ZlHwaK1cdTAwMDFor3aPNeNggtXFXHUwMDFjI1x1MDAxMHMsXHUwMDAy111fQ1LJqKqsXFxcdTAwMWJcdTAwMDNcdTAwMGKBeFx0/js8dFFcZixcdTAwMDC4XHUwMDAyQEAnXHUwMDExZFc+NkZRmF9jvVx0vMHgXHUwMDBi1JxcdFx1MDAwZWCe4bZcdTAwMWGFpFx1MDAxM6bGXHUwMDFjPoC/oqVcdTAwMDG+V1x1MDAwNWp8lFx1MDAxMnBcdTAwMGYwXG6wpfLBXHUwMDE5kXiGPX1cdTAwMWH7coVcdTAwMWOSg+Q5Olx1MDAwNYZcdTAwMGZcdTAwMTZ6qZKchi2BMWXRSnpHxUhb6kNcYlOjnFx1MDAxY6QgXG6sM4yEaqpIyrKWXlx1MDAwNlwiuVBtUFx1MDAxOaGEXbKA4ORhkU9LPzs58DvEXHUwMDFlIJPc6+RQgFfiMqBcdTAwMDSlJKudYYbbo2Lo23tYdjlcdTAwMTR+xrJgnbWF2qyuXHUwMDEwYLDdsEZcdTAwMTQ7oVx1MDAxOI8pMFx1MDAxYy7Apm3G7HyoXlx1MDAxYpWIZ+140NSLefaFLk1hLMAgnka1XHUwMDBlSdeG21x1MDAwMJCHn1RcYrSDXHUwMDFh65Jwt+Q4XZ2BwnNcdTAwMDP+0fDSIavOeV/M8YBcdTAwMWZcdTAwMWSLt1x1MDAxOa6oNqhpiofZ/1xiuWKNTIGaoi/Bwi4g9Gq3xpiESUgyXHSrvtxQ/klcdTAwMTBJw1x1MDAwMkH/Vjs1XHUwMDEzpibTqlx1MDAxM53qJeiQPIuwLVx1MDAwMEpcdTAwMWV8aG2abKih4uC/MdxA743Zl1x1MDAwMj0pdNo8RJRcdTAwMTdqXHUwMDE4XHUwMDA3m3joWCikwD6XOJSnXHUwMDA0ptBp4TegY3XNXHUwMDA3s7IsoJOp4nYxXHUwMDE2yLm09lx1MDAwMVx1MDAxYVx1MDAxZrq+XHUwMDFhxE2cXHUwMDFhXHUwMDFmtGCNhrbC53iOXHRoxaBcdTAwMWHulfGI6nqytFhcdTAwMDaSynyCUFwi0zKd0oMq4YVgeFx1MDAxNexHdVuaXHUwMDA2OI/WQ1VEwUB7zuZz6UxcdTAwMTFcblx1MDAwN6DCUqjK1SlYO8BcdTAwMDQmi71LXHUwMDFi4/7Mf1xu715j4TBfXHUwMDExXHUwMDEwp1x1MDAxYeBEwivoMrijgNN2qJGMWDswolxulVKrv2WS5DR9SI51XHUwMDAyLIQpLlx1MDAxNo/ggbHPyEOgQ43uKoJcdTAwMTLBMmynXHUwMDE5Nch3LrG0xfPRwk5cdTAwMDS4vzVcdTAwMTbnXHUwMDEyuuSBXHUwMDE5XsGmg1x1MDAxYzlFjFx1MDAwMdlP69VEta7Tnj1uzOfQecmn2lVaxCrgicGNJlx1MDAxMK6+1clSXHUwMDBiiVPkK1x1MDAxNt1akUeajFx1MDAxYVx1MDAwNy9ZaWhZyVNcdTAwMWScXHUwMDAzOSZcdTAwMWWlXG40xlJcdTAwMTXrvSxjmkBTyig6XHUwMDE4Ne5VwkqBn+CPXHUwMDAw9Fx1MDAxN6vR6KFERoKCYUCozrYyjynhykUni9RcZotcZpVcdTAwMDR/21BD+uFvpM8lXHKTwWabXHUwMDAyOc3wmuH/fVx1MDAxZFdcdTAwMWaYP7K+UEKOIEVOXHUwMDE2XHUwMDFlnSD7XHUwMDFhOixwXHKqV1x1MDAwN1x1MDAwZsLD6GBv8b9cdTAwMTjzRoc7gW3CXrDwiNXMT05cdTAwMGYokGVDMFx1MDAxNlx1MDAwNpLpwlAlXHUwMDFmo57MOkuoieqodVpHXG5xhSqGk65cblx1MDAxNSisI8U+MWRHh1vXXGJcdTAwMWZcdTAwMDA8sUFL0Fx1MDAxZUA05FChq4FcblxiXHUwMDFj0ciKnEpylr6C5uw48CnLXHUwMDFkXHUwMDBiXG6KXHUwMDE5XzC5jIGFfpXbO3F6rOWDMDGSzHrCvHvC7aD44yP48FCMVeQkQFxyPGe4dJZaXFzmo2CQXHLFXHUwMDAwuIkhTUxXc1x1MDAwYlx1MDAwYlx1MDAwN1x1MDAxY0xcdTAwMGYkilxiKVx1MDAxZlKXsLRQXHUwMDAzlrVcdTAwMGI06tWoXSVwdDhZXHUwMDE0Kt5cdTAwMDb40XlNwI4hPDPYXHUwMDFlpWDcZfXTg7niME7IZ8BcdTAwMDJFPqSe1vlDw0K3sFx1MDAwNaBG0TFcdTAwMWJcdTAwMTHoN1x1MDAxOdbdweXKe7FsRICKZYc1YCVcdTAwMWL7qumlfb1MsjuGR/JcdTAwMTVBXHTTLjaVjlhcdTAwMDNcdTAwMDYk0HWWkVx1MDAxMbC9d/lsXHUwMDA0nlx1MDAxY65kXHUwMDE1oFx1MDAxZvGYqy5cdTAwMDaqIEd9XHUwMDAzO+fZeIFccnlqcpLOJVx1MDAwM7WsoYb7n1x1MDAwZq6xoNJ7ljFcdTAwMDGCXHUwMDAy3NdKvrDaXHUwMDE4y4BcblKc4CrzXHUwMDA0XHUwMDA1S1x1MDAwYqlcdTAwMTJcdTAwMTWMrWc+vpJkjsDg239k//3P9Zf+vnmzutlQjlx1MDAxOctcdTAwMGInKsI/0qXNhkv1m1xyX1+9/+Zb/v3lR91qb82rs53FzOiqqZ7ewk5UXGJcdTAwMGJLLr3MXGZsvJ7LJKD9XHUwMDE0o8VcZry6MeNcdTAwMWNcdTAwMWYyvFx1MDAwNVx1MDAwZbdcdTAwMGJpZlx1MDAwMl6gL5lYym9Ax8GRXHUwMDAxOlx1MDAwMlx1MDAwM2daXHUwMDFmb0a3pPhEqlg+0v6WlX63XHUwMDFkTnHb4SxrxqC40zk+rCHNR55/5t5cdTAwMDVnj1x1MDAwMvHW6Fx1MDAxMlx1MDAwMEHytCCI4uBA48ZcdTAwMTCsU4Y2cYJwcjhsV1rWJrDYNkevyPaV5Fx1MDAxOLGgN2VdmtfIR1x1MDAwNKVNi1loz6xIw8aV9EaJJl8sefPYXHUwMDA2XHUwMDA1ZOQ5eaJGmdyEyaUpXHUwMDFjuktsLmA4N29cIiVcdTAwMWNu1lx1MDAwNTpuVHXAnT2OXHUwMDFlQI5VUukgyUJcdTAwMWYra5Q4/ZvdWFx1MDAwMni0XHUwMDA2t1xiQY6mR1x1MDAxYTj5XCJcdTAwMTRcXFxyjtZUXHUwMDAw5nifzTnGNmerIz+PZSVN8e3B5ELBXHUwMDFhXHUwMDAwXTri7H19I/l1efnoc2dzdaV9aL9vvP/+faf9fdTgwukykkEm7FVMp/HITKfWTyNpXHUwMDEyXHUwMDE2oFx1MDAwNFx1MDAwNVxmJDNcdIdJW0nJ4Fx1MDAwNS2dXHUwMDA2tio7+4XyXHUwMDA1IyNcdTAwMWTjxkBdaqg9n0NO2MlUPszwt538XHUwMDE17OTdvlx1MDAxZFx1MDAxMvi5cFxmWV7PpvV8411C0Oc8XHUwMDFkJs1DV6qraUayIV+e5fee+1x1MDAxN6ykVq5cIkfvXrKyQti0SC8/polcdTAwMDZLOEB0I1x1MDAxOUaqdsEmTE4l7Ia1bPFm75DJXHUwMDA32YelrfLh8dmxNyFcdTAwMWS2XHUwMDA1L9pcdTAwMTfWx1E/zHi4XHUwMDEwtKlhXG5cdTAwMTJOXFxcZixcdTAwMWW0XHUwMDFj66WKTepA7my1semghEo08liWJVx1MDAxNN9cdTAwMWWch0R/NIyYpf+hvmlZXt8x399cdTAwMWatafv1cF6et7+6s9m5X8K0WE6YYomBulx1MDAxZcxTMC3SJ5FxXCKllIxcIjzS9Eyb9n5Yw7lA8Fx1MDAwNWPJmUiMUEONRGIzwtWhXHUwMDAx2zKy2Er58Hvyy69rWoCoWS+rXVx1MDAxYd5jXHUwMDEyPPvzmJgg4PgwSlxmsFqdVyiQU/lcdTAwMWNKTFhcdTAwMWFnXHUwMDFkiy9cdTAwMDXrbJ6aXHUwMDFj8DfPaVx1MDAwMaGYjlQqhiZcdTAwMDNcdTAwMWJ6mDfT+Eu1aYyJY9m/Z0mXglx1MDAxY+Ujpzo9lU9cdTAwMGLnsXxXY4BGjlxcLKazQI5cdTAwMWbiWVx1MDAwNMgtzEBcdTAwMTW5Wcb5bTqRg9M4jc732aTybVx1MDAxOMNmOWWs0+v5XGJcdTAwMDRcckTTRCNcdTAwMWRuLYZ8p0jgtFx1MDAwZcWGQJVWUVVyn0jblOA2XHUwMDFizrRiUWd+xMfszVx1MDAxN5xLe2ZcdTAwMDU4IVaHPVx1MDAxZslGjo5RgpHgcrjygWjLd7CRn47XPlx1MDAxY71rrK+/nH3z43Jv8WJ/+f2vYCO9gKBKoSNcdTAwMDBcdTAwMThraVx1MDAwN07NjY1kP1x1MDAxYVx1MDAxODGFVplk48RtpGFsR1x0Q4SbOcIxZyONZVx1MDAwMoK90nCzho/eNCw2V8r+jlP+ukbybt+GUnM6rUpLi6p9XHUwMDFl80OpXHUwMDAx57Pxl2fT6eqafJNwhlxuh1xis7VKuSGdm2fASp1cdTAwMGKryTGuLs2pwY/JR1xmWeSUjkjmzC/la8yhLNCzRatlLZtcdTAwMTnSTr87L+5hxJhrXGZcdTAwMDLGRbLLSIp8cFkmnlx1MDAxZEnsk5XM5VeTXHUwMDEznJSdXHUwMDBlX1x1MDAxNUZrW+g/wK5cdTAwMDcmXi2xsojVgzZcdTAwMTPcJ1x1MDAwZrBR3nuZTlx1MDAwZfkz/7Hm7CO2Wlx1MDAxOcXOqalMp3lcdTAwMGWnXHUwMDE05e7cSn1T9bbZPbs4WHt52N7vnPS2W1edg83Gr2CqXHUwMDFjW8c5XGZRXHUwMDA2OFPGXHUwMDE002ks7WBtJLtvdHicQGFkm1x1MDAwNMd5g5WIk0pcZtU1dzJ2XHUwMDEx2Fx1MDAxNFByRDTlLmYr4n/bqV/OTlx1MDAxOVaHR+bzOcFO51x1MDAwYldmJZtjXHUwMDE0vVx1MDAxMdZ1c2Rjc7a6is1cdTAwMDNqqWh4jjUgWaGlhnVVUFFQr0Cs4PXqgFx1MDAxOJv7fXBcdTAwMDJcdTAwMDKTXHUwMDFlyFNcYiayXHUwMDBlQXL8XHUwMDEz63mqbaNKpGZcdTAwMWUlXHUwMDFkWsVEUs44XHUwMDE2mb5GfinxgSMlY1pcdTAwMDLM2OG45dVcdTAwMTlRXHSBZCdcZoeSsVx0zo95es80mllmJvdcdTAwMGWddWOpWVx1MDAwNknFrHZfra/dje6Hg3VcYu7O25efdvrHl1xyv/KL5IHSoeIs93Z0XHUwMDFjXHUwMDA30bhr7a45Slx1MDAwML69M2lcYtpcdTAwMTVcdTAwMTY2sTxcdTAwMTBb1Vl9XHUwMDBmRlx1MDAwNo4pc0RcdTAwMWP7mmRMo77BXGb7IVi8XGYhXHUwMDEzz/6t3n859X7Hb3NcdTAwMTRcdTAwMDPHt5F/XHUwMDE1e2nyuidoViTyNCvrfKxjXG4kJ7im0/RcYnRl4Vx1MDAwMICEYVx1MDAxYWpNwfR8jWbNyVLjgSFQsOw6XHUwMDA0+1x1MDAxN1x1MDAwNuBBOjxcdTAwMWVANJHX0tVpXHUwMDFiwVmEXHUwMDFjXHUwMDE2XHUwMDFh0yNcdTAwMDPyTWD4XHUwMDE0UqY5XHUwMDE3Mira2Up6MKLcXHUwMDAxmipcdTAwMTaRuGKgkFE9bINcdTAwMTEssaxxulx1MDAwNlx1MDAxYobYXHUwMDA3xqNcdTAwMDLoXHUwMDBl5elcdTAwMTV1QVxyMyXYUlx1MDAwMlx1MDAxNyNIz0RU0cgz1cSzXHUwMDFhLKvy60yomTRBTvjBbqg0panYVZ674yS18J5jJrBrtrpspuh8uZBvXHUwMDA1XHUwMDE1acW6opvJkVa2TsvKY5nn0ScnSGBcdTAwMTDNxZXZ54/17bNcdTAwMGaXcaHZmovfNvY/ypX5o87Rystfwj47m5CRoMeCzc74XHUwMDFj2Ge6/+zipkg8WjUj56PzoJ10pl7mZMCsfTaSk1x1MDAxNdnkXHUwMDFko/HDXHUwMDA1jTx/gS1SVWfR/bbQ/1x1MDAxNlx1MDAwYlxypeZcdTAwMTQnc1x1MDAxYlx1MDAwM9aN+XZDXHRcdTAwMTXqvFZQkmnPR3WiQnHuqYSPwTFYrPAo6FxcyYNnvOKwP1lcdTAwMWSeqqJcdTAwMDZiQcGkslx1MDAwNULV0Lg6UYZzXHUwMDFlhDM2XHUwMDA1XHUwMDFlXHUwMDA1k1VcdTAwMTCPJ6fHXHUwMDA2QVx1MDAwZTXi3EdOKMhcdTAwMTdWcKaaXHUwMDAx8uZseLicNYaRc0BcdTAwMGVcdTAwMWU5PUal2eWVXHUwMDFmz81cdTAwMGVcdTAwMTjLaf5wXHUwMDAx2dVTTTBcdTAwMWRb49nDyIicXG6iaLCyxfmcR/ZMJFx1MDAwNbtcciStJuw+Pf2hsGaWKHbv2Vxmayy+/dOwXHUwMDAyh4HzYf7L7Oqn+na1vd5fO3179sXt9lx1MDAxN+zpkt0yrz5d/Vx1MDAxMnaV51x1MDAxMrHu2bDMybli/SNnJFx1MDAxMKiyXHUwMDAwXHUwMDFmKuCR/F6fTq3mPM7AOlx1MDAxNVdmV9mtwCpMzptxLPNcdTAwMWF2fCNPXHUwMDA1XHUwMDEzv+Oa/3/MqqKds1x1MDAxY3xcdTAwMDJnK+f2XG6Oy47sk+e4cVx1MDAxM2v03Su6glx1MDAxNpJcdTAwMTDYQK7yfqqkXHUwMDE1itBzXHUwMDFj71x1MDAwZihePSSOXHUwMDA3I3LSXHUwMDBlXFxcdTAwMWY4glHns0hcdTAwMDV6NY7Ri1x1MDAxY6yhOXFcdTAwMWHWq9BbqDnUXHJuKo/Qk1x1MDAxY1pcXEXMJVx1MDAxY15l8eywLtZ55MhcdTAwMTnO8I1sJuDonurW8clSY/xaMpxLl4xj+/PjxIY1QSXBwFx1MDAwMypcZtxJyTFg0lx1MDAxNVx1MDAwZlx1MDAxMOLUXHUwMDFjzi/lWTamRjeBTCdCsYmSNSY07YWt5TFcdFHAK3HG1Vx1MDAxOVo8aYI3xpehXHUwMDEw9qrg1lx1MDAwYlxyXHUwMDBmwnueXHUwMDE5XHUwMDE4OVx1MDAwM4Gz9Svt/YNMc6+527+2PyX2OaqRWUdccqSmebZImXleq2+ez8/WXHUwMDE35lx1MDAxYsufZ+dcdTAwMGW2rlZcdTAwMTfn3i6/nZfTfWBgXHUwMDEwbP9N56tcdTAwMTnOklx1MDAxY1BJf1x1MDAxZng4tKZHYXmQh1x1MDAxOJNvbPKf8Ya5YfdC2aGBWkiexuHS4eU8WmPYLluyLuMrJl6/htxdxvyonsvd3TtcdTAwMTncv2/57idr/VxmKP0z2lx1MDAwZd/+5u9cZlx1MDAwN98wxuLqxZuLePTu+7I8fd14fdk+fbW08Fwiy+q3PNygXHUwMDAxfHH7yT9/ltP9+fV+86KfJ3R9xc2Pl62LQ7N5XCLP31x1MDAxYyxteXmp9Go12etcdTAwMWb3L6+2vp/pneXL7ltcdTAwMWKWXHUwMDE3Zz9cdTAwMWVnelHHLndcYt/kQVx0WFxyXHUwMDA2z2aQVzUoXHUwMDE5K/K5+89Iu/ajm5F4UjB8JVEq7uv1xb38XHUwMDE5l4v7YWP38KzXnFx1MDAwMoG3PLiag1x1MDAwMVNcdTAwMDNfXHUwMDEwd6fgbvGMQFx1MDAwZd1cdTAwMWEr7rVcdTAwMGVcYm3uxliCw6NPOLqAQ1x1MDAxMCNcdTAwMTNRw+I+SOP+lG9ccs+cI1jL246eXHUwMDAwT9+HdVx1MDAwN6vqdvprrStuh1x1MDAxMrl3XzeOW20+/MFcdTAwMWSnPE2t0ek3e7zIzMvVxZm1Zlx1MDAwZoz8XCL3rZft1kEndfaa/G5OXHUwMDEw+q3dRvv2XHUwMDBix629vaxd3MWlXHUwMDFi8GR7i3UsV7fXOmh1XHUwMDFh7fVaK2uc9bufmqfXt9vvnTWzT6z59tbVSm4g0P3MeaZKsyDgdCE1u3PK5PvzXHUwMDFkzHk43z0/7C11ttTX84NcdTAwMTDX7c7Xt9Ntzlx1MDAwMdh1wrn/ii1cdTAwMWZcdTAwMWNBU7TnJtFcdTAwMTBwXHUwMDFlXGInlFx1MDAxM7awsumx55xcdTAwMGVcdTAwMDc/Y0Sb4XOZ8yqz299f9+ry+EN/qTm/K94vyq+zh/N1ze7LuNHZnnVy8d3lTm9j/nD/495mTbM7lu7c3kf9+sv6wbuF1ruThfarXdne9pMy5zLANVx1MDAwZVlcdH9cZnPuxUhpl1x1MDAxY1x1MDAxMFx1MDAxN0VmaFpW3Dfqi3v53k25OVx1MDAwNzDXXHRr2lx1MDAwNctFrFx1MDAxM0WBtz5cdIqHkflYIfBcdTAwMGax6Fx1MDAxY1x1MDAxMslpmIGuVGYwzDiLbnicgnX2OS36nbn3YVx1MDAxNn211z1v7TV7MyftM1x1MDAxONTHMubj7VbRmI9cXNSk7Pheq3Hc7eyVybVcdONqxThvUOvSoPmX+nK99PLsfThaXdp623U7y4fbO/Pft0dcdTAwMTWLTYlcdTAwMTmHXGLBgGpOPuL4XV1IQ1x1MDAwN8VcdTAwMTHaXHUwMDEwaM2h0pnBnUNCrfZj05jxQr2j9tXOTolQXHUwMDA3YFx1MDAwNZ5som+M9MBcdTAwMWJcdTAwMThItbSJtYZV6kXxTqfqa1x1MDAxM/WjWPCf9TtcdTAwMTO34Fdb/dXVlbX3bvfgdVSz31ZcdTAwMGVbL0NdS2tEZ2P1XWfrJFx1MDAxZfSVvFxcvOot7dT08yssLWtvONDz0S1tduJDUVwinVDG8Fx1MDAxNKEyidysL5Hlz3jKLa3jcHbPMzZEYId9oYcsRMuCMet5+sCDZXKUofU2YZNcdTAwMWFLlnh2bZlIlkiiJi6wWVx1MDAxOX1iS/ugXFzU/Sxtd2+m25n5q3Pe6vXPXHUwMDFhbfyt091rPpLFrTAxQ1x1MDAxNvd6cT+Xll/YpKzutYIpkfAoRk5TYOrCclZlmYB/vUN99lg9OKVcdTAwMDLuleTpNtJShkuMrlx1MDAwYkmAXFyrMFx0oztSwDlzyvogVclwXHUwMDFlnoam5TCSZmVcbnx6o8pz0o9vasfKvcvOXHUwMDA0vH9cdTAwMGU6s7Dm9aXryF6qKXbPuEqWklhpPFx1MDAwZqyCXCJ3PNMtk/F7cdA44Vx1MDAwNiScg1wirE37XHUwMDFmQ3aMOfj2XCKf11x1MDAxZXoyudz4qFx1MDAxNe9vtd+srsuNxbONXHUwMDBmy5s9eSXMx2bZikVcdTAwMTJ4NDgwYNDs0c9WXFzfLFcngVx1MDAwM+NuXHUwMDAyLVwie1xiTI3lTjhhX9Q5XHUwMDEzzdmXSFx1MDAwNl+zP4Vi8PshKNVs73R/1MRFI9WmhF1cdTAwMWaJjDRcdTAwMGYu5ElcdTAwMTRlinOrvuJcdTAwMWNcdTAwMWaqmVLFyUOMYY20S+dXx8zo/2vNXHUwMDE5eaZyXGKRnoR3ZkxXy0M0p9ZcIpE8KZK1cTJzXHUwMDA2bFx1MDAwNlx1MDAxYfHYeiWvx1x1MDAxOFx1MDAwNz3U0+KlhZfzSCnEXHUwMDA3qNE09cDjKlx1MDAxZlGNnr76tPGl2du5mt9/12j0t1x1MDAxYkvzK2sj1KhkoSZcdTAwMWLOLYva/LBcdTAwMTI1PIZcdTAwMTFSaWAmXHUwMDA19kJl6UxGiY5cdTAwMGZy5JRoejyBjYZn5khZokR5zo1QmozBoLN8dCVa1DJPqUdHylx0X7NFXHUwMDExeXStasLoZnDL46GiXHUwMDE5XHUwMDFjuZrVqo36WnV8+n1KtWpkYDdoIFLFyVx1MDAwZr7QKlx1MDAxOIXl8V02cJ68MP5x4ChYhY1cdTAwMGXeR9ZtXG6rS3K12ibpXHUwMDFhtOBxXHUwMDE2Klx1MDAwZalVJ4GjJuN+TlxcrWqXnUk9ebU6PrGaU1M8XHUwMDEyiVVZ0JmGp75mu61v9SqkwfBQLs/CcfdcYnq1tlx1MDAxZMCCOVx1MDAwMZjjdFx1MDAwMs8jcVlcXHa7Xlx1MDAxMalJbDBpyV6803p/JXQ6WlD4XHUwMDFhXHUwMDEykVx0qdVRQTzlR/Z4MarOXHUwMDExRKUu/k59nbpi+v2XnzZfrS3Lzyvr8+3L7bdnXHUwMDFmpl2nXHUwMDA2XHUwMDE304GWkYeYcD5YXqfCVU00I3zA8+Nd/Fx1MDAwNyXLnEs8S4klXHUwMDBmaOH5xGU6tahEg7awXHUwMDA0Mv76MbyQe3dMXGZv4yY+tvyAwF2/ezIqapdbdzFEV37tScXmRsmts2NGaCvrZFxmrtTF3K0vuKdvL85cdTAwMWK7buH90a5faM4vLiza96+nXXAlTFxip6d7XHUwMDFlU2ekLPSPXHUwMDA0ZVx1MDAxMlxiLM8j5kSDMWNxXHUwMDFlXHUwMDAyhqSJiYo8RdCkx//oXHUwMDEyXHUwMDE3M1x1MDAxM6G+XHUwMDEx3PR0LyNGtGE+UZpcdTAwMWJAMTNS6X6Cm6klqlx1MDAxMNy1tbczn5dcdTAwMTc3Z9ZW5pdcdTAwMTbWn1p2R17+scXXyNFcdTAwMTFcIlx1MDAxMdnBPqLGfO9cdTAwMGV2N6ztfP3+eXFztfHh+GS3705cdTAwMTbCqKK0qVx1MDAxMV+WnXnWe1x1MDAxMeHCrStcdTAwMTSpRE5K5dHonCdcdTAwMDK7+DhcdTAwMDGidPRKelx1MDAxY1x1MDAxZo9sNGVTT4alV/K8ZbaGPKf4Ko7rezrxPeu0LmZOSbD/1KJbeumnqEOJIyWXJ7IzXHUwMDEzUFxumJv1XHUwMDA197L3abf7Zv5iSa3sL8+9eTX38erN1rRcdTAwMGIufDbPk9y1XHUwMDAyTFx1MDAxNcWct/WOp9lItp2Nz3nvi7ArxP3kVvHcS8VmubKcmOJcdTAwMTEuXHUwMDFhSsWV5MXoi2mVOWP4lyhB+Xx+vt5wX9z+5qftdz/eLLUvd9ZN3Vx1MDAxMpQ37z9td1x1MDAwZnqti52Nq8WFtVx1MDAwZnvrX7ZU/ir3L0G5s1x1MDAwM3AvM6pHh1x1MDAwNDm9R45qpN6vL4zlj3jahTE6m7AvM2p1XVqVXHUwMDE3R8dTzNOh11x1MDAxMVbuscRRXG6dXGJcdTAwMWFzZ9jCL8tQsFx1MDAxZLajiieSS/F8dvRZalD+6sz/NH6nj1R7UmFXSmpPylx1MDAxNzUpK9tst1snp6U9XHUwMDFi1o3Gx057nppVPnrooL5kb1x1MDAxZL9Ul9+2zZd3a2r1eLW5PL+9PmpG+ZRUe3LqUlwiJCdnWG+HjCyEXsCJXHUwMDA09+JcdTAwMWLRj5459CCp1iZhtW1p3Ylxklx1MDAwN+K6Mlx1MDAxYmucXHUwMDEx0UT3XFw50/uZ2M2T1vzn7c67471vn8355fbJxdK2fO4+jX+B6TajayR4NK9cdTAwMWZlulx1MDAwZutcdTAwMGJ4+dZNu+n2XiecX1x1MDAwM/lcdTAwMGVcIntcdTAwMTTvzVx1MDAwMFx1MDAxNC9cdTAwMTJcdTAwMTfZbq1cdTAwMTnkXHUwMDFhM1isjpCP6styISE2MNb5wMLukurRYcutXHUwMDE0z2nxz9d4+fSGe45Dc/7qrF2e9pvHj2S2K+xU0WyPWNKjXHUwMDE3i2ZzJMPHiljBc2NKI9Kt+lx1MDAxMj1en06rRLtcdTAwMDCR5VxiUJ9cdTAwMTbo+WJI2nlcdTAwMWU1xHOrrVxyWlx1MDAxNFc2mZiWXHJcdTAwMDBcdTAwMGU831x1MDAwMF6u4YWGJZrlXHUwMDFlSrJiXFzJwNNDMieA/Yxx8Sx5XHUwMDEx5Vx1MDAxNCbo79+gVTdBX7+OyHNQqExcdTAwMTdlWImY+dJ1utsmTE2k0yM1J5G6LJnJpOfHq43MctNqV56zXHUwMDA2XHUwMDE2lIpDTrOzWW6rR4E5XHUwMDE1lqrBoTY/pO5flqBcdTAwMWYpKXzNXHUwMDBlXHUwMDBiyYDeXHUwMDEwtppI4VN2eGhRsYK5eFZf6XFNR/X16ng8Oa16NVx1MDAwNJVcYqMlZ1REq4ZGxcFcdTAwMWQylpXZ7LRcdLGwsMmoVVx1MDAwN2E3Nkiod/7pVFmuXHUwMDAw+t14p0VcdTAwMWGgt9mTOlx1MDAwNkdgOCPD9NWTPkVZfm1FxcnJWvLcXHUwMDAyab2gXHUwMDA3KrJlTdeKylx1MDAwMTx74XlcZlx1MDAwZbtccqO+m6KqpVrHXHUwMDA3UvKqVUmel1xuZ1xcRZ7bIIdXLMHF6Vx1MDAwNG5wQDTG5Vpccv5dqnW0tPA1OywoXHUwMDEz0q1j54Nk51x1MDAxZVx1MDAwZsWaiMli0KVcdTAwMTNcdTAwMDPadyilXHUwMDE4Wys3pVxuXHUwMDE2955cdTAwMDTphVMxLZcotDnBO0ygZNOKXHUwMDA1KXPnf0/ZhFx1MDAxMIhcdTAwMTZcYkzXuK+quNPe6qZZVn7n45vTpatXXHUwMDFiR6uvXvXOn2COx1i6XHUwMDBmmE42JL8luWudXHL7PlrKaDSasixcdTAwMTgy5cJ+XFxf2Mu3bsqFnelbQF5cdTAwMDMzpYXJPoRrYVx1MDAwNyp2XrF1KVRcYvtcdTAwMDNcblx1MDAxZWNMODVbKcPaZmnLwNRw7tY4XHUwMDBlXHUwMDA3i+bZ4k5cdTAwMGbqurlX3ImFS41cdTAwMDOs65FiTlx1MDAxNfaqrI6qsJxHjzdcdTAwMTk7eiBISKfwilBaQtWpL8njx1x1MDAxYk6pJMNYJyE4gF+OOsqim2u3XGKC7l2UnGyttdSP41x1MDAxN6lExfScXHUwMDE4y1x1MDAxMIjPXHUwMDA2vVx1MDAwNslcIp1giVo5oGIvdFx1MDAxODqYQlx0nn1cdTAwMTWjLj/B9pnb7O474a+mW3SH3l88O3ZUXHUwMDA2y+OstfByuL/iXHUwMDExmpNrN6ykZ187nnaj2OBcdTAwMTF5ZEmZ48ZcdTAwMGZMtNpcdTAwMDfANfXvXHIwjZZccr6GpGJAblxiQ02kXHUwMDAzZPSQXHUwMDA3ybCgXHUwMDBiWeSf0aPd+nr006vttbBuXlx1MDAxZc6vicOmOtps7bU/T7tcdTAwMWVccjomXHUwMDFhXG5IhcAjXHUwMDE0RSFcdTAwMTFcdTAwMTdE4ER3toVxpnumXFzl2UtRtdJcdTAwMDBpelx1MDAxMlH6503E/a5EXHUwMDFkUyMjMyO4h1x1MDAxMm6KnVx1MDAwNKY84XZaX3B/vDM/Xn/8fiTez8tv6uhje07MjzpcdTAwMWN5WmpktJGJs1CxUnLC0lBcdTAwMDLdOsZcdTAwMTGBjaxVzjxwsOmokWjRJS49Y86HXHUwMDE0aZWk27K9KT9dmVx1MDAxOEJ0XprBvv1cbjUyO+8uXHUwMDE3hfnxfXtTL+1cdTAwMDezf3m0vrR3N9+fXHUwMDBl1F3q1u9l6vzIY3egLINcdTAwMTLelPdM9etcdTAwMGJM+aOYcoFxPK1DKGnS0+yK/kJQXHRnXHUwMDFkXHRnJKdcdTAwMWT5R5FcdTAwMTerYExjdMxChnLP31xy2TmWuVx1MDAxYVxicaaR/Fx1MDAxOTz/u7Luw1xmXHUwMDFkXFztvzr9s06n2f6r8zCDV1x1MDAxMVx1MDAwM6jQ/SUxgNFcdTAwMGK7szn840ZdvGicnKz18cRvNdqL81bzx1xcKYTii2on1Vx1MDAwYpS1ZqpcYv/545//XHUwMDAzyUI58CJ9 + + + + + LOGIN NODE ON RESOURCE PROVIDER3. No INBOUND connectivity to the HPCVirtual KubeletInterlink API ServerProvider pluginPod on virtual nodeVirtual NodeSSH UNIX SOCKETunix socketPodContainersBatchSystemSSH agentunix socketSSHtunnelsocket diff --git a/docs/yarn.lock b/docs/yarn.lock index ead1f818..3afebb0f 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -4,7 +4,7 @@ "@algolia/autocomplete-core@1.9.3": version "1.9.3" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz#1d56482a768c33aae0868c8533049e02e8961be7" + resolved "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz" integrity sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw== dependencies: "@algolia/autocomplete-plugin-algolia-insights" "1.9.3" @@ -12,45 +12,45 @@ "@algolia/autocomplete-plugin-algolia-insights@1.9.3": version "1.9.3" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz#9b7f8641052c8ead6d66c1623d444cbe19dde587" + resolved "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz" integrity sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg== dependencies: "@algolia/autocomplete-shared" "1.9.3" "@algolia/autocomplete-preset-algolia@1.9.3": version "1.9.3" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz#64cca4a4304cfcad2cf730e83067e0c1b2f485da" + resolved "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz" integrity sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA== dependencies: "@algolia/autocomplete-shared" "1.9.3" "@algolia/autocomplete-shared@1.9.3": version "1.9.3" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz#2e22e830d36f0a9cf2c0ccd3c7f6d59435b77dfa" + resolved "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz" integrity sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ== "@algolia/cache-browser-local-storage@4.22.0": version "4.22.0" - resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.0.tgz#548e3f9524988bbe0c14b7fc7b2a66335520eeb7" + resolved "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.0.tgz" integrity sha512-uZ1uZMLDZb4qODLfTSNHxSi4fH9RdrQf7DXEzW01dS8XK7QFtFh29N5NGKa9S+Yudf1vUMIF+/RiL4i/J0pWlQ== dependencies: "@algolia/cache-common" "4.22.0" "@algolia/cache-common@4.22.0": version "4.22.0" - resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.22.0.tgz#83d6111caac74a71bebe5fc050a3b64f3e45d037" + resolved "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.22.0.tgz" integrity sha512-TPwUMlIGPN16eW67qamNQUmxNiGHg/WBqWcrOoCddhqNTqGDPVqmgfaM85LPbt24t3r1z0zEz/tdsmuq3Q6oaA== "@algolia/cache-in-memory@4.22.0": version "4.22.0" - resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.22.0.tgz#ff86b08d8c80a9402f39e5c64cef2ba8299bbe1d" + resolved "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.22.0.tgz" integrity sha512-kf4Cio9NpPjzp1+uXQgL4jsMDeck7MP89BYThSvXSjf2A6qV/0KeqQf90TL2ECS02ovLOBXkk98P7qVarM+zGA== dependencies: "@algolia/cache-common" "4.22.0" "@algolia/client-account@4.22.0": version "4.22.0" - resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.22.0.tgz#d7fa001dc062dca446f0620281fc0cec7c850487" + resolved "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.22.0.tgz" integrity sha512-Bjb5UXpWmJT+yGWiqAJL0prkENyEZTBzdC+N1vBuHjwIJcjLMjPB6j1hNBRbT12Lmwi55uzqeMIKS69w+0aPzA== dependencies: "@algolia/client-common" "4.22.0" @@ -59,7 +59,7 @@ "@algolia/client-analytics@4.22.0": version "4.22.0" - resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.22.0.tgz#ea10e73d649aa1b9a1a25a786300d241fd4ad0d1" + resolved "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.22.0.tgz" integrity sha512-os2K+kHUcwwRa4ArFl5p/3YbF9lN3TLOPkbXXXxOvDpqFh62n9IRZuzfxpHxMPKAQS3Et1s0BkKavnNP02E9Hg== dependencies: "@algolia/client-common" "4.22.0" @@ -69,7 +69,7 @@ "@algolia/client-common@4.22.0": version "4.22.0" - resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.22.0.tgz#4bf298acec78fa988a5b829748e6c488b8a6b570" + resolved "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.22.0.tgz" integrity sha512-BlbkF4qXVWuwTmYxVWvqtatCR3lzXwxx628p1wj1Q7QP2+LsTmGt1DiUYRuy9jG7iMsnlExby6kRMOOlbhv2Ag== dependencies: "@algolia/requester-common" "4.22.0" @@ -77,16 +77,16 @@ "@algolia/client-personalization@4.22.0": version "4.22.0" - resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.22.0.tgz#210c7d196b3c31da45e16db6ed98a7594fcf5e1c" + resolved "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.22.0.tgz" integrity sha512-pEOftCxeBdG5pL97WngOBi9w5Vxr5KCV2j2D+xMVZH8MuU/JX7CglDSDDb0ffQWYqcUN+40Ry+xtXEYaGXTGow== dependencies: "@algolia/client-common" "4.22.0" "@algolia/requester-common" "4.22.0" "@algolia/transporter" "4.22.0" -"@algolia/client-search@4.22.0": +"@algolia/client-search@>= 4.9.1 < 6", "@algolia/client-search@4.22.0": version "4.22.0" - resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.22.0.tgz#1113332cf973ce69067b741a17e8f798d71e07db" + resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.22.0.tgz" integrity sha512-bn4qQiIdRPBGCwsNuuqB8rdHhGKKWIij9OqidM1UkQxnSG8yzxHdb7CujM30pvp5EnV7jTqDZRbxacbjYVW20Q== dependencies: "@algolia/client-common" "4.22.0" @@ -95,43 +95,43 @@ "@algolia/events@^4.0.1": version "4.0.1" - resolved "https://registry.yarnpkg.com/@algolia/events/-/events-4.0.1.tgz#fd39e7477e7bc703d7f893b556f676c032af3950" + resolved "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz" integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== "@algolia/logger-common@4.22.0": version "4.22.0" - resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.22.0.tgz#f9498729ca5b0e9c0bd1b8dd729edd91ddd02b5c" + resolved "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.22.0.tgz" integrity sha512-HMUQTID0ucxNCXs5d1eBJ5q/HuKg8rFVE/vOiLaM4Abfeq1YnTtGV3+rFEhOPWhRQxNDd+YHa4q864IMc0zHpQ== "@algolia/logger-console@4.22.0": version "4.22.0" - resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.22.0.tgz#52e62b98fc01b40d6677b0ddf656b342e89f13c2" + resolved "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.22.0.tgz" integrity sha512-7JKb6hgcY64H7CRm3u6DRAiiEVXMvCJV5gRE672QFOUgDxo4aiDpfU61g6Uzy8NKjlEzHMmgG4e2fklELmPXhQ== dependencies: "@algolia/logger-common" "4.22.0" "@algolia/requester-browser-xhr@4.22.0": version "4.22.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.0.tgz#ca16e4c6860458477a00b440a407c81591f14b8a" + resolved "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.0.tgz" integrity sha512-BHfv1h7P9/SyvcDJDaRuIwDu2yrDLlXlYmjvaLZTtPw6Ok/ZVhBR55JqW832XN/Fsl6k3LjdkYHHR7xnsa5Wvg== dependencies: "@algolia/requester-common" "4.22.0" "@algolia/requester-common@4.22.0": version "4.22.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.22.0.tgz#d7a8283f5b77550eeab353c571a6566adf552fa7" + resolved "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.22.0.tgz" integrity sha512-Y9cEH/cKjIIZgzvI1aI0ARdtR/xRrOR13g5psCxkdhpgRN0Vcorx+zePhmAa4jdQNqexpxtkUdcKYugBzMZJgQ== "@algolia/requester-node-http@4.22.0": version "4.22.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.22.0.tgz#41d5e7d5dc7adb930e7fe8dcd9d39bfc378cc5f5" + resolved "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.22.0.tgz" integrity sha512-8xHoGpxVhz3u2MYIieHIB6MsnX+vfd5PS4REgglejJ6lPigftRhTdBCToe6zbwq4p0anZXjjPDvNWMlgK2+xYA== dependencies: "@algolia/requester-common" "4.22.0" "@algolia/transporter@4.22.0": version "4.22.0" - resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.22.0.tgz#733385f6457408228d2a4d7a4fe4e2b1599a5d33" + resolved "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.22.0.tgz" integrity sha512-ieO1k8x2o77GNvOoC+vAkFKppydQSVfbjM3YrSjLmgywiBejPTvU1R1nEvG59JIIUvtSLrZsLGPkd6vL14zopA== dependencies: "@algolia/cache-common" "4.22.0" @@ -140,7 +140,7 @@ "@ampproject/remapping@^2.2.0": version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== dependencies: "@jridgewell/gen-mapping" "^0.3.0" @@ -148,7 +148,7 @@ "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.8.3": version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz" integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== dependencies: "@babel/highlight" "^7.23.4" @@ -156,23 +156,23 @@ "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.3", "@babel/compat-data@^7.23.5": version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz" integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== -"@babel/core@^7.19.6", "@babel/core@^7.23.3": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.7.tgz#4d8016e06a14b5f92530a13ed0561730b5c6483f" - integrity sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw== +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.19.6", "@babel/core@^7.23.3", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0": + version "7.23.6" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz" + integrity sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.23.5" "@babel/generator" "^7.23.6" "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.7" + "@babel/helpers" "^7.23.6" "@babel/parser" "^7.23.6" "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.7" + "@babel/traverse" "^7.23.6" "@babel/types" "^7.23.6" convert-source-map "^2.0.0" debug "^4.1.0" @@ -182,7 +182,7 @@ "@babel/generator@^7.23.3", "@babel/generator@^7.23.6": version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz" integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== dependencies: "@babel/types" "^7.23.6" @@ -192,21 +192,21 @@ "@babel/helper-annotate-as-pure@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz" integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== dependencies: "@babel/types" "^7.22.5" "@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz" integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== dependencies: "@babel/types" "^7.22.15" "@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6": version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz" integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== dependencies: "@babel/compat-data" "^7.23.5" @@ -216,9 +216,9 @@ semver "^6.3.1" "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.23.6": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz#b2e6826e0e20d337143655198b79d58fdc9bd43d" - integrity sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g== + version "7.23.6" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.6.tgz" + integrity sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.20" @@ -232,7 +232,7 @@ "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz" integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -241,7 +241,7 @@ "@babel/helper-define-polyfill-provider@^0.4.4": version "0.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz#64df615451cb30e94b59a9696022cffac9a10088" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz" integrity sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA== dependencies: "@babel/helper-compilation-targets" "^7.22.6" @@ -252,12 +252,12 @@ "@babel/helper-environment-visitor@^7.22.20": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== "@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz" integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: "@babel/template" "^7.22.15" @@ -265,28 +265,28 @@ "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: "@babel/types" "^7.22.5" "@babel/helper-member-expression-to-functions@^7.22.15", "@babel/helper-member-expression-to-functions@^7.23.0": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz" integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== dependencies: "@babel/types" "^7.23.0" "@babel/helper-module-imports@^7.22.15": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz" integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== dependencies: "@babel/types" "^7.22.15" "@babel/helper-module-transforms@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz" integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== dependencies: "@babel/helper-environment-visitor" "^7.22.20" @@ -297,19 +297,19 @@ "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz" integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== dependencies: "@babel/types" "^7.22.5" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== "@babel/helper-remap-async-to-generator@^7.22.20": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz" integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -318,7 +318,7 @@ "@babel/helper-replace-supers@^7.22.20": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz" integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== dependencies: "@babel/helper-environment-visitor" "^7.22.20" @@ -327,61 +327,61 @@ "@babel/helper-simple-access@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz" integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== dependencies: "@babel/types" "^7.22.5" "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz" integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== dependencies: "@babel/types" "^7.22.5" "@babel/helper-split-export-declaration@^7.22.6": version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz" integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== dependencies: "@babel/types" "^7.22.5" "@babel/helper-string-parser@^7.23.4": version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz" integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== "@babel/helper-validator-identifier@^7.22.20": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== "@babel/helper-validator-option@^7.22.15", "@babel/helper-validator-option@^7.23.5": version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz" integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== "@babel/helper-wrap-function@^7.22.20": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz" integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== dependencies: "@babel/helper-function-name" "^7.22.5" "@babel/template" "^7.22.15" "@babel/types" "^7.22.19" -"@babel/helpers@^7.23.7": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.7.tgz#eb543c36f81da2873e47b76ee032343ac83bba60" - integrity sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ== +"@babel/helpers@^7.23.6": + version "7.23.6" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz" + integrity sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA== dependencies: "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.7" + "@babel/traverse" "^7.23.6" "@babel/types" "^7.23.6" "@babel/highlight@^7.23.4": version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz" integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== dependencies: "@babel/helper-validator-identifier" "^7.22.20" @@ -390,174 +390,174 @@ "@babel/parser@^7.22.15", "@babel/parser@^7.22.7", "@babel/parser@^7.23.6": version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz" integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz#5cd1c87ba9380d0afb78469292c954fee5d2411a" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz" integrity sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz#f6652bb16b94f8f9c20c50941e16e9756898dc5d" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz" integrity sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/plugin-transform-optional-chaining" "^7.23.3" -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.23.7": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz#516462a95d10a9618f197d39ad291a9b47ae1d7b" - integrity sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz" + integrity sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w== dependencies: "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": version "7.21.0-placeholder-for-preset-env.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz" integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-class-static-block@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-import-assertions@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz#9c05a7f592982aff1a2768260ad84bcd3f0c77fc" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz" integrity sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-import-attributes@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz#992aee922cf04512461d7dae3ff6951b90a2dc06" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz" integrity sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz" integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.10.4": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-private-property-in-object@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-top-level-await@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz#24f460c85dbbc983cd2b9c4994178bcc01df958f" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz" integrity sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz" integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.18.6" @@ -565,15 +565,15 @@ "@babel/plugin-transform-arrow-functions@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz#94c6dcfd731af90f27a79509f9ab7fb2120fc38b" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz" integrity sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-async-generator-functions@^7.23.7": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz#3aa0b4f2fa3788b5226ef9346cf6d16ec61f99cd" - integrity sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA== +"@babel/plugin-transform-async-generator-functions@^7.23.4": + version "7.23.4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz" + integrity sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw== dependencies: "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-plugin-utils" "^7.22.5" @@ -582,7 +582,7 @@ "@babel/plugin-transform-async-to-generator@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz#d1f513c7a8a506d43f47df2bf25f9254b0b051fa" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz" integrity sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw== dependencies: "@babel/helper-module-imports" "^7.22.15" @@ -591,21 +591,21 @@ "@babel/plugin-transform-block-scoped-functions@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz#fe1177d715fb569663095e04f3598525d98e8c77" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz" integrity sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-block-scoping@^7.23.4": version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz#b2d38589531c6c80fbe25e6b58e763622d2d3cf5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz" integrity sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-class-properties@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz#35c377db11ca92a785a718b6aa4e3ed1eb65dc48" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz" integrity sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg== dependencies: "@babel/helper-create-class-features-plugin" "^7.22.15" @@ -613,7 +613,7 @@ "@babel/plugin-transform-class-static-block@^7.23.4": version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz#2a202c8787a8964dd11dfcedf994d36bfc844ab5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz" integrity sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ== dependencies: "@babel/helper-create-class-features-plugin" "^7.22.15" @@ -622,7 +622,7 @@ "@babel/plugin-transform-classes@^7.23.5": version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.5.tgz#e7a75f815e0c534cc4c9a39c56636c84fc0d64f2" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.5.tgz" integrity sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -637,7 +637,7 @@ "@babel/plugin-transform-computed-properties@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz#652e69561fcc9d2b50ba4f7ac7f60dcf65e86474" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz" integrity sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -645,14 +645,14 @@ "@babel/plugin-transform-destructuring@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz#8c9ee68228b12ae3dff986e56ed1ba4f3c446311" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz" integrity sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-dotall-regex@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz#3f7af6054882ede89c378d0cf889b854a993da50" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz" integrity sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.15" @@ -660,14 +660,14 @@ "@babel/plugin-transform-duplicate-keys@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz#664706ca0a5dfe8d066537f99032fc1dc8b720ce" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz" integrity sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-dynamic-import@^7.23.4": version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz#c7629e7254011ac3630d47d7f34ddd40ca535143" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz" integrity sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -675,7 +675,7 @@ "@babel/plugin-transform-exponentiation-operator@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz#ea0d978f6b9232ba4722f3dbecdd18f450babd18" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz" integrity sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ== dependencies: "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" @@ -683,7 +683,7 @@ "@babel/plugin-transform-export-namespace-from@^7.23.4": version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz#084c7b25e9a5c8271e987a08cf85807b80283191" + resolved "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz" integrity sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -691,7 +691,7 @@ "@babel/plugin-transform-for-of@^7.23.6": version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz#81c37e24171b37b370ba6aaffa7ac86bcb46f94e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz" integrity sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -699,7 +699,7 @@ "@babel/plugin-transform-function-name@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz#8f424fcd862bf84cb9a1a6b42bc2f47ed630f8dc" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz" integrity sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw== dependencies: "@babel/helper-compilation-targets" "^7.22.15" @@ -708,7 +708,7 @@ "@babel/plugin-transform-json-strings@^7.23.4": version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz#a871d9b6bd171976efad2e43e694c961ffa3714d" + resolved "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz" integrity sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -716,14 +716,14 @@ "@babel/plugin-transform-literals@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz#8214665f00506ead73de157eba233e7381f3beb4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz" integrity sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-logical-assignment-operators@^7.23.4": version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz#e599f82c51d55fac725f62ce55d3a0886279ecb5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz" integrity sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -731,14 +731,14 @@ "@babel/plugin-transform-member-expression-literals@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz#e37b3f0502289f477ac0e776b05a833d853cabcc" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz" integrity sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-modules-amd@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz#e19b55436a1416829df0a1afc495deedfae17f7d" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz" integrity sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw== dependencies: "@babel/helper-module-transforms" "^7.23.3" @@ -746,7 +746,7 @@ "@babel/plugin-transform-modules-commonjs@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz#661ae831b9577e52be57dd8356b734f9700b53b4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz" integrity sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA== dependencies: "@babel/helper-module-transforms" "^7.23.3" @@ -755,7 +755,7 @@ "@babel/plugin-transform-modules-systemjs@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz#fa7e62248931cb15b9404f8052581c302dd9de81" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz" integrity sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ== dependencies: "@babel/helper-hoist-variables" "^7.22.5" @@ -765,7 +765,7 @@ "@babel/plugin-transform-modules-umd@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz#5d4395fccd071dfefe6585a4411aa7d6b7d769e9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz" integrity sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg== dependencies: "@babel/helper-module-transforms" "^7.23.3" @@ -773,7 +773,7 @@ "@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz" integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.5" @@ -781,14 +781,14 @@ "@babel/plugin-transform-new-target@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz#5491bb78ed6ac87e990957cea367eab781c4d980" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz" integrity sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-nullish-coalescing-operator@^7.23.4": version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz#45556aad123fc6e52189ea749e33ce090637346e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz" integrity sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -796,7 +796,7 @@ "@babel/plugin-transform-numeric-separator@^7.23.4": version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz#03d08e3691e405804ecdd19dd278a40cca531f29" + resolved "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz" integrity sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -804,7 +804,7 @@ "@babel/plugin-transform-object-rest-spread@^7.23.4": version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz#2b9c2d26bf62710460bdc0d1730d4f1048361b83" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz" integrity sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g== dependencies: "@babel/compat-data" "^7.23.3" @@ -815,7 +815,7 @@ "@babel/plugin-transform-object-super@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz#81fdb636dcb306dd2e4e8fd80db5b2362ed2ebcd" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz" integrity sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -823,7 +823,7 @@ "@babel/plugin-transform-optional-catch-binding@^7.23.4": version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz#318066de6dacce7d92fa244ae475aa8d91778017" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz" integrity sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -831,7 +831,7 @@ "@babel/plugin-transform-optional-chaining@^7.23.3", "@babel/plugin-transform-optional-chaining@^7.23.4": version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz#6acf61203bdfc4de9d4e52e64490aeb3e52bd017" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz" integrity sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -840,14 +840,14 @@ "@babel/plugin-transform-parameters@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz#83ef5d1baf4b1072fa6e54b2b0999a7b2527e2af" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz" integrity sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-private-methods@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz#b2d7a3c97e278bfe59137a978d53b2c2e038c0e4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz" integrity sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g== dependencies: "@babel/helper-create-class-features-plugin" "^7.22.15" @@ -855,7 +855,7 @@ "@babel/plugin-transform-private-property-in-object@^7.23.4": version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz#3ec711d05d6608fd173d9b8de39872d8dbf68bf5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz" integrity sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -865,35 +865,35 @@ "@babel/plugin-transform-property-literals@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz#54518f14ac4755d22b92162e4a852d308a560875" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz" integrity sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-react-constant-elements@^7.18.12": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.23.3.tgz#5efc001d07ef0f7da0d73c3a86c132f73d28e43c" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.23.3.tgz" integrity sha512-zP0QKq/p6O42OL94udMgSfKXyse4RyJ0JqbQ34zDAONWjyrEsghYEyTSK5FIpmXmCpB55SHokL1cRRKHv8L2Qw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-react-display-name@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz#70529f034dd1e561045ad3c8152a267f0d7b6200" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz" integrity sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-react-jsx-development@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz" integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== dependencies: "@babel/plugin-transform-react-jsx" "^7.22.5" "@babel/plugin-transform-react-jsx@^7.22.15", "@babel/plugin-transform-react-jsx@^7.22.5": version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz" integrity sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -904,7 +904,7 @@ "@babel/plugin-transform-react-pure-annotations@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz#fabedbdb8ee40edf5da96f3ecfc6958e3783b93c" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz" integrity sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -912,7 +912,7 @@ "@babel/plugin-transform-regenerator@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz#141afd4a2057298602069fce7f2dc5173e6c561c" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz" integrity sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -920,33 +920,33 @@ "@babel/plugin-transform-reserved-words@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz#4130dcee12bd3dd5705c587947eb715da12efac8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz" integrity sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-runtime@^7.22.9": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.7.tgz#52bbd20054855beb9deae3bee9ceb05289c343e6" - integrity sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw== + version "7.23.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.6.tgz" + integrity sha512-kF1Zg62aPseQ11orDhFRw+aPG/eynNQtI+TyY+m33qJa2cJ5EEvza2P2BNTIA9E5MyqFABHEyY6CPHwgdy9aNg== dependencies: "@babel/helper-module-imports" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" - babel-plugin-polyfill-corejs2 "^0.4.7" - babel-plugin-polyfill-corejs3 "^0.8.7" - babel-plugin-polyfill-regenerator "^0.5.4" + babel-plugin-polyfill-corejs2 "^0.4.6" + babel-plugin-polyfill-corejs3 "^0.8.5" + babel-plugin-polyfill-regenerator "^0.5.3" semver "^6.3.1" "@babel/plugin-transform-shorthand-properties@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz#97d82a39b0e0c24f8a981568a8ed851745f59210" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz" integrity sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-spread@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz#41d17aacb12bde55168403c6f2d6bdca563d362c" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz" integrity sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -954,28 +954,28 @@ "@babel/plugin-transform-sticky-regex@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz#dec45588ab4a723cb579c609b294a3d1bd22ff04" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz" integrity sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-template-literals@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz#5f0f028eb14e50b5d0f76be57f90045757539d07" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz" integrity sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-typeof-symbol@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz#9dfab97acc87495c0c449014eb9c547d8966bca4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz" integrity sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-typescript@^7.23.3": version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz#aa36a94e5da8d94339ae3a4e22d40ed287feb34c" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz" integrity sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -985,14 +985,14 @@ "@babel/plugin-transform-unicode-escapes@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz#1f66d16cab01fab98d784867d24f70c1ca65b925" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz" integrity sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-unicode-property-regex@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz#19e234129e5ffa7205010feec0d94c251083d7ad" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz" integrity sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.15" @@ -1000,7 +1000,7 @@ "@babel/plugin-transform-unicode-regex@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz#26897708d8f42654ca4ce1b73e96140fbad879dc" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz" integrity sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.15" @@ -1008,16 +1008,16 @@ "@babel/plugin-transform-unicode-sets-regex@^7.23.3": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz#4fb6f0a719c2c5859d11f6b55a050cc987f3799e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz" integrity sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" "@babel/preset-env@^7.19.4", "@babel/preset-env@^7.22.9": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.7.tgz#e5d69b9f14db8a13bae4d8e5ce7f360973626241" - integrity sha512-SY27X/GtTz/L4UryMNJ6p4fH4nsgWbz84y9FE0bQeWJP6O5BhgVCt53CotQKHCOeXJel8VyhlhujhlltKms/CA== + version "7.23.6" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.6.tgz" + integrity sha512-2XPn/BqKkZCpzYhUUNZ1ssXw7DcXfKQEjv/uXZUXgaebCMYmkEsfZ2yY+vv+xtXv50WmL5SGhyB6/xsWxIvvOQ== dependencies: "@babel/compat-data" "^7.23.5" "@babel/helper-compilation-targets" "^7.23.6" @@ -1025,7 +1025,7 @@ "@babel/helper-validator-option" "^7.23.5" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.23.3" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.23.3" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.23.7" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.23.3" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" @@ -1046,7 +1046,7 @@ "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" "@babel/plugin-transform-arrow-functions" "^7.23.3" - "@babel/plugin-transform-async-generator-functions" "^7.23.7" + "@babel/plugin-transform-async-generator-functions" "^7.23.4" "@babel/plugin-transform-async-to-generator" "^7.23.3" "@babel/plugin-transform-block-scoped-functions" "^7.23.3" "@babel/plugin-transform-block-scoping" "^7.23.4" @@ -1094,15 +1094,15 @@ "@babel/plugin-transform-unicode-regex" "^7.23.3" "@babel/plugin-transform-unicode-sets-regex" "^7.23.3" "@babel/preset-modules" "0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2 "^0.4.7" - babel-plugin-polyfill-corejs3 "^0.8.7" - babel-plugin-polyfill-regenerator "^0.5.4" + babel-plugin-polyfill-corejs2 "^0.4.6" + babel-plugin-polyfill-corejs3 "^0.8.5" + babel-plugin-polyfill-regenerator "^0.5.3" core-js-compat "^3.31.0" semver "^6.3.1" "@babel/preset-modules@0.1.6-no-external-plugins": version "0.1.6-no-external-plugins" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz" integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -1111,7 +1111,7 @@ "@babel/preset-react@^7.18.6", "@babel/preset-react@^7.22.5": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.23.3.tgz#f73ca07e7590f977db07eb54dbe46538cc015709" + resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz" integrity sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -1123,7 +1123,7 @@ "@babel/preset-typescript@^7.18.6", "@babel/preset-typescript@^7.22.5": version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz#14534b34ed5b6d435aa05f1ae1c5e7adcc01d913" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz" integrity sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -1134,44 +1134,37 @@ "@babel/regjsgen@^0.8.0": version "0.8.0" - resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime-corejs3@^7.22.6": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.23.7.tgz#2c3d323d21569f2950c9126780bfa400632360bd" - integrity sha512-ER55qzLREVA5YxeyQ3Qu48tgsF2ZrFjFjUS6V6wF0cikSw+goBJgB9PBRM1T6+Ah4iiM+sxmfS/Sy/jdzFfhiQ== + version "7.23.6" + resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.23.6.tgz" + integrity sha512-Djs/ZTAnpyj0nyg7p1J6oiE/tZ9G2stqAFlLGZynrW+F3k2w2jGK2mLOBxzYIOcZYA89+c3d3wXKpYLcpwcU6w== dependencies: core-js-pure "^3.30.2" regenerator-runtime "^0.14.0" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.22.6", "@babel/runtime@^7.8.4": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.7.tgz#dd7c88deeb218a0f8bd34d5db1aa242e0f203193" - integrity sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/runtime@^7.17.8": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.0.tgz#584c450063ffda59697021430cb47101b085951e" - integrity sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw== +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.8", "@babel/runtime@^7.22.6", "@babel/runtime@^7.8.4": + version "7.23.6" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz" + integrity sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ== dependencies: regenerator-runtime "^0.14.0" "@babel/template@^7.22.15": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz" integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== dependencies: "@babel/code-frame" "^7.22.13" "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/traverse@^7.22.8", "@babel/traverse@^7.23.7": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.7.tgz#9a7bf285c928cb99b5ead19c3b1ce5b310c9c305" - integrity sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg== +"@babel/traverse@^7.22.8", "@babel/traverse@^7.23.6": + version "7.23.6" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz" + integrity sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ== dependencies: "@babel/code-frame" "^7.23.5" "@babel/generator" "^7.23.6" @@ -1186,31 +1179,42 @@ "@babel/types@^7.20.0", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.23.6", "@babel/types@^7.4.4": version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz" integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg== dependencies: "@babel/helper-string-parser" "^7.23.4" "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" +"@cfaester/enzyme-adapter-react-18@^0.8.0": + version "0.8.0" + resolved "https://registry.npmjs.org/@cfaester/enzyme-adapter-react-18/-/enzyme-adapter-react-18-0.8.0.tgz" + integrity sha512-3Z3ThTUouHwz8oIyhTYQljEMNRFtlVyc3VOOHCbxs47U6cnXs8K9ygi/c1tv49s7MBlTXeIcuN+Ttd9aPtILFQ== + dependencies: + enzyme-shallow-equal "^1.0.0" + function.prototype.name "^1.1.6" + has "^1.0.4" + react-is "^18.2.0" + react-shallow-renderer "^16.15.0" + "@colors/colors@1.5.0": version "1.5.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== "@discoveryjs/json-ext@0.5.7": version "0.5.7" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== "@docsearch/css@3.5.2": version "3.5.2" - resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.5.2.tgz#610f47b48814ca94041df969d9fcc47b91fc5aac" + resolved "https://registry.npmjs.org/@docsearch/css/-/css-3.5.2.tgz" integrity sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA== "@docsearch/react@^3.5.2": version "3.5.2" - resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.5.2.tgz#2e6bbee00eb67333b64906352734da6aef1232b9" + resolved "https://registry.npmjs.org/@docsearch/react/-/react-3.5.2.tgz" integrity sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng== dependencies: "@algolia/autocomplete-core" "1.9.3" @@ -1220,7 +1224,7 @@ "@docusaurus/core@3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-3.0.1.tgz#ad9a66b20802ea81b25e65db75d4ca952eda7e01" + resolved "https://registry.npmjs.org/@docusaurus/core/-/core-3.0.1.tgz" integrity sha512-CXrLpOnW+dJdSv8M5FAJ3JBwXtL6mhUWxFA8aS0ozK6jBG/wgxERk5uvH28fCeFxOGbAT9v1e9dOMo1X2IEVhQ== dependencies: "@babel/core" "^7.23.3" @@ -1295,7 +1299,7 @@ "@docusaurus/cssnano-preset@3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-3.0.1.tgz#22fbf2e97389e338747864baf011743846e8fd26" + resolved "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.0.1.tgz" integrity sha512-wjuXzkHMW+ig4BD6Ya1Yevx9UJadO4smNZCEljqBoQfIQrQskTswBs7lZ8InHP7mCt273a/y/rm36EZhqJhknQ== dependencies: cssnano-preset-advanced "^5.3.10" @@ -1303,9 +1307,17 @@ postcss-sort-media-queries "^4.4.1" tslib "^2.6.0" +"@docusaurus/eslint-plugin@^3.5.2": + version "3.5.2" + resolved "https://registry.npmjs.org/@docusaurus/eslint-plugin/-/eslint-plugin-3.5.2.tgz" + integrity sha512-9zBtXQwRgj2unY+peS5HIISvG7kDQDoWl8dZ+sN41B2qIctNUWpBFkFAPHZSPy2cvEDQwWshNpPYDjp+sv+CVA== + dependencies: + "@typescript-eslint/utils" "^5.62.0" + tslib "^2.6.0" + "@docusaurus/logger@3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-3.0.1.tgz#06f512eef6c6ae4e2da63064257e01b1cdc41a82" + resolved "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.0.1.tgz" integrity sha512-I5L6Nk8OJzkVA91O2uftmo71LBSxe1vmOn9AMR6JRCzYeEBrqneWMH02AqMvjJ2NpMiviO+t0CyPjyYV7nxCWQ== dependencies: chalk "^4.1.2" @@ -1313,7 +1325,7 @@ "@docusaurus/mdx-loader@3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-3.0.1.tgz#89f221e5bcc570983fd61d7ab56d6fbe36810b59" + resolved "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.0.1.tgz" integrity sha512-ldnTmvnvlrONUq45oKESrpy+lXtbnTcTsFkOTIDswe5xx5iWJjt6eSa0f99ZaWlnm24mlojcIGoUWNCS53qVlQ== dependencies: "@babel/parser" "^7.22.7" @@ -1345,7 +1357,7 @@ "@docusaurus/module-type-aliases@3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-3.0.1.tgz#d45990fe377d7ffaa68841cf89401188a5d65293" + resolved "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.0.1.tgz" integrity sha512-DEHpeqUDsLynl3AhQQiO7AbC7/z/lBra34jTcdYuvp9eGm01pfH1wTVq8YqWZq6Jyx0BgcVl/VJqtE9StRd9Ag== dependencies: "@docusaurus/react-loadable" "5.5.2" @@ -1359,7 +1371,7 @@ "@docusaurus/plugin-content-blog@3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.0.1.tgz#dee6147187c2d8b634252444d60312d12c9571a6" + resolved "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.0.1.tgz" integrity sha512-cLOvtvAyaMQFLI8vm4j26svg3ktxMPSXpuUJ7EERKoGbfpJSsgtowNHcRsaBVmfuCsRSk1HZ/yHBsUkTmHFEsg== dependencies: "@docusaurus/core" "3.0.1" @@ -1382,7 +1394,7 @@ "@docusaurus/plugin-content-docs@3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.0.1.tgz#d9b1884562186573d5c4521ac3546b68512c1126" + resolved "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.0.1.tgz" integrity sha512-dRfAOA5Ivo+sdzzJGXEu33yAtvGg8dlZkvt/NEJ7nwi1F2j4LEdsxtfX2GKeETB2fP6XoGNSQnFXqa2NYGrHFg== dependencies: "@docusaurus/core" "3.0.1" @@ -1403,7 +1415,7 @@ "@docusaurus/plugin-content-pages@3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.0.1.tgz#27e6424c77173f867760efe53f848bbab8849ea6" + resolved "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.0.1.tgz" integrity sha512-oP7PoYizKAXyEttcvVzfX3OoBIXEmXTMzCdfmC4oSwjG4SPcJsRge3mmI6O8jcZBgUPjIzXD21bVGWEE1iu8gg== dependencies: "@docusaurus/core" "3.0.1" @@ -1417,7 +1429,7 @@ "@docusaurus/plugin-debug@3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-3.0.1.tgz#886b5dd03c066e970484ca251c1b79613df90700" + resolved "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.0.1.tgz" integrity sha512-09dxZMdATky4qdsZGzhzlUvvC+ilQ2hKbYF+wez+cM2mGo4qHbv8+qKXqxq0CQZyimwlAOWQLoSozIXU0g0i7g== dependencies: "@docusaurus/core" "3.0.1" @@ -1429,7 +1441,7 @@ "@docusaurus/plugin-google-analytics@3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.0.1.tgz#ec69902131ea3aad8b062eeb1d17bf0962986f80" + resolved "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.0.1.tgz" integrity sha512-jwseSz1E+g9rXQwDdr0ZdYNjn8leZBnKPjjQhMBEiwDoenL3JYFcNW0+p0sWoVF/f2z5t7HkKA+cYObrUh18gg== dependencies: "@docusaurus/core" "3.0.1" @@ -1439,7 +1451,7 @@ "@docusaurus/plugin-google-gtag@3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.0.1.tgz#bb5526377d3a324ebec235127846fda386562b05" + resolved "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.0.1.tgz" integrity sha512-UFTDvXniAWrajsulKUJ1DB6qplui1BlKLQZjX4F7qS/qfJ+qkKqSkhJ/F4VuGQ2JYeZstYb+KaUzUzvaPK1aRQ== dependencies: "@docusaurus/core" "3.0.1" @@ -1450,7 +1462,7 @@ "@docusaurus/plugin-google-tag-manager@3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.0.1.tgz#4e36d13279cf90c2614b62438aa1109dd4696ec8" + resolved "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.0.1.tgz" integrity sha512-IPFvuz83aFuheZcWpTlAdiiX1RqWIHM+OH8wS66JgwAKOiQMR3+nLywGjkLV4bp52x7nCnwhNk1rE85Cpy/CIw== dependencies: "@docusaurus/core" "3.0.1" @@ -1460,7 +1472,7 @@ "@docusaurus/plugin-sitemap@3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.0.1.tgz#ab55857e90d4500f892e110b30e4bc3289202bd4" + resolved "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.0.1.tgz" integrity sha512-xARiWnjtVvoEniZudlCq5T9ifnhCu/GAZ5nA7XgyLfPcNpHQa241HZdsTlLtVcecEVVdllevBKOp7qknBBaMGw== dependencies: "@docusaurus/core" "3.0.1" @@ -1475,7 +1487,7 @@ "@docusaurus/preset-classic@3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-3.0.1.tgz#d363ac837bba967095ed2a896d13c54f3717d6b5" + resolved "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.0.1.tgz" integrity sha512-il9m9xZKKjoXn6h0cRcdnt6wce0Pv1y5t4xk2Wx7zBGhKG1idu4IFHtikHlD0QPuZ9fizpXspXcTzjL5FXc1Gw== dependencies: "@docusaurus/core" "3.0.1" @@ -1492,9 +1504,9 @@ "@docusaurus/theme-search-algolia" "3.0.1" "@docusaurus/types" "3.0.1" -"@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": +"@docusaurus/react-loadable@5.5.2": version "5.5.2" - resolved "https://registry.yarnpkg.com/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz#81aae0db81ecafbdaee3651f12804580868fa6ce" + resolved "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz" integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== dependencies: "@types/react" "*" @@ -1502,7 +1514,7 @@ "@docusaurus/theme-classic@3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-3.0.1.tgz#3ba4dc77553d2c1608e433c0d01bed7c6db14eb9" + resolved "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.0.1.tgz" integrity sha512-XD1FRXaJiDlmYaiHHdm27PNhhPboUah9rqIH0lMpBt5kYtsGjJzhqa27KuZvHLzOP2OEpqd2+GZ5b6YPq7Q05Q== dependencies: "@docusaurus/core" "3.0.1" @@ -1531,9 +1543,9 @@ tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-common@3.0.1": +"@docusaurus/theme-common@^3.0.0", "@docusaurus/theme-common@3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-3.0.1.tgz#29a5bcb286296a52bc10afa5308e360cbed6b49c" + resolved "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.0.1.tgz" integrity sha512-cr9TOWXuIOL0PUfuXv6L5lPlTgaphKP+22NdVBOYah5jSq5XAAulJTjfe+IfLsEG4L7lJttLbhW7LXDFSAI7Ag== dependencies: "@docusaurus/mdx-loader" "3.0.1" @@ -1554,7 +1566,7 @@ "@docusaurus/theme-search-algolia@3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.0.1.tgz#d8fb6bddca8d8355e4706c4c7d30d3b800217cf4" + resolved "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.0.1.tgz" integrity sha512-DDiPc0/xmKSEdwFkXNf1/vH1SzJPzuJBar8kMcBbDAZk/SAmo/4lf6GU2drou4Ae60lN2waix+jYWTWcJRahSA== dependencies: "@docsearch/react" "^3.5.2" @@ -1576,7 +1588,7 @@ "@docusaurus/theme-translations@3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-3.0.1.tgz#837a01a166ccd698a3eceaed0c2f798555bc024b" + resolved "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.0.1.tgz" integrity sha512-6UrbpzCTN6NIJnAtZ6Ne9492vmPVX+7Fsz4kmp+yor3KQwA1+MCzQP7ItDNkP38UmVLnvB/cYk/IvehCUqS3dg== dependencies: fs-extra "^11.1.1" @@ -1584,12 +1596,12 @@ "@docusaurus/tsconfig@3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/tsconfig/-/tsconfig-3.0.1.tgz#170f230c34ff12e55995bd7e9f1f21db33035d8f" + resolved "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.0.1.tgz" integrity sha512-hT2HCdNE3pWTzXV/7cSsowfmaOxXVOTFOXmkqaYjBWjaxjJ3FO0nHbdJ8rF6Da7PvWmIPbUekdP5gep1XCJ7Vg== -"@docusaurus/types@3.0.1": +"@docusaurus/types@*", "@docusaurus/types@3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-3.0.1.tgz#4fe306aa10ef7c97dbc07588864f6676a40f3b6f" + resolved "https://registry.npmjs.org/@docusaurus/types/-/types-3.0.1.tgz" integrity sha512-plyX2iU1tcUsF46uQ01pAd4JhexR7n0iiQ5MSnBFX6M6NSJgDYdru/i1/YNPKOnQHBoXGLHv0dNT6OAlDWNjrg== dependencies: "@types/history" "^4.7.11" @@ -1603,14 +1615,14 @@ "@docusaurus/utils-common@3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-3.0.1.tgz#111f450089d5f0a290c0c25f8a574a270d08436f" + resolved "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.0.1.tgz" integrity sha512-W0AxD6w6T8g6bNro8nBRWf7PeZ/nn7geEWM335qHU2DDDjHuV4UZjgUGP1AQsdcSikPrlIqTJJbKzer1lRSlIg== dependencies: tslib "^2.6.0" "@docusaurus/utils-validation@3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-3.0.1.tgz#3c5f12941b328a19fc9acb34d070219f3e865ec6" + resolved "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.0.1.tgz" integrity sha512-ujTnqSfyGQ7/4iZdB4RRuHKY/Nwm58IIb+41s5tCXOv/MBU2wGAjOHq3U+AEyJ8aKQcHbxvTKJaRchNHYUVUQg== dependencies: "@docusaurus/logger" "3.0.1" @@ -1619,9 +1631,9 @@ js-yaml "^4.1.0" tslib "^2.6.0" -"@docusaurus/utils@3.0.1": +"@docusaurus/utils@^3.0.0", "@docusaurus/utils@3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-3.0.1.tgz#c64f68980a90c5bc6d53a5b8f32deb9026b1e303" + resolved "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.0.1.tgz" integrity sha512-TwZ33Am0q4IIbvjhUOs+zpjtD/mXNmLmEgeTGuRq01QzulLHuPhaBTTAC/DHu6kFx3wDgmgpAlaRuCHfTcXv8g== dependencies: "@docusaurus/logger" "3.0.1" @@ -1642,50 +1654,101 @@ url-loader "^4.1.1" webpack "^5.88.1" -"@emotion/is-prop-valid@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc" - integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== +"@emotion/is-prop-valid@1.2.2": + version "1.2.2" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz" + integrity sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw== dependencies: "@emotion/memoize" "^0.8.1" "@emotion/memoize@^0.8.1": version "0.8.1" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz" integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== -"@emotion/unitless@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" - integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== +"@emotion/unitless@0.8.1": + version "0.8.1" + resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz" + integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.6.1": + version "4.11.1" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz" + integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== "@exodus/schemasafe@^1.0.0-rc.2": version "1.3.0" - resolved "https://registry.yarnpkg.com/@exodus/schemasafe/-/schemasafe-1.3.0.tgz#731656abe21e8e769a7f70a4d833e6312fe59b7f" + resolved "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.3.0.tgz" integrity sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw== "@hapi/hoek@^9.0.0": version "9.3.0" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz" integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== "@hapi/topo@^5.0.0": version "5.1.0" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + resolved "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz" integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== dependencies: "@hapi/hoek" "^9.0.0" +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== + dependencies: + "@humanwhocodes/object-schema" "^2.0.3" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.3": + version "2.0.3" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== + "@jest/schemas@^29.6.3": version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz" integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== dependencies: "@sinclair/typebox" "^0.27.8" "@jest/types@^29.6.3": version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz" integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== dependencies: "@jest/schemas" "^29.6.3" @@ -1697,7 +1760,7 @@ "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== dependencies: "@jridgewell/set-array" "^1.0.1" @@ -1706,17 +1769,17 @@ "@jridgewell/resolve-uri@^3.1.0": version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz" integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== "@jridgewell/set-array@^1.0.1": version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== "@jridgewell/source-map@^0.3.3": version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" + resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz" integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== dependencies: "@jridgewell/gen-mapping" "^0.3.0" @@ -1724,12 +1787,12 @@ "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.9": +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.20" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz" integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== dependencies: "@jridgewell/resolve-uri" "^3.1.0" @@ -1737,12 +1800,12 @@ "@leichtgewicht/ip-codec@^2.0.1": version "2.0.4" - resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" + resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== "@mdx-js/mdx@^3.0.0": version "3.0.0" - resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-3.0.0.tgz#37ef87685143fafedf1165f0a79e9fe95fbe5154" + resolved "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.0.tgz" integrity sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw== dependencies: "@types/estree" "^1.0.0" @@ -1771,27 +1834,27 @@ "@mdx-js/react@^3.0.0": version "3.0.0" - resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-3.0.0.tgz#eaccaa8d6a7736b19080aff5a70448a7ba692271" + resolved "https://registry.npmjs.org/@mdx-js/react/-/react-3.0.0.tgz" integrity sha512-nDctevR9KyYFyV+m+/+S4cpzCWHqj+iHDHq3QrsWezcC+B17uZdIWgCguESUkwFhM3n/56KxWVE3V6EokrmONQ== dependencies: "@types/mdx" "^2.0.0" "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.3": +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" @@ -1799,19 +1862,19 @@ "@pnpm/config.env-replace@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz#ab29da53df41e8948a00f2433f085f54de8b3a4c" + resolved "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz" integrity sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w== "@pnpm/network.ca-file@^1.0.1": version "1.0.2" - resolved "https://registry.yarnpkg.com/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz#2ab05e09c1af0cdf2fcf5035bea1484e222f7983" + resolved "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz" integrity sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA== dependencies: graceful-fs "4.2.10" "@pnpm/npm-conf@^2.1.0": version "2.2.2" - resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz#0058baf1c26cbb63a828f0193795401684ac86f0" + resolved "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz" integrity sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA== dependencies: "@pnpm/config.env-replace" "^1.1.0" @@ -1820,26 +1883,33 @@ "@polka/url@^1.0.0-next.24": version "1.0.0-next.24" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.24.tgz#58601079e11784d20f82d0585865bb42305c4df3" + resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.24.tgz" integrity sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ== "@redocly/ajv@^8.11.0": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@redocly/ajv/-/ajv-8.11.0.tgz#2fad322888dc0113af026e08fceb3e71aae495ae" - integrity sha512-9GWx27t7xWhDIR02PA18nzBdLcKQRgc46xNQvjFkrYk4UOmvKhJ/dawwiX0cCOeetN5LcaaiqQbVOWYK62SGHw== + version "8.11.2" + resolved "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.2.tgz" + integrity sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" - uri-js "^4.2.2" + uri-js-replace "^1.0.1" -"@redocly/openapi-core@1.10.3", "@redocly/openapi-core@^1.0.0-rc.2": - version "1.10.3" - resolved "https://registry.yarnpkg.com/@redocly/openapi-core/-/openapi-core-1.10.3.tgz#907b148dc72caba22b6ddbe76e15c67db84dc10d" - integrity sha512-4SnIWh8r3EM1ylcoHIJSnQnuvqRTpQMnf2RU3BfVdcCBa0A1uEyH6XSxgcO5ehxfQGuGGpUXJ+vPh32PUaQDkA== +"@redocly/config@^0.6.0": + version "0.6.3" + resolved "https://registry.npmjs.org/@redocly/config/-/config-0.6.3.tgz" + integrity sha512-hGWJgCsXRw0Ow4rplqRlUQifZvoSwZipkYnt11e3SeH1Eb23VUIDBcRuaQOUqy1wn0eevXkU2GzzQ8fbKdQ7Mg== + +"@redocly/openapi-core@^1.4.0", "@redocly/openapi-core@1.16.0": + version "1.16.0" + resolved "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.16.0.tgz" + integrity sha512-z06h+svyqbUcdAaePq8LPSwTPlm6Ig7j2VlL8skPBYnJvyaQ2IN7x/JkOvRL4ta+wcOCBdAex5JWnZbKaNktJg== dependencies: "@redocly/ajv" "^8.11.0" + "@redocly/config" "^0.6.0" colorette "^1.2.0" + https-proxy-agent "^7.0.4" js-levenshtein "^1.1.6" js-yaml "^4.1.0" lodash.isequal "^4.5.0" @@ -1850,39 +1920,39 @@ "@sideway/address@^4.1.3": version "4.1.4" - resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" + resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz" integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== dependencies: "@hapi/hoek" "^9.0.0" "@sideway/formula@^3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" + resolved "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz" integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== "@sideway/pinpoint@^2.0.0": version "2.0.0" - resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + resolved "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz" integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== "@sinclair/typebox@^0.27.8": version "0.27.8" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== "@sindresorhus/is@^4.6.0": version "4.6.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" + resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz" integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== "@sindresorhus/is@^5.2.0": version "5.6.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.6.0.tgz#41dd6093d34652cddb5d5bdeee04eafc33826668" + resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz" integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== "@slorber/remark-comment@^1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@slorber/remark-comment/-/remark-comment-1.0.0.tgz#2a020b3f4579c89dec0361673206c28d67e08f5a" + resolved "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz" integrity sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA== dependencies: micromark-factory-space "^1.0.0" @@ -1891,7 +1961,7 @@ "@slorber/static-site-generator-webpack-plugin@^4.0.7": version "4.0.7" - resolved "https://registry.yarnpkg.com/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz#fc1678bddefab014e2145cbe25b3ce4e1cfc36f3" + resolved "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz" integrity sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA== dependencies: eval "^0.1.8" @@ -1900,47 +1970,47 @@ "@svgr/babel-plugin-add-jsx-attribute@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz#74a5d648bd0347bda99d82409d87b8ca80b9a1ba" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz" integrity sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ== "@svgr/babel-plugin-remove-jsx-attribute@*": version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz#69177f7937233caca3a1afb051906698f2f59186" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz" integrity sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA== "@svgr/babel-plugin-remove-jsx-empty-expression@*": version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz#c2c48104cfd7dcd557f373b70a56e9e3bdae1d44" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz" integrity sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA== "@svgr/babel-plugin-replace-jsx-attribute-value@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz#fb9d22ea26d2bc5e0a44b763d4c46d5d3f596c60" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz" integrity sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg== "@svgr/babel-plugin-svg-dynamic-title@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz#01b2024a2b53ffaa5efceaa0bf3e1d5a4c520ce4" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz" integrity sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw== "@svgr/babel-plugin-svg-em-dimensions@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz#dd3fa9f5b24eb4f93bcf121c3d40ff5facecb217" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz" integrity sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA== "@svgr/babel-plugin-transform-react-native-svg@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz#1d8e945a03df65b601551097d8f5e34351d3d305" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz" integrity sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg== "@svgr/babel-plugin-transform-svg-component@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz#48620b9e590e25ff95a80f811544218d27f8a250" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz" integrity sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ== "@svgr/babel-preset@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-6.5.1.tgz#b90de7979c8843c5c580c7e2ec71f024b49eb828" + resolved "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz" integrity sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw== dependencies: "@svgr/babel-plugin-add-jsx-attribute" "^6.5.1" @@ -1952,9 +2022,9 @@ "@svgr/babel-plugin-transform-react-native-svg" "^6.5.1" "@svgr/babel-plugin-transform-svg-component" "^6.5.1" -"@svgr/core@^6.5.1": +"@svgr/core@*", "@svgr/core@^6.0.0", "@svgr/core@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/core/-/core-6.5.1.tgz#d3e8aa9dbe3fbd747f9ee4282c1c77a27410488a" + resolved "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz" integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw== dependencies: "@babel/core" "^7.19.6" @@ -1965,7 +2035,7 @@ "@svgr/hast-util-to-babel-ast@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz#81800bd09b5bcdb968bf6ee7c863d2288fdb80d2" + resolved "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz" integrity sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw== dependencies: "@babel/types" "^7.20.0" @@ -1973,7 +2043,7 @@ "@svgr/plugin-jsx@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz#0e30d1878e771ca753c94e69581c7971542a7072" + resolved "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz" integrity sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw== dependencies: "@babel/core" "^7.19.6" @@ -1983,7 +2053,7 @@ "@svgr/plugin-svgo@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz#0f91910e988fc0b842f88e0960c2862e022abe84" + resolved "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz" integrity sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ== dependencies: cosmiconfig "^7.0.1" @@ -1992,7 +2062,7 @@ "@svgr/webpack@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-6.5.1.tgz#ecf027814fc1cb2decc29dc92f39c3cf691e40e8" + resolved "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz" integrity sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA== dependencies: "@babel/core" "^7.19.6" @@ -2006,26 +2076,26 @@ "@szmarczak/http-timer@^5.0.1": version "5.0.1" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" + resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz" integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== dependencies: defer-to-connect "^2.0.1" "@trysound/sax@0.2.0": version "0.2.0" - resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz" integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== "@types/acorn@^4.0.0": version "4.0.6" - resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.6.tgz#d61ca5480300ac41a7d973dd5b84d0a591154a22" + resolved "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz" integrity sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ== dependencies: "@types/estree" "*" "@types/body-parser@*": version "1.19.5" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz" integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== dependencies: "@types/connect" "*" @@ -2033,14 +2103,14 @@ "@types/bonjour@^3.5.9": version "3.5.13" - resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.13.tgz#adf90ce1a105e81dd1f9c61fdc5afda1bfb92956" + resolved "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz" integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== dependencies: "@types/node" "*" "@types/connect-history-api-fallback@^1.3.5": version "1.5.4" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3" + resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz" integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== dependencies: "@types/express-serve-static-core" "*" @@ -2048,21 +2118,21 @@ "@types/connect@*": version "3.4.38" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz" integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== dependencies: "@types/node" "*" "@types/debug@^4.0.0": version "4.1.12" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz" integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== dependencies: "@types/ms" "*" "@types/eslint-scope@^3.7.3": version "3.7.7" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" + resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz" integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== dependencies: "@types/eslint" "*" @@ -2070,7 +2140,7 @@ "@types/eslint@*": version "8.56.0" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.0.tgz#e28d045b8e530a33c9cbcfbf02332df0d1380a2c" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.0.tgz" integrity sha512-FlsN0p4FhuYRjIxpbdXovvHQhtlG05O1GG/RNWvdAxTboR438IOTwmrY/vLA+Xfgg06BTkP045M3vpFwTMv1dg== dependencies: "@types/estree" "*" @@ -2078,19 +2148,19 @@ "@types/estree-jsx@^1.0.0": version "1.0.3" - resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-1.0.3.tgz#f8aa833ec986d82b8271a294a92ed1565bf2c66a" + resolved "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.3.tgz" integrity sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w== dependencies: "@types/estree" "*" "@types/estree@*", "@types/estree@^1.0.0": version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": version "4.17.41" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz#5077defa630c2e8d28aa9ffc2c01c157c305bef6" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz" integrity sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA== dependencies: "@types/node" "*" @@ -2100,7 +2170,7 @@ "@types/express@*", "@types/express@^4.17.13": version "4.17.21" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz" integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== dependencies: "@types/body-parser" "*" @@ -2110,141 +2180,136 @@ "@types/gtag.js@^0.0.12": version "0.0.12" - resolved "https://registry.yarnpkg.com/@types/gtag.js/-/gtag.js-0.0.12.tgz#095122edca896689bdfcdd73b057e23064d23572" + resolved "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz" integrity sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg== "@types/hast@^3.0.0": version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.3.tgz#7f75e6b43bc3f90316046a287d9ad3888309f7e1" + resolved "https://registry.npmjs.org/@types/hast/-/hast-3.0.3.tgz" integrity sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ== dependencies: "@types/unist" "*" "@types/history@^4.7.11": version "4.7.11" - resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64" + resolved "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz" integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== "@types/html-minifier-terser@^6.0.0": version "6.1.0" - resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" + resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== "@types/http-cache-semantics@^4.0.2": version "4.0.4" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" + resolved "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz" integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== "@types/http-errors@*": version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz" integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== "@types/http-proxy@^1.17.8": version "1.17.14" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.14.tgz#57f8ccaa1c1c3780644f8a94f9c6b5000b5e2eec" + resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz" integrity sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w== dependencies: "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz" integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== "@types/istanbul-lib-report@*": version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz" integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz" integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== dependencies: "@types/istanbul-lib-report" "*" "@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/mdast@^4.0.0", "@types/mdast@^4.0.2": version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.3.tgz#1e011ff013566e919a4232d1701ad30d70cab333" + resolved "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz" integrity sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg== dependencies: "@types/unist" "*" "@types/mdx@^2.0.0": version "2.0.10" - resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.10.tgz#0d7b57fb1d83e27656156e4ee0dfba96532930e4" + resolved "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.10.tgz" integrity sha512-Rllzc5KHk0Al5/WANwgSPl1/CwjqCy+AZrGd78zuK+jO9aDM6ffblZ+zIjgPNAaEBmlO0RYDvLNh7wD0zKVgEg== -"@types/mime@*": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.4.tgz#2198ac274de6017b44d941e00261d5bc6a0e0a45" - integrity sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw== - -"@types/mime@^1": +"@types/mime@*", "@types/mime@^1": version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz" integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== "@types/ms@*": version "0.7.34" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz" integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== "@types/node-forge@^1.3.0": version "1.3.10" - resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.10.tgz#62a19d4f75a8b03290578c2b04f294b1a5a71b07" + resolved "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.10.tgz" integrity sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw== dependencies: "@types/node" "*" "@types/node@*": - version "20.10.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.6.tgz#a3ec84c22965802bf763da55b2394424f22bfbb5" - integrity sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw== + version "20.10.5" + resolved "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz" + integrity sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw== dependencies: undici-types "~5.26.4" "@types/node@^17.0.5": version "17.0.45" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" + resolved "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz" integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== "@types/parse-json@^4.0.0": version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz" integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== "@types/prismjs@^1.26.0": version "1.26.3" - resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.3.tgz#47fe8e784c2dee24fe636cab82e090d3da9b7dec" + resolved "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.3.tgz" integrity sha512-A0D0aTXvjlqJ5ZILMz3rNfDBOx9hHxLZYv2by47Sm/pqW35zzjusrZTryatjN/Rf8Us2gZrJD+KeHbUSTux1Cw== "@types/prop-types@*": version "15.7.11" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz" integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== "@types/qs@*": version "6.9.11" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.11.tgz#208d8a30bc507bd82e03ada29e4732ea46a6bbda" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz" integrity sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ== "@types/range-parser@*": version "1.2.7" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz" integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== "@types/react-router-config@*", "@types/react-router-config@^5.0.7": version "5.0.11" - resolved "https://registry.yarnpkg.com/@types/react-router-config/-/react-router-config-5.0.11.tgz#2761a23acc7905a66a94419ee40294a65aaa483a" + resolved "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz" integrity sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw== dependencies: "@types/history" "^4.7.11" @@ -2253,7 +2318,7 @@ "@types/react-router-dom@*": version "5.3.3" - resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.3.tgz#e9d6b4a66fcdbd651a5f106c2656a30088cc1e83" + resolved "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz" integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw== dependencies: "@types/history" "^4.7.11" @@ -2262,16 +2327,16 @@ "@types/react-router@*", "@types/react-router@^5.1.0": version "5.1.20" - resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.20.tgz#88eccaa122a82405ef3efbcaaa5dcdd9f021387c" + resolved "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz" integrity sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q== dependencies: "@types/history" "^4.7.11" "@types/react" "*" -"@types/react@*": - version "18.2.46" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.46.tgz#f04d6c528f8f136ea66333bc66abcae46e2680df" - integrity sha512-nNCvVBcZlvX4NU1nRRNV/mFl1nNRuTuslAJglQsq+8ldXe5Xv0Wd2f7WTE3jOxhLH2BFfiZGC6GCp+kHQbgG+w== +"@types/react@*", "@types/react@>= 16.8.0 < 19.0.0", "@types/react@>=16": + version "18.2.45" + resolved "https://registry.npmjs.org/@types/react/-/react-18.2.45.tgz" + integrity sha512-TtAxCNrlrBp8GoeEp1npd5g+d/OejJHFxS3OWmrPBMFaVQMSN0OFySozJio5BHxTuTeug00AVXVAjfDSfk+lUg== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2279,24 +2344,29 @@ "@types/retry@0.12.0": version "0.12.0" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== "@types/sax@^1.2.1": version "1.2.7" - resolved "https://registry.yarnpkg.com/@types/sax/-/sax-1.2.7.tgz#ba5fe7df9aa9c89b6dff7688a19023dd2963091d" + resolved "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz" integrity sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A== dependencies: "@types/node" "*" "@types/scheduler@*": version "0.16.8" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz" integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== +"@types/semver@^7.3.12": + version "7.5.8" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + "@types/send@*": version "0.17.4" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + resolved "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz" integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== dependencies: "@types/mime" "^1" @@ -2304,14 +2374,14 @@ "@types/serve-index@^1.9.1": version "1.9.4" - resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898" + resolved "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz" integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== dependencies: "@types/express" "*" "@types/serve-static@*", "@types/serve-static@^1.13.10": version "1.15.5" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.5.tgz#15e67500ec40789a1e8c9defc2d32a896f05b033" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz" integrity sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ== dependencies: "@types/http-errors" "*" @@ -2320,53 +2390,101 @@ "@types/sockjs@^0.3.33": version "0.3.36" - resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535" + resolved "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz" integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== dependencies: "@types/node" "*" -"@types/stylis@4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@types/stylis/-/stylis-4.2.0.tgz#199a3f473f0c3a6f6e4e1b17cdbc967f274bdc6b" - integrity sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw== +"@types/stylis@4.2.5": + version "4.2.5" + resolved "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz" + integrity sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw== "@types/unist@*", "@types/unist@^3.0.0": version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.2.tgz#6dd61e43ef60b34086287f83683a5c1b2dc53d20" + resolved "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz" integrity sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ== "@types/unist@^2.0.0": version "2.0.10" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" + resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz" integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== "@types/ws@^8.5.5": version "8.5.10" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" + resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz" integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== dependencies: "@types/node" "*" "@types/yargs-parser@*": version "21.0.3" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz" integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^17.0.8": version "17.0.32" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz" integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== dependencies: "@types/yargs-parser" "*" -"@ungap/structured-clone@^1.0.0": +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== + +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@^5.62.0": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== + dependencies: + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" + +"@ungap/structured-clone@^1.0.0", "@ungap/structured-clone@^1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== -"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": +"@webassemblyjs/ast@^1.11.5", "@webassemblyjs/ast@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz" integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== dependencies: "@webassemblyjs/helper-numbers" "1.11.6" @@ -2374,22 +2492,22 @@ "@webassemblyjs/floating-point-hex-parser@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz" integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== "@webassemblyjs/helper-api-error@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz" integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== "@webassemblyjs/helper-buffer@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz" integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== "@webassemblyjs/helper-numbers@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz" integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== dependencies: "@webassemblyjs/floating-point-hex-parser" "1.11.6" @@ -2398,12 +2516,12 @@ "@webassemblyjs/helper-wasm-bytecode@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz" integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== "@webassemblyjs/helper-wasm-section@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz" integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -2413,26 +2531,26 @@ "@webassemblyjs/ieee754@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz" integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== dependencies: "@xtuc/ieee754" "^1.2.0" "@webassemblyjs/leb128@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz" integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== dependencies: "@xtuc/long" "4.2.2" "@webassemblyjs/utf8@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz" integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== "@webassemblyjs/wasm-edit@^1.11.5": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz" integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -2446,7 +2564,7 @@ "@webassemblyjs/wasm-gen@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz" integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -2457,7 +2575,7 @@ "@webassemblyjs/wasm-opt@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz" integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -2465,9 +2583,9 @@ "@webassemblyjs/wasm-gen" "1.11.6" "@webassemblyjs/wasm-parser" "1.11.6" -"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": +"@webassemblyjs/wasm-parser@^1.11.5", "@webassemblyjs/wasm-parser@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz" integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -2479,7 +2597,7 @@ "@webassemblyjs/wast-printer@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz" integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -2487,17 +2605,17 @@ "@xtuc/ieee754@^1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== "@xtuc/long@4.2.2": version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== dependencies: mime-types "~2.1.34" @@ -2505,32 +2623,39 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: acorn-import-assertions@^1.9.0: version "1.9.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" + resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz" integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== -acorn-jsx@^5.0.0: +acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.0.0: version "8.3.1" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.1.tgz#2f10f5b69329d90ae18c58bf1fa8fccd8b959a43" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz" integrity sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw== -acorn@^8.0.0, acorn@^8.0.4, acorn@^8.7.1, acorn@^8.8.2: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8, acorn@^8.0.0, acorn@^8.0.4, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: + version "8.11.2" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz" + integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== address@^1.0.1, address@^1.1.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" + resolved "https://registry.npmjs.org/address/-/address-1.2.2.tgz" integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== +agent-base@^7.0.2: + version "7.1.1" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz" + integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== + dependencies: + debug "^4.3.4" + aggregate-error@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" @@ -2538,26 +2663,41 @@ aggregate-error@^3.0.0: ajv-formats@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== dependencies: ajv "^8.0.0" -ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: +ajv-keywords@^3.4.1: version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== ajv-keywords@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz" integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== dependencies: fast-deep-equal "^3.1.3" -ajv@^6.12.2, ajv@^6.12.5: +ajv@^6.12.2, ajv@^6.12.5, ajv@^6.9.1: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^6.12.4: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -2565,9 +2705,9 @@ ajv@^6.12.2, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.9.0: +ajv@^8.0.0, ajv@^8.8.2, ajv@^8.9.0: version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== dependencies: fast-deep-equal "^3.1.1" @@ -2577,14 +2717,14 @@ ajv@^8.0.0, ajv@^8.9.0: algoliasearch-helper@^3.13.3: version "3.16.1" - resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.16.1.tgz#421e3554ec86e14e60e7e0bf796aef61cf4a06ec" + resolved "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.16.1.tgz" integrity sha512-qxAHVjjmT7USVvrM8q6gZGaJlCK1fl4APfdAA7o8O6iXEc68G0xMNrzRkxoB/HmhhvyHnoteS/iMTiHiTcQQcg== dependencies: "@algolia/events" "^4.0.1" -algoliasearch@^4.18.0, algoliasearch@^4.19.1: +algoliasearch@^4.18.0, algoliasearch@^4.19.1, "algoliasearch@>= 3.1 < 6", "algoliasearch@>= 4.9.1 < 6": version "4.22.0" - resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.22.0.tgz#9ece4446b5ab0af941ef97553c18ddcd1b8040a5" + resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.22.0.tgz" integrity sha512-gfceltjkwh7PxXwtkS8KVvdfK+TSNQAWUeNSxf4dA29qW5tf2EGwa8jkJujlT9jLm17cixMVoGNc+GJFO1Mxhg== dependencies: "@algolia/cache-browser-local-storage" "4.22.0" @@ -2604,48 +2744,48 @@ algoliasearch@^4.18.0, algoliasearch@^4.19.1: ansi-align@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + resolved "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz" integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== dependencies: string-width "^4.1.0" ansi-html-community@^0.0.8: version "0.0.8" - resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz" integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^6.1.0: version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -2653,49 +2793,93 @@ anymatch@~3.1.2: arg@^5.0.0: version "5.0.2" - resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== argparse@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" array-flatten@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + array-union@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +array.prototype.filter@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.4.tgz" + integrity sha512-r+mCJ7zXgXElgR4IRC+fkvNCeoaavWBs6EdCso5Tbcf+iEMKzBU/His60lt34WEZ9vlb8wDkZvQGcVI5GwkfoQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-array-method-boxes-properly "^1.0.0" + es-object-atoms "^1.0.0" + is-string "^1.0.7" + +array.prototype.flat@^1.2.3: + version "1.3.2" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" + astring@^1.8.0: version "1.8.6" - resolved "https://registry.yarnpkg.com/astring/-/astring-1.8.6.tgz#2c9c157cf1739d67561c56ba896e6948f6b93731" + resolved "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz" integrity sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg== at-least-node@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== autoprefixer@^10.4.12, autoprefixer@^10.4.14: version "10.4.16" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.16.tgz#fad1411024d8670880bdece3970aa72e3572feb8" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz" integrity sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ== dependencies: browserslist "^4.21.10" @@ -2705,9 +2889,16 @@ autoprefixer@^10.4.12, autoprefixer@^10.4.14: picocolors "^1.0.0" postcss-value-parser "^4.2.0" +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + babel-loader@^9.1.3: version "9.1.3" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.3.tgz#3d0e01b4e69760cc694ee306fe16d358aa1c6f9a" + resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz" integrity sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw== dependencies: find-cache-dir "^4.0.0" @@ -2715,63 +2906,63 @@ babel-loader@^9.1.3: babel-plugin-dynamic-import-node@^2.3.3: version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + resolved "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz" integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== dependencies: object.assign "^4.1.0" -babel-plugin-polyfill-corejs2@^0.4.7: +babel-plugin-polyfill-corejs2@^0.4.6: version "0.4.7" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz#679d1b94bf3360f7682e11f2cb2708828a24fe8c" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz" integrity sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ== dependencies: "@babel/compat-data" "^7.22.6" "@babel/helper-define-polyfill-provider" "^0.4.4" semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.8.7: +babel-plugin-polyfill-corejs3@^0.8.5: version "0.8.7" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz#941855aa7fdaac06ed24c730a93450d2b2b76d04" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz" integrity sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA== dependencies: "@babel/helper-define-polyfill-provider" "^0.4.4" core-js-compat "^3.33.1" -babel-plugin-polyfill-regenerator@^0.5.4: +babel-plugin-polyfill-regenerator@^0.5.3: version "0.5.4" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz#c6fc8eab610d3a11eb475391e52584bacfc020f4" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz" integrity sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg== dependencies: "@babel/helper-define-polyfill-provider" "^0.4.4" bail@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" + resolved "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz" integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== batch@0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== big.js@^5.2.2: version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== binary-extensions@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== body-parser@1.20.1: version "1.20.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz" integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== dependencies: bytes "3.1.2" @@ -2789,7 +2980,7 @@ body-parser@1.20.1: bonjour-service@^1.0.11: version "1.1.1" - resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.1.1.tgz#960948fa0e0153f5d26743ab15baf8e33752c135" + resolved "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz" integrity sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg== dependencies: array-flatten "^2.1.2" @@ -2799,12 +2990,12 @@ bonjour-service@^1.0.11: boolbase@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== boxen@^6.2.1: version "6.2.1" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-6.2.1.tgz#b098a2278b2cd2845deef2dff2efc38d329b434d" + resolved "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz" integrity sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw== dependencies: ansi-align "^3.0.1" @@ -2818,7 +3009,7 @@ boxen@^6.2.1: boxen@^7.0.0: version "7.1.1" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-7.1.1.tgz#f9ba525413c2fec9cdb88987d835c4f7cad9c8f4" + resolved "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz" integrity sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog== dependencies: ansi-align "^3.0.1" @@ -2832,7 +3023,7 @@ boxen@^7.0.0: brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -2840,21 +3031,21 @@ brace-expansion@^1.1.7: brace-expansion@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: balanced-match "^1.0.0" braces@^3.0.2, braces@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.22.2: +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.22.2, "browserslist@>= 4.21.0": version "4.22.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.2.tgz#704c4943072bd81ea18997f3bd2180e89c77874b" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz" integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A== dependencies: caniuse-lite "^1.0.30001565" @@ -2864,27 +3055,27 @@ browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4 buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== bytes@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== bytes@3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== cacheable-lookup@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz#3476a8215d046e5a3202a9209dd13fec1f933a27" + resolved "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz" integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== cacheable-request@^10.2.8: version "10.2.14" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.14.tgz#eb915b665fda41b79652782df3f553449c406b9d" + resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz" integrity sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ== dependencies: "@types/http-cache-semantics" "^4.0.2" @@ -2895,28 +3086,30 @@ cacheable-request@^10.2.8: normalize-url "^8.0.0" responselike "^3.0.0" -call-bind@^1.0.0, call-bind@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" - integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" function-bind "^1.1.2" - get-intrinsic "^1.2.1" - set-function-length "^1.1.1" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" call-me-maybe@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.2.tgz#03f964f19522ba643b1b0693acb9152fe2074baa" + resolved "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz" integrity sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ== callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camel-case@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== dependencies: pascal-case "^3.1.2" @@ -2924,22 +3117,22 @@ camel-case@^4.1.2: camelcase@^6.2.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== camelcase@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-7.0.1.tgz#f02e50af9fd7782bc8b88a3558c32fd3a388f048" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz" integrity sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw== camelize@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" + resolved "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz" integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== caniuse-api@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + resolved "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz" integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== dependencies: browserslist "^4.0.0" @@ -2948,18 +3141,18 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001565: - version "1.0.30001572" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001572.tgz#1ccf7dc92d2ee2f92ed3a54e11b7b4a3041acfa0" - integrity sha512-1Pbh5FLmn5y4+QhNyJE9j3/7dK44dGB83/ZMjv/qJk86TvDbjk0LosiZo0i0WB0Vx607qMX9jYrn1VLHCkN4rw== + version "1.0.30001667" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz" + integrity sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw== ccount@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + resolved "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz" integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== chalk@^2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -2968,7 +3161,7 @@ chalk@^2.4.2: chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -2976,37 +3169,37 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: chalk@^5.0.1, chalk@^5.2.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + resolved "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz" integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== char-regex@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== character-entities-html4@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" + resolved "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz" integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== character-entities-legacy@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" + resolved "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz" integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== character-entities@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + resolved "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz" integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== character-reference-invalid@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" + resolved "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz" integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== cheerio-select@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" + resolved "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz" integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== dependencies: boolbase "^1.0.0" @@ -3016,9 +3209,9 @@ cheerio-select@^2.1.0: domhandler "^5.0.3" domutils "^3.0.1" -cheerio@^1.0.0-rc.12: +cheerio@^1.0.0-rc.12, cheerio@^1.0.0-rc.3: version "1.0.0-rc.12" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" + resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz" integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== dependencies: cheerio-select "^2.1.0" @@ -3031,7 +3224,7 @@ cheerio@^1.0.0-rc.12: chokidar@^3.4.2, chokidar@^3.5.3: version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: anymatch "~3.1.2" @@ -3046,39 +3239,39 @@ chokidar@^3.4.2, chokidar@^3.5.3: chrome-trace-event@^1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== ci-info@^3.2.0: version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== -classnames@^2.3.1: +classnames@^2.3.2: version "2.5.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" + resolved "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz" integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== clean-css@^5.2.2, clean-css@^5.3.2, clean-css@~5.3.2: version "5.3.3" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd" + resolved "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz" integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== dependencies: source-map "~0.6.0" clean-stack@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== cli-boxes@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" + resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz" integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== cli-table3@^0.6.3: version "0.6.3" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" + resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz" integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== dependencies: string-width "^4.2.0" @@ -3087,7 +3280,7 @@ cli-table3@^0.6.3: cliui@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: string-width "^4.2.0" @@ -3096,117 +3289,122 @@ cliui@^8.0.1: clone-deep@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== dependencies: is-plain-object "^2.0.4" kind-of "^6.0.2" shallow-clone "^3.0.0" -clsx@^1.1.0, clsx@^1.2.1: +clsx@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== clsx@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.0.tgz#e851283bcb5c80ee7608db18487433f7b23f77cb" - integrity sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg== + version "2.0.0" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz" + integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== collapse-white-space@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-2.1.0.tgz#640257174f9f42c740b40f3b55ee752924feefca" + resolved "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz" integrity sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw== color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + colord@^2.9.1: version "2.9.3" - resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" + resolved "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz" integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== colorette@^1.2.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" + resolved "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz" integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== colorette@^2.0.10: version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== combine-promises@^1.1.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/combine-promises/-/combine-promises-1.2.0.tgz#5f2e68451862acf85761ded4d9e2af7769c2ca6a" + resolved "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz" integrity sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ== comma-separated-tokens@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== commander@^10.0.0: version "10.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== +commander@^2.19.0: + version "2.20.3" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + commander@^2.20.0: version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== commander@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== commander@^7.2.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== commander@^8.3.0: version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== common-path-prefix@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" + resolved "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz" integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== compressible@~2.0.16: version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== dependencies: mime-db ">= 1.43.0 < 2" compression@^1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== dependencies: accepts "~1.3.5" @@ -3219,12 +3417,12 @@ compression@^1.7.4: concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== config-chain@^1.1.11: version "1.1.13" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + resolved "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz" integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== dependencies: ini "^1.3.4" @@ -3232,7 +3430,7 @@ config-chain@^1.1.11: configstore@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-6.0.0.tgz#49eca2ebc80983f77e09394a1a56e0aca8235566" + resolved "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz" integrity sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA== dependencies: dot-prop "^6.0.1" @@ -3243,54 +3441,54 @@ configstore@^6.0.0: connect-history-api-fallback@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz" integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== consola@^2.15.3: version "2.15.3" - resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" + resolved "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz" integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== content-disposition@0.5.2: version "0.5.2" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz" integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== content-disposition@0.5.4: version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: safe-buffer "5.2.1" content-type@~1.0.4: version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== convert-source-map@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== cookie-signature@1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== cookie@0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== copy-text-to-clipboard@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz#0202b2d9bdae30a49a53f898626dcc3b49ad960b" + resolved "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz" integrity sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q== copy-webpack-plugin@^11.0.0: version "11.0.0" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz#96d4dbdb5f73d02dd72d0528d1958721ab72e04a" + resolved "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz" integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== dependencies: fast-glob "^3.2.11" @@ -3301,30 +3499,30 @@ copy-webpack-plugin@^11.0.0: serialize-javascript "^6.0.0" core-js-compat@^3.31.0, core-js-compat@^3.33.1: - version "3.35.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.35.0.tgz#c149a3d1ab51e743bc1da61e39cb51f461a41873" - integrity sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw== + version "3.34.0" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.34.0.tgz" + integrity sha512-4ZIyeNbW/Cn1wkMMDy+mvrRUxrwFNjKwbhCfQpDd+eLgYipDqp8oGFGtLmhh18EDPKA0g3VUBYOxQGGwvWLVpA== dependencies: browserslist "^4.22.2" core-js-pure@^3.30.2: - version "3.35.0" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.35.0.tgz#4660033304a050215ae82e476bd2513a419fbb34" - integrity sha512-f+eRYmkou59uh7BPcyJ8MC76DiGhspj1KMxVIcF24tzP8NA9HVa1uC7BTW2tgx7E1QVCzDzsgp7kArrzhlz8Ew== + version "3.34.0" + resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.34.0.tgz" + integrity sha512-pmhivkYXkymswFfbXsANmBAewXx86UBfmagP+w0wkK06kLsLlTK5oQmsURPivzMkIBQiYq2cjamcZExIwlFQIg== -core-js@^3.31.1: - version "3.35.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.35.0.tgz#58e651688484f83c34196ca13f099574ee53d6b4" - integrity sha512-ntakECeqg81KqMueeGJ79Q5ZgQNR+6eaE8sxGCx62zMbAIj65q+uYvatToew3m6eAGdU4gNZwpZ34NMe4GYswg== +core-js@^3.1.4, core-js@^3.31.1: + version "3.34.0" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.34.0.tgz" + integrity sha512-aDdvlDder8QmY91H88GzNi9EtQi2TjvQhpCX6B1v/dAZHU1AuLgHvRh54RiOerpEhEW46Tkf+vgAViB/CWC0ag== core-util-is@~1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cosmiconfig@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz" integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== dependencies: "@types/parse-json" "^4.0.0" @@ -3335,7 +3533,7 @@ cosmiconfig@^6.0.0: cosmiconfig@^7.0.1: version "7.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz" integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: "@types/parse-json" "^4.0.0" @@ -3344,9 +3542,9 @@ cosmiconfig@^7.0.1: path-type "^4.0.0" yaml "^1.10.0" -cosmiconfig@^8.3.5: +cosmiconfig@^8.2.0: version "8.3.6" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz" integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== dependencies: import-fresh "^3.3.0" @@ -3354,9 +3552,9 @@ cosmiconfig@^8.3.5: parse-json "^5.2.0" path-type "^4.0.0" -cross-spawn@^7.0.3: +cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" @@ -3365,24 +3563,24 @@ cross-spawn@^7.0.3: crypto-random-string@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-4.0.0.tgz#5a3cc53d7dd86183df5da0312816ceeeb5bb1fc2" + resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz" integrity sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA== dependencies: type-fest "^1.0.1" css-color-keywords@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" + resolved "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz" integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== css-declaration-sorter@^6.3.1: version "6.4.1" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz#28beac7c20bad7f1775be3a7129d7eae409a3a71" + resolved "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz" integrity sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g== css-loader@^6.8.1: version "6.8.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88" + resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz" integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== dependencies: icss-utils "^5.1.0" @@ -3396,7 +3594,7 @@ css-loader@^6.8.1: css-minimizer-webpack-plugin@^4.2.2: version "4.2.2" - resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz#79f6199eb5adf1ff7ba57f105e3752d15211eb35" + resolved "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz" integrity sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA== dependencies: cssnano "^5.1.8" @@ -3408,7 +3606,7 @@ css-minimizer-webpack-plugin@^4.2.2: css-select@^4.1.3: version "4.3.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz" integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== dependencies: boolbase "^1.0.0" @@ -3419,7 +3617,7 @@ css-select@^4.1.3: css-select@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + resolved "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz" integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== dependencies: boolbase "^1.0.0" @@ -3430,7 +3628,7 @@ css-select@^5.1.0: css-to-react-native@3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32" + resolved "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz" integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ== dependencies: camelize "^1.0.0" @@ -3439,7 +3637,7 @@ css-to-react-native@3.2.0: css-tree@^1.1.2, css-tree@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz" integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== dependencies: mdn-data "2.0.14" @@ -3447,17 +3645,17 @@ css-tree@^1.1.2, css-tree@^1.1.3: css-what@^6.0.1, css-what@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== cssesc@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== cssnano-preset-advanced@^5.3.10: version "5.3.10" - resolved "https://registry.yarnpkg.com/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz#25558a1fbf3a871fb6429ce71e41be7f5aca6eef" + resolved "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz" integrity sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ== dependencies: autoprefixer "^10.4.12" @@ -3469,7 +3667,7 @@ cssnano-preset-advanced@^5.3.10: cssnano-preset-default@^5.2.14: version "5.2.14" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz#309def4f7b7e16d71ab2438052093330d9ab45d8" + resolved "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz" integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== dependencies: css-declaration-sorter "^6.3.1" @@ -3504,12 +3702,12 @@ cssnano-preset-default@^5.2.14: cssnano-utils@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" + resolved "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz" integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== cssnano@^5.1.15, cssnano@^5.1.8: version "5.1.15" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf" + resolved "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz" integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== dependencies: cssnano-preset-default "^5.2.14" @@ -3518,98 +3716,132 @@ cssnano@^5.1.15, cssnano@^5.1.8: csso@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + resolved "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz" integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== dependencies: css-tree "^1.1.2" -csstype@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== - -csstype@^3.0.2: +csstype@^3.0.2, csstype@3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + debounce@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + resolved "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz" integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== -debug@2.6.9, debug@^2.6.0: +debug@^2.6.0: version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: +debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@4: version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + decko@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/decko/-/decko-1.2.0.tgz#fd43c735e967b8013306884a56fbe665996b6817" + resolved "https://registry.npmjs.org/decko/-/decko-1.2.0.tgz" integrity sha512-m8FnyHXV1QX+S1cl+KPFDIl6NMkxtKsy6+U/aYyjrOqWMuwAwYWu7ePqrsUHtDR5Y8Yk2pi/KIDSgF+vT4cPOQ== decode-named-character-reference@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" + resolved "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz" integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== dependencies: character-entities "^2.0.0" decompress-response@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz" integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== dependencies: mimic-response "^3.1.0" deep-extend@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + deepmerge@^4.2.2: version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== default-gateway@^6.0.3: version "6.0.3" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + resolved "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz" integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== dependencies: execa "^5.0.0" defer-to-connect@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz" integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== -define-data-property@^1.0.1, define-data-property@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" - integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: - get-intrinsic "^1.2.1" + es-define-property "^1.0.0" + es-errors "^1.3.0" gopd "^1.0.1" - has-property-descriptors "^1.0.0" define-lazy-prop@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.2.1: +define-properties@^1.2.0, define-properties@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: define-data-property "^1.0.1" @@ -3618,7 +3850,7 @@ define-properties@^1.2.1: del@^6.1.1: version "6.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" + resolved "https://registry.npmjs.org/del/-/del-6.1.1.tgz" integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== dependencies: globby "^11.0.1" @@ -3630,34 +3862,34 @@ del@^6.1.1: rimraf "^3.0.2" slash "^3.0.0" -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - depd@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== +depd@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + dequal@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== destroy@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== detect-node@^2.0.4: version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== detect-port-alt@^1.1.6: version "1.1.6" - resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + resolved "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz" integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== dependencies: address "^1.0.1" @@ -3665,7 +3897,7 @@ detect-port-alt@^1.1.6: detect-port@^1.5.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" + resolved "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz" integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== dependencies: address "^1.0.1" @@ -3673,60 +3905,74 @@ detect-port@^1.5.1: devlop@^1.0.0, devlop@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" + resolved "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz" integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== dependencies: dequal "^2.0.0" dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" +discontinuous-range@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz" + integrity sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ== + dns-equal@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + resolved "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz" integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== dns-packet@^5.2.2: version "5.6.1" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" + resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz" integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== dependencies: "@leichtgewicht/ip-codec" "^2.0.1" -docusaurus-plugin-redoc@2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/docusaurus-plugin-redoc/-/docusaurus-plugin-redoc-2.0.2.tgz#d8feddf0626939363549d06145fc585e7f2583b5" - integrity sha512-J4pfu+dvwm1D4qWA6O8FT6EYSw9R1mv9fIXCqKh7aHYD+OU19hj/vQQUdjIbAwTcOkBg+eUYVXvdopwTvUXNcQ== +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: - "@redocly/openapi-core" "1.10.3" - redoc "2.1.3" + esutils "^2.0.2" -docusaurus-theme-redoc@2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/docusaurus-theme-redoc/-/docusaurus-theme-redoc-2.0.2.tgz#d56d3b5a5773f609f8d4d0e29ea3614952632554" - integrity sha512-qa8svxKCipIvokNGctoQRP3Vz+HTF2Mnwg6xzY/W/LR5TYEIu3nuSvouLLR58uBrHKGzGpto5CEPDq0SvVvDlA== +docusaurus-plugin-redoc@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/docusaurus-plugin-redoc/-/docusaurus-plugin-redoc-2.1.1.tgz" + integrity sha512-gf9HbFAKPZu17rbx+3C6vIpfMMTuvUFG8rRKeuHro1B5wUutBSjE5/VjB1owVGjIJQ74OgVKJvgczqUjhcQcjQ== + dependencies: + "@redocly/openapi-core" "1.16.0" + redoc "2.1.5" + +docusaurus-theme-redoc@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/docusaurus-theme-redoc/-/docusaurus-theme-redoc-2.1.2.tgz" + integrity sha512-UB6g+YDPjVgFMhJnIUaW/mNl9vsCMbrMQutgdoG5DaI+HpxO2sV+zT2z23Wg6ngi2GM+oxEhYf5Qc1dPwKZqBQ== dependencies: - "@redocly/openapi-core" "1.10.3" + "@redocly/openapi-core" "1.16.0" clsx "^1.2.1" lodash "^4.17.21" - mobx "^6.0.4" - redoc "2.1.3" - styled-components "^6.0.5" + mobx "^6.12.4" + postcss "^8.4.45" + postcss-prefix-selector "^1.16.1" + redoc "2.1.5" + styled-components "^6.1.11" dom-converter@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + resolved "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz" integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== dependencies: utila "~0.4" dom-serializer@^1.0.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== dependencies: domelementtype "^2.0.1" @@ -3735,7 +3981,7 @@ dom-serializer@^1.0.1: dom-serializer@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz" integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== dependencies: domelementtype "^2.3.0" @@ -3744,31 +3990,31 @@ dom-serializer@^2.0.0: domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== dependencies: domelementtype "^2.2.0" domhandler@^5.0.2, domhandler@^5.0.3: version "5.0.3" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz" integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== dependencies: domelementtype "^2.3.0" -dompurify@^2.2.8: - version "2.4.7" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.7.tgz#277adeb40a2c84be2d42a8bcd45f582bfa4d0cfc" - integrity sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ== +dompurify@^3.0.6: + version "3.1.7" + resolved "https://registry.npmjs.org/dompurify/-/dompurify-3.1.7.tgz" + integrity sha512-VaTstWtsneJY8xzy7DekmYWEOZcmzIe3Qb3zPd4STve1OBTa+e+WmS1ITQec1fZYXI3HCsOZZiSMpG6oxoWMWQ== domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== dependencies: dom-serializer "^1.0.1" @@ -3777,7 +4023,7 @@ domutils@^2.5.2, domutils@^2.8.0: domutils@^3.0.1: version "3.1.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + resolved "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz" integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== dependencies: dom-serializer "^2.0.0" @@ -3786,7 +4032,7 @@ domutils@^3.0.1: dot-case@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== dependencies: no-case "^3.0.4" @@ -3794,64 +4040,64 @@ dot-case@^3.0.4: dot-prop@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" + resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz" integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== dependencies: is-obj "^2.0.0" duplexer@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== eastasianwidth@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== ee-first@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.4.601: version "1.4.616" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.616.tgz#4bddbc2c76e1e9dbf449ecd5da3d8119826ea4fb" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.616.tgz" integrity sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.2.2: version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== emojilib@^2.4.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/emojilib/-/emojilib-2.4.0.tgz#ac518a8bb0d5f76dda57289ccb2fdf9d39ae721e" + resolved "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz" integrity sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw== emojis-list@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== emoticon@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/emoticon/-/emoticon-4.0.1.tgz#2d2bbbf231ce3a5909e185bbb64a9da703a1e749" + resolved "https://registry.npmjs.org/emoticon/-/emoticon-4.0.1.tgz" integrity sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw== encodeurl@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== enhanced-resolve@^5.15.0: version "5.15.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz" integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== dependencies: graceful-fs "^4.2.4" @@ -3859,101 +4105,316 @@ enhanced-resolve@^5.15.0: entities@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== entities@^4.2.0, entities@^4.4.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== +enzyme-shallow-equal@^1.0.0, enzyme-shallow-equal@^1.0.1: + version "1.0.7" + resolved "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.7.tgz" + integrity sha512-/um0GFqUXnpM9SvKtje+9Tjoz3f1fpBC3eXRFrNs8kpYn69JljciYP7KZTqM/YQbUY9KUjvKB4jo/q+L6WGGvg== + dependencies: + hasown "^2.0.0" + object-is "^1.1.5" + +enzyme@^3.11.0: + version "3.11.0" + resolved "https://registry.npmjs.org/enzyme/-/enzyme-3.11.0.tgz" + integrity sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw== + dependencies: + array.prototype.flat "^1.2.3" + cheerio "^1.0.0-rc.3" + enzyme-shallow-equal "^1.0.1" + function.prototype.name "^1.1.2" + has "^1.0.3" + html-element-map "^1.2.0" + is-boolean-object "^1.0.1" + is-callable "^1.1.5" + is-number-object "^1.0.4" + is-regex "^1.0.5" + is-string "^1.0.5" + is-subset "^0.1.1" + lodash.escape "^4.0.1" + lodash.isequal "^4.5.0" + object-inspect "^1.7.0" + object-is "^1.0.2" + object.assign "^4.1.0" + object.entries "^1.1.1" + object.values "^1.1.1" + raf "^3.4.1" + rst-selector-parser "^2.2.3" + string.prototype.trim "^1.2.1" + error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: + version "1.23.3" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.15" + +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + es-module-lexer@^1.2.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.4.1.tgz#41ea21b43908fe6a287ffcbe4300f790555331f5" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz" integrity sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w== +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + es6-promise@^3.2.1: version "3.3.1" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz" integrity sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg== escalade@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-goat@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-4.0.0.tgz#9424820331b510b0666b98f7873fe11ac4aa8081" + resolved "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz" integrity sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg== escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== escape-string-regexp@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz" integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== -eslint-scope@5.1.1: +eslint-scope@^5.1.1, eslint-scope@5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: esrecurse "^4.3.0" estraverse "^4.1.1" +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +"eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@>= 6", eslint@>=6: + version "8.57.1" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + esprima@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== +esquery@^1.4.2: + version "1.6.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== + dependencies: + estraverse "^5.1.0" + esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^4.1.1: version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== +estraverse@^5.1.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + estraverse@^5.2.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== estree-util-attach-comments@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz#344bde6a64c8a31d15231e5ee9e297566a691c2d" + resolved "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz" integrity sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw== dependencies: "@types/estree" "^1.0.0" estree-util-build-jsx@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz#b6d0bced1dcc4f06f25cf0ceda2b2dcaf98168f1" + resolved "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz" integrity sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ== dependencies: "@types/estree-jsx" "^1.0.0" @@ -3963,12 +4424,12 @@ estree-util-build-jsx@^3.0.0: estree-util-is-identifier-name@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz#0b5ef4c4ff13508b34dcd01ecfa945f61fce5dbd" + resolved "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz" integrity sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg== estree-util-to-js@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz#10a6fb924814e6abb62becf0d2bc4dea51d04f17" + resolved "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz" integrity sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg== dependencies: "@types/estree-jsx" "^1.0.0" @@ -3977,7 +4438,7 @@ estree-util-to-js@^2.0.0: estree-util-value-to-estree@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/estree-util-value-to-estree/-/estree-util-value-to-estree-3.0.1.tgz#0b7b5d6b6a4aaad5c60999ffbc265a985df98ac5" + resolved "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.0.1.tgz" integrity sha512-b2tdzTurEIbwRh+mKrEcaWfu1wgb8J1hVsgREg7FFiecWwK/PhO8X0kyc+0bIcKNtD4sqxIdNoRy6/p/TvECEA== dependencies: "@types/estree" "^1.0.0" @@ -3985,7 +4446,7 @@ estree-util-value-to-estree@^3.0.1: estree-util-visit@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/estree-util-visit/-/estree-util-visit-2.0.0.tgz#13a9a9f40ff50ed0c022f831ddf4b58d05446feb" + resolved "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz" integrity sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww== dependencies: "@types/estree-jsx" "^1.0.0" @@ -3993,47 +4454,52 @@ estree-util-visit@^2.0.0: estree-walker@^3.0.0: version "3.0.3" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz" integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== dependencies: "@types/estree" "^1.0.0" esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== eta@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/eta/-/eta-2.2.0.tgz#eb8b5f8c4e8b6306561a455e62cd7492fe3a9b8a" + resolved "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz" integrity sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g== etag@~1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== eval@^0.1.8: version "0.1.8" - resolved "https://registry.yarnpkg.com/eval/-/eval-0.1.8.tgz#2b903473b8cc1d1989b83a1e7923f883eb357f85" + resolved "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz" integrity sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw== dependencies: "@types/node" "*" require-like ">= 0.1.1" -eventemitter3@^4.0.0, eventemitter3@^4.0.7: +eventemitter3@^4.0.0: version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + events@^3.2.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== execa@^5.0.0: version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: cross-spawn "^7.0.3" @@ -4048,7 +4514,7 @@ execa@^5.0.0: express@^4.17.3: version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== dependencies: accepts "~1.3.8" @@ -4085,24 +4551,24 @@ express@^4.17.3: extend-shallow@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== dependencies: is-extendable "^0.1.0" extend@^3.0.0: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.2.11, fast-glob@^3.2.9, fast-glob@^3.3.0: version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -4113,52 +4579,64 @@ fast-glob@^3.2.11, fast-glob@^3.2.9, fast-glob@^3.3.0: fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + fast-safe-stringify@^2.0.7: version "2.1.1" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + resolved "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== fast-url-parser@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" + resolved "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz" integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== dependencies: punycode "^1.3.2" fastq@^1.6.0: version "1.16.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.16.0.tgz#83b9a9375692db77a822df081edb6a9cf6839320" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz" integrity sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA== dependencies: reusify "^1.0.4" fault@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/fault/-/fault-2.0.1.tgz#d47ca9f37ca26e4bd38374a7c500b5a384755b6c" + resolved "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz" integrity sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ== dependencies: format "^0.2.0" faye-websocket@^0.11.3: version "0.11.4" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz" integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== dependencies: websocket-driver ">=0.5.1" feed@^4.2.2: version "4.2.2" - resolved "https://registry.yarnpkg.com/feed/-/feed-4.2.2.tgz#865783ef6ed12579e2c44bbef3c9113bc4956a7e" + resolved "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz" integrity sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ== dependencies: xml-js "^1.6.11" -file-loader@^6.2.0: +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-loader@*, file-loader@^6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz" integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== dependencies: loader-utils "^2.0.0" @@ -4166,19 +4644,19 @@ file-loader@^6.2.0: filesize@^8.0.6: version "8.0.7" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" + resolved "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz" integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" finalhandler@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz" integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== dependencies: debug "2.6.9" @@ -4191,7 +4669,7 @@ finalhandler@1.2.0: find-cache-dir@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-4.0.0.tgz#a30ee0448f81a3990708f6453633c733e2f6eec2" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz" integrity sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg== dependencies: common-path-prefix "^3.0.0" @@ -4199,14 +4677,14 @@ find-cache-dir@^4.0.0: find-up@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== dependencies: locate-path "^3.0.0" find-up@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -4214,30 +4692,51 @@ find-up@^5.0.0: find-up@^6.3.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + resolved "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz" integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== dependencies: locate-path "^7.1.0" path-exists "^5.0.0" +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + flat@^5.0.2: version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + follow-redirects@^1.0.0: version "1.15.3" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz" integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + foreach@^2.0.4: version "2.0.6" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.6.tgz#87bcc8a1a0e74000ff2bf9802110708cfb02eb6e" + resolved "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz" integrity sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg== fork-ts-checker-webpack-plugin@^6.5.0: version "6.5.3" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz#eda2eff6e22476a2688d10661688c47f611b37f3" + resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz" integrity sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ== dependencies: "@babel/code-frame" "^7.8.3" @@ -4256,32 +4755,32 @@ fork-ts-checker-webpack-plugin@^6.5.0: form-data-encoder@^2.1.2: version "2.1.4" - resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" + resolved "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz" integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== format@^0.2.0: version "0.2.2" - resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" + resolved "https://registry.npmjs.org/format/-/format-0.2.2.tgz" integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== forwarded@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fraction.js@^4.3.6: version "4.3.7" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== fresh@0.5.2: version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== fs-extra@^11.1.1: version "11.2.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz" integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== dependencies: graceful-fs "^4.2.0" @@ -4290,7 +4789,7 @@ fs-extra@^11.1.1: fs-extra@^9.0.0: version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: at-least-node "^1.0.0" @@ -4300,39 +4799,50 @@ fs-extra@^9.0.0: fs-monkey@^1.0.4: version "1.0.5" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.5.tgz#fe450175f0db0d7ea758102e1d84096acb925788" + resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz" integrity sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew== fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== +function.prototype.name@^1.1.2, function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" - integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== dependencies: + es-errors "^1.3.0" function-bind "^1.1.2" has-proto "^1.0.1" has-symbols "^1.0.3" @@ -4340,41 +4850,57 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@ get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" - resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== get-stream@^6.0.0, get-stream@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== + dependencies: + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + github-slugger@^1.5.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.5.0.tgz#17891bbc73232051474d68bd867a34625c955f7d" + resolved "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz" integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-parent@^6.0.1: version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" glob-to-regexp@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -4386,21 +4912,21 @@ glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: global-dirs@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" + resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz" integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== dependencies: ini "2.0.0" global-modules@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== dependencies: global-prefix "^3.0.0" global-prefix@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz" integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== dependencies: ini "^1.3.5" @@ -4409,12 +4935,27 @@ global-prefix@^3.0.0: globals@^11.1.0: version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" @@ -4426,7 +4967,7 @@ globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: globby@^13.1.1: version "13.2.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" + resolved "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz" integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== dependencies: dir-glob "^3.0.1" @@ -4437,14 +4978,14 @@ globby@^13.1.1: gopd@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: get-intrinsic "^1.1.3" got@^12.1.0: version "12.6.1" - resolved "https://registry.yarnpkg.com/got/-/got-12.6.1.tgz#8869560d1383353204b5a9435f782df9c091f549" + resolved "https://registry.npmjs.org/got/-/got-12.6.1.tgz" integrity sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ== dependencies: "@sindresorhus/is" "^5.2.0" @@ -4459,19 +5000,24 @@ got@^12.1.0: p-cancelable "^3.0.0" responselike "^3.0.0" -graceful-fs@4.2.10: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== +graceful-fs@4.2.10: + version "4.2.10" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + gray-matter@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" + resolved "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz" integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== dependencies: js-yaml "^3.13.1" @@ -4481,58 +5027,75 @@ gray-matter@^4.0.3: gzip-size@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + resolved "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz" integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== dependencies: duplexer "^0.1.2" handle-thing@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" - integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: - get-intrinsic "^1.2.2" + es-define-property "^1.0.0" -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== -has-symbols@^1.0.3: +has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + has-yarn@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-3.0.0.tgz#c3c21e559730d1d3b57e28af1f30d06fac38147d" + resolved "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz" integrity sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA== -hasown@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" - integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== +has@^1.0.3, has@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/has/-/has-1.0.4.tgz" + integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== + +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" hast-util-from-parse5@^8.0.0: version "8.0.1" - resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz#654a5676a41211e14ee80d1b1758c399a0327651" + resolved "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz" integrity sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ== dependencies: "@types/hast" "^3.0.0" @@ -4546,14 +5109,14 @@ hast-util-from-parse5@^8.0.0: hast-util-parse-selector@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz#352879fa86e25616036037dd8931fb5f34cb4a27" + resolved "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz" integrity sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A== dependencies: "@types/hast" "^3.0.0" hast-util-raw@^9.0.0: version "9.0.1" - resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-9.0.1.tgz#2ba8510e4ed2a1e541cde2a4ebb5c38ab4c82c2d" + resolved "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.1.tgz" integrity sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA== dependencies: "@types/hast" "^3.0.0" @@ -4572,7 +5135,7 @@ hast-util-raw@^9.0.0: hast-util-to-estree@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz#f2afe5e869ddf0cf690c75f9fc699f3180b51b19" + resolved "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz" integrity sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw== dependencies: "@types/estree" "^1.0.0" @@ -4594,7 +5157,7 @@ hast-util-to-estree@^3.0.0: hast-util-to-jsx-runtime@^2.0.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz#3ed27caf8dc175080117706bf7269404a0aa4f7c" + resolved "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz" integrity sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ== dependencies: "@types/estree" "^1.0.0" @@ -4615,7 +5178,7 @@ hast-util-to-jsx-runtime@^2.0.0: hast-util-to-parse5@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz#477cd42d278d4f036bc2ea58586130f6f39ee6ed" + resolved "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz" integrity sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw== dependencies: "@types/hast" "^3.0.0" @@ -4628,14 +5191,14 @@ hast-util-to-parse5@^8.0.0: hast-util-whitespace@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" + resolved "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz" integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== dependencies: "@types/hast" "^3.0.0" hastscript@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-8.0.0.tgz#4ef795ec8dee867101b9f23cc830d4baf4fd781a" + resolved "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz" integrity sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw== dependencies: "@types/hast" "^3.0.0" @@ -4646,12 +5209,12 @@ hastscript@^8.0.0: he@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== history@^4.9.0: version "4.10.1" - resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" + resolved "https://registry.npmjs.org/history/-/history-4.10.1.tgz" integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== dependencies: "@babel/runtime" "^7.1.2" @@ -4663,14 +5226,14 @@ history@^4.9.0: hoist-non-react-statics@^3.1.0: version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== dependencies: react-is "^16.7.0" hpack.js@^2.1.6: version "2.1.6" - resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz" integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== dependencies: inherits "^2.0.1" @@ -4678,19 +5241,27 @@ hpack.js@^2.1.6: readable-stream "^2.0.1" wbuf "^1.1.0" +html-element-map@^1.2.0: + version "1.3.1" + resolved "https://registry.npmjs.org/html-element-map/-/html-element-map-1.3.1.tgz" + integrity sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg== + dependencies: + array.prototype.filter "^1.0.0" + call-bind "^1.0.2" + html-entities@^2.3.2: version "2.4.0" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" + resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz" integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== html-escaper@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== html-minifier-terser@^6.0.2: version "6.1.0" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" + resolved "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== dependencies: camel-case "^4.1.2" @@ -4703,7 +5274,7 @@ html-minifier-terser@^6.0.2: html-minifier-terser@^7.2.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz#18752e23a2f0ed4b0f550f217bb41693e975b942" + resolved "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz" integrity sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA== dependencies: camel-case "^4.1.2" @@ -4716,17 +5287,17 @@ html-minifier-terser@^7.2.0: html-tags@^3.3.1: version "3.3.1" - resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce" + resolved "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz" integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== html-void-elements@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" + resolved "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz" integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== html-webpack-plugin@^5.5.3: version "5.6.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz#50a8fa6709245608cb00e811eacecb8e0d7b7ea0" + resolved "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz" integrity sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw== dependencies: "@types/html-minifier-terser" "^6.0.0" @@ -4737,7 +5308,7 @@ html-webpack-plugin@^5.5.3: htmlparser2@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz" integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== dependencies: domelementtype "^2.0.1" @@ -4747,7 +5318,7 @@ htmlparser2@^6.1.0: htmlparser2@^8.0.1: version "8.0.2" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz" integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== dependencies: domelementtype "^2.3.0" @@ -4757,17 +5328,27 @@ htmlparser2@^8.0.1: http-cache-semantics@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== http-deceiver@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + http-errors@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: depd "2.0.0" @@ -4776,24 +5357,14 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - http-parser-js@>=0.5.1: version "0.5.8" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== http-proxy-middleware@^2.0.3: version "2.0.6" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== dependencies: "@types/http-proxy" "^1.17.8" @@ -4804,7 +5375,7 @@ http-proxy-middleware@^2.0.3: http-proxy@^1.18.1: version "1.18.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== dependencies: eventemitter3 "^4.0.0" @@ -4813,54 +5384,62 @@ http-proxy@^1.18.1: http2-client@^1.2.5: version "1.3.5" - resolved "https://registry.yarnpkg.com/http2-client/-/http2-client-1.3.5.tgz#20c9dc909e3cc98284dd20af2432c524086df181" + resolved "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz" integrity sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA== http2-wrapper@^2.1.10: version "2.2.1" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz#310968153dcdedb160d8b72114363ef5fce1f64a" + resolved "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz" integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== dependencies: quick-lru "^5.1.1" resolve-alpn "^1.2.0" +https-proxy-agent@^7.0.4: + version "7.0.5" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz" + integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== + dependencies: + agent-base "^7.0.2" + debug "4" + human-signals@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== iconv-lite@0.4.24: version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" icss-utils@^5.0.0, icss-utils@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== ignore@^5.2.0, ignore@^5.2.4: version "5.3.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz" integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== image-size@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.1.0.tgz#e0458a7957b1230ec3916ae2cac7273345a93a86" - integrity sha512-asnTHw2K8OlqT5kVnQwX+AGKQqpvLo95LbNzQ/C0ln3yzentZmAdd0ygoD004VC4Kkd4PV7J2iaPQkqwp9yuTw== + version "1.0.2" + resolved "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz" + integrity sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg== dependencies: queue "6.0.2" immer@^9.0.7: version "9.0.21" - resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" + resolved "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz" integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" @@ -4868,282 +5447,398 @@ import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: import-lazy@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" + resolved "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz" integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== infima@0.2.0-alpha.43: version "0.2.0-alpha.43" - resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.43.tgz#f7aa1d7b30b6c08afef441c726bac6150228cbe0" + resolved "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz" integrity sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: +inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@2, inherits@2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inherits@2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== -ini@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" - integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== - ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +ini@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + inline-style-parser@0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz" integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== inline-style-parser@0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.2.2.tgz#d498b4e6de0373458fc610ff793f6b14ebf45633" + resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.2.tgz" integrity sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ== +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" + interpret@^1.0.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== invariant@^2.2.4: version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - ipaddr.js@^2.0.1: version "2.1.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz" integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + is-alphabetical@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" + resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz" integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== is-alphanumerical@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875" + resolved "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz" integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== dependencies: is-alphabetical "^2.0.0" is-decimal "^2.0.0" +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" +is-boolean-object@^1.0.1, is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.1.5, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + is-ci@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + resolved "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz" integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== dependencies: ci-info "^3.2.0" is-core-module@^2.13.0: version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz" integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: hasown "^2.0.0" +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + is-decimal@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" + resolved "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz" integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== is-extendable@^0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-hexadecimal@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" + resolved "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz" integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== is-installed-globally@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + resolved "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz" integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== dependencies: global-dirs "^3.0.0" is-path-inside "^3.0.2" +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + is-npm@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-6.0.0.tgz#b59e75e8915543ca5d881ecff864077cba095261" + resolved "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz" integrity sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ== +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-obj@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== is-obj@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== is-path-cwd@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + resolved "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz" integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== -is-path-inside@^3.0.2: +is-path-inside@^3.0.2, is-path-inside@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== is-plain-obj@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz" integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== is-plain-obj@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz" integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== is-plain-object@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" is-plain-object@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== is-reference@^3.0.0: version "3.0.2" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-3.0.2.tgz#154747a01f45cd962404ee89d43837af2cba247c" + resolved "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz" integrity sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg== dependencies: "@types/estree" "*" +is-regex@^1.0.5, is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-regexp@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz" integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== is-root@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + resolved "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz" integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + dependencies: + call-bind "^1.0.7" + is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-subset@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz" + integrity sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw== + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + is-typedarray@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + is-wsl@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== dependencies: is-docker "^2.0.0" is-yarn-global@^0.4.0: version "0.4.1" - resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.4.1.tgz#b312d902b313f81e4eaf98b6361ba2b45cd694bb" + resolved "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz" integrity sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ== -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== isarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isobject@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== jest-util@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz" integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== dependencies: "@jest/types" "^29.6.3" @@ -5155,7 +5850,7 @@ jest-util@^29.7.0: jest-worker@^27.4.5: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== dependencies: "@types/node" "*" @@ -5164,7 +5859,7 @@ jest-worker@^27.4.5: jest-worker@^29.1.2: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz" integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== dependencies: "@types/node" "*" @@ -5172,14 +5867,14 @@ jest-worker@^29.1.2: merge-stream "^2.0.0" supports-color "^8.0.0" -jiti@^1.20.0: +jiti@^1.18.2, jiti@^1.20.0: version "1.21.0" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz" integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== joi@^17.9.2: version "17.11.0" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.11.0.tgz#aa9da753578ec7720e6f0ca2c7046996ed04fc1a" + resolved "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz" integrity sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ== dependencies: "@hapi/hoek" "^9.0.0" @@ -5190,17 +5885,17 @@ joi@^17.9.2: js-levenshtein@^1.1.6: version "1.1.6" - resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + resolved "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz" integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" @@ -5208,56 +5903,61 @@ js-yaml@^3.13.1: js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" jsesc@^2.5.1: version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== jsesc@~0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== json-buffer@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== -json-pointer@0.6.2, json-pointer@^0.6.2: +json-pointer@^0.6.2, json-pointer@0.6.2: version "0.6.2" - resolved "https://registry.yarnpkg.com/json-pointer/-/json-pointer-0.6.2.tgz#f97bd7550be5e9ea901f8c9264c9d436a22a93cd" + resolved "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz" integrity sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw== dependencies: foreach "^2.0.4" json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema-traverse@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + json5@^2.1.2, json5@^2.2.3: version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonfile@^6.0.1: version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: universalify "^2.0.0" @@ -5266,31 +5966,31 @@ jsonfile@^6.0.1: keyv@^4.5.3: version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== kleur@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== latest-version@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-7.0.0.tgz#843201591ea81a4d404932eeb61240fe04e9e5da" + resolved "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz" integrity sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg== dependencies: package-json "^8.1.0" launch-editor@^2.6.0: version "2.6.1" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.1.tgz#f259c9ef95cbc9425620bbbd14b468fcdb4ffe3c" + resolved "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz" integrity sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw== dependencies: picocolors "^1.0.0" @@ -5298,27 +5998,35 @@ launch-editor@^2.6.0: leven@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + lilconfig@^2.0.3: version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== loader-runner@^4.2.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== loader-utils@^2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz" integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" @@ -5327,12 +6035,12 @@ loader-utils@^2.0.0: loader-utils@^3.2.0: version "3.2.1" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz" integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== locate-path@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== dependencies: p-locate "^3.0.0" @@ -5340,109 +6048,124 @@ locate-path@^3.0.0: locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" locate-path@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz" integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== dependencies: p-locate "^6.0.0" lodash.debounce@^4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.escape@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz" + integrity sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw== + +lodash.flattendeep@^4.4.0: + version "4.4.0" + resolved "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz" + integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ== + lodash.isequal@^4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz" integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== lodash.memoize@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + lodash.uniq@^4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== lodash@^4.17.20, lodash@^4.17.21: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== longest-streak@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" + resolved "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz" integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" lower-case@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== dependencies: tslib "^2.0.3" lowercase-keys@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" + resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz" integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" lunr@^2.3.9: version "2.3.9" - resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" + resolved "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz" integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== mark.js@^8.11.1: version "8.11.1" - resolved "https://registry.yarnpkg.com/mark.js/-/mark.js-8.11.1.tgz#180f1f9ebef8b0e638e4166ad52db879beb2ffc5" + resolved "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz" integrity sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ== markdown-extensions@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/markdown-extensions/-/markdown-extensions-2.0.0.tgz#34bebc83e9938cae16e0e017e4a9814a8330d3c4" + resolved "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz" integrity sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q== markdown-table@^3.0.0: version "3.0.3" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.3.tgz#e6331d30e493127e031dd385488b5bd326e4a6bd" + resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz" integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== -marked@^4.0.15: +marked@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" + resolved "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz" integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== mdast-util-directive@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz#3fb1764e705bbdf0afb0d3f889e4404c3e82561f" + resolved "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz" integrity sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q== dependencies: "@types/mdast" "^4.0.0" @@ -5456,7 +6179,7 @@ mdast-util-directive@^3.0.0: mdast-util-find-and-replace@^3.0.0, mdast-util-find-and-replace@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz#a6fc7b62f0994e973490e45262e4bc07607b04e0" + resolved "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz" integrity sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA== dependencies: "@types/mdast" "^4.0.0" @@ -5466,7 +6189,7 @@ mdast-util-find-and-replace@^3.0.0, mdast-util-find-and-replace@^3.0.1: mdast-util-from-markdown@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz#52f14815ec291ed061f2922fd14d6689c810cb88" + resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz" integrity sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA== dependencies: "@types/mdast" "^4.0.0" @@ -5484,7 +6207,7 @@ mdast-util-from-markdown@^2.0.0: mdast-util-frontmatter@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz#f5f929eb1eb36c8a7737475c7eb438261f964ee8" + resolved "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz" integrity sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA== dependencies: "@types/mdast" "^4.0.0" @@ -5496,7 +6219,7 @@ mdast-util-frontmatter@^2.0.0: mdast-util-gfm-autolink-literal@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz#5baf35407421310a08e68c15e5d8821e8898ba2a" + resolved "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz" integrity sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg== dependencies: "@types/mdast" "^4.0.0" @@ -5507,7 +6230,7 @@ mdast-util-gfm-autolink-literal@^2.0.0: mdast-util-gfm-footnote@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz#25a1753c7d16db8bfd53cd84fe50562bd1e6d6a9" + resolved "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz" integrity sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ== dependencies: "@types/mdast" "^4.0.0" @@ -5518,7 +6241,7 @@ mdast-util-gfm-footnote@^2.0.0: mdast-util-gfm-strikethrough@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz#d44ef9e8ed283ac8c1165ab0d0dfd058c2764c16" + resolved "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz" integrity sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg== dependencies: "@types/mdast" "^4.0.0" @@ -5527,7 +6250,7 @@ mdast-util-gfm-strikethrough@^2.0.0: mdast-util-gfm-table@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz#7a435fb6223a72b0862b33afbd712b6dae878d38" + resolved "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz" integrity sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg== dependencies: "@types/mdast" "^4.0.0" @@ -5538,7 +6261,7 @@ mdast-util-gfm-table@^2.0.0: mdast-util-gfm-task-list-item@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz#e68095d2f8a4303ef24094ab642e1047b991a936" + resolved "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz" integrity sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ== dependencies: "@types/mdast" "^4.0.0" @@ -5548,7 +6271,7 @@ mdast-util-gfm-task-list-item@^2.0.0: mdast-util-gfm@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz#3f2aecc879785c3cb6a81ff3a243dc11eca61095" + resolved "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz" integrity sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw== dependencies: mdast-util-from-markdown "^2.0.0" @@ -5561,7 +6284,7 @@ mdast-util-gfm@^3.0.0: mdast-util-mdx-expression@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz#4968b73724d320a379110d853e943a501bfd9d87" + resolved "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz" integrity sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw== dependencies: "@types/estree-jsx" "^1.0.0" @@ -5573,7 +6296,7 @@ mdast-util-mdx-expression@^2.0.0: mdast-util-mdx-jsx@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.0.0.tgz#f73631fa5bb7a36712ff1e9cedec0cafed03401c" + resolved "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.0.0.tgz" integrity sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA== dependencies: "@types/estree-jsx" "^1.0.0" @@ -5592,7 +6315,7 @@ mdast-util-mdx-jsx@^3.0.0: mdast-util-mdx@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz#792f9cf0361b46bee1fdf1ef36beac424a099c41" + resolved "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz" integrity sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w== dependencies: mdast-util-from-markdown "^2.0.0" @@ -5603,7 +6326,7 @@ mdast-util-mdx@^3.0.0: mdast-util-mdxjs-esm@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz#019cfbe757ad62dd557db35a695e7314bcc9fa97" + resolved "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz" integrity sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg== dependencies: "@types/estree-jsx" "^1.0.0" @@ -5615,7 +6338,7 @@ mdast-util-mdxjs-esm@^2.0.0: mdast-util-phrasing@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-4.0.0.tgz#468cbbb277375523de807248b8ad969feb02a5c7" + resolved "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.0.0.tgz" integrity sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA== dependencies: "@types/mdast" "^4.0.0" @@ -5623,7 +6346,7 @@ mdast-util-phrasing@^4.0.0: mdast-util-to-hast@^13.0.0: version "13.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz#74c0a9f014bb2340cae6118f6fccd75467792be7" + resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz" integrity sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og== dependencies: "@types/hast" "^3.0.0" @@ -5637,7 +6360,7 @@ mdast-util-to-hast@^13.0.0: mdast-util-to-markdown@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz#9813f1d6e0cdaac7c244ec8c6dabfdb2102ea2b4" + resolved "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz" integrity sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ== dependencies: "@types/mdast" "^4.0.0" @@ -5651,51 +6374,51 @@ mdast-util-to-markdown@^2.0.0: mdast-util-to-string@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz#7a5121475556a04e7eddeb67b264aae79d312814" + resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz" integrity sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg== dependencies: "@types/mdast" "^4.0.0" mdn-data@2.0.14: version "2.0.14" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz" integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== media-typer@0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== memfs@^3.1.2, memfs@^3.4.3: - version "3.6.0" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" - integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== + version "3.5.3" + resolved "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz" + integrity sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw== dependencies: fs-monkey "^1.0.4" merge-descriptors@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== methods@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== micromark-core-commonmark@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz#50740201f0ee78c12a675bf3e68ffebc0bf931a3" + resolved "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz" integrity sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA== dependencies: decode-named-character-reference "^1.0.0" @@ -5717,7 +6440,7 @@ micromark-core-commonmark@^2.0.0: micromark-extension-directive@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-directive/-/micromark-extension-directive-3.0.0.tgz#527869de497a6de9024138479091bc885dae076b" + resolved "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.0.tgz" integrity sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg== dependencies: devlop "^1.0.0" @@ -5730,7 +6453,7 @@ micromark-extension-directive@^3.0.0: micromark-extension-frontmatter@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz#651c52ffa5d7a8eeed687c513cd869885882d67a" + resolved "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz" integrity sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg== dependencies: fault "^2.0.0" @@ -5740,7 +6463,7 @@ micromark-extension-frontmatter@^2.0.0: micromark-extension-gfm-autolink-literal@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz#f1e50b42e67d441528f39a67133eddde2bbabfd9" + resolved "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz" integrity sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg== dependencies: micromark-util-character "^2.0.0" @@ -5750,7 +6473,7 @@ micromark-extension-gfm-autolink-literal@^2.0.0: micromark-extension-gfm-footnote@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz#91afad310065a94b636ab1e9dab2c60d1aab953c" + resolved "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz" integrity sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg== dependencies: devlop "^1.0.0" @@ -5764,7 +6487,7 @@ micromark-extension-gfm-footnote@^2.0.0: micromark-extension-gfm-strikethrough@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz#6917db8e320da70e39ffbf97abdbff83e6783e61" + resolved "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz" integrity sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw== dependencies: devlop "^1.0.0" @@ -5776,7 +6499,7 @@ micromark-extension-gfm-strikethrough@^2.0.0: micromark-extension-gfm-table@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz#2cf3fe352d9e089b7ef5fff003bdfe0da29649b7" + resolved "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz" integrity sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw== dependencies: devlop "^1.0.0" @@ -5787,14 +6510,14 @@ micromark-extension-gfm-table@^2.0.0: micromark-extension-gfm-tagfilter@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz#f26d8a7807b5985fba13cf61465b58ca5ff7dc57" + resolved "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz" integrity sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg== dependencies: micromark-util-types "^2.0.0" micromark-extension-gfm-task-list-item@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz#ee8b208f1ced1eb9fb11c19a23666e59d86d4838" + resolved "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz" integrity sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw== dependencies: devlop "^1.0.0" @@ -5805,7 +6528,7 @@ micromark-extension-gfm-task-list-item@^2.0.0: micromark-extension-gfm@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz#3e13376ab95dd7a5cfd0e29560dfe999657b3c5b" + resolved "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz" integrity sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w== dependencies: micromark-extension-gfm-autolink-literal "^2.0.0" @@ -5819,7 +6542,7 @@ micromark-extension-gfm@^3.0.0: micromark-extension-mdx-expression@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz#1407b9ce69916cf5e03a196ad9586889df25302a" + resolved "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz" integrity sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ== dependencies: "@types/estree" "^1.0.0" @@ -5833,7 +6556,7 @@ micromark-extension-mdx-expression@^3.0.0: micromark-extension-mdx-jsx@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz#4aba0797c25efb2366a3fd2d367c6b1c1159f4f5" + resolved "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz" integrity sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w== dependencies: "@types/acorn" "^4.0.0" @@ -5849,14 +6572,14 @@ micromark-extension-mdx-jsx@^3.0.0: micromark-extension-mdx-md@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz#1d252881ea35d74698423ab44917e1f5b197b92d" + resolved "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz" integrity sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ== dependencies: micromark-util-types "^2.0.0" micromark-extension-mdxjs-esm@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz#de21b2b045fd2059bd00d36746081de38390d54a" + resolved "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz" integrity sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A== dependencies: "@types/estree" "^1.0.0" @@ -5871,7 +6594,7 @@ micromark-extension-mdxjs-esm@^3.0.0: micromark-extension-mdxjs@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz#b5a2e0ed449288f3f6f6c544358159557549de18" + resolved "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz" integrity sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ== dependencies: acorn "^8.0.0" @@ -5885,7 +6608,7 @@ micromark-extension-mdxjs@^3.0.0: micromark-factory-destination@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz#857c94debd2c873cba34e0445ab26b74f6a6ec07" + resolved "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz" integrity sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA== dependencies: micromark-util-character "^2.0.0" @@ -5894,7 +6617,7 @@ micromark-factory-destination@^2.0.0: micromark-factory-label@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz#17c5c2e66ce39ad6f4fc4cbf40d972f9096f726a" + resolved "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz" integrity sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw== dependencies: devlop "^1.0.0" @@ -5904,7 +6627,7 @@ micromark-factory-label@^2.0.0: micromark-factory-mdx-expression@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz#f2a9724ce174f1751173beb2c1f88062d3373b1b" + resolved "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz" integrity sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg== dependencies: "@types/estree" "^1.0.0" @@ -5918,7 +6641,7 @@ micromark-factory-mdx-expression@^2.0.0: micromark-factory-space@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz#c8f40b0640a0150751d3345ed885a080b0d15faf" + resolved "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz" integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== dependencies: micromark-util-character "^1.0.0" @@ -5926,7 +6649,7 @@ micromark-factory-space@^1.0.0: micromark-factory-space@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz#5e7afd5929c23b96566d0e1ae018ae4fcf81d030" + resolved "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz" integrity sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg== dependencies: micromark-util-character "^2.0.0" @@ -5934,7 +6657,7 @@ micromark-factory-space@^2.0.0: micromark-factory-title@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz#726140fc77892af524705d689e1cf06c8a83ea95" + resolved "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz" integrity sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A== dependencies: micromark-factory-space "^2.0.0" @@ -5944,7 +6667,7 @@ micromark-factory-title@^2.0.0: micromark-factory-whitespace@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz#9e92eb0f5468083381f923d9653632b3cfb5f763" + resolved "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz" integrity sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA== dependencies: micromark-factory-space "^2.0.0" @@ -5954,7 +6677,7 @@ micromark-factory-whitespace@^2.0.0: micromark-util-character@^1.0.0, micromark-util-character@^1.1.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.2.0.tgz#4fedaa3646db249bc58caeb000eb3549a8ca5dcc" + resolved "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz" integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg== dependencies: micromark-util-symbol "^1.0.0" @@ -5962,7 +6685,7 @@ micromark-util-character@^1.0.0, micromark-util-character@^1.1.0: micromark-util-character@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.0.1.tgz#52b824c2e2633b6fb33399d2ec78ee2a90d6b298" + resolved "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz" integrity sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw== dependencies: micromark-util-symbol "^2.0.0" @@ -5970,14 +6693,14 @@ micromark-util-character@^2.0.0: micromark-util-chunked@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz#e51f4db85fb203a79dbfef23fd41b2f03dc2ef89" + resolved "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz" integrity sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg== dependencies: micromark-util-symbol "^2.0.0" micromark-util-classify-character@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz#8c7537c20d0750b12df31f86e976d1d951165f34" + resolved "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz" integrity sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw== dependencies: micromark-util-character "^2.0.0" @@ -5986,7 +6709,7 @@ micromark-util-classify-character@^2.0.0: micromark-util-combine-extensions@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz#75d6ab65c58b7403616db8d6b31315013bfb7ee5" + resolved "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz" integrity sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ== dependencies: micromark-util-chunked "^2.0.0" @@ -5994,14 +6717,14 @@ micromark-util-combine-extensions@^2.0.0: micromark-util-decode-numeric-character-reference@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz#2698bbb38f2a9ba6310e359f99fcb2b35a0d2bd5" + resolved "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz" integrity sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ== dependencies: micromark-util-symbol "^2.0.0" micromark-util-decode-string@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz#7dfa3a63c45aecaa17824e656bcdb01f9737154a" + resolved "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz" integrity sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA== dependencies: decode-named-character-reference "^1.0.0" @@ -6011,12 +6734,12 @@ micromark-util-decode-string@^2.0.0: micromark-util-encode@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz#0921ac7953dc3f1fd281e3d1932decfdb9382ab1" + resolved "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz" integrity sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA== micromark-util-events-to-acorn@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz#4275834f5453c088bd29cd72dfbf80e3327cec07" + resolved "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz" integrity sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA== dependencies: "@types/acorn" "^4.0.0" @@ -6030,26 +6753,26 @@ micromark-util-events-to-acorn@^2.0.0: micromark-util-html-tag-name@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz#ae34b01cbe063363847670284c6255bb12138ec4" + resolved "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz" integrity sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw== micromark-util-normalize-identifier@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz#91f9a4e65fe66cc80c53b35b0254ad67aa431d8b" + resolved "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz" integrity sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w== dependencies: micromark-util-symbol "^2.0.0" micromark-util-resolve-all@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz#189656e7e1a53d0c86a38a652b284a252389f364" + resolved "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz" integrity sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA== dependencies: micromark-util-types "^2.0.0" micromark-util-sanitize-uri@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz#ec8fbf0258e9e6d8f13d9e4770f9be64342673de" + resolved "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz" integrity sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw== dependencies: micromark-util-character "^2.0.0" @@ -6058,7 +6781,7 @@ micromark-util-sanitize-uri@^2.0.0: micromark-util-subtokenize@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz#9f412442d77e0c5789ffdf42377fa8a2bcbdf581" + resolved "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz" integrity sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg== dependencies: devlop "^1.0.0" @@ -6068,27 +6791,27 @@ micromark-util-subtokenize@^2.0.0: micromark-util-symbol@^1.0.0, micromark-util-symbol@^1.0.1: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz#813cd17837bdb912d069a12ebe3a44b6f7063142" + resolved "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz" integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== micromark-util-symbol@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz#12225c8f95edf8b17254e47080ce0862d5db8044" + resolved "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz" integrity sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw== micromark-util-types@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" + resolved "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz" integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== micromark-util-types@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.0.tgz#63b4b7ffeb35d3ecf50d1ca20e68fc7caa36d95e" + resolved "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz" integrity sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w== micromark@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-4.0.0.tgz#84746a249ebd904d9658cfabc1e8e5f32cbc6249" + resolved "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz" integrity sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ== dependencies: "@types/debug" "^4.0.0" @@ -6111,150 +6834,198 @@ micromark@^4.0.0: micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: braces "^3.0.2" picomatch "^2.3.1" -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": +"mime-db@>= 1.43.0 < 2": version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-db@~1.33.0: version "1.33.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz" integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== -mime-types@2.1.18: +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.27: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime-types@^2.1.31: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime-types@~2.1.17, mime-types@2.1.18: version "2.1.18" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz" integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== dependencies: mime-db "~1.33.0" -mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@~2.1.24: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime-types@~2.1.34: version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" mime@1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== mimic-response@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== mimic-response@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-4.0.0.tgz#35468b19e7c75d10f5165ea25e75a5ceea7cf70f" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz" integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== mini-css-extract-plugin@^2.7.6: version "2.7.6" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz#282a3d38863fddcd2e0c220aaed5b90bc156564d" + resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz" integrity sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw== dependencies: schema-utils "^4.0.0" minimalistic-assert@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2, minimatch@3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimatch@^5.0.1: version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== dependencies: brace-expansion "^2.0.1" minimist@^1.2.0: version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -mobx-react-lite@^3.4.0: - version "3.4.3" - resolved "https://registry.yarnpkg.com/mobx-react-lite/-/mobx-react-lite-3.4.3.tgz#3a4c22c30bfaa8b1b2aa48d12b2ba811c0947ab7" - integrity sha512-NkJREyFTSUXR772Qaai51BnE1voWx56LOL80xG7qkZr6vo8vEaLF3sz1JNUVh+rxmUzxYaqOhfuxTfqUh0FXUg== +mobx-react-lite@^4.0.7: + version "4.0.7" + resolved "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-4.0.7.tgz" + integrity sha512-RjwdseshK9Mg8On5tyJZHtGD+J78ZnCnRaxeQDSiciKVQDUbfZcXhmld0VMxAwvcTnPEHZySGGewm467Fcpreg== + dependencies: + use-sync-external-store "^1.2.0" -mobx-react@^7.2.0: - version "7.6.0" - resolved "https://registry.yarnpkg.com/mobx-react/-/mobx-react-7.6.0.tgz#ebf0456728a9bd2e5c24fdcf9b36e285a222a7d6" - integrity sha512-+HQUNuh7AoQ9ZnU6c4rvbiVVl+wEkb9WqYsVDzGLng+Dqj1XntHu79PvEWKtSMoMj67vFp/ZPXcElosuJO8ckA== +mobx-react@^9.1.1: + version "9.1.1" + resolved "https://registry.npmjs.org/mobx-react/-/mobx-react-9.1.1.tgz" + integrity sha512-gVV7AdSrAAxqXOJ2bAbGa5TkPqvITSzaPiiEkzpW4rRsMhSec7C2NBCJYILADHKp2tzOAIETGRsIY0UaCV5aEw== dependencies: - mobx-react-lite "^3.4.0" + mobx-react-lite "^4.0.7" + +mobx@^6.0.4, mobx@^6.12.4, mobx@^6.9.0: + version "6.13.3" + resolved "https://registry.npmjs.org/mobx/-/mobx-6.13.3.tgz" + integrity sha512-YtAS+ZMbdpbHYUU4ESht3na8KiX11KuMT1yOiKtbKlQ0GZkHDYPKyEw/Tdp7h7aHyLrTWj2TBaSNJ6bCr638iQ== -mobx@^6.0.4: - version "6.12.0" - resolved "https://registry.yarnpkg.com/mobx/-/mobx-6.12.0.tgz#72b2685ca5af031aaa49e77a4d76ed67fcbf9135" - integrity sha512-Mn6CN6meXEnMa0a5u6a5+RKrqRedHBhZGd15AWLk9O6uFY4KYHzImdt8JI8WODo1bjTSRnwXhJox+FCUZhCKCQ== +moo@^0.5.0: + version "0.5.2" + resolved "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz" + integrity sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q== mrmime@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.0.tgz#151082a6e06e59a9a39b46b3e14d5cfe92b3abb4" + resolved "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz" integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== ms@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== ms@2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== multicast-dns@^7.2.5: version "7.2.5" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz" integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== dependencies: dns-packet "^5.2.2" thunky "^1.0.2" -nanoid@^3.3.6, nanoid@^3.3.7: +nanoid@^3.3.7: version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +nearley@^2.7.10: + version "2.20.1" + resolved "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz" + integrity sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ== + dependencies: + commander "^2.19.0" + moo "^0.5.0" + railroad-diagrams "^1.0.0" + randexp "0.4.6" + negotiator@0.6.3: version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== neo-async@^2.6.2: version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== no-case@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== dependencies: lower-case "^2.0.2" @@ -6262,7 +7033,7 @@ no-case@^3.0.4: node-emoji@^2.1.0: version "2.1.3" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-2.1.3.tgz#93cfabb5cc7c3653aa52f29d6ffb7927d8047c06" + resolved "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz" integrity sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA== dependencies: "@sindresorhus/is" "^4.6.0" @@ -6272,84 +7043,84 @@ node-emoji@^2.1.0: node-fetch-h2@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz#c6188325f9bd3d834020bf0f2d6dc17ced2241ac" + resolved "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz" integrity sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg== dependencies: http2-client "^1.2.5" node-fetch@^2.6.1: version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" node-forge@^1: version "1.3.1" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== node-readfiles@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/node-readfiles/-/node-readfiles-0.2.0.tgz#dbbd4af12134e2e635c245ef93ffcf6f60673a5d" + resolved "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz" integrity sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA== dependencies: es6-promise "^3.2.1" node-releases@^2.0.14: version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz" integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-range@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== normalize-url@^6.0.1: version "6.1.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== normalize-url@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.0.tgz#593dbd284f743e8dcf6a5ddf8fadff149c82701a" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz" integrity sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw== npm-run-path@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" nprogress@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" + resolved "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz" integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== nth-check@^2.0.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== dependencies: boolbase "^1.0.0" oas-kit-common@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/oas-kit-common/-/oas-kit-common-1.0.8.tgz#6d8cacf6e9097967a4c7ea8bcbcbd77018e1f535" + resolved "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz" integrity sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ== dependencies: fast-safe-stringify "^2.0.7" oas-linter@^3.2.2: version "3.2.2" - resolved "https://registry.yarnpkg.com/oas-linter/-/oas-linter-3.2.2.tgz#ab6a33736313490659035ca6802dc4b35d48aa1e" + resolved "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz" integrity sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ== dependencies: "@exodus/schemasafe" "^1.0.0-rc.2" @@ -6358,7 +7129,7 @@ oas-linter@^3.2.2: oas-resolver@^2.5.6: version "2.5.6" - resolved "https://registry.yarnpkg.com/oas-resolver/-/oas-resolver-2.5.6.tgz#10430569cb7daca56115c915e611ebc5515c561b" + resolved "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz" integrity sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ== dependencies: node-fetch-h2 "^2.3.0" @@ -6369,12 +7140,12 @@ oas-resolver@^2.5.6: oas-schema-walker@^1.1.5: version "1.1.5" - resolved "https://registry.yarnpkg.com/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz#74c3cd47b70ff8e0b19adada14455b5d3ac38a22" + resolved "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz" integrity sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ== oas-validator@^5.0.8: version "5.0.8" - resolved "https://registry.yarnpkg.com/oas-validator/-/oas-validator-5.0.8.tgz#387e90df7cafa2d3ffc83b5fb976052b87e73c28" + resolved "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz" integrity sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw== dependencies: call-me-maybe "^1.0.1" @@ -6388,22 +7159,30 @@ oas-validator@^5.0.8: object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.9.0: +object-inspect@^1.13.1, object-inspect@^1.7.0, object-inspect@^1.9.0: version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz" integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== +object-is@^1.0.2, object-is@^1.1.5: + version "1.1.6" + resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.0: +object.assign@^4.1.0, object.assign@^4.1.5: version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz" integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== dependencies: call-bind "^1.0.5" @@ -6411,116 +7190,146 @@ object.assign@^4.1.0: has-symbols "^1.0.3" object-keys "^1.1.1" +object.entries@^1.1.1: + version "1.1.8" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +object.values@^1.1.1: + version "1.2.0" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== on-finished@2.4.1: version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" on-headers@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== once@^1.3.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" onetime@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" open@^8.0.9, open@^8.4.0: version "8.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz" integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== dependencies: define-lazy-prop "^2.0.0" is-docker "^2.1.1" is-wsl "^2.2.0" -openapi-sampler@^1.3.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/openapi-sampler/-/openapi-sampler-1.4.0.tgz#c133cad6250481f2ec7e48b16eb70062adb514c0" - integrity sha512-3FKJQCHAMG9T7RsRy9u5Ft4ERPq1QQmn77C8T3OSofYL9uur59AqychvQ0YQKijrqRwIkAbzkh+nQnAE3gjMVA== +openapi-sampler@^1.5.0: + version "1.5.1" + resolved "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.5.1.tgz" + integrity sha512-tIWIrZUKNAsbqf3bd9U1oH6JEXo8LNYuDlXw26By67EygpjT+ArFnsxxyTMjFWRfbqo5ozkvgSQDK69Gd8CddA== dependencies: "@types/json-schema" "^7.0.7" json-pointer "0.6.2" opener@^1.5.2: version "1.5.2" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + p-cancelable@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" + resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz" integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== p-limit@^2.0.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" p-limit@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-limit@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz" integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== dependencies: yocto-queue "^1.0.0" p-locate@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== dependencies: p-limit "^2.0.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" p-locate@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz" integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== dependencies: p-limit "^4.0.0" p-map@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: aggregate-error "^3.0.0" p-retry@^4.5.0: version "4.6.2" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz" integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== dependencies: "@types/retry" "0.12.0" @@ -6528,12 +7337,12 @@ p-retry@^4.5.0: p-try@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== package-json@^8.1.0: version "8.1.1" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-8.1.1.tgz#3e9948e43df40d1e8e78a85485f1070bf8f03dc8" + resolved "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz" integrity sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA== dependencies: got "^12.1.0" @@ -6543,7 +7352,7 @@ package-json@^8.1.0: param-case@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz" integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== dependencies: dot-case "^3.0.4" @@ -6551,14 +7360,14 @@ param-case@^3.0.4: parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parse-entities@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.1.tgz#4e2a01111fb1c986549b944af39eeda258fc9e4e" + resolved "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz" integrity sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w== dependencies: "@types/unist" "^2.0.0" @@ -6572,7 +7381,7 @@ parse-entities@^4.0.0: parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -6582,12 +7391,12 @@ parse-json@^5.0.0, parse-json@^5.2.0: parse-numeric-range@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz#7c63b61190d61e4d53a1197f0c83c47bb670ffa3" + resolved "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz" integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== parse5-htmlparser2-tree-adapter@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" + resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz" integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== dependencies: domhandler "^5.0.2" @@ -6595,19 +7404,19 @@ parse5-htmlparser2-tree-adapter@^7.0.0: parse5@^7.0.0: version "7.1.2" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz" integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== dependencies: entities "^4.4.0" parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== pascal-case@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== dependencies: no-case "^3.0.4" @@ -6615,119 +7424,129 @@ pascal-case@^3.1.2: path-browserify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== path-exists@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-exists@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz" integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-is-inside@1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + resolved "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz" integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + path-to-regexp@0.1.7: version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== path-to-regexp@2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz" integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - path-type@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== perfect-scrollbar@^1.5.5: version "1.5.5" - resolved "https://registry.yarnpkg.com/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz#41a211a2fb52a7191eff301432134ea47052b27f" + resolved "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz" integrity sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g== +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + periscopic@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/periscopic/-/periscopic-3.1.0.tgz#7e9037bf51c5855bd33b48928828db4afa79d97a" + resolved "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz" integrity sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw== dependencies: "@types/estree" "^1.0.0" estree-walker "^3.0.0" is-reference "^3.0.0" -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.0.0, picocolors@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz" + integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pkg-dir@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-7.0.0.tgz#8f0c08d6df4476756c5ff29b3282d0bab7517d11" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz" integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA== dependencies: find-up "^6.3.0" pkg-up@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + resolved "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz" integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== dependencies: find-up "^3.0.0" pluralize@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + resolved "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== -polished@^4.1.3: +polished@^4.2.2: version "4.3.1" - resolved "https://registry.yarnpkg.com/polished/-/polished-4.3.1.tgz#5a00ae32715609f83d89f6f31d0f0261c6170548" + resolved "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz" integrity sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA== dependencies: "@babel/runtime" "^7.17.8" +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + postcss-calc@^8.2.3: version "8.2.4" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" + resolved "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz" integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== dependencies: postcss-selector-parser "^6.0.9" @@ -6735,7 +7554,7 @@ postcss-calc@^8.2.3: postcss-colormin@^5.3.1: version "5.3.1" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz#86c27c26ed6ba00d96c79e08f3ffb418d1d1988f" + resolved "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz" integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== dependencies: browserslist "^4.21.4" @@ -6745,7 +7564,7 @@ postcss-colormin@^5.3.1: postcss-convert-values@^5.1.3: version "5.1.3" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz#04998bb9ba6b65aa31035d669a6af342c5f9d393" + resolved "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz" integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== dependencies: browserslist "^4.21.4" @@ -6753,43 +7572,43 @@ postcss-convert-values@^5.1.3: postcss-discard-comments@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" + resolved "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz" integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== postcss-discard-duplicates@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" + resolved "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz" integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== postcss-discard-empty@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" + resolved "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz" integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== postcss-discard-overridden@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" + resolved "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz" integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== postcss-discard-unused@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz#8974e9b143d887677304e558c1166d3762501142" + resolved "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz" integrity sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw== dependencies: postcss-selector-parser "^6.0.5" postcss-loader@^7.3.3: - version "7.3.4" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.3.4.tgz#aed9b79ce4ed7e9e89e56199d25ad1ec8f606209" - integrity sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A== + version "7.3.3" + resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz" + integrity sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA== dependencies: - cosmiconfig "^8.3.5" - jiti "^1.20.0" - semver "^7.5.4" + cosmiconfig "^8.2.0" + jiti "^1.18.2" + semver "^7.3.8" postcss-merge-idents@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz#7753817c2e0b75d0853b56f78a89771e15ca04a1" + resolved "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz" integrity sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw== dependencies: cssnano-utils "^3.1.0" @@ -6797,7 +7616,7 @@ postcss-merge-idents@^5.1.1: postcss-merge-longhand@^5.1.7: version "5.1.7" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16" + resolved "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz" integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== dependencies: postcss-value-parser "^4.2.0" @@ -6805,7 +7624,7 @@ postcss-merge-longhand@^5.1.7: postcss-merge-rules@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz#2f26fa5cacb75b1402e213789f6766ae5e40313c" + resolved "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz" integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== dependencies: browserslist "^4.21.4" @@ -6815,14 +7634,14 @@ postcss-merge-rules@^5.1.4: postcss-minify-font-values@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" + resolved "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz" integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== dependencies: postcss-value-parser "^4.2.0" postcss-minify-gradients@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" + resolved "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz" integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== dependencies: colord "^2.9.1" @@ -6831,7 +7650,7 @@ postcss-minify-gradients@^5.1.1: postcss-minify-params@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz#c06a6c787128b3208b38c9364cfc40c8aa5d7352" + resolved "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz" integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== dependencies: browserslist "^4.21.4" @@ -6840,19 +7659,19 @@ postcss-minify-params@^5.1.4: postcss-minify-selectors@^5.2.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" + resolved "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz" integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== dependencies: postcss-selector-parser "^6.0.5" postcss-modules-extract-imports@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz" integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== postcss-modules-local-by-default@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" + resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz" integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== dependencies: icss-utils "^5.0.0" @@ -6861,61 +7680,61 @@ postcss-modules-local-by-default@^4.0.3: postcss-modules-scope@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.1.0.tgz#fbfddfda93a31f310f1d152c2bb4d3f3c5592ee0" + resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.0.tgz" integrity sha512-SaIbK8XW+MZbd0xHPf7kdfA/3eOt7vxJ72IRecn3EzuZVLr1r0orzf0MX/pN8m+NMDoo6X/SQd8oeKqGZd8PXg== dependencies: postcss-selector-parser "^6.0.4" postcss-modules-values@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== dependencies: icss-utils "^5.0.0" postcss-normalize-charset@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" + resolved "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz" integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== postcss-normalize-display-values@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" + resolved "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz" integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== dependencies: postcss-value-parser "^4.2.0" postcss-normalize-positions@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92" + resolved "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz" integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== dependencies: postcss-value-parser "^4.2.0" postcss-normalize-repeat-style@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2" + resolved "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz" integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== dependencies: postcss-value-parser "^4.2.0" postcss-normalize-string@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" + resolved "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz" integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== dependencies: postcss-value-parser "^4.2.0" postcss-normalize-timing-functions@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" + resolved "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz" integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== dependencies: postcss-value-parser "^4.2.0" postcss-normalize-unicode@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz#f67297fca3fea7f17e0d2caa40769afc487aa030" + resolved "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz" integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== dependencies: browserslist "^4.21.4" @@ -6923,7 +7742,7 @@ postcss-normalize-unicode@^5.1.1: postcss-normalize-url@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" + resolved "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz" integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== dependencies: normalize-url "^6.0.1" @@ -6931,29 +7750,34 @@ postcss-normalize-url@^5.1.0: postcss-normalize-whitespace@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" + resolved "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz" integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== dependencies: postcss-value-parser "^4.2.0" postcss-ordered-values@^5.1.3: version "5.1.3" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38" + resolved "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz" integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== dependencies: cssnano-utils "^3.1.0" postcss-value-parser "^4.2.0" +postcss-prefix-selector@^1.16.1: + version "1.16.1" + resolved "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.16.1.tgz" + integrity sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ== + postcss-reduce-idents@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz#c89c11336c432ac4b28792f24778859a67dfba95" + resolved "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz" integrity sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg== dependencies: postcss-value-parser "^4.2.0" postcss-reduce-initial@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz#798cd77b3e033eae7105c18c9d371d989e1382d6" + resolved "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz" integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== dependencies: browserslist "^4.21.4" @@ -6961,29 +7785,29 @@ postcss-reduce-initial@^5.1.2: postcss-reduce-transforms@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" + resolved "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz" integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== dependencies: postcss-value-parser "^4.2.0" postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: - version "6.0.15" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz#11cc2b21eebc0b99ea374ffb9887174855a01535" - integrity sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw== + version "6.0.14" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.14.tgz" + integrity sha512-65xXYsT40i9GyWzlHQ5ShZoK7JZdySeOozi/tz2EezDo6c04q6+ckYMeoY7idaie1qp2dT5KoYQ2yky6JuoHnA== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" postcss-sort-media-queries@^4.4.1: version "4.4.1" - resolved "https://registry.yarnpkg.com/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz#04a5a78db3921eb78f28a1a781a2e68e65258128" + resolved "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz" integrity sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw== dependencies: sort-css-media-queries "2.1.0" postcss-svgo@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" + resolved "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz" integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== dependencies: postcss-value-parser "^4.2.0" @@ -6991,42 +7815,47 @@ postcss-svgo@^5.1.0: postcss-unique-selectors@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" + resolved "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz" integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== dependencies: postcss-selector-parser "^6.0.5" postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== postcss-zindex@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-5.1.0.tgz#4a5c7e5ff1050bd4c01d95b1847dfdcc58a496ff" + resolved "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz" integrity sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A== -postcss@8.4.31: - version "8.4.31" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" - integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== +"postcss@^7.0.0 || ^8.0.1", postcss@^8.0.9, postcss@^8.1.0, postcss@^8.2.15, postcss@^8.2.2, postcss@^8.4.16, postcss@^8.4.17, postcss@^8.4.21, postcss@^8.4.26, "postcss@>4 <9", postcss@8.4.38: + version "8.4.38" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== dependencies: - nanoid "^3.3.6" + nanoid "^3.3.7" picocolors "^1.0.0" - source-map-js "^1.0.2" + source-map-js "^1.2.0" -postcss@^8.4.17, postcss@^8.4.21, postcss@^8.4.26: - version "8.4.32" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.32.tgz#1dac6ac51ab19adb21b8b34fd2d93a86440ef6c9" - integrity sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw== +postcss@^8.4.45: + version "8.4.47" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz" + integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ== dependencies: nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.0.2" + picocolors "^1.1.0" + source-map-js "^1.2.1" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== pretty-error@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" + resolved "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz" integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== dependencies: lodash "^4.17.20" @@ -7034,38 +7863,38 @@ pretty-error@^4.0.0: pretty-time@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" + resolved "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz" integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== prism-react-renderer@^2.3.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-2.3.1.tgz#e59e5450052ede17488f6bc85de1553f584ff8d5" + resolved "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.3.1.tgz" integrity sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw== dependencies: "@types/prismjs" "^1.26.0" clsx "^2.0.0" -prismjs@^1.27.0, prismjs@^1.29.0: +prismjs@^1.29.0: version "1.29.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" + resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz" integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== prompts@^2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.5.0, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.5.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: loose-envify "^1.4.0" @@ -7074,17 +7903,17 @@ prop-types@^15.5.0, prop-types@^15.6.2, prop-types@^15.7.2: property-information@^6.0.0: version "6.4.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.4.0.tgz#6bc4c618b0c2d68b3bb8b552cbb97f8e300a0f82" + resolved "https://registry.npmjs.org/property-information/-/property-information-6.4.0.tgz" integrity sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ== proto-list@~1.2.1: version "1.2.4" - resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + resolved "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz" integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== proxy-addr@~2.0.7: version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: forwarded "0.2.0" @@ -7092,65 +7921,90 @@ proxy-addr@~2.0.7: punycode@^1.3.2: version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== punycode@^2.1.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== pupa@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/pupa/-/pupa-3.1.0.tgz#f15610274376bbcc70c9a3aa8b505ea23f41c579" + resolved "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz" integrity sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug== dependencies: escape-goat "^4.0.0" qs@6.11.0: version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== queue@6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" + resolved "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz" integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== dependencies: inherits "~2.0.3" quick-lru@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== +raf@^3.4.1: + version "3.4.1" + resolved "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== + dependencies: + performance-now "^2.1.0" + +railroad-diagrams@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz" + integrity sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A== + +randexp@0.4.6: + version "0.4.6" + resolved "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz" + integrity sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ== + dependencies: + discontinuous-range "1.0.0" + ret "~0.1.10" + randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" -range-parser@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" - integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== +range-parser@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -range-parser@^1.2.1, range-parser@~1.2.1: +range-parser@~1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== +range-parser@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz" + integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== + raw-body@2.5.1: version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== dependencies: bytes "3.1.2" @@ -7160,7 +8014,7 @@ raw-body@2.5.1: raw-loader@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-4.0.2.tgz#1aac6b7d1ad1501e66efdac1522c73e59a584eb6" + resolved "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz" integrity sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA== dependencies: loader-utils "^2.0.0" @@ -7168,7 +8022,7 @@ raw-loader@^4.0.2: rc@1.2.8: version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: deep-extend "^0.6.0" @@ -7178,7 +8032,7 @@ rc@1.2.8: react-dev-utils@^12.0.1: version "12.0.1" - resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" + resolved "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz" integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== dependencies: "@babel/code-frame" "^7.16.0" @@ -7206,9 +8060,9 @@ react-dev-utils@^12.0.1: strip-ansi "^6.0.1" text-table "^0.2.0" -react-dom@^18.0.0: +react-dom@*, "react-dom@^16.6.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8.4 || ^17.0.0 || ^18.0.0", react-dom@^18.0.0, "react-dom@>= 16.8.0", "react-dom@>= 16.8.0 < 19.0.0", react-dom@>=18: version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== dependencies: loose-envify "^1.1.0" @@ -7216,26 +8070,17 @@ react-dom@^18.0.0: react-error-overlay@^6.0.11: version "6.0.11" - resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" + resolved "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz" integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== -react-fast-compare@^3.2.0, react-fast-compare@^3.2.2: +react-fast-compare@^3.2.0: version "3.2.2" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" + resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz" integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== -react-helmet-async@*: - version "2.0.4" - resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-2.0.4.tgz#50a4377778f380ed1d0136303916b38eff1bf153" - integrity sha512-yxjQMWposw+akRfvpl5+8xejl4JtUlHnEBcji6u8/e6oc7ozT+P9PNTWMhCbz2y9tc5zPegw2BvKjQA+NwdEjQ== - dependencies: - invariant "^2.2.4" - react-fast-compare "^3.2.2" - shallowequal "^1.1.0" - -react-helmet-async@^1.3.0: +react-helmet-async@*, react-helmet-async@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.3.0.tgz#7bd5bf8c5c69ea9f02f6083f14ce33ef545c222e" + resolved "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz" integrity sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg== dependencies: "@babel/runtime" "^7.12.5" @@ -7244,33 +8089,46 @@ react-helmet-async@^1.3.0: react-fast-compare "^3.2.0" shallowequal "^1.1.0" -react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: +"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-is@^18.2.0: + version "18.3.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== + react-json-view-lite@^1.2.0: version "1.2.1" - resolved "https://registry.yarnpkg.com/react-json-view-lite/-/react-json-view-lite-1.2.1.tgz#c59a0bea4ede394db331d482ee02e293d38f8218" + resolved "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.2.1.tgz" integrity sha512-Itc0g86fytOmKZoIoJyGgvNqohWSbh3NXIKNgH6W6FT9PC1ck4xas1tT3Rr/b3UlFXyA9Jjaw9QSXdZy2JwGMQ== react-loadable-ssr-addon-v5-slorber@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz#2cdc91e8a744ffdf9e3556caabeb6e4278689883" + resolved "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz" integrity sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A== dependencies: "@babel/runtime" "^7.10.3" +react-loadable@*, "react-loadable@npm:@docusaurus/react-loadable@5.5.2": + version "5.5.2" + resolved "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz" + integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== + dependencies: + "@types/react" "*" + prop-types "^15.6.2" + react-router-config@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/react-router-config/-/react-router-config-5.1.1.tgz#0f4263d1a80c6b2dc7b9c1902c9526478194a988" + resolved "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz" integrity sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg== dependencies: "@babel/runtime" "^7.1.2" react-router-dom@^5.3.4: version "5.3.4" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.4.tgz#2ed62ffd88cae6db134445f4a0c0ae8b91d2e5e6" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz" integrity sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ== dependencies: "@babel/runtime" "^7.12.13" @@ -7281,9 +8139,9 @@ react-router-dom@^5.3.4: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-router@5.3.4, react-router@^5.3.4: +react-router@^5.3.4, react-router@>=5, react-router@5.3.4: version "5.3.4" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.4.tgz#8ca252d70fcc37841e31473c7a151cf777887bb5" + resolved "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz" integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== dependencies: "@babel/runtime" "^7.12.13" @@ -7296,24 +8154,32 @@ react-router@5.3.4, react-router@^5.3.4: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-tabs@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/react-tabs/-/react-tabs-4.3.0.tgz#9f4db0fd209ba4ab2c1e78993ff964435f84af62" - integrity sha512-2GfoG+f41kiBIIyd3gF+/GRCCYtamC8/2zlAcD8cqQmqI9Q+YVz7fJLHMmU9pXDVYYHpJeCgUSBJju85vu5q8Q== +react-shallow-renderer@^16.15.0: + version "16.15.0" + resolved "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz" + integrity sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA== + dependencies: + object-assign "^4.1.1" + react-is "^16.12.0 || ^17.0.0 || ^18.0.0" + +react-tabs@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/react-tabs/-/react-tabs-6.0.2.tgz" + integrity sha512-aQXTKolnM28k3KguGDBSAbJvcowOQr23A+CUJdzJtOSDOtTwzEaJA+1U4KwhNL9+Obe+jFS7geuvA7ICQPXOnQ== dependencies: - clsx "^1.1.0" + clsx "^2.0.0" prop-types "^15.5.0" -react@^18.0.0: +react@*, "react@^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.13.1 || ^17.0.0 || ^18.0.0", "react@^16.6.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17 || ^18", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.4 || ^17.0.0 || ^18.0.0", react@^18.0.0, react@^18.2.0, "react@>= 16.8.0", "react@>= 16.8.0 < 19.0.0", react@>=15, react@>=16, react@>=16.0.0, react@>=18: version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== dependencies: loose-envify "^1.1.0" readable-stream@^2.0.1: version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" @@ -7326,7 +8192,7 @@ readable-stream@^2.0.1: readable-stream@^3.0.6: version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" @@ -7335,97 +8201,108 @@ readable-stream@^3.0.6: readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" reading-time@^1.5.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/reading-time/-/reading-time-1.5.0.tgz#d2a7f1b6057cb2e169beaf87113cc3411b5bc5bb" + resolved "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz" integrity sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg== rechoir@^0.6.2: version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== dependencies: resolve "^1.1.6" recursive-readdir@^2.2.2: version "2.2.3" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" + resolved "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz" integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== dependencies: minimatch "^3.0.5" -redoc@2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/redoc/-/redoc-2.1.3.tgz#612c9fed744993d5fc99cbf39fe9056bd1034fa5" - integrity sha512-d7F9qLLxaiFW4GC03VkwlX9wuRIpx9aiIIf3o6mzMnqPfhxrn2IRKGndrkJeVdItgCfmg9jXZiFEowm60f1meQ== +redoc@2.1.5: + version "2.1.5" + resolved "https://registry.npmjs.org/redoc/-/redoc-2.1.5.tgz" + integrity sha512-POSbVg+7WLf+/5/c6GWLxL7+9t2D+1WlZdLN0a6qaCQc+ih3XYzteRBkXEN5kjrYrRNjdspfxTZkDLN5WV3Tzg== dependencies: - "@redocly/openapi-core" "^1.0.0-rc.2" - classnames "^2.3.1" + "@cfaester/enzyme-adapter-react-18" "^0.8.0" + "@redocly/openapi-core" "^1.4.0" + classnames "^2.3.2" decko "^1.2.0" - dompurify "^2.2.8" - eventemitter3 "^4.0.7" + dompurify "^3.0.6" + eventemitter3 "^5.0.1" json-pointer "^0.6.2" lunr "^2.3.9" mark.js "^8.11.1" - marked "^4.0.15" - mobx-react "^7.2.0" - openapi-sampler "^1.3.1" + marked "^4.3.0" + mobx-react "^9.1.1" + openapi-sampler "^1.5.0" path-browserify "^1.0.1" perfect-scrollbar "^1.5.5" - polished "^4.1.3" - prismjs "^1.27.0" - prop-types "^15.7.2" - react-tabs "^4.3.0" + polished "^4.2.2" + prismjs "^1.29.0" + prop-types "^15.8.1" + react-tabs "^6.0.2" slugify "~1.4.7" stickyfill "^1.1.1" - swagger2openapi "^7.0.6" + swagger2openapi "^7.0.8" url-template "^2.0.8" redocusaurus@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/redocusaurus/-/redocusaurus-2.0.2.tgz#8e4d7b3a1e4d32f3be6cbc6d218d11957eb0474d" - integrity sha512-o71XY24IkqCWVUF39UpVbklvKilbI5LfqPPeD5yhuaME87agsIHpRNdvifdPIK0oAQog4RMjDM+qMRqKUB414A== + version "2.1.2" + resolved "https://registry.npmjs.org/redocusaurus/-/redocusaurus-2.1.2.tgz" + integrity sha512-PqMXxmjAyQ78zdI9W5lUI21a9N9bXDQYj5NuTcjG5xmyn63+KfqF+ugmqh7FbY3Fr9Sud14X6ZDoRGdwVtBDew== dependencies: - docusaurus-plugin-redoc "2.0.2" - docusaurus-theme-redoc "2.0.2" + docusaurus-plugin-redoc "2.1.1" + docusaurus-theme-redoc "2.1.2" reftools@^1.1.9: version "1.1.9" - resolved "https://registry.yarnpkg.com/reftools/-/reftools-1.1.9.tgz#e16e19f662ccd4648605312c06d34e5da3a2b77e" + resolved "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz" integrity sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w== regenerate-unicode-properties@^10.1.0: version "10.1.1" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz" integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== dependencies: regenerate "^1.4.2" regenerate@^1.4.2: version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.14.0: version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== regenerator-transform@^0.15.2: version "0.15.2" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz" integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== dependencies: "@babel/runtime" "^7.8.4" +regexp.prototype.flags@^1.5.2: + version "1.5.3" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz" + integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.2" + regexpu-core@^5.3.1: version "5.3.2" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz" integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== dependencies: "@babel/regjsgen" "^0.8.0" @@ -7437,28 +8314,28 @@ regexpu-core@^5.3.1: registry-auth-token@^5.0.1: version "5.0.2" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.2.tgz#8b026cc507c8552ebbe06724136267e63302f756" + resolved "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz" integrity sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ== dependencies: "@pnpm/npm-conf" "^2.1.0" registry-url@^6.0.0: version "6.0.1" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-6.0.1.tgz#056d9343680f2f64400032b1e199faa692286c58" + resolved "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz" integrity sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q== dependencies: rc "1.2.8" regjsparser@^0.9.1: version "0.9.1" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz" integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== dependencies: jsesc "~0.5.0" rehype-raw@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-7.0.0.tgz#59d7348fd5dbef3807bbaa1d443efd2dd85ecee4" + resolved "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz" integrity sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww== dependencies: "@types/hast" "^3.0.0" @@ -7467,12 +8344,12 @@ rehype-raw@^7.0.0: relateurl@^0.2.7: version "0.2.7" - resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz" integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== remark-directive@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/remark-directive/-/remark-directive-3.0.0.tgz#34452d951b37e6207d2e2a4f830dc33442923268" + resolved "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.0.tgz" integrity sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA== dependencies: "@types/mdast" "^4.0.0" @@ -7482,7 +8359,7 @@ remark-directive@^3.0.0: remark-emoji@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-4.0.1.tgz#671bfda668047689e26b2078c7356540da299f04" + resolved "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz" integrity sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg== dependencies: "@types/mdast" "^4.0.2" @@ -7493,7 +8370,7 @@ remark-emoji@^4.0.0: remark-frontmatter@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz#b68d61552a421ec412c76f4f66c344627dc187a2" + resolved "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz" integrity sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ== dependencies: "@types/mdast" "^4.0.0" @@ -7503,7 +8380,7 @@ remark-frontmatter@^5.0.0: remark-gfm@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-4.0.0.tgz#aea777f0744701aa288b67d28c43565c7e8c35de" + resolved "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz" integrity sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA== dependencies: "@types/mdast" "^4.0.0" @@ -7515,7 +8392,7 @@ remark-gfm@^4.0.0: remark-mdx@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-3.0.0.tgz#146905a3925b078970e05fc89b0e16b9cc3bfddd" + resolved "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.0.tgz" integrity sha512-O7yfjuC6ra3NHPbRVxfflafAj3LTwx3b73aBvkEFU5z4PsD6FD4vrqJAkE5iNGLz71GdjXfgRqm3SQ0h0VuE7g== dependencies: mdast-util-mdx "^3.0.0" @@ -7523,7 +8400,7 @@ remark-mdx@^3.0.0: remark-parse@^11.0.0: version "11.0.0" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-11.0.0.tgz#aa60743fcb37ebf6b069204eb4da304e40db45a1" + resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz" integrity sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA== dependencies: "@types/mdast" "^4.0.0" @@ -7533,7 +8410,7 @@ remark-parse@^11.0.0: remark-rehype@^11.0.0: version "11.0.0" - resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.0.0.tgz#7f21c08738bde024be5f16e4a8b13e5d7a04cf6b" + resolved "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.0.0.tgz" integrity sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw== dependencies: "@types/hast" "^3.0.0" @@ -7544,7 +8421,7 @@ remark-rehype@^11.0.0: remark-stringify@^11.0.0: version "11.0.0" - resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-11.0.0.tgz#4c5b01dd711c269df1aaae11743eb7e2e7636fd3" + resolved "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz" integrity sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw== dependencies: "@types/mdast" "^4.0.0" @@ -7553,7 +8430,7 @@ remark-stringify@^11.0.0: renderkid@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" + resolved "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz" integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== dependencies: css-select "^4.1.3" @@ -7564,42 +8441,42 @@ renderkid@^3.0.0: require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== "require-like@>= 0.1.1": version "0.1.2" - resolved "https://registry.yarnpkg.com/require-like/-/require-like-0.1.2.tgz#ad6f30c13becd797010c468afa775c0c0a6b47fa" + resolved "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz" integrity sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A== requires-port@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== resolve-alpn@^1.2.0: version "1.2.1" - resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + resolved "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz" integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-pathname@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" + resolved "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz" integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== resolve@^1.1.6, resolve@^1.14.2: version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: is-core-module "^2.13.0" @@ -7608,36 +8485,49 @@ resolve@^1.1.6, resolve@^1.14.2: responselike@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-3.0.0.tgz#20decb6c298aff0dbee1c355ca95461d42823626" + resolved "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz" integrity sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg== dependencies: lowercase-keys "^3.0.0" +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + retry@^0.13.1: version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== reusify@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" +rst-selector-parser@^2.2.3: + version "2.2.3" + resolved "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz" + integrity sha512-nDG1rZeP6oFTLN6yNDV/uiAvs1+FS/KlrEwh7+y7dpuApDBy6bI2HTBcc0/V8lv9OTqfyD34eF7au2pm8aBbhA== + dependencies: + lodash.flattendeep "^4.4.0" + nearley "^2.7.10" + rtl-detect@^1.0.4: version "1.1.2" - resolved "https://registry.yarnpkg.com/rtl-detect/-/rtl-detect-1.1.2.tgz#ca7f0330af5c6bb626c15675c642ba85ad6273c6" + resolved "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.1.2.tgz" integrity sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ== rtlcss@^4.1.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/rtlcss/-/rtlcss-4.1.1.tgz#f20409fcc197e47d1925996372be196fee900c0c" + resolved "https://registry.npmjs.org/rtlcss/-/rtlcss-4.1.1.tgz" integrity sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ== dependencies: escalade "^3.1.1" @@ -7647,50 +8537,83 @@ rtlcss@^4.1.0: run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: +safe-buffer@^5.1.0, safe-buffer@>=5.1.0, safe-buffer@~5.2.0, safe-buffer@5.2.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-regex "^1.1.4" + "safer-buffer@>= 2.1.2 < 3": version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sax@^1.2.4: version "1.3.0" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" + resolved "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz" integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== scheduler@^0.23.0: version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz" integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== dependencies: loose-envify "^1.1.0" -schema-utils@2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== +schema-utils@^3.0.0: + version "3.3.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^3.1.1: + version "3.3.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: +schema-utils@^3.2.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== dependencies: "@types/json-schema" "^7.0.8" @@ -7699,7 +8622,7 @@ schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: schema-utils@^4.0.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz" integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== dependencies: "@types/json-schema" "^7.0.9" @@ -7707,9 +8630,23 @@ schema-utils@^4.0.0: ajv-formats "^2.1.1" ajv-keywords "^5.1.0" +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +"search-insights@>= 1 < 3": + version "2.13.0" + resolved "https://registry.npmjs.org/search-insights/-/search-insights-2.13.0.tgz" + integrity sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw== + section-matter@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" + resolved "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz" integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== dependencies: extend-shallow "^2.0.1" @@ -7717,12 +8654,12 @@ section-matter@^1.0.0: select-hose@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== selfsigned@^2.1.1: version "2.4.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" + resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz" integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== dependencies: "@types/node-forge" "^1.3.0" @@ -7730,26 +8667,26 @@ selfsigned@^2.1.1: semver-diff@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-4.0.0.tgz#3afcf5ed6d62259f5c72d0d5d50dffbdc9680df5" + resolved "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz" integrity sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA== dependencies: semver "^7.3.5" semver@^6.3.1: version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.4: version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" send@0.18.0: version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== dependencies: debug "2.6.9" @@ -7768,14 +8705,14 @@ send@0.18.0: serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz" integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== dependencies: randombytes "^2.1.0" serve-handler@^6.1.5: version "6.1.5" - resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.5.tgz#a4a0964f5c55c7e37a02a633232b6f0d6f068375" + resolved "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz" integrity sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg== dependencies: bytes "3.0.0" @@ -7789,7 +8726,7 @@ serve-handler@^6.1.5: serve-index@^1.9.1: version "1.9.1" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== dependencies: accepts "~1.3.4" @@ -7802,7 +8739,7 @@ serve-index@^1.9.1: serve-static@1.15.0: version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== dependencies: encodeurl "~1.0.2" @@ -7810,58 +8747,70 @@ serve-static@1.15.0: parseurl "~1.3.3" send "0.18.0" -set-function-length@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" - integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: - define-data-property "^1.1.1" - get-intrinsic "^1.2.1" + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" gopd "^1.0.1" - has-property-descriptors "^1.0.0" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" setprototypeof@1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== setprototypeof@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== shallow-clone@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== dependencies: kind-of "^6.0.2" -shallowequal@1.1.0, shallowequal@^1.1.0: +shallowequal@^1.1.0, shallowequal@1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz" integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shell-quote@^1.7.3, shell-quote@^1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== shelljs@^0.8.5: version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz" integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== dependencies: glob "^7.0.0" @@ -7870,14 +8819,14 @@ shelljs@^0.8.5: should-equal@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/should-equal/-/should-equal-2.0.0.tgz#6072cf83047360867e68e98b09d71143d04ee0c3" + resolved "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz" integrity sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA== dependencies: should-type "^1.4.0" should-format@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/should-format/-/should-format-3.0.3.tgz#9bfc8f74fa39205c53d38c34d717303e277124f1" + resolved "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz" integrity sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q== dependencies: should-type "^1.3.0" @@ -7885,7 +8834,7 @@ should-format@^3.0.3: should-type-adaptors@^1.0.1: version "1.1.0" - resolved "https://registry.yarnpkg.com/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz#401e7f33b5533033944d5cd8bf2b65027792e27a" + resolved "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz" integrity sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA== dependencies: should-type "^1.3.0" @@ -7893,17 +8842,17 @@ should-type-adaptors@^1.0.1: should-type@^1.3.0, should-type@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/should-type/-/should-type-1.4.0.tgz#0756d8ce846dfd09843a6947719dfa0d4cff5cf3" + resolved "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz" integrity sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ== should-util@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/should-util/-/should-util-1.0.1.tgz#fb0d71338f532a3a149213639e2d32cbea8bcb28" + resolved "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz" integrity sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g== should@^13.2.1: version "13.2.3" - resolved "https://registry.yarnpkg.com/should/-/should-13.2.3.tgz#96d8e5acf3e97b49d89b51feaa5ae8d07ef58f10" + resolved "https://registry.npmjs.org/should/-/should-13.2.3.tgz" integrity sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ== dependencies: should-equal "^2.0.0" @@ -7914,7 +8863,7 @@ should@^13.2.1: side-channel@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: call-bind "^1.0.0" @@ -7923,12 +8872,12 @@ side-channel@^1.0.4: signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== sirv@^2.0.3: version "2.0.4" - resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.4.tgz#5dd9a725c578e34e449f332703eb2a74e46a29b0" + resolved "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz" integrity sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ== dependencies: "@polka/url" "^1.0.0-next.24" @@ -7937,12 +8886,12 @@ sirv@^2.0.3: sisteransi@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== sitemap@^7.1.1: version "7.1.1" - resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-7.1.1.tgz#eeed9ad6d95499161a3eadc60f8c6dce4bea2bef" + resolved "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz" integrity sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg== dependencies: "@types/node" "^17.0.5" @@ -7952,29 +8901,29 @@ sitemap@^7.1.1: skin-tone@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/skin-tone/-/skin-tone-2.0.0.tgz#4e3933ab45c0d4f4f781745d64b9f4c208e41237" + resolved "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz" integrity sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA== dependencies: unicode-emoji-modifier-base "^1.0.0" slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slash@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== slugify@~1.4.7: version "1.4.7" - resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.4.7.tgz#e42359d505afd84a44513280868e31202a79a628" + resolved "https://registry.npmjs.org/slugify/-/slugify-1.4.7.tgz" integrity sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg== sockjs@^0.3.24: version "0.3.24" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz" integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== dependencies: faye-websocket "^0.11.3" @@ -7983,40 +8932,50 @@ sockjs@^0.3.24: sort-css-media-queries@2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz#7c85e06f79826baabb232f5560e9745d7a78c4ce" + resolved "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz" integrity sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA== -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +source-map-js@^1.2.0, source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== source-map-support@~0.5.20: version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@^0.7.0: version "0.7.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== +source-map@~0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + space-separated-tokens@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz" integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== spdy-transport@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz" integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== dependencies: debug "^4.1.0" @@ -8028,7 +8987,7 @@ spdy-transport@^3.0.0: spdy@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + resolved "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz" integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== dependencies: debug "^4.1.0" @@ -8039,42 +8998,65 @@ spdy@^4.0.2: sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== srcset@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/srcset/-/srcset-4.0.0.tgz#336816b665b14cd013ba545b6fe62357f86e65f4" + resolved "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz" integrity sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw== stable@^0.1.8: version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - "statuses@>= 1.4.0 < 2": version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + std-env@^3.0.1: version "3.7.0" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" + resolved "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz" integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== stickyfill@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/stickyfill/-/stickyfill-1.1.1.tgz#39413fee9d025c74a7e59ceecb23784cc0f17f02" + resolved "https://registry.npmjs.org/stickyfill/-/stickyfill-1.1.1.tgz" integrity sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA== -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.2.3: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -8083,30 +9065,44 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: eastasianwidth "^0.2.0" emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== +string.prototype.trim@^1.2.1, string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== dependencies: - safe-buffer "~5.2.0" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== dependencies: - safe-buffer "~5.1.0" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" stringify-entities@^4.0.0: version "4.0.3" - resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.3.tgz#cfabd7039d22ad30f3cc435b0ca2c1574fc88ef8" + resolved "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz" integrity sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g== dependencies: character-entities-html4 "^2.0.0" @@ -8114,7 +9110,7 @@ stringify-entities@^4.0.0: stringify-object@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== dependencies: get-own-enumerable-property-symbols "^3.0.0" @@ -8123,114 +9119,114 @@ stringify-object@^3.3.0: strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^7.0.1: version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" strip-bom-string@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + resolved "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz" integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strip-json-comments@~2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== style-to-object@^0.4.0: version "0.4.4" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.4.tgz#266e3dfd56391a7eefb7770423612d043c3f33ec" + resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz" integrity sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg== dependencies: inline-style-parser "0.1.1" style-to-object@^1.0.0: version "1.0.5" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-1.0.5.tgz#5e918349bc3a39eee3a804497d97fcbbf2f0d7c0" + resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.5.tgz" integrity sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ== dependencies: inline-style-parser "0.2.2" -styled-components@^6.0.5: - version "6.1.8" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-6.1.8.tgz#c109d36aeea52d8f049e12de2f3be39a6fc86201" - integrity sha512-PQ6Dn+QxlWyEGCKDS71NGsXoVLKfE1c3vApkvDYS5KAK+V8fNWGhbSUEo9Gg2iaID2tjLXegEW3bZDUGpofRWw== +"styled-components@^4.1.1 || ^5.1.1 || ^6.0.5", styled-components@^6.1.11: + version "6.1.13" + resolved "https://registry.npmjs.org/styled-components/-/styled-components-6.1.13.tgz" + integrity sha512-M0+N2xSnAtwcVAQeFEsGWFFxXDftHUD7XrKla06QbpUMmbmtFBMMTcKWvFXtWxuD5qQkB8iU5gk6QASlx2ZRMw== dependencies: - "@emotion/is-prop-valid" "1.2.1" - "@emotion/unitless" "0.8.0" - "@types/stylis" "4.2.0" + "@emotion/is-prop-valid" "1.2.2" + "@emotion/unitless" "0.8.1" + "@types/stylis" "4.2.5" css-to-react-native "3.2.0" - csstype "3.1.2" - postcss "8.4.31" + csstype "3.1.3" + postcss "8.4.38" shallowequal "1.1.0" - stylis "4.3.1" - tslib "2.5.0" + stylis "4.3.2" + tslib "2.6.2" stylehacks@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" + resolved "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz" integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== dependencies: browserslist "^4.21.4" postcss-selector-parser "^6.0.4" -stylis@4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.1.tgz#ed8a9ebf9f76fe1e12d462f5cc3c4c980b23a7eb" - integrity sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ== +stylis@4.3.2: + version "4.3.2" + resolved "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz" + integrity sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg== supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-color@^8.0.0: version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== svg-parser@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz" integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== svgo@^2.7.0, svgo@^2.8.0: version "2.8.0" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" + resolved "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz" integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== dependencies: "@trysound/sax" "0.2.0" @@ -8241,9 +9237,9 @@ svgo@^2.7.0, svgo@^2.8.0: picocolors "^1.0.0" stable "^0.1.8" -swagger2openapi@^7.0.6: +swagger2openapi@^7.0.8: version "7.0.8" - resolved "https://registry.yarnpkg.com/swagger2openapi/-/swagger2openapi-7.0.8.tgz#12c88d5de776cb1cbba758994930f40ad0afac59" + resolved "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz" integrity sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g== dependencies: call-me-maybe "^1.0.1" @@ -8260,28 +9256,28 @@ swagger2openapi@^7.0.6: tapable@^1.0.0: version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== terser-webpack-plugin@^5.3.7, terser-webpack-plugin@^5.3.9: - version "5.3.10" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" - integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== + version "5.3.9" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz" + integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== dependencies: - "@jridgewell/trace-mapping" "^0.3.20" + "@jridgewell/trace-mapping" "^0.3.17" jest-worker "^27.4.5" schema-utils "^3.1.1" serialize-javascript "^6.0.1" - terser "^5.26.0" + terser "^5.16.8" -terser@^5.10.0, terser@^5.15.1, terser@^5.26.0: +terser@^5.10.0, terser@^5.15.1, terser@^5.16.8: version "5.26.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.26.0.tgz#ee9f05d929f4189a9c28a0feb889d96d50126fe1" + resolved "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz" integrity sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ== dependencies: "@jridgewell/source-map" "^0.3.3" @@ -8291,119 +9287,192 @@ terser@^5.10.0, terser@^5.15.1, terser@^5.26.0: text-table@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== thunky@^1.0.2: version "1.1.0" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== tiny-invariant@^1.0.2: version "1.3.1" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" + resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz" integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== tiny-warning@^1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== to-fast-properties@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" toidentifier@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== totalist@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" + resolved "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz" integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== tr46@~0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== trim-lines@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + resolved "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz" integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== trough@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" + resolved "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz" integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== -tslib@2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.3, tslib@^2.6.0: +tslib@^2.0.3, tslib@^2.6.0, tslib@2.6.2: version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + type-fest@^1.0.1: version "1.4.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz" integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== type-fest@^2.13.0, type-fest@^2.5.0: version "2.19.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz" integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== type-is@~1.6.18: version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" mime-types "~2.1.24" +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + typedarray-to-buffer@^3.1.5: version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== dependencies: is-typedarray "^1.0.0" -typescript@~5.2.2: +"typescript@>= 2.7", "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", typescript@>=4.9.5, typescript@~5.2.2: version "5.2.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz" integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + undici-types@~5.26.4: version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== unicode-emoji-modifier-base@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz#dbbd5b54ba30f287e2a8d5a249da6c0cef369459" + resolved "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz" integrity sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g== unicode-match-property-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== dependencies: unicode-canonical-property-names-ecmascript "^2.0.0" @@ -8411,17 +9480,17 @@ unicode-match-property-ecmascript@^2.0.0: unicode-match-property-value-ecmascript@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== unicode-property-aliases-ecmascript@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== unified@^11.0.0, unified@^11.0.3, unified@^11.0.4: version "11.0.4" - resolved "https://registry.yarnpkg.com/unified/-/unified-11.0.4.tgz#f4be0ac0fe4c88cb873687c07c64c49ed5969015" + resolved "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz" integrity sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ== dependencies: "@types/unist" "^3.0.0" @@ -8434,35 +9503,35 @@ unified@^11.0.0, unified@^11.0.3, unified@^11.0.4: unique-string@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-3.0.0.tgz#84a1c377aff5fd7a8bc6b55d8244b2bd90d75b9a" + resolved "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz" integrity sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ== dependencies: crypto-random-string "^4.0.0" unist-util-is@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" + resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz" integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== dependencies: "@types/unist" "^3.0.0" unist-util-position-from-estree@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz#d94da4df596529d1faa3de506202f0c9a23f2200" + resolved "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz" integrity sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ== dependencies: "@types/unist" "^3.0.0" unist-util-position@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" + resolved "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz" integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== dependencies: "@types/unist" "^3.0.0" unist-util-remove-position@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz#fea68a25658409c9460408bc6b4991b965b52163" + resolved "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz" integrity sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q== dependencies: "@types/unist" "^3.0.0" @@ -8470,14 +9539,14 @@ unist-util-remove-position@^5.0.0: unist-util-stringify-position@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" + resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz" integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== dependencies: "@types/unist" "^3.0.0" unist-util-visit-parents@^6.0.0: version "6.0.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" + resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz" integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== dependencies: "@types/unist" "^3.0.0" @@ -8485,7 +9554,7 @@ unist-util-visit-parents@^6.0.0: unist-util-visit@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" + resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz" integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== dependencies: "@types/unist" "^3.0.0" @@ -8494,17 +9563,17 @@ unist-util-visit@^5.0.0: universalify@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0, unpipe@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== update-browserslist-db@^1.0.13: version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz" integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== dependencies: escalade "^3.1.1" @@ -8512,7 +9581,7 @@ update-browserslist-db@^1.0.13: update-notifier@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-6.0.2.tgz#a6990253dfe6d5a02bd04fbb6a61543f55026b60" + resolved "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz" integrity sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og== dependencies: boxen "^7.0.0" @@ -8530,16 +9599,21 @@ update-notifier@^6.0.2: semver-diff "^4.0.0" xdg-basedir "^5.1.0" +uri-js-replace@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/uri-js-replace/-/uri-js-replace-1.0.1.tgz" + integrity sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g== + uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" url-loader@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + resolved "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz" integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== dependencies: loader-utils "^2.0.0" @@ -8548,47 +9622,52 @@ url-loader@^4.1.1: url-template@^2.0.8: version "2.0.8" - resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" + resolved "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz" integrity sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw== +use-sync-external-store@^1.2.0: + version "1.2.2" + resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz" + integrity sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw== + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== utila@~0.4: version "0.4.0" - resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz" integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== utility-types@^3.10.0: version "3.10.0" - resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b" + resolved "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz" integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== utils-merge@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== uuid@^8.3.2: version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== value-equal@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" + resolved "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz" integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== vary@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== vfile-location@^5.0.0: version "5.0.2" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-5.0.2.tgz#220d9ca1ab6f8b2504a4db398f7ebc149f9cb464" + resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz" integrity sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg== dependencies: "@types/unist" "^3.0.0" @@ -8596,7 +9675,7 @@ vfile-location@^5.0.0: vfile-message@^4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.2.tgz#c883c9f677c72c166362fd635f21fc165a7d1181" + resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz" integrity sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw== dependencies: "@types/unist" "^3.0.0" @@ -8604,7 +9683,7 @@ vfile-message@^4.0.0: vfile@^6.0.0, vfile@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-6.0.1.tgz#1e8327f41eac91947d4fe9d237a2dd9209762536" + resolved "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz" integrity sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw== dependencies: "@types/unist" "^3.0.0" @@ -8613,7 +9692,7 @@ vfile@^6.0.0, vfile@^6.0.1: watchpack@^2.4.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== dependencies: glob-to-regexp "^0.4.1" @@ -8621,24 +9700,24 @@ watchpack@^2.4.0: wbuf@^1.1.0, wbuf@^1.7.3: version "1.7.3" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz" integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== dependencies: minimalistic-assert "^1.0.0" web-namespaces@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" + resolved "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz" integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== webpack-bundle-analyzer@^4.9.0: version "4.10.1" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz#84b7473b630a7b8c21c741f81d8fe4593208b454" + resolved "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz" integrity sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ== dependencies: "@discoveryjs/json-ext" "0.5.7" @@ -8657,7 +9736,7 @@ webpack-bundle-analyzer@^4.9.0: webpack-dev-middleware@^5.3.1: version "5.3.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" + resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz" integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== dependencies: colorette "^2.0.10" @@ -8668,7 +9747,7 @@ webpack-dev-middleware@^5.3.1: webpack-dev-server@^4.15.1: version "4.15.1" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz#8944b29c12760b3a45bdaa70799b17cb91b03df7" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz" integrity sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA== dependencies: "@types/bonjour" "^3.5.9" @@ -8704,7 +9783,7 @@ webpack-dev-server@^4.15.1: webpack-merge@^5.9.0: version "5.10.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" + resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz" integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== dependencies: clone-deep "^4.0.1" @@ -8713,12 +9792,12 @@ webpack-merge@^5.9.0: webpack-sources@^3.2.2, webpack-sources@^3.2.3: version "3.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@^5.88.1: +"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.20.0, webpack@^5.88.1, "webpack@>= 4", "webpack@>=4.41.1 || 5.x", webpack@>=5, "webpack@3 || 4 || 5": version "5.89.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.89.0.tgz#56b8bf9a34356e93a6625770006490bf3a7f32dc" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz" integrity sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw== dependencies: "@types/eslint-scope" "^3.7.3" @@ -8748,7 +9827,7 @@ webpack@^5.88.1: webpackbar@^5.0.2: version "5.0.2" - resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-5.0.2.tgz#d3dd466211c73852741dfc842b7556dcbc2b0570" + resolved "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz" integrity sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ== dependencies: chalk "^4.1.0" @@ -8756,9 +9835,9 @@ webpackbar@^5.0.2: pretty-time "^1.1.0" std-env "^3.0.1" -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: +websocket-driver@^0.7.4, websocket-driver@>=0.5.1: version "0.7.4" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== dependencies: http-parser-js ">=0.5.1" @@ -8767,46 +9846,73 @@ websocket-driver@>=0.5.1, websocket-driver@^0.7.4: websocket-extensions@>=0.1.1: version "0.1.4" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" webidl-conversions "^3.0.0" +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-typed-array@^1.1.14, which-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" + which@^1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" widest-line@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-4.0.1.tgz#a0fc673aaba1ea6f0a0d35b3c2795c9a9cc2ebf2" + resolved "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz" integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== dependencies: string-width "^5.0.1" wildcard@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" + resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz" integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -8815,7 +9921,7 @@ wrap-ansi@^7.0.0: wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: ansi-styles "^6.1.0" @@ -8824,12 +9930,12 @@ wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== dependencies: imurmurhash "^0.1.4" @@ -8839,59 +9945,59 @@ write-file-atomic@^3.0.3: ws@^7.3.1: version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== ws@^8.13.0: version "8.16.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" + resolved "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz" integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== xdg-basedir@^5.0.1, xdg-basedir@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" + resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz" integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== xml-js@^1.6.11: version "1.6.11" - resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.11.tgz#927d2f6947f7f1c19a316dd8eea3614e8b18f8e9" + resolved "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz" integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== dependencies: sax "^1.2.4" y18n@^5.0.5: version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^3.0.2: version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml-ast-parser@0.0.43: version "0.0.43" - resolved "https://registry.yarnpkg.com/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz#e8a23e6fb4c38076ab92995c5dca33f3d3d7c9bb" + resolved "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz" integrity sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A== yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yargs-parser@^21.1.1: version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs@^17.0.1: version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" @@ -8904,15 +10010,15 @@ yargs@^17.0.1: yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== yocto-queue@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz" integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== zwitch@^2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + resolved "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz" integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== diff --git a/example/.DS_Store b/example/.DS_Store deleted file mode 100644 index eb4bb013..00000000 Binary files a/example/.DS_Store and /dev/null differ diff --git a/example/Dockerfile.mock b/example/Dockerfile.mock deleted file mode 100644 index e69de29b..00000000 diff --git a/example/README.md b/example/README.md deleted file mode 100644 index e69de29b..00000000 diff --git a/example/create_openapi.py b/example/create_openapi.py deleted file mode 100644 index 47a81b33..00000000 --- a/example/create_openapi.py +++ /dev/null @@ -1,48 +0,0 @@ -import json -import os.path -from typing import List - -from fastapi import FastAPI -from fastapi.openapi.utils import get_openapi -from fastapi.responses import PlainTextResponse - -import interlink - -app = FastAPI() - - -@app.post("/create") -async def create_pod(pod: List[interlink.Pod]) -> interlink.CreateStruct: - raise NotImplementedError - - -@app.post("/delete") -async def delete_pod(pod: interlink.PodRequest) -> str: - raise NotImplementedError - - -@app.get("/status") -async def status_pod(pods: List[interlink.PodRequest]) -> List[interlink.PodStatus]: - raise NotImplementedError - - -@app.get("/getLogs", response_class=PlainTextResponse) -async def get_logs(req: interlink.LogRequest) -> bytes: - raise NotImplementedError - - -openapi_schema = os.path.join( - os.path.dirname(__file__), *["..", "docs", "openapi", "openapi.json"] -) - -with open(openapi_schema, "w") as f: - json.dump( - get_openapi( - title="interLink sidecar", - version=os.environ.get("VERSION", "v0.0.0"), - openapi_version=app.openapi()["openapi"], - description="openapi spec for interLink apis <-> provider sidecar communication", - routes=app.routes, - ), - f, - ) \ No newline at end of file diff --git a/example/interlink-docker/interlink/InterLinkConfig.yaml b/example/interlink-docker/interlink/InterLinkConfig.yaml deleted file mode 100644 index 6738ee3c..00000000 --- a/example/interlink-docker/interlink/InterLinkConfig.yaml +++ /dev/null @@ -1,9 +0,0 @@ -VKTokenFile: "$HOME/interLink/token" -InterlinkAddress: "http://XXX.XXX.XXX.XXX" -SidecarURL: "http://docker-sidecar" -InterlinkPort: "3000" -SidecarPort: "4000" -ExportPodData: true -DataRootFolder: ".local/interlink/jobs/" -VerboseLogging: true -ErrorsOnlyLogging: false diff --git a/example/interlink-docker/interlink/docker-compose.yaml b/example/interlink-docker/interlink/docker-compose.yaml deleted file mode 100644 index 243c9d5f..00000000 --- a/example/interlink-docker/interlink/docker-compose.yaml +++ /dev/null @@ -1,46 +0,0 @@ -version: '3.7' -services: - interlink: - build: - context: ../../../ - dockerfile: docker/Dockerfile.interlink - restart: always - #network_mode: "host" - ports: - - 3000:3000 - volumes: - - type: bind - source: ./ - target: /etc/interlink - environment: - - INTERLINKCONFIGPATH=/etc/interlink/InterLinkConfig.yaml - # healthcheck: - # test: ["CMD", "/check.sh"] - # interval: 10s - # timeout: 10s - # retries: 3 - # start_period: 5s - docker-sidecar: - image: ghcr.io/intertwin-eu/interlink-sidecar-docker:0.0.2-pre1 - restart: always - privileged: true - cap_add: - - SYS_ADMIN - #network_mode: "host" - ports: - - 4000:4000 - environment: - - INTERLINKCONFIGPATH=/etc/interlink/sidecarConfig.yaml - volumes: - - type: bind - source: ./ - target: /etc/interlink - - type: bind - source: /var/run/docker.sock - target: /var/run/docker.sock - # healthcheck: - # test: ["CMD", "/check.sh"] - # interval: 10s - # timeout: 10s - # retries: 3 - # start_period: 5s diff --git a/example/interlink-docker/interlink/sidecarConfig.yaml b/example/interlink-docker/interlink/sidecarConfig.yaml deleted file mode 100644 index 75b216df..00000000 --- a/example/interlink-docker/interlink/sidecarConfig.yaml +++ /dev/null @@ -1,15 +0,0 @@ -SidecarURL: "http://docker-sidecar" -SidecarPort: "4000" -SbatchPath: "/usr/bin/sbatch" -ScancelPath: "/usr/bin/scancel" -SqueuePath: "/usr/bin/squeue" -CommandPrefix: "" -ExportPodData: true -DataRootFolder: ".local/interlink/jobs/" -Tsocks: false -TsocksPath: "$WORK/tsocks-1.8beta5+ds1/libtsocks.so" -TsocksLoginNode: "login01" -BashPath: /bin/bash -VerboseLogging: true -ErrorsOnlyLogging: false - diff --git a/example/interlink-docker/test_pod.yaml b/example/interlink-docker/test_pod.yaml deleted file mode 100644 index 7dcd1ecf..00000000 --- a/example/interlink-docker/test_pod.yaml +++ /dev/null @@ -1,21 +0,0 @@ -apiVersion: v1 -kind: Pod -metadata: - name: test-pod-cfg-cowsay-dciangot - namespace: vk - annotations: - slurm-job.vk.io/flags: "--job-name=test-pod-cfg -t 2800 --ntasks=8 --nodes=1 --mem-per-cpu=2000" -spec: - restartPolicy: Never - containers: - - image: ghcr.io/grycap/cowsay - command: ["/bin/sh"] - args: ["-c", "\"touch /tmp/test.txt && sleep 60 && echo \\\"hello muu\\\" | /usr/games/cowsay \" " ] - imagePullPolicy: Always - name: cowsayo - dnsPolicy: ClusterFirst - nodeSelector: - kubernetes.io/hostname: test-vk - tolerations: - - key: virtual-node.interlink/no-schedule - operator: Exists diff --git a/example/interlink-docker/vk/InterLinkConfig.yaml b/example/interlink-docker/vk/InterLinkConfig.yaml deleted file mode 100644 index 02f7f092..00000000 --- a/example/interlink-docker/vk/InterLinkConfig.yaml +++ /dev/null @@ -1,11 +0,0 @@ -VKTokenFile: "$HOME/interLink/token" -InterlinkAddress: "http://XXX.XXX.XXX.XXX" -CommandPrefix: "" -ExportPodData: true -ServiceAccount: "interlink" -Namespace: "vk" -VerboseLogging: true -ErrorsOnlyLogging: false -CPU: 100 -Memory: 128Gi -Pod: 100 diff --git a/example/interlink-docker/vk/deployment.yaml b/example/interlink-docker/vk/deployment.yaml deleted file mode 100644 index 109d1a4a..00000000 --- a/example/interlink-docker/vk/deployment.yaml +++ /dev/null @@ -1,101 +0,0 @@ ---- - -apiVersion: apps/v1 -kind: Deployment -metadata: - name: test-vk - labels: - nodeName: test-vk -spec: - replicas: 1 - selector: - matchLabels: - nodeName: test-vk - template: - metadata: - labels: - nodeName: test-vk - spec: - initContainers: - - name: settoken - image: "docker.io/alpine:3" - command: ["sh", "-c"] - args: ["touch /opt/interlink/token"] - volumeMounts: - - name: token - mountPath: /opt/interlink - containers: - - name: jaeger - image: jaegertracing/all-in-one:1.51 - - name: inttw-vk - image: ghcr.io/intertwin-eu/interlink/virtual-kubelet-inttw:latest - #image: dciangot/vk:latest - imagePullPolicy: Always - #command: ["sleep", "infinity"] - env: - - name: NODENAME - value: test-vk - - name: POD_IP - valueFrom: - fieldRef: - fieldPath: status.podIP - #- name: KUBECONFIG - # value: /etc/interlink/kubeconfig - - name: KUBELET_PORT - value: "10250" - - name: CONFIGPATH - value: "/etc/interlink/InterLinkConfig.yaml" - - name: VKTOKENFILE - value: "/opt/interlink/token" - volumeMounts: - - name: config - mountPath: /etc/interlink/InterLinkConfig.yaml - subPath: InterLinkConfig.yaml - - name: token - mountPath: /opt/interlink - resources: - limits: - cpu: 500m - memory: 600Mi - requests: - cpu: 50m - memory: 100Mi - - name: refresh-token - image: ghcr.io/intertwin-eu/virtual-kubelet-inttw-refresh:latest - imagePullPolicy: Always - env: - - name: IAM_SERVER - value: "https://dodas-iam.cloud.cnaf.infn.it/" - # TODO load env IAM client from secret - - name: IAM_CLIENT_ID - value: "DUMMY" - - name: IAM_CLIENT_SECRET - value: "DUMMY" - - name: IAM_REFRESH_TOKEN - value: "DUMMY" - - name: IAM_VK_AUD - value: intertw-vk - - name: TOKEN_PATH - value: /opt/interlink/token - resources: - limits: - cpu: 500m - memory: 600Mi - requests: - cpu: 50m - memory: 100Mi - volumeMounts: - - name: token - mountPath: /opt/interlink - serviceAccountName: interlink - volumes: - - name: config - configMap: - # Provide the name of the ConfigMap you want to mount. - name: vk-config - - name: kubeconfig - configMap: - # Provide the name of the ConfigMap you want to mount. - name: vk-kubeconfig - - name: token - emptyDir: {} diff --git a/example/interlink-docker/vk/kustomization.yaml b/example/interlink-docker/vk/kustomization.yaml deleted file mode 100644 index 3890ba28..00000000 --- a/example/interlink-docker/vk/kustomization.yaml +++ /dev/null @@ -1,13 +0,0 @@ -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization -resources: - - ./deployment.yaml - - ./service-account.yaml - -configMapGenerator: - - name: vk-config-json - files: - - vk-cfg.json=vk-cfg.json - - name: vk-config - files: - - InterLinkConfig.yaml=InterLinkConfig.yaml \ No newline at end of file diff --git a/example/interlink-docker/vk/otecol_config.yaml b/example/interlink-docker/vk/otecol_config.yaml deleted file mode 100644 index 2f6bb992..00000000 --- a/example/interlink-docker/vk/otecol_config.yaml +++ /dev/null @@ -1,41 +0,0 @@ -extensions: - health_check: - pprof: - endpoint: 0.0.0.0:1777 - zpages: - endpoint: 0.0.0.0:55679 - -receivers: - otlp: - protocols: - grpc: - endpoint: 0.0.0.0:4319 - http: - endpoint: 0.0.0.0:4318 - -processors: - batch: - -exporters: - otlp: - endpoint: "localhost:4317" - tls: - insecure: true - logging: - verbosity: detailed - -service: - - pipelines: - - traces: - receivers: [otlp, opencensus, jaeger, zipkin] - processors: [batch] - exporters: [logging] - - metrics: - receivers: [otlp, opencensus, prometheus] - processors: [batch] - exporters: [logging] - - extensions: [health_check, pprof, zpages] \ No newline at end of file diff --git a/example/interlink-docker/vk/service-account.yaml b/example/interlink-docker/vk/service-account.yaml deleted file mode 100644 index 3dbaa7f2..00000000 --- a/example/interlink-docker/vk/service-account.yaml +++ /dev/null @@ -1,97 +0,0 @@ -apiVersion: v1 -kind: ServiceAccount -metadata: - name: interlink - namespace: vk ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: interlink-role - namespace: vk -rules: -- apiGroups: - - "coordination.k8s.io" - resources: - - leases - verbs: - - update - - create - - get - - list - - watch - - patch -- apiGroups: - - "" - resources: - - configmaps - - secrets - - services - - serviceaccounts - - namespaces - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - pods - verbs: - - delete - - get - - list - - watch - - patch -- apiGroups: - - "" - resources: - - nodes - verbs: - - create - - get -- apiGroups: - - "" - resources: - - nodes/status - verbs: - - update - - patch -- apiGroups: - - "" - resources: - - pods/status - verbs: - - update - - patch -- apiGroups: - - "" - resources: - - events - verbs: - - create - - patch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: interlink-rolebinding -subjects: -- kind: ServiceAccount - name: interlink - namespace: vk -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: interlink-role ---- -apiVersion: v1 -kind: Secret -metadata: - name: interlink-secret - namespace: vk - annotations: - kubernetes.io/service-account.name: interlink - labels: - kubernetes.io/service-account.name: interlink -type: kubernetes.io/service-account-token diff --git a/example/interlink/__init__.py b/example/interlink/__init__.py deleted file mode 100644 index e5559f1a..00000000 --- a/example/interlink/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .provider import * -from .spec import * diff --git a/example/interlink/interlink.egg-info/PKG-INFO b/example/interlink/interlink.egg-info/PKG-INFO deleted file mode 100644 index c028c6da..00000000 --- a/example/interlink/interlink.egg-info/PKG-INFO +++ /dev/null @@ -1,11 +0,0 @@ -Metadata-Version: 2.1 -Name: interlink -Version: 0.0.1 -Summary: interlink provider library -Home-page: package URL -Author: Diego Ciangottini -Author-email: diego.ciangottini@gmail.com -Classifier: Programming Language :: Python :: 3 -Classifier: Operating System :: OS Independent -Requires-Python: >=3.6 -Description-Content-Type: text/markdown diff --git a/example/interlink/interlink.egg-info/SOURCES.txt b/example/interlink/interlink.egg-info/SOURCES.txt deleted file mode 100644 index 64dcb304..00000000 --- a/example/interlink/interlink.egg-info/SOURCES.txt +++ /dev/null @@ -1,7 +0,0 @@ -README.md -setup.py -src/interlink/interlink.egg-info/PKG-INFO -src/interlink/interlink.egg-info/SOURCES.txt -src/interlink/interlink.egg-info/dependency_links.txt -src/interlink/interlink.egg-info/requires.txt -src/interlink/interlink.egg-info/top_level.txt \ No newline at end of file diff --git a/example/interlink/interlink.egg-info/dependency_links.txt b/example/interlink/interlink.egg-info/dependency_links.txt deleted file mode 100644 index 8b137891..00000000 --- a/example/interlink/interlink.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/example/interlink/interlink.egg-info/requires.txt b/example/interlink/interlink.egg-info/requires.txt deleted file mode 100644 index 909e9224..00000000 --- a/example/interlink/interlink.egg-info/requires.txt +++ /dev/null @@ -1,2 +0,0 @@ -fastapi -pydantic diff --git a/example/interlink/interlink.egg-info/top_level.txt b/example/interlink/interlink.egg-info/top_level.txt deleted file mode 100644 index 8b137891..00000000 --- a/example/interlink/interlink.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/example/interlink/provider.py b/example/interlink/provider.py deleted file mode 100644 index 40378a6e..00000000 --- a/example/interlink/provider.py +++ /dev/null @@ -1,53 +0,0 @@ -from fastapi import FastAPI, HTTPException -from .spec import * -from typing import List - - -class Provider(FastAPI): - def __init__( - self, - docker_client, - ): - self.docker = docker_client - self.container_pod_map = {} - - def create(self, pod: Pod) -> CreateStruct: - raise HTTPException(status_code=500, detail="NOT IMPLEMENTED YET") - - def delete(self, pod: PodRequest) -> None: - raise HTTPException(status_code=500, detail="NOT IMPLEMENTED YET") - - def status(self, pod: PodRequest) -> PodStatus: - raise HTTPException(status_code=500, detail="NOT IMPLEMENTED YET") - - def logs(self, req: LogRequest) -> bytes: - raise HTTPException(status_code=500, detail="NOT IMPLEMENTED YET") - - def create_pod(self, pod: Pod) -> CreateStruct: - try: - self.create(pod) - except Exception as ex: - raise ex - - return "Containers created" - - def delete_pod(self, pod: PodRequest) -> str: - try: - self.delete(pod) - except Exception as ex: - raise ex - - return "Containers deleted" - - def get_status(self, pods: List[PodRequest]) -> List[PodStatus]: - pod = pods[0] - - return [self.Status(pod)] - - def get_logs(self, req: LogRequest) -> bytes: - try: - logContent = self.Logs(req) - except Exception as ex: - raise ex - - return logContent \ No newline at end of file diff --git a/example/interlink/spec.py b/example/interlink/spec.py deleted file mode 100644 index 34f9a983..00000000 --- a/example/interlink/spec.py +++ /dev/null @@ -1,196 +0,0 @@ -import datetime -from typing import Dict, List, Optional - -from pydantic import BaseModel, Field - -class Metadata(BaseModel): - name: Optional[str] = None - namespace: Optional[str] = None - uid: Optional[str] = None - annotations: Optional[Dict[str, str]] = Field({}) - labels: Optional[Dict[str, str]] = Field({}) - generate_name: Optional[str] = None - - -class VolumeMount(BaseModel): - name: str - mount_path: str - sub_path: Optional[str] = None - read_only: Optional[bool] = False - mount_propagation: Optional[str] = None - - -class ConfigMapKeySelector(BaseModel): - key: str - name: Optional[str] = None - optional: Optional[bool] = None - - -class SecretKeySelector(BaseModel): - key: str - name: Optional[str] = None - optional: Optional[bool] = None - - -class EnvVarSource(BaseModel): - config_map_key_ref: Optional[ConfigMapKeySelector] = None - secret_key_ref: Optional[SecretKeySelector] = None - - -class EnvVar(BaseModel): - name: str - value: Optional[str] = None - value_from: Optional[EnvVarSource] = None - - -class SecurityContext(BaseModel): - allow_privilege_escalation: Optional[bool] = None - privileged: Optional[bool] = None - proc_mount: Optional[str] = None - read_only_file_system: Optional[bool] = None - run_as_group: Optional[int] = None - run_as_non_root: Optional[bool] = None - run_as_user: Optional[int] = None - - -class Container(BaseModel): - name: str - image: str - tag: str = "latest" - command: List[str] - args: Optional[List[str]] = Field([]) - resources: Optional[dict] = Field({}) - volume_mounts: Optional[List[VolumeMount]] = Field([]) - env: Optional[List[EnvVar]] = None - security_context: Optional[SecurityContext] = None - - -class KeyToPath(BaseModel): - key: Optional[str] - path: str - mode: Optional[int] = None - - -class SecretVolumeSource(BaseModel): - secret_name: str - items: Optional[List[KeyToPath]] = Field([]) - optional: Optional[bool] = None - default_mode: Optional[int] = None - - -class ConfigMapVolumeSource(BaseModel): - name: str - items: Optional[List[KeyToPath]] = Field([]) - optional: Optional[bool] = None - default_mode: Optional[int] = None - - -# class VolumeSource(BaseModel): -# emptyDir: Optional[dict] = None -# secret: Optional[SecretSource] = None -# configMap: Optional[ConfigMapVolumeSource] = None - - -class PodVolume(BaseModel): - name: str - # volumeSource: Optional[VolumeSource] = None - empty_dir: Optional[dict] = None - secret: Optional[SecretVolumeSource] = None - config_map: Optional[ConfigMapVolumeSource] = None - - -class PodSpec(BaseModel): - containers: List[Container] - init_containers: Optional[List[Container]] = None - volumes: Optional[List[PodVolume]] = None - preemption_policy: Optional[str] = None - priority_class_name: Optional[str] = None - priority: Optional[int] = None - restart_policy: Optional[str] = None - termination_grace_period_seconds: Optional[int] = None - - -class PodRequest(BaseModel): - metadata: Metadata - spec: PodSpec - - -class ConfigMap(BaseModel): - metadata: Metadata - data: Optional[dict] - binary_data: Optional[dict] = None - type: Optional[str] = None - immutable: Optional[bool] = None - - -class Secret(BaseModel): - metadata: Metadata - data: Optional[dict] = None - string_data: Optional[dict] = None - type: Optional[str] = None - immutable: Optional[bool] = None - - -class Volume(BaseModel): - name: str - config_maps: Optional[List[ConfigMap]] = None - secrets: Optional[List[Secret]] = None - empty_dirs: Optional[List[str]] = None - - -class Pod(BaseModel): - pod: PodRequest - container: List[Volume] - - -class StateTerminated(BaseModel): - exit_code: int - reason: Optional[str] = None - - -class StateRunning(BaseModel): - started_at: Optional[str] = None - - -class StateWaiting(BaseModel): - message: Optional[str] = None - reason: Optional[str] = None - - -class ContainerStates(BaseModel): - terminated: Optional[StateTerminated] = None - running: Optional[StateRunning] = None - waiting: Optional[StateWaiting] = None - - -class ContainerStatus(BaseModel): - name: str - state: ContainerStates - - -class PodStatus(BaseModel): - name: str - uid: str - namespace: str - containers: List[ContainerStatus] - - -class LogOpts(BaseModel): - tail: Optional[int] = None - limit_bytes: Optional[int] = None - timestamps: Optional[bool] = None - previous: Optional[bool] = None - since_seconds: Optional[int] = None - since_time: Optional[datetime.datetime] = None - - -class LogRequest(BaseModel): - namespace: str - pod_uid: str - pod_name: str - container_name: str - opts: LogOpts - -class CreateStruct(BaseModel): - pod_uid: str - pod_jid: str \ No newline at end of file diff --git a/example/requirements.txt b/example/requirements.txt deleted file mode 100644 index 909e9224..00000000 --- a/example/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -fastapi -pydantic diff --git a/example/setup.py b/example/setup.py deleted file mode 100644 index 45bfc93e..00000000 --- a/example/setup.py +++ /dev/null @@ -1,34 +0,0 @@ -import setuptools - -with open("README.md", "r", encoding = "utf-8") as fh: - long_description = fh.read() - -install_requires = [] -with open("requirements.txt") as f: - for line in f.readlines(): - req = line.strip() - if not req or req.startswith(("-e", "#")): - continue - install_requires.append(req) - -setuptools.setup( - name = "interlink", - version = "0.0.1", - author = "Diego Ciangottini", - author_email = "diego.ciangottini@gmail.com", - description = "interlink provider library", - long_description = long_description, - long_description_content_type = "text/markdown", - url = "package URL", - project_urls = { - }, - classifiers = [ - "Programming Language :: Python :: 3", - "Operating System :: OS Independent", - ], - packages = ["interlink"], - python_requires = ">=3.6", - install_requires = install_requires -) - - diff --git a/go.mod b/go.mod index 29fcc8b0..9dc14960 100644 --- a/go.mod +++ b/go.mod @@ -1,15 +1,21 @@ -module github.com/intertwin-eu/interlink +module github.com/interlink-hq/interlink -go 1.22 +go 1.22.5 + +toolchain go1.24.1 require ( github.com/containerd/containerd v1.7.6 + github.com/google/uuid v1.6.0 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.7.0 + github.com/swaggest/openapi-go v0.2.57 github.com/virtual-kubelet/virtual-kubelet v1.11.0 go.opentelemetry.io/otel v1.27.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 go.opentelemetry.io/otel/sdk v1.27.0 + go.opentelemetry.io/otel/trace v1.27.0 + golang.org/x/crypto v0.23.0 golang.org/x/oauth2 v0.20.0 google.golang.org/grpc v1.64.0 gopkg.in/yaml.v2 v2.4.0 @@ -31,16 +37,15 @@ require ( github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/go-logr/logr v1.4.1 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-openapi/jsonpointer v0.20.0 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.22.4 // indirect + github.com/go-openapi/swag v0.23.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.6.0 // indirect github.com/gorilla/mux v1.8.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect @@ -61,10 +66,11 @@ require ( github.com/prometheus/common v0.44.0 // indirect github.com/prometheus/procfs v0.11.1 // indirect github.com/spf13/pflag v1.0.5 // indirect + github.com/swaggest/jsonschema-go v0.3.73 // indirect + github.com/swaggest/refl v1.3.1 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect go.opentelemetry.io/otel/metric v1.27.0 // indirect - go.opentelemetry.io/otel/trace v1.27.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect golang.org/x/net v0.25.0 // indirect golang.org/x/sync v0.7.0 // indirect diff --git a/go.sum b/go.sum index 38260fda..1d5eb2d7 100644 --- a/go.sum +++ b/go.sum @@ -8,6 +8,10 @@ github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bombsimon/logrusr/v3 v3.1.0 h1:zORbLM943D+hDMGgyjMhSAz/iDz86ZV72qaak/CA0zQ= github.com/bombsimon/logrusr/v3 v3.1.0/go.mod h1:PksPPgSFEL2I52pla2glgCyyd2OqOHAnFF5E+g8Ixco= +github.com/bool64/dev v0.2.39 h1:kP8DnMGlWXhGYJEZE/J0l/gVBdbuhoPGL+MJG4QbofE= +github.com/bool64/dev v0.2.39/go.mod h1:iJbh1y/HkunEPhgebWRNcs8wfGq7sjvJ6W5iabL8ACg= +github.com/bool64/shared v0.1.5 h1:fp3eUhBsrSjNCQPcSdQqZxxh9bBwrYiZ+zOKFkM0/2E= +github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6MHJlPs= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -40,13 +44,13 @@ github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ4 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ= -github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= -github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -93,6 +97,8 @@ github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWm github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/iancoleman/orderedmap v0.3.0 h1:5cbR2grmZR/DiVt+VJopEhtVs9YGInGIxAoMJn+Ichc= +github.com/iancoleman/orderedmap v0.3.0/go.mod h1:XuLcCUkdL5owUCQeF2Ue9uuw1EptkJDkXXS7VoV7XGE= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= @@ -145,6 +151,8 @@ github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/ github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= @@ -161,8 +169,20 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/swaggest/assertjson v1.9.0 h1:dKu0BfJkIxv/xe//mkCrK5yZbs79jL7OVf9Ija7o2xQ= +github.com/swaggest/assertjson v1.9.0/go.mod h1:b+ZKX2VRiUjxfUIal0HDN85W0nHPAYUbYH5WkkSsFsU= +github.com/swaggest/jsonschema-go v0.3.73 h1:gU1pBzF3pkZ1GDD3dRMdQoCjrA0sldJ+QcM7aSSPgvc= +github.com/swaggest/jsonschema-go v0.3.73/go.mod h1:qp+Ym2DIXHlHzch3HKz50gPf2wJhKOrAB/VYqLS2oJU= +github.com/swaggest/openapi-go v0.2.57 h1:ofY6NlZzix6LSMNIzfx74aa6U2OeyVmb6KEnkItT60U= +github.com/swaggest/openapi-go v0.2.57/go.mod h1:pWhyF7lAIBRW6UYAvCijYkhy7PEmD92y3DMefiAQiL8= +github.com/swaggest/refl v1.3.1 h1:XGplEkYftR7p9cz1lsiwXMM2yzmOymTE9vneVVpaOh4= +github.com/swaggest/refl v1.3.1/go.mod h1:4uUVFVfPJ0NSX9FPwMPspeHos9wPFlCMGoPRllUbpvA= github.com/virtual-kubelet/virtual-kubelet v1.11.0 h1:LOMcZQfP083xmYH9mYtyHAR+ybFbK1uMaRA+EtDcd1I= github.com/virtual-kubelet/virtual-kubelet v1.11.0/go.mod h1:WQfPHbIlzfhMNYkh6hFXF1ctGfNM8UJCYLYpLa/trxc= +github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= @@ -186,6 +206,8 @@ go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= diff --git a/go.work.sum b/go.work.sum new file mode 100644 index 00000000..82e4a0bc --- /dev/null +++ b/go.work.sum @@ -0,0 +1,144 @@ +cloud.google.com/go/compute v1.25.1/go.mod h1:oopOIR53ly6viBYxaDhBfJwzUAxf1zE//uf3IB011ls= +cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +contrib.go.opencensus.io/exporter/jaeger v0.2.1/go.mod h1:Y8IsLgdxqh1QxYxPC5IgXVmBaeLUeQFfBeBi9PbeZd0= +contrib.go.opencensus.io/exporter/ocagent v0.7.0/go.mod h1:IshRmMJBhDfFj5Y67nVhMYTTIze91RUeT73ipWKs/GY= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0/go.mod h1:OahwfttHWG6eJ0clwcfBAHoDI6X/LV/15hx/wlMZSrU= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/hcsshim v0.11.0/go.mod h1:OEthFdQv/AD2RAdzR6Mm1N1KPCztGKDurW1Z8b8VGMM= +github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= +github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= +github.com/cilium/ebpf v0.9.1/go.mod h1:+OhNOIXx/Fnu1IE8bJz2dzOA+VSfyTfdNUVdlQnxUFY= +github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50/go.mod h1:5e1+Vvlzido69INQaVO6d87Qn543Xr6nooe9Kz7oBFM= +github.com/container-orchestrated-devices/container-device-interface v0.5.4/go.mod h1:DjE95rfPiiSmG7uVXtg0z6MnPm/Lx4wxKCIts0ZE0vg= +github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/btrfs/v2 v2.0.0/go.mod h1:swkD/7j9HApWpzl8OHfrHNxppPd9l44DFZdF94BUj9k= +github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= +github.com/containerd/cgroups/v3 v3.0.2/go.mod h1:JUgITrzdFqp42uI2ryGA+ge0ap/nxzYgkGmIcetmErE= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/containerd/continuity v0.4.2/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +github.com/containerd/fifo v1.1.0/go.mod h1:bmC4NWMbXlt2EZ0Hc7Fx7QzTFxgPID13eH0Qu+MAb2o= +github.com/containerd/go-cni v1.1.9/go.mod h1:XYrZJ1d5W6E2VOvjffL3IZq0Dz6bsVlERHbekNK90PM= +github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/imgcrypt v1.1.7/go.mod h1:FD8gqIcX5aTotCtOmjeCsi3A1dHmTZpnMISGKSczt4k= +github.com/containerd/nri v0.3.0/go.mod h1:Zw9q2lP16sdg0zYybemZ9yTDy8g7fPCIB3KXOGlggXI= +github.com/containerd/ttrpc v1.2.2/go.mod h1:sIT6l32Ph/H9cvnJsfXM5drIVzTr5A2flTf1G5tYZak= +github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= +github.com/containerd/typeurl/v2 v2.1.1/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3HZj1hsSQlywkQ0= +github.com/containerd/zfs v1.1.0/go.mod h1:oZF9wBnrnQjpWLaPKEinrx3TQ9a+W/RJO7Zb41d8YLE= +github.com/containernetworking/cni v1.1.2/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw= +github.com/containernetworking/plugins v1.2.0/go.mod h1:/VjX4uHecW5vVimFa1wkG4s+r/s9qIfPdqlLF4TW8c4= +github.com/containers/ocicrypt v1.1.6/go.mod h1:WgjxPWdTJMqYMjf3M6cuIFFA1/MpyyhIM99YInA+Rvc= +github.com/coreos/go-oidc v2.2.1+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/IragXCQKCnYbmlmtHvwRG0= +github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= +github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/cel-go v0.17.7/go.mod h1:HXZKzB0LXqer5lHHgfWAnlYwJaQBDKMjxjulNQzhwhY= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/intel/goresctrl v0.3.0/go.mod h1:fdz3mD85cmP9sHD8JUlrNWAxvwM86CrbmVXltEKd7zk= +github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mistifyio/go-zfs/v3 v3.0.1/go.mod h1:CzVgeB0RvF2EGzQnytKVvVSDwmKJXxkOTUGbNrTja/k= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= +github.com/moby/sys/signal v0.7.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= +github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= +github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= +github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= +github.com/opencontainers/runtime-spec v1.1.0-rc.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.9.1-0.20221107090550-2e043c6bd626/go.mod h1:BRHJJd0E+cx42OybVYSgUvZmU0B8P9gZuRXlZUP7TKI= +github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/tchap/go-patricia/v2 v2.3.1/go.mod h1:VZRHKAb53DLaG+nA9EaYYiaEx6YztwDlLElMsnSHD4k= +github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75/go.mod h1:KO6IkyS8Y3j8OdNO85qEYBsRPuteD+YciPomcXdrMnk= +github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/urfave/cli v1.22.12/go.mod h1:sSBEIC79qR6OvcmsD4U3KABeOTxDqQtdDnaFuUN30b8= +github.com/vishvananda/netlink v1.2.1-beta.2/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.etcd.io/etcd/api/v3 v3.5.10/go.mod h1:TidfmT4Uycad3NM/o25fG3J07odo4GBB9hoxaodFCtI= +go.etcd.io/etcd/client/pkg/v3 v3.5.10/go.mod h1:DYivfIviIuQ8+/lCq4vcxuseg2P2XbHygkKwFo9fc8U= +go.etcd.io/etcd/client/v2 v2.305.10/go.mod h1:m3CKZi69HzilhVqtPDcjhSGp+kA1OmbNn0qamH80xjA= +go.etcd.io/etcd/client/v3 v3.5.10/go.mod h1:RVeBnDz2PUEZqTpgqwAtUd8nAPf5kjyFyND7P1VkOKc= +go.etcd.io/etcd/pkg/v3 v3.5.10/go.mod h1:TKTuCKKcF1zxmfKWDkfz5qqYaE3JncKKZPFf8c1nFUs= +go.etcd.io/etcd/raft/v3 v3.5.10/go.mod h1:odD6kr8XQXTy9oQnyMPBOr0TVe+gT0neQhElQ6jbGRc= +go.etcd.io/etcd/server/v3 v3.5.10/go.mod h1:gBplPHfs6YI0L+RpGkTQO7buDbHv5HJGG/Bst0/zIPo= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.0/go.mod h1:Ct6zzQEuGK3WpJs2n4dn+wfJYzd/+hNnxMRTWjGn30M= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0/go.mod h1:SeQhzAEccGVZVEy7aH87Nh0km+utSpo1pTv6eMMop48= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.14.0/go.mod h1:UFG7EBMRdXyFstOwH028U0sVf+AvukSGhF0g8+dmNG8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.14.0/go.mod h1:+N7zNjIJv4K+DeX67XXET0P+eIciESgaFDBqh+ZJFS4= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/telemetry v0.0.0-20240208230135-b75ee8823808/go.mod h1:KG1lNk5ZFNssSZLrpVb4sMXKMpGwGXOxSG3rnu2gZQQ= +golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= +golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d h1:VBu5YqKPv6XiJ199exd8Br+Aetz+o08F+PLMnwJQHAY= +google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= +gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +k8s.io/cri-api v0.27.1/go.mod h1:+Ts/AVYbIo04S86XbTD73UPp/DkTiYxtsFeOFEu32L0= +k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/kms v0.29.1/go.mod h1:Hqkx3zEGWThUTbcSkK508DUv4c1HOJOB5qihSoLBWgU= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.28.0/go.mod h1:VHVDI/KrK4fjnV61bE2g3sA7tiETLn8sooImelsCx3Y= diff --git a/pkg/interlink/api/create.go b/pkg/interlink/api/create.go index c3afbf9b..871ae3e4 100644 --- a/pkg/interlink/api/create.go +++ b/pkg/interlink/api/create.go @@ -9,7 +9,7 @@ import ( "github.com/containerd/containerd/log" - types "github.com/intertwin-eu/interlink/pkg/interlink" + types "github.com/interlink-hq/interlink/pkg/interlink" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" @@ -25,10 +25,11 @@ func (h *InterLinkHandler) CreateHandler(w http.ResponseWriter, r *http.Request) )) defer span.End() defer types.SetDurationSpan(start, span) + defer types.SetInfoFromHeaders(span, &r.Header) log.G(h.Ctx).Info("InterLink: received Create call") - statusCode := -1 + var statusCode int bodyBytes, err := io.ReadAll(r.Body) if err != nil { @@ -38,8 +39,8 @@ func (h *InterLinkHandler) CreateHandler(w http.ResponseWriter, r *http.Request) return } - var req *http.Request //request to forward to sidecar - var pod types.PodCreateRequests //request for interlink + var req *http.Request // request to forward to sidecar + var pod types.PodCreateRequests // request for interlink err = json.Unmarshal(bodyBytes, &pod) if err != nil { statusCode = http.StatusInternalServerError @@ -56,14 +57,22 @@ func (h *InterLinkHandler) CreateHandler(w http.ResponseWriter, r *http.Request) var retrievedData []types.RetrievedPodData - data := types.RetrievedPodData{} - if h.Config.ExportPodData { - data, err = getData(h.Ctx, h.Config, pod, span) - if err != nil { - statusCode = http.StatusInternalServerError - log.G(h.Ctx).Error(err) - w.WriteHeader(statusCode) - return + data, err := getData(h.Ctx, h.Config, pod, span) + if err != nil { + statusCode = http.StatusInternalServerError + log.G(h.Ctx).Error(err) + w.WriteHeader(statusCode) + return + } + + if log.G(h.Ctx).Logger.IsLevelEnabled(log.DebugLevel) { + // For debugging purpose only. + allContainers := pod.Pod.Spec.InitContainers + allContainers = append(allContainers, pod.Pod.Spec.Containers...) + for _, container := range allContainers { + for _, envVar := range container.Env { + log.G(h.Ctx).Debug("InterLink VK environment variable to pod ", pod.Pod.Name, " container: ", container.Name, " env: ", envVar.Name, " value: ", envVar.Value) + } } } @@ -81,7 +90,6 @@ func (h *InterLinkHandler) CreateHandler(w http.ResponseWriter, r *http.Request) log.G(h.Ctx).Info(req) req, err = http.NewRequest(http.MethodPost, h.SidecarEndpoint+"/create", reader) - if err != nil { statusCode = http.StatusInternalServerError w.WriteHeader(statusCode) @@ -90,31 +98,13 @@ func (h *InterLinkHandler) CreateHandler(w http.ResponseWriter, r *http.Request) } log.G(h.Ctx).Info("InterLink: forwarding Create call to sidecar") - var resp *http.Response - req.Header.Set("Content-Type", "application/json") - resp, err = http.DefaultClient.Do(req) + sessionContext := GetSessionContext(r) + _, err := ReqWithError(h.Ctx, req, w, start, span, true, false, sessionContext, h.ClientHTTP) if err != nil { - statusCode = http.StatusInternalServerError - w.WriteHeader(statusCode) - log.G(h.Ctx).Error(err) + log.L.Error(err) return } - if resp != nil { - if resp.StatusCode == http.StatusOK { - statusCode = http.StatusOK - log.G(h.Ctx).Debug(statusCode) - } else { - statusCode = http.StatusInternalServerError - log.G(h.Ctx).Error(statusCode) - } - - returnValue, _ := io.ReadAll(resp.Body) - log.G(h.Ctx).Debug(string(returnValue)) - w.WriteHeader(statusCode) - types.SetDurationSpan(start, span, types.WithHTTPReturnCode(statusCode)) - w.Write(returnValue) - } } } diff --git a/pkg/interlink/api/delete.go b/pkg/interlink/api/delete.go index cce503ad..cb4da1ff 100644 --- a/pkg/interlink/api/delete.go +++ b/pkg/interlink/api/delete.go @@ -10,7 +10,7 @@ import ( "github.com/containerd/containerd/log" v1 "k8s.io/api/core/v1" - types "github.com/intertwin-eu/interlink/pkg/interlink" + types "github.com/interlink-hq/interlink/pkg/interlink" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" @@ -26,11 +26,12 @@ func (h *InterLinkHandler) DeleteHandler(w http.ResponseWriter, r *http.Request) )) defer span.End() defer types.SetDurationSpan(start, span) + defer types.SetInfoFromHeaders(span, &r.Header) log.G(h.Ctx).Info("InterLink: received Delete call") bodyBytes, err := io.ReadAll(r.Body) - statusCode := http.StatusOK + var statusCode int if err != nil { statusCode = http.StatusInternalServerError @@ -42,7 +43,6 @@ func (h *InterLinkHandler) DeleteHandler(w http.ResponseWriter, r *http.Request) var pod *v1.Pod reader := bytes.NewReader(bodyBytes) err = json.Unmarshal(bodyBytes, &pod) - if err != nil { statusCode = http.StatusInternalServerError w.WriteHeader(statusCode) @@ -66,34 +66,10 @@ func (h *InterLinkHandler) DeleteHandler(w http.ResponseWriter, r *http.Request) req.Header.Set("Content-Type", "application/json") log.G(h.Ctx).Info("InterLink: forwarding Delete call to sidecar") - resp, err := http.DefaultClient.Do(req) + sessionContext := GetSessionContext(r) + _, err = ReqWithError(h.Ctx, req, w, start, span, true, false, sessionContext, h.ClientHTTP) if err != nil { - statusCode = http.StatusInternalServerError - w.WriteHeader(statusCode) - log.G(h.Ctx).Error(err) + log.L.Error(err) return } - - if resp != nil { - returnValue, _ := io.ReadAll(resp.Body) - statusCode = resp.StatusCode - - if statusCode != http.StatusOK { - w.WriteHeader(http.StatusInternalServerError) - } else { - w.WriteHeader(http.StatusOK) - } - log.G(h.Ctx).Debug("InterLink: " + string(returnValue)) - var returnJson []types.PodStatus - returnJson = append(returnJson, types.PodStatus{PodName: pod.Name, PodUID: string(pod.UID), PodNamespace: pod.Namespace}) - - bodyBytes, err = json.Marshal(returnJson) - if err != nil { - log.G(h.Ctx).Error(err) - w.Write([]byte{}) - } else { - types.SetDurationSpan(start, span, types.WithHTTPReturnCode(statusCode)) - w.Write(bodyBytes) - } - } } diff --git a/pkg/interlink/api/func.go b/pkg/interlink/api/func.go index a9915273..68c90cb4 100644 --- a/pkg/interlink/api/func.go +++ b/pkg/interlink/api/func.go @@ -2,7 +2,7 @@ package api import ( "context" - "path/filepath" + "strings" "sync" "time" @@ -11,7 +11,7 @@ import ( trace "go.opentelemetry.io/otel/trace" v1 "k8s.io/api/core/v1" - types "github.com/intertwin-eu/interlink/pkg/interlink" + types "github.com/interlink-hq/interlink/pkg/interlink" ) type MutexStatuses struct { @@ -24,7 +24,7 @@ var PodStatuses MutexStatuses // getData retrieves ConfigMaps, Secrets and EmptyDirs from the provided pod by calling the retrieveData function. // The config is needed by the retrieveData function. // The function aggregates the return values of retrieveData function in a commonIL.RetrievedPodData variable and returns it, along with the first encountered error. -func getData(ctx context.Context, config types.InterLinkConfig, pod types.PodCreateRequests, span trace.Span) (types.RetrievedPodData, error) { +func getData(ctx context.Context, config types.Config, pod types.PodCreateRequests, span trace.Span) (types.RetrievedPodData, error) { start := time.Now().UnixMicro() span.AddEvent("Retrieving data for pod " + pod.Pod.Name) log.G(ctx).Debug(pod.ConfigMaps) @@ -35,10 +35,10 @@ func getData(ctx context.Context, config types.InterLinkConfig, pod types.PodCre startContainer := time.Now().UnixMicro() log.G(ctx).Info("- Retrieving Secrets and ConfigMaps for the Docker Sidecar. InitContainer: " + container.Name) log.G(ctx).Debug(container.VolumeMounts) - data, InterlinkIP := retrieveData(ctx, config, pod, container) - if InterlinkIP != nil { - log.G(ctx).Error(InterlinkIP) - return types.RetrievedPodData{}, InterlinkIP + data, err := retrieveData(ctx, config, pod, container) + if err != nil { + log.G(ctx).Error(err) + return types.RetrievedPodData{}, err } retrievedData.Containers = append(retrievedData.Containers, data) @@ -73,40 +73,76 @@ func getData(ctx context.Context, config types.InterLinkConfig, pod types.PodCre // retrieveData retrieves ConfigMaps, Secrets and EmptyDirs. // The config is needed to specify the EmptyDirs mounting point. // It returns the retrieved data in a variable of type commonIL.RetrievedContainer and the first encountered error. -func retrieveData(ctx context.Context, config types.InterLinkConfig, pod types.PodCreateRequests, container v1.Container) (types.RetrievedContainer, error) { +func retrieveData(ctx context.Context, _ types.Config, pod types.PodCreateRequests, container v1.Container) (types.RetrievedContainer, error) { retrievedData := types.RetrievedContainer{} + retrievedData.Name = container.Name for _, mountVar := range container.VolumeMounts { - log.G(ctx).Debug("-- Retrieving data for mountpoint " + mountVar.Name) + log.G(ctx).Debug("-- Retrieving data for mountpoint ", mountVar.Name) + loopVolumes: for _, vol := range pod.Pod.Spec.Volumes { if vol.Name == mountVar.Name { - if vol.ConfigMap != nil { - - log.G(ctx).Info("--- Retrieving ConfigMap " + vol.ConfigMap.Name) - retrievedData.Name = container.Name + switch { + case vol.ConfigMap != nil: + log.G(ctx).Info("--- Retrieving ConfigMap ", vol.ConfigMap.Name) for _, cfgMap := range pod.ConfigMaps { if cfgMap.Name == vol.ConfigMap.Name { - retrievedData.Name = container.Name + log.G(ctx).Debug("configMap found! Name: ", cfgMap.Name) retrievedData.ConfigMaps = append(retrievedData.ConfigMaps, cfgMap) + break loopVolumes } } + // This should not happen, error. Building error context. + var configMapsKeys []string + for _, cfgMap := range pod.ConfigMaps { + configMapsKeys = append(configMapsKeys, cfgMap.Name) + } + log.G(ctx).Errorf("could not find in retrievedData the matching object for volume: %s (pod: %s container: %s configMap: %s) retrievedData keys: %s", vol.Name, + pod.Pod.Name, container.Name, vol.ConfigMap.Name, strings.Join(configMapsKeys, ",")) + + case vol.Projected != nil: + log.G(ctx).Info("--- Retrieving ProjectedVolume ", vol.Name) + for _, projectedVolumeMap := range pod.ProjectedVolumeMaps { + log.G(ctx).Debug("Comparing projectedVolumeMap.Name: ", projectedVolumeMap.Name, " with vol.Name: ", vol.Name) + if projectedVolumeMap.Name == vol.Name { + log.G(ctx).Debug("projectedVolumeMap found! Name: ", projectedVolumeMap.Name) + + retrievedData.ProjectedVolumeMaps = append(retrievedData.ProjectedVolumeMaps, projectedVolumeMap) + break loopVolumes + } + } + // This should not happen, error. Building error context. + var projectedVolumeMapsKeys []string + for _, projectedVolumeMap := range pod.ProjectedVolumeMaps { + projectedVolumeMapsKeys = append(projectedVolumeMapsKeys, projectedVolumeMap.Name) + } + log.G(ctx).Errorf("could not find in retrievedData the matching object for volume: %s (pod: %s container: %s projectedVolumeMap) retrievedData keys: %s", + vol.Name, pod.Pod.Name, container.Name, strings.Join(projectedVolumeMapsKeys, ",")) - } else if vol.Secret != nil { - - log.G(ctx).Info("--- Retrieving Secret " + vol.Secret.SecretName) - retrievedData.Name = container.Name + case vol.Secret != nil: + log.G(ctx).Info("--- Retrieving Secret ", vol.Secret.SecretName) for _, secret := range pod.Secrets { if secret.Name == vol.Secret.SecretName { - retrievedData.Name = container.Name + log.G(ctx).Debug("secret found! Name: ", secret.Name) retrievedData.Secrets = append(retrievedData.Secrets, secret) + break loopVolumes } } + // This should not happen, error. Building error context. + var secretKeys []string + for _, secret := range pod.Secrets { + secretKeys = append(secretKeys, secret.Name) + } + log.G(ctx).Errorf("could not find in retrievedData the matching object for volume: %s (pod: %s container: %s secret: %s) retrievedData keys: %s", + pod.Pod.Name, container.Name, vol.Name, vol.Secret.SecretName, strings.Join(secretKeys, ",")) - } else if vol.EmptyDir != nil { - edPath := filepath.Join(config.DataRootFolder, pod.Pod.Namespace+"-"+string(pod.Pod.UID)+"/"+"emptyDirs/"+vol.Name) + case vol.EmptyDir != nil: + // Deprecated: EmptyDirs is useless at VK level. It should be moved to plugin level. + // edPath := filepath.Join(config.DataRootFolder, pod.Pod.Namespace+"-"+string(pod.Pod.UID), "emptyDirs", vol.Name) + // retrievedData.EmptyDirs = append(retrievedData.EmptyDirs, edPath) - retrievedData.Name = container.Name - retrievedData.EmptyDirs = append(retrievedData.EmptyDirs, edPath) + default: + log.G(ctx).Warning("ignoring unsupported volume type for ", mountVar.Name) } } } @@ -125,11 +161,7 @@ func deleteCachedStatus(uid string) { func checkIfCached(uid string) bool { _, ok := PodStatuses.Statuses[uid] - if ok { - return true - } else { - return false - } + return ok } // updateStatuses locks and updates the PodStatuses map with the statuses contained in the returnedStatuses slice @@ -137,7 +169,7 @@ func updateStatuses(returnedStatuses []types.PodStatus) { PodStatuses.mu.Lock() for _, new := range returnedStatuses { - //log.G(ctx).Debug(PodStatuses.Statuses, new) + // log.G(ctx).Debug(PodStatuses.Statuses, new) PodStatuses.Statuses[new.PodUID] = new } diff --git a/pkg/interlink/api/handler.go b/pkg/interlink/api/handler.go index 54dcecd6..76aed079 100644 --- a/pkg/interlink/api/handler.go +++ b/pkg/interlink/api/handler.go @@ -1,14 +1,176 @@ package api import ( + "bufio" "context" + "fmt" + "io" + "net/http" + "strconv" - "github.com/intertwin-eu/interlink/pkg/interlink" + "github.com/containerd/containerd/log" + "github.com/google/uuid" + + trace "go.opentelemetry.io/otel/trace" + + "github.com/interlink-hq/interlink/pkg/interlink" ) type InterLinkHandler struct { - Config interlink.InterLinkConfig + Config interlink.Config Ctx context.Context SidecarEndpoint string + ClientHTTP *http.Client // TODO: http client with TLS } + +func AddSessionContext(req *http.Request, sessionContext string) { + req.Header.Set("InterLink-Http-Session", sessionContext) +} + +func GetSessionContext(r *http.Request) string { + sessionContext := r.Header.Get("InterLink-Http-Session") + if sessionContext == "" { + id := uuid.New() + sessionContext = "Request-" + id.String() + } + return sessionContext +} + +func GetSessionContextMessage(sessionContext string) string { + return "HTTP InterLink session " + sessionContext + ": " +} + +// respondWithReturn: if false, return nil. Useful when body is too big to be contained in one big string. +// sessionNumber: integer number for debugging purpose, generated from InterLink VK, to follow HTTP request from end-to-end. +func ReqWithError( + ctx context.Context, + req *http.Request, + w http.ResponseWriter, + start int64, + span trace.Span, + respondWithValues bool, + respondWithReturn bool, + sessionContext string, + clientHTTP *http.Client, +) ([]byte, error) { + req.Header.Set("Content-Type", "application/json") + + sessionContextMessage := GetSessionContextMessage(sessionContext) + log.G(ctx).Debug(sessionContextMessage, "doing request: ", fmt.Sprintf("%#v", req)) + + // Add session number for end-to-end from API to InterLink plugin (eg interlink-slurm-plugin) + AddSessionContext(req, sessionContext) + + resp, err := clientHTTP.Do(req) + if err != nil { + statusCode := http.StatusInternalServerError + w.WriteHeader(statusCode) + errWithContext := fmt.Errorf(sessionContextMessage+"error doing DoReq() of ReqWithErrorWithSessionNumber error %w", err) + return nil, errWithContext + } + defer resp.Body.Close() + + w.WriteHeader(resp.StatusCode) + // Flush headers ASAP so that the client is not blocked in request. + if f, ok := w.(http.Flusher); ok { + log.G(ctx).Debug(sessionContextMessage, "Flushing client...") + f.Flush() + } else { + log.G(ctx).Error(sessionContextMessage, "could not flush because server does not support Flusher.") + } + + if resp.StatusCode != http.StatusOK { + log.G(ctx).Error(sessionContextMessage, "HTTP request in error.") + statusCode := http.StatusInternalServerError + w.WriteHeader(statusCode) + ret, err := io.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf(sessionContextMessage+"HTTP request in error and could not read body response error: %w", err) + } + errHTTP := fmt.Errorf(sessionContextMessage+"call exit status: %d. Body: %s", statusCode, ret) + log.G(ctx).Error(errHTTP) + _, err = w.Write([]byte(errHTTP.Error())) + if err != nil { + return nil, fmt.Errorf(sessionContextMessage+"HTTP request in error and could not write all body response to InterLink Node error: %w", err) + } + return nil, errHTTP + } + + interlink.SetDurationSpan(start, span, interlink.WithHTTPReturnCode(resp.StatusCode)) + + if respondWithReturn { + + log.G(ctx).Debug(sessionContextMessage, "reading all body once for all") + returnValue, err := io.ReadAll(resp.Body) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + return nil, fmt.Errorf(sessionContextMessage+"error doing ReadAll() of ReqWithErrorComplex see error %w", err) + } + + if respondWithValues { + _, err = w.Write(returnValue) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + return nil, fmt.Errorf(sessionContextMessage+"error doing Write() of ReqWithErrorComplex see error %w", err) + } + } + + return returnValue, nil + } + + // Case no return needed. + + if respondWithValues { + // Because no return needed, we can write continuously instead of writing one big block of data. + // Useful to get following logs. + log.G(ctx).Debug(sessionContextMessage, "in respondWithValues loop, reading body continuously until EOF") + + // In this case, we return continuously the values in the w, instead of reading it all. This allows for logs to be followed. + bodyReader := bufio.NewReader(resp.Body) + + // 4096 is bufio.NewReader default buffer size. + bufferBytes := make([]byte, 4096) + + // Looping until we get EOF from sidecar. + for { + log.G(ctx).Debug(sessionContextMessage, "trying to read some bytes from InterLink sidecar "+req.RequestURI) + n, err := bodyReader.Read(bufferBytes) + if err != nil { + if err == io.EOF { + log.G(ctx).Debug(sessionContextMessage, "received EOF and read number of bytes: "+strconv.Itoa(n)) + + // EOF but we still have something to read! + if n != 0 { + _, err = w.Write(bufferBytes[:n]) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + return nil, fmt.Errorf(sessionContextMessage+"could not write during ReqWithError() error: %w", err) + } + } + return nil, nil + } + // Error during read. + w.WriteHeader(http.StatusInternalServerError) + return nil, fmt.Errorf(sessionContextMessage+"could not read HTTP body: see error %w", err) + } + log.G(ctx).Debug(sessionContextMessage, "received some bytes from InterLink sidecar") + _, err = w.Write(bufferBytes[:n]) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + return nil, fmt.Errorf(sessionContextMessage+"could not write during ReqWithError() error: %w", err) + } + + // Flush otherwise it will take time to appear in kubectl logs. + if f, ok := w.(http.Flusher); ok { + log.G(ctx).Debug(sessionContextMessage, "Wrote some logs, now flushing...") + f.Flush() + } else { + log.G(ctx).Error(sessionContextMessage, "could not flush because server does not support Flusher.") + } + } + } + + // Case no respondWithValue no respondWithReturn , it means we are doing a request and not using response. + return nil, nil +} diff --git a/pkg/interlink/api/logs.go b/pkg/interlink/api/logs.go index 63bd6f16..c2384ca7 100644 --- a/pkg/interlink/api/logs.go +++ b/pkg/interlink/api/logs.go @@ -6,12 +6,11 @@ import ( "errors" "io" "net/http" - "strconv" "time" "github.com/containerd/containerd/log" - types "github.com/intertwin-eu/interlink/pkg/interlink" + types "github.com/interlink-hq/interlink/pkg/interlink" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" @@ -26,21 +25,25 @@ func (h *InterLinkHandler) GetLogsHandler(w http.ResponseWriter, r *http.Request )) defer span.End() defer types.SetDurationSpan(start, span) + defer types.SetInfoFromHeaders(span, &r.Header) - statusCode := http.StatusOK - log.G(h.Ctx).Info("InterLink: received GetLogs call") + sessionContext := GetSessionContext(r) + sessionContextMessage := GetSessionContextMessage(sessionContext) + + var statusCode int + log.G(h.Ctx).Info(sessionContextMessage, "InterLink: received GetLogs call") bodyBytes, err := io.ReadAll(r.Body) if err != nil { - log.G(h.Ctx).Fatal(err) + log.G(h.Ctx).Fatal(sessionContextMessage, err) } - log.G(h.Ctx).Info("InterLink: unmarshal GetLogs request") - var req2 types.LogStruct //incoming request. To be used in interlink API. req is directly forwarded to sidecar + log.G(h.Ctx).Info(sessionContextMessage, "InterLink: unmarshal GetLogs request") + var req2 types.LogStruct // incoming request. To be used in interlink API. req is directly forwarded to sidecar err = json.Unmarshal(bodyBytes, &req2) if err != nil { statusCode = http.StatusInternalServerError w.WriteHeader(statusCode) - log.G(h.Ctx).Error(err) + log.G(h.Ctx).Error(sessionContextMessage, err) return } @@ -56,20 +59,27 @@ func (h *InterLinkHandler) GetLogsHandler(w http.ResponseWriter, r *http.Request attribute.Bool("opts.timestamps", req2.Opts.Timestamps), ) - log.G(h.Ctx).Info("InterLink: new GetLogs podUID: now ", string(req2.PodUID)) + log.G(h.Ctx).Info(sessionContextMessage, "InterLink: new GetLogs podUID: now ", req2.PodUID) if (req2.Opts.Tail != 0 && req2.Opts.LimitBytes != 0) || (req2.Opts.SinceSeconds != 0 && !req2.Opts.SinceTime.IsZero()) { statusCode = http.StatusInternalServerError w.WriteHeader(statusCode) + if req2.Opts.Tail != 0 && req2.Opts.LimitBytes != 0 { - w.Write([]byte("Both Tail and LimitBytes set. Set only one of them")) - } else { - w.Write([]byte("Both SinceSeconds and SinceTime set. Set only one of them")) + _, err = w.Write([]byte("Both Tail and LimitBytes set. Set only one of them")) + if err != nil { + log.G(h.Ctx).Error(errors.New(sessionContextMessage + "Failed to write to http buffer")) + } + return } - log.G(h.Ctx).Error(errors.New("check opts configurations")) - return + + _, err = w.Write([]byte("Both SinceSeconds and SinceTime set. Set only one of them")) + if err != nil { + log.G(h.Ctx).Error(errors.New(sessionContextMessage + "Failed to write to http buffer")) + } + } - log.G(h.Ctx).Info("InterLink: marshal GetLogs request ") + log.G(h.Ctx).Info(sessionContextMessage, "InterLink: marshal GetLogs request ") bodyBytes, err = json.Marshal(req2) if err != nil { @@ -79,33 +89,23 @@ func (h *InterLinkHandler) GetLogsHandler(w http.ResponseWriter, r *http.Request return } reader := bytes.NewReader(bodyBytes) + log.G(h.Ctx).Info("Sending log request to: ", h.SidecarEndpoint) req, err := http.NewRequest(http.MethodGet, h.SidecarEndpoint+"/getLogs", reader) if err != nil { log.G(h.Ctx).Fatal(err) } req.Header.Set("Content-Type", "application/json") - log.G(h.Ctx).Info("InterLink: forwarding GetLogs call to sidecar") - resp, err := http.DefaultClient.Do(req) - if err != nil { - statusCode = http.StatusInternalServerError - w.WriteHeader(statusCode) - log.G(h.Ctx).Error(err) - return - } - - if resp != nil { - if resp.StatusCode != http.StatusOK { - log.L.Error("Unexpected error occured. Status code: " + strconv.Itoa(resp.StatusCode) + ". Check Sidecar's logs for further informations") - statusCode = http.StatusInternalServerError - } - - returnValue, _ := io.ReadAll(resp.Body) - log.G(h.Ctx).Debug("InterLink: logs " + string(returnValue)) - types.SetDurationSpan(start, span, types.WithHTTPReturnCode(statusCode)) + // logTransport := http.DefaultTransport.(*http.Transport).Clone() + // // logTransport.DisableKeepAlives = true + // // logTransport.MaxIdleConnsPerHost = -1 + // var logHTTPClient = &http.Client{Transport: logTransport} - w.WriteHeader(statusCode) - w.Write(returnValue) + log.G(h.Ctx).Info(sessionContextMessage, "InterLink: forwarding GetLogs call to sidecar") + _, err = ReqWithError(h.Ctx, req, w, start, span, true, false, sessionContext, h.ClientHTTP) + if err != nil { + log.L.Error(sessionContextMessage, err) + return } } diff --git a/pkg/interlink/api/ping.go b/pkg/interlink/api/ping.go index c0109031..2a6611d1 100644 --- a/pkg/interlink/api/ping.go +++ b/pkg/interlink/api/ping.go @@ -3,14 +3,16 @@ package api import ( "bytes" "encoding/json" + "errors" "net/http" "strconv" "time" "github.com/containerd/containerd/log" - types "github.com/intertwin-eu/interlink/pkg/interlink" v1 "k8s.io/api/core/v1" + types "github.com/interlink-hq/interlink/pkg/interlink" + "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" trace "go.opentelemetry.io/otel/trace" @@ -25,6 +27,7 @@ func (h *InterLinkHandler) Ping(w http.ResponseWriter, r *http.Request) { )) defer span.End() defer types.SetDurationSpan(start, span) + defer types.SetInfoFromHeaders(span, &r.Header) log.G(h.Ctx).Info("InterLink: received Ping call") @@ -43,25 +46,40 @@ func (h *InterLinkHandler) Ping(w http.ResponseWriter, r *http.Request) { log.G(h.Ctx).Info("InterLink: forwarding GetStatus call to sidecar") req.Header.Set("Content-Type", "application/json") log.G(h.Ctx).Debug(req) - respPlugin, err := http.DefaultClient.Do(req) + + // ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + // defer cancel() + // respPlugin, err := http.DefaultClient.Do(req) + // respPlugin, err := DoReq(req.WithContext(ctx)) + sessionContext := GetSessionContext(req) + _, err = ReqWithError(h.Ctx, req, w, start, span, true, false, sessionContext, h.ClientHTTP) if err != nil { log.G(h.Ctx).Error(err) w.WriteHeader(http.StatusServiceUnavailable) - w.Write([]byte(strconv.Itoa(http.StatusServiceUnavailable))) - return - } - - if respPlugin != nil { - if respPlugin.StatusCode != http.StatusOK { - log.G(h.Ctx).Error("error pinging plugin") - w.WriteHeader(respPlugin.StatusCode) - w.Write([]byte(strconv.Itoa(http.StatusServiceUnavailable))) - return + _, err = w.Write([]byte(strconv.Itoa(http.StatusServiceUnavailable))) + if err != nil { + log.G(h.Ctx).Error(errors.New("failed to write to http buffer")) } - - types.SetDurationSpan(start, span, types.WithHTTPReturnCode(respPlugin.StatusCode)) - - w.WriteHeader(http.StatusOK) - w.Write([]byte("0")) + return } + // defer respPlugin.Body.Close() + // + // if respPlugin.StatusCode != http.StatusOK { + // log.G(h.Ctx).Error("error pinging plugin") + // w.WriteHeader(respPlugin.StatusCode) + // _, err = w.Write([]byte(strconv.Itoa(http.StatusServiceUnavailable))) + // if err != nil { + // log.G(h.Ctx).Error(errors.New("Failed to write to http buffer")) + // } + // + // return + // } + // + // types.SetDurationSpan(start, span, types.WithHTTPReturnCode(respPlugin.StatusCode)) + // + // w.WriteHeader(http.StatusOK) + // _, err = w.Write([]byte("0")) + // if err != nil { + // log.G(h.Ctx).Error(errors.New("Failed to write to http buffer")) + // } } diff --git a/pkg/interlink/api/status.go b/pkg/interlink/api/status.go index 7e0c04bb..84d40764 100644 --- a/pkg/interlink/api/status.go +++ b/pkg/interlink/api/status.go @@ -3,15 +3,16 @@ package api import ( "bytes" "encoding/json" + "errors" + "fmt" "io" "net/http" - "strconv" "time" "github.com/containerd/containerd/log" v1 "k8s.io/api/core/v1" - types "github.com/intertwin-eu/interlink/pkg/interlink" + types "github.com/interlink-hq/interlink/pkg/interlink" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" @@ -21,11 +22,12 @@ import ( func (h *InterLinkHandler) StatusHandler(w http.ResponseWriter, r *http.Request) { start := time.Now().UnixMicro() tracer := otel.Tracer("interlink-API") - _, span := tracer.Start(h.Ctx, "PingAPI", trace.WithAttributes( + _, span := tracer.Start(h.Ctx, "StatusAPI", trace.WithAttributes( attribute.Int64("start.timestamp", start), )) defer span.End() defer types.SetDurationSpan(start, span) + defer types.SetInfoFromHeaders(span, &r.Header) statusCode := http.StatusOK var pods []*v1.Pod log.G(h.Ctx).Info("InterLink: received GetStatus call") @@ -37,7 +39,8 @@ func (h *InterLinkHandler) StatusHandler(w http.ResponseWriter, r *http.Request) err = json.Unmarshal(bodyBytes, &pods) if err != nil { - log.G(h.Ctx).Error(err) + errWithContext := fmt.Errorf("error doing fisrt Unmarshal() in StatusHandler() error detail: %s error: %w", fmt.Sprintf("%#v", err), err) + log.G(h.Ctx).Error(errWithContext) } span.SetAttributes( @@ -45,28 +48,21 @@ func (h *InterLinkHandler) StatusHandler(w http.ResponseWriter, r *http.Request) ) var podsToBeChecked []*v1.Pod - var returnedStatuses []types.PodStatus //returned from the query to the sidecar - var returnPods []types.PodStatus //returned to the vk + var returnedStatuses []types.PodStatus // returned from the query to the sidecar + var returnPods []types.PodStatus // returned to the vk PodStatuses.mu.Lock() for _, pod := range pods { cached := checkIfCached(string(pod.UID)) if pod.Status.Phase == v1.PodRunning || pod.Status.Phase == v1.PodPending || !cached { - span.AddEvent("Pod "+pod.Name+" is not cached", trace.WithAttributes( - attribute.String("pod.name", pod.Name), - attribute.String("pod.namespace", pod.Namespace), - attribute.String("pod.uid", string(pod.UID)), - attribute.String("pod.phase", string(pod.Status.Phase)), - )) podsToBeChecked = append(podsToBeChecked, pod) - } else if cached { - span.AddEvent("Pod "+pod.Name+" is cached", trace.WithAttributes( - attribute.String("pod.name", pod.Name), - attribute.String("pod.namespace", pod.Namespace), - attribute.String("pod.uid", string(pod.UID)), - attribute.String("pod.phase", string(pod.Status.Phase)), - )) } + span.AddEvent("Pod "+pod.Name+" is cached", trace.WithAttributes( + attribute.String("pod.name", pod.Name), + attribute.String("pod.namespace", pod.Namespace), + attribute.String("pod.uid", string(pod.UID)), + attribute.String("pod.phase", string(pod.Status.Phase)), + )) } PodStatuses.mu.Unlock() @@ -85,41 +81,25 @@ func (h *InterLinkHandler) StatusHandler(w http.ResponseWriter, r *http.Request) log.G(h.Ctx).Info("InterLink: forwarding GetStatus call to sidecar") req.Header.Set("Content-Type", "application/json") - log.G(h.Ctx).Debug(req) - resp, err := http.DefaultClient.Do(req) + + sessionContext := GetSessionContext(r) + bodyBytes, err = ReqWithError(h.Ctx, req, w, start, span, false, true, sessionContext, h.ClientHTTP) + if err != nil { + log.L.Error(err) + return + } + + err = json.Unmarshal(bodyBytes, &returnedStatuses) if err != nil { statusCode = http.StatusInternalServerError w.WriteHeader(statusCode) - log.G(h.Ctx).Error(err) + errWithContext := fmt.Errorf("error doing Unmarshal() in StatusHandler() of req %s error detail: %s error: %w", fmt.Sprintf("%#v", req), fmt.Sprintf("%#v", err), err) + log.G(h.Ctx).Error(errWithContext) return } - if resp != nil { - if resp.StatusCode != http.StatusOK { - log.L.Error("Unexpected error occured. Status code: " + strconv.Itoa(resp.StatusCode) + ". Check Sidecar's logs for further informations") - statusCode = http.StatusInternalServerError - } - - bodyBytes, err = io.ReadAll(resp.Body) - if err != nil { - statusCode = http.StatusInternalServerError - w.WriteHeader(statusCode) - log.G(h.Ctx).Error(err) - return - } - - log.G(h.Ctx).Debug(string(bodyBytes)) - err = json.Unmarshal(bodyBytes, &returnedStatuses) - if err != nil { - statusCode = http.StatusInternalServerError - w.WriteHeader(statusCode) - log.G(h.Ctx).Error(err) - return - } - - updateStatuses(returnedStatuses) - types.SetDurationSpan(start, span, types.WithHTTPReturnCode(statusCode)) - } + updateStatuses(returnedStatuses) + types.SetDurationSpan(start, span, types.WithHTTPReturnCode(statusCode)) } @@ -147,8 +127,10 @@ func (h *InterLinkHandler) StatusHandler(w http.ResponseWriter, r *http.Request) log.G(h.Ctx).Error(err) return } - log.G(h.Ctx).Debug("InterLink: status " + string(returnValue)) w.WriteHeader(statusCode) - w.Write(returnValue) + _, err = w.Write(returnValue) + if err != nil { + log.G(h.Ctx).Error(errors.New("failed to write to http buffer")) + } } diff --git a/pkg/interlink/api/updateCache.go b/pkg/interlink/api/updateCache.go index a376bfc4..a2a10983 100644 --- a/pkg/interlink/api/updateCache.go +++ b/pkg/interlink/api/updateCache.go @@ -1,6 +1,7 @@ package api import ( + "errors" "io" "net/http" @@ -21,5 +22,8 @@ func (h *InterLinkHandler) UpdateCacheHandler(w http.ResponseWriter, r *http.Req deleteCachedStatus(string(bodyBytes)) w.WriteHeader(statusCode) - w.Write([]byte("Updated cache")) + _, err = w.Write([]byte("Updated cache")) + if err != nil { + log.G(h.Ctx).Error(errors.New("failed to write to http buffer")) + } } diff --git a/pkg/interlink/config.go b/pkg/interlink/config.go index 89e1af72..864f1bdf 100644 --- a/pkg/interlink/config.go +++ b/pkg/interlink/config.go @@ -2,34 +2,176 @@ package interlink import ( "context" + "crypto/tls" + "crypto/x509" "flag" + "fmt" "os" + "time" "github.com/containerd/containerd/log" + "github.com/google/uuid" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" + "go.opentelemetry.io/otel/propagation" + "go.opentelemetry.io/otel/sdk/resource" + sdktrace "go.opentelemetry.io/otel/sdk/trace" + semconv "go.opentelemetry.io/otel/semconv/v1.21.0" + "google.golang.org/grpc" + "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/credentials/insecure" "gopkg.in/yaml.v2" ) -// InterLinkConfig holds the whole configuration -type InterLinkConfig struct { +// Config holds the whole configuration +type Config struct { InterlinkAddress string `yaml:"InterlinkAddress"` Interlinkport string `yaml:"InterlinkPort"` Sidecarurl string `yaml:"SidecarURL"` Sidecarport string `yaml:"SidecarPort"` - ExportPodData bool `yaml:"ExportPodData"` VerboseLogging bool `yaml:"VerboseLogging"` ErrorsOnlyLogging bool `yaml:"ErrorsOnlyLogging"` DataRootFolder string `yaml:"DataRootFolder"` } +func SetupTelemetry(ctx context.Context, serviceName string) (*sdktrace.TracerProvider, error) { + log.G(ctx).Info("Tracing is enabled, setting up the TracerProvider") + + // Get the TELEMETRY_UNIQUE_ID from the environment, if it is not set, use the hostname + uniqueID := os.Getenv("TELEMETRY_UNIQUE_ID") + if uniqueID == "" { + log.G(ctx).Info("No TELEMETRY_UNIQUE_ID set, generating a new one") + newUUID := uuid.New() + uniqueID = newUUID.String() + log.G(ctx).Info("Generated unique ID: ", uniqueID, " use "+serviceName+"-"+uniqueID+" as service name from Grafana") + } + + fullServiceName := serviceName + uniqueID + + res, err := resource.New(ctx, + resource.WithAttributes( + // the service name used to display traces in backends + semconv.ServiceName(fullServiceName), + ), + ) + if err != nil { + return nil, fmt.Errorf("failed to create resource: %w", err) + } + + ctx, cancel := context.WithTimeout(ctx, time.Second) + defer cancel() + + otlpEndpoint := os.Getenv("TELEMETRY_ENDPOINT") + + if otlpEndpoint == "" { + otlpEndpoint = "localhost:4317" + } + + log.G(ctx).Info("TELEMETRY_ENDPOINT: ", otlpEndpoint) + + caCrtFilePath := os.Getenv("TELEMETRY_CA_CRT_FILEPATH") + + conn := &grpc.ClientConn{} + if caCrtFilePath != "" { + + // if the CA certificate is provided, set up mutual TLS + + log.G(ctx).Info("CA certificate provided, setting up mutual TLS") + + caCert, err := os.ReadFile(caCrtFilePath) + if err != nil { + return nil, fmt.Errorf("failed to load CA certificate: %w", err) + } + + clientKeyFilePath := os.Getenv("TELEMETRY_CLIENT_KEY_FILEPATH") + if clientKeyFilePath == "" { + return nil, fmt.Errorf("client key file path not provided. Since a CA certificate is provided, a client key is required for mutual TLS") + } + + clientCrtFilePath := os.Getenv("TELEMETRY_CLIENT_CRT_FILEPATH") + if clientCrtFilePath == "" { + return nil, fmt.Errorf("client certificate file path not provided. Since a CA certificate is provided, a client certificate is required for mutual TLS") + } + + insecureSkipVerify := false + if os.Getenv("TELEMETRY_INSECURE_SKIP_VERIFY") == "true" { + insecureSkipVerify = true + } + + certPool := x509.NewCertPool() + if !certPool.AppendCertsFromPEM(caCert) { + return nil, fmt.Errorf("failed to append CA certificate") + } + + cert, err := tls.LoadX509KeyPair(clientCrtFilePath, clientKeyFilePath) + if err != nil { + return nil, fmt.Errorf("failed to load client certificate: %w", err) + } + + tlsConfig := &tls.Config{ + Certificates: []tls.Certificate{cert}, + RootCAs: certPool, + MinVersion: tls.VersionTLS12, + InsecureSkipVerify: insecureSkipVerify, // #nosec + } + + creds := credentials.NewTLS(tlsConfig) + conn, err = grpc.NewClient(otlpEndpoint, grpc.WithTransportCredentials(creds)) + if err != nil { + return nil, fmt.Errorf("failed to create gRPC client: %w", err) + } + } else { + conn, err = grpc.NewClient(otlpEndpoint, grpc.WithTransportCredentials(insecure.NewCredentials())) + } + + conn.WaitForStateChange(ctx, connectivity.Ready) + + if err != nil { + return nil, fmt.Errorf("failed to create gRPC connection to collector: %w", err) + } + + // Set up a trace exporter + traceExporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithGRPCConn(conn)) + if err != nil { + return nil, fmt.Errorf("failed to create trace exporter: %w", err) + } + + // Register the trace exporter with a TracerProvider, using a batch + // span processor to aggregate spans before export. + bsp := sdktrace.NewBatchSpanProcessor(traceExporter) + tracerProvider := sdktrace.NewTracerProvider( + sdktrace.WithSampler(sdktrace.AlwaysSample()), + sdktrace.WithResource(res), + sdktrace.WithSpanProcessor(bsp), + ) + otel.SetTracerProvider(tracerProvider) + + // set global propagator to tracecontext (the default is no-op). + otel.SetTextMapPropagator(propagation.TraceContext{}) + + return tracerProvider, nil +} + +func InitTracer(ctx context.Context, serviceName string) (func(context.Context) error, error) { + // Get the TELEMETRY_UNIQUE_ID from the environment, if it is not set, use the hostname + tracerProvider, err := SetupTelemetry(ctx, serviceName) + if err != nil { + return nil, err + } + + return tracerProvider.Shutdown, nil +} + // NewInterLinkConfig returns a variable of type InterLinkConfig, used in many other functions and the first encountered error. -func NewInterLinkConfig() (InterLinkConfig, error) { +func NewInterLinkConfig() (Config, error) { var path string verbose := flag.Bool("verbose", false, "Enable or disable Debug level logging") errorsOnly := flag.Bool("errorsonly", false, "Prints only errors if enabled") InterLinkConfigPath := flag.String("interlinkconfigpath", "", "Path to InterLink config") flag.Parse() - interLinkNewConfig := InterLinkConfig{} + interLinkNewConfig := Config{} if *verbose { interLinkNewConfig.VerboseLogging = true @@ -41,24 +183,30 @@ func NewInterLinkConfig() (InterLinkConfig, error) { if *InterLinkConfigPath != "" { path = *InterLinkConfigPath - } else if os.Getenv("INTERLINKCONFIGPATH") != "" { - path = os.Getenv("INTERLINKCONFIGPATH") } else { - path = "/etc/interlink/InterLinkConfig.yaml" + if os.Getenv("INTERLINKCONFIGPATH") != "" { + path = os.Getenv("INTERLINKCONFIGPATH") + } else { + path = "/etc/interlink/InterLinkConfig.yaml" + } } if _, err := os.Stat(path); err != nil { log.G(context.Background()).Error("File " + path + " doesn't exist. You can set a custom path by exporting INTERLINKCONFIGPATH. Exiting...") - return InterLinkConfig{}, err + return Config{}, err } log.G(context.Background()).Info("Loading InterLink config from " + path) yfile, err := os.ReadFile(path) if err != nil { log.G(context.Background()).Error("Error opening config file, exiting...") - return InterLinkConfig{}, err + return Config{}, err + } + + err = yaml.Unmarshal(yfile, &interLinkNewConfig) + if err != nil { + return Config{}, err } - yaml.Unmarshal(yfile, &interLinkNewConfig) if os.Getenv("INTERLINKURL") != "" { interLinkNewConfig.InterlinkAddress = os.Getenv("INTERLINKURL") diff --git a/pkg/interlink/spans.go b/pkg/interlink/spans.go index 73469b5b..b4c260ee 100644 --- a/pkg/interlink/spans.go +++ b/pkg/interlink/spans.go @@ -1,6 +1,7 @@ package interlink import ( + "net/http" "time" "go.opentelemetry.io/otel/attribute" @@ -30,3 +31,17 @@ func SetDurationSpan(startTime int64, span trace.Span, opts ...SpanOption) { span.SetAttributes(attribute.Int("exit.code", config.HTTPReturnCode)) } } + +func SetInfoFromHeaders(span trace.Span, h *http.Header) { + var xForwardedEmail, xForwardedUser string + if xForwardedEmail = h.Get("X-Forwarded-Email"); xForwardedEmail == "" { + xForwardedEmail = "unknown" + } + if xForwardedUser = h.Get("X-Forwarded-User"); xForwardedUser == "" { + xForwardedUser = "unknown" + } + span.SetAttributes( + attribute.String("X-Forwarded-Email", xForwardedEmail), + attribute.String("X-Forwarded-User", xForwardedUser), + ) +} diff --git a/pkg/interlink/types.go b/pkg/interlink/types.go index 6ba742f4..0d09de8d 100644 --- a/pkg/interlink/types.go +++ b/pkg/interlink/types.go @@ -11,15 +11,19 @@ type PodCreateRequests struct { Pod v1.Pod `json:"pod"` ConfigMaps []v1.ConfigMap `json:"configmaps"` Secrets []v1.Secret `json:"secrets"` + // The projected volumes are those created by ServiceAccounts (in K8S >= 1.24). They are automatically added in the pod from kubelet code. + // Here the configmap will hold the files name (as key) and content (as value). + ProjectedVolumeMaps []v1.ConfigMap `json:"projectedvolumesmaps"` } // PodStatus is a simplified v1.Pod struct, holding only necessary variables to uniquely identify a job/service in the sidecar. It is used to request type PodStatus struct { - PodName string `json:"name"` - PodUID string `json:"UID"` - PodNamespace string `json:"namespace"` - JobID string `json:"JID"` - Containers []v1.ContainerStatus `json:"containers"` + PodName string `json:"name"` + PodUID string `json:"UID"` + PodNamespace string `json:"namespace"` + JobID string `json:"JID"` + Containers []v1.ContainerStatus `json:"containers"` + InitContainers []v1.ContainerStatus `json:"initContainers"` } // CreateStruct is the response to be received from interLink whenever asked to create a pod. It will allow for mapping remote ID with the pod UUID @@ -30,10 +34,14 @@ type CreateStruct struct { // RetrievedContainer is used in InterLink to rearrange data structure in a suitable way for the sidecar type RetrievedContainer struct { - Name string `json:"name"` - ConfigMaps []v1.ConfigMap `json:"configMaps"` - Secrets []v1.Secret `json:"secrets"` - EmptyDirs []string `json:"emptyDirs"` + Name string `json:"name"` + ConfigMaps []v1.ConfigMap `json:"configMaps"` + ProjectedVolumeMaps []v1.ConfigMap `json:"projectedvolumemaps"` + Secrets []v1.Secret `json:"secrets"` + // Deprecated: EmptyDirs should be built on plugin side. + // Currently, it holds the DATA_ROOT_DIR/emptydirs/volumeName, but this should be a plugin choice instead, + // like it currently is for ConfigMaps, ProjectedVolumeMaps, Secrets. + EmptyDirs []string `json:"emptyDirs"` } // RetrievedPoData is used in InterLink to rearrange data structure in a suitable way for the sidecar diff --git a/pkg/virtualkubelet/cert-retriever.go b/pkg/virtualkubelet/cert-retriever.go index 47f1b6b2..9ad250e7 100644 --- a/pkg/virtualkubelet/cert-retriever.go +++ b/pkg/virtualkubelet/cert-retriever.go @@ -17,15 +17,15 @@ import ( "k8s.io/client-go/kubernetes" "k8s.io/client-go/util/certificate" "k8s.io/klog" - //"k8s.io/kubernetes/pkg/apis/certificates" + // k8s.io/kubernetes/pkg/apis/certificates" ) -type crtretriever func(*tls.ClientHelloInfo) (*tls.Certificate, error) +type Crtretriever func(*tls.ClientHelloInfo) (*tls.Certificate, error) // NewCertificateManager creates a certificate manager for the kubelet when retrieving a server certificate, or returns an error. // This function is inspired by Liqo implementation: // https://github.com/liqotech/liqo/blob/master/cmd/virtual-kubelet/root/http.go#L149 -func NewCertificateRetriever(kubeClient kubernetes.Interface, signer, nodeName string, nodeIP net.IP) (crtretriever, error) { +func NewCertificateRetriever(kubeClient kubernetes.Interface, signer, nodeName string, nodeIP net.IP) (Crtretriever, error) { const ( vkCertsPath = "/tmp/certs" vkCertsPrefix = "virtual-kubelet" @@ -47,7 +47,7 @@ func NewCertificateRetriever(kubeClient kubernetes.Interface, signer, nodeName s } mgr, err := certificate.NewManager(&certificate.Config{ - ClientsetFn: func(current *tls.Certificate) (kubernetes.Interface, error) { + ClientsetFn: func(_ *tls.Certificate) (kubernetes.Interface, error) { return kubeClient, nil }, GetTemplate: getTemplate, @@ -85,7 +85,7 @@ func NewCertificateRetriever(kubeClient kubernetes.Interface, signer, nodeName s } // newSelfSignedCertificateRetriever creates a new retriever for self-signed certificates. -func NewSelfSignedCertificateRetriever(nodeName string, nodeIP net.IP) crtretriever { +func NewSelfSignedCertificateRetriever(nodeName string, nodeIP net.IP) Crtretriever { creator := func() (*tls.Certificate, time.Time, error) { expiration := time.Now().AddDate(1, 0, 0) // 1 year diff --git a/pkg/virtualkubelet/config.go b/pkg/virtualkubelet/config.go index a7f68339..5270f397 100644 --- a/pkg/virtualkubelet/config.go +++ b/pkg/virtualkubelet/config.go @@ -1,18 +1,46 @@ package virtualkubelet -// VirtualKubeletConfig holds the whole configuration -type VirtualKubeletConfig struct { - InterlinkURL string `yaml:"InterlinkURL"` - Interlinkport string `yaml:"InterlinkPort"` - VKConfigPath string `yaml:"VKConfigPath"` - VKTokenFile string `yaml:"VKTokenFile"` - ServiceAccount string `yaml:"ServiceAccount"` - Namespace string `yaml:"Namespace"` - PodIP string `yaml:"PodIP"` - VerboseLogging bool `yaml:"VerboseLogging"` - ErrorsOnlyLogging bool `yaml:"ErrorsOnlyLogging"` - CPU string `yaml:"CPU,omitempty"` - Memory string `yaml:"Memory,omitempty"` - Pods string `yaml:"Pods,omitempty"` - GPU string `yaml:"nvidia.com/gpu,omitempty"` +// Config holds the whole configuration +type Config struct { + InterlinkURL string `yaml:"InterlinkURL"` + InterlinkPort string `yaml:"InterlinkPort"` + KubernetesAPIAddr string `yaml:"KubernetesApiAddr"` + KubernetesAPIPort string `yaml:"KubernetesApiPort"` + KubernetesAPICaCrt string `yaml:"KubernetesApiCaCrt"` + DisableProjectedVolumes bool `yaml:"DisableProjectedVolumes"` + VKConfigPath string `yaml:"VKConfigPath"` + VKTokenFile string `yaml:"VKTokenFile"` + ServiceAccount string `yaml:"ServiceAccount"` + Namespace string `yaml:"Namespace"` + PodIP string `yaml:"PodIP"` + VerboseLogging bool `yaml:"VerboseLogging"` + ErrorsOnlyLogging bool `yaml:"ErrorsOnlyLogging"` + HTTP HTTP `yaml:"HTTP"` + KubeletHTTP HTTP `yaml:"KubeletHTTP"` + Resources Resources `yaml:"Resources"` + NodeLabels []string `yaml:"NodeLabels"` + NodeTaints []TaintSpec `yaml:"NodeTaints"` +} + +type HTTP struct { + Insecure bool `yaml:"Insecure"` +} + +type Resources struct { + CPU string `yaml:"CPU,omitempty"` + Memory string `yaml:"Memory,omitempty"` + Pods string `yaml:"Pods,omitempty"` + Accelerators []Accelerator `yaml:"Accelerators"` +} + +type Accelerator struct { + ResourceType string `yaml:"ResourceType"` + Model string `yaml:"Model"` + Available int `yaml:"Available"` +} + +type TaintSpec struct { + Key string `yaml:"Key"` + Value string `yaml:"Value"` + Effect string `yaml:"Effect"` } diff --git a/pkg/virtualkubelet/execute.go b/pkg/virtualkubelet/execute.go index 95a69990..3f4b7285 100644 --- a/pkg/virtualkubelet/execute.go +++ b/pkg/virtualkubelet/execute.go @@ -7,6 +7,7 @@ import ( "errors" "fmt" "io" + "math/rand" "net/http" "os" "strconv" @@ -17,45 +18,80 @@ import ( "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" trace "go.opentelemetry.io/otel/trace" + authenticationv1 "k8s.io/api/authentication/v1" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - types "github.com/intertwin-eu/interlink/pkg/interlink" + types "github.com/interlink-hq/interlink/pkg/interlink" ) +const ( + PodPhaseInitialize = "Initializing" + PodPhaseCompleted = "Completed" +) + +func failedMount(ctx context.Context, failedAndWait *bool, name string, pod *v1.Pod, p *Provider, err error) error { + *failedAndWait = true + log.G(ctx).Warningf("Unable to find ConfigMap %s for pod %s. Waiting for it to be initialized. Error was: %v. Current phase: %s", name, pod.Name, err, pod.Status.Phase) + if pod.Status.Phase != PodPhaseInitialize { + pod.Status.Phase = PodPhaseInitialize + err := p.UpdatePod(ctx, pod) + if err != nil { + return err + } + } + return nil +} + +func traceExecute(ctx context.Context, pod *v1.Pod, name string, startHTTPCall int64) *trace.Span { + tracer := otel.Tracer("interlink-service") + _, spanHTTP := tracer.Start(ctx, name, trace.WithAttributes( + attribute.String("pod.name", pod.Name), + attribute.String("pod.namespace", pod.Namespace), + attribute.String("pod.uid", string(pod.UID)), + attribute.Int64("start.timestamp", startHTTPCall), + )) + defer spanHTTP.End() + defer types.SetDurationSpan(startHTTPCall, spanHTTP) + + return &spanHTTP +} + func doRequest(req *http.Request, token string) (*http.Response, error) { + return doRequestWithClient(req, token, http.DefaultClient) +} +func doRequestWithClient(req *http.Request, token string, httpClient *http.Client) (*http.Response, error) { if token != "" { req.Header.Add("Authorization", "Bearer "+token) } req.Header.Set("Content-Type", "application/json") - return http.DefaultClient.Do(req) - + return httpClient.Do(req) } func getSidecarEndpoint(ctx context.Context, interLinkURL string, interLinkPort string) string { interLinkEndpoint := "" log.G(ctx).Info("InterlingURL: ", interLinkURL) - if strings.HasPrefix(interLinkURL, "unix://") { + switch { + case strings.HasPrefix(interLinkURL, "unix://"): interLinkEndpoint = "http://unix" - } else if strings.HasPrefix(interLinkURL, "http://") { + case strings.HasPrefix(interLinkURL, "http://"): interLinkEndpoint = interLinkURL + ":" + interLinkPort - } else if strings.HasPrefix(interLinkURL, "https://") { + case strings.HasPrefix(interLinkURL, "https://"): interLinkEndpoint = interLinkURL + ":" + interLinkPort - } else { + default: log.G(ctx).Fatal("InterLinkURL URL should either start per unix:// or http(s)://") } return interLinkEndpoint } // PingInterLink pings the InterLink API and returns true if there's an answer. The second return value is given by the answer provided by the API. -func PingInterLink(ctx context.Context, config VirtualKubeletConfig) (bool, int, error) { +func PingInterLink(ctx context.Context, config Config) (bool, int, error) { tracer := otel.Tracer("interlink-service") - interLinkEndpoint := getSidecarEndpoint(ctx, config.InterlinkURL, config.Interlinkport) + interLinkEndpoint := getSidecarEndpoint(ctx, config.InterlinkURL, config.InterlinkPort) log.G(ctx).Info("Pinging: " + interLinkEndpoint + "/pinglink") retVal := -1 req, err := http.NewRequest(http.MethodPost, interLinkEndpoint+"/pinglink", nil) - if err != nil { log.G(ctx).Error(err) } @@ -69,52 +105,47 @@ func PingInterLink(ctx context.Context, config VirtualKubeletConfig) (bool, int, req.Header.Add("Authorization", "Bearer "+string(token)) } - startHttpCall := time.Now().UnixMicro() - _, spanHttp := tracer.Start(ctx, "PingHttpCall", trace.WithAttributes( - attribute.Int64("start.timestamp", startHttpCall), + startHTTPCall := time.Now().UnixMicro() + _, spanHTTP := tracer.Start(ctx, "PingHttpCall", trace.WithAttributes( + attribute.Int64("start.timestamp", startHTTPCall), )) - defer spanHttp.End() - defer types.SetDurationSpan(startHttpCall, spanHttp) + defer spanHTTP.End() + defer types.SetDurationSpan(startHTTPCall, spanHTTP) - resp, err := http.DefaultClient.Do(req) + // Add session number for end-to-end from VK to API to InterLink plugin (eg interlink-slurm-plugin) + AddSessionContext(req, "PingInterLink#"+strconv.Itoa(rand.Intn(100000))) + resp, err := http.DefaultClient.Do(req) if err != nil { - spanHttp.SetAttributes(attribute.Int("exit.code", http.StatusInternalServerError)) + spanHTTP.SetAttributes(attribute.Int("exit.code", http.StatusInternalServerError)) return false, retVal, err } + defer resp.Body.Close() - if resp != nil { - types.SetDurationSpan(startHttpCall, spanHttp, types.WithHTTPReturnCode(resp.StatusCode)) - retBytes, err := io.ReadAll(resp.Body) - if err != nil { - log.G(ctx).Error(err) - return false, retVal, err - } - retVal, err = strconv.Atoi(string(retBytes)) - if err != nil { - log.G(ctx).Error(err) - return false, retVal, err - } + types.SetDurationSpan(startHTTPCall, spanHTTP, types.WithHTTPReturnCode(resp.StatusCode)) + _, err = io.ReadAll(resp.Body) + if err != nil { + log.G(ctx).Error(err) + return false, retVal, err + } - if resp.StatusCode != http.StatusOK { - log.G(ctx).Error("server error: " + fmt.Sprint(resp.StatusCode)) - return false, retVal, nil - } + if resp.StatusCode != http.StatusOK { + log.G(ctx).Error("server error: " + fmt.Sprint(resp.StatusCode)) + return false, retVal, nil } - return true, retVal, nil + return true, resp.StatusCode, nil } // updateCacheRequest is called when the VK receives the status of a pod already deleted. It performs a REST call InterLink API to update the cache deleting that pod from the cached structure -func updateCacheRequest(ctx context.Context, config VirtualKubeletConfig, pod v1.Pod, token string) error { - tracer := otel.Tracer("interlink-service") +func updateCacheRequest(ctx context.Context, config Config, pod v1.Pod, token string) error { bodyBytes, err := json.Marshal(pod) if err != nil { log.L.Error(err) return err } - interLinkEndpoint := getSidecarEndpoint(ctx, config.InterlinkURL, config.Interlinkport) + interLinkEndpoint := getSidecarEndpoint(ctx, config.InterlinkURL, config.InterlinkPort) reader := bytes.NewReader(bodyBytes) req, err := http.NewRequest(http.MethodPost, interLinkEndpoint+"/updateCache", reader) if err != nil { @@ -127,26 +158,22 @@ func updateCacheRequest(ctx context.Context, config VirtualKubeletConfig, pod v1 } req.Header.Set("Content-Type", "application/json") - startHttpCall := time.Now().UnixMicro() - _, spanHttp := tracer.Start(ctx, "UpdateCacheHttpCall", trace.WithAttributes( - attribute.String("pod.name", pod.Name), - attribute.String("pod.namespace", pod.Namespace), - attribute.String("pod.uid", string(pod.UID)), - attribute.Int64("start.timestamp", startHttpCall), - )) - defer spanHttp.End() - defer types.SetDurationSpan(startHttpCall, spanHttp) + startHTTPCall := time.Now().UnixMicro() + spanHTTP := traceExecute(ctx, &pod, "UpdateCacheHttpCall", startHTTPCall) + + // Add session number for end-to-end from VK to API to InterLink plugin (eg interlink-slurm-plugin) + AddSessionContext(req, "UpdateCache#"+strconv.Itoa(rand.Intn(100000))) resp, err := http.DefaultClient.Do(req) if err != nil { log.L.Error(err) return err } - if resp != nil { - types.SetDurationSpan(startHttpCall, spanHttp, types.WithHTTPReturnCode(resp.StatusCode)) - if resp.StatusCode != http.StatusOK { - return errors.New("Unexpected error occured while updating InterLink cache. Status code: " + strconv.Itoa(resp.StatusCode) + ". Check InterLink's logs for further informations") - } + defer resp.Body.Close() + + types.SetDurationSpan(startHTTPCall, *spanHTTP, types.WithHTTPReturnCode(resp.StatusCode)) + if resp.StatusCode != http.StatusOK { + return errors.New("Unexpected error occured while updating InterLink cache. Status code: " + strconv.Itoa(resp.StatusCode) + ". Check InterLink's logs for further informations") } return err @@ -154,10 +181,9 @@ func updateCacheRequest(ctx context.Context, config VirtualKubeletConfig, pod v1 // createRequest performs a REST call to the InterLink API when a Pod is registered to the VK. It Marshals the pod with already retrieved ConfigMaps and Secrets and sends it to InterLink. // Returns the call response expressed in bytes and/or the first encountered error -func createRequest(ctx context.Context, config VirtualKubeletConfig, pod types.PodCreateRequests, token string) ([]byte, error) { +func createRequest(ctx context.Context, config Config, pod types.PodCreateRequests, token string) ([]byte, error) { tracer := otel.Tracer("interlink-service") - interLinkEndpoint := getSidecarEndpoint(ctx, config.InterlinkURL, config.Interlinkport) - var returnValue, _ = json.Marshal(types.CreateStruct{}) + interLinkEndpoint := getSidecarEndpoint(ctx, config.InterlinkURL, config.InterlinkPort) bodyBytes, err := json.Marshal(pod) if err != nil { @@ -171,34 +197,33 @@ func createRequest(ctx context.Context, config VirtualKubeletConfig, pod types.P return nil, err } - startHttpCall := time.Now().UnixMicro() - _, spanHttp := tracer.Start(ctx, "CreateHttpCall", trace.WithAttributes( + startHTTPCall := time.Now().UnixMicro() + _, spanHTTP := tracer.Start(ctx, "CreateHttpCall", trace.WithAttributes( attribute.String("pod.name", pod.Pod.Name), attribute.String("pod.namespace", pod.Pod.Namespace), attribute.String("pod.uid", string(pod.Pod.UID)), - attribute.Int64("start.timestamp", startHttpCall), + attribute.Int64("start.timestamp", startHTTPCall), )) - defer spanHttp.End() - defer types.SetDurationSpan(startHttpCall, spanHttp) + defer spanHTTP.End() + defer types.SetDurationSpan(startHTTPCall, spanHTTP) + + // Add session number for end-to-end from VK to API to InterLink plugin (eg interlink-slurm-plugin) + AddSessionContext(req, "CreatePod#"+strconv.Itoa(rand.Intn(100000))) resp, err := doRequest(req, token) if err != nil { - log.L.Error(err) - return nil, err + return nil, fmt.Errorf("error doing doRequest() in createRequest() log request: %s error: %w", fmt.Sprintf("%#v", req), err) } + defer resp.Body.Close() - if resp != nil { - types.SetDurationSpan(startHttpCall, spanHttp, types.WithHTTPReturnCode(resp.StatusCode)) + types.SetDurationSpan(startHTTPCall, spanHTTP, types.WithHTTPReturnCode(resp.StatusCode)) - if resp.StatusCode != http.StatusOK { - return nil, errors.New("Unexpected error occured while creating Pods. Status code: " + strconv.Itoa(resp.StatusCode) + ". Check InterLink's logs for further informations") - } else { - returnValue, err = io.ReadAll(resp.Body) - if err != nil { - log.L.Error(err) - return nil, err - } - } + if resp.StatusCode != http.StatusOK { + return nil, errors.New("Unexpected error occured while creating Pods. Status code: " + strconv.Itoa(resp.StatusCode) + ". Check InterLink's logs for further informations") + } + returnValue, err := io.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("error doing ReadAll() in createRequest() log request: %s error: %w", fmt.Sprintf("%#v", req), err) } return returnValue, nil @@ -206,9 +231,8 @@ func createRequest(ctx context.Context, config VirtualKubeletConfig, pod types.P // deleteRequest performs a REST call to the InterLink API when a Pod is deleted from the VK. It Marshals the standard v1.Pod struct and sends it to InterLink. // Returns the call response expressed in bytes and/or the first encountered error -func deleteRequest(ctx context.Context, config VirtualKubeletConfig, pod *v1.Pod, token string) ([]byte, error) { - tracer := otel.Tracer("interlink-service") - interLinkEndpoint := getSidecarEndpoint(ctx, config.InterlinkURL, config.Interlinkport) +func deleteRequest(ctx context.Context, config Config, pod *v1.Pod, token string) ([]byte, error) { + interLinkEndpoint := getSidecarEndpoint(ctx, config.InterlinkURL, config.InterlinkPort) var returnValue []byte bodyBytes, err := json.Marshal(pod) if err != nil { @@ -222,41 +246,37 @@ func deleteRequest(ctx context.Context, config VirtualKubeletConfig, pod *v1.Pod return nil, err } - startHttpCall := time.Now().UnixMicro() - _, spanHttp := tracer.Start(ctx, "DeleteHttpCall", trace.WithAttributes( - attribute.String("pod.name", pod.Name), - attribute.String("pod.namespace", pod.Namespace), - attribute.String("pod.uid", string(pod.UID)), - attribute.Int64("start.timestamp", startHttpCall), - )) - defer spanHttp.End() - defer types.SetDurationSpan(startHttpCall, spanHttp) + startHTTPCall := time.Now().UnixMicro() + spanHTTP := traceExecute(ctx, pod, "DeleteHttpCall", startHTTPCall) + + // Add session number for end-to-end from VK to API to InterLink plugin (eg interlink-slurm-plugin) + AddSessionContext(req, "DeletePod#"+strconv.Itoa(rand.Intn(100000))) resp, err := doRequest(req, token) if err != nil { log.G(context.Background()).Error(err) return nil, err } + defer resp.Body.Close() - if resp != nil { - statusCode := resp.StatusCode - types.SetDurationSpan(startHttpCall, spanHttp, types.WithHTTPReturnCode(resp.StatusCode)) - if statusCode != http.StatusOK { - return nil, errors.New("Unexpected error occured while deleting Pods. Status code: " + strconv.Itoa(resp.StatusCode) + ". Check InterLink's logs for further informations") - } else { - returnValue, err := io.ReadAll(resp.Body) - if err != nil { - log.G(context.Background()).Error(err) - return nil, err - } - log.G(context.Background()).Info(string(returnValue)) - var response []types.PodStatus - err = json.Unmarshal(returnValue, &response) - if err != nil { - log.G(context.Background()).Error(err) - return nil, err - } - } + statusCode := resp.StatusCode + types.SetDurationSpan(startHTTPCall, *spanHTTP, types.WithHTTPReturnCode(resp.StatusCode)) + + if statusCode != http.StatusOK { + return nil, errors.New("Unexpected error occured while deleting Pods. Status code: " + strconv.Itoa(resp.StatusCode) + ". Check InterLink's logs for further informations") + } + + returnValue, err = io.ReadAll(resp.Body) + if err != nil { + log.G(context.Background()).Error(err) + return nil, err + } + log.G(context.Background()).Info(string(returnValue)) + var response []types.PodStatus + err = json.Unmarshal(returnValue, &response) + if err != nil { + log.G(context.Background()).Error(err) + return nil, err } return returnValue, nil @@ -265,10 +285,10 @@ func deleteRequest(ctx context.Context, config VirtualKubeletConfig, pod *v1.Pod // statusRequest performs a REST call to the InterLink API when the VK needs an update on its Pods' status. A Marshalled slice of v1.Pod is sent to the InterLink API, // to query the below plugin for their status. // Returns the call response expressed in bytes and/or the first encountered error -func statusRequest(ctx context.Context, config VirtualKubeletConfig, podsList []*v1.Pod, token string) ([]byte, error) { +func statusRequest(ctx context.Context, config Config, podsList []*v1.Pod, token string) ([]byte, error) { tracer := otel.Tracer("interlink-service") - returnValue, _ := json.Marshal(types.PodStatus{}) - interLinkEndpoint := getSidecarEndpoint(ctx, config.InterlinkURL, config.Interlinkport) + + interLinkEndpoint := getSidecarEndpoint(ctx, config.InterlinkURL, config.InterlinkPort) bodyBytes, err := json.Marshal(podsList) if err != nil { @@ -282,31 +302,37 @@ func statusRequest(ctx context.Context, config VirtualKubeletConfig, podsList [] return nil, err } - //log.L.Println(string(bodyBytes)) + // log.L.Println(string(bodyBytes)) - startHttpCall := time.Now().UnixMicro() - _, spanHttp := tracer.Start(ctx, "StatusHttpCall", trace.WithAttributes( - attribute.Int64("start.timestamp", startHttpCall), + startHTTPCall := time.Now().UnixMicro() + _, spanHTTP := tracer.Start(ctx, "StatusHttpCall", trace.WithAttributes( + attribute.Int64("start.timestamp", startHTTPCall), )) - defer spanHttp.End() - defer types.SetDurationSpan(startHttpCall, spanHttp) + defer spanHTTP.End() + defer types.SetDurationSpan(startHTTPCall, spanHTTP) + + // Add session number for end-to-end from VK to API to InterLink plugin (eg interlink-slurm-plugin) + AddSessionContext(req, "GetStatus#"+strconv.Itoa(rand.Intn(100000))) resp, err := doRequest(req, token) if err != nil { return nil, err } + defer resp.Body.Close() - if resp != nil { - types.SetDurationSpan(startHttpCall, spanHttp, types.WithHTTPReturnCode(resp.StatusCode)) - if resp.StatusCode != http.StatusOK { - return nil, errors.New("Unexpected error occured while getting status. Status code: " + strconv.Itoa(resp.StatusCode) + ". Check InterLink's logs for further informations") - } else { - returnValue, err = io.ReadAll(resp.Body) - if err != nil { - log.L.Error(err) - return nil, err - } + types.SetDurationSpan(startHTTPCall, spanHTTP, types.WithHTTPReturnCode(resp.StatusCode)) + if resp.StatusCode != http.StatusOK { + returnValue, err := io.ReadAll(resp.Body) + if err != nil { + log.L.Error(err) + return nil, err } + return nil, errors.New("Unexpected error occured while getting status. Status code: " + strconv.Itoa(resp.StatusCode) + ". Check InterLink's logs for further informations\n" + string(returnValue)) + } + returnValue, err := io.ReadAll(resp.Body) + if err != nil { + log.L.Error(err) + return nil, err } return returnValue, nil @@ -315,10 +341,15 @@ func statusRequest(ctx context.Context, config VirtualKubeletConfig, podsList [] // LogRetrieval performs a REST call to the InterLink API when the user ask for a log retrieval. Compared to create/delete/status request, a way smaller struct is marshalled and sent. // This struct only includes a minimum data set needed to identify the job/container to get the logs from. // Returns the call response and/or the first encountered error -func LogRetrieval(ctx context.Context, config VirtualKubeletConfig, logsRequest types.LogStruct) (io.ReadCloser, error) { +func LogRetrieval( + ctx context.Context, + config Config, + logsRequest types.LogStruct, + clientHTTPTransport *http.Transport, + sessionContext string, +) (io.ReadCloser, error) { tracer := otel.Tracer("interlink-service") - var returnValue io.ReadCloser - interLinkEndpoint := getSidecarEndpoint(ctx, config.InterlinkURL, config.Interlinkport) + interLinkEndpoint := getSidecarEndpoint(ctx, config.InterlinkURL, config.InterlinkPort) token := "" @@ -330,54 +361,357 @@ func LogRetrieval(ctx context.Context, config VirtualKubeletConfig, logsRequest token = string(b) } + sessionContextMessage := GetSessionContextMessage(sessionContext) + bodyBytes, err := json.Marshal(logsRequest) if err != nil { - log.G(ctx).Error(err) - return nil, err + errWithContext := fmt.Errorf(sessionContextMessage+"error during marshalling to JSON the log request: %s. Bodybytes: %s error: %w", fmt.Sprintf("%#v", logsRequest), bodyBytes, err) + log.G(ctx).Error(errWithContext) + return nil, errWithContext } + reader := bytes.NewReader(bodyBytes) req, err := http.NewRequest(http.MethodGet, interLinkEndpoint+"/getLogs", reader) if err != nil { - log.G(ctx).Error(err) - return nil, err + errWithContext := fmt.Errorf(sessionContextMessage+"error during HTTP request: %s/getLogs %w", interLinkEndpoint, err) + log.G(ctx).Error(errWithContext) + return nil, errWithContext } - //log.G(ctx).Println(string(bodyBytes)) + // log.G(ctx).Println(string(bodyBytes)) - startHttpCall := time.Now().UnixMicro() - _, spanHttp := tracer.Start(ctx, "LogHttpCall", trace.WithAttributes( + startHTTPCall := time.Now().UnixMicro() + _, spanHTTP := tracer.Start(ctx, "LogHttpCall", trace.WithAttributes( attribute.String("pod.name", logsRequest.PodName), attribute.String("pod.namespace", logsRequest.Namespace), attribute.String("pod.uid", logsRequest.PodUID), - attribute.Int64("start.timestamp", startHttpCall), + attribute.Int64("start.timestamp", startHTTPCall), )) - defer spanHttp.End() - defer types.SetDurationSpan(startHttpCall, spanHttp) + defer spanHTTP.End() + defer types.SetDurationSpan(startHTTPCall, spanHTTP) - resp, err := doRequest(req, token) + log.G(ctx).Debug(sessionContextMessage, "before doRequestWithClient()") + // Add session number for end-to-end from VK to API to InterLink plugin (eg interlink-slurm-plugin) + AddSessionContext(req, sessionContext) + + clientHTTPTransport.DisableKeepAlives = true + clientHTTPTransport.MaxIdleConnsPerHost = -1 + logHTTPClient := &http.Client{Transport: clientHTTPTransport} + + resp, err := doRequestWithClient(req, token, logHTTPClient) if err != nil { log.G(ctx).Error(err) return nil, err } + // resp.body must not be closed because the kubelet needs to consume it! This is the responsability of the caller to close it. + // Called here https://github.com/virtual-kubelet/virtual-kubelet/blob/v1.11.0/node/api/logs.go#L132 + // defer resp.Body.Close() + log.G(ctx).Debug(sessionContextMessage, "after doRequestWithClient()") + + types.SetDurationSpan(startHTTPCall, spanHTTP, types.WithHTTPReturnCode(resp.StatusCode)) + if resp.StatusCode != http.StatusOK { + err = errors.New(sessionContextMessage + "Unexpected error occured while getting logs. Status code: " + strconv.Itoa(resp.StatusCode) + ". Check InterLink's logs for further informations") + } - if resp != nil { - types.SetDurationSpan(startHttpCall, spanHttp, types.WithHTTPReturnCode(resp.StatusCode)) - if resp.StatusCode != http.StatusOK { - err = errors.New("Unexpected error occured while getting logs. Status code: " + strconv.Itoa(resp.StatusCode) + ". Check InterLink's logs for further informations") - } else { - returnValue = resp.Body + // return io.NopCloser(bufio.NewReader(resp.Body)), err + return resp.Body, err +} + +// Adds to pod environment variables related to services. For now, it only concerns Kubernetes API variables, example below: +/* +KUBERNETES_PORT=tcp://10.96.0.1:443 +KUBERNETES_SERVICE_PORT=443 +KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1 +KUBERNETES_PORT_443_TCP_PORT=443 +KUBERNETES_PORT_443_TCP_PROTO=tcp +KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443 +KUBERNETES_SERVICE_PORT_HTTPS=443 +KUBERNETES_SERVICE_HOST=10.96.0.1 +*/ +func addKubernetesServicesEnvVars(ctx context.Context, config Config, pod *v1.Pod) { + if config.KubernetesAPIAddr == "" || config.KubernetesAPIPort == "" { + log.G(ctx).Info("InterLink configuration does not contains both KubernetesApiAddr and KubernetesApiPort, so no env var like KUBERNETES_SERVICE_HOST is added.") + return + } + + appendEnvVar := func(envs *[]v1.EnvVar, name string, value string) { + envVar := v1.EnvVar{ + Name: name, + Value: value, + } + *envs = append(*envs, envVar) + } + appendEnvVars := func(containersPtr *[]v1.Container, index int) { + containers := *containersPtr + // container := containers[index] + envsPtr := &containers[index].Env + + appendEnvVar(envsPtr, "KUBERNETES_PORT", "tcp://"+config.KubernetesAPIAddr+":"+config.KubernetesAPIPort) + appendEnvVar(envsPtr, "KUBERNETES_SERVICE_PORT", config.KubernetesAPIPort) + appendEnvVar(envsPtr, "KUBERNETES_PORT_443_TCP_ADDR", config.KubernetesAPIAddr) + appendEnvVar(envsPtr, "KUBERNETES_PORT_443_TCP_PORT", config.KubernetesAPIPort) + appendEnvVar(envsPtr, "KUBERNETES_PORT_443_TCP_PROTO", "tcp") + appendEnvVar(envsPtr, "KUBERNETES_PORT_443_TCP", "tcp://"+config.KubernetesAPIAddr+":"+config.KubernetesAPIPort) + appendEnvVar(envsPtr, "KUBERNETES_SERVICE_PORT_HTTPS", config.KubernetesAPIPort) + appendEnvVar(envsPtr, "KUBERNETES_SERVICE_HOST", config.KubernetesAPIAddr) + } + // Warning: loop range copy value, so to modify original containers, we must use index instead. + for i := range pod.Spec.InitContainers { + appendEnvVars(&pod.Spec.InitContainers, i) + } + for i := range pod.Spec.Containers { + appendEnvVars(&pod.Spec.Containers, i) + } + + if log.G(ctx).Logger.IsLevelEnabled(log.DebugLevel) { + // For debugging purpose only. + for _, container := range pod.Spec.InitContainers { + for _, envVar := range container.Env { + log.G(ctx).Debug("in addKubernetesServicesEnvVars InterLink VK environment variable to pod ", pod.Name, " container: ", container.Name, " env: ", envVar.Name, " value: ", envVar.Value) + } + } + for _, container := range pod.Spec.Containers { + for _, envVar := range container.Env { + log.G(ctx).Debug("in addKubernetesServicesEnvVars InterLink VK environment variable to pod ", pod.Name, " container: ", container.Name, " env: ", envVar.Name, " value: ", envVar.Value) + } } } + log.G(ctx).Info("InterLink VK added a set of environment variables (e.g.: KUBERNETES_SERVICE_HOST) to all containers of pod ", + pod.Name, " k8s addr ", config.KubernetesAPIAddr, " k8s port ", config.KubernetesAPIPort) +} + +// Handle projected sources and fills the projectedVolume object. +func remoteExecutionHandleProjectedSource( + ctx context.Context, p *Provider, pod *v1.Pod, source v1.VolumeProjection, projectedVolume *v1.ConfigMap, +) error { + switch { + case source.ServiceAccountToken != nil: + /* Case + - serviceAccountToken: + expirationSeconds: 3600 + path: token + */ + log.G(ctx).Debug("Volume is a projected volume typed serviceAccountToken") + + // Now using TokenRequest API (https://kubernetes.io/docs/reference/kubernetes-api/authentication-resources/token-request-v1/) + var expirationSeconds int64 + /* + TODO: honor the expirationSeconds field and implement a rotation. + if source.ServiceAccountToken.ExpirationSeconds != nil { + expirationSeconds = *source.ServiceAccountToken.ExpirationSeconds + } else { + // If not expiration is set, set to 1h. + expirationSeconds = 3600 + } + */ + // Infinite = 100 years + expirationSeconds = 100 * 365 * 24 * 3600 + + // Bount it to POD, so that token is deleted if pod is deleted. This is important given the illimited expiration. + bountObjectRef := &authenticationv1.BoundObjectReference{ + Kind: "Pod", + // Only one of UID or Name is sufficient, k8s will retrieve the other value. + UID: pod.UID, + Name: pod.Name, + } + tokenRequest := &authenticationv1.TokenRequest{ + Spec: authenticationv1.TokenRequestSpec{ + // No need to set audience field. If set with wrong value, it might break token validity! + ExpirationSeconds: &expirationSeconds, + BoundObjectRef: bountObjectRef, + }, + } - return returnValue, err + tokenRequestResult, err := p.clientSet.CoreV1().ServiceAccounts(pod.Namespace).CreateToken( + ctx, pod.Spec.ServiceAccountName, tokenRequest, metav1.CreateOptions{}) + if err != nil { + log.G(ctx).Error("error during token request in RemoteExecution() ", err) + } + log.G(ctx).Debug("could get token ", tokenRequestResult.Status.Token) + + // Add found token to result. + projectedVolume.Data[source.ServiceAccountToken.Path] = tokenRequestResult.Status.Token + + case source.ConfigMap != nil: + /* Case + - configMap: + items: + - key: ca.crt + path: ca.crt + name: kube-root-ca.crt + */ + for _, item := range source.ConfigMap.Items { + const kubeCaCrt = "kube-root-ca.crt" + overrideCaCrt := p.config.KubernetesAPICaCrt + if source.ConfigMap.Name == kubeCaCrt && overrideCaCrt != "" { + log.G(ctx).Debug("handling special case of Kubernetes API kube-root-ca.crt, override found, using provided ca.crt:, ", overrideCaCrt) + projectedVolume.Data[item.Path] = overrideCaCrt + } else { + // This gets the usual certificate for K8s API, but it is restricted to whatever usual IP/FQDN of K8S API URL. + // With InterLink, the Kubernetes internal network is not accessible so this default ca.crt is probably useless. + log.G(ctx).Warning("using default Kubernetes API kube-root-ca.crt (no override found), but the default one might not be compatible with the subject: ", p.config.KubernetesAPIAddr) + cfgmap, err := p.clientSet.CoreV1().ConfigMaps(pod.Namespace).Get(ctx, source.ConfigMap.Name, metav1.GetOptions{}) + if err != nil { + return fmt.Errorf("error during retrieval of ConfigMap %s error: %w", source.ConfigMap.Name, err) + } + if value, ok := cfgmap.Data[item.Key]; ok { + projectedVolume.Data[item.Path] = value + } else { + return fmt.Errorf("error during retrieval of key %s of (existing) ConfigMap %s error: %w", item.Key, source.ConfigMap.Name, err) + } + } + } + + case source.DownwardAPI != nil: + /* Case + - downwardAPI: + items: + - fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + path: namespace + */ + // https://kubernetes.io/docs/concepts/workloads/pods/downward-api/ + // See URL doc above, that describe what type of DownwardAPI to expect from volume. For now, only FieldRef is supported. + // The rest are ignored. + for _, item := range source.DownwardAPI.Items { + switch { + + case item.FieldRef != nil: + switch item.FieldRef.FieldPath { + case "metadata.name": + projectedVolume.Data[item.Path] = pod.Name + + case "metadata.namespace": + projectedVolume.Data[item.Path] = pod.Namespace + + case "metadata.uid": + projectedVolume.Data[item.Path] = string(pod.UID) + + // TODO implement DownwardAPI annotation and label if needed. + + default: + log.G(ctx).Warningf("in pod %s unsupported DownwardAPI FieldPath %s in InterLink, ignoring this source...", pod.Name, item.FieldRef.FieldPath) + } + + case item.ResourceFieldRef != nil: + // TODO implement DownwardAPI resourceFieldRef if needed. + log.G(ctx).Warningf("in pod %s unsupported DownwardAPI resourceFieldRef in InterLink, ignoring this source...", pod.Name) + + default: + log.G(ctx).Warningf("in pod %s unsupported unknown DownwardAPI in InterLink, ignoring this source...", pod.Name) + } + } + } + return nil +} + +func remoteExecutionHandleVolumes(ctx context.Context, p *Provider, pod *v1.Pod, req *types.PodCreateRequests) error { + startTime := time.Now() + endTime := startTime.Add(5 * time.Minute) + + _, err := p.clientSet.CoreV1().Pods(pod.Namespace).Get(ctx, pod.Name, metav1.GetOptions{}) + if err != nil { + log.G(ctx).Warning("Deleted Pod before actual creation") + return nil + } + // Sometime the get secret or configmap can fail because it didn't have time to initialize, thus this + // is not a true failure. We use this flag to wait. + var failedAndWait bool + + log.G(ctx).Debug("Looking at volumes") + for _, volume := range pod.Spec.Volumes { + log.G(ctx).Debug("Looking at volume ", volume) + for { + failedAndWait = false + if time.Now().Before(endTime) { + switch { + case volume.ConfigMap != nil: + cfgmap, err := p.clientSet.CoreV1().ConfigMaps(pod.Namespace).Get(ctx, volume.ConfigMap.Name, metav1.GetOptions{}) + if err != nil { + err = failedMount(ctx, &failedAndWait, volume.ConfigMap.Name, pod, p, err) + if err != nil { + return err + } + } else { + req.ConfigMaps = append(req.ConfigMaps, *cfgmap) + } + + case volume.Projected != nil: + // The service account token uses the projected volume in K8S >= 1.24. + + if p.config.DisableProjectedVolumes { + // This flag disable doing anything about Projected Volumes. + log.G(ctx).Warning("Flag DisableProjectedVolumes set to true, so not handing Projected Volume: ", volume) + break + } + + var projectedVolume v1.ConfigMap + projectedVolume.Name = volume.Name + projectedVolume.Data = make(map[string]string) + log.G(ctx).Debug("Adding to PodCreateRequests the projected volume ", volume.Name) + req.ProjectedVolumeMaps = append(req.ProjectedVolumeMaps, projectedVolume) + + for _, source := range volume.Projected.Sources { + err := remoteExecutionHandleProjectedSource(ctx, p, pod, source, &projectedVolume) + if err != nil { + return err + } + failedAndWait = false + log.G(ctx).Debug("ProjectedVolumeMaps len: ", len(req.ProjectedVolumeMaps)) + } + + case volume.Secret != nil: + scrt, err := p.clientSet.CoreV1().Secrets(pod.Namespace).Get(ctx, volume.Secret.SecretName, metav1.GetOptions{}) + if err != nil { + err = failedMount(ctx, &failedAndWait, volume.Secret.SecretName, pod, p, err) + if err != nil { + return err + } + } else { + req.Secrets = append(req.Secrets, *scrt) + } + + case volume.EmptyDir != nil: + log.G(ctx).Debugf("empty dir found, nothing to do for volume %s for Pod %s", volume.Name, pod.Name) + + default: + log.G(ctx).Warningf("ignoring unsupported volume %s for Pod %s", volume.Name, pod.Name) + } + + if failedAndWait { + log.G(ctx).Warningf("volume %s not ready, sleeping 2s, attempt %f / 5 minutes max", volume.Name, time.Since(startTime).Minutes()) + time.Sleep(2 * time.Second) + continue + } + pod.Status.Phase = v1.PodPending + err = p.UpdatePod(ctx, pod) + if err != nil { + return err + } + break + } + + pod.Status.Phase = v1.PodFailed + pod.Status.Reason = "CFGMaps/Secrets not found" + for i := range pod.Status.ContainerStatuses { + pod.Status.ContainerStatuses[i].Ready = false + } + err = p.UpdatePod(ctx, pod) + if err != nil { + return err + } + return errors.New("unable to retrieve ConfigMaps or Secrets after 5m. Check logs") + } + } + return nil } // RemoteExecution is called by the VK everytime a Pod is being registered or deleted to/from the VK. // Depending on the mode (CREATE/DELETE), it performs different actions, making different REST calls. // Note: for the CREATE mode, the function gets stuck up to 5 minutes waiting for every missing ConfigMap/Secret. // If after 5m they are not still available, the function errors out -func RemoteExecution(ctx context.Context, config VirtualKubeletConfig, p *VirtualKubeletProvider, pod *v1.Pod, mode int8) error { - +func RemoteExecution(ctx context.Context, config Config, p *Provider, pod *v1.Pod, mode int8) error { token := "" if config.VKTokenFile != "" { b, err := os.ReadFile(config.VKTokenFile) // just pass the file name @@ -393,77 +727,36 @@ func RemoteExecution(ctx context.Context, config VirtualKubeletConfig, p *Virtua var resp types.CreateStruct req.Pod = *pod - startTime := time.Now() - timeNow := time.Now() - _, err := p.clientSet.CoreV1().Pods(pod.Namespace).Get(ctx, pod.Name, metav1.GetOptions{}) + err := remoteExecutionHandleVolumes(ctx, p, pod, &req) if err != nil { - log.G(ctx).Warning("Deleted Pod before actual creation") - return nil + return err } - var failed bool - - for _, volume := range pod.Spec.Volumes { - for { - if timeNow.Sub(startTime).Seconds() < time.Hour.Minutes()*5 { - if volume.ConfigMap != nil { - cfgmap, err := p.clientSet.CoreV1().ConfigMaps(pod.Namespace).Get(ctx, volume.ConfigMap.Name, metav1.GetOptions{}) - if err != nil { - failed = true - log.G(ctx).Warning("Unable to find ConfigMap " + volume.ConfigMap.Name + " for pod " + pod.Name + ". Waiting for it to be initialized") - if pod.Status.Phase != "Initializing" { - pod.Status.Phase = "Initializing" - p.UpdatePod(ctx, pod) - } - } else { - failed = false - req.ConfigMaps = append(req.ConfigMaps, *cfgmap) - } - } else if volume.Secret != nil { - scrt, err := p.clientSet.CoreV1().Secrets(pod.Namespace).Get(ctx, volume.Secret.SecretName, metav1.GetOptions{}) - if err != nil { - failed = true - log.G(ctx).Warning("Unable to find Secret " + volume.Secret.SecretName + " for pod " + pod.Name + ". Waiting for it to be initialized") - if pod.Status.Phase != "Initializing" { - pod.Status.Phase = "Initializing" - p.UpdatePod(ctx, pod) - } - } else { - failed = false - req.Secrets = append(req.Secrets, *scrt) - } - } + // Adds special Kubernetes env var. Note: the pod provided by VK is "immutable", well it is a copy. In InterLink, we can modify it. + addKubernetesServicesEnvVars(ctx, config, pod) - if failed { - time.Sleep(time.Second) - continue - } else { - pod.Status.Phase = v1.PodPending - p.UpdatePod(ctx, pod) - break - } - } else { - pod.Status.Phase = v1.PodFailed - pod.Status.Reason = "CFGMaps/Secrets not found" - for i := range pod.Status.ContainerStatuses { - pod.Status.ContainerStatuses[i].Ready = false - } - p.UpdatePod(ctx, pod) - return errors.New("unable to retrieve ConfigMaps or Secrets. Check logs") - } + // For debugging purpose only. + for _, container := range pod.Spec.InitContainers { + for _, envVar := range container.Env { + log.G(ctx).Debug("InterLink VK environment variable to pod ", pod.Name, " container: ", container.Name, " env: ", envVar.Name, " value: ", envVar.Value) + } + } + for _, container := range pod.Spec.Containers { + for _, envVar := range container.Env { + log.G(ctx).Debug("InterLink VK environment variable to pod ", pod.Name, " container: ", container.Name, " env: ", envVar.Name, " value: ", envVar.Value) } } - returnVal, err := createRequest(ctx, config, req, token) if err != nil { - return err + return fmt.Errorf("error doing createRequest() in RemoteExecution() return value %s error detail %s error: %w", returnVal, fmt.Sprintf("%#v", err), err) } + log.G(ctx).Debug("Pod ", pod.Name, " with Job ID ", resp.PodJID, " before json.Unmarshal()") // get remote job ID and annotate it into the pod err = json.Unmarshal(returnVal, &resp) if err != nil { - return err + return fmt.Errorf("error doing Unmarshal() in RemoteExecution() return value %s error detail %s error: %w", returnVal, fmt.Sprintf("%#v", err), err) } if string(pod.UID) == resp.PodUID { @@ -483,7 +776,7 @@ func RemoteExecution(ctx context.Context, config VirtualKubeletConfig, p *Virtua case DELETE: req := pod - if pod.Status.Phase != "Initializing" { + if pod.Status.Phase != PodPhaseInitialize { returnVal, err := deleteRequest(ctx, config, req, token) if err != nil { return err @@ -494,13 +787,132 @@ func RemoteExecution(ctx context.Context, config VirtualKubeletConfig, p *Virtua return nil } +func handleInitContainersUpdate(ctx context.Context, podRemoteStatus types.PodStatus, podRefInCluster *v1.Pod, nInitContainersInPod int) (bool, bool, bool, string, int) { + log.G(ctx).Debug("Init containers detected, going to check them first") + + counterOfTerminatedInitContainers := 0 + podErrored := false + failedReason := "" + podWaitingForInitContainers := false + podInit := false + + for _, containerRemoteStatus := range podRemoteStatus.InitContainers { + index := 0 + foundCt := false + + for i, checkedContainer := range podRefInCluster.Status.InitContainerStatuses { + if checkedContainer.Name == containerRemoteStatus.Name { + foundCt = true + index = i + break + } + } + + if !foundCt { + podRefInCluster.Status.InitContainerStatuses = append(podRefInCluster.Status.InitContainerStatuses, containerRemoteStatus) + } else { + podRefInCluster.Status.InitContainerStatuses[index] = containerRemoteStatus + } + + switch { + case containerRemoteStatus.State.Terminated != nil: + counterOfTerminatedInitContainers++ + podRefInCluster.Status.InitContainerStatuses[index].State.Terminated.ExitCode = containerRemoteStatus.State.Terminated.ExitCode + podRefInCluster.Status.InitContainerStatuses[index].State.Terminated.Reason = PodPhaseCompleted + if containerRemoteStatus.State.Terminated.ExitCode != 0 { + podErrored = true + failedReason = "Error: " + strconv.Itoa(int(containerRemoteStatus.State.Terminated.ExitCode)) + podRefInCluster.Status.InitContainerStatuses[index].State.Terminated.Reason = failedReason + log.G(ctx).Error("Container " + containerRemoteStatus.Name + " exited with error: " + strconv.Itoa(int(containerRemoteStatus.State.Terminated.ExitCode))) + } + case containerRemoteStatus.State.Waiting != nil: + log.G(ctx).Info("Pod " + podRemoteStatus.PodName + ": Service " + containerRemoteStatus.Name + " is setting up on Sidecar") + podWaitingForInitContainers = true + podRefInCluster.Status.InitContainerStatuses[index].State.Waiting = containerRemoteStatus.State.Waiting + case containerRemoteStatus.State.Running != nil: + podInit = true + log.G(ctx).Debug("Pod " + podRemoteStatus.PodName + ": Service " + containerRemoteStatus.Name + " is running on Sidecar") + podRefInCluster.Status.InitContainerStatuses[index].State.Running = containerRemoteStatus.State.Running + podRefInCluster.Status.InitContainerStatuses[index].State.Waiting = nil + } + } + if counterOfTerminatedInitContainers == nInitContainersInPod { + podWaitingForInitContainers = false + } + + return podWaitingForInitContainers, podInit, podErrored, failedReason, counterOfTerminatedInitContainers +} + +func handleContainersUpdate(ctx context.Context, podRemoteStatus types.PodStatus, podRefInCluster *v1.Pod, podWaitingForInitContainers bool, podInit bool, nInitContainersInPod int, counterOfTerminatedInitContainers int) (int, bool, string, bool) { + counterOfTerminatedContainers := 0 + podErrored := false + failedReason := "" + podRunning := false + + for _, containerRemoteStatus := range podRemoteStatus.Containers { + index := 0 + foundCt := false + + for i, checkedContainer := range podRefInCluster.Status.ContainerStatuses { + if checkedContainer.Name == containerRemoteStatus.Name { + foundCt = true + index = i + break + } + } + + // if it is the first time checking the container, append it to the pod containers, otherwise just update the correct item + if !foundCt { + podRefInCluster.Status.ContainerStatuses = append(podRefInCluster.Status.ContainerStatuses, containerRemoteStatus) + } else { + podRefInCluster.Status.ContainerStatuses[index] = containerRemoteStatus + } + + // if the pod is waiting for the starting of the init containers or some of them are still running + // all the other containers are in waiting state + if podWaitingForInitContainers || podInit { + podRefInCluster.Status.ContainerStatuses[index].State.Waiting = &v1.ContainerStateWaiting{Reason: "Waiting for init containers"} + podRefInCluster.Status.ContainerStatuses[index].State.Running = nil + podRefInCluster.Status.ContainerStatuses[index].State.Terminated = nil + if podInit { + podRefInCluster.Status.ContainerStatuses[index].State.Waiting.Reason = "Init:" + strconv.Itoa(counterOfTerminatedInitContainers) + "/" + strconv.Itoa(nInitContainersInPod) + } else { + podRefInCluster.Status.ContainerStatuses[index].State.Waiting.Reason = "PodInitializing" + } + } else { + // if plugin cannot return any non-terminated container set the status to terminated + // if the exit code is != 0 get the error and set error reason + rememeber to set pod to failed + switch { + case containerRemoteStatus.State.Terminated != nil: + log.G(ctx).Debug("Pod " + podRemoteStatus.PodName + ": Service " + containerRemoteStatus.Name + " is not running on Plugin side") + counterOfTerminatedContainers++ + podRefInCluster.Status.ContainerStatuses[index].State.Terminated.Reason = PodPhaseCompleted + if containerRemoteStatus.State.Terminated.ExitCode != 0 { + podErrored = true + failedReason = "Error: " + strconv.Itoa(int(containerRemoteStatus.State.Terminated.ExitCode)) + podRefInCluster.Status.ContainerStatuses[index].State.Terminated.Reason = failedReason + log.G(ctx).Error("Container " + containerRemoteStatus.Name + " exited with error: " + strconv.Itoa(int(containerRemoteStatus.State.Terminated.ExitCode))) + } + case containerRemoteStatus.State.Waiting != nil: + log.G(ctx).Info("Pod " + podRemoteStatus.PodName + ": Service " + containerRemoteStatus.Name + " is setting up on Sidecar") + podRunning = true + case containerRemoteStatus.State.Running != nil: + podRunning = true + log.G(ctx).Debug("Pod " + podRemoteStatus.PodName + ": Service " + containerRemoteStatus.Name + " is running on Sidecar") + podRefInCluster.Status.ContainerStatuses[index].Ready = true + podRefInCluster.Status.ContainerStatuses[index].State.Running = containerRemoteStatus.State.Running + } + } + } + + return counterOfTerminatedContainers, podErrored, failedReason, podRunning +} + // checkPodsStatus is regularly called by the VK itself at regular intervals of time to query InterLink for Pods' status. // It basically append all available pods registered to the VK to a slice and passes this slice to the statusRequest function. // After the statusRequest returns a response, this function uses that response to update every Pod and Container status. -func checkPodsStatus(ctx context.Context, p *VirtualKubeletProvider, podsList []*v1.Pod, token string, config VirtualKubeletConfig) ([]types.PodStatus, error) { +func checkPodsStatus(ctx context.Context, p *Provider, podsList []*v1.Pod, token string, config Config) ([]types.PodStatus, error) { var ret []types.PodStatus - //commented out because it's too verbose. uncomment to see all registered pods - //log.G(ctx).Debug(p.pods) // retrieve pod status from remote interlink returnVal, err := statusRequest(ctx, config, podsList, token) @@ -512,7 +924,8 @@ func checkPodsStatus(ctx context.Context, p *VirtualKubeletProvider, podsList [] err = json.Unmarshal(returnVal, &ret) if err != nil { - return nil, err + errWithContext := fmt.Errorf("error doing Unmarshal() in checkPodsStatus() error detail: %s error: %w", fmt.Sprintf("%#v", err), err) + return nil, errWithContext } // if there is a pod status available go ahead to match with the latest state available in etcd @@ -521,101 +934,120 @@ func checkPodsStatus(ctx context.Context, p *VirtualKubeletProvider, podsList [] log.G(ctx).Debug(fmt.Sprintln("Get status from remote status len: ", len(podRemoteStatus.Containers))) // avoid asking for status too early, when etcd as not been updated - if podRemoteStatus.PodName != "" { - // get pod reference from cluster etcd - podRefInCluster, err := p.GetPod(ctx, podRemoteStatus.PodNamespace, podRemoteStatus.PodName) - if err != nil { - log.G(ctx).Warning(err) - continue + if podRemoteStatus.PodName == "" { + log.G(ctx).Warning("PodName is empty, skipping") + continue + } + + // get pod reference from cluster etcd + podRefInCluster, err := p.GetPod(ctx, podRemoteStatus.PodNamespace, podRemoteStatus.PodName) + if err != nil { + log.G(ctx).Warning(err) + continue + } + log.G(ctx).Debug(fmt.Sprintln("Get pod from k8s cluster status: ", podRefInCluster.Status.ContainerStatuses)) + + // if the PodUID match with the one in etcd we are talking of the same thing. GOOD + if podRemoteStatus.PodUID == string(podRefInCluster.UID) { + podInit := false // if a init container is running, the other containers phase is PodInitializing + podRunning := false // if a normale container is running, the phase is PodRunning + podErrored := false + podInitErrored := false // if a container is in error, the phase is PodFailed + podCompleted := false // if all containers are terminated, the phase is PodSucceeded, but if one is in error, the phase is PodFailed + podWaitingForInitContainers := false // if init containers are waiting, the phase is PodPending + failedReason := "" + failedReasonInit := "" + + nContainersInPod := 0 + if podRemoteStatus.Containers != nil { + nContainersInPod = len(podRemoteStatus.Containers) } - log.G(ctx).Debug(fmt.Sprintln("Get pod from k8s cluster status: ", podRefInCluster.Status.ContainerStatuses)) - - // if the PodUID match with the one in etcd we are talking of the same thing. GOOD - if podRemoteStatus.PodUID == string(podRefInCluster.UID) { - podRunning := false - podErrored := false - podCompleted := false - failedReason := "" - - // For each container of the pod we check if there is a previous state known by K8s - for _, containerRemoteStatus := range podRemoteStatus.Containers { - index := 0 - foundCt := false - - for i, checkedContainer := range podRefInCluster.Status.ContainerStatuses { - if checkedContainer.Name == containerRemoteStatus.Name { - foundCt = true - index = i - } - } + counterOfTerminatedContainers := 0 - // if it is the first time checking the container, append it to the pod containers, otherwise just update the correct item - if !foundCt { - podRefInCluster.Status.ContainerStatuses = append(podRefInCluster.Status.ContainerStatuses, containerRemoteStatus) - } else { - podRefInCluster.Status.ContainerStatuses[index] = containerRemoteStatus - } + nInitContainersInPod := 0 + if podRemoteStatus.InitContainers != nil { + nInitContainersInPod = len(podRemoteStatus.InitContainers) + } + counterOfTerminatedInitContainers := 0 - log.G(ctx).Debug(containerRemoteStatus.State.Running) - - // if plugin cannot return any non-terminated container set the status to terminated - // if the exit code is != 0 get the error and set error reason + rememeber to set pod to failed - if containerRemoteStatus.State.Terminated != nil { - log.G(ctx).Debug("Pod " + podRemoteStatus.PodName + ": Service " + containerRemoteStatus.Name + " is not running on Plugin side") - podCompleted = true - podRefInCluster.Status.ContainerStatuses[index].State.Terminated.Reason = "Completed" - if containerRemoteStatus.State.Terminated.ExitCode != 0 { - podErrored = true - failedReason = "Error: " + strconv.Itoa(int(containerRemoteStatus.State.Terminated.ExitCode)) - podRefInCluster.Status.ContainerStatuses[index].State.Terminated.Reason = failedReason - log.G(ctx).Error("Container " + containerRemoteStatus.Name + " exited with error: " + strconv.Itoa(int(containerRemoteStatus.State.Terminated.ExitCode))) - } - } else if containerRemoteStatus.State.Waiting != nil { - log.G(ctx).Info("Pod " + podRemoteStatus.PodName + ": Service " + containerRemoteStatus.Name + " is setting up on Sidecar") - podRunning = true - } else if containerRemoteStatus.State.Running != nil { - podRunning = true - log.G(ctx).Debug("Pod " + podRemoteStatus.PodName + ": Service " + containerRemoteStatus.Name + " is running on Sidecar") - } + log.G(ctx).Debug("Number of containers in POD: " + strconv.Itoa(nContainersInPod)) + log.G(ctx).Debug("Number of init containers in POD: " + strconv.Itoa(nInitContainersInPod)) - // if this is the first time you see a container running/errored/completed, update the status of the pod. - if podRunning && podRefInCluster.Status.Phase != v1.PodRunning { - podRefInCluster.Status.Phase = v1.PodRunning - podRefInCluster.Status.Conditions = append(podRefInCluster.Status.Conditions, v1.PodCondition{Type: v1.PodReady, Status: v1.ConditionTrue}) - } else if podErrored && podRefInCluster.Status.Phase != v1.PodFailed { - podRefInCluster.Status.Phase = v1.PodFailed + // if there are init containers, we need to check them first + if nInitContainersInPod > 0 { + podWaitingForInitContainers, podInit, podInitErrored, failedReasonInit, counterOfTerminatedInitContainers = handleInitContainersUpdate(ctx, podRemoteStatus, podRefInCluster, nInitContainersInPod) + } + + if podInitErrored { + log.G(ctx).Error("At least one init container is in error with reason: " + failedReasonInit) + } + + // call handleContainersUpdate to update the status of the containers + counterOfTerminatedContainers, podErrored, failedReason, podRunning = handleContainersUpdate(ctx, podRemoteStatus, podRefInCluster, podWaitingForInitContainers, podInit, nInitContainersInPod, counterOfTerminatedInitContainers) + + if counterOfTerminatedContainers == nContainersInPod { + podCompleted = true + } + + if podCompleted { + // it means that all containers are terminated, check if some of them are errored + if podErrored || podInitErrored { + podRefInCluster.Status.Phase = v1.PodFailed + if podErrored { podRefInCluster.Status.Reason = failedReason - } else if podCompleted && podRefInCluster.Status.Phase != v1.PodSucceeded { - podRefInCluster.Status.Conditions = append(podRefInCluster.Status.Conditions, v1.PodCondition{Type: v1.PodReady, Status: v1.ConditionFalse}) - podRefInCluster.Status.Phase = v1.PodSucceeded - podRefInCluster.Status.Reason = "Completed" + } else { + podRefInCluster.Status.Reason = failedReasonInit } - + // override all the ContainerStatuses to set Reason to failedReason or failedReasonInit + for i := range podRefInCluster.Status.ContainerStatuses { + if podErrored { + podRefInCluster.Status.ContainerStatuses[i].State.Terminated.Reason = failedReason + } else { + podRefInCluster.Status.ContainerStatuses[i].State.Terminated.Reason = failedReasonInit + } + } + } else { + podRefInCluster.Status.Conditions = append(podRefInCluster.Status.Conditions, v1.PodCondition{Type: v1.PodReady, Status: v1.ConditionFalse}) + podRefInCluster.Status.Phase = v1.PodSucceeded + podRefInCluster.Status.Reason = PodPhaseCompleted } } else { - - // if you don't now any UID yet, collect the status and updated the status cache - list, err := p.clientSet.CoreV1().Pods(podRemoteStatus.PodNamespace).List(ctx, metav1.ListOptions{}) - if err != nil { - log.G(ctx).Error(err) - return nil, err + if podInit { + podRefInCluster.Status.Phase = v1.PodPending + podRefInCluster.Status.Reason = "Init" + } + if podWaitingForInitContainers { + podRefInCluster.Status.Phase = v1.PodPending + podRefInCluster.Status.Reason = "Waiting for init containers" + } + if podRunning && podRefInCluster.Status.Phase != v1.PodRunning { // do not update the status if it is already running + podRefInCluster.Status.Phase = v1.PodRunning + podRefInCluster.Status.Conditions = append(podRefInCluster.Status.Conditions, v1.PodCondition{Type: v1.PodReady, Status: v1.ConditionTrue}) + podRefInCluster.Status.Reason = "Running" } + } + } else { + list, err := p.clientSet.CoreV1().Pods(podRemoteStatus.PodNamespace).List(ctx, metav1.ListOptions{}) + if err != nil { + log.G(ctx).Error(err) + return nil, err + } - pods := list.Items + pods := list.Items - for _, pod := range pods { - if string(pod.UID) == podRemoteStatus.PodUID { - err = updateCacheRequest(ctx, config, pod, token) - if err != nil { - log.G(ctx).Error(err) - continue - } + for _, pod := range pods { + if string(pod.UID) == podRemoteStatus.PodUID { + err = updateCacheRequest(ctx, config, pod, token) + if err != nil { + log.G(ctx).Error(err) + continue } } - } + } + } log.G(ctx).Info("No errors while getting statuses") log.G(ctx).Debug(ret) diff --git a/pkg/virtualkubelet/virtualkubelet.go b/pkg/virtualkubelet/virtualkubelet.go index aedb799e..c499cc6f 100644 --- a/pkg/virtualkubelet/virtualkubelet.go +++ b/pkg/virtualkubelet/virtualkubelet.go @@ -5,8 +5,10 @@ import ( "fmt" "io" "math/rand" + "net/http" "os" "strconv" + "strings" "time" "gopkg.in/yaml.v2" @@ -24,7 +26,7 @@ import ( "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/clientcmd" - types "github.com/intertwin-eu/interlink/pkg/interlink" + types "github.com/interlink-hq/interlink/pkg/interlink" ) const ( @@ -32,13 +34,217 @@ const ( DefaultMemoryCapacity = "3000G" DefaultPodCapacity = "10000" DefaultGPUCapacity = "0" + DefaultFPGACapacity = "0" DefaultListenPort = 10250 NamespaceKey = "namespace" NameKey = "name" CREATE = 0 DELETE = 1 + nvidiaGPU = "nvidia.com/gpu" + amdGPU = "amd.com/gpu" + intelGPU = "intel.com/gpu" + xilinxFPGA = "xilinx.com/fpga" + intelFPGA = "intel.com/fpga" ) +func TracerUpdate(ctx *context.Context, name string, pod *v1.Pod) { + start := time.Now().Unix() + tracer := otel.Tracer("interlink-service") + + var span trace.Span + if pod != nil { + *ctx, span = tracer.Start(*ctx, name, trace.WithAttributes( + attribute.String("pod.name", pod.Name), + attribute.String("pod.namespace", pod.Namespace), + attribute.Int64("start.timestamp", start), + )) + log.G(*ctx).Infof("receive %s %q", name, pod.Name) + } else { + *ctx, span = tracer.Start(*ctx, name, trace.WithAttributes( + attribute.Int64("start.timestamp", start), + )) + } + defer span.End() + defer types.SetDurationSpan(start, span) +} + +func PodPhase(p Provider, phase string) (v1.PodStatus, error) { + now := metav1.NewTime(time.Now()) + + var podPhase v1.PodPhase + var initialized v1.ConditionStatus + var ready v1.ConditionStatus + var scheduled v1.ConditionStatus + + switch phase { + case "Running": + podPhase = v1.PodRunning + initialized = v1.ConditionTrue + ready = v1.ConditionTrue + scheduled = v1.ConditionTrue + case "Pending": + podPhase = v1.PodPending + initialized = v1.ConditionTrue + ready = v1.ConditionFalse + scheduled = v1.ConditionTrue + case "Failed": + podPhase = v1.PodFailed + initialized = v1.ConditionFalse + ready = v1.ConditionFalse + scheduled = v1.ConditionFalse + default: + return v1.PodStatus{}, fmt.Errorf("invalid pod phase specified: %s", phase) + } + + return v1.PodStatus{ + Phase: podPhase, + HostIP: p.internalIP, + PodIP: p.internalIP, + StartTime: &now, + Conditions: []v1.PodCondition{ + { + Type: v1.PodInitialized, + Status: initialized, + }, + { + Type: v1.PodReady, + Status: ready, + }, + { + Type: v1.PodScheduled, + Status: scheduled, + }, + }, + }, nil +} + +func NodeCondition(ready bool) []v1.NodeCondition { + var readyType v1.ConditionStatus + var netType v1.ConditionStatus + if ready { + readyType = v1.ConditionTrue + netType = v1.ConditionFalse + } else { + readyType = v1.ConditionFalse + netType = v1.ConditionTrue + } + + return []v1.NodeCondition{ + { + Type: "Ready", + Status: readyType, + LastHeartbeatTime: metav1.Now(), + LastTransitionTime: metav1.Now(), + Reason: "KubeletPending", + Message: "kubelet is pending.", + }, + { + Type: "OutOfDisk", + Status: v1.ConditionFalse, + LastHeartbeatTime: metav1.Now(), + LastTransitionTime: metav1.Now(), + Reason: "KubeletHasSufficientDisk", + Message: "kubelet has sufficient disk space available", + }, + { + Type: "MemoryPressure", + Status: v1.ConditionFalse, + LastHeartbeatTime: metav1.Now(), + LastTransitionTime: metav1.Now(), + Reason: "KubeletHasSufficientMemory", + Message: "kubelet has sufficient memory available", + }, + { + Type: "DiskPressure", + Status: v1.ConditionFalse, + LastHeartbeatTime: metav1.Now(), + LastTransitionTime: metav1.Now(), + Reason: "KubeletHasNoDiskPressure", + Message: "kubelet has no disk pressure", + }, + { + Type: "NetworkUnavailable", + Status: netType, + LastHeartbeatTime: metav1.Now(), + LastTransitionTime: metav1.Now(), + Reason: "RouteCreated", + Message: "RouteController created a route", + }, + } +} + +func GetResources(config Config) v1.ResourceList { + gpuCount := map[string]int{} + fpgaCount := map[string]int{} + + for _, accelerator := range config.Resources.Accelerators { + switch accelerator.ResourceType { + case nvidiaGPU, amdGPU, intelGPU: + gpuCount[accelerator.ResourceType] += accelerator.Available + case xilinxFPGA, intelFPGA: + fpgaCount[accelerator.ResourceType] += accelerator.Available + } + } + + resourceList := v1.ResourceList{ + "cpu": resource.MustParse(config.Resources.CPU), + "memory": resource.MustParse(config.Resources.Memory), + "pods": resource.MustParse(config.Resources.Pods), + } + + for resourceType, count := range gpuCount { + if count > 0 { + resourceList[v1.ResourceName(resourceType)] = *resource.NewQuantity(int64(count), resource.DecimalSI) + } + } + + for resourceType, count := range fpgaCount { + if count > 0 { + resourceList[v1.ResourceName(resourceType)] = *resource.NewQuantity(int64(count), resource.DecimalSI) + } + } + + // log the resource list + for key, value := range resourceList { + log.G(context.Background()).Infof("Resource %s: %s", key, value.String()) + } + + return resourceList +} + +func SetDefaultResource(config *Config) { + if config.Resources.CPU == "" { + config.Resources.CPU = DefaultCPUCapacity + } + if config.Resources.Memory == "" { + config.Resources.Memory = DefaultMemoryCapacity + } + if config.Resources.Pods == "" { + config.Resources.Pods = DefaultPodCapacity + } + + for i, accelerator := range config.Resources.Accelerators { + if accelerator.Available == 0 { + switch accelerator.ResourceType { + case nvidiaGPU, amdGPU, intelGPU: + defaultGPUCapacity, err := strconv.Atoi(DefaultGPUCapacity) + if err != nil { + log.G(context.Background()).Errorf("Invalid default GPU capacity: %v", err) + defaultGPUCapacity = 0 + } + config.Resources.Accelerators[i].Available = defaultGPUCapacity + case xilinxFPGA, intelFPGA: + defaultFPGACapacity, err := strconv.Atoi(DefaultFPGACapacity) + if err != nil { + log.G(context.Background()).Errorf("Invalid default FPGA capacity: %v", err) + defaultFPGACapacity = 0 + } + config.Resources.Accelerators[i].Available = defaultFPGACapacity + } + } + } +} + func buildKeyFromNames(namespace string, name string) (string, error) { return fmt.Sprintf("%s-%s", namespace, name), nil } @@ -55,66 +261,108 @@ func buildKey(pod *v1.Pod) (string, error) { return buildKeyFromNames(pod.Namespace, pod.Name) } -// VirtualKubeletProvider defines the properties of the virtual kubelet provider -type VirtualKubeletProvider struct { +// Provider defines the properties of the virtual kubelet provider +type Provider struct { nodeName string node *v1.Node operatingSystem string internalIP string daemonEndpointPort int32 pods map[string]*v1.Pod - config VirtualKubeletConfig + config Config startTime time.Time notifier func(*v1.Pod) onNodeChangeCallback func(*v1.Node) clientSet *kubernetes.Clientset + clientHTTPTransport *http.Transport } // NewProviderConfig takes user-defined configuration and fills the Virtual Kubelet provider struct func NewProviderConfig( - config VirtualKubeletConfig, + config Config, nodeName string, nodeVersion string, operatingSystem string, internalIP string, daemonEndpointPort int32, -) (*VirtualKubeletProvider, error) { - - // set defaults - if config.CPU == "" { - config.CPU = DefaultCPUCapacity - } - if config.Memory == "" { - config.Memory = DefaultMemoryCapacity - } - if config.Pods == "" { - config.Pods = DefaultPodCapacity - } - if config.GPU == "" { - config.GPU = DefaultGPUCapacity - } + clientHTTPTransport *http.Transport, +) (*Provider, error) { + SetDefaultResource(&config) lbls := map[string]string{ "alpha.service-controller.kubernetes.io/exclude-balancer": "true", "beta.kubernetes.io/os": "linux", + "kubernetes.io/os": "linux", "kubernetes.io/hostname": nodeName, "kubernetes.io/role": "agent", "node.kubernetes.io/exclude-from-external-load-balancers": "true", - "type": "virtual-kubelet", + "virtual-node.interlink/type": "virtual-kubelet", + } + + taints := []v1.Taint{ + { + Key: "virtual-node.interlink/no-schedule", + Value: strconv.FormatBool(true), + Effect: v1.TaintEffectNoSchedule, + }, + } + + // Add custom labels from config + for _, label := range config.NodeLabels { + + parts := strings.SplitN(label, "=", 2) + if len(parts) == 2 { + lbls[parts[0]] = parts[1] + } else { + log.G(context.Background()).Warnf("Node label %q is not in the correct format. Should be key=value", label) + } + } + + for _, accelerator := range config.Resources.Accelerators { + switch strings.ToLower(accelerator.ResourceType) { + case "nvidia.com/gpu": + lbls["nvidia-gpu-type"] = accelerator.Model + case "xilinx.com/fpga": + lbls["xilinx-fpga-type"] = accelerator.Model + case "intel.com/fpga": + lbls["intel-fpga-type"] = accelerator.Model + default: + log.G(context.Background()).Warnf("Unhandled accelerator resource type: %q", accelerator.ResourceType) + } + } + + for _, taint := range config.NodeTaints { + log.G(context.Background()).Infof("Adding taint key=%q value=%q effect=%q", taint.Key, taint.Value, taint.Effect) + + var effect v1.TaintEffect + + switch taint.Effect { + case "NoSchedule": + effect = v1.TaintEffectNoSchedule + case "PreferNoSchedule": + effect = v1.TaintEffectPreferNoSchedule + case "NoExecute": + effect = v1.TaintEffectNoExecute + default: + effect = v1.TaintEffectNoSchedule + log.G(context.Background()).Warnf("Unknown taint effect %q, defaulting to NoSchedule", taint.Effect) + } + + taints = append(taints, v1.Taint{ + Key: taint.Key, + Value: taint.Value, + Effect: effect, + }) } node := v1.Node{ ObjectMeta: metav1.ObjectMeta{ Name: nodeName, Labels: lbls, - //Annotations: cfg.ExtraAnnotations, }, Spec: v1.NodeSpec{ - Taints: []v1.Taint{{ - Key: "virtual-node.interlink/no-schedule", - Value: strconv.FormatBool(true), - Effect: v1.TaintEffectNoSchedule, - }}, + ProviderID: "external:///" + nodeName, + Taints: taints, }, Status: v1.NodeStatus{ NodeInfo: v1.NodeSystemInfo{ @@ -123,108 +371,115 @@ func NewProviderConfig( OperatingSystem: "linux", }, Addresses: []v1.NodeAddress{{Type: v1.NodeInternalIP, Address: internalIP}}, - DaemonEndpoints: v1.NodeDaemonEndpoints{KubeletEndpoint: v1.DaemonEndpoint{Port: int32(daemonEndpointPort)}}, - Capacity: v1.ResourceList{ - "cpu": resource.MustParse(config.CPU), - "memory": resource.MustParse(config.Memory), - "pods": resource.MustParse(config.Pods), - "nvidia.com/gpu": resource.MustParse(config.GPU), - }, - Allocatable: v1.ResourceList{ - "cpu": resource.MustParse(config.CPU), - "memory": resource.MustParse(config.Memory), - "pods": resource.MustParse(config.Pods), - "nvidia.com/gpu": resource.MustParse(config.GPU), - }, - Conditions: nodeConditions(), + DaemonEndpoints: v1.NodeDaemonEndpoints{KubeletEndpoint: v1.DaemonEndpoint{Port: daemonEndpointPort}}, + Capacity: GetResources(config), + Allocatable: GetResources(config), + Conditions: NodeCondition(false), }, } - provider := VirtualKubeletProvider{ - nodeName: nodeName, - node: &node, - operatingSystem: operatingSystem, - internalIP: internalIP, - daemonEndpointPort: daemonEndpointPort, - pods: make(map[string]*v1.Pod), - config: config, - startTime: time.Now(), + provider := Provider{ + nodeName: nodeName, + node: &node, + operatingSystem: operatingSystem, + internalIP: internalIP, + daemonEndpointPort: daemonEndpointPort, + pods: make(map[string]*v1.Pod), + config: config, + startTime: time.Now(), + clientHTTPTransport: clientHTTPTransport, } return &provider, nil } // NewProvider creates a new Provider, which implements the PodNotifier and other virtual-kubelet interfaces -func NewProvider(providerConfig, nodeName, nodeVersion, operatingSystem string, internalIP string, daemonEndpointPort int32, ctx context.Context) (*VirtualKubeletProvider, error) { - config, err := LoadConfig(providerConfig, nodeName, ctx) +func NewProvider( + ctx context.Context, + providerConfig, + nodeName, + nodeVersion, + operatingSystem string, + internalIP string, + daemonEndpointPort int32, + clientHTTPTransport *http.Transport, +) (*Provider, error) { + config, err := LoadConfig(ctx, providerConfig) if err != nil { return nil, err } log.G(ctx).Info("Init server with config:", config) - return NewProviderConfig(config, nodeName, nodeVersion, operatingSystem, internalIP, daemonEndpointPort) + return NewProviderConfig( + config, + nodeName, + nodeVersion, + operatingSystem, + internalIP, + daemonEndpointPort, + clientHTTPTransport, + ) } // LoadConfig loads the given json configuration files and return a VirtualKubeletConfig struct -func LoadConfig(providerConfig, nodeName string, ctx context.Context) (config VirtualKubeletConfig, err error) { - +func LoadConfig(ctx context.Context, providerConfig string) (config Config, err error) { log.G(ctx).Info("Loading Virtual Kubelet config from " + providerConfig) data, err := os.ReadFile(providerConfig) if err != nil { return config, err } - config = VirtualKubeletConfig{} + config = Config{} err = yaml.Unmarshal(data, &config) - if err != nil { log.G(ctx).Fatal(err) return config, err } - //config = configMap - if config.CPU == "" { - config.CPU = DefaultCPUCapacity - } - if config.Memory == "" { - config.Memory = DefaultMemoryCapacity + // config = configMap + SetDefaultResource(&config) + + if _, err = resource.ParseQuantity(config.Resources.CPU); err != nil { + return config, fmt.Errorf("invalid CPU value %v", config.Resources.CPU) } - if config.Pods == "" { - config.Pods = DefaultPodCapacity + if _, err = resource.ParseQuantity(config.Resources.Memory); err != nil { + return config, fmt.Errorf("invalid memory value %v", config.Resources.Memory) } - if config.GPU == "" { - config.GPU = DefaultGPUCapacity + if _, err = resource.ParseQuantity(config.Resources.Pods); err != nil { + return config, fmt.Errorf("invalid pods value %v", config.Resources.Pods) } - - if _, err = resource.ParseQuantity(config.CPU); err != nil { - return config, fmt.Errorf("invalid CPU value %v", config.CPU) + if _, err = resource.ParseQuantity(config.Resources.CPU); err != nil { + return config, fmt.Errorf("invalid CPU value %v", config.Resources.CPU) } - if _, err = resource.ParseQuantity(config.Memory); err != nil { - return config, fmt.Errorf("invalid memory value %v", config.Memory) + if _, err = resource.ParseQuantity(config.Resources.Memory); err != nil { + return config, fmt.Errorf("invalid memory value %v", config.Resources.Memory) } - if _, err = resource.ParseQuantity(config.Pods); err != nil { - return config, fmt.Errorf("invalid pods value %v", config.Pods) + if _, err = resource.ParseQuantity(config.Resources.Pods); err != nil { + return config, fmt.Errorf("invalid pods value %v", config.Resources.Pods) } - if _, err = resource.ParseQuantity(config.GPU); err != nil { - return config, fmt.Errorf("invalid GPU value %v", config.GPU) + for _, accelerator := range config.Resources.Accelerators { + quantity := resource.NewQuantity(int64(accelerator.Available), resource.DecimalSI) + if _, err = resource.ParseQuantity(quantity.String()); err != nil { + return config, fmt.Errorf("invalid value for accelerator %v (model: %v): %v", accelerator.ResourceType, accelerator.Model, err) + } } + return config, nil } // GetNode return the Node information at the initiation of a virtual node -func (p *VirtualKubeletProvider) GetNode() *v1.Node { +func (p *Provider) GetNode() *v1.Node { return p.node } // NotifyNodeStatus runs once at initiation time and set the function to be used for node change notification (native of vk) // it also starts a go routine for continously checking the node status and availability -func (p *VirtualKubeletProvider) NotifyNodeStatus(ctx context.Context, f func(*v1.Node)) { +func (p *Provider) NotifyNodeStatus(ctx context.Context, f func(*v1.Node)) { p.onNodeChangeCallback = f go p.nodeUpdate(ctx) } // nodeUpdate continously checks for node status and availability -func (p *VirtualKubeletProvider) nodeUpdate(ctx context.Context) { - +func (p *Provider) nodeUpdate(ctx context.Context) { t := time.NewTimer(5 * time.Second) if !t.Stop() { <-t.C @@ -246,123 +501,32 @@ func (p *VirtualKubeletProvider) nodeUpdate(ctx context.Context) { return case <-t.C: } - bool, code, err := PingInterLink(ctx, p.config) - if err != nil || !bool { - p.node.Status.Conditions = []v1.NodeCondition{ - { - Type: "Ready", - Status: v1.ConditionFalse, - LastHeartbeatTime: metav1.Now(), - LastTransitionTime: metav1.Now(), - Reason: "KubeletPending", - Message: "kubelet is pending.", - }, - { - Type: "OutOfDisk", - Status: v1.ConditionFalse, - LastHeartbeatTime: metav1.Now(), - LastTransitionTime: metav1.Now(), - Reason: "KubeletHasSufficientDisk", - Message: "kubelet has sufficient disk space available", - }, - { - Type: "MemoryPressure", - Status: v1.ConditionFalse, - LastHeartbeatTime: metav1.Now(), - LastTransitionTime: metav1.Now(), - Reason: "KubeletHasSufficientMemory", - Message: "kubelet has sufficient memory available", - }, - { - Type: "DiskPressure", - Status: v1.ConditionFalse, - LastHeartbeatTime: metav1.Now(), - LastTransitionTime: metav1.Now(), - Reason: "KubeletHasNoDiskPressure", - Message: "kubelet has no disk pressure", - }, - { - Type: "NetworkUnavailable", - Status: v1.ConditionTrue, - LastHeartbeatTime: metav1.Now(), - LastTransitionTime: metav1.Now(), - Reason: "RouteCreated", - Message: "RouteController created a route", - }, - } + _, code, err := PingInterLink(ctx, p.config) + if err != nil || code != 200 { + p.node.Status.Conditions = NodeCondition(false) p.onNodeChangeCallback(p.node) log.G(ctx).Error("Ping Failed with exit code: ", code) + log.G(ctx).Error("Error: ", err) } else { - p.node.Status.Conditions = []v1.NodeCondition{ - { - Type: "Ready", - Status: v1.ConditionTrue, - LastHeartbeatTime: metav1.Now(), - LastTransitionTime: metav1.Now(), - Reason: "KubeletPending", - Message: "kubelet is pending.", - }, - { - Type: "OutOfDisk", - Status: v1.ConditionFalse, - LastHeartbeatTime: metav1.Now(), - LastTransitionTime: metav1.Now(), - Reason: "KubeletHasSufficientDisk", - Message: "kubelet has sufficient disk space available", - }, - { - Type: "MemoryPressure", - Status: v1.ConditionFalse, - LastHeartbeatTime: metav1.Now(), - LastTransitionTime: metav1.Now(), - Reason: "KubeletHasSufficientMemory", - Message: "kubelet has sufficient memory available", - }, - { - Type: "DiskPressure", - Status: v1.ConditionFalse, - LastHeartbeatTime: metav1.Now(), - LastTransitionTime: metav1.Now(), - Reason: "KubeletHasNoDiskPressure", - Message: "kubelet has no disk pressure", - }, - { - Type: "NetworkUnavailable", - Status: v1.ConditionFalse, - LastHeartbeatTime: metav1.Now(), - LastTransitionTime: metav1.Now(), - Reason: "RouteCreated", - Message: "RouteController created a route", - }, - } - + p.node.Status.Conditions = NodeCondition(true) log.G(ctx).Info("Ping succeded with exit code: ", code) p.onNodeChangeCallback(p.node) } log.G(ctx).Info("endNodeLoop") } - } // Ping the kubelet from the cluster, this will always be ok by design probably -func (p *VirtualKubeletProvider) Ping(ctx context.Context) error { +func (p *Provider) Ping(_ context.Context) error { return nil } // CreatePod accepts a Pod definition and stores it in memory in p.pods -func (p *VirtualKubeletProvider) CreatePod(ctx context.Context, pod *v1.Pod) error { - start := time.Now().Unix() - tracer := otel.Tracer("interlink-service") - ctx, span := tracer.Start(ctx, "CreatePodVK", trace.WithAttributes( - attribute.String("pod.name", pod.Name), - attribute.String("pod.namespace", pod.Namespace), - attribute.Int64("start.timestamp", start), - )) - defer span.End() - defer types.SetDurationSpan(start, span) +func (p *Provider) CreatePod(ctx context.Context, pod *v1.Pod) error { + TracerUpdate(&ctx, "CreatePodVK", pod) - var hasInitContainers = false + hasInitContainers := false var state v1.ContainerState key, err := buildKey(pod) @@ -388,49 +552,20 @@ func (p *VirtualKubeletProvider) CreatePod(ctx context.Context, pod *v1.Pod) err hasInitContainers = true // we put the phase in running but initialization phase to false - pod.Status = v1.PodStatus{ - Phase: v1.PodRunning, - HostIP: p.internalIP, - PodIP: p.internalIP, - StartTime: &now, - Conditions: []v1.PodCondition{ - { - Type: v1.PodInitialized, - Status: v1.ConditionFalse, - }, - { - Type: v1.PodReady, - Status: v1.ConditionFalse, - }, - { - Type: v1.PodScheduled, - Status: v1.ConditionTrue, - }, - }, + pod.Status, err = PodPhase(*p, "Running") + if err != nil { + log.G(ctx).Error(err) + return err } } else { // if no init containers are there, go head and set phase to initialized - pod.Status = v1.PodStatus{ - Phase: v1.PodPending, - HostIP: p.internalIP, - PodIP: p.internalIP, - StartTime: &now, - Conditions: []v1.PodCondition{ - { - Type: v1.PodInitialized, - Status: v1.ConditionTrue, - }, - { - Type: v1.PodReady, - Status: v1.ConditionTrue, - }, - { - Type: v1.PodScheduled, - Status: v1.ConditionTrue, - }, - }, + pod.Status, err = PodPhase(*p, "Pending") + if err != nil { + log.G(ctx).Error(err) + return err } + } // Create pod asynchronously on the remote plugin @@ -443,28 +578,16 @@ func (p *VirtualKubeletProvider) CreatePod(ctx context.Context, pod *v1.Pod) err } else { // TODO if node in NotReady put it to Unknown/pending? log.G(ctx).Error(err) - pod.Status = v1.PodStatus{ - Phase: v1.PodFailed, - HostIP: p.internalIP, - PodIP: p.internalIP, - StartTime: &now, - Conditions: []v1.PodCondition{ - { - Type: v1.PodInitialized, - Status: v1.ConditionFalse, - }, - { - Type: v1.PodReady, - Status: v1.ConditionFalse, - }, - { - Type: v1.PodScheduled, - Status: v1.ConditionFalse, - }, - }, + pod.Status, err = PodPhase(*p, "Failed") + if err != nil { + log.G(ctx).Error(err) + return } - p.UpdatePod(ctx, pod) + err = p.UpdatePod(ctx, pod) + if err != nil { + log.G(ctx).Error(err) + } } return @@ -473,7 +596,6 @@ func (p *VirtualKubeletProvider) CreatePod(ctx context.Context, pod *v1.Pod) err // set pod containers status to notReady and waiting if there is an initContainer to be executed first for _, container := range pod.Spec.Containers { - pod.Status.ContainerStatuses = append(pod.Status.ContainerStatuses, v1.ContainerStatus{ Name: container.Name, Image: container.Image, @@ -481,7 +603,6 @@ func (p *VirtualKubeletProvider) CreatePod(ctx context.Context, pod *v1.Pod) err RestartCount: 0, State: state, }) - } p.pods[key] = pod @@ -490,18 +611,8 @@ func (p *VirtualKubeletProvider) CreatePod(ctx context.Context, pod *v1.Pod) err } // UpdatePod accepts a Pod definition and updates its reference. -func (p *VirtualKubeletProvider) UpdatePod(ctx context.Context, pod *v1.Pod) error { - start := time.Now().Unix() - tracer := otel.Tracer("interlink-service") - ctx, span := tracer.Start(ctx, "UpdatePodVK", trace.WithAttributes( - attribute.String("pod.name", pod.Name), - attribute.String("pod.namespace", pod.Namespace), - attribute.Int64("start.timestamp", start), - )) - defer span.End() - defer types.SetDurationSpan(start, span) - - log.G(ctx).Infof("receive UpdatePod %q", pod.Name) +func (p *Provider) UpdatePod(ctx context.Context, pod *v1.Pod) error { + TracerUpdate(&ctx, "UpdatePodVK", pod) p.notifier(pod) @@ -509,16 +620,8 @@ func (p *VirtualKubeletProvider) UpdatePod(ctx context.Context, pod *v1.Pod) err } // DeletePod deletes the specified pod and drops it out of p.pods -func (p *VirtualKubeletProvider) DeletePod(ctx context.Context, pod *v1.Pod) (err error) { - start := time.Now().Unix() - tracer := otel.Tracer("interlink-service") - ctx, span := tracer.Start(ctx, "DeletePodVK", trace.WithAttributes( - attribute.String("pod.name", pod.Name), - attribute.String("pod.namespace", pod.Namespace), - attribute.Int64("start.timestamp", start), - )) - defer span.End() - defer types.SetDurationSpan(start, span) +func (p *Provider) DeletePod(ctx context.Context, pod *v1.Pod) (err error) { + TracerUpdate(&ctx, "DeletePodVK", pod) log.G(ctx).Infof("receive DeletePod %q", pod.Name) @@ -564,7 +667,10 @@ func (p *VirtualKubeletProvider) DeletePod(ctx context.Context, pod *v1.Pod) (er } // tell k8s it's terminated - p.UpdatePod(ctx, pod) + err = p.UpdatePod(ctx, pod) + if err != nil { + return err + } // delete from p.pods delete(p.pods, key) @@ -573,7 +679,7 @@ func (p *VirtualKubeletProvider) DeletePod(ctx context.Context, pod *v1.Pod) (er } // GetPod returns a pod by name that is stored in memory. -func (p *VirtualKubeletProvider) GetPod(ctx context.Context, namespace, name string) (pod *v1.Pod, err error) { +func (p *Provider) GetPod(ctx context.Context, namespace, name string) (pod *v1.Pod, err error) { start := time.Now().Unix() tracer := otel.Tracer("interlink-service") ctx, span := tracer.Start(ctx, "GetPodVK", trace.WithAttributes( @@ -600,18 +706,15 @@ func (p *VirtualKubeletProvider) GetPod(ctx context.Context, namespace, name str // GetPodStatus returns the status of a pod by name that is "running". // returns nil if a pod by that name is not found. -func (p *VirtualKubeletProvider) GetPodStatus(ctx context.Context, namespace, name string) (*v1.PodStatus, error) { - start := time.Now().Unix() - tracer := otel.Tracer("interlink-service") - ctx, span := tracer.Start(ctx, "GetPodStatusVK", trace.WithAttributes( - attribute.String("pod.name", name), - attribute.String("pod.namespace", namespace), - attribute.Int64("start.timestamp", start), - )) - defer span.End() - defer types.SetDurationSpan(start, span) - - log.G(ctx).Infof("receive GetPodStatus %q", name) +func (p *Provider) GetPodStatus(ctx context.Context, namespace, name string) (*v1.PodStatus, error) { + podTmp := v1.Pod{ + TypeMeta: metav1.TypeMeta{}, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: namespace, + }, + } + TracerUpdate(&ctx, "GetPodStatusVK", &podTmp) pod, err := p.GetPod(ctx, namespace, name) if err != nil { @@ -622,19 +725,18 @@ func (p *VirtualKubeletProvider) GetPodStatus(ctx context.Context, namespace, na } // GetPods returns a list of all pods known to be "running". -func (p *VirtualKubeletProvider) GetPods(ctx context.Context) ([]*v1.Pod, error) { - start := time.Now().Unix() - tracer := otel.Tracer("interlink-service") - ctx, span := tracer.Start(ctx, "GetPodsVK", trace.WithAttributes( - attribute.Int64("start.timestamp", start), - )) - defer span.End() - defer types.SetDurationSpan(start, span) +func (p *Provider) GetPods(ctx context.Context) ([]*v1.Pod, error) { + TracerUpdate(&ctx, "GetPodsVK", nil) - log.G(ctx).Info("receive GetPods") + err := p.initClientSet(ctx) + if err != nil { + return nil, err + } - p.initClientSet(ctx) - p.RetrievePodsFromCluster(ctx) + err = p.RetrievePodsFromCluster(ctx) + if err != nil { + return nil, err + } var pods []*v1.Pod @@ -645,63 +747,14 @@ func (p *VirtualKubeletProvider) GetPods(ctx context.Context) ([]*v1.Pod, error) return pods, nil } -// NodeConditions returns a list of conditions (Ready, OutOfDisk, etc), for updates to the node status -// within Kubernetes. -// TODO: use as var not function -func nodeConditions() []v1.NodeCondition { - return []v1.NodeCondition{ - { - Type: "Ready", - Status: v1.ConditionFalse, - LastHeartbeatTime: metav1.Now(), - LastTransitionTime: metav1.Now(), - Reason: "KubeletPending", - Message: "kubelet is pending.", - }, - { - Type: "OutOfDisk", - Status: v1.ConditionFalse, - LastHeartbeatTime: metav1.Now(), - LastTransitionTime: metav1.Now(), - Reason: "KubeletHasSufficientDisk", - Message: "kubelet has sufficient disk space available", - }, - { - Type: "MemoryPressure", - Status: v1.ConditionFalse, - LastHeartbeatTime: metav1.Now(), - LastTransitionTime: metav1.Now(), - Reason: "KubeletHasSufficientMemory", - Message: "kubelet has sufficient memory available", - }, - { - Type: "DiskPressure", - Status: v1.ConditionFalse, - LastHeartbeatTime: metav1.Now(), - LastTransitionTime: metav1.Now(), - Reason: "KubeletHasNoDiskPressure", - Message: "kubelet has no disk pressure", - }, - { - Type: "NetworkUnavailable", - Status: v1.ConditionTrue, - LastHeartbeatTime: metav1.Now(), - LastTransitionTime: metav1.Now(), - Reason: "RouteCreated", - Message: "RouteController created a route", - }, - } - -} - // NotifyPods is called to set a pod notifier callback function. Also starts the go routine to monitor all vk pods -func (p *VirtualKubeletProvider) NotifyPods(ctx context.Context, f func(*v1.Pod)) { +func (p *Provider) NotifyPods(ctx context.Context, f func(*v1.Pod)) { p.notifier = f go p.statusLoop(ctx) } // statusLoop preiodically monitoring the status of all the pods in p.pods -func (p *VirtualKubeletProvider) statusLoop(ctx context.Context) { +func (p *Provider) statusLoop(ctx context.Context) { t := time.NewTimer(5 * time.Second) if !t.Stop() { <-t.C @@ -756,8 +809,16 @@ func (p *VirtualKubeletProvider) statusLoop(ctx context.Context) { } } +func AddSessionContext(req *http.Request, sessionContext string) { + req.Header.Set("InterLink-Http-Session", sessionContext) +} + +func GetSessionContextMessage(sessionContext string) string { + return "HTTP InterLink session " + sessionContext + ": " +} + // GetLogs implements the logic for interLink pod logs retrieval. -func (p *VirtualKubeletProvider) GetLogs(ctx context.Context, namespace, podName, containerName string, opts api.ContainerLogOpts) (io.ReadCloser, error) { +func (p *Provider) GetLogs(ctx context.Context, namespace, podName, containerName string, opts api.ContainerLogOpts) (io.ReadCloser, error) { start := time.Now().Unix() tracer := otel.Tracer("interlink-service") ctx, span := tracer.Start(ctx, "GetLogsVK", trace.WithAttributes( @@ -766,7 +827,12 @@ func (p *VirtualKubeletProvider) GetLogs(ctx context.Context, namespace, podName defer span.End() defer types.SetDurationSpan(start, span) - log.G(ctx).Infof("receive GetPodLogs %q", podName) + // For debugging purpose, when we have many API calls, we can differentiate each one. + sessionNumber := rand.Intn(100000) + sessionContext := "GetLogs#" + strconv.Itoa(sessionNumber) + sessionContextMessage := GetSessionContextMessage(sessionContext) + + log.G(ctx).Infof(sessionContextMessage+"receive GetPodLogs %q", podName) key, err := buildKeyFromNames(namespace, podName) if err != nil { @@ -781,11 +847,11 @@ func (p *VirtualKubeletProvider) GetLogs(ctx context.Context, namespace, podName Opts: types.ContainerLogOpts(opts), } - return LogRetrieval(ctx, p.config, logsRequest) + return LogRetrieval(ctx, p.config, logsRequest, p.clientHTTPTransport, sessionContext) } // GetStatsSummary returns dummy stats for all pods known by this provider. -func (p *VirtualKubeletProvider) GetStatsSummary(ctx context.Context) (*stats.Summary, error) { +func (p *Provider) GetStatsSummary(ctx context.Context) (*stats.Summary, error) { start := time.Now().Unix() tracer := otel.Tracer("interlink-service") _, span := tracer.Start(ctx, "GetStatsSummaryVK", trace.WithAttributes( @@ -829,11 +895,11 @@ func (p *VirtualKubeletProvider) GetStatsSummary(ctx context.Context) (*stats.Su for _, container := range pod.Spec.Containers { // Grab a dummy value to be used as the total CPU usage. // The value should fit a uint32 in order to avoid overflows later on when computing pod stats. - dummyUsageNanoCores := uint64(rand.Uint32()) + dummyUsageNanoCores := uint64(9999) totalUsageNanoCores += dummyUsageNanoCores // Create a dummy value to be used as the total RAM usage. // The value should fit a uint32 in order to avoid overflows later on when computing pod stats. - dummyUsageBytes := uint64(rand.Uint32()) + dummyUsageBytes := uint64(9999) totalUsageBytes += dummyUsageBytes // Append a ContainerStats object containing the dummy stats to the PodStats object. pss.Containers = append(pss.Containers, stats.ContainerStats{ @@ -868,7 +934,7 @@ func (p *VirtualKubeletProvider) GetStatsSummary(ctx context.Context) (*stats.Su // RetrievePodsFromCluster scans all pods registered to the K8S cluster and re-assigns the ones with a valid JobID to the Virtual Kubelet. // This will run at the initiation time only -func (p *VirtualKubeletProvider) RetrievePodsFromCluster(ctx context.Context) error { +func (p *Provider) RetrievePodsFromCluster(ctx context.Context) error { start := time.Now().Unix() tracer := otel.Tracer("interlink-service") ctx, span := tracer.Start(ctx, "RetrievePodsFromCluster", trace.WithAttributes( @@ -911,14 +977,10 @@ func (p *VirtualKubeletProvider) RetrievePodsFromCluster(ctx context.Context) er func CheckIfAnnotationExists(pod *v1.Pod, key string) bool { _, ok := pod.Annotations[key] - if ok { - return true - } else { - return false - } + return ok } -func (p *VirtualKubeletProvider) initClientSet(ctx context.Context) error { +func (p *Provider) initClientSet(ctx context.Context) error { start := time.Now().Unix() tracer := otel.Tracer("interlink-service") ctx, span := tracer.Start(ctx, "InitClientSet", trace.WithAttributes( diff --git a/systemd/user/.slurm-plugin.service.swp b/systemd/user/.slurm-plugin.service.swp new file mode 100644 index 00000000..d0d24e88 Binary files /dev/null and b/systemd/user/.slurm-plugin.service.swp differ diff --git a/systemd/user/interlink.service b/systemd/user/interlink.service new file mode 100644 index 00000000..777101db --- /dev/null +++ b/systemd/user/interlink.service @@ -0,0 +1,20 @@ +[Unit] +Description=This Unit is needed to automatically start the interLink API at system startup +After=network.target + +[Service] +Type=simple +Restart=always +RestartSec=3 + +ExecStart=/home/USERNAME/.interlink/bin/interlink +Environment="INTERLINKCONFIGPATH=/home/USERNAME/.interlink/config/InterLinkConfig.yaml" +Environment="SHARED_FS=true" + +Environment="ENABLE_TRACING=0" + +StandardOutput=append:/home/USERNAME/.interlink/logs/interlink.log +StandardError=append:/home/USERNAME/.interlink/logs/interlink.log + +[Install] +WantedBy=multi-user.target diff --git a/systemd/user/oauth2-proxy.cfg b/systemd/user/oauth2-proxy.cfg new file mode 100644 index 00000000..78997b3b --- /dev/null +++ b/systemd/user/oauth2-proxy.cfg @@ -0,0 +1,27 @@ +client_id = "YOUR OIDC CLIENT ID" +client_secret = "YOUR OIDC CLIENT SECRET" +http_address = "0.0.0.0:30443" +oidc_issuer_url = "https://iam.cloud.infn.it/" +pass_authorization_header = "true" +provider = "oidc" +redirect_url = "http://localhost:8081/" +oidc_extra_audiences = [ "users" ] +upstreams = [ "unix:///leonardo/home/usera07cna/a07cna01/.interlink/interlink.sock", "http://localhost:30080/"] +allowed_groups = [ "YOUR USER SUB"] +validate_url = "https://iam.cloud.infn.it/token" +oidc_groups_claim = "sub" +email_domains = [ + "*" + ] +cookie_secret= "2IS..nfCSKy4=" +skip_auth_routes = [ + "='*'" + ] +force_https = "true" +https_address = "0.0.0.0:30443" +tls_cert_file = "/home/USERNAME/.interlink/config/tls.crt" +tls_key_file = "/home/USERNAME/.interlink/config/tls.key" + +tls_cipher_suites = ["TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA","TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256","TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA","TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384","TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256","TLS_RSA_WITH_AES_128_CBC_SHA","TLS_RSA_WITH_AES_128_GCM_SHA256","TLS_RSA_WITH_AES_256_CBC_SHA","TLS_RSA_WITH_AES_256_GCM_SHA384"] +skip_jwt_bearer_tokens = "true" + diff --git a/systemd/user/oauth2-proxy.service b/systemd/user/oauth2-proxy.service new file mode 100644 index 00000000..4a2e295c --- /dev/null +++ b/systemd/user/oauth2-proxy.service @@ -0,0 +1,20 @@ +[Unit] +Description=This Unit is needed to automatically start the oauth2-proxy at system startup +After=network.target + +[Service] +Type=simple +Restart=always +RestartSec=3 + +WorkDirectory=/home/USERNAME/.interlink/config/ + +ExecStart=/home/USERNAME/.interlink/bin/oauth2-proxy --config=/home/USERNAME/.config/systemd/user/oauth2-proxy.cfg + +StandardOutput=append:/home/USERNAME/interlink/logs/oauth2-proxy.log +StandardError=append:/home/USERNAME/.interlink/logs/oauth2-proxy.log + +[Install] +WantedBy=multi-user.target + + diff --git a/systemd/user/slurm-plugin.service b/systemd/user/slurm-plugin.service new file mode 100644 index 00000000..3abce749 --- /dev/null +++ b/systemd/user/slurm-plugin.service @@ -0,0 +1,19 @@ +[Unit] +Description=This Unit is needed to automatically start the SLURM plugin at system startup +After=network.target + +[Service] +Type=simple +Restart=always +RestartSec=3 + +ExecStart=/home/USERNAME/.interlink/bin/plugin +Environment="SLURMCONFIGPATH=/home/USERNAME/.interlink/config/plugin-config.yaml" +Environment="SHARED_FS=true" + +Environment="ENABLE_TRACING=0" +StandardOutput=append:/home/USERNAME/.interlink/logs/plugin.log +StandardError=append:/home/USERNAME/.interlink/logs/plugin.log + +[Install] +WantedBy=multi-user.target