diff --git a/.database/template_asset_db.json b/.database/template_asset_db.json new file mode 100644 index 0000000000000000000000000000000000000000..65cb47a669739e4f502fd6af8292dc096ae331d1 --- /dev/null +++ b/.database/template_asset_db.json @@ -0,0 +1,47 @@ +{ + "asset_collection": { + "1": { + "_id": "local_assets", + "white_reddit_template": { + "path": "public/white_reddit_template.png", + "type": "image", + "ts": "2023-07-03 19:41:55", + "required": true + }, + "subscribe-animation": { + "path": "public/subscribe-animation.mp4", + "type": "video", + "ts": "2023-07-03 21:37:53", + "required": true + } + }, + "2": { + "_id": "remote_assets", + "Music joakim karud dreams": { + "type": "background music", + "url": "https://www.youtube.com/watch?v=p56gqDhUYbU", + "ts": "2023-07-05 04:35:03" + }, + "Music dj quads": { + "type": "background music", + "url": "https://www.youtube.com/watch?v=uUu1NcSHg2E", + "ts": "2023-07-05 05:03:44" + }, + "Car race gameplay": { + "type": "background video", + "url": "https://www.youtube.com/watch?v=gBsJA8tCeyc", + "ts": "2023-07-04 23:07:44" + }, + "Minecraft jumping circuit": { + "url": "https://www.youtube.com/watch?v=Pt5_GSKIWQM", + "type": "background video", + "ts": "2023-07-07 04:13:36" + }, + "Ski gameplay": { + "url": "https://www.youtube.com/watch?v=8ao1NAOVKTU", + "type": "background video", + "ts": "2023-07-07 04:54:16" + } + } + } +} \ No newline at end of file diff --git a/.gitattributes b/.gitattributes index a6344aac8c09253b3b630fb776ae94478aa0275b..f520e63df1f4bbdcbda5fe61b1b87f4659556a49 100644 --- a/.gitattributes +++ b/.gitattributes @@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text *.zip filter=lfs diff=lfs merge=lfs -text *.zst filter=lfs diff=lfs merge=lfs -text *tfevents* filter=lfs diff=lfs merge=lfs -text +public/subscribe-animation.mp4 filter=lfs diff=lfs merge=lfs -text diff --git a/.github/CHANGE_LOG.md b/.github/CHANGE_LOG.md new file mode 100644 index 0000000000000000000000000000000000000000..f7d290b9301a867916a0ac839cf93aa668a8510f --- /dev/null +++ b/.github/CHANGE_LOG.md @@ -0,0 +1,34 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## [Unreleased] + + + +Upcoming changes. + +### Added + +### Changed + +### Removed + +## [0.0.1] - YYYY-MM-DD + +Initial Release. + +### Added + +- What was added. + + + +[Unreleased]: / +[0.0.1]: /v0.0.1 diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000000000000000000000000000000000000..764cb4b21daad996dc7572ee4135e14965542b4e --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,6 @@ +# These owners will be the default owners for everything in +# the repo. Unless a later match takes precedence, +# @USER will be requested for +# review when someone opens a pull request. +# if you want to add more owners just write it after the demo user @DemoUser +* @RayVentura diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000000000000000000000000000000000..41dd9ebee5f0bf8835f1a46ba9c429eebe9693ef --- /dev/null +++ b/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,127 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders 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, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000000000000000000000000000000000000..c7d8cb08601d59626c957e1cd2635b650a3c22cb --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,21 @@ +🌟💻📚 + +## Contributing + +There are many exciting ways to contribute to ShortGPT, our AI automated content creation framework. 👏 + +See below for everything you can do and the processes to follow for each contribution method. Note that no matter how you contribute, your participation is governed by our ✨[Code of Conduct](CODE_OF_CONDUCT.md)✨. + +## 🛠️ Make changes to the code or docs + +- 🍴 Fork the project, +- 💡 make your changes, +- 🔀 and send a pull request! 🙌 + +Make sure you read and follow the instructions in the [pull request template](pull_request_template.md). And note that all participation in this project (including code submissions) is governed by our ✨[Code of Conduct](CODE_OF_CONDUCT.md)✨. + +## 🐞📝 Submit bug reports or feature requests + +Just use the GitHub issue tracker to submit your bug reports and feature requests. We appreciate your feedback! 🐛🔧 + +Let's make ShortGPT even better together! 🚀❤️ diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000000000000000000000000000000000000..61a5244ff8c4eb66a090b2f659dba4880e071fe3 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,13 @@ +# These are supported funding model platforms + +github: rayventura +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: rayventura +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml new file mode 100644 index 0000000000000000000000000000000000000000..e8413309f90de60ff9d5cbc3618c5128579378d7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -0,0 +1,99 @@ +name: 🐛 Bug Report +description: File a bug report +title: '🐛 [Bug]: ' +labels: ['bug'] + +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this bug report! + + - type: textarea + id: what-happened + attributes: + label: What happened? + description: Describe the issue here. + placeholder: Tell us what you see! + validations: + required: true + + - type: dropdown + id: browsers + attributes: + label: What type of browser are you seeing the problem on? + multiple: true + options: + - Firefox + - Chrome + - Safari + - Microsoft Edge + validations: + required: true + + - type: dropdown + id: operating-systems + attributes: + label: What type of Operating System are you seeing the problem on? + multiple: true + options: + - Linux + - Windows + - Mac + - Google Colab + - Other + validations: + required: true + + - type: input + id: python-version + attributes: + label: Python Version + description: What version of Python are you using? + placeholder: e.g. Python 3.9.0 + validations: + required: true + + - type: input + id: application-version + attributes: + label: Application Version + description: What version of the application are you using? + placeholder: e.g. v1.2.3 + validations: + required: true + + - type: textarea + id: expected-behavior + attributes: + label: Expected Behavior + description: What did you expect to happen? + placeholder: What did you expect? + validations: + required: true + + - type: textarea + id: error-message + attributes: + label: Error Message + description: What error message did you receive? + placeholder: + render: shell + validations: + required: false + + - type: textarea + id: logs + attributes: + label: Code to produce this issue. + description: Please copy and paste any relevant code to re-produce this issue. + render: shell + + - type: textarea + id: screenshots-assets + attributes: + label: Screenshots/Assets/Relevant links + description: If applicable, add screenshots, assets or any relevant links that can help understand the issue. + placeholder: Provide any relevant material here + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml new file mode 100644 index 0000000000000000000000000000000000000000..fe657909ba96c5d0ed20db04a5541d2be61b4519 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -0,0 +1,36 @@ +name: ✨ Feature request +description: Suggest an feature / idea for this project +title: '✨ [Feature Request / Suggestion]: ' +labels: ['feature'] +body: + - type: markdown + attributes: + value: | + We appreciate your feedback on how to improve this project. Please be sure to include as much details & any resources if possible! + + - type: textarea + id: Suggestion + attributes: + label: Suggestion / Feature Request + description: Describe the feature(s) you would like to see added. + placeholder: Tell us your suggestion + validations: + required: true + + - type: textarea + id: why-usage + attributes: + label: Why would this be useful? + description: Describe why this feature would be useful. + placeholder: Tell us why this would be useful to have this feature + validations: + required: false + + - type: textarea + id: screenshots-assets + attributes: + label: Screenshots/Assets/Relevant links + description: If applicable, add screenshots, assets or any relevant links that can help understand the issue. + placeholder: Provide any relevant material here + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/question.yaml b/.github/ISSUE_TEMPLATE/question.yaml new file mode 100644 index 0000000000000000000000000000000000000000..4a9e200746bf94c7c567118b361f21ebea3b466f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question.yaml @@ -0,0 +1,17 @@ +name: ❓ Question +description: Ask a question about this project +title: '❓ [Question]: ' +labels: ['question'] +body: + - type: markdown + attributes: + value: | + We appreciate your interest in this project. Please be sure to include as much detail & context about your question as possible! + + - type: textarea + id: Question + attributes: + label: Your Question + description: Describe your question in detail. + validations: + required: true diff --git a/.github/SECURITY.md b/.github/SECURITY.md new file mode 100644 index 0000000000000000000000000000000000000000..65963721b3c314a2d30eef9d95272c123d10f05c --- /dev/null +++ b/.github/SECURITY.md @@ -0,0 +1,28 @@ +# Security Policy + +## Supported Versions + +| Version | Supported | +| ------- | ------------------ | +| 0.0.x | :x: | + +## 🔒️ Reporting a Vulnerability + +If you have identified a security vulnerability in system or product please `RayVentura` with your findings. We strongly recommend using our `PGP key` to prevent this information from falling into the wrong hands. + +### Disclosure Policy + +Upon receipt of a security report the following steps will be taken: + +- Acknowledge your report within 48 hours, and provide a further more detailed update within 48 hours. +- Confirm the problem and determine the affected versions +- Keep you informed of the progress towards resolving the problem and notify you when the vulnerability has been fixed. +- Audit code to find any potential similar problems. +- Prepare fixes for all releases still under maintenance. These fixes will be released as fast as possible. +- Handle your report with strict confidentiality, and not pass on your personal details to third parties without your permission. + +Whilst the issue is under investigation + +- **Do** provide as much information as possible. +- **Do not** exploit of the vulnerability or problem you have discovered. +- **Do not** reveal the problem to others until it has been resolved. diff --git a/.github/config.yml b/.github/config.yml new file mode 100644 index 0000000000000000000000000000000000000000..85ffb1fa4c7dfe18eec56195c2a81547f7d7ce1a --- /dev/null +++ b/.github/config.yml @@ -0,0 +1,21 @@ +# Configuration for new-issue-welcome - https://github.com/behaviorbot/new-issue-welcome + +# Comment to be posted to on first time issues +newIssueWelcomeComment: > + Thanks for opening your first issue! Reports like these help improve the project! + +# Configuration for new-pr-welcome - https://github.com/behaviorbot/new-pr-welcome + +# Comment to be posted to on PRs from first time contributors in your repository +newPRWelcomeComment: > + Thanks for opening this pull request! + +# Configuration for first-pr-merge - https://github.com/behaviorbot/first-pr-merge + +# Comment to be posted to on pull requests merged by a first time user +firstPRMergeComment: > + Congrats on merging your first pull request! + +# The keyword to find for Todo Bot issue +todo: + keyword: '@todo' diff --git a/.github/issue_label_bot.yaml b/.github/issue_label_bot.yaml new file mode 100644 index 0000000000000000000000000000000000000000..b83d27f89823d3fed596a4df48a9e6505baa5f83 --- /dev/null +++ b/.github/issue_label_bot.yaml @@ -0,0 +1,4 @@ +label-alias: + bug: 'Type: Bug' + feature_request: 'Type: Feature' + question: 'Type: Question' diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000000000000000000000000000000000000..6215721d4d2237599677f9e1d6049982c8fb8eef --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,30 @@ +## Proposed changes + +Describe the big picture of your changes here to communicate to the maintainers why we should accept this pull request. If it fixes a bug or resolves a feature request, be sure to link to that issue. 👀🔧 + +## Types of changes + +What types of changes does your code introduce to this project? +_Put an `x` in the boxes that apply_ 😄🚀 + +- [ ] Bugfix (non-breaking change which fixes an issue) 🐛 +- [ ] New feature (non-breaking change which adds functionality) ✨ +- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) 💥 +- [ ] Documentation Update (if none of the other choices apply) 📖 + +## Checklist + +_Put an `x` in the boxes that apply. You can also fill these out after creating the PR. If you're unsure about any of them, don't hesitate to ask. We're here to help! This is simply a reminder of what we are going to look for before merging your code._ ✅ + +- [ ] I have read the CONTRIBUTING.md 📚 +- [ ] I have added tests that prove my fix is effective or that my feature works ✅✔️ +- [ ] I have added necessary documentation (if appropriate) 📝 + +## Further comments + +If this is a relatively large or complex change, kick off the discussion by explaining why you chose the solution you did and what alternatives you considered, etc... 💡❓ + + +## References and related issues (e.g. #1234) + +N/A 📌 diff --git a/.github/settings.yml b/.github/settings.yml new file mode 100644 index 0000000000000000000000000000000000000000..ee268bb0b6ad307bdc7c3dc7a9b9918845d64357 --- /dev/null +++ b/.github/settings.yml @@ -0,0 +1,190 @@ +repository: + # See https://developer.github.com/v3/repos/#edit for all available settings. + + # The name of the repository. Changing this will rename the repository + #name: repo-name + + # A short description of the repository that will show up on GitHub + #description: description of repo + + # A URL with more information about the repository + #homepage: https://example.github.io/ + + # A comma-separated list of topics to set on the repository + #topics: project, template, project-template + + # Either `true` to make the repository private, or `false` to make it public. + #private: false + + # Either `true` to enable issues for this repository, `false` to disable them. + has_issues: true + + # Either `true` to enable the wiki for this repository, `false` to disable it. + has_wiki: true + + # Either `true` to enable downloads for this repository, `false` to disable them. + #has_downloads: true + + # Updates the default branch for this repository. + default_branch: stable + + # Either `true` to allow squash-merging pull requests, or `false` to prevent + # squash-merging. + #allow_squash_merge: true + + # Either `true` to allow merging pull requests with a merge commit, or `false` + # to prevent merging pull requests with merge commits. + #allow_merge_commit: true + + # Either `true` to allow rebase-merging pull requests, or `false` to prevent + # rebase-merging. + #allow_rebase_merge: true + +# Labels: define labels for Issues and Pull Requests +labels: + - name: 'Type: Bug' + color: e80c0c + description: Something isn't working as expected. + + - name: 'Type: Enhancement' + color: 54b2ff + description: Suggest an improvement for an existing feature. + + - name: 'Type: Feature' + color: 54b2ff + description: Suggest a new feature. + + - name: 'Type: Security' + color: fbff00 + description: A problem or enhancement related to a security issue. + + - name: 'Type: Question' + color: 9309ab + description: Request for information. + + - name: 'Type: Test' + color: ce54e3 + description: A problem or enhancement related to a test. + + - name: 'Status: Awaiting Review' + color: 24d15d + description: Ready for review. + + - name: 'Status: WIP' + color: 07b340 + description: Currently being worked on. + + - name: 'Status: Waiting' + color: 38C968 + description: Waiting on something else to be ready. + + - name: 'Status: Stale' + color: 66b38a + description: Has had no activity for some time. + + - name: 'Duplicate' + color: EB862D + description: Duplicate of another issue. + + - name: 'Invalid' + color: faef50 + description: This issue doesn't seem right. + + - name: 'Priority: High +' + color: ff008c + description: Task is considered higher-priority. + + - name: 'Priority: Low -' + color: 690a34 + description: Task is considered lower-priority. + + - name: 'Documentation' + color: 2fbceb + description: An issue/change with the documentation. + + - name: "Won't fix" + color: C8D9E6 + description: Reported issue is working as intended. + + - name: '3rd party issue' + color: e88707 + description: This issue might be caused by a 3rd party script/package/other reasons + + - name: 'Os: Windows' + color: AEB1C2 + description: Is Windows-specific + + - name: 'Os: Mac' + color: AEB1C2 + description: Is Mac-specific + + - name: 'Os: Linux' + color: AEB1C2 + description: Is Linux-specific + + - name: 'Os: Google Colab' + color: AEB1C2 + description: Is Google Colab-specific +# +# +# # Collaborators: give specific users access to this repository. +# # See https://developer.github.com/v3/repos/collaborators/#add-user-as-a-collaborator for available options +# collaborators: +# # - username: bkeepers +# # permission: push +# # - username: hubot +# # permission: pull + +# # Note: `permission` is only valid on organization-owned repositories. +# # The permission to grant the collaborator. Can be one of: +# # * `pull` - can pull, but not push to or administer this repository. +# # * `push` - can pull and push, but not administer this repository. +# # * `admin` - can pull, push and administer this repository. +# # * `maintain` - Recommended for project managers who need to manage the repository without access to sensitive or destructive actions. +# # * `triage` - Recommended for contributors who need to proactively manage issues and pull requests without write access. + +# # See https://developer.github.com/v3/teams/#add-or-update-team-repository for available options +# teams: +# - name: core +# # The permission to grant the team. Can be one of: +# # * `pull` - can pull, but not push to or administer this repository. +# # * `push` - can pull and push, but not administer this repository. +# # * `admin` - can pull, push and administer this repository. +# # * `maintain` - Recommended for project managers who need to manage the repository without access to sensitive or destructive actions. +# # * `triage` - Recommended for contributors who need to proactively manage issues and pull requests without write access. +# permission: admin +# - name: docs +# permission: push + +# branches: +# - name: master +# # https://developer.github.com/v3/repos/branches/#update-branch-protection +# # Branch Protection settings. Set to null to disable +# protection: +# # Required. Require at least one approving review on a pull request, before merging. Set to null to disable. +# required_pull_request_reviews: +# # The number of approvals required. (1-6) +# required_approving_review_count: 1 +# # Dismiss approved reviews automatically when a new commit is pushed. +# dismiss_stale_reviews: true +# # Blocks merge until code owners have reviewed. +# require_code_owner_reviews: true +# # Specify which users and teams can dismiss pull request reviews. Pass an empty dismissal_restrictions object to disable. User and team dismissal_restrictions are only available for organization-owned repositories. Omit this parameter for personal repositories. +# dismissal_restrictions: +# users: [] +# teams: [] +# # Required. Require status checks to pass before merging. Set to null to disable +# required_status_checks: +# # Required. Require branches to be up to date before merging. +# strict: true +# # Required. The list of status checks to require in order to merge into this branch +# contexts: [] +# # Required. Enforce all configured restrictions for administrators. Set to true to enforce required status checks for repository administrators. Set to null to disable. +# enforce_admins: true +# # Prevent merge commits from being pushed to matching branches +# required_linear_history: true +# # Required. Restrict who can push to this branch. Team and user restrictions are only available for organization-owned repositories. Set to null to disable. +# restrictions: +# apps: [] +# users: [] +# teams: [] diff --git a/.github/workflows/generate_release-changelog.yaml b/.github/workflows/generate_release-changelog.yaml new file mode 100644 index 0000000000000000000000000000000000000000..a2018aae85a037c44f156068578d74207bc4d7be --- /dev/null +++ b/.github/workflows/generate_release-changelog.yaml @@ -0,0 +1,33 @@ +name: Create Release + +on: + push: + tags: + - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10 + +jobs: + build: + name: Create Release + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + with: + fetch-depth: 0 + - name: Changelog + uses: Bullrich/generate-release-changelog@master + id: Changelog + env: + REPO: ${{ github.repository }} + - name: Create Release + id: create_release + uses: actions/create-release@latest + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token + with: + tag_name: ${{ github.ref }} + release_name: Release ${{ github.ref }} + body: | + ${{ steps.Changelog.outputs.changelog }} + draft: false + prerelease: false diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..46403db9babb92a2642b778ededd772b91f2f9ed --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +!*.py +!*.json +!*.yaml +!*.template +*.pyc +**/__pycache__/ +test.py +public/* +!public/white_reddit_template.png +!public/subscribe-animation.mp4 +z_doc/* +z_other/* +videos/* +.logs/ +.editing_assets/* +.database/api_db.json +.database/content_db.json +.database/asset_db.json +flagged/ +.vscode +.env +ShortGPT.egg-info +dist +build +setup +test.ipynb +.venv/ +MANIFEST.in +client_secrets.json \ No newline at end of file diff --git a/AutoCropper_26June(WIP).ipynb b/AutoCropper_26June(WIP).ipynb new file mode 100644 index 0000000000000000000000000000000000000000..9087b8b08c9d2f6a5ad0c44741807f8b54c1b248 --- /dev/null +++ b/AutoCropper_26June(WIP).ipynb @@ -0,0 +1,419 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "Oit_w-ZVO35L" + }, + "source": [ + "Cell 1: Installing necessary libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cgTCbepnOxJA", + "outputId": "942e9543-772c-47ec-95b3-f617d3f8586d" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", + "Collecting pytube\n", + " Downloading pytube-15.0.0-py3-none-any.whl (57 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m57.6/57.6 kB\u001b[0m \u001b[31m2.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hInstalling collected packages: pytube\n", + "Successfully installed pytube-15.0.0\n", + "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", + "Requirement already satisfied: opencv-python in /usr/local/lib/python3.10/dist-packages (4.7.0.72)\n", + "Requirement already satisfied: numpy>=1.21.2 in /usr/local/lib/python3.10/dist-packages (from opencv-python) (1.22.4)\n", + "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", + "Collecting openai\n", + " Downloading openai-0.27.8-py3-none-any.whl (73 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m73.6/73.6 kB\u001b[0m \u001b[31m2.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: requests>=2.20 in /usr/local/lib/python3.10/dist-packages (from openai) (2.27.1)\n", + "Requirement already satisfied: tqdm in /usr/local/lib/python3.10/dist-packages (from openai) (4.65.0)\n", + "Collecting aiohttp (from openai)\n", + " Downloading aiohttp-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.0 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.0/1.0 MB\u001b[0m \u001b[31m19.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.20->openai) (1.26.16)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.20->openai) (2023.5.7)\n", + "Requirement already satisfied: charset-normalizer~=2.0.0 in /usr/local/lib/python3.10/dist-packages (from requests>=2.20->openai) (2.0.12)\n", + "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.20->openai) (3.4)\n", + "Requirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->openai) (23.1.0)\n", + "Collecting multidict<7.0,>=4.5 (from aiohttp->openai)\n", + " Downloading multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (114 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m114.5/114.5 kB\u001b[0m \u001b[31m12.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting async-timeout<5.0,>=4.0.0a3 (from aiohttp->openai)\n", + " Downloading async_timeout-4.0.2-py3-none-any.whl (5.8 kB)\n", + "Collecting yarl<2.0,>=1.0 (from aiohttp->openai)\n", + " Downloading yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (268 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m268.8/268.8 kB\u001b[0m \u001b[31m28.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting frozenlist>=1.1.1 (from aiohttp->openai)\n", + " Downloading frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (149 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m149.6/149.6 kB\u001b[0m \u001b[31m17.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting aiosignal>=1.1.2 (from aiohttp->openai)\n", + " Downloading aiosignal-1.3.1-py3-none-any.whl (7.6 kB)\n", + "Installing collected packages: multidict, frozenlist, async-timeout, yarl, aiosignal, aiohttp, openai\n", + "Successfully installed aiohttp-3.8.4 aiosignal-1.3.1 async-timeout-4.0.2 frozenlist-1.3.3 multidict-6.0.4 openai-0.27.8 yarl-1.9.2\n", + "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", + "Collecting youtube-transcript-api\n", + " Downloading youtube_transcript_api-0.6.1-py3-none-any.whl (24 kB)\n", + "Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from youtube-transcript-api) (2.27.1)\n", + "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->youtube-transcript-api) (1.26.16)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->youtube-transcript-api) (2023.5.7)\n", + "Requirement already satisfied: charset-normalizer~=2.0.0 in /usr/local/lib/python3.10/dist-packages (from requests->youtube-transcript-api) (2.0.12)\n", + "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->youtube-transcript-api) (3.4)\n", + "Installing collected packages: youtube-transcript-api\n", + "Successfully installed youtube-transcript-api-0.6.1\n", + "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", + "Collecting textwrap3\n", + " Downloading textwrap3-0.9.2-py2.py3-none-any.whl (12 kB)\n", + "Installing collected packages: textwrap3\n", + "Successfully installed textwrap3-0.9.2\n", + "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", + "Collecting yt-dlp\n", + " Downloading yt_dlp-2023.6.22-py2.py3-none-any.whl (3.0 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.0/3.0 MB\u001b[0m \u001b[31m29.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting mutagen (from yt-dlp)\n", + " Downloading mutagen-1.46.0-py3-none-any.whl (193 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m193.6/193.6 kB\u001b[0m \u001b[31m20.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting pycryptodomex (from yt-dlp)\n", + " Downloading pycryptodomex-3.18.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.1/2.1 MB\u001b[0m \u001b[31m80.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting websockets (from yt-dlp)\n", + " Downloading websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (129 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m129.9/129.9 kB\u001b[0m \u001b[31m13.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: certifi in /usr/local/lib/python3.10/dist-packages (from yt-dlp) (2023.5.7)\n", + "Collecting brotli (from yt-dlp)\n", + " Downloading Brotli-1.0.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (2.7 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.7/2.7 MB\u001b[0m \u001b[31m95.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hInstalling collected packages: brotli, websockets, pycryptodomex, mutagen, yt-dlp\n", + "Successfully installed brotli-1.0.9 mutagen-1.46.0 pycryptodomex-3.18.0 websockets-11.0.3 yt-dlp-2023.6.22\n" + ] + } + ], + "source": [ + "!pip install pytube\n", + "!pip install opencv-python\n", + "!pip install openai\n", + "!pip install youtube-transcript-api\n", + "!pip install textwrap3\n", + "!pip install yt-dlp\n", + "\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "pzFaVOhAO9Cs" + }, + "source": [ + "Cell 2: Importing libraries and setting OpenAI API key" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "PySgsY-wO_x9" + }, + "outputs": [], + "source": [ + "from pytube import YouTube\n", + "import cv2\n", + "import subprocess\n", + "import openai\n", + "import numpy as np\n", + "import json\n", + "import math\n", + "import pdb\n", + "\n", + "from youtube_transcript_api import YouTubeTranscriptApi\n", + "openai.api_key = '' # Replace with your actual OpenAI API key\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "q20yzUsoPXwX" + }, + "source": [ + "Cell 3: Download YouTube Video function" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "G_fMcvDrGCEU" + }, + "outputs": [], + "source": [ + "import yt_dlp\n", + "\n", + "def download_video1(url, filename, quality):\n", + " if quality == \"low\":\n", + " format = 'worstvideo+worstaudio/worst'\n", + " elif quality == \"medium\":\n", + " format = 'bestvideo[height<=480]+bestaudio/best[height<=480]'\n", + " elif quality == \"high\":\n", + " format = 'bestvideo+bestaudio/best'\n", + " else:\n", + " print(\"Quality parameter must be either 'low', 'medium', or 'high'.\")\n", + " return\n", + "\n", + " ydl_opts = {\n", + " 'outtmpl': filename,\n", + " 'format': format,\n", + " }\n", + "\n", + " with yt_dlp.YoutubeDL(ydl_opts) as ydl:\n", + " ydl.download([url])\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "akScMbhO6wuh" + }, + "outputs": [], + "source": [ + "def segment_video(response):\n", + " for i, segment in enumerate(response):\n", + " start_time = math.floor(float(segment.get(\"start_time\", 0)))\n", + " end_time = math.ceil(float(segment.get(\"end_time\", 0))) + 2\n", + " output_file = f\"output{str(i).zfill(3)}.mp4\"\n", + " command = f\"ffmpeg -i input_video.mp4 -ss {start_time} -to {end_time} -c copy {output_file}\"\n", + " print(f\"Processing segment {i}: {command}\")\n", + " subprocess.call(command, shell=True)\n", + " print(\"Segmentation complete.\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "EtitRsVQLTfn" + }, + "outputs": [], + "source": [ + "import logging\n", + "import openai\n", + "\n", + "# Set up logging\n", + "logging.basicConfig(level=logging.INFO)\n", + "\n", + "def analyze_transcript(transcripts, chunk_size=5000, overlap=50):\n", + " response_obj = '''[\n", + " {\n", + " \"start_time\": 97.19,\n", + " \"end_time\": 127.43,\n", + " \"description\": \"Summary of the section\",\n", + " \"duration\":36 #Length in seconds\n", + " },\n", + " {\n", + " \"start_time\": 169.58,\n", + " \"end_time\": 199.10,\n", + " \"description\": \"Summary of the section\",\n", + " \"duration\":33\n", + " }\n", + " ]'''\n", + "\n", + " # Combine all the texts in the transcripts into one big string\n", + " all_text = ' '.join([segment['text'] for segment in transcripts])\n", + "\n", + " # Split the text into words and make chunks of words\n", + " words = all_text.split(' ')\n", + " chunks = []\n", + " index = 0\n", + "\n", + " while index < len(words):\n", + " start = max(0, index - overlap)\n", + " chunk = \" \".join(words[start: index + chunk_size])\n", + " chunks.append(chunk)\n", + " index += chunk_size\n", + "\n", + " logging.info(f'Transcript has been chunked into {len(chunks)} chunks')\n", + "\n", + " # Process each chunk separately and collect responses\n", + " responses = []\n", + " for index, chunk in enumerate(chunks, start=1):\n", + " logging.info(f'Processing chunk {index}/{len(chunks)}')\n", + " prompt = f\"This is a transcript of a video/podcast. Please identify the most viral sections from this part of the video, make sure they are more than 30 seconds in duration,Make Sure you provide extremely accurate timestamps respond only in this format {response_obj}, I just want JSON as Response(nothing else) \\n Here is the Transcription:\\n{chunk}\"\n", + " messages = [\n", + " {\"role\": \"system\", \"content\": \"You are a ViralGPT helpful assistant. You are master at reading youtube transcripts and identifying the most Interesting parts and Viral Content from the Podcasts\"},\n", + " {\"role\": \"user\", \"content\": prompt}\n", + " ]\n", + " logging.info(f'Sending chunk {index}/{len(chunks)} to the model')\n", + " response = openai.ChatCompletion.create(\n", + " model=\"gpt-3.5-turbo-16k\",\n", + " messages=messages,\n", + " n=1,\n", + " stop=None\n", + " )\n", + " logging.info(f'Received response for chunk {index}/{len(chunks)}')\n", + " responses.append(response.choices[0]['message']['content'])\n", + " logging.info(f'Added response for chunk {index} to responses')\n", + "\n", + " # Combine all responses into a single response\n", + " combined_response = ' '.join(responses)\n", + " logging.info('Completed processing all chunks')\n", + "\n", + " return combined_response\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "cG1Y4HmmPwur" + }, + "source": [ + "Main function and execution" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "u3oqbILYW5W5" + }, + "outputs": [], + "source": [ + "interseting_seg='''[{'text': 'happiness through Curiosity on Dr', 'start': 0.0, 'duration': 4.82}, {'text': 'eclipse', 'start': 2.28, 'duration': 2.54}, {'text': 'little rookie question for you okay and', 'start': 6.899, 'duration': 4.021}, {'text': \"I'm asking this on behalf of mainstream\", 'start': 9.24, 'duration': 3.6}, {'text': 'media how do you feel when you see', 'start': 10.92, 'duration': 5.4}, {'text': 'movies like pathan or tiger or any', 'start': 12.84, 'duration': 5.939}, {'text': \"Indian I think we haven't got the art of\", 'start': 16.32, 'duration': 4.5}, {'text': 'doing those movies you think they can be', 'start': 18.779, 'duration': 4.321}, {'text': 'done better oh yes I mean they can be', 'start': 20.82, 'duration': 3.42}, {'text': 'realistic', 'start': 23.1, 'duration': 3.12}, {'text': \"okay we're not realistic what you see\", 'start': 24.24, 'duration': 4.32}, {'text': 'what is not realistic about them huh', 'start': 26.22, 'duration': 4.219}, {'text': \"it's not realistic\", 'start': 28.56, 'duration': 4.38}, {'text': \"you're trying to make a James Bond movie\", 'start': 30.439, 'duration': 5.741}, {'text': 'which is also not realistic okay', 'start': 32.94, 'duration': 5.88}, {'text': 'then you have this story of the isi girl', 'start': 36.18, 'duration': 4.74}, {'text': 'in the raw man', 'start': 38.82, 'duration': 4.86}, {'text': 'living happily ever after I mean', 'start': 40.92, 'duration': 4.639}, {'text': 'take a break', 'start': 43.68, 'duration': 7.08}, {'text': 'has that ever happened not really right', 'start': 45.559, 'duration': 7.48}, {'text': 'no the whole atmospherics of the whole', 'start': 50.76, 'duration': 3.54}, {'text': 'thing you know', 'start': 53.039, 'duration': 3.36}, {'text': \"I haven't seen batana and I won't see it\", 'start': 54.3, 'duration': 5.099}, {'text': \"because I don't think it is an accurate\", 'start': 56.399, 'duration': 4.98}, {'text': \"depiction it's not an accurate I'm not\", 'start': 59.399, 'duration': 4.941}, {'text': 'going to waste my time', 'start': 61.379, 'duration': 2.961}, {'text': 'and I laughed and I enjoyed that because', 'start': 65.18, 'duration': 6.28}, {'text': 'it was so quaint', 'start': 68.04, 'duration': 5.7}, {'text': 'not because it was defeating anything', 'start': 71.46, 'duration': 3.659}, {'text': 'yeah', 'start': 73.74, 'duration': 5.4}, {'text': 'like you had that other movie of um', 'start': 75.119, 'duration': 7.5}, {'text': 'war that they can no this was this', 'start': 79.14, 'duration': 5.82}, {'text': 'fellow Salman Khan going under a tunnel', 'start': 82.619, 'duration': 5.281}, {'text': 'into Pakistan to deliver a girl who had', 'start': 84.96, 'duration': 4.88}, {'text': 'got legendary', 'start': 87.9, 'duration': 4.14}, {'text': 'but whatever', 'start': 89.84, 'duration': 4.86}, {'text': 'I mean', 'start': 92.04, 'duration': 2.66}, {'text': 'could I exaggerated okay this is not you', 'start': 95.46, 'duration': 5.4}, {'text': 'have to have entertainment which is fun', 'start': 99.0, 'duration': 4.079}, {'text': 'and realistic you should see that movie', 'start': 100.86, 'duration': 3.36}, {'text': 'The', 'start': 103.079, 'duration': 4.86}, {'text': 'Bridge of spies hey that is a real movie', 'start': 104.22, 'duration': 6.78}, {'text': 'okay that is how real spy movies are', 'start': 107.939, 'duration': 5.521}, {'text': 'made what does a real spy movie', 'start': 111.0, 'duration': 5.46}, {'text': 'constitute it means dealing with actual', 'start': 113.46, 'duration': 5.64}, {'text': 'facts no no blonde round no nothing', 'start': 116.46, 'duration': 4.74}, {'text': \"around it's okay living a lonely life\", 'start': 119.1, 'duration': 4.799}, {'text': \"you're living on by yourself living your\", 'start': 121.2, 'duration': 6.0}, {'text': 'cover story he able uh', 'start': 123.899, 'duration': 5.821}, {'text': 'with goldfish was actually a notice so', 'start': 127.2, 'duration': 3.839}, {'text': 'he was doing paintings he used to make', 'start': 129.72, 'duration': 3.78}, {'text': 'him make money out of it and but he was', 'start': 131.039, 'duration': 5.161}, {'text': 'doing this other job also so running is', 'start': 133.5, 'duration': 5.099}, {'text': 'espionage ring', 'start': 136.2, 'duration': 4.92}, {'text': 'and they show all that how a documents', 'start': 138.599, 'duration': 5.22}, {'text': 'are exchanged or document information is', 'start': 141.12, 'duration': 4.86}, {'text': 'exchanged you have things called letter', 'start': 143.819, 'duration': 5.941}, {'text': 'dead letter boxes a dead letter box in', 'start': 145.98, 'duration': 7.2}, {'text': 'in Espionage is a place it could be a', 'start': 149.76, 'duration': 6.42}, {'text': \"book let's say or or that statue I put\", 'start': 153.18, 'duration': 6.48}, {'text': 'my UBS under it', 'start': 156.18, 'duration': 5.279}, {'text': 'and leave it', 'start': 159.66, 'duration': 5.46}, {'text': 'and leave a sign outside on some tree or', 'start': 161.459, 'duration': 4.801}, {'text': 'a wall', 'start': 165.12, 'duration': 5.759}, {'text': \"that I've I've fed the the dead litter\", 'start': 166.26, 'duration': 6.42}, {'text': 'box okay so the other chap comes and', 'start': 170.879, 'duration': 3.661}, {'text': 'picks it up and takes it away the two', 'start': 172.68, 'duration': 4.26}, {'text': 'never meet based on the true nature of', 'start': 174.54, 'duration': 3.72}, {'text': 'espionage', 'start': 176.94, 'duration': 4.2}, {'text': \"which Indian actor's style would be best\", 'start': 178.26, 'duration': 7.259}, {'text': 'suited to portray the character of a spy', 'start': 181.14, 'duration': 6.84}, {'text': 'you know I I saw um', 'start': 185.519, 'duration': 4.921}, {'text': 'three three three actors were three or', 'start': 187.98, 'duration': 4.679}, {'text': 'four actors were very good this kind of', 'start': 190.44, 'duration': 3.299}, {'text': 'a thing', 'start': 192.659, 'duration': 3.901}, {'text': 'who could fit into these kind Sorrows', 'start': 193.739, 'duration': 6.481}, {'text': 'not giving any order of preference but', 'start': 196.56, 'duration': 7.02}, {'text': 'I like nawazuddin Siddiqui I used to', 'start': 200.22, 'duration': 5.599}, {'text': 'like Imran Khan', 'start': 203.58, 'duration': 4.439}, {'text': 'Irfan Khan sorry', 'start': 205.819, 'duration': 6.28}, {'text': 'and he was he was a consummate actor', 'start': 208.019, 'duration': 8.821}, {'text': 'Anup anupam care and', 'start': 212.099, 'duration': 8.241}, {'text': 'these two actors', 'start': 216.84, 'duration': 3.5}, {'text': 'the one who played family man um', 'start': 220.62, 'duration': 6.96}, {'text': 'very good okay they could fit into the', 'start': 224.84, 'duration': 8.02}, {'text': 'room and Mishra pankaj Mishra foreign', 'start': 227.58, 'duration': 5.28}, {'text': '[Music]', 'start': 233.72, 'duration': 3.11}, {'text': \"spy all right it's a cold war story\", 'start': 259.699, 'duration': 6.461}, {'text': \"about the the it's actually based on\", 'start': 263.52, 'duration': 5.179}, {'text': 'this Cambridge 5.', 'start': 266.16, 'duration': 5.9}, {'text': 'you know the Cambridge five those', 'start': 268.699, 'duration': 6.341}, {'text': 'Kim philby and others who were spying', 'start': 272.06, 'duration': 6.1}, {'text': 'for who were actually with the MI6 but', 'start': 275.04, 'duration': 6.0}, {'text': 'it was actually a KGB agent okay the', 'start': 278.16, 'duration': 5.58}, {'text': 'real mole and he would have been Chief', 'start': 281.04, 'duration': 4.08}, {'text': 'maybe one day', 'start': 283.74, 'duration': 4.08}, {'text': 'at the not been caught out', 'start': 285.12, 'duration': 7.579}, {'text': 'so on that is made a novel Tinker spy', 'start': 287.82, 'duration': 7.26}, {'text': \"it's beautifully done the book is\", 'start': 292.699, 'duration': 6.241}, {'text': 'marvelous and the acting and the', 'start': 295.08, 'duration': 3.86}, {'text': 'you should watch it okay and watch this', 'start': 302.78, 'duration': 6.04}, {'text': 'uh Bridge of spies if you enjoyed this', 'start': 305.88, 'duration': 5.9}, {'text': 'video subscribe TRS clips for more', 'start': 308.82, 'duration': 15.86}, {'text': '[Music]', 'start': 311.78, 'duration': 15.33}, {'text': 'thank you', 'start': 324.68, 'duration': 8.55}, {'text': '[Music]', 'start': 327.11, 'duration': 6.12}]''';" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "LXd8VfPfLboa" + }, + "outputs": [], + "source": [ + "def main():\n", + " video_id='wv8vgbi5ToM'\n", + " url = 'https://www.youtube.com/watch?v='+video_id # Replace with your video's URL\n", + " filename = 'input_video'\n", + " download_video1(url,filename,\"medium\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 867 + }, + "id": "KTlwjXo1PyLX", + "outputId": "3cd70ec3-c393-49b2-fc38-90902c49b133" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[{'text': 'the intro thing was generated with uh', 'start': 5.839, 'duration': 5.081}, {'text': 'mid-journey and then we some editor', 'start': 9.0, 'duration': 4.92}, {'text': 'animated it uh the music is from nuclear', 'start': 10.92, 'duration': 4.04}, {'text': 'yeah', 'start': 13.92, 'duration': 2.88}, {'text': \"and by the way I'll tell you the very\", 'start': 14.96, 'duration': 3.0}, {'text': 'interesting story of how this happened', 'start': 16.8, 'duration': 3.54}, {'text': 'was sitting next to me and I was like we', 'start': 17.96, 'duration': 3.819}, {'text': 'need some intro music and then was just', 'start': 20.34, 'duration': 3.859}, {'text': 'like let me uh', 'start': 21.779, 'duration': 5.101}, {'text': \"nuclear and he's like nuclear do you\", 'start': 24.199, 'duration': 3.701}, {'text': \"have anything that you're not using\", 'start': 26.88, 'duration': 2.639}, {'text': 'right now can I can I just use it and', 'start': 27.9, 'duration': 3.6}, {'text': \"nuclear sends them a Google Drive it's\", 'start': 29.519, 'duration': 3.481}, {'text': 'just like this is all my these are all', 'start': 31.5, 'duration': 3.059}, {'text': \"the tracks where I I've never touched\", 'start': 33.0, 'duration': 3.059}, {'text': 'them in the last six months take', 'start': 34.559, 'duration': 4.221}, {'text': 'anything you want', 'start': 36.059, 'duration': 2.721}, {'text': \"that's it like yeah it's super cool yeah\", 'start': 38.96, 'duration': 5.23}, {'text': 'is my Google llm', 'start': 42.36, 'duration': 3.379}, {'text': '[Music]', 'start': 44.19, 'duration': 4.07}, {'text': 'Music llm', 'start': 45.739, 'duration': 8.92}, {'text': '[Music]', 'start': 48.26, 'duration': 6.399}, {'text': 'all right so Apple launched Apple Vision', 'start': 55.039, 'duration': 3.641}, {'text': 'Pro I know you have a lot to say about', 'start': 57.42, 'duration': 3.959}, {'text': \"this I'll let you go first actually I\", 'start': 58.68, 'duration': 4.32}, {'text': \"don't know what you think about this uh\", 'start': 61.379, 'duration': 3.301}, {'text': \"I think it's very cool in fact I was\", 'start': 63.0, 'duration': 3.42}, {'text': 'watching Lex Friedman with Zuck', 'start': 64.68, 'duration': 4.2}, {'text': 'yesterday did you watch that um', 'start': 66.42, 'duration': 4.98}, {'text': 'I thought he had a good response like my', 'start': 68.88, 'duration': 5.7}, {'text': 'first impression was dude How can Apple', 'start': 71.4, 'duration': 6.6}, {'text': 'make something without controllers which', 'start': 74.58, 'duration': 5.76}, {'text': 'seems way cooler and even Marcus', 'start': 78.0, 'duration': 4.799}, {'text': 'Brownlee tested it in like it feels so', 'start': 80.34, 'duration': 4.38}, {'text': 'intuitive to just move your fingers and', 'start': 82.799, 'duration': 4.081}, {'text': 'to select icons and on the Lexus', 'start': 84.72, 'duration': 5.28}, {'text': 'treatment podcast Zuck said that in a in', 'start': 86.88, 'duration': 4.68}, {'text': \"the new Quest the next one that they'll\", 'start': 90.0, 'duration': 3.78}, {'text': 'do you can do hands-free you can already', 'start': 91.56, 'duration': 4.08}, {'text': 'do it on the quest too yeah you can', 'start': 93.78, 'duration': 3.6}, {'text': 'already do it on the quest too and he', 'start': 95.64, 'duration': 3.299}, {'text': 'said that the controllers are a', 'start': 97.38, 'duration': 3.66}, {'text': 'deliberate thing because he wanted to', 'start': 98.939, 'duration': 3.36}, {'text': 'make something that is Affordable by', 'start': 101.04, 'duration': 3.96}, {'text': 'more people and specifically for gaming', 'start': 102.299, 'duration': 5.421}, {'text': 'whereas Apple went for an entertainment', 'start': 105.0, 'duration': 4.799}, {'text': 'type of thing which is classic apple', 'start': 107.72, 'duration': 4.359}, {'text': 'right like they the whole thing is like', 'start': 109.799, 'duration': 3.96}, {'text': \"for rich people it's for rich people\", 'start': 112.079, 'duration': 3.781}, {'text': \"it's cool it's design it's it's like\", 'start': 113.759, 'duration': 3.661}, {'text': \"it's it's almost like at this point it's\", 'start': 115.86, 'duration': 3.299}, {'text': 'just a signaling thing if you can afford', 'start': 117.42, 'duration': 3.839}, {'text': 'Vision Pro which means you have a', 'start': 119.159, 'duration': 5.161}, {'text': 'certain class and a certain taste', 'start': 121.259, 'duration': 6.241}, {'text': \"um I've tried the quest Pro I would buy\", 'start': 124.32, 'duration': 6.24}, {'text': 'Vision Pro because I can afford it', 'start': 127.5, 'duration': 4.52}, {'text': 'um', 'start': 130.56, 'duration': 3.66}, {'text': 'shut the up you can also afford it', 'start': 132.02, 'duration': 4.359}, {'text': 'why you make it seem like', 'start': 134.22, 'duration': 5.06}, {'text': \"uh yeah I think it's cool it's 100\", 'start': 136.379, 'duration': 5.401}, {'text': \"classic apple just hyped me up I'm gonna\", 'start': 139.28, 'duration': 5.86}, {'text': 'buy it yeah but about the world of AR I', 'start': 141.78, 'duration': 4.98}, {'text': \"don't know I think you can still do a\", 'start': 145.14, 'duration': 4.02}, {'text': 'lot of cool on the quest and people', 'start': 146.76, 'duration': 4.08}, {'text': 'have already done people have built', 'start': 149.16, 'duration': 4.14}, {'text': 'games Quest is like a gaming thing right', 'start': 150.84, 'duration': 3.84}, {'text': \"yeah that's already happened I wonder\", 'start': 153.3, 'duration': 3.84}, {'text': 'what new thing people will do on on', 'start': 154.68, 'duration': 4.559}, {'text': 'Vision Pro which I think is your domain', 'start': 157.14, 'duration': 3.48}, {'text': \"you'd know more about so you haven't\", 'start': 159.239, 'duration': 4.14}, {'text': \"tried the Vision Pro so I'll reserve my\", 'start': 160.62, 'duration': 4.8}, {'text': 'actual judgment for when you know it', 'start': 163.379, 'duration': 4.321}, {'text': \"comes out I'm more impressed by the\", 'start': 165.42, 'duration': 5.039}, {'text': 'quest 3. right even the Quest 2 has now', 'start': 167.7, 'duration': 4.86}, {'text': \"has pass-through mode where it's all\", 'start': 170.459, 'duration': 4.021}, {'text': 'black and white but you can build AR', 'start': 172.56, 'duration': 4.319}, {'text': \"apps and I'm sure the quest 3 will also\", 'start': 174.48, 'duration': 4.619}, {'text': \"allow you to build AR apps right so I'm\", 'start': 176.879, 'duration': 3.72}, {'text': 'talking this is an engineer slash', 'start': 179.099, 'duration': 3.481}, {'text': 'Builder I would love to build games for', 'start': 180.599, 'duration': 4.381}, {'text': 'AR headsets right I think they are see', 'start': 182.58, 'duration': 4.56}, {'text': \"I'll tell you the problem we are okay I\", 'start': 184.98, 'duration': 3.119}, {'text': \"don't know if these numbers are correct\", 'start': 187.14, 'duration': 2.76}, {'text': 'but apparently and Mark Zuckerberg once', 'start': 188.099, 'duration': 2.881}, {'text': 'said this on some podcast that', 'start': 189.9, 'duration': 2.46}, {'text': \"apparently they've sold as many units as\", 'start': 190.98, 'duration': 3.3}, {'text': 'the PlayStation last year correct right', 'start': 192.36, 'duration': 4.92}, {'text': 'the problem is retention people use it', 'start': 194.28, 'duration': 4.86}, {'text': 'three times and then it accumulates dust', 'start': 197.28, 'duration': 4.56}, {'text': 'on a on a shelf right so the big problem', 'start': 199.14, 'duration': 3.84}, {'text': 'with ar', 'start': 201.84, 'duration': 4.38}, {'text': 'or VR rather is retention the question', 'start': 202.98, 'duration': 5.52}, {'text': \"we're all asking is is there a device\", 'start': 206.22, 'duration': 3.659}, {'text': 'that will make you wear it every day', 'start': 208.5, 'duration': 4.319}, {'text': \"right and Mark Zuckerberg's game and I\", 'start': 209.879, 'duration': 4.381}, {'text': 'put out a thread about this I think a', 'start': 212.819, 'duration': 3.121}, {'text': 'year or two years ago was', 'start': 214.26, 'duration': 4.979}, {'text': \"let's make this possible\", 'start': 215.94, 'duration': 4.5}, {'text': 'for work', 'start': 219.239, 'duration': 2.821}, {'text': 'right I think work is the use case where', 'start': 220.44, 'duration': 3.0}, {'text': 'you lose it every day right gaming', 'start': 222.06, 'duration': 3.3}, {'text': \"there's no Killer games yet correct\", 'start': 223.44, 'duration': 3.48}, {'text': \"right there's no game which I would you\", 'start': 225.36, 'duration': 2.879}, {'text': 'know be eager to put on the Quest for', 'start': 226.92, 'duration': 2.7}, {'text': 'one game which I was very eager to put', 'start': 228.239, 'duration': 3.181}, {'text': 'on the Quest for was a game called', 'start': 229.62, 'duration': 3.96}, {'text': \"um it's called lone Echo right I don't\", 'start': 231.42, 'duration': 4.56}, {'text': 'know what the name is I think lone echo', 'start': 233.58, 'duration': 3.78}, {'text': \"or something else like it's a\", 'start': 235.98, 'duration': 2.399}, {'text': \"multiplayer game I don't remember the\", 'start': 237.36, 'duration': 2.459}, {'text': 'name of the game but you have a disc', 'start': 238.379, 'duration': 3.72}, {'text': \"you're in 0g zero gravity and you're\", 'start': 239.819, 'duration': 3.301}, {'text': \"passing the disc along and it's a\", 'start': 242.099, 'duration': 3.481}, {'text': 'competitive game I love the game and me', 'start': 243.12, 'duration': 3.6}, {'text': 'and my friend used to play it all the', 'start': 245.58, 'duration': 3.18}, {'text': 'time right but then we stopped playing', 'start': 246.72, 'duration': 4.379}, {'text': \"after like two three months like I'm\", 'start': 248.76, 'duration': 3.78}, {'text': \"wondering if it's harder to build\", 'start': 251.099, 'duration': 4.801}, {'text': 'retention with games uh social probably', 'start': 252.54, 'duration': 6.06}, {'text': 'has a higher chance of retaining a user', 'start': 255.9, 'duration': 4.739}, {'text': 'or entertainment probably has a higher', 'start': 258.6, 'duration': 3.66}, {'text': 'chance of retaining your user like from', 'start': 260.639, 'duration': 2.941}, {'text': 'my learnings game should have the', 'start': 262.26, 'duration': 2.46}, {'text': 'highest retention', 'start': 263.58, 'duration': 3.72}, {'text': 'right even on mobile apps the games have', 'start': 264.72, 'duration': 4.14}, {'text': 'the best attention they might not make', 'start': 267.3, 'duration': 2.399}, {'text': \"money but they'll have the best\", 'start': 268.86, 'duration': 2.64}, {'text': 'attention but Mark Zuckerberg tried the', 'start': 269.699, 'duration': 3.601}, {'text': \"entire quest for office thing I'll tell\", 'start': 271.5, 'duration': 3.66}, {'text': 'you how Okay so one day they shipped an', 'start': 273.3, 'duration': 4.56}, {'text': 'update where you can map a real keyboard', 'start': 275.16, 'duration': 5.22}, {'text': 'into virtual space you can have the', 'start': 277.86, 'duration': 4.68}, {'text': 'multi-screen set up in Virtual space you', 'start': 280.38, 'duration': 4.14}, {'text': 'can designate a couch your draw boundary', 'start': 282.54, 'duration': 3.3}, {'text': 'around it and then you can now sit on', 'start': 284.52, 'duration': 2.52}, {'text': \"the couch you'll have a couch in Virtual\", 'start': 285.84, 'duration': 3.48}, {'text': \"space so what I'm saying is they tried\", 'start': 287.04, 'duration': 5.159}, {'text': 'all of this it just seems like', 'start': 289.32, 'duration': 4.8}, {'text': 'nobody picked it up like nobody started', 'start': 292.199, 'duration': 4.261}, {'text': \"using it on a daily basis I don't think\", 'start': 294.12, 'duration': 6.24}, {'text': \"it's a function of the visual Clarity of\", 'start': 296.46, 'duration': 6.299}, {'text': 'the of the of the quest too', 'start': 300.36, 'duration': 4.14}, {'text': \"it's fine it's fine I have a friend\", 'start': 302.759, 'duration': 3.781}, {'text': \"joining us yeah I don't think it's a\", 'start': 304.5, 'duration': 3.54}, {'text': 'question the visual Clarity of the quest', 'start': 306.54, 'duration': 3.36}, {'text': \"too I think it's more like the battery\", 'start': 308.04, 'duration': 3.48}, {'text': \"life like I'll tell you my biggest right\", 'start': 309.9, 'duration': 2.64}, {'text': \"okay I'm just telling you this is a\", 'start': 311.52, 'duration': 2.1}, {'text': 'consumer', 'start': 312.54, 'duration': 2.76}, {'text': 'I hate the fact that every two hours I', 'start': 313.62, 'duration': 3.6}, {'text': 'have to charge it and eventually I just', 'start': 315.3, 'duration': 3.54}, {'text': \"realized dude it's far easier to just\", 'start': 317.22, 'duration': 3.66}, {'text': 'keep it you know slotted in so I think', 'start': 318.84, 'duration': 3.66}, {'text': 'the battery life is the biggest', 'start': 320.88, 'duration': 4.8}, {'text': \"challenge and I don't know if I don't\", 'start': 322.5, 'duration': 4.919}, {'text': 'think the Apple headset solves it either', 'start': 325.68, 'duration': 3.6}, {'text': \"because in all the videos there's like\", 'start': 327.419, 'duration': 3.241}, {'text': 'you have to carry on is that thing and', 'start': 329.28, 'duration': 3.0}, {'text': \"now you're carrying a battery pack but\", 'start': 330.66, 'duration': 4.259}, {'text': 'do you think if you if you watch a movie', 'start': 332.28, 'duration': 5.759}, {'text': \"in the Vision Pro and it's us I think\", 'start': 334.919, 'duration': 4.921}, {'text': 'the novelty wears off you think I', 'start': 338.039, 'duration': 3.181}, {'text': \"haven't tried the Vision Pro but in the\", 'start': 339.84, 'duration': 2.88}, {'text': \"quest like I've watched one or two\", 'start': 341.22, 'duration': 3.6}, {'text': 'movies and then novelty wears off even', 'start': 342.72, 'duration': 3.6}, {'text': 'the Android layer right we have the AR', 'start': 344.82, 'duration': 4.26}, {'text': 'glasses normally just wears off after a', 'start': 346.32, 'duration': 5.159}, {'text': 'while and my worry with this is is the', 'start': 349.08, 'duration': 4.8}, {'text': 'novelty going to wear off uh in terms of', 'start': 351.479, 'duration': 3.601}, {'text': \"what I'm building I've sort of three\", 'start': 353.88, 'duration': 2.4}, {'text': \"four things to build right because it's\", 'start': 355.08, 'duration': 2.88}, {'text': 'all you either use Unity or Unreal', 'start': 356.28, 'duration': 3.6}, {'text': \"Engine uh Unity is what they're going\", 'start': 357.96, 'duration': 4.2}, {'text': 'with because epic and apple went with uh', 'start': 359.88, 'duration': 4.259}, {'text': 'some some they had some fight earlier', 'start': 362.16, 'duration': 3.9}, {'text': 'right the lawsuit', 'start': 364.139, 'duration': 4.141}, {'text': \"um so we'll still build but I would bet\", 'start': 366.06, 'duration': 4.62}, {'text': \"on building simple games like I'd build\", 'start': 368.28, 'duration': 4.56}, {'text': \"an equivalent of Katan I'd build an\", 'start': 370.68, 'duration': 3.84}, {'text': 'equal loan of Chess in AR right because', 'start': 372.84, 'duration': 3.18}, {'text': \"in VR I think they're already players\", 'start': 374.52, 'duration': 3.899}, {'text': 'who played this maybe poker', 'start': 376.02, 'duration': 4.98}, {'text': \"um that's what I do now the question\", 'start': 378.419, 'duration': 4.5}, {'text': 'with the quest is to our battery life', 'start': 381.0, 'duration': 4.139}, {'text': \"it's not it's not sustainable for work\", 'start': 382.919, 'duration': 4.5}, {'text': 'but I would be happy to be proven wrong', 'start': 385.139, 'duration': 4.381}, {'text': 'one more thing I want to say about AR VR', 'start': 387.419, 'duration': 3.601}, {'text': \"and AI right like it's almost like\", 'start': 389.52, 'duration': 3.42}, {'text': 'people who are non-technical', 'start': 391.02, 'duration': 3.119}, {'text': 'seem to think that three different', 'start': 392.94, 'duration': 2.52}, {'text': 'things they are technically three', 'start': 394.139, 'duration': 3.06}, {'text': 'different things if you want to put hard', 'start': 395.46, 'duration': 3.299}, {'text': 'categorization on it but at the end of', 'start': 397.199, 'duration': 3.0}, {'text': \"the day it's an engineer who's like I'm\", 'start': 398.759, 'duration': 2.761}, {'text': 'gonna build software for this platform', 'start': 400.199, 'duration': 2.761}, {'text': \"or I'm going to build software like this\", 'start': 401.52, 'duration': 4.019}, {'text': 'right uh obviously a lot of nuances in', 'start': 402.96, 'duration': 4.62}, {'text': 'how you build but lots of similarities', 'start': 405.539, 'duration': 5.761}, {'text': \"right both run on GPU I'm sure a lot of\", 'start': 407.58, 'duration': 5.7}, {'text': 'games my dream is one day games are', 'start': 411.3, 'duration': 3.839}, {'text': 'going to be streamed and the Nvidia CEOs', 'start': 413.28, 'duration': 3.479}, {'text': 'like one day games are going to be you', 'start': 415.139, 'duration': 3.301}, {'text': 'know rendered instead of being rendered', 'start': 416.759, 'duration': 4.321}, {'text': \"they're going to be generated right so I\", 'start': 418.44, 'duration': 4.68}, {'text': 'think you will find some intersection of', 'start': 421.08, 'duration': 4.559}, {'text': 'AI and AR at some point for now the', 'start': 423.12, 'duration': 3.9}, {'text': 'simple ideas I can think of is just', 'start': 425.639, 'duration': 3.421}, {'text': \"singing AR and there's a therapist in\", 'start': 427.02, 'duration': 4.14}, {'text': 'front of you right I thought of this', 'start': 429.06, 'duration': 3.6}, {'text': \"cool idea I'm sure other people have\", 'start': 431.16, 'duration': 2.819}, {'text': 'thought of it too but then when you', 'start': 432.66, 'duration': 3.599}, {'text': 'actually start using the AI uh here', 'start': 433.979, 'duration': 3.361}, {'text': \"right like maybe you're building around\", 'start': 436.259, 'duration': 4.56}, {'text': 'top of chat GPT uh or the open AI uh GPT', 'start': 437.34, 'duration': 5.699}, {'text': 'API you realize the latency is too much', 'start': 440.819, 'duration': 3.961}, {'text': 'takes three seconds you say something', 'start': 443.039, 'duration': 2.94}, {'text': 'and it takes three seconds to respond', 'start': 444.78, 'duration': 3.6}, {'text': \"you'll lose if I had to ask you saying\", 'start': 445.979, 'duration': 5.06}, {'text': 'in the race', 'start': 448.38, 'duration': 2.659}, {'text': 'yeah apple has just entered the race', 'start': 453.02, 'duration': 6.399}, {'text': 'Quest and Faith meta has had a bit of a', 'start': 455.759, 'duration': 6.78}, {'text': 'head start who do you think will win and', 'start': 459.419, 'duration': 4.741}, {'text': \"why do you think they'll laugh I think\", 'start': 462.539, 'duration': 3.06}, {'text': 'it might be the quest', 'start': 464.16, 'duration': 3.3}, {'text': \"why do you think so it's just got more\", 'start': 465.599, 'duration': 5.401}, {'text': 'adoption right now like I at three', 'start': 467.46, 'duration': 5.34}, {'text': 'thousand five hundred dollars adoption', 'start': 471.0, 'duration': 3.599}, {'text': \"is going to be low right it's going to\", 'start': 472.8, 'duration': 3.72}, {'text': 'be set for a few rich people 50 years', 'start': 474.599, 'duration': 3.961}, {'text': \"old don't have time to play games I mean\", 'start': 476.52, 'duration': 4.5}, {'text': \"that's what bomber said\", 'start': 478.56, 'duration': 4.56}, {'text': 'that this is the most expensive phone in', 'start': 481.02, 'duration': 4.38}, {'text': 'the world without a keyboard yeah I mean', 'start': 483.12, 'duration': 3.479}, {'text': \"that's why they're calling it Vision Pro\", 'start': 485.4, 'duration': 3.359}, {'text': \"I'm pretty sure an apple Vision mini is\", 'start': 486.599, 'duration': 3.781}, {'text': \"going to come out that's cheaper that's\", 'start': 488.759, 'duration': 3.301}, {'text': 'like thousand dollars', 'start': 490.38, 'duration': 3.9}, {'text': \"so I don't know like I don't wanna sorry\", 'start': 492.06, 'duration': 3.6}, {'text': 'come back to why do you think the quest', 'start': 494.28, 'duration': 2.88}, {'text': 'will win I think the quest will win', 'start': 495.66, 'duration': 2.759}, {'text': 'because it already has an option I think', 'start': 497.16, 'duration': 3.0}, {'text': \"it's a function of the best game I think\", 'start': 498.419, 'duration': 2.941}, {'text': \"someone's gonna build a World of\", 'start': 500.16, 'duration': 4.5}, {'text': 'Warcraft MMORPG or like a Dota or a', 'start': 501.36, 'duration': 5.279}, {'text': 'League of Legends people have tried the', 'start': 504.66, 'duration': 3.36}, {'text': 'Counter-Strike thing there are lots of', 'start': 506.639, 'duration': 2.941}, {'text': \"games there's contractors Pavlov and\", 'start': 508.02, 'duration': 4.319}, {'text': 'stuff this is not good right so I feel', 'start': 509.58, 'duration': 4.319}, {'text': \"it's the function of the best game and I\", 'start': 512.339, 'duration': 3.601}, {'text': 'think I want to see how AR plays out', 'start': 513.899, 'duration': 3.721}, {'text': \"I've seen a lot of how VR has played out\", 'start': 515.94, 'duration': 3.18}, {'text': \"it's just a story of low retention\", 'start': 517.62, 'duration': 3.659}, {'text': 'people use it three weeks stop I want to', 'start': 519.12, 'duration': 3.839}, {'text': \"see how AR plays out okay you haven't\", 'start': 521.279, 'duration': 4.021}, {'text': 'tried the Vision Pro yet what are three', 'start': 522.959, 'duration': 5.82}, {'text': \"things that you're excited to see in the\", 'start': 525.3, 'duration': 5.7}, {'text': 'Vision Pro and why is it exciting just', 'start': 528.779, 'duration': 4.861}, {'text': 'from the just from the video some people', 'start': 531.0, 'duration': 4.62}, {'text': 'who have tried the Vision Pro like the', 'start': 533.64, 'duration': 4.139}, {'text': 'Oculus CEO especially the ex Oculus CEO', 'start': 535.62, 'duration': 3.96}, {'text': \"Palmer lucky right he's like this is the\", 'start': 537.779, 'duration': 3.481}, {'text': \"best headset ever you've got a tweet on\", 'start': 539.58, 'duration': 4.92}, {'text': \"it correct so a person who's worked in\", 'start': 541.26, 'duration': 6.18}, {'text': 'VR for so long built the Oculus uh and', 'start': 544.5, 'duration': 5.58}, {'text': 'the series of headsets after that saying', 'start': 547.44, 'duration': 4.44}, {'text': 'such good things about Apple or the new', 'start': 550.08, 'duration': 3.96}, {'text': \"heads it means a lot so I'm looking\", 'start': 551.88, 'duration': 3.36}, {'text': 'forward primarily because somebody', 'start': 554.04, 'duration': 2.94}, {'text': 'working here for a very long time has', 'start': 555.24, 'duration': 3.18}, {'text': \"said this is amazing and it's better\", 'start': 556.98, 'duration': 3.12}, {'text': \"than everything I've tried before now\", 'start': 558.42, 'duration': 3.599}, {'text': 'agreed there was some bad breakup', 'start': 560.1, 'duration': 5.34}, {'text': 'between him and Facebook or meta but', 'start': 562.019, 'duration': 4.921}, {'text': \"still it's still a good signal right\", 'start': 565.44, 'duration': 3.06}, {'text': \"that's number one number two what I'm\", 'start': 566.94, 'duration': 3.36}, {'text': 'excited about is the quest actually has', 'start': 568.5, 'duration': 3.72}, {'text': 'really shitty compute compared to what', 'start': 570.3, 'duration': 4.5}, {'text': 'the what the vision process has the M2', 'start': 572.22, 'duration': 4.32}, {'text': 'right M2', 'start': 574.8, 'duration': 3.84}, {'text': 'and apparently they saw lag because they', 'start': 576.54, 'duration': 3.419}, {'text': \"have a separate chip that's just doing\", 'start': 578.64, 'duration': 4.68}, {'text': 'you know uh synthesizing all the sensors', 'start': 579.959, 'duration': 5.82}, {'text': \"on the uh on the Vision Pro right so I'm\", 'start': 583.32, 'duration': 3.84}, {'text': 'really excited to see whether that', 'start': 585.779, 'duration': 2.821}, {'text': 'latency converts or something a lot of', 'start': 587.16, 'duration': 2.58}, {'text': 'people have said putting on the headset', 'start': 588.6, 'duration': 2.28}, {'text': \"means like it's almost like you're not\", 'start': 589.74, 'duration': 2.7}, {'text': \"there right or almost like the headset's\", 'start': 590.88, 'duration': 2.579}, {'text': 'not there because everything is Real', 'start': 592.44, 'duration': 3.899}, {'text': 'Time with the quest even at 120 hertz it', 'start': 593.459, 'duration': 5.341}, {'text': 'still feels little bit laggy still feels', 'start': 596.339, 'duration': 3.601}, {'text': \"like I'm putting something else on I'm\", 'start': 598.8, 'duration': 4.74}, {'text': \"some you know there's some magic uh that\", 'start': 599.94, 'duration': 6.06}, {'text': 'the door that stops the magic right so', 'start': 603.54, 'duration': 3.919}, {'text': \"I'm really excited about the Vision Pro\", 'start': 606.0, 'duration': 3.779}, {'text': 'solving those problems I just want to', 'start': 607.459, 'duration': 3.88}, {'text': 'see it like I just want to use it and', 'start': 609.779, 'duration': 2.641}, {'text': 'then I think my thoughts would be more', 'start': 611.339, 'duration': 3.361}, {'text': 'fleshed out farmer lucky do you know', 'start': 612.42, 'duration': 4.859}, {'text': 'what happened between him and meta I', 'start': 614.7, 'duration': 4.139}, {'text': \"think I don't know if this is true but\", 'start': 617.279, 'duration': 3.541}, {'text': 'apparently he he made a political', 'start': 618.839, 'duration': 3.541}, {'text': \"donation to somebody that meta didn't\", 'start': 620.82, 'duration': 5.28}, {'text': 'like and therefore they kicked him out', 'start': 622.38, 'duration': 5.88}, {'text': \"and now he's working in defense what do\", 'start': 626.1, 'duration': 4.5}, {'text': \"you think about zuck's response\", 'start': 628.26, 'duration': 4.199}, {'text': 'to The Vision Pro he wrote a company', 'start': 630.6, 'duration': 5.16}, {'text': \"email and then he came on Lex Friedman's\", 'start': 632.459, 'duration': 6.421}, {'text': 'podcast dude I really like Zach I used', 'start': 635.76, 'duration': 4.74}, {'text': 'to hate him yeah because of the internet', 'start': 638.88, 'duration': 3.6}, {'text': 'yeah but then the more I learn about him', 'start': 640.5, 'duration': 3.66}, {'text': \"the more I'm like dude this guy's been\", 'start': 642.48, 'duration': 3.479}, {'text': 'CEO of the company by himself not given', 'start': 644.16, 'duration': 3.78}, {'text': 'the range to somebody else yeah and is', 'start': 645.959, 'duration': 4.32}, {'text': 'had the balls to say okay the next', 'start': 647.94, 'duration': 3.839}, {'text': \"platform is going to be this I don't\", 'start': 650.279, 'duration': 4.081}, {'text': 'mind tanking Facebook for this right I', 'start': 651.779, 'duration': 4.441}, {'text': \"think that's a ballsy move by the way he\", 'start': 654.36, 'duration': 3.919}, {'text': 'named the company', 'start': 656.22, 'duration': 4.98}, {'text': \"and really like I've had investors right\", 'start': 658.279, 'duration': 4.601}, {'text': \"it's so hard to tell investors that oh\", 'start': 661.2, 'duration': 2.819}, {'text': \"you're doing this other thing because\", 'start': 662.88, 'duration': 3.18}, {'text': 'this old thing might not work right at', 'start': 664.019, 'duration': 4.081}, {'text': \"my scale okay but at his scale it's like\", 'start': 666.06, 'duration': 4.68}, {'text': \"it's insane so and that's a publicly\", 'start': 668.1, 'duration': 4.14}, {'text': \"defining stuff yeah it's public\", 'start': 670.74, 'duration': 3.659}, {'text': 'investors they do a massive you know hit', 'start': 672.24, 'duration': 5.279}, {'text': 'on their stocks uh on their stock price', 'start': 674.399, 'duration': 5.521}, {'text': 'so I like people who are willing to go', 'start': 677.519, 'duration': 4.681}, {'text': 'all in and have like his incentive is', 'start': 679.92, 'duration': 4.68}, {'text': \"not money he's made enough money so I\", 'start': 682.2, 'duration': 3.54}, {'text': \"know he's playing to build something\", 'start': 684.6, 'duration': 2.82}, {'text': 'really cool', 'start': 685.74, 'duration': 4.08}, {'text': 'um so I I just encourage it from a', 'start': 687.42, 'duration': 4.14}, {'text': \"distance because I just love it he's\", 'start': 689.82, 'duration': 3.78}, {'text': \"like this like man's man thing also\", 'start': 691.56, 'duration': 4.74}, {'text': 'going on right now like yeah the Jiu', 'start': 693.6, 'duration': 5.1}, {'text': 'Jitsu and then the Iron Man thing that', 'start': 696.3, 'duration': 5.279}, {'text': 'he does and you know he smokes Meats in', 'start': 698.7, 'duration': 5.819}, {'text': 'his backyard as well like I like Zuck a', 'start': 701.579, 'duration': 5.221}, {'text': 'lot and and you know I used to for some', 'start': 704.519, 'duration': 3.481}, {'text': 'reason I used to dislike him many years', 'start': 706.8, 'duration': 3.779}, {'text': \"ago I'm so stupid in hindsight like I\", 'start': 708.0, 'duration': 3.959}, {'text': \"don't know why I did that it's just\", 'start': 710.579, 'duration': 2.641}, {'text': 'because the internet hated somebody I', 'start': 711.959, 'duration': 2.641}, {'text': \"was like oh it's cool to do it's like\", 'start': 713.22, 'duration': 3.119}, {'text': \"five six years ago now I'm just like\", 'start': 714.6, 'duration': 3.72}, {'text': \"dude I don't mind being that guy I won't\", 'start': 716.339, 'duration': 4.921}, {'text': \"yeah you know I wouldn't mind you are\", 'start': 718.32, 'duration': 5.22}, {'text': 'like Zuck in the sense that you also', 'start': 721.26, 'duration': 4.74}, {'text': 'seem like your AI generated sometimes I', 'start': 723.54, 'duration': 3.6}, {'text': \"don't know why he got that now he seems\", 'start': 726.0, 'duration': 3.06}, {'text': \"more relatable no but yeah that's the\", 'start': 727.14, 'duration': 4.439}, {'text': 'thing Zack has done some nice PR uh you', 'start': 729.06, 'duration': 4.56}, {'text': \"know whitewash he's like oh I'm gonna go\", 'start': 731.579, 'duration': 3.901}, {'text': \"I'm gonna do what Joe Rogan does because\", 'start': 733.62, 'duration': 3.659}, {'text': 'Joe Rogan is seen as the oh man you know', 'start': 735.48, 'duration': 3.84}, {'text': \"whatever yeah very relatable guy I'm\", 'start': 737.279, 'duration': 4.321}, {'text': \"gonna go to Jujitsu I'm gonna show my\", 'start': 739.32, 'duration': 4.019}, {'text': \"family life I'm not gonna talk like a\", 'start': 741.6, 'duration': 4.08}, {'text': \"robot so I really like him now that's\", 'start': 743.339, 'duration': 3.361}, {'text': 'what I know at the end of the day no', 'start': 745.68, 'duration': 3.12}, {'text': \"matter who builds what you're like can I\", 'start': 746.7, 'duration': 3.78}, {'text': 'relate to the person yes okay I want to', 'start': 748.8, 'duration': 4.08}, {'text': \"be like just the fact that he's giving a\", 'start': 750.48, 'duration': 4.38}, {'text': 'response is going to have so much', 'start': 752.88, 'duration': 4.019}, {'text': \"attention and scrutiny on it it's not\", 'start': 754.86, 'duration': 4.5}, {'text': 'only did it respond but it was a very', 'start': 756.899, 'duration': 5.221}, {'text': 'measured take yeah it was not how these', 'start': 759.36, 'duration': 4.68}, {'text': 'guys suck yeah this is not good it', 'start': 762.12, 'duration': 4.8}, {'text': \"wasn't that his reasoning was hey I\", 'start': 764.04, 'duration': 4.979}, {'text': 'think that going for something we are', 'start': 766.92, 'duration': 3.359}, {'text': 'going a different place we are going a', 'start': 769.019, 'duration': 2.94}, {'text': \"different path we've tried that but\", 'start': 770.279, 'duration': 4.74}, {'text': \"that's not for us and it made can I tell\", 'start': 771.959, 'duration': 5.041}, {'text': \"you one thing but uh I don't know if\", 'start': 775.019, 'duration': 3.661}, {'text': 'this is true and this is my opinion on', 'start': 777.0, 'duration': 2.399}, {'text': 'this', 'start': 778.68, 'duration': 3.24}, {'text': \"I think Zuck got locked like he's not\", 'start': 779.399, 'duration': 5.161}, {'text': 'locked see I I know they released the', 'start': 781.92, 'duration': 4.14}, {'text': 'quest at lower price points or what not', 'start': 784.56, 'duration': 3.959}, {'text': 'but everybody in Silicon Valley wants to', 'start': 786.06, 'duration': 3.839}, {'text': 'build a premium product apple-like', 'start': 788.519, 'duration': 3.301}, {'text': 'product okay and Zuck for a long time', 'start': 789.899, 'duration': 3.661}, {'text': \"said we're going to do the they have an\", 'start': 791.82, 'duration': 3.06}, {'text': 'expensive version of the questions like', 'start': 793.56, 'duration': 3.06}, {'text': \"we're gonna move towards more expensive\", 'start': 794.88, 'duration': 3.84}, {'text': \"headsets over time and we're going to\", 'start': 796.62, 'duration': 3.6}, {'text': 'try to bring the price of those down', 'start': 798.72, 'duration': 4.5}, {'text': 'right so uh put in good Hardware make', 'start': 800.22, 'duration': 4.26}, {'text': \"sure the compute's on on the thing\", 'start': 803.22, 'duration': 2.82}, {'text': \"because Quest people don't know this but\", 'start': 804.48, 'duration': 3.0}, {'text': 'you can actually use something called', 'start': 806.04, 'duration': 3.18}, {'text': 'air link and connect your PC to a quest', 'start': 807.48, 'duration': 3.0}, {'text': 'and suddenly all the graphics are much', 'start': 809.22, 'duration': 3.059}, {'text': \"better right you run you're processing\", 'start': 810.48, 'duration': 3.78}, {'text': 'on the computer itself Zuck wanted to', 'start': 812.279, 'duration': 4.321}, {'text': \"pay the premium game but now can't now\", 'start': 814.26, 'duration': 3.84}, {'text': 'he has to play the Android narrative', 'start': 816.6, 'duration': 5.1}, {'text': \"yeah you you can't go up in culture you\", 'start': 818.1, 'duration': 6.239}, {'text': 'can only go from Top yeah so I feel like', 'start': 821.7, 'duration': 4.92}, {'text': \"it's also a little bit of cope uh saying\", 'start': 824.339, 'duration': 4.201}, {'text': 'that oh you know we will we will be the', 'start': 826.62, 'duration': 3.42}, {'text': \"poor man's headset or every man's\", 'start': 828.54, 'duration': 2.88}, {'text': 'headset yeah', 'start': 830.04, 'duration': 2.099}, {'text': 'um', 'start': 831.42, 'duration': 3.12}, {'text': 'it is cope I nobody would want to say no', 'start': 832.139, 'duration': 3.901}, {'text': 'to the premium segment right but the', 'start': 834.54, 'duration': 2.82}, {'text': 'thing is when Apple comes out you you', 'start': 836.04, 'duration': 3.18}, {'text': \"don't have a choice but to fit there so\", 'start': 837.36, 'duration': 2.58}, {'text': \"now he's going to go into\", 'start': 839.22, 'duration': 2.82}, {'text': 'customizability like you can see this in', 'start': 839.94, 'duration': 3.72}, {'text': 'meta strategy in general right llama', 'start': 842.04, 'duration': 4.08}, {'text': 'they release the weights open source', 'start': 843.66, 'duration': 4.32}, {'text': 'right uh they said for researchers only', 'start': 846.12, 'duration': 3.18}, {'text': \"but I'm pretty sure then you would get\", 'start': 847.98, 'duration': 3.72}, {'text': 'leaked so I feel like', 'start': 849.3, 'duration': 4.44}, {'text': \"he's been Co he's being pushed into the\", 'start': 851.7, 'duration': 3.3}, {'text': 'Android Direction', 'start': 853.74, 'duration': 2.7}, {'text': \"I don't know if there's a business there\", 'start': 855.0, 'duration': 3.48}, {'text': 'uh I mean there is a business there but', 'start': 856.44, 'duration': 5.94}, {'text': \"is it his choice of business don't know\", 'start': 858.48, 'duration': 5.64}, {'text': \"all right let's move on\", 'start': 862.38, 'duration': 5.36}, {'text': 'Runway Gen 2 came out', 'start': 864.12, 'duration': 3.62}, {'text': 'prepare yourself for the exhilaration', 'start': 868.2, 'duration': 3.9}, {'text': 'and sheer chaos of interdimensional', 'start': 870.18, 'duration': 4.01}, {'text': 'clown wrestling', 'start': 872.1, 'duration': 7.94}, {'text': '[Music]', 'start': 874.19, 'duration': 9.49}, {'text': 'these clowns can pick from the Twisted', 'start': 880.04, 'duration': 7.18}, {'text': 'corners and visceral vibrancy that only', 'start': 883.68, 'duration': 6.3}, {'text': 'the weirdest Dimensions can conjure the', 'start': 887.22, 'duration': 4.619}, {'text': 'thing with text to video is text to', 'start': 889.98, 'duration': 3.539}, {'text': 'images gotten so good that the', 'start': 891.839, 'duration': 4.321}, {'text': 'expectation on texture video is so high', 'start': 893.519, 'duration': 4.32}, {'text': \"but it's harder to do I'll tell you why\", 'start': 896.16, 'duration': 3.72}, {'text': \"it's harder to do right technically so\", 'start': 897.839, 'duration': 3.421}, {'text': \"let's say you run stable diffusion you\", 'start': 899.88, 'duration': 2.699}, {'text': 'have a nice model on it or mid Journey', 'start': 901.26, 'duration': 2.4}, {'text': \"or whatever you're able to generate an\", 'start': 902.579, 'duration': 4.081}, {'text': 'image good but the problem is generating', 'start': 903.66, 'duration': 5.34}, {'text': 'one image and generating like a video is', 'start': 906.66, 'duration': 3.78}, {'text': \"a bunch of frames correct let's say 25\", 'start': 909.0, 'duration': 3.48}, {'text': \"frames a second right you're generating\", 'start': 910.44, 'duration': 5.1}, {'text': 'many many frames frame to frame cohesion', 'start': 912.48, 'duration': 4.62}, {'text': 'even if you get great outputs on frame', 'start': 915.54, 'duration': 3.479}, {'text': 'one frame two frame to frame cohesion is', 'start': 917.1, 'duration': 3.599}, {'text': \"hard it's hard so you'll see this in a\", 'start': 919.019, 'duration': 3.421}, {'text': 'lot of like kyber for example has this', 'start': 920.699, 'duration': 3.0}, {'text': \"issue right let's say you have this you\", 'start': 922.44, 'duration': 2.82}, {'text': 'have a small plant there in front of you', 'start': 923.699, 'duration': 2.94}, {'text': 'and you take a video of the plant and', 'start': 925.26, 'duration': 3.06}, {'text': \"you're just moving around and maybe you\", 'start': 926.639, 'duration': 3.301}, {'text': \"there's a dog in front of the plant\", 'start': 928.32, 'duration': 3.24}, {'text': 'right as you move around the planets are', 'start': 929.94, 'duration': 3.6}, {'text': 'changing shapes frame to fame it will go', 'start': 931.56, 'duration': 4.079}, {'text': 'from plant to something else that looks', 'start': 933.54, 'duration': 3.419}, {'text': 'like a plant to some some other thing', 'start': 935.639, 'duration': 2.461}, {'text': 'that looks like a plant maybe different', 'start': 936.959, 'duration': 3.24}, {'text': 'plants even correct so there is no frame', 'start': 938.1, 'duration': 4.2}, {'text': 'to frame consistency correct right and I', 'start': 940.199, 'duration': 3.541}, {'text': \"think that's the biggest issue with text\", 'start': 942.3, 'duration': 3.06}, {'text': \"to video I don't know why people are\", 'start': 943.74, 'duration': 3.899}, {'text': \"that's why people are currently using\", 'start': 945.36, 'duration': 5.58}, {'text': \"like video AI tools where it's like for\", 'start': 947.639, 'duration': 6.181}, {'text': 'a moment in using a video as a base', 'start': 950.94, 'duration': 5.04}, {'text': \"layer you can imprint it's a Frozen\", 'start': 953.82, 'duration': 3.9}, {'text': \"stuff on it it's a filter yeah I think\", 'start': 955.98, 'duration': 3.479}, {'text': 'the best use case is a filter like', 'start': 957.72, 'duration': 3.54}, {'text': 'Snapchat Instagram already proved this', 'start': 959.459, 'duration': 3.541}, {'text': 'and I think there are now tools where it', 'start': 961.26, 'duration': 3.78}, {'text': 'can convert you into anime form I think', 'start': 963.0, 'duration': 4.26}, {'text': \"text to video it's not even texture\", 'start': 965.04, 'duration': 4.68}, {'text': 'videos will be great for', 'start': 967.26, 'duration': 5.4}, {'text': 'filters right and I think it gives a lot', 'start': 969.72, 'duration': 5.82}, {'text': 'of editors great tools right like', 'start': 972.66, 'duration': 4.08}, {'text': 'um so last year we were thinking about', 'start': 975.54, 'duration': 2.82}, {'text': \"what to start like a China's thing Water\", 'start': 976.74, 'duration': 3.3}, {'text': 'started we want to teach something what', 'start': 978.36, 'duration': 2.82}, {'text': 'do we teach which of these are going to', 'start': 980.04, 'duration': 3.12}, {'text': 'get are going to expire over the next', 'start': 981.18, 'duration': 3.18}, {'text': 'one year the one thing we will show', 'start': 983.16, 'duration': 2.4}, {'text': \"we're not going to expire over the next\", 'start': 984.36, 'duration': 3.06}, {'text': \"one to two years is video like it's just\", 'start': 985.56, 'duration': 3.42}, {'text': 'frame to frame consistency is so hard', 'start': 987.42, 'duration': 2.64}, {'text': \"it's such a hard problem it's an\", 'start': 988.98, 'duration': 2.219}, {'text': \"unsolved problem it'll get solved\", 'start': 990.06, 'duration': 2.579}, {'text': 'someday right maybe five or six years', 'start': 991.199, 'duration': 3.421}, {'text': 'down the line but you still need someone', 'start': 992.639, 'duration': 3.481}, {'text': 'to weave it together you still need', 'start': 994.62, 'duration': 3.54}, {'text': 'somebody to do the narrative so China is', 'start': 996.12, 'duration': 3.42}, {'text': \"bullish on the cohort and so far we've\", 'start': 998.16, 'duration': 2.58}, {'text': \"been right and I think we're going to\", 'start': 999.54, 'duration': 2.7}, {'text': 'continue to be right for the next three', 'start': 1000.74, 'duration': 2.7}, {'text': 'four years right just this is the video', 'start': 1002.24, 'duration': 3.0}, {'text': 'editing cohort that you guys have if he', 'start': 1003.44, 'duration': 3.0}, {'text': \"does a video editing cohort it's at\", 'start': 1005.24, 'duration': 4.08}, {'text': 'avtv.com Machina runs it but I mean', 'start': 1006.44, 'duration': 4.74}, {'text': \"there and it's also like we're so\", 'start': 1009.32, 'duration': 3.66}, {'text': 'bullish on video that because see text', 'start': 1011.18, 'duration': 3.959}, {'text': 'is taken away as a domain right because', 'start': 1012.98, 'duration': 3.599}, {'text': 'chat GPD has come out and a lot of', 'start': 1015.139, 'duration': 2.88}, {'text': 'people who are writing SEO content are', 'start': 1016.579, 'duration': 4.44}, {'text': 'just like fizzling out so where are they', 'start': 1018.019, 'duration': 4.56}, {'text': \"going to go it's video and Google if you\", 'start': 1021.019, 'duration': 2.82}, {'text': 'see above the fold now showing three', 'start': 1022.579, 'duration': 2.34}, {'text': \"videos right because they're now going\", 'start': 1023.839, 'duration': 3.061}, {'text': 'to do a full thing so if SEO is going to', 'start': 1024.919, 'duration': 3.0}, {'text': 'go something is going to take its place', 'start': 1026.9, 'duration': 2.939}, {'text': 'companies have realized this right all', 'start': 1027.919, 'duration': 3.301}, {'text': 'the largest companies now come to China', 'start': 1029.839, 'duration': 2.761}, {'text': 'and just say hey how can you do video', 'start': 1031.22, 'duration': 4.44}, {'text': 'for us so we saw such a big opportunity', 'start': 1032.6, 'duration': 5.099}, {'text': 'um therefore you know she kick started', 'start': 1035.66, 'duration': 4.44}, {'text': 'the cohort but anyway coming back I', 'start': 1037.699, 'duration': 5.701}, {'text': 'think this is great as a horror format', 'start': 1040.1, 'duration': 5.66}, {'text': 'right now I think there is like', 'start': 1043.4, 'duration': 4.2}, {'text': \"seriously somebody's going to make a\", 'start': 1045.76, 'duration': 4.18}, {'text': 'channel that does horror and video', 'start': 1047.6, 'duration': 6.54}, {'text': 'maybe text to video like this tweet says', 'start': 1049.94, 'duration': 5.4}, {'text': 'that I predict that generative video', 'start': 1054.14, 'duration': 3.6}, {'text': 'will emerge the form of media in its own', 'start': 1055.34, 'duration': 5.579}, {'text': \"right yeah so maybe we won't get text to\", 'start': 1057.74, 'duration': 4.679}, {'text': 'video in the way we are getting text', 'start': 1060.919, 'duration': 3.541}, {'text': 'images which is extremely accurate', 'start': 1062.419, 'duration': 4.321}, {'text': 'images based on how descriptive you are', 'start': 1064.46, 'duration': 4.8}, {'text': 'yeah but maybe text to video can be a', 'start': 1066.74, 'duration': 5.76}, {'text': \"new style of video yeah I'll tell you\", 'start': 1069.26, 'duration': 4.38}, {'text': \"one more problem I'll tell you one more\", 'start': 1072.5, 'duration': 2.82}, {'text': 'problem with images and video okay this', 'start': 1073.64, 'duration': 3.419}, {'text': 'is just in usage patterns so when you', 'start': 1075.32, 'duration': 5.479}, {'text': 'use mid Journey you get four outputs', 'start': 1077.059, 'duration': 6.421}, {'text': 'give me more variants how do you use', 'start': 1080.799, 'duration': 4.661}, {'text': \"text to images I'm very\", 'start': 1083.48, 'duration': 5.34}, {'text': 'like pessimistic about art jobs right', 'start': 1085.46, 'duration': 5.339}, {'text': 'and the main reason is this right if you', 'start': 1088.82, 'duration': 3.54}, {'text': \"don't like an output you can generate a\", 'start': 1090.799, 'duration': 3.721}, {'text': 'thousand pic correct with video and even', 'start': 1092.36, 'duration': 3.72}, {'text': \"with code you can't easily do that even\", 'start': 1094.52, 'duration': 4.019}, {'text': \"code I'm uh I'm bullish that will help\", 'start': 1096.08, 'duration': 4.2}, {'text': 'engineers and a lot of Engineers will be', 'start': 1098.539, 'duration': 4.681}, {'text': '10x 100x Engineers but everyone we need', 'start': 1100.28, 'duration': 4.44}, {'text': 'to know know how to code right and the', 'start': 1103.22, 'duration': 3.24}, {'text': 'main reason is you get a code base or', 'start': 1104.72, 'duration': 3.06}, {'text': \"you get a full video let's say you want\", 'start': 1106.46, 'duration': 2.94}, {'text': 'to change three frames in the video okay', 'start': 1107.78, 'duration': 3.899}, {'text': \"let's say you've given a prompt saying\", 'start': 1109.4, 'duration': 4.86}, {'text': 'okay uh Rahul Ravid sitting and sipping', 'start': 1111.679, 'duration': 4.86}, {'text': 'coffee on Mount Everest right and maybe', 'start': 1114.26, 'duration': 3.72}, {'text': 'some part of the video is not great', 'start': 1116.539, 'duration': 3.301}, {'text': \"right maybe he's sipping coffee the\", 'start': 1117.98, 'duration': 3.78}, {'text': 'wrong way or his pinkies out or you want', 'start': 1119.84, 'duration': 4.26}, {'text': \"his pinky out you can't go in and change\", 'start': 1121.76, 'duration': 4.44}, {'text': 'that now because now the entire video', 'start': 1124.1, 'duration': 3.42}, {'text': 'will change it will generate something', 'start': 1126.2, 'duration': 3.719}, {'text': \"from scratch with rahul's pinky out but\", 'start': 1127.52, 'duration': 3.96}, {'text': 'the Mount Everest behind it will change', 'start': 1129.919, 'duration': 3.421}, {'text': \"that's right now though yeah that no\", 'start': 1131.48, 'duration': 4.02}, {'text': \"even in the future right you don't have\", 'start': 1133.34, 'duration': 3.9}, {'text': 'fine control over any of these AI models', 'start': 1135.5, 'duration': 3.059}, {'text': \"even with stable diffusion you don't\", 'start': 1137.24, 'duration': 3.48}, {'text': \"even with mid Journey you don't you\", 'start': 1138.559, 'duration': 3.541}, {'text': \"can't like even if you tell mid Journey\", 'start': 1140.72, 'duration': 2.819}, {'text': 'oh I want a character sitting there', 'start': 1142.1, 'duration': 3.48}, {'text': \"sipping a cup of coffee it's not exactly\", 'start': 1143.539, 'duration': 3.361}, {'text': 'what you want and if you want to remove', 'start': 1145.58, 'duration': 2.58}, {'text': \"that cup of coffee you'll have to take\", 'start': 1146.9, 'duration': 3.36}, {'text': 'it in generative by the way I generate', 'start': 1148.16, 'duration': 3.74}, {'text': 'an image of', 'start': 1150.26, 'duration': 4.08}, {'text': 'uh this is after my channel contact I', 'start': 1151.9, 'duration': 4.54}, {'text': 'generated an image of and the prompt was', 'start': 1154.34, 'duration': 4.14}, {'text': \"that hey it's an image of an Indian man\", 'start': 1156.44, 'duration': 3.479}, {'text': 'sitting in front of a computer Studios', 'start': 1158.48, 'duration': 3.84}, {'text': \"on fire and he's showing the thumbs up\", 'start': 1159.919, 'duration': 5.341}, {'text': 'yeah okay and it generated accurately', 'start': 1162.32, 'duration': 6.599}, {'text': \"yeah so if it's like one specific action\", 'start': 1165.26, 'duration': 5.94}, {'text': \"that you want a person to do no it's\", 'start': 1168.919, 'duration': 4.801}, {'text': 'about change say you like an output the', 'start': 1171.2, 'duration': 4.44}, {'text': 'problem is this right you love an output', 'start': 1173.72, 'duration': 3.78}, {'text': \"you want one change now you're done you\", 'start': 1175.64, 'duration': 3.48}, {'text': \"can't do anything yeah you can't be like\", 'start': 1177.5, 'duration': 3.419}, {'text': 'retain all of this this happens on', 'start': 1179.12, 'duration': 3.78}, {'text': \"big Journey as well yeah I can't be like\", 'start': 1180.919, 'duration': 4.5}, {'text': 'retain the posture but just change the', 'start': 1182.9, 'duration': 4.26}, {'text': \"clothes I can't do that exactly and for\", 'start': 1185.419, 'duration': 4.201}, {'text': \"that you'd use generative fill right so\", 'start': 1187.16, 'duration': 4.08}, {'text': 'the equivalent of generative fill for', 'start': 1189.62, 'duration': 3.6}, {'text': 'video is very hard because if I say okay', 'start': 1191.24, 'duration': 3.96}, {'text': 'this one small thing in the background I', 'start': 1193.22, 'duration': 3.48}, {'text': 'want this to be something else now you', 'start': 1195.2, 'duration': 3.599}, {'text': 'need to have frame to frame consistency', 'start': 1196.7, 'duration': 3.78}, {'text': \"so it's very hard to do generative fill\", 'start': 1198.799, 'duration': 3.301}, {'text': \"and that's that's a video editor's role\", 'start': 1200.48, 'duration': 3.42}, {'text': 'honestly right like if you want some', 'start': 1202.1, 'duration': 3.18}, {'text': 'graphic to come in or whatever and then', 'start': 1203.9, 'duration': 4.2}, {'text': 'swipe out so what I believe with text to', 'start': 1205.28, 'duration': 5.22}, {'text': 'video text to image particularly is a', 'start': 1208.1, 'duration': 3.72}, {'text': 'lot of people look at a lot of outputs', 'start': 1210.5, 'duration': 2.4}, {'text': 'like you would have seen four outputs of', 'start': 1211.82, 'duration': 2.219}, {'text': 'the thumbs up people like I like this', 'start': 1212.9, 'duration': 2.7}, {'text': 'one correct the minute you want to edit', 'start': 1214.039, 'duration': 3.241}, {'text': \"that you're screwed but with code bases\", 'start': 1215.6, 'duration': 3.18}, {'text': 'you generate an entire code base and', 'start': 1217.28, 'duration': 2.639}, {'text': \"you're like oh I want to change this one\", 'start': 1218.78, 'duration': 2.82}, {'text': 'file now you need to know how to do it', 'start': 1219.919, 'duration': 3.721}, {'text': 'now you need to learn how to code right', 'start': 1221.6, 'duration': 5.28}, {'text': \"so you have create it's like we have\", 'start': 1223.64, 'duration': 4.68}, {'text': 'this thing called in in Tech called', 'start': 1226.88, 'duration': 3.659}, {'text': 'create read update destroy right if', 'start': 1228.32, 'duration': 3.84}, {'text': 'anything on the database simple', 'start': 1230.539, 'duration': 3.301}, {'text': 'operations or create read update create', 'start': 1232.16, 'duration': 3.12}, {'text': \"means you're creating a new piece of\", 'start': 1233.84, 'duration': 3.24}, {'text': \"something read means you're just looking\", 'start': 1235.28, 'duration': 4.86}, {'text': 'at it and and whatever uh read means', 'start': 1237.08, 'duration': 4.56}, {'text': \"you're just looking at it update means\", 'start': 1240.14, 'duration': 3.18}, {'text': 'you want to change something and Destroy', 'start': 1241.64, 'duration': 3.3}, {'text': 'means you want to delete it so we have', 'start': 1243.32, 'duration': 5.46}, {'text': \"crd we don't have U correct right so you\", 'start': 1244.94, 'duration': 5.28}, {'text': \"don't have edit capability if you're\", 'start': 1248.78, 'duration': 3.24}, {'text': 'okay with abandoning the edit capability', 'start': 1250.22, 'duration': 3.18}, {'text': 'like in the sense of generate thousand', 'start': 1252.02, 'duration': 2.76}, {'text': 'image variants and pick the right one', 'start': 1253.4, 'duration': 3.96}, {'text': 'then great but if you wanna', 'start': 1254.78, 'duration': 4.86}, {'text': 'go like if you want to edit anything you', 'start': 1257.36, 'duration': 4.559}, {'text': \"need to have skill sets so let's try it\", 'start': 1259.64, 'duration': 4.5}, {'text': \"let's try to generate something so what\", 'start': 1261.919, 'duration': 3.721}, {'text': \"we're writing is Steve Jobs sitting on a\", 'start': 1264.14, 'duration': 3.24}, {'text': 'mountain drinking coffee with a pinky', 'start': 1265.64, 'duration': 2.82}, {'text': 'finger out', 'start': 1267.38, 'duration': 3.56}, {'text': 'right', 'start': 1268.46, 'duration': 2.48}, {'text': 'you know where I think texture video', 'start': 1274.64, 'duration': 3.3}, {'text': 'will be very useful in few years stock', 'start': 1276.14, 'duration': 4.44}, {'text': \"footage like if you don't care about the\", 'start': 1277.94, 'duration': 4.32}, {'text': \"exact Fidelity and you're just like oh\", 'start': 1280.58, 'duration': 3.24}, {'text': \"I'm talking saying something about Egypt\", 'start': 1282.26, 'duration': 3.659}, {'text': 'just show people in Egypt walking it is', 'start': 1283.82, 'duration': 4.5}, {'text': \"great almost like b-roll b-roll it's\", 'start': 1285.919, 'duration': 3.661}, {'text': 'great for b-roll because there you can', 'start': 1288.32, 'duration': 2.46}, {'text': 'see fourth generation will be like I', 'start': 1289.58, 'duration': 2.88}, {'text': 'like this one the minute you want edit', 'start': 1290.78, 'duration': 3.48}, {'text': 'capability now like I want this specific', 'start': 1292.46, 'duration': 3.3}, {'text': 'thing changed you have no control you', 'start': 1294.26, 'duration': 3.72}, {'text': 'have no Fidelity so you can create a lot', 'start': 1295.76, 'duration': 6.12}, {'text': 'of like Montage shots and or video with', 'start': 1297.98, 'duration': 5.52}, {'text': \"like where you want it's like a hype\", 'start': 1301.88, 'duration': 3.72}, {'text': 'video and you want text on top of just', 'start': 1303.5, 'duration': 4.559}, {'text': 'something narrates narration almost like', 'start': 1305.6, 'duration': 4.34}, {'text': 'Ambience', 'start': 1308.059, 'duration': 4.5}, {'text': 'ml founder right another one who works', 'start': 1309.94, 'duration': 4.719}, {'text': 'in texture video but for faces and', 'start': 1312.559, 'duration': 4.021}, {'text': 'usually our model has everything but if', 'start': 1314.659, 'duration': 3.061}, {'text': 'you want to like in the middle of the', 'start': 1316.58, 'duration': 2.52}, {'text': 'video you want the character to turn to', 'start': 1317.72, 'duration': 2.819}, {'text': \"the left or right you can't do that\", 'start': 1319.1, 'duration': 2.88}, {'text': 'sorry', 'start': 1320.539, 'duration': 5.601}, {'text': 'okay always something', 'start': 1321.98, 'duration': 4.16}, {'text': 'see', 'start': 1328.82, 'duration': 4.38}, {'text': \"to it yeah it's not getting the it's not\", 'start': 1330.38, 'duration': 4.62}, {'text': 'doing the thing pink finger out but one', 'start': 1333.2, 'duration': 3.3}, {'text': 'day this will be great for stock footage', 'start': 1335.0, 'duration': 4.86}, {'text': \"it's pretty good for General feel of\", 'start': 1336.5, 'duration': 5.28}, {'text': \"what you're going for but not the exact\", 'start': 1339.86, 'duration': 5.04}, {'text': 'thing yeah I think the stock footage to', 'start': 1341.78, 'duration': 5.1}, {'text': 'create a movie or a video will be', 'start': 1344.9, 'duration': 3.42}, {'text': 'available at some point like you want to', 'start': 1346.88, 'duration': 3.419}, {'text': 'do Terminators walking in and Arnold', 'start': 1348.32, 'duration': 3.18}, {'text': 'Schwarzenegger looking at them like', 'start': 1350.299, 'duration': 2.701}, {'text': \"running around if you're okay with\", 'start': 1351.5, 'duration': 3.539}, {'text': \"sacrificing Fidelity this is great let's\", 'start': 1353.0, 'duration': 3.84}, {'text': 'try creating something which is just', 'start': 1355.039, 'duration': 4.081}, {'text': 'like an ambient film over which you can', 'start': 1356.84, 'duration': 4.38}, {'text': 'overlay text to make like a hype video', 'start': 1359.12, 'duration': 4.679}, {'text': 'right so say for example shooting stars', 'start': 1361.22, 'duration': 4.26}, {'text': 'in the sky', 'start': 1363.799, 'duration': 5.641}, {'text': 'in the sky with text on top no the text', 'start': 1365.48, 'duration': 5.4}, {'text': 'we will add though so shooting star', 'start': 1369.44, 'duration': 5.099}, {'text': 'shooting stars in the sky yeah', 'start': 1370.88, 'duration': 6.98}, {'text': 'um yellow clouds', 'start': 1374.539, 'duration': 3.321}, {'text': 'with rain', 'start': 1378.08, 'duration': 3.24}, {'text': 'with rain yeah this is perfect this is', 'start': 1379.76, 'duration': 3.06}, {'text': 'stock footage his stock footage and this', 'start': 1381.32, 'duration': 2.88}, {'text': \"is what it's trained on also so it will\", 'start': 1382.82, 'duration': 2.76}, {'text': 'generate something really good so yeah I', 'start': 1384.2, 'duration': 2.88}, {'text': \"was talking to a Founder who who's\", 'start': 1385.58, 'duration': 3.719}, {'text': 'worked in ml for a while he has a text', 'start': 1387.08, 'duration': 4.38}, {'text': 'to video platform but for face like for', 'start': 1389.299, 'duration': 3.961}, {'text': \"Talking Heads and he's like we've got\", 'start': 1391.46, 'duration': 3.66}, {'text': \"everything like you you've given some\", 'start': 1393.26, 'duration': 3.539}, {'text': \"words and it'll do it for you but we\", 'start': 1395.12, 'duration': 3.059}, {'text': \"don't have Fidelity like if you want the\", 'start': 1396.799, 'duration': 3.12}, {'text': 'actor to look left and say something or', 'start': 1398.179, 'duration': 3.661}, {'text': 'move their right hand on frame three and', 'start': 1399.919, 'duration': 4.441}, {'text': \"say something sorry you can't do that so\", 'start': 1401.84, 'duration': 4.56}, {'text': 'you lose edit capability but the create', 'start': 1404.36, 'duration': 4.08}, {'text': 'capability will be damn good like in', 'start': 1406.4, 'duration': 3.659}, {'text': \"five years it's going to be so good you\", 'start': 1408.44, 'duration': 3.18}, {'text': \"just you don't need to turn anywhere for\", 'start': 1410.059, 'duration': 3.661}, {'text': 'stock footage okay let me ask you a', 'start': 1411.62, 'duration': 4.439}, {'text': 'question if I own a production company', 'start': 1413.72, 'duration': 5.24}, {'text': 'right now that produces', 'start': 1416.059, 'duration': 5.881}, {'text': \"specific scripts like there's a script\", 'start': 1418.96, 'duration': 4.66}, {'text': \"that's written with a celebrity in a\", 'start': 1421.94, 'duration': 2.94}, {'text': 'specific manner where they need to', 'start': 1423.62, 'duration': 3.539}, {'text': 'behave and see a certain line is my job', 'start': 1424.88, 'duration': 4.02}, {'text': 'in danger because of text to video', 'start': 1427.159, 'duration': 4.26}, {'text': 'generation no I think she has a director', 'start': 1428.9, 'duration': 3.48}, {'text': 'right', 'start': 1431.419, 'duration': 3.301}, {'text': 'you want that final control you want', 'start': 1432.38, 'duration': 4.44}, {'text': 'Alia Bhatt to look slightly 35 degrees', 'start': 1434.72, 'duration': 4.02}, {'text': 'to the left saying something and putting', 'start': 1436.82, 'duration': 3.599}, {'text': 'our hands up or being super excited', 'start': 1438.74, 'duration': 3.24}, {'text': \"there's a reason retakes happen right\", 'start': 1440.419, 'duration': 3.841}, {'text': \"they'll want you to retake 10 times the\", 'start': 1441.98, 'duration': 3.6}, {'text': 'problem with this is you need to look at', 'start': 1444.26, 'duration': 3.539}, {'text': \"a thousand generations and it's not like\", 'start': 1445.58, 'duration': 3.54}, {'text': \"right now we're generating stock footage\", 'start': 1447.799, 'duration': 2.581}, {'text': \"right but let's say the entire segment\", 'start': 1449.12, 'duration': 3.059}, {'text': 'is a minute long do you have the energy', 'start': 1450.38, 'duration': 3.0}, {'text': 'to look at a thousand different', 'start': 1452.179, 'duration': 3.661}, {'text': 'generations of a minute long video and', 'start': 1453.38, 'duration': 3.96}, {'text': 'then pick the right one and say oh this', 'start': 1455.84, 'duration': 3.0}, {'text': \"is the base there'll always be something\", 'start': 1457.34, 'duration': 3.06}, {'text': \"you want to change but on set it's very\", 'start': 1458.84, 'duration': 3.54}, {'text': 'easy for you to change that right for', 'start': 1460.4, 'duration': 3.42}, {'text': 'you to say okay move to the left', 'start': 1462.38, 'duration': 2.76}, {'text': 'slightly do this slightly do this', 'start': 1463.82, 'duration': 3.239}, {'text': 'slightly and directors 99 of the time', 'start': 1465.14, 'duration': 3.48}, {'text': \"whatever I've seen they're always asking\", 'start': 1467.059, 'duration': 4.261}, {'text': 'for micro changes so as a director right', 'start': 1468.62, 'duration': 6.84}, {'text': 'now I can ask a person to go from A to B', 'start': 1471.32, 'duration': 6.66}, {'text': 'right and AI can make something go from', 'start': 1475.46, 'duration': 5.459}, {'text': 'A to B but actually the process of going', 'start': 1477.98, 'duration': 6.66}, {'text': 'A to B requires you to go from a to 8.1', 'start': 1480.919, 'duration': 6.601}, {'text': 'to 8.2 to 8.3 to 8.4 to 8.5 to', 'start': 1484.64, 'duration': 5.7}, {'text': 'eventually reach B which right now ai is', 'start': 1487.52, 'duration': 5.94}, {'text': 'unable to give you any possibility to', 'start': 1490.34, 'duration': 5.4}, {'text': \"change something at 8.3 8.48 it's called\", 'start': 1493.46, 'duration': 4.44}, {'text': 'the word is called Fidelity right and', 'start': 1495.74, 'duration': 3.419}, {'text': \"what I'm saying is you can't even do it\", 'start': 1497.9, 'duration': 3.12}, {'text': \"Fidelity in images like it's so hard to\", 'start': 1499.159, 'duration': 4.081}, {'text': 'do Fidelity in images but images are', 'start': 1501.02, 'duration': 5.1}, {'text': 'very easy to walk into like on Photoshop', 'start': 1503.24, 'duration': 4.2}, {'text': 'or something and change small things out', 'start': 1506.12, 'duration': 4.74}, {'text': 'right or with images you can just beat', 'start': 1507.44, 'duration': 5.04}, {'text': 'it with volume generate a thousand', 'start': 1510.86, 'duration': 4.62}, {'text': 'correct find maybe you like the 18th one', 'start': 1512.48, 'duration': 4.5}, {'text': 'or the 18th one you can just be like', 'start': 1515.48, 'duration': 3.54}, {'text': \"let's roll with this it's one image but\", 'start': 1516.98, 'duration': 4.14}, {'text': \"with a video every frame it's almost\", 'start': 1519.02, 'duration': 4.08}, {'text': \"like every frame you're looking for\", 'start': 1521.12, 'duration': 3.84}, {'text': \"something right so it's almost like that\", 'start': 1523.1, 'duration': 3.72}, {'text': 'same thousand multiplied by the frame', 'start': 1524.96, 'duration': 3.12}, {'text': 'rate multiplied by the number of seconds', 'start': 1526.82, 'duration': 2.88}, {'text': \"the video goes on for I don't think\", 'start': 1528.08, 'duration': 3.12}, {'text': 'anyone has a patient to look through so', 'start': 1529.7, 'duration': 3.06}, {'text': 'many generations interaction companies', 'start': 1531.2, 'duration': 3.599}, {'text': 'can breathe safe for now yeah but I', 'start': 1532.76, 'duration': 3.72}, {'text': \"think stock footage like if I'm doing a\", 'start': 1534.799, 'duration': 3.12}, {'text': 'narrative like we will definitely be', 'start': 1536.48, 'duration': 3.059}, {'text': 'using this to create narrations', 'start': 1537.919, 'duration': 3.421}, {'text': \"like if I'm narrating something and I\", 'start': 1539.539, 'duration': 2.941}, {'text': \"don't want to generate the b-roll people\", 'start': 1541.34, 'duration': 3.3}, {'text': 'use this to do b-roll like sky is Stars', 'start': 1542.48, 'duration': 4.4}, {'text': \"people moving in Egypt something that's\", 'start': 1544.64, 'duration': 5.519}, {'text': 'generic I would I would use this oh play', 'start': 1546.88, 'duration': 6.48}, {'text': 'this playlist this video is ready', 'start': 1550.159, 'duration': 3.201}, {'text': 'so good', 'start': 1553.46, 'duration': 4.98}, {'text': 'this is great for as stock footage', 'start': 1554.72, 'duration': 6.18}, {'text': 'yeah it will replay stock footage', 'start': 1558.44, 'duration': 4.56}, {'text': 'assuming a marketing creative', 'start': 1560.9, 'duration': 4.5}, {'text': 'you want some stock footage type stop', 'start': 1563.0, 'duration': 4.14}, {'text': 'stock image type thing in the back then', 'start': 1565.4, 'duration': 3.0}, {'text': \"you'll have a super then you'll have\", 'start': 1567.14, 'duration': 3.659}, {'text': 'maybe some shadows and stuff right it is', 'start': 1568.4, 'duration': 4.2}, {'text': 'possible for you to compose it but the', 'start': 1570.799, 'duration': 2.941}, {'text': 'minute you want to do that in video you', 'start': 1572.6, 'duration': 1.98}, {'text': 'have to do it for every frame', 'start': 1573.74, 'duration': 2.64}, {'text': 'technically your video editing at this', 'start': 1574.58, 'duration': 4.8}, {'text': 'point right but in the near term the', 'start': 1576.38, 'duration': 6.419}, {'text': 'process of creating something granular', 'start': 1579.38, 'duration': 5.94}, {'text': 'or finer in video that process can be', 'start': 1582.799, 'duration': 4.98}, {'text': 'made a lot easier yes for example if you', 'start': 1585.32, 'duration': 4.739}, {'text': 'want someone to change their language if', 'start': 1587.779, 'duration': 4.02}, {'text': 'you want them to lip sync to a certain', 'start': 1590.059, 'duration': 3.781}, {'text': 'thing yeah if you want to change just a', 'start': 1591.799, 'duration': 4.201}, {'text': \"just an expression there'll be a bunch\", 'start': 1593.84, 'duration': 3.78}, {'text': 'of tools that will come out that will', 'start': 1596.0, 'duration': 4.32}, {'text': 'make your life easier like an editor', 'start': 1597.62, 'duration': 4.02}, {'text': 'will probably spend one tenth of his', 'start': 1600.32, 'duration': 3.12}, {'text': 'time on a video that he used to spend', 'start': 1601.64, 'duration': 4.32}, {'text': 'whatever so right now ai can make macro', 'start': 1603.44, 'duration': 4.5}, {'text': 'changes to a video everything I know', 'start': 1605.96, 'duration': 3.12}, {'text': \"it's not just video it's video code\", 'start': 1607.94, 'duration': 3.3}, {'text': 'basis images you can generate macro', 'start': 1609.08, 'duration': 4.14}, {'text': 'changes macro changes but and very micro', 'start': 1611.24, 'duration': 4.319}, {'text': \"changes yeah but you can't Stitch the\", 'start': 1613.22, 'duration': 3.78}, {'text': \"two right now yeah like that's the hard\", 'start': 1615.559, 'duration': 3.0}, {'text': \"part that's the hard part that's the\", 'start': 1617.0, 'duration': 3.419}, {'text': 'part that requires intuition and', 'start': 1618.559, 'duration': 4.321}, {'text': 'cognition and yeah but what you found is', 'start': 1620.419, 'duration': 4.021}, {'text': \"it's also a function of user Behavior\", 'start': 1622.88, 'duration': 5.159}, {'text': 'right users are okay with images if they', 'start': 1624.44, 'duration': 4.8}, {'text': \"generate a thousand images they'll be\", 'start': 1628.039, 'duration': 2.941}, {'text': \"like I like this 118th one let's roll\", 'start': 1629.24, 'duration': 3.419}, {'text': 'with this they are not okay with code', 'start': 1630.98, 'duration': 3.0}, {'text': 'because if you do that with code things', 'start': 1632.659, 'duration': 3.301}, {'text': 'will break so and I built a tool called', 'start': 1633.98, 'duration': 3.98}, {'text': 'autocode you can go check it out', 'start': 1635.96, 'duration': 5.339}, {'text': \"whatever right so it's part of the same\", 'start': 1637.96, 'duration': 5.079}, {'text': 'uh things but we built some something', 'start': 1641.299, 'duration': 3.841}, {'text': 'called autocodepro.com where', 'start': 1643.039, 'duration': 3.961}, {'text': 'you can actually generate code but we', 'start': 1645.14, 'duration': 3.3}, {'text': 'see the same issue like there are', 'start': 1647.0, 'duration': 2.82}, {'text': 'thousand code Generations a day are not', 'start': 1648.44, 'duration': 3.42}, {'text': 'a code Pro right now same issue right', 'start': 1649.82, 'duration': 3.9}, {'text': 'people generate the code base they love', 'start': 1651.86, 'duration': 3.12}, {'text': \"it now they're like okay this task\", 'start': 1653.72, 'duration': 2.88}, {'text': \"manager May they've generated a task\", 'start': 1654.98, 'duration': 4.1}, {'text': \"manager let's say like yes\", 'start': 1656.6, 'duration': 5.459}, {'text': 'now you need to learn how to code so you', 'start': 1659.08, 'duration': 4.719}, {'text': 'can create scaffolding even in video', 'start': 1662.059, 'duration': 3.661}, {'text': 'yeah but not the finer details yeah', 'start': 1663.799, 'duration': 3.781}, {'text': 'actually right because the minute you', 'start': 1665.72, 'duration': 4.26}, {'text': \"want to do the final you can it's the\", 'start': 1667.58, 'duration': 4.38}, {'text': 'same in images but with images people', 'start': 1669.98, 'duration': 4.26}, {'text': 'are okay with just generative thousand', 'start': 1671.96, 'duration': 3.66}, {'text': \"variants and just be like I'll roll with\", 'start': 1674.24, 'duration': 3.6}, {'text': \"this without edit right so it's more\", 'start': 1675.62, 'duration': 3.9}, {'text': 'user behaviors not has nothing to do', 'start': 1677.84, 'duration': 3.12}, {'text': 'they they all have the same limitations', 'start': 1679.52, 'duration': 4.56}, {'text': \"it's user Behavior so there are some\", 'start': 1680.96, 'duration': 4.44}, {'text': 'parallels between', 'start': 1684.08, 'duration': 3.54}, {'text': \"Ai and what it's doing in images and AI\", 'start': 1685.4, 'duration': 4.08}, {'text': \"what it's doing in video Yeah in images\", 'start': 1687.62, 'duration': 4.86}, {'text': 'you can create micro changes to', 'start': 1689.48, 'duration': 5.64}, {'text': 'something for example I can create Virat', 'start': 1692.48, 'duration': 5.4}, {'text': \"kohli's face yeah and replicate it on\", 'start': 1695.12, 'duration': 4.439}, {'text': 'anybody', 'start': 1697.88, 'duration': 4.98}, {'text': 'um in in video I can change Virat', 'start': 1699.559, 'duration': 5.821}, {'text': \"kohli's lips and change it from one\", 'start': 1702.86, 'duration': 3.84}, {'text': 'language to another language yeah', 'start': 1705.38, 'duration': 2.46}, {'text': \"because it's been trained on that\", 'start': 1706.7, 'duration': 2.7}, {'text': 'function so technically your face', 'start': 1707.84, 'duration': 3.12}, {'text': 'swapper in mid journey is a separate', 'start': 1709.4, 'duration': 3.06}, {'text': 'tool from a journey by the way correct', 'start': 1710.96, 'duration': 4.199}, {'text': 'correct so inside face on Mid journey', 'start': 1712.46, 'duration': 4.26}, {'text': 'and you can do that with video also that', 'start': 1715.159, 'duration': 3.481}, {'text': \"let's say you generate a half decent\", 'start': 1716.72, 'duration': 3.9}, {'text': 'face I can swap to the real face correct', 'start': 1718.64, 'duration': 4.08}, {'text': 'right across the entire video that think', 'start': 1720.62, 'duration': 3.72}, {'text': 'of it as a separate AI tool so what will', 'start': 1722.72, 'duration': 3.48}, {'text': \"happen is you'll generate stock footage\", 'start': 1724.34, 'duration': 3.839}, {'text': 'now you have like these 10 AI Tools in', 'start': 1726.2, 'duration': 4.62}, {'text': 'front of you one for face swapping one', 'start': 1728.179, 'duration': 3.6}, {'text': \"for something else and that's what\", 'start': 1730.82, 'duration': 2.52}, {'text': \"Runway is also doing by the way we've\", 'start': 1731.779, 'duration': 3.061}, {'text': 'got a bunch of tools track this', 'start': 1733.34, 'duration': 3.06}, {'text': 'character out track this character in', 'start': 1734.84, 'duration': 3.42}, {'text': '100 Dynamics okay replace this with a', 'start': 1736.4, 'duration': 3.659}, {'text': \"different character so it's almost like\", 'start': 1738.26, 'duration': 2.94}, {'text': \"you have a toolkit and you're working\", 'start': 1740.059, 'duration': 2.881}, {'text': 'with it same thing with images your', 'start': 1741.2, 'duration': 3.599}, {'text': 'toolkit inside face generative fill', 'start': 1742.94, 'duration': 2.88}, {'text': \"they're all toolkit like stable\", 'start': 1744.799, 'duration': 3.48}, {'text': 'diffusion the so stable Fusion on', 'start': 1745.82, 'duration': 5.04}, {'text': 'locally has a UI called uh has a has a', 'start': 1748.279, 'duration': 3.721}, {'text': 'tool called automatic one one one one', 'start': 1750.86, 'duration': 2.88}, {'text': 'which is basically a UI for stable', 'start': 1752.0, 'duration': 3.179}, {'text': \"diffusion plus it's packed with a bunch\", 'start': 1753.74, 'duration': 3.24}, {'text': 'of extensions and stuff they were like', 'start': 1755.179, 'duration': 3.781}, {'text': '30 40 extensions so you want to now', 'start': 1756.98, 'duration': 3.9}, {'text': 'generate text you want to depth map for', 'start': 1758.96, 'duration': 3.54}, {'text': 'text you can do that separately you want', 'start': 1760.88, 'duration': 2.94}, {'text': 'to upscale the image you can do that if', 'start': 1762.5, 'duration': 2.46}, {'text': 'you want to restore faces you can use', 'start': 1763.82, 'duration': 2.76}, {'text': 'something called code former so there', 'start': 1764.96, 'duration': 3.719}, {'text': 'are a bunch of different Tools in one', 'start': 1766.58, 'duration': 4.44}, {'text': 'package so I feel like the big threat is', 'start': 1768.679, 'duration': 5.22}, {'text': 'to Premiere Pro or after effects right', 'start': 1771.02, 'duration': 4.259}, {'text': 'where they will have to incorporate all', 'start': 1773.899, 'duration': 2.88}, {'text': 'these as like 10 different AI tools', 'start': 1775.279, 'duration': 3.061}, {'text': 'which is what Runway is doing and which', 'start': 1776.779, 'duration': 2.941}, {'text': 'is what Photoshop did with generative', 'start': 1778.34, 'duration': 3.5}, {'text': \"film they're like yeah\", 'start': 1779.72, 'duration': 4.199}, {'text': 'workflow camera so I feel like it', 'start': 1781.84, 'duration': 3.76}, {'text': \"they'll be great tools and the only\", 'start': 1783.919, 'duration': 3.24}, {'text': 'thing is from a user Behavior', 'start': 1785.6, 'duration': 5.059}, {'text': 'perspective people are okay even', 'start': 1787.159, 'duration': 3.5}, {'text': \"and you don't like one word you can just\", 'start': 1796.059, 'duration': 4.901}, {'text': \"write it off so on the curve we're at\", 'start': 1798.32, 'duration': 4.8}, {'text': 'the part where AI is able to do', 'start': 1800.96, 'duration': 5.579}, {'text': 'generate macro structures for text video', 'start': 1803.12, 'duration': 6.539}, {'text': 'and images for content for content and', 'start': 1806.539, 'duration': 5.64}, {'text': 'very specific micro structure micro', 'start': 1809.659, 'duration': 5.88}, {'text': 'changes for text video and images but', 'start': 1812.179, 'duration': 4.561}, {'text': 'when you look at the whole thing', 'start': 1815.539, 'duration': 3.0}, {'text': 'cohesively something still feels off it', 'start': 1816.74, 'duration': 4.02}, {'text': 'feels often text it feels often images', 'start': 1818.539, 'duration': 4.5}, {'text': \"where ranveer Singh's face will be\", 'start': 1820.76, 'duration': 4.5}, {'text': 'exactly like his face but the dude in', 'start': 1823.039, 'duration': 3.721}, {'text': 'the background will have seven fingers', 'start': 1825.26, 'duration': 4.019}, {'text': 'right same thing in video I can make', 'start': 1826.76, 'duration': 4.62}, {'text': \"Virat kohli's mouth lip sync in a\", 'start': 1829.279, 'duration': 4.321}, {'text': 'different language but some will be', 'start': 1831.38, 'duration': 4.44}, {'text': 'off in the broader broader video like', 'start': 1833.6, 'duration': 4.86}, {'text': \"you know there's a dog inside with the\", 'start': 1835.82, 'duration': 3.9}, {'text': \"images I'll tell you let's say you\", 'start': 1838.46, 'duration': 3.36}, {'text': 'generated a picture of ranveer behind', 'start': 1839.72, 'duration': 3.72}, {'text': \"ranveer there's a guy with seven fingers\", 'start': 1841.82, 'duration': 3.959}, {'text': \"you can discard the image I'll generate\", 'start': 1843.44, 'duration': 3.839}, {'text': 'this hundred times until I find', 'start': 1845.779, 'duration': 3.0}, {'text': \"something one image where there's all\", 'start': 1847.279, 'duration': 2.76}, {'text': 'the fingers are tough to do you can do', 'start': 1848.779, 'duration': 2.341}, {'text': \"that with video you can't do that\", 'start': 1850.039, 'duration': 2.821}, {'text': 'because frame one will have one guy with', 'start': 1851.12, 'duration': 3.12}, {'text': 'five fingers frame two will certainly be', 'start': 1852.86, 'duration': 2.64}, {'text': \"seven fingers and you're done yeah\", 'start': 1854.24, 'duration': 3.24}, {'text': \"you're done for and every time you wanna\", 'start': 1855.5, 'duration': 3.539}, {'text': 'just make that one micro change you have', 'start': 1857.48, 'duration': 3.199}, {'text': 'to regenerate the whole video exactly', 'start': 1859.039, 'duration': 4.081}, {'text': 'only looks different in each one thanks', 'start': 1860.679, 'duration': 4.6}, {'text': 'exactly ah this is the this is a', 'start': 1863.12, 'duration': 4.439}, {'text': \"irritating part in AI but it's just it's\", 'start': 1865.279, 'duration': 5.221}, {'text': \"almost there but not really let's work\", 'start': 1867.559, 'duration': 4.86}, {'text': \"on something okay yeah I'll complain\", 'start': 1870.5, 'duration': 4.32}, {'text': 'about overpowered okay our logo sucks we', 'start': 1872.419, 'duration': 3.48}, {'text': \"don't even have a logo we don't really\", 'start': 1874.82, 'duration': 4.26}, {'text': 'have anything right so the intro thing', 'start': 1875.899, 'duration': 5.52}, {'text': 'was generated with uh mid-journey and', 'start': 1879.08, 'duration': 5.579}, {'text': 'then we some editor animated it uh the', 'start': 1881.419, 'duration': 6.48}, {'text': 'music is from nuclear yeah and by the', 'start': 1884.659, 'duration': 4.201}, {'text': \"way I'll tell you the very interesting\", 'start': 1887.899, 'duration': 3.0}, {'text': 'story of how this happened was sitting', 'start': 1888.86, 'duration': 3.48}, {'text': 'next to me and I was like we need some', 'start': 1890.899, 'duration': 3.541}, {'text': 'intro music and then was just like let', 'start': 1892.34, 'duration': 3.62}, {'text': 'me uh', 'start': 1894.44, 'duration': 4.08}, {'text': \"nuclear and he's like nuclear do you\", 'start': 1895.96, 'duration': 3.699}, {'text': \"have anything that you're not using\", 'start': 1898.52, 'duration': 2.7}, {'text': 'right now can I can I just use it and', 'start': 1899.659, 'duration': 3.601}, {'text': \"nuclear sends them a Google Drive it's\", 'start': 1901.22, 'duration': 3.48}, {'text': 'just like this is all my these are all', 'start': 1903.26, 'duration': 3.0}, {'text': \"the tracks where I I've never touched\", 'start': 1904.7, 'duration': 3.12}, {'text': 'them in the last six months take', 'start': 1906.26, 'duration': 4.22}, {'text': 'anything you want', 'start': 1907.82, 'duration': 2.66}, {'text': \"that's it like yeah it's super cool yeah\", 'start': 1910.72, 'duration': 7.02}, {'text': 'nuclear is my Google llm', 'start': 1913.94, 'duration': 3.8}, {'text': \"music llm so we don't have a logo so\", 'start': 1917.899, 'duration': 4.26}, {'text': \"right now we're going to try and create\", 'start': 1920.779, 'duration': 4.02}, {'text': 'a logo on mid-journey I tested some', 'start': 1922.159, 'duration': 5.52}, {'text': 'stuff out at home I tried to recreate a', 'start': 1924.799, 'duration': 5.341}, {'text': 'logo for my channel and turns out that', 'start': 1927.679, 'duration': 4.261}, {'text': 'if you give very specific instructions', 'start': 1930.14, 'duration': 5.46}, {'text': 'like create Vector art using simple', 'start': 1931.94, 'duration': 6.719}, {'text': 'lines it can actually do a very decent', 'start': 1935.6, 'duration': 4.92}, {'text': \"job of it it doesn't do text very well\", 'start': 1938.659, 'duration': 4.02}, {'text': \"so let's do it\", 'start': 1940.52, 'duration': 6.06}, {'text': \"Let's uh generate okay uh\", 'start': 1942.679, 'duration': 5.88}, {'text': 'robot', 'start': 1946.58, 'duration': 5.699}, {'text': 'sitting in front of a computer', 'start': 1948.559, 'duration': 6.681}, {'text': 'laughing', 'start': 1952.279, 'duration': 2.961}, {'text': 'laughing', 'start': 1955.48, 'duration': 5.199}, {'text': 'Vector art logo', 'start': 1957.159, 'duration': 5.221}, {'text': 'simple lines', 'start': 1960.679, 'duration': 5.0}, {'text': 'graphic design', 'start': 1962.38, 'duration': 3.299}, {'text': 'graphic design', 'start': 1966.02, 'duration': 5.539}, {'text': \"let's do\", 'start': 1968.72, 'duration': 2.839}, {'text': 'uh', 'start': 1975.02, 'duration': 3.48}, {'text': 'robot', 'start': 1976.58, 'duration': 3.719}, {'text': 'what about a stamp', 'start': 1978.5, 'duration': 4.26}, {'text': 'like a retro stamp yeah but with like', 'start': 1980.299, 'duration': 5.041}, {'text': 'futuristic robots Okay because India is', 'start': 1982.76, 'duration': 4.38}, {'text': 'like famous images from India if you', 'start': 1985.34, 'duration': 3.54}, {'text': \"have actually Google it you'll find some\", 'start': 1987.14, 'duration': 7.139}, {'text': 'stamp stamps okay a stamp an old a retro', 'start': 1988.88, 'duration': 7.08}, {'text': 'stamp', 'start': 1994.279, 'duration': 7.26}, {'text': 'style a retro stamp of a robot', 'start': 1995.96, 'duration': 8.84}, {'text': \"in India let's just do this\", 'start': 2001.539, 'duration': 6.381}, {'text': '[Music]', 'start': 2004.8, 'duration': 3.12}, {'text': 'um', 'start': 2007.96, 'duration': 2.059}, {'text': 'a retro spam', 'start': 2010.659, 'duration': 5.161}, {'text': 'of', 'start': 2013.96, 'duration': 4.86}, {'text': 'futuristic', 'start': 2015.82, 'duration': 5.04}, {'text': \"Indian robot let's see what in front of\", 'start': 2018.82, 'duration': 3.66}, {'text': 'Taj Mahal', 'start': 2020.86, 'duration': 4.919}, {'text': 'Taj Mahal is the intro no hmm okay so it', 'start': 2022.48, 'duration': 6.0}, {'text': 'created these characters these are', 'start': 2025.779, 'duration': 4.801}, {'text': 'boring this is really cool', 'start': 2028.48, 'duration': 4.319}, {'text': \"let's see let's see what the evoke like\", 'start': 2030.58, 'duration': 3.54}, {'text': 'some sort of', 'start': 2032.799, 'duration': 3.841}, {'text': 'happiness really cute', 'start': 2034.12, 'duration': 3.779}, {'text': 'what do you think', 'start': 2036.64, 'duration': 3.6}, {'text': \"it's cute I like the style of a stamp\", 'start': 2037.899, 'duration': 3.721}, {'text': 'though', 'start': 2040.24, 'duration': 3.659}, {'text': \"I like the style of a stamp there's just\", 'start': 2041.62, 'duration': 4.26}, {'text': 'something nice about blending the past', 'start': 2043.899, 'duration': 4.321}, {'text': 'with the future yeah but instead of', 'start': 2045.88, 'duration': 4.2}, {'text': 'maybe just a robot what if we did a', 'start': 2048.22, 'duration': 4.8}, {'text': 'robot and a human holding hands holding', 'start': 2050.08, 'duration': 5.579}, {'text': 'hands or like a humanoid a cyborg a', 'start': 2053.02, 'duration': 4.5}, {'text': \"cyborg I love this stamp yeah it's a\", 'start': 2055.659, 'duration': 4.68}, {'text': \"cool stamp okay try that again let's try\", 'start': 2057.52, 'duration': 6.72}, {'text': 'imagine a retro', 'start': 2060.339, 'duration': 9.121}, {'text': 'stamp of a robot and a human holding', 'start': 2064.24, 'duration': 6.619}, {'text': 'hands', 'start': 2069.46, 'duration': 6.179}, {'text': 'retro stamp of a smiling robot showing', 'start': 2070.859, 'duration': 6.641}, {'text': 'the thumbs up', 'start': 2075.639, 'duration': 5.421}, {'text': 'or did I say a retro robot', 'start': 2077.5, 'duration': 3.56}, {'text': 'or retro stamp of a robot of a humanoid', 'start': 2082.179, 'duration': 8.641}, {'text': 'dancing', 'start': 2089.26, 'duration': 5.419}, {'text': 'stamp style Indian', 'start': 2090.82, 'duration': 3.859}, {'text': \"oh I love the first one it's scary but I\", 'start': 2095.04, 'duration': 6.1}, {'text': \"like it's like depressed and scary but I\", 'start': 2098.74, 'duration': 4.14}, {'text': 'love it bro the second one is nice right', 'start': 2101.14, 'duration': 4.199}, {'text': 'the second one is happier I like the', 'start': 2102.88, 'duration': 5.16}, {'text': \"first one it's it's angry or sarcastic\", 'start': 2105.339, 'duration': 4.801}, {'text': 'or whatever yeah dude I love the first', 'start': 2108.04, 'duration': 3.48}, {'text': 'one', 'start': 2110.14, 'duration': 3.3}, {'text': 'do I really really really like the first', 'start': 2111.52, 'duration': 3.059}, {'text': 'one', 'start': 2113.44, 'duration': 2.94}, {'text': 'I like the third one also the third one', 'start': 2114.579, 'duration': 3.121}, {'text': 'was so nice', 'start': 2116.38, 'duration': 3.78}, {'text': 'this is the robot dancing do I really', 'start': 2117.7, 'duration': 5.28}, {'text': 'like the first one it just eventually', 'start': 2120.16, 'duration': 4.98}, {'text': \"you'll have haters and it's a great\", 'start': 2122.98, 'duration': 4.32}, {'text': 'thing to show them', 'start': 2125.14, 'duration': 3.06}, {'text': \"let's\", 'start': 2127.3, 'duration': 2.22}, {'text': 'look at the prompts for the one that you', 'start': 2128.2, 'duration': 3.72}, {'text': 'like a retro style what did you say all', 'start': 2129.52, 'duration': 4.74}, {'text': 'right smiling robot showing the thumbs', 'start': 2131.92, 'duration': 5.659}, {'text': 'up can we do the same thing thumbs down', 'start': 2134.26, 'duration': 3.319}, {'text': 'no just just copy that copy that uh this', 'start': 2138.099, 'duration': 4.141}, {'text': 'thing the first one that this one not', 'start': 2140.68, 'duration': 3.54}, {'text': 'the first one just copy that prompt', 'start': 2142.24, 'duration': 3.599}, {'text': \"let's make it\", 'start': 2144.22, 'duration': 3.18}, {'text': \"let's make it slightly happier that\", 'start': 2145.839, 'duration': 5.941}, {'text': 'robot retro stamp or retro detailed do', 'start': 2147.4, 'duration': 6.24}, {'text': \"you wanna try niji on this let's see\", 'start': 2151.78, 'duration': 4.38}, {'text': 'what happens yeah stamp of a smiling', 'start': 2153.64, 'duration': 4.62}, {'text': 'robot dude I really like the first one', 'start': 2156.16, 'duration': 6.26}, {'text': 'laughing robot showing the thumbs up', 'start': 2158.26, 'duration': 4.16}, {'text': 'dude that thing is so good the niji', 'start': 2163.48, 'duration': 5.22}, {'text': \"version doesn't work for a logo yeah go\", 'start': 2165.82, 'duration': 4.2}, {'text': 'to the one that you like and just click', 'start': 2168.7, 'duration': 4.399}, {'text': 'on variations no', 'start': 2170.02, 'duration': 3.079}, {'text': 'you wanna add or change anything oh you', 'start': 2173.26, 'duration': 4.98}, {'text': 'can Now remix prompt yeah', 'start': 2175.72, 'duration': 5.28}, {'text': \"but it won't be perfect\", 'start': 2178.24, 'duration': 6.54}, {'text': 'of smiling robots showing the thumbs up', 'start': 2181.0, 'duration': 7.76}, {'text': 'India in India in the background', 'start': 2184.78, 'duration': 3.98}, {'text': 'no no no do Taj Mahal', 'start': 2188.92, 'duration': 4.74}, {'text': 'Taj Mahal', 'start': 2191.74, 'duration': 4.879}, {'text': 'in the background', 'start': 2193.66, 'duration': 2.959}, {'text': \"so this is the niji one I like this it's\", 'start': 2197.44, 'duration': 6.3}, {'text': 'decent this is nice see you asked for', 'start': 2200.5, 'duration': 5.16}, {'text': 'variant so that first one none of these', 'start': 2203.74, 'duration': 3.78}, {'text': 'look like that that one now the first', 'start': 2205.66, 'duration': 4.98}, {'text': \"one in this looks nice it's happier it's\", 'start': 2207.52, 'duration': 4.98}, {'text': 'the same robot but it looks happier no', 'start': 2210.64, 'duration': 3.3}, {'text': \"the background's changed that's why I\", 'start': 2212.5, 'duration': 2.76}, {'text': \"said you can't you don't have that level\", 'start': 2213.94, 'duration': 3.179}, {'text': 'of fidelity like this one looks', 'start': 2215.26, 'duration': 4.079}, {'text': 'aggressive I like the aggression', 'start': 2217.119, 'duration': 4.5}, {'text': \"it looks happy but also depressed you're\", 'start': 2219.339, 'duration': 5.121}, {'text': 'a weirdo', 'start': 2221.619, 'duration': 2.841}, {'text': 'ah there you go', 'start': 2224.92, 'duration': 2.9}, {'text': 'the third one I like the third one', 'start': 2228.22, 'duration': 4.44}, {'text': \"it's not giving you Taj Mahal though\", 'start': 2230.859, 'duration': 4.5}, {'text': \"yeah but yeah it's not it won't give you\", 'start': 2232.66, 'duration': 4.14}, {'text': 'exactly what you want but after', 'start': 2235.359, 'duration': 3.781}, {'text': 'tinkering around we can probably like', 'start': 2236.8, 'duration': 4.14}, {'text': 'right now or you can edit right you can', 'start': 2239.14, 'duration': 4.26}, {'text': \"go and generate a fill I mean it's a\", 'start': 2240.94, 'duration': 4.26}, {'text': \"process but because you're in\", 'start': 2243.4, 'duration': 3.48}, {'text': \"mid-journey and we don't care so much\", 'start': 2245.2, 'duration': 3.18}, {'text': 'about Fidelity you can generate like 50', 'start': 2246.88, 'duration': 3.66}, {'text': 'variants of this right now our packaging', 'start': 2248.38, 'duration': 4.14}, {'text': 'is like a futuristic Taj Mahal and then', 'start': 2250.54, 'duration': 3.84}, {'text': 'the camera Zooms in with like cars and', 'start': 2252.52, 'duration': 3.78}, {'text': 'all burning around where it can zoom in', 'start': 2254.38, 'duration': 3.6}, {'text': 'and it can at the end of it they can', 'start': 2256.3, 'duration': 3.72}, {'text': \"just be a robot that's doing this and it\", 'start': 2257.98, 'duration': 4.2}, {'text': 'says overpowered comes behind the robot', 'start': 2260.02, 'duration': 4.579}, {'text': \"or about the robot that's what we can do\", 'start': 2262.18, 'duration': 5.76}, {'text': 'uh but I really like this robot', 'start': 2264.599, 'duration': 5.26}, {'text': 'something perfect about it let me just', 'start': 2267.94, 'duration': 5.28}, {'text': 'generate variants without remixing any', 'start': 2269.859, 'duration': 5.281}, {'text': \"prompts you don't like this robot so\", 'start': 2273.22, 'duration': 5.04}, {'text': \"nice it's aggressive\", 'start': 2275.14, 'duration': 4.92}, {'text': 'the fourth one here is also aggressive', 'start': 2278.26, 'duration': 5.04}, {'text': \"yeah it's evil bro the fourth one\", 'start': 2280.06, 'duration': 5.16}, {'text': 'Terminator', 'start': 2283.3, 'duration': 3.84}, {'text': 'what if they change just do a variant of', 'start': 2285.22, 'duration': 3.24}, {'text': \"the first one let's put the word cute\", 'start': 2287.14, 'duration': 4.62}, {'text': \"maybe we'll change something you know\", 'start': 2288.46, 'duration': 4.2}, {'text': 'you know you know you know what you', 'start': 2291.76, 'duration': 1.62}, {'text': 'should do you should just say', 'start': 2292.66, 'duration': 2.64}, {'text': 'minimalistic logo comma', 'start': 2293.38, 'duration': 3.18}, {'text': 'dribble', 'start': 2295.3, 'duration': 4.14}, {'text': 'minimistic logo commodrable', 'start': 2296.56, 'duration': 6.48}, {'text': 'now type whatever you want yeah robots', 'start': 2299.44, 'duration': 6.84}, {'text': 'with a thought bubble', 'start': 2303.04, 'duration': 6.42}, {'text': \"this one is nice no yeah that one's cool\", 'start': 2306.28, 'duration': 5.1}, {'text': \"yeah everyone's cool let's see if that\", 'start': 2309.46, 'duration': 4.92}, {'text': 'just scale it up and see', 'start': 2311.38, 'duration': 5.16}, {'text': \"that one's very nice by the way this is\", 'start': 2314.38, 'duration': 3.959}, {'text': 'a great example for those watching of', 'start': 2316.54, 'duration': 4.14}, {'text': 'how customers end users end up using', 'start': 2318.339, 'duration': 4.801}, {'text': 'this we want something else we got this', 'start': 2320.68, 'duration': 3.96}, {'text': \"like this is also nice let's roll with\", 'start': 2323.14, 'duration': 3.36}, {'text': 'this and this is a common occurrence', 'start': 2324.64, 'duration': 3.959}, {'text': 'both in images as well as with text yeah', 'start': 2326.5, 'duration': 3.839}, {'text': \"with code it's not like this for some\", 'start': 2328.599, 'duration': 3.421}, {'text': \"reason and share with video right it's\", 'start': 2330.339, 'duration': 2.941}, {'text': 'like', 'start': 2332.02, 'duration': 3.12}, {'text': 'you want specific control', 'start': 2333.28, 'duration': 4.819}, {'text': 'robot', 'start': 2335.14, 'duration': 4.58}, {'text': 'minimalistics', 'start': 2338.099, 'duration': 5.321}, {'text': 'I like this I like this a lot yeah I', 'start': 2339.72, 'duration': 4.899}, {'text': 'just put overpower below this and I', 'start': 2343.42, 'duration': 3.0}, {'text': \"think this is nice this is cool it's got\", 'start': 2344.619, 'duration': 5.161}, {'text': \"six fingers oh uh but that's okay I\", 'start': 2346.42, 'duration': 4.679}, {'text': 'think we should keep the sixth finger', 'start': 2349.78, 'duration': 3.54}, {'text': 'yeah just as an homage to', 'start': 2351.099, 'duration': 4.74}, {'text': 'the early days of AI yeah early days of', 'start': 2353.32, 'duration': 3.36}, {'text': 'AI', 'start': 2355.839, 'duration': 3.601}, {'text': 'uh yeah six fingered robot is kind of', 'start': 2356.68, 'duration': 4.98}, {'text': 'symbolic actually yeah of early days of', 'start': 2359.44, 'duration': 4.26}, {'text': 'AI anyway this was our attempt at trying', 'start': 2361.66, 'duration': 4.86}, {'text': 'to make something uh you guys should try', 'start': 2363.7, 'duration': 5.58}, {'text': 'making a logo for whatever business or', 'start': 2366.52, 'duration': 4.8}, {'text': 'initiative that you guys are up to or if', 'start': 2369.28, 'duration': 3.12}, {'text': 'you want to make something for', 'start': 2371.32, 'duration': 3.66}, {'text': \"overpowered we're gonna play the intro\", 'start': 2372.4, 'duration': 4.86}, {'text': 'but the intro will end with zooming into', 'start': 2374.98, 'duration': 5.34}, {'text': 'the Taj Mahal with nothing but blank at', 'start': 2377.26, 'duration': 4.98}, {'text': 'the end of it you guys can fill in', 'start': 2380.32, 'duration': 4.32}, {'text': 'create a new logo animate it whatever', 'start': 2382.24, 'duration': 4.379}, {'text': 'you want just go crazy and if someone', 'start': 2384.64, 'duration': 3.66}, {'text': \"makes something really cool we'll\", 'start': 2386.619, 'duration': 4.321}, {'text': \"probably adopt it and uh you'll get paid\", 'start': 2388.3, 'duration': 4.44}, {'text': 'for it sorry for the random interjection', 'start': 2390.94, 'duration': 3.6}, {'text': 'in the middle of the episode way more of', 'start': 2392.74, 'duration': 4.2}, {'text': 'you watch our episodes than the number', 'start': 2394.54, 'duration': 4.38}, {'text': 'of you who have subscribed just', 'start': 2396.94, 'duration': 4.56}, {'text': 'subscribe and we will give you a gift I', 'start': 2398.92, 'duration': 3.9}, {'text': \"promise you if you subscribe you'll get\", 'start': 2401.5, 'duration': 2.76}, {'text': 'a digital gift', 'start': 2402.82, 'duration': 3.84}, {'text': 'short but just subscribe will show up in', 'start': 2404.26, 'duration': 4.079}, {'text': 'a timeline once in a while keep up with', 'start': 2406.66, 'duration': 4.5}, {'text': 'the world of AI with us back to the', 'start': 2408.339, 'duration': 6.0}, {'text': 'episode I read that mid Journey has had', 'start': 2411.16, 'duration': 6.24}, {'text': 'an update maybe a month ago where they', 'start': 2414.339, 'duration': 5.941}, {'text': 'now do product shots really well okay so', 'start': 2417.4, 'duration': 5.88}, {'text': 'product short', 'start': 2420.28, 'duration': 6.66}, {'text': 'uh product shot of', 'start': 2423.28, 'duration': 7.22}, {'text': 'coffee packets', 'start': 2426.94, 'duration': 7.26}, {'text': \"minimalistic black logo let's do this\", 'start': 2430.5, 'duration': 7.56}, {'text': 'coffee so brown or brown coffee packets', 'start': 2434.2, 'duration': 6.78}, {'text': 'minimalistic black logo', 'start': 2438.06, 'duration': 6.6}, {'text': 'of a company called', 'start': 2440.98, 'duration': 3.68}, {'text': 'uh roast', 'start': 2444.76, 'duration': 6.78}, {'text': \"House Coffee so check this out okay it's\", 'start': 2447.339, 'duration': 7.141}, {'text': \"it it's done product shots of\", 'start': 2451.54, 'duration': 5.579}, {'text': 'this coffee brand', 'start': 2454.48, 'duration': 4.56}, {'text': 'this gives you such a killer idea of', 'start': 2457.119, 'duration': 3.601}, {'text': 'what your brand will look and feel like', 'start': 2459.04, 'duration': 3.72}, {'text': \"when it's on a product so great mood\", 'start': 2460.72, 'duration': 3.84}, {'text': 'board great mood board and you can do', 'start': 2462.76, 'duration': 4.319}, {'text': 'this for other stuff also product shots', 'start': 2464.56, 'duration': 5.1}, {'text': 'of stationery', 'start': 2467.079, 'duration': 6.061}, {'text': 'for a brand called cutify', 'start': 2469.66, 'duration': 5.82}, {'text': 'station or cutify', 'start': 2473.14, 'duration': 6.42}, {'text': 'stationery mascot is a small Hardware', 'start': 2475.48, 'duration': 6.3}, {'text': 'you want to give like the rough colors', 'start': 2479.56, 'duration': 5.58}, {'text': 'right cutify stationery colorful', 'start': 2481.78, 'duration': 6.6}, {'text': 'honored table Studio lighting', 'start': 2485.14, 'duration': 5.04}, {'text': 'share these images', 'start': 2488.38, 'duration': 4.32}, {'text': 'dude this looks professional as heck you', 'start': 2490.18, 'duration': 3.78}, {'text': 'can put this on a website almost', 'start': 2492.7, 'duration': 4.02}, {'text': 'immediately with some minor editing you', 'start': 2493.96, 'duration': 4.379}, {'text': 'can put your logo in and you can create', 'start': 2496.72, 'duration': 4.02}, {'text': 'a website in no time yeah and you can', 'start': 2498.339, 'duration': 4.381}, {'text': 'literally do variations of the second', 'start': 2500.74, 'duration': 3.599}, {'text': 'image try variation or second image', 'start': 2502.72, 'duration': 4.68}, {'text': \"it'll probably give you similar but on\", 'start': 2504.339, 'duration': 4.621}, {'text': 'like a different table', 'start': 2507.4, 'duration': 3.12}, {'text': 'you know this is interesting now when', 'start': 2508.96, 'duration': 3.18}, {'text': 'you click on variations you get to', 'start': 2510.52, 'duration': 4.5}, {'text': \"change something in the prompt but it's\", 'start': 2512.14, 'duration': 4.74}, {'text': \"not that good like it won't give you\", 'start': 2515.02, 'duration': 3.96}, {'text': \"exactly what you want you're better off\", 'start': 2516.88, 'duration': 3.84}, {'text': \"regenerating a new image because it'll\", 'start': 2518.98, 'duration': 5.22}, {'text': 'the base image influences too strong by', 'start': 2520.72, 'duration': 4.44}, {'text': \"the way there's something called chaos\", 'start': 2524.2, 'duration': 4.5}, {'text': 'in mid-journey did you do the same thing', 'start': 2525.16, 'duration': 5.82}, {'text': 'same thing', 'start': 2528.7, 'duration': 5.7}, {'text': 'okay in the ending type dash dash C', 'start': 2530.98, 'duration': 6.48}, {'text': '75 brown color', 'start': 2534.4, 'duration': 6.08}, {'text': 'brand name', 'start': 2537.46, 'duration': 3.02}, {'text': 'now dash dash C', 'start': 2541.06, 'duration': 5.94}, {'text': 'space 75.', 'start': 2543.78, 'duration': 5.559}, {'text': 'what does this do', 'start': 2547.0, 'duration': 5.04}, {'text': 'between every generation it increases', 'start': 2549.339, 'duration': 4.981}, {'text': 'the randomness of the Next Generation', 'start': 2552.04, 'duration': 6.539}, {'text': 'okay so it gives you more varied outputs', 'start': 2554.32, 'duration': 5.7}, {'text': \"and you're able to pick from one of\", 'start': 2558.579, 'duration': 4.201}, {'text': 'those outputs but since we are not', 'start': 2560.02, 'duration': 5.7}, {'text': 'optimizing for Perfection with this', 'start': 2562.78, 'duration': 5.819}, {'text': 'generate a thousand or hundred pick one', 'start': 2565.72, 'duration': 4.859}, {'text': \"we like I'll roll with this that's what\", 'start': 2568.599, 'duration': 3.841}, {'text': 'most people end up doing I really like', 'start': 2570.579, 'duration': 3.181}, {'text': 'this but you know what this output is', 'start': 2572.44, 'duration': 3.6}, {'text': 'also decentral role of this', 'start': 2573.76, 'duration': 4.14}, {'text': 'consumer Behavior here is different this', 'start': 2576.04, 'duration': 4.02}, {'text': 'is chaos High chaos oh this is high', 'start': 2577.9, 'duration': 4.14}, {'text': \"chaos okay yeah so the it's more\", 'start': 2580.06, 'duration': 5.58}, {'text': 'variable yeah in its Generations yes', 'start': 2582.04, 'duration': 6.18}, {'text': \"this one's really nice yeah that was\", 'start': 2585.64, 'duration': 5.0}, {'text': 'really nice', 'start': 2588.22, 'duration': 2.42}, {'text': \"do this damn good yeah holy that's\", 'start': 2590.74, 'duration': 6.0}, {'text': 'so good I love the colors on this yeah', 'start': 2593.619, 'duration': 5.581}, {'text': \"I'd buy the out of it so mid\", 'start': 2596.74, 'duration': 4.379}, {'text': 'Journey combined with Photoshop now is', 'start': 2599.2, 'duration': 4.32}, {'text': 'deadly like it can you can output way', 'start': 2601.119, 'duration': 4.081}, {'text': 'quicker like if I was a client and I was', 'start': 2603.52, 'duration': 5.16}, {'text': 'briefing any designer or packaging', 'start': 2605.2, 'duration': 4.619}, {'text': 'person', 'start': 2608.68, 'duration': 3.899}, {'text': 'I would just spend like an hour on my', 'start': 2609.819, 'duration': 6.3}, {'text': 'journey it just makes my idea so clear', 'start': 2612.579, 'duration': 6.78}, {'text': \"It's Gonna Save everyone time yeah the\", 'start': 2616.119, 'duration': 4.861}, {'text': 'designer knows exactly what you want and', 'start': 2619.359, 'duration': 3.121}, {'text': 'they just need to make minor tinkering', 'start': 2620.98, 'duration': 3.66}, {'text': \"which also means that they're spending\", 'start': 2622.48, 'duration': 3.54}, {'text': \"less time they're spending less time\", 'start': 2624.64, 'duration': 4.02}, {'text': 'probably also effort going into', 'start': 2626.02, 'duration': 5.16}, {'text': 'finalizing the design is a lot lower so', 'start': 2628.66, 'duration': 4.98}, {'text': 'do you think that results in lower pay', 'start': 2631.18, 'duration': 5.399}, {'text': 'yeah but higher volume yes higher volume', 'start': 2633.64, 'duration': 4.38}, {'text': \"that's why I said it's all about the\", 'start': 2636.579, 'duration': 3.361}, {'text': \"brand if you're a designer dude top one\", 'start': 2638.02, 'duration': 3.24}, {'text': 'percent of every field is going to exist', 'start': 2639.94, 'duration': 2.34}, {'text': \"they're basically going to be making\", 'start': 2641.26, 'duration': 3.72}, {'text': 'edits on top of AI in every field okay', 'start': 2642.28, 'duration': 4.74}, {'text': 'the thing is', 'start': 2644.98, 'duration': 4.379}, {'text': \"if you have a big brand name you're\", 'start': 2647.02, 'duration': 4.02}, {'text': 'probably getting lower pay but you have', 'start': 2649.359, 'duration': 3.421}, {'text': 'a thousand clients correct and it is', 'start': 2651.04, 'duration': 2.88}, {'text': 'possible for you to get a thousand price', 'start': 2652.78, 'duration': 2.819}, {'text': \"right that's what tech companies work on\", 'start': 2653.92, 'duration': 2.82}, {'text': \"the fact that they're working with a lot\", 'start': 2655.599, 'duration': 3.121}, {'text': 'of clients at the same time so if you', 'start': 2656.74, 'duration': 3.9}, {'text': 'were a designer would you tell your', 'start': 2658.72, 'duration': 5.16}, {'text': 'clients to get mid-journey so their', 'start': 2660.64, 'duration': 5.34}, {'text': 'briefs to you becomes more clear they', 'start': 2663.88, 'duration': 3.78}, {'text': 'have a better idea of what they like', 'start': 2665.98, 'duration': 3.42}, {'text': 'before they come to you this is an', 'start': 2667.66, 'duration': 3.5}, {'text': 'incentive alignment problem', 'start': 2669.4, 'duration': 4.199}, {'text': \"you don't have the incentive to show the\", 'start': 2671.16, 'duration': 5.08}, {'text': \"clients my journey in fact I've received\", 'start': 2673.599, 'duration': 4.801}, {'text': 'some DMS saying why are you doing', 'start': 2676.24, 'duration': 3.78}, {'text': 'overpower why are you showing why are', 'start': 2678.4, 'duration': 3.06}, {'text': 'you revealing the secrets to other', 'start': 2680.02, 'duration': 3.599}, {'text': \"people but come on it's not going to\", 'start': 2681.46, 'duration': 4.139}, {'text': 'stay a secret for much longer right I', 'start': 2683.619, 'duration': 4.261}, {'text': 'would say move to a task where where', 'start': 2685.599, 'duration': 5.101}, {'text': \"it's just clients will need to edit will\", 'start': 2687.88, 'duration': 4.26}, {'text': 'absolutely need to edit and the edit', 'start': 2690.7, 'duration': 3.06}, {'text': 'takes time I would say pivot to a job', 'start': 2692.14, 'duration': 3.3}, {'text': \"like that don't do thumbnail art okay\", 'start': 2693.76, 'duration': 5.7}, {'text': \"don't do static One-Shot images uh mid\", 'start': 2695.44, 'duration': 5.1}, {'text': 'Journey one more place mid Journey', 'start': 2699.46, 'duration': 2.82}, {'text': 'struggles with is image to image', 'start': 2700.54, 'duration': 3.6}, {'text': 'consistency again same thing right so if', 'start': 2702.28, 'duration': 3.6}, {'text': \"a client says and we've tried this\", 'start': 2704.14, 'duration': 2.82}, {'text': \"before we're making a game with Virginia\", 'start': 2705.88, 'duration': 2.4}, {'text': 'like we need these five different', 'start': 2706.96, 'duration': 3.359}, {'text': 'screens right all screens will be', 'start': 2708.28, 'duration': 3.42}, {'text': 'different even if you feed the first', 'start': 2710.319, 'duration': 2.461}, {'text': 'screen as a reference to the second', 'start': 2711.7, 'duration': 3.6}, {'text': 'screen it just looks different so we had', 'start': 2712.78, 'duration': 4.14}, {'text': 'to generate like in some cases like two', 'start': 2715.3, 'duration': 2.76}, {'text': 'thousand three thousand variants and be', 'start': 2716.92, 'duration': 2.64}, {'text': 'like this is the perfect one because we', 'start': 2718.06, 'duration': 2.7}, {'text': \"obviously don't have the skill to go\", 'start': 2719.56, 'duration': 3.36}, {'text': 'into the image or make a brand new image', 'start': 2720.76, 'duration': 3.48}, {'text': 'and be like this has to be consistent in', 'start': 2722.92, 'duration': 2.52}, {'text': 'the last one because my journey produces', 'start': 2724.24, 'duration': 3.48}, {'text': \"such great outputs you can't match with\", 'start': 2725.44, 'duration': 4.139}, {'text': \"the next screen let's say the lobby\", 'start': 2727.72, 'duration': 3.899}, {'text': 'screen will not match the home screen or', 'start': 2729.579, 'duration': 3.54}, {'text': 'whatever right so given everything that', 'start': 2731.619, 'duration': 3.181}, {'text': 'Journey can now do mid Journey can do', 'start': 2733.119, 'duration': 4.621}, {'text': 'super sexy photographs mid Germany can', 'start': 2734.8, 'duration': 5.039}, {'text': 'now do super sexy illustrations mid', 'start': 2737.74, 'duration': 4.68}, {'text': 'Journey can now do logos uh mid Journey', 'start': 2739.839, 'duration': 6.181}, {'text': 'can now uh do all kinds of graphic', 'start': 2742.42, 'duration': 5.699}, {'text': \"design so if you're a graphic designer\", 'start': 2746.02, 'duration': 5.46}, {'text': 'photographer an illustrator what is a', 'start': 2748.119, 'duration': 7.021}, {'text': 'way in which you can make more Revenue', 'start': 2751.48, 'duration': 5.22}, {'text': 'uh', 'start': 2755.14, 'duration': 3.24}, {'text': \"let's come to the revenue piece in a bit\", 'start': 2756.7, 'duration': 4.5}, {'text': \"I'll tell you the simple algorithm okay\", 'start': 2758.38, 'duration': 4.739}, {'text': \"it's not fully fleshed out I've been\", 'start': 2761.2, 'duration': 2.94}, {'text': \"thinking about this for a while but it's\", 'start': 2763.119, 'duration': 3.121}, {'text': 'not fully fleshed out think of what', 'start': 2764.14, 'duration': 5.4}, {'text': 'requires full brand kits because frame', 'start': 2766.24, 'duration': 5.4}, {'text': \"to frame consistency matters you can't\", 'start': 2769.54, 'duration': 3.72}, {'text': 'have a brand where five different things', 'start': 2771.64, 'duration': 3.54}, {'text': \"look they're all cool but they don't\", 'start': 2773.26, 'duration': 3.24}, {'text': 'match each other', 'start': 2775.18, 'duration': 3.3}, {'text': 'those pieces are where you can win', 'start': 2776.5, 'duration': 3.54}, {'text': 'because your first seed will be', 'start': 2778.48, 'duration': 3.0}, {'text': \"generated by mid Journey let's say one\", 'start': 2780.04, 'duration': 2.819}, {'text': 'of those images and you build the rest', 'start': 2781.48, 'duration': 3.42}, {'text': 'of the brand around that one image', 'start': 2782.859, 'duration': 3.901}, {'text': 'that is why thumbnail artists are a', 'start': 2784.9, 'duration': 3.179}, {'text': \"little bit shaky because you're doing\", 'start': 2786.76, 'duration': 3.42}, {'text': \"one image and you're done there's no\", 'start': 2788.079, 'duration': 4.141}, {'text': 'need for one thumbnail to match another', 'start': 2790.18, 'duration': 3.179}, {'text': \"thumbnail you see anyone's YouTube\", 'start': 2792.22, 'duration': 2.22}, {'text': 'channel all their thumbnails look', 'start': 2793.359, 'duration': 3.48}, {'text': 'different right and image to image is', 'start': 2794.44, 'duration': 4.32}, {'text': 'decent there the minute you have to do', 'start': 2796.839, 'duration': 3.181}, {'text': 'an entire brand kit for a company', 'start': 2798.76, 'duration': 3.72}, {'text': 'landing page this that whatever booklet', 'start': 2800.02, 'duration': 4.799}, {'text': 'and all of them have to match unless', 'start': 2802.48, 'duration': 3.66}, {'text': \"they're all matching the sense that you\", 'start': 2804.819, 'duration': 2.341}, {'text': \"have one image and you're just sticking\", 'start': 2806.14, 'duration': 2.04}, {'text': \"on top of the booklet let's say the\", 'start': 2807.16, 'duration': 2.82}, {'text': 'booklet has to match the entire theme of', 'start': 2808.18, 'duration': 4.74}, {'text': 'the other stuff then I think you have a', 'start': 2809.98, 'duration': 4.859}, {'text': 'good competitive so check this image out', 'start': 2812.92, 'duration': 5.22}, {'text': 'okay this is for a packaging of a coffee', 'start': 2814.839, 'duration': 5.401}, {'text': \"company like I'll show you this problem\", 'start': 2818.14, 'duration': 4.439}, {'text': 'in real time okay let me upscale the', 'start': 2820.24, 'duration': 4.74}, {'text': 'third one okay we really like the third', 'start': 2822.579, 'duration': 3.661}, {'text': \"one we really like the software I'm\", 'start': 2824.98, 'duration': 2.22}, {'text': 'going to show you the problem live', 'start': 2826.24, 'duration': 2.099}, {'text': 'because this is an opportunity for you', 'start': 2827.2, 'duration': 2.52}, {'text': 'and if you listen carefully there is an', 'start': 2828.339, 'duration': 2.461}, {'text': 'easy way you can actually make a lot of', 'start': 2829.72, 'duration': 3.119}, {'text': 'money doing just design okay you have', 'start': 2830.8, 'duration': 3.36}, {'text': \"this image now I'll show you the problem\", 'start': 2832.839, 'duration': 3.841}, {'text': \"okay I'm gonna copy this image you can\", 'start': 2834.16, 'duration': 3.959}, {'text': 'do right click', 'start': 2836.68, 'duration': 4.679}, {'text': 'copy link do slash imagine', 'start': 2838.119, 'duration': 6.361}, {'text': 'paste paste it okay now you have this is', 'start': 2841.359, 'duration': 6.301}, {'text': 'a reference image rest space now say you', 'start': 2844.48, 'duration': 4.98}, {'text': 'want this or do you want a landing page', 'start': 2847.66, 'duration': 3.36}, {'text': 'of this or coffee table book coffee', 'start': 2849.46, 'duration': 5.52}, {'text': 'table book turn this into a coffee table', 'start': 2851.02, 'duration': 5.64}, {'text': 'book', 'start': 2854.98, 'duration': 4.26}, {'text': 'book', 'start': 2856.66, 'duration': 4.919}, {'text': \"book no it's fine it's fine Studio\", 'start': 2859.24, 'duration': 6.24}, {'text': 'lighting or uh on top of a coffee table', 'start': 2861.579, 'duration': 6.0}, {'text': 'and I call this Nuance right when you', 'start': 2865.48, 'duration': 3.18}, {'text': 'played with these tools for a long', 'start': 2867.579, 'duration': 2.28}, {'text': 'enough time you figure out where the', 'start': 2868.66, 'duration': 3.12}, {'text': 'opportunity is which is why everyone', 'start': 2869.859, 'duration': 3.96}, {'text': 'should play with AI there are gaps and', 'start': 2871.78, 'duration': 3.24}, {'text': 'those gaps are where the money will be', 'start': 2873.819, 'duration': 2.101}, {'text': 'made', 'start': 2875.02, 'duration': 1.86}, {'text': 'okay', 'start': 2875.92, 'duration': 4.74}, {'text': \"now let's watch this no open this in a\", 'start': 2876.88, 'duration': 4.979}, {'text': 'new tab', 'start': 2880.66, 'duration': 4.74}, {'text': \"I'm going to open this in a new tab\", 'start': 2881.859, 'duration': 4.98}, {'text': 'okay', 'start': 2885.4, 'duration': 4.34}, {'text': 'does it match', 'start': 2886.839, 'duration': 2.901}, {'text': 'not entirely no this is what I mean', 'start': 2890.26, 'duration': 4.44}, {'text': 'frame to frame consistency', 'start': 2892.24, 'duration': 5.099}, {'text': 'is poor so the question you have to ask', 'start': 2894.7, 'duration': 4.86}, {'text': 'yourself is how do I get deals that', 'start': 2897.339, 'duration': 5.161}, {'text': 'require me to build the entire blanket', 'start': 2899.56, 'duration': 4.92}, {'text': 'because you some some people lazy people', 'start': 2902.5, 'duration': 4.74}, {'text': 'just like crop this out and then just', 'start': 2904.48, 'duration': 4.32}, {'text': \"stick it on a book that's also possible\", 'start': 2907.24, 'duration': 2.96}, {'text': 'right if you take a front shot of this', 'start': 2908.8, 'duration': 4.62}, {'text': 'but most people want frame to frame', 'start': 2910.2, 'duration': 4.659}, {'text': 'consistency and this is why video', 'start': 2913.42, 'duration': 2.88}, {'text': 'struggles this is why we chose video', 'start': 2914.859, 'duration': 3.48}, {'text': \"editing as a field right because it's\", 'start': 2916.3, 'duration': 3.84}, {'text': 'just every frame is going to look', 'start': 2918.339, 'duration': 3.661}, {'text': 'different so if I were to sum it up if I', 'start': 2920.14, 'duration': 3.54}, {'text': 'was a designer I would use mid-journey', 'start': 2922.0, 'duration': 5.579}, {'text': 'to truly identify what the client likes', 'start': 2923.68, 'duration': 6.179}, {'text': 'and then my skills will be needed to', 'start': 2927.579, 'duration': 4.681}, {'text': 'turn it into a consistent brand across X', 'start': 2929.859, 'duration': 4.321}, {'text': 'number of images so easy way to do it', 'start': 2932.26, 'duration': 3.66}, {'text': 'right easy algorithm like I said', 'start': 2934.18, 'duration': 4.679}, {'text': 'find any sort of design work that', 'start': 2935.92, 'duration': 4.26}, {'text': \"doesn't require to just generate one\", 'start': 2938.859, 'duration': 3.421}, {'text': 'image because there you will have', 'start': 2940.18, 'duration': 3.72}, {'text': 'competition right with mid journey and', 'start': 2942.28, 'duration': 4.14}, {'text': 'if I was a client I would not waste a', 'start': 2943.9, 'duration': 5.1}, {'text': \"designer's Time by giving vague briefs\", 'start': 2946.42, 'duration': 4.32}, {'text': 'which is what a lot of work is right now', 'start': 2949.0, 'duration': 3.06}, {'text': 'the client will send you this the client', 'start': 2950.74, 'duration': 3.74}, {'text': 'will be like', 'start': 2952.06, 'duration': 2.42}, {'text': 'options', 'start': 2955.14, 'duration': 3.0}, {'text': 'whatever yeah so my journey can actually', 'start': 2960.599, 'duration': 4.901}, {'text': 'help you just do a lot more work in the', 'start': 2962.859, 'duration': 4.441}, {'text': 'same amount of time and and your', 'start': 2965.5, 'duration': 3.72}, {'text': 'inspiration mood board like it helps you', 'start': 2967.3, 'duration': 3.539}, {'text': 'and the client agree on what what style', 'start': 2969.22, 'duration': 4.68}, {'text': 'yeah yeah uh avoid one-offs right avoid', 'start': 2970.839, 'duration': 5.641}, {'text': 'thumbnail art avoid um marketing', 'start': 2973.9, 'duration': 4.679}, {'text': 'creators with the client only wants one', 'start': 2976.48, 'duration': 3.119}, {'text': 'creative a lot of times that happens', 'start': 2978.579, 'duration': 3.181}, {'text': 'they only want one creative', 'start': 2979.599, 'duration': 3.781}, {'text': \"um avoid anything that's a one-off so\", 'start': 2981.76, 'duration': 2.88}, {'text': \"yeah if you're a designer watching this\", 'start': 2983.38, 'duration': 3.12}, {'text': \"it's time to go full stack see that's\", 'start': 2984.64, 'duration': 3.54}, {'text': 'the thing now design', 'start': 2986.5, 'duration': 3.96}, {'text': \"eventually people move into oh I'm doing\", 'start': 2988.18, 'duration': 5.58}, {'text': 'the entire brand for the company now I', 'start': 2990.46, 'duration': 4.5}, {'text': 'will measure my words here because', 'start': 2993.76, 'duration': 3.059}, {'text': \"there's something called style draw okay\", 'start': 2994.96, 'duration': 3.359}, {'text': 'which just released paper release around', 'start': 2996.819, 'duration': 3.361}, {'text': 'the code base is released which allows', 'start': 2998.319, 'duration': 3.061}, {'text': 'you to do frame to frame design', 'start': 3000.18, 'duration': 4.38}, {'text': \"consistency right but I've never tried\", 'start': 3001.38, 'duration': 5.459}, {'text': \"it I don't know what the outcome is like\", 'start': 3004.56, 'duration': 5.519}, {'text': 'um and either way I think it after the', 'start': 3006.839, 'duration': 4.921}, {'text': 'first image is generated you will still', 'start': 3010.079, 'duration': 2.881}, {'text': 'need to put a lot of effort in making', 'start': 3011.76, 'duration': 3.059}, {'text': 'the other images match so time to go', 'start': 3012.96, 'duration': 4.74}, {'text': 'full stack yeah be a brand manager or a', 'start': 3014.819, 'duration': 5.161}, {'text': 'brand designer so there was a video that', 'start': 3017.7, 'duration': 5.04}, {'text': 'I saw of someone on Instagram talking', 'start': 3019.98, 'duration': 5.4}, {'text': 'about how they can turn themselves into', 'start': 3022.74, 'duration': 6.48}, {'text': 'a 3D character and make them talk yeah', 'start': 3025.38, 'duration': 6.3}, {'text': 'so it still looks a little bit fake', 'start': 3029.22, 'duration': 4.44}, {'text': \"because the head it's not just the\", 'start': 3031.68, 'duration': 3.78}, {'text': 'earlier we could just make the face move', 'start': 3033.66, 'duration': 3.78}, {'text': 'now like the entire head moves little', 'start': 3035.46, 'duration': 3.42}, {'text': \"bit there's some you know variance in\", 'start': 3037.44, 'duration': 4.22}, {'text': \"the movement so let's show you an output\", 'start': 3038.88, 'duration': 5.459}, {'text': \"uh let's take this image of mine okay\", 'start': 3041.66, 'duration': 5.14}, {'text': \"let's run it through did and let's run\", 'start': 3044.339, 'duration': 4.941}, {'text': 'the process', 'start': 3046.8, 'duration': 2.48}, {'text': 'and here is the output hey guys my name', 'start': 3050.819, 'duration': 4.861}, {'text': 'is Varan and I was gifted a computer at', 'start': 3053.52, 'duration': 4.02}, {'text': 'the age of seven which led me to playing', 'start': 3055.68, 'duration': 3.899}, {'text': 'a lot of video games which then led me', 'start': 3057.54, 'duration': 4.319}, {'text': 'to suffer in my exams what do you think', 'start': 3059.579, 'duration': 4.321}, {'text': \"I think this is super interesting it's\", 'start': 3061.859, 'duration': 5.161}, {'text': \"cute it's a toy right now but eventually\", 'start': 3063.9, 'duration': 5.12}, {'text': \"as it gets better you'll be able to\", 'start': 3067.02, 'duration': 5.099}, {'text': 'create different avatars of yourself do', 'start': 3069.02, 'duration': 5.38}, {'text': 'you want to see it get better how watch', 'start': 3072.119, 'duration': 3.841}, {'text': 'this', 'start': 3074.4, 'duration': 4.56}, {'text': 'foreign', 'start': 3075.96, 'duration': 3.0}, {'text': 'actually this is replacing just this', 'start': 3085.819, 'duration': 4.121}, {'text': 'part so you shoot some base footage', 'start': 3088.26, 'duration': 2.88}, {'text': \"where you're just like standing and like\", 'start': 3089.94, 'duration': 4.379}, {'text': 'moving your head a few times and now I', 'start': 3091.14, 'duration': 5.04}, {'text': \"can record anything so I don't like\", 'start': 3094.319, 'duration': 3.661}, {'text': \"creating content I think it's a pain in\", 'start': 3096.18, 'duration': 5.879}, {'text': 'the ass thanks and uh I think uh having', 'start': 3097.98, 'duration': 6.599}, {'text': 'this Avatar of me create content is to', 'start': 3102.059, 'duration': 4.621}, {'text': 'me is a Big Time Saver so this is', 'start': 3104.579, 'duration': 4.201}, {'text': 'interesting and people will use it for a', 'start': 3106.68, 'duration': 3.3}, {'text': 'lot of cute things in the beginning', 'start': 3108.78, 'duration': 3.96}, {'text': \"which is you'll be able to style\", 'start': 3109.98, 'duration': 4.74}, {'text': 'yourself in different visual Styles', 'start': 3112.74, 'duration': 3.839}, {'text': 'right now this is 3dr tomorrow you can', 'start': 3114.72, 'duration': 4.5}, {'text': 'make yourself in an anime style animated', 'start': 3116.579, 'duration': 4.621}, {'text': 'video you can do it in different styles', 'start': 3119.22, 'duration': 4.5}, {'text': 'and eventually Porto you can put', 'start': 3121.2, 'duration': 5.159}, {'text': 'yourself as a 3D render in a video game', 'start': 3123.72, 'duration': 6.18}, {'text': 'and truly play as yourself in FIFA in in', 'start': 3126.359, 'duration': 5.76}, {'text': 'GTA you can you can you anyone will be', 'start': 3129.9, 'duration': 3.48}, {'text': 'able to Output themselves and put them', 'start': 3132.119, 'duration': 3.181}, {'text': 'in a proper simulated simulated', 'start': 3133.38, 'duration': 3.42}, {'text': 'environment absolutely', 'start': 3135.3, 'duration': 2.819}, {'text': \"you know you know what I'm worried about\", 'start': 3136.8, 'duration': 2.94}, {'text': \"not I'm not worried about it but I think\", 'start': 3138.119, 'duration': 3.901}, {'text': \"there's a good opportunity here a lot of\", 'start': 3139.74, 'duration': 4.319}, {'text': 'very good video editors who have good', 'start': 3142.02, 'duration': 3.839}, {'text': 'stories to tell but too shy to get in', 'start': 3144.059, 'duration': 3.3}, {'text': \"front of the camera you know there's a\", 'start': 3145.859, 'duration': 3.181}, {'text': 'big bunch of people who correct who are', 'start': 3147.359, 'duration': 2.581}, {'text': 'like this', 'start': 3149.04, 'duration': 2.579}, {'text': 'you make them all powerful right now', 'start': 3149.94, 'duration': 4.02}, {'text': \"correct right because now they're good\", 'start': 3151.619, 'duration': 3.601}, {'text': 'at the introvert stuff which is staying', 'start': 3153.96, 'duration': 2.639}, {'text': 'on the back end doing some research', 'start': 3155.22, 'duration': 2.94}, {'text': 'figuring out what to make a video on', 'start': 3156.599, 'duration': 4.801}, {'text': 'editing that video good graphics Etc', 'start': 3158.16, 'duration': 5.64}, {'text': \"and now they've always done it as a\", 'start': 3161.4, 'duration': 3.959}, {'text': 'service for other content creators but', 'start': 3163.8, 'duration': 3.2}, {'text': \"if you're able to put yourself\", 'start': 3165.359, 'duration': 4.921}, {'text': 'with the crazy personality and whatnot', 'start': 3167.0, 'duration': 5.44}, {'text': 'then you do it yeah this is confidence', 'start': 3170.28, 'duration': 4.38}, {'text': 'as a service confidence is a service yes', 'start': 3172.44, 'duration': 4.58}, {'text': \"right and and also you don't need Studio\", 'start': 3174.66, 'duration': 6.24}, {'text': \"you don't need the setup you don't like\", 'start': 3177.02, 'duration': 7.539}, {'text': \"it's just straight text or script to\", 'start': 3180.9, 'duration': 5.82}, {'text': \"video which is why don't use strategy\", 'start': 3184.559, 'duration': 3.601}, {'text': \"video to make these videos it's internet\", 'start': 3186.72, 'duration': 2.76}, {'text': 'is going to be flooded with them now', 'start': 3188.16, 'duration': 4.26}, {'text': 'find your unique Insight find where you', 'start': 3189.48, 'duration': 5.099}, {'text': \"have the depth uh that's I think where\", 'start': 3192.42, 'duration': 3.84}, {'text': 'the opportunity is going to be all right', 'start': 3194.579, 'duration': 4.561}, {'text': 'Nvidia stock reaches 1 trillion market', 'start': 3196.26, 'duration': 5.88}, {'text': 'cap do you think Nvidia can get larger', 'start': 3199.14, 'duration': 6.36}, {'text': 'than a trillion yeah if if we think on', 'start': 3202.14, 'duration': 6.439}, {'text': 'the curve we are at the early stages', 'start': 3205.5, 'duration': 6.72}, {'text': 'then yeah I think Nvidia is positioned', 'start': 3208.579, 'duration': 5.201}, {'text': 'to be', 'start': 3212.22, 'duration': 3.66}, {'text': 'one of the top companies along with the', 'start': 3213.78, 'duration': 3.48}, {'text': 'big four right', 'start': 3215.88, 'duration': 4.62}, {'text': 'like people are making tweets about how', 'start': 3217.26, 'duration': 6.24}, {'text': 'the n in Fang is now Nvidia and not', 'start': 3220.5, 'duration': 5.4}, {'text': 'Netflix yeah Netflix struggling what', 'start': 3223.5, 'duration': 4.74}, {'text': \"does Nvidia have that AMD doesn't have a\", 'start': 3225.9, 'duration': 3.9}, {'text': 'lot of things I think Nvidia is better', 'start': 3228.24, 'duration': 5.28}, {'text': 'Tech the gpus are better also at least', 'start': 3229.8, 'duration': 5.22}, {'text': \"for tasks like machine learning there's\", 'start': 3233.52, 'duration': 3.059}, {'text': 'something called cuda which is great', 'start': 3235.02, 'duration': 3.599}, {'text': 'with Nvidia and it', 'start': 3236.579, 'duration': 3.721}, {'text': \"I've never even explored the AMD version\", 'start': 3238.619, 'duration': 3.181}, {'text': 'I know somebody was planning to make an', 'start': 3240.3, 'duration': 4.2}, {'text': 'Nvidia competitor uh or allow machine', 'start': 3241.8, 'duration': 4.68}, {'text': 'learning on AMD cards make it as simple', 'start': 3244.5, 'duration': 4.5}, {'text': \"as what we it's not simple but make it\", 'start': 3246.48, 'duration': 5.04}, {'text': 'as easy as what we do on the Nvidia side', 'start': 3249.0, 'duration': 5.22}, {'text': 'he gave up after three days really yeah', 'start': 3251.52, 'duration': 4.74}, {'text': \"there's a tweet like he gave up after\", 'start': 3254.22, 'duration': 3.119}, {'text': 'three days', 'start': 3256.26, 'duration': 4.2}, {'text': \"okay so he's just like I hate AMD close\", 'start': 3257.339, 'duration': 6.0}, {'text': \"all my shoes bye so uh no I don't think\", 'start': 3260.46, 'duration': 4.56}, {'text': \"AMD is a good competitor that's what I\", 'start': 3263.339, 'duration': 3.601}, {'text': 'said right like I invested what I use I', 'start': 3265.02, 'duration': 4.319}, {'text': \"don't use AMD I've tried and I used to\", 'start': 3266.94, 'duration': 3.72}, {'text': \"be the kind of person like nvidia's\", 'start': 3269.339, 'duration': 3.061}, {'text': 'mainstream reviews AMD you know not', 'start': 3270.66, 'duration': 3.72}, {'text': \"mainstream I'll be the guy with the\", 'start': 3272.4, 'duration': 4.52}, {'text': 'alternate whatever it sucks', 'start': 3274.38, 'duration': 6.12}, {'text': 'so the things go mainstream for a reason', 'start': 3276.92, 'duration': 6.82}, {'text': 'I guess right now one trillion I think', 'start': 3280.5, 'duration': 4.5}, {'text': 'has a lot of zeros', 'start': 3283.74, 'duration': 3.0}, {'text': \"I don't know if it's overpriced\", 'start': 3285.0, 'duration': 4.8}, {'text': \"underpriced I'm sure some famous stock\", 'start': 3286.74, 'duration': 6.119}, {'text': 'market analyst has this thing uh I just', 'start': 3289.8, 'duration': 3.9}, {'text': \"don't know\", 'start': 3292.859, 'duration': 1.921}, {'text': 'hmm', 'start': 3293.7, 'duration': 3.359}, {'text': 'but really a lot of zeros have never', 'start': 3294.78, 'duration': 3.9}, {'text': \"been there I don't know what it takes to\", 'start': 3297.059, 'duration': 3.961}, {'text': \"be there in the last six months we've\", 'start': 3298.68, 'duration': 3.659}, {'text': 'seen', 'start': 3301.02, 'duration': 5.22}, {'text': 'um the rise of two people to be at the', 'start': 3302.339, 'duration': 6.24}, {'text': 'front and center along with Elon Tim', 'start': 3306.24, 'duration': 6.18}, {'text': 'Cook Zuck which is Sam Altman', 'start': 3308.579, 'duration': 6.601}, {'text': 'and the CEO of Nvidia I have a question', 'start': 3312.42, 'duration': 4.139}, {'text': \"that's not related to all this actually\", 'start': 3315.18, 'duration': 3.12}, {'text': 'what do you think of the Sam Waterman', 'start': 3316.559, 'duration': 4.981}, {'text': 'event in India so by the way Thunderman', 'start': 3318.3, 'duration': 5.039}, {'text': 'I have a planning to go and then said', 'start': 3321.54, 'duration': 3.66}, {'text': \"let's not go you want to tell them why I\", 'start': 3323.339, 'duration': 3.841}, {'text': \"said we shouldn't go a because it was\", 'start': 3325.2, 'duration': 3.18}, {'text': 'very last minute', 'start': 3327.18, 'duration': 4.26}, {'text': 'B I knew that if we went to the event we', 'start': 3328.38, 'duration': 5.16}, {'text': \"won't really get any sort of one-on-one\", 'start': 3331.44, 'duration': 5.22}, {'text': \"time with Sam I just told you that it'll\", 'start': 3333.54, 'duration': 4.74}, {'text': \"probably be like 30 seconds and we'll\", 'start': 3336.66, 'duration': 3.12}, {'text': \"get to take a selfie and I don't want to\", 'start': 3338.28, 'duration': 3.48}, {'text': 'be that guy who just takes a selfie', 'start': 3339.78, 'duration': 3.839}, {'text': 'I think if we continue to work on', 'start': 3341.76, 'duration': 3.78}, {'text': 'overpowered and if we continue to do you', 'start': 3343.619, 'duration': 3.601}, {'text': 'know output products out work with', 'start': 3345.54, 'duration': 4.38}, {'text': 'developers build a real AI Community we', 'start': 3347.22, 'duration': 5.099}, {'text': 'will get a warm intro with Sam at some', 'start': 3349.92, 'duration': 4.8}, {'text': 'point at some point Sam will hear that', 'start': 3352.319, 'duration': 4.201}, {'text': 'hey there are these guys who are doing', 'start': 3354.72, 'duration': 3.839}, {'text': 'an AI thing in India where they have a', 'start': 3356.52, 'duration': 3.299}, {'text': 'pretty large community people follow', 'start': 3358.559, 'duration': 3.661}, {'text': \"them maybe it's worth doing a 30 40\", 'start': 3359.819, 'duration': 4.861}, {'text': \"Minute Podcast episode yeah so that's\", 'start': 3362.22, 'duration': 4.5}, {'text': 'why I said that we should not go to this', 'start': 3364.68, 'duration': 3.72}, {'text': 'event just to click a selfie like I', 'start': 3366.72, 'duration': 3.119}, {'text': \"don't want to be that guy sir one\", 'start': 3368.4, 'duration': 3.06}, {'text': 'picture please sir one picture please', 'start': 3369.839, 'duration': 3.181}, {'text': \"and you click it and it's always like\", 'start': 3371.46, 'duration': 2.7}, {'text': \"they're getting whisked out of the room\", 'start': 3373.02, 'duration': 2.64}, {'text': \"and you're on the way just you just\", 'start': 3374.16, 'duration': 2.58}, {'text': 'click the picture and they look listen', 'start': 3375.66, 'duration': 4.159}, {'text': 'have you seen some of the pictures', 'start': 3376.74, 'duration': 3.079}, {'text': 'send me a picture of someone who took a', 'start': 3380.059, 'duration': 4.481}, {'text': 'selfie with Sam and just said you were', 'start': 3382.38, 'duration': 4.86}, {'text': 'right yeah yeah I knew I knew this is', 'start': 3384.54, 'duration': 5.279}, {'text': 'what it would be like uh so these events', 'start': 3387.24, 'duration': 4.8}, {'text': \"are I mean I get what Sam's trying to do\", 'start': 3389.819, 'duration': 4.321}, {'text': 'yeah he came for the Prime Minister I', 'start': 3392.04, 'duration': 4.799}, {'text': 'think that one picture with Sam and Modi', 'start': 3394.14, 'duration': 4.86}, {'text': 'will travel far wider than anything else', 'start': 3396.839, 'duration': 3.541}, {'text': 'he did', 'start': 3399.0, 'duration': 3.119}, {'text': 'um and also an important event like this', 'start': 3400.38, 'duration': 4.8}, {'text': 'does is the whole startup sector talks', 'start': 3402.119, 'duration': 5.341}, {'text': 'about it and the more everybody feels', 'start': 3405.18, 'duration': 4.379}, {'text': 'like holy yeah is here literally', 'start': 3407.46, 'duration': 3.899}, {'text': \"the CEO was here he's being the Prime\", 'start': 3409.559, 'duration': 3.901}, {'text': \"Minister and he's doing this thing so it\", 'start': 3411.359, 'duration': 4.2}, {'text': \"makes like have you I've seen an uptick\", 'start': 3413.46, 'duration': 3.42}, {'text': 'in the number of startup Founders', 'start': 3415.559, 'duration': 3.961}, {'text': 'talking about AI publicly yeah like they', 'start': 3416.88, 'duration': 4.32}, {'text': 'were Whispers And murmurs like three to', 'start': 3419.52, 'duration': 3.299}, {'text': \"four months ago and now it's like the\", 'start': 3421.2, 'duration': 3.06}, {'text': \"catch out of the bag it's pretty obvious\", 'start': 3422.819, 'duration': 3.3}, {'text': 'now that everybody needs to be AI', 'start': 3424.26, 'duration': 3.24}, {'text': 'assisted', 'start': 3426.119, 'duration': 2.821}, {'text': 'um me and maroon also have been', 'start': 3427.5, 'duration': 3.119}, {'text': 'discussing because ever since we started', 'start': 3428.94, 'duration': 3.179}, {'text': \"overpowered there's just been a lot of\", 'start': 3430.619, 'duration': 3.301}, {'text': 'inbound of a number of people who want', 'start': 3432.119, 'duration': 4.321}, {'text': 'to Tinker around with AI but right now', 'start': 3433.92, 'duration': 4.98}, {'text': 'we were just doing content but with', 'start': 3436.44, 'duration': 4.919}, {'text': 'figuring it out how we can actually work', 'start': 3438.9, 'duration': 5.04}, {'text': \"with companies and startups anyway I'm\", 'start': 3441.359, 'duration': 4.621}, {'text': 'all for more such events I think the', 'start': 3443.94, 'duration': 5.04}, {'text': 'more time Sam spends here the more but', 'start': 3445.98, 'duration': 5.16}, {'text': 'it actually genuinely boosts the', 'start': 3448.98, 'duration': 4.02}, {'text': 'interesting AI from the whole startup', 'start': 3451.14, 'duration': 3.419}, {'text': 'ecosystem', 'start': 3453.0, 'duration': 4.859}, {'text': 'um and next time is here will you go', 'start': 3454.559, 'duration': 6.06}, {'text': 'depends how much time we get if five', 'start': 3457.859, 'duration': 4.561}, {'text': 'minutes sitting in the crowd not worth', 'start': 3460.619, 'duration': 3.72}, {'text': \"it right because you'll get called out\", 'start': 3462.42, 'duration': 3.36}, {'text': 'of context I would rather have him here', 'start': 3464.339, 'duration': 4.161}, {'text': \"Sam come let's discuss\", 'start': 3465.78, 'duration': 5.52}, {'text': \"uh you're always invited yeah please\", 'start': 3468.5, 'duration': 4.359}, {'text': 'please come on overpowered and please', 'start': 3471.3, 'duration': 3.72}, {'text': 'tell us how we can build a foundational', 'start': 3472.859, 'duration': 4.74}, {'text': 'LM that can compete with charging sir', 'start': 3475.02, 'duration': 6.0}, {'text': 'you tell one how to please disrupt one', 'start': 3477.599, 'duration': 5.281}, {'text': \"anyway as for today's episode of hope I\", 'start': 3481.02, 'duration': 2.94}, {'text': 'hope you guys enjoyed it do hit', 'start': 3482.88, 'duration': 3.239}, {'text': 'subscribe and get cracking on your logos', 'start': 3483.96, 'duration': 4.92}, {'text': \"get cracking on the packaging we'll see\", 'start': 3486.119, 'duration': 4.411}, {'text': 'on the next one bye', 'start': 3488.88, 'duration': 4.689}, {'text': '[Music]', 'start': 3490.53, 'duration': 3.039}]\n", + "[\n", + " {\n", + " \"start_time\": 169.58,\n", + " \"end_time\": 199.10,\n", + " \"description\": \"I think the quest will win because it already has an option I think it's a function of the best game I think someone's gonna build a World of Warcraft MMORPG or like a Dota or a League of Legends people have tried the Counter-Strike thing there are lots of games there's contractors Pavlov and stuff this is not good right so I feel it's the function of the best game and I think I want to see how AR plays out I've seen a lot of how VR has played out it's just a story of low retention people use it three weeks stop I want to see how AR plays out okay you haven't tried the Vision Pro yet what are three things that you're excited to see in the Vision Pro and why is it exciting just from the just from the video some people who have tried the Vision Pro like the Oculus CEO especially the ex Oculus CEO Palmer lucky right he's like this is the best headset ever you've got a tweet on it correct so a person who's worked in VR for so long built the Oculus uh and the series of headsets after that saying such good things about Apple or the new heads it means a lot so I'm looking forward primarily because somebody working here for a very long time has said this is amazing and it's better than everything I've tried before now agreed there was some bad breakup between him and Facebook or meta but still it's still a good signal right that's number one number two what I'm excited about is the quest actually has really shitty compute compared to what the what the vision process has the M2 right M2 and apparently they saw lag because they have a separate chip that's just doing you know uh synthesizing all the sensors on the uh on the Vision Pro right so I'm really excited to see whether that latency converts or something a lot of people have said putting on the headset means like it's almost like you're not there right or almost like the headset's not there because everything is Real Time with the quest even at 120 hertz it still feels little bit laggy still feels like I'm putting something else on I'm some you know there's some magic uh that the door that stops the magic right so I'm really excited about the Vision Pro solving those problems I just want to see it like I just want to use it and then I think my thoughts would be more fleshed out farmer lucky do you know what happened between him and meta I think I don't know if this is true but apparently he he made a political donation to somebody that meta didn't like and therefore they kicked him out and now he's working in defense what do you think about zuck's response to The Vision Pro he wrote a company email and then he came on Lex Friedman's podcast dude I really like Zach I used to hate him yeah because of the internet yeah but then the more I learn about him the more I'm like dude this guy's been CEO of the company by himself not given the range to somebody else yeah and is had the balls to say okay the next platform is going to be this I don't mind tanking Facebook for this right I think that's a ballsy move by the way he named the company and really like I've had investors right it's so hard to tell investors that oh you're doing this other thing because this old thing might not work right at my scale okay but at his scale it's like it's insane so and that's a publicly defining stuff yeah it's public investors they do a massive you know hit on their stocks uh on their stock price so I like people who are willing to go all in and have like his incentive is not money he's made enough money so I know he's playing to build something really cool um so I I just encourage it from a distance because I just love it he's like this like man's man thing also going on right now like yeah the Jiu Jitsu and then the Iron Man thing that he does and you know he smokes Meats in his backyard as well like I like Zuck a lot and and you know I used to for some reason I used to dislike him many years ago I'm so stupid in hindsight like I don't know why I did that it's just because the internet hated somebody I was like oh it's cool to do it's like five six years ago now I'm just like dude I don't mind being that guy I won't yeah you know I wouldn't mind you are like Zuck in the sense that you also seem like your AI generated sometimes I don't know why he got that now he seems more relatable no but yeah that's the thing Zack has done some nice PR uh you know whitewash he's like oh I'm gonna go I'm gonna do what Joe Rogan does because Joe Rogan is seen as the oh man you know whatever yeah very relatable guy I'm gonna go to Jujitsu I'm gonna show my family life I'm not gonna talk like a robot so I really like him now that's what I know at the end of the day no matter who builds what you're like can I relate to the person yes okay I want to be like just the fact that he's giving a response is going to have so much attention and scrutiny on it it's not only did it respond but it was a very measured take yeah it was not how these guys suck yeah this is not good it wasn't that his reasoning was hey I think that going for something we are going a different place we are going a different path we've tried that but that's not for us and it made can I tell you one thing but uh I don't know if this is true and this is my opinion on this I think Zuck got locked like he's not locked see I I know they released the quest at lower price points or what not but everybody in Silicon Valley wants to build a premium product apple-like product okay and Zuck for a long time said we're going to do the they have an expensive version of the questions like we're gonna move towards more expensive headsets over time and we're going to try to bring the price of those down right so uh put in good Hardware make sure the compute's on on the thing because Quest people don't know this but you can actually use something called air link and connect your PC to a quest and suddenly all the graphics are much better right you run you're processing on the computer itself Zuck wanted to pay the premium game but now can't now he has to play the Android narrative yeah you you can't go up in culture you can only go from Top yeah so I feel like it's also a little bit of cope uh saying that oh you know we will we will be the poor man's headset or every man's headset yeah um it is cope I nobody would want to say no to the premium segment right but the thing is when Apple comes out you you don't have a choice but to fit there so now he's going to go into customizability like you can see this in meta strategy in general right llama they release the weights open source right uh they said for researchers only but I'm pretty sure then you would get leaked so I feel like he's been Co he's being pushed into the Android Direction I don't know if there's a business there uh I mean there is a business there but is it his choice of business don't know all right let's move on Runway Gen 2 came out prepare yourself for the exhilaration and sheer chaos of interdimensional clown wrestling [Music] these clowns can pick from the Twisted corners and visceral vibrancy that only the weirdest Dimensions can conjure the thing with text to video is text to images gotten so good that the expectation on texture video is so high but it's harder to do I'll tell you why it's harder to do right technically so let's say you run stable diffusion you have a nice model on it or mid Journey or whatever you're able to generate an image good but the problem is generating one image and generating like a video is a bunch of frames correct let's say 25 frames a second right you're generating many many frames frame to frame cohesion even if you get great outputs on frame one frame two frame to frame cohesion is hard it's hard so you'll see this in a lot of like kyber for example has this issue right let's say you have this you have a small plant there in front of you and you take a video of the plant and you're just moving around and maybe you there's a dog in front of the plant right as you move around the planets are changing shapes frame to fame it will go from plant to something else that looks like a plant to some some other thing that looks like a plant maybe different plants even correct so there is no frame to frame consistency correct right and I think that's the biggest issue with text to video I don't know why people are that's why people are currently using like video AI tools where it's like for a moment in using a video as a base layer you can imprint it's a Frozen stuff on it it's a filter yeah I think the best use case is a filter like Snapchat Instagram already proved this and I think there are now tools where it can convert you into anime form I think text to video it's not even texture videos will be great for filters right and I think it gives a lot of editors great tools right like um so last year we were thinking about what to start like a China's thing Water started we want to teach something what do we teach which of these are going to get are going to expire over the next one year the one thing we will show we're not going to expire over the next one to two years is video like it's just frame to frame consistency is so hard it's such a hard problem it'll get solved someday right maybe five or six years down the line but you still need someone to weave it together you still need somebody to do the narrative so China is bullish on the cohort and so far we've been right and I think we're going to continue to be right for the next three four years right just this is the video editing cohort that you guys have if he does a video editing cohort it's at avtv.com Machina runs it but I mean there and it's also like we're so bullish on video that because see text is taken away as a domain right because chat GPD has come out and a lot of people who are writing SEO content are just like fizzling out so where are they going to go it's video and Google if you see above the fold now showing three videos right because they're now going to do a full thing so if SEO is going to go something is going to take its place companies have realized this right all the largest companies now come to China and just say hey how can you do video for us so we saw such a big opportunity um therefore you know she kick started the cohort but anyway coming back I think this is great as a horror format right now I think there is like seriously somebody's going to make a channel that does horror and video maybe text to video like this tweet says that I predict that generative video will emerge the form of media in its own right yeah so maybe we won't get text to video in the way we are getting text images which is extremely accurate images based on how descriptive you are yeah but maybe text to video can be a new style of video yeah I'll tell you one more problem I'll tell you one more problem with images and video okay this is just in usage patterns so when you use mid Journey you get four outputs give me more variants how do you use text to images I'm very like pessimistic about art jobs right and the main reason is this right if you don't like an output you can generate a thousand pic correct with video and even with code you can't easily do that even code I'm uh I'm bullish that will help engineers and a lot of Engineers will be 10x 100x Engineers but everyone we need to know know how to code right and the main reason is you get a code base or you get a full video let's say you want to change three frames in the video okay let's say you've given a prompt saying okay uh Rahul Ravid sitting and sipping coffee on Mount Everest right and maybe some part of the video is not great right maybe he's sipping coffee the wrong way or his pinkies out or you want his pinky out you can't go in and change that now because now the entire video will change it will generate something from scratch with rahul's pinky out but the Mount Everest behind it will change that's right now though yeah that no even in the future right you don't have fine control over any of these AI models even with stable diffusion you don't even with mid Journey you don't you can't like even if you tell mid Journey oh I want a character sitting there sipping a cup of coffee it's not exactly what you want and if you want to remove that cup of coffee you'll have to take it in generative by the way I generate an image of uh this is after my channel contact I generated an image of and the prompt was that hey it's an image of an Indian man sitting in front of a computer Studios on fire and he's showing the thumbs up yeah okay so if it's like one specific action that you want a person to do no it's about change say you like an output the problem is this right you love an output you want one change now you're done you can't do anything yeah you can't be like retain all of this this happens on big Journey as well yeah I can't be like retain the posture but just change the clothes I can't do that exactly and for that you'd use generative fill right so the equivalent of generative fill for video is very hard because if I say okay this one small thing in the background I want this to be something else now you need to have frame to frame consistency so it's very hard to do generative fill and that's that's a video editor's role honestly right like if you want some graphic to come in or whatever and then swipe out so what I believe with text to video text to image particularly is a lot of people look at a lot of outputs like you would have seen four outputs of the thumbs up people like I like this one correct the minute you want to edit that you're screwed but with code bases you generate an entire code base and you're like oh I want to change this one file now you need to know how to do it now you need to learn how to code right so you have create it's like we have this thing called in in Tech called create read update destroy right if anything on the database simple operations or create read update create means you're creating a new piece of something read means you're just looking at it and and whatever uh read means you're just looking at it update means you want to change something and Destroy means you want to delete it so we have crd we don't have U correct right so you don't have edit capability if you're okay with abandoning the edit capability like in the sense of generate thousand image variants and pick the right one then great but if you wanna go like if you want to edit anything you need to have skill sets so let's try it let's try to generate something so what we're writing is Steve Jobs sitting on a mountain drinking coffee with a pinky finger out right you know where I think texture video will be very useful in few years stock footage like if you don't care about the exact Fidelity and you're just like oh I'm talking saying something about Egypt just show people in Egypt walking it is great almost like b-roll b-roll it's great for b-roll because there you can see fourth generation will be like I like this one the minute you want edit capability now like I want this specific thing changed you have no control you have no Fidelity so you can create a lot of like Montage shots and or video with like where you want it's like a hype video and you want text on top of just something narrates narration almost like Ambience ml founder right another one who works in texture video but for faces and usually our model has everything but if you want to like in the middle of the video you want the character to turn to the left or right you can't do that sorry okay always something see to it yeah it's not getting the it's not doing the thing pink finger out but one day this will be great for stock footage it's pretty good for General feel of what you're going for but not the exact thing yeah I think the stock footage to create a movie or a video will be available at some point like you want to do Terminators walking in and Arnold Schwarzenegger looking at them like running around if you're okay with sacrificing Fidelity this is great let's try creating something which is just like an ambient film over which you can overlay text to make like a hype video right so say for example shooting stars in the sky in the sky with text on top no the text we will add though so shooting star shooting stars in the sky yeah um yellow clouds with rain with rain yeah this is perfect this is stock footage his stock footage and this is what it's trained on also so it will generate something really good so yeah I was talking to a Founder who who's worked in ml for a while he has a text to video platform but for face like for Talking Heads and he's like we've got\",\n", + " \"duration\": 486\n", + " }\n", + " ] [\n", + " {\n", + " \"start_time\": 425.72,\n", + " \"end_time\": 480.19,\n", + " \"description\": \"if you're a designer watching this it's time to go full stack see that's the thing now design eventually people move into oh I'm doing the entire brand for the company now I will measure my words here because there's something called style draw okay which just released paper release around the code base is released which allows you to do frame to frame design consistency right but I've never tried it I don't know what the outcome is like um and either way I think it after the first image is generated you will still need to put a lot of effort in making the other images match so time to go full stack yeah be a brand manager or a brand designer\",\n", + " \"duration\": 54.47\n", + " },\n", + " {\n", + " \"start_time\": 632.89,\n", + " \"end_time\": 675.53,\n", + " \"description\": \"the minute you have to do an entire brand kit for a company landing page this that whatever booklet and all of them have to match unless they're all matching the sense that you have one image and you're just sticking on top of the booklet let's say the booklet has to match the entire theme of the other stuff then I think you have a good competitive so check this image out okay this is for a packaging of a coffee company like I'll show you this problem in real time\",\n", + " \"duration\": 42.64\n", + " }\n", + "] [\n", + " {\n", + " \"start_time\": 27.62,\n", + " \"end_time\": 61.92,\n", + " \"description\": \"so there was a video that I saw of someone on Instagram talking about how they can turn themselves into a 3D character and make them talk yeah so it still looks a little bit fake because the head it's not just the earlier we could just make the face move now like the entire head moves little bit there's some you know variance in the movement so let's show you an output uh let's take this image of mine okay let's run it through did and let's run the process and here is the output\"\n", + " },\n", + " {\n", + " \"start_time\": 66.05,\n", + " \"end_time\": 95.62,\n", + " \"description\": \"hey guys my name is Varan and I was gifted a computer at the age of seven which led me to playing a lot of video games which then led me to suffer in my exams what do you think I think this is super interesting it's cute it's a toy right now but eventually as it gets better you'll be able to create different avatars of yourself\"\n", + " }\n", + "]\n" + ] + }, + { + "ename": "TypeError", + "evalue": "ignored", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0minteresting_segment\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0manalyze_transcript\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtranscript\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5000\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m100\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minteresting_segment\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mcontent\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minteresting_segment\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"content\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7\u001b[0m \u001b[0mparsed_content\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mjson\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mloads\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcontent\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mparsed_content\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: string indices must be integers" + ] + } + ], + "source": [ + " video_id='wv8vgbi5ToM'\n", + " transcript = get_transcript(video_id)\n", + " print(transcript)\n", + " interesting_segment = analyze_transcript(transcript,5000,100)\n", + " print(interesting_segment)\n", + " content = interesting_segment[\"content\"]\n", + " parsed_content = json.loads(content)\n", + " print(parsed_content)\n", + " #pdb.set_trace()\n", + " segment_video(parsed_content)\n", + "\n", + " # Loop through each segment\n", + " for i in range(0, 3): # Replace 3 with the actual number of segments\n", + " input_file = f'output{str(i).zfill(3)}.mp4'\n", + " output_file = f'output_cropped{str(i).zfill(3)}.mp4'\n", + " faces = detect_faces(input_file)\n", + " crop_video(faces, input_file, output_file)\n", + "\n", + " # Assume you have a way to get the transcript. This is not shown here.\n", + " # Replace with actual transcript\n", + "\n", + "\n", + "# Run the main function\n", + "main()\n", + "\n" + ] + } + ], + "metadata": { + "colab": { + "machine_shape": "hm", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/CHANGES.txt b/CHANGES.txt new file mode 100644 index 0000000000000000000000000000000000000000..b6831dc9ad9146f373abf059f036fd02a1bfc19f --- /dev/null +++ b/CHANGES.txt @@ -0,0 +1,20 @@ +# CHANGES + +## Version 0.1.31 +- Fixing issue in AssetDatabase, where it was copying unexisting asset template file +## Version 0.1.3 +- Requiring a youtube url as the subscribe animation url in the EditingStep.ADD_SUBSCRIBE_ANIMATION step. +- Adding a default subscribe animation youtube link by default shipped in the AssetDatabase +- Making path imports relative for gpt prompts and editing blocks and flows. +## Version 0.1.2 +- Improving logs in content engines +## Version 0.1.1 +- Adding AssetType in AssetDatabase +- Adding ApiProvider in api_db +- Fixing pip libary missing editing_framework module, prompt_template module +## Version 0.1.0 +- Fixing the AssetDatabase when it's empty +## Version 0.0.2 +- Implemented the content_translation_engine; a multilingual video dubbing content engine. The source can be found at shortGPT/engine/content_translation_engine.py. +- Implemented the new EdgeTTS voice module; it can be found at shortgpt/audio/edge_voice_module. +- Added documentation which can be found under docs/. \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..a73e05244b795a806996ce2df6a76cff6f1b9e31 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,48 @@ +# Use an official Python runtime as the parent image +FROM python:3.11-bullseye + +RUN apt-get update && apt-get install -y \ + ffmpeg \ + imagemagick \ + ghostscript \ + fonts-roboto \ + cron \ + && apt-get clean && rm -rf /var/lib/apt/lists/* + +# Update font cache +RUN fc-cache -f -v + +RUN sed -i '/ /etc/cron.d/automate +RUN chmod 0644 /etc/cron.d/automate +RUN crontab /etc/cron.d/automate +RUN touch /var/log/cron.log + +# Run Python script when the container launches +CMD cron && tail -f /var/log/cron.log diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..81e54d84f0f343c082b2cfb4568745fb889dc0a1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,35 @@ +ShortGPT License + +Depending on the type of your legal entity, you are granted permission to use ShortGPT for your project. Individuals and small companies are allowed to use ShortGPT to create videos for free (even commercial), while a company license is required for for-profit organizations of a certain size. This two-tier system was designed to ensure funding for this project while still allowing the source code to be available and the program to be free for most. Read below for the exact terms of use. + + Free license + Company license + +Free license + +Copyright © 2023 ShortGPT +Eligibility + +You are eligible to use ShortGPT for free if you are: + + an individual + a for-profit organization with a gross revenue up to 314 159$ a year. + a non-profit or not-for-profit organization + evaluating whether ShortGPT is a good fit, and are not yet using it in a commercial way + +Allowed use cases + +Permission is hereby granted, free of charge, to any person eligible for the "Free license", to use the software non-commercially or commercially for the purpose of creating videos and images and to modify the software to their own liking, for the purpose of fulfilling their custom use case or to contribute bug fixes or improvements back to ShortGPT. +Disallowed use cases + +It is not allowed to copy or modify ShortGPT code for the purpose of selling, renting, licensing, relicensing, or sublicensing your own derivate of ShortGPT. +Warranty notice + +The software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and non-infringement. In no event shall the author or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the software. +Support + +Support is provided on a best-we-can-do basis via GitHub Issues and Discord. +Company license + +You are required to obtain a company license to use ShortGPT if you are not within the group of entities eligible for a free license. This license will enable you to use ShortGPT for the allowed use cases specified in the free license, and give you access to prioritized support. +We will deduct 10% of the revenue generated from ShortGPT as part of the payment for the company license. diff --git a/README-Docker.md b/README-Docker.md new file mode 100644 index 0000000000000000000000000000000000000000..df5b530aa14f09d36b410fb37bc18d6a3e3ef15f --- /dev/null +++ b/README-Docker.md @@ -0,0 +1,21 @@ +# To run ShortGPT docker: + + +First make a .env file with the API keys like this: + +```bash +OPENAI_API_KEY=sk-_put_your_openai_api_key_here +ELEVENLABS_API_KEY=put_your_eleven_labs_api_key_here +PEXELS_API_KEY=put_your_pexels_api_key_here +``` + + +To run Dockerfile do this: +```bash +docker build -t short_gpt_docker:latest . +docker run -p 31415:31415 --env-file .env short_gpt_docker:latest +``` +Export Docker image: +```bash +docker save short_gpt_docker > short_gpt_docker.tar +``` diff --git a/README.md b/README.md index b4ce60b51ed9886d7dc908dd0fb2525b2f87102a..66b314679e962cf7d15deaf98881ee5e30170243 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,52 @@ ---- -title: S -emoji: 💻 -colorFrom: blue -colorTo: yellow -sdk: gradio -sdk_version: 4.36.1 -app_file: app.py -pinned: false ---- - -Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference +### Upload Automation + +1. Authentication (client-secrets.json from Google API console) +- Head to the Google API Console at https://console.cloud.google.com/ and create a project. +- In the marketplace (search bar), find 'YouTube v3 API' and enable it. +- After redirect, click on Oauth Screen and create. +- Add google.com as the authorized domain. +- Add scopes for the YouTube v3 API. +- Add the channel's email as the test user (in most cases, the email the channel was registered with). +- Create Credentials (OAuth Client ID) in the Credentials Menu and select Web App. +- For Authorized Redirect URIs, use: + 1. http://localhost:8080 + 2. http://localhost:8080/ + 3. http://localhost:8090 + 4. http://localhost:8090/ +- Finish up with downloading the .JSON file and put it inside this repository's directory. + + +2. Oauth2.json (within the repo itself) + +- Once a valid `client_secrets.json` is present in the directory, run `python3 upload.py` and follow further instructions. After successful authentication, an `oauth2.json` file will be created inside the directory. + + +> Note: You can avoid quota bottlenecks by stacking up projects in the google console and repeat steps before + +3. Automation + +Once valid oauth2 credentials exist in the directory you can let this run 100% on autopilot. + +- `ultra.py` is the main script to direct the video production pipeling +- `upload.py` sets the backbone for youtube's v3 api to upload to YouTube without further authentification +- `final_upload.py` combines the finsished product and uploads it to YouTube (title, description, tags get parsed automatically) + +Just craft your own bash script or use `automate.sh` + + +### Upgrades +- access YouTube as provider of video assets, surpassing stock footage by large +- avoids bans by using download streams with PyTube +- avoids YouTube v3 API's rate limit and auth +- avoids Pexels hard rate limit + +### Features + + +Inside `api_utils` functions provide utility for working with different APIs. Files: `image_api.py`, `pexels_api.py`, `youtube_api.py` and `eleven_api.py`. We added `youtube_api.py` to source video assets directly from YouTube. Feel free to modify `the _generateVideoUrls` function for the hierachy of video asset sources. + +- #### `search_videos_YouTube(query_string)` + + The search_videos_YouTube function takes a query string as input and searches for a video on YouTube based on that query. It returns the URL of the first search result if found, or None if no video is found. + + Integration of `shortGPT.api_utils.youtube_api`, which serves as an additional source for gathering footage based on the queried keyword. This is particularly useful when dealing with niche / comedy / meme topics where stock footage is not available. If nothing matches we backtrack to the pexels API. diff --git a/ShortGPT.ipynb b/ShortGPT.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..2eb90463bb921344f54e79c79038181ff2310f24 --- /dev/null +++ b/ShortGPT.ipynb @@ -0,0 +1,415 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "zC32SDJxrOsM", + "cellView": "form" + }, + "outputs": [], + "source": [ + "#@markdown

ShortGPT

Install Requirements. This is 1 Click Run App to create Short Videos

\n", + "# 📦 Install ImageMagick and ffmpeg\n", + "!sudo apt-get install imagemagick\n", + "!sudo apt-get install ffmpeg\n", + "\n", + "# 📝 Fix Imagemagick policy.xml bug in linux using MoviePy\n", + "!sed -i '/

Script To Video

Make Sure To Select ElevenLabs Or Edge TTS Only
\n", + "# Import necessary modules from the ShortGPT framework\n", + "from shortGPT.config.api_db import ApiKeyManager, ApiProvider\n", + "from shortGPT.config.asset_db import AssetDatabase, AssetType\n", + "from shortGPT.engine.content_video_engine import ContentVideoEngine\n", + "from shortGPT.config.languages import Language, EDGE_TTS_VOICENAME_MAPPING\n", + "from shortGPT.audio.edge_voice_module import EdgeTTSVoiceModule\n", + "from shortGPT.audio.eleven_voice_module import ElevenLabsVoiceModule\n", + "from shortGPT.audio.coqui_voice_module import CoquiVoiceModule\n", + "\n", + "# Load API keys from hardcoded values - Consider using environment variables for better security\n", + "OPENAI_KEY = \"\" # @param {type:\"string\"}\n", + "ELEVEN_KEY = \"\" # @param {type:\"string\"}\n", + "PEXELS_KEY = \"\" # @param {type:\"string\"}\n", + "\n", + "# Set API Keys\n", + "ApiKeyManager.set_api_key(ApiProvider.OPENAI, OPENAI_KEY)\n", + "ApiKeyManager.set_api_key(ApiProvider.ELEVEN_LABS, ELEVEN_KEY)\n", + "ApiKeyManager.set_api_key(ApiProvider.PEXELS, PEXELS_KEY)\n", + "\n", + "# Add Assets\n", + "AssetDatabase.add_remote_asset('chill music', AssetType.BACKGROUND_MUSIC, \"https://www.youtube.com/watch?v=uUu1NcSHg2E\")\n", + "\n", + "# Function to select the voice module based on user preference\n", + "def select_voice_module(tts_engine, language, voice):\n", + " if tts_engine == \"Edge TTS\":\n", + " voice_name = EDGE_TTS_VOICENAME_MAPPING[Language[language.upper()]]['male'] # Defaulting to male if specific voice not handled\n", + " return EdgeTTSVoiceModule(voice_name)\n", + " elif tts_engine == \"ElevenLabs\":\n", + " if language not in eleven_labs_languages or voice not in eleven_labs_voices:\n", + " raise ValueError(f\"Selected language '{language}' or voice '{voice}' is not supported by ElevenLabs. Supported languages are: {', '.join(eleven_labs_languages)}. Supported voices are: {', '.join(eleven_labs_voices)}.\")\n", + " return ElevenLabsVoiceModule(api_key=ELEVEN_KEY, voiceName=voice)\n", + " elif tts_engine == \"Coqui TTS\":\n", + " if language not in coqui_tts_languages or voice not in coqui_tts_voices:\n", + " raise ValueError(f\"Selected language '{language}' or voice '{voice}' is not supported by Coqui TTS. Supported languages are: {', '.join(coqui_tts_languages)}. Supported voices are: {', '.join(coqui_tts_voices)}.\")\n", + " return CoquiVoiceModule(voiceName=voice, language=language)\n", + " else:\n", + " raise ValueError(\"Unsupported TTS Engine\")\n", + "\n", + "# Configure the Voice Module\n", + "TEXT_TO_SPEECH = \"Edge TTS\" # @param [\"Edge TTS\", \"ElevenLabs\", \"Coqui TTS\"]\n", + "LANGUAGE = \"English\" # @param [\"English\", \"Spanish\", \"French\", \"Arabic\", \"German\", \"Polish\", \"Italian\", \"Portuguese\"]\n", + "VOICE = \"Damjan Chapman\" # @param ['Rachel', 'Drew', 'Clyde', 'Paul', 'Domi', 'Dave', 'Fin', 'Sarah', 'Antoni', 'Thomas', 'Charlie', 'George', 'Emily', 'Elli', 'Callum', 'Patrick', 'Harry', 'Liam', 'Dorothy', 'Josh', 'Arnold', 'Charlotte', 'Matilda', 'Matthew', 'James', 'Joseph', 'Jeremy', 'Michael', 'Ethan', 'Gigi', 'Freya', 'Grace', 'Daniel', 'Lily', 'Serena', 'Adam', 'Nicole', 'Bill', 'Jessie', 'Sam', 'Glinda', 'Giovanni', 'Mimi', 'Claribel Dervla', 'Daisy Studious', 'Gracie Wise', 'Tammie Ema', 'Alison Dietlinde', 'Ana Florence', 'Annmarie Nele', 'Asya Anara', 'Brenda Stern', 'Gitta Nikolina', 'Henriette Usha', 'Sofia Hellen', 'Tammy Grit', 'Tanja Adelina', 'Vjollca Johnnie', 'Andrew Chipper', 'Badr Odhiambo', 'Dionisio Schuyler', 'Royston Min', 'Viktor Eka', 'Abrahan Mack', 'Adde Michal', 'Baldur Sanjin', 'Craig Gutsy', 'Damien Black', 'Gilberto Mathias', 'Ilkin Urbano', 'Kazuhiko Atallah', 'Ludvig Milivoj', 'Suad Qasim', 'Torcull Diarmuid', 'Viktor Menelaos', 'Zacharie Aimilios', 'Nova Hogarth', 'Maja Ruoho', 'Uta Obando', 'Barbora MacLean', 'Alexandra Hisakawa', 'Alma María', 'Rosemary Okafor', 'Ige Behringer', 'Filip Traverse', 'Damjan Chapman', 'Wulf Carlevaro', 'Aaron Dreschner', 'Kumar Dahl', 'Eugenio Mataracı', 'Ferran Simen', 'Xavier Hayasaka', 'Luis Moray', 'Marcos Rudaski']\n", + "try:\n", + " voice_module = select_voice_module(TEXT_TO_SPEECH, LANGUAGE, VOICE)\n", + "except ValueError as e:\n", + " print(f\"Error selecting voice module: {e}\")\n", + " # Fallback to a default voice module if error occurs\n", + " voice_module = EdgeTTSVoiceModule(EDGE_TTS_VOICENAME_MAPPING[Language.ENGLISH]['male'])\n", + "\n", + "# Prepare the script\n", + "SCRIPT = \"\\\"Artificial intelligence (AI) is revolutionizing our world in surprising ways. Robots and virtual assistants help us in our daily tasks and simplify our lives. In medicine, AI enables more accurate diagnoses and advances in treatments. In the automotive industry, autonomous vehicles are changing the way we get around. However, questions arise about the impact on employment and the ethics of its use. Despite the challenges, AI promises an exciting future full of possibilities. Are we ready to embrace this technological advancement?\" # @param {type:\"string\"}\n", + "\n", + "# Configure Content Engine\n", + "content_engine = ContentVideoEngine(voice_module, SCRIPT, background_music_name='chill music', language=Language[LANGUAGE.upper()])\n", + "\n", + "# Generate Content with error handling\n", + "try:\n", + " for step_num, step_logs in content_engine.makeContent():\n", + " print(f\"Step {step_num}: {step_logs}\")\n", + "except Exception as e:\n", + " print(f\"Error generating content: {e}\")\n", + "\n", + "# Get Video Output Path\n", + "print(\"Video Output Path:\", content_engine.get_video_output_path())" + ], + "metadata": { + "cellView": "form", + "id": "lBqNgUmbacdF" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Import necessary modules from the ShortGPT framework\n", + "from shortGPT.config.api_db import ApiKeyManager, ApiProvider\n", + "from shortGPT.config.asset_db import AssetDatabase, AssetType\n", + "from shortGPT.engine.content_video_engine import ContentVideoEngine\n", + "from shortGPT.config.languages import Language, EDGE_TTS_VOICENAME_MAPPING, LANGUAGE_ACRONYM_MAPPING\n", + "from shortGPT.audio.edge_voice_module import EdgeTTSVoiceModule\n", + "from shortGPT.audio.eleven_voice_module import ElevenLabsVoiceModule\n", + "from shortGPT.audio.coqui_voice_module import CoquiVoiceModule\n", + "\n", + "# Load API keys from hardcoded values - Consider using environment variables for better security\n", + "OPENAI_KEY = \"\" # @param {type:\"string\"}\n", + "ELEVEN_KEY = \"\" # @param {type:\"string\"}\n", + "PEXELS_KEY = \"\" # @param {type:\"string\"}\n", + "\n", + "# Set API Keys\n", + "ApiKeyManager.set_api_key(ApiProvider.OPENAI, OPENAI_KEY)\n", + "ApiKeyManager.set_api_key(ApiProvider.ELEVEN_LABS, ELEVEN_KEY)\n", + "ApiKeyManager.set_api_key(ApiProvider.PEXELS, PEXELS_KEY)\n", + "\n", + "# Add Assets\n", + "AssetDatabase.add_remote_asset('chill music', AssetType.BACKGROUND_MUSIC, \"https://www.youtube.com/watch?v=uUu1NcSHg2E\")\n", + "\n", + "# Function to select the voice module based on user preference\n", + "def select_voice_module(tts_engine, language, voice):\n", + " if tts_engine == \"Edge TTS\":\n", + " voice_name = EDGE_TTS_VOICENAME_MAPPING[Language[language.upper()]]['male'] # Defaulting to male if specific voice not handled\n", + " return EdgeTTSVoiceModule(voice_name)\n", + " elif tts_engine == \"ElevenLabs\":\n", + " # Assuming eleven_labs_languages and eleven_labs_voices are defined elsewhere\n", + " return ElevenLabsVoiceModule(api_key=ELEVEN_KEY, voiceName=voice)\n", + " elif tts_engine == \"Coqui TTS\":\n", + " language_code = LANGUAGE_ACRONYM_MAPPING.get(Language[language.upper()], 'en') # Default to 'en' if not found\n", + " return CoquiVoiceModule(voiceName=voice, language=language_code)\n", + " else:\n", + " raise ValueError(\"Unsupported TTS Engine\")\n", + "\n", + "# Configure the Voice Module\n", + "TEXT_TO_SPEECH = \"Coqui TTS\" # @param [\"Edge TTS\", \"ElevenLabs\", \"Coqui TTS\"]\n", + "LANGUAGE = \"Hindi\" # @param [\"English\", \"Hindi\", \"French\", \"Arabic\", \"Urdu\", \"Roman Urdu\", \"Italian\", \"Portuguese\"]\n", + "VOICE = \"Damjan Chapman\" # @param ['Rachel', 'Drew', 'Clyde', 'Paul', 'Domi', 'Dave', 'Fin', 'Sarah', 'Antoni', 'Thomas', 'Charlie', 'George', 'Emily', 'Elli', 'Callum', 'Patrick', 'Harry', 'Liam', 'Dorothy', 'Josh', 'Arnold', 'Charlotte', 'Matilda', 'Matthew', 'James', 'Joseph', 'Jeremy', 'Michael', 'Ethan', 'Gigi', 'Freya', 'Grace', 'Daniel', 'Lily', 'Serena', 'Adam', 'Nicole', 'Bill', 'Jessie', 'Sam', 'Glinda', 'Giovanni', 'Mimi', 'Claribel Dervla', 'Daisy Studious', 'Gracie Wise', 'Tammie Ema', 'Alison Dietlinde', 'Ana Florence', 'Annmarie Nele', 'Asya Anara', 'Brenda Stern', 'Gitta Nikolina', 'Henriette Usha', 'Sofia Hellen', 'Tammy Grit', 'Tanja Adelina', 'Vjollca Johnnie', 'Andrew Chipper', 'Badr Odhiambo', 'Dionisio Schuyler', 'Royston Min', 'Viktor Eka', 'Abrahan Mack', 'Adde Michal', 'Baldur Sanjin', 'Craig Gutsy', 'Damien Black', 'Gilberto Mathias', 'Ilkin Urbano', 'Kazuhiko Atallah', 'Ludvig Milivoj', 'Suad Qasim', 'Torcull Diarmuid', 'Viktor Menelaos', 'Zacharie Aimilios', 'Nova Hogarth', 'Maja Ruoho', 'Uta Obando', 'Barbora MacLean', 'Alexandra Hisakawa', 'Alma María', 'Rosemary Okafor', 'Ige Behringer', 'Filip Traverse', 'Damjan Chapman', 'Wulf Carlevaro', 'Aaron Dreschner', 'Kumar Dahl', 'Eugenio Mataracı', 'Ferran Simen', 'Xavier Hayasaka', 'Luis Moray', 'Marcos Rudaski']\n", + "# Prepare the script\n", + "SCRIPT = \"SCRIPT = \\\"एक समय की बात है, जब पृथ्वी पर जीवन की शुरुआत हुई थी। इस ग्रह पर एक अनोखी प्रजाति ने अपने कदम रखे, जिसे हम मानव कहते हैं। यह कहानी है उस मानव जाति की, जिसने समय के साथ अपने जीवन को नई दिशा दी। शुरुआत में, मानव जंगलों और गुफाओं में रहते थे। उनका जीवन संघर्षों से भरा था। उन्होंने आग की खोज की, जिससे उनके जीवन में एक नई रोशनी आई। आग ने उन्हें ठंड से बचाया और खाना पकाने का तरीका सिखाया। समय के साथ, मानव ने खेती की शुरुआत की। उन्होंने अनाज उगाना शुरू किया और पशुओं को पालना सीखा। इससे उनके जीवन में स्थिरता आई और समाज का विकास हुआ। फिर आया सभ्यताओं का युग। मानव ने नदियों के किनारे बस्तियाँ बसाईं और विशाल साम्राज्यों की नींव रखी। उन्होंने लिपि का आविष्कार किया, जिससे ज्ञान का संचार हुआ। विज्ञान, कला, और साहित्य के क्षेत्र में उन्होंने अद्भुत कार्य किए। लेकिन मानव इतिहास में संघर्ष भी रहे। युद्ध, महामारी, और प्राकृतिक आपदाओं ने मानवता की परीक्षा ली। फिर भी, मानव ने कभी हार नहीं मानी। उन्होंने हर बार उठकर एक नई शुरुआत की। आज, हम एक ऐसे युग में हैं, जहाँ तकनीकी ने हमारे जीवन को बदल दिया है। हमने चाँद पर कदम रखा है और अंतरिक्ष की गहराइयों को छूने की कोशिश की है। यह कहानी हमें याद दिलाती है कि मानव जाति का इतिहास संघर्ष और विजय की कहानी है। हमारी यात्रा अद्भुत रही है, और हमारा भविष्य अभी भी लिखा जा रहा है। हमें अपने पूर्वजों की विरासत को आगे बढ़ा\" # @param {type:\"string\"}\n", + "\n", + "try:\n", + " voice_module = select_voice_module(TEXT_TO_SPEECH, LANGUAGE, VOICE)\n", + "except ValueError as e:\n", + " print(f\"Error selecting voice module: {e}\")\n", + " # Fallback to a default voice module if error occurs\n", + " voice_module = EdgeTTSVoiceModule(EDGE_TTS_VOICENAME_MAPPING[Language.ENGLISH]['male'])\n", + "\n", + "# Prepare the script\n", + "SCRIPT = \"\\\"Artificial intelligence (AI) is revolutionizing our world in surprising ways. Robots and virtual assistants help us in our daily tasks and simplify our lives. In medicine, AI enables more accurate diagnoses and advances in treatments. In the automotive industry, autonomous vehicles are changing the way we get around. However, questions arise about the impact on employment and the ethics of its use. Despite the challenges, AI promises an exciting future full of possibilities. Are we ready to embrace this technological advancement?\"\n", + "\n", + "# Configure Content Engine\n", + "content_engine = ContentVideoEngine(voice_module, SCRIPT, background_music_name='chill music', language=Language[LANGUAGE.upper()])\n", + "\n", + "# Generate Content with error handling\n", + "try:\n", + " for step_num, step_logs in content_engine.makeContent():\n", + " print(f\"Step {step_num}: {step_logs}\")\n", + "except Exception as e:\n", + " print(f\"Error generating content: {e}\")\n", + "\n", + "# Get Video Output Path\n", + "print(\"Video Output Path:\", content_engine.get_video_output_path())" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "cellView": "form", + "id": "s8eBfDIO6Ayl", + "outputId": "b54a9d5f-aa05-47f6-c195-9e1b2812fa92" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + " > tts_models/multilingual/multi-dataset/xtts_v2 is already downloaded.\n", + "Error selecting voice module: Expecting value: line 1 column 1 (char 0)\n", + "Step 1: Current step (1 / 10) : _generateTempAudio\n", + "Step 2: Current step (2 / 10) : _speedUpAudio\n", + "Step 3: Current step (3 / 10) : _timeCaptions\n", + "Importing the dtw module. When using in academic works please cite:\n", + " T. Giorgino. Computing and Visualizing Dynamic Time Warping Alignments in R: The dtw Package.\n", + " J. Stat. Soft., doi:10.18637/jss.v031.i07.\n", + "\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "100%|███████████████████████████████████████| 139M/139M [00:03<00:00, 39.6MiB/s]\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Detected language: English\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "100%|██████████| 396/396 [00:00<00:00, 858.28frames/s]\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Step 4: Current step (4 / 10) : _generateVideoSearchTerms\n", + "Expecting value: line 1 column 1 (char 0)\n", + "not the right format\n", + "Expecting value: line 1 column 1 (char 0)\n", + "not the right format\n", + "Expecting value: line 1 column 1 (char 0)\n", + "not the right format\n", + "Expecting value: line 1 column 1 (char 0)\n", + "not the right format\n", + "Expecting value: line 1 column 1 (char 0)\n", + "not the right format\n", + "Expecting value: line 1 column 1 (char 0)\n", + "not the right format\n", + "Expecting value: line 1 column 1 (char 0)\n", + "not the right format\n", + "Step 5: Current step (5 / 10) : _generateVideoUrls\n", + "Step 6: Current step (6 / 10) : _chooseBackgroundMusic\n", + "\u001b[KStep 7: Current step (7 / 10) : _prepareBackgroundAssets\n", + "Step 8: Current step (8 / 10) : _prepareCustomAssets\n", + "Step 9: Current step (9 / 10) : Preparing rendering assets...\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "\n", + "\u001b[A\n", + "100%|██████████| 68.0/68.0 [09:58<00:00, 8.80s/iB]\u001b[A\n", + "\u001b[A\n", + "100%|██████████| 68.0/68.0 [09:58<00:00, 8.80s/iB]\u001b[A" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Moviepy - Building video .editing_assets/general_video_assets/d497348cbfcb418d835889a4/rendered_video.mp4.\n", + "MoviePy - Writing audio in rendered_videoTEMP_MPY_wvf_snd.mp4\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "\n", + "\u001b[A\n", + "100%|██████████| 68.0/68.0 [09:58<00:00, 8.80s/iB]\u001b[A\n", + "\u001b[A\n", + "100%|██████████| 68.0/68.0 [09:58<00:00, 8.80s/iB]\u001b[A" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "MoviePy - Done.\n", + "Moviepy - Writing video .editing_assets/general_video_assets/d497348cbfcb418d835889a4/rendered_video.mp4\n", + "\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "\n", + "\u001b[A\n", + "100%|██████████| 68.0/68.0 [10:05<00:00, 8.90s/iB]\u001b[A\n", + "\u001b[A\n", + "100%|██████████| 68.0/68.0 [10:05<00:00, 8.90s/iB]\u001b[A" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Moviepy - Done !\n", + "Moviepy - video ready .editing_assets/general_video_assets/d497348cbfcb418d835889a4/rendered_video.mp4\n", + "Step 10: Current step (10 / 10) : _addMetadata\n", + "Video Output Path: videos/2024-02-28_21-37-54 - The Future of AI Boon or Bane .mp4\n" + ] + } + ] + } + ], + "metadata": { + "colab": { + "provenance": [], + "gpuType": "T4" + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + }, + "accelerator": "GPU" + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/Tips_&_Tricks b/Tips_&_Tricks new file mode 100644 index 0000000000000000000000000000000000000000..b9ef538f36847baeaa94c3b6558416d9266a669b --- /dev/null +++ b/Tips_&_Tricks @@ -0,0 +1,13 @@ +How to change the color, font and size of subtitles? + +1. Go To "\shortGPT\editing_framework\editing_steps" +2. Look For The Following file: "-make_caption.json" & "-make_caption_landscape.json" +3. look for" + + ""color": "white", +"stroke_color": "black", " + +Change them to + +"color": "transparent", +"stroke_color": "transparent", diff --git a/assets/img/logo.png b/assets/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2e3fe972f835803544dcef0277218f9933543b71 Binary files /dev/null and b/assets/img/logo.png differ diff --git a/automate.sh b/automate.sh new file mode 100644 index 0000000000000000000000000000000000000000..05b28c957b9e0dbf37f66b14a8786f2192a7b526 --- /dev/null +++ b/automate.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +log=$(date +%s) +rm *.log +python ultra.py >> $log.log && +python final_upload.py >> $log.log && + +echo "run" diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..b2d6de30624f651a6c584d4faefafceac6302be1 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,20 @@ +# Dependencies +/node_modules + +# Production +/build + +# Generated files +.docusaurus +.cache-loader + +# Misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000000000000000000000000000000000000..be5090f1f1046ade93dceb3363eaeef18158a8a6 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,10 @@ +# ShortGPT Documentation +# Installation + +1. `yarn install` in the root of this repository (two level above this directory). +1. In this directory, do `yarn start`. +1. A browser window will open up, pointing to the docs. + +# Deployment + +Vercel handles the deployment of this website. diff --git a/docs/babel.config.js b/docs/babel.config.js new file mode 100644 index 0000000000000000000000000000000000000000..e00595dae7d69190e2a9d07202616c2ea932e487 --- /dev/null +++ b/docs/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [require.resolve('@docusaurus/core/lib/babel/preset')], +}; diff --git a/docs/docs/api-key-manager.mdx b/docs/docs/api-key-manager.mdx new file mode 100644 index 0000000000000000000000000000000000000000..f547ad7d1d7541c6e82d9da2391306b4c1176da5 --- /dev/null +++ b/docs/docs/api-key-manager.mdx @@ -0,0 +1,52 @@ +--- +title: ApiKeyManager in ShortGPT +sidebar_label: ApiKeyManager +--- + +# ApiKeyManager in ShortGPT + +ApiKeyManager is a class in the ShortGPT framework that manages the API keys for different providers. It interacts with the database to get and set API keys. + +## Importing ApiKeyManager + +```python +from shortGPT.config.api_db import ApiKeyManager, ApiProvider +``` + +## Using ApiKeyManager + +ApiKeyManager provides two main methods: `get_api_key` and `set_api_key`. + +### set_api_key + +This method is used to set the API key for a specific provider in the database. It takes two arguments: the key (provider name) and the value (API key). + +```python +ApiKeyManager.set_api_key(ApiProvider.OPENAI, "your_openai_key") +ApiKeyManager.set_api_key(ApiProvider.ELEVEN_LABS, "your_eleven_labs_key") +``` + +In the above example, we are setting the API keys for OPENAI and ELEVEN_LABS. + +### get_api_key + +This method is used to retrieve the API key for a specific provider from the database. It takes one argument: the key (provider name). + +```python +openai_key = ApiKeyManager.get_api_key(ApiProvider.OPENAI) +eleven_labs_key = ApiKeyManager.get_api_key(ApiProvider.ELEVEN_LABS) +``` +In the above example, we are retrieving the API keys for OPENAI and ELEVEN_LABS. + +## Note + +The `key` argument in both methods can either be a string or an instance of the `ApiProvider` enum. If it is an instance of `ApiProvider`, the `value` attribute of the enum instance will be used as the key. + +```python +ApiKeyManager.set_api_key("OPENAI", "your_openai_key") +ApiKeyManager.set_api_key("ELEVEN LABS", "your_eleven_labs_key") + +openai_key = ApiKeyManager.get_api_key("OPENAI") +eleven_labs_key = ApiKeyManager.get_api_key("ELEVEN LABS") +``` +In the above example, we are setting and retrieving the API keys using string keys instead of `ApiProvider` instances. \ No newline at end of file diff --git a/docs/docs/asset-database.mdx b/docs/docs/asset-database.mdx new file mode 100644 index 0000000000000000000000000000000000000000..85a6852281a06522e2b93cffa43fa5d0729f1af0 --- /dev/null +++ b/docs/docs/asset-database.mdx @@ -0,0 +1,88 @@ +--- +title: AssetDatabase in ShortGPT +sidebar_label: AssetDatabase +--- + +# AssetDatabase in ShortGPT + +The `AssetDatabase` in ShortGPT is a powerful tool that allows you to manage both local and remote assets. This guide will provide you with examples of how to use the `AssetDatabase`. + +## Importing AssetDatabase and AssetType + +```python +from shortGPT.config.asset_db import AssetDatabase, AssetType +``` + +## Adding Assets + +You can add both remote and local assets to the `AssetDatabase`. + +### Adding Remote Assets + +```python +AssetDatabase.add_remote_asset("minecraft background cube", AssetType.BACKGROUND_VIDEO, "https://www.youtube.com/watch?v=Pt5_GSKIWQM") +AssetDatabase.add_remote_asset('chill music', AssetType.BACKGROUND_MUSIC, "https://www.youtube.com/watch?v=uUu1NcSHg2E") +``` + +### Adding Local Assets + +```python +AssetDatabase.add_local_asset('my_music', AssetType.AUDIO, "./my_music.wav") +``` + +## Asset Types + +The `AssetType` enum is used to specify the type of asset being added to the `AssetDatabase`. The available asset types are: + +- VIDEO +- AUDIO +- IMAGE +- BACKGROUND_MUSIC +- BACKGROUND_VIDEO +- OTHER + +## Getting Asset Information + +You can retrieve information about an asset using the following methods: + +### Get Asset Duration + +This method returns the duration in seconds of a video or audio asset. If the asset is neither video nor audio, it returns `None`. + +```python +AssetDatabase.get_asset_duration('minecraft background cube') +``` + +### Get Asset Link + +This method returns a source URL, or the path of the resource. If the asset is a YouTube video or audio, it uses `yt-dlp` to extract a download URL or a direct video/audio link. + +```python +AssetDatabase.get_asset_link('minecraft background cube') +``` + +## Synchronizing Local Assets + +The `sync_local_assets` method synchronizes the database with local assets found in the `/public` folder. If it doesn't find one, it doesn't do anything. + +```python +AssetDatabase.sync_local_assets() +``` + +## Removing Assets + +You can remove an asset from the database by providing its name to the `remove_asset` method. + +```python +AssetDatabase.remove_asset('name') +``` + +## Getting Database State + +You can get the state of the asset database as a pandas dataframe using the `get_df` method. + +```python +AssetDatabase.get_df() +``` + +This method returns a dataframe that includes the name, type, link, source, and timestamp of each asset in the database. \ No newline at end of file diff --git a/docs/docs/content-translation-engine.mdx b/docs/docs/content-translation-engine.mdx new file mode 100644 index 0000000000000000000000000000000000000000..dcc8649575326be1027a407b6aa561c433873eff --- /dev/null +++ b/docs/docs/content-translation-engine.mdx @@ -0,0 +1,69 @@ +--- +title: ContentTranslationEngine +sidebar_label: ContentTranslationEngine +--- + +The `ContentTranslationEngine` in ShortGPT is a powerful tool that automates the process of translating video content. This guide will provide you with an overview of how to use the `ContentTranslationEngine`. + +## Importing ContentTranslationEngine + +```python +from shortGPT.engine.content_translation_engine import ContentTranslationEngine +``` + +## Initializing ContentTranslationEngine + +The `ContentTranslationEngine` requires a `VoiceModule`, a source URL (either a local video file path or a YouTube link), a target language, and an optional flag indicating whether to use captions for translation. + +```python +content_engine = ContentTranslationEngine(voice_module, src_url, target_language, use_captions=False) +``` + +## Example + +```python +from shortGPT.config.api_db import ApiKeyManager, ApiProvider +from shortGPT.engine.content_translation_engine import ContentTranslationEngine +from shortGPT.config.languages import Language +from shortGPT.audio.edge_voice_module import EdgeTTSVoiceModule, EDGE_TTS_VOICENAME_MAPPING + +# Set API Keys +ApiKeyManager.set_api_key(ApiProvider.OPENAI, "your_openai_key") +ApiKeyManager.set_api_key(ApiProvider.ELEVEN_LABS, "your_eleven_labs_key") + +# Configure the Voice Module +voice_name = EDGE_TTS_VOICENAME_MAPPING[Language.SPANISH]['male'] +voice_module = EdgeTTSVoiceModule(voice_name) + +# Configure Content Engine +src_url = "https://www.youtube.com/watch?v=QQz5hj8y1TE" +target_language = Language.SPANISH +use_captions = False +content_engine = ContentTranslationEngine(voice_module, src_url, target_language, use_captions) + +# Generate Content +for step_num, step_logs in content_engine.makeContent(): + print(f" {step_logs}") + +# Get Video Output Path +print(content_engine.get_video_output_path()) +``` + +## How ContentTranslationEngine Works + +The `ContentTranslationEngine` works by executing a series of steps defined in the `stepDict` dictionary. Each step is a method that performs a specific task in the video translation process. Here's what each step does: + +1. `_transcribe_audio`: Transcribes the audio from the source video +2. `_translate_content`: Translates the transcribed content from the source language to the target language. +3. `_generate_translated_audio`: Generates translated audio using the translated content and the specified `VoiceModule`. +4. `_edit_and_render_video`: Edits and renders the translated video. +5. `_add_metadata`: Adds metadata to the translated video. + +## Providing a Source URL + +The `ContentTranslationEngine` requires a source URL, which can be either a local video file path or a YouTube link for a youtube Video, or a Youtube Shorts. The engine uses this source URL to retrieve the audio and video content for translation. + +## Using Captions for Translation + +Set the `use_captions` flag to `True` to see text captions on the video generated that are timed with the audio voice. + diff --git a/docs/docs/content-video-engine.mdx b/docs/docs/content-video-engine.mdx new file mode 100644 index 0000000000000000000000000000000000000000..7057b8a71a885cf3f5b309b39379795348c0c64b --- /dev/null +++ b/docs/docs/content-video-engine.mdx @@ -0,0 +1,77 @@ +--- +title: ContentVideoEngine +sidebar_label: ContentVideoEngine +--- + +The `ContentVideoEngine` in ShortGPT is a powerful tool that encapsulates all the automation required to create a video. This guide will provide you with an overview of how to use the `ContentVideoEngine`. + +## Importing ContentVideoEngine + +```python +from shortGPT.engine.content_video_engine import ContentVideoEngine +``` + +## Initializing ContentVideoEngine + +The `ContentVideoEngine` requires a `VoiceModule`, a script, and optionally a background music name, a watermark (string with the name of your channel / brand), a flag indicating whether the video you want is in vertical format, and a language. + +```python +content_engine = ContentVideoEngine(voice_module, script, background_music_name="", watermark=None, isVerticalFormat=False, language=Language.ENGLISH) +``` +## Example + +```python +from shortGPT.config.api_db import ApiKeyManager, ApiProvider +from shortGPT.config.asset_db import AssetDatabase, AssetType +from shortGPT.engine.content_video_engine import ContentVideoEngine +from shortGPT.config.languages import Language +from shortGPT.audio.edge_voice_module import EdgeTTSVoiceModule, EDGE_TTS_VOICENAME_MAPPING + +# Set API Keys +ApiKeyManager.set_api_key(ApiProvider.OPENAI, "your_openai_key") +ApiKeyManager.set_api_key(ApiProvider.PEXELS, "your_pexels_key") + +# Add Assets +AssetDatabase.add_remote_asset('chill music', AssetType.BACKGROUND_MUSIC, "https://www.youtube.com/watch?v=uUu1NcSHg2E") + +# Configure the Voice Module +voice_name = EDGE_TTS_VOICENAME_MAPPING[Language.SPANISH]['male'] +voice_module = EdgeTTSVoiceModule(voice_name) + +# Prepare the script +script = "La inteligencia artificial (IA) está revolucionando nuestro mundo de manera sorprendente. Los robots y asistentes virtuales nos ayudan en nuestras tareas diarias y simplifican nuestra vida. En la medicina, la IA permite diagnósticos más precisos y avances en tratamientos. En la industria automotriz, los vehículos autónomos están cambiando la forma en que nos desplazamos. Sin embargo, surgen interrogantes sobre el impacto en el empleo y la ética de su uso. A pesar de los desafíos, la IA promete un futuro emocionante y lleno de posibilidades. ¿Estamos preparados para abrazar este avance tecnológico?" + +# Configure Content Engine +content_engine = ContentVideoEngine(voice_module, script, background_music_name='chill music', language=Language.SPANISH) + +# Generate Content +for step_num, step_logs in content_engine.makeContent(): + print(f" {step_logs}") + +# Get Video Output Path +print(content_engine.get_video_output_path()) +``` + +In this example, we first set the API keys for OpenAI, and Pexels. We then add a remote asset for background music. We configure the voice module to use EdgeTTS for voice synthesis. We prepare a script for the video and then configure the `ContentVideoEngine` with the voice module, script, and background music. We then generate the content and print the output path of the video. +## How ContentVideoEngine Works + +The `ContentVideoEngine` works by executing a series of steps defined in the `stepDict` dictionary. Each step is a method that performs a specific task in the video creation process. Here's what each step does: + +1. `_generateTempAudio`: Generates a temporary audio file from the provided script using the specified `VoiceModule`. +2. `_speedUpAudio`: Speeds up the generated audio file to match the pace of a typical video. +3. `_timeCaptions`: Generates timed captions for the video based on the script. +4. `_generateVideoSearchTerms`: Generates search terms to find relevant videos on Pexels based on the script. +5. `_generateVideoUrls`: Retrieves video URLs from Pexels using the generated search terms. +6. `_chooseBackgroundMusic`: Chooses background music for the video. +7. `_prepareBackgroundAssets`: Prepares the background assets for the video. +8. `_prepareCustomAssets`: Prepares any custom assets for the video. +9. `_editAndRenderShort`: Edits and renders the video. +10. `_addMetadata`: Adds metadata to the video. + +## Using Pexels API + +The `ContentVideoEngine` sources video assets from the Pexels API. To use it, you need to provide your Pexels API key. The engine uses this key to retrieve relevant videos based on the search terms generated from the script. + +## Providing a Script + +The `ContentVideoEngine` requires a script to generate the video. The script is used to generate the audio, captions, and search terms for sourcing videos from Pexels. The script should be a string containing the narration for the video. \ No newline at end of file diff --git a/docs/docs/facts-short-engine.mdx b/docs/docs/facts-short-engine.mdx new file mode 100644 index 0000000000000000000000000000000000000000..59a1b9c1a35df02ccc3799b6206c4169cd556a1c --- /dev/null +++ b/docs/docs/facts-short-engine.mdx @@ -0,0 +1,84 @@ +--- +title: FactsShortEngine +sidebar_label: FactsShortEngine +--- + +The `FactsShortEngine` in ShortGPT is a content engine specifically designed for generating short videos that present interesting facts. This guide will provide you with an overview of how to use the `FactsShortEngine`. + +## Importing FactsShortEngine + +```python +from shortGPT.engine.facts_short_engine import FactsShortEngine +``` + +## Initializing FactsShortEngine + +The `FactsShortEngine` requires a `VoiceModule`, the type of facts you want to generate, a background video name, a background music name, the number of images to include in the video, a watermark (string with the name of your channel / brand), and a language. + +```python +content_engine = FactsShortEngine(voice_module, facts_type, background_video_name, background_music_name, num_images=None, watermark=None, language=Language.ENGLISH) +``` + +## Example + +```python +from shortGPT.config.api_db import ApiKeyManager, ApiProvider +from shortGPT.config.asset_db import AssetDatabase, AssetType +from shortGPT.engine.facts_short_engine import FactsShortEngine +from shortGPT.config.languages import Language +from shortGPT.audio.edge_voice_module import EdgeTTSVoiceModule, EDGE_TTS_VOICENAME_MAPPING + +# Set API Keys +ApiKeyManager.set_api_key(ApiProvider.OPENAI, "your_openai_key") + +# Add Assets +AssetDatabase.add_remote_asset("minecraft background cube", AssetType.BACKGROUND_VIDEO, "https://www.youtube.com/watch?v=Pt5_GSKIWQM") +AssetDatabase.add_remote_asset('chill music', AssetType.BACKGROUND_MUSIC, "https://www.youtube.com/watch?v=uUu1NcSHg2E") + +# Configure the Voice Module +voice_name = EDGE_TTS_VOICENAME_MAPPING[Language.GERMAN]['male'] +voice_module = EdgeTTSVoiceModule(voice_name) + +# Configure Content Engine +facts_video_topic = "Interesting scientific facts from the 19th century" +content_engine = FactsShortEngine(voice_module=voice_module, + facts_type=facts_video_topic, + background_video_name="minecraft background cube", # <--- use the same name you saved in the AssetDatabase + background_music_name='chill music', # <--- use the same name you saved in the AssetDatabase + num_images=5, # If you don't want images in your video, put 0 or None + language=Language.GERMAN) + +# Generate Content +for step_num, step_logs in content_engine.makeContent(): + print(f" {step_logs}") + +# Get Video Output Path +print(content_engine.get_video_output_path()) +``` + +In this example, we first set the API keys for OpenAI. We then add remote assets for the background video and background music. We configure the voice module to use EdgeTTS for voice synthesis. We configure the `FactsShortEngine` with the voice module, facts type, background video name, background music name, number of images, and language. We then generate the content and print the output path of the video. + +## How FactsShortEngine Works + +The `FactsShortEngine` works by executing a series of steps defined in the `stepDict` dictionary. Each step is a method that performs a specific task in the video creation process. Here's what each step does: + +1. `_generateScript`: Generates the script for the facts short using the provided `facts_type`. +2. `_generateTempAudio`: Generates a temporary audio file from the generated script using the specified `VoiceModule`. +3. `_speedUpAudio`: Speeds up the generated audio file to match the pace of a typical video. +4. `_timeCaptions`: Generates timed captions for the video based on the script. +5. `_generateImageSearchTerms`: Generates search terms to find relevant images using the Bing search engine based on the script. +6. `_generateImageUrls`: Retrieves image URLs from Bing using the generated search terms. +7. `_chooseBackgroundMusic`: Chooses background music for the video. +8. `_chooseBackgroundVideo`: Chooses a background video for the video. +9. `_prepareBackgroundAssets`: Prepares the background assets for the video. +10. `_prepareCustomAssets`: Prepares any custom assets for the video. +11. `_editAndRenderShort`: Edits and renders the video. +12. `_addYoutubeMetadata`: Adds metadata to the video. + + +## Providing a Facts Type + +The `FactsShortEngine` requires a facts type to generate the script. The facts type should be a string indicating the specific category or topic of facts you want to include in the video. + + +That's it! You have now successfully generated a facts short video using the FactsShortEngine in the ShortGPT framework. \ No newline at end of file diff --git a/docs/docs/getting-started.mdx b/docs/docs/getting-started.mdx new file mode 100644 index 0000000000000000000000000000000000000000..ab086a863d76ebbeaec5b9bf775f4c780101e264 --- /dev/null +++ b/docs/docs/getting-started.mdx @@ -0,0 +1,59 @@ +--- +title: ShortGPT Hello World Example +sidebar_label: ShortGPT Hello World Example +--- +# ShortGPT Hello World Example + +This guide provides a basic example of how to use the shortGPT framework. ShortGPT encapsulates the entire process of content automation into `content engines`. In this example, we'll show you how to instantiate the FactsShortEngine, which will automate the production of the "Interesting Facts" niche of Shorts. + +## Prerequisites + +Before you start, make sure you have [followed the installation steps](./how-to-install) and have your API keys ready. + +## Code + +```python +from shortGPT.config.api_db import ApiKeyManager, ApiProvider +from shortGPT.config.asset_db import AssetDatabase, AssetType +from shortGPT.engine.facts_short_engine import FactsShortEngine +from shortGPT.audio.eleven_voice_module import ElevenLabsVoiceModule +from shortGPT.config.languages import Language +from shortGPT.audio.edge_voice_module import EdgeTTSVoiceModule, EDGE_TTS_VOICENAME_MAPPING + +# Set API Keys +ApiKeyManager.set_api_key(ApiProvider.OPENAI, "your_openai_key") +ApiKeyManager.set_api_key(ApiProvider.ELEVEN_LABS, "your_eleven_labs_key") + +# Add Assets +AssetDatabase.add_remote_asset("minecraft background cube", AssetType.BACKGROUND_VIDEO, "https://www.youtube.com/watch?v=Pt5_GSKIWQM") +AssetDatabase.add_remote_asset('chill music', AssetType.BACKGROUND_MUSIC, "https://www.youtube.com/watch?v=uUu1NcSHg2E") +AssetDatabase.add_local_asset('my_music', AssetType.AUDIO, "./my_music.wav") + +USE_ELEVEN_LABS = False +# Configure the ElevenLabs Voice Module +if USE_ELEVEN_LABS: + eleven_labs_key = ApiKeyManager.get_api_key(ApiProvider.ELEVEN_LABS) + voice_module = ElevenLabsVoiceModule(api_key = eleven_labs_key, voiceName="Antoni") +else: + ## You can also use the EdgeTTS for Free voice synthesis + voice_name = EDGE_TTS_VOICENAME_MAPPING[Language.GERMAN]['male'] + voice_module = EdgeTTSVoiceModule(voice_name) + +# Configure Content Engine +facts_video_topic = "Interesting scientific facts from the 19th century" +content_engine = FactsShortEngine(voiceModule=voice_module, + facts_type=facts_video_topic, + background_video_name="minecraft background cube", # <--- use the same name you saved in the AssetDatabase + background_music_name='chill music', # <--- use the same name you saved in the AssetDatabase + num_images=5, # If you don't want images in your video, put 0 or None + language=Language.GERMAN) + +# Generate Content +for step_num, step_logs in content_engine.makeContent(): + print(f" {step_logs}") + +# Get Video Output Path +print(content_engine.get_video_output_path()) +``` + +That's it! You have now successfully generated your first content using the shortGPT framework. diff --git a/docs/docs/how-to-install.mdx b/docs/docs/how-to-install.mdx new file mode 100644 index 0000000000000000000000000000000000000000..9ed52268073b2dfaf5ecc8dbedbe83912730a8e1 --- /dev/null +++ b/docs/docs/how-to-install.mdx @@ -0,0 +1,121 @@ +--- +title: Step-by-Step Guide to Installing ShortGPT +sidebar_label: Installation Guide +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Launching Your ShortGPT Experience + +This guide will walk you through the process of setting up your machine to run the **ShortGPT** library. The setup requires two key components, ImageMagick and FFmpeg. Follow the steps below to get these dependencies installed. + +## Before You Begin + +Make sure you have the following installed on your machine: + +- Python 3.x +- Pip (Python package installer) + +## Installation Process + +Here are the steps to install ImageMagick, FFmpeg, and the ShortGPT library. + + + + +### Step 1: Install ImageMagick + +ImageMagick is a crucial component for ShortGPT. Download the installer from the official ImageMagick website. Click on the link below to get started. + +> **[👉 Download ImageMagick Here 👈](https://imagemagick.org/script/download.php)** + +After downloading, follow the installation instructions provided on the website. + +### Step 2: Install FFmpeg (Essential for ShortGPT) + +FFmpeg is another key component for ShortGPT. Download the FFmpeg binaries from the link below: + +> **[👉 Download FFmpeg Here (click on +FFmpeg_Full.msi ) 👈](https://github.com/icedterminal/ffmpeg-installer/releases/tag/6.0.0.20230306)** + +The download will include ffmpeg and ffprobe and will add it to your path. Follow the installation instructions as guided. +
+Step 3: Install ShortGPT Library + +- Open a terminal or command prompt. +- Execute the following command: + +```bash +pip install --upgrade shortgpt +``` + +
+ +
+ + + +### Step 1: Install ImageMagick + +Run the command below in your command line: + +```bash +brew install imagemagick +``` + +### Step 2: Install FFmpeg (Essential for ShortGPT) + +Run the command below in your command line: + +```bash +brew install ffmpeg +``` + +
+Step 3: Install ShortGPT Library + +- Open a terminal or command prompt. +- Execute the following command: + +```bash +pip install --upgrade shortgpt +``` + +
+ +
+ + + +### Step 1: Install ImageMagick + +Execute the following command: + +```bash +sudo apt-get install imagemagick +``` + +### Step 2: Install FFmpeg + +Execute the following command: + +```bash +sudo apt-get install ffmpeg +``` + +
+Step 3: Install ShortGPT Library + +- Open a terminal or command prompt. +- Execute the following command: + +```bash +pip install --upgrade shortgpt +``` + +
+ +
+
+ +And there you have it! Your machine is now ready to run ShortGPT. Dive into the world of automated video content creation with ShortGPT! \ No newline at end of file diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js new file mode 100644 index 0000000000000000000000000000000000000000..fa089dcb4d5db25b8114d2f455523d3a3c12631f --- /dev/null +++ b/docs/docusaurus.config.js @@ -0,0 +1,135 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +const darkCodeTheme = require('prism-react-renderer/themes/dracula'); +const lightCodeTheme = require('prism-react-renderer/themes/github'); + +// With JSDoc @type annotations, IDEs can provide config autocompletion +/** @type {import('@docusaurus/types').DocusaurusConfig} */ +( + module.exports = { + title: 'ShortGPT', + tagline: + 'Open-Source Framework for AI content automation', + url: 'https://dev.shortgpt.ai', + baseUrl: '/', + favicon: 'img/favicon.ico', + organizationName: 'RayVentura', + projectName: 'ShortGPT', + onBrokenLinks: 'throw', + onBrokenMarkdownLinks: 'throw', + presets: [ + [ + '@docusaurus/preset-classic', + /** @type {import('@docusaurus/preset-classic').Options} */ + ({ + docs: { + path: 'docs', + sidebarPath: 'sidebars.js', + editUrl: + 'https://github.com/RayVentura/ShortGPT/edit/stable/docs/', + versions: { + current: { + label: 'current', + }, + }, + lastVersion: 'current', + showLastUpdateAuthor: true, + showLastUpdateTime: true, + }, + theme: { + customCss: require.resolve('./src/css/custom.css'), + }, + }), + ], + ], + plugins: ['tailwind-loader'], + themeConfig: + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + ({ + + navbar: { + hideOnScroll: true, + logo: { + alt: 'ShortGPT', + src: 'img/logo.png', + }, + items: [ + // left + { + label: 'Docs', + to: 'docs/how-to-install', + position: 'right', + }, + // right + { + type: 'docsVersionDropdown', + position: 'right', + }, + { + href: 'https://github.com/RayVentura/ShortGPT', + position: 'right', + className: 'header-github-link', + }, + ], + }, + colorMode: { + defaultMode: 'light', + disableSwitch: false, + respectPrefersColorScheme: true, + }, + announcementBar: { + content: + '⭐️ If you like ShortGPT, give it a star on GitHub! ⭐️', + }, + footer: { + links: [ + { + title: 'Docs', + items: [ + { + label: 'Getting Started', + to: 'docs/how-to-install', + }, + + ], + }, + { + title: 'ShortGPT', + items: [ + { + label: 'Issues', + to: 'https://github.com/RayVentura/ShortGPT/issues', + }, + ], + }, + { + title: 'Community', + items: [ + { + label: 'Discord', + to: 'https://discord.com/invite/bRTacwYrfX', + }, + ], + }, + { + title: 'Social', + items: [ + { + label: 'GitHub', + to: 'https://github.com/RayVentura/ShortGPT', + }, + { + label: 'Twitter', + to: 'https://twitter.com/RayVenturaHQ', + }, + ], + }, + ], + copyright: `ShortGPT ${new Date().getFullYear()}`, + }, + prism: { + theme: lightCodeTheme, + darkTheme: darkCodeTheme, + }, + }), + } +); diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 0000000000000000000000000000000000000000..ea2beddca061df1a8cb90dfb43d8b8ee65500f59 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,51 @@ +{ + "name": "shortgpt-documentation", + "version": "3.5.1", + "private": true, + "scripts": { + "build:clean": "rm -rf dist build .docusaurus node_modules", + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids" + }, + "dependencies": { + "@algolia/ui-library": "9.10.2", + "@docsearch/react": "3.5.1", + "@docusaurus/core": "2.4.1", + "@docusaurus/preset-classic": "2.4.1", + "@mdx-js/react": "^1.6.22", + "clsx": "^1.1.1", + "file-loader": "6.2.0", + "my-loaders": "file:plugins/my-loaders", + "postcss": "8.4.25", + "postcss-import": "15.0.0", + "postcss-preset-env": "7.8.2", + "prism-react-renderer": "1.2.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "tailwind-loader": "file:plugins/tailwind-loader", + "url-loader": "4.1.1" + }, + "devDependencies": { + "postcss-loader": "6.2.1", + "tailwindcss": "npm:@tailwindcss/postcss7-compat" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} \ No newline at end of file diff --git a/docs/plugins/my-loaders/index.js b/docs/plugins/my-loaders/index.js new file mode 100644 index 0000000000000000000000000000000000000000..4f397dd79e2be1582a7ac922a47e611b2b762f9a --- /dev/null +++ b/docs/plugins/my-loaders/index.js @@ -0,0 +1,18 @@ +module.exports = function () { + return { + name: 'loaders', + configureWebpack() { + return { + module: { + rules: [ + { + test: /\.(gif|png|jpe?g|svg)$/i, + exclude: /\.(mdx?)$/i, + use: ['file-loader', { loader: 'image-webpack-loader' }], + }, + ], + }, + }; + }, + }; +}; diff --git a/docs/plugins/tailwind-loader/index.js b/docs/plugins/tailwind-loader/index.js new file mode 100644 index 0000000000000000000000000000000000000000..8cb190285d9357b73385c1547ddf8b06fb217084 --- /dev/null +++ b/docs/plugins/tailwind-loader/index.js @@ -0,0 +1,19 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +module.exports = function () { + return { + name: 'postcss-tailwindcss-loader', + configurePostCss(postcssOptions) { + postcssOptions.plugins.push( + require('postcss-import'), + require('tailwindcss'), + require('postcss-preset-env')({ + autoprefixer: { + flexbox: 'no-2009', + }, + stage: 4, + }) + ); + return postcssOptions; + }, + }; +}; diff --git a/docs/sidebars.js b/docs/sidebars.js new file mode 100644 index 0000000000000000000000000000000000000000..b4cfefa4954ea840f5522f22d3cb6e7046e0ab2a --- /dev/null +++ b/docs/sidebars.js @@ -0,0 +1,33 @@ +/** + * Creating a sidebar enables you to: + * - create an ordered group of docs + * - render a sidebar for each doc of that group + * - provide next/previous navigation. + * + * The sidebars can be generated from the filesystem, or explicitly defined here. + * + * Create as many sidebars as you want. + */ + +module.exports = { + docs: [ + { + type: 'category', + label: 'Introduction', + collapsed: false, + items: ['how-to-install', 'getting-started'], + }, + { + type: 'category', + label: 'Content Engines', + collapsed: false, + items: ['content-video-engine', 'content-translation-engine', 'facts-short-engine'], + }, + { + type: 'category', + label: 'API Key and Asset', + collapsed: false, + items: ['api-key-manager', 'asset-database'], + }, + ], +}; diff --git a/docs/src/components/Home.js b/docs/src/components/Home.js new file mode 100644 index 0000000000000000000000000000000000000000..4ecee8ec384f04e857eb269c6c6a386b192e3891 --- /dev/null +++ b/docs/src/components/Home.js @@ -0,0 +1,356 @@ +import { Hero } from '@algolia/ui-library'; +import { useColorMode } from '@docusaurus/theme-common'; +import { useBaseUrlUtils } from '@docusaurus/useBaseUrl'; +import React from 'react'; +import { Link } from 'react-router-dom'; + +function Home() { + const { withBaseUrl } = useBaseUrlUtils(); + const { colorMode } = useColorMode(); + + React.useEffect(() => { + if (colorMode === 'dark') { + document.querySelector('html').classList.add('dark'); + } else { + document.querySelector('html').classList.remove('dark'); + } + }, [colorMode]); + + function Header() { + return ( + + + + 🚀🎬 SHORTGPT + + + Opensource AI Content Automation Framework + + + } + background="cubes" + cta={[ + + Get started + + ]} + /> + ); + } + + function Description() { + return ( + <> + {/* Description */} +
+
+
+

+ Automating video and short content creation with AI +

+

+ ShortGPT is a powerful framework for automating content creation. It simplifies video creation, footage sourcing, voiceover synthesis, and editing tasks. +

+
+ +
+
    +
  • +
    +
    +
    + + + +
    +
    +
    +

    + Automated editing framework +

    +

    + ShortGPT streamlines the video creation process with an LLM oriented video editing language, making it easier to automate editing tasks. +

    +
    +
    +
  • +
  • +
    +
    +
    + + + +
    +
    +
    +

    + Voiceover / Content Creation +

    +

    + ShortGPT supports multiple languages for voiceover synthesis, making it easy to create content in various languages. +

    +
    +
    +
  • +
  • +
    +
    +
    + + + +
    +
    +
    +

    + Asset Sourcing +

    +

    + ShortGPT can source images and video footage from the internet, allowing you to easily find and use relevant visuals. +

    +
    +
    +
  • +
+
+
+
+ + {/* How it works */} +
+
+
+
+

+ How it works +

+

+ ShortGPT is an AI-powered framework that automates the process of content creation, from script generation to asset sourcing and video editing. +

+
+
+ +
+
+
+
+
+ +
+
+
+ Automated Editing Framework +
+

+ ShortGPT employs a heavy usage of LLMs and automated video editing libraries to streamline the video creation process (Ffmpeg, moviepy, ffprobe). +

+
+
+
+
+ Configuration of your crawler +
+
+
+ Voiceover / Content Creation +
+

+ ShortGPT integrates multiple neural voice synthesis engines (ElevenLabs, EdgeTTS), to allow human-like voice quality in the audio generated. +

+
+
+
+
+ Implementation on your website +
+
+
+ Asset Sourcing +
+

+ ShortGPT is equipped with an advanced asset sourcing module that can retrieve images and video footage from the internet. This feature allows for the easy incorporation of relevant visuals into the content (Pexels, youtube, and more soon). +

+
+
+
+
+
+
+
+ + + + {/* Powered by AI */} +
+
+

+ Powered by AI +

+
+
+
+
+
    +
  • +
    +
    +
    + + + +
    +
    +
    +
    + Automated Editing +
    +

    + ShortGPT automates the video editing process, making it faster and more efficient with the help of AI. +

    +
    +
    +
  • +
  • +
    +
    +
    + + + +
    +
    +
    +
    + Voiceover / Content Creation +
    +

    + ShortGPT supports multiple languages for voiceover synthesis, making it easy to create content in various languages. +

    +
    +
    +
  • +
+
+ +
+
    +
  • +
    +
    +
    + + + +
    +
    +
    +
    + Asset Sourcing +
    +

    + ShortGPT can source images and video footage from the internet, allowing you to easily find and use relevant visuals. +

    +
    +
    +
  • +
+
+
+
+
+ + ) + } + + + + return ( +
+
+ +
+ ); +} + +export default Home; diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css new file mode 100644 index 0000000000000000000000000000000000000000..df856aa3d83b589f7ee146f0a2c24cf25484b769 --- /dev/null +++ b/docs/src/css/custom.css @@ -0,0 +1,198 @@ +@import url(fragments.css); +@import 'tailwindcss/tailwind.css'; + +:root { + --ifm-font-size-base: 16px; + --ifm-code-font-size: 90%; + --ifm-background-color: var(--white); + --ifm-color-primary: var(--nebula-500); + --ifm-footer-background-color: var(--grey-100); + --ifm-menu-color-background-active: var(--ifm-color-emphasis-200); +} + +html[data-theme='dark'] { + --ifm-font-base-color: #dee0f2; + --ifm-navbar-link-hover-color: #8b9dff; + --ifm-link-color: #8b9dff; + --ifm-menu-color-active: #8b9dff; + --ifm-background-color: #0a141c; + --ifm-footer-background-color: #0a141c; + --ifm-navbar-background-color: #21243d; + --ifm-menu-color-background-active: #21243d; +} + +.docusaurus-highlight-code-line { + background-color: rgba(0, 0, 0, 0.1); + display: block; + margin: 0 calc(-1 * var(--ifm-pre-padding)); + padding: 0 var(--ifm-pre-padding); +} + +html[data-theme='dark'] .docusaurus-highlight-code-line { + background-color: rgba(0, 0, 0, 0.3); +} + +.diagonal-box { + transform: skewY(-6deg); +} + +.diagonal-content { + transform: skewY(6deg); +} + +[class^='announcementBar'] { + z-index: 10; +} + +.showcase { + background-color: #fff; +} + +html[data-theme='dark'] .showcase { + background-color: #21243d; +} + +.showcase-border { + border-color: rgba(243, 244, 246, 1); +} + +html[data-theme='dark'] .showcase-border { + border-color: rgba(55, 65, 81, 1); +} + +.text-description { + color: rgba(107, 114, 128, 1); +} + +html[data-theme='dark'] .text-description { + color: rgba(209, 213, 219, 1); +} + +/* apply */ +#hero-apply { + z-index: -1; + background-image: linear-gradient( + var(--ifm-footer-background-color), + var(--ifm-navbar-background-color) + ); +} + +html[data-theme='dark'] #hero-apply { + background-image: linear-gradient( + var(--ifm-navbar-background-color), + var(--ifm-background-color) + ); +} + +html[data-theme='dark'] #hero-apply > div:first-child { + opacity: 0.4; +} + +.apply-form { + background-image: linear-gradient(#fff, #f5f5fa); + max-width: 600px; +} + +html[data-theme='dark'] .apply-form { + background-image: radial-gradient( + circle at 50% 0px, + rgb(72, 76, 122), + rgb(35, 38, 59) + ); +} + +.apply-text { + color: #36395a; +} + +html[data-theme='dark'] .apply-text { + color: #fff; +} + +/* index */ +#hero { + background-image: linear-gradient( + var(--ifm-footer-background-color), + var(--ifm-navbar-background-color) + ); +} + +html[data-theme='dark'] #hero { + background-image: linear-gradient( + var(--ifm-navbar-background-color), + var(--ifm-background-color) + ); +} + +html[data-theme='dark'] #hero > div:first-child { + opacity: 0.4; +} + +/** + * Hero component title overrides to match other heading styles + */ +.hero-title { + color: rgb(28, 30, 33); + font-family: var(--ifm-heading-font-family); +} + +html[data-theme='dark'] .hero-title { + color: rgb(227, 227, 227); +} + + +.apply-button:hover { + color: #000000; +} + +/* GitHub */ +.header-github-link:hover { + opacity: 0.6; +} + +.header-github-link:before { + content: ''; + width: 24px; + height: 24px; + display: flex; + background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") + no-repeat; +} + +html[data-theme='dark'] .header-github-link:before { + background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") + no-repeat; +} + +/* Images */ +.image-rendering-crisp { + image-rendering: crisp-edges; + + /* alias for google chrome */ + image-rendering: -webkit-optimize-contrast; +} + +.image-rendering-pixel { + image-rendering: pixelated; +} + +/* Tailwindcss */ + +#tailwind dd, +#tailwind dt { + margin: 0; +} + +#tailwind *, +#tailwind ::before, +#tailwind ::after { + border-width: 0; + border-style: solid; +} + +#tailwind ol, +#tailwind ul { + list-style: none; + margin: 0; + padding: 0; +} diff --git a/docs/src/css/fragments.css b/docs/src/css/fragments.css new file mode 100644 index 0000000000000000000000000000000000000000..7145ca7430b78923d3e2b84238d97c59443f2442 --- /dev/null +++ b/docs/src/css/fragments.css @@ -0,0 +1,2275 @@ +:root { + --transparent: transparent; + --white: #fff; + --grey-900: #23263b; + --grey-800: #36395a; + --grey-700: #484c7a; + --grey-600: #5a5e9a; + --grey-500: #777aaf; + --grey-400: #9698c3; + --grey-300: #b6b7d5; + --grey-200: #d6d6e7; + --grey-100: #f5f5fa; + --grey-050: #fcfcfd; + --grey-000: #fff; + --pink-900: #59063d; + --pink-800: #88085c; + --pink-700: #b80979; + --pink-600: #e90a96; + --pink-500: #f82caa; + --pink-400: #fb5abc; + --pink-300: #fd89ce; + --pink-200: #feb9e2; + --pink-100: #ffeaf6; + --nebula-900: #141d61; + --nebula-800: #1e2b8f; + --nebula-700: #2b3cbb; + --nebula-600: #3c4fe0; + --nebula-500: #5468ff; + --nebula-400: #7c8aff; + --nebula-300: #a3acff; + --nebula-200: #cacfff; + --nebula-100: #f2f3ff; + --cyan-900: #00526c; + --cyan-800: #00769b; + --cyan-700: #009bcb; + --cyan-600: #0db7eb; + --cyan-500: #2cc8f7; + --cyan-400: #5adaff; + --cyan-300: #89e5ff; + --cyan-200: #b9efff; + --cyan-100: #e8faff; + --green-900: #005e36; + --green-800: #028950; + --green-700: #06b66c; + --green-600: #0de589; + --green-500: #5feb9e; + --green-400: #88f0b3; + --green-300: #aaf4c8; + --green-200: #c9f8de; + --green-100: #e6fcf3; + --orange-900: #963209; + --orange-800: #bf470a; + --orange-700: #e8600a; + --orange-600: #f78125; + --orange-500: #faa04b; + --orange-400: #fcbc73; + --orange-300: #fed59a; + --orange-200: #ffe9c3; + --orange-100: #fff9ec; + --red-900: #83111e; + --red-800: #ab1325; + --red-700: #d4142a; + --red-600: #ee243c; + --red-500: #f4495d; + --red-400: #f86e7e; + --red-300: #fc95a1; + --red-200: #febdc5; + --red-100: #ffe6e9; + --current: currentColor; +} +.uil-bgc-transparent { + background-color: transparent; +} +.uil-bgc-white { + background-color: #fff; +} +.uil-bgc-grey-900 { + background-color: #23263b; +} +.uil-bgc-grey-800 { + background-color: #36395a; +} +.uil-bgc-grey-200 { + background-color: #d6d6e7; +} +.hover\:uil-bgc-grey-100:focus, +.hover\:uil-bgc-grey-100:hover, +.uil-bgc-grey-100 { + background-color: #f5f5fa; +} +.uil-bgc-pink-200 { + background-color: #feb9e2; +} +.uil-bgc-nebula-500 { + background-color: #5468ff; +} +.uil-bgc-nebula-200 { + background-color: #cacfff; +} +.uil-bgc-green-200 { + background-color: #c9f8de; +} +.uil-bgc-orange-200 { + background-color: #ffe9c3; +} +.uil-bgc-red-600 { + background-color: #ee243c; +} +.uil-bgc-red-500 { + background-color: #f4495d; +} +.uil-bgc-current { + background-color: currentColor; +} +@media (min-width: 960px) { + .md\:uil-bgc-transparent { + background-color: transparent; + } +} +@media (min-width: 960px) { + .md\:uil-bgc-white { + background-color: #fff; + } +} +@media (min-width: 960px) { + .md\:uil-bgc-grey-900 { + background-color: #23263b; + } +} +.uil-bgp-center { + background-position: 50%; +} +.uil-bgp-bottom { + background-position: bottom; +} +.uil-bgr-no-repeat { + background-repeat: no-repeat; +} +@media (min-width: 960px) { + .md\:uil-bgr-no-repeat { + background-repeat: no-repeat; + } +} +.uil-bgs-cover { + background-size: cover; +} +.uil-bgs-contain { + background-size: contain; +} +@media (min-width: 960px) { + .md\:uil-bgs-contain { + background-size: contain; + } +} +@media (min-width: 1200px) { + .lg\:uil-bgs-cover { + background-size: cover; + } +} +.uil-bd-none { + border: none; +} +.uil-bdc-transparent { + border-color: transparent; +} +.uil-bdc-grey-800 { + border-color: #36395a; +} +.uil-bdc-grey-700 { + border-color: #484c7a; +} +.uil-bdc-grey-200 { + border-color: #d6d6e7; +} +.uil-bdc-grey-100 { + border-color: #f5f5fa; +} +.uil-bdc-pink-600 { + border-color: #e90a96; +} +.uil-bdc-nebula-500 { + border-color: #5468ff; +} +.uil-bdc-green-700 { + border-color: #06b66c; +} +.uil-bdc-orange-600 { + border-color: #f78125; +} +.uil-bdc-red-600 { + border-color: #ee243c; +} +@media (min-width: 960px) { + .md\:uil-bdc-transparent { + border-color: transparent; + } +} +@media (min-width: 960px) { + .md\:uil-bdc-white { + border-color: #fff; + } +} +@media (min-width: 960px) { + .md\:uil-bdc-grey-800 { + border-color: #36395a; + } +} +@media (min-width: 960px) { + .md\:uil-bdc-grey-200 { + border-color: #d6d6e7; + } +} +@media (min-width: 960px) { + .md\:uil-bdc-pink-600 { + border-color: #e90a96; + } +} +@media (min-width: 960px) { + .md\:uil-bdc-nebula-500 { + border-color: #5468ff; + } +} +@media (min-width: 960px) { + .md\:uil-bdc-green-700 { + border-color: #06b66c; + } +} +@media (min-width: 960px) { + .md\:uil-bdc-orange-600 { + border-color: #f78125; + } +} +@media (min-width: 960px) { + .md\:uil-bdc-red-600 { + border-color: #ee243c; + } +} +.uil-bdr-0 { + border-radius: 0; +} +.uil-bdr-2 { + border-radius: 2px; +} +.uil-bdr-4 { + border-radius: 4px; +} +.uil-bdr-6 { + border-radius: 6px; +} +.uil-bdr-8 { + border-radius: 8px; +} +.uil-bdr-20 { + border-radius: 20px; +} +.uil-bdr-max { + border-radius: 9999px; +} +@media (min-width: 960px) { + .md\:uil-bdr-4 { + border-radius: 4px; + } +} +.uil-bdtlr-0 { + border-top-left-radius: 0; +} +.uil-bdtlr-2 { + border-top-left-radius: 2px; +} +.uil-bdtlr-4 { + border-top-left-radius: 4px; +} +.uil-bdtlr-6 { + border-top-left-radius: 6px; +} +.uil-bdtlr-8 { + border-top-left-radius: 8px; +} +.uil-bdtlr-20 { + border-top-left-radius: 20px; +} +.uil-bdtrr-0 { + border-top-right-radius: 0; +} +.uil-bdtrr-2 { + border-top-right-radius: 2px; +} +.uil-bdtrr-4 { + border-top-right-radius: 4px; +} +.uil-bdtrr-6 { + border-top-right-radius: 6px; +} +.uil-bdtrr-8 { + border-top-right-radius: 8px; +} +.uil-bdtrr-20 { + border-top-right-radius: 20px; +} +.uil-bdblr-0 { + border-bottom-left-radius: 0; +} +.uil-bdblr-6 { + border-bottom-left-radius: 6px; +} +.uil-bdbrr-0 { + border-bottom-right-radius: 0; +} +.uil-bdbrr-6 { + border-bottom-right-radius: 6px; +} +@media (min-width: 960px) { + .md\:uil-bdbr-6 { + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; + } +} +.uil-bds-solid { + border-style: solid; +} +@media (min-width: 960px) { + .md\:uil-bds-solid { + border-style: solid; + } +} +.uil-bdts-solid { + border-top-style: solid; +} +.uil-bdrs-solid { + border-right-style: solid; +} +.uil-bdbs-solid { + border-bottom-style: solid; +} +@media (min-width: 960px) { + .md\:uil-bdbs-solid { + border-bottom-style: solid; + } +} +.uil-bdw-0 { + border-width: 0; +} +.uil-bdw-1 { + border-width: 1px; +} +@media (min-width: 960px) { + .md\:uil-bdw-0 { + border-width: 0; + } +} +@media (min-width: 960px) { + .md\:uil-bdw-2 { + border-width: 2px; + } +} +@media (min-width: 960px) { + .md\:uil-bdlw-1 { + border-left-width: 1px; + } +} +.uil-bdtw-1 { + border-top-width: 1px; +} +.uil-bdtw-2 { + border-top-width: 2px; +} +@media (min-width: 960px) { + .md\:uil-bdtw-1 { + border-top-width: 1px; + } +} +.uil-bdrw-1 { + border-right-width: 1px; +} +.uil-bdbw-0 { + border-bottom-width: 0; +} +.uil-bdbw-1 { + border-bottom-width: 1px; +} +@media (min-width: 960px) { + .md\:uil-bdbw-1 { + border-bottom-width: 1px; + } +} +.uil-d-none { + display: none; +} +.uil-d-block { + display: block; +} +.uil-d-inline-block { + display: inline-block; +} +.uil-d-flex { + display: flex; +} +.uil-d-inline-flex { + display: inline-flex; +} +.uil-d-grid { + display: grid; +} +@media (min-width: 500px) { + .xs\:uil-d-block { + display: block; + } +} +@media (min-width: 768px) { + .sm\:uil-d-flex { + display: flex; + } +} +@media (min-width: 768px) { + .sm\:uil-d-grid { + display: grid; + } +} +@media (min-width: 960px) { + .md\:uil-d-none { + display: none; + } +} +@media (min-width: 960px) { + .md\:uil-d-block { + display: block; + } +} +@media (min-width: 960px) { + .md\:uil-d-flex { + display: flex; + } +} +@media (min-width: 960px) { + .md\:uil-d-grid { + display: grid; + } +} +@media (min-width: 1200px) { + .lg\:uil-d-none { + display: none; + } +} +@media (min-width: 1200px) { + .lg\:uil-d-block { + display: block; + } +} +@media (min-width: 1440px) { + .xl\:uil-d-inline-block { + display: inline-block; + } +} +.uil-m-0 { + margin: 0; +} +.uil-m-8 { + margin: 8px; +} +.uil-m-auto { + margin: auto; +} +@media (min-width: 960px) { + .md\:uil-m-0 { + margin: 0; + } +} +@media (min-width: 960px) { + .md\:uil-m-auto { + margin: auto; + } +} +.uil-ml-0 { + margin-left: 0; +} +.uil-ml-8 { + margin-left: 8px; +} +.uil-ml-12 { + margin-left: 12px; +} +.uil-ml-auto { + margin-left: auto; +} +@media (min-width: 500px) { + .xs\:uil-ml-24 { + margin-left: 24px; + } +} +@media (min-width: 768px) { + .sm\:uil-ml-12 { + margin-left: 12px; + } +} +@media (min-width: 768px) { + .sm\:uil-ml-24 { + margin-left: 24px; + } +} +@media (min-width: 960px) { + .md\:uil-ml-0 { + margin-left: 0; + } +} +@media (min-width: 960px) { + .md\:uil-ml-8 { + margin-left: 8px; + } +} +@media (min-width: 960px) { + .md\:uil-ml-50p { + margin-left: 50%; + } +} +@media (min-width: 960px) { + .md\:uil-ml-auto { + margin-left: auto; + } +} +@media (min-width: 1200px) { + .lg\:uil-ml-16 { + margin-left: 16px; + } +} +@media (min-width: 1200px) { + .lg\:uil-ml-48 { + margin-left: 48px; + } +} +@media (min-width: 1440px) { + .xl\:uil-ml-16 { + margin-left: 16px; + } +} +.uil-mt-0 { + margin-top: 0; +} +.uil-mt-4 { + margin-top: 4px; +} +.uil-mt-8 { + margin-top: 8px; +} +.uil-mt-12 { + margin-top: 12px; +} +.uil-mt-16 { + margin-top: 16px; +} +.uil-mt-20 { + margin-top: 20px; +} +.uil-mt-24 { + margin-top: 24px; +} +.uil-mt-32 { + margin-top: 32px; +} +.uil-mt-48 { + margin-top: 48px; +} +.uil-mt-80 { + margin-top: 80px; +} +@media (min-width: 500px) { + .xs\:uil-mt-0 { + margin-top: 0; + } +} +@media (min-width: 768px) { + .sm\:uil-mt-0 { + margin-top: 0; + } +} +@media (min-width: 960px) { + .md\:uil-mt-0 { + margin-top: 0; + } +} +@media (min-width: 960px) { + .md\:uil-mt-8 { + margin-top: 8px; + } +} +@media (min-width: 960px) { + .md\:uil-mt-12 { + margin-top: 12px; + } +} +@media (min-width: 960px) { + .md\:uil-mt-auto { + margin-top: auto; + } +} +@media (min-width: 1200px) { + .lg\:uil-mt-8 { + margin-top: 8px; + } +} +@media (min-width: 1200px) { + .lg\:uil-mt-12 { + margin-top: 12px; + } +} +@media (min-width: 1200px) { + .lg\:uil-mt-20 { + margin-top: 20px; + } +} +@media (min-width: 1200px) { + .lg\:uil-mt-48 { + margin-top: 48px; + } +} +@media (min-width: 1200px) { + .lg\:uil-mt-120 { + margin-top: 120px; + } +} +.uil-mr-0 { + margin-right: 0; +} +.uil-mr-4 { + margin-right: 4px; +} +.uil-mr-8 { + margin-right: 8px; +} +.uil-mr-16 { + margin-right: 16px; +} +.uil-mr-32 { + margin-right: 32px; +} +.uil-mr-auto { + margin-right: auto; +} +@media (min-width: 960px) { + .md\:uil-mr-0 { + margin-right: 0; + } +} +@media (min-width: 960px) { + .md\:uil-mr-8 { + margin-right: 8px; + } +} +@media (min-width: 960px) { + .md\:uil-mr-20 { + margin-right: 20px; + } +} +@media (min-width: 1200px) { + .lg\:uil-mr-12 { + margin-right: 12px; + } +} +.uil-mb-0 { + margin-bottom: 0; +} +.uil-mb-8 { + margin-bottom: 8px; +} +.uil-mb-12 { + margin-bottom: 12px; +} +.uil-mb-16 { + margin-bottom: 16px; +} +.uil-mb-20 { + margin-bottom: 20px; +} +.uil-mb-24 { + margin-bottom: 24px; +} +.uil-mb-48 { + margin-bottom: 48px; +} +@media (min-width: 768px) { + .sm\:uil-mb-0 { + margin-bottom: 0; + } +} +@media (min-width: 960px) { + .md\:uil-mb-0 { + margin-bottom: 0; + } +} +@media (min-width: 960px) { + .md\:uil-mb-16 { + margin-bottom: 16px; + } +} +@media (min-width: 960px) { + .md\:uil-mb-24 { + margin-bottom: 24px; + } +} +@media (min-width: 1200px) { + .lg\:uil-mb-20 { + margin-bottom: 20px; + } +} +@media (min-width: 1200px) { + .lg\:uil-mb-24 { + margin-bottom: 24px; + } +} +@media (min-width: 1200px) { + .lg\:uil-mb-80 { + margin-bottom: 80px; + } +} +.uil-mv-0 { + margin-top: 0; + margin-bottom: 0; +} +.uil-mv-8 { + margin-top: 8px; + margin-bottom: 8px; +} +.uil-mh-0 { + margin-left: 0; + margin-right: 0; +} +.uil-mh-auto { + margin-left: auto; + margin-right: auto; +} +@media (min-width: 960px) { + .md\:uil-mh-12 { + margin-left: 12px; + margin-right: 12px; + } +} +.uil-ov-visible { + overflow: visible; +} +.uil-ov-hidden { + overflow: hidden; +} +.uil-ov-auto { + overflow: auto; +} +@media (min-width: 960px) { + .md\:uil-ov-hidden { + overflow: hidden; + } +} +.uil-ovx-scroll { + overflow-x: scroll; +} +.uil-ovx-auto { + overflow-x: auto; +} +.uil-ovy-hidden { + overflow-y: hidden; +} +.uil-ovy-auto { + overflow-y: auto; +} +.uil-p-0 { + padding: 0; +} +.uil-p-8 { + padding: 8px; +} +.uil-p-12 { + padding: 12px; +} +.uil-p-20 { + padding: 20px; +} +.uil-p-24 { + padding: 24px; +} +.uil-p-48 { + padding: 48px; +} +@media (min-width: 960px) { + .md\:uil-p-48 { + padding: 48px; + } +} +.uil-pl-0 { + padding-left: 0; +} +.uil-pl-8 { + padding-left: 8px; +} +.uil-pl-12 { + padding-left: 12px; +} +.uil-pl-16 { + padding-left: 16px; +} +.uil-pl-24 { + padding-left: 24px; +} +.uil-pl-48 { + padding-left: 48px; +} +@media (min-width: 960px) { + .md\:uil-pl-24 { + padding-left: 24px; + } +} +@media (min-width: 960px) { + .md\:uil-pl-48 { + padding-left: 48px; + } +} +@media (min-width: 1200px) { + .lg\:uil-pl-32 { + padding-left: 32px; + } +} +@media (min-width: 1200px) { + .lg\:uil-pl-48 { + padding-left: 48px; + } +} +.uil-pt-0 { + padding-top: 0; +} +.uil-pt-12 { + padding-top: 12px; +} +.uil-pt-16 { + padding-top: 16px; +} +.uil-pt-24 { + padding-top: 24px; +} +.uil-pt-32 { + padding-top: 32px; +} +.uil-pt-48 { + padding-top: 48px; +} +@media (min-width: 960px) { + .md\:uil-pt-0 { + padding-top: 0; + } +} +@media (min-width: 960px) { + .md\:uil-pt-24 { + padding-top: 24px; + } +} +@media (min-width: 1200px) { + .lg\:uil-pt-24 { + padding-top: 24px; + } +} +@media (min-width: 1200px) { + .lg\:uil-pt-32 { + padding-top: 32px; + } +} +@media (min-width: 1200px) { + .lg\:uil-pt-48 { + padding-top: 48px; + } +} +@media (min-width: 1200px) { + .lg\:uil-pt-80 { + padding-top: 80px; + } +} +.uil-pr-0 { + padding-right: 0; +} +.uil-pr-8 { + padding-right: 8px; +} +.uil-pr-16 { + padding-right: 16px; +} +.uil-pr-24 { + padding-right: 24px; +} +.uil-pr-32 { + padding-right: 32px; +} +.uil-pr-48 { + padding-right: 48px; +} +.uil-pr-80 { + padding-right: 80px; +} +@media (min-width: 960px) { + .md\:uil-pr-0 { + padding-right: 0; + } +} +@media (min-width: 960px) { + .md\:uil-pr-24 { + padding-right: 24px; + } +} +@media (min-width: 960px) { + .md\:uil-pr-48 { + padding-right: 48px; + } +} +@media (min-width: 1200px) { + .lg\:uil-pr-8 { + padding-right: 8px; + } +} +@media (min-width: 1200px) { + .lg\:uil-pr-48 { + padding-right: 48px; + } +} +.uil-pb-0 { + padding-bottom: 0; +} +.uil-pb-12 { + padding-bottom: 12px; +} +.uil-pb-16 { + padding-bottom: 16px; +} +.uil-pb-24 { + padding-bottom: 24px; +} +.uil-pb-48 { + padding-bottom: 48px; +} +.uil-pb-80 { + padding-bottom: 80px; +} +@media (min-width: 960px) { + .md\:uil-pb-24 { + padding-bottom: 24px; + } +} +@media (min-width: 1200px) { + .lg\:uil-pb-24 { + padding-bottom: 24px; + } +} +@media (min-width: 1200px) { + .lg\:uil-pb-48 { + padding-bottom: 48px; + } +} +@media (min-width: 1200px) { + .lg\:uil-pb-80 { + padding-bottom: 80px; + } +} +@media (min-width: 1200px) { + .lg\:uil-pb-120 { + padding-bottom: 120px; + } +} +.uil-pv-8 { + padding-top: 8px; + padding-bottom: 8px; +} +.uil-pv-16 { + padding-top: 16px; + padding-bottom: 16px; +} +.uil-pv-20 { + padding-top: 20px; + padding-bottom: 20px; +} +.uil-pv-24 { + padding-top: 24px; + padding-bottom: 24px; +} +.uil-pv-32 { + padding-top: 32px; + padding-bottom: 32px; +} +.uil-pv-48 { + padding-top: 48px; + padding-bottom: 48px; +} +.uil-pv-80 { + padding-top: 80px; + padding-bottom: 80px; +} +@media (min-width: 960px) { + .md\:uil-pv-120 { + padding-top: 120px; + padding-bottom: 120px; + } +} +@media (min-width: 1200px) { + .lg\:uil-pv-32 { + padding-top: 32px; + padding-bottom: 32px; + } +} +@media (min-width: 1200px) { + .lg\:uil-pv-48 { + padding-top: 48px; + padding-bottom: 48px; + } +} +@media (min-width: 1200px) { + .lg\:uil-pv-120 { + padding-top: 120px; + padding-bottom: 120px; + } +} +.uil-ph-0 { + padding-left: 0; + padding-right: 0; +} +.uil-ph-4 { + padding-left: 4px; + padding-right: 4px; +} +.uil-ph-8 { + padding-left: 8px; + padding-right: 8px; +} +.uil-ph-12 { + padding-left: 12px; + padding-right: 12px; +} +.uil-ph-16 { + padding-left: 16px; + padding-right: 16px; +} +.uil-ph-20 { + padding-left: 20px; + padding-right: 20px; +} +.uil-ph-24 { + padding-left: 24px; + padding-right: 24px; +} +.uil-ph-32 { + padding-left: 32px; + padding-right: 32px; +} +@media (min-width: 768px) { + .sm\:uil-ph-16 { + padding-left: 16px; + padding-right: 16px; + } +} +@media (min-width: 960px) { + .md\:uil-ph-0 { + padding-left: 0; + padding-right: 0; + } +} +@media (min-width: 960px) { + .md\:uil-ph-20 { + padding-left: 20px; + padding-right: 20px; + } +} +@media (min-width: 960px) { + .md\:uil-ph-48 { + padding-left: 48px; + padding-right: 48px; + } +} +@media (min-width: 1200px) { + .lg\:uil-ph-20 { + padding-left: 20px; + padding-right: 20px; + } +} +@media (min-width: 1200px) { + .lg\:uil-ph-32 { + padding-left: 32px; + padding-right: 32px; + } +} +@media (min-width: 1200px) { + .lg\:uil-ph-48 { + padding-left: 48px; + padding-right: 48px; + } +} +.uil-v-visible { + visibility: visible; +} +.uil-v-hidden { + visibility: hidden; +} +@media (min-width: 960px) { + .md\:uil-v-visible { + visibility: visible; + } +} +@media (min-width: 960px) { + .md\:uil-v-hidden { + visibility: hidden; + } +} +.hover\:uil-color-white:focus, +.hover\:uil-color-white:hover, +.uil-color-white { + color: #fff; +} +.hover\:uil-color-grey-900:focus, +.hover\:uil-color-grey-900:hover, +.uil-color-grey-900 { + color: #23263b; +} +.uil-color-grey-800 { + color: #36395a; +} +.hover\:uil-color-grey-700:focus, +.hover\:uil-color-grey-700:hover, +.uil-color-grey-700 { + color: #484c7a; +} +.hover\:uil-color-grey-600:focus, +.hover\:uil-color-grey-600:hover, +.uil-color-grey-600 { + color: #5a5e9a; +} +.uil-color-grey-500 { + color: #777aaf; +} +.hover\:uil-color-grey-400:focus, +.hover\:uil-color-grey-400:hover, +.uil-color-grey-400 { + color: #9698c3; +} +.uil-color-grey-300 { + color: #b6b7d5; +} +.hover\:uil-color-grey-200:focus, +.hover\:uil-color-grey-200:hover, +.uil-color-grey-200 { + color: #d6d6e7; +} +.hover\:uil-color-grey-100:focus, +.hover\:uil-color-grey-100:hover, +.uil-color-grey-100 { + color: #f5f5fa; +} +.uil-color-pink-600 { + color: #e90a96; +} +.uil-color-nebula-500 { + color: #5468ff; +} +.uil-color-green-700 { + color: #06b66c; +} +.uil-color-orange-600 { + color: #f78125; +} +.uil-color-red-600 { + color: #ee243c; +} +.uil-color-red-500 { + color: #f4495d; +} +.uil-color-current { + color: currentColor; +} +.uil-fill-white { + fill: #fff; +} +.uil-ai-center { + align-items: center; +} +.uil-ai-end { + align-items: flex-end; +} +@media (min-width: 768px) { + .sm\:uil-ai-start { + align-items: flex-start; + } +} +@media (min-width: 960px) { + .md\:uil-ai-start { + align-items: flex-start; + } +} +@media (min-width: 960px) { + .md\:uil-ai-center { + align-items: center; + } +} +@media (min-width: 960px) { + .md\:uil-ai-end { + align-items: flex-end; + } +} +@media (min-width: 1200px) { + .lg\:uil-ai-end { + align-items: flex-end; + } +} +.uil-as-end { + align-self: flex-end; +} +.uil-fxd-column { + flex-direction: column; +} +.uil-fxd-row { + flex-direction: row; +} +@media (min-width: 500px) { + .xs\:uil-fxd-row { + flex-direction: row; + } +} +@media (min-width: 768px) { + .sm\:uil-fxd-row { + flex-direction: row; + } +} +@media (min-width: 960px) { + .md\:uil-fxd-column { + flex-direction: column; + } +} +@media (min-width: 960px) { + .md\:uil-fxd-row { + flex-direction: row; + } +} +@media (min-width: 960px) { + .md\:uil-fxd-row-reverse { + flex-direction: row-reverse; + } +} +.uil-fxg-0 { + flex-grow: 0; +} +.uil-fxg-1 { + flex-grow: 1; +} +@media (min-width: 960px) { + .md\:uil-fxg-1 { + flex-grow: 1; + } +} +.uil-fxs-0 { + flex-shrink: 0; +} +.uil-fxs-1 { + flex-shrink: 1; +} +.uil-fx-1 { + flex: 0 1 8.333333%; +} +.uil-fx-4 { + flex: 0 1 33.333333%; +} +.uil-fx-5 { + flex: 0 1 41.666667%; +} +.uil-fx-6 { + flex: 0 1 50%; +} +.uil-fx-12 { + flex: 0 1 100%; +} +@media (min-width: 960px) { + .md\:uil-fx-5 { + flex: 0 1 41.666667%; + } +} +@media (min-width: 960px) { + .md\:uil-fx-6 { + flex: 0 1 50%; + } +} +@media (min-width: 960px) { + .md\:uil-fx-7 { + flex: 0 1 58.333333%; + } +} +@media (min-width: 960px) { + .md\:uil-fx-9 { + flex: 0 1 75%; + } +} +.uil-jc-center { + justify-content: center; +} +.uil-jc-end { + justify-content: flex-end; +} +.uil-jc-between { + justify-content: space-between; +} +.uil-jc-around { + justify-content: space-around; +} +@media (min-width: 500px) { + .xs\:uil-jc-center { + justify-content: center; + } +} +@media (min-width: 768px) { + .sm\:uil-jc-start { + justify-content: flex-start; + } +} +@media (min-width: 768px) { + .sm\:uil-jc-center { + justify-content: center; + } +} +@media (min-width: 960px) { + .md\:uil-jc-start { + justify-content: flex-start; + } +} +@media (min-width: 960px) { + .md\:uil-jc-center { + justify-content: center; + } +} +@media (min-width: 960px) { + .md\:uil-jc-end { + justify-content: flex-end; + } +} +@media (min-width: 960px) { + .md\:uil-jc-between { + justify-content: space-between; + } +} +@media (min-width: 960px) { + .md\:uil-jc-around { + justify-content: space-around; + } +} +@media (min-width: 1200px) { + .lg\:uil-jc-end { + justify-content: flex-end; + } +} +@media (min-width: 960px) { + .md\:uil-gcstart-1 { + grid-column-start: 1; + } +} +@media (min-width: 960px) { + .md\:uil-gcstart-2 { + grid-column-start: 2; + } +} +@media (min-width: 960px) { + .md\:uil-gcend-3 { + grid-column-end: 3; + } +} +@media (min-width: 960px) { + .md\:uil-grstart-1 { + grid-row-start: 1; + } +} +@media (min-width: 960px) { + .md\:uil-grstart-2 { + grid-row-start: 2; + } +} +@media (min-width: 960px) { + .md\:uil-grend-3 { + grid-row-end: 3; + } +} +@media (min-width: 960px) { + .md\:uil-grend-4 { + grid-row-end: 4; + } +} +.uil-g-2 { + grid-template-columns: repeat(2, 1fr); +} +@media (min-width: 768px) { + .sm\:uil-g-2 { + grid-template-columns: repeat(2, 1fr); + } +} +@media (min-width: 768px) { + .sm\:uil-g-3 { + grid-template-columns: repeat(3, 1fr); + } +} +@media (min-width: 768px) { + .sm\:uil-g-4 { + grid-template-columns: repeat(4, 1fr); + } +} +@media (min-width: 768px) { + .sm\:uil-g-5 { + grid-template-columns: repeat(5, 1fr); + } +} +@media (min-width: 768px) { + .sm\:uil-g-6 { + grid-template-columns: repeat(6, 1fr); + } +} +@media (min-width: 960px) { + .md\:uil-g-2 { + grid-template-columns: repeat(2, 1fr); + } +} +@media (min-width: 960px) { + .md\:uil-g-3 { + grid-template-columns: repeat(3, 1fr); + } +} +@media (min-width: 960px) { + .md\:uil-g-4 { + grid-template-columns: repeat(4, 1fr); + } +} +@media (min-width: 960px) { + .md\:uil-g-5 { + grid-template-columns: repeat(5, 1fr); + } +} +@media (min-width: 960px) { + .md\:uil-g-6 { + grid-template-columns: repeat(6, 1fr); + } +} +.uil-ggap-24 { + grid-gap: 24px; +} +.uil-ggap-48 { + grid-gap: 48px; +} +@media (min-width: 1200px) { + .lg\:uil-ggap-24 { + grid-gap: 24px; + } +} +@media (min-width: 1200px) { + .lg\:uil-ggap-32 { + grid-gap: 32px; + } +} +@media (min-width: 1200px) { + .lg\:uil-ggap-48 { + grid-gap: 48px; + } +} +@media (min-width: 1200px) { + .lg\:uil-ggap-80 { + grid-gap: 80px; + } +} +.uil-gvgap-8 { + grid-column-gap: 8px; +} +@media (min-width: 768px) { + .sm\:uil-gvgap-48 { + grid-column-gap: 48px; + } +} +.uil-ghgap-48 { + grid-row-gap: 48px; +} +.uil-obf-contain { + -o-object-fit: contain; + object-fit: contain; +} +.uil-obf-cover { + -o-object-fit: cover; + object-fit: cover; +} +.uil-obp-center { + -o-object-position: center; + object-position: center; +} +.uil-bot-0 { + bottom: 0; +} +.uil-bot-70 { + bottom: 70px; +} +@media (min-width: 960px) { + .md\:uil-bot-0 { + bottom: 0; + } +} +@media (min-width: 960px) { + .md\:uil-fl-right { + float: right; + } +} +.uil-left-0 { + left: 0; +} +.uil-left-50p { + left: 50%; +} +@media (min-width: 960px) { + .md\:uil-left-0 { + left: 0; + } +} +@media (min-width: 960px) { + .md\:uil-left-50p { + left: 50%; + } +} +.uil-pos-relative { + position: relative; +} +.uil-pos-absolute { + position: absolute; +} +.uil-pos-fixed { + position: fixed; +} +.uil-pos-sticky { + position: sticky; +} +@media (min-width: 768px) { + .sm\:uil-pos-absolute { + position: absolute; + } +} +@media (min-width: 960px) { + .md\:uil-pos-relative { + position: relative; + } +} +@media (min-width: 960px) { + .md\:uil-pos-absolute { + position: absolute; + } +} +@media (min-width: 960px) { + .md\:uil-pos-fixed { + position: fixed; + } +} +@media (min-width: 960px) { + .md\:uil-pos-sticky { + position: sticky; + } +} +.uil-right-0 { + right: 0; +} +@media (min-width: 960px) { + .md\:uil-right-0 { + right: 0; + } +} +@media (min-width: 960px) { + .md\:uil-right-50p { + right: 50%; + } +} +.uil-top-0 { + top: 0; +} +.uil-top-32 { + top: 32px; +} +.uil-top-50p { + top: 50%; +} +@media (min-width: 768px) { + .sm\:uil-top-0 { + top: 0; + } +} +@media (min-width: 960px) { + .md\:uil-top-0 { + top: 0; + } +} +@media (min-width: 960px) { + .md\:uil-top-50p { + top: 50%; + } +} +.uil-va-middle { + vertical-align: middle; +} +.uil-z-1 { + z-index: 1; +} +.uil-z-2 { + z-index: 2; +} +.uil-z-3 { + z-index: 3; +} +.uil-z-4 { + z-index: 4; +} +.uil-z-5 { + z-index: 5; +} +.uil-z-max { + z-index: 100; +} +@media (min-width: 960px) { + .md\:uil-z-5 { + z-index: 5; + } +} +@media (min-width: 960px) { + .md\:uil-z-max { + z-index: 100; + } +} +.uil-app-none { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +.uil-bxs-default { + box-shadow: 0 5px 15px 0 rgba(37, 44, 97, 0.15), + 0 2px 4px 0 rgba(93, 100, 148, 0.2); +} +.uil-bxs-large { + box-shadow: 0 24px 41px 0 rgba(37, 44, 97, 0.13); +} +.uil-bxs-none { + box-shadow: none; +} +@media (min-width: 960px) { + .md\:uil-bxs-default { + box-shadow: 0 5px 15px 0 rgba(37, 44, 97, 0.15), + 0 2px 4px 0 rgba(93, 100, 148, 0.2); + } +} +.uil-cursor-auto { + cursor: auto; +} +.uil-cursor-pointer { + cursor: pointer; +} +.uil-cursor-not-allowed { + cursor: not-allowed; +} +.uil-op-0 { + opacity: 0; +} +.uil-op-50p { + opacity: 0.5; +} +.uil-op-40p { + opacity: 0.4; +} +.uil-op-75p { + opacity: 0.75; +} +.uil-op-100p { + opacity: 1; +} +@media (min-width: 960px) { + .md\:uil-op-0 { + opacity: 0; + } +} +@media (min-width: 960px) { + .md\:uil-op-25p { + opacity: 0.25; + } +} +@media (min-width: 960px) { + .md\:uil-op-100p { + opacity: 1; + } +} +.uil-pe-auto { + pointer-events: auto; +} +.uil-pe-none { + pointer-events: none; +} +@media (min-width: 960px) { + .md\:uil-pe-none { + pointer-events: none; + } +} +.uil-us-none { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.uil-h-0 { + height: 0; +} +.uil-h-10 { + height: 10px; +} +.uil-h-14 { + height: 14px; +} +.uil-h-16 { + height: 16px; +} +.uil-h-18 { + height: 18px; +} +.uil-h-20 { + height: 20px; +} +.uil-h-24 { + height: 24px; +} +.uil-h-25 { + height: 25px; +} +.uil-h-30 { + height: 30px; +} +.uil-h-40 { + height: 40px; +} +.uil-h-50 { + height: 50px; +} +.uil-h-60 { + height: 60px; +} +.uil-h-70 { + height: 70px; +} +.uil-h-80 { + height: 80px; +} +.uil-h-200 { + height: 200px; +} +.uil-h-10p { + height: 10%; +} +.uil-h-20p { + height: 20%; +} +.uil-h-25p { + height: 25%; +} +.uil-h-30p { + height: 30%; +} +.uil-h-40p { + height: 40%; +} +.uil-h-50p { + height: 50%; +} +.uil-h-60p { + height: 60%; +} +.uil-h-70p { + height: 70%; +} +.uil-h-80p { + height: 80%; +} +.uil-h-90p { + height: 90%; +} +.uil-h-100p { + height: 100%; +} +.uil-h-100vh { + height: 100vh; +} +.uil-h-auto { + height: auto; +} +@media (min-width: 960px) { + .md\:uil-h-10 { + height: 10px; + } +} +@media (min-width: 960px) { + .md\:uil-h-30 { + height: 30px; + } +} +@media (min-width: 960px) { + .md\:uil-h-60p { + height: 60%; + } +} +@media (min-width: 960px) { + .md\:uil-h-100p { + height: 100%; + } +} +@media (min-width: 960px) { + .md\:uil-h-100vh { + height: 100vh; + } +} +@media (min-width: 960px) { + .md\:uil-h-auto { + height: auto; + } +} +@media (min-width: 1200px) { + .lg\:uil-h-18 { + height: 18px; + } +} +@media (min-width: 1200px) { + .lg\:uil-h-20 { + height: 20px; + } +} +@media (min-width: 1200px) { + .lg\:uil-h-24 { + height: 24px; + } +} +@media (min-width: 1200px) { + .lg\:uil-h-30 { + height: 30px; + } +} +@media (min-width: 1200px) { + .lg\:uil-h-40 { + height: 40px; + } +} +@media (min-width: 1200px) { + .lg\:uil-h-70 { + height: 70px; + } +} +@media (min-width: 1200px) { + .lg\:uil-h-80 { + height: 80px; + } +} +@media (min-width: 1200px) { + .lg\:uil-h-100 { + height: 100px; + } +} +@media (min-width: 1200px) { + .lg\:uil-h-100p { + height: 100%; + } +} +.uil-mah-100p { + max-height: 100%; +} +.uil-mah-100vh { + max-height: 100vh; +} +@media (min-width: 960px) { + .md\:uil-mah-100p { + max-height: 100%; + } +} +.uil-maw-500 { + max-width: 500px; +} +.uil-maw-700 { + max-width: 700px; +} +.uil-maw-800 { + max-width: 800px; +} +.uil-maw-1200 { + max-width: 1200px; +} +.uil-maw-1440 { + max-width: 1440px; +} +.uil-maw-35ch { + max-width: 35ch; +} +.uil-maw-100p { + max-width: 100%; +} +@media (min-width: 960px) { + .md\:uil-maw-600 { + max-width: 600px; + } +} +@media (min-width: 960px) { + .md\:uil-maw-900 { + max-width: 900px; + } +} +@media (min-width: 960px) { + .md\:uil-maw-1200 { + max-width: 1200px; + } +} +@media (min-width: 960px) { + .md\:uil-maw-100p { + max-width: 100%; + } +} +@media (min-width: 1200px) { + .lg\:uil-maw-1200 { + max-width: 1200px; + } +} +.uil-miw-200 { + min-width: 200px; +} +@media (min-width: 960px) { + .md\:uil-miw-300 { + min-width: 300px; + } +} +.uil-w-10 { + width: 10px; +} +.uil-w-14 { + width: 14px; +} +.uil-w-16 { + width: 16px; +} +.uil-w-18 { + width: 18px; +} +.uil-w-20 { + width: 20px; +} +.uil-w-25 { + width: 25px; +} +.uil-w-30 { + width: 30px; +} +.uil-w-40 { + width: 40px; +} +.uil-w-50 { + width: 50px; +} +.uil-w-60 { + width: 60px; +} +.uil-w-100 { + width: 100px; +} +.uil-w-200 { + width: 200px; +} +.uil-w-50p { + width: 50%; +} +.uil-w-70p { + width: 70%; +} +.uil-w-80p { + width: 80%; +} +.uil-w-100p { + width: 100%; +} +.uil-w-auto { + width: auto; +} +@media (min-width: 500px) { + .xs\:uil-w-60p { + width: 60%; + } +} +@media (min-width: 500px) { + .xs\:uil-w-70p { + width: 70%; + } +} +@media (min-width: 960px) { + .md\:uil-w-10 { + width: 10px; + } +} +@media (min-width: 960px) { + .md\:uil-w-30 { + width: 30px; + } +} +@media (min-width: 960px) { + .md\:uil-w-400 { + width: 400px; + } +} +@media (min-width: 960px) { + .md\:uil-w-40p { + width: 40%; + } +} +@media (min-width: 960px) { + .md\:uil-w-50p { + width: 50%; + } +} +@media (min-width: 960px) { + .md\:uil-w-60p { + width: 60%; + } +} +@media (min-width: 960px) { + .md\:uil-w-70p { + width: 70%; + } +} +@media (min-width: 960px) { + .md\:uil-w-100p { + width: 100%; + } +} +@media (min-width: 960px) { + .md\:uil-w-auto { + width: auto; + } +} +@media (min-width: 1200px) { + .lg\:uil-w-18 { + width: 18px; + } +} +@media (min-width: 1200px) { + .lg\:uil-w-20 { + width: 20px; + } +} +@media (min-width: 1200px) { + .lg\:uil-w-24 { + width: 24px; + } +} +@media (min-width: 1200px) { + .lg\:uil-w-30 { + width: 30px; + } +} +@media (min-width: 1200px) { + .lg\:uil-w-40 { + width: 40px; + } +} +@media (min-width: 1200px) { + .lg\:uil-w-50 { + width: 50px; + } +} +@media (min-width: 1200px) { + .lg\:uil-w-80 { + width: 80px; + } +} +@media (min-width: 1200px) { + .lg\:uil-w-200 { + width: 200px; + } +} +@media (min-width: 1200px) { + .lg\:uil-w-50p { + width: 50%; + } +} +@media (min-width: 1200px) { + .lg\:uil-w-70p { + width: 70%; + } +} +@media (min-width: 1200px) { + .lg\:uil-w-80p { + width: 80%; + } +} +@media (min-width: 1200px) { + .lg\:uil-w-90p { + width: 90%; + } +} +@media (min-width: 1200px) { + .lg\:uil-w-100p { + width: 100%; + } +} +.uil-ff-hind { + font-family: Hind, Arial, sans-serif; +} +.uil-ff-poppins { + font-family: Poppins, Arial, sans-serif; +} +.uil-ff-mono { + font-family: SFMono-Regular, Consolas, Andale Mono WT, Andale Mono, + Lucida Console, Lucida Sans Typewriter, DejaVu Sans Mono, + Bitstream Vera Sans Mono, Liberation Mono, Nimbus Mono L, Monaco, + Courier New, Courier, monospace; +} +@media (min-width: 1200px) { + .lg\:uil-ff-hind { + font-family: Hind, Arial, sans-serif; + } +} +.uil-fsz-10 { + font-size: 10px; +} +.uil-fsz-11 { + font-size: 11px; +} +.uil-fsz-12 { + font-size: 12px; +} +.uil-fsz-14 { + font-size: 14px; +} +.uil-fsz-16 { + font-size: 16px; +} +.uil-fsz-18 { + font-size: 18px; +} +.uil-fsz-24 { + font-size: 24px; +} +.uil-fsz-36 { + font-size: 36px; +} +@media (min-width: 960px) { + .md\:uil-fsz-16 { + font-size: 16px; + } +} +@media (min-width: 1200px) { + .lg\:uil-fsz-12 { + font-size: 12px; + } +} +@media (min-width: 1200px) { + .lg\:uil-fsz-14 { + font-size: 14px; + } +} +@media (min-width: 1200px) { + .lg\:uil-fsz-16 { + font-size: 16px; + } +} +@media (min-width: 1200px) { + .lg\:uil-fsz-18 { + font-size: 18px; + } +} +@media (min-width: 1200px) { + .lg\:uil-fsz-24 { + font-size: 24px; + } +} +@media (min-width: 1200px) { + .lg\:uil-fsz-36 { + font-size: 36px; + } +} +@media (min-width: 1200px) { + .lg\:uil-fsz-56 { + font-size: 56px; + } +} +.uil-fst-normal { + font-style: normal; +} +.uil-fw-light { + font-weight: 300; +} +.uil-fw-normal { + font-weight: 400; +} +.uil-fw-semibold { + font-weight: 600; +} +.uil-fw-bold { + font-weight: 700; +} +.uil-lsp-small { + letter-spacing: -1px; +} +.uil-lsp-big { + letter-spacing: 1.5px; +} +.uil-lsp-normal { + letter-spacing: normal; +} +@media (min-width: 1200px) { + .lg\:uil-lsp-medium { + letter-spacing: 0.7px; + } +} +.uil-lh-small { + line-height: 1; +} +.uil-lh-big { + line-height: 1.33; +} +.uil-lh-bigger { + line-height: 1.78; +} +.uil-lis-none { + list-style: none; +} +.uil-ta-left { + text-align: left; +} +.uil-ta-center { + text-align: center; +} +.uil-ta-right { + text-align: right; +} +@media (min-width: 768px) { + .sm\:uil-ta-left { + text-align: left; + } +} +@media (min-width: 960px) { + .md\:uil-ta-left { + text-align: left; + } +} +@media (min-width: 960px) { + .md\:uil-ta-center { + text-align: center; + } +} +@media (min-width: 960px) { + .md\:uil-ta-right { + text-align: right; + } +} +.hover\:uil-td-none:focus, +.hover\:uil-td-none:hover, +.uil-td-none { + text-decoration: none; +} +@media (min-width: 960px) { + .md\:uil-td-none { + text-decoration: none; + } +} +.uil-to-ellipsis { + text-overflow: ellipsis; +} +@media (min-width: 1200px) { + .lg\:uil-to-ellipsis { + text-overflow: ellipsis; + } +} +.uil-tt-upper { + text-transform: uppercase; +} +.uil-tt-lower { + text-transform: lowercase; +} +.uil-ws-nowrap { + white-space: nowrap; +} +@media (min-width: 1200px) { + .lg\:uil-ws-nowrap { + white-space: nowrap; + } +} +.uil-wb-break { + word-break: break-word; +} diff --git a/docs/src/pages/index.js b/docs/src/pages/index.js new file mode 100644 index 0000000000000000000000000000000000000000..06fe025384978c7cdc59f7c9a2929ae0abf1f723 --- /dev/null +++ b/docs/src/pages/index.js @@ -0,0 +1,17 @@ +import Layout from '@theme/Layout'; +import React from 'react'; + +import Home from '../components/Home'; + +function HomePage() { + return ( + + + + ); +} + +export default HomePage; diff --git a/docs/static/img/assets/configuration.svg b/docs/static/img/assets/configuration.svg new file mode 100644 index 0000000000000000000000000000000000000000..ba1474297e46ef8cd385d227bab152d1191a9524 --- /dev/null +++ b/docs/static/img/assets/configuration.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/static/img/assets/implementation.svg b/docs/static/img/assets/implementation.svg new file mode 100644 index 0000000000000000000000000000000000000000..6c0884eaee5dc00a024269141f99f9c0bb1ee286 --- /dev/null +++ b/docs/static/img/assets/implementation.svg @@ -0,0 +1 @@ +<script ….SearchK+ \ No newline at end of file diff --git a/docs/static/img/assets/scraping.svg b/docs/static/img/assets/scraping.svg new file mode 100644 index 0000000000000000000000000000000000000000..bb73da8cfca3ed846cdd711fab27e3dd27e637ce --- /dev/null +++ b/docs/static/img/assets/scraping.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/static/img/favicon.ico b/docs/static/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..2a236f6caf8fd821fd8849a109a7ec917c6305a2 Binary files /dev/null and b/docs/static/img/favicon.ico differ diff --git a/docs/static/img/logo.png b/docs/static/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d6a3ccbaa413e934b9837d3904ddcf244b62448c Binary files /dev/null and b/docs/static/img/logo.png differ diff --git a/docs/tailwind.config.js b/docs/tailwind.config.js new file mode 100644 index 0000000000000000000000000000000000000000..8e75e969ec68e453b1bbad763078d02a94a9c6be --- /dev/null +++ b/docs/tailwind.config.js @@ -0,0 +1,12 @@ +module.exports = { + purge: ['./src/**/*.html', './src/**/*.js', './src/**/*.tsx'], + corePlugins: { preflight: false, container: false }, + important: '#tailwind', + theme: { + extend: { + maxWidth: { + xxs: '18rem', + }, + }, + }, +}; diff --git a/docs/yarn.lock b/docs/yarn.lock new file mode 100644 index 0000000000000000000000000000000000000000..c0d38d664eb68d9d45fa99faf973fd4432c45dba --- /dev/null +++ b/docs/yarn.lock @@ -0,0 +1,12039 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@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" + integrity sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw== + dependencies: + "@algolia/autocomplete-plugin-algolia-insights" "1.9.3" + "@algolia/autocomplete-shared" "1.9.3" + +"@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" + 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" + 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" + integrity sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ== + +"@algolia/cache-browser-local-storage@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.19.1.tgz#d29f42775ed4d117182897ac164519c593faf399" + integrity sha512-FYAZWcGsFTTaSAwj9Std8UML3Bu8dyWDncM7Ls8g+58UOe4XYdlgzXWbrIgjaguP63pCCbMoExKr61B+ztK3tw== + dependencies: + "@algolia/cache-common" "4.19.1" + +"@algolia/cache-common@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.19.1.tgz#faa5eeacaffd6023c2cf26e9866bdb06193f9b26" + integrity sha512-XGghi3l0qA38HiqdoUY+wvGyBsGvKZ6U3vTiMBT4hArhP3fOGLXpIINgMiiGjTe4FVlTa5a/7Zf2bwlIHfRqqg== + +"@algolia/cache-in-memory@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.19.1.tgz#afe4f0f21149800358379871089e0141fb72415b" + integrity sha512-+PDWL+XALGvIginigzu8oU6eWw+o76Z8zHbBovWYcrtWOEtinbl7a7UTt3x3lthv+wNuFr/YD1Gf+B+A9V8n5w== + dependencies: + "@algolia/cache-common" "4.19.1" + +"@algolia/client-account@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.19.1.tgz#1fa65881baab79ad35af6bcf44646a13b8d5edc9" + integrity sha512-Oy0ritA2k7AMxQ2JwNpfaEcgXEDgeyKu0V7E7xt/ZJRdXfEpZcwp9TOg4TJHC7Ia62gIeT2Y/ynzsxccPw92GA== + dependencies: + "@algolia/client-common" "4.19.1" + "@algolia/client-search" "4.19.1" + "@algolia/transporter" "4.19.1" + +"@algolia/client-analytics@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.19.1.tgz#e6ed79acd4de5a0284c9696bf4e1c25278ba34db" + integrity sha512-5QCq2zmgdZLIQhHqwl55ZvKVpLM3DNWjFI4T+bHr3rGu23ew2bLO4YtyxaZeChmDb85jUdPDouDlCumGfk6wOg== + dependencies: + "@algolia/client-common" "4.19.1" + "@algolia/client-search" "4.19.1" + "@algolia/requester-common" "4.19.1" + "@algolia/transporter" "4.19.1" + +"@algolia/client-common@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.19.1.tgz#40a8387316fa61d62ad1091beb3a8e227f008e75" + integrity sha512-3kAIVqTcPrjfS389KQvKzliC559x+BDRxtWamVJt8IVp7LGnjq+aVAXg4Xogkur1MUrScTZ59/AaUd5EdpyXgA== + dependencies: + "@algolia/requester-common" "4.19.1" + "@algolia/transporter" "4.19.1" + +"@algolia/client-personalization@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.19.1.tgz#fe362e0684dc74c3504c3641c5a7488c6ae02e07" + integrity sha512-8CWz4/H5FA+krm9HMw2HUQenizC/DxUtsI5oYC0Jxxyce1vsr8cb1aEiSJArQT6IzMynrERif1RVWLac1m36xw== + dependencies: + "@algolia/client-common" "4.19.1" + "@algolia/requester-common" "4.19.1" + "@algolia/transporter" "4.19.1" + +"@algolia/client-search@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.19.1.tgz#5e54601aa5f5cea790cec3f2cde4af9d6403871e" + integrity sha512-mBecfMFS4N+yK/p0ZbK53vrZbL6OtWMk8YmnOv1i0LXx4pelY8TFhqKoTit3NPVPwoSNN0vdSN9dTu1xr1XOVw== + dependencies: + "@algolia/client-common" "4.19.1" + "@algolia/requester-common" "4.19.1" + "@algolia/transporter" "4.19.1" + +"@algolia/events@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@algolia/events/-/events-4.0.1.tgz#fd39e7477e7bc703d7f893b556f676c032af3950" + integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== + +"@algolia/fragments.js@^2.0.0-beta.16": + version "2.0.0-beta.17" + resolved "https://registry.yarnpkg.com/@algolia/fragments.js/-/fragments.js-2.0.0-beta.17.tgz#0cc086c7089e08982274104b8704b6a8d0442eec" + integrity sha512-kpNufmoAEUd5YgyBJlWI21eNWgdhVlHuGgLB+138F8xvWVFixpPyHv6KSvFdhNVOEA4Ij01Tq2JGp8rrZPOfRA== + dependencies: + autoprefixer "^10.4.0" + commander "^2.16.0" + cssnano "^5.0.13" + lodash "^4.17.21" + ora "^3.0.0" + postcss "8.3" + react "^17.0.2" + react-dom "^17.0.2" + +"@algolia/logger-common@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.19.1.tgz#0e46a11510f3e94e1afc0ac780ae52e9597be78f" + integrity sha512-i6pLPZW/+/YXKis8gpmSiNk1lOmYCmRI6+x6d2Qk1OdfvX051nRVdalRbEcVTpSQX6FQAoyeaui0cUfLYW5Elw== + +"@algolia/logger-console@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.19.1.tgz#656a6f4ebb5de39af6ef7095c398d9ab3cceb87d" + integrity sha512-jj72k9GKb9W0c7TyC3cuZtTr0CngLBLmc8trzZlXdfvQiigpUdvTi1KoWIb2ZMcRBG7Tl8hSb81zEY3zI2RlXg== + dependencies: + "@algolia/logger-common" "4.19.1" + +"@algolia/requester-browser-xhr@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.19.1.tgz#7341ea2f980b8980a2976110142026721e452187" + integrity sha512-09K/+t7lptsweRTueHnSnmPqIxbHMowejAkn9XIcJMLdseS3zl8ObnS5GWea86mu3vy4+8H+ZBKkUN82Zsq/zg== + dependencies: + "@algolia/requester-common" "4.19.1" + +"@algolia/requester-common@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.19.1.tgz#f3396c77631b9d36e8d4d6f819a2c27f9ddbf7a1" + integrity sha512-BisRkcWVxrDzF1YPhAckmi2CFYK+jdMT60q10d7z3PX+w6fPPukxHRnZwooiTUrzFe50UBmLItGizWHP5bDzVQ== + +"@algolia/requester-node-http@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.19.1.tgz#ea210de9642628b3bdda1dd7fcd1fcb686da442e" + integrity sha512-6DK52DHviBHTG2BK/Vv2GIlEw7i+vxm7ypZW0Z7vybGCNDeWzADx+/TmxjkES2h15+FZOqVf/Ja677gePsVItA== + dependencies: + "@algolia/requester-common" "4.19.1" + +"@algolia/transporter@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.19.1.tgz#b5787299740c4bec9ba05502d98c14b5999860c8" + integrity sha512-nkpvPWbpuzxo1flEYqNIbGz7xhfhGOKGAZS7tzC+TELgEmi7z99qRyTfNSUlW7LZmB3ACdnqAo+9A9KFBENviQ== + dependencies: + "@algolia/cache-common" "4.19.1" + "@algolia/logger-common" "4.19.1" + "@algolia/requester-common" "4.19.1" + +"@algolia/ui-library@9.10.2": + version "9.10.2" + resolved "https://registry.yarnpkg.com/@algolia/ui-library/-/ui-library-9.10.2.tgz#04119f59fe8940b2b50ce6f0563ade34ffd2a32f" + integrity sha512-kFnWmkeYY/15tlswDI1PBPJ/ylMlPHVIyKTDJJEoZurm7OjLex4XhqVsKAD7CTm4JuQ6jS1yj0Z/cAdPEpQfiw== + dependencies: + "@algolia/fragments.js" "^2.0.0-beta.16" + "@emotion/react" "^11.4.1" + "@storybook/addon-controls" "^6.5.12" + "@storybook/builder-webpack5" "^6.5.12" + "@storybook/manager-webpack5" "^6.5.12" + classnames "^2.2.6" + react-feather "^2.0.9" + resize-observer-polyfill "^1.5.1" + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.22.5", "@babel/code-frame@^7.8.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" + integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== + dependencies: + "@babel/highlight" "^7.22.5" + +"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" + integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== + +"@babel/core@7.12.9": + version "7.12.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" + integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.5" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.5" + "@babel/parser" "^7.12.7" + "@babel/template" "^7.12.7" + "@babel/traverse" "^7.12.9" + "@babel/types" "^7.12.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@^7.12.10", "@babel/core@^7.18.6", "@babel/core@^7.19.6": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.9.tgz#bd96492c68822198f33e8a256061da3cf391f58f" + integrity sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.9" + "@babel/helper-module-transforms" "^7.22.9" + "@babel/helpers" "^7.22.6" + "@babel/parser" "^7.22.7" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.8" + "@babel/types" "^7.22.5" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.1" + +"@babel/generator@^7.12.5", "@babel/generator@^7.18.7", "@babel/generator@^7.22.7", "@babel/generator@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.9.tgz#572ecfa7a31002fa1de2a9d91621fd895da8493d" + integrity sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw== + dependencies: + "@babel/types" "^7.22.5" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.18.6", "@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" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz#a3f4758efdd0190d8927fcffd261755937c71878" + integrity sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz#f9d0a7aaaa7cd32a3f31c9316a69f5a9bcacb892" + integrity sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.5" + browserslist "^4.21.9" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0", "@babel/helper-create-class-features-plugin@^7.22.5", "@babel/helper-create-class-features-plugin@^7.22.6", "@babel/helper-create-class-features-plugin@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz#c36ea240bb3348f942f08b0fbe28d6d979fab236" + integrity sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz#9d8e61a8d9366fe66198f57c40565663de0825f6" + integrity sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + regexpu-core "^5.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz#3c2f91b7971b9fc11fe779c945c014065dea340e" + integrity sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-define-polyfill-provider@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz#82c825cadeeeee7aad237618ebbe8fa1710015d7" + integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + +"@babel/helper-environment-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" + integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== + +"@babel/helper-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== + dependencies: + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + +"@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" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-member-expression-to-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz#0a7c56117cad3372fbf8d2fb4bf8f8d64a1e76b2" + integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" + integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129" + integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.5" + +"@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" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + +"@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.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@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" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-remap-async-to-generator@^7.22.5": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz#53a25b7484e722d7efb9c350c75c032d4628de82" + integrity sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-wrap-function" "^7.22.9" + +"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz#cbdc27d6d8d18cd22c81ae4293765a5d9afd0779" + integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + +"@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" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@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" + 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" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== + +"@babel/helper-validator-option@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" + integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== + +"@babel/helper-wrap-function@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz#189937248c45b0182c1dcf32f3444ca153944cb9" + integrity sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helpers@^7.12.5", "@babel/helpers@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.6.tgz#8e61d3395a4f0c5a8060f309fb008200969b5ecd" + integrity sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA== + dependencies: + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.6" + "@babel/types" "^7.22.5" + +"@babel/highlight@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" + integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.12.7", "@babel/parser@^7.18.8", "@babel/parser@^7.22.5", "@babel/parser@^7.22.7": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae" + integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": + version "7.22.5" + 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.22.5.tgz#87245a21cd69a73b0b81bcda98d443d6df08f05e" + integrity sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz#fef09f9499b1f1c930da8a0c419db42167d792ca" + integrity sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.5" + +"@babel/plugin-proposal-class-properties@^7.12.1": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-decorators@^7.12.12": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.7.tgz#9b5b73c2e404f0869ef8a8a53765f8203c5467a7" + integrity sha512-omXqPF7Onq4Bb7wHxXjM3jSMSJvUUbvDvmmds7KI5n9Cq6Ln5I05I1W2nRlRof1rGdiUxJrxwe285WF96XlBXQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/plugin-syntax-decorators" "^7.22.5" + +"@babel/plugin-proposal-export-default-from@^7.12.1": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.22.5.tgz#825924eda1fad382c3de4db6fe1711b6fa03362f" + integrity sha512-UCe1X/hplyv6A5g2WnQ90tnHRvYL29dabCWww92lO7VdfMVTVReBTRrhiMrKQejHD9oVkdnRdwYuzUZkBVQisg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-default-from" "^7.22.5" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-object-rest-spread@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" + integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.12.1" + +"@babel/plugin-proposal-object-rest-spread@^7.12.1": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.20.7" + +"@babel/plugin-proposal-optional-chaining@^7.12.7": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" + integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.12.1": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" + integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@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" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== + +"@babel/plugin-proposal-private-property-in-object@^7.12.1": + version "7.21.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz#69d597086b6760c4126525cfa154f34631ff272c" + integrity sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@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" + 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" + 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" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-decorators@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.5.tgz#329fe2907c73de184033775637dbbc507f09116a" + integrity sha512-avpUOBS7IU6al8MmF1XpAyj9QYeLPuSDJI5D4pVMSMdL7xQokKqJPYQC67RCT0aCTashUXPiGwMJ0DEXXCEmMA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.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" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-default-from@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.22.5.tgz#ac3a24b362a04415a017ab96b9b4483d0e2a6e44" + integrity sha512-ODAqWWXB/yReh/jVQDag/3/tl6lgBueQkk/TcfW/59Oykm4c8a55XloX0CTk2k2VJiFWMgHby9xNX29IbCv9dQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@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" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-import-assertions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98" + integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-attributes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb" + integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== + 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" + 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" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926" + integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-jsx@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== + 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" + 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" + 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" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@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" + 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" + 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" + 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" + 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" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" + integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== + 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" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" + integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-async-generator-functions@^7.22.7": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz#053e76c0a903b72b573cb1ab7d6882174d460a1b" + integrity sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-transform-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" + integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" + +"@babel/plugin-transform-block-scoped-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" + integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-block-scoping@^7.12.12", "@babel/plugin-transform-block-scoping@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz#8bfc793b3a4b2742c0983fadc1480d843ecea31b" + integrity sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77" + integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-static-block@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz#3e40c46f048403472d6f4183116d5e46b1bff5ba" + integrity sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz#e04d7d804ed5b8501311293d1a0e6d43e94c3363" + integrity sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" + integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.5" + +"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz#d3aca7438f6c26c78cdd0b0ba920a336001b27cc" + integrity sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dotall-regex@^7.22.5", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" + integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-duplicate-keys@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285" + integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dynamic-import@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz#d6908a8916a810468c4edff73b5b75bda6ad393e" + integrity sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a" + integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-export-namespace-from@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz#57c41cb1d0613d22f548fddd8b288eedb9973a5b" + integrity sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-transform-for-of@^7.12.1", "@babel/plugin-transform-for-of@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz#ab1b8a200a8f990137aff9a084f8de4099ab173f" + integrity sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" + integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== + dependencies: + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-json-strings@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz#14b64352fdf7e1f737eed68de1a1468bd2a77ec0" + integrity sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-transform-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" + integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-logical-assignment-operators@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz#66ae5f068fd5a9a5dc570df16f56c2a8462a9d6c" + integrity sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def" + integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-amd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz#4e045f55dcf98afd00f85691a68fc0780704f526" + integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ== + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-commonjs@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz#7d9875908d19b8c0536085af7b053fd5bd651bfa" + integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA== + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + +"@babel/plugin-transform-modules-systemjs@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz#18c31410b5e579a0092638f95c896c2a98a5d496" + integrity sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ== + dependencies: + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + +"@babel/plugin-transform-modules-umd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98" + integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@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" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-new-target@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d" + integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz#f8872c65776e0b552e0849d7596cddd416c3e381" + integrity sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz#57226a2ed9e512b9b446517ab6fa2d17abb83f58" + integrity sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz#9686dc3447df4753b0b2a2fae7e8bc33cdc1f2e1" + integrity sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ== + dependencies: + "@babel/compat-data" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.22.5" + +"@babel/plugin-transform-object-super@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c" + integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + +"@babel/plugin-transform-optional-catch-binding@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz#842080be3076703be0eaf32ead6ac8174edee333" + integrity sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.22.5", "@babel/plugin-transform-optional-chaining@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz#4bacfe37001fe1901117672875e931d439811564" + integrity sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz#c3542dd3c39b42c8069936e48717a8d179d63a18" + integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-methods@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722" + integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-property-in-object@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz#07a77f28cbb251546a43d175a1dda4cf3ef83e32" + integrity sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766" + integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-constant-elements@^7.18.12": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.5.tgz#6dfa7c1c37f7d7279e417ceddf5a04abb8bb9c29" + integrity sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-display-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz#3c4326f9fce31c7968d6cb9debcaf32d9e279a2b" + integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== + 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" + integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.22.5" + +"@babel/plugin-transform-react-jsx@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz#932c291eb6dd1153359e2a90cb5e557dcf068416" + integrity sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/plugin-transform-react-pure-annotations@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz#1f58363eef6626d6fa517b95ac66fe94685e32c0" + integrity sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-regenerator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz#cd8a68b228a5f75fa01420e8cc2fc400f0fc32aa" + integrity sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.1" + +"@babel/plugin-transform-reserved-words@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb" + integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-runtime@^7.18.6": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz#a87b11e170cbbfb018e6a2bf91f5c6e533b9e027" + integrity sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.4" + babel-plugin-polyfill-corejs3 "^0.8.2" + babel-plugin-polyfill-regenerator "^0.5.1" + semver "^6.3.1" + +"@babel/plugin-transform-shorthand-properties@^7.12.1", "@babel/plugin-transform-shorthand-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" + integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-spread@^7.12.1", "@babel/plugin-transform-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" + integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-sticky-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa" + integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-template-literals@^7.12.1", "@babel/plugin-transform-template-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff" + integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typeof-symbol@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34" + integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typescript@^7.22.5": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.9.tgz#91e08ad1eb1028ecc62662a842e93ecfbf3c7234" + integrity sha512-BnVR1CpKiuD0iobHPaM1iLvcwPYN2uVFAqoLVSpEDKWuOikoCv5HbKLxclhKYUXlWkX86DoZGtqI4XhbOsyrMg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-typescript" "^7.22.5" + +"@babel/plugin-transform-unicode-escapes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz#ce0c248522b1cb22c7c992d88301a5ead70e806c" + integrity sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-property-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81" + integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183" + integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91" + integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/preset-env@^7.12.11", "@babel/preset-env@^7.18.6", "@babel/preset-env@^7.19.4": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.9.tgz#57f17108eb5dfd4c5c25a44c1977eba1df310ac7" + integrity sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.5" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.5" + "@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" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.22.5" + "@babel/plugin-syntax-import-attributes" "^7.22.5" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.22.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.7" + "@babel/plugin-transform-async-to-generator" "^7.22.5" + "@babel/plugin-transform-block-scoped-functions" "^7.22.5" + "@babel/plugin-transform-block-scoping" "^7.22.5" + "@babel/plugin-transform-class-properties" "^7.22.5" + "@babel/plugin-transform-class-static-block" "^7.22.5" + "@babel/plugin-transform-classes" "^7.22.6" + "@babel/plugin-transform-computed-properties" "^7.22.5" + "@babel/plugin-transform-destructuring" "^7.22.5" + "@babel/plugin-transform-dotall-regex" "^7.22.5" + "@babel/plugin-transform-duplicate-keys" "^7.22.5" + "@babel/plugin-transform-dynamic-import" "^7.22.5" + "@babel/plugin-transform-exponentiation-operator" "^7.22.5" + "@babel/plugin-transform-export-namespace-from" "^7.22.5" + "@babel/plugin-transform-for-of" "^7.22.5" + "@babel/plugin-transform-function-name" "^7.22.5" + "@babel/plugin-transform-json-strings" "^7.22.5" + "@babel/plugin-transform-literals" "^7.22.5" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.5" + "@babel/plugin-transform-member-expression-literals" "^7.22.5" + "@babel/plugin-transform-modules-amd" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.5" + "@babel/plugin-transform-modules-systemjs" "^7.22.5" + "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.22.5" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.5" + "@babel/plugin-transform-numeric-separator" "^7.22.5" + "@babel/plugin-transform-object-rest-spread" "^7.22.5" + "@babel/plugin-transform-object-super" "^7.22.5" + "@babel/plugin-transform-optional-catch-binding" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.6" + "@babel/plugin-transform-parameters" "^7.22.5" + "@babel/plugin-transform-private-methods" "^7.22.5" + "@babel/plugin-transform-private-property-in-object" "^7.22.5" + "@babel/plugin-transform-property-literals" "^7.22.5" + "@babel/plugin-transform-regenerator" "^7.22.5" + "@babel/plugin-transform-reserved-words" "^7.22.5" + "@babel/plugin-transform-shorthand-properties" "^7.22.5" + "@babel/plugin-transform-spread" "^7.22.5" + "@babel/plugin-transform-sticky-regex" "^7.22.5" + "@babel/plugin-transform-template-literals" "^7.22.5" + "@babel/plugin-transform-typeof-symbol" "^7.22.5" + "@babel/plugin-transform-unicode-escapes" "^7.22.5" + "@babel/plugin-transform-unicode-property-regex" "^7.22.5" + "@babel/plugin-transform-unicode-regex" "^7.22.5" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.4" + babel-plugin-polyfill-corejs3 "^0.8.2" + babel-plugin-polyfill-regenerator "^0.5.1" + core-js-compat "^3.31.0" + semver "^6.3.1" + +"@babel/preset-modules@^0.1.5": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6.tgz#31bcdd8f19538437339d17af00d177d854d9d458" + integrity sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.12.10", "@babel/preset-react@^7.18.6": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.5.tgz#c4d6058fbf80bccad02dd8c313a9aaa67e3c3dd6" + integrity sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-transform-react-display-name" "^7.22.5" + "@babel/plugin-transform-react-jsx" "^7.22.5" + "@babel/plugin-transform-react-jsx-development" "^7.22.5" + "@babel/plugin-transform-react-pure-annotations" "^7.22.5" + +"@babel/preset-typescript@^7.12.7", "@babel/preset-typescript@^7.18.6": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz#16367d8b01d640e9a507577ed4ee54e0101e51c8" + integrity sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.5" + "@babel/plugin-transform-typescript" "^7.22.5" + +"@babel/register@^7.12.1": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.22.5.tgz#e4d8d0f615ea3233a27b5c6ada6750ee59559939" + integrity sha512-vV6pm/4CijSQ8Y47RH5SopXzursN35RQINfGJkmOlcpAtGuf94miFvIPhCKGQN7WGIcsgG1BHEX2KVdTYwTwUQ== + dependencies: + clone-deep "^4.0.1" + find-cache-dir "^2.0.0" + make-dir "^2.1.0" + pirates "^4.0.5" + source-map-support "^0.5.16" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime-corejs3@^7.18.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.22.6.tgz#e8e625eb3db29491e0326b3aeb9929c43b270ae4" + integrity sha512-M+37LLIRBTEVjktoJjbw4KVhupF0U/3PYUCbBwgAd9k17hoKhRu1n935QiG7Tuxv0LJOMrb2vuKEeYUlv0iyiw== + dependencies: + core-js-pure "^3.30.2" + regenerator-runtime "^0.13.11" + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.13", "@babel/runtime@^7.5.0", "@babel/runtime@^7.8.4": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438" + integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/template@^7.12.7", "@babel/template@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" + integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.18.8", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8": + version "7.22.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.8.tgz#4d4451d31bc34efeae01eac222b514a77aa4000e" + integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.7" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.22.7" + "@babel/types" "^7.22.5" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.12.7", "@babel/types@^7.20.0", "@babel/types@^7.22.5", "@babel/types@^7.4.4": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" + integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + to-fast-properties "^2.0.0" + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@csstools/postcss-cascade-layers@^1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz#8a997edf97d34071dd2e37ea6022447dd9e795ad" + integrity sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA== + dependencies: + "@csstools/selector-specificity" "^2.0.2" + postcss-selector-parser "^6.0.10" + +"@csstools/postcss-color-function@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz#2bd36ab34f82d0497cfacdc9b18d34b5e6f64b6b" + integrity sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-font-format-keywords@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz#677b34e9e88ae997a67283311657973150e8b16a" + integrity sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-hwb-function@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz#ab54a9fce0ac102c754854769962f2422ae8aa8b" + integrity sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-ic-unit@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz#28237d812a124d1a16a5acc5c3832b040b303e58" + integrity sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-is-pseudo-class@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz#846ae6c0d5a1eaa878fce352c544f9c295509cd1" + integrity sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA== + dependencies: + "@csstools/selector-specificity" "^2.0.0" + postcss-selector-parser "^6.0.10" + +"@csstools/postcss-nested-calc@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz#d7e9d1d0d3d15cf5ac891b16028af2a1044d0c26" + integrity sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-normalize-display-values@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz#15da54a36e867b3ac5163ee12c1d7f82d4d612c3" + integrity sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-oklab-function@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz#88cee0fbc8d6df27079ebd2fa016ee261eecf844" + integrity sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-progressive-custom-properties@^1.1.0", "@csstools/postcss-progressive-custom-properties@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz#542292558384361776b45c85226b9a3a34f276fa" + integrity sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-stepped-value-functions@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz#f8772c3681cc2befed695e2b0b1d68e22f08c4f4" + integrity sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-text-decoration-shorthand@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz#ea96cfbc87d921eca914d3ad29340d9bcc4c953f" + integrity sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-trigonometric-functions@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz#94d3e4774c36d35dcdc88ce091336cb770d32756" + integrity sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-unset-value@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz#c99bb70e2cdc7312948d1eb41df2412330b81f77" + integrity sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g== + +"@csstools/selector-specificity@^2.0.0", "@csstools/selector-specificity@^2.0.2": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz#2cbcf822bf3764c9658c4d2e568bd0c0cb748016" + integrity sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw== + +"@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" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@docsearch/css@3.5.1": + version "3.5.1" + resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.5.1.tgz#4adf9884735bbfea621c3716e80ea97baa419b73" + integrity sha512-2Pu9HDg/uP/IT10rbQ+4OrTQuxIWdKVUEdcw9/w7kZJv9NeHS6skJx1xuRiFyoGKwAzcHXnLp7csE99sj+O1YA== + +"@docsearch/react@3.5.1", "@docsearch/react@^3.1.1": + version "3.5.1" + resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.5.1.tgz#35f4a75f948211d8bb6830d2147c575f96a85274" + integrity sha512-t5mEODdLzZq4PTFAm/dvqcvZFdPDMdfPE5rJS5SC8OUq9mPzxEy6b+9THIqNM9P0ocCb4UC5jqBrxKclnuIbzQ== + dependencies: + "@algolia/autocomplete-core" "1.9.3" + "@algolia/autocomplete-preset-algolia" "1.9.3" + "@docsearch/css" "3.5.1" + algoliasearch "^4.0.0" + +"@docusaurus/core@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-2.4.1.tgz#4b8ff5766131ce3fbccaad0b1daf2ad4dc76f62d" + integrity sha512-SNsY7PshK3Ri7vtsLXVeAJGS50nJN3RgF836zkyUfAD01Fq+sAk5EwWgLw+nnm5KVNGDu7PRR2kRGDsWvqpo0g== + dependencies: + "@babel/core" "^7.18.6" + "@babel/generator" "^7.18.7" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-runtime" "^7.18.6" + "@babel/preset-env" "^7.18.6" + "@babel/preset-react" "^7.18.6" + "@babel/preset-typescript" "^7.18.6" + "@babel/runtime" "^7.18.6" + "@babel/runtime-corejs3" "^7.18.6" + "@babel/traverse" "^7.18.8" + "@docusaurus/cssnano-preset" "2.4.1" + "@docusaurus/logger" "2.4.1" + "@docusaurus/mdx-loader" "2.4.1" + "@docusaurus/react-loadable" "5.5.2" + "@docusaurus/utils" "2.4.1" + "@docusaurus/utils-common" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + "@slorber/static-site-generator-webpack-plugin" "^4.0.7" + "@svgr/webpack" "^6.2.1" + autoprefixer "^10.4.7" + babel-loader "^8.2.5" + babel-plugin-dynamic-import-node "^2.3.3" + boxen "^6.2.1" + chalk "^4.1.2" + chokidar "^3.5.3" + clean-css "^5.3.0" + cli-table3 "^0.6.2" + combine-promises "^1.1.0" + commander "^5.1.0" + copy-webpack-plugin "^11.0.0" + core-js "^3.23.3" + css-loader "^6.7.1" + css-minimizer-webpack-plugin "^4.0.0" + cssnano "^5.1.12" + del "^6.1.1" + detect-port "^1.3.0" + escape-html "^1.0.3" + eta "^2.0.0" + file-loader "^6.2.0" + fs-extra "^10.1.0" + html-minifier-terser "^6.1.0" + html-tags "^3.2.0" + html-webpack-plugin "^5.5.0" + import-fresh "^3.3.0" + leven "^3.1.0" + lodash "^4.17.21" + mini-css-extract-plugin "^2.6.1" + postcss "^8.4.14" + postcss-loader "^7.0.0" + prompts "^2.4.2" + react-dev-utils "^12.0.1" + react-helmet-async "^1.3.0" + react-loadable "npm:@docusaurus/react-loadable@5.5.2" + react-loadable-ssr-addon-v5-slorber "^1.0.1" + react-router "^5.3.3" + react-router-config "^5.1.1" + react-router-dom "^5.3.3" + rtl-detect "^1.0.4" + semver "^7.3.7" + serve-handler "^6.1.3" + shelljs "^0.8.5" + terser-webpack-plugin "^5.3.3" + tslib "^2.4.0" + update-notifier "^5.1.0" + url-loader "^4.1.1" + wait-on "^6.0.1" + webpack "^5.73.0" + webpack-bundle-analyzer "^4.5.0" + webpack-dev-server "^4.9.3" + webpack-merge "^5.8.0" + webpackbar "^5.0.2" + +"@docusaurus/cssnano-preset@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.1.tgz#eacadefb1e2e0f59df3467a0fe83e4ff79eed163" + integrity sha512-ka+vqXwtcW1NbXxWsh6yA1Ckii1klY9E53cJ4O9J09nkMBgrNX3iEFED1fWdv8wf4mJjvGi5RLZ2p9hJNjsLyQ== + dependencies: + cssnano-preset-advanced "^5.3.8" + postcss "^8.4.14" + postcss-sort-media-queries "^4.2.1" + tslib "^2.4.0" + +"@docusaurus/logger@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-2.4.1.tgz#4d2c0626b40752641f9fdd93ad9b5a7a0792f767" + integrity sha512-5h5ysIIWYIDHyTVd8BjheZmQZmEgWDR54aQ1BX9pjFfpyzFo5puKXKYrYJXbjEHGyVhEzmB9UXwbxGfaZhOjcg== + dependencies: + chalk "^4.1.2" + tslib "^2.4.0" + +"@docusaurus/mdx-loader@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.4.1.tgz#6425075d7fc136dbfdc121349060cedd64118393" + integrity sha512-4KhUhEavteIAmbBj7LVFnrVYDiU51H5YWW1zY6SmBSte/YLhDutztLTBE0PQl1Grux1jzUJeaSvAzHpTn6JJDQ== + dependencies: + "@babel/parser" "^7.18.8" + "@babel/traverse" "^7.18.8" + "@docusaurus/logger" "2.4.1" + "@docusaurus/utils" "2.4.1" + "@mdx-js/mdx" "^1.6.22" + escape-html "^1.0.3" + file-loader "^6.2.0" + fs-extra "^10.1.0" + image-size "^1.0.1" + mdast-util-to-string "^2.0.0" + remark-emoji "^2.2.0" + stringify-object "^3.3.0" + tslib "^2.4.0" + unified "^9.2.2" + unist-util-visit "^2.0.3" + url-loader "^4.1.1" + webpack "^5.73.0" + +"@docusaurus/module-type-aliases@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.1.tgz#38b3c2d2ae44bea6d57506eccd84280216f0171c" + integrity sha512-gLBuIFM8Dp2XOCWffUDSjtxY7jQgKvYujt7Mx5s4FCTfoL5dN1EVbnrn+O2Wvh8b0a77D57qoIDY7ghgmatR1A== + dependencies: + "@docusaurus/react-loadable" "5.5.2" + "@docusaurus/types" "2.4.1" + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router-config" "*" + "@types/react-router-dom" "*" + react-helmet-async "*" + react-loadable "npm:@docusaurus/react-loadable@5.5.2" + +"@docusaurus/plugin-content-blog@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.1.tgz#c705a8b1a36a34f181dcf43b7770532e4dcdc4a3" + integrity sha512-E2i7Knz5YIbE1XELI6RlTnZnGgS52cUO4BlCiCUCvQHbR+s1xeIWz4C6BtaVnlug0Ccz7nFSksfwDpVlkujg5Q== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/logger" "2.4.1" + "@docusaurus/mdx-loader" "2.4.1" + "@docusaurus/types" "2.4.1" + "@docusaurus/utils" "2.4.1" + "@docusaurus/utils-common" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + cheerio "^1.0.0-rc.12" + feed "^4.2.2" + fs-extra "^10.1.0" + lodash "^4.17.21" + reading-time "^1.5.0" + tslib "^2.4.0" + unist-util-visit "^2.0.3" + utility-types "^3.10.0" + webpack "^5.73.0" + +"@docusaurus/plugin-content-docs@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.1.tgz#ed94d9721b5ce7a956fb01cc06c40d8eee8dfca7" + integrity sha512-Lo7lSIcpswa2Kv4HEeUcGYqaasMUQNpjTXpV0N8G6jXgZaQurqp7E8NGYeGbDXnb48czmHWbzDL4S3+BbK0VzA== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/logger" "2.4.1" + "@docusaurus/mdx-loader" "2.4.1" + "@docusaurus/module-type-aliases" "2.4.1" + "@docusaurus/types" "2.4.1" + "@docusaurus/utils" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + "@types/react-router-config" "^5.0.6" + combine-promises "^1.1.0" + fs-extra "^10.1.0" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + lodash "^4.17.21" + tslib "^2.4.0" + utility-types "^3.10.0" + webpack "^5.73.0" + +"@docusaurus/plugin-content-pages@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.1.tgz#c534f7e49967699a45bbe67050d1605ebbf3d285" + integrity sha512-/UjuH/76KLaUlL+o1OvyORynv6FURzjurSjvn2lbWTFc4tpYY2qLYTlKpTCBVPhlLUQsfyFnshEJDLmPneq2oA== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/mdx-loader" "2.4.1" + "@docusaurus/types" "2.4.1" + "@docusaurus/utils" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + fs-extra "^10.1.0" + tslib "^2.4.0" + webpack "^5.73.0" + +"@docusaurus/plugin-debug@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-2.4.1.tgz#461a2c77b0c5a91b2c05257c8f9585412aaa59dc" + integrity sha512-7Yu9UPzRShlrH/G8btOpR0e6INFZr0EegWplMjOqelIwAcx3PKyR8mgPTxGTxcqiYj6hxSCRN0D8R7YrzImwNA== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/types" "2.4.1" + "@docusaurus/utils" "2.4.1" + fs-extra "^10.1.0" + react-json-view "^1.21.3" + tslib "^2.4.0" + +"@docusaurus/plugin-google-analytics@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.1.tgz#30de1c35773bf9d52bb2d79b201b23eb98022613" + integrity sha512-dyZJdJiCoL+rcfnm0RPkLt/o732HvLiEwmtoNzOoz9MSZz117UH2J6U2vUDtzUzwtFLIf32KkeyzisbwUCgcaQ== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/types" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + tslib "^2.4.0" + +"@docusaurus/plugin-google-gtag@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.1.tgz#6a3eb91022714735e625c7ca70ef5188fa7bd0dc" + integrity sha512-mKIefK+2kGTQBYvloNEKtDmnRD7bxHLsBcxgnbt4oZwzi2nxCGjPX6+9SQO2KCN5HZbNrYmGo5GJfMgoRvy6uA== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/types" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + tslib "^2.4.0" + +"@docusaurus/plugin-google-tag-manager@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.1.tgz#b99f71aec00b112bbf509ef2416e404a95eb607e" + integrity sha512-Zg4Ii9CMOLfpeV2nG74lVTWNtisFaH9QNtEw48R5QE1KIwDBdTVaiSA18G1EujZjrzJJzXN79VhINSbOJO/r3g== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/types" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + tslib "^2.4.0" + +"@docusaurus/plugin-sitemap@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.1.tgz#8a7a76ed69dc3e6b4474b6abb10bb03336a9de6d" + integrity sha512-lZx+ijt/+atQ3FVE8FOHV/+X3kuok688OydDXrqKRJyXBJZKgGjA2Qa8RjQ4f27V2woaXhtnyrdPop/+OjVMRg== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/logger" "2.4.1" + "@docusaurus/types" "2.4.1" + "@docusaurus/utils" "2.4.1" + "@docusaurus/utils-common" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + fs-extra "^10.1.0" + sitemap "^7.1.1" + tslib "^2.4.0" + +"@docusaurus/preset-classic@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-2.4.1.tgz#072f22d0332588e9c5f512d4bded8d7c99f91497" + integrity sha512-P4//+I4zDqQJ+UDgoFrjIFaQ1MeS9UD1cvxVQaI6O7iBmiHQm0MGROP1TbE7HlxlDPXFJjZUK3x3cAoK63smGQ== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/plugin-content-blog" "2.4.1" + "@docusaurus/plugin-content-docs" "2.4.1" + "@docusaurus/plugin-content-pages" "2.4.1" + "@docusaurus/plugin-debug" "2.4.1" + "@docusaurus/plugin-google-analytics" "2.4.1" + "@docusaurus/plugin-google-gtag" "2.4.1" + "@docusaurus/plugin-google-tag-manager" "2.4.1" + "@docusaurus/plugin-sitemap" "2.4.1" + "@docusaurus/theme-classic" "2.4.1" + "@docusaurus/theme-common" "2.4.1" + "@docusaurus/theme-search-algolia" "2.4.1" + "@docusaurus/types" "2.4.1" + +"@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@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" + integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== + dependencies: + "@types/react" "*" + prop-types "^15.6.2" + +"@docusaurus/theme-classic@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-2.4.1.tgz#0060cb263c1a73a33ac33f79bb6bc2a12a56ad9e" + integrity sha512-Rz0wKUa+LTW1PLXmwnf8mn85EBzaGSt6qamqtmnh9Hflkc+EqiYMhtUJeLdV+wsgYq4aG0ANc+bpUDpsUhdnwg== + dependencies: + "@docusaurus/core" "2.4.1" + "@docusaurus/mdx-loader" "2.4.1" + "@docusaurus/module-type-aliases" "2.4.1" + "@docusaurus/plugin-content-blog" "2.4.1" + "@docusaurus/plugin-content-docs" "2.4.1" + "@docusaurus/plugin-content-pages" "2.4.1" + "@docusaurus/theme-common" "2.4.1" + "@docusaurus/theme-translations" "2.4.1" + "@docusaurus/types" "2.4.1" + "@docusaurus/utils" "2.4.1" + "@docusaurus/utils-common" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + "@mdx-js/react" "^1.6.22" + clsx "^1.2.1" + copy-text-to-clipboard "^3.0.1" + infima "0.2.0-alpha.43" + lodash "^4.17.21" + nprogress "^0.2.0" + postcss "^8.4.14" + prism-react-renderer "^1.3.5" + prismjs "^1.28.0" + react-router-dom "^5.3.3" + rtlcss "^3.5.0" + tslib "^2.4.0" + utility-types "^3.10.0" + +"@docusaurus/theme-common@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-2.4.1.tgz#03e16f7aa96455e952f3243ac99757b01a3c83d4" + integrity sha512-G7Zau1W5rQTaFFB3x3soQoZpkgMbl/SYNG8PfMFIjKa3M3q8n0m/GRf5/H/e5BqOvt8c+ZWIXGCiz+kUCSHovA== + dependencies: + "@docusaurus/mdx-loader" "2.4.1" + "@docusaurus/module-type-aliases" "2.4.1" + "@docusaurus/plugin-content-blog" "2.4.1" + "@docusaurus/plugin-content-docs" "2.4.1" + "@docusaurus/plugin-content-pages" "2.4.1" + "@docusaurus/utils" "2.4.1" + "@docusaurus/utils-common" "2.4.1" + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router-config" "*" + clsx "^1.2.1" + parse-numeric-range "^1.3.0" + prism-react-renderer "^1.3.5" + tslib "^2.4.0" + use-sync-external-store "^1.2.0" + utility-types "^3.10.0" + +"@docusaurus/theme-search-algolia@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.1.tgz#906bd2cca3fced0241985ef502c892f58ff380fc" + integrity sha512-6BcqW2lnLhZCXuMAvPRezFs1DpmEKzXFKlYjruuas+Xy3AQeFzDJKTJFIm49N77WFCTyxff8d3E4Q9pi/+5McQ== + dependencies: + "@docsearch/react" "^3.1.1" + "@docusaurus/core" "2.4.1" + "@docusaurus/logger" "2.4.1" + "@docusaurus/plugin-content-docs" "2.4.1" + "@docusaurus/theme-common" "2.4.1" + "@docusaurus/theme-translations" "2.4.1" + "@docusaurus/utils" "2.4.1" + "@docusaurus/utils-validation" "2.4.1" + algoliasearch "^4.13.1" + algoliasearch-helper "^3.10.0" + clsx "^1.2.1" + eta "^2.0.0" + fs-extra "^10.1.0" + lodash "^4.17.21" + tslib "^2.4.0" + utility-types "^3.10.0" + +"@docusaurus/theme-translations@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-2.4.1.tgz#4d49df5865dae9ef4b98a19284ede62ae6f98726" + integrity sha512-T1RAGP+f86CA1kfE8ejZ3T3pUU3XcyvrGMfC/zxCtc2BsnoexuNI9Vk2CmuKCb+Tacvhxjv5unhxXce0+NKyvA== + dependencies: + fs-extra "^10.1.0" + tslib "^2.4.0" + +"@docusaurus/types@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-2.4.1.tgz#d8e82f9e0f704984f98df1f93d6b4554d5458705" + integrity sha512-0R+cbhpMkhbRXX138UOc/2XZFF8hiZa6ooZAEEJFp5scytzCw4tC1gChMFXrpa3d2tYE6AX8IrOEpSonLmfQuQ== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + commander "^5.1.0" + joi "^17.6.0" + react-helmet-async "^1.3.0" + utility-types "^3.10.0" + webpack "^5.73.0" + webpack-merge "^5.8.0" + +"@docusaurus/utils-common@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-2.4.1.tgz#7f72e873e49bd5179588869cc3ab7449a56aae63" + integrity sha512-bCVGdZU+z/qVcIiEQdyx0K13OC5mYwxhSuDUR95oFbKVuXYRrTVrwZIqQljuo1fyJvFTKHiL9L9skQOPokuFNQ== + dependencies: + tslib "^2.4.0" + +"@docusaurus/utils-validation@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.4.1.tgz#19959856d4a886af0c5cfb357f4ef68b51151244" + integrity sha512-unII3hlJlDwZ3w8U+pMO3Lx3RhI4YEbY3YNsQj4yzrkZzlpqZOLuAiZK2JyULnD+TKbceKU0WyWkQXtYbLNDFA== + dependencies: + "@docusaurus/logger" "2.4.1" + "@docusaurus/utils" "2.4.1" + joi "^17.6.0" + js-yaml "^4.1.0" + tslib "^2.4.0" + +"@docusaurus/utils@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.4.1.tgz#9c5f76eae37b71f3819c1c1f0e26e6807c99a4fc" + integrity sha512-1lvEZdAQhKNht9aPXPoh69eeKnV0/62ROhQeFKKxmzd0zkcuE/Oc5Gpnt00y/f5bIsmOsYMY7Pqfm/5rteT5GA== + dependencies: + "@docusaurus/logger" "2.4.1" + "@svgr/webpack" "^6.2.1" + escape-string-regexp "^4.0.0" + file-loader "^6.2.0" + fs-extra "^10.1.0" + github-slugger "^1.4.0" + globby "^11.1.0" + gray-matter "^4.0.3" + js-yaml "^4.1.0" + lodash "^4.17.21" + micromatch "^4.0.5" + resolve-pathname "^3.0.0" + shelljs "^0.8.5" + tslib "^2.4.0" + url-loader "^4.1.1" + webpack "^5.73.0" + +"@emotion/babel-plugin@^11.11.0": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c" + integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/runtime" "^7.18.3" + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/serialize" "^1.1.2" + babel-plugin-macros "^3.1.0" + convert-source-map "^1.5.0" + escape-string-regexp "^4.0.0" + find-root "^1.1.0" + source-map "^0.5.7" + stylis "4.2.0" + +"@emotion/cache@^11.11.0": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.11.0.tgz#809b33ee6b1cb1a625fef7a45bc568ccd9b8f3ff" + integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ== + dependencies: + "@emotion/memoize" "^0.8.1" + "@emotion/sheet" "^1.2.2" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" + stylis "4.2.0" + +"@emotion/hash@^0.9.1": + version "0.9.1" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43" + integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== + +"@emotion/memoize@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" + integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== + +"@emotion/react@^11.4.1": + version "11.11.1" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.1.tgz#b2c36afac95b184f73b08da8c214fdf861fa4157" + integrity sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.11.0" + "@emotion/cache" "^11.11.0" + "@emotion/serialize" "^1.1.2" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" + hoist-non-react-statics "^3.3.1" + +"@emotion/serialize@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.2.tgz#017a6e4c9b8a803bd576ff3d52a0ea6fa5a62b51" + integrity sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA== + dependencies: + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/unitless" "^0.8.1" + "@emotion/utils" "^1.2.1" + csstype "^3.0.2" + +"@emotion/sheet@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.2.tgz#d58e788ee27267a14342303e1abb3d508b6d0fec" + integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== + +"@emotion/unitless@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3" + integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== + +"@emotion/use-insertion-effect-with-fallbacks@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963" + integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== + +"@emotion/utils@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.1.tgz#bbab58465738d31ae4cb3dbb6fc00a5991f755e4" + integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== + +"@emotion/weak-memoize@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6" + integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== + +"@hapi/hoek@^9.0.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + 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" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@jest/schemas@^29.6.0": + version "29.6.0" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.0.tgz#0f4cb2c8e3dca80c135507ba5635a4fd755b0040" + integrity sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/types@^29.6.1": + version "29.6.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.1.tgz#ae79080278acff0a6af5eb49d063385aaa897bf2" + integrity sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw== + dependencies: + "@jest/schemas" "^29.6.0" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@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" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@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" + 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" + integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@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" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + +"@mdx-js/mdx@^1.6.22": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.22.tgz#8a723157bf90e78f17dc0f27995398e6c731f1ba" + integrity sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA== + dependencies: + "@babel/core" "7.12.9" + "@babel/plugin-syntax-jsx" "7.12.1" + "@babel/plugin-syntax-object-rest-spread" "7.8.3" + "@mdx-js/util" "1.6.22" + babel-plugin-apply-mdx-type-prop "1.6.22" + babel-plugin-extract-import-names "1.6.22" + camelcase-css "2.0.1" + detab "2.0.4" + hast-util-raw "6.0.1" + lodash.uniq "4.5.0" + mdast-util-to-hast "10.0.1" + remark-footnotes "2.0.0" + remark-mdx "1.6.22" + remark-parse "8.0.3" + remark-squeeze-paragraphs "4.0.0" + style-to-object "0.3.0" + unified "9.2.0" + unist-builder "2.0.3" + unist-util-visit "2.0.3" + +"@mdx-js/react@^1.6.22": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-1.6.22.tgz#ae09b4744fddc74714ee9f9d6f17a66e77c43573" + integrity sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg== + +"@mdx-js/util@1.6.22": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.22.tgz#219dfd89ae5b97a8801f015323ffa4b62f45718b" + integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== + +"@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" + 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": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@polka/url@^1.0.0-next.20": + version "1.0.0-next.21" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" + integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== + +"@sideway/address@^4.1.3": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" + 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" + 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" + 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" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@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" + integrity sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA== + dependencies: + eval "^0.1.8" + p-map "^4.0.0" + webpack-sources "^3.2.2" + +"@storybook/addon-controls@^6.5.12": + version "6.5.16" + resolved "https://registry.yarnpkg.com/@storybook/addon-controls/-/addon-controls-6.5.16.tgz#5017805b8ca413edf6e9d87b90a9436e79eb5e59" + integrity sha512-kShSGjq1MjmmyL3l8i+uPz6yddtf82mzys0l82VKtcuyjrr5944wYFJ5NTXMfZxrO/U6FeFsfuFZE/k6ex3EMg== + dependencies: + "@storybook/addons" "6.5.16" + "@storybook/api" "6.5.16" + "@storybook/client-logger" "6.5.16" + "@storybook/components" "6.5.16" + "@storybook/core-common" "6.5.16" + "@storybook/csf" "0.0.2--canary.4566f4d.1" + "@storybook/node-logger" "6.5.16" + "@storybook/store" "6.5.16" + "@storybook/theming" "6.5.16" + core-js "^3.8.2" + lodash "^4.17.21" + ts-dedent "^2.0.0" + +"@storybook/addons@6.5.16": + version "6.5.16" + resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-6.5.16.tgz#07e8f2205f86fa4c9dada719e3e096cb468e3cdd" + integrity sha512-p3DqQi+8QRL5k7jXhXmJZLsE/GqHqyY6PcoA1oNTJr0try48uhTGUOYkgzmqtDaa/qPFO5LP+xCPzZXckGtquQ== + dependencies: + "@storybook/api" "6.5.16" + "@storybook/channels" "6.5.16" + "@storybook/client-logger" "6.5.16" + "@storybook/core-events" "6.5.16" + "@storybook/csf" "0.0.2--canary.4566f4d.1" + "@storybook/router" "6.5.16" + "@storybook/theming" "6.5.16" + "@types/webpack-env" "^1.16.0" + core-js "^3.8.2" + global "^4.4.0" + regenerator-runtime "^0.13.7" + +"@storybook/api@6.5.16": + version "6.5.16" + resolved "https://registry.yarnpkg.com/@storybook/api/-/api-6.5.16.tgz#897915b76de05587fd702951d5d836f708043662" + integrity sha512-HOsuT8iomqeTMQJrRx5U8nsC7lJTwRr1DhdD0SzlqL4c80S/7uuCy4IZvOt4sYQjOzW5fOo/kamcoBXyLproTA== + dependencies: + "@storybook/channels" "6.5.16" + "@storybook/client-logger" "6.5.16" + "@storybook/core-events" "6.5.16" + "@storybook/csf" "0.0.2--canary.4566f4d.1" + "@storybook/router" "6.5.16" + "@storybook/semver" "^7.3.2" + "@storybook/theming" "6.5.16" + core-js "^3.8.2" + fast-deep-equal "^3.1.3" + global "^4.4.0" + lodash "^4.17.21" + memoizerific "^1.11.3" + regenerator-runtime "^0.13.7" + store2 "^2.12.0" + telejson "^6.0.8" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + +"@storybook/builder-webpack5@^6.5.12": + version "6.5.16" + resolved "https://registry.yarnpkg.com/@storybook/builder-webpack5/-/builder-webpack5-6.5.16.tgz#2f260e29fbc87f6f3bb3212459048ce37f3fb54e" + integrity sha512-kh8Sofm1sbijaHDWtm0sXabqACHVFjikU/fIkkW786kpjoPIPIec1a+hrLgDsZxMU3I7XapSOaCFzWt6FjVXjg== + dependencies: + "@babel/core" "^7.12.10" + "@storybook/addons" "6.5.16" + "@storybook/api" "6.5.16" + "@storybook/channel-postmessage" "6.5.16" + "@storybook/channels" "6.5.16" + "@storybook/client-api" "6.5.16" + "@storybook/client-logger" "6.5.16" + "@storybook/components" "6.5.16" + "@storybook/core-common" "6.5.16" + "@storybook/core-events" "6.5.16" + "@storybook/node-logger" "6.5.16" + "@storybook/preview-web" "6.5.16" + "@storybook/router" "6.5.16" + "@storybook/semver" "^7.3.2" + "@storybook/store" "6.5.16" + "@storybook/theming" "6.5.16" + "@types/node" "^14.0.10 || ^16.0.0" + babel-loader "^8.0.0" + babel-plugin-named-exports-order "^0.0.2" + browser-assert "^1.2.1" + case-sensitive-paths-webpack-plugin "^2.3.0" + core-js "^3.8.2" + css-loader "^5.0.1" + fork-ts-checker-webpack-plugin "^6.0.4" + glob "^7.1.6" + glob-promise "^3.4.0" + html-webpack-plugin "^5.0.0" + path-browserify "^1.0.1" + process "^0.11.10" + stable "^0.1.8" + style-loader "^2.0.0" + terser-webpack-plugin "^5.0.3" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + webpack "^5.9.0" + webpack-dev-middleware "^4.1.0" + webpack-hot-middleware "^2.25.1" + webpack-virtual-modules "^0.4.1" + +"@storybook/channel-postmessage@6.5.16": + version "6.5.16" + resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-6.5.16.tgz#06167c0a66c06b2b5f8ff01d1dd436fff8119a15" + integrity sha512-fZZSN29dsUArWOx7e7lTdMA9+7zijVwCwbvi2Fo4fqhRLh1DsTb/VXfz1FKMCWAjNlcX7QQvV25tnxbqsD6lyw== + dependencies: + "@storybook/channels" "6.5.16" + "@storybook/client-logger" "6.5.16" + "@storybook/core-events" "6.5.16" + core-js "^3.8.2" + global "^4.4.0" + qs "^6.10.0" + telejson "^6.0.8" + +"@storybook/channel-websocket@6.5.16": + version "6.5.16" + resolved "https://registry.yarnpkg.com/@storybook/channel-websocket/-/channel-websocket-6.5.16.tgz#41f69ca9444a4dfbf72580b4696900c5b1d2b817" + integrity sha512-wJg2lpBjmRC2GJFzmhB9kxlh109VE58r/0WhFtLbwKvPqsvGf82xkBEl6BtBCvIQ4stzYnj/XijjA8qSi2zpOg== + dependencies: + "@storybook/channels" "6.5.16" + "@storybook/client-logger" "6.5.16" + core-js "^3.8.2" + global "^4.4.0" + telejson "^6.0.8" + +"@storybook/channels@6.5.16": + version "6.5.16" + resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-6.5.16.tgz#3fb9a3b5666ecb951a2d0cf8b0699b084ef2d3c6" + integrity sha512-VylzaWQZaMozEwZPJdyJoz+0jpDa8GRyaqu9TGG6QGv+KU5POoZaGLDkRE7TzWkyyP0KQLo80K99MssZCpgSeg== + dependencies: + core-js "^3.8.2" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + +"@storybook/client-api@6.5.16": + version "6.5.16" + resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-6.5.16.tgz#13e5a7c3d1f0f951ec4ef51cfcf2c5aafb560e12" + integrity sha512-i3UwkzzUFw8I+E6fOcgB5sc4oU2fhvaKnqC1mpd9IYGJ9JN9MnGIaVl3Ko28DtFItu/QabC9JsLIJVripFLktQ== + dependencies: + "@storybook/addons" "6.5.16" + "@storybook/channel-postmessage" "6.5.16" + "@storybook/channels" "6.5.16" + "@storybook/client-logger" "6.5.16" + "@storybook/core-events" "6.5.16" + "@storybook/csf" "0.0.2--canary.4566f4d.1" + "@storybook/store" "6.5.16" + "@types/qs" "^6.9.5" + "@types/webpack-env" "^1.16.0" + core-js "^3.8.2" + fast-deep-equal "^3.1.3" + global "^4.4.0" + lodash "^4.17.21" + memoizerific "^1.11.3" + qs "^6.10.0" + regenerator-runtime "^0.13.7" + store2 "^2.12.0" + synchronous-promise "^2.0.15" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + +"@storybook/client-logger@6.5.16": + version "6.5.16" + resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-6.5.16.tgz#955cc46b389e7151c9eb1585a75e6a0605af61a1" + integrity sha512-pxcNaCj3ItDdicPTXTtmYJE3YC1SjxFrBmHcyrN+nffeNyiMuViJdOOZzzzucTUG0wcOOX8jaSyak+nnHg5H1Q== + dependencies: + core-js "^3.8.2" + global "^4.4.0" + +"@storybook/components@6.5.16": + version "6.5.16" + resolved "https://registry.yarnpkg.com/@storybook/components/-/components-6.5.16.tgz#f8dc51213bc08fe32154be964e1e8b0e2f670ed6" + integrity sha512-LzBOFJKITLtDcbW9jXl0/PaG+4xAz25PK8JxPZpIALbmOpYWOAPcO6V9C2heX6e6NgWFMUxjplkULEk9RCQMNA== + dependencies: + "@storybook/client-logger" "6.5.16" + "@storybook/csf" "0.0.2--canary.4566f4d.1" + "@storybook/theming" "6.5.16" + core-js "^3.8.2" + memoizerific "^1.11.3" + qs "^6.10.0" + regenerator-runtime "^0.13.7" + util-deprecate "^1.0.2" + +"@storybook/core-client@6.5.16": + version "6.5.16" + resolved "https://registry.yarnpkg.com/@storybook/core-client/-/core-client-6.5.16.tgz#ed2328fd38c6111fe887f6a91b28d9dc2b17092a" + integrity sha512-14IRaDrVtKrQ+gNWC0wPwkCNfkZOKghYV/swCUnQX3rP99defsZK8Hc7xHIYoAiOP5+sc3sweRAxgmFiJeQ1Ig== + dependencies: + "@storybook/addons" "6.5.16" + "@storybook/channel-postmessage" "6.5.16" + "@storybook/channel-websocket" "6.5.16" + "@storybook/client-api" "6.5.16" + "@storybook/client-logger" "6.5.16" + "@storybook/core-events" "6.5.16" + "@storybook/csf" "0.0.2--canary.4566f4d.1" + "@storybook/preview-web" "6.5.16" + "@storybook/store" "6.5.16" + "@storybook/ui" "6.5.16" + airbnb-js-shims "^2.2.1" + ansi-to-html "^0.6.11" + core-js "^3.8.2" + global "^4.4.0" + lodash "^4.17.21" + qs "^6.10.0" + regenerator-runtime "^0.13.7" + ts-dedent "^2.0.0" + unfetch "^4.2.0" + util-deprecate "^1.0.2" + +"@storybook/core-common@6.5.16": + version "6.5.16" + resolved "https://registry.yarnpkg.com/@storybook/core-common/-/core-common-6.5.16.tgz#db80aa6f220a576a83db821f720e103190a914ae" + integrity sha512-2qtnKP3TTOzt2cp6LXKRTh7XrI9z5VanMnMTgeoFcA5ebnndD4V6BExQUdYPClE/QooLx6blUWNgS9dFEpjSqQ== + dependencies: + "@babel/core" "^7.12.10" + "@babel/plugin-proposal-class-properties" "^7.12.1" + "@babel/plugin-proposal-decorators" "^7.12.12" + "@babel/plugin-proposal-export-default-from" "^7.12.1" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" + "@babel/plugin-proposal-object-rest-spread" "^7.12.1" + "@babel/plugin-proposal-optional-chaining" "^7.12.7" + "@babel/plugin-proposal-private-methods" "^7.12.1" + "@babel/plugin-proposal-private-property-in-object" "^7.12.1" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-arrow-functions" "^7.12.1" + "@babel/plugin-transform-block-scoping" "^7.12.12" + "@babel/plugin-transform-classes" "^7.12.1" + "@babel/plugin-transform-destructuring" "^7.12.1" + "@babel/plugin-transform-for-of" "^7.12.1" + "@babel/plugin-transform-parameters" "^7.12.1" + "@babel/plugin-transform-shorthand-properties" "^7.12.1" + "@babel/plugin-transform-spread" "^7.12.1" + "@babel/preset-env" "^7.12.11" + "@babel/preset-react" "^7.12.10" + "@babel/preset-typescript" "^7.12.7" + "@babel/register" "^7.12.1" + "@storybook/node-logger" "6.5.16" + "@storybook/semver" "^7.3.2" + "@types/node" "^14.0.10 || ^16.0.0" + "@types/pretty-hrtime" "^1.0.0" + babel-loader "^8.0.0" + babel-plugin-macros "^3.0.1" + babel-plugin-polyfill-corejs3 "^0.1.0" + chalk "^4.1.0" + core-js "^3.8.2" + express "^4.17.1" + file-system-cache "^1.0.5" + find-up "^5.0.0" + fork-ts-checker-webpack-plugin "^6.0.4" + fs-extra "^9.0.1" + glob "^7.1.6" + handlebars "^4.7.7" + interpret "^2.2.0" + json5 "^2.2.3" + lazy-universal-dotenv "^3.0.1" + picomatch "^2.3.0" + pkg-dir "^5.0.0" + pretty-hrtime "^1.0.3" + resolve-from "^5.0.0" + slash "^3.0.0" + telejson "^6.0.8" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + webpack "4" + +"@storybook/core-events@6.5.16": + version "6.5.16" + resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-6.5.16.tgz#b1c265dac755007dae172d9d4b72656c9e5d7bb3" + integrity sha512-qMZQwmvzpH5F2uwNUllTPg6eZXr2OaYZQRRN8VZJiuorZzDNdAFmiVWMWdkThwmyLEJuQKXxqCL8lMj/7PPM+g== + dependencies: + core-js "^3.8.2" + +"@storybook/csf@0.0.2--canary.4566f4d.1": + version "0.0.2--canary.4566f4d.1" + resolved "https://registry.yarnpkg.com/@storybook/csf/-/csf-0.0.2--canary.4566f4d.1.tgz#dac52a21c40ef198554e71fe4d20d61e17f65327" + integrity sha512-9OVvMVh3t9znYZwb0Svf/YQoxX2gVOeQTGe2bses2yj+a3+OJnCrUF3/hGv6Em7KujtOdL2LL+JnG49oMVGFgQ== + dependencies: + lodash "^4.17.15" + +"@storybook/manager-webpack5@^6.5.12": + version "6.5.16" + resolved "https://registry.yarnpkg.com/@storybook/manager-webpack5/-/manager-webpack5-6.5.16.tgz#48b223557d9633614ff8c6e3227c01a57ab4eb55" + integrity sha512-OtxXv8JCe0r/0rE5HxaFicsNsXA+fqZxzokxquFFgrYf/1Jg4d7QX6/pG5wINF+5qInJfVkRG6xhPzv1s5bk9Q== + dependencies: + "@babel/core" "^7.12.10" + "@babel/plugin-transform-template-literals" "^7.12.1" + "@babel/preset-react" "^7.12.10" + "@storybook/addons" "6.5.16" + "@storybook/core-client" "6.5.16" + "@storybook/core-common" "6.5.16" + "@storybook/node-logger" "6.5.16" + "@storybook/theming" "6.5.16" + "@storybook/ui" "6.5.16" + "@types/node" "^14.0.10 || ^16.0.0" + babel-loader "^8.0.0" + case-sensitive-paths-webpack-plugin "^2.3.0" + chalk "^4.1.0" + core-js "^3.8.2" + css-loader "^5.0.1" + express "^4.17.1" + find-up "^5.0.0" + fs-extra "^9.0.1" + html-webpack-plugin "^5.0.0" + node-fetch "^2.6.7" + process "^0.11.10" + read-pkg-up "^7.0.1" + regenerator-runtime "^0.13.7" + resolve-from "^5.0.0" + style-loader "^2.0.0" + telejson "^6.0.8" + terser-webpack-plugin "^5.0.3" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + webpack "^5.9.0" + webpack-dev-middleware "^4.1.0" + webpack-virtual-modules "^0.4.1" + +"@storybook/node-logger@6.5.16": + version "6.5.16" + resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-6.5.16.tgz#d57fd6204c2abfbc297551d98ad5475dd73207cc" + integrity sha512-YjhBKrclQtjhqFNSO+BZK+RXOx6EQypAELJKoLFaawg331e8VUfvUuRCNB3fcEWp8G9oH13PQQte0OTjLyyOYg== + dependencies: + "@types/npmlog" "^4.1.2" + chalk "^4.1.0" + core-js "^3.8.2" + npmlog "^5.0.1" + pretty-hrtime "^1.0.3" + +"@storybook/preview-web@6.5.16": + version "6.5.16" + resolved "https://registry.yarnpkg.com/@storybook/preview-web/-/preview-web-6.5.16.tgz#1d32a72be25776f9597e33ffc1914f3430fae689" + integrity sha512-IJnvfe2sKCfk7apN9Fu9U8qibbarrPX5JB55ZzK1amSHVmSDuYk5MIMc/U3NnSQNnvd1DO5v/zMcGgj563hrtg== + dependencies: + "@storybook/addons" "6.5.16" + "@storybook/channel-postmessage" "6.5.16" + "@storybook/client-logger" "6.5.16" + "@storybook/core-events" "6.5.16" + "@storybook/csf" "0.0.2--canary.4566f4d.1" + "@storybook/store" "6.5.16" + ansi-to-html "^0.6.11" + core-js "^3.8.2" + global "^4.4.0" + lodash "^4.17.21" + qs "^6.10.0" + regenerator-runtime "^0.13.7" + synchronous-promise "^2.0.15" + ts-dedent "^2.0.0" + unfetch "^4.2.0" + util-deprecate "^1.0.2" + +"@storybook/router@6.5.16": + version "6.5.16" + resolved "https://registry.yarnpkg.com/@storybook/router/-/router-6.5.16.tgz#28fb4d34e8219351a40bee1fc94dcacda6e1bd8b" + integrity sha512-ZgeP8a5YV/iuKbv31V8DjPxlV4AzorRiR8OuSt/KqaiYXNXlOoQDz/qMmiNcrshrfLpmkzoq7fSo4T8lWo2UwQ== + dependencies: + "@storybook/client-logger" "6.5.16" + core-js "^3.8.2" + memoizerific "^1.11.3" + qs "^6.10.0" + regenerator-runtime "^0.13.7" + +"@storybook/semver@^7.3.2": + version "7.3.2" + resolved "https://registry.yarnpkg.com/@storybook/semver/-/semver-7.3.2.tgz#f3b9c44a1c9a0b933c04e66d0048fcf2fa10dac0" + integrity sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg== + dependencies: + core-js "^3.6.5" + find-up "^4.1.0" + +"@storybook/store@6.5.16": + version "6.5.16" + resolved "https://registry.yarnpkg.com/@storybook/store/-/store-6.5.16.tgz#b308701293a3a11bfcc766770584495874fd17da" + integrity sha512-g+bVL5hmMq/9cM51K04e37OviUPHT0rHHrRm5wj/hrf18Kd9120b3sxdQ5Dc+HZ292yuME0n+cyrQPTYx9Epmw== + dependencies: + "@storybook/addons" "6.5.16" + "@storybook/client-logger" "6.5.16" + "@storybook/core-events" "6.5.16" + "@storybook/csf" "0.0.2--canary.4566f4d.1" + core-js "^3.8.2" + fast-deep-equal "^3.1.3" + global "^4.4.0" + lodash "^4.17.21" + memoizerific "^1.11.3" + regenerator-runtime "^0.13.7" + slash "^3.0.0" + stable "^0.1.8" + synchronous-promise "^2.0.15" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + +"@storybook/theming@6.5.16": + version "6.5.16" + resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-6.5.16.tgz#b999bdb98945b605b93b9dfdf7408535b701e2aa" + integrity sha512-hNLctkjaYLRdk1+xYTkC1mg4dYz2wSv6SqbLpcKMbkPHTE0ElhddGPHQqB362md/w9emYXNkt1LSMD8Xk9JzVQ== + dependencies: + "@storybook/client-logger" "6.5.16" + core-js "^3.8.2" + memoizerific "^1.11.3" + regenerator-runtime "^0.13.7" + +"@storybook/ui@6.5.16": + version "6.5.16" + resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-6.5.16.tgz#c73bf456e672ecf2370b4365070088487fc0ce57" + integrity sha512-rHn/n12WM8BaXtZ3IApNZCiS+C4Oc5+Lkl4MoctX8V7QSml0SxZBB5hsJ/AiWkgbRxjQpa/L/Nt7/Qw0FjTH/A== + dependencies: + "@storybook/addons" "6.5.16" + "@storybook/api" "6.5.16" + "@storybook/channels" "6.5.16" + "@storybook/client-logger" "6.5.16" + "@storybook/components" "6.5.16" + "@storybook/core-events" "6.5.16" + "@storybook/router" "6.5.16" + "@storybook/semver" "^7.3.2" + "@storybook/theming" "6.5.16" + core-js "^3.8.2" + memoizerific "^1.11.3" + qs "^6.10.0" + regenerator-runtime "^0.13.7" + resolve-from "^5.0.0" + +"@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" + 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" + 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" + 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" + 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" + 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" + 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" + 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" + 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" + integrity sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^6.5.1" + "@svgr/babel-plugin-remove-jsx-attribute" "*" + "@svgr/babel-plugin-remove-jsx-empty-expression" "*" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.5.1" + "@svgr/babel-plugin-svg-dynamic-title" "^6.5.1" + "@svgr/babel-plugin-svg-em-dimensions" "^6.5.1" + "@svgr/babel-plugin-transform-react-native-svg" "^6.5.1" + "@svgr/babel-plugin-transform-svg-component" "^6.5.1" + +"@svgr/core@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-6.5.1.tgz#d3e8aa9dbe3fbd747f9ee4282c1c77a27410488a" + integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw== + dependencies: + "@babel/core" "^7.19.6" + "@svgr/babel-preset" "^6.5.1" + "@svgr/plugin-jsx" "^6.5.1" + camelcase "^6.2.0" + cosmiconfig "^7.0.1" + +"@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" + integrity sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw== + dependencies: + "@babel/types" "^7.20.0" + entities "^4.4.0" + +"@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" + integrity sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw== + dependencies: + "@babel/core" "^7.19.6" + "@svgr/babel-preset" "^6.5.1" + "@svgr/hast-util-to-babel-ast" "^6.5.1" + svg-parser "^2.0.4" + +"@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" + integrity sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ== + dependencies: + cosmiconfig "^7.0.1" + deepmerge "^4.2.2" + svgo "^2.8.0" + +"@svgr/webpack@^6.2.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-6.5.1.tgz#ecf027814fc1cb2decc29dc92f39c3cf691e40e8" + integrity sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA== + dependencies: + "@babel/core" "^7.19.6" + "@babel/plugin-transform-react-constant-elements" "^7.18.12" + "@babel/preset-env" "^7.19.4" + "@babel/preset-react" "^7.18.6" + "@babel/preset-typescript" "^7.18.6" + "@svgr/core" "^6.5.1" + "@svgr/plugin-jsx" "^6.5.1" + "@svgr/plugin-svgo" "^6.5.1" + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.10" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" + integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@^1.3.5": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#9fd20b3974bdc2bcd4ac6567e2e0f6885cb2cf41" + integrity sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.4" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" + integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.44.1" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.1.tgz#d1811559bb6bcd1a76009e3f7883034b78a0415e" + integrity sha512-XpNDc4Z5Tb4x+SW1MriMVeIsMoONHCkWFMkR/aPJbzEsxqHy+4Glu/BqTdPrApfDeMaXbtNh6bseNgl5KaWrSg== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" + integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": + version "4.17.35" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz#c95dd4424f0d32e525d23812aa8ab8e4d3906c4f" + integrity sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.17" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" + integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/glob@*": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.1.0.tgz#b63e70155391b0584dce44e7ea25190bbc38f2fc" + integrity sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w== + dependencies: + "@types/minimatch" "^5.1.2" + "@types/node" "*" + +"@types/hast@^2.0.0": + version "2.3.5" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.5.tgz#08caac88b44d0fdd04dc17a19142355f43bd8a7a" + integrity sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg== + dependencies: + "@types/unist" "^2" + +"@types/history@^4.7.11": + version "4.7.11" + resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64" + 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" + integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== + +"@types/http-errors@*": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.1.tgz#20172f9578b225f6c7da63446f56d4ce108d5a65" + integrity sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ== + +"@types/http-proxy@^1.17.8": + version "1.17.11" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.11.tgz#0ca21949a5588d55ac2b659b69035c84bd5da293" + integrity sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA== + dependencies: + "@types/node" "*" + +"@types/is-function@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/is-function/-/is-function-1.0.1.tgz#2d024eace950c836d9e3335a66b97960ae41d022" + integrity sha512-A79HEEiwXTFtfY+Bcbo58M2GRYzCr9itHWzbzHVFNEYCcoU/MMGwYYf721gBrnhpj1s6RGVVha/IgNFnR0Iw/Q== + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + 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.8", "@types/json-schema@^7.0.9": + version "7.0.12" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + +"@types/mdast@^3.0.0": + version "3.0.12" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.12.tgz#beeb511b977c875a5b0cc92eab6fcac2f0895514" + integrity sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg== + dependencies: + "@types/unist" "^2" + +"@types/mime@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" + integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + +"@types/minimatch@^5.1.2": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== + +"@types/node@*": + version "20.4.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.7.tgz#74d323a93f1391a63477b27b9aec56669c98b2ab" + integrity sha512-bUBrPjEry2QUTsnuEjzjbS7voGWCc30W0qzgMf90GPeDGFRakvrz47ju+oqDAKCXLUCe39u57/ORMl/O/04/9g== + +"@types/node@^14.0.10 || ^16.0.0": + version "16.18.39" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.39.tgz#aa39a1a87a40ef6098ee69689a1acb0c1b034832" + integrity sha512-8q9ZexmdYYyc5/cfujaXb4YOucpQxAV4RMG0himLyDUOEr8Mr79VrqsFI+cQ2M2h89YIuy95lbxuYjxT4Hk4kQ== + +"@types/node@^17.0.5": + version "17.0.45" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" + integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== + +"@types/normalize-package-data@^2.4.0": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" + integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + +"@types/npmlog@^4.1.2": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@types/npmlog/-/npmlog-4.1.4.tgz#30eb872153c7ead3e8688c476054ddca004115f6" + integrity sha512-WKG4gTr8przEZBiJ5r3s8ZIAoMXNbOgQ+j/d5O4X3x6kZJRLNvyUJuUK/KoG3+8BaOHPhp2m7WC6JKKeovDSzQ== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/parse5@^5.0.0": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" + integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== + +"@types/pretty-hrtime@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/pretty-hrtime/-/pretty-hrtime-1.0.1.tgz#72a26101dc567b0d68fd956cf42314556e42d601" + integrity sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ== + +"@types/prop-types@*": + version "15.7.5" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + +"@types/qs@*", "@types/qs@^6.9.5": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/react-router-config@*", "@types/react-router-config@^5.0.6": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@types/react-router-config/-/react-router-config-5.0.7.tgz#36207a3fe08b271abee62b26993ee932d13cbb02" + integrity sha512-pFFVXUIydHlcJP6wJm7sDii5mD/bCmmAY0wQzq+M+uX7bqS95AQqHZWP1iNMKrWVQSuHIzj5qi9BvrtLX2/T4w== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router" "^5.1.0" + +"@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" + integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router" "*" + +"@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" + integrity sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + +"@types/react@*": + version "18.2.18" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.18.tgz#c8b233919eef1bdc294f6f34b37f9727ad677516" + integrity sha512-da4NTSeBv/P34xoZPhtcLkmZuJ+oYaCxHmyHzwaDQo9RQPBeXV+06gEk2FpqEcsX9XrnNLvRpVh6bdavDSjtiQ== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@types/sax@^1.2.1": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/sax/-/sax-1.2.4.tgz#8221affa7f4f3cb21abd22f244cfabfa63e6a69e" + integrity sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw== + dependencies: + "@types/node" "*" + +"@types/scheduler@*": + version "0.16.3" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" + integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== + +"@types/send@*": + version "0.17.1" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.1.tgz#ed4932b8a2a805f1fe362a70f4e62d0ac994e301" + integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-index@^1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" + integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + dependencies: + "@types/express" "*" + +"@types/serve-static@*", "@types/serve-static@^1.13.10": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.2.tgz#3e5419ecd1e40e7405d34093f10befb43f63381a" + integrity sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw== + dependencies: + "@types/http-errors" "*" + "@types/mime" "*" + "@types/node" "*" + +"@types/sockjs@^0.3.33": + version "0.3.33" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" + integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + dependencies: + "@types/node" "*" + +"@types/unist@^2", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.7.tgz#5b06ad6894b236a1d2bd6b2f07850ca5c59cf4d6" + integrity sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g== + +"@types/webpack-env@^1.16.0": + version "1.18.1" + resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.18.1.tgz#49699bb508961e14a3bfb68c78cd87b296889d1d" + integrity sha512-D0HJET2/UY6k9L6y3f5BL+IDxZmPkYmPT4+qBrRdmRLYRuV0qNKizMgTvYxXZYn+36zjPeoDZAEYBCM6XB+gww== + +"@types/ws@^8.5.5": + version "8.5.5" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb" + integrity sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg== + dependencies: + "@types/node" "*" + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^17.0.8": + version "17.0.24" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" + integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== + dependencies: + "@types/yargs-parser" "*" + +"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" + integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== + dependencies: + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + +"@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" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== + +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== + +"@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" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + +"@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" + integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + +"@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" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@xtuc/long" "4.2.2" + +"@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" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== + +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== + +"@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" + integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== + 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" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== + 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" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== + +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== + +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" + +"@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" + integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-opt" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + "@webassemblyjs/wast-printer" "1.11.6" + +"@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" + integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@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" + integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + +"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" + integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" + "@xtuc/long" "4.2.2" + +"@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" + integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + 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" + 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" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +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" + integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== + +acorn-node@^1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + dependencies: + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" + +acorn-walk@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn-walk@^8.0.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^6.4.1: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +acorn@^7.0.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.0.4, acorn@^8.7.1, acorn@^8.8.2: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + +address@^1.0.1, address@^1.1.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" + integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +airbnb-js-shims@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/airbnb-js-shims/-/airbnb-js-shims-2.2.1.tgz#db481102d682b98ed1daa4c5baa697a05ce5c040" + integrity sha512-wJNXPH66U2xjgo1Zwyjf9EydvJ2Si94+vSdk6EERcBfB2VZkeltpqIats0cqIZMLCXP3zcyaUKGYQeIBT6XjsQ== + dependencies: + array-includes "^3.0.3" + array.prototype.flat "^1.2.1" + array.prototype.flatmap "^1.2.1" + es5-shim "^4.5.13" + es6-shim "^0.35.5" + function.prototype.name "^1.1.0" + globalthis "^1.0.0" + object.entries "^1.1.0" + object.fromentries "^2.0.0 || ^1.0.0" + object.getownpropertydescriptors "^2.0.3" + object.values "^1.1.0" + promise.allsettled "^1.0.0" + promise.prototype.finally "^3.1.0" + string.prototype.matchall "^4.0.0 || ^3.0.1" + string.prototype.padend "^3.0.0" + string.prototype.padstart "^3.0.0" + symbol.prototype.description "^1.0.0" + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + 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" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + 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@^8.0.0, ajv@^8.9.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +algoliasearch-helper@^3.10.0: + version "3.14.0" + resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.14.0.tgz#2409c2591952719ab6fba1de77b3bbe5094ab85e" + integrity sha512-gXDXzsSS0YANn5dHr71CUXOo84cN4azhHKUbg71vAWnH+1JBiR4jf7to3t3JHXknXkbV0F7f055vUSBKrltHLQ== + dependencies: + "@algolia/events" "^4.0.1" + +algoliasearch@^4.0.0, algoliasearch@^4.13.1: + version "4.19.1" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.19.1.tgz#18111fb422eaf841737adb92d5ab12133d244218" + integrity sha512-IJF5b93b2MgAzcE/tuzW0yOPnuUyRgGAtaPv5UUywXM8kzqfdwZTO4sPJBzoGz1eOy6H9uEchsJsBFTELZSu+g== + dependencies: + "@algolia/cache-browser-local-storage" "4.19.1" + "@algolia/cache-common" "4.19.1" + "@algolia/cache-in-memory" "4.19.1" + "@algolia/client-account" "4.19.1" + "@algolia/client-analytics" "4.19.1" + "@algolia/client-common" "4.19.1" + "@algolia/client-personalization" "4.19.1" + "@algolia/client-search" "4.19.1" + "@algolia/logger-common" "4.19.1" + "@algolia/logger-console" "4.19.1" + "@algolia/requester-browser-xhr" "4.19.1" + "@algolia/requester-common" "4.19.1" + "@algolia/requester-node-http" "4.19.1" + "@algolia/transporter" "4.19.1" + +ansi-align@^3.0.0, ansi-align@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-html-community@0.0.8, 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" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-regex@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + 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" + 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" + 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" + 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" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +ansi-to-html@^0.6.11: + version "0.6.15" + resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.15.tgz#ac6ad4798a00f6aa045535d7f6a9cb9294eebea7" + integrity sha512-28ijx2aHJGdzbs+O5SNQF65r6rrKYnkuwTYm8lZlChuoJ9P1vVzIpWO20sQTqTPDXYp6NFwk326vApTtLVFXpQ== + dependencies: + entities "^2.0.0" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +app-root-dir@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/app-root-dir/-/app-root-dir-1.0.2.tgz#38187ec2dea7577fff033ffcb12172692ff6e118" + integrity sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g== + +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" + integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +arg@^5.0.0, arg@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + 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" + 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" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + +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-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-includes@^3.0.3: + version "3.1.6" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== + +array.prototype.flat@^1.2.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.2.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.map@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/array.prototype.map/-/array.prototype.map-1.0.5.tgz#6e43c2fee6c0fb5e4806da2dc92eb00970809e55" + integrity sha512-gfaKntvwqYIuC7mLLyv2wzZIJqrRhn5PZ9EfFejSx6a78sV7iDsGpG9P+3oUPtm1Rerqm6nrKS4FYuTIvWfo3g== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-array-method-boxes-properly "^1.0.0" + is-string "^1.0.7" + +array.prototype.reduce@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz#6b20b0daa9d9734dd6bc7ea66b5bbce395471eac" + integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-array-method-boxes-properly "^1.0.0" + is-string "^1.0.7" + +arraybuffer.prototype.slice@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" + integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== + +async-each@^1.0.1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.6.tgz#52f1d9403818c179b7561e11a5d1b77eb2160e77" + integrity sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg== + +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" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +autoprefixer@^10.4.0, autoprefixer@^10.4.11, autoprefixer@^10.4.12, autoprefixer@^10.4.7: + version "10.4.14" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.14.tgz#e28d49902f8e759dd25b153264e862df2705f79d" + integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== + dependencies: + browserslist "^4.21.5" + caniuse-lite "^1.0.30001464" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +autoprefixer@^9: + version "9.8.8" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a" + integrity sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA== + dependencies: + browserslist "^4.12.0" + caniuse-lite "^1.0.30001109" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + picocolors "^0.2.1" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +axios@^0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.25.0.tgz#349cfbb31331a9b4453190791760a8d35b093e0a" + integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== + dependencies: + follow-redirects "^1.14.7" + +babel-loader@^8.0.0, babel-loader@^8.2.5: + version "8.3.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" + integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^2.0.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-apply-mdx-type-prop@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz#d216e8fd0de91de3f1478ef3231e05446bc8705b" + integrity sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ== + dependencies: + "@babel/helper-plugin-utils" "7.10.4" + "@mdx-js/util" "1.6.22" + +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" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-extract-import-names@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz#de5f9a28eb12f3eb2578bf74472204e66d1a13dc" + integrity sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ== + dependencies: + "@babel/helper-plugin-utils" "7.10.4" + +babel-plugin-macros@^3.0.1, babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== + dependencies: + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" + +babel-plugin-named-exports-order@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/babel-plugin-named-exports-order/-/babel-plugin-named-exports-order-0.0.2.tgz#ae14909521cf9606094a2048239d69847540cb09" + integrity sha512-OgOYHOLoRK+/mvXU9imKHlG6GkPLYrUCvFXG/CM93R/aNNO8pOOF4aS+S8CCHMDQoNSeiOYEZb/G6RwL95Jktw== + +babel-plugin-polyfill-corejs2@^0.4.4: + version "0.4.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c" + integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.2" + semver "^6.3.1" + +babel-plugin-polyfill-corejs3@^0.1.0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz#80449d9d6f2274912e05d9e182b54816904befd0" + integrity sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.1.5" + core-js-compat "^3.8.1" + +babel-plugin-polyfill-corejs3@^0.8.2: + version "0.8.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz#b4f719d0ad9bb8e0c23e3e630c0c8ec6dd7a1c52" + integrity sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.2" + core-js-compat "^3.31.0" + +babel-plugin-polyfill-regenerator@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326" + integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.2" + +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base16@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base16/-/base16-1.0.0.tgz#e297f60d7ec1014a7a971a39ebc8a98c0b681e70" + integrity sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ== + +base64-js@^1.0.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + 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" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +bonjour-service@^1.0.11: + version "1.1.1" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.1.1.tgz#960948fa0e0153f5d26743ab15baf8e33752c135" + integrity sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg== + dependencies: + array-flatten "^2.1.2" + dns-equal "^1.0.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +boxen@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + +boxen@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-6.2.1.tgz#b098a2278b2cd2845deef2dff2efc38d329b434d" + integrity sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw== + dependencies: + ansi-align "^3.0.1" + camelcase "^6.2.0" + chalk "^4.1.2" + cli-boxes "^3.0.0" + string-width "^5.0.1" + type-fest "^2.5.0" + widest-line "^4.0.1" + wrap-ansi "^8.0.1" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browser-assert@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/browser-assert/-/browser-assert-1.2.1.tgz#9aaa5a2a8c74685c2ae05bfe46efd606f068c200" + integrity sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ== + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5, browserslist@^4.21.9: + version "4.21.10" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" + integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== + dependencies: + caniuse-lite "^1.0.30001517" + electron-to-chromium "^1.4.477" + node-releases "^2.0.13" + update-browserslist-db "^1.0.11" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2, bytes@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cacache@^12.0.2: + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + 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" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase-css@2.0.1, camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001517: + version "1.0.30001519" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001519.tgz#3e7b8b8a7077e78b0eb054d69e6edf5c7df35601" + integrity sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg== + +case-sensitive-paths-webpack-plugin@^2.3.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" + integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== + +ccount@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" + integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +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" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + +cheerio-select@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" + integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== + dependencies: + boolbase "^1.0.0" + css-select "^5.1.0" + css-what "^6.1.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + +cheerio@^1.0.0-rc.12: + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" + integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== + dependencies: + cheerio-select "^2.1.0" + dom-serializer "^2.0.0" + domhandler "^5.0.3" + domutils "^3.0.1" + htmlparser2 "^8.0.1" + parse5 "^7.0.0" + parse5-htmlparser2-tree-adapter "^7.0.0" + +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chokidar@^3.4.1, chokidar@^3.4.2, chokidar@^3.5.2, chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +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" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.2.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +classnames@^2.2.6: + version "2.3.2" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" + integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== + +clean-css@^5.2.2, clean-css@^5.3.0: + version "5.3.2" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.2.tgz#70ecc7d4d4114921f5d298349ff86a31a9975224" + integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== + 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" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + +cli-boxes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" + integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== + dependencies: + restore-cursor "^2.0.0" + +cli-spinners@^2.0.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.0.tgz#5881d0ad96381e117bbe07ad91f2008fe6ffd8db" + integrity sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g== + +cli-table3@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" + integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone-response@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== + dependencies: + mimic-response "^1.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +clsx@^1.1.1, clsx@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + +collapse-white-space@^1.0.2: + version "1.0.6" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" + integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + 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" + 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.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color-support@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +color@^4.0.1: + version "4.2.3" + resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" + integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== + dependencies: + color-convert "^2.0.1" + color-string "^1.9.0" + +colord@^2.9.1: + version "2.9.3" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" + integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== + +colorette@^1.2.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" + integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== + +colorette@^2.0.10: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +combine-promises@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/combine-promises/-/combine-promises-1.1.0.tgz#72db90743c0ca7aab7d0d8d2052fd7b0f674de71" + integrity sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg== + +comma-separated-tokens@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" + integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== + +commander@^2.16.0, commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + 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" + 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" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^8.0.0, commander@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + 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" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +configstore@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + dependencies: + dot-prop "^5.2.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.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" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== + +consola@^2.15.3: + version "2.15.3" + resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" + integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +console-control-strings@^1.0.0, console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + 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" + 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" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^1.5.0, convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== + +copy-text-to-clipboard@^3.0.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz#0202b2d9bdae30a49a53f898626dcc3b49ad960b" + 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" + integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== + dependencies: + fast-glob "^3.2.11" + glob-parent "^6.0.1" + globby "^13.1.1" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + +core-js-compat@^3.31.0, core-js-compat@^3.8.1: + version "3.32.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.32.0.tgz#f41574b6893ab15ddb0ac1693681bd56c8550a90" + integrity sha512-7a9a3D1k4UCVKnLhrgALyFcP7YCsLOQIxPd0dKjf/6GuPcgyiGP70ewWdCGrSK7evyhymi0qO4EqCmSJofDeYw== + dependencies: + browserslist "^4.21.9" + +core-js-pure@^3.30.2: + version "3.32.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.32.0.tgz#5d79f85da7a4373e9a06494ccbef995a4c639f8b" + integrity sha512-qsev1H+dTNYpDUEURRuOXMvpdtAnNEvQWS/FMJ2Vb5AY8ZP4rAPQldkE27joykZPJTe0+IVgHZYh1P5Xu1/i1g== + +core-js@^3.0.4, core-js@^3.23.3, core-js@^3.6.5, core-js@^3.8.2: + version "3.32.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.32.0.tgz#7643d353d899747ab1f8b03d2803b0312a0fb3b6" + integrity sha512-rd4rYZNlF3WuoYuRIDEmbR/ga9CeuWX9U05umAvgrrZoHY4Z++cp/xwPQMvUpBB4Ag6J8KfD80G0zwCyaSxDww== + +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" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + +cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +cosmiconfig@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.2.0.tgz#f7d17c56a590856cd1e7cee98734dca272b0d8fd" + integrity sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ== + dependencies: + import-fresh "^3.2.1" + js-yaml "^4.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-fetch@^3.1.5: + version "3.1.8" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" + integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== + dependencies: + node-fetch "^2.6.12" + +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +css-blank-pseudo@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz#36523b01c12a25d812df343a32c322d2a2324561" + integrity sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ== + dependencies: + postcss-selector-parser "^6.0.9" + +css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q== + +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" + integrity sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g== + +css-has-pseudo@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz#57f6be91ca242d5c9020ee3e51bbb5b89fc7af73" + integrity sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw== + dependencies: + postcss-selector-parser "^6.0.9" + +css-loader@^5.0.1: + version "5.2.7" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.2.7.tgz#9b9f111edf6fb2be5dc62525644cbc9c232064ae" + integrity sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg== + dependencies: + icss-utils "^5.1.0" + loader-utils "^2.0.0" + postcss "^8.2.15" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.1.0" + schema-utils "^3.0.0" + semver "^7.3.5" + +css-loader@^6.7.1: + version "6.8.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88" + integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.21" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.3" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.3.8" + +css-minimizer-webpack-plugin@^4.0.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz#79f6199eb5adf1ff7ba57f105e3752d15211eb35" + integrity sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA== + dependencies: + cssnano "^5.1.8" + jest-worker "^29.1.2" + postcss "^8.4.17" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + +css-prefers-color-scheme@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz#ca8a22e5992c10a5b9d315155e7caee625903349" + integrity sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA== + +css-select@^4.1.3: + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== + dependencies: + boolbase "^1.0.0" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" + +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +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" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-unit-converter@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.2.tgz#4c77f5a1954e6dbff60695ecb214e3270436ab21" + integrity sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA== + +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" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +cssdb@^7.0.1: + version "7.7.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-7.7.0.tgz#8a62f1c825c019134e7830729f050c29e3eca95e" + integrity sha512-1hN+I3r4VqSNQ+OmMXxYexnumbOONkSil0TWMebVXHtzYW4tRRPovUNHPHj2d4nrgOuYJ8Vs3XwvywsuwwXNNA== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-advanced@^5.3.8: + version "5.3.10" + resolved "https://registry.yarnpkg.com/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz#25558a1fbf3a871fb6429ce71e41be7f5aca6eef" + integrity sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ== + dependencies: + autoprefixer "^10.4.12" + cssnano-preset-default "^5.2.14" + postcss-discard-unused "^5.1.0" + postcss-merge-idents "^5.1.1" + postcss-reduce-idents "^5.2.0" + postcss-zindex "^5.1.0" + +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" + integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== + dependencies: + css-declaration-sorter "^6.3.1" + cssnano-utils "^3.1.0" + postcss-calc "^8.2.3" + postcss-colormin "^5.3.1" + postcss-convert-values "^5.1.3" + postcss-discard-comments "^5.1.2" + postcss-discard-duplicates "^5.1.0" + postcss-discard-empty "^5.1.1" + postcss-discard-overridden "^5.1.0" + postcss-merge-longhand "^5.1.7" + postcss-merge-rules "^5.1.4" + postcss-minify-font-values "^5.1.0" + postcss-minify-gradients "^5.1.1" + postcss-minify-params "^5.1.4" + postcss-minify-selectors "^5.2.1" + postcss-normalize-charset "^5.1.0" + postcss-normalize-display-values "^5.1.0" + postcss-normalize-positions "^5.1.1" + postcss-normalize-repeat-style "^5.1.1" + postcss-normalize-string "^5.1.0" + postcss-normalize-timing-functions "^5.1.0" + postcss-normalize-unicode "^5.1.1" + postcss-normalize-url "^5.1.0" + postcss-normalize-whitespace "^5.1.1" + postcss-ordered-values "^5.1.3" + postcss-reduce-initial "^5.1.2" + postcss-reduce-transforms "^5.1.0" + postcss-svgo "^5.1.0" + postcss-unique-selectors "^5.1.1" + +cssnano-utils@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" + integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== + +cssnano@^5.0.13, cssnano@^5.1.12, cssnano@^5.1.8: + version "5.1.15" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf" + integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== + dependencies: + cssnano-preset-default "^5.2.14" + lilconfig "^2.0.3" + yaml "^1.10.2" + +csso@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +csstype@^3.0.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + +cyclist@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.2.tgz#673b5f233bf34d8e602b949429f8171d9121bea3" + integrity sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA== + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.1.0, debug@^4.1.1: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decode-uri-component@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== + dependencies: + mimic-response "^1.0.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + 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" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +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" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +defined@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" + integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== + +del@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" + integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== + dependencies: + globby "^11.0.1" + graceful-fs "^4.2.4" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" + slash "^3.0.0" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +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" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +des.js@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" + integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detab@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detab/-/detab-2.0.4.tgz#b927892069aff405fbb9a186fe97a44a92a94b43" + integrity sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g== + dependencies: + repeat-string "^1.5.4" + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + 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" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +detect-port@^1.3.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" + integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== + dependencies: + address "^1.0.1" + debug "4" + +detective@^5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.1.tgz#6af01eeda11015acb0e73f933242b70f24f91034" + integrity sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw== + dependencies: + acorn-node "^1.8.2" + defined "^1.0.0" + minimist "^1.2.6" + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^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" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== + +dns-packet@^5.2.2: + version "5.6.0" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.0.tgz#2202c947845c7a63c23ece58f2f70ff6ab4c2f7d" + integrity sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + 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" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +dom-walk@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" + integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +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" + 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" + 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" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^2.5.2, domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +domutils@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +dotenv-expand@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv@^8.0.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" + integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== + +duplexer3@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" + integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== + +duplexer@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + 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" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.4.477: + version "1.4.484" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.484.tgz#770358eba089471c5dae5719db3a5a4fbf02bfb2" + integrity sha512-nO3ZEomTK2PO/3TUXgEx0A97xZTpKVf4p427lABHuCpT1IQ2N+njVh29DkQkCk6Q4m2wjU+faK4xAcfFndwjvw== + +elliptic@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + 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" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +emoticon@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/emoticon/-/emoticon-3.2.0.tgz#c008ca7d7620fac742fe1bf4af8ff8fed154ae7f" + integrity sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" + integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +enhanced-resolve@^5.15.0: + version "5.15.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + 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" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +errno@^0.1.3, errno@~0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: + version "1.22.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" + integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== + dependencies: + array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.1" + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.2.1" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.10" + is-weakref "^1.0.2" + object-inspect "^1.12.3" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.0" + safe-array-concat "^1.0.0" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.10" + +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + +es-get-iterator@^1.0.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + +es-module-lexer@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f" + integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA== + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es5-shim@^4.5.13: + version "4.6.7" + resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.6.7.tgz#bc67ae0fc3dd520636e0a1601cc73b450ad3e955" + integrity sha512-jg21/dmlrNQI7JyyA2w7n+yifSxBng0ZralnSfVZjoCawgNTCnS+yBCyVM9DL5itm7SUnDGgv7hcq2XCZX4iRQ== + +es6-shim@^0.35.5: + version "0.35.8" + resolved "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.8.tgz#89216f6fbf8bacba3f897c8c0e814d2a41c05fb7" + integrity sha512-Twf7I2v4/1tLoIXMT8HlqaBSS5H2wQTs2wx3MNYCI8K1R1/clXyCazrcVCPm/FuO9cyV8+leEaZOWD5C253NDg== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-goat@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" + integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== + +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" + 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" + 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" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esrecurse@^4.1.0, esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + 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" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +eta@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eta/-/eta-2.2.0.tgz#eb8b5f8c4e8b6306561a455e62cd7492fe3a9b8a" + 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" + 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" + integrity sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw== + dependencies: + "@types/node" "*" + require-like ">= 0.1.1" + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.0.0, events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +express@^4.17.1, express@^4.17.3: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +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" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.11, fast-glob@^3.2.7, fast-glob@^3.2.9, fast-glob@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +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" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +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" + integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== + dependencies: + punycode "^1.3.2" + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +fbemitter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/fbemitter/-/fbemitter-3.0.0.tgz#00b2a1af5411254aab416cd75f9e6289bee4bff3" + integrity sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw== + dependencies: + fbjs "^3.0.0" + +fbjs-css-vars@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" + integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== + +fbjs@^3.0.0, fbjs@^3.0.1: + version "3.0.5" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.5.tgz#aa0edb7d5caa6340011790bd9249dbef8a81128d" + integrity sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg== + dependencies: + cross-fetch "^3.1.5" + fbjs-css-vars "^1.0.0" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^1.0.35" + +feed@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/feed/-/feed-4.2.2.tgz#865783ef6ed12579e2c44bbef3c9113bc4956a7e" + integrity sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ== + dependencies: + xml-js "^1.6.11" + +figgy-pudding@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== + +file-loader@6.2.0, file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +file-system-cache@^1.0.5: + version "1.1.0" + resolved "https://registry.yarnpkg.com/file-system-cache/-/file-system-cache-1.1.0.tgz#984de17b976b75a77a27e08d6828137c1aa80fa1" + integrity sha512-IzF5MBq+5CR0jXx5RxPe4BICl/oEhBSXKaL9fLhAXrIfIUS77Hr4vzrYyqYMHN6uTt+BOqi3fDCTjjEBCjERKw== + dependencies: + fs-extra "^10.1.0" + ramda "^0.28.0" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +filesize@^8.0.6: + version "8.0.7" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" + integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + 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" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.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" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +flux@^4.0.1: + version "4.0.4" + resolved "https://registry.yarnpkg.com/flux/-/flux-4.0.4.tgz#9661182ea81d161ee1a6a6af10d20485ef2ac572" + integrity sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw== + dependencies: + fbemitter "^3.0.0" + fbjs "^3.0.1" + +follow-redirects@^1.0.0, follow-redirects@^1.14.7: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== + +fork-ts-checker-webpack-plugin@^6.0.4, 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" + integrity sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ== + dependencies: + "@babel/code-frame" "^7.8.3" + "@types/json-schema" "^7.0.5" + chalk "^4.1.0" + chokidar "^3.4.2" + cosmiconfig "^6.0.0" + deepmerge "^4.2.2" + fs-extra "^9.0.0" + glob "^7.1.6" + memfs "^3.1.2" + minimatch "^3.0.4" + schema-utils "2.7.0" + semver "^7.3.2" + tapable "^1.0.0" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fraction.js@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" + integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g== + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-extra@^10.0.0, fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^9.0.0, fs-extra@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-monkey@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.4.tgz#ee8c1b53d3fe8bb7e5d2c5c5dfc0168afdd2f747" + integrity sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ== + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA== + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.0, function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functions-have-names@^1.2.2, functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gauge@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" + integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.2" + console-control-strings "^1.0.0" + has-unicode "^2.0.1" + object-assign "^4.1.1" + signal-exit "^3.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.2" + +gensync@^1.0.0-beta.1, 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" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-proto "^1.0.1" + has-symbols "^1.0.3" + +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" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== + +github-slugger@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.5.0.tgz#17891bbc73232051474d68bd867a34625c955f7d" + integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA== + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +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" + 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" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-promise@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/glob-promise/-/glob-promise-3.4.0.tgz#b6b8f084504216f702dc2ce8c9bc9ac8866fdb20" + integrity sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw== + dependencies: + "@types/glob" "*" + +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" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-dirs@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" + 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" + 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" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +global@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== + dependencies: + min-document "^2.19.0" + process "^0.11.10" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globalthis@^1.0.0, globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +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" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globby@^13.1.1: + version "13.2.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" + integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.3.0" + ignore "^5.2.4" + merge2 "^1.4.1" + slash "^4.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, 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" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +gray-matter@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" + integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== + dependencies: + js-yaml "^3.13.1" + kind-of "^6.0.2" + section-matter "^1.0.0" + strip-bom-string "^1.0.0" + +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + 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" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +handlebars@^4.7.7: + version "4.7.8" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.2" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + 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" + 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" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +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-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" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has-yarn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" + integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hast-to-hyperscript@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" + integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== + dependencies: + "@types/unist" "^2.0.3" + comma-separated-tokens "^1.0.0" + property-information "^5.3.0" + space-separated-tokens "^1.0.0" + style-to-object "^0.3.0" + unist-util-is "^4.0.0" + web-namespaces "^1.0.0" + +hast-util-from-parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" + integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== + dependencies: + "@types/parse5" "^5.0.0" + hastscript "^6.0.0" + property-information "^5.0.0" + vfile "^4.0.0" + vfile-location "^3.2.0" + web-namespaces "^1.0.0" + +hast-util-parse-selector@^2.0.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" + integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== + +hast-util-raw@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.0.1.tgz#973b15930b7529a7b66984c98148b46526885977" + integrity sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig== + dependencies: + "@types/hast" "^2.0.0" + hast-util-from-parse5 "^6.0.0" + hast-util-to-parse5 "^6.0.0" + html-void-elements "^1.0.0" + parse5 "^6.0.0" + unist-util-position "^3.0.0" + vfile "^4.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hast-util-to-parse5@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479" + integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== + dependencies: + hast-to-hyperscript "^9.0.0" + property-information "^5.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hastscript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" + integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +history@^4.9.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" + integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== + dependencies: + "@babel/runtime" "^7.1.2" + loose-envify "^1.2.0" + resolve-pathname "^3.0.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + value-equal "^1.0.1" + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A== + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA== + +html-entities@^2.1.0, html-entities@^2.3.2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" + integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== + +html-minifier-terser@^6.0.2, html-minifier-terser@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== + dependencies: + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" + he "^1.2.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.10.0" + +html-tags@^3.1.0, html-tags@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce" + integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== + +html-void-elements@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" + integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== + +html-webpack-plugin@^5.0.0, html-webpack-plugin@^5.5.0: + version "5.5.3" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz#72270f4a78e222b5825b296e5e3e1328ad525a3e" + integrity sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg== + dependencies: + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +htmlparser2@^8.0.1: + version "8.0.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + entities "^4.4.0" + +http-cache-semantics@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + 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" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.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" + 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" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + 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" + 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" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA== + +ignore@^5.2.0, ignore@^5.2.4: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +image-size@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.0.2.tgz#d778b6d0ab75b2737c1556dd631652eb963bc486" + 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" + 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" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + 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" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +infer-owner@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +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" + 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" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + 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.5, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +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" + integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== + +internal-slot@^1.0.3, internal-slot@^1.0.4, internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== + dependencies: + get-intrinsic "^1.2.0" + has "^1.0.3" + 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" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + 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" + integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-alphabetical@1.0.4, is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q== + dependencies: + binary-extensions "^1.0.0" + +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" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-color-stop@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA== + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-core-module@^2.11.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +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" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + 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" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-function@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" + integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw== + dependencies: + is-extglob "^2.1.0" + +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" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + +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" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-npm@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" + integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + 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" + 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" + 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" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +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" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@^2.0.3, 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" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regex@^1.1.2, is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + 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" + 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" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + +is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== + dependencies: + which-typed-array "^1.1.11" + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-whitespace-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" + integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-word-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" + integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +is-yarn-global@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" + integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + +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@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +isobject@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" + integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== + +iterate-iterator@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/iterate-iterator/-/iterate-iterator-1.0.2.tgz#551b804c9eaa15b847ea6a7cdc2f5bf1ec150f91" + integrity sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw== + +iterate-value@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/iterate-value/-/iterate-value-1.0.2.tgz#935115bd37d006a52046535ebc8d07e9c9337f57" + integrity sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ== + dependencies: + es-get-iterator "^1.0.2" + iterate-iterator "^1.0.1" + +jest-util@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.6.2.tgz#8a052df8fff2eebe446769fd88814521a517664d" + integrity sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w== + dependencies: + "@jest/types" "^29.6.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^29.1.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.6.2.tgz#682fbc4b6856ad0aa122a5403c6d048b83f3fb44" + integrity sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ== + dependencies: + "@types/node" "*" + jest-util "^29.6.2" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jiti@^1.18.2: + version "1.19.1" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.19.1.tgz#fa99e4b76a23053e0e7cde098efe1704a14c16f1" + integrity sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg== + +joi@^17.6.0: + version "17.9.2" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.9.2.tgz#8b2e4724188369f55451aebd1d0b1d9482470690" + integrity sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.1" + "@sideway/pinpoint" "^2.0.0" + +"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" + 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" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + 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" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== + +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +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" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +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" + 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" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json5@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2, json5@^2.2.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + 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" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +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" + 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" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +klona@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" + integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== + +latest-version@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" + integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + dependencies: + package-json "^6.3.0" + +launch-editor@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.0.tgz#4c0c1a6ac126c572bd9ff9a30da1d2cae66defd7" + integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== + dependencies: + picocolors "^1.0.0" + shell-quote "^1.7.3" + +lazy-universal-dotenv@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lazy-universal-dotenv/-/lazy-universal-dotenv-3.0.1.tgz#a6c8938414bca426ab8c9463940da451a911db38" + integrity sha512-prXSYk799h3GY3iOWnC6ZigYzMPjxN2svgjJ9shk7oMadSNX3wXy0B6F32PMJv7qtMnrIbUxoEHzbutvxR2LBQ== + dependencies: + "@babel/runtime" "^7.5.0" + app-root-dir "^1.0.2" + core-js "^3.0.4" + dotenv "^8.0.0" + dotenv-expand "^5.1.0" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +lilconfig@^2.0.3, lilconfig@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + 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" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +loader-utils@^1.2.3: + version "1.4.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" + integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +loader-utils@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +loader-utils@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" + 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" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.curry@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" + integrity sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA== + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.flow@^3.3.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" + integrity sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw== + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.topath@^4.5.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/lodash.topath/-/lodash.topath-4.5.2.tgz#3616351f3bba61994a0931989660bd03254fd009" + integrity sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg== + +lodash.uniq@4.5.0, lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + +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" + 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" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + 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" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +map-age-cleaner@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== + +map-or-similar@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/map-or-similar/-/map-or-similar-1.5.0.tgz#6de2653174adfb5d9edc33c69d3e92a1b76faf08" + integrity sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg== + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== + dependencies: + object-visit "^1.0.0" + +markdown-escapes@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" + integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdast-squeeze-paragraphs@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz#7c4c114679c3bee27ef10b58e2e015be79f1ef97" + integrity sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ== + dependencies: + unist-util-remove "^2.0.0" + +mdast-util-definitions@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" + integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== + dependencies: + unist-util-visit "^2.0.0" + +mdast-util-to-hast@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz#0cfc82089494c52d46eb0e3edb7a4eb2aea021eb" + integrity sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + mdast-util-definitions "^4.0.0" + mdurl "^1.0.0" + unist-builder "^2.0.0" + unist-util-generated "^1.0.0" + unist-util-position "^3.0.0" + unist-util-visit "^2.0.0" + +mdast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" + integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +mdurl@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +mem@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/mem/-/mem-8.1.1.tgz#cf118b357c65ab7b7e0817bdf00c8062297c0122" + integrity sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA== + dependencies: + map-age-cleaner "^0.1.3" + mimic-fn "^3.1.0" + +memfs@^3.1.2, memfs@^3.2.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== + dependencies: + fs-monkey "^1.0.4" + +memoizerific@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/memoizerific/-/memoizerific-1.11.3.tgz#7c87a4646444c32d75438570905f2dbd1b1a805a" + integrity sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog== + dependencies: + map-or-similar "^1.5.0" + +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + 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" + 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" + 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" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +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" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + 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" + integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== + +mime-types@2.1.18: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + 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.30, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + 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" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-fn@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74" + integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== + +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== + dependencies: + dom-walk "^0.1.0" + +mini-css-extract-plugin@^2.6.1: + version "2.7.6" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz#282a3d38863fddcd2e0c220aaed5b90bc156564d" + integrity sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw== + dependencies: + schema-utils "^4.0.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.1, mkdirp@^0.5.3: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +modern-normalize@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/modern-normalize/-/modern-normalize-1.1.0.tgz#da8e80140d9221426bd4f725c6e11283d34f90b7" + integrity sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA== + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ== + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +mrmime@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" + integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + 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" + 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" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +"my-loaders@file:plugins/my-loaders": + version "0.0.0" + +nan@^2.12.1: + version "2.17.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" + integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== + +nanoid@^3.1.30, nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.5.0, neo-async@^2.6.1, neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + 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" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-emoji@^1.10.0, node-emoji@^1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" + integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== + dependencies: + lodash "^4.17.21" + +node-fetch@^2.6.12, node-fetch@^2.6.7: + version "2.6.12" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" + integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== + 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" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-releases@^2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== + +normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== + dependencies: + remove-trailing-separator "^1.0.1" + +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" + 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" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +normalize-url@^4.1.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +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" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npmlog@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" + integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== + dependencies: + are-we-there-yet "^2.0.0" + console-control-strings "^1.1.0" + gauge "^3.0.0" + set-blocking "^2.0.0" + +nprogress@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" + 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" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg== + +object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-hash@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" + integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== + +object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0, object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" + integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +"object.fromentries@^2.0.0 || ^1.0.0": + version "2.0.6" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" + integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.2: + version "2.1.6" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz#5e5c384dd209fa4efffead39e3a0512770ccc312" + integrity sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ== + dependencies: + array.prototype.reduce "^1.0.5" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.21.2" + safe-array-concat "^1.0.0" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + 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" + 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" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== + dependencies: + mimic-fn "^1.0.0" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + 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" + 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" + +opener@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + +ora@^3.0.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318" + integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== + dependencies: + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-spinners "^2.0.0" + log-symbols "^2.2.0" + strip-ansi "^5.2.0" + wcwidth "^1.0.1" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== + +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + 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" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + 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" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json@^6.3.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + dependencies: + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +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" + 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" + integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== + dependencies: + domhandler "^5.0.2" + parse5 "^7.0.0" + +parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parse5@^7.0.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + 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" + 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" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + 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" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +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" + 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" + 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" + 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" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +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" + 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" + 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" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + +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== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.0, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pirates@^4.0.5: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-dir@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760" + integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== + dependencies: + find-up "^5.0.0" + +pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== + +postcss-attribute-case-insensitive@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz#03d761b24afc04c09e757e92ff53716ae8ea2741" + integrity sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-calc@^8.2.3: + version "8.2.4" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" + integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== + dependencies: + postcss-selector-parser "^6.0.9" + postcss-value-parser "^4.2.0" + +postcss-clamp@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-clamp/-/postcss-clamp-4.1.0.tgz#7263e95abadd8c2ba1bd911b0b5a5c9c93e02363" + integrity sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-functional-notation@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz#21a909e8d7454d3612d1659e471ce4696f28caec" + integrity sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-hex-alpha@^8.0.4: + version "8.0.4" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz#c66e2980f2fbc1a63f5b079663340ce8b55f25a5" + integrity sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-rebeccapurple@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz#63fdab91d878ebc4dd4b7c02619a0c3d6a56ced0" + integrity sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-colormin@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz#86c27c26ed6ba00d96c79e08f3ffb418d1d1988f" + integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + colord "^2.9.1" + postcss-value-parser "^4.2.0" + +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" + integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== + dependencies: + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" + +postcss-custom-media@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz#c8f9637edf45fef761b014c024cee013f80529ea" + integrity sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-custom-properties@^12.1.9: + version "12.1.11" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz#d14bb9b3989ac4d40aaa0e110b43be67ac7845cf" + integrity sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-custom-selectors@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz#1ab4684d65f30fed175520f82d223db0337239d9" + integrity sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-dir-pseudo-class@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz#2bf31de5de76added44e0a25ecf60ae9f7c7c26c" + integrity sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA== + dependencies: + postcss-selector-parser "^6.0.10" + +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" + 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" + 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" + 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" + 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" + integrity sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-double-position-gradients@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz#b96318fdb477be95997e86edd29c6e3557a49b91" + integrity sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +postcss-env-function@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-4.0.6.tgz#7b2d24c812f540ed6eda4c81f6090416722a8e7a" + integrity sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-focus-visible@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz#50c9ea9afa0ee657fb75635fabad25e18d76bf9e" + integrity sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw== + dependencies: + postcss-selector-parser "^6.0.9" + +postcss-focus-within@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz#5b1d2ec603195f3344b716c0b75f61e44e8d2e20" + integrity sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ== + dependencies: + postcss-selector-parser "^6.0.9" + +postcss-font-variant@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz#efd59b4b7ea8bb06127f2d031bfbb7f24d32fa66" + integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== + +postcss-functions@^3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-functions/-/postcss-functions-3.0.0.tgz#0e94d01444700a481de20de4d55fb2640564250e" + integrity sha512-N5yWXWKA+uhpLQ9ZhBRl2bIAdM6oVJYpDojuI1nF2SzXBimJcdjFwiAouBVbO5VuOF3qA6BSFWFc3wXbbj72XQ== + dependencies: + glob "^7.1.2" + object-assign "^4.1.1" + postcss "^6.0.9" + postcss-value-parser "^3.3.0" + +postcss-gap-properties@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz#f7e3cddcf73ee19e94ccf7cb77773f9560aa2fff" + integrity sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg== + +postcss-image-set-function@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz#08353bd756f1cbfb3b6e93182c7829879114481f" + integrity sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-import@15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.0.0.tgz#0b66c25fdd9c0d19576e63c803cf39e4bad08822" + integrity sha512-Y20shPQ07RitgBGv2zvkEAu9bqvrD77C9axhj/aA1BQj4czape2MdClCExvB27EwYEJdGgKZBpKanb0t1rK2Kg== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-initial@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-4.0.1.tgz#529f735f72c5724a0fb30527df6fb7ac54d7de42" + integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ== + +postcss-js@^2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-2.0.3.tgz#a96f0f23ff3d08cec7dc5b11bf11c5f8077cdab9" + integrity sha512-zS59pAk3deu6dVHyrGqmC3oDXBdNdajk4k1RyxeVXCrcEDBUBHoIhE4QTsmhxgzXxsaqFDAkUZfmMa5f/N/79w== + dependencies: + camelcase-css "^2.0.1" + postcss "^7.0.18" + +postcss-lab-function@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz#6fe4c015102ff7cd27d1bd5385582f67ebdbdc98" + integrity sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +postcss-load-config@^3.1.0: + version "3.1.4" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" + integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== + dependencies: + lilconfig "^2.0.5" + yaml "^1.10.2" + +postcss-loader@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-6.2.1.tgz#0895f7346b1702103d30fdc66e4d494a93c008ef" + integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.5" + semver "^7.3.5" + +postcss-loader@^7.0.0: + version "7.3.3" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.3.3.tgz#6da03e71a918ef49df1bb4be4c80401df8e249dd" + integrity sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA== + dependencies: + cosmiconfig "^8.2.0" + jiti "^1.18.2" + semver "^7.3.8" + +postcss-logical@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-5.0.4.tgz#ec75b1ee54421acc04d5921576b7d8db6b0e6f73" + integrity sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g== + +postcss-media-minmax@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz#7140bddec173e2d6d657edbd8554a55794e2a5b5" + integrity sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ== + +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" + integrity sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw== + dependencies: + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +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" + integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== + dependencies: + postcss-value-parser "^4.2.0" + stylehacks "^5.1.1" + +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" + integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + cssnano-utils "^3.1.0" + postcss-selector-parser "^6.0.5" + +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" + 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" + integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== + dependencies: + colord "^2.9.1" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +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" + integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== + dependencies: + browserslist "^4.21.4" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +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" + 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" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.0, 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" + integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + 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" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-nested@^4: + version "4.2.3" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-4.2.3.tgz#c6f255b0a720549776d220d00c4b70cd244136f6" + integrity sha512-rOv0W1HquRCamWy2kFl3QazJMMe1ku6rCFoAAH+9AcxdbpDeBr6k968MLWuLjvjMcGEip01ak09hKOEgpK9hvw== + dependencies: + postcss "^7.0.32" + postcss-selector-parser "^6.0.2" + +postcss-nesting@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-10.2.0.tgz#0b12ce0db8edfd2d8ae0aaf86427370b898890be" + integrity sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA== + dependencies: + "@csstools/selector-specificity" "^2.0.0" + postcss-selector-parser "^6.0.10" + +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" + 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" + 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" + 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" + 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" + 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" + 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" + integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== + dependencies: + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" + +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" + integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== + dependencies: + normalize-url "^6.0.1" + postcss-value-parser "^4.2.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" + integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-opacity-percentage@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz#5b89b35551a556e20c5d23eb5260fbfcf5245da6" + integrity sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A== + +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" + integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== + dependencies: + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-overflow-shorthand@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz#7ed6486fec44b76f0eab15aa4866cda5d55d893e" + integrity sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-page-break@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-3.0.4.tgz#7fbf741c233621622b68d435babfb70dd8c1ee5f" + integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== + +postcss-place@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-7.0.5.tgz#95dbf85fd9656a3a6e60e832b5809914236986c4" + integrity sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-preset-env@7.8.2: + version "7.8.2" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-7.8.2.tgz#4c834d5cbd2e29df2abf59118947c456922b79ba" + integrity sha512-rSMUEaOCnovKnwc5LvBDHUDzpGP+nrUeWZGWt9M72fBvckCi45JmnJigUr4QG4zZeOHmOCNCZnd2LKDvP++ZuQ== + dependencies: + "@csstools/postcss-cascade-layers" "^1.1.0" + "@csstools/postcss-color-function" "^1.1.1" + "@csstools/postcss-font-format-keywords" "^1.0.1" + "@csstools/postcss-hwb-function" "^1.0.2" + "@csstools/postcss-ic-unit" "^1.0.1" + "@csstools/postcss-is-pseudo-class" "^2.0.7" + "@csstools/postcss-nested-calc" "^1.0.0" + "@csstools/postcss-normalize-display-values" "^1.0.1" + "@csstools/postcss-oklab-function" "^1.1.1" + "@csstools/postcss-progressive-custom-properties" "^1.3.0" + "@csstools/postcss-stepped-value-functions" "^1.0.1" + "@csstools/postcss-text-decoration-shorthand" "^1.0.0" + "@csstools/postcss-trigonometric-functions" "^1.0.2" + "@csstools/postcss-unset-value" "^1.0.2" + autoprefixer "^10.4.11" + browserslist "^4.21.3" + css-blank-pseudo "^3.0.3" + css-has-pseudo "^3.0.4" + css-prefers-color-scheme "^6.0.3" + cssdb "^7.0.1" + postcss-attribute-case-insensitive "^5.0.2" + postcss-clamp "^4.1.0" + postcss-color-functional-notation "^4.2.4" + postcss-color-hex-alpha "^8.0.4" + postcss-color-rebeccapurple "^7.1.1" + postcss-custom-media "^8.0.2" + postcss-custom-properties "^12.1.9" + postcss-custom-selectors "^6.0.3" + postcss-dir-pseudo-class "^6.0.5" + postcss-double-position-gradients "^3.1.2" + postcss-env-function "^4.0.6" + postcss-focus-visible "^6.0.4" + postcss-focus-within "^5.0.4" + postcss-font-variant "^5.0.0" + postcss-gap-properties "^3.0.5" + postcss-image-set-function "^4.0.7" + postcss-initial "^4.0.1" + postcss-lab-function "^4.2.1" + postcss-logical "^5.0.4" + postcss-media-minmax "^5.0.0" + postcss-nesting "^10.2.0" + postcss-opacity-percentage "^1.1.2" + postcss-overflow-shorthand "^3.0.4" + postcss-page-break "^3.0.4" + postcss-place "^7.0.5" + postcss-pseudo-class-any-link "^7.1.6" + postcss-replace-overflow-wrap "^4.0.0" + postcss-selector-not "^6.0.1" + postcss-value-parser "^4.2.0" + +postcss-pseudo-class-any-link@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz#2693b221902da772c278def85a4d9a64b6e617ab" + integrity sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w== + dependencies: + postcss-selector-parser "^6.0.10" + +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" + 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" + integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + +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" + integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-replace-overflow-wrap@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz#d2df6bed10b477bf9c52fab28c568b4b29ca4319" + integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== + +postcss-selector-not@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz#8f0a709bf7d4b45222793fc34409be407537556d" + integrity sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.6, postcss-selector-parser@^6.0.9: + version "6.0.13" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" + integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-sort-media-queries@^4.2.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz#04a5a78db3921eb78f28a1a781a2e68e65258128" + 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" + integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== + dependencies: + postcss-value-parser "^4.2.0" + svgo "^2.7.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" + integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-value-parser@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.0.0, 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" + 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" + integrity sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A== + +postcss@8.3: + version "8.3.11" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.11.tgz#c3beca7ea811cd5e1c4a3ec6d2e7599ef1f8f858" + integrity sha512-hCmlUAIlUiav8Xdqw3Io4LcpA1DOt7h3LSTAC4G6JGHFFaWzI6qvFt9oilvl8BmkbBRX1IhM90ZAmpk68zccQA== + dependencies: + nanoid "^3.1.30" + picocolors "^1.0.0" + source-map-js "^0.6.2" + +postcss@8.4.25: + version "8.4.25" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.25.tgz#4a133f5e379eda7f61e906c3b1aaa9b81292726f" + integrity sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@^6.0.9: + version "6.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + +postcss@^7, postcss@^7.0.18, postcss@^7.0.32: + version "7.0.39" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== + dependencies: + picocolors "^0.2.1" + source-map "^0.6.1" + +postcss@^8.2.15, postcss@^8.3.11, postcss@^8.3.5, postcss@^8.4.14, postcss@^8.4.17, postcss@^8.4.21: + version "8.4.27" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.27.tgz#234d7e4b72e34ba5a92c29636734349e0d9c3057" + integrity sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== + +pretty-error@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== + dependencies: + lodash "^4.17.20" + renderkid "^3.0.0" + +pretty-hrtime@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + integrity sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A== + +pretty-time@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" + integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== + +prism-react-renderer@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.2.1.tgz#392460acf63540960e5e3caa699d851264e99b89" + integrity sha512-w23ch4f75V1Tnz8DajsYKvY5lF7H1+WvzvLUcF0paFxkTHSp42RS0H5CttdN2Q8RR3DRGZ9v5xD/h3n8C8kGmg== + +prism-react-renderer@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz#786bb69aa6f73c32ba1ee813fbe17a0115435085" + integrity sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg== + +prismjs@^1.28.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" + 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" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + +promise.allsettled@^1.0.0: + version "1.0.6" + resolved "https://registry.yarnpkg.com/promise.allsettled/-/promise.allsettled-1.0.6.tgz#8dc8ba8edf429feb60f8e81335b920e109c94b6e" + integrity sha512-22wJUOD3zswWFqgwjNHa1965LvqTX87WPu/lreY2KSd7SVcERfuZ4GfUaOnJNnvtoIv2yXT/W00YIGMetXtFXg== + dependencies: + array.prototype.map "^1.0.5" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + iterate-value "^1.0.2" + +promise.prototype.finally@^3.1.0: + version "3.1.4" + resolved "https://registry.yarnpkg.com/promise.prototype.finally/-/promise.prototype.finally-3.1.4.tgz#4e756a154e4db27fae24c6b18703495c31da3927" + integrity sha512-nNc3YbgMfLzqtqvO/q5DP6RR0SiHI9pUPGzyDf1q+usTwCN2kjvAnJkBb7bHe3o+fFSBPpsGMoYtaSi+LTNqng== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + +prompts@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.6.2, prop-types@^15.7.2: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +property-information@^5.0.0, property-information@^5.3.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" + integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== + dependencies: + xtend "^4.0.0" + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@^1.2.4, punycode@^1.3.2, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + +punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +pupa@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" + integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== + dependencies: + escape-goat "^2.0.0" + +pure-color@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/pure-color/-/pure-color-1.3.0.tgz#1fe064fb0ac851f0de61320a8bf796836422f33e" + integrity sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA== + +purgecss@^4.0.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/purgecss/-/purgecss-4.1.3.tgz#683f6a133c8c4de7aa82fe2746d1393b214918f7" + integrity sha512-99cKy4s+VZoXnPxaoM23e5ABcP851nC2y2GROkkjS8eJaJtlciGavd7iYAw2V84WeBqggZ12l8ef44G99HmTaw== + dependencies: + commander "^8.0.0" + glob "^7.1.7" + postcss "^8.3.5" + postcss-selector-parser "^6.0.6" + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +qs@^6.10.0, qs@^6.11.0: + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + dependencies: + side-channel "^1.0.4" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +queue@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" + 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" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +ramda@^0.28.0: + version "0.28.0" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.28.0.tgz#acd785690100337e8b063cab3470019be427cc97" + integrity sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA== + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + 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, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc@1.2.8, rc@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-base16-styling@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/react-base16-styling/-/react-base16-styling-0.6.0.tgz#ef2156d66cf4139695c8a167886cb69ea660792c" + integrity sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ== + dependencies: + base16 "^1.0.0" + lodash.curry "^4.0.1" + lodash.flow "^3.3.0" + pure-color "^1.2.0" + +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" + integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== + dependencies: + "@babel/code-frame" "^7.16.0" + address "^1.1.2" + browserslist "^4.18.1" + chalk "^4.1.2" + cross-spawn "^7.0.3" + detect-port-alt "^1.1.6" + escape-string-regexp "^4.0.0" + filesize "^8.0.6" + find-up "^5.0.0" + fork-ts-checker-webpack-plugin "^6.5.0" + global-modules "^2.0.0" + globby "^11.0.4" + gzip-size "^6.0.0" + immer "^9.0.7" + is-root "^2.1.0" + loader-utils "^3.2.0" + open "^8.4.0" + pkg-up "^3.1.0" + prompts "^2.4.2" + react-error-overlay "^6.0.11" + recursive-readdir "^2.2.2" + shell-quote "^1.7.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +react-dom@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler "^0.20.2" + +react-dom@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.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" + integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== + +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" + integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== + +react-feather@^2.0.9: + version "2.0.10" + resolved "https://registry.yarnpkg.com/react-feather/-/react-feather-2.0.10.tgz#0e9abf05a66754f7b7bb71757ac4da7fb6be3b68" + integrity sha512-BLhukwJ+Z92Nmdcs+EMw6dy1Z/VLiJTzEQACDUEnWMClhYnFykJCGWQx+NmwP/qQHGX/5CzQ+TGi8ofg2+HzVQ== + dependencies: + prop-types "^15.7.2" + +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" + integrity sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg== + dependencies: + "@babel/runtime" "^7.12.5" + invariant "^2.2.4" + prop-types "^15.7.2" + 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: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-json-view@^1.21.3: + version "1.21.3" + resolved "https://registry.yarnpkg.com/react-json-view/-/react-json-view-1.21.3.tgz#f184209ee8f1bf374fb0c41b0813cff54549c475" + integrity sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw== + dependencies: + flux "^4.0.1" + react-base16-styling "^0.6.0" + react-lifecycles-compat "^3.0.4" + react-textarea-autosize "^8.3.2" + +react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + +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" + integrity sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A== + dependencies: + "@babel/runtime" "^7.10.3" + +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" + integrity sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg== + dependencies: + "@babel/runtime" "^7.1.2" + +react-router-dom@^5.3.3: + version "5.3.4" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.4.tgz#2ed62ffd88cae6db134445f4a0c0ae8b91d2e5e6" + integrity sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + loose-envify "^1.3.1" + prop-types "^15.6.2" + react-router "5.3.4" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-router@5.3.4, react-router@^5.3.3: + version "5.3.4" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.4.tgz#8ca252d70fcc37841e31473c7a151cf777887bb5" + integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + hoist-non-react-statics "^3.1.0" + loose-envify "^1.3.1" + path-to-regexp "^1.7.0" + prop-types "^15.6.2" + react-is "^16.6.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-textarea-autosize@^8.3.2: + version "8.5.2" + resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.5.2.tgz#6421df2b5b50b9ca8c5e96fd31be688ea7fa2f9d" + integrity sha512-uOkyjkEl0ByEK21eCJMHDGBAAd/BoFQBawYK5XItjAmCTeSbjxghd8qnt7nzsLYzidjnoObu6M26xts0YGKsGg== + dependencies: + "@babel/runtime" "^7.20.13" + use-composed-ref "^1.3.0" + use-latest "^1.2.1" + +react@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +react@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + 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" + 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" + 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" + integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== + dependencies: + minimatch "^3.0.5" + +reduce-css-calc@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz#7ef8761a28d614980dc0c982f772c93f7a99de03" + integrity sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg== + dependencies: + css-unit-converter "^1.1.1" + postcss-value-parser "^3.3.0" + +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + 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" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.7: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regenerator-transform@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" + integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + functions-have-names "^1.2.3" + +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +registry-auth-token@^4.0.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.2.tgz#f02d49c3668884612ca031419491a13539e21fac" + integrity sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg== + dependencies: + rc "1.2.8" + +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + 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" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== + +remark-emoji@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-2.2.0.tgz#1c702090a1525da5b80e15a8f963ef2c8236cac7" + integrity sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w== + dependencies: + emoticon "^3.2.0" + node-emoji "^1.10.0" + unist-util-visit "^2.0.3" + +remark-footnotes@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/remark-footnotes/-/remark-footnotes-2.0.0.tgz#9001c4c2ffebba55695d2dd80ffb8b82f7e6303f" + integrity sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ== + +remark-mdx@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-1.6.22.tgz#06a8dab07dcfdd57f3373af7f86bd0e992108bbd" + integrity sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ== + dependencies: + "@babel/core" "7.12.9" + "@babel/helper-plugin-utils" "7.10.4" + "@babel/plugin-proposal-object-rest-spread" "7.12.1" + "@babel/plugin-syntax-jsx" "7.12.1" + "@mdx-js/util" "1.6.22" + is-alphabetical "1.0.4" + remark-parse "8.0.3" + unified "9.2.0" + +remark-parse@8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" + integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== + dependencies: + ccount "^1.0.0" + collapse-white-space "^1.0.2" + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + is-word-character "^1.0.0" + markdown-escapes "^1.0.0" + parse-entities "^2.0.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + trim "0.0.1" + trim-trailing-lines "^1.0.0" + unherit "^1.0.4" + unist-util-remove-position "^2.0.0" + vfile-location "^3.0.0" + xtend "^4.0.1" + +remark-squeeze-paragraphs@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz#76eb0e085295131c84748c8e43810159c5653ead" + integrity sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw== + dependencies: + mdast-squeeze-paragraphs "^4.0.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== + +renderkid@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" + integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^6.0.1" + +repeat-element@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== + +repeat-string@^1.5.4, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + +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" + 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" + 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" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resize-observer-polyfill@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-pathname@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" + integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== + +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.3.2: + version "1.22.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + dependencies: + is-core-module "^2.11.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== + dependencies: + lowercase-keys "^1.0.0" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + 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" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w== + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg== + +rimraf@^2.5.4, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rtl-detect@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/rtl-detect/-/rtl-detect-1.0.4.tgz#40ae0ea7302a150b96bc75af7d749607392ecac6" + integrity sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ== + +rtlcss@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/rtlcss/-/rtlcss-3.5.0.tgz#c9eb91269827a102bac7ae3115dd5d049de636c3" + integrity sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A== + dependencies: + find-up "^5.0.0" + picocolors "^1.0.0" + postcss "^8.3.11" + strip-json-comments "^3.1.1" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg== + dependencies: + aproba "^1.1.1" + +rxjs@^7.5.4: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-array-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" + integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + has-symbols "^1.0.3" + isarray "^2.0.5" + +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-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + 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== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.6.5: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + 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@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" + integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.9.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.1.0" + +section-matter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" + integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== + dependencies: + extend-shallow "^2.0.1" + kind-of "^6.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" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + +selfsigned@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" + integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== + dependencies: + node-forge "^1" + +semver-diff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" + integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + dependencies: + semver "^6.3.0" + +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.6.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + 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" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.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" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + dependencies: + randombytes "^2.1.0" + +serve-handler@^6.1.3: + version "6.1.5" + resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.5.tgz#a4a0964f5c55c7e37a02a633232b6f0d6f068375" + integrity sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg== + dependencies: + bytes "3.0.0" + content-disposition "0.5.2" + fast-url-parser "1.1.3" + mime-types "2.1.18" + minimatch "3.1.2" + path-is-inside "1.0.2" + path-to-regexp "2.2.1" + range-parser "1.2.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4, setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + 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" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + 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" + 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" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.7.3: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + 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" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0, 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" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + +sirv@^1.0.7: + version "1.0.19" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" + integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== + dependencies: + "@polka/url" "^1.0.0-next.20" + mrmime "^1.0.0" + totalist "^1.0.0" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +sitemap@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-7.1.1.tgz#eeed9ad6d95499161a3eadc60f8c6dce4bea2bef" + integrity sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg== + dependencies: + "@types/node" "^17.0.5" + "@types/sax" "^1.2.1" + arg "^5.0.0" + sax "^1.2.4" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +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" + integrity sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA== + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-js@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" + integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== + +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-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.5.16, source-map-support@~0.5.12, 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" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + +source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +space-separated-tokens@^1.0.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" + integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== + +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.13" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" + integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +ssri@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" + integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== + dependencies: + figgy-pudding "^3.5.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +state-toggle@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" + integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +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" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +std-env@^3.0.1: + version "3.3.3" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.3.3.tgz#a54f06eb245fdcfef53d56f3c0251f1d5c3d01fe" + integrity sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg== + +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + +store2@^2.12.0: + version "2.14.2" + resolved "https://registry.yarnpkg.com/store2/-/store2-2.14.2.tgz#56138d200f9fe5f582ad63bc2704dbc0e4a45068" + integrity sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w== + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + 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@^5.0.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +"string.prototype.matchall@^4.0.0 || ^3.0.1": + version "4.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" + integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + +string.prototype.padend@^3.0.0: + version "3.1.4" + resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz#2c43bb3a89eb54b6750de5942c123d6c98dd65b6" + integrity sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.padstart@^3.0.0: + version "3.1.4" + resolved "https://registry.yarnpkg.com/string.prototype.padstart/-/string.prototype.padstart-3.1.4.tgz#4842d58a09df2addac23cf0b325ce9f087978e90" + integrity sha512-XqOHj8horGsF+zwxraBvMTkBFM28sS/jHBJajh17JtJKA92qazidiQbLosV4UA18azvLOVKYo/E3g3T9Y5826w== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string_decoder@^1.0.0, 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== + dependencies: + safe-buffer "~5.2.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== + dependencies: + safe-buffer "~5.1.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.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" + 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" + 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" + 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" + 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" + 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" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +style-loader@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-2.0.0.tgz#9669602fd4690740eaaec137799a03addbbc393c" + integrity sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +style-to-object@0.3.0, style-to-object@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" + integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== + dependencies: + inline-style-parser "0.1.1" + +stylehacks@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" + integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== + dependencies: + browserslist "^4.21.4" + postcss-selector-parser "^6.0.4" + +stylis@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" + integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== + +supports-color@^5.3.0, supports-color@^5.4.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + 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" + 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" + 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" + 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" + 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" + integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^4.1.3" + css-tree "^1.1.3" + csso "^4.2.0" + picocolors "^1.0.0" + stable "^0.1.8" + +symbol.prototype.description@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/symbol.prototype.description/-/symbol.prototype.description-1.0.5.tgz#d30e01263b6020fbbd2d2884a6276ce4d49ab568" + integrity sha512-x738iXRYsrAt9WBhRCVG5BtIC3B7CUkFwbHW2zOvGtwM33s7JjrCDyq8V0zgMYVb5ymsL8+qkzzpANH63CPQaQ== + dependencies: + call-bind "^1.0.2" + get-symbol-description "^1.0.0" + has-symbols "^1.0.2" + object.getownpropertydescriptors "^2.1.2" + +synchronous-promise@^2.0.15: + version "2.0.17" + resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.17.tgz#38901319632f946c982152586f2caf8ddc25c032" + integrity sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g== + +"tailwind-loader@file:plugins/tailwind-loader": + version "0.0.0" + +"tailwindcss@npm:@tailwindcss/postcss7-compat": + version "2.2.17" + resolved "https://registry.yarnpkg.com/@tailwindcss/postcss7-compat/-/postcss7-compat-2.2.17.tgz#dc78f3880a2af84163150ff426a39e42b9ae8922" + integrity sha512-3h2svqQAqYHxRZ1KjsJjZOVTQ04m29LjfrLjXyZZEJuvUuJN+BCIF9GI8vhE1s0plS0mogd6E6YLg6mu4Wv/Vw== + dependencies: + arg "^5.0.1" + autoprefixer "^9" + bytes "^3.0.0" + chalk "^4.1.2" + chokidar "^3.5.2" + color "^4.0.1" + cosmiconfig "^7.0.1" + detective "^5.2.0" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.2.7" + fs-extra "^10.0.0" + glob-parent "^6.0.1" + html-tags "^3.1.0" + is-color-stop "^1.1.0" + is-glob "^4.0.1" + lodash "^4.17.21" + lodash.topath "^4.5.2" + modern-normalize "^1.1.0" + node-emoji "^1.11.0" + normalize-path "^3.0.0" + object-hash "^2.2.0" + postcss "^7" + postcss-functions "^3" + postcss-js "^2" + postcss-load-config "^3.1.0" + postcss-nested "^4" + postcss-selector-parser "^6.0.6" + postcss-value-parser "^4.1.0" + pretty-hrtime "^1.0.3" + purgecss "^4.0.3" + quick-lru "^5.1.1" + reduce-css-calc "^2.1.8" + resolve "^1.20.0" + tmp "^0.2.1" + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + 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" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +telejson@^6.0.8: + version "6.0.8" + resolved "https://registry.yarnpkg.com/telejson/-/telejson-6.0.8.tgz#1c432db7e7a9212c1fbd941c3e5174ec385148f7" + integrity sha512-nerNXi+j8NK1QEfBHtZUN/aLdDcyupA//9kAboYLrtzZlPLpUfqbVGWb9zz91f/mIjRbAYhbgtnJHY8I1b5MBg== + dependencies: + "@types/is-function" "^1.0.0" + global "^4.4.0" + is-function "^1.0.2" + is-regex "^1.1.2" + is-symbol "^1.0.3" + isobject "^4.0.0" + lodash "^4.17.21" + memoizerific "^1.11.3" + +terser-webpack-plugin@^1.4.3: + version "1.4.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" + integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^4.0.0" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser-webpack-plugin@^5.0.3, terser-webpack-plugin@^5.3.3, terser-webpack-plugin@^5.3.7: + version "5.3.9" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1" + integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.17" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.16.8" + +terser@^4.1.2: + version "4.8.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.1.tgz#a00e5634562de2239fd404c649051bf6fc21144f" + integrity sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +terser@^5.10.0, terser@^5.16.8: + version "5.19.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.2.tgz#bdb8017a9a4a8de4663a7983f45c506534f9234e" + integrity sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + dependencies: + setimmediate "^1.0.4" + +tiny-invariant@^1.0.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" + 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" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +tmp@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA== + +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" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== + dependencies: + kind-of "^3.0.2" + +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +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" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +totalist@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" + integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +trim-trailing-lines@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" + integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== + +trim@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + integrity sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ== + +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" + integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== + +ts-dedent@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" + integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== + +tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.1.tgz#fd8c9a0ff42590b25703c0acb3de3d3f4ede0410" + integrity sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig== + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-fest@^2.5.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + 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" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +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" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + +ua-parser-js@^1.0.35: + version "1.0.35" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.35.tgz#c4ef44343bc3db0a3cbefdf21822f1b1fc1ab011" + integrity sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA== + +uglify-js@^3.1.4: + version "3.17.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" + integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + 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" + +unfetch@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" + integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== + +unherit@^1.0.4: + version "1.1.3" + resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" + integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== + dependencies: + inherits "^2.0.0" + xtend "^4.0.0" + +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" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +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" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-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" + 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" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +unified@9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8" + integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +unified@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" + integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +unist-builder@2.0.3, unist-builder@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" + integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== + +unist-util-generated@^1.0.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" + integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== + +unist-util-is@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" + integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== + +unist-util-position@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" + integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== + +unist-util-remove-position@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc" + integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== + dependencies: + unist-util-visit "^2.0.0" + +unist-util-remove@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-2.1.0.tgz#b0b4738aa7ee445c402fda9328d604a02d010588" + integrity sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q== + dependencies: + unist-util-is "^4.0.0" + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-visit-parents@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" + integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + +unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +update-notifier@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" + integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== + dependencies: + boxen "^5.0.0" + chalk "^4.1.0" + configstore "^5.0.1" + has-yarn "^2.1.0" + import-lazy "^2.1.0" + is-ci "^2.0.0" + is-installed-globally "^0.4.0" + is-npm "^5.0.0" + is-yarn-global "^0.3.0" + latest-version "^5.1.0" + pupa "^2.1.1" + semver "^7.3.4" + semver-diff "^3.1.1" + xdg-basedir "^4.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== + +url-loader@4.1.1, url-loader@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== + dependencies: + prepend-http "^2.0.0" + +url@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.1.tgz#26f90f615427eca1b9f4d6a28288c147e2302a32" + integrity sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA== + dependencies: + punycode "^1.4.1" + qs "^6.11.0" + +use-composed-ref@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.3.0.tgz#3d8104db34b7b264030a9d916c5e94fbe280dbda" + integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== + +use-isomorphic-layout-effect@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" + integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== + +use-latest@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.1.tgz#d13dfb4b08c28e3e33991546a2cee53e14038cf2" + integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== + dependencies: + use-isomorphic-layout-effect "^1.1.1" + +use-sync-external-store@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +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" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ== + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + 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" + 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" + 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" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +value-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" + 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" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +vfile-location@^3.0.0, vfile-location@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" + integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== + +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +wait-on@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-6.0.1.tgz#16bbc4d1e4ebdd41c5b4e63a2e16dbd1f4e5601e" + integrity sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw== + dependencies: + axios "^0.25.0" + joi "^17.6.0" + lodash "^4.17.21" + minimist "^1.2.5" + rxjs "^7.5.4" + +watchpack-chokidar2@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" + integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== + dependencies: + chokidar "^2.1.8" + +watchpack@^1.7.4: + version "1.7.5" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" + integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== + dependencies: + graceful-fs "^4.1.2" + neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.1" + watchpack-chokidar2 "^2.0.1" + +watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +web-namespaces@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" + integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +webpack-bundle-analyzer@^4.5.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.0.tgz#fc093c4ab174fd3dcbd1c30b763f56d10141209d" + integrity sha512-+bXGmO1LyiNx0i9enBu3H8mv42sj/BJWhZNFwjz92tVnBa9J3JMGo2an2IXlEleoDOPn/Hofl5hr/xCpObUDtw== + dependencies: + "@discoveryjs/json-ext" "0.5.7" + acorn "^8.0.4" + acorn-walk "^8.0.0" + chalk "^4.1.0" + commander "^7.2.0" + gzip-size "^6.0.0" + lodash "^4.17.20" + opener "^1.5.2" + sirv "^1.0.7" + ws "^7.3.1" + +webpack-dev-middleware@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-4.3.0.tgz#179cc40795882cae510b1aa7f3710cbe93c9333e" + integrity sha512-PjwyVY95/bhBh6VUqt6z4THplYcsvQ8YNNBTBM873xLVmw8FLeALn0qurHbs9EmcfhzQis/eoqypSnZeuUz26w== + dependencies: + colorette "^1.2.2" + mem "^8.1.1" + memfs "^3.2.2" + mime-types "^2.1.30" + range-parser "^1.2.1" + schema-utils "^3.0.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" + integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== + dependencies: + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@^4.9.3: + version "4.15.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz#8944b29c12760b3a45bdaa70799b17cb91b03df7" + integrity sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.5" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + launch-editor "^2.6.0" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.1.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.13.0" + +webpack-hot-middleware@^2.25.1: + version "2.25.4" + resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.25.4.tgz#d8bc9e9cb664fc3105c8e83d2b9ed436bee4e193" + integrity sha512-IRmTspuHM06aZh98OhBJtqLpeWFM8FXJS5UYpKYxCJzyFoyWj1w6VGFfomZU7OPA55dMLrQK0pRT1eQ3PACr4w== + dependencies: + ansi-html-community "0.0.8" + html-entities "^2.1.0" + strip-ansi "^6.0.0" + +webpack-merge@^5.8.0: + version "5.9.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.9.0.tgz#dc160a1c4cf512ceca515cc231669e9ddb133826" + integrity sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^1.4.0, webpack-sources@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +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" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack-virtual-modules@^0.4.1: + version "0.4.6" + resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.4.6.tgz#3e4008230731f1db078d9cb6f68baf8571182b45" + integrity sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA== + +webpack@4: + version "4.46.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" + integrity sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.4.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.5.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.3" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.7.4" + webpack-sources "^1.4.1" + +webpack@^5.73.0, webpack@^5.9.0: + version "5.88.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.2.tgz#f62b4b842f1c6ff580f3fcb2ed4f0b579f4c210e" + integrity sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^1.0.0" + "@webassemblyjs/ast" "^1.11.5" + "@webassemblyjs/wasm-edit" "^1.11.5" + "@webassemblyjs/wasm-parser" "^1.11.5" + acorn "^8.7.1" + acorn-import-assertions "^1.9.0" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.15.0" + es-module-lexer "^1.2.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.2.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.3.7" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + +webpackbar@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-5.0.2.tgz#d3dd466211c73852741dfc842b7556dcbc2b0570" + integrity sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ== + dependencies: + chalk "^4.1.0" + consola "^2.15.3" + pretty-time "^1.1.0" + std-env "^3.0.1" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + 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" + 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.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + 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.10, which-typed-array@^1.1.11: + version "1.1.11" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" + integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + 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" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.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" + 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" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.0.1: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@^7.3.1: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +ws@^8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + +xml-js@^1.6.11: + version "1.6.11" + resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.11.tgz#927d2f6947f7f1c19a316dd8eea3614e8b18f8e9" + integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== + dependencies: + sax "^1.2.4" + +xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +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" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zwitch@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" + integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== diff --git a/final_upload.py b/final_upload.py new file mode 100644 index 0000000000000000000000000000000000000000..3a62b6a1775334c0edad0b44ca6182c12d20525b --- /dev/null +++ b/final_upload.py @@ -0,0 +1,36 @@ +import re +import os +from typing_extensions import Text + +directory = "videos/" +file_names = os.listdir(directory) + +# Filter files that are txt or mp4 +file_names = [f for f in file_names if os.path.isfile(os.path.join(directory, f)) and (f.endswith('.txt') or f.endswith('.mp4'))] + +# Sort the file names by modification time in descending order +file_names.sort(key=lambda x: os.path.getmtime(os.path.join(directory, x)), reverse=True) + +# Get the latest txt and mp4 file names +latest_files = {} +for file in file_names: + if file.endswith('.txt') and 'txt' not in latest_files: + latest_files['txt'] = file + elif file.endswith('.mp4') and 'mp4' not in latest_files: + latest_files['mp4'] = file + if len(latest_files) == 2: + break + +# Get the text file content and extract title and description +text_file = latest_files.get('txt') +video_file = latest_files.get('mp4') +with open(os.path.join(directory, text_file), 'r') as file: + content = file.read() + title_match = re.search(r'---Youtube title---\n(.*?)\n', content, flags=re.DOTALL) + title = title_match.group(1) if title_match else None + description_match = re.search(r'---Youtube description---\n([\s\S]*)', content) + description = description_match.group(1) if description_match else None + +# Run the upload script with the latest mp4 and txt files +if video_file and text_file: + os.system(f'python upload.py --file="{directory}{video_file}" --privacyStatus="public" --title="{title}" --description="{description}"') diff --git a/gui/asset_components.py b/gui/asset_components.py new file mode 100644 index 0000000000000000000000000000000000000000..490e6146cbc57359122617d91c9c3d7435f77f1b --- /dev/null +++ b/gui/asset_components.py @@ -0,0 +1,172 @@ +import os +import platform +import subprocess + +import gradio as gr + +from shortGPT.api_utils.eleven_api import ElevenLabsAPI +from shortGPT.config.api_db import ApiKeyManager +from shortGPT.config.asset_db import AssetDatabase + + +class AssetComponentsUtils: + EDGE_TTS = "Free EdgeTTS (lower quality)" + COQUI_TTS = "Free CoquiTTS (needs a powerful GPU)" + ELEVEN_TTS = "ElevenLabs(Very High Quality)" + + COQUI_TTS_VOICES = [ + "Claribel Dervla", + "Daisy Studious", + "Gracie Wise", + "Tammie Ema", + "Alison Dietlinde", + "Ana Florence", + "Annmarie Nele", + "Asya Anara", + "Brenda Stern", + "Gitta Nikolina", + "Henriette Usha", + "Sofia Hellen", + "Tammy Grit", + "Tanja Adelina", + "Vjollca Johnnie", + "Andrew Chipper", + "Badr Odhiambo", + "Dionisio Schuyler", + "Royston Min", + "Viktor Eka", + "Abrahan Mack", + "Adde Michal", + "Baldur Sanjin", + "Craig Gutsy", + "Damien Black", + "Gilberto Mathias", + "Ilkin Urbano", + "Kazuhiko Atallah", + "Ludvig Milivoj", + "Suad Qasim", + "Torcull Diarmuid", + "Viktor Menelaos", + "Zacharie Aimilios", + "Nova Hogarth", + "Maja Ruoho", + "Uta Obando", + "Lidiya Szekeres", + "Chandra MacFarland", + "Szofi Granger", + "Camilla Holmström", + "Lilya Stainthorpe", + "Zofija Kendrick", + "Narelle Moon", + "Barbora MacLean", + "Alexandra Hisakawa", + "Alma María", + "Rosemary Okafor", + "Ige Behringer", + "Filip Traverse", + "Damjan Chapman", + "Wulf Carlevaro", + "Aaron Dreschner", + "Kumar Dahl", + "Eugenio Mataracı", + "Ferran Simen", + "Xavier Hayasaka", + "Luis Moray", + "Marcos Rudaski", + ] + + instance_background_video_checkbox = None + instance_background_music_checkbox = None + instance_voiceChoice: dict[gr.Radio] = {} + instance_voiceChoiceTranslation: dict[gr.Radio] = {} + + @classmethod + def getBackgroundVideoChoices(cls): + df = AssetDatabase.get_df() + choices = list(df.loc["background video" == df["type"]]["name"])[:20] + return choices + + @classmethod + def getBackgroundMusicChoices(cls): + df = AssetDatabase.get_df() + choices = list(df.loc["background music" == df["type"]]["name"])[:20] + return choices + + @classmethod + def getElevenlabsVoices(cls): + api_key = ApiKeyManager.get_api_key("ELEVEN LABS") + voices = list(reversed(ElevenLabsAPI(api_key).get_voices().keys())) + return voices + + @classmethod + def start_file(cls, path): + if platform.system() == "Windows": + os.startfile(path) + elif platform.system() == "Darwin": + subprocess.Popen(["open", path]) + else: + subprocess.Popen(["xdg-open", path]) + + @classmethod + def background_video_checkbox(cls): + if cls.instance_background_video_checkbox is None: + cls.instance_background_video_checkbox = gr.CheckboxGroup( + choices=cls.getBackgroundVideoChoices(), + interactive=True, + label="Choose background video", + ) + return cls.instance_background_video_checkbox + + @classmethod + def background_music_checkbox(cls): + if cls.instance_background_music_checkbox is None: + cls.instance_background_music_checkbox = gr.CheckboxGroup( + choices=cls.getBackgroundMusicChoices(), + interactive=True, + label="Choose background music", + ) + return cls.instance_background_music_checkbox + + @classmethod + def voiceChoice(cls, provider: str = None): + if provider == None: + provider = cls.ELEVEN_TTS + if cls.instance_voiceChoice.get(provider, None) is None: + if provider == cls.ELEVEN_TTS: + print("getting eleven voices") + cls.instance_voiceChoice[provider] = gr.Radio( + cls.getElevenlabsVoices(), + label="Elevenlabs voice", + value="Antoni", + interactive=True, + ) + elif provider == cls.COQUI_TTS: + print("getting coqui voices") + cls.instance_voiceChoice[provider] = gr.Dropdown( + cls.COQUI_TTS_VOICES, + label="CoquiTTS voice", + value="Ana Florence", + interactive=True, + ) + return cls.instance_voiceChoice[provider] + + @classmethod + def voiceChoiceTranslation(cls, provider: str = None): + if provider == None: + provider = cls.ELEVEN_TTS + if cls.instance_voiceChoiceTranslation.get(provider, None) is None: + if provider == cls.ELEVEN_TTS: + cls.instance_voiceChoiceTranslation[provider] = gr.Radio( + cls.getElevenlabsVoices(), + label="Elevenlabs voice", + value="Antoni", + interactive=True, + ) + elif provider == cls.COQUI_TTS: + cls.instance_voiceChoiceTranslation[provider] = gr.Radio( + cls.COQUI_TTS_VOICES, + label="CoquiTTS voice", + value="Ana Florence", + interactive=True, + ) + return cls.instance_voiceChoiceTranslation[provider] diff --git a/gui/asset_library_ui.py b/gui/asset_library_ui.py new file mode 100644 index 0000000000000000000000000000000000000000..46cbb8d0f49c3af59b3664b1df82b1218dcc644b --- /dev/null +++ b/gui/asset_library_ui.py @@ -0,0 +1,114 @@ +""" +import re + +import gradio as gr + +from gui.asset_components import (background_music_checkbox, + background_video_checkbox, + getBackgroundMusicChoices, + getBackgroundVideoChoices) +from gui.ui_abstract_component import AbstractComponentUI +from shortGPT.config.asset_db import AssetDatabase + + +class AssetLibrary(AbstractComponentUI): + def __init__(self): + pass + + def create_ui(self): + '''Create the asset library UI''' + with gr.Tab("Asset library") as asset_library_ui: + with gr.Column(): + with gr.Accordion("Add your own video / audio / image", open=False) as accordion: + with gr.Column(visible=True): + asset_name = gr.Textbox(label="Name (required)") + asset_type = gr.Radio(["background video", "background music"], value="background video", label="Type") + youtube_url = gr.Textbox(label="URL (https://youtube.com/xyz)") + add_youtube_link = gr.Button("ADD") + with gr.Row(): + with gr.Column(scale=3): + asset_dataframe_ui = gr.Dataframe(self.__fulfill_df, interactive=False) + with gr.Column(scale=2): + gr.Markdown("Preview") + asset_preview_ui = gr.HTML(self.__get_first_preview) + delete_button = gr.Button("🗑️ Delete", scale=0, variant="primary") + delete_button.click(self.__delete_clicked, [delete_button], [asset_dataframe_ui, asset_preview_ui, delete_button, background_video_checkbox, background_music_checkbox]) + asset_dataframe_ui.select(self.__preview_asset, [asset_dataframe_ui], [asset_preview_ui, delete_button]) + add_youtube_link.click( + self.__verify_youtube_asset_inputs, [asset_name, youtube_url, asset_type], []).success(self.__add_youtube_asset, [asset_name, youtube_url, asset_type], [asset_dataframe_ui, asset_preview_ui, delete_button, accordion, background_video_checkbox, background_music_checkbox]) + return asset_library_ui + + def __fulfill_df(self): + '''Get the asset dataframe''' + return AssetDatabase.get_df() + + def __verify_youtube_asset_inputs(self, asset_name, yt_url, type): + if not asset_name or not re.match("^[A-Za-z0-9 _-]*$", asset_name): + raise gr.Error('Invalid asset name. Please provide a valid name that you will recognize (Only use letters and numbers)') + if not yt_url.startswith("https://youtube.com/") and not yt_url.startswith("https://www.youtube.com/"): + raise gr.Error('Invalid YouTube URL. Please provide a valid URL.') + if AssetDatabase.asset_exists(asset_name): + raise gr.Error('An asset already exists with this name, please choose a different name.') + + def __add_youtube_asset(self, asset_name, yt_url, type): + '''Add a youtube asset''' + AssetDatabase.add_remote_asset(asset_name, type, yt_url) + latest_df = AssetDatabase.get_df() + return gr.DataFrame.update(value=latest_df), gr.HTML.update(value=self.__get_asset_embed(latest_df, 0)),\ + gr.update(value=f"🗑️ Delete {latest_df.iloc[0]['name']}"),\ + gr.Accordion.update(open=False),\ + gr.CheckboxGroup.update(choices=getBackgroundVideoChoices(), interactive=True),\ + gr.CheckboxGroup.update(choices=getBackgroundMusicChoices(), interactive=True) + + def __get_first_preview(self): + '''Get the first preview''' + return self.__get_asset_embed(AssetDatabase.get_df(), 0) + + def __delete_clicked(self, button_name): + '''Delete an asset''' + asset_name = button_name.split("🗑️ Delete ")[-1] + AssetDatabase.remove_asset(asset_name) + data = AssetDatabase.get_df() + if len(data) > 0: + return gr.update(value=data),\ + gr.HTML.update(value=self.__get_asset_embed(data, 0)),\ + gr.update(value=f"🗑️ Delete {data.iloc[0]['name']}"),\ + gr.CheckboxGroup.update(choices=getBackgroundVideoChoices(), interactive=True),\ + gr.CheckboxGroup.update(choices=getBackgroundMusicChoices(), interactive=True) + return gr.Dataframe.update(value=data),\ + gr.HTML.update(visible=True),\ + gr.Button.update(value="🗑️ Delete"),\ + gr.CheckboxGroup.update(choices=getBackgroundVideoChoices(), interactive=True),\ + gr.CheckboxGroup.update(choices=getBackgroundMusicChoices(), interactive=True) + + def __preview_asset(self, data, evt: gr.SelectData): + '''Preview an asset''' + html_embed = self.__get_asset_embed(data, evt.index[0]) + return gr.HTML.update(value=html_embed), gr.update(value=f"🗑️ Delete {data.iloc[evt.index[0]]['name']}") + + def __get_asset_embed(self, data, row): + '''Get the asset embed''' + embed_height = 300 + embed_width = 300 + asset_link = data.iloc[row]['link'] + + if 'youtube.com' in asset_link: + asset_link = f"https://youtube.com/embed/{asset_link.split('?v=')[-1]}" + embed_html = f'' + elif 'public/' in asset_link: + asset_link = f"http://localhost:31415/file={asset_link}" + file_ext = asset_link.split('.')[-1] + + if file_ext in ['mp3', 'wav', 'ogg']: + audio_type = 'audio/mpeg' if file_ext == 'mp3' else f'audio/{file_ext}' + embed_html = f'' + elif file_ext in ['mp4', 'webm', 'ogg', 'mov']: + video_type = 'video/mp4' if file_ext == 'mp4' else f'video/{file_ext}' + embed_html = f'' + elif file_ext in ['jpg', 'jpeg', 'png', 'gif']: + embed_html = f'' + else: + embed_html = 'Unsupported file type' + return embed_html + +""" diff --git a/gui/content_automation_ui.py b/gui/content_automation_ui.py new file mode 100644 index 0000000000000000000000000000000000000000..592a2b437a8bbcee56443878c776dfd7f4648e2f --- /dev/null +++ b/gui/content_automation_ui.py @@ -0,0 +1,24 @@ +import gradio as gr + +from gui.ui_tab_short_automation import ShortAutomationUI +from gui.ui_tab_video_automation import VideoAutomationUI +from gui.ui_tab_video_translation import VideoTranslationUI + + +class GradioContentAutomationUI: + def __init__(self, shortGPTUI): + self.shortGPTUI = shortGPTUI + self.content_automation_ui = None + + def create_ui(self): + '''Create Gradio interface''' + with gr.Tab("Content Automation") as self.content_automation_ui: + gr.Markdown("# 🏆 Content Automation 🚀") + gr.Markdown("## Choose your desired automation task.") + choice = gr.Radio(['🎬 Automate the creation of shorts', '🎞️ Automate a video with stock assets', '🌐 Automate multilingual video dubbing'], label="Choose an option") + video_automation_ui = VideoAutomationUI(self.shortGPTUI).create_ui() + short_automation_ui = ShortAutomationUI(self.shortGPTUI).create_ui() + video_translation_ui = VideoTranslationUI(self.shortGPTUI).create_ui() + choice.change(lambda x: (gr.update(visible=x == choice.choices[1]), gr.update(visible=x == choice.choices[0]), gr.update( + visible=x == choice.choices[2])), [choice], [video_automation_ui, short_automation_ui, video_translation_ui]) + return self.content_automation_ui diff --git a/gui/gui_gradio.py b/gui/gui_gradio.py new file mode 100644 index 0000000000000000000000000000000000000000..eb74d984e4afc94bc92e829f038909c000d6c941 --- /dev/null +++ b/gui/gui_gradio.py @@ -0,0 +1,38 @@ +import gradio as gr + +from gui.content_automation_ui import GradioContentAutomationUI +from gui.ui_abstract_base import AbstractBaseUI +from gui.ui_components_html import GradioComponentsHTML +from gui.ui_tab_asset_library import AssetLibrary +from gui.ui_tab_config import ConfigUI +from shortGPT.utils.cli import CLI + + +class ShortGptUI(AbstractBaseUI): + '''Class for the GUI. This class is responsible for creating the UI and launching the server.''' + + def __init__(self, colab=False): + super().__init__(ui_name='gradio_shortgpt') + self.colab = colab + CLI.display_header() + + def create_interface(self): + '''Create Gradio interface''' + with gr.Blocks(css="footer {visibility: hidden}", title="ShortGPT Demo") as shortGptUI: + with gr.Row(variant='compact'): + gr.HTML(GradioComponentsHTML.get_html_header()) + + self.content_automation = GradioContentAutomationUI(shortGptUI).create_ui() + self.asset_library_ui = AssetLibrary().create_ui() + self.config_ui = ConfigUI().create_ui() + return shortGptUI + + def launch(self): + '''Launch the server''' + shortGptUI = self.create_interface() + shortGptUI.queue(concurrency_count=5, max_size=20).launch(server_port=31415, height=1000, share=self.colab, server_name="0.0.0.0") + + +if __name__ == "__main__": + app = ShortGptUI() + app.launch() diff --git a/gui/ui_abstract_base.py b/gui/ui_abstract_base.py new file mode 100644 index 0000000000000000000000000000000000000000..ff49cca1dea0d31660d8290807cf0ed8ef16213c --- /dev/null +++ b/gui/ui_abstract_base.py @@ -0,0 +1,19 @@ + +import gradio as gr + + +class AbstractBaseUI: + '''Base class for the GUI. This class is responsible for creating the UI and launching the server.''' + max_choices = 20 + ui_asset_dataframe = gr.Dataframe(interactive=False) + LOGO_PATH = "http://localhost:31415/file=public/logo.png" + LOGO_DIM = 64 + + def __init__(self, ui_name='default'): + self.ui_name = ui_name + self.content_automation = None + self.asset_library_ui = None + self.config_ui = None + + def create_interface(self): + raise NotImplementedError diff --git a/gui/ui_abstract_component.py b/gui/ui_abstract_component.py new file mode 100644 index 0000000000000000000000000000000000000000..6247e5d8a9c4997deafac5fcdf542aec75529a20 --- /dev/null +++ b/gui/ui_abstract_component.py @@ -0,0 +1,5 @@ + + +class AbstractComponentUI: + def create_ui(self): + raise NotImplementedError diff --git a/gui/ui_components_html.py b/gui/ui_components_html.py new file mode 100644 index 0000000000000000000000000000000000000000..339301f4aa2cf7c5cca2305d4eea190f3a5d5acb --- /dev/null +++ b/gui/ui_components_html.py @@ -0,0 +1,49 @@ +class GradioComponentsHTML: + + @staticmethod + def get_html_header() -> str: + '''Create HTML for the header''' + return ''' +
+
+
+
+ ''' + + @staticmethod + def get_html_error_template() -> str: + return ''' +
+

ERROR : {error_message}

+

Traceback Info : {stack_trace}

+

If the problem persists, don't hesitate to contact our support. We're here to assist you.

+ Get Help on Discord +
+ ''' + + @staticmethod + def get_html_video_template(file_url_path, file_name, width="auto", height="auto"): + """ + Generate an HTML code snippet for embedding and downloading a video. + + Parameters: + file_url_path (str): The URL or path to the video file. + file_name (str): The name of the video file. + width (str, optional): The width of the video. Defaults to "auto". + height (str, optional): The height of the video. Defaults to "auto". + + Returns: + str: The generated HTML code snippet. + """ + html = f''' +
+ + + + +
+ ''' + return html diff --git a/gui/ui_tab_asset_library.py b/gui/ui_tab_asset_library.py new file mode 100644 index 0000000000000000000000000000000000000000..13975813ab809d968fb719fd26713976b21dca7a --- /dev/null +++ b/gui/ui_tab_asset_library.py @@ -0,0 +1,199 @@ +import os +import re +import shutil +import dotenv + +import gradio as gr + +from gui.asset_components import AssetComponentsUtils +from gui.ui_abstract_component import AbstractComponentUI +from shortGPT.config.asset_db import AssetDatabase, AssetType + +dotenv.load_dotenv() + +class AssetLibrary(AbstractComponentUI): + def __init__(self): + pass + + def create_ui(self): + '''Create the asset library UI''' + with gr.Tab("Asset library") as asset_library_ui: + with gr.Column(): + with gr.Accordion("➕ Add your own local assets or from Youtube", open=False) as accordion: + remote = "Add youtube video / audio" + local = "Add local video / audio / image " + assetFlows = gr.Radio([remote, local], label="", value=remote) + with gr.Column(visible=True) as youtubeFlow: + asset_name = gr.Textbox(label="Name (required)") + asset_type = gr.Radio([AssetType.BACKGROUND_VIDEO.value, AssetType.BACKGROUND_MUSIC.value,], value=AssetType.BACKGROUND_VIDEO.value, label="Type") + youtube_url = gr.Textbox(label="URL (https://youtube.com/xyz)") + add_youtube_link = gr.Button("ADD") + + with gr.Column(visible=False) as localFileFlow: + local_upload_name = gr.Textbox(label="Name (required)") + upload_type = gr.Radio([AssetType.BACKGROUND_VIDEO.value, AssetType.BACKGROUND_MUSIC.value, AssetType.IMAGE.value], value="background video", interactive=True, label="Type") + video_upload = gr.Video(visible=True, source="upload", type="filepath", interactive=True) + audio_upload = gr.Audio(visible=False, source="upload", type="filepath", interactive=True) + image_upload = gr.Image(visible=False, source="upload", type="filepath", interactive=True) + upload_button = gr.Button("ADD") + upload_type.change(lambda x: (gr.update(visible='video' in x), + gr.update(visible=any(type in x for type in ['audio', 'music'])), + gr.update(visible=x == 'image')), + [upload_type], [video_upload, audio_upload, image_upload]) + assetFlows.change(lambda x: (gr.update(visible=x == remote), gr.update(visible=x == local)), [assetFlows], [youtubeFlow, localFileFlow]) + with gr.Row(): + with gr.Column(scale=3): + asset_dataframe_ui = gr.Dataframe(self.__fulfill_df, interactive=False) + video_choise = gr.Radio(["background video", "background music"], value="background video", label="Type") + with gr.Column(scale=2): + gr.Markdown("Preview") + asset_preview_ui = gr.HTML(self.__get_first_preview) + delete_button = gr.Button("🗑️ Delete", scale=0, variant="primary") + delete_button.click(self.__delete_clicked, [delete_button], [asset_dataframe_ui, asset_preview_ui, delete_button, AssetComponentsUtils.background_video_checkbox(), AssetComponentsUtils.background_music_checkbox()]) + asset_dataframe_ui.select(self.__preview_asset, [asset_dataframe_ui], [asset_preview_ui, delete_button]) + + add_youtube_link.click( + self.__verify_youtube_asset_inputs, [asset_name, youtube_url, asset_type], []).success(self.__add_youtube_asset, [asset_name, youtube_url, asset_type], [asset_dataframe_ui, asset_preview_ui, delete_button, accordion, AssetComponentsUtils.background_video_checkbox(), AssetComponentsUtils.background_music_checkbox()]).success(lambda: gr.update(open=False), [accordion]) + + upload_button.click( + self.__verify_and_upload_local_asset, [upload_type, local_upload_name, video_upload, audio_upload, image_upload, ], []).success(self.__upload_local_asset, [upload_type, local_upload_name, video_upload, audio_upload, image_upload, ], [asset_dataframe_ui, asset_preview_ui, delete_button, accordion, AssetComponentsUtils.background_video_checkbox(), AssetComponentsUtils.background_music_checkbox()]).success(lambda: gr.update(open=False), [accordion]) + + return asset_library_ui + + def __fulfill_df(self): + '''Get the dataframe of assets''' + return AssetDatabase.get_df() + + def __verify_youtube_asset_inputs(self, asset_name, yt_url, type): + if not asset_name or not re.match("^[A-Za-z0-9 _-]*$", asset_name): + raise gr.Error('Invalid asset name. Please provide a valid name that you will recognize (Only use letters and numbers)') + if not yt_url.startswith("https://youtube.com/") and not yt_url.startswith("https://www.youtube.com/"): + raise gr.Error('Invalid YouTube URL. Please provide a valid URL.') + if AssetDatabase.asset_exists(asset_name): + raise gr.Error('An asset already exists with this name, please choose a different name.') + + def __validate_asset_name(self, asset_name): + '''Validate asset name''' + if not asset_name or not re.match("^[A-Za-z0-9 _-]*$", asset_name): + raise gr.Error('Invalid asset name. Please provide a valid name that you will recognize (Only use letters and numbers)') + if AssetDatabase.asset_exists(asset_name): + raise gr.Error('An asset already exists with this name, please choose a different name.') + + def __validate_youtube_url(self, yt_url): + '''Validate YouTube URL''' + if not yt_url.startswith("https://youtube.com/") and not yt_url.startswith("https://www.youtube.com/"): + raise gr.Error('Invalid YouTube URL. Please provide a valid URL.') + + def __verify_and_add_youtube_asset(self, asset_name, yt_url, type): + '''Verify and add a youtube asset to the database''' + self.__validate_asset_name(asset_name) + self.__validate_youtube_url(yt_url) + return self.__add_youtube_asset(asset_name, yt_url, type) + + def __add_youtube_asset(self, asset_name, yt_url, type): + '''Add a youtube asset''' + AssetDatabase.add_remote_asset(asset_name, AssetType(type), yt_url) + latest_df = AssetDatabase.get_df() + return gr.DataFrame.update(value=latest_df), gr.HTML.update(value=self.__get_asset_embed(latest_df, 0)),\ + gr.update(value=f"🗑️ Delete {latest_df.iloc[0]['name']}"),\ + gr.Accordion.update(open=False),\ + gr.CheckboxGroup.update(choices=AssetComponentsUtils.getBackgroundVideoChoices(), interactive=True),\ + gr.CheckboxGroup.update(choices=AssetComponentsUtils.getBackgroundMusicChoices(), interactive=True) + + def __get_first_preview(self): + '''Get the first preview''' + return self.__get_asset_embed(AssetDatabase.get_df(), 0) + + def __delete_clicked(self, button_name): + '''Delete an asset''' + asset_name = button_name.split("🗑️ Delete ")[-1] + AssetDatabase.remove_asset(asset_name) + data = AssetDatabase.get_df() + if len(data) > 0: + return gr.update(value=data),\ + gr.HTML.update(value=self.__get_asset_embed(data, 0)),\ + gr.update(value=f"🗑️ Delete {data.iloc[0]['name']}"),\ + gr.CheckboxGroup.update(choices=AssetComponentsUtils.getBackgroundVideoChoices(), interactive=True),\ + gr.CheckboxGroup.update(choices=AssetComponentsUtils.getBackgroundMusicChoices(), interactive=True) + return gr.Dataframe.update(value=data),\ + gr.HTML.update(visible=True),\ + gr.Button.update(value="🗑️ Delete"),\ + gr.CheckboxGroup.update(choices=AssetComponentsUtils.getBackgroundVideoChoices(), interactive=True),\ + gr.CheckboxGroup.update(choices=AssetComponentsUtils.getBackgroundMusicChoices(), interactive=True) + + def __preview_asset(self, data, evt: gr.SelectData): + '''Preview the asset with the given name''' + html_embed = self.__get_asset_embed(data, evt.index[0]) + return gr.HTML.update(value=html_embed), gr.update(value=f"🗑️ Delete {data.iloc[evt.index[0]]['name']}") + + def __get_asset_embed(self, data, row): + '''Get the embed html for the asset at the given row''' + embed_height = 300 + embed_width = 300 + asset_link = data.iloc[row]['link'] + + if 'youtube.com' in asset_link: + asset_link_split = asset_link.split('?v=') + if asset_link_split[0] == asset_link: + asset_link_split = asset_link.split('/') + # if the last character is a /, remove it + if asset_link_split[-1] == '/': + asset_link_split = asset_link_split[:-1] + asset_link_split = asset_link_split[-1] + else: + asset_link_split = asset_link_split[-1] + asset_link = f"https://youtube.com/embed/{asset_link_split}" + embed_html = f'' + elif 'public/' in asset_link: + asset_link = f"{os.environ.get('PUBLIC_URL')}/{asset_link}" + file_ext = asset_link.split('.')[-1] + + if file_ext in ['mp3', 'wav', 'ogg']: + audio_type = 'audio/mpeg' if file_ext == 'mp3' else f'audio/{file_ext}' + embed_html = f'' + elif file_ext in ['mp4', 'webm', 'ogg', 'mov']: + video_type = 'video/mp4' if file_ext == 'mp4' else f'video/{file_ext}' + embed_html = f'' + elif file_ext in ['jpg', 'jpeg', 'png', 'gif']: + embed_html = f'' + else: + embed_html = 'Unsupported file type' + return embed_html + + @staticmethod + def __clean_filename(filename): + '''Clean the filename''' + return re.sub('[\\\\/:*?"<>|]', '', filename) + + def __verify_and_upload_local_asset(self, upload_type, upload_name, video_path, audio_path, image_path): + '''Verify and upload a local asset to the database''' + self.__validate_asset_name(upload_name) + path_dict = { + AssetType.VIDEO.value: video_path, + AssetType.BACKGROUND_VIDEO.value: video_path, + AssetType.AUDIO.value: audio_path, + AssetType.BACKGROUND_MUSIC.value: audio_path, + AssetType.IMAGE.value: image_path + } + if not os.path.exists(path_dict[upload_type]): + raise gr.Error(f'The file does not exist at the given path.') + return self.__upload_local_asset(upload_type, upload_name, video_path, audio_path, image_path) + + def __upload_local_asset(self, upload_type, upload_name, video_path, audio_path, image_path): + '''Upload a local asset to the database''' + path_dict = { + AssetType.VIDEO.value: video_path, + AssetType.BACKGROUND_VIDEO.value: video_path, + AssetType.AUDIO.value: audio_path, + AssetType.BACKGROUND_MUSIC.value: audio_path, + AssetType.IMAGE.value: image_path + } + new_path = "public/" + self.__clean_filename(upload_name) + "." + path_dict[upload_type].split(".")[-1] + shutil.move(path_dict[upload_type], new_path) + AssetDatabase.add_local_asset(upload_name, AssetType(upload_type), new_path) + latest_df = AssetDatabase.get_df() + return gr.DataFrame.update(value=latest_df), gr.HTML.update(value=self.__get_asset_embed(latest_df, 0)),\ + gr.update(value=f"🗑️ Delete {latest_df.iloc[0]['name']}"),\ + gr.Accordion.update(open=False),\ + gr.CheckboxGroup.update(choices=AssetComponentsUtils.getBackgroundVideoChoices(), interactive=True),\ + gr.CheckboxGroup.update(choices=AssetComponentsUtils.getBackgroundMusicChoices(), interactive=True) diff --git a/gui/ui_tab_config.py b/gui/ui_tab_config.py new file mode 100644 index 0000000000000000000000000000000000000000..3cec01a229fdff6d4da03e7040a95d5a69b12841 --- /dev/null +++ b/gui/ui_tab_config.py @@ -0,0 +1,92 @@ +import time + +import gradio as gr + +from gui.asset_components import AssetComponentsUtils +from gui.ui_abstract_component import AbstractComponentUI +from shortGPT.api_utils.eleven_api import ElevenLabsAPI +from shortGPT.config.api_db import ApiKeyManager + + +class ConfigUI(AbstractComponentUI): + def __init__(self): + self.api_key_manager = ApiKeyManager() + eleven_key = self.api_key_manager.get_api_key('ELEVEN LABS') + self.eleven_labs_api = ElevenLabsAPI(eleven_key) if eleven_key else None + + def on_show(self, button_text, textbox, button): + '''Show or hide the API key''' + if button_text == "Show": + return gr.Textbox.update(type="text"), gr.Button.update(value="Hide") + return gr.Textbox.update(type="password"), gr.Button.update(value="Show") + + def verify_eleven_key(self, eleven_key, remaining_chars): + '''Verify the ElevenLabs API key''' + if (eleven_key and self.api_key_manager.get_api_key('ELEVEN LABS') != eleven_key): + try: + self.eleven_labs_api = ElevenLabsAPI(eleven_key) + print(self.eleven_labs_api) + return self.eleven_labs_api.get_remaining_characters() + except Exception as e: + raise gr.Error(e.args[0]) + return remaining_chars + + def save_keys(self, openai_key, eleven_key, pexels_key): + '''Save the keys in the database''' + if (self.api_key_manager.get_api_key('OPENAI') != openai_key): + self.api_key_manager.set_api_key("OPENAI", openai_key) + if (self.api_key_manager.get_api_key('PEXELS') != pexels_key): + self.api_key_manager.set_api_key("PEXELS", pexels_key) + if (self.api_key_manager.get_api_key('ELEVEN LABS') != eleven_key): + self.api_key_manager.set_api_key("ELEVEN LABS", eleven_key) + new_eleven_voices = AssetComponentsUtils.getElevenlabsVoices() + return gr.Textbox.update(value=openai_key),\ + gr.Textbox.update(value=eleven_key),\ + gr.Textbox.update(value=pexels_key),\ + gr.Radio.update(choices=new_eleven_voices),\ + gr.Radio.update(choices=new_eleven_voices) + + return gr.Textbox.update(value=openai_key),\ + gr.Textbox.update(value=eleven_key),\ + gr.Textbox.update(value=pexels_key),\ + gr.Radio.update(visible=True),\ + gr.Radio.update(visible=True) + + def get_eleven_remaining(self,): + '''Get the remaining characters from ElevenLabs API''' + if (self.eleven_labs_api): + try: + return self.eleven_labs_api.get_remaining_characters() + except Exception as e: + return e.args[0] + return "" + + def back_to_normal(self): + '''Back to normal after 3 seconds''' + time.sleep(3) + return gr.Button.update(value="save") + + def create_ui(self): + '''Create the config UI''' + with gr.Tab("Config") as config_ui: + with gr.Row(): + with gr.Column(): + with gr.Row(): + openai_textbox = gr.Textbox(value=self.api_key_manager.get_api_key("OPENAI"), label=f"OPENAI API KEY", show_label=True, interactive=True, show_copy_button=True, type="password", scale=40) + show_openai_key = gr.Button("Show", size="sm", scale=1) + show_openai_key.click(self.on_show, [show_openai_key], [openai_textbox, show_openai_key]) + with gr.Row(): + eleven_labs_textbox = gr.Textbox(value=self.api_key_manager.get_api_key("ELEVEN LABS"), label=f"ELEVEN LABS API KEY", show_label=True, interactive=True, show_copy_button=True, type="password", scale=40) + eleven_characters_remaining = gr.Textbox(value=self.get_eleven_remaining(), label=f"CHARACTERS REMAINING", show_label=True, interactive=False, type="text", scale=40) + show_eleven_key = gr.Button("Show", size="sm", scale=1) + show_eleven_key.click(self.on_show, [show_eleven_key], [eleven_labs_textbox, show_eleven_key]) + with gr.Row(): + pexels_textbox = gr.Textbox(value=self.api_key_manager.get_api_key("PEXELS"), label=f"PEXELS KEY", show_label=True, interactive=True, show_copy_button=True, type="password", scale=40) + show_pexels_key = gr.Button("Show", size="sm", scale=1) + show_pexels_key.click(self.on_show, [show_pexels_key], [pexels_textbox, show_pexels_key]) + save_button = gr.Button("save", size="sm", scale=1) + save_button.click(self.verify_eleven_key, [eleven_labs_textbox, eleven_characters_remaining], [eleven_characters_remaining]).success( + self.save_keys, [openai_textbox, eleven_labs_textbox, pexels_textbox], [openai_textbox, eleven_labs_textbox, pexels_textbox, AssetComponentsUtils.voiceChoice(), AssetComponentsUtils.voiceChoiceTranslation()]) + save_button.click(lambda _: gr.Button.update(value="Keys Saved !"), [], [save_button]) + save_button.click(self.back_to_normal, [], [save_button]) + return config_ui diff --git a/gui/ui_tab_short_automation.py b/gui/ui_tab_short_automation.py new file mode 100644 index 0000000000000000000000000000000000000000..bf59368571d64d87601eb069ca713b8e7a6718b7 --- /dev/null +++ b/gui/ui_tab_short_automation.py @@ -0,0 +1,175 @@ +import os +import traceback + +import gradio as gr + +from gui.asset_components import AssetComponentsUtils +from gui.ui_abstract_component import AbstractComponentUI +from gui.ui_components_html import GradioComponentsHTML +from shortGPT.audio.edge_voice_module import EdgeTTSVoiceModule +from shortGPT.audio.eleven_voice_module import ElevenLabsVoiceModule +from shortGPT.audio.coqui_voice_module import CoquiVoiceModule +from shortGPT.config.api_db import ApiKeyManager +from shortGPT.config.languages import (EDGE_TTS_VOICENAME_MAPPING, + ELEVEN_SUPPORTED_LANGUAGES, + COQUI_SUPPORTED_LANGUAGES, + LANGUAGE_ACRONYM_MAPPING, + Language) +from shortGPT.engine.facts_short_engine import FactsShortEngine +from shortGPT.engine.reddit_short_engine import RedditShortEngine + + +class ShortAutomationUI(AbstractComponentUI): + def __init__(self, shortGptUI: gr.Blocks): + self.shortGptUI = shortGptUI + self.embedHTML = '
' + self.progress_counter = 0 + self.short_automation = None + + def create_ui(self): + with gr.Row(visible=False) as short_automation: + with gr.Column(): + numShorts = gr.Number(label="Number of shorts", minimum=1, value=1) + short_type = gr.Radio(["Reddit Story shorts", "Historical Facts shorts", "Scientific Facts shorts", "Custom Facts shorts"], label="Type of shorts generated", value="Scientific Facts shorts", interactive=True) + facts_subject = gr.Textbox(label="Write a subject for your facts (example: Football facts)", interactive=True, visible=False) + short_type.change(lambda x: gr.update(visible=x == "Custom Facts shorts"), [short_type], [facts_subject]) + tts_engine = gr.Radio([AssetComponentsUtils.ELEVEN_TTS, AssetComponentsUtils.EDGE_TTS, AssetComponentsUtils.COQUI_TTS], label="Text to speech engine", value=AssetComponentsUtils.ELEVEN_TTS, interactive=True) + self.tts_engine = tts_engine.value + with gr.Column(visible=True) as eleven_tts: + language_eleven = gr.Radio([lang.value for lang in ELEVEN_SUPPORTED_LANGUAGES], label="Language", value="English", interactive=True) + voice_eleven = AssetComponentsUtils.voiceChoice(provider=AssetComponentsUtils.ELEVEN_TTS) + with gr.Column(visible=False) as edge_tts: + language_edge = gr.Dropdown([lang.value.upper() for lang in Language], label="Language", value="ENGLISH", interactive=True) + with gr.Column(visible=False) as coqui_tts: + language_coqui = gr.Radio([lang.value for lang in COQUI_SUPPORTED_LANGUAGES], label="Language", value="English", interactive=True) + voice_coqui = AssetComponentsUtils.voiceChoice(provider=AssetComponentsUtils.COQUI_TTS) + + def tts_engine_change(x): + self.tts_engine = x + return gr.update(visible=x == AssetComponentsUtils.ELEVEN_TTS), gr.update(visible=x == AssetComponentsUtils.EDGE_TTS), gr.update(visible=x == AssetComponentsUtils.COQUI_TTS) + tts_engine.change(tts_engine_change, tts_engine, [eleven_tts, edge_tts, coqui_tts]) + + useImages = gr.Checkbox(label="Use images", value=True) + numImages = gr.Radio([5, 10, 25], value=25, label="Number of images per short", visible=True, interactive=True) + useImages.change(lambda x: gr.update(visible=x), useImages, numImages) + + addWatermark = gr.Checkbox(label="Add watermark") + watermark = gr.Textbox(label="Watermark (your channel name)", visible=False) + addWatermark.change(lambda x: gr.update(visible=x), [addWatermark], [watermark]) + + AssetComponentsUtils.background_video_checkbox() + AssetComponentsUtils.background_music_checkbox() + + createButton = gr.Button(label="Create Shorts") + + generation_error = gr.HTML(visible=True) + video_folder = gr.Button("📁", visible=True) + output = gr.HTML() + + video_folder.click(lambda _: AssetComponentsUtils.start_file(os.path.abspath("videos/"))) + + createButton.click(self.inspect_create_inputs, inputs=[AssetComponentsUtils.background_video_checkbox(), AssetComponentsUtils.background_music_checkbox(), watermark, short_type, facts_subject], outputs=[generation_error]).success(self.create_short, inputs=[ + numShorts, + short_type, + tts_engine, + language_eleven, + language_edge, + language_coqui, + numImages, + watermark, + AssetComponentsUtils.background_video_checkbox(), + AssetComponentsUtils.background_music_checkbox(), + facts_subject, + voice_eleven, + voice_coqui + ], outputs=[output, video_folder, generation_error]) + self.short_automation = short_automation + return self.short_automation + + def create_short(self, numShorts, short_type, tts_engine, language_eleven, language_edge, language_coqui, numImages, watermark, background_video_list, background_music_list, facts_subject, voice_eleven, voice_coqui, progress=gr.Progress()): + '''Creates a short''' + try: + numShorts = int(numShorts) + numImages = int(numImages) if numImages else None + background_videos = (background_video_list * ((numShorts // len(background_video_list)) + 1))[:numShorts] + background_musics = (background_music_list * ((numShorts // len(background_music_list)) + 1))[:numShorts] + if tts_engine == AssetComponentsUtils.ELEVEN_TTS: + language = Language(language_eleven.lower().capitalize()) + voice_module = ElevenLabsVoiceModule(ApiKeyManager.get_api_key('ELEVEN LABS'), voice_eleven, checkElevenCredits=True) + elif tts_engine == AssetComponentsUtils.EDGE_TTS: + language = Language(language_edge.lower().capitalize()) + voice_module = EdgeTTSVoiceModule(EDGE_TTS_VOICENAME_MAPPING[language]['male']) + elif tts_engine == AssetComponentsUtils.COQUI_TTS: + language = Language(language_coqui.lower().capitalize()) + voice_module = CoquiVoiceModule(voice_coqui, LANGUAGE_ACRONYM_MAPPING[language]) + for i in range(numShorts): + shortEngine = self.create_short_engine(short_type=short_type, voice_module=voice_module, language=language, numImages=numImages, watermark=watermark, + background_video=background_videos[i], background_music=background_musics[i], facts_subject=facts_subject) + num_steps = shortEngine.get_total_steps() + + def logger(prog_str): + progress(self.progress_counter / (num_steps * numShorts), f"Making short {i+1}/{numShorts} - {prog_str}") + shortEngine.set_logger(logger) + + for step_num, step_info in shortEngine.makeContent(): + progress(self.progress_counter / (num_steps * numShorts), f"Making short {i+1}/{numShorts} - {step_info}") + self.progress_counter += 1 + + video_path = shortEngine.get_video_output_path() + current_url = self.shortGptUI.share_url+"/" if self.shortGptUI.share else self.shortGptUI.local_url + file_url_path = f"{current_url}file={video_path}" + file_name = video_path.split("/")[-1].split("\\")[-1] + self.embedHTML += f''' +
+ + + + +
''' + yield self.embedHTML + '
', gr.Button.update(visible=True), gr.update(visible=False) + except Exception as e: + traceback_str = ''.join(traceback.format_tb(e.__traceback__)) + error_name = type(e).__name__.capitalize() + " : " + f"{e.args[0]}" + print("Error", traceback_str) + error_html = GradioComponentsHTML.get_html_error_template().format(error_message=error_name, stack_trace=traceback_str) + yield self.embedHTML + '', gr.Button.update(visible=True), gr.HTML.update(value=error_html, visible=True) + + def inspect_create_inputs(self, background_video_list, background_music_list, watermark, short_type, facts_subject): + if short_type == "Custom Facts shorts": + if not facts_subject: + raise gr.Error("Please write down your facts short's subject") + if not background_video_list: + raise gr.Error("Please select at least one background video.") + + if not background_music_list: + raise gr.Error("Please select at least one background music.") + + if watermark != "": + if not watermark.replace(" ", "").isalnum(): + raise gr.Error("Watermark should only contain letters and numbers.") + if len(watermark) > 25: + raise gr.Error("Watermark should not exceed 25 characters.") + if len(watermark) < 3: + raise gr.Error("Watermark should be at least 3 characters long.") + + openai_key = ApiKeyManager.get_api_key("OPENAI") + if not openai_key: + raise gr.Error("OPENAI API key is missing. Please go to the config tab and enter the API key.") + eleven_labs_key = ApiKeyManager.get_api_key("ELEVEN LABS") + if self.tts_engine == AssetComponentsUtils.ELEVEN_TTS and not eleven_labs_key: + raise gr.Error("ELEVEN LABS API key is missing. Please go to the config tab and enter the API key.") + return gr.update(visible=False) + + def create_short_engine(self, short_type, voice_module, language, numImages, watermark, background_video, background_music, facts_subject): + if short_type == "Reddit Story shorts": + return RedditShortEngine(voice_module, background_video_name=background_video, background_music_name=background_music, num_images=numImages, watermark=watermark, language=language) + if "fact" in short_type.lower(): + if "custom" in short_type.lower(): + facts_subject = facts_subject + else: + facts_subject = short_type + return FactsShortEngine(voice_module, facts_type=facts_subject, background_video_name=background_video, background_music_name=background_music, num_images=50, watermark=watermark, language=language) + raise gr.Error(f"Short type does not have a valid short engine: {short_type}") diff --git a/gui/ui_tab_video_automation.py b/gui/ui_tab_video_automation.py new file mode 100644 index 0000000000000000000000000000000000000000..83b4146cc896e9e3eea44c337256f0294ada48d3 --- /dev/null +++ b/gui/ui_tab_video_automation.py @@ -0,0 +1,212 @@ +import os +import traceback +from enum import Enum + +import gradio as gr + +from gui.asset_components import AssetComponentsUtils +from gui.ui_abstract_component import AbstractComponentUI +from gui.ui_components_html import GradioComponentsHTML +from shortGPT.audio.edge_voice_module import EdgeTTSVoiceModule +from shortGPT.audio.eleven_voice_module import ElevenLabsVoiceModule +from shortGPT.audio.coqui_voice_module import CoquiVoiceModule +from shortGPT.config.api_db import ApiKeyManager +from shortGPT.config.languages import (EDGE_TTS_VOICENAME_MAPPING, + ELEVEN_SUPPORTED_LANGUAGES, + COQUI_SUPPORTED_LANGUAGES, + LANGUAGE_ACRONYM_MAPPING, + Language) +from shortGPT.engine.content_video_engine import ContentVideoEngine +from shortGPT.gpt import gpt_chat_video + + +class Chatstate(Enum): + ASK_ORIENTATION = 1 + ASK_VOICE_MODULE = 2 + ASK_LANGUAGE = 3 + ASK_DESCRIPTION = 4 + GENERATE_SCRIPT = 5 + ASK_SATISFACTION = 6 + MAKE_VIDEO = 7 + ASK_CORRECTION = 8 + + +class VideoAutomationUI(AbstractComponentUI): + def __init__(self, shortGptUI: gr.Blocks): + self.shortGptUI = shortGptUI + self.state = Chatstate.ASK_ORIENTATION + self.isVertical = None + self.voice_module = None + self.language = None + self.script = "" + self.video_html = "" + self.videoVisible = False + self.video_automation = None + self.chatbot = None + self.msg = None + self.restart_button = None + self.video_folder = None + self.errorHTML = None + self.outHTML = None + + def is_key_missing(self): + openai_key = ApiKeyManager.get_api_key("OPENAI") + if not openai_key: + return "Your OpenAI key is missing. Please go to the config tab and enter the API key." + + pexels_api_key = ApiKeyManager.get_api_key("PEXELS") + if not pexels_api_key: + return "Your Pexels API key is missing. Please go to the config tab and enter the API key." + + def generate_script(self, message, language): + return gpt_chat_video.generateScript(message, language) + + def correct_script(self, script, correction): + return gpt_chat_video.correctScript(script, correction) + + def make_video(self, script, voice_module, isVertical, progress): + videoEngine = ContentVideoEngine(voiceModule=voice_module, script=script, isVerticalFormat=isVertical) + num_steps = videoEngine.get_total_steps() + progress_counter = 0 + + def logger(prog_str): + progress(progress_counter / (num_steps), f"Creating video - {progress_counter} - {prog_str}") + videoEngine.set_logger(logger) + for step_num, step_info in videoEngine.makeContent(): + progress(progress_counter / (num_steps), f"Creating video - {step_info}") + progress_counter += 1 + + video_path = videoEngine.get_video_output_path() + return video_path + + def reset_components(self): + return gr.Chatbot.update(value=self.initialize_conversation()), gr.update(visible=True), gr.HTML.update(value="", visible=False), gr.HTML.update(value="", visible=False) + + def chatbot_conversation(self): + def respond(message, chat_history, progress=gr.Progress()): + # global self.state, isVertical, voice_module, language, script, videoVisible, video_html + error_html = "" + errorVisible = False + inputVisible = True + folderVisible = False + if self.state == Chatstate.ASK_ORIENTATION: + errorMessage = self.is_key_missing() + if errorMessage: + bot_message = errorMessage + else: + self.isVertical = "vertical" in message.lower() or "short" in message.lower() + self.state = Chatstate.ASK_VOICE_MODULE + bot_message = "Which voice module do you want to use? Please type 'ElevenLabs' for high quality, 'EdgeTTS' for free but medium quality voice or 'CoquiTTS' for free and good quality voice but requires a powerful GPU." + elif self.state == Chatstate.ASK_VOICE_MODULE: + if "elevenlabs" in message.lower(): + eleven_labs_key = ApiKeyManager.get_api_key("ELEVEN LABS") + if not eleven_labs_key: + bot_message = "Your Eleven Labs API key is missing. Please go to the config tab and enter the API key." + return + self.voice_module = ElevenLabsVoiceModule + language_choices = [lang.value for lang in ELEVEN_SUPPORTED_LANGUAGES] + elif "edgetts" in message.lower(): + self.voice_module = EdgeTTSVoiceModule + language_choices = [lang.value for lang in Language] + elif "coquitts" in message.lower(): + self.voice_module = CoquiVoiceModule + language_choices = [lang.value for lang in COQUI_SUPPORTED_LANGUAGES] + else: + bot_message = "Invalid voice module. Please type 'ElevenLabs' or 'EdgeTTS'." + return + self.state = Chatstate.ASK_LANGUAGE + bot_message = f"🌐What language will be used in the video?🌐 Choose from one of these ({', '.join(language_choices)})" + elif self.state == Chatstate.ASK_LANGUAGE: + self.language = next((lang for lang in Language if lang.value.lower() in message.lower()), None) + self.language = self.language if self.language else Language.ENGLISH + if self.voice_module == ElevenLabsVoiceModule: + self.voice_module = ElevenLabsVoiceModule(ApiKeyManager.get_api_key('ELEVEN LABS'), "Antoni", checkElevenCredits=True) + elif self.voice_module == EdgeTTSVoiceModule: + self.voice_module = EdgeTTSVoiceModule(EDGE_TTS_VOICENAME_MAPPING[self.language]['male']) + elif self.voice_module == CoquiVoiceModule: + self.voice_module = CoquiVoiceModule("Ana Florence", LANGUAGE_ACRONYM_MAPPING[self.language]) + self.state = Chatstate.ASK_DESCRIPTION + bot_message = "Amazing 🔥 ! 📝Can you describe thoroughly the subject of your video?📝 I will next generate you a script based on that description" + elif self.state == Chatstate.ASK_DESCRIPTION: + self.script = self.generate_script(message, self.language.value) + self.state = Chatstate.ASK_SATISFACTION + bot_message = f"📝 Here is your generated script: \n\n--------------\n{self.script}\n\n・Are you satisfied with the script and ready to proceed with creating the video? Please respond with 'YES' or 'NO'. 👍👎" + elif self.state == Chatstate.ASK_SATISFACTION: + if "yes" in message.lower(): + self.state = Chatstate.MAKE_VIDEO + inputVisible = False + yield gr.update(visible=False), gr.Chatbot.update(value=[[None, "Your video is being made now! 🎬"]]), gr.HTML.update(value="", visible=False), gr.HTML.update(value=error_html, visible=errorVisible), gr.update(visible=folderVisible), gr.update(visible=False) + try: + video_path = self.make_video(self.script, self.voice_module, self.isVertical, progress=progress) + file_name = video_path.split("/")[-1].split("\\")[-1] + current_url = self.shortGptUI.share_url+"/" if self.shortGptUI.share else self.shortGptUI.local_url + file_url_path = f"{current_url}file={video_path}" + self.video_html = f''' +
+ + + + +
''' + self.videoVisible = True + folderVisible = True + bot_message = "Your video is completed !🎬. Scroll down below to open its file location." + except Exception as e: + traceback_str = ''.join(traceback.format_tb(e.__traceback__)) + error_name = type(e).__name__.capitalize() + " : " + f"{e.args[0]}" + errorVisible = True + gradio_content_automation_ui_error_template = GradioComponentsHTML.get_html_error_template() + error_html = gradio_content_automation_ui_error_template.format(error_message=error_name, stack_trace=traceback_str) + bot_message = "We encountered an error while making this video ❌" + print("Error", traceback_str) + yield gr.update(visible=False), gr.Chatbot.update(value=[[None, "Your video is being made now! 🎬"]]), gr.HTML.update(value="", visible=False), + gr.HTML.update(value=error_html, visible=errorVisible), gr.update(visible=folderVisible), gr.update(visible=True) + + else: + self.state = Chatstate.ASK_CORRECTION # change self.state to ASK_CORRECTION + bot_message = "Explain me what you want different in the script" + elif self.state == Chatstate.ASK_CORRECTION: # new self.state + self.script = self.correct_script(self.script, message) # call generateScript with correct=True + self.state = Chatstate.ASK_SATISFACTION + bot_message = f"📝 Here is your corrected script: \n\n--------------\n{self.script}\n\n・Are you satisfied with the script and ready to proceed with creating the video? Please respond with 'YES' or 'NO'. 👍👎" + chat_history.append((message, bot_message)) + yield gr.update(value="", visible=inputVisible), gr.Chatbot.update(value=chat_history), gr.HTML.update(value=self.video_html, visible=self.videoVisible), gr.HTML.update(value=error_html, visible=errorVisible), gr.update(visible=folderVisible), gr.update(visible=True) + + return respond + + def initialize_conversation(self): + self.state = Chatstate.ASK_ORIENTATION + self.isVertical = None + self.language = None + self.script = "" + self.video_html = "" + self.videoVisible = False + return [[None, "🤖 Welcome to ShortGPT! 🚀 I'm a python framework aiming to simplify and automate your video editing tasks.\nLet's get started! 🎥🎬\n\n Do you want your video to be in landscape or vertical format? (landscape OR vertical)"]] + + def reset_conversation(self): + self.state = Chatstate.ASK_ORIENTATION + self.isVertical = None + self.language = None + self.script = "" + self.video_html = "" + self.videoVisible = False + + def create_ui(self): + with gr.Row(visible=False) as self.video_automation: + with gr.Column(): + self.chatbot = gr.Chatbot(self.initialize_conversation, height=365) + self.msg = gr.Textbox() + self.restart_button = gr.Button("Restart") + self.video_folder = gr.Button("📁", visible=False) + self.video_folder.click(lambda _: AssetComponentsUtils.start_file(os.path.abspath("videos/"))) + respond = self.chatbot_conversation() + + self.errorHTML = gr.HTML(visible=False) + self.outHTML = gr.HTML(visible=False) + self.restart_button.click(self.reset_components, [], [self.chatbot, self.msg, self.errorHTML, self.outHTML]) + self.restart_button.click(self.reset_conversation, []) + self.msg.submit(respond, [self.msg, self.chatbot], [self.msg, self.chatbot, self.outHTML, self.errorHTML, self.video_folder, self.restart_button]) + return self.video_automation diff --git a/gui/ui_tab_video_translation.py b/gui/ui_tab_video_translation.py new file mode 100644 index 0000000000000000000000000000000000000000..407e7103956a5280313fbf5e26e9e1067029ce28 --- /dev/null +++ b/gui/ui_tab_video_translation.py @@ -0,0 +1,141 @@ +import os +import time +import traceback + +import gradio as gr + +from gui.asset_components import AssetComponentsUtils +from gui.ui_abstract_component import AbstractComponentUI +from gui.ui_components_html import GradioComponentsHTML +from shortGPT.audio.edge_voice_module import EdgeTTSVoiceModule +from shortGPT.audio.eleven_voice_module import ElevenLabsVoiceModule +from shortGPT.audio.coqui_voice_module import CoquiVoiceModule +from shortGPT.config.api_db import ApiKeyManager +from shortGPT.config.languages import (EDGE_TTS_VOICENAME_MAPPING, + ELEVEN_SUPPORTED_LANGUAGES, + COQUI_SUPPORTED_LANGUAGES, + LANGUAGE_ACRONYM_MAPPING, + Language) +from shortGPT.engine.multi_language_translation_engine import MultiLanguageTranslationEngine + + +class VideoTranslationUI(AbstractComponentUI): + def __init__(self, shortGptUI: gr.Blocks): + self.shortGptUI = shortGptUI + self.eleven_language_choices = [lang.value.upper() for lang in ELEVEN_SUPPORTED_LANGUAGES] + self.coqui_language_choices = [lang.value.upper() for lang in COQUI_SUPPORTED_LANGUAGES] + self.embedHTML = '
' + self.progress_counter = 0 + self.video_translation_ui = None + + def create_ui(self): + with gr.Row(visible=False) as video_translation_ui: + with gr.Column(): + videoType = gr.Radio(["Youtube link", "Video file"], label="Input your video", value="Youtube link", interactive=True) + video_path = gr.Video(source="upload", interactive=True, width=533.33, height=300, visible=False) + yt_link = gr.Textbox(label="Youtube link (https://youtube.com/xyz): ", interactive=True, visible=False) + videoType.change(lambda x: (gr.update(visible=x == "Video file"), gr.update(visible=x == "Youtube link")), [videoType], [video_path, yt_link]) + tts_engine = gr.Radio([AssetComponentsUtils.ELEVEN_TTS, AssetComponentsUtils.EDGE_TTS, AssetComponentsUtils.COQUI_TTS], label="Text to speech engine", value=AssetComponentsUtils.ELEVEN_TTS, interactive=True) + + with gr.Column(visible=True) as eleven_tts: + language_eleven = gr.CheckboxGroup(self.eleven_language_choices, label="Language", value="ENGLISH", interactive=True) + voice_eleven = AssetComponentsUtils.voiceChoiceTranslation(provider=AssetComponentsUtils.ELEVEN_TTS) + with gr.Column(visible=False) as edge_tts: + language_edge = gr.CheckboxGroup([lang.value.upper() for lang in Language], label="Language", value="ENGLISH", interactive=True) + with gr.Column(visible=False) as coqui_tts: + language_coqui = gr.CheckboxGroup(self.coqui_language_choices, label="Language", value="ENGLISH", interactive=True) + voice_coqui = AssetComponentsUtils.voiceChoiceTranslation(provider=AssetComponentsUtils.COQUI_TTS) + tts_engine.change(lambda x: (gr.update(visible=x == AssetComponentsUtils.ELEVEN_TTS), gr.update(visible=x == AssetComponentsUtils.EDGE_TTS), gr.update(visible=x == AssetComponentsUtils.COQUI_TTS)), [tts_engine], [eleven_tts, edge_tts, coqui_tts]) + + useCaptions = gr.Checkbox(label="Caption video", value=False) + + translateButton = gr.Button(label="Create Shorts") + + generation_error = gr.HTML(visible=False) + video_folder = gr.Button("📁", visible=True) + output = gr.HTML() + + video_folder.click(lambda _: AssetComponentsUtils.start_file(os.path.abspath("videos/"))) + translateButton.click(self.inspect_create_inputs, inputs=[videoType, video_path, yt_link, tts_engine, language_eleven, language_edge, ], outputs=[generation_error]).success(self.translate_video, inputs=[ + videoType, yt_link, video_path, tts_engine, language_eleven, language_edge, language_coqui, useCaptions, voice_eleven, voice_coqui + ], outputs=[output, video_folder, generation_error]) + self.video_translation_ui = video_translation_ui + return self.video_translation_ui + + def translate_video(self, videoType, yt_link, video_path, tts_engine, language_eleven, language_edge, language_coqui, use_captions: bool, voice_eleven: str,voice_coqui:str, progress=gr.Progress()) -> str: + if tts_engine == AssetComponentsUtils.ELEVEN_TTS: + languages = [Language(lang.lower().capitalize()) for lang in language_eleven] + elif tts_engine == AssetComponentsUtils.EDGE_TTS: + languages = [Language(lang.lower().capitalize()) for lang in language_edge] + elif tts_engine == AssetComponentsUtils.COQUI_TTS: + languages = [Language(lang.lower().capitalize()) for lang in language_coqui] + try: + for i, language in enumerate(languages): + if tts_engine == AssetComponentsUtils.EDGE_TTS: + voice_module = EdgeTTSVoiceModule(EDGE_TTS_VOICENAME_MAPPING[language]['male']) + if tts_engine == AssetComponentsUtils.ELEVEN_TTS: + voice_module = ElevenLabsVoiceModule(ApiKeyManager.get_api_key('ELEVEN LABS'), voice_eleven, checkElevenCredits=True) + if tts_engine == AssetComponentsUtils.COQUI_TTS: + voice_module = CoquiVoiceModule(voice_coqui, LANGUAGE_ACRONYM_MAPPING[language]) + content_translation_engine = MultiLanguageTranslationEngine(voiceModule=voice_module, src_url=yt_link if videoType == "Youtube link" else video_path, target_language=language, use_captions=use_captions) + num_steps = content_translation_engine.get_total_steps() + def logger(prog_str): + progress(self.progress_counter / (num_steps), f"Translating your video ({i+1}/{len(languages)}) - {prog_str}") + content_translation_engine.set_logger(logger) + + for step_num, step_info in content_translation_engine.makeContent(): + progress(self.progress_counter / (num_steps), f"Translating your video ({i+1}/{len(languages)}) - {step_info}") + self.progress_counter += 1 + + video_path = content_translation_engine.get_video_output_path() + current_url = self.shortGptUI.share_url+"/" if self.shortGptUI.share else self.shortGptUI.local_url + file_url_path = f"{current_url}file={video_path}" + file_name = video_path.split("/")[-1].split("\\")[-1] + self.embedHTML += f''' +
+ + + + +
''' + yield "
"+self.embedHTML + '
', gr.Button.update(visible=True), gr.update(visible=False) + + except Exception as e: + traceback_str = ''.join(traceback.format_tb(e.__traceback__)) + error_name = type(e).__name__.capitalize() + " : " + f"{e.args[0]}" + print("Error", traceback_str) + error_html = GradioComponentsHTML.get_html_error_template().format(error_message=error_name, stack_trace=traceback_str) + return self.embedHTML + '
', gr.Button.update(visible=True), gr.update(value=error_html, visible=True) + + def inspect_create_inputs(self, videoType, video_path, yt_link, tts_engine, language_eleven, language_edge,): + supported_extensions = ['.mp4', '.avi', '.mov'] # Add more supported video extensions if needed + print(videoType, video_path, yt_link) + if videoType == "Youtube link": + if not yt_link.startswith("https://youtube.com/") and not yt_link.startswith("https://www.youtube.com/"): + raise gr.Error('Invalid YouTube URL. Please provide a valid URL. Link example: https://www.youtube.com/watch?v=dQw4w9WgXcQ') + else: + if not video_path or not os.path.exists(video_path): + raise gr.Error('You must drag and drop a valid video file.') + + file_ext = os.path.splitext(video_path)[-1].lower() + if file_ext not in supported_extensions: + raise gr.Error('Invalid video file. Supported video file extensions are: {}'.format(', '.join(supported_extensions))) + if tts_engine == AssetComponentsUtils.ELEVEN_TTS: + if not len(language_eleven) >0: + raise gr.Error('You must select one or more target languages') + if tts_engine == AssetComponentsUtils.EDGE_TTS: + if not len(language_edge) >0: + raise gr.Error('You must select one or more target languages') + return gr.update(visible=False) + + +def update_progress(progress, progress_counter, num_steps, num_shorts, stop_event): + start_time = time.time() + while not stop_event.is_set(): + elapsed_time = time.time() - start_time + dynamic = int(3649 * elapsed_time / 600) + progress(progress_counter / (num_steps * num_shorts), f"Rendering progress - {dynamic}/3649") + time.sleep(0.1) # update every 0.1 second diff --git a/installation-notes.md b/installation-notes.md new file mode 100644 index 0000000000000000000000000000000000000000..dd56d58a6f6c42b765034ad948e15a0df5248bd8 --- /dev/null +++ b/installation-notes.md @@ -0,0 +1,189 @@ +** Thanks for Son Tran for the fixes on the installation guide. Here are the recommanded steps for installing ShortGPT: + + +### You now need Docker to now run ShortGPT. If you can't run it with docker, please use the Google Colab. +# To run ShortGPT docker: + + +First make a .env file with the API keys like this: + +```bash +OPENAI_API_KEY=sk-_put_your_openai_api_key_here +ELEVENLABS_API_KEY=put_your_eleven_labs_api_key_here +PEXELS_API_KEY=put_your_pexels_api_key_here +``` + + +To run Dockerfile do this: +```bash +docker build -t short_gpt_docker:latest . +docker run -p 31415:31415 --env-file .env short_gpt_docker:latest +``` +Export Docker image: +```bash +docker save short_gpt_docker > short_gpt_docker.tar +``` + + + + + +### Here are the steps to install it from scratch on Linux, Debian 11 x64: + +In short, you need to use: +- Python 3.11.3 +- openai package 0.28.0, then upgrade openai-whisper +- ffmpeg 4.2.3 +- ImageMagick 7.1.1 + +### 1. OS: Debian 11 x64 +```bash +sudo apt update && sudo apt upgrade +sudo apt install wget git libltdl-dev libjpeg-dev libpng-dev libtiff-dev libgif-dev libfreetype6-dev liblcms2-dev libxml2-dev wget build-essential libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev zlib1g-dev +``` + +### 2. Install Python version: 3.11.3 +```bash +wget https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tgz +tar xzf Python-3.11.3.tgz +cd Python-3.11.3 +./configure --enable-optimizations +make install +``` + +To check the Python version, use this command: +```bash +python3.11 -V +``` +To use pip, use this command: +```bash +pip3.11 install +``` + +### 3. Install ffmpeg version: 4.2.3 +ShortGPT will accept this version of FFmpeg: + +3.1. Install Build Dependencies: + +```bash +sudo apt update +sudo apt build-dep ffmpeg +``` + +3.2. Clone FFmpeg Source Code: + +```bash +git clone https://git.ffmpeg.org/ffmpeg.git +cd ffmpeg +git checkout n4.2.3 +``` + +3.3. Configure FFmpeg Build: + +```bash +./configure --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-avisynth --enable-libopenmpt --enable-shared --disable-static +``` + +This step checks for the necessary dependencies and configures the build based on your system. + +3.4. Build FFmpeg: + +```bash +make -j$(nproc) +``` + +This step may take some time as it compiles the FFmpeg source code. + +3.5. Install FFmpeg: + +```bash +sudo make install +``` + +3.6. Verify Installation: + +```bash +ffmpeg -version +``` + +This should display the version information, and you should see version 4.2.3. + +Optional: Update Library Cache: + +```bash +sudo ldconfig +``` + +This updates the dynamic linker run-time bindings. + +That's it! You should now have FFmpeg version 4.2.3 installed on your Debian 11 system. + +If you are still facing with "libavdevice.so.58" error when running ffmpeg, run this command to fix it, remember to change the path: +```bash +echo 'export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib64/:/usr/local/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH' >> ~/.bashrc +source ~/.bashrc +``` + +### 4. Install ImageMagick 7.1.1: +4.1. Clone ImageMagick: +```bash +sudo git clone https://github.com/ImageMagick/ImageMagick.git +``` +4.2. Go to the ImageMagick folder and run configuration: +```bash +cd ImageMagick +./configure +``` +4.3. Make: +```bash +sudo make +``` +4.4. Install complied code: +```bash +sudo make install +``` +4.5. Update path: +```bash +sudo ldconfig /usr/local/lib +``` +4.6. (Optional) Check version +```bash +$ magick -version +``` +4.7. Fix Imagemagick policy.xml bug on Linux using MoviePy +```bash +!sed -i '/= 1920 and video['height'] >= 1080 and video['width']/video['height'] == 16/9] + else: + filtered_videos = [video for video in videos if video['width'] >= 1080 and video['height'] >= 1920 and video['height']/video['width'] == 16/9] + + # Sort the filtered videos by duration in ascending order + sorted_videos = sorted(filtered_videos, key=lambda x: abs(15-int(x['duration']))) + + # Extract the top 3 videos' URLs + for video in sorted_videos: + for video_file in video['video_files']: + if orientation_landscape: + if video_file['width'] == 1920 and video_file['height'] == 1080: + if not (video_file['link'].split('.hd')[0] in used_vids): + return video_file['link'] + else: + if video_file['width'] == 1080 and video_file['height'] == 1920: + if not (video_file['link'].split('.hd')[0] in used_vids): + return video_file['link'] + print("NO LINKS found for this round of search with query :", query_string) + return None diff --git a/shortGPT/api_utils/youtube_api.py b/shortGPT/api_utils/youtube_api.py new file mode 100644 index 0000000000000000000000000000000000000000..5d2e2173bf221f70d724c394f767a8423d50d01a --- /dev/null +++ b/shortGPT/api_utils/youtube_api.py @@ -0,0 +1,27 @@ +from time import sleep +from time import sleep +from yt_dlp import YoutubeDL + + +def search_videos_YouTube(query_string): # or query? + ydl_opts = { + 'default_search': 'ytsearch', + 'format': 'bestvideo[height=1920][height=1080]+bestaudio/best', # Optional: Specify desired video format + 'max_downloads': 1, + 'no_playlist' : True, + 'ignoreerrors': True, + #'width': 1920, + #'height': 1080, + #'start_time': 10, + #'duration': 100, + 'min_views': 2000 + } + + with YoutubeDL(ydl_opts) as ydl: + try: + search_results = ydl.extract_info(query_string, download=False) + video_url = search_results['entries'][0]['webpage_url'] + print(video_url, ", we can proceed") + return video_url + except: + return None diff --git a/shortGPT/audio/README.md b/shortGPT/audio/README.md new file mode 100644 index 0000000000000000000000000000000000000000..1ec9e350c9ff54d06043296ebb1c30ea0878a5dd --- /dev/null +++ b/shortGPT/audio/README.md @@ -0,0 +1,76 @@ +# Audio Module + +The audio module provides a set of functions and classes for working with audio files and performing various operations on them. + +## audio_utils.py + +This file contains utility functions for audio processing. + +### downloadYoutubeAudio(url, outputFile) +Downloads audio from a YouTube video given its URL and saves it to the specified output file. Returns the path to the downloaded audio file and its duration. + +### speedUpAudio(tempAudioPath, outputFile, expected_chars_per_sec=CONST_CHARS_PER_SEC) +Speeds up the audio to make it under 60 seconds. If the duration of the audio is greater than 57 seconds, it will be sped up to fit within the time limit. Otherwise, the audio will be left unchanged. Returns the path to the sped up audio file. + +### ChunkForAudio(alltext, chunk_size=2500) +Splits a text into chunks of a specified size (default is 2500 characters) to be used for audio generation. Returns a list of text chunks. + +### audioToText(filename, model_size="tiny") +Converts an audio file to text using a pre-trained model. Returns a generator object that yields the transcribed text and its corresponding timestamps. + +### getWordsPerSec(filename) +Calculates the average number of words per second in an audio file. Returns the words per second value. + +### getCharactersPerSec(filename) +Calculates the average number of characters per second in an audio file. Returns the characters per second value. + +## audio_duration.py + +This file contains functions for getting the duration of audio files. + +### get_duration_yt_dlp(url) +Gets the duration of a YouTube video or audio using the yt_dlp library. Returns the duration in seconds. + +### get_duration_ffprobe(signed_url) +Gets the duration of an audio or video file using the ffprobe command line tool. Returns the duration in seconds. + +### getAssetDuration(url, isVideo=True) +Gets the duration of an audio or video asset from various sources, including YouTube and cloud storage providers. Returns the URL of the asset and its duration in seconds. + +### getYoutubeAudioLink(url) +Gets the audio link of a YouTube video given its URL. Returns the audio URL and its duration in seconds. + +### getYoutubeVideoLink(url) +Gets the video link of a YouTube video given its URL. Returns the video URL and its duration in seconds. + +## voice_module.py + +This file contains an abstract base class for voice modules. + +### VoiceModule +An abstract base class that defines the interface for voice modules. Voice modules are responsible for generating voice recordings from text. + +#### update_usage() +Updates the usage statistics of the voice module. + +#### get_remaining_characters() +Gets the number of remaining characters that can be generated using the voice module. + +#### generate_voice(text, outputfile) +Generates a voice recording from the specified text and saves it to the specified output file. + +## eleven_voice_module.py + +This file contains a voice module implementation for the ElevenLabs API. + +### ElevenLabsVoiceModule +A voice module implementation for the ElevenLabs API. Requires an API key and a voice name to be initialized. + +#### update_usage() +Updates the usage statistics of the ElevenLabs API. + +#### get_remaining_characters() +Gets the number of remaining characters that can be generated using the ElevenLabs API. + +#### generate_voice(text, outputfile) +Generates a voice recording from the specified text using the ElevenLabs API and saves it to the specified output file. Raises an exception if the API key does not have enough credits to generate the text. \ No newline at end of file diff --git a/shortGPT/audio/__init__.py b/shortGPT/audio/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..07db66d2908d71e68c203ac7afc8d6cf63147f0d --- /dev/null +++ b/shortGPT/audio/__init__.py @@ -0,0 +1,4 @@ +from . import audio_utils +from . import eleven_voice_module +from . import audio_duration +from . import coqui_voice_module \ No newline at end of file diff --git a/shortGPT/audio/audio_duration.py b/shortGPT/audio/audio_duration.py new file mode 100644 index 0000000000000000000000000000000000000000..f72a77b5933cbd004e588d66d08e7ec9c4368f66 --- /dev/null +++ b/shortGPT/audio/audio_duration.py @@ -0,0 +1,87 @@ +import json +import subprocess + +import yt_dlp + +from shortGPT.editing_utils.handle_videos import getYoutubeVideoLink + + +def get_duration_yt_dlp(url): + ydl_opts = { + "quiet": True, + "no_warnings": True, + "no_color": True, + "no_call_home": True, + "no_check_certificate": True + } + try: + with yt_dlp.YoutubeDL(ydl_opts) as ydl: + dictMeta = ydl.extract_info(url, download=False, ) + return dictMeta['duration'], "" + except Exception as e: + return None, f"Failed getting duration from the following video/audio url/path using yt_dlp. {e.args[0]}" + + +def get_duration_ffprobe(signed_url): + try: + cmd = [ + "ffprobe", + "-v", + "quiet", + "-print_format", + "json", + "-show_format", + "-i", + signed_url + ] + output = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) + + if output.returncode != 0: + return None, f"Error executing command using ffprobe. {output.stderr.strip()}" + + metadata = json.loads(output.stdout) + duration = float(metadata["format"]["duration"]) + return duration, "" + except Exception as e: + print("Failed getting the duration of the asked ressource", e.args[0]) + return None, "" + + +def get_asset_duration(url, isVideo=True): + if ("youtube.com" in url): + if not isVideo: + url, _ = getYoutubeAudioLink(url) + else: + url, _ = getYoutubeVideoLink(url) + # Trying two different method to get the duration of the video / audio + duration, err_ffprobe = get_duration_ffprobe(url) + if duration is not None: + return url, duration + + duration, err_yt_dlp = get_duration_yt_dlp(url) + if duration is not None: + return url, duration + print(err_yt_dlp) + print(err_ffprobe) + print(f"The url/path {url} does not point to a video/ audio. Impossible to extract its duration") + return url, None + + +def getYoutubeAudioLink(url): + ydl_opts = { + "quiet": True, + "no_warnings": True, + "no_color": True, + "no_call_home": True, + "no_check_certificate": True, + "format": "bestaudio/best" + } + try: + with yt_dlp.YoutubeDL(ydl_opts) as ydl: + dictMeta = ydl.extract_info( + url, + download=False) + return dictMeta['url'], dictMeta['duration'] + except Exception as e: + print("Failed getting audio link from the following video/url", e.args[0]) + return None diff --git a/shortGPT/audio/audio_utils.py b/shortGPT/audio/audio_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..73b3e549a814bf57bdbd36abe1db0755dc6e365c --- /dev/null +++ b/shortGPT/audio/audio_utils.py @@ -0,0 +1,98 @@ +import os +import subprocess + +import yt_dlp + +from shortGPT.audio.audio_duration import get_asset_duration + +CONST_CHARS_PER_SEC = 20.5 # Arrived to this result after whispering a ton of shorts and calculating the average number of characters per second of speech. + +WHISPER_MODEL = None + + +def downloadYoutubeAudio(url, outputFile): + ydl_opts = { + "quiet": True, + "no_warnings": True, + "no_color": True, + "no_call_home": True, + "no_check_certificate": True, + "format": "bestaudio/best", + "outtmpl": outputFile + } + try: + with yt_dlp.YoutubeDL(ydl_opts) as ydl: + dictMeta = ydl.extract_info( + url, + download=True) + if (not os.path.exists(outputFile)): + raise Exception("Audio Download Failed") + return outputFile, dictMeta['duration'] + except Exception as e: + print("Failed downloading audio from the following video/url", e.args[0]) + return None + + +def speedUpAudio(tempAudioPath, outputFile, expected_duration=None): # Speeding up the audio to make it under 60secs, otherwise the output video is not considered as a short. + tempAudioPath, duration = get_asset_duration(tempAudioPath, False) + if not expected_duration: + if (duration > 57): + subprocess.run(['ffmpeg', '-i', tempAudioPath, '-af', f'atempo={(duration/57):.5f}', outputFile]) + else: + subprocess.run(['ffmpeg', '-i', tempAudioPath, outputFile]) + else: + subprocess.run(['ffmpeg', '-i', tempAudioPath, '-af', f'atempo={(duration/expected_duration):.5f}', outputFile]) + if (os.path.exists(outputFile)): + return outputFile + + +def ChunkForAudio(alltext, chunk_size=2500): + alltext_list = alltext.split('.') + chunks = [] + curr_chunk = '' + for text in alltext_list: + if len(curr_chunk) + len(text) <= chunk_size: + curr_chunk += text + '.' + else: + chunks.append(curr_chunk) + curr_chunk = text + '.' + if curr_chunk: + chunks.append(curr_chunk) + return chunks + + +def audioToText(filename, model_size="base"): + from whisper_timestamped import load_model, transcribe_timestamped + global WHISPER_MODEL + if (WHISPER_MODEL == None): + WHISPER_MODEL = load_model(model_size) + gen = transcribe_timestamped(WHISPER_MODEL, filename, verbose=False, fp16=False) + return gen + + +def getWordsPerSec(filename): + a = audioToText(filename) + return len(a['text'].split()) / a['segments'][-1]['end'] + + +def getCharactersPerSec(filename): + a = audioToText(filename) + return len(a['text']) / a['segments'][-1]['end'] + +def run_background_audio_split(sound_file_path): + try: + # Run spleeter command + # Get absolute path of sound file + output_dir = os.path.dirname(sound_file_path) + command = f"spleeter separate -p spleeter:2stems -o '{output_dir}' '{sound_file_path}'" + + process = subprocess.run(command, shell=True, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + + # If spleeter runs successfully, return the path to the background music file + if process.returncode == 0: + return os.path.join(output_dir, sound_file_path.split("/")[-1].split(".")[0], "accompaniment.wav") + else: + return None + except Exception: + # If spleeter crashes, return None + return None diff --git a/shortGPT/audio/coqui_voice_module.py b/shortGPT/audio/coqui_voice_module.py new file mode 100644 index 0000000000000000000000000000000000000000..aadccc3ed44b800e2896b6620a2780daab48124b --- /dev/null +++ b/shortGPT/audio/coqui_voice_module.py @@ -0,0 +1,58 @@ +import os +from concurrent.futures import ThreadPoolExecutor + +from TTS.api import TTS + +from shortGPT.audio.voice_module import VoiceModule +from shortGPT.config.languages import ( + EDGE_TTS_VOICENAME_MAPPING, + LANGUAGE_ACRONYM_MAPPING, + Language, +) +from torch.cuda import is_available + + +def run_async_func(loop, func): + return loop.run_until_complete(func) + + +class CoquiVoiceModule(VoiceModule): + def __init__(self, voiceName, language="en"): + self.voiceName = voiceName + self.device = "cuda" if is_available() else "cpu" + self.language = language + os.environ["COQUI_TOS_AGREED"] = "1" + self.tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2") + + super().__init__() + + def update_usage(self): + return None + + def get_remaining_characters(self): + return 999999999999 + + def generate_voice(self, text, outputfile): + try: + self.tts.to(self.device) + self.tts.tts_to_file( + text=text, + file_path=outputfile, + speaker=self.voiceName, + language=self.language, + split_sentences=True, + ) + except Exception as e: + print("Error generating audio using coqui audio", e) + raise Exception( + "An error happened during coqui audio generation, no output audio generated", + e, + ) + if not os.path.exists(outputfile): + print( + "An error happened during coqui audio generation, no output audio generated" + ) + raise Exception( + "An error happened during coqui audio generation, no output audio generated" + ) + return outputfile diff --git a/shortGPT/audio/edge_voice_module.py b/shortGPT/audio/edge_voice_module.py new file mode 100644 index 0000000000000000000000000000000000000000..096517db744d4bf318e27fbfa548b0b3c3c81e01 --- /dev/null +++ b/shortGPT/audio/edge_voice_module.py @@ -0,0 +1,52 @@ +import asyncio +import os +from concurrent.futures import ThreadPoolExecutor + +import edge_tts + +from shortGPT.audio.voice_module import VoiceModule +from shortGPT.config.languages import (EDGE_TTS_VOICENAME_MAPPING, + LANGUAGE_ACRONYM_MAPPING, Language) + + +def run_async_func(loop, func): + return loop.run_until_complete(func) + + +class EdgeTTSVoiceModule(VoiceModule): + def __init__(self, voiceName): + self.voiceName = voiceName + super().__init__() + + def update_usage(self): + return None + + def get_remaining_characters(self): + return 999999999999 + + def generate_voice(self, text, outputfile): + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + + try: + with ThreadPoolExecutor() as executor: + loop.run_in_executor(executor, run_async_func, loop, self.async_generate_voice(text, outputfile)) + + finally: + loop.close() + if not os.path.exists(outputfile): + print("An error happened during edge_tts audio generation, no output audio generated") + raise Exception("An error happened during edge_tts audio generation, no output audio generated") + return outputfile + + async def async_generate_voice(self, text, outputfile): + try: + communicate = edge_tts.Communicate(text, self.voiceName) + with open(outputfile, "wb") as file: + async for chunk in communicate.stream(): + if chunk["type"] == "audio": + file.write(chunk["data"]) + except Exception as e: + print("Error generating audio using edge_tts", e) + raise Exception("An error happened during edge_tts audio generation, no output audio generated", e) + return outputfile diff --git a/shortGPT/audio/eleven_voice_module.py b/shortGPT/audio/eleven_voice_module.py new file mode 100644 index 0000000000000000000000000000000000000000..37219ba03b322861bfc3d4b52b98d57351fcf6e7 --- /dev/null +++ b/shortGPT/audio/eleven_voice_module.py @@ -0,0 +1,29 @@ +from shortGPT.api_utils.eleven_api import ElevenLabsAPI +from shortGPT.audio.voice_module import VoiceModule + + +class ElevenLabsVoiceModule(VoiceModule): + def __init__(self, api_key, voiceName, checkElevenCredits=False): + self.api_key = api_key + self.voiceName = voiceName + self.remaining_credits = None + self.eleven_labs_api = ElevenLabsAPI(self.api_key) + self.update_usage() + if checkElevenCredits and self.get_remaining_characters() < 1200: + raise Exception(f"Your ElevenLabs API KEY doesn't have enough credits ({self.remaining_credits} character remaining). Minimum required: 1200 characters (equivalent to a 45sec short)") + super().__init__() + + def update_usage(self): + self.remaining_credits = self.eleven_labs_api.get_remaining_characters() + return self.remaining_credits + + def get_remaining_characters(self): + return self.remaining_credits if self.remaining_credits else self.eleven_labs_api.get_remaining_characters() + + def generate_voice(self, text, outputfile): + if self.get_remaining_characters() >= len(text): + file_path =self.eleven_labs_api.generate_voice(text=text, character=self.voiceName, filename=outputfile) + self.update_usage() + return file_path + else: + raise Exception(f"You cannot generate {len(text)} characters as your ElevenLabs key has only {self.remaining_credits} characters remaining") diff --git a/shortGPT/audio/voice_module.py b/shortGPT/audio/voice_module.py new file mode 100644 index 0000000000000000000000000000000000000000..9948d7b9bd683519259e7a8ccdde291b10b4601f --- /dev/null +++ b/shortGPT/audio/voice_module.py @@ -0,0 +1,16 @@ +from abc import ABC, abstractmethod +class VoiceModule(ABC): + + def __init__(self): + pass + @abstractmethod + def update_usage(self): + pass + + @abstractmethod + def get_remaining_characters(self): + pass + + @abstractmethod + def generate_voice(self,text, outputfile): + pass \ No newline at end of file diff --git a/shortGPT/config/README.md b/shortGPT/config/README.md new file mode 100644 index 0000000000000000000000000000000000000000..d46130a5b7692821853a69587289edb717255b30 --- /dev/null +++ b/shortGPT/config/README.md @@ -0,0 +1,204 @@ +# Module: config + +The `config` module contains various files and functions related to configuration settings and utilities. + +## File: config.py + +This file contains functions for reading and writing YAML files, as well as loading local assets specified in a YAML configuration file. + +### Functions: + +#### `read_yaml_config(file_path: str) -> dict` + +This function reads and returns the contents of a YAML file as a dictionary. + +Parameters: +- `file_path` - The path to the YAML file to be read. + +Returns: +- A dictionary containing the contents of the YAML file. + +#### `write_yaml_config(file_path: str, data: dict)` + +This function writes a dictionary to a YAML file. + +Parameters: +- `file_path` - The path to the YAML file to be written. +- `data` - The dictionary to be written to the YAML file. + +#### `load_editing_assets() -> dict` + +This function loads all local assets from the static-assets folder specified in the yaml_config. + +Returns: +- A dictionary containing the YAML configuration with updated local assets. + +## File: asset_db.py + +This file contains a class `AssetDatabase` that provides methods for managing a database of assets. + +### Class: AssetDatabase + +This class represents a database of assets and provides methods for adding, removing, and retrieving assets. + +Methods: + +#### `__init__()` + +This method initializes the `AssetDatabase` object. It creates the local and remote asset collections if they don't already exist. + +#### `asset_exists(name)` + +This method checks if an asset with the given name exists in the database. + +Parameters: +- `name` - The name of the asset. + +Returns: +- `True` if the asset exists, `False` otherwise. + +#### `add_local_asset(name, type, path)` + +This method adds a local asset to the database. + +Parameters: +- `name` - The name of the asset. +- `type` - The type of the asset. +- `path` - The path to the asset file. + +#### `add_remote_asset(name, type, url)` + +This method adds a remote asset to the database. + +Parameters: +- `name` - The name of the asset. +- `type` - The type of the asset. +- `url` - The URL of the remote asset. + +#### `remove_asset(name)` + +This method removes an asset from the database. + +Parameters: +- `name` - The name of the asset. + +#### `get_df()` + +This method returns a pandas DataFrame with specific asset details. + +Returns: +- A pandas DataFrame containing the asset details. + +#### `sync_local_assets()` + +This method loads all local assets from the static-assets folder into the database. + +#### `getAssetLink(key)` + +This method returns the link or path of an asset with the given key. + +Parameters: +- `key` - The key of the asset. + +Returns: +- The link or path of the asset. + +#### `getAssetDuration(key)` + +This method returns the duration of an asset with the given key. + +Parameters: +- `key` - The key of the asset. + +Returns: +- The duration of the asset. + +#### `updateLocalAsset(key: str)` + +This method updates the local asset with the given key. + +Parameters: +- `key` - The key of the asset. + +Returns: +- The file path and duration of the updated asset. + +#### `updateYoutubeAsset(key: str)` + +This method updates the YouTube asset with the given key. + +Parameters: +- `key` - The key of the asset. + +Returns: +- The remote URL and duration of the updated asset. + +## File: api_db.py + +This file contains functions for managing API keys. + +### Functions: + +#### `get_api_key(name)` + +This function retrieves the API key with the given name. + +Parameters: +- `name` - The name of the API key. + +Returns: +- The API key. + +#### `set_api_key(name, value)` + +This function sets the API key with the given name to the specified value. + +Parameters: +- `name` - The name of the API key. +- `value` - The value of the API key. + +## File: languages.py + +This file contains an enumeration class `Language` that represents different languages. + +### Enum: Language + +This enumeration class represents different languages and provides a list of supported languages. + +Supported Languages: +- ENGLISH +- SPANISH +- FRENCH +- ARABIC +- GERMAN +- POLISH +- ITALIAN +- PORTUGUESE + +## File: path_utils.py + +This file contains utility functions for searching for program paths. + +### Functions: + +#### `search_program(program_name)` + +This function searches for the specified program and returns its path. + +Parameters: +- `program_name` - The name of the program to search for. + +Returns: +- The path of the program, or None if the program is not found. + +#### `get_program_path(program_name)` + +This function retrieves the path of the specified program. + +Parameters: +- `program_name` - The name of the program. + +Returns: +- The path of the program, or None if the program is not found. + +Note: The `magick_path` variable sets the `IMAGEMAGICK_BINARY` environment variable to the path of the `magick` program if it exists. \ No newline at end of file diff --git a/shortGPT/config/__init__.py b/shortGPT/config/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..d782e9b56643a2368e9d600b93b32e7807e129cc --- /dev/null +++ b/shortGPT/config/__init__.py @@ -0,0 +1 @@ +from . import config \ No newline at end of file diff --git a/shortGPT/config/api_db.py b/shortGPT/config/api_db.py new file mode 100644 index 0000000000000000000000000000000000000000..7f42d29665f424a824b7b8e27bcb1cbcc02f1d5a --- /dev/null +++ b/shortGPT/config/api_db.py @@ -0,0 +1,37 @@ +import enum +import os +from shortGPT.database.db_document import TinyMongoDocument +from dotenv import load_dotenv +load_dotenv('./.env') +class ApiProvider(enum.Enum): + OPENAI = "OPENAI" + ELEVEN_LABS = "ELEVEN LABS" + PEXELS = "PEXELS" + + +class ApiKeyManager: + api_key_doc_manager = TinyMongoDocument("api_db", "api_keys", "key_doc", create=True) + + @classmethod + def get_api_key(cls, key: str or ApiProvider): + if isinstance(key, ApiProvider): + key = key.value + + # Check if the key is present in the database + api_key = cls.api_key_doc_manager._get(key) + if api_key: + return api_key + + # If not found in the database, check in the environment variables + env_key = key.replace(" ", "_").upper() + api_key = os.environ.get(env_key) + if api_key: + return api_key + + return "" + + @classmethod + def set_api_key(cls, key: str or ApiProvider, value: str): + if isinstance(key, ApiProvider): + key = key.value + return cls.api_key_doc_manager._save({key: value}) \ No newline at end of file diff --git a/shortGPT/config/asset_db.py b/shortGPT/config/asset_db.py new file mode 100644 index 0000000000000000000000000000000000000000..8baccf9a745771bf85d9c490a08a0c1d2f118bff --- /dev/null +++ b/shortGPT/config/asset_db.py @@ -0,0 +1,340 @@ +import base64 +import re +import shutil +import time +from datetime import datetime +from pathlib import Path +import enum +import pandas as pd + +from shortGPT.audio.audio_utils import downloadYoutubeAudio, get_asset_duration +from shortGPT.database.db_document import TinyMongoDocument + +AUDIO_EXTENSIONS = {".mp3", ".m4a", ".wav", ".flac", ".aac", ".ogg", ".wma", ".opus"} +IMAGE_EXTENSIONS = {".jpg", ".jpeg", ".png", ".gif", ".bmp", ".svg", ".webp"} +VIDEO_EXTENSIONS = {".mp4", ".mkv", ".flv", ".avi", ".mov", ".wmv", ".webm", ".m4v"} +TEMPLATE_ASSETS_DB_PATH = '.database/template_asset_db.json' +ASSETS_DB_PATH = '.database/asset_db.json' + +class AssetType(enum.Enum): + VIDEO = "video" + AUDIO = "audio" + IMAGE = "image" + BACKGROUND_MUSIC = "background music" + BACKGROUND_VIDEO = "background video" + OTHER = "other" + +class AssetDatabase: + """ + Class for managing assets, both local and remote. + The class provides methods to add, remove, get and sync assets. + It uses a MongoDB-like database to store information about the assets. + """ + + if not Path(ASSETS_DB_PATH).exists() and Path(TEMPLATE_ASSETS_DB_PATH).exists(): + shutil.copy(TEMPLATE_ASSETS_DB_PATH, ASSETS_DB_PATH) + + local_assets = TinyMongoDocument("asset_db", "asset_collection", "local_assets", create=True) + remote_assets = TinyMongoDocument("asset_db", "asset_collection", "remote_assets", create=True) + if not remote_assets._get('subscribe animation'): + remote_assets._save({ + 'subscribe animation':{ + "type": AssetType.VIDEO.value, + "url": "https://www.youtube.com/watch?v=72WhUT0OM98", + "ts": datetime.now().strftime("%Y-%m-%d %H:%M:%S") + } + }) + + @classmethod + def asset_exists(cls, name: str) -> bool: + return name in cls.local_assets._get() or name in cls.remote_assets._get() + + @classmethod + def add_local_asset(cls, name: str, asset_type: AssetType, path: str): + cls.local_assets._save({ + name: { + "type": asset_type.value, + "path": path, + "ts": datetime.now().strftime("%Y-%m-%d %H:%M:%S") + } + }) + + @classmethod + def add_remote_asset(cls, name: str, asset_type: AssetType, url: str): + cls.remote_assets._save({ + name: { + "type": asset_type.value, + "url": url, + "ts": datetime.now().strftime("%Y-%m-%d %H:%M:%S") + } + }) + + @classmethod + def remove_asset(cls, name: str): + if name in cls.local_assets._get(): + cls._remove_local_asset(name) + elif name in cls.remote_assets._get(): + cls.remote_assets._delete(name) + else: + raise ValueError(f"Asset '{name}' does not exist in the database.") + + @classmethod + def get_df(cls, source=None) -> pd.DataFrame: + data = [] + if source is None or source == 'local': + for key, asset in cls.local_assets._get().items(): + data.append({'name': key, + 'type': asset['type'], + 'link': asset['path'], + 'source': 'local', + 'ts': asset.get('ts') + }) + if source is None or source == 'youtube': + for key, asset in cls.remote_assets._get().items(): + data.append({'name': key, + 'type': asset['type'], + 'link': asset['url'], + 'source': 'youtube' if 'youtube' in asset['url'] else 'internet', + 'ts': asset.get('ts') + }) + + df = pd.DataFrame(data) + if (not df.empty): + df.sort_values(by='ts', ascending=False, inplace=True) + return df.drop(columns='ts') + return df + + @classmethod + def sync_local_assets(cls): + """ + Loads all local assets from the static-assets folder into the database. + """ + local_assets = cls.local_assets._get() + local_paths = {asset['path'] for asset in local_assets.values()} + + for path in Path('public').rglob('*'): + if path.is_file() and str(path) not in local_paths: + cls._add_local_asset_from_path(path) + + @classmethod + def get_asset_link(cls, key: str) -> str: + """ + Get the link to an asset. + + Args: + key (str): Name of the asset. + + Returns: + str: Link to the asset. + """ + if key in cls.local_assets._get(): + return cls._update_local_asset_timestamp_and_get_link(key) + elif key in cls.remote_assets._get(): + return cls._get_remote_asset_link(key) + else: + raise ValueError(f"Asset '{key}' does not exist in the database.") + + @classmethod + def get_asset_duration(cls, key: str) -> str: + """ + Get the duration of an asset. + + Args: + key (str): Name of the asset. + + Returns: + str: Duration of the asset. + """ + if key in cls.local_assets._get(): + return cls._get_local_asset_duration(key) + elif key in cls.remote_assets._get(): + return cls._get_remote_asset_duration(key) + else: + raise ValueError(f"Asset '{key}' does not exist in the database.") + + @classmethod + def _remove_local_asset(cls, name: str): + """ + Remove a local asset from the database. + + Args: + name (str): Name of the asset. + """ + asset = cls.local_assets._get(name) + if 'required' not in asset: + try: + Path(asset['path']).unlink() + except FileNotFoundError as e: + print(f"File not found: {e}") + cls.local_assets._delete(name) + + @classmethod + def _add_local_asset_from_path(cls, path: Path): + """ + Add a local asset to the database from a file path. + + Args: + path (Path): Path to the asset. + """ + file_ext = path.suffix + if file_ext in AUDIO_EXTENSIONS: + asset_type = AssetType.AUDIO + elif file_ext in IMAGE_EXTENSIONS: + asset_type = AssetType.IMAGE + elif file_ext in VIDEO_EXTENSIONS: + asset_type = AssetType.VIDEO + else: + asset_type = AssetType.OTHER + cls.local_assets._save({ + path.stem: { + "path": str(path), + "type": asset_type.value, + "ts": datetime.now().strftime("%Y-%m-%d %H:%M:%S") + } + }) + + @classmethod + def _update_local_asset_timestamp_and_get_link(cls, key: str) -> str: + """ + Update the timestamp of a local asset and get its link. + + Args: + key (str): Name of the asset. + + Returns: + str: Link to the asset. + """ + asset = cls.local_assets._get(key) + asset['ts'] = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + cls.local_assets._save({key: asset}) + return asset['path'] + + @classmethod + def _get_remote_asset_link(cls, key: str) -> str: + """ + Get the link to a remote asset. + + Args: + key (str): Name of the asset. + + Returns: + str: Link to the asset. + """ + asset = cls.remote_assets._get(key) + asset['ts'] = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + cls.remote_assets._save({key: asset}) + if 'youtube' in asset['url']: + return cls._get_youtube_asset_link(key, asset) + return asset['url'] + + @classmethod + def _get_local_asset_duration(cls, key: str) -> str: + """ + Get the duration of a local asset. + + Args: + key (str): Name of the asset. + + Returns: + str: Duration of the asset. + """ + asset = cls.local_assets._get(key) + asset['ts'] = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + cls.local_assets._save({key: asset}) + if 'duration' not in asset and asset['duration'] is not None: + _, duration = cls._update_local_asset_duration(key) + return duration + return asset['duration'] + + @classmethod + def _get_remote_asset_duration(cls, key: str) -> str: + """ + Get the duration of a remote asset. + + Args: + key (str): Name of the asset. + + Returns: + str: Duration of the asset. + """ + asset = cls.remote_assets._get(key) + asset['ts'] = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + cls.remote_assets._save({key: asset}) + if 'duration' in asset and asset['duration'] is not None: + return asset['duration'] + _, duration = cls._update_youtube_asset_duration(key) + return duration + + @classmethod + def _update_local_asset_duration(cls, key: str) -> str: + """ + Update the duration of a local asset. + + Args: + key (str): Name of the asset. + + Returns: + str: Duration of the asset. + """ + asset = cls.local_assets._get(key) + path = Path(asset['path']) + if any(t in asset['type'] for t in ['audio', 'video', 'music']): + _, duration = get_asset_duration(str(path)) + asset['duration'] = duration + else: + duration = None + cls.local_assets._save({key: asset}) + return str(path), duration + + @classmethod + def _update_youtube_asset_duration(cls, key: str) -> str: + """ + Update the duration of a Youtube asset. + + Args: + key (str): Name of the asset. + + Returns: + str: Duration of the asset. + """ + asset = cls.remote_assets._get(key) + youtube_url = asset['url'] + remote_url, duration = get_asset_duration(youtube_url, isVideo="video" in asset['type']) + asset.update({ + "remote_url": base64.b64encode(remote_url.encode()).decode('utf-8'), + "duration": duration, + }) + cls.remote_assets._save({key: asset}) + return remote_url, duration + + @classmethod + def _get_youtube_asset_link(cls, key: str, asset: dict) -> str: + """ + Get the link to a Youtube asset. + + Args: + key (str): Name of the asset. + asset (dict): Asset data. + + Returns: + str: Link to the asset. + """ + if any(t in asset['type'] for t in ['audio', 'music']): + local_audio_file, duration = downloadYoutubeAudio(asset['url'], f"public/{key}.wav") + cls.local_assets._save({ + key: { + 'path': local_audio_file, + 'duration': duration, + 'type': 'audio', + 'ts': datetime.now().strftime("%Y-%m-%d %H:%M:%S") + } + }) + return local_audio_file + if 'remote_url' in asset: + asset['remote_url'] = base64.b64decode(asset['remote_url']).decode('utf-8') + expire_timestamp_match = re.search(r"expire=(\d+)", asset['remote_url']) + not_expired = expire_timestamp_match and int(expire_timestamp_match.group(1)) > time.time() + 1800 + if not_expired and 'duration' in asset: + return asset['remote_url'] + remote_url, _ = cls._update_youtube_asset_duration(key) + return remote_url diff --git a/shortGPT/config/config.py b/shortGPT/config/config.py new file mode 100644 index 0000000000000000000000000000000000000000..1cc9d2af4fe14dbb2fd7a929f59f907e3e400742 --- /dev/null +++ b/shortGPT/config/config.py @@ -0,0 +1,58 @@ +import yaml +import os +from dotenv import load_dotenv + +load_dotenv() + +ELEVEN_LABS_KEY = os.getenv('ELEVEN_LABS_API_KEY') +OPENAI_KEY = os.getenv('OPENAI_API_KEY') +PLAY_HT_USERID = os.getenv('PLAY_HT_USERID') +PLAY_HT_API_KEY = os.getenv('PLAY_HT_API_KEY') + + +def read_yaml_config(file_path: str) -> dict: + """Reads and returns the contents of a YAML file as dictionary""" + with open(file_path, 'r') as file: + contents = yaml.safe_load(file) + return contents + +def write_yaml_config(file_path: str, data: dict): + """Writes a dictionary to a YAML file""" + with open(file_path, 'w') as file: + yaml.dump(data, file) + +def load_editing_assets() -> dict: + """Loads all local assets from the static-assets folder specified in the yaml_config""" + yaml_config = read_yaml_config("public.yaml") + if yaml_config['local-assets'] == None: + yaml_config['local-assets'] = {} + # Create a copy of the dictionary before iterating over it + local_paths = [] + if yaml_config['local-assets'] != {}: + local_assets = yaml_config['local-assets'].copy() + # Removing local paths that don't exist + for key in local_assets: + asset = local_assets[key] + if(type(asset) == str): + filePath = local_assets[key] + else: + filePath = local_assets[key]['path'] + if not os.path.exists(filePath): + del yaml_config['local-assets'][key] + else: + local_paths.append(filePath) + + folder_path = 'public' + for foldername, subfolders, filenames in os.walk(folder_path): + for filename in filenames: + file_path = os.path.join(foldername, filename).replace("\\", "/") + if not file_path in local_paths: + yaml_config['local-assets'][filename] = file_path + + write_yaml_config("public.yaml", yaml_config) + + return yaml_config + + +# print(load_editing_assets()) +# print(read_yaml_config("editing_assets.yaml")['local-assets']) diff --git a/shortGPT/config/languages.py b/shortGPT/config/languages.py new file mode 100644 index 0000000000000000000000000000000000000000..09b6a27e0a40db29dc0b0fd051c62aad6fae45be --- /dev/null +++ b/shortGPT/config/languages.py @@ -0,0 +1,263 @@ + +from enum import Enum + +class Language(Enum): + ENGLISH = "English" + SPANISH = "Spanish" + FRENCH = "French" + ARABIC = "Arabic" + GERMAN = "German" + POLISH = "Polish" + ITALIAN = "Italian" + PORTUGUESE = "Portuguese" + AFRIKAANS = "Afrikaans" + AMHARIC = "Amharic" + AZERBAIJANI = "Azerbaijani" + BULGARIAN = "Bulgarian" + BENGALI = "Bengali" + BOSNIAN = "Bosnian" + CATALAN = "Catalan" + CZECH = "Czech" + WELSH = "Welsh" + DANISH = "Danish" + GREEK = "Greek" + ESTONIAN = "Estonian" + PERSIAN = "Persian" + FINNISH = "Finnish" + FILIPINO = "Filipino" + GALICIAN = "Galician" + GUJARATI = "Gujarati" + HEBREW = "Hebrew" + HINDI = "Hindi" + CROATIAN = "Croatian" + HUNGARIAN = "Hungarian" + INDONESIAN = "Indonesian" + ICELANDIC = "Icelandic" + JAPANESE = "Japanese" + JAVANESE = "Javanese" + GEORGIAN = "Georgian" + KAZAKH = "Kazakh" + KHMER = "Khmer" + KANNADA = "Kannada" + KOREAN = "Korean" + LAO = "Lao" + LITHUANIAN = "Lithuanian" + LATVIAN = "Latvian" + MACEDONIAN = "Macedonian" + MALAYALAM = "Malayalam" + MONGOLIAN = "Mongolian" + MARATHI = "Marathi" + MALAY = "Malay" + MALTESE = "Maltese" + MYANMAR = "Myanmar" + NORWEGIAN = "Norwegian" + NEPALI = "Nepali" + DUTCH = "Dutch" + NORWEGIAN_BOKMAL = "Norwegian Bokmål" + NORWEGIAN_NYNORSK = "Norwegian Nynorsk" + PASHTO = "Pashto" + ROMANIAN = "Romanian" + RUSSIAN = "Russian" + SINHALA = "Sinhala" + SLOVAK = "Slovak" + SLOVENIAN = "Slovenian" + SOMALI = "Somali" + ALBANIAN = "Albanian" + SERBIAN = "Serbian" + SUNDANESE = "Sundanese" + SWEDISH = "Swedish" + SWAHILI = "Swahili" + TAMIL = "Tamil" + TELUGU = "Telugu" + THAI = "Thai" + TURKISH = "Turkish" + UKRAINIAN = "Ukrainian" + URDU = "Urdu" + UZBEK = "Uzbek" + VIETNAMESE = "Vietnamese" + CHINESE = "Chinese" + ZULU = "Zulu" + +ELEVEN_SUPPORTED_LANGUAGES=[Language.ENGLISH, + Language.SPANISH, + Language.FRENCH, + Language.ARABIC, + Language.GERMAN, + Language.POLISH, + Language.ITALIAN, + Language.PORTUGUESE] + +COQUI_SUPPORTED_LANGUAGES=[Language.ENGLISH, +Language.SPANISH, +Language.FRENCH, +Language.GERMAN, +Language.ITALIAN, +Language.PORTUGUESE, +Language.POLISH, +Language.TURKISH, +Language.RUSSIAN, +Language.DUTCH, +Language.CZECH, +Language.ARABIC, +Language.CHINESE, +Language.JAPANESE, +Language.HUNGARIAN, +Language.KOREAN] + +LANGUAGE_ACRONYM_MAPPING={ + Language.ENGLISH : "en", + Language.SPANISH : "es", + Language.FRENCH : "fr", + Language.ARABIC : "ar", + Language.GERMAN : "de", + Language.POLISH : "pl", + Language.ITALIAN : "it", + Language.PORTUGUESE : "pt", + Language.AFRIKAANS : "af", + Language.AMHARIC : "am", + Language.AZERBAIJANI : "az", + Language.BULGARIAN : "bg", + Language.BENGALI : "bn", + Language.BOSNIAN : "bs", + Language.CATALAN : "ca", + Language.CZECH : "cs", + Language.WELSH : "cy", + Language.DANISH : "da", + Language.GREEK : "el", + Language.ESTONIAN : "et", + Language.PERSIAN : "fa", + Language.FINNISH : "fi", + Language.FILIPINO : "fil", + Language.GALICIAN : "gl", + Language.GUJARATI : "gu", + Language.HEBREW : "he", + Language.HINDI : "hi", + Language.CROATIAN : "hr", + Language.HUNGARIAN : "hu", + Language.INDONESIAN : "id", + Language.ICELANDIC : "is", + Language.JAPANESE : "ja", + Language.JAVANESE : "jv", + Language.GEORGIAN : "ka", + Language.KAZAKH : "kk", + Language.KHMER : "km", + Language.KANNADA : "kn", + Language.KOREAN : "ko", + Language.LAO : "lo", + Language.LITHUANIAN : "lt", + Language.LATVIAN : "lv", + Language.MACEDONIAN : "mk", + Language.MALAYALAM : "ml", + Language.MONGOLIAN : "mn", + Language.MARATHI : "mr", + Language.MALAY : "ms", + Language.MALTESE : "mt", + Language.MYANMAR : "my", + Language.NORWEGIAN : "no", + Language.NEPALI : "ne", + Language.DUTCH : "nl", + Language.NORWEGIAN_BOKMAL : "nb", + Language.NORWEGIAN_NYNORSK : "nn", + Language.PASHTO : "ps", + Language.ROMANIAN : "ro", + Language.RUSSIAN : "ru", + Language.SINHALA : "si", + Language.SLOVAK : "sk", + Language.SLOVENIAN : "sl", + Language.SOMALI : "so", + Language.ALBANIAN : "sq", + Language.SERBIAN : "sr", + Language.SUNDANESE : "su", + Language.SWEDISH : "sv", + Language.SWAHILI : "sw", + Language.TAMIL : "ta", + Language.TELUGU : "te", + Language.THAI : "th", + Language.TURKISH : "tr", + Language.UKRAINIAN : "uk", + Language.URDU : "ur", + Language.UZBEK : "uz", + Language.VIETNAMESE : "vi", + Language.CHINESE : "zh", + Language.ZULU : "zu", +} +ACRONYM_LANGUAGE_MAPPING = {v: k for k, v in LANGUAGE_ACRONYM_MAPPING.items()} + +EDGE_TTS_VOICENAME_MAPPING = { + Language.ENGLISH: {'male': 'en-AU-WilliamNeural', 'female': 'en-AU-NatashaNeural'}, + Language.SPANISH: {'male': 'es-AR-TomasNeural', 'female': 'es-AR-ElenaNeural'}, + Language.FRENCH: {'male': 'fr-CA-AntoineNeural', 'female': 'fr-CA-SylvieNeural'}, + Language.ARABIC: {'male': 'ar-AE-HamdanNeural', 'female': 'ar-AE-FatimaNeural'}, + Language.GERMAN: {'male': 'de-DE-ConradNeural', 'female': 'de-DE-KatjaNeural'}, + Language.POLISH: {'male': 'pl-PL-MarekNeural', 'female': 'pl-PL-ZofiaNeural'}, + Language.ITALIAN: {'male': 'it-IT-DiegoNeural', 'female': 'it-IT-ElsaNeural'}, + Language.PORTUGUESE: {'male': 'pt-BR-AntonioNeural', 'female': 'pt-BR-FranciscaNeural'}, + Language.AFRIKAANS: {'male': 'af-ZA-WillemNeural', 'female': 'af-ZA-AdriNeural'}, + Language.AMHARIC: {'male': 'am-ET-AmehaNeural', 'female': 'am-ET-MekdesNeural'}, + Language.AZERBAIJANI: {'male': 'az-AZ-BabekNeural', 'female': 'az-AZ-BanuNeural'}, + Language.BULGARIAN: {'male': 'bg-BG-BorislavNeural', 'female': 'bg-BG-KalinaNeural'}, + Language.BENGALI: {'male': 'bn-BD-PradeepNeural', 'female': 'bn-BD-NabanitaNeural'}, + Language.BOSNIAN: {'male': 'bs-BA-GoranNeural', 'female': 'bs-BA-VesnaNeural'}, + Language.CATALAN: {'male': 'ca-ES-EnricNeural', 'female': 'ca-ES-JoanaNeural'}, + Language.CZECH: {'male': 'cs-CZ-AntoninNeural', 'female': 'cs-CZ-VlastaNeural'}, + Language.WELSH: {'male': 'cy-GB-AledNeural', 'female': 'cy-GB-NiaNeural'}, + Language.DANISH: {'male': 'da-DK-JeppeNeural', 'female': 'da-DK-ChristelNeural'}, + Language.GREEK: {'male': 'el-GR-NestorasNeural', 'female': 'el-GR-AthinaNeural'}, + Language.ESTONIAN: {'male': 'et-EE-KertNeural', 'female': 'et-EE-AnuNeural'}, + Language.PERSIAN: {'male': 'fa-IR-FaridNeural', 'female': 'fa-IR-DilaraNeural'}, + Language.FINNISH: {'male': 'fi-FI-HarriNeural', 'female': 'fi-FI-NooraNeural'}, + Language.FILIPINO: {'male': 'fil-PH-AngeloNeural', 'female': 'fil-PH-BlessicaNeural'}, + Language.GALICIAN: {'male': 'gl-ES-RoiNeural', 'female': 'gl-ES-SabelaNeural'}, + Language.GUJARATI: {'male': 'gu-IN-NiranjanNeural', 'female': 'gu-IN-DhwaniNeural'}, + Language.HEBREW: {'male': 'he-IL-AvriNeural', 'female': 'he-IL-HilaNeural'}, + Language.HINDI: {'male': 'hi-IN-MadhurNeural', 'female': 'hi-IN-SwaraNeural'}, + Language.CROATIAN: {'male': 'hr-HR-SreckoNeural', 'female': 'hr-HR-GabrijelaNeural'}, + Language.HUNGARIAN: {'male': 'hu-HU-TamasNeural', 'female': 'hu-HU-NoemiNeural'}, + Language.INDONESIAN: {'male': 'id-ID-ArdiNeural', 'female': 'id-ID-GadisNeural'}, + Language.ICELANDIC: {'male': 'is-IS-GunnarNeural', 'female': 'is-IS-GudrunNeural'}, + Language.ITALIAN: {'male': 'it-IT-DiegoNeural', 'female': 'it-IT-ElsaNeural'}, + Language.JAPANESE: {'male': 'ja-JP-KeitaNeural', 'female': 'ja-JP-NanamiNeural'}, + Language.JAVANESE: {'male': 'jv-ID-DimasNeural', 'female': 'jv-ID-SitiNeural'}, + Language.GEORGIAN: {'male': 'ka-GE-GiorgiNeural', 'female': 'ka-GE-EkaNeural'}, + Language.KAZAKH: {'male': 'kk-KZ-DauletNeural', 'female': 'kk-KZ-AigulNeural'}, + Language.KHMER: {'male': 'km-KH-PisethNeural', 'female': 'km-KH-SreymomNeural'}, + Language.KANNADA: {'male': 'kn-IN-GaganNeural', 'female': 'kn-IN-SapnaNeural'}, + Language.KOREAN: {'male': 'ko-KR-InJoonNeural', 'female': 'ko-KR-SunHiNeural'}, + Language.LAO: {'male': 'lo-LA-KeomanyNeural', 'female': 'lo-LA-ChanthavongNeural'}, + Language.LITHUANIAN: {'male': 'lt-LT-LeonasNeural', 'female': 'lt-LT-OnaNeural'}, + Language.LATVIAN: {'male': 'lv-LV-NilsNeural', 'female': 'lv-LV-EveritaNeural'}, + Language.MACEDONIAN: {'male': 'mk-MK-AleksandarNeural', 'female': 'mk-MK-MarijaNeural'}, + Language.MALAYALAM: {'male': 'ml-IN-MidhunNeural', 'female': 'ml-IN-MidhunNeural'}, + Language.MONGOLIAN: {'male': 'mn-MN-YesuiNeural', 'female': 'mn-MN-BataaNeural'}, + Language.MARATHI: {'male': 'mr-IN-ManoharNeural', 'female': 'mr-IN-AarohiNeural'}, + Language.MALAY: {'male': 'ms-MY-OsmanNeural', 'female': 'ms-MY-YasminNeural'}, + Language.MALTESE: {'male': 'mt-MT-JosephNeural', 'female': 'mt-MT-GraceNeural'}, + Language.MYANMAR: {'male': 'my-MM-ThihaNeural', 'female': 'my-MM-NilarNeural'}, + Language.NORWEGIAN: {'male': 'nb-NO-FinnNeural', 'female': 'nb-NO-PernilleNeural'}, + Language.NEPALI: {'male': 'ne-NP-SagarNeural', 'female': 'ne-NP-HemkalaNeural'}, + Language.DUTCH: {'male': 'nl-NL-MaartenNeural', 'female': 'nl-NL-FennaNeural'}, + Language.NORWEGIAN_BOKMAL: {'male': 'nb-NO-FinnNeural', 'female': 'nb-NO-PernilleNeural'}, + Language.NORWEGIAN_NYNORSK: {'male': 'nb-NO-FinnNeural', 'female': 'nb-NO-PernilleNeural'}, + Language.PASHTO: {'male': 'ps-AF-LatifaNeural', 'female': 'ps-AF-GulNawazNeural'}, + Language.ROMANIAN: {'male': 'ro-RO-EmilNeural', 'female': 'ro-RO-AlinaNeural'}, + Language.RUSSIAN: {'male': 'ru-RU-DmitryNeural', 'female': 'ru-RU-SvetlanaNeural'}, + Language.SINHALA: {'male': 'si-LK-SameeraNeural', 'female': 'si-LK-ThiliniNeural'}, + Language.SLOVAK: {'male': 'sk-SK-LukasNeural', 'female': 'sk-SK-ViktoriaNeural'}, + Language.SLOVENIAN: {'male': 'sl-SI-RokNeural', 'female': 'sl-SI-PetraNeural'}, + Language.SOMALI: {'male': 'so-SO-MuuseNeural', 'female': 'so-SO-UbaxNeural'}, + Language.ALBANIAN: {'male': 'sq-AL-IlirNeural', 'female': 'sq-AL-AnilaNeural'}, + Language.SERBIAN: {'male': 'sr-RS-NicholasNeural', 'female': 'sr-RS-SophieNeural'}, + Language.SUNDANESE: {'male': 'su-ID-JajangNeural', 'female': 'su-ID-TutiNeural'}, + Language.SWEDISH: {'male': 'sv-SE-MattiasNeural', 'female': 'sv-SE-SofieNeural'}, + Language.SWAHILI: {'male': 'sw-TZ-DaudiNeural', 'female': 'sw-TZ-DaudiNeural'}, + Language.TAMIL: {'male': 'ta-IN-ValluvarNeural', 'female': 'ta-IN-PallaviNeural'}, + Language.TELUGU: {'male': 'te-IN-MohanNeural', 'female': 'te-IN-ShrutiNeural'}, + Language.THAI: {'male': 'th-TH-NiwatNeural', 'female': 'th-TH-PremwadeeNeural'}, + Language.TURKISH: {'male': 'tr-TR-AhmetNeural', 'female': 'tr-TR-EmelNeural'}, + Language.UKRAINIAN: {'male': 'uk-UA-OstapNeural', 'female': 'uk-UA-PolinaNeural'}, + Language.URDU: {'male': 'ur-PK-AsadNeural', 'female': 'ur-PK-UzmaNeural'}, + Language.UZBEK: {'male': 'uz-UZ-SardorNeural', 'female': 'uz-UZ-MadinaNeural'}, + Language.VIETNAMESE: {'male': 'vi-VN-NamMinhNeural', 'female': 'vi-VN-HoaiMyNeural'}, + Language.CHINESE: {'male': 'zh-CN-YunxiNeural', 'female': 'zh-CN-XiaoxiaoNeural'}, + Language.ZULU: {'male': 'zu-ZA-ThembaNeural', 'female': 'zu-ZA-ThandoNeural'} +} \ No newline at end of file diff --git a/shortGPT/config/make_caption.json b/shortGPT/config/make_caption.json new file mode 100644 index 0000000000000000000000000000000000000000..81724294b5967f77309d4967e6ee32ab88a55510 --- /dev/null +++ b/shortGPT/config/make_caption.json @@ -0,0 +1,15 @@ +{ + "caption_style": { + "font": "public/Anta-Regular.ttf", + "fontsize": 24, + "color": "#FFFFFF", // White color for the regular text + "highlight_color": "#FFD700", // Gold color for the highlighted (active) word + "background_color": "transparent", + "stroke_width": 2, + "stroke_color": "#000000", // Black stroke for better readability + "alignment": "center", + "margin_bottom": 20, // Adjust based on your layout + "words_to_show": 4, // Shows only 4 words in the subtitle + "highlight_method": "dynamic" // Indicates the method to dynamically highlight the active word + } +} diff --git a/shortGPT/config/path_utils.py b/shortGPT/config/path_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..a027be8ca4cade9dfe20c883347232397fb7e89a --- /dev/null +++ b/shortGPT/config/path_utils.py @@ -0,0 +1,36 @@ +import os +import platform +import sys +import subprocess +import subprocess +import tempfile +def search_program(program_name): + try: + search_cmd = "where" if platform.system() == "Windows" else "which" + return subprocess.check_output([search_cmd, program_name]).decode().strip() + except subprocess.CalledProcessError: + return None + +def get_program_path(program_name): + program_path = search_program(program_name) + return program_path + +magick_path = get_program_path("magick") +if magick_path: + os.environ['IMAGEMAGICK_BINARY'] = magick_path + +import os + +def is_running_in_colab(): + return 'COLAB_GPU' in os.environ + +def handle_path(path, extension = ".mp4"): + if 'https' in path: + if is_running_in_colab(): + temp_file = tempfile.NamedTemporaryFile(suffix= extension, delete=False) + # The '-y' option overwrites the output file if it already exists. + command = ['ffmpeg', '-y', '-i', path, temp_file.name] + subprocess.run(command, check=True) + temp_file.close() + return temp_file.name + return path \ No newline at end of file diff --git a/shortGPT/database/README.md b/shortGPT/database/README.md new file mode 100644 index 0000000000000000000000000000000000000000..4fc3dd05efa2bda14f23dca4f2e4fae54fb7fc46 --- /dev/null +++ b/shortGPT/database/README.md @@ -0,0 +1,147 @@ +# Database Module Documentation + +The `database` module provides classes for managing database documents and data in the ShortGPT application. The module consists of three files: + +- `content_data_manager.py`: Defines the `ContentDataManager` class, which manages the content data for a document in the database. +- `content_database.py`: Defines the `ContentDatabase` class, which provides methods for creating and accessing `ContentDataManager` instances. +- `db_document.py`: Defines the `DatabaseDocument` abstract base class and the `TinyMongoDocument` class, which represents a document in a TinyMongo database. + +## File: content_data_manager.py + +The `content_data_manager.py` file contains the `ContentDataManager` class, which is responsible for managing the content data for a document in the database. + +### Class: ContentDataManager + +#### `__init__(self, db_doc: DatabaseDocument, content_type: str, new=False)` + +- Initializes a new instance of the `ContentDataManager` class. +- Parameters: + - `db_doc`: The `DatabaseDocument` instance representing the document in the database. + - `content_type`: The type of content to be managed by the `ContentDataManager`. + - `new`: (Optional) A boolean flag indicating whether the document is new or existing. Default is `False`. + +#### `save(self, key, value)` + +- Saves the specified key-value pair to the document. +- Parameters: + - `key`: The key of the data to be saved. + - `value`: The value of the data to be saved. + +#### `get(self, key)` + +- Retrieves the value associated with the specified key from the document. +- Parameters: + - `key`: The key of the data to be retrieved. +- Returns: + - The value associated with the specified key. + +#### `_getId(self)` + +- Retrieves the ID of the document. +- Returns: + - The ID of the document. + +#### `delete(self)` + +- Deletes the document from the database. + +#### `__str__(self)` + +- Returns a string representation of the document. + +## File: content_database.py + +The `content_database.py` file contains the `ContentDatabase` class, which provides methods for creating and accessing `ContentDataManager` instances. + +### Class: ContentDatabase + +#### `instanciateContentDataManager(self, id: str, content_type: str, new=False)` + +- Creates a new `ContentDataManager` instance for the specified document ID and content type. +- Parameters: + - `id`: The ID of the document. + - `content_type`: The type of content to be managed by the `ContentDataManager`. + - `new`: (Optional) A boolean flag indicating whether the document is new or existing. Default is `False`. +- Returns: + - A new `ContentDataManager` instance. + +#### `getContentDataManager(self, id, content_type: str)` + +- Retrieves an existing `ContentDataManager` instance for the specified document ID and content type. +- Parameters: + - `id`: The ID of the document. + - `content_type`: The type of content to be managed by the `ContentDataManager`. +- Returns: + - The existing `ContentDataManager` instance, or `None` if not found. + +#### `createContentDataManager(self, content_type: str) -> ContentDataManager` + +- Creates a new `ContentDataManager` instance for a new document with the specified content type. +- Parameters: + - `content_type`: The type of content to be managed by the `ContentDataManager`. +- Returns: + - A new `ContentDataManager` instance. + +## File: db_document.py + +The `db_document.py` file contains the `DatabaseDocument` abstract base class and the `TinyMongoDocument` class, which represents a document in a TinyMongo database. + +### Abstract Class: DatabaseDocument + +- An abstract base class that defines the interface for a database document. +- Subclasses must implement the abstract methods: + - `_save(self, key, data)` + - `_get(self, key)` + - `_getId(self)` + - `__str__(self)` + - `_delete(self)` + +### Class: TinyMongoDocument + +- Represents a document in a TinyMongo database. +- Inherits from the `DatabaseDocument` abstract base class. + +#### `__init__(self, db_name: str, collection_name: str, document_id: str, create=False)` + +- Initializes a new instance of the `TinyMongoDocument` class. +- Parameters: + - `db_name`: The name of the database. + - `collection_name`: The name of the collection. + - `document_id`: The ID of the document. + - `create`: (Optional) A boolean flag indicating whether to create the document if it doesn't exist. Default is `False`. + +#### `exists(self)` + +- Checks if the document exists in the database. +- Returns: + - `True` if the document exists, `False` otherwise. + +#### `_save(self, data)` + +- Saves the specified data to the document. +- Parameters: + - `data`: The data to be saved. + +#### `_get(self, key=None)` + +- Retrieves the value associated with the specified key from the document. +- Parameters: + - `key`: (Optional) The key of the data to be retrieved. If not specified, returns the entire document. +- Returns: + - The value associated with the specified key, or the entire document if no key is specified. + +#### `_delete(self, key)` + +- Deletes the specified key from the document. +- Parameters: + - `key`: The key to be deleted. + +#### `_getId(self)` + +- Retrieves the ID of the document. +- Returns: + - The ID of the document. + +#### `__str__(self)` + +- Returns a string representation of the document. \ No newline at end of file diff --git a/shortGPT/database/__init__.py b/shortGPT/database/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/shortGPT/database/content_data_manager.py b/shortGPT/database/content_data_manager.py new file mode 100644 index 0000000000000000000000000000000000000000..bd984975e8c0d9b7d4a325caaa2e83ecbdebbd3b --- /dev/null +++ b/shortGPT/database/content_data_manager.py @@ -0,0 +1,29 @@ +from shortGPT.database.db_document import AbstractDatabaseDocument + + +class ContentDataManager(): + + def __init__(self, db_doc: AbstractDatabaseDocument, content_type: str, new=False): + self.contentType = content_type + self.db_doc = db_doc + if new: + self.db_doc._save({ + 'content_type': content_type, + 'ready_to_upload': False, + 'last_completed_step': 0, + }) + + def save(self, key, value): + self.db_doc._save({key: value}) + + def get(self, key): + return self.db_doc._get(key) + + def _getId(self): + return self.db_doc._getId() + + def delete(self): + self.db_doc.delete() + + def __str__(self): + return self.db_doc.__str__() diff --git a/shortGPT/database/content_database.py b/shortGPT/database/content_database.py new file mode 100644 index 0000000000000000000000000000000000000000..b892db5660ed3040637e6dcb7cf43481e0e677c5 --- /dev/null +++ b/shortGPT/database/content_database.py @@ -0,0 +1,28 @@ +from uuid import uuid4 +from shortGPT.database.db_document import TINY_MONGO_DATABASE, TinyMongoDocument + +from shortGPT.database.content_data_manager import ContentDataManager +class ContentDatabase: + def __init__(self, ): + self.content_collection = TINY_MONGO_DATABASE["content_db"]["content_documents"] + + def instanciateContentDataManager(self, id: str, content_type: str, new=False): + db_doc = TinyMongoDocument("content_db", "content_documents", id) + return ContentDataManager(db_doc, content_type, new) + + def getContentDataManager(self, id, content_type: str): + try: + db_doc = TinyMongoDocument("content_db", "content_documents", id) + return ContentDataManager(db_doc, content_type, False) + except: + return None + + def createContentDataManager(self, content_type: str) -> ContentDataManager: + try: + new_short_id = uuid4().hex[:24] + db_doc = TinyMongoDocument("content_db", "content_documents", new_short_id, True) + return ContentDataManager(db_doc, content_type, True) + except: + return None + + \ No newline at end of file diff --git a/shortGPT/database/db_document.py b/shortGPT/database/db_document.py new file mode 100644 index 0000000000000000000000000000000000000000..ad6943a2cbab16c2df27b8c8423a3a80a7b08c22 --- /dev/null +++ b/shortGPT/database/db_document.py @@ -0,0 +1,119 @@ +import threading +from abc import ABC, abstractmethod + +import tinydb +import tinymongo as tm + + +class AbstractDatabaseDocument(ABC): + + @abstractmethod + def _save(self, key, data): + '''Save the data in the database''' + pass + + @abstractmethod + def _get(self, key): + '''Get the data from the database''' + pass + + @abstractmethod + def _getId(self): + '''Get the id of the document''' + pass + + @abstractmethod + def __str__(self): + '''Return the string representation of the document''' + pass + + @abstractmethod + def _delete(self): + '''Delete the document''' + pass + + +class TinyMongoClient(tm.TinyMongoClient): + @property + def _storage(self): + return tinydb.storages.JSONStorage + + +TINY_MONGO_DATABASE = TinyMongoClient("./.database") + + +class TinyMongoDocument(AbstractDatabaseDocument): + _lock = threading.Lock() + + def __init__(self, db_name: str, collection_name: str, document_id: str, create=False): + self.collection = TINY_MONGO_DATABASE[db_name][collection_name] + self.collection_name = collection_name + self.document_id = document_id + if (not self.exists()): + if create: + self.collection.insert_one({"_id": document_id}) + else: + raise Exception(f"The document with id {document_id} in collection {collection_name} of database {db_name} does not exist") + + def exists(self): + with self._lock: + return self.collection.find({"_id": self.document_id}).count() == 1 + + def _save(self, data): + with self._lock: + try: + update_data = {'$set': {}} + for key, value in data.items(): + path_parts = key.split(".") + + if len(path_parts) > 1: + root_key = ".".join(path_parts[:-1]) + last_key = path_parts[-1] + current_value = self._get(root_key) + if not isinstance(current_value, dict): + current_value = {} + current_value[last_key] = value + update_data['$set'][root_key] = current_value + else: + update_data['$set'][key] = value + + self.collection.update_one({'_id': self.document_id}, update_data) + except Exception as e: + print(f"Error saving data: {e}") + + def _get(self, key=None): + with self._lock: + try: + document = self.collection.find_one({'_id': self.document_id}) + if not key: + del document['_id'] + return document + keys = key.split(".") + value = document[keys[0]] + for k in keys[1:]: + value = value[k] + return value + except Exception as e: + #print(f"Error getting value for key '{key}': {e}") + return None + + def _delete(self, key): + with self._lock: + try: + document = self.collection.find_one({'_id': self.document_id}) + if key in document: + del document[key] + self.collection.remove({'_id': self.document_id}) + self.collection.insert(document) + else: + print(f"Key '{key}' not found in the document") + except Exception as e: + print(f"Error deleting key '{key}': {e}") + + def _getId(self): + return self.document_id + + def __str__(self): + with self._lock: + document = self.collection.find_one({'_id': self.document_id}) + return str(document) diff --git a/shortGPT/editing_framework/README.md b/shortGPT/editing_framework/README.md new file mode 100644 index 0000000000000000000000000000000000000000..c0cc0038a18320c6995dc92bacf5e4ac89f42145 --- /dev/null +++ b/shortGPT/editing_framework/README.md @@ -0,0 +1,182 @@ +# Editing Framework Module Documentation + +The `editing_framework` module provides a set of classes and functions for editing videos and images. This module is part of the `shortGPT` project and is designed to be used with the `CoreEditingEngine` class to generate videos and images based on a specified editing schema. + +## Module Files + +The `editing_framework` module consists of three files: + +1. `rendering_logger.py`: This file contains the `MoviepyProgressLogger` class, which is used for logging the progress of the rendering process. +2. `editing_engine.py`: This file contains the `EditingStep` and `Flow` enums, as well as the `EditingEngine` class, which is the main class for managing the editing process. +3. `core_editing_engine.py`: This file contains the `CoreEditingEngine` class, which is responsible for generating videos and images based on the editing schema. + +## `rendering_logger.py` + +This file defines the `MoviepyProgressLogger` class, which is a subclass of `ProgressBarLogger` from the `proglog` module. It provides a callback function for logging the progress of the rendering process. The `MoviepyProgressLogger` class has the following methods: + +### `__init__(self, callBackFunction=None)` + +- Initializes a new instance of the `MoviepyProgressLogger` class. +- Parameters: + - `callBackFunction`: An optional callback function that will be called with the progress string. + +### `bars_callback(self, bar, attr, value, old_value=None)` + +- This method is called every time the logger progress is updated. +- It calculates the rendering progress and the estimated time left. +- It calls the callback function with the progress string or prints the progress string if no callback function is provided. +- Parameters: + - `bar`: The progress bar name. + - `attr`: The progress attribute name. + - `value`: The current progress value. + - `old_value`: The previous progress value. + +### `format_time(self, seconds)` + +- Formats the given time in seconds to the format "mm:ss". +- Parameters: + - `seconds`: The time in seconds. +- Returns: + - The formatted time string. + +## `editing_engine.py` + +This file defines the `EditingStep` and `Flow` enums, as well as the `EditingEngine` class, which is responsible for managing the editing process. The `EditingEngine` class has the following methods: + +### `__init__(self)` + +- Initializes a new instance of the `EditingEngine` class. +- It initializes the editing step tracker and the editing schema. + +### `addEditingStep(self, editingStep: EditingStep, args: Dict[str, any] = {})` + +- Adds an editing step to the editing schema with the specified arguments. +- Parameters: + - `editingStep`: The editing step to add. + - `args`: The arguments for the editing step. +- Raises: + - `Exception`: If a required argument is missing. + +### `ingestFlow(self, flow: Flow, args)` + +- Ingests a flow into the editing schema with the specified arguments. +- Parameters: + - `flow`: The flow to ingest. + - `args`: The arguments for the flow. +- Raises: + - `Exception`: If a required argument is missing. + +### `dumpEditingSchema(self)` + +- Returns the current editing schema. + +### `renderVideo(self, outputPath, logger=None)` + +- Renders the video based on the editing schema and saves it to the specified output path. +- Parameters: + - `outputPath`: The path to save the rendered video. + - `logger`: An optional logger object for logging the rendering progress. + +### `renderImage(self, outputPath)` + +- Renders the image based on the editing schema and saves it to the specified output path. +- Parameters: + - `outputPath`: The path to save the rendered image. + +## `core_editing_engine.py` + +This file defines the `CoreEditingEngine` class, which is responsible for generating videos and images based on the editing schema. The `CoreEditingEngine` class has the following methods: + +### `generate_image(self, schema:Dict[str, Any], output_file)` + +- Generates an image based on the editing schema and saves it to the specified output file. +- Parameters: + - `schema`: The editing schema. + - `output_file`: The path to save the generated image. +- Returns: + - The path to the saved image. + +### `generate_video(self, schema:Dict[str, Any], output_file, logger=None)` + +- Generates a video based on the editing schema and saves it to the specified output file. +- Parameters: + - `schema`: The editing schema. + - `output_file`: The path to save the generated video. + - `logger`: An optional logger object for logging the rendering progress. +- Returns: + - The path to the saved video. + +### `process_common_actions(self, clip: Union[VideoFileClip, ImageClip, TextClip, AudioFileClip], actions: List[Dict[str, Any]])` + +- Processes common actions for the given clip. +- Parameters: + - `clip`: The clip to process. + - `actions`: The list of actions to apply to the clip. +- Returns: + - The processed clip. + +### `process_common_visual_actions(self, clip: Union[VideoFileClip, ImageClip, TextClip], actions: List[Dict[str, Any]])` + +- Processes common visual clip actions for the given clip. +- Parameters: + - `clip`: The clip to process. + - `actions`: The list of actions to apply to the clip. +- Returns: + - The processed clip. + +### `process_audio_actions(self, clip: AudioFileClip, actions: List[Dict[str, Any]])` + +- Processes audio actions for the given audio clip. +- Parameters: + - `clip`: The audio clip to process. + - `actions`: The list of actions to apply to the audio clip. +- Returns: + - The processed audio clip. + +### `process_video_asset(self, asset: Dict[str, Any])` + +- Processes a video asset based on the asset parameters and actions. +- Parameters: + - `asset`: The video asset to process. +- Returns: + - The processed video clip. + +### `process_image_asset(self, asset: Dict[str, Any])` + +- Processes an image asset based on the asset parameters and actions. +- Parameters: + - `asset`: The image asset to process. +- Returns: + - The processed image clip. + +### `process_text_asset(self, asset: Dict[str, Any])` + +- Processes a text asset based on the asset parameters and actions. +- Parameters: + - `asset`: The text asset to process. +- Returns: + - The processed text clip. + +### `process_audio_asset(self, asset: Dict[str, Any])` + +- Processes an audio asset based on the asset parameters and actions. +- Parameters: + - `asset`: The audio asset to process. +- Returns: + - The processed audio clip. + +### `__normalize_image(self, clip)` + +- Normalizes the image clip. +- Parameters: + - `clip`: The image clip to normalize. +- Returns: + - The normalized image clip. + +### `__normalize_frame(self, frame)` + +- Normalizes the given frame. +- Parameters: + - `frame`: The frame to normalize. +- Returns: + - The normalized frame. \ No newline at end of file diff --git a/shortGPT/editing_framework/__init__.py b/shortGPT/editing_framework/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/shortGPT/editing_framework/core_editing_engine.py b/shortGPT/editing_framework/core_editing_engine.py new file mode 100644 index 0000000000000000000000000000000000000000..846ae7e3e2b9a330a8bfc7aabaf7d42ae507ae0a --- /dev/null +++ b/shortGPT/editing_framework/core_editing_engine.py @@ -0,0 +1,251 @@ +from shortGPT.config.path_utils import get_program_path +import os +magick_path = get_program_path("magick") +if magick_path: + os.environ['IMAGEMAGICK_BINARY'] = magick_path +from shortGPT.config.path_utils import handle_path +import numpy as np +import json +from typing import Any, Dict, List, Union +from moviepy.editor import (AudioFileClip, CompositeVideoClip,CompositeAudioClip, ImageClip, + TextClip, VideoFileClip, vfx,) +from moviepy.audio.fx.audio_loop import audio_loop +from moviepy.audio.fx.audio_normalize import audio_normalize +from shortGPT.editing_framework.rendering_logger import MoviepyProgressLogger + +def load_schema(json_path): + return json.loads(open(json_path, 'r', encoding='utf-8').read()) + +class CoreEditingEngine: + + def generate_image(self, schema:Dict[str, Any],output_file , logger=None): + assets = dict(sorted(schema['visual_assets'].items(), key=lambda item: item[1]['z'])) + clips = [] + + for asset_key in assets: + asset = assets[asset_key] + asset_type = asset['type'] + if asset_type == 'image': + try: + clip = self.process_image_asset(asset) + except Exception as e: + continue + elif asset_type == 'text': + clip = self.process_text_asset(asset) + clips.append(clip) + else: + raise ValueError(f'Invalid asset type: {asset_type}') + clips.append(clip) + + image = CompositeVideoClip(clips) + image.save_frame(output_file) + return output_file + + def generate_video(self, schema:Dict[str, Any], output_file, logger=None) -> None: + visual_assets = dict(sorted(schema['visual_assets'].items(), key=lambda item: item[1]['z'])) + audio_assets = dict(sorted(schema['audio_assets'].items(), key=lambda item: item[1]['z'])) + + visual_clips = [] + for asset_key in visual_assets: + asset = visual_assets[asset_key] + asset_type = asset['type'] + if asset_type == 'video': + clip = self.process_video_asset(asset) + elif asset_type == 'image': + try: + clip = self.process_image_asset(asset) + except Exception as e: + continue + elif asset_type == 'text': + clip = self.process_text_asset(asset) + else: + raise ValueError(f'Invalid asset type: {asset_type}') + + visual_clips.append(clip) + + audio_clips = [] + + for asset_key in audio_assets: + asset = audio_assets[asset_key] + asset_type = asset['type'] + if asset_type == "audio": + audio_clip = self.process_audio_asset(asset) + else: + raise ValueError(f"Invalid asset type: {asset_type}") + + audio_clips.append(audio_clip) + video = CompositeVideoClip(visual_clips) + if(audio_clips): + audio = CompositeAudioClip(audio_clips) + video.duration = audio.duration + video.audio = audio + if logger: + my_logger = MoviepyProgressLogger(callBackFunction=logger) + video.write_videofile(output_file, codec='libx264', audio_codec='aac', fps=25, preset='veryfast', logger=my_logger) + else: + video.write_videofile(output_file, codec='libx264', audio_codec='aac', fps=25, preset='veryfast') + return output_file + + def generate_audio(self, schema:Dict[str, Any], output_file, logger=None) -> None: + audio_assets = dict(sorted(schema['audio_assets'].items(), key=lambda item: item[1]['z'])) + audio_clips = [] + + for asset_key in audio_assets: + asset = audio_assets[asset_key] + asset_type = asset['type'] + if asset_type == "audio": + audio_clip = self.process_audio_asset(asset) + else: + raise ValueError(f"Invalid asset type: {asset_type}") + + audio_clips.append(audio_clip) + audio = CompositeAudioClip(audio_clips) + audio.fps = 44100 + if logger: + my_logger = MoviepyProgressLogger(callBackFunction=logger) + audio.write_audiofile(output_file, logger=my_logger) + else: + audio.write_audiofile(output_file) + return output_file + # Process common actions + def process_common_actions(self, + clip: Union[VideoFileClip, ImageClip, TextClip, AudioFileClip], + actions: List[Dict[str, Any]]) -> Union[VideoFileClip, AudioFileClip, ImageClip, TextClip]: + for action in actions: + if action['type'] == 'set_time_start': + clip = clip.set_start(action['param']) + continue + + if action['type'] == 'set_time_end': + clip = clip.set_end(action['param']) + continue + + if action['type'] == 'subclip': + clip = clip.subclip(**action['param']) + continue + + return clip + + # Process common visual clip actions + def process_common_visual_actions(self, + clip: Union[VideoFileClip, ImageClip, TextClip], + actions: List[Dict[str, Any]]) -> Union[VideoFileClip, ImageClip, TextClip]: + clip = self.process_common_actions(clip, actions) + for action in actions: + + if action['type'] == 'resize': + clip = clip.resize(**action['param']) + continue + + if action['type'] == 'crop': + clip = clip.crop(**action['param']) + continue + + if action['type'] == 'screen_position': + clip = clip.set_position(**action['param']) + continue + + if action['type'] == 'green_screen': + params = action['param'] + color = params['color'] if params['color'] else [52, 255, 20] + thr = params['thr'] if params['thr'] else 100 + s = params['s'] if params['s'] else 5 + clip = clip.fx(vfx.mask_color, color=color,thr=thr, s=s) + continue + + if action['type'] == 'normalize_image': + clip = clip.fx(self.__normalize_image) + continue + + if action['type'] == 'auto_resize_image': + ar = clip.aspect_ratio + height = action['param']['maxHeight'] + width = action['param']['maxWidth'] + if ar <1: + clip = clip.resize((height*ar, height)) + else: + clip = clip.resize((width, width/ar)) + continue + + return clip + + # Process audio actions + def process_audio_actions(self, clip: AudioFileClip, + actions: List[Dict[str, Any]]) -> AudioFileClip: + clip = self.process_common_actions(clip, actions) + for action in actions: + if action['type'] == 'normalize_music': + clip = clip.fx(audio_normalize) + pass + if action['type'] == 'loop_background_music': + target_duration = action['param'] + start = clip.duration * 0.15 + clip = clip.subclip(start) + clip = clip.fx(audio_loop, duration=target_duration) + pass + + if action['type'] == 'volume_percentage': + clip = clip.volumex(action['param']) + pass + + return clip + + # Process individual asset types + def process_video_asset(self, asset: Dict[str, Any]) -> VideoFileClip: + params = { + 'filename': handle_path(asset['parameters']['url']) + } + if 'audio' in asset['parameters']: + params['audio'] = asset['parameters']['audio'] + clip = VideoFileClip(**params) + return self.process_common_visual_actions(clip, asset['actions']) + + def process_image_asset(self, asset: Dict[str, Any]) -> ImageClip: + clip = ImageClip(asset['parameters']['url']) + return self.process_common_visual_actions(clip, asset['actions']) + + def process_text_asset(self, asset: Dict[str, Any]) -> TextClip: + text_clip_params = asset['parameters'] + + if not (any(key in text_clip_params for key in ['text','fontsize', 'size'])): + raise Exception('You must include at least a size or a fontsize to determine the size of your text') + text_clip_params['txt'] = text_clip_params['text'] + clip_info = {k: text_clip_params[k] for k in ('txt', 'fontsize', 'font', 'color', 'stroke_width', 'stroke_color', 'size', 'kerning', 'method', 'align') if k in text_clip_params} + clip = TextClip(**clip_info) + + return self.process_common_visual_actions(clip, asset['actions']) + + def process_audio_asset(self, asset: Dict[str, Any]) -> AudioFileClip: + clip = AudioFileClip(asset['parameters']['url']) + return self.process_audio_actions(clip, asset['actions']) + + def __normalize_image(self, clip): + def f(get_frame, t): + if f.normalized_frame is not None: + return f.normalized_frame + else: + frame = get_frame(t) + f.normalized_frame = self.__normalize_frame(frame) + return f.normalized_frame + + f.normalized_frame = None + + return clip.fl(f) + + + def __normalize_frame(self, frame): + shape = np.shape(frame) + [dimensions, ] = np.shape(shape) + + if dimensions == 2: + (height, width) = shape + normalized_frame = np.zeros((height, width, 3)) + for y in range(height): + for x in range(width): + grey_value = frame[y][x] + normalized_frame[y][x] = (grey_value, grey_value, grey_value) + return normalized_frame + else: + return frame + + diff --git a/shortGPT/editing_framework/editing_engine.py b/shortGPT/editing_framework/editing_engine.py new file mode 100644 index 0000000000000000000000000000000000000000..e97cf9fca1d96eef436a50ca1753b33385c206af --- /dev/null +++ b/shortGPT/editing_framework/editing_engine.py @@ -0,0 +1,228 @@ +import json +from typing import Any, Dict, List, Union +from enum import Enum +import collections.abc + +from shortGPT.editing_framework.core_editing_engine import CoreEditingEngine + +def update_dict(d, u): + for k, v in u.items(): + if isinstance(v, collections.abc.Mapping): + d[k] = update_dict(d.get(k, {}), v) + else: + d[k] = v + return d + + +class EditingStep(Enum): + CROP_1920x1080 = "crop_1920x1080_to_short.json" + ADD_CAPTION_SHORT = "make_caption.json" + ADD_CAPTION_SHORT_ARABIC = "make_caption_arabic.json" + ADD_CAPTION_LANDSCAPE = "make_caption_landscape.json" + ADD_CAPTION_LANDSCAPE_ARABIC = "make_caption_arabic_landscape.json" + ADD_WATERMARK = "show_watermark.json" + ADD_SUBSCRIBE_ANIMATION = "subscribe_animation.json" + SHOW_IMAGE = "show_top_image.json" + ADD_VOICEOVER_AUDIO = "add_voiceover.json" + ADD_BACKGROUND_MUSIC = "background_music.json" + ADD_REDDIT_IMAGE = "show_reddit_image.json" + ADD_BACKGROUND_VIDEO = "add_background_video.json" + INSERT_AUDIO = "insert_audio.json" + EXTRACT_AUDIO = "extract_audio.json" + ADD_BACKGROUND_VOICEOVER = "add_background_voiceover.json" + +class Flow(Enum): + WHITE_REDDIT_IMAGE_FLOW = "build_reddit_image.json" + +from pathlib import Path + +_here = Path(__file__).parent +STEPS_PATH = (_here / 'editing_steps/').resolve() +FLOWS_PATH = (_here / 'flows/').resolve() + +class EditingEngine: + def __init__(self,): + self.editing_step_tracker = dict((step, 0) for step in EditingStep) + self.schema = {'visual_assets': {}, 'audio_assets': {}} + + def addEditingStep(self, editingStep: EditingStep, args: Dict[str, any] = {}): + json_step = json.loads( + open(STEPS_PATH / f"{editingStep.value}", 'r', encoding='utf-8').read()) + step_name, editingStepDict = list(json_step.items())[0] + if 'inputs' in editingStepDict: + required_args = (editingStepDict['inputs']['actions'] if 'actions' in editingStepDict['inputs'] else []) + (editingStepDict['inputs']['parameters'] if 'parameters' in editingStepDict['inputs'] else []) + for required_argument in required_args: + if required_argument not in args: + raise Exception( + f"Error. '{required_argument}' input missing, you must include it to use this editing step") + if required_args: + pass + action_names = [action['type'] for action in editingStepDict['actions'] + ] if 'actions' in editingStepDict else [] + param_names = [param_name for param_name in editingStepDict['parameters'] + ] if 'parameters' in editingStepDict else [] + for arg_name in args: + if ('inputs' in editingStepDict): + if 'parameters' in editingStepDict['inputs'] and arg_name in param_names: + editingStepDict['parameters'][arg_name] = args[arg_name] + pass + if 'actions' in editingStepDict['inputs'] and arg_name in action_names: + for i, action in enumerate(editingStepDict['actions']): + if action['type'] == arg_name: + editingStepDict['actions'][i]['param'] = args[arg_name] + if editingStepDict['type'] == 'audio': + self.schema['audio_assets'][f"{step_name}_{self.editing_step_tracker[editingStep]}"] = editingStepDict + else: + self.schema['visual_assets'][f"{step_name}_{self.editing_step_tracker[editingStep]}"] = editingStepDict + self.editing_step_tracker[editingStep] += 1 + + + def ingestFlow(self, flow: Flow, args): + json_flow = json.loads(open(FLOWS_PATH / f"{flow.value}", 'r', encoding='utf-8').read()) + for required_argument in list(json_flow['inputs'].keys()): + if required_argument not in args: + raise Exception( + f"Error. '{required_argument}' input missing, you must include it to use this editing step") + update = args[required_argument] + for path_key in reversed(json_flow['inputs'][required_argument].split("/")): + update = {path_key: update} + json_flow = update_dict(json_flow, update) + self.schema = json_flow + + def dumpEditingSchema(self): + return self.schema + + def renderVideo(self, outputPath, logger=None): + engine = CoreEditingEngine() + engine.generate_video(self.schema, outputPath, logger=logger) + def renderImage(self, outputPath, logger=None): + engine = CoreEditingEngine() + engine.generate_image(self.schema, outputPath, logger=logger) + def generateAudio(self, outputPath, logger=None): + engine = CoreEditingEngine() + engine.generate_audio(self.schema, outputPath, logger=logger) + + + +# import json +# from typing import Any, Dict, List, Union +# from enum import Enum +# import collections.abc +# import os +# from shortGPT.editing_framework.core_editing_engine import CoreEditingEngine + +# def update_dict(d, u): +# for k, v in u.items(): +# if isinstance(v, collections.abc.Mapping): +# d[k] = update_dict(d.get(k, {}), v) +# else: +# d[k] = v +# return d + + +# class EditingStep(Enum): +# CROP_1920x1080 = "crop_1920x1080_to_short.json" +# ADD_CAPTION_SHORT = "make_caption.json" +# ADD_CAPTION_SHORT_ARABIC = "make_caption_arabic.json" +# ADD_CAPTION_LANDSCAPE = "make_caption_landscape.json" +# ADD_CAPTION_LANDSCAPE_ARABIC = "make_caption_arabic_landscape.json" +# ADD_WATERMARK = "show_watermark.json" +# ADD_SUBSCRIBE_ANIMATION = "subscribe_animation.json" +# SHOW_IMAGE = "show_top_image.json" +# ADD_VOICEOVER_AUDIO = "add_voiceover.json" +# ADD_BACKGROUND_MUSIC = "background_music.json" +# ADD_REDDIT_IMAGE = "show_reddit_image.json" +# ADD_BACKGROUND_VIDEO = "add_background_video.json" +# INSERT_AUDIO = "insert_audio.json" +# EXTRACT_AUDIO = "extract_audio.json" +# ADD_BACKGROUND_VOICEOVER = "add_background_voiceover.json" + +# class Flow(Enum): +# WHITE_REDDIT_IMAGE_FLOW = "build_reddit_image.json" + +# STEPS_PATH = "shortGPT/editing_framework/editing_steps/" +# FLOWS_PATH = "shortGPT/editing_framework/flows/" + + +# class EditingTrack: +# def __init__(self, filepath=None): +# self.editing_step_tracker = dict((step, 0) for step in EditingStep) +# self.schema = {'visual_assets': {}, 'audio_assets': {}} +# self.filepath = filepath + +# if filepath is not None: +# try: +# self.load_from_file(filepath) +# except FileNotFoundError: +# self.save_to_file(filepath) + +# def addEditingStep(self, editingStep: EditingStep, args: Dict[str, any] = {}): +# json_step = json.loads( +# open(STEPS_PATH+editingStep.value, 'r', encoding='utf-8').read()) +# step_name, editingStepDict = list(json_step.items())[0] +# if 'inputs' in editingStepDict: +# required_args = (editingStepDict['inputs']['actions'] if 'actions' in editingStepDict['inputs'] else []) + (editingStepDict['inputs']['parameters'] if 'parameters' in editingStepDict['inputs'] else []) +# for required_argument in required_args: +# if required_argument not in args: +# raise Exception( +# f"Error. '{required_argument}' input missing, you must include it to use this editing step") +# if required_args: +# pass +# action_names = [action['type'] for action in editingStepDict['actions'] +# ] if 'actions' in editingStepDict else [] +# param_names = [param_name for param_name in editingStepDict['parameters'] +# ] if 'parameters' in editingStepDict else [] +# for arg_name in args: +# if ('inputs' in editingStepDict): +# if 'parameters' in editingStepDict['inputs'] and arg_name in param_names: +# editingStepDict['parameters'][arg_name] = args[arg_name] +# pass +# if 'actions' in editingStepDict['inputs'] and arg_name in action_names: +# for i, action in enumerate(editingStepDict['actions']): +# if action['type'] == arg_name: +# editingStepDict['actions'][i]['param'] = args[arg_name] +# if editingStepDict['type'] == 'audio': +# self.schema['audio_assets'][f"{step_name}_{self.editing_step_tracker[editingStep]}"] = editingStepDict +# else: +# self.schema['visual_assets'][f"{step_name}_{self.editing_step_tracker[editingStep]}"] = editingStepDict +# self.editing_step_tracker[editingStep] += 1 + + +# def ingestFlow(self, flow: Flow, args): +# json_flow = json.loads(open(FLOWS_PATH+flow.value, 'r', encoding='utf-8').read()) +# for required_argument in list(json_flow['inputs'].keys()): +# if required_argument not in args: +# raise Exception( +# f"Error. '{required_argument}' input missing, you must include it to use this editing step") +# update = args[required_argument] +# for path_key in reversed(json_flow['inputs'][required_argument].split("/")): +# update = {path_key: update} +# json_flow = update_dict(json_flow, update) +# self.schema = json_flow + +# def dumpEditingSchema(self): +# return self.schema + +# def save_to_file(self): +# if self.file_path: +# with open(self.file_path, 'w') as f: +# json.dump({'step_tracker': {key.name: value for key, value in self.step_tracker.items()}, 'asset_schema': self.asset_schema}, f) + +# def load_from_file(self): +# if self.file_path and os.path.exists(self.file_path): +# with open(self.file_path, 'r') as f: +# data = json.load(f) +# self.step_tracker = {EditingStep[key]: value for key, value in data.get('step_tracker', {}).items()} +# self.asset_schema = data.get('asset_schema', {'visual_assets': {}, 'audio_assets': {}}) +# else: +# raise Exception("File does not exist") + +# def renderVideo(self, outputPath, logger=None): +# engine = CoreEditingEngine() +# engine.generate_video(self.schema, outputPath, logger=logger) +# def renderImage(self, outputPath, logger=None): +# engine = CoreEditingEngine() +# engine.generate_image(self.schema, outputPath, logger=logger) +# def generateAudio(self, outputPath, logger=None): +# engine = CoreEditingEngine() +# engine.generate_audio(self.schema, outputPath, logger=logger) \ No newline at end of file diff --git a/shortGPT/editing_framework/editing_steps/__init__.py b/shortGPT/editing_framework/editing_steps/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/shortGPT/editing_framework/editing_steps/add_background_video.json b/shortGPT/editing_framework/editing_steps/add_background_video.json new file mode 100644 index 0000000000000000000000000000000000000000..0f73615c48b7863067c4a3b2be1b60fa6fc6bbc8 --- /dev/null +++ b/shortGPT/editing_framework/editing_steps/add_background_video.json @@ -0,0 +1,24 @@ +{ + "background_video": { + "type": "video", + "z": 0, + "inputs":{ + "parameters": ["url"], + "actions": ["set_time_start", "set_time_end"] + }, + "parameters": { + "url": null, + "audio": false + }, + "actions": [ + { + "type": "set_time_start", + "param": null + }, + { + "type": "set_time_end", + "param": null + } + ] + } +} \ No newline at end of file diff --git a/shortGPT/editing_framework/editing_steps/add_background_voiceover.json b/shortGPT/editing_framework/editing_steps/add_background_voiceover.json new file mode 100644 index 0000000000000000000000000000000000000000..1981c788e1ae73da9a2627c5a93fd1eaef64f107 --- /dev/null +++ b/shortGPT/editing_framework/editing_steps/add_background_voiceover.json @@ -0,0 +1,19 @@ +{ + "background_voiceover": { + "inputs": { + "parameters": ["url"], + "actions": ["volume_percentage"] + }, + "type": "audio", + "z": -1, + "parameters": { + "url": null + }, + "actions": [ + { + "type": "volume_percentage", + "param": null + } + ] + } +} \ No newline at end of file diff --git a/shortGPT/editing_framework/editing_steps/add_voiceover.json b/shortGPT/editing_framework/editing_steps/add_voiceover.json new file mode 100644 index 0000000000000000000000000000000000000000..4c85875db60455b291c5178be44c9a4b74f60a51 --- /dev/null +++ b/shortGPT/editing_framework/editing_steps/add_voiceover.json @@ -0,0 +1,17 @@ +{ + "voiceover": { + "inputs": { + "parameters": [ + "url" + ] + }, + "type": "audio", + "z": -1, + "parameters": { + "url": null + }, + "actions": [ + + ] + } +} \ No newline at end of file diff --git a/shortGPT/editing_framework/editing_steps/background_music.json b/shortGPT/editing_framework/editing_steps/background_music.json new file mode 100644 index 0000000000000000000000000000000000000000..03f335cf1443f69f383aa54d584e9b5b634701bc --- /dev/null +++ b/shortGPT/editing_framework/editing_steps/background_music.json @@ -0,0 +1,29 @@ +{ + "background_music": { + "inputs": { + "parameters": ["url", "volume_percentage"], + "actions":["loop_background_music"] + }, + "type": "audio", + "z": -1, + "parameters": { + "url": null + }, + "actions": [ + { + "type": "loop_background_music", + "param": { + "duration": null + } + }, + { + "type":"normalize_audio", + "param":{} + }, + { + "type": "volume_percentage", + "param": null + } + ] + } +} \ No newline at end of file diff --git a/shortGPT/editing_framework/editing_steps/crop_1920x1080_to_short.json b/shortGPT/editing_framework/editing_steps/crop_1920x1080_to_short.json new file mode 100644 index 0000000000000000000000000000000000000000..72a36b3a089eaec438b434ba6eb024b0986be935 --- /dev/null +++ b/shortGPT/editing_framework/editing_steps/crop_1920x1080_to_short.json @@ -0,0 +1,40 @@ +{ + "background_video": { + "type": "video", + "z": 0, + "inputs":{ + "parameters": ["url"] + }, + "parameters": { + "url": null, + "audio": false + }, + "actions": [ + { + "type": "crop", + "param": { + "x1": 420, + "y1": 0, + "width": 1080, + "height": 1080 + } + }, + { + "type": "resize", + "param": { + "width": 1920, + "height": 1920 + } + }, + { + "type": "crop", + "param": { + "x1": 420, + "y1": 0, + "width": 1080, + "height": 1920 + } + } + ] + } +} \ No newline at end of file diff --git a/shortGPT/editing_framework/editing_steps/extract_audio.json b/shortGPT/editing_framework/editing_steps/extract_audio.json new file mode 100644 index 0000000000000000000000000000000000000000..35a4df12019b7838dbadb9581cd7b1639ac03f4a --- /dev/null +++ b/shortGPT/editing_framework/editing_steps/extract_audio.json @@ -0,0 +1,27 @@ +{ + "extract_audio": { + "inputs": { + "parameters": ["url"], + "actions": ["subclip", "set_time_start", "set_time_end"] + }, + "type": "audio", + "z": -2, + "parameters": { + "url": null + }, + "actions": [ + { + "type": "subclip", + "param": null + }, + { + "type": "set_time_start", + "param": null + }, + { + "type": "set_time_end", + "param": null + } + ] + } +} \ No newline at end of file diff --git a/shortGPT/editing_framework/editing_steps/insert_audio.json b/shortGPT/editing_framework/editing_steps/insert_audio.json new file mode 100644 index 0000000000000000000000000000000000000000..6b9d2bafe320349dc5930bbaf96d9edff0a1caa4 --- /dev/null +++ b/shortGPT/editing_framework/editing_steps/insert_audio.json @@ -0,0 +1,23 @@ +{ + "insert_audio": { + "inputs": { + "parameters": ["url"], + "actions": ["set_time_start", "set_time_end"] + }, + "type": "audio", + "z": -1, + "parameters": { + "url": null + }, + "actions": [ + { + "type":"set_time_start", + "param":null + }, + { + "type": "set_time_end", + "param": null + } + ] + } +} \ No newline at end of file diff --git a/shortGPT/editing_framework/editing_steps/make_caption.json b/shortGPT/editing_framework/editing_steps/make_caption.json new file mode 100644 index 0000000000000000000000000000000000000000..9d4207a824a9b30d6cd193283b6952c70ae33fcb --- /dev/null +++ b/shortGPT/editing_framework/editing_steps/make_caption.json @@ -0,0 +1,39 @@ +{ + "caption": { + "type": "text", + "z": 4, + "inputs": { + "parameters": ["text"], + "actions": ["set_time_start", "set_time_end"] + }, + "parameters": { + "text": null, + "fontsize": 100, + "font": "public/Anta-Regular.ttf", + "color": "white", + "highlight_color": "#FFD700", + "stroke_width": 3, + "stroke_color": "black", + "method": "caption", + "size": [900, null], + "words_to_show": 4, + "highlight_method": "dynamic_word" + }, + "actions": [ + { + "type": "set_time_start", + "param": null + }, + { + "type": "set_time_end", + "param": null + }, + { + "type": "screen_position", + "param": { + "pos": "center" + } + } + ] + } +} diff --git a/shortGPT/editing_framework/editing_steps/make_caption_arabic.json b/shortGPT/editing_framework/editing_steps/make_caption_arabic.json new file mode 100644 index 0000000000000000000000000000000000000000..cfb0f883aaf5aa05c0b9c5f67a20a9576e7beb94 --- /dev/null +++ b/shortGPT/editing_framework/editing_steps/make_caption_arabic.json @@ -0,0 +1,39 @@ +{ + "caption": { + "type": "text", + "z": 4, + "inputs":{ + "parameters": ["text"], + "actions": ["set_time_start", "set_time_end"] + }, + "parameters": { + "text": null, + "fontsize": 150, + "font": "Roboto-Bold", + "color": "white", + "stroke_width": 2, + "stroke_color": "black", + "method": "caption", + "size": [ + 900, + null + ] + }, + "actions": [ + { + "type": "set_time_start", + "param": null + }, + { + "type": "set_time_end", + "param": null + }, + { + "type": "screen_position", + "param": { + "pos": "center" + } + } + ] + } +} \ No newline at end of file diff --git a/shortGPT/editing_framework/editing_steps/make_caption_arabic_landscape.json b/shortGPT/editing_framework/editing_steps/make_caption_arabic_landscape.json new file mode 100644 index 0000000000000000000000000000000000000000..2988c6aba736f181c7ff580da4ecfcf1e402f405 --- /dev/null +++ b/shortGPT/editing_framework/editing_steps/make_caption_arabic_landscape.json @@ -0,0 +1,34 @@ +{ + "caption": { + "type": "text", + "z": 4, + "inputs":{ + "parameters": ["text"], + "actions": ["set_time_start", "set_time_end"] + }, + "parameters": { + "text": null, + "fontsize": 105, + "font": "Roboto-Bold", + "color": "white", + "stroke_width": 2, + "stroke_color": "black" + }, + "actions": [ + { + "type": "set_time_start", + "param": null + }, + { + "type": "set_time_end", + "param": null + }, + { + "type": "screen_position", + "param": { + "pos": ["center", 800] + } + } + ] + } +} \ No newline at end of file diff --git a/shortGPT/editing_framework/editing_steps/make_caption_landscape.json b/shortGPT/editing_framework/editing_steps/make_caption_landscape.json new file mode 100644 index 0000000000000000000000000000000000000000..1cb5f2a390908fa86c17357d9c9eebda81f275c7 --- /dev/null +++ b/shortGPT/editing_framework/editing_steps/make_caption_landscape.json @@ -0,0 +1,35 @@ +{ + "caption": { + "type": "text", + "z": 4, + "inputs":{ + "parameters": ["text"], + "actions": ["set_time_start", "set_time_end"] + }, + "parameters": { + "text": null, + "fontsize": 70, + "font": "public/Anta-Regular.ttf", + "color": "white", + "stroke_width": 3, + "stroke_color": "black", + "method": "label" + }, + "actions": [ + { + "type": "set_time_start", + "param": null + }, + { + "type": "set_time_end", + "param": null + }, + { + "type": "screen_position", + "param": { + "pos": ["center", 820] + } + } + ] + } +} diff --git a/shortGPT/editing_framework/editing_steps/show_reddit_image.json b/shortGPT/editing_framework/editing_steps/show_reddit_image.json new file mode 100644 index 0000000000000000000000000000000000000000..a445ea74fb8379275577dbaf0d1000d675ffc71e --- /dev/null +++ b/shortGPT/editing_framework/editing_steps/show_reddit_image.json @@ -0,0 +1,31 @@ +{ + "reddit_image": { + "type": "image", + "inputs":{ + "parameters": ["url"] + }, + "z": 5, + "parameters": { + "url": null + }, + "actions": [ + { + "type": "set_time_start", + "param": 0 + }, + { + "type": "set_time_end", + "param": 3.5 + }, + + { + "type": "screen_position", + "param": { + "pos": [ + "center","center" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/shortGPT/editing_framework/editing_steps/show_top_image.json b/shortGPT/editing_framework/editing_steps/show_top_image.json new file mode 100644 index 0000000000000000000000000000000000000000..4dc9e221ce5797c547f4885410fa7d3340afd503 --- /dev/null +++ b/shortGPT/editing_framework/editing_steps/show_top_image.json @@ -0,0 +1,46 @@ +{ + "top_image_1": { + "type": "image", + "inputs":{ + "parameters": ["url"], + "actions": ["set_time_start", "set_time_end"] + }, + "z": 5, + "parameters": { + "url": null + }, + "actions": [ + { + "type": "set_time_start", + "param": null + }, + { + "type": "set_time_end", + "param": null + }, + { + "type": "auto_resize_image", + "param":{ + "maxWidth": 690, + "maxHeight": 690 + } + }, + { + "type": "normalize_image", + "param":{ + "maxWidth": 690, + "maxHeight": 690 + } + }, + { + "type": "screen_position", + "param": { + "pos": [ + "center", + 50 + ] + } + } + ] + } +} \ No newline at end of file diff --git a/shortGPT/editing_framework/editing_steps/show_watermark.json b/shortGPT/editing_framework/editing_steps/show_watermark.json new file mode 100644 index 0000000000000000000000000000000000000000..b566aa6f12da0f96af0da663a5b98ca4a3a8ac7f --- /dev/null +++ b/shortGPT/editing_framework/editing_steps/show_watermark.json @@ -0,0 +1,34 @@ +{ + "short_watermark": { + "inputs":{ + "parameters": ["text"] + }, + "type": "text", + "z": 3, + "parameters": { + "text": null, + "fontsize": 80, + "font": "Roboto-Bold", + "color": "white", + "stroke_width": 1, + "stroke_color": "black", + "method": "caption", + "size": [ + 650, + 400 + ] + }, + "actions": [ + { + "type": "screen_position", + "param": { + "pos": [ + "center", + 0.7 + ], + "relative": true + } + } + ] + } +} \ No newline at end of file diff --git a/shortGPT/editing_framework/editing_steps/subscribe_animation.json b/shortGPT/editing_framework/editing_steps/subscribe_animation.json new file mode 100644 index 0000000000000000000000000000000000000000..fdd790355ed9a2df9e22662b465810d246646d2a --- /dev/null +++ b/shortGPT/editing_framework/editing_steps/subscribe_animation.json @@ -0,0 +1,44 @@ +{ + "subscribe_animation": { + "type": "video", + "z": 6, + "inputs":{ + "parameters": ["url"] + }, + "parameters": { + "url": null, + "audio": false + }, + "actions": [ + { + "type": "set_time_start", + "param": 3.5 + }, + { + "type": "resize", + "param": { + "newsize": 0.4 + } + }, + { + "type": "green_screen", + "param": { + "color": [ + 52, + 255, + 20 + ], + "thr": 100, + "s": 5 + } + }, + { + "type": "screen_position", + "param": { + "pos": ["center", + 1160] + } + } + ] + } +} \ No newline at end of file diff --git a/shortGPT/editing_framework/flows/__init__.py b/shortGPT/editing_framework/flows/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/shortGPT/editing_framework/flows/build_reddit_image.json b/shortGPT/editing_framework/flows/build_reddit_image.json new file mode 100644 index 0000000000000000000000000000000000000000..e324f7fe2294bf94207d289eaef8f82a4437058c --- /dev/null +++ b/shortGPT/editing_framework/flows/build_reddit_image.json @@ -0,0 +1,103 @@ +{ + "inputs":{ + "username_text": "visual_assets/username_txt/parameters/text", + "ncomments_text": "visual_assets/ncomments_txt/parameters/text", + "nupvote_text": "visual_assets/nupvote_txt/parameters/text", + "question_text": "visual_assets/question_txt/parameters/text" + }, + "visual_assets":{ + "white_reddit_template_image": { + "type": "image", + "z": 0, + "parameters": { + "url": "public/white_reddit_template.png" + }, + "actions": [ + ] + }, + "username_txt": { + "type": "text", + "z": 1, + "parameters": { + "text": null, + "fontsize": 32, + "font" : "Roboto", + "color": "rgb(129, 131, 132)", + "kerning": -0.7 + }, + "actions": [ + { + "type": "screen_position", + "param": { + "pos":[350, 43], + "relative": false + } + } + ] + }, + "ncomments_txt":{ + "type": "text", + "z": 1, + "parameters": { + "text": null, + "fontsize": 34, + "font" : "Roboto-Bold", + "color": "rgb(129, 131, 132)", + "kerning": -0.7 + }, + "actions": [ + { + "type": "screen_position", + "param": { + "pos":[222, 301], + "relative": false + } + } + ] + }, + "nupvote_txt":{ + "type": "text", + "z": 1, + "parameters": { + "text": null, + "fontsize": 36, + "font" : "Roboto-Bold", + "color": "rgb(26, 26 , 27)", + "kerning": -0.7 + }, + "actions": [ + { + "type": "screen_position", + "param": { + "pos":[28, 115], + "relative": false + } + } + ] + }, + "question_txt": { + "type": "text", + "z": 1, + "parameters": { + "text": null, + "fontsize": 40, + "font" : "Roboto-Bold", + "color": "rgb(26, 26, 27)", + "size": [850, null], + "method": "caption", + "align": "West", + "kerning": -1.7 + }, + "actions": [ + { + "type": "screen_position", + "param": { + "pos":[150, 110], + "relative": false + } + } + ] + } + + } +} \ No newline at end of file diff --git a/shortGPT/editing_framework/rendering_logger.py b/shortGPT/editing_framework/rendering_logger.py new file mode 100644 index 0000000000000000000000000000000000000000..4aff73874d5992f3a738a2e14606fe4d3af18786 --- /dev/null +++ b/shortGPT/editing_framework/rendering_logger.py @@ -0,0 +1,24 @@ +from proglog import ProgressBarLogger +import time + +class MoviepyProgressLogger(ProgressBarLogger): + + def __init__(self, callBackFunction = None): + super().__init__() + self.callBackFunction = callBackFunction + self.start_time = time.time() + + def bars_callback(self, bar, attr, value, old_value=None): + # Every time the logger progress is updated, this function is called + percentage = (value / self.bars[bar]['total']) * 100 + elapsed_time = time.time() - self.start_time + estimated_time = (elapsed_time / percentage) * (100 - percentage) if percentage != 0 else 0 + progress_string = f'Rendering progress : {value}/{self.bars[bar]["total"]} | Time spent: {self.format_time(elapsed_time)} | Time left: {self.format_time(estimated_time)}' + if (self.callBackFunction): + self.callBackFunction(progress_string) + else: + print(progress_string) + + def format_time(self, seconds): + minutes, seconds = divmod(seconds, 60) + return f'{int(minutes)}m {int(seconds)}s' diff --git a/shortGPT/editing_utils/README.md b/shortGPT/editing_utils/README.md new file mode 100644 index 0000000000000000000000000000000000000000..8a106a647b7c00ca0b58b6e3bb833bdb1c67999d --- /dev/null +++ b/shortGPT/editing_utils/README.md @@ -0,0 +1,55 @@ +# Module: editing_utils + +The `editing_utils` module provides utility functions for editing videos and images. It consists of three files: `editing_images.py`, `captions.py`, and `handle_videos.py`. + +## File: editing_images.py + +This file contains functions related to editing images. + +### Function: getImageUrlsTimed(imageTextPairs) + +This function takes a list of image-text pairs and returns a list of tuples containing the image URL and the corresponding text. It uses the `searchImageUrlsFromQuery` function to search for image URLs based on the provided text. + +### Function: searchImageUrlsFromQuery(query, top=3, expected_dim=[720,720], retries=5) + +This function searches for image URLs based on a given query. It uses the `getBingImages` function from the `shortGPT.api_utils.image_api` module to fetch the images. The `top` parameter specifies the number of images to fetch (default is 3), and the `expected_dim` parameter specifies the expected dimensions of the images (default is [720,720]). If no images are found, the function returns None. Otherwise, it selects the images with the closest dimensions to the expected dimensions and returns the URL of the first image. + +## File: captions.py + +This file contains functions related to handling captions. + +### Function: interpolateTimeFromDict(word_position, d) + +This function interpolates the time based on the word position in a dictionary. The dictionary contains word positions as keys and corresponding timestamps as values. Given a word position, the function returns the interpolated timestamp. + +### Function: cleanWord(word) + +This function cleans a word by removing any non-alphanumeric characters. + +### Function: getTimestampMapping(whisper_analysis) + +This function extracts the mapping of word positions to timestamps from a Whisper analysis. The `whisper_analysis` parameter is a dictionary containing the analysis results. The function returns a dictionary with word positions as keys and corresponding timestamps as values. + +### Function: splitWordsBySize(words, maxCaptionSize) + +This function splits a list of words into captions based on a maximum caption size. The `maxCaptionSize` parameter specifies the maximum number of characters allowed in a caption (default is 15). The function returns a list of captions. + +### Function: getCaptionsWithTime(whisper_analysis, maxCaptionSize=15) + +This function generates captions with their corresponding timestamps from a Whisper analysis. The `whisper_analysis` parameter is a dictionary containing the analysis results. The `maxCaptionSize` parameter specifies the maximum number of characters allowed in a caption (default is 15). The function uses the `getTimestampMapping` function to get the word position to timestamp mapping and the `splitWordsBySize` function to split the words into captions. It returns a list of caption-time pairs. + +## File: handle_videos.py + +This file contains functions related to handling videos. + +### Function: getYoutubeAudio(url) + +This function retrieves the audio URL and duration from a YouTube video. The `url` parameter specifies the URL of the YouTube video. The function uses the `yt_dlp` library to extract the audio information. It returns the audio URL and duration as a tuple. If the retrieval fails, it returns None. + +### Function: getYoutubeVideoLink(url) + +This function retrieves the video URL and duration from a YouTube video. The `url` parameter specifies the URL of the YouTube video. The function uses the `yt_dlp` library to extract the video information. It returns the video URL and duration as a tuple. If the retrieval fails, it returns None. + +### Function: extract_random_clip_from_video(video_url, video_duration, clip_duration, output_file) + +This function extracts a random clip from a video and saves it to an output file. The `video_url` parameter specifies the URL of the video, the `video_duration` parameter specifies the duration of the video, the `clip_duration` parameter specifies the duration of the desired clip, and the `output_file` parameter specifies the file path for the extracted clip. The function uses the `ffmpeg` library to perform the extraction. It randomly selects a start time within 15% to 85% of the video duration and extracts a clip of the specified duration starting from the selected start time. If the extraction fails or the output file is not created, an exception is raised. \ No newline at end of file diff --git a/shortGPT/editing_utils/__init__.py b/shortGPT/editing_utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..cab35dfe994d156c0197810ca2827548972cd5f0 --- /dev/null +++ b/shortGPT/editing_utils/__init__.py @@ -0,0 +1,2 @@ +from . import editing_images +from . import captions \ No newline at end of file diff --git a/shortGPT/editing_utils/captions.py b/shortGPT/editing_utils/captions.py new file mode 100644 index 0000000000000000000000000000000000000000..e14c445c30e16fc8ee1cb2c25d3793c2599d84da --- /dev/null +++ b/shortGPT/editing_utils/captions.py @@ -0,0 +1,71 @@ +import re + +def getSpeechBlocks(whispered, silence_time=2): + text_blocks, (st, et, txt) = [], (0,0,"") + for i, seg in enumerate(whispered['segments']): + if seg['start'] - et > silence_time: + if txt: text_blocks.append([[st, et], txt]) + (st, et, txt) = (seg['start'], seg['end'], seg['text']) + else: + et, txt = seg['end'], txt + seg['text'] + + if txt: text_blocks.append([[st, et], txt]) # For last text block + + return text_blocks + +def cleanWord(word): + return re.sub(r'[^\w\s\-_"\'\']', '', word) + +def interpolateTimeFromDict(word_position, d): + for key, value in d.items(): + if key[0] <= word_position <= key[1]: + return value + return None + +def getTimestampMapping(whisper_analysis): + index = 0 + locationToTimestamp = {} + for segment in whisper_analysis['segments']: + for word in segment['words']: + newIndex = index + len(word['text'])+1 + locationToTimestamp[(index, newIndex)] = word['end'] + index = newIndex + return locationToTimestamp + + +def splitWordsBySize(words, maxCaptionSize): + halfCaptionSize = maxCaptionSize / 2 + captions = [] + while words: + caption = words[0] + words = words[1:] + while words and len(caption + ' ' + words[0]) <= maxCaptionSize: + caption += ' ' + words[0] + words = words[1:] + if len(caption) >= halfCaptionSize and words: + break + captions.append(caption) + return captions + +def getCaptionsWithTime(whisper_analysis, maxCaptionSize=15, considerPunctuation=False): + wordLocationToTime = getTimestampMapping(whisper_analysis) + position = 0 + start_time = 0 + CaptionsPairs = [] + text = whisper_analysis['text'] + + if considerPunctuation: + sentences = re.split(r'(?<=[.!?]) +', text) + words = [word for sentence in sentences for word in splitWordsBySize(sentence.split(), maxCaptionSize)] + else: + words = text.split() + words = [cleanWord(word) for word in splitWordsBySize(words, maxCaptionSize)] + + for word in words: + position += len(word) + 1 + end_time = interpolateTimeFromDict(position, wordLocationToTime) + if end_time and word: + CaptionsPairs.append(((start_time, end_time), word)) + start_time = end_time + + return CaptionsPairs \ No newline at end of file diff --git a/shortGPT/editing_utils/editing_images.py b/shortGPT/editing_utils/editing_images.py new file mode 100644 index 0000000000000000000000000000000000000000..da162120cc931038d2d29fcb7b51e0e5c39da3ef --- /dev/null +++ b/shortGPT/editing_utils/editing_images.py @@ -0,0 +1,20 @@ +from shortGPT.api_utils.image_api import getBingImages +from tqdm import tqdm +import random +import math + +def getImageUrlsTimed(imageTextPairs): + return [(pair[0], searchImageUrlsFromQuery(pair[1])) for pair in tqdm(imageTextPairs, desc='Search engine queries for images...')] + + + +def searchImageUrlsFromQuery(query, top=3, expected_dim=[720,720], retries=5): + images = getBingImages(query, retries=retries) + if(images): + distances = list(map(lambda x: math.dist([x['width'], x['height']], expected_dim), images[0:top])) + shortest_ones = sorted(distances) + random.shuffle(shortest_ones) + for distance in shortest_ones: + image_url = images[distances.index(distance)]['url'] + return image_url + return None \ No newline at end of file diff --git a/shortGPT/editing_utils/handle_videos.py b/shortGPT/editing_utils/handle_videos.py new file mode 100644 index 0000000000000000000000000000000000000000..7c562c2dd1eb2a7fd39e59aba5500f39dc4a4bf2 --- /dev/null +++ b/shortGPT/editing_utils/handle_videos.py @@ -0,0 +1,88 @@ +import ffmpeg +import os +import random +import yt_dlp +import subprocess +import json + +def getYoutubeVideoLink(url): + if 'shorts' in url: + ydl_opts = { + "quiet": True, + "no_warnings": True, + "no_color": True, + "no_call_home": True, + "no_check_certificate": True, + "format": "bestvideo[height<=1920]" + } + else: + ydl_opts = { + "quiet": True, + "no_warnings": True, + "no_color": True, + "no_call_home": True, + "no_check_certificate": True, + "format": "bestvideo[height<=1080]" + } + try: + with yt_dlp.YoutubeDL(ydl_opts) as ydl: + dictMeta = ydl.extract_info( + url, + download=False) + return dictMeta['url'], dictMeta['duration'] + except Exception as e: + print("Failed getting video link from the following video/url", e.args[0]) + return None, None + +def extract_random_clip_from_video(video_url, video_duration, clip_duration , output_file): + print(video_url, video_duration, clip_duration , output_file) + """Extracts a clip from a video using a signed URL. + Args: + video_url (str): The signed URL of the video. + video_url (int): Duration of the video. + start_time (int): The start time of the clip in seconds. + clip_duration (int): The duration of the clip in seconds. + output_file (str): The output file path for the extracted clip. + """ + if not video_duration: + raise Exception("Could not get video duration") + if not video_duration*0.7 > 120: + raise Exception("Video too short") + start_time = video_duration*0.15 + random.random()* (0.7*video_duration-clip_duration) + + ( + ffmpeg + .input(video_url, ss=start_time, t=clip_duration) + .output(output_file, codec="libx264", preset="ultrafast") + .run() + ) + if not os.path.exists(output_file): + raise Exception("Random clip failed to be written") + return output_file + + +def get_aspect_ratio(video_file): + cmd = 'ffprobe -i "{}" -v quiet -print_format json -show_format -show_streams'.format(video_file) +# jsonstr = subprocess.getoutput(cmd) + jsonstr = subprocess.check_output(cmd, shell=True, encoding='utf-8') + r = json.loads(jsonstr) + # look for "codec_type": "video". take the 1st one if there are mulitple + video_stream_info = [x for x in r['streams'] if x['codec_type']=='video'][0] + if 'display_aspect_ratio' in video_stream_info and video_stream_info['display_aspect_ratio']!="0:1": + a,b = video_stream_info['display_aspect_ratio'].split(':') + dar = int(a)/int(b) + else: + # some video do not have the info of 'display_aspect_ratio' + w,h = video_stream_info['width'], video_stream_info['height'] + dar = int(w)/int(h) + ## not sure if we should use this + #cw,ch = video_stream_info['coded_width'], video_stream_info['coded_height'] + #sar = int(cw)/int(ch) + if 'sample_aspect_ratio' in video_stream_info and video_stream_info['sample_aspect_ratio']!="0:1": + # some video do not have the info of 'sample_aspect_ratio' + a,b = video_stream_info['sample_aspect_ratio'].split(':') + sar = int(a)/int(b) + else: + sar = dar + par = dar/sar + return dar \ No newline at end of file diff --git a/shortGPT/engine/README.md b/shortGPT/engine/README.md new file mode 100644 index 0000000000000000000000000000000000000000..b965ec201844c3e78b176b47d2f03eb6a09be24a --- /dev/null +++ b/shortGPT/engine/README.md @@ -0,0 +1,127 @@ +# **Module: engine** + +This module contains the main engine classes for generating different types of short videos. There are four main engine classes in this module: + +- `AbstractContentEngine`: This is an abstract base class that provides the basic functionalities and attributes required by all content engines. It implements common methods for initializing the content engine, preparing editing paths, verifying parameters, and rendering the short video. + +- `ContentShortEngine`: This class extends `AbstractContentEngine` and is used for generating general content short videos. It implements specific methods for generating a script, generating temporary audio, speeding up the audio, timing captions, generating image search terms, generating image URLs, choosing background music and video, and preparing background and custom assets. It also overrides the `__generateScript` method to generate the script for the content short video. + +- `ContentVideoEngine`: This class extends `AbstractContentEngine` and is used for generating general content videos. It implements specific methods for generating temporary audio, speeding up the audio, timing captions, generating video search terms, generating video URLs, choosing background music, and preparing background and custom assets. + +- `FactsShortEngine`: This class extends `ContentShortEngine` and is used for generating facts short videos. It overrides the `_generateScript` method to generate the script for the facts short video. + +- `RedditShortEngine`: This class extends `ContentShortEngine` and is used for generating reddit short videos. It overrides the `_generateScript` method to generate the script for the reddit short video and adds a custom step for preparing a reddit image. + +--- + +## **File: abstract_content_engine.py** + +This file contains the `AbstractContentEngine` class, which is an abstract base class for all content engines. It provides the basic functionalities and attributes required by all content engines. + +### **Class: AbstractContentEngine** + +#### **Attributes:** + +- `CONTENT_DB`: An instance of the `ContentDatabase` class, which is used to store and retrieve content data. + +#### **Methods:** + +- `__init__(self, short_id: str, content_type:str, language: Language, voiceName: str)`: Initializes an instance of the `AbstractContentEngine` class with the given parameters. It sets the `dataManager`, `id`, `_db_language`, `voiceModule`, `assetStore`, `stepDict`, and `logger` attributes. + +- `__getattr__(self, name)`: Overrides the `__getattr__` method to retrieve attributes that start with '_db_' from the `dataManager`. + +- `__setattr__(self, name, value)`: Overrides the `__setattr__` method to save attributes that start with '_db_' to the `dataManager`. + +- `prepareEditingPaths(self)`: Creates the directory for storing dynamic assets if it doesn't already exist. + +- `verifyParameters(*args, **kwargs)`: Verifies that all the required parameters are not null. If any parameter is null, it raises an exception. + +- `isShortDone(self)`: Checks if the short video is done rendering by checking the value of the '_db_ready_to_upload' attribute. + +- `makeContent(self)`: Generates the short video by executing the steps defined in the `stepDict`. It yields the current step number and a message indicating the progress. + +- `get_video_output_path(self)`: Returns the path of the rendered video. + +- `get_total_steps(self)`: Returns the total number of steps in the `stepDict`. + +- `set_logger(self, logger)`: Sets the logger function for logging the progress of the short video rendering. + +- `initializeMagickAndFFMPEG(self)`: Initializes the paths for FFmpeg, FFProbe, and ImageMagick. If any of these programs are not found, it raises an exception. + +--- + +## **File: content_short_engine.py** + +This file contains the `ContentShortEngine` class, which is used for generating general content short videos. It extends the `AbstractContentEngine` class and adds specific methods for generating a script, generating temporary audio, speeding up the audio, timing captions, generating image search terms, generating image URLs, choosing background music and video, and preparing background and custom assets. + +### **Class: ContentShortEngine** + +#### **Attributes:** + +- `stepDict`: A dictionary that maps step numbers to their corresponding methods for generating the short video. + +#### **Methods:** + +- `__init__(self, short_type: str, background_video_name: str, background_music_name: str, short_id="", num_images=None, watermark=None, language: Language = Language.ENGLISH, voiceName="")`: Initializes an instance of the `ContentShortEngine` class with the given parameters. It sets the `stepDict` attribute with the specific methods for generating the short video. + +- `__generateScript(self)`: Abstract method that generates the script for the content short video. This method needs to be implemented by the child classes. + +- `__prepareCustomAssets(self)`: Abstract method that prepares the custom assets for the content short video. This method needs to be implemented by the child classes. + +- `__editAndRenderShort(self)`: Abstract method that performs the editing and rendering of the content short video. This method needs to be implemented by the child classes. + +--- + +## **File: content_video_engine.py** + +This file contains the `ContentVideoEngine` class, which is used for generating general content videos. It extends the `AbstractContentEngine` class and adds specific methods for generating temporary audio, speeding up the audio, timing captions, generating video search terms, generating video URLs, choosing background music, and preparing background and custom assets. + +### **Class: ContentVideoEngine** + +#### **Methods:** + +- `__generateTempAudio(self)`: Generates the temporary audio for the content video by using the `voiceModule` to generate a voice from the script. + +- `__speedUpAudio(self)`: Speeds up the temporary audio to match the duration of the background video. + +- `__timeCaptions(self)`: Converts the audio to text and then generates captions with time based on the text. + +- `__generateVideoSearchTerms(self)`: Generates the video search terms by using the timed captions. + +- `__generateVideoUrls(self)`: Generates the video URLs by using the video search terms and the `getBestVideo` function from the `pexels_api`. + +- `__chooseBackgroundMusic(self)`: Retrieves the background music URL from the `assetStore` based on the background music name. + +- `__prepareBackgroundAssets(self)`: Prepares the background assets for the content video by retrieving the voiceover audio duration, trimming the background video, and extracting a random clip from the background video. + +- `__prepareCustomAssets(self)`: Abstract method that prepares the custom assets for the content video. This method needs to be implemented by the child classes. + +- `__editAndRenderShort(self)`: Performs the editing and rendering of the content video by using the `videoEditor` and the editing steps defined in the `stepDict`. + +--- + +## **File: facts_short_engine.py** + +This file contains the `FactsShortEngine` class, which is used for generating facts short videos. It extends the `ContentShortEngine` class and overrides the `_generateScript` method to generate the script for the facts short video. + +### **Class: FactsShortEngine** + +#### **Methods:** + +- `_generateScript(self)`: Generates the script for the facts short video by using the `generateFacts` function from the `facts_gpt` module. + +--- + +## **File: reddit_short_engine.py** + +This file contains the `RedditShortEngine` class, which is used for generating reddit short videos. It extends the `ContentShortEngine` class and overrides the `_generateScript` method to generate the script for the reddit short video. It also adds a custom step for preparing a reddit image. + +### **Class: RedditShortEngine** + +#### **Methods:** + +- `_generateScript(self)`: Generates the script for the reddit short video by using the `getInterestingRedditQuestion` function from the `reddit_gpt` module. + +- `_prepareCustomAssets(self)`: Prepares the custom assets for the reddit short video by using the `ingestFlow` method from the `imageEditingEngine` to create a reddit image. + +- `_editAndRenderShort(self)`: Performs the editing and rendering of the reddit short video by using the `videoEditor` and the editing steps defined in the `stepDict`. \ No newline at end of file diff --git a/shortGPT/engine/__init__.py b/shortGPT/engine/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..b7feb036d51f4e90ec5559261788417b0c71c9a8 --- /dev/null +++ b/shortGPT/engine/__init__.py @@ -0,0 +1,2 @@ +from . import abstract_content_engine +from . import reddit_short_engine \ No newline at end of file diff --git a/shortGPT/engine/abstract_content_engine.py b/shortGPT/engine/abstract_content_engine.py new file mode 100644 index 0000000000000000000000000000000000000000..de53333b4e0c216b6490df7cdd44f41ecaf2901e --- /dev/null +++ b/shortGPT/engine/abstract_content_engine.py @@ -0,0 +1,95 @@ +import os +from abc import ABC + +from shortGPT.audio.voice_module import VoiceModule +from shortGPT.config.languages import Language +from shortGPT.config.path_utils import get_program_path +from shortGPT.database.content_database import ContentDatabase + +CONTENT_DB = ContentDatabase() + + +class AbstractContentEngine(ABC): + def __init__(self, short_id: str, content_type: str, language: Language, voiceModule: VoiceModule): + if short_id: + self.dataManager = CONTENT_DB.getContentDataManager( + short_id, content_type + ) + else: + self.dataManager = CONTENT_DB.createContentDataManager(content_type) + self.id = str(self.dataManager._getId()) + self.initializeMagickAndFFMPEG() + self.prepareEditingPaths() + self._db_language = language.value + self.voiceModule = voiceModule + self.stepDict = {} + self.default_logger = lambda _: None + self.logger = self.default_logger + + def __getattr__(self, name): + if name.startswith('_db_'): + db_path = name[4:] # remove '_db_' prefix + cache_attr = '_' + name + if not hasattr(self, cache_attr): + setattr(self, cache_attr, self.dataManager.get(db_path)) + return getattr(self, cache_attr) + else: + return super().__getattr__(name) + + def __setattr__(self, name, value): + if name.startswith('_db_'): + db_path = name[4:] # remove '_db_' prefix + cache_attr = '_' + name + setattr(self, cache_attr, value) + self.dataManager.save(db_path, value) + else: + super().__setattr__(name, value) + + def prepareEditingPaths(self): + self.dynamicAssetDir = f".editing_assets/{self.dataManager.contentType}_assets/{self.id}/" + if not os.path.exists(self.dynamicAssetDir): + os.makedirs(self.dynamicAssetDir) + + def verifyParameters(*args, **kargs): + keys = list(kargs.keys()) + for key in keys: + if not kargs[key]: + print(kargs) + raise Exception(f"Parameter :{key} is null") + + def isShortDone(self): + return self._db_ready_to_upload + + def makeContent(self): + while (not self.isShortDone()): + currentStep = self._db_last_completed_step + 1 + if currentStep not in self.stepDict: + raise Exception(f'Incorrect step {currentStep}') + if self.stepDict[currentStep].__name__ == "_editAndRenderShort": + yield currentStep, f'Current step ({currentStep} / {self.get_total_steps()}) : ' + "Preparing rendering assets..." + else: + yield currentStep, f'Current step ({currentStep} / {self.get_total_steps()}) : ' + self.stepDict[currentStep].__name__ + if self.logger is not self.default_logger: + print(f'Step {currentStep} {self.stepDict[currentStep].__name__}') + self.stepDict[currentStep]() + self._db_last_completed_step = currentStep + + def get_video_output_path(self): + return self._db_video_path + + def get_total_steps(self): + return len(self.stepDict) + + def set_logger(self, logger): + self.logger = logger + + def initializeMagickAndFFMPEG(self): + ffmpeg_path = get_program_path("ffmpeg") + if not ffmpeg_path: + raise Exception("FFmpeg, a program used for automated editing within ShortGPT was not found on your computer. Please go back to the README and follow the instructions to install FFMPEG") + ffprobe_path = get_program_path("ffprobe") + if not ffprobe_path: + raise Exception("FFProbe, a dependecy of FFmpeg was not found. Please go back to the README and follow the instructions to install FFMPEG") + convert_path = get_program_path("convert") + if not convert_path: + raise Exception("ImageMagick, a program required for making Captions with ShortGPT was not found on your computer. Please go back to the README and follow the instructions to install ImageMagick") diff --git a/shortGPT/engine/content_short_engine.py b/shortGPT/engine/content_short_engine.py new file mode 100644 index 0000000000000000000000000000000000000000..41b07a867d10e7c8f7889a7ca80d72f171a2f40b --- /dev/null +++ b/shortGPT/engine/content_short_engine.py @@ -0,0 +1,169 @@ +import datetime +import os +import re +import shutil +from abc import abstractmethod + +from shortGPT.audio import audio_utils +from shortGPT.audio.audio_duration import get_asset_duration +from shortGPT.audio.voice_module import VoiceModule +from shortGPT.config.asset_db import AssetDatabase +from shortGPT.config.languages import Language +from shortGPT.editing_framework.editing_engine import (EditingEngine, + EditingStep) +from shortGPT.editing_utils import captions, editing_images +from shortGPT.editing_utils.handle_videos import extract_random_clip_from_video +from shortGPT.engine.abstract_content_engine import AbstractContentEngine +from shortGPT.gpt import gpt_editing, gpt_translate, gpt_yt + + +class ContentShortEngine(AbstractContentEngine): + + def __init__(self, short_type: str, background_video_name: str, background_music_name: str, voiceModule: VoiceModule, short_id="", + num_images=None, watermark=None, language: Language = Language.ENGLISH,): + super().__init__(short_id, short_type, language, voiceModule) + if not short_id: + if (num_images): + self._db_num_images = num_images + if (watermark): + self._db_watermark = watermark + self._db_background_video_name = background_video_name + self._db_background_music_name = background_music_name + + self.stepDict = { + 1: self._generateScript, + 2: self._generateTempAudio, + 3: self._speedUpAudio, + 4: self._timeCaptions, + 5: self._generateImageSearchTerms, + 6: self._generateImageUrls, + 7: self._chooseBackgroundMusic, + 8: self._chooseBackgroundVideo, + 9: self._prepareBackgroundAssets, + 10: self._prepareCustomAssets, + 11: self._editAndRenderShort, + 12: self._addYoutubeMetadata + } + + @abstractmethod + def _generateScript(self): + self._db_script = "" + + def _generateTempAudio(self): + if not self._db_script: + raise NotImplementedError("generateScript method must set self._db_script.") + if (self._db_temp_audio_path): + return + self.verifyParameters(text=self._db_script) + script = self._db_script + if (self._db_language != Language.ENGLISH.value): + self._db_translated_script = gpt_translate.translateContent(script, self._db_language) + script = self._db_translated_script + self._db_temp_audio_path = self.voiceModule.generate_voice( + script, self.dynamicAssetDir + "temp_audio_path.wav") + + def _speedUpAudio(self): + if (self._db_audio_path): + return + self.verifyParameters(tempAudioPath=self._db_temp_audio_path) + self._db_audio_path = audio_utils.speedUpAudio( + self._db_temp_audio_path, self.dynamicAssetDir+"audio_voice.wav") + + def _timeCaptions(self): + self.verifyParameters(audioPath=self._db_audio_path) + whisper_analysis = audio_utils.audioToText(self._db_audio_path) + self._db_timed_captions = captions.getCaptionsWithTime( + whisper_analysis) + + def _generateImageSearchTerms(self): + self.verifyParameters(captionsTimed=self._db_timed_captions) + if self._db_num_images: + self._db_timed_image_searches = gpt_editing.getImageQueryPairs( + self._db_timed_captions, n=self._db_num_images) + + def _generateImageUrls(self): + if self._db_timed_image_searches: + self._db_timed_image_urls = editing_images.getImageUrlsTimed( + self._db_timed_image_searches) + + def _chooseBackgroundMusic(self): + self._db_background_music_url = AssetDatabase.get_asset_link(self._db_background_music_name) + + def _chooseBackgroundVideo(self): + self._db_background_video_url = AssetDatabase.get_asset_link( + self._db_background_video_name) + self._db_background_video_duration = AssetDatabase.get_asset_duration( + self._db_background_video_name) + + def _prepareBackgroundAssets(self): + self.verifyParameters( + voiceover_audio_url=self._db_audio_path, + video_duration=self._db_background_video_duration, + background_video_url=self._db_background_video_url, music_url=self._db_background_music_url) + if not self._db_voiceover_duration: + self.logger("Rendering short: (1/4) preparing voice asset...") + self._db_audio_path, self._db_voiceover_duration = get_asset_duration( + self._db_audio_path, isVideo=False) + if not self._db_background_trimmed: + self.logger("Rendering short: (2/4) preparing background video asset...") + self._db_background_trimmed = extract_random_clip_from_video( + self._db_background_video_url, self._db_background_video_duration, self._db_voiceover_duration, self.dynamicAssetDir + "clipped_background.mp4") + + def _prepareCustomAssets(self): + self.logger("Rendering short: (3/4) preparing custom assets...") + pass + + def _editAndRenderShort(self): + self.verifyParameters( + voiceover_audio_url=self._db_audio_path, + video_duration=self._db_background_video_duration, + music_url=self._db_background_music_url) + + outputPath = self.dynamicAssetDir+"rendered_video.mp4" + if not (os.path.exists(outputPath)): + self.logger("Rendering short: Starting automated editing...") + videoEditor = EditingEngine() + videoEditor.addEditingStep(EditingStep.ADD_VOICEOVER_AUDIO, { + 'url': self._db_audio_path}) + videoEditor.addEditingStep(EditingStep.ADD_BACKGROUND_MUSIC, {'url': self._db_background_music_url, + 'loop_background_music': self._db_voiceover_duration, + "volume_percentage": 0.11}) + videoEditor.addEditingStep(EditingStep.CROP_1920x1080, { + 'url': self._db_background_trimmed}) + videoEditor.addEditingStep(EditingStep.ADD_SUBSCRIBE_ANIMATION, {'url': AssetDatabase.get_asset_link('subscribe animation')}) + + if self._db_watermark: + videoEditor.addEditingStep(EditingStep.ADD_WATERMARK, { + 'text': self._db_watermark}) + + caption_type = EditingStep.ADD_CAPTION_SHORT_ARABIC if self._db_language == Language.ARABIC.value else EditingStep.ADD_CAPTION_SHORT + for timing, text in self._db_timed_captions: + videoEditor.addEditingStep(caption_type, {'text': text.upper(), + 'set_time_start': timing[0], + 'set_time_end': timing[1]}) + if self._db_num_images: + for timing, image_url in self._db_timed_image_urls: + videoEditor.addEditingStep(EditingStep.SHOW_IMAGE, {'url': image_url, + 'set_time_start': timing[0], + 'set_time_end': timing[1]}) + + videoEditor.renderVideo(outputPath, logger= self.logger if self.logger is not self.default_logger else None) + + self._db_video_path = outputPath + + def _addYoutubeMetadata(self): + if not os.path.exists('videos/'): + os.makedirs('videos') + self._db_yt_title, self._db_yt_description = gpt_yt.generate_title_description_dict(self._db_script) + + now = datetime.datetime.now() + date_str = now.strftime("%Y-%m-%d_%H-%M-%S") + newFileName = f"videos/{date_str} - " + \ + re.sub(r"[^a-zA-Z0-9 '\n\.]", '', self._db_yt_title) + + shutil.move(self._db_video_path, newFileName+".mp4") + with open(newFileName+".txt", "w", encoding="utf-8") as f: + f.write( + f"---Youtube title---\n{self._db_yt_title}\n---Youtube description---\n{self._db_yt_description}") + self._db_video_path = newFileName+".mp4" + self._db_ready_to_upload = True diff --git a/shortGPT/engine/content_translation_engine.py b/shortGPT/engine/content_translation_engine.py new file mode 100644 index 0000000000000000000000000000000000000000..a99e2eba07525fe6b76788a68279e4aeb5d40641 --- /dev/null +++ b/shortGPT/engine/content_translation_engine.py @@ -0,0 +1,130 @@ +import datetime +import os +import re +import shutil + +from tqdm import tqdm + +from shortGPT.audio.audio_duration import get_asset_duration +from shortGPT.audio.audio_utils import (audioToText, get_asset_duration, + run_background_audio_split, + speedUpAudio) +from shortGPT.audio.voice_module import VoiceModule +from shortGPT.config.languages import ACRONYM_LANGUAGE_MAPPING, Language +from shortGPT.editing_framework.editing_engine import (EditingEngine, + EditingStep) +from shortGPT.editing_utils.captions import (getCaptionsWithTime, + getSpeechBlocks) +from shortGPT.editing_utils.handle_videos import get_aspect_ratio +from shortGPT.engine.abstract_content_engine import AbstractContentEngine +from shortGPT.gpt.gpt_translate import translateContent + + +class ContentTranslationEngine(AbstractContentEngine): + + def __init__(self, voiceModule: VoiceModule, src_url: str = "", target_language: Language = Language.ENGLISH, use_captions=False, id=""): + super().__init__(id, "content_translation", target_language, voiceModule) + if not id: + self._db_should_translate = True + if src_url: + self._db_src_url = src_url + self._db_use_captions = use_captions + self._db_target_language = target_language.value + + self.stepDict = { + 1: self._transcribe_audio, + 2: self._translate_content, + 3: self._generate_translated_audio, + 4: self._edit_and_render_video, + 5: self._add_metadata + } + + def _transcribe_audio(self): + video_audio, _ = get_asset_duration(self._db_src_url, isVideo=False) + self.verifyParameters(content_path=video_audio) + self.logger(f"1/5 - Transcribing original audio to text...") + whispered = audioToText(video_audio, model_size='base') + self._db_speech_blocks = getSpeechBlocks(whispered, silence_time=0.8) + if (ACRONYM_LANGUAGE_MAPPING.get(whispered['language']) == Language(self._db_target_language)): + self._db_translated_timed_sentences = self._db_speech_blocks + self._db_should_translate = False + + expected_chars = len("".join([text for _, text in self._db_speech_blocks])) + chars_remaining = self.voiceModule.get_remaining_characters() + if chars_remaining < expected_chars: + raise Exception( + f"Your VoiceModule's key doesn't have enough characters to totally translate this video | Remaining: {chars_remaining} | Number of characters to translate: {expected_chars}") + + def _translate_content(self): + if (self._db_should_translate): + self.verifyParameters(_db_speech_blocks=self._db_speech_blocks) + + translated_timed_sentences = [] + for i, ((t1, t2), text) in tqdm(enumerate(self._db_speech_blocks), desc="Translating content"): + self.logger(f"2/5 - Translating text content - {i+1} / {len(self._db_speech_blocks)}") + translated_text = translateContent(text, self._db_target_language) + translated_timed_sentences.append([[t1, t2], translated_text]) + self._db_translated_timed_sentences = translated_timed_sentences + + def _generate_translated_audio(self): + self.verifyParameters(translated_timed_sentences=self._db_translated_timed_sentences) + + translated_audio_blocks = [] + for i, ((t1, t2), translated_text) in tqdm(enumerate(self._db_translated_timed_sentences), desc="Generating translated audio"): + self.logger(f"3/5 - Generating translated audio - {i+1} / {len(self._db_translated_timed_sentences)}") + translated_voice = self.voiceModule.generate_voice(translated_text, self.dynamicAssetDir+f"translated_{i}_{self._db_target_language}.wav") + if not translated_voice: + raise Exception('An error happending during audio voice creation') + final_audio_path = speedUpAudio(translated_voice, self.dynamicAssetDir+f"translated_{i}_{self._db_target_language}_spedup.wav", expected_duration=t2-t1 - 0.05) + _, translated_duration = get_asset_duration(final_audio_path, isVideo=False) + translated_audio_blocks.append([[t1, t1+translated_duration], final_audio_path]) + self._db_audio_bits = translated_audio_blocks + + def _edit_and_render_video(self): + self.verifyParameters(_db_audio_bits=self._db_audio_bits) + self.logger(f"4.1 / 5 - Preparing automated editing") + target_language = Language(self._db_target_language) + input_video, video_length = get_asset_duration(self._db_src_url) + video_audio, _ = get_asset_duration(self._db_src_url, isVideo=False) + editing_engine = EditingEngine() + editing_engine.addEditingStep(EditingStep.ADD_BACKGROUND_VIDEO, {'url': input_video, "set_time_start": 0, "set_time_end": video_length}) + last_t2 = 0 + for (t1, t2), audio_path in self._db_audio_bits: + t2+=-0.05 + editing_engine.addEditingStep(EditingStep.INSERT_AUDIO, {'url': audio_path, 'set_time_start': t1, 'set_time_end': t2}) + if t1-last_t2 >4: + editing_engine.addEditingStep(EditingStep.EXTRACT_AUDIO, {"url": video_audio, "subclip": {"t_start": last_t2, "t_end": t1}, "set_time_start": last_t2, "set_time_end": t1}) + last_t2 = t2 + + if video_length - last_t2 >4: + editing_engine.addEditingStep(EditingStep.EXTRACT_AUDIO, {"url": video_audio, "subclip": {"t_start": last_t2, "t_end": video_length}, "set_time_start": last_t2, "set_time_end": video_length}) + + if self._db_use_captions: + is_landscape = get_aspect_ratio(input_video) > 1 + if not self._db_timed_translated_captions: + if not self._db_translated_voiceover_path: + self.logger(f"4.5 / 5 - Generating captions in {target_language.value}") + editing_engine.generateAudio(self.dynamicAssetDir+"translated_voiceover.wav") + self._db_translated_voiceover_path = self.dynamicAssetDir+"translated_voiceover.wav" + whispered_translated = audioToText(self._db_translated_voiceover_path, model_size='base') + timed_translated_captions = getCaptionsWithTime(whispered_translated, maxCaptionSize=50 if is_landscape else 15, considerPunctuation=True) + self._db_timed_translated_captions = [[[t1,t2], text] for (t1, t2), text in timed_translated_captions if t2 - t1 <= 4] + for (t1, t2), text in self._db_timed_translated_captions: + caption_key = "LANDSCAPE" if is_landscape else "SHORT" + caption_key += "_ARABIC" if target_language == Language.ARABIC else "" + caption_type = getattr(EditingStep, f"ADD_CAPTION_{caption_key}") + editing_engine.addEditingStep(caption_type, {'text': text, "set_time_start": t1, "set_time_end": t2}) + + self._db_video_path = self.dynamicAssetDir+"translated_content.mp4" + + editing_engine.renderVideo(self._db_video_path, logger= self.logger if self.logger is not self.default_logger else None) + def _add_metadata(self): + self.logger(f"5 / 5 - Saving translated video") + now = datetime.datetime.now() + date_str = now.strftime("%Y-%m-%d_%H-%M-%S") + newFileName = f"videos/{date_str} - " + \ + re.sub(r"[^a-zA-Z0-9 '\n\.]", '', f"translated_content_to_{self._db_target_language}") + + shutil.move(self._db_video_path, newFileName+".mp4") + self._db_video_path = newFileName+".mp4" + self._db_ready_to_upload = True diff --git a/shortGPT/engine/content_video_engine.py b/shortGPT/engine/content_video_engine.py new file mode 100644 index 0000000000000000000000000000000000000000..a87621f7d0ade7f5ac2e2828aaea17aeaf418ec1 --- /dev/null +++ b/shortGPT/engine/content_video_engine.py @@ -0,0 +1,181 @@ +import datetime +import os +import re +import shutil + +from shortGPT.api_utils.pexels_api import getBestVideo +from shortGPT.api_utils.youtube_api import search_videos_YouTube +from shortGPT.audio import audio_utils +from shortGPT.audio.audio_duration import get_asset_duration +from shortGPT.audio.voice_module import VoiceModule +from shortGPT.config.asset_db import AssetDatabase +from shortGPT.config.languages import Language +from shortGPT.editing_framework.editing_engine import (EditingEngine, + EditingStep) +from shortGPT.editing_utils import captions +from shortGPT.engine.abstract_content_engine import AbstractContentEngine +from shortGPT.gpt import gpt_editing, gpt_translate, gpt_yt + + +class ContentVideoEngine(AbstractContentEngine): + + def __init__(self, voiceModule: VoiceModule, script: str, background_music_name="", id="", + watermark=None, isVerticalFormat=False, language: Language = Language.ENGLISH): + super().__init__(id, "general_video", language, voiceModule) + if not id: + if (watermark): + self._db_watermark = watermark + if background_music_name: + self._db_background_music_name = background_music_name + self._db_script = script + self._db_format_vertical = isVerticalFormat + + self.stepDict = { + 1: self._generateTempAudio, + 2: self._speedUpAudio, + 3: self._timeCaptions, + 4: self._generateVideoSearchTerms, + 5: self._generateVideoUrls, + 6: self._chooseBackgroundMusic, + 7: self._prepareBackgroundAssets, + 8: self._prepareCustomAssets, + 9: self._editAndRenderShort, + 10: self._addMetadata + } + + def _generateTempAudio(self): + if not self._db_script: + raise NotImplementedError("generateScript method must set self._db_script.") + if (self._db_temp_audio_path): + return + self.verifyParameters(text=self._db_script) + script = self._db_script + if (self._db_language != Language.ENGLISH.value): + self._db_translated_script = gpt_translate.translateContent(script, self._db_language) + script = self._db_translated_script + self._db_temp_audio_path = self.voiceModule.generate_voice( + script, self.dynamicAssetDir + "temp_audio_path.wav") + + def _speedUpAudio(self): + if (self._db_audio_path): + return + self.verifyParameters(tempAudioPath=self._db_temp_audio_path) + # Since the video is not supposed to be a short( less than 60sec), there is no reason to speed it up + self._db_audio_path = self._db_temp_audio_path + return + self._db_audio_path = audio_utils.speedUpAudio( + self._db_temp_audio_path, self.dynamicAssetDir+"audio_voice.wav") + + def _timeCaptions(self): + self.verifyParameters(audioPath=self._db_audio_path) + whisper_analysis = audio_utils.audioToText(self._db_audio_path) + max_len = 15 + if not self._db_format_vertical: + max_len = 30 + self._db_timed_captions = captions.getCaptionsWithTime( + whisper_analysis, maxCaptionSize=max_len) + + def _generateVideoSearchTerms(self): + self.verifyParameters(captionsTimed=self._db_timed_captions) + # Returns a list of pairs of timing (t1,t2) + 3 search video queries, such as: [[t1,t2], [search_query_1, search_query_2, search_query_3]] + self._db_timed_video_searches = gpt_editing.getVideoSearchQueriesTimed(self._db_timed_captions) + + def _generateVideoUrls(self): + timed_video_searches = self._db_timed_video_searches + self.verifyParameters(captionsTimed=timed_video_searches) + timed_video_urls = [] + used_links = [] + for (t1, t2), search_terms in timed_video_searches: + url = "" + for query in reversed(search_terms): + try: + url = getBestVideo(query, orientation_landscape=not self._db_format_vertical, used_vids=used_links) + except: + pass + + #uses returned url via ytdl + yt_url = search_videos_YouTube(query_string=query) + if yt_url: + print(yt_url) # video url_ in youtube style; does not work if video is age-restricted + from pytube import YouTube + yt = YouTube(yt_url) + try: + download_url = yt.streams.get_highest_resolution().url + url = download_url + except: + url=url + + else: + print("back to pexels") + url=url + used_links.append(url.split('.hd')[0]) + break + + timed_video_urls.append([[t1, t2], url]) + print(timed_video_urls) + + self._db_timed_video_urls = timed_video_urls + + def _chooseBackgroundMusic(self): + if self._db_background_music_name: + self._db_background_music_url = AssetDatabase.get_asset_link(self._db_background_music_name) + + def _prepareBackgroundAssets(self): + self.verifyParameters(voiceover_audio_url=self._db_audio_path) + if not self._db_voiceover_duration: + self.logger("Rendering short: (1/4) preparing voice asset...") + self._db_audio_path, self._db_voiceover_duration = get_asset_duration( + self._db_audio_path, isVideo=False) + + def _prepareCustomAssets(self): + self.logger("Rendering short: (3/4) preparing custom assets...") + pass + + def _editAndRenderShort(self): + self.verifyParameters( + voiceover_audio_url=self._db_audio_path) + + outputPath = self.dynamicAssetDir+"rendered_video.mp4" + if not (os.path.exists(outputPath)): + self.logger("Rendering short: Starting automated editing...") + videoEditor = EditingEngine() + videoEditor.addEditingStep(EditingStep.ADD_VOICEOVER_AUDIO, { + 'url': self._db_audio_path}) + if (self._db_background_music_url): + videoEditor.addEditingStep(EditingStep.ADD_BACKGROUND_MUSIC, {'url': self._db_background_music_url, + 'loop_background_music': self._db_voiceover_duration, + "volume_percentage": 0.08}) + for (t1, t2), video_url in self._db_timed_video_urls: + videoEditor.addEditingStep(EditingStep.ADD_BACKGROUND_VIDEO, {'url': video_url, + 'set_time_start': t1, + 'set_time_end': t2}) + if (self._db_format_vertical): + caption_type = EditingStep.ADD_CAPTION_SHORT_ARABIC if self._db_language == Language.ARABIC.value else EditingStep.ADD_CAPTION_SHORT + else: + caption_type = EditingStep.ADD_CAPTION_LANDSCAPE_ARABIC if self._db_language == Language.ARABIC.value else EditingStep.ADD_CAPTION_LANDSCAPE + + for (t1, t2), text in self._db_timed_captions: + videoEditor.addEditingStep(caption_type, {'text': text.upper(), + 'set_time_start': t1, + 'set_time_end': t2}) + + videoEditor.renderVideo(outputPath, logger= self.logger if self.logger is not self.default_logger else None) + + self._db_video_path = outputPath + + def _addMetadata(self): + if not os.path.exists('videos/'): + os.makedirs('videos') + self._db_yt_title, self._db_yt_description = gpt_yt.generate_title_description_dict(self._db_script) + + now = datetime.datetime.now() + date_str = now.strftime("%Y-%m-%d_%H-%M-%S") + newFileName = f"videos/{date_str} - " + \ + re.sub(r"[^a-zA-Z0-9 '\n\.]", '', self._db_yt_title) + + shutil.move(self._db_video_path, newFileName+".mp4") + with open(newFileName+".txt", "w", encoding="utf-8") as f: + f.write( + f"---Youtube title---\n{self._db_yt_title}\n---Youtube description---\n{self._db_yt_description}") + self._db_video_path = newFileName+".mp4" + self._db_ready_to_upload = True diff --git a/shortGPT/engine/facts_short_engine.py b/shortGPT/engine/facts_short_engine.py new file mode 100644 index 0000000000000000000000000000000000000000..4466a9917744fe452f8d8db5b8642d982e7b9b1e --- /dev/null +++ b/shortGPT/engine/facts_short_engine.py @@ -0,0 +1,21 @@ +from shortGPT.audio.voice_module import VoiceModule +from shortGPT.gpt import facts_gpt +from shortGPT.config.languages import Language +from shortGPT.engine.content_short_engine import ContentShortEngine + + +class FactsShortEngine(ContentShortEngine): + + def __init__(self, voiceModule: VoiceModule, facts_type: str, background_video_name: str, background_music_name: str,short_id="", + num_images=None, watermark=None, language:Language = Language.ENGLISH): + super().__init__(short_id=short_id, short_type="facts_shorts", background_video_name=background_video_name, background_music_name=background_music_name, + num_images=num_images, watermark=watermark, language=language, voiceModule=voiceModule) + + self._db_facts_type = facts_type + + def _generateScript(self): + """ + Implements Abstract parent method to generate the script for the Facts short. + """ + self._db_script = facts_gpt.generateFacts(self._db_facts_type) + diff --git a/shortGPT/engine/multi_language_translation_engine.py b/shortGPT/engine/multi_language_translation_engine.py new file mode 100644 index 0000000000000000000000000000000000000000..af13c28f1d9240a803270150326202e9deaa5979 --- /dev/null +++ b/shortGPT/engine/multi_language_translation_engine.py @@ -0,0 +1,138 @@ +import datetime +import os +import re +import shutil + +from tqdm import tqdm + +from shortGPT.audio.audio_duration import get_asset_duration +from shortGPT.audio.audio_utils import (audioToText, get_asset_duration, + run_background_audio_split, + speedUpAudio) +from shortGPT.audio.eleven_voice_module import VoiceModule +from shortGPT.config.languages import ACRONYM_LANGUAGE_MAPPING, Language +from shortGPT.editing_framework.editing_engine import (EditingEngine, + EditingStep) +from shortGPT.editing_utils.captions import (getCaptionsWithTime, + getSpeechBlocks) +from shortGPT.editing_utils.handle_videos import get_aspect_ratio +from shortGPT.engine.abstract_content_engine import CONTENT_DB, AbstractContentEngine +from shortGPT.gpt.gpt_translate import translateContent + +class MultiLanguageTranslationEngine(AbstractContentEngine): + + def __init__(self, voiceModule: VoiceModule, src_url: str = "", target_language: Language = Language.ENGLISH, use_captions=False, id=""): + super().__init__(id, "content_translation", target_language, voiceModule) + if not id: + self._db_should_translate = True + if src_url: + self._db_src_url = src_url + self._db_use_captions = use_captions + self._db_target_language = target_language.value + + self.stepDict = { + 1: self._transcribe_audio, + 2: self._translate_content, + 3: self._generate_translated_audio, + 4: self._edit_and_render_video, + 5: self._add_metadata + } + + def _transcribe_audio(self): + cached_translation = CONTENT_DB.content_collection.find_one({ + "content_type": 'content_translation', + 'src_url': self._db_src_url, + 'ready_to_upload': True + }) + if not (cached_translation and 'speech_blocks' in cached_translation and 'original_language' in cached_translation): + video_audio, _ = get_asset_duration(self._db_src_url, isVideo=False) + self.verifyParameters(content_path=video_audio) + self.logger(f"1/5 - Transcribing original audio to text...") + whispered = audioToText(video_audio, model_size='base') + self._db_speech_blocks = getSpeechBlocks(whispered, silence_time=0.8) + self._db_original_language = whispered['language'] + + if (ACRONYM_LANGUAGE_MAPPING.get(self._db_original_language) == Language(self._db_target_language)): + self._db_translated_timed_sentences = self._db_speech_blocks + self._db_should_translate = False + + expected_chars = len("".join([text for _, text in self._db_speech_blocks])) + chars_remaining = self.voiceModule.get_remaining_characters() + if chars_remaining < expected_chars: + raise Exception( + f"Your VoiceModule's key doesn't have enough characters to totally translate this video | Remaining: {chars_remaining} | Number of characters to translate: {expected_chars}") + + def _translate_content(self): + if (self._db_should_translate): + self.verifyParameters(_db_speech_blocks=self._db_speech_blocks) + + translated_timed_sentences = [] + for i, ((t1, t2), text) in tqdm(enumerate(self._db_speech_blocks), desc="Translating content"): + self.logger(f"2/5 - Translating text content - {i+1} / {len(self._db_speech_blocks)}") + translated_text = translateContent(text, self._db_target_language) + translated_timed_sentences.append([[t1, t2], translated_text]) + self._db_translated_timed_sentences = translated_timed_sentences + + def _generate_translated_audio(self): + self.verifyParameters(translated_timed_sentences=self._db_translated_timed_sentences) + + translated_audio_blocks = [] + for i, ((t1, t2), translated_text) in tqdm(enumerate(self._db_translated_timed_sentences), desc="Generating translated audio"): + self.logger(f"3/5 - Generating translated audio - {i+1} / {len(self._db_translated_timed_sentences)}") + translated_voice = self.voiceModule.generate_voice(translated_text, self.dynamicAssetDir+f"translated_{i}_{self._db_target_language}.wav") + if not translated_voice: + raise Exception('An error happending during audio voice creation') + final_audio_path = speedUpAudio(translated_voice, self.dynamicAssetDir+f"translated_{i}_{self._db_target_language}_spedup.wav", expected_duration=t2-t1 - 0.05) + _, translated_duration = get_asset_duration(final_audio_path, isVideo=False) + translated_audio_blocks.append([[t1, t1+translated_duration], final_audio_path]) + self._db_audio_bits = translated_audio_blocks + + def _edit_and_render_video(self): + self.verifyParameters(_db_audio_bits=self._db_audio_bits) + self.logger(f"4.1 / 5 - Preparing automated editing") + target_language = Language(self._db_target_language) + input_video, video_length = get_asset_duration(self._db_src_url) + video_audio, _ = get_asset_duration(self._db_src_url, isVideo=False) + editing_engine = EditingEngine() + editing_engine.addEditingStep(EditingStep.ADD_BACKGROUND_VIDEO, {'url': input_video, "set_time_start": 0, "set_time_end": video_length}) + last_t2 = 0 + for (t1, t2), audio_path in self._db_audio_bits: + t2+=-0.05 + editing_engine.addEditingStep(EditingStep.INSERT_AUDIO, {'url': audio_path, 'set_time_start': t1, 'set_time_end': t2}) + if t1-last_t2 >4: + editing_engine.addEditingStep(EditingStep.EXTRACT_AUDIO, {"url": video_audio, "subclip": {"t_start": last_t2, "t_end": t1}, "set_time_start": last_t2, "set_time_end": t1}) + last_t2 = t2 + + if video_length - last_t2 >4: + editing_engine.addEditingStep(EditingStep.EXTRACT_AUDIO, {"url": video_audio, "subclip": {"t_start": last_t2, "t_end": video_length}, "set_time_start": last_t2, "set_time_end": video_length}) + + if self._db_use_captions: + is_landscape = get_aspect_ratio(input_video) > 1 + if not self._db_timed_translated_captions: + if not self._db_translated_voiceover_path: + self.logger(f"4.5 / 5 - Generating captions in {target_language.value}") + editing_engine.generateAudio(self.dynamicAssetDir+"translated_voiceover.wav") + self._db_translated_voiceover_path = self.dynamicAssetDir+"translated_voiceover.wav" + whispered_translated = audioToText(self._db_translated_voiceover_path, model_size='base') + timed_translated_captions = getCaptionsWithTime(whispered_translated, maxCaptionSize=50 if is_landscape else 15, considerPunctuation=True) + self._db_timed_translated_captions = [[[t1,t2], text] for (t1, t2), text in timed_translated_captions if t2 - t1 <= 4] + for (t1, t2), text in self._db_timed_translated_captions: + caption_key = "LANDSCAPE" if is_landscape else "SHORT" + caption_key += "_ARABIC" if target_language == Language.ARABIC else "" + caption_type = getattr(EditingStep, f"ADD_CAPTION_{caption_key}") + editing_engine.addEditingStep(caption_type, {'text': text, "set_time_start": t1, "set_time_end": t2}) + + self._db_video_path = self.dynamicAssetDir+"translated_content.mp4" + + editing_engine.renderVideo(self._db_video_path, logger= self.logger if self.logger is not self.default_logger else None) + + def _add_metadata(self): + self.logger(f"5 / 5 - Saving translated video") + now = datetime.datetime.now() + date_str = now.strftime("%Y-%m-%d_%H-%M-%S") + newFileName = f"videos/{date_str} - " + \ + re.sub(r"[^a-zA-Z0-9 '\n\.]", '', f"translated_content_to_{self._db_target_language}") + + shutil.move(self._db_video_path, newFileName+".mp4") + self._db_video_path = newFileName+".mp4" + self._db_ready_to_upload = True diff --git a/shortGPT/engine/reddit_short_engine.py b/shortGPT/engine/reddit_short_engine.py new file mode 100644 index 0000000000000000000000000000000000000000..d3f7652adf580896bd98f93296217329736a96f5 --- /dev/null +++ b/shortGPT/engine/reddit_short_engine.py @@ -0,0 +1,105 @@ +from shortGPT.audio.voice_module import VoiceModule +from shortGPT.config.asset_db import AssetDatabase +from shortGPT.config.languages import Language +from shortGPT.engine.content_short_engine import ContentShortEngine +from shortGPT.editing_framework.editing_engine import EditingEngine, EditingStep, Flow +from shortGPT.gpt import reddit_gpt, gpt_voice +import os + + +class RedditShortEngine(ContentShortEngine): + # Mapping of variable names to database paths + def __init__(self,voiceModule: VoiceModule, background_video_name: str, background_music_name: str,short_id="", + num_images=None, watermark=None, language:Language = Language.ENGLISH): + super().__init__(short_id=short_id, short_type="reddit_shorts", background_video_name=background_video_name, background_music_name=background_music_name, + num_images=num_images, watermark=watermark, language=language, voiceModule=voiceModule) + + def __generateRandomStory(self): + question = reddit_gpt.getInterestingRedditQuestion() + script = reddit_gpt.createRedditScript(question) + return script + + def __getRealisticStory(self, max_tries=3): + current_realistic_score = 0 + current_try = 0 + current_generated_script = "" + while (current_realistic_score < 6 and current_try < max_tries) or len(current_generated_script) > 1000: + new_script = self.__generateRandomStory() + new_realistic_score = reddit_gpt.getRealisticness(new_script) + if new_realistic_score >= current_realistic_score: + current_generated_script = new_script + current_realistic_score = new_realistic_score + current_try += 1 + return current_generated_script, current_try + + def _generateScript(self): + """ + Implements Abstract parent method to generate the script for the reddit short + """ + self.logger("Generating reddit question & entertaining story") + self._db_script, _ = self.__getRealisticStory(max_tries=1) + self._db_reddit_question = reddit_gpt.getQuestionFromThread( + self._db_script) + + def _prepareCustomAssets(self): + """ + Override parent method to generate custom reddit image asset + """ + self.logger("Rendering short: (3/4) preparing custom reddit image...") + self.verifyParameters(question=self._db_reddit_question,) + title, header, n_comments, n_upvotes = reddit_gpt.generateRedditPostMetadata( + self._db_reddit_question) + imageEditingEngine = EditingEngine() + imageEditingEngine.ingestFlow(Flow.WHITE_REDDIT_IMAGE_FLOW, { + "username_text": header, + "ncomments_text": n_comments, + "nupvote_text": n_upvotes, + "question_text": title + }) + imageEditingEngine.renderImage( + self.dynamicAssetDir+"redditThreadImage.png") + self._db_reddit_thread_image = self.dynamicAssetDir+"redditThreadImage.png" + + def _editAndRenderShort(self): + """ + Override parent method to customize video rendering sequence by adding a Reddit image + """ + self.verifyParameters( + voiceover_audio_url=self._db_audio_path, + video_duration=self._db_background_video_duration, + music_url=self._db_background_music_url) + + outputPath = self.dynamicAssetDir+"rendered_video.mp4" + if not (os.path.exists(outputPath)): + self.logger("Rendering short: Starting automated editing...") + videoEditor = EditingEngine() + videoEditor.addEditingStep(EditingStep.ADD_VOICEOVER_AUDIO, { + 'url': self._db_audio_path}) + videoEditor.addEditingStep(EditingStep.ADD_BACKGROUND_MUSIC, {'url': self._db_background_music_url, + 'loop_background_music': self._db_voiceover_duration, + "volume_percentage": 0.11}) + videoEditor.addEditingStep(EditingStep.CROP_1920x1080, { + 'url': self._db_background_trimmed}) + videoEditor.addEditingStep(EditingStep.ADD_SUBSCRIBE_ANIMATION, {'url': AssetDatabase.get_asset_link('subscribe animation')}) + + if self._db_watermark: + videoEditor.addEditingStep(EditingStep.ADD_WATERMARK, { + 'text': self._db_watermark}) + videoEditor.addEditingStep(EditingStep.ADD_REDDIT_IMAGE, { + 'url': self._db_reddit_thread_image}) + + caption_type = EditingStep.ADD_CAPTION_SHORT_ARABIC if self._db_language == Language.ARABIC.value else EditingStep.ADD_CAPTION_SHORT + for timing, text in self._db_timed_captions: + videoEditor.addEditingStep(caption_type, {'text': text.upper(), + 'set_time_start': timing[0], + 'set_time_end': timing[1]}) + if self._db_num_images: + for timing, image_url in self._db_timed_image_urls: + videoEditor.addEditingStep(EditingStep.SHOW_IMAGE, {'url': image_url, + 'set_time_start': timing[0], + 'set_time_end': timing[1]}) + + videoEditor.renderVideo(outputPath, logger= self.logger if self.logger is not self.default_logger else None) + + self._db_video_path = outputPath + diff --git a/shortGPT/gpt/README.md b/shortGPT/gpt/README.md new file mode 100644 index 0000000000000000000000000000000000000000..e2f2b63bc7ae30c37533f4b41a5610aebbd4401b --- /dev/null +++ b/shortGPT/gpt/README.md @@ -0,0 +1,129 @@ +# Module: gpt + +The `gpt` module provides various functions for working with the OpenAI GPT-3 API. This module consists of multiple files, each serving a specific purpose. Let's take a look at each file and its contents. + +## File: gpt_utils.py + +This file contains utility functions used by other files in the module. Here are the functions defined in this file: + +### `num_tokens_from_messages(texts, model="gpt-3.5-turbo-0301")` + +This function calculates the number of tokens used by a list of messages. It takes the `texts` parameter as input, which can be either a string or a list of strings. The function returns the total number of tokens used. + +### `extract_biggest_json(string)` + +This function extracts the largest JSON object from a string. It searches for JSON objects using a regular expression and returns the object with the maximum length. + +### `get_first_number(string)` + +This function searches for the first occurrence of a number in a string and returns it. It uses a regular expression to match the number. + +### `load_yaml_file(file_path: str) -> dict` + +This function reads and returns the contents of a YAML file as a dictionary. It takes the file path as input and uses the `yaml.safe_load()` function to parse the YAML file. + +### `load_json_file(file_path)` + +This function reads and returns the contents of a JSON file. It takes the file path as input and uses the `json.load()` function to parse the JSON file. + +### `load_local_yaml_prompt(file_path)` + +This function loads a YAML file containing chat and system prompts and returns the chat and system prompts as separate strings. + +### `open_file(filepath)` + +This function opens and reads a file and returns its contents as a string. It takes the file path as input and uses the `open()` function to read the file. + +### `gpt3Turbo_completion(chat_prompt="", system="You are an AI that can give the answer to anything", temp=0.7, model="gpt-3.5-turbo", max_tokens=1000, remove_nl=True, conversation=None)` + +This function performs a GPT-3 completion using the OpenAI API. It takes various parameters such as chat prompt, system prompt, temperature, model, and maximum tokens. It returns the generated text as a response from the GPT-3 model. + +## File: reddit_gpt.py + +This file contains functions related to generating Reddit posts. Here are the functions defined in this file: + +### `generateRedditPostMetadata(title)` + +This function generates metadata for a Reddit post. It takes the post title as input and returns the title, header, number of comments, and number of upvotes. + +### `getInterestingRedditQuestion()` + +This function generates an interesting question for a Reddit post. It uses a YAML file containing chat and system prompts to generate the question. + +### `createRedditScript(question)` + +This function creates a Reddit script based on a given question. It uses a YAML file containing chat and system prompts to generate the script. + +### `getRealisticness(text)` + +This function calculates the realisticness score of a given text. It uses a YAML file containing chat and system prompts to generate the score. + +### `getQuestionFromThread(text)` + +This function extracts a question from a Reddit thread. It takes the thread text as input and uses a YAML file containing chat and system prompts to generate the question. + +### `generateUsername()` + +This function generates a username for a Reddit post. It uses a YAML file containing chat and system prompts to generate the username. + +## File: gpt_translate.py + +This file contains functions related to translating content using GPT-3. Here is the function defined in this file: + +### `translateContent(content, language)` + +This function translates the given content to the specified language. It takes the content and language as input and uses a YAML file containing chat and system prompts to perform the translation. + +## File: facts_gpt.py + +This file contains functions related to generating facts using GPT-3. Here are the functions defined in this file: + +### `generateFacts(facts_type)` + +This function generates facts of a specific type. It takes the facts type as input and uses a YAML file containing chat and system prompts to generate the facts. + +### `generateFactSubjects(n)` + +This function generates a list of fact subjects. It takes the number of subjects to generate as input and uses a YAML file containing chat and system prompts to generate the subjects. + +## File: gpt_yt.py + +This file contains functions related to generating YouTube video titles and descriptions using GPT-3. Here is the function defined in this file: + +### `generate_title_description_dict(content)` + +This function generates a title and description for a YouTube video based on the given content. It takes the content as input and uses a YAML file containing chat and system prompts to generate the title and description. + +## File: gpt_editing.py + +This file contains functions related to image and video editing using GPT-3. Here are the functions defined in this file: + +### `getImageQueryPairs(captions, n=15, maxTime=2)` + +This function generates pairs of image queries and their corresponding timestamps based on the given captions. It takes the captions, number of queries to generate, and maximum time between queries as input. It uses a YAML file containing chat prompts to generate the queries. + +### `getVideoSearchQueriesTimed(captions_timed)` + +This function generates timed video search queries based on the given captions with timestamps. It takes the captions with timestamps as input and uses a YAML file containing chat and system prompts to generate the queries. + +## File: gpt_chat_video.py + +This file contains functions related to generating chat video scripts using GPT-3. Here are the functions defined in this file: + +### `generateScript(script_description, language)` + +This function generates a script for a chat video based on the given description and language. It takes the script description and language as input and uses a YAML file containing chat and system prompts to generate the script. + +### `correctScript(script, correction)` + +This function corrects a script for a chat video based on the given original script and correction. It takes the original script and correction as input and uses a YAML file containing chat and system prompts to correct the script. + +## File: gpt_voice.py + +This file contains a function related to identifying the gender of a text using GPT-3. Here is the function defined in this file: + +### `getGenderFromText(text)` + +This function identifies the gender of a given text. It takes the text as input and uses a YAML file containing chat and system prompts to perform gender identification. It returns either "female" or "male" as the gender. + +These are the functions and their descriptions provided by the `gpt` module. Each function serves a specific purpose and can be used to perform various tasks related to GPT-3. \ No newline at end of file diff --git a/shortGPT/gpt/__init__.py b/shortGPT/gpt/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..3fb297b4bc136d470aa2337b6c868e6de7f59068 --- /dev/null +++ b/shortGPT/gpt/__init__.py @@ -0,0 +1,2 @@ +from . import gpt_utils +from . import reddit_gpt \ No newline at end of file diff --git a/shortGPT/gpt/facts_gpt.py b/shortGPT/gpt/facts_gpt.py new file mode 100644 index 0000000000000000000000000000000000000000..8249bd353336bcaa84bb31219db6ff2fdf002d5b --- /dev/null +++ b/shortGPT/gpt/facts_gpt.py @@ -0,0 +1,23 @@ +from shortGPT.gpt import gpt_utils +import json +def generateFacts(facts_type): + chat, system = gpt_utils.load_local_yaml_prompt('prompt_templates/facts_generator.yaml') + chat = chat.replace("<>", facts_type) + result = gpt_utils.gpt3Turbo_completion(chat_prompt=chat, system=system, temp=1.3) + return result + +def generateFactSubjects(n): + out = [] + chat, system = gpt_utils.load_local_yaml_prompt('prompt_templates/facts_subjects_generation.yaml') + chat = chat.replace("<>", f"{n}") + count = 0 + while len(out) != n: + result = gpt_utils.gpt3Turbo_completion(chat_prompt=chat, system=system, temp=1.69) + count+=1 + try: + out = json.loads(result.replace("'", '"')) + except Exception as e: + print(f"INFO - Failed generating {n} fact subjects after {count} trials", e) + pass + + return out \ No newline at end of file diff --git a/shortGPT/gpt/gpt_chat_video.py b/shortGPT/gpt/gpt_chat_video.py new file mode 100644 index 0000000000000000000000000000000000000000..3199ed6f4805e1e07d9f49795399accf205fac09 --- /dev/null +++ b/shortGPT/gpt/gpt_chat_video.py @@ -0,0 +1,26 @@ +from shortGPT.gpt import gpt_utils +import json +def generateScript(script_description, language): + out = {'script': ''} + chat, system = gpt_utils.load_local_yaml_prompt('prompt_templates/chat_video_script.yaml') + chat = chat.replace("<>", script_description).replace("<>", language) + while not ('script' in out and out['script']): + try: + result = gpt_utils.gpt3Turbo_completion(chat_prompt=chat, system=system, temp=1) + out = json.loads(result) + except Exception as e: + print(e, "Difficulty parsing the output in gpt_chat_video.generateScript") + return out['script'] + +def correctScript(script, correction): + out = {'script': ''} + chat, system = gpt_utils.load_local_yaml_prompt('prompt_templates/chat_video_edit_script.yaml') + chat = chat.replace("<>", script).replace("<>", correction) + + while not ('script' in out and out['script']): + try: + result = gpt_utils.gpt3Turbo_completion(chat_prompt=chat, system=system, temp=1) + out = json.loads(result) + except Exception as e: + print("Difficulty parsing the output in gpt_chat_video.generateScript") + return out['script'] \ No newline at end of file diff --git a/shortGPT/gpt/gpt_editing.py b/shortGPT/gpt/gpt_editing.py new file mode 100644 index 0000000000000000000000000000000000000000..492e659863a470f22c1b0a765620633bbc565396 --- /dev/null +++ b/shortGPT/gpt/gpt_editing.py @@ -0,0 +1,40 @@ +from shortGPT.gpt import gpt_utils +import json +def getImageQueryPairs(captions,n=15 ,maxTime=2): + chat, _ = gpt_utils.load_local_yaml_prompt('prompt_templates/editing_generate_images.yaml') + prompt = chat.replace('<>', f"{captions}").replace("<>", f"{n}") + res = gpt_utils.gpt3Turbo_completion(chat_prompt=prompt) + imagesCouples = ('{'+res).replace('{','').replace('}','').replace('\n', '').split(',') + pairs = [] + t0 = 0 + end_audio = captions[-1][0][1] + for a in imagesCouples: + try: + query = a[a.find("'")+1:a.rfind("'")] + time = float(a.split(":")[0].replace(' ','')) + if (time > t0 and time< end_audio): + pairs.append((time, query+" image")) + t0 = time + except: + print('problem extracting image queries from ', a) + for i in range(len(pairs)): + if(i!= len(pairs)-1): + end = pairs[i][0]+ maxTime if (pairs[i+1][0] - pairs[i][0]) > maxTime else pairs[i+1][0] + else: + end = pairs[i][0]+ maxTime if (end_audio - pairs[i][0]) > maxTime else end_audio + pairs[i] = ((pairs[i][0], end), pairs[i][1]) + return pairs + + +def getVideoSearchQueriesTimed(captions_timed): + end = captions_timed[-1][0][1] + chat, system = gpt_utils.load_local_yaml_prompt('prompt_templates/editing_generate_videos.yaml') + chat = chat.replace("<>", f"{captions_timed}") + out = [[[0,0],""]] + while out[-1][0][1] != end: + try: + out = json.loads(gpt_utils.gpt3Turbo_completion(chat_prompt=chat, system=system, temp=1).replace("'", '"')) + except Exception as e: + print(e) + print("not the right format") + return out \ No newline at end of file diff --git a/shortGPT/gpt/gpt_translate.py b/shortGPT/gpt/gpt_translate.py new file mode 100644 index 0000000000000000000000000000000000000000..8c6406e6b0644f6b89b307f5fb72dd9d56fcd0fa --- /dev/null +++ b/shortGPT/gpt/gpt_translate.py @@ -0,0 +1,10 @@ +from shortGPT.gpt import gpt_utils + +def translateContent(content, language): + chat, system = gpt_utils.load_local_yaml_prompt('prompt_templates/translate_content.yaml') + if language == "arabic": + language =="arabic, and make the translated text two third of the length of the original." + system = system.replace("<>", language) + chat = chat.replace("<>", content) + result = gpt_utils.gpt3Turbo_completion(chat_prompt=chat, system=system, temp=1) + return result \ No newline at end of file diff --git a/shortGPT/gpt/gpt_utils.py b/shortGPT/gpt/gpt_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..58fef99459717fef22a913cf2b0209dfaa324d23 --- /dev/null +++ b/shortGPT/gpt/gpt_utils.py @@ -0,0 +1,110 @@ +import json +import os +import re +from time import sleep, time +import g4f +import openai +import tiktoken +import yaml + +from shortGPT.config.api_db import ApiKeyManager + + +def num_tokens_from_messages(texts, model="gpt-3.5-turbo-0301"): + """Returns the number of tokens used by a list of messages.""" + try: + encoding = tiktoken.encoding_for_model(model) + except KeyError: + encoding = tiktoken.get_encoding("cl100k_base") + if model == "gpt-3.5-turbo-0301": # note: future models may deviate from this + if isinstance(texts, str): + texts = [texts] + score = 0 + for text in texts: + score += 4 + len(encoding.encode(text)) + return score + else: + raise NotImplementedError(f"""num_tokens_from_messages() is not presently implemented for model {model}. + See https://github.com/openai/openai-python/blob/main/chatml.md for information""") + + +def extract_biggest_json(string): + json_regex = r"\{(?:[^{}]|(?R))*\}" + json_objects = re.findall(json_regex, string) + if json_objects: + return max(json_objects, key=len) + return None + + +def get_first_number(string): + pattern = r'\b(0|[1-9]|10)\b' + match = re.search(pattern, string) + if match: + return int(match.group()) + else: + return None + + +def load_yaml_file(file_path: str) -> dict: + """Reads and returns the contents of a YAML file as dictionary""" + return yaml.safe_load(open_file(file_path)) + + +def load_json_file(file_path): + with open(file_path, 'r', encoding='utf-8') as f: + json_data = json.load(f) + return json_data + +from pathlib import Path + +def load_local_yaml_prompt(file_path): + _here = Path(__file__).parent + _absolute_path = (_here / '..' / file_path).resolve() + json_template = load_yaml_file(str(_absolute_path)) + return json_template['chat_prompt'], json_template['system_prompt'] + + +def open_file(filepath): + with open(filepath, 'r', encoding='utf-8') as infile: + return infile.read() + + +def gpt3Turbo_completion(chat_prompt="", system="You are an AI that can give the answer to anything", temp=0.7, model="gpt-3.5-turbo", max_tokens=1000, remove_nl=True, conversation=None): + openai.api_key = ApiKeyManager.get_api_key("OPENAI") + max_retry = 5 + retry = 0 + while True: + try: + if conversation: + messages = conversation + else: + messages = [ + {"role": "system", "content": system}, + {"role": "user", "content": chat_prompt} + ] + # response = openai.chat.completions.create( + # model=model, + # messages=messages, + # max_tokens=max_tokens, + # temperature=temp) + + g4f.ChatCompletion.create( + model=g4f.models.gpt_35_turbo_16k_0613, + messages=[{"role": "system", "content": system}, {"role": "user", "content": chat_prompt}], + ) + + text = response.choices[0].message.content.strip() + if remove_nl: + text = re.sub('\s+', ' ', text) + filename = '%s_gpt3.txt' % time() + if not os.path.exists('.logs/gpt_logs'): + os.makedirs('.logs/gpt_logs') + with open('.logs/gpt_logs/%s' % filename, 'w', encoding='utf-8') as outfile: + outfile.write(f"System prompt: ===\n{system}\n===\n"+f"Chat prompt: ===\n{chat_prompt}\n===\n" + f'RESPONSE:\n====\n{text}\n===\n') + return text + except Exception as oops: + retry += 1 + if retry >= max_retry: + raise Exception("GPT3 error: %s" % oops) + print('Error communicating with OpenAI:', oops) + sleep(1) \ No newline at end of file diff --git a/shortGPT/gpt/gpt_voice.py b/shortGPT/gpt/gpt_voice.py new file mode 100644 index 0000000000000000000000000000000000000000..49a5c30788922f55c19cc5518c46d9762d816af1 --- /dev/null +++ b/shortGPT/gpt/gpt_voice.py @@ -0,0 +1,9 @@ + +from shortGPT.gpt import gpt_utils +def getGenderFromText(text): + chat, system = gpt_utils.load_local_yaml_prompt('prompt_templates/voice_identify_gender.yaml') + chat = chat.replace("<>", text) + result = gpt_utils.gpt3Turbo_completion(chat_prompt=chat, system=system).replace("\n", "").lower() + if 'female' in result: + return 'female' + return 'male' \ No newline at end of file diff --git a/shortGPT/gpt/gpt_yt.py b/shortGPT/gpt/gpt_yt.py new file mode 100644 index 0000000000000000000000000000000000000000..346efd2034f22fea863cdb95b42b755a8786e207 --- /dev/null +++ b/shortGPT/gpt/gpt_yt.py @@ -0,0 +1,20 @@ +from shortGPT.gpt import gpt_utils +import json + +def generate_title_description_dict(content): + out = {"title": "", "description":""} + chat, system = gpt_utils.load_local_yaml_prompt('prompt_templates/yt_title_description.yaml') + chat = chat.replace("<>", f"{content}") + + while out["title"] == "" or out["description"] == "": + result = gpt_utils.gpt3Turbo_completion(chat_prompt=chat, system=system, temp=1) + try: + response = json.loads(result) + if "title" in response: + out["title"] = response["title"] + if "description" in response: + out["description"] = response["description"] + except Exception as e: + pass + + return out['title'], out['description'] diff --git a/shortGPT/gpt/reddit_gpt.py b/shortGPT/gpt/reddit_gpt.py new file mode 100644 index 0000000000000000000000000000000000000000..8c917880054d2e239c05fe1e6982b63abf8bc9e0 --- /dev/null +++ b/shortGPT/gpt/reddit_gpt.py @@ -0,0 +1,52 @@ +from shortGPT.gpt import gpt_utils +import random +import json +def generateRedditPostMetadata(title): + name = generateUsername() + if title and title[0] == '"': + title = title.replace('"', '') + n_months = random.randint(1,11) + header = f"{name} - {n_months} months ago" + n_comments = random.random() * 10 + 2 + n_upvotes = n_comments*(1.2+ random.random()*2.5) + return title, header, f"{n_comments:.1f}k", f"{n_upvotes:.1f}k" + + +def getInterestingRedditQuestion(): + chat, system = gpt_utils.load_local_yaml_prompt('prompt_templates/reddit_generate_question.yaml') + return gpt_utils.gpt3Turbo_completion(chat_prompt=chat, system=system, temp=1.08) + +def createRedditScript(question): + chat, system = gpt_utils.load_local_yaml_prompt('prompt_templates/reddit_generate_script.yaml') + chat = chat.replace("<>", question) + result = "Reddit, " + question +" "+gpt_utils.gpt3Turbo_completion(chat_prompt=chat, system=system, temp=1.08) + return result + + +def getRealisticness(text): + chat, system = gpt_utils.load_local_yaml_prompt('prompt_templates/reddit_filter_realistic.yaml') + chat = chat.replace("<>", text) + while True: + try: + result = gpt_utils.gpt3Turbo_completion(chat_prompt=chat, system=system, temp=1) + return json.loads(result)['score'] + except Exception as e: + print("Error in getRealisticness", e.args[0]) + + +def getQuestionFromThread(text): + if ((text.find("Reddit, ") < 15) and (10 < text.find("?") < 100)): + question = text.split("?")[0].replace("Reddit, ", "").strip().capitalize() + else: + chat, system = gpt_utils.load_local_yaml_prompt('prompt_templates/reddit_filter_realistic.yaml') + chat = chat.replace("<>", text) + question = gpt_utils.gpt3Turbo_completion(chat_prompt=chat, system=system).replace("\n", "") + question = question.replace('"', '').replace("?", "") + return question + + +def generateUsername(): + chat, system = gpt_utils.load_local_yaml_prompt('prompt_templates/reddit_username.yaml') + return gpt_utils.gpt3Turbo_completion(chat_prompt=chat, system=system, temp=1.2).replace("u/", "") + + diff --git a/shortGPT/prompt_templates/__init__.py b/shortGPT/prompt_templates/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/shortGPT/prompt_templates/chat_video_edit_script.yaml b/shortGPT/prompt_templates/chat_video_edit_script.yaml new file mode 100644 index 0000000000000000000000000000000000000000..304dae60b7dc293b5eb7fcbb94bfd198ea704f14 --- /dev/null +++ b/shortGPT/prompt_templates/chat_video_edit_script.yaml @@ -0,0 +1,15 @@ +system_prompt: | + You are an expert video script writer / editor. You ONLY write text that is read. You only write the script that will be read by a voice actor for a video. The user will give you a script they have already written and the corrections they want you to make. From that, you will edit the script. Make sure to directly edit the script in response to the corrections given. + Your edited script will not have any reference to the audio footage / video footage shown. Only the text that will be narrated by the voice actor. + You will edit purely text. + Don't write any other textual thing than the text itself. + Make sure the text is not longer than 200 words (keep the video pretty short and neat). + # Output + You will output the edited script in a JSON format of this kind, and only a parsable JSON object + {"script": "did you know that ... ?"} + +chat_prompt: | + Original script: + <> + Corrections: + <> \ No newline at end of file diff --git a/shortGPT/prompt_templates/chat_video_script.yaml b/shortGPT/prompt_templates/chat_video_script.yaml new file mode 100644 index 0000000000000000000000000000000000000000..5ab4d6c81027a2ee1afdf29589dcfcf6eaf114f7 --- /dev/null +++ b/shortGPT/prompt_templates/chat_video_script.yaml @@ -0,0 +1,14 @@ +system_prompt: | + You are an expert video writer. You ONLY produce text that is read. You only produce the script. that will be read by a voice actor for a video. The user will give you the description of the video they want you to make and from that, you will write the script. Make sure to directly write the script in response to the video description. + Your script will not have any reference to the audio footage / video footage shown. Only the text that will be narrated by the voice actor. + You will produce purely text. + Don't write any other textual thing than the text itself. + Make sure the text is not longer than 200 words (keep the video pretty short and neat). + # Output + You will output the script in a JSON format of this kind, and only a parsable JSON object + {"script": "did you know that ... ?"} + +chat_prompt: | + Language: <> + Video description: + <> diff --git a/shortGPT/prompt_templates/editing_generate_images.yaml b/shortGPT/prompt_templates/editing_generate_images.yaml new file mode 100644 index 0000000000000000000000000000000000000000..2691c3e550315da574a2b858067f574ed9d16dab --- /dev/null +++ b/shortGPT/prompt_templates/editing_generate_images.yaml @@ -0,0 +1,22 @@ +system_prompt: | + +chat_prompt: | + You are a shorts video editor. Your audience is people from 18 yo to 40yo. Your style of editing is pretty simple, you take the transcript of your short and put a very simple google image to illustrate the narrated sentances. + + Each google image is searched with a short query of two words maximum. So let's say someone is talking about being sad, you would query on google `sad person frowning` and show that image around that sentence. + + I will give you a transcript which contains which words are shown at the screen, and the timestamps where they are shown. Understand the transcript, and time images at timestamps and, write me the query for each image. For the image queries you have two choices: concrete objects, like 'cash', 'old table', and other objects, or people in situations like 'sad person', 'happy family', ect... Generate a maximum of <> image queries equally distributed in the video. + + Avoid depicting shocking or nude / crude images, since your video will get demonetized. The queries should bring images that represent objects and persons that are useful to understand the emotions and what is happening in the transcript. The queries should describe OBJECTS or PERSONS. So for something romantic, maybe a couple hugging, or a heart-shaped balloon. For the image queries you have two choices: concrete objects, like 'cash', 'old table', and other objects, or people in situations like 'sad person', 'happy family', ect.. + + The images should be an image representation of what is happening. Use places and real life people as image queries if you find any in the transcript. Avoid using overly generic queries like 'smiling man' that can bring up horror movie pictures, use the word 'person instead'. Instead, try to use more specific words that describe the action or emotion in the scene. Also, try to avoid queries that don't represent anything in images, such as abstract concepts, ideas, or feelings. MAKE SURE THAT THE QUERIES ARE VERY DESCRIPTIVE AND VISUAL AND CAN BE DRAWN AND NEVER USE WORDS THAT ONLY DESCRIBE AN ABSTRACT IDEA. NEVER USE ABSTRACT NOUNS IN THE QUERIES. ALWAYS USE REAL OBJECTS OR PERSONS IN THE QUERIES. + + Transcript: + + <> + + + Every few transcript captions, find an image that can be shown. Really understand the context and emotions for the image to be good ! The queries should describe OBJECTS or PERSONS. Write it in a dictionary with timestamp to query format like { 1.0: 'happy person', 3.2: 'sad person', ...} . DON'T GENERATE A QUERY FOR EACH CAPTION. Generate <> image queries and time them accordingly in the video. NEVER use the same search query for multiple captions. Make sure that the timestamps make sense. + NEVER USE ABSTRACT NOUNS IN THE QUERIES. ALWAYS USE REAL OBJECTS OR PERSONS IN THE QUERIES. + For the image queries you have two choices: concrete objects, like 'cash', 'old table', 'red car', 'broken pen' and other objects, or people in situations like 'sad person', 'happy family', ect.. Choose more objects than people. + The <> generated image queries and their timestamps, make sure to respect the number <>: diff --git a/shortGPT/prompt_templates/editing_generate_videos.yaml b/shortGPT/prompt_templates/editing_generate_videos.yaml new file mode 100644 index 0000000000000000000000000000000000000000..6f27297dcdcb66726bb55113c24747aa2537ecd7 --- /dev/null +++ b/shortGPT/prompt_templates/editing_generate_videos.yaml @@ -0,0 +1,32 @@ +system_prompt: | + # Instructions + + You're a video research expert. The user will give you the timed captions of a video they will make, and you will give back a list of couples of text search queries that will be used to search for background video footage, and the time t1 and t2 when it will be shown in the video. + # Output format + The format will be JSON parasable and look like this: + [[[0.0, 4.4], ["Dog barking", "Dog angry", Canine angry"]], [[4.4, 7.8], "bone", "pet food", "food", "canine"], ect... + + # Time periods t1 and t2 + Time periods t1 and t2 must always be consecutive, and last between 4 to 5 seconds, and must cover the whole video. + For example, [0, 2.5] <= IS BAD, because 2.5-0 = 2.5 < 3 + [0, 11] <= IS BAD, because 11sec > 5 sec + [0, 4.2] <= IS GOOD + + # Query search string list + YOU ALWAYS USE ENGLISH IN YOUR TEXT QUERIES + As you have seen above, for each time period you will be tasked to generate 3 strings that will be searched on the video search engine, to find the appropriate clip to find. + Each string has to be between ONE to TWO words. + Each search string must DEPICT something visual. + The depictions have to be extremely visually concrete, like `coffee beans`, or `dog running`. + 'confused feelings' <= BAD, because it doesn't depict something visually + 'heartbroken man' <= GOOD, because it depicts something visual. + 'man feeling very lonely' <= BAD, because it contains 4 words. + The list must always contain 3 query searches. + ['Sad person'] <= BAD, because it's one string + ['Sad person', 'depressed man', 'depressed person'] <= GOOD, because it's 3 strings + ['Une Pomme', 'un enfant qui rit', 'une personne heureuse'] <= BAD, because the text query is NOT in english + +chat_prompt: | + Timed captions: + <> + Video search queries: diff --git a/shortGPT/prompt_templates/facts_generator.yaml b/shortGPT/prompt_templates/facts_generator.yaml new file mode 100644 index 0000000000000000000000000000000000000000..c5bf8f1e55d98700bb9dc1bb1640e327787eeb4a --- /dev/null +++ b/shortGPT/prompt_templates/facts_generator.yaml @@ -0,0 +1,35 @@ +system_prompt: > + You are an expert content writer of a YouTube shorts channel. You specialize in `facts` shorts. + Your facts shorts are less than 50 seconds verbally ( around 140 words maximum). They are extremely captivating, and original. + The user will ask you a type of facts short and you will produce it. + For examples, when the user Asks : + `Weird facts` + You produce the following content script: + + --- + Weird facts you don't know. + A swarm of 20,000 bees followed a car for two days because their queen was stuck inside. + Rockados cannot stick their tongue out because it's attached to the roof of their mouths. + + If you tickle a rat day after day, it will start laughing whenever it sees you. + + In 2013, police and the Maldives arrested a coconut for lordering near a polling station for the presidential election. + Locals fear the coconut may have been ingrained with a black magic spell to influence the election. + + A Chinese farmer who always wanted to own his own plane built a full scale, + non-working replica of an airbus A320 out of 50 tons of steel. It took him and his friends over two years and costed over $400,000. + + When invited by a lady to spend a night with her, Benjamin Franklin asked to postpone until winter when nights were longer. + --- + + You are now tasked to produce the greatest short script depending on the user's request type of 'facts'. + Only give the first `hook`, like "Weird facts you don't know. " in the example. Then the facts. + Keep it short, extremely interesting and original. + +chat_prompt: > + <> + + + + + diff --git a/shortGPT/prompt_templates/facts_subjects_generation.yaml b/shortGPT/prompt_templates/facts_subjects_generation.yaml new file mode 100644 index 0000000000000000000000000000000000000000..499ee157a815aead995daa264a3354e0849e86a8 --- /dev/null +++ b/shortGPT/prompt_templates/facts_subjects_generation.yaml @@ -0,0 +1,7 @@ +system_prompt: > + +chat_prompt: > + For a series of <> youtube video about top 10 facts on a certain subject, + pick a random subject. Be very original. Put it in the '`Subject` facts' format. + Give the output in an array format that's json parseable., like ['Police facts', 'prison facts']. + Only give the array and nothing else. diff --git a/shortGPT/prompt_templates/reddit_extract_question.yaml b/shortGPT/prompt_templates/reddit_extract_question.yaml new file mode 100644 index 0000000000000000000000000000000000000000..fe26440f9b6252b8ee657c93994437dcab5f4cf8 --- /dev/null +++ b/shortGPT/prompt_templates/reddit_extract_question.yaml @@ -0,0 +1,24 @@ +system_prompt: | + From the transcript of a reddit ask, tell me the question in the title. The transcript always answers the question that a redditor asks in the title of the thread. + The question in the title must be a very shorts open-ended question that requires opinion/anecdotal-based answers. Examples of questions are: + --- + What’s the worst part of having a child? + What screams “this person peaked in high school” to you? + What was your “it can’t be that easy / it was that easy” moment in your life? + --- + Rules: + Most important rule : The question MUST be directed at the person reading it, the subject of the question should ALWAYS be the reader. It must contain 'you' or 'your', or something asking THEM their experience. + * The question is always very general, and then, people answer it with a specific anecdote that is related to that question. The question is always short and can bring spicy answers. By taking inspiration from the questions above, try to find the reddit thread question where we get the following anecdote. + * The question NEVER contains "I" as it is NOT answered by the person asking it. + * The question is NEVER specific too specific about a certain situation. + * The question should be as short and consise as possible. NEVER be too wordy, it must be fast and concise, and it doesn't matter if it's too general. + * The question must sound good to the ear, and bring interest. It should sound natural. + * The question must use the vocabulary of reddit users. Young, not too complicated, and very straight to the point. + * The question must be relatable for anyone, girl or guy. + The question should ALWAYS START with "What" +chat_prompt: | + -Transcript: + <> + The question should ALWAYS START with "What" + -Most probable very short and conssise open-ended question from the transcript (50 characters MAXIMUM): + \ No newline at end of file diff --git a/shortGPT/prompt_templates/reddit_filter_realistic.yaml b/shortGPT/prompt_templates/reddit_filter_realistic.yaml new file mode 100644 index 0000000000000000000000000000000000000000..7d4c4b0f76ef7c02722676459d19387864c5663c --- /dev/null +++ b/shortGPT/prompt_templates/reddit_filter_realistic.yaml @@ -0,0 +1,13 @@ +system_prompt: | + You are the judge of the story. Your goal will be to judge if it can possibly happen. + If it's possible and the story makes sense, then it's a 10, and if it's something that wouldn't ever happen in real life or something that doesn't make sense at all, it's a 0. + You have to be tolerant and keep in mind that the stories are sometimes very unlikely, but really happened, so you will only give a low score when something doesn't make sense in the story. + + For parsing purposes, you will ALWAYS the output as a JSON OBJECT with the key `score` and the value being the number between 1 to 10 and. + The output should look like: + {score: 1.3} + +chat_prompt: | + Story: + <> + Output: \ No newline at end of file diff --git a/shortGPT/prompt_templates/reddit_generate_question.yaml b/shortGPT/prompt_templates/reddit_generate_question.yaml new file mode 100644 index 0000000000000000000000000000000000000000..d46266d2e956810ccaa28241f09710756ed4aac4 --- /dev/null +++ b/shortGPT/prompt_templates/reddit_generate_question.yaml @@ -0,0 +1,25 @@ +system_prompt: | + You will write an interesting reddit ask thread question. + + Instructions for the question: + The question in the must be a very shorts open-ended question that requires opinion/anecdotal-based answers. Examples of questions are: + --- + What’s the worst part of having a child? + What screams “this person peaked in high school” to you? + What was your “it can’t be that easy / it was that easy” moment in your life? + Have you ever had a bad date turning into a good one? + --- + Most important rule for questions : The question MUST be directed at the person reading it, the subject of the question should ALWAYS be the reader. It must contain 'you' or 'your', or something asking THEM their experience. + * The question is always very general, and then, people answer it with a specific anecdote that is related to that question. The question is always short and can bring spicy answers. + * The question NEVER contains 'I' as it is NOT answered by the person asking it. + * The question is NEVER too specific about a certain situation. + * The question should be as short and consise as possible. NEVER be too wordy, it must be fast and concise. + * The question must sound good to the ear, and bring interest. It should sound natural. + * The question must use the vocabulary of reddit users. Young, not too complicated, and very straight to the point. + The question must spark curiosity and interest, and must create very entertaining answers + * The question must be relatable for anyone, girl or guy. + * The question is maximum 80 characters long + +chat_prompt: | + Totally new question: + \ No newline at end of file diff --git a/shortGPT/prompt_templates/reddit_generate_script.yaml b/shortGPT/prompt_templates/reddit_generate_script.yaml new file mode 100644 index 0000000000000000000000000000000000000000..890b5de8af16f03d503ab0ec5918a942ae093561 --- /dev/null +++ b/shortGPT/prompt_templates/reddit_generate_script.yaml @@ -0,0 +1,18 @@ +system_prompt: | + Instructions for the new story: + You are a YouTube shorts content creator who makes extremely good YouTube shorts over answers from AskReddit questions. I'm going to give you a question, and you will give an anecdote as if you are a redditor than answered that question (narrated with 'I' in the first person). The anecdote you will create will be used in a YouTube short that will get 1 million views. + 1- The story must be between 120 and 140 words MAXIMUM. + 2- DO NOT end the story with a moral conclusion or any sort of conclusion that elongates the personal story. Just stop it when it makes sense. + 3- Make sure that the story is very SPICY, very unusual, HIGHLY entertaining to listen to, not boring, and not a classic story that everyone tells. + 4- Make sure that the new short's content is totally captivating and will bang with the YouTube algorithm. + 5- Make sure that the story directly answers the title. + 6- Make the question sound like an r/AskReddit question: open-ended and very interesting, very short and not too specific. + 7- The language used in the story must be familiar, casual that a normal person telling an story would use. Even youthful. + 8- The story must be narrated as if you're a friend of the viewer telling them about the story. + 9- Start the the story with 'I' + +chat_prompt: | + Reddit question: <> + + -New Generated story. The story has to be highly unusual and spicy and must really surprise its listeners and hook them up to the story. Don't forget to make it between 120 and 140 words: + Reddit, <> \ No newline at end of file diff --git a/shortGPT/prompt_templates/reddit_story_filter.yaml b/shortGPT/prompt_templates/reddit_story_filter.yaml new file mode 100644 index 0000000000000000000000000000000000000000..4f8a48e7a34464a438f5fabd0d01ea78ce4f8635 --- /dev/null +++ b/shortGPT/prompt_templates/reddit_story_filter.yaml @@ -0,0 +1,26 @@ +system_prompt: > + You're a judge of the realisticness of a story for a youtube short. + You must put yourself in the shoes of the youtube viewer hearing this story + and determine if it's totally nonsense. + Your goal will be to judge if it can possibly happen. + If it's possible and the story makes sense, then it's a 10, + and if it's something that wouldn't ever happen in real life or + something that doesn't make sense at all, it's a 0. + + You have to be tolerant and keep in mind that the stories are meant to be unusual, they are sometimes very unlikely, + but really happened, so you will only give a low score when something doesn't make sense in the story. + For parsing purposes, you will ALWAYS the output as a JSON OBJECT with the key + 'score' and the value being the number between 1 to 10 and the key 'explanation' + with one sentence to explain why it's not. Make this explanation maximum 4 words. + The output should look like: + {score: number, explanation: "some words..."} + + Give perfect json with keys score and explanation, and nothing else. + +chat_prompt: > + Story: + + <> + + Output: + diff --git a/shortGPT/prompt_templates/reddit_username.yaml b/shortGPT/prompt_templates/reddit_username.yaml new file mode 100644 index 0000000000000000000000000000000000000000..b7da0f0add87f3d4104de649104a009817a03608 --- /dev/null +++ b/shortGPT/prompt_templates/reddit_username.yaml @@ -0,0 +1,6 @@ +system_prompt: > + +chat_prompt: > + Generate a random Reddit name with one or two numbers inside the name. Only generate one name, and don't output anything else. Make it sound natural. The name must be between 7 and 10 characters: + u/ + diff --git a/shortGPT/prompt_templates/translate_content.yaml b/shortGPT/prompt_templates/translate_content.yaml new file mode 100644 index 0000000000000000000000000000000000000000..bc6832185d3a8204da9663a72dab009ee6cf85a4 --- /dev/null +++ b/shortGPT/prompt_templates/translate_content.yaml @@ -0,0 +1,26 @@ +system_prompt: > + You're an expert content translator to <>. + You always translate sentences very properly, and you write down numbers in WORDS, you never write digits in your text. + + IMPORTANT INSTRUCTION: + ***You write down numbers in words + For example: + Input: "There are 7 days in a week." + Translation: "Existem sete dias em uma semana." + + Example 2: + Input: "She bought 4 apples at the market." + Translation: "Existem sete dias em uma semana." + + Example 3: + Input:"The temperature is -2 degrees Celsius." + Translation: "A temperatura está dois graus Celsius negativos." + + + Example 4: + Input: "He is 30 years old." + Translation: "Ele tem trinta anos de idade." + ** + +chat_prompt: > + <> \ No newline at end of file diff --git a/shortGPT/prompt_templates/voice_identify_gender.yaml b/shortGPT/prompt_templates/voice_identify_gender.yaml new file mode 100644 index 0000000000000000000000000000000000000000..8ecf5ea315c86eb4c09aedfe4179faf84f9ac14d --- /dev/null +++ b/shortGPT/prompt_templates/voice_identify_gender.yaml @@ -0,0 +1,13 @@ +system_prompt: | + I will give you a narrated transcript and you must identify if it's most probably a male or female. + If you think the narrator is more probable to be a male, answer "male" and if you think it's female, say "female". + If you don't know, just say male. + + +chat_prompt: | + Transcript: + + <> + + Gender of narrator: + diff --git a/shortGPT/prompt_templates/yt_title_description.yaml b/shortGPT/prompt_templates/yt_title_description.yaml new file mode 100644 index 0000000000000000000000000000000000000000..eec5e0e83b4c4623a2d2e2266e48eae238f23a57 --- /dev/null +++ b/shortGPT/prompt_templates/yt_title_description.yaml @@ -0,0 +1,11 @@ +system_prompt: > + You are a youtube shorts title and description expert writer. + The user will give you the transcript of a youtube short, and you will create a title, and a description. In function of the audience, demography of viewers, you will adapt the title to be catchy. + Use only MAXIMUM 2 emojis in the title of the video ( very depending on the context, be careful) + and use hashtags in the description + The title has to be less than 80 characters (one small sentance of 10 words max) + And the description maximum 240 characters (keep it small) + You will give the title and description in a perfect json format. You will give nothing else but the perfect json object with key `title` and `description` + In your JSON, use the double quotes "" instead of '' +chat_prompt: > + <> diff --git a/shortGPT/tracking/README.md b/shortGPT/tracking/README.md new file mode 100644 index 0000000000000000000000000000000000000000..25bec3e9afb594ec70c5ed9e8380986d2aba9cb1 --- /dev/null +++ b/shortGPT/tracking/README.md @@ -0,0 +1,56 @@ +# Module: Tracking + +## Goal +The `tracking` module is responsible for tracking and analyzing the usage and cost of various APIs used in the project. It includes two files: `api_tracking.py` and `cost_analytics.py`. + +## File: api_tracking.py + +### Class: APITracker +This class is responsible for tracking the usage of APIs and saving the data to a content manager. + +#### Method: `__init__()` +- Initializes the APITracker object. +- Calls the `initiateAPITracking()` method. + +#### Method: `setDataManager(contentManager: ContentDataManager)` +- Sets the content manager for storing the API usage data. +- Raises an exception if the content manager is null. + +#### Method: `openAIWrapper(gptFunc)` +- Wrapper function for OpenAI API calls. +- Saves the API usage data to the content manager. +- Returns the result of the API call. + +#### Method: `elevenWrapper(audioFunc)` +- Wrapper function for Eleven API calls. +- Saves the API usage data to the content manager. +- Returns the result of the API call. + +#### Method: `wrap_turbo()` +- Wraps the `gpt3Turbo_completion` function from the `gpt_utils` module using the `openAIWrapper` method. +- Replaces the original function with the wrapped function. + +#### Method: `wrap_eleven()` +- Wraps the `generateVoice` function from the `audio_generation` module using the `elevenWrapper` method. +- Replaces the original function with the wrapped function. + +#### Method: `initiateAPITracking()` +- Initiates the tracking of APIs by wrapping the necessary functions using the `wrap_turbo` and `wrap_eleven` methods. + + +## File: cost_analytics.py + +### Function: calculateCostAnalytics() +This function calculates the average usage and cost of OpenAI and Eleven APIs based on the data stored in the content database. + +- Initializes the content database. +- Retrieves the API usage data from the database. +- Calculates the average usage and cost for OpenAI and Eleven APIs. +- Prints the results. + +### Usage example: +```python +calculateCostAnalytics() +``` + +Note: The commented code at the end of the file is unrelated and can be ignored. \ No newline at end of file diff --git a/shortGPT/tracking/__init__.py b/shortGPT/tracking/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..47fca8ef18752bce148c7ce6f1656c733063f79b --- /dev/null +++ b/shortGPT/tracking/__init__.py @@ -0,0 +1 @@ +from . import api_tracking \ No newline at end of file diff --git a/shortGPT/tracking/api_tracking.py b/shortGPT/tracking/api_tracking.py new file mode 100644 index 0000000000000000000000000000000000000000..bda95f625816baf68cf164fb5ee5e7b27957f1db --- /dev/null +++ b/shortGPT/tracking/api_tracking.py @@ -0,0 +1,60 @@ +from shortGPT.gpt import gpt_utils +from shortGPT.database.content_data_manager import ContentDataManager +import json + +class APITracker: + + def __init__(self): + self.initiateAPITracking() + + def setDataManager(self, contentManager : ContentDataManager): + if(not contentManager): + raise Exception("contentManager is null") + self.datastore = contentManager + + def openAIWrapper(self, gptFunc): + + def wrapper(*args, **kwargs): + result = gptFunc(*args, **kwargs) + prompt = kwargs.get('prompt') or kwargs.get('conversation') or args[0] + prompt = json.dumps(prompt) + if self.datastore and result: + tokensUsed = gpt_utils.num_tokens_from_messages([prompt, result]) + self.datastore.save('api_openai', tokensUsed, add=True) + return result + + return wrapper + + def elevenWrapper(self, audioFunc): + + def wrapper(*args, **kwargs): + result = audioFunc(*args, **kwargs) + textInput = kwargs.get('text') or args[0] + if self.datastore and result: + self.datastore.save('api_eleven', len(textInput), add=True) + return result + + return wrapper + + + def wrap_turbo(self): + func_name = "gpt3Turbo_completion" + module = __import__("gpt_utils", fromlist=["gpt3Turbo_completion"]) + func = getattr(module, func_name) + wrapped_func = self.openAIWrapper(func) + setattr(module, func_name, wrapped_func) + + def wrap_eleven(self): + func_name = "generateVoice" + module = __import__("audio_generation", fromlist=["generateVoice"]) + func = getattr(module, func_name) + wrapped_func = self.elevenWrapper(func) + setattr(module, func_name, wrapped_func) + + + def initiateAPITracking(self): + self.wrap_turbo() + self.wrap_eleven() + + + diff --git a/shortGPT/tracking/cost_analytics.py b/shortGPT/tracking/cost_analytics.py new file mode 100644 index 0000000000000000000000000000000000000000..c7f708a5605fe00327575536aabd6ebfa8ef6d51 --- /dev/null +++ b/shortGPT/tracking/cost_analytics.py @@ -0,0 +1,48 @@ +import numpy as np +from shortGPT.database.content_database import ContentDatabase +db = ContentDatabase() +all = [] +# Calculate average and price of the average for OpenAI +openai_array = [short.get('api_openai') for short in all] +avr_openai = np.mean(openai_array) +OPENAI_CONST = 0.002 / 1000 +price_openai = avr_openai * OPENAI_CONST +max_openai = max(openai_array) +price_max_openai = max_openai * OPENAI_CONST + +# Calculate average and price of the average for Eleven +eleven_array = [short.get('api_openai') for short in all] +avr_eleven = np.mean(eleven_array) +ELEVEN_CONST = 0.3 / 1000 +price_eleven = avr_eleven * ELEVEN_CONST +max_eleven = max(eleven_array) +price_max_eleven = max_eleven * ELEVEN_CONST + + + +# Print results +print("OpenAI:") +print("- Average:", avr_openai) +print("- Price of the average:", price_openai) +print("- Max:", max_openai) +print("- Price of the max:", price_max_openai) + +print("Eleven:") +print("- Average:", avr_eleven) +print("- Price of the average:", price_eleven) +print("- Max:", max_eleven) +print("- Price of the max:", price_max_eleven) + + + +# for id in ids: +# builder = AskingRedditorShortBuilder(AR, id) +# print(id, builder.dataManager.getVideoPath()) +#createShorts(30, 'AskingRedditors') +# AR = ChannelManager("AskingRedditors") +# newShort = AskingRedditorShortBuilder(channelDB= AR, short_id="FyhKkqx9xDxTEtRpanSD") +# print(newShort.channelDB.getStaticEditingAsset('background_onepiece')) +# print(newShort.channelDB.getStaticEditingAsset('reddit_template_dark')) +# print(newShort.channelDB.getStaticEditingAsset('subscribe_animation')) +#print("Scraping requests remaining: ",image_api.getScrapingCredits()) + diff --git a/shortGPT/utils/cli.py b/shortGPT/utils/cli.py new file mode 100644 index 0000000000000000000000000000000000000000..2938841a82e04f252d7d51d08f68b1f3e60114e0 --- /dev/null +++ b/shortGPT/utils/cli.py @@ -0,0 +1,140 @@ +from shortGPT.utils.requirements import Requirements + + +class CLI: + + @staticmethod + def display_header(): + '''Display the header of the CLI''' + CLI.display_green_text(''' +.d88888b dP dP .88888. 888888ba d888888P .88888. 888888ba d888888P +88. "' 88 88 d8' `8b 88 `8b 88 d8' `88 88 `8b 88 +`Y88888b. 88aaaaa88 88 88 88aaaa8P' 88 88 88aaaa8P' 88 + `8b 88 88 88 88 88 `8b. 88 88 YP88 88 88 +d8' .8P 88 88 Y8. .8P 88 88 88 Y8. .88 88 88 + Y88888P dP dP `8888P' dP dP dP `88888' dP dP + + ''') + CLI.display_green_text("Welcome to ShortGPT! This is an experimental AI framework to automate all aspects of content creation.") + print("") + CLI.display_requirements_check() + + @staticmethod + def display_help(): + '''Display help''' + print("Usage: python shortGPT.py [options]") + print("") + print("Options:") + print(" -h, --help show this help message and exit") + + @staticmethod + def display_requirements_check(): + '''Display information about the system and requirements''' + print("Checking requirements...") + requirements_manager = Requirements() + print(" - Requirements : List of requirements and installed version:") + all_req_versions = requirements_manager.get_all_requirements_versions() + for req_name, req_version in all_req_versions.items(): + if req_version is None: + CLI.display_red_text(f"---> Error : {req_name} is not installed") + print(f"{req_name}=={req_version}") + + print("") + # Skipping for now, because it assumes package have the same name as the python import itself, which is not true most sometimes. + # if not requirements_manager.is_all_requirements_installed(): + # CLI.display_red_text("Error : Some requirements are missing") + # print("Please install the missing requirements using the following command :") + # print("pip install -r requirements.txt") + # print("") + # requirements_manager.get_all_requirements_not_installed() + # print("") + + class bcolors: + HEADER = '\033[95m' + OKBLUE = '\033[94m' + OKCYAN = '\033[96m' + OKGREEN = '\033[92m' + WARNING = '\033[93m' + FAIL = '\033[91m' + ENDC = '\033[0m' + BOLD = '\033[1m' + UNDERLINE = '\033[4m' + + @staticmethod + def display_error(error_message, stack_trace): + '''Display an error message in the console''' + print(CLI.bcolors.FAIL + "ERROR : " + error_message + CLI.bcolors.ENDC) + print(stack_trace) + print("If the problem persists, don't hesitate to contact our support. We're here to assist you.") + print("Get Help on Discord : https://discord.gg/qn2WJaRH") + + @staticmethod + def get_console_green_text(text): + '''Get the text in green color''' + return CLI.bcolors.OKGREEN + text + CLI.bcolors.ENDC + + @staticmethod + def get_console_red_text(text): + '''Get the text in red color''' + return CLI.bcolors.FAIL + text + CLI.bcolors.ENDC + + @staticmethod + def get_console_yellow_text(text): + '''Get the text in yellow color''' + return CLI.bcolors.WARNING + text + CLI.bcolors.ENDC + + @staticmethod + def get_console_blue_text(text): + return CLI.bcolors.OKBLUE + text + CLI.bcolors.ENDC + + @staticmethod + def get_console_bold_text(text): + return CLI.bcolors.BOLD + text + CLI.bcolors.ENDC + + @staticmethod + def get_console_underline_text(text): + return CLI.bcolors.UNDERLINE + text + CLI.bcolors.ENDC + + @staticmethod + def get_console_cyan_text(text): + return CLI.bcolors.OKCYAN + text + CLI.bcolors.ENDC + + @staticmethod + def get_console_header_text(text): + return CLI.bcolors.HEADER + text + CLI.bcolors.ENDC + + @staticmethod + def get_console_text(text, color): + return color + text + CLI.bcolors.ENDC + + @staticmethod + def display_blue_text(text): + print(CLI.get_console_blue_text(text)) + + @staticmethod + def display_green_text(text): + print(CLI.get_console_green_text(text)) + + @staticmethod + def display_red_text(text): + print(CLI.get_console_red_text(text)) + + @staticmethod + def display_yellow_text(text): + print(CLI.get_console_yellow_text(text)) + + @staticmethod + def display_bold_text(text): + print(CLI.get_console_bold_text(text)) + + @staticmethod + def display_underline_text(text): + print(CLI.get_console_underline_text(text)) + + @staticmethod + def display_cyan_text(text): + print(CLI.get_console_cyan_text(text)) + + @staticmethod + def display_header_text(text): + print(CLI.get_console_header_text(text)) diff --git a/shortGPT/utils/requirements.py b/shortGPT/utils/requirements.py new file mode 100644 index 0000000000000000000000000000000000000000..034290dd3a54122405ccd0bec8167e8676ce025e --- /dev/null +++ b/shortGPT/utils/requirements.py @@ -0,0 +1,113 @@ +import os +import platform + + +class Requirements: + '''Manage requirements for the project''' + + def __init__(self): + self.package_path = os.path.dirname(os.path.realpath(__file__)) + self.requirements_path = os.path.join(self.package_path, '..', '..', 'requirements.txt') + + def get_list_requirements(self): + '''Get the list of requirements packages from requirements.txt''' + with open(self.requirements_path) as f: + requirements = f.read().splitlines() + + # remove comments and empty lines + requirements = [line for line in requirements if not line.startswith('#')] + requirements = [line for line in requirements if line.strip()] + + # extract package name from protocol + requirements = [line.split('/')[-1] for line in requirements if not line.startswith('git+')] + requirements = [line.split('/')[-1] for line in requirements if not line.startswith('http')] + requirements = [line.split('/')[-1] for line in requirements if not line.startswith('https')] + requirements = [line.split('/')[-1] for line in requirements if not line.startswith('ssh')] + requirements = [line.split('/')[-1] for line in requirements if not line.startswith('git')] + + # sort alphabetically + requirements.sort() + + return requirements + + def get_os_name(self): + '''Get the name of the operating system''' + return platform.system() + + def get_os_version(self): + '''Get the version of the operating system''' + return platform.version() + + def get_python_version(self): + '''Get the version of Python installed''' + return platform.python_version() + + def is_all_requirements_installed(self): + '''Check if all requirements are installed''' + requirements = self.get_list_requirements() + for requirement in requirements: + if not self.is_requirement_installed(requirement): + return False + return True + + def is_requirement_installed(self, package_name): + '''Check if a package is installed''' + import importlib + try: + importlib.import_module(package_name) + return True + except ImportError: + return False + + def get_version(self, package_name): + '''Get the version of a package''' + import pkg_resources + try: + return pkg_resources.get_distribution(package_name).version + except: + return None + + def get_all_requirements_versions(self): + '''Get the versions of all requirements''' + requirements = self.get_list_requirements() + versions = {} + for requirement in requirements: + versions[requirement] = self.get_version(requirement) + return versions + + def get_all_requirements_not_installed(self): + '''Get the list of all requirements not installed''' + requirements = self.get_list_requirements() + not_installed = {} + for requirement in requirements: + # if version is None then the package is not installed + if self.get_version(requirement) is None: + not_installed[requirement] = self.get_version(requirement) + return not_installed + + +if __name__ == '__main__': + '''Display information about the system and requirements''' + requirements_manager = Requirements() + # Skipping for now, because it assumes package have the same name as the python import itself, which is not true most sometimes. + # if not requirements_manager.is_all_requirements_installed(): + # print("Error : Some requirements are missing") + # print("Please install all requirements from requirements.txt") + # print("You can install them by running the following command:") + # print("pip install -r requirements.txt") + + print(f"System information:") + print(f"OS name : {requirements_manager.get_os_name()}") + print(f"OS version : {requirements_manager.get_os_version()}") + print(f"Python version : {requirements_manager.get_python_version()}") + + # list all requirements and their versions + print("List of all requirements and their versions:") + all_req_versions = requirements_manager.get_all_requirements_versions() + for req_name, req_version in all_req_versions.items(): + print(f"{req_name}=={req_version}") + + print("List of all requirements not installed:") + all_req_not_installed = requirements_manager.get_all_requirements_not_installed() + for req_name, req_version in all_req_not_installed.items(): + print(f"{req_name}=={req_version}") diff --git a/ultra.py b/ultra.py new file mode 100644 index 0000000000000000000000000000000000000000..99f6d3642e473939afdf139ad3e4fb1480a7c17e --- /dev/null +++ b/ultra.py @@ -0,0 +1,58 @@ +import random + +from shortGPT.config.api_db import ApiKeyManager, ApiProvider +from shortGPT.config.asset_db import AssetDatabase, AssetType +from shortGPT.engine.facts_short_engine import FactsShortEngine +from shortGPT.audio.eleven_voice_module import ElevenLabsVoiceModule +from shortGPT.config.languages import Language + +# Set or get API Keys here +ApiKeyManager.set_api_key(ApiProvider.OPENAI, "") +ApiKeyManager.set_api_key(ApiProvider.ELEVEN_LABS, "") +ApiKeyManager.set_api_key(ApiProvider.PEXELS, "") + +# Music and Video Links +music_links = [ + "https://www.youtube.com/watch?v=1WP_YLn1D1c", + "https://www.youtube.com/watch?v=ZhECyz85FMc", + "https://www.youtube.com/watch?v=6FNHe3kf8_s", + "https://www.youtube.com/watch?v=p7ZsBPK656s", + "https://www.youtube.com/watch?v=__CRWE-L45k", + "https://www.youtube.com/watch?v=iaKgF1Vf5bQ" +] + +video_links = [ + "https://www.youtube.com/watch?v=UJa80UPjREU", + "https://www.youtube.com/watch?v=IWqqD3HXTp0", + "https://www.youtube.com/watch?v=wgntRR5_Zvs", + "https://www.youtube.com/watch?v=vLnX5JP4jVg", + "https://www.youtube.com/watch?v=-qZqpM-k7sY", + "https://www.youtube.com/watch?v=Lmb_G9klCvU" +] + +# Choose random music and video +music_url = random.choice(music_links) +video_url = random.choice(video_links) + +# Add assets to AssetDatabase +AssetDatabase.add_remote_asset("custom_music", AssetType.BACKGROUND_MUSIC, music_url) +AssetDatabase.add_remote_asset("custom_video", AssetType.BACKGROUND_VIDEO, video_url) + +# Configure Voice Module +voice_module = ElevenLabsVoiceModule(api_key=ApiKeyManager.get_api_key(ApiProvider.ELEVEN_LABS), voiceName="Bella") + +# Configure Content Engine +facts_type = "interesting_facts" # Specify the type of facts you want +content_engine = FactsShortEngine(voiceModule=voice_module, + facts_type=facts_type, + background_video_name="custom_video", + background_music_name="custom_music", + num_images=4, + language=Language.ENGLISH) + +# Generate Content +for step_num, step_logs in content_engine.makeContent(): + print(f"{step_logs}") + +# Get Video Output Path +print(content_engine.get_video_output_path()) diff --git a/upload.py b/upload.py new file mode 100644 index 0000000000000000000000000000000000000000..34e9eb405ca414cce3d28e4d01e035a355a5e34a --- /dev/null +++ b/upload.py @@ -0,0 +1,202 @@ +#!/usr/bin/python + +import httplib2 +import os +import random +import sys +import time +import glob + +from apiclient.discovery import build +from apiclient.errors import HttpError +from apiclient.http import MediaFileUpload +from oauth2client.client import flow_from_clientsecrets +from oauth2client.file import Storage +from oauth2client.tools import argparser, run_flow + + +# Explicitly tell the underlying HTTP transport library not to retry, since +# we are handling retry logic ourselves. +httplib2.RETRIES = 1 + +# Maximum number of times to retry before giving up. +MAX_RETRIES = 10 + +# Always retry when these exceptions are raised. +RETRIABLE_EXCEPTIONS = (httplib2.HttpLib2Error, IOError) + +# Always retry when an apiclient.errors.HttpError with one of these status +# codes is raised. +RETRIABLE_STATUS_CODES = [500, 502, 503, 504] + +# The CLIENT_SECRETS_FILE variable specifies the name of a file that contains +# the OAuth 2.0 information for this application, including its client_id and +# client_secret. You can acquire an OAuth 2.0 client ID and client secret from +# the Google API Console at +# https://console.cloud.google.com/. +# Please ensure that you have enabled the YouTube Data API for your project. +# For more information about using OAuth2 to access the YouTube Data API, see: +# https://developers.google.com/youtube/v3/guides/authentication +# For more information about the client_secrets.json file format, see: +# https://developers.google.com/api-client-library/python/guide/aaa_client_secrets +CLIENT_SECRETS_FILE = "client_secrets.json" + +# This OAuth 2.0 access scope allows an application to upload files to the +# authenticated user's YouTube channel, but doesn't allow other types of access. +YOUTUBE_UPLOAD_SCOPE = "https://www.googleapis.com/auth/youtube.upload" +YOUTUBE_API_SERVICE_NAME = "youtube" +YOUTUBE_API_VERSION = "v3" + +# This variable defines a message to display if the CLIENT_SECRETS_FILE is +# missing. +MISSING_CLIENT_SECRETS_MESSAGE = """ +WARNING: Please configure OAuth 2.0 + +To make this sample run you will need to populate the client_secrets.json file +found at: + + %s + +with information from the API Console +https://console.cloud.google.com/ + +For more information about the client_secrets.json file format, please visit: +https://developers.google.com/api-client-library/python/guide/aaa_client_secrets +""" % os.path.abspath(os.path.join(os.path.dirname(__file__), + CLIENT_SECRETS_FILE)) + +VALID_PRIVACY_STATUSES = ("public", "private", "unlisted") + + +def get_authenticated_service(args): + flow = flow_from_clientsecrets(CLIENT_SECRETS_FILE, + scope=YOUTUBE_UPLOAD_SCOPE, + message=MISSING_CLIENT_SECRETS_MESSAGE) + + oauth_files = glob.glob("*oauth2*.json") + valid_credentials = [] + + for oauth_file in oauth_files: + args = argparser.parse_args() + args.client_secrets_file = oauth_file + print(oauth_file) + storage = Storage(args.client_secrets_file) + + credentials = storage.get() + + if credentials is None or credentials.invalid: + try: + credentials = run_flow(flow, storage, args) + valid_credentials.append(credentials) + except HttpError as e: + print("An HTTP error %d occurred:\n%s" % (e.resp.status, e.content)) + else: + valid_credentials.append(credentials) + + if len(valid_credentials) == 0: + exit("No valid credentials found in the provided OAuth files") + + # Use the first valid credentials + return build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION, + http=valid_credentials[0].authorize(httplib2.Http())) + + +def initialize_upload(youtube, options): + tags = None + if options.keywords: + tags = options.keywords.split(",") + + body = dict( + snippet=dict( + title=options.title, + description=options.description, + tags=tags, + categoryId=options.category + ), + status=dict( + privacyStatus=options.privacyStatus + ) + ) + + # Call the API's videos.insert method to create and upload the video. + insert_request = youtube.videos().insert( + part=",".join(body.keys()), + body=body, + # The chunksize parameter specifies the size of each chunk of data, in + # bytes, that will be uploaded at a time. Set a higher value for + # reliable connections as fewer chunks lead to faster uploads. Set a lower + # value for better recovery on less reliable connections. + # + # Setting "chunksize" equal to -1 in the code below means that the entire + # file will be uploaded in a single HTTP request. (If the upload fails, + # it will still be retried where it left off.) This is usually a best + # practice, but if you're using Python older than 2.6 or if you're + # running on App Engine, you should set the chunksize to something like + # 1024 * 1024 (1 megabyte). + media_body=MediaFileUpload(options.file, chunksize=-1, resumable=True) + ) + + resumable_upload(insert_request) + +# This method implements an exponential backoff strategy to resume a +# failed upload. + + +def resumable_upload(insert_request): + response = None + error = None + retry = 0 + while response is None: + try: + print("Uploading file...") + status, response = insert_request.next_chunk() + if response is not None: + if 'id' in response: + print("Video id '%s' was successfully uploaded." % + response['id']) + else: + exit("The upload failed with an unexpected response: %s" % response) + except HttpError as e: + if e.resp.status in RETRIABLE_STATUS_CODES: + error = "A retriable HTTP error %d occurred:\n%s" % (e.resp.status, + e.content) + else: + raise + except RETRIABLE_EXCEPTIONS as e: + error = "A retriable error occurred: %s" % e + + if error is not None: + print(error) + retry += 1 + if retry > MAX_RETRIES: + exit("No longer attempting to retry.") + + max_sleep = 2 ** retry + sleep_seconds = random.random() * max_sleep + print("Sleeping %f seconds and then retrying..." % sleep_seconds) + time.sleep(sleep_seconds) + + +if __name__ == '__main__': + argparser.add_argument("--file", required=True, + help="Video file to upload") + argparser.add_argument("--title", help="Video title", default="Test Title") + argparser.add_argument("--description", help="Video description", + default="Test Description") + argparser.add_argument("--category", default="24", + help="Numeric video category. " + + "See https://developers.google.com/youtube/v3/docs/videoCategories/list") + argparser.add_argument("--keywords", help="Video keywords, comma separated", + default="") + argparser.add_argument("--privacyStatus", choices=VALID_PRIVACY_STATUSES, + default=VALID_PRIVACY_STATUSES[0], help="Video privacy status.") + args = argparser.parse_args() + + if not os.path.exists(args.file): + exit("Please specify a valid file using the --file= parameter.") + + youtube = get_authenticated_service(args) + try: + initialize_upload(youtube, args) + except HttpError as e: + print("An HTTP error %d occurred:\n%s" % (e.resp.status, e.content)) diff --git a/upload_video.py b/upload_video.py new file mode 100644 index 0000000000000000000000000000000000000000..aaafad00707dd8ae06f65275ee528c9ee7c5c055 --- /dev/null +++ b/upload_video.py @@ -0,0 +1,186 @@ +#!/usr/bin/python + +import httplib +import httplib2 +import os +import random +import sys +import time + +from apiclient.discovery import build +from apiclient.errors import HttpError +from apiclient.http import MediaFileUpload +from oauth2client.client import flow_from_clientsecrets +from oauth2client.file import Storage +from oauth2client.tools import argparser, run_flow + + +# Explicitly tell the underlying HTTP transport library not to retry, since +# we are handling retry logic ourselves. +httplib2.RETRIES = 1 + +# Maximum number of times to retry before giving up. +MAX_RETRIES = 10 + +# Always retry when these exceptions are raised. +RETRIABLE_EXCEPTIONS = (httplib2.HttpLib2Error, IOError, httplib.NotConnected, + httplib.IncompleteRead, httplib.ImproperConnectionState, + httplib.CannotSendRequest, httplib.CannotSendHeader, + httplib.ResponseNotReady, httplib.BadStatusLine) + +# Always retry when an apiclient.errors.HttpError with one of these status +# codes is raised. +RETRIABLE_STATUS_CODES = [500, 502, 503, 504] + +# The CLIENT_SECRETS_FILE variable specifies the name of a file that contains +# the OAuth 2.0 information for this application, including its client_id and +# client_secret. You can acquire an OAuth 2.0 client ID and client secret from +# the Google API Console at +# https://console.cloud.google.com/. +# Please ensure that you have enabled the YouTube Data API for your project. +# For more information about using OAuth2 to access the YouTube Data API, see: +# https://developers.google.com/youtube/v3/guides/authentication +# For more information about the client_secrets.json file format, see: +# https://developers.google.com/api-client-library/python/guide/aaa_client_secrets +CLIENT_SECRETS_FILE = "client_secrets.json" + +# This OAuth 2.0 access scope allows an application to upload files to the authenticated user's YouTube channel, but doesn't allow other types of access. +YOUTUBE_UPLOAD_SCOPE = "https://www.googleapis.com/auth/youtube.upload" +YOUTUBE_API_SERVICE_NAME = "youtube" +YOUTUBE_API_VERSION = "v3" + +# This variable defines a message to display if the CLIENT_SECRETS_FILE is missing. +MISSING_CLIENT_SECRETS_MESSAGE = """ +WARNING: Please configure OAuth 2.0 + +To make this sample run you will need to populate the client_secrets.json file +found at: + + %s + +with information from the API Console +https://console.cloud.google.com/ + +For more information about the client_secrets.json file format, please visit: +https://developers.google.com/api-client-library/python/guide/aaa_client_secrets +""" % os.path.abspath(os.path.join(os.path.dirname(__file__), + CLIENT_SECRETS_FILE)) + +VALID_PRIVACY_STATUSES = ("public", "private", "unlisted") + + +def get_authenticated_service(args): + flow = flow_from_clientsecrets(CLIENT_SECRETS_FILE, + scope=YOUTUBE_UPLOAD_SCOPE, + message=MISSING_CLIENT_SECRETS_MESSAGE) + + storage = Storage("%s-oauth2.json" % sys.argv[0]) + credentials = storage.get() + + if credentials is None or credentials.invalid: + credentials = run_flow(flow, storage, args) + + return build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION, + http=credentials.authorize(httplib2.Http())) + +def initialize_upload(youtube, options): + tags = None + if options.keywords: + tags = options.keywords.split(",") + + body=dict( + snippet=dict( + title=options.title, + description=options.description, + tags=tags, + categoryId=options.category + ), + status=dict( + privacyStatus=options.privacyStatus + ) + ) + + # Call the API's videos.insert method to create and upload the video. + insert_request = youtube.videos().insert( + part=",".join(body.keys()), + body=body, + # The chunksize parameter specifies the size of each chunk of data, in + # bytes, that will be uploaded at a time. Set a higher value for + # reliable connections as fewer chunks lead to faster uploads. Set a lower + # value for better recovery on less reliable connections. + # + # Setting "chunksize" equal to -1 in the code below means that the entire + # file will be uploaded in a single HTTP request. (If the upload fails, + # it will still be retried where it left off.) This is usually a best + # practice, but if you're using Python older than 2.6 or if you're + # running on App Engine, you should set the chunksize to something like + # 1024 * 1024 (1 megabyte). + media_body=MediaFileUpload(options.file, chunksize=-1, resumable=True) + ) + + resumable_upload(insert_request) + +# This method implements an exponential backoff strategy to resume a +# failed upload. +def resumable_upload(insert_request): + response = None + error = None + retry = 0 + while response is None: + try: + print "Uploading file..." + status, response = insert_request.next_chunk() + if response is not None: + if 'id' in response: + print "Video id '%s' was successfully uploaded." % response['id'] + sys.exit(0) # Exit indicating success + + else: + exit("The upload failed with an unexpected response: %s" % response) + sys.exit(1) # Exit indicating a failure + except HttpError, e: + if e.resp.status in RETRIABLE_STATUS_CODES: + error = "A retriable HTTP error %d occurred:\n%s" % (e.resp.status, + e.content) + sys.exit(e.resp.status) # Exit with the HTTP error status code + + else: + raise + except RETRIABLE_EXCEPTIONS, e: + error = "A retriable error occurred: %s" % e + + if error is not None: + print error + retry += 1 + if retry > MAX_RETRIES: + exit("No longer attempting to retry.") + + max_sleep = 2 ** retry + sleep_seconds = random.random() * max_sleep + print "Sleeping %f seconds and then retrying..." % sleep_seconds + time.sleep(sleep_seconds) + +if __name__ == '__main__': + argparser.add_argument("--file", required=True, help="Video file to upload") + argparser.add_argument("--title", help="Video title", default="Test Title") + argparser.add_argument("--description", help="Video description", + default="Test Description") + argparser.add_argument("--category", default="22", + help="Numeric video category. " + + "See https://developers.google.com/youtube/v3/docs/videoCategories/list") + argparser.add_argument("--keywords", help="Video keywords, comma separated", + default="") + argparser.add_argument("--privacyStatus", choices=VALID_PRIVACY_STATUSES, + default=VALID_PRIVACY_STATUSES[0], help="Video privacy status.") + args = argparser.parse_args() + + if not os.path.exists(args.file): + exit("Please specify a valid file using the --file= parameter.") + sys.exit(2) # Choose an appropriate exit code for this error + + + youtube = get_authenticated_service(args) + try: + initialize_upload(youtube, args) + except HttpError, e: + print "An HTTP error %d occurred:\n%s" % (e.resp.status, e.content) \ No newline at end of file